Ariver
2026-05-06 f7ed0fe62e2792ede1000fd13370f9528bb68a03
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import Foundation
 
// MARK: - Localization Manager
 
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() {
        let code = UserDefaults.standard.string(forKey: "appLanguage") ?? fallbackCode()
        load(code)
    }
 
    static let supported: [(code: String, name: String)] = [
        ("en", "English"),
        ("zh-Hans", "简体中文"),
        ("zh-Hant", "繁體中文"),
        ("ja", "日本語"),
        ("ko", "한국어"),
        ("ru", "Русский"),
        ("fr", "Français"),
        ("it", "Italiano"),
        ("es", "Español"),
    ]
 
    static func switchTo(_ code: String) {
        load(code)
        UserDefaults.standard.set(code, forKey: "appLanguage")
    }
 
    private static func load(_ code: String) {
        guard let url = Bundle.main.url(
            forResource: code, withExtension: "json",
            subdirectory: "Localization"
        ) else {
            if code != "en" { load("en") }
            return
        }
        guard let data = try? Data(contentsOf: url),
              let dict = try? JSONSerialization.jsonObject(with: data) as? [String: String]
        else { return }
        current = dict
        currentCode = code
    }
 
    private static func fallbackCode() -> String {
        let lang = Locale.preferredLanguages.first ?? "en"
        if lang.hasPrefix("zh-Hant") || lang.hasPrefix("zh-HK") || lang.hasPrefix("zh-TW") { return "zh-Hant" }
        if lang.hasPrefix("zh") { return "zh-Hans" }
        if lang.hasPrefix("ja") { return "ja" }
        if lang.hasPrefix("ko") { return "ko" }
        if lang.hasPrefix("ru") { return "ru" }
        if lang.hasPrefix("fr") { return "fr" }
        if lang.hasPrefix("it") { return "it" }
        if lang.hasPrefix("es") { return "es" }
        return "en"
    }
}
 
/// Convenience function — use `tr("key")` everywhere.
func tr(_ key: String) -> String {
    L10n.current[key] ?? key
}