blob: a6c63d29c515c6fb3b0bf5db35f019923e3272ba (
plain)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
//
// ApplicationLanguage.swift
// MullvadVPN
//
// Created by Mojgan on 2025-07-16.
// Copyright © 2026 Mullvad VPN AB. All rights reserved.
//
import Foundation
/**
* TODO:
* Edit the "Localization Cleanup (Release Build)" build script phase after
* multi-language support is completed and released.
*
* Note:
* - Localization is not available for the Staging configuration, which is used by `UITest`.
* - When the functionality is finished, the script should:
* • Remove bilingual content only for Staging.
* • Eliminate the Debug configuration check.
*/
enum ApplicationLanguage: String, CaseIterable, Identifiable {
case english = "en"
case danish = "da"
case german = "de"
case spanish = "es"
case finnish = "fi"
case french = "fr"
case italian = "it"
case japanese = "ja"
case korean = "ko"
case burmese = "my"
case norwegianBokmal = "nb"
case dutch = "nl"
case polish = "pl"
case portuguese = "pt"
case russian = "ru"
case swedish = "sv"
case thai = "th"
case turkish = "tr"
case chineseSimplified = "zh-Hans" // Maps to zh-CN
case chineseTraditional = "zh-Hant" // Maps to zh-TW
var id: String { rawValue }
var displayName: String {
switch self {
case .english: "English"
case .danish: "Dansk"
case .german: "Deutsch"
case .spanish: "Español"
case .finnish: "Suomi"
case .french: "Français"
case .italian: "Italiano"
case .japanese: "日本語"
case .korean: "한국어"
case .burmese: "မြန်မာ"
case .norwegianBokmal: "Norsk Bokmål"
case .dutch: "Nederlands"
case .polish: "Polski"
case .portuguese: "Português"
case .russian: "Русский"
case .swedish: "Svenska"
case .thai: "ไทย"
case .turkish: "Türkçe"
case .chineseSimplified: "简体中文"
case .chineseTraditional: "繁體中文"
}
}
var countryCodeForFlag: String {
switch self {
case .english: "us" // English → US flag (or "gb" for UK)
case .danish: "dk"
case .german: "de"
case .spanish: "es"
case .finnish: "fi"
case .french: "fr"
case .italian: "it"
case .japanese: "jp"
case .korean: "kr"
case .burmese: "mm"
case .norwegianBokmal: "no"
case .dutch: "nl"
case .polish: "pl"
case .portuguese: "pt"
case .russian: "ru"
case .swedish: "se"
case .thai: "th"
case .turkish: "tr"
case .chineseSimplified: "cn"
case .chineseTraditional: "tw"
}
}
var flagEmoji: String {
let base: UInt32 = 127397
var flagString = ""
for scalar in countryCodeForFlag.uppercased().unicodeScalars {
guard let scalarValue = UnicodeScalar(base + scalar.value) else { return "" }
flagString.unicodeScalars.append(scalarValue)
}
return flagString
}
static var currentLanguage: ApplicationLanguage {
let defaultCode = ApplicationLanguage.english.rawValue
let fullCode = Locale.preferredLanguages.first ?? defaultCode
let locale = Locale(identifier: fullCode)
if let script = locale.language.script?.identifier {
switch script {
case "Hans":
return .chineseSimplified
case "Hant":
return .chineseTraditional
default:
break
}
}
let langCode = locale.language.languageCode?.identifier ?? defaultCode
return ApplicationLanguage(rawValue: langCode) ?? .english
}
}
|