mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-26 06:45:20 +00:00
Add Persian (fa) localization and an in-app language picker (#1443)
* 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>
This commit is contained in:
co-authored by
Claude Fable 5
jack
jack
parent
593fd7d737
commit
ca18843bb0
@@ -0,0 +1,40 @@
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user