Skip to content

Commit 8ce038e

Browse files
committed
Translation: Load user preferred language on startup: Required because Locale.Current only gives English (based on app's fallback UI). so we must manually query for user's preferred language and fallback to Locale.current. Should accurately translate to your system language and display the language in the menu too :D
1 parent ae2d336 commit 8ce038e

File tree

2 files changed

+31
-7
lines changed

2 files changed

+31
-7
lines changed

SpotifyLyricsInMenubar/SpotifyLyricsInMenubarApp.swift

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ struct SpotifyLyricsInMenubarApp: App {
4747
viewmodel.fetchBackgroundColor()
4848
if viewmodel.translate {
4949
if #available(macOS 15, *) {
50-
if translationConfigObject.translationConfig == TranslationSession.Configuration(target: Locale.Language.systemLanguages.first!) {
50+
if translationConfigObject.translationConfig == TranslationSession.Configuration(target: viewmodel.userLocaleLanguage.language) {
5151
translationConfigObject.translationConfig?.invalidate()
5252
} else {
53-
translationConfigObject.translationConfig = TranslationSession.Configuration(target: Locale.Language.systemLanguages.first!)
53+
translationConfigObject.translationConfig = TranslationSession.Configuration(target: viewmodel.userLocaleLanguage.language)
5454
}
5555
}
5656
}
@@ -87,7 +87,8 @@ struct SpotifyLyricsInMenubarApp: App {
8787
}
8888
}
8989
}
90-
Toggle("Translate To \(Locale.current.localizedString(forLanguageCode: Bundle.main.preferredLocalizations[0])!)", isOn: $viewmodel.translate)
90+
91+
Toggle("Translate To \(viewmodel.userLocaleLanguageString)", isOn: $viewmodel.translate)
9192
.disabled(!hasOnboarded)
9293
}
9394
else {
@@ -310,7 +311,7 @@ struct SpotifyLyricsInMenubarApp: App {
310311

311312
} catch {
312313
if let source = viewmodel.findRealLanguage() {
313-
translationConfigObject.translationConfig = TranslationSession.Configuration(source: source, target: Locale.Language.systemLanguages.first!)
314+
translationConfigObject.translationConfig = TranslationSession.Configuration(source: source, target: viewmodel.userLocaleLanguage.language)
314315
}
315316
print(error)
316317
}
@@ -323,7 +324,7 @@ struct SpotifyLyricsInMenubarApp: App {
323324
// required for most hindi songs: lyrics are written in english script and apple translation is very stupid
324325
// translationConfigObject.translationConfig = TranslationSession.Configuration(source: Locale.Language.init(identifier: "hi_IN"), target: Locale.Language.systemLanguages.first!)
325326
// good backup for now, doesn't replace english songs with french
326-
translationConfigObject.translationConfig = TranslationSession.Configuration(target: Locale.Language.systemLanguages.first!)
327+
translationConfigObject.translationConfig = TranslationSession.Configuration(target: viewmodel.userLocaleLanguage.language)
327328
// TODO: update translationConfig on song change, pickup song language from spotify and feed it as source locale
328329
return
329330
}
@@ -452,10 +453,10 @@ struct SpotifyLyricsInMenubarApp: App {
452453
viewmodel.fetchBackgroundColor()
453454
if viewmodel.translate {
454455
if #available(macOS 15, *) {
455-
if translationConfigObject.translationConfig == TranslationSession.Configuration(target: Locale.Language.systemLanguages.first!) {
456+
if translationConfigObject.translationConfig == TranslationSession.Configuration(target: viewmodel.userLocaleLanguage.language) {
456457
translationConfigObject.translationConfig?.invalidate()
457458
} else {
458-
translationConfigObject.translationConfig = TranslationSession.Configuration(target: Locale.Language.systemLanguages.first!)
459+
translationConfigObject.translationConfig = TranslationSession.Configuration(target: viewmodel.userLocaleLanguage.language)
459460
}
460461
}
461462
}
@@ -561,3 +562,18 @@ extension View {
561562
closure(self)
562563
}
563564
}
565+
// https://stackoverflow.com/questions/48136456/locale-current-reporting-wrong-language-on-device
566+
extension Locale {
567+
static func preferredLocaleString() -> String? {
568+
guard let preferredIdentifier = Locale.preferredLanguages.first else {
569+
return Locale.current.localizedString(for: Calendar.autoupdatingCurrent.identifier)
570+
}
571+
return Locale.current.localizedString(forIdentifier: preferredIdentifier)
572+
}
573+
static func preferredLocale() -> Locale {
574+
guard let preferredIdentifier = Locale.preferredLanguages.first else {
575+
return Locale.current
576+
}
577+
return Locale.init(identifier: preferredIdentifier)
578+
}
579+
}

SpotifyLyricsInMenubar/viewModel.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ import NaturalLanguage
9999
let LRCLIBUserAgentConfig = URLSessionConfiguration.default
100100
let LRCLIBUserAgentSession: URLSession
101101

102+
let userLocaleLanguage: Locale
103+
let userLocaleLanguageString: String
104+
102105
@Published var mustUpdateUrgent: Bool = false
103106
@Published var lyricsIsEmptyPostLoad: Bool = true
104107

@@ -113,12 +116,17 @@ import NaturalLanguage
113116
updaterController = SPUStandardUpdaterController(startingUpdater: true, updaterDelegate: nil, userDriverDelegate: nil)
114117
coreDataContainer = NSPersistentContainer(name: "Lyrics")
115118

119+
120+
116121
fakeSpotifyUserAgentconfig.httpAdditionalHeaders = ["User-Agent": "Spotify/121000760 Win32/0 (PC laptop)"]
117122
fakeSpotifyUserAgentSession = URLSession(configuration: fakeSpotifyUserAgentconfig)
118123

119124
LRCLIBUserAgentConfig.httpAdditionalHeaders = ["User-Agent": "Lyric Fever v2.0 (https://github.com/aviwad/LyricFever)"]
120125
LRCLIBUserAgentSession = URLSession(configuration: LRCLIBUserAgentConfig)
121126

127+
userLocaleLanguage = Locale.preferredLocale()
128+
userLocaleLanguageString = Locale.preferredLocaleString() ?? ""
129+
122130
coreDataContainer.loadPersistentStores { description, error in
123131
if let error = error {
124132
fatalError("Error: \(error.localizedDescription)")

0 commit comments

Comments
 (0)