| | |
| | | |
| | | // MARK: - Localization Manager |
| | | |
| | | extension Notification.Name { |
| | | static let appLanguageDidChange = Notification.Name("AppLanguageDidChange") |
| | | } |
| | | |
| | | enum L10n { |
| | | static var current: [String: String] = [:] |
| | | private(set) static var currentCode = "en" |
| | |
| | | ] |
| | | |
| | | static func switchTo(_ code: String) { |
| | | guard supported.contains(where: { $0.code == code }) else { return } |
| | | guard code != currentCode else { return } |
| | | load(code) |
| | | UserDefaults.standard.set(code, forKey: "appLanguage") |
| | | NotificationCenter.default.post(name: .appLanguageDidChange, object: nil, userInfo: ["code": currentCode]) |
| | | } |
| | | |
| | | /// 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) { |