|
|
@@ -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)
|