| | |
| | | |
| | | enum L10n { |
| | | static var current: [String: String] = [:] |
| | | private(set) static var currentCode = "en" |
| | | |
| | | /// Call once at startup to load the saved or system language. |
| | | static func setup() { |
| | |
| | | UserDefaults.standard.set(code, forKey: "appLanguage") |
| | | } |
| | | |
| | | /// Load a specific key's translation for a given language code without switching. |
| | | static func loadedTranslation(_ key: String, for code: String) -> String? { |
| | | guard let url = Bundle.main.url( |
| | | forResource: code, withExtension: "json", |
| | | subdirectory: "Localization" |
| | | ) else { return nil } |
| | | guard let data = try? Data(contentsOf: url), |
| | | let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String] |
| | | else { return nil } |
| | | return dict[key] |
| | | } |
| | | |
| | | private static func load(_ code: String) { |
| | | guard let url = Bundle.main.url( |
| | | forResource: code, withExtension: "json", |
| | | subdirectory: "Localization" |
| | | ) else { |
| | | // Fallback to bundled English |
| | | if code != "en" { load("en") } |
| | | return |
| | | } |
| | |
| | | let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String] |
| | | else { return } |
| | | current = dict |
| | | currentCode = code |
| | | } |
| | | |
| | | private static func fallbackCode() -> String { |