summaryrefslogtreecommitdiffhomepage
path: root/ios/Localizations
diff options
context:
space:
mode:
Diffstat (limited to 'ios/Localizations')
-rw-r--r--ios/Localizations/AppLanguage.swift145
-rw-r--r--ios/Localizations/da.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/de.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/en.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/es.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/fi.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/fr.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/it.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/ja.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/ko.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/my.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/nb.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/nl.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/pl.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/pt-PT.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/ru.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/sv.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/th.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/tr.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/zh-Hans.lproj/Localizable.strings7
-rw-r--r--ios/Localizations/zh-Hant.lproj/Localizable.strings7
21 files changed, 285 insertions, 0 deletions
diff --git a/ios/Localizations/AppLanguage.swift b/ios/Localizations/AppLanguage.swift
new file mode 100644
index 0000000000..b299938235
--- /dev/null
+++ b/ios/Localizations/AppLanguage.swift
@@ -0,0 +1,145 @@
+//
+// AppLanguage.swift
+// MullvadVPN
+//
+// Created by Mojgan on 2025-07-16.
+// Copyright © 2025 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 AppLanguage: 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"
+ }
+ }
+
+ static var allSorted: [AppLanguage] {
+ AppLanguage.allCases
+ .sorted { $0.displayName.localizedCaseInsensitiveCompare($1.displayName) == .orderedAscending }
+ }
+
+ static func from(_ code: String) -> AppLanguage {
+ AppLanguage(rawValue: code) ?? .english
+ }
+
+ 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: AppLanguage {
+ let defaultCode = AppLanguage.english.rawValue
+ let fullCode = Locale.preferredLanguages.first ?? defaultCode
+
+ if #available(iOS 16, *) {
+ let locale = Locale(identifier: fullCode)
+ if let script = locale.language.script?.identifier {
+ switch script {
+ case "Hans":
+ return .chineseSimplified
+ case "Hant":
+ return .chineseTraditional
+ default:
+ break
+ }
+ }
+ } else {
+ if fullCode.contains("Hans") {
+ return .chineseSimplified
+ } else if fullCode.contains("Hant") {
+ return .chineseTraditional
+ }
+ }
+
+ // Otherwise, try to get languageCode (e.g., "en", "fr")
+ let locale = Locale(identifier: fullCode)
+ let langCode = locale.languageCode ?? defaultCode
+
+ return AppLanguage.from(langCode)
+ }
+}
diff --git a/ios/Localizations/da.lproj/Localizable.strings b/ios/Localizations/da.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/da.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/de.lproj/Localizable.strings b/ios/Localizations/de.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/de.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/en.lproj/Localizable.strings b/ios/Localizations/en.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/en.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/es.lproj/Localizable.strings b/ios/Localizations/es.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/es.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/fi.lproj/Localizable.strings b/ios/Localizations/fi.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/fi.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/fr.lproj/Localizable.strings b/ios/Localizations/fr.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/fr.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/it.lproj/Localizable.strings b/ios/Localizations/it.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/it.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/ja.lproj/Localizable.strings b/ios/Localizations/ja.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/ja.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/ko.lproj/Localizable.strings b/ios/Localizations/ko.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/ko.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/my.lproj/Localizable.strings b/ios/Localizations/my.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/my.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/nb.lproj/Localizable.strings b/ios/Localizations/nb.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/nb.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/nl.lproj/Localizable.strings b/ios/Localizations/nl.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/nl.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/pl.lproj/Localizable.strings b/ios/Localizations/pl.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/pl.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/pt-PT.lproj/Localizable.strings b/ios/Localizations/pt-PT.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/pt-PT.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/ru.lproj/Localizable.strings b/ios/Localizations/ru.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/ru.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/sv.lproj/Localizable.strings b/ios/Localizations/sv.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/sv.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/th.lproj/Localizable.strings b/ios/Localizations/th.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/th.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/tr.lproj/Localizable.strings b/ios/Localizations/tr.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/tr.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/zh-Hans.lproj/Localizable.strings b/ios/Localizations/zh-Hans.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/zh-Hans.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/
diff --git a/ios/Localizations/zh-Hant.lproj/Localizable.strings b/ios/Localizations/zh-Hant.lproj/Localizable.strings
new file mode 100644
index 0000000000..f40aa19b9a
--- /dev/null
+++ b/ios/Localizations/zh-Hant.lproj/Localizable.strings
@@ -0,0 +1,7 @@
+/*
+ Localizable.strings
+ MullvadVPN
+
+ Created by Mojgan on 2025-07-16.
+ Copyright © 2025 Mullvad VPN AB. All rights reserved.
+*/