mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 23:05:20 +00:00
* Add Persian (fa) localization and an in-app language picker Persian was the one notable gap in the 29-language catalog. Translate all 381 strings (plus the share extension) with proper plural substitutions, and register fa in knownRegions. Settings gains a LANGUAGE section: a picker over every language the bundle ships (native names via Locale), backed by an AppleLanguages override so users can run bitchat in a language different from the device's. Localization resolves at process start, so the picker surfaces a restart note. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Remove unused AppLanguageSettings.currentOverride (Periphery) AppInfoView reads the override via @AppStorage, so the accessor was dead code and failed the Periphery CI scan. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com> Co-authored-by: jack <jackjackbits@users.noreply.github.com> Co-authored-by: jack <212554440+jackjackbits@users.noreply.github.com>
41 lines
1.8 KiB
Swift
41 lines
1.8 KiB
Swift
import Foundation
|
|
|
|
/// In-app override for the UI language, on top of the system per-app
|
|
/// language. Apple resolves localization from the AppleLanguages default at
|
|
/// process start, so a new choice takes effect on the next launch — callers
|
|
/// surface a "restart to apply" note after changing it.
|
|
enum AppLanguageSettings {
|
|
/// "" means no override: follow the device (or per-app system) language.
|
|
static let overrideKey = "app.languageOverride"
|
|
private static let appleLanguagesKey = "AppleLanguages"
|
|
|
|
/// Language codes the app ships translations for, straight from the
|
|
/// built bundle so this never drifts from the string catalog.
|
|
static var availableLanguages: [String] {
|
|
Bundle.main.localizations
|
|
.filter { $0 != "Base" }
|
|
.sorted { endonym(for: $0).localizedCaseInsensitiveCompare(endonym(for: $1)) == .orderedAscending }
|
|
}
|
|
|
|
/// The language's name in that language ("فارسی", "한국어") so every user
|
|
/// can find their own entry regardless of the current UI language.
|
|
static func endonym(for code: String) -> String {
|
|
let locale = Locale(identifier: code)
|
|
let name = locale.localizedString(forIdentifier: code) ?? code
|
|
return name.lowercased(with: locale)
|
|
}
|
|
|
|
/// Persists the override (nil clears it). AppleLanguages drives the
|
|
/// actual localization lookup on next launch.
|
|
static func setOverride(_ code: String?) {
|
|
let defaults = UserDefaults.standard
|
|
if let code, !code.isEmpty {
|
|
defaults.set(code, forKey: overrideKey)
|
|
defaults.set([code], forKey: appleLanguagesKey)
|
|
} else {
|
|
defaults.removeObject(forKey: overrideKey)
|
|
defaults.removeObject(forKey: appleLanguagesKey)
|
|
}
|
|
}
|
|
}
|