Prechádzať zdrojové kódy

Follow macOS system language on launch instead of persisting UI locale.

Settings language changes apply for the current session only; legacy preferred-language UserDefaults are cleared on startup.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 1 mesiac pred
rodič
commit
7766111341

+ 1 - 1
App for Indeed/AppDelegate.swift

@@ -48,8 +48,8 @@ class AppDelegate: NSObject, NSApplicationDelegate {
     private var lastSubscriptionRefreshAt: Date?
 
     func applicationWillFinishLaunching(_ notification: Notification) {
-        AppAppearanceManager.shared.apply()
         AppLanguageManager.shared.applyStoredPreferenceOnLaunch()
+        AppAppearanceManager.shared.apply()
     }
 
     func applicationDidFinishLaunching(_ aNotification: Notification) {

+ 18 - 10
App for Indeed/Services/AppLocalization.swift

@@ -46,12 +46,18 @@ enum AppLanguage: CaseIterable {
         if lower.hasPrefix("zh") {
             return .chineseSimplified
         }
+        if lower.hasPrefix("en") {
+            return .english
+        }
         if lower.hasPrefix("fr-ca") {
             return .frenchCanada
         }
         if lower.hasPrefix("fr") {
             return .french
         }
+        if lower.hasPrefix("ar") {
+            return .arabic
+        }
         for language in AppLanguage.allCases where preferred.hasPrefix(language.localeIdentifier) {
             return language
         }
@@ -86,8 +92,7 @@ func appLocalized(_ key: String, language: AppLanguage) -> String {
 }
 
 func currentAppLanguage() -> AppLanguage {
-    let code = UserDefaults.standard.string(forKey: "com.appforindeed.preferredLanguage") ?? "en"
-    return AppLanguage.allCases.first(where: { $0.localeIdentifier == code }) ?? .english
+    AppLanguageManager.resolvedLanguage
 }
 
 /// Resolves copy for the user’s currently selected language.
@@ -206,25 +211,28 @@ final class AppLanguageManager {
 
     static let didChangeNotification = Notification.Name("AppLanguageManager.didChange")
 
-    private enum UserDefaultsKey {
-        static let preferredLanguage = "com.appforindeed.preferredLanguage"
+    private static let legacyPreferredLanguageKey = "com.appforindeed.preferredLanguage"
+
+    /// Settings override for this run only; cleared on launch so UI follows macOS each time.
+    nonisolated(unsafe) private static var sessionOverride: AppLanguage?
+
+    nonisolated static var resolvedLanguage: AppLanguage {
+        sessionOverride ?? AppLanguage.systemLanguage
     }
 
     var current: AppLanguage {
-        currentAppLanguage()
+        Self.resolvedLanguage
     }
 
     func applyStoredPreferenceOnLaunch() {
         // UI copy uses `appLocalized`; do not drive layout from `AppleLanguages` (Arabic forces RTL and breaks CV templates).
+        Self.sessionOverride = nil
         UserDefaults.standard.removeObject(forKey: "AppleLanguages")
-        if UserDefaults.standard.string(forKey: UserDefaultsKey.preferredLanguage) == nil {
-            setLanguage(AppLanguage.systemLanguage, notify: false)
-        }
+        UserDefaults.standard.removeObject(forKey: Self.legacyPreferredLanguageKey)
     }
 
     func setLanguage(_ language: AppLanguage, notify: Bool = true) {
-        let code = language.localeIdentifier
-        UserDefaults.standard.set(code, forKey: UserDefaultsKey.preferredLanguage)
+        Self.sessionOverride = language
         UserDefaults.standard.removeObject(forKey: "AppleLanguages")
         if notify {
             NotificationCenter.default.post(name: Self.didChangeNotification, object: self)