Sfoglia il codice sorgente

Localize AI CV template names across all supported languages.

Split camelCase and fused English titles into translatable tokens, add a shared vocabulary lexicon, and ship phrase-level strings so gallery cards match the UI language.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 2 giorni fa
parent
commit
5381bec5ca

+ 54 - 72
App for Indeed/Services/AppLocalization.swift

@@ -128,19 +128,52 @@ func localizedTemplateName(_ nameKey: String) -> String {
128 128
     if !exact.isEmpty, exact != trimmed { return exact }
129 129
 
130 130
     guard language != .english else { return trimmed }
131
+
132
+    let expandedPhrase = tokenizeTemplateName(trimmed).joined(separator: " ")
133
+    if expandedPhrase != trimmed {
134
+        let phrase = appLocalized(expandedPhrase, language: language)
135
+        if !phrase.isEmpty, phrase != expandedPhrase { return phrase }
136
+    }
137
+
131 138
     let tokenized = translateTemplateNameByTokens(trimmed, language: language)
132 139
     return tokenized.isEmpty ? trimmed : tokenized
133 140
 }
134 141
 
142
+/// Splits space-separated, camelCase, and punctuation-joined AI template titles into words.
143
+private func tokenizeTemplateName(_ name: String) -> [String] {
144
+    var s = name.trimmingCharacters(in: .whitespacesAndNewlines)
145
+    guard !s.isEmpty else { return [] }
146
+
147
+    for separator in ["&", "·", "-", "_", "/"] {
148
+        s = s.replacingOccurrences(of: separator, with: " ")
149
+    }
150
+
151
+    var expanded = ""
152
+    let chars = Array(s)
153
+    for index in chars.indices {
154
+        let char = chars[index]
155
+        if index > 0 {
156
+            let prev = chars[index - 1]
157
+            if char.isUppercase, prev.isLowercase {
158
+                expanded.append(" ")
159
+            } else if char.isUppercase, prev.isUppercase, index + 1 < chars.count, chars[index + 1].isLowercase {
160
+                expanded.append(" ")
161
+            }
162
+        }
163
+        expanded.append(char)
164
+    }
165
+
166
+    return expanded
167
+        .split(whereSeparator: \.isWhitespace)
168
+        .map(String.init)
169
+        .filter { !$0.isEmpty }
170
+}
171
+
135 172
 private func translateTemplateNameByTokens(_ name: String, language: AppLanguage) -> String {
136
-    let tokens = name.split(separator: " ").map(String.init)
173
+    let tokens = tokenizeTemplateName(name)
137 174
     guard !tokens.isEmpty else { return name }
138 175
 
139
-    let translated = tokens.map { token -> String in
140
-        let perWord = appLocalized(token, language: language)
141
-        if perWord != token { return perWord }
142
-        return templateNameTokenTranslation(token, language: language) ?? token
143
-    }
176
+    let translated = tokens.map { translateTemplateNameToken($0, language: language) }
144 177
 
145 178
     switch language {
146 179
     case .chineseSimplified, .chineseTraditional:
@@ -150,76 +183,25 @@ private func translateTemplateNameByTokens(_ name: String, language: AppLanguage
150 183
     }
151 184
 }
152 185
 
153
-/// Vocabulary for AI-invented template titles (e.g. “Creative Cascade”) when no full-string key exists.
154
-private func templateNameTokenTranslation(_ token: String, language: AppLanguage) -> String? {
155
-    let key = token.trimmingCharacters(in: .whitespacesAndNewlines)
156
-    guard !key.isEmpty else { return nil }
157
-
158
-    switch language {
159
-    case .chineseTraditional:
160
-        return TemplateNameTokenLexicon.zhHant[key] ?? TemplateNameTokenLexicon.zhHant[key.capitalized]
161
-    case .chineseSimplified:
162
-        return TemplateNameTokenLexicon.zhHans[key] ?? TemplateNameTokenLexicon.zhHans[key.capitalized]
163
-    case .arabic:
164
-        return TemplateNameTokenLexicon.ar[key] ?? TemplateNameTokenLexicon.ar[key.capitalized]
165
-    case .french, .frenchCanada, .german, .swedish, .english:
166
-        return nil
167
-    }
168
-}
186
+private func translateTemplateNameToken(_ token: String, language: AppLanguage) -> String {
187
+    let trimmed = token.trimmingCharacters(in: .whitespacesAndNewlines)
188
+    guard !trimmed.isEmpty else { return token }
169 189
 
170
-private enum TemplateNameTokenLexicon {
171
-    static let zhHant: [String: String] = [
172
-        "AI": "人工智慧", "UI": "介面", "UX": "體驗", "ATS": "ATS",
173
-        "Airy": "通透", "Atlas": "地圖", "Axis": "軸線", "Bloom": "綻放",
174
-        "Blue": "藍", "Bold": "大膽", "Briefing": "簡報", "Cascade": "層疊",
175
-        "Chairman": "主席", "Charter": "憲章", "Circuit": "電路", "Clear": "清晰",
176
-        "Conduit": "管道", "Core": "核心", "Corporate": "企業", "Craft": "工藝",
177
-        "Creative": "創意", "Design": "設計", "Docket": "待辦", "Dynamo": "動力",
178
-        "Echo": "回音", "Edge": "邊緣", "Ember": "餘燼", "Estate": "莊園",
179
-        "Executive": "高階", "Facet": "刻面", "Flow": "流動", "Flux": "流變",
180
-        "Forge": "鍛造", "Frame": "框架", "Grid": "網格", "Harbor": "港灣",
181
-        "Horizon": "地平線", "Impact": "影響", "Kite": "風箏", "Lattice": "格柵",
182
-        "Ledger": "帳本", "Lens": "鏡頭", "Linea": "線條", "Marigold": "金盞花",
183
-        "Mesh": "網狀", "Minimal": "簡約", "Modern": "現代", "Mono": "單色",
184
-        "Monarch": "君主", "Nova": "新星", "North": "北方", "Ocean": "海洋",
185
-        "Path": "路徑", "Peak": "峰", "Pixel": "像素", "Pinstripe": "細條紋",
186
-        "Prime": "首要", "Prism": "稜鏡", "Professional": "專業", "Pulse": "脈動",
187
-        "Pure": "純淨", "Quorum": "法定人數", "Regent": "攝政", "River": "河",
188
-        "Sculptor": "雕刻", "Shift": "轉換", "Slate": "石板", "Spark": "火花",
189
-        "Sterling": "純正", "Stone": "石", "Studio": "工作室", "Summit": "頂峰",
190
-        "Swiss": "瑞士", "Swift": "迅捷", "Tabular": "表格", "Vale": "谷",
191
-        "Vertex": "頂點", "Wave": "波浪", "White": "白"
190
+    let candidates = [
191
+        trimmed,
192
+        trimmed.capitalized,
193
+        trimmed.prefix(1).uppercased() + trimmed.dropFirst().lowercased()
192 194
     ]
193 195
 
194
-    static let zhHans: [String: String] = [
195
-        "AI": "人工智能", "UI": "界面", "UX": "体验", "ATS": "ATS",
196
-        "Airy": "通透", "Atlas": "地图", "Axis": "轴线", "Bloom": "绽放",
197
-        "Blue": "蓝", "Bold": "大胆", "Briefing": "简报", "Cascade": "层叠",
198
-        "Chairman": "主席", "Charter": "宪章", "Circuit": "电路", "Clear": "清晰",
199
-        "Conduit": "管道", "Core": "核心", "Corporate": "企业", "Craft": "工艺",
200
-        "Creative": "创意", "Design": "设计", "Docket": "待办", "Dynamo": "动力",
201
-        "Echo": "回音", "Edge": "边缘", "Ember": "余烬", "Estate": "庄园",
202
-        "Executive": "高管", "Facet": "刻面", "Flow": "流动", "Flux": "流变",
203
-        "Forge": "锻造", "Frame": "框架", "Grid": "网格", "Harbor": "港湾",
204
-        "Horizon": "地平线", "Impact": "影响", "Kite": "风筝", "Lattice": "格栅",
205
-        "Ledger": "账本", "Lens": "镜头", "Linea": "线条", "Marigold": "金盏花",
206
-        "Mesh": "网状", "Minimal": "简约", "Modern": "现代", "Mono": "单色",
207
-        "Monarch": "君主", "Nova": "新星", "North": "北方", "Ocean": "海洋",
208
-        "Path": "路径", "Peak": "峰", "Pixel": "像素", "Pinstripe": "细条纹",
209
-        "Prime": "首要", "Prism": "棱镜", "Professional": "专业", "Pulse": "脉动",
210
-        "Pure": "纯净", "Quorum": "法定人数", "Regent": "摄政", "River": "河",
211
-        "Sculptor": "雕刻", "Shift": "转换", "Slate": "石板", "Spark": "火花",
212
-        "Sterling": "纯正", "Stone": "石", "Studio": "工作室", "Summit": "顶峰",
213
-        "Swiss": "瑞士", "Swift": "迅捷", "Tabular": "表格", "Vale": "谷",
214
-        "Vertex": "顶点", "Wave": "波浪", "White": "白"
215
-    ]
196
+    for candidate in candidates where !candidate.isEmpty {
197
+        let localized = appLocalized(candidate, language: language)
198
+        if !localized.isEmpty, localized != candidate { return localized }
199
+        if let lex = TemplateNameTokenLexicon.lookup(candidate, language: language) {
200
+            return lex
201
+        }
202
+    }
216 203
 
217
-    static let ar: [String: String] = [
218
-        "Creative": "إبداعي", "Cascade": "تتالي", "Design": "تصميم", "Dynamo": "ديناميكي",
219
-        "Modern": "عصري", "Professional": "احترافي", "Executive": "تنفيذي", "Minimal": "بسيط",
220
-        "Ocean": "محيط", "Blue": "أزرق", "Summit": "قمة", "Horizon": "أفق", "Harbor": "ميناء",
221
-        "Studio": "استوديو", "Craft": "حرفة", "Sculptor": "نحات", "UI": "واجهة"
222
-    ]
204
+    return trimmed.prefix(1).uppercased() + trimmed.dropFirst().lowercased()
223 205
 }
224 206
 
225 207
 

+ 8 - 13
App for Indeed/Services/CVTemplateFetchService.swift

@@ -41,21 +41,16 @@ final class CVTemplateFetchService {
41 41
 
42 42
         /// English `name` values double as localization keys in the app; keep them ASCII words.
43 43
         static func displayNameRule(for language: AppLanguage) -> String {
44
+            let spacingRule = """
45
+            Each `name` must be 1–3 English words separated by ASCII spaces (never camelCase, concatenation, or symbols). \
46
+            Examples: \"Creative Cascade\", \"Blue Horizon\", \"Pure Simplicity\". \
47
+            Do not use \"PerformanceDriven\", \"Innovate&Lead\", or similar fused titles.
48
+            """
44 49
             switch language {
45 50
             case .english:
46
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only), e.g. \"Creative Cascade\"."
47
-            case .chineseTraditional:
48
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only) suitable as localization keys, e.g. \"Creative Cascade\" — do not use Chinese characters in `name`."
49
-            case .chineseSimplified:
50
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only) suitable as localization keys, e.g. \"Design Dynamo\" — do not use Chinese characters in `name`."
51
-            case .arabic:
52
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only) suitable as localization keys, e.g. \"UI Sculptor\" — do not use Arabic script in `name`."
53
-            case .french, .frenchCanada:
54
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only) suitable as localization keys, e.g. \"Creative Cascade\" — do not use French characters in `name`."
55
-            case .german:
56
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only) suitable as localization keys, e.g. \"Creative Cascade\" — do not use German characters in `name`."
57
-            case .swedish:
58
-                return "Each `name` must be 1–3 English words (ASCII letters and spaces only) suitable as localization keys, e.g. \"Creative Cascade\" — do not use Swedish characters in `name`."
51
+                return spacingRule
52
+            case .chineseTraditional, .chineseSimplified, .arabic, .french, .frenchCanada, .german, .swedish:
53
+                return spacingRule + " The app localizes these English keys client-side — do not use non-English script in `name`."
59 54
             }
60 55
         }
61 56
     }

+ 334 - 0
App for Indeed/Services/TemplateNameTokenLexicon.swift

@@ -0,0 +1,334 @@
1
+//
2
+//  TemplateNameTokenLexicon.swift
3
+//  App for Indeed
4
+//
5
+//  Per-word vocabulary for AI-invented CV template titles (often camelCase or
6
+//  concatenated English) when no full-string key exists in Localizable.strings.
7
+//
8
+
9
+import Foundation
10
+
11
+enum TemplateNameTokenLexicon {
12
+    static func lookup(_ token: String, language: AppLanguage) -> String? {
13
+        let trimmed = token.trimmingCharacters(in: .whitespacesAndNewlines)
14
+        guard !trimmed.isEmpty else { return nil }
15
+
16
+        let table = table(for: language)
17
+        for candidate in lookupCandidates(for: trimmed) {
18
+            if let hit = table[candidate] { return hit }
19
+        }
20
+        return nil
21
+    }
22
+
23
+    /// English key plus common inflections (plurals, -ics, etc.) used in AI titles.
24
+    private static func lookupCandidates(for token: String) -> [String] {
25
+        var seen = Set<String>()
26
+        var results: [String] = []
27
+
28
+        func append(_ value: String) {
29
+            let v = value.trimmingCharacters(in: .whitespacesAndNewlines)
30
+            guard !v.isEmpty, seen.insert(v).inserted else { return }
31
+            results.append(v)
32
+        }
33
+
34
+        append(token)
35
+        append(token.capitalized)
36
+        append(normalizedKey(token))
37
+
38
+        let key = normalizedKey(token)
39
+        if key.hasSuffix("ies"), key.count > 4 {
40
+            append(String(key.dropLast(3)) + "y")
41
+        }
42
+        if key.hasSuffix("ics"), key.count > 4 {
43
+            append(String(key.dropLast(1)))
44
+        }
45
+        if key.hasSuffix("ions"), key.count > 5 {
46
+            append(String(key.dropLast(1)))
47
+            append(String(key.dropLast(3)) + "ion")
48
+        }
49
+        if key.hasSuffix("ness"), key.count > 5 {
50
+            append(String(key.dropLast(4)))
51
+        }
52
+        if key.hasSuffix("ity"), key.count > 4 {
53
+            append(String(key.dropLast(3)) + "e")
54
+            append(String(key.dropLast(3)) + "y")
55
+        }
56
+        if key.hasSuffix("es"), key.count > 3 {
57
+            append(String(key.dropLast(2)))
58
+            append(String(key.dropLast(1)))
59
+        }
60
+        if key.hasSuffix("s"), key.count > 2, !key.hasSuffix("ss") {
61
+            append(String(key.dropLast(1)))
62
+        }
63
+
64
+        return results
65
+    }
66
+
67
+    private static func normalizedKey(_ token: String) -> String {
68
+        token.prefix(1).uppercased() + token.dropFirst().lowercased()
69
+    }
70
+
71
+    private static func table(for language: AppLanguage) -> [String: String] {
72
+        switch language {
73
+        case .english:
74
+            return [:]
75
+        case .chineseSimplified:
76
+            return zhHans
77
+        case .chineseTraditional:
78
+            return zhHant
79
+        case .arabic:
80
+            return ar
81
+        case .german:
82
+            return de
83
+        case .french, .frenchCanada:
84
+            return fr
85
+        case .swedish:
86
+            return sv
87
+        }
88
+    }
89
+
90
+    static let zhHans: [String: String] = buildTable(\.zhHans)
91
+    static let zhHant: [String: String] = buildTable(\.zhHant)
92
+    static let ar: [String: String] = buildTable(\.ar)
93
+    static let de: [String: String] = buildTable(\.de)
94
+    static let fr: [String: String] = buildTable(\.fr)
95
+    static let sv: [String: String] = buildTable(\.sv)
96
+}
97
+
98
+// MARK: - Master vocabulary (one row per English token, all locales)
99
+
100
+private struct TemplateNameTokenRow {
101
+    let key: String
102
+    let zhHans: String
103
+    let zhHant: String
104
+    let de: String
105
+    let fr: String
106
+    let sv: String
107
+    let ar: String
108
+}
109
+
110
+private let templateNameTokenRows: [TemplateNameTokenRow] = [
111
+    .init(key: "AI", zhHans: "人工智能", zhHant: "人工智慧", de: "KI", fr: "IA", sv: "AI", ar: "ذكاء اصطناعي"),
112
+    .init(key: "ATS", zhHans: "ATS", zhHant: "ATS", de: "ATS", fr: "ATS", sv: "ATS", ar: "ATS"),
113
+    .init(key: "Aesthetic", zhHans: "美学", zhHant: "美學", de: "Ästhetik", fr: "Esthétique", sv: "Estetik", ar: "جمالي"),
114
+    .init(key: "Aesthetics", zhHans: "美学", zhHant: "美學", de: "Ästhetik", fr: "Esthétique", sv: "Estetik", ar: "جماليات"),
115
+    .init(key: "Airy", zhHans: "通透", zhHant: "通透", de: "Luftig", fr: "Aérien", sv: "Luftig", ar: "خفيف"),
116
+    .init(key: "Apex", zhHans: "巅峰", zhHant: "巔峰", de: "Spitze", fr: "Sommet", sv: "Topp", ar: "قمة"),
117
+    .init(key: "Arc", zhHans: "弧线", zhHant: "弧線", de: "Bogen", fr: "Arc", sv: "Båge", ar: "قوس"),
118
+    .init(key: "Artistic", zhHans: "艺术", zhHant: "藝術", de: "Künstlerisch", fr: "Artistique", sv: "Konstnärlig", ar: "فني"),
119
+    .init(key: "Atlas", zhHans: "地图", zhHant: "地圖", de: "Atlas", fr: "Atlas", sv: "Atlas", ar: "أطلس"),
120
+    .init(key: "Axis", zhHans: "轴线", zhHant: "軸線", de: "Achse", fr: "Axe", sv: "Axel", ar: "محور"),
121
+    .init(key: "Balance", zhHans: "平衡", zhHant: "平衡", de: "Balance", fr: "Équilibre", sv: "Balans", ar: "توازن"),
122
+    .init(key: "Beacon", zhHans: "灯塔", zhHant: "燈塔", de: "Leuchtfeuer", fr: "Phare", sv: "Fyr", ar: "منارة"),
123
+    .init(key: "Blueprint", zhHans: "蓝图", zhHant: "藍圖", de: "Bauplan", fr: "Plan", sv: "Ritning", ar: "مخطط"),
124
+    .init(key: "Bloom", zhHans: "绽放", zhHant: "綻放", de: "Blüte", fr: "Floraison", sv: "Blomning", ar: "ازدهار"),
125
+    .init(key: "Blue", zhHans: "蓝", zhHant: "藍", de: "Blau", fr: "Bleu", sv: "Blå", ar: "أزرق"),
126
+    .init(key: "Bold", zhHans: "大胆", zhHant: "大膽", de: "Mutig", fr: "Audacieux", sv: "Djärv", ar: "جريء"),
127
+    .init(key: "Brilliance", zhHans: "光彩", zhHant: "光彩", de: "Glanz", fr: "Éclat", sv: "Glans", ar: "تألق"),
128
+    .init(key: "Briefing", zhHans: "简报", zhHant: "簡報", de: "Kurzüberblick", fr: "Synthèse", sv: "Sammanfattning", ar: "موجز"),
129
+    .init(key: "Bright", zhHans: "明亮", zhHant: "明亮", de: "Hell", fr: "Lumineux", sv: "Ljus", ar: "مشرق"),
130
+    .init(key: "Canvas", zhHans: "画布", zhHant: "畫布", de: "Leinwand", fr: "Toile", sv: "Duk", ar: "لوحة"),
131
+    .init(key: "Cascade", zhHans: "层叠", zhHant: "層疊", de: "Kaskade", fr: "Cascade", sv: "Kaskad", ar: "تتالي"),
132
+    .init(key: "Chairman", zhHans: "主席", zhHant: "主席", de: "Vorsitzender", fr: "Président", sv: "Ordförande", ar: "رئيس"),
133
+    .init(key: "Charter", zhHans: "宪章", zhHant: "憲章", de: "Charta", fr: "Charte", sv: "Stadga", ar: "ميثاق"),
134
+    .init(key: "Chronicle", zhHans: "纪事", zhHant: "紀事", de: "Chronik", fr: "Chronique", sv: "Krönika", ar: "سجل"),
135
+    .init(key: "Circuit", zhHans: "电路", zhHant: "電路", de: "Schaltung", fr: "Circuit", sv: "Krets", ar: "دائرة"),
136
+    .init(key: "Clarity", zhHans: "明晰", zhHant: "明晰", de: "Klarheit", fr: "Clarté", sv: "Klarhet", ar: "وضوح"),
137
+    .init(key: "Clean", zhHans: "洁净", zhHant: "潔淨", de: "Sauber", fr: "Propre", sv: "Ren", ar: "نظيف"),
138
+    .init(key: "Clear", zhHans: "清晰", zhHant: "清晰", de: "Klar", fr: "Clair", sv: "Klar", ar: "واضح"),
139
+    .init(key: "Compass", zhHans: "罗盘", zhHant: "羅盤", de: "Kompass", fr: "Boussole", sv: "Kompass", ar: "بوصلة"),
140
+    .init(key: "Conduit", zhHans: "管道", zhHant: "管道", de: "Leitung", fr: "Conduit", sv: "Ledning", ar: "قناة"),
141
+    .init(key: "Core", zhHans: "核心", zhHant: "核心", de: "Kern", fr: "Noyau", sv: "Kärna", ar: "جوهر"),
142
+    .init(key: "Corporate", zhHans: "企业", zhHant: "企業", de: "Unternehmen", fr: "Entreprise", sv: "Företag", ar: "مؤسسي"),
143
+    .init(key: "Craft", zhHans: "工艺", zhHant: "工藝", de: "Handwerk", fr: "Artisanat", sv: "Hantverk", ar: "حرفة"),
144
+    .init(key: "Crisp", zhHans: "清爽", zhHant: "清爽", de: "Knackig", fr: "Net", sv: "Skarp", ar: "حاد"),
145
+    .init(key: "Creative", zhHans: "创意", zhHant: "創意", de: "Kreativ", fr: "Créatif", sv: "Kreativ", ar: "إبداعي"),
146
+    .init(key: "Crest", zhHans: "峰顶", zhHant: "峰頂", de: "Kamm", fr: "Crête", sv: "Kam", ar: "قمة"),
147
+    .init(key: "Design", zhHans: "设计", zhHant: "設計", de: "Design", fr: "Design", sv: "Design", ar: "تصميم"),
148
+    .init(key: "Dimension", zhHans: "维度", zhHant: "維度", de: "Dimension", fr: "Dimension", sv: "Dimension", ar: "بعد"),
149
+    .init(key: "Docket", zhHans: "待办", zhHant: "待辦", de: "Dokument", fr: "Rôle", sv: "Diarium", ar: "سجل"),
150
+    .init(key: "Driven", zhHans: "驱动", zhHant: "驅動", de: "Orientiert", fr: "Orienté", sv: "Driven", ar: "موجه"),
151
+    .init(key: "Dynamic", zhHans: "动态", zhHant: "動態", de: "Dynamisch", fr: "Dynamique", sv: "Dynamisk", ar: "ديناميكي"),
152
+    .init(key: "Dynamo", zhHans: "动力", zhHant: "動力", de: "Dynamik", fr: "Dynamique", sv: "Dynamik", ar: "ديناميكي"),
153
+    .init(key: "Echo", zhHans: "回音", zhHant: "回音", de: "Echo", fr: "Écho", sv: "Eko", ar: "صدى"),
154
+    .init(key: "Edge", zhHans: "边缘", zhHant: "邊緣", de: "Kante", fr: "Bord", sv: "Kant", ar: "حافة"),
155
+    .init(key: "Effortless", zhHans: "轻松", zhHant: "輕鬆", de: "Mühelos", fr: "Sans effort", sv: "Ansträngningslös", ar: "بلا جهد"),
156
+    .init(key: "Elegance", zhHans: "优雅", zhHant: "優雅", de: "Eleganz", fr: "Élégance", sv: "Elegans", ar: "أناقة"),
157
+    .init(key: "Element", zhHans: "元素", zhHant: "元素", de: "Element", fr: "Élément", sv: "Element", ar: "عنصر"),
158
+    .init(key: "Elevate", zhHans: "提升", zhHant: "提升", de: "Erheben", fr: "Élever", sv: "Lyft", ar: "رفع"),
159
+    .init(key: "Elite", zhHans: "精英", zhHant: "精英", de: "Elite", fr: "Élite", sv: "Elit", ar: "نخبة"),
160
+    .init(key: "Ember", zhHans: "余烬", zhHant: "餘燼", de: "Glut", fr: "Braise", sv: "Glöd", ar: "جمر"),
161
+    .init(key: "Essence", zhHans: "本质", zhHant: "本質", de: "Essenz", fr: "Essence", sv: "Essens", ar: "جوهر"),
162
+    .init(key: "Estate", zhHans: "庄园", zhHant: "莊園", de: "Anwesen", fr: "Domaine", sv: "Egendom", ar: "عقار"),
163
+    .init(key: "Executive", zhHans: "高管", zhHant: "高階", de: "Führungskraft", fr: "Cadre", sv: "Chefsnivå", ar: "تنفيذي"),
164
+    .init(key: "Expression", zhHans: "表达", zhHant: "表達", de: "Ausdruck", fr: "Expression", sv: "Uttryck", ar: "تعبير"),
165
+    .init(key: "Expressions", zhHans: "表达", zhHant: "表達", de: "Ausdruck", fr: "Expressions", sv: "Uttryck", ar: "تعبيرات"),
166
+    .init(key: "Facet", zhHans: "刻面", zhHant: "刻面", de: "Facette", fr: "Facette", sv: "Facett", ar: "وجه"),
167
+    .init(key: "Focus", zhHans: "聚焦", zhHant: "聚焦", de: "Fokus", fr: "Focus", sv: "Fokus", ar: "تركيز"),
168
+    .init(key: "Focused", zhHans: "专注", zhHant: "專注", de: "Fokussiert", fr: "Ciblé", sv: "Fokuserad", ar: "مركّز"),
169
+    .init(key: "Forge", zhHans: "锻造", zhHant: "鍛造", de: "Schmiede", fr: "Forge", sv: "Smedja", ar: "حدادة"),
170
+    .init(key: "Form", zhHans: "形态", zhHant: "形態", de: "Form", fr: "Forme", sv: "Form", ar: "شكل"),
171
+    .init(key: "Format", zhHans: "格式", zhHant: "格式", de: "Format", fr: "Format", sv: "Format", ar: "تنسيق"),
172
+    .init(key: "Forward", zhHans: "前瞻", zhHant: "前瞻", de: "Voraus", fr: "Avant", sv: "Framåt", ar: "مستقبلي"),
173
+    .init(key: "Foundation", zhHans: "基础", zhHant: "基礎", de: "Fundament", fr: "Fondation", sv: "Grund", ar: "أساس"),
174
+    .init(key: "Frame", zhHans: "框架", zhHant: "框架", de: "Rahmen", fr: "Cadre", sv: "Ram", ar: "إطار"),
175
+    .init(key: "Frontier", zhHans: "前沿", zhHant: "前沿", de: "Grenze", fr: "Frontière", sv: "Gräns", ar: "حدود"),
176
+    .init(key: "Fusion", zhHans: "融合", zhHant: "融合", de: "Fusion", fr: "Fusion", sv: "Fusion", ar: "دمج"),
177
+    .init(key: "Future", zhHans: "未来", zhHant: "未來", de: "Zukunft", fr: "Futur", sv: "Framtid", ar: "مستقبل"),
178
+    .init(key: "Gallery", zhHans: "画廊", zhHant: "畫廊", de: "Galerie", fr: "Galerie", sv: "Galleri", ar: "معرض"),
179
+    .init(key: "Genesis", zhHans: "起源", zhHant: "起源", de: "Genesis", fr: "Genèse", sv: "Genesis", ar: "بداية"),
180
+    .init(key: "Grace", zhHans: "优雅", zhHant: "優雅", de: "Anmut", fr: "Grâce", sv: "Grace", ar: "رشاقة"),
181
+    .init(key: "Graceful", zhHans: "雅致", zhHant: "雅致", de: "Anmutig", fr: "Gracieux", sv: "Graciös", ar: "أنيق"),
182
+    .init(key: "Gradient", zhHans: "渐变", zhHant: "漸變", de: "Verlauf", fr: "Dégradé", sv: "Gradient", ar: "تدرج"),
183
+    .init(key: "Grid", zhHans: "网格", zhHant: "網格", de: "Gitter", fr: "Grille", sv: "Rutnät", ar: "شبكة"),
184
+    .init(key: "Harmony", zhHans: "和谐", zhHant: "和諧", de: "Harmonie", fr: "Harmonie", sv: "Harmoni", ar: "انسجام"),
185
+    .init(key: "Harbor", zhHans: "港湾", zhHant: "港灣", de: "Hafen", fr: "Havre", sv: "Hamn", ar: "ميناء"),
186
+    .init(key: "Heritage", zhHans: "传承", zhHant: "傳承", de: "Erbe", fr: "Héritage", sv: "Arv", ar: "تراث"),
187
+    .init(key: "Horizon", zhHans: "地平线", zhHant: "地平線", de: "Horizont", fr: "Horizon", sv: "Horisont", ar: "أفق"),
188
+    .init(key: "Icon", zhHans: "标志", zhHant: "標誌", de: "Ikone", fr: "Icône", sv: "Ikon", ar: "أيقونة"),
189
+    .init(key: "Iconic", zhHans: "经典", zhHant: "經典", de: "Ikonisch", fr: "Iconique", sv: "Ikonisk", ar: "أيقوني"),
190
+    .init(key: "Identity", zhHans: "身份", zhHant: "身份", de: "Identität", fr: "Identité", sv: "Identitet", ar: "هوية"),
191
+    .init(key: "Impact", zhHans: "影响", zhHant: "影響", de: "Wirkung", fr: "Impact", sv: "Effekt", ar: "تأثير"),
192
+    .init(key: "Imprint", zhHans: "印记", zhHant: "印記", de: "Prägung", fr: "Empreinte", sv: "Avtryck", ar: "بصمة"),
193
+    .init(key: "Insight", zhHans: "洞察", zhHant: "洞察", de: "Einblick", fr: "Perspicacité", sv: "Insikt", ar: "بصيرة"),
194
+    .init(key: "Inspire", zhHans: "启发", zhHant: "啟發", de: "Inspiration", fr: "Inspirer", sv: "Inspirera", ar: "إلهام"),
195
+    .init(key: "Inspired", zhHans: "灵感", zhHant: "靈感", de: "Inspiriert", fr: "Inspiré", sv: "Inspirerad", ar: "ملهم"),
196
+    .init(key: "Innovate", zhHans: "创新", zhHant: "創新", de: "Innovation", fr: "Innovation", sv: "Innovation", ar: "ابتكار"),
197
+    .init(key: "Journey", zhHans: "旅程", zhHant: "旅程", de: "Reise", fr: "Parcours", sv: "Resa", ar: "رحلة"),
198
+    .init(key: "Keystone", zhHans: "基石", zhHant: "基石", de: "Schlüsselstein", fr: "Clé de voûte", sv: "Hörnsten", ar: "حجر الزاوية"),
199
+    .init(key: "Kite", zhHans: "风筝", zhHant: "風箏", de: "Drachen", fr: "Cerf-volant", sv: "Drake", ar: "طائرة ورقية"),
200
+    .init(key: "Landmark", zhHans: "地标", zhHant: "地標", de: "Wahrzeichen", fr: "Repère", sv: "Landmärke", ar: "معلم"),
201
+    .init(key: "Lattice", zhHans: "格栅", zhHant: "格柵", de: "Gitter", fr: "Treillis", sv: "Galler", ar: "شبكة"),
202
+    .init(key: "Lead", zhHans: "引领", zhHant: "引領", de: "Führung", fr: "Conduite", sv: "Ledarskap", ar: "قيادة"),
203
+    .init(key: "Leadership", zhHans: "领导力", zhHant: "領導力", de: "Führung", fr: "Leadership", sv: "Ledarskap", ar: "قيادة"),
204
+    .init(key: "Legacy", zhHans: "传承", zhHant: "傳承", de: "Vermächtnis", fr: "Héritage", sv: "Arv", ar: "إرث"),
205
+    .init(key: "Ledger", zhHans: "账本", zhHant: "帳本", de: "Hauptbuch", fr: "Registre", sv: "Huvudbok", ar: "دفتر"),
206
+    .init(key: "Lens", zhHans: "镜头", zhHant: "鏡頭", de: "Linse", fr: "Objectif", sv: "Lins", ar: "عدسة"),
207
+    .init(key: "Linea", zhHans: "线条", zhHant: "線條", de: "Linie", fr: "Ligne", sv: "Linje", ar: "خط"),
208
+    .init(key: "Linear", zhHans: "线性", zhHant: "線性", de: "Linear", fr: "Linéaire", sv: "Linjär", ar: "خطي"),
209
+    .init(key: "Lumen", zhHans: "光度", zhHant: "光度", de: "Lumen", fr: "Lumen", sv: "Lumen", ar: "لومن"),
210
+    .init(key: "Luminous", zhHans: "明亮", zhHant: "明亮", de: "Leuchtend", fr: "Lumineux", sv: "Lysande", ar: "مضيء"),
211
+    .init(key: "Marigold", zhHans: "金盏花", zhHant: "金盞花", de: "Ringelblume", fr: "Souci", sv: "Ringblomma", ar: "آذريون"),
212
+    .init(key: "Mastery", zhHans: "精通", zhHant: "精通", de: "Meisterschaft", fr: "Maîtrise", sv: "Mästerskap", ar: "إتقان"),
213
+    .init(key: "Matrix", zhHans: "矩阵", zhHant: "矩陣", de: "Matrix", fr: "Matrice", sv: "Matris", ar: "مصفوفة"),
214
+    .init(key: "Meridian", zhHans: "子午", zhHant: "子午", de: "Meridian", fr: "Méridien", sv: "Meridian", ar: "خط الزوال"),
215
+    .init(key: "Mesh", zhHans: "网状", zhHant: "網狀", de: "Netz", fr: "Maillage", sv: "Nät", ar: "شبكة"),
216
+    .init(key: "Minimal", zhHans: "简约", zhHant: "簡約", de: "Minimal", fr: "Minimaliste", sv: "Minimal", ar: "بسيط"),
217
+    .init(key: "Modern", zhHans: "现代", zhHant: "現代", de: "Modern", fr: "Moderne", sv: "Modern", ar: "عصري"),
218
+    .init(key: "Momentum", zhHans: "动能", zhHant: "動能", de: "Schwung", fr: "Élan", sv: "Momentum", ar: "زخم"),
219
+    .init(key: "Mono", zhHans: "单色", zhHant: "單色", de: "Einfarbig", fr: "Monochrome", sv: "Monokrom", ar: "أحادي"),
220
+    .init(key: "Monarch", zhHans: "君主", zhHant: "君主", de: "Monarch", fr: "Monarque", sv: "Monark", ar: "ملك"),
221
+    .init(key: "Mosaic", zhHans: "马赛克", zhHant: "馬賽克", de: "Mosaik", fr: "Mosaïque", sv: "Mosaik", ar: "فسيفساء"),
222
+    .init(key: "Motion", zhHans: "动感", zhHant: "動感", de: "Bewegung", fr: "Mouvement", sv: "Rörelse", ar: "حركة"),
223
+    .init(key: "Narrative", zhHans: "叙事", zhHant: "敘事", de: "Erzählung", fr: "Récit", sv: "Berättelse", ar: "سرد"),
224
+    .init(key: "Native", zhHans: "原生", zhHant: "原生", de: "Nativ", fr: "Natif", sv: "Nativ", ar: "أصلي"),
225
+    .init(key: "Nexus", zhHans: "枢纽", zhHant: "樞紐", de: "Nexus", fr: "Nexus", sv: "Nexus", ar: "رابط"),
226
+    .init(key: "Noble", zhHans: "尊贵", zhHant: "尊貴", de: "Edel", fr: "Noble", sv: "Ädel", ar: "نبيل"),
227
+    .init(key: "North", zhHans: "北方", zhHant: "北方", de: "Norden", fr: "Nord", sv: "Norr", ar: "شمال"),
228
+    .init(key: "Nova", zhHans: "新星", zhHant: "新星", de: "Nova", fr: "Nova", sv: "Nova", ar: "نجم"),
229
+    .init(key: "Ocean", zhHans: "海洋", zhHant: "海洋", de: "Ozean", fr: "Océan", sv: "Ocean", ar: "محيط"),
230
+    .init(key: "Oasis", zhHans: "绿洲", zhHant: "綠洲", de: "Oase", fr: "Oasis", sv: "Oas", ar: "واحة"),
231
+    .init(key: "Opus", zhHans: "作品", zhHant: "作品", de: "Opus", fr: "Opus", sv: "Opus", ar: "opus"),
232
+    .init(key: "Orbit", zhHans: "轨道", zhHant: "軌道", de: "Orbit", fr: "Orbite", sv: "Omloppsbana", ar: "مدار"),
233
+    .init(key: "Origin", zhHans: "起源", zhHant: "起源", de: "Ursprung", fr: "Origine", sv: "Ursprung", ar: "أصل"),
234
+    .init(key: "Outline", zhHans: "轮廓", zhHant: "輪廓", de: "Umriss", fr: "Contour", sv: "Kontur", ar: "مخطط"),
235
+    .init(key: "Palette", zhHans: "调色", zhHant: "調色", de: "Palette", fr: "Palette", sv: "Palett", ar: "لوحة"),
236
+    .init(key: "Path", zhHans: "路径", zhHant: "路徑", de: "Pfad", fr: "Chemin", sv: "Väg", ar: "مسار"),
237
+    .init(key: "Peak", zhHans: "峰", zhHant: "峰", de: "Gipfel", fr: "Sommet", sv: "Topp", ar: "قمة"),
238
+    .init(key: "Performance", zhHans: "绩效", zhHant: "績效", de: "Leistung", fr: "Performance", sv: "Prestation", ar: "أداء"),
239
+    .init(key: "Pinnacle", zhHans: "巅峰", zhHant: "巔峰", de: "Gipfel", fr: "Apogée", sv: "Topp", ar: "ذروة"),
240
+    .init(key: "Pioneer", zhHans: "先锋", zhHant: "先鋒", de: "Pionier", fr: "Pionnier", sv: "Pionjär", ar: "رائد"),
241
+    .init(key: "Pixel", zhHans: "像素", zhHant: "像素", de: "Pixel", fr: "Pixel", sv: "Pixel", ar: "بكسل"),
242
+    .init(key: "Pinstripe", zhHans: "细条纹", zhHant: "細條紋", de: "Nadelstreifen", fr: "Rayures fines", sv: "Smala ränder", ar: "خطوط"),
243
+    .init(key: "Poise", zhHans: "从容", zhHant: "從容", de: "Haltung", fr: "Assurance", sv: "Balans", ar: "اتزان"),
244
+    .init(key: "Portrait", zhHans: "肖像", zhHant: "肖像", de: "Porträt", fr: "Portrait", sv: "Porträtt", ar: "صورة"),
245
+    .init(key: "Prelude", zhHans: "序章", zhHant: "序章", de: "Präludium", fr: "Prélude", sv: "Preludium", ar: "مقدمة"),
246
+    .init(key: "Prestige", zhHans: "声望", zhHant: "聲望", de: "Prestige", fr: "Prestige", sv: "Prestige", ar: "هيبة"),
247
+    .init(key: "Principal", zhHans: "首席", zhHant: "首席", de: "Leitend", fr: "Principal", sv: "Ledande", ar: "رئيسي"),
248
+    .init(key: "Prime", zhHans: "首要", zhHant: "首要", de: "Prime", fr: "Premier", sv: "Prim", ar: "أول"),
249
+    .init(key: "Prism", zhHans: "棱镜", zhHant: "稜鏡", de: "Prisma", fr: "Prisme", sv: "Prisma", ar: "منشور"),
250
+    .init(key: "Professional", zhHans: "专业", zhHant: "專業", de: "Professionell", fr: "Professionnel", sv: "Professionell", ar: "احترافي"),
251
+    .init(key: "Profile", zhHans: "档案", zhHant: "檔案", de: "Profil", fr: "Profil", sv: "Profil", ar: "ملف"),
252
+    .init(key: "Progress", zhHans: "进步", zhHant: "進步", de: "Fortschritt", fr: "Progrès", sv: "Framsteg", ar: "تقدم"),
253
+    .init(key: "Pulse", zhHans: "脉动", zhHant: "脈動", de: "Puls", fr: "Pulsation", sv: "Puls", ar: "نبض"),
254
+    .init(key: "Pure", zhHans: "纯净", zhHant: "純淨", de: "Rein", fr: "Pur", sv: "Ren", ar: "نقي"),
255
+    .init(key: "Quantum", zhHans: "量子", zhHant: "量子", de: "Quantum", fr: "Quantum", sv: "Quantum", ar: "كم"),
256
+    .init(key: "Quest", zhHans: "探索", zhHant: "探索", de: "Quest", fr: "Quête", sv: "Quest", ar: "رحلة"),
257
+    .init(key: "Quorum", zhHans: "法定人数", zhHant: "法定人數", de: "Quorum", fr: "Quorum", sv: "Kvorum", ar: "نصاب"),
258
+    .init(key: "Radiance", zhHans: "光辉", zhHant: "光輝", de: "Glanz", fr: "Éclat", sv: "Glans", ar: "إشراق"),
259
+    .init(key: "Realm", zhHans: "领域", zhHant: "領域", de: "Reich", fr: "Royaume", sv: "Rike", ar: "مجال"),
260
+    .init(key: "Refined", zhHans: "精致", zhHant: "精緻", de: "Verfeinert", fr: "Raffiné", sv: "Förfinad", ar: "مُنقّى"),
261
+    .init(key: "Reflection", zhHans: "映像", zhHant: "映像", de: "Reflexion", fr: "Réflexion", sv: "Reflektion", ar: "انعكاس"),
262
+    .init(key: "Regent", zhHans: "摄政", zhHant: "攝政", de: "Regent", fr: "Régent", sv: "Ställföreträdare", ar: "وصي"),
263
+    .init(key: "Resonance", zhHans: "共鸣", zhHant: "共鳴", de: "Resonanz", fr: "Résonance", sv: "Resonans", ar: "صدى"),
264
+    .init(key: "Rhythm", zhHans: "韵律", zhHant: "韻律", de: "Rhythmus", fr: "Rythme", sv: "Rytm", ar: "إيقاع"),
265
+    .init(key: "Rise", zhHans: "崛起", zhHant: "崛起", de: "Aufstieg", fr: "Ascension", sv: "Uppgång", ar: "صعود"),
266
+    .init(key: "River", zhHans: "河", zhHant: "河", de: "Fluss", fr: "Rivière", sv: "Flod", ar: "نهر"),
267
+    .init(key: "Sculptor", zhHans: "雕刻", zhHant: "雕刻", de: "Bildhauer", fr: "Sculpteur", sv: "Bildhuggare", ar: "نحات"),
268
+    .init(key: "Serene", zhHans: "宁静", zhHant: "寧靜", de: "Gelassen", fr: "Serein", sv: "Lugn", ar: "هادئ"),
269
+    .init(key: "Serenity", zhHans: "宁静", zhHant: "寧靜", de: "Gelassenheit", fr: "Sérénité", sv: "Lugn", ar: "سكينة"),
270
+    .init(key: "Shape", zhHans: "形态", zhHant: "形態", de: "Form", fr: "Forme", sv: "Form", ar: "شكل"),
271
+    .init(key: "Sharp", zhHans: "锐利", zhHant: "銳利", de: "Scharf", fr: "Net", sv: "Skarp", ar: "حاد"),
272
+    .init(key: "Shift", zhHans: "转换", zhHant: "轉換", de: "Wandel", fr: "Shift", sv: "Skift", ar: "تحول"),
273
+    .init(key: "Signature", zhHans: "签名", zhHant: "簽名", de: "Signatur", fr: "Signature", sv: "Signatur", ar: "توقيع"),
274
+    .init(key: "Silhouette", zhHans: "剪影", zhHant: "剪影", de: "Silhouette", fr: "Silhouette", sv: "Silhuett", ar: "silhouette"),
275
+    .init(key: "Simplicity", zhHans: "简约", zhHant: "簡約", de: "Einfachheit", fr: "Simplicité", sv: "Enkelhet", ar: "بساطة"),
276
+    .init(key: "Slate", zhHans: "石板", zhHant: "石板", de: "Schiefer", fr: "Ardoise", sv: "Skiffer", ar: "لوح"),
277
+    .init(key: "Sleek", zhHans: "流畅", zhHant: "流暢", de: "Schlank", fr: "Élégant", sv: "Slank", ar: "أنيق"),
278
+    .init(key: "Skyline", zhHans: "天际", zhHant: "天際", de: "Skyline", fr: "Horizon urbain", sv: "Silhuett", ar: "أفق"),
279
+    .init(key: "Spark", zhHans: "火花", zhHant: "火花", de: "Funke", fr: "Étincelle", sv: "Gnista", ar: "شرارة"),
280
+    .init(key: "Spectrum", zhHans: "光谱", zhHant: "光譜", de: "Spektrum", fr: "Spectre", sv: "Spektrum", ar: "طيف"),
281
+    .init(key: "Spirit", zhHans: "精神", zhHant: "精神", de: "Geist", fr: "Esprit", sv: "Ande", ar: "روح"),
282
+    .init(key: "Spotlight", zhHans: "聚光", zhHant: "聚光", de: "Rampenlicht", fr: "Projecteur", sv: "Rampljus", ar: "spotlight"),
283
+    .init(key: "Sterling", zhHans: "纯正", zhHant: "純正", de: "Erstklassig", fr: "Excellence", sv: "Förstklassig", ar: "ممتاز"),
284
+    .init(key: "Stone", zhHans: "石", zhHant: "石", de: "Stein", fr: "Pierre", sv: "Sten", ar: "حجر"),
285
+    .init(key: "Story", zhHans: "故事", zhHant: "故事", de: "Story", fr: "Histoire", sv: "Berättelse", ar: "قصة"),
286
+    .init(key: "Strategic", zhHans: "战略", zhHant: "戰略", de: "Strategisch", fr: "Stratégique", sv: "Strategisk", ar: "استراتيجي"),
287
+    .init(key: "Stream", zhHans: "流线", zhHant: "流線", de: "Strom", fr: "Flux", sv: "Ström", ar: "تيار"),
288
+    .init(key: "Structure", zhHans: "结构", zhHant: "結構", de: "Struktur", fr: "Structure", sv: "Struktur", ar: "هيكل"),
289
+    .init(key: "Studio", zhHans: "工作室", zhHant: "工作室", de: "Atelier", fr: "Atelier", sv: "Ateljé", ar: "استوديو"),
290
+    .init(key: "Style", zhHans: "风格", zhHant: "風格", de: "Stil", fr: "Style", sv: "Stil", ar: "أسلوب"),
291
+    .init(key: "Styled", zhHans: "风格化", zhHant: "風格化", de: "Gestylt", fr: "Stylisé", sv: "Stylad", ar: "منسق"),
292
+    .init(key: "Summit", zhHans: "顶峰", zhHant: "頂峰", de: "Gipfel", fr: "Sommet", sv: "Topp", ar: "قمة"),
293
+    .init(key: "Surge", zhHans: "浪潮", zhHant: "浪潮", de: "Schub", fr: "Impulsion", sv: "Våg", ar: "موجة"),
294
+    .init(key: "Swiss", zhHans: "瑞士", zhHant: "瑞士", de: "Schweizer", fr: "Suisse", sv: "Schweizisk", ar: "سويسري"),
295
+    .init(key: "Swift", zhHans: "迅捷", zhHant: "迅捷", de: "Schnell", fr: "Rapide", sv: "Snabb", ar: "سريع"),
296
+    .init(key: "Synergy", zhHans: "协同", zhHant: "協同", de: "Synergie", fr: "Synergie", sv: "Synergi", ar: "تآزر"),
297
+    .init(key: "Tabular", zhHans: "表格", zhHant: "表格", de: "Tabellarisch", fr: "Tabulaire", sv: "Tabellformad", ar: "جدولي"),
298
+    .init(key: "Tapestry", zhHans: "织锦", zhHant: "織錦", de: "Tapisserie", fr: "Tapisserie", sv: "Tapet", ar: "نسيج"),
299
+    .init(key: "Tempo", zhHans: "节奏", zhHant: "節奏", de: "Tempo", fr: "Tempo", sv: "Tempo", ar: "إيقاع"),
300
+    .init(key: "Tone", zhHans: "色调", zhHant: "色調", de: "Ton", fr: "Ton", sv: "Ton", ar: "نبرة"),
301
+    .init(key: "Trail", zhHans: "轨迹", zhHant: "軌跡", de: "Pfad", fr: "Piste", sv: "Stig", ar: "مسار"),
302
+    .init(key: "Triumph", zhHans: "凯旋", zhHant: "凱旋", de: "Triumph", fr: "Triomphe", sv: "Triumf", ar: "انتصار"),
303
+    .init(key: "True", zhHans: "真实", zhHant: "真實", de: "Wahr", fr: "Vrai", sv: "Sann", ar: "حقيقي"),
304
+    .init(key: "Trust", zhHans: "信任", zhHant: "信任", de: "Vertrauen", fr: "Confiance", sv: "Förtroende", ar: "ثقة"),
305
+    .init(key: "UI", zhHans: "界面", zhHant: "介面", de: "UI", fr: "UI", sv: "UI", ar: "واجهة"),
306
+    .init(key: "Unity", zhHans: "统一", zhHant: "統一", de: "Einheit", fr: "Unité", sv: "Enhet", ar: "وحدة"),
307
+    .init(key: "Urban", zhHans: "都市", zhHant: "都市", de: "Urban", fr: "Urbain", sv: "Urban", ar: "حضري"),
308
+    .init(key: "UX", zhHans: "体验", zhHant: "體驗", de: "UX", fr: "UX", sv: "UX", ar: "تجربة"),
309
+    .init(key: "Vale", zhHans: "谷", zhHant: "谷", de: "Tal", fr: "Vallée", sv: "Dal", ar: "وadi"),
310
+    .init(key: "Valor", zhHans: "勇气", zhHant: "勇氣", de: "Tapferkeit", fr: "Vaillance", sv: "Tapperhet", ar: "شجاعة"),
311
+    .init(key: "Vault", zhHans: "宝库", zhHant: "寶庫", de: "Tresor", fr: "Coffre", sv: "Valv", ar: "خزنة"),
312
+    .init(key: "Vector", zhHans: "向量", zhHant: "向量", de: "Vektor", fr: "Vecteur", sv: "Vektor", ar: "متجه"),
313
+    .init(key: "Venture", zhHans: "创业", zhHant: "創業", de: "Unternehmung", fr: "Aventure", sv: "Satsning", ar: "مشروع"),
314
+    .init(key: "Vertex", zhHans: "顶点", zhHant: "頂點", de: "Scheitelpunkt", fr: "Sommet", sv: "Toppunkt", ar: "رأس"),
315
+    .init(key: "Vibe", zhHans: "氛围", zhHant: "氛圍", de: "Stimmung", fr: "Ambiance", sv: "Stämning", ar: "أجواء"),
316
+    .init(key: "Vibrant", zhHans: "活力", zhHant: "活力", de: "Lebhaft", fr: "Vibrant", sv: "Livfull", ar: "حيوي"),
317
+    .init(key: "Vision", zhHans: "愿景", zhHant: "願景", de: "Vision", fr: "Vision", sv: "Vision", ar: "رؤية"),
318
+    .init(key: "Visionary", zhHans: "远见", zhHant: "遠見", de: "Visionär", fr: "Visionnaire", sv: "Visionär", ar: "رؤيوي"),
319
+    .init(key: "Visual", zhHans: "视觉", zhHant: "視覺", de: "Visuell", fr: "Visuel", sv: "Visuell", ar: "بصري"),
320
+    .init(key: "Vital", zhHans: "关键", zhHant: "關鍵", de: "Vital", fr: "Vital", sv: "Vital", ar: "حيوي"),
321
+    .init(key: "Vivid", zhHans: "鲜明", zhHant: "鮮明", de: "Lebhaft", fr: "Vif", sv: "Livfull", ar: "حي"),
322
+    .init(key: "Voice", zhHans: "声音", zhHant: "聲音", de: "Stimme", fr: "Voix", sv: "Röst", ar: "صوت"),
323
+    .init(key: "Voyage", zhHans: "航程", zhHant: "航程", de: "Reise", fr: "Voyage", sv: "Resa", ar: "رحلة"),
324
+    .init(key: "Wave", zhHans: "波浪", zhHant: "波浪", de: "Welle", fr: "Vague", sv: "Våg", ar: "موجة"),
325
+    .init(key: "White", zhHans: "白", zhHant: "白", de: "Weiß", fr: "Blanc", sv: "Vit", ar: "أبيض"),
326
+    .init(key: "Zen", zhHans: "禅", zhHant: "禪", de: "Zen", fr: "Zen", sv: "Zen", ar: "zen"),
327
+    .init(key: "Zenith", zhHans: "天顶", zhHant: "天頂", de: "Zenit", fr: "Zénith", sv: "Zenit", ar: "ذروة"),
328
+    .init(key: "Flux", zhHans: "流变", zhHant: "流變", de: "Fluss", fr: "Flux", sv: "Flöde", ar: "flux"),
329
+    .init(key: "Flow", zhHans: "流动", zhHant: "流動", de: "Fluss", fr: "Flux", sv: "Flöde", ar: "flow")
330
+]
331
+
332
+private func buildTable(_ keyPath: KeyPath<TemplateNameTokenRow, String>) -> [String: String] {
333
+    Dictionary(uniqueKeysWithValues: templateNameTokenRows.map { ($0.key, $0[keyPath: keyPath]) })
334
+}

+ 22 - 0
App for Indeed/ar.lproj/Localizable.strings

@@ -289,6 +289,28 @@
289 289
 "Chairman" = "رئيس مجلس الإدارة";
290 290
 "Blue Ocean" = "المحيط الأزرق";
291 291
 
292
+// MARK: - أسماء قوالب السيرة الذاتية بالذكاء الاصطناعي
293
+"Design Frontier" = "حدود التصميم";
294
+"Modern Aesthetics" = "جماليات عصرية";
295
+"Creative Expressions" = "تعبيرات إبداعية";
296
+"Performance Driven" = "موجه بالأداء";
297
+"Innovate Lead" = "الابتكار والقيادة";
298
+"Visionary Leadership" = "قيادة رؤيوية";
299
+"Effortless Elegance" = "أناقة بلا جهد";
300
+"Pure Simplicity" = "بساطة نقية";
301
+"Crisp Clarity" = "وضوح حاد";
302
+"Artistic Imprint" = "بصمة فنية";
303
+"Visionary Design" = "تصميم رؤيوي";
304
+"Modern Vision" = "رؤية عصرية";
305
+"Modern Creative" = "إبداع عصري";
306
+"Creative Cascade" = "تتالي إبداعي";
307
+"Design Dynamo" = "ديناميكية التصميم";
308
+"UI Sculptor" = "نحات الواجهة";
309
+"Blue Horizon" = "أفق أزرق";
310
+"Clear Vision" = "رؤية واضحة";
311
+"Bold Statement" = "بيان جريء";
312
+"Clean Slate" = "بداية نظيفة";
313
+
292 314
 // MARK: - محتوى معاينة السيرة الذاتية التجريبي
293 315
 "Sarah Johnson" = "سارة جونسون";
294 316
 "Senior Product Manager" = "مدير منتج أول";

+ 22 - 0
App for Indeed/de.lproj/Localizable.strings

@@ -289,6 +289,28 @@
289 289
 "Chairman" = "Vorsitzender";
290 290
 "Blue Ocean" = "Blauer Ozean";
291 291
 
292
+// MARK: - KI-Lebenslauf-Vorlagennamen (häufige Zweiwort-Kombinationen)
293
+"Design Frontier" = "Design-Grenze";
294
+"Modern Aesthetics" = "Moderne Ästhetik";
295
+"Creative Expressions" = "Kreative Ausdrücke";
296
+"Performance Driven" = "Leistungsorientiert";
297
+"Innovate Lead" = "Innovation & Führung";
298
+"Visionary Leadership" = "Visionäre Führung";
299
+"Effortless Elegance" = "Mühelose Eleganz";
300
+"Pure Simplicity" = "Reine Einfachheit";
301
+"Crisp Clarity" = "Knackige Klarheit";
302
+"Artistic Imprint" = "Künstlerischer Abdruck";
303
+"Visionary Design" = "Visionäres Design";
304
+"Modern Vision" = "Moderne Vision";
305
+"Modern Creative" = "Modern Kreativ";
306
+"Creative Cascade" = "Kreative Kaskade";
307
+"Design Dynamo" = "Design-Dynamik";
308
+"UI Sculptor" = "UI-Bildhauer";
309
+"Blue Horizon" = "Blauer Horizont";
310
+"Clear Vision" = "Klare Vision";
311
+"Bold Statement" = "Mutiges Statement";
312
+"Clean Slate" = "Sauberer Start";
313
+
292 314
 // MARK: - Lebenslauf-Demo-Vorschauinhalt
293 315
 "Sarah Johnson" = "Anna Müller";
294 316
 "Senior Product Manager" = "Senior Produktmanager";

+ 22 - 0
App for Indeed/fr-CA.lproj/Localizable.strings

@@ -289,6 +289,28 @@
289 289
 "Chairman" = "Président";
290 290
 "Blue Ocean" = "Océan Bleu";
291 291
 
292
+// MARK: - Noms de modèles CV IA (combinaisons courantes)
293
+"Design Frontier" = "Frontière Design";
294
+"Modern Aesthetics" = "Esthétique Moderne";
295
+"Creative Expressions" = "Expressions Créatives";
296
+"Performance Driven" = "Orienté Performance";
297
+"Innovate Lead" = "Innovation et Leadership";
298
+"Visionary Leadership" = "Leadership Visionnaire";
299
+"Effortless Elegance" = "Élégance Sans Effort";
300
+"Pure Simplicity" = "Simplicité Pure";
301
+"Crisp Clarity" = "Clarté Nette";
302
+"Artistic Imprint" = "Empreinte Artistique";
303
+"Visionary Design" = "Design Visionnaire";
304
+"Modern Vision" = "Vision Moderne";
305
+"Modern Creative" = "Créatif Moderne";
306
+"Creative Cascade" = "Cascade Créative";
307
+"Design Dynamo" = "Dynamique Design";
308
+"UI Sculptor" = "Sculpteur UI";
309
+"Blue Horizon" = "Horizon Bleu";
310
+"Clear Vision" = "Vision Claire";
311
+"Bold Statement" = "Déclaration Audacieuse";
312
+"Clean Slate" = "Page Blanche";
313
+
292 314
 // MARK: - Contenu de l'aperçu de démonstration du CV
293 315
 "Sarah Johnson" = "Marie Dubois";
294 316
 "Senior Product Manager" = "Chef de produit principal";

+ 22 - 0
App for Indeed/fr.lproj/Localizable.strings

@@ -289,6 +289,28 @@
289 289
 "Chairman" = "Président";
290 290
 "Blue Ocean" = "Océan Bleu";
291 291
 
292
+// MARK: - Noms de modèles CV IA (combinaisons courantes)
293
+"Design Frontier" = "Frontière Design";
294
+"Modern Aesthetics" = "Esthétique Moderne";
295
+"Creative Expressions" = "Expressions Créatives";
296
+"Performance Driven" = "Orienté Performance";
297
+"Innovate Lead" = "Innovation & Leadership";
298
+"Visionary Leadership" = "Leadership Visionnaire";
299
+"Effortless Elegance" = "Élégance Sans Effort";
300
+"Pure Simplicity" = "Simplicité Pure";
301
+"Crisp Clarity" = "Clarté Nette";
302
+"Artistic Imprint" = "Empreinte Artistique";
303
+"Visionary Design" = "Design Visionnaire";
304
+"Modern Vision" = "Vision Moderne";
305
+"Modern Creative" = "Créatif Moderne";
306
+"Creative Cascade" = "Cascade Créative";
307
+"Design Dynamo" = "Dynamique Design";
308
+"UI Sculptor" = "Sculpteur UI";
309
+"Blue Horizon" = "Horizon Bleu";
310
+"Clear Vision" = "Vision Claire";
311
+"Bold Statement" = "Déclaration Audacieuse";
312
+"Clean Slate" = "Page Blanche";
313
+
292 314
 // MARK: - Contenu de l'aperçu de démonstration du CV
293 315
 "Sarah Johnson" = "Marie Dubois";
294 316
 "Senior Product Manager" = "Chef de produit senior";

+ 22 - 0
App for Indeed/sv.lproj/Localizable.strings

@@ -289,6 +289,28 @@
289 289
 "Chairman" = "Ordförande";
290 290
 "Blue Ocean" = "Blått hav";
291 291
 
292
+// MARK: - AI CV-mallnamn (vanliga tvåordskombinationer)
293
+"Design Frontier" = "Designgräns";
294
+"Modern Aesthetics" = "Modern estetik";
295
+"Creative Expressions" = "Kreativa uttryck";
296
+"Performance Driven" = "Prestationsdriven";
297
+"Innovate Lead" = "Innovation och ledarskap";
298
+"Visionary Leadership" = "Visionärt ledarskap";
299
+"Effortless Elegance" = "Ansträngningslös elegans";
300
+"Pure Simplicity" = "Ren enkelhet";
301
+"Crisp Clarity" = "Skarp klarhet";
302
+"Artistic Imprint" = "Konstnärligt avtryck";
303
+"Visionary Design" = "Visionär design";
304
+"Modern Vision" = "Modern vision";
305
+"Modern Creative" = "Modern kreativ";
306
+"Creative Cascade" = "Kreativ kaskad";
307
+"Design Dynamo" = "Designdynamik";
308
+"UI Sculptor" = "UI-bildhuggare";
309
+"Blue Horizon" = "Blå horisont";
310
+"Clear Vision" = "Tydlig vision";
311
+"Bold Statement" = "Djärvt statement";
312
+"Clean Slate" = "Ren start";
313
+
292 314
 // MARK: - CV-demo förhandsgranskningsinnehåll
293 315
 "Sarah Johnson" = "Anna Andersson";
294 316
 "Senior Product Manager" = "Senior produktchef";

+ 22 - 0
App for Indeed/zh-Hans.lproj/Localizable.strings

@@ -290,6 +290,28 @@
290 290
 "Chairman" = "主席";
291 291
 "Blue Ocean" = "蓝海";
292 292
 
293
+// MARK: - AI 简历模板名称(常见双词组合)
294
+"Design Frontier" = "设计前沿";
295
+"Modern Aesthetics" = "现代美学";
296
+"Creative Expressions" = "创意表达";
297
+"Performance Driven" = "绩效驱动";
298
+"Innovate Lead" = "创新引领";
299
+"Visionary Leadership" = "远见领导力";
300
+"Effortless Elegance" = "轻松优雅";
301
+"Pure Simplicity" = "纯粹简约";
302
+"Crisp Clarity" = "清晰明晰";
303
+"Artistic Imprint" = "艺术印记";
304
+"Visionary Design" = "远见设计";
305
+"Modern Vision" = "现代愿景";
306
+"Modern Creative" = "现代创意";
307
+"Creative Cascade" = "创意层叠";
308
+"Design Dynamo" = "设计动力";
309
+"UI Sculptor" = "界面雕刻";
310
+"Blue Horizon" = "蓝色地平线";
311
+"Clear Vision" = "清晰愿景";
312
+"Bold Statement" = "大胆宣言";
313
+"Clean Slate" = "清爽起点";
314
+
293 315
 // MARK: - 简历演示预览内容
294 316
 "Sarah Johnson" = "李雅婷";
295 317
 "Senior Product Manager" = "高级产品经理";

+ 22 - 0
App for Indeed/zh-Hant.lproj/Localizable.strings

@@ -289,6 +289,28 @@
289 289
 "Chairman" = "主席";
290 290
 "Blue Ocean" = "藍海";
291 291
 
292
+// MARK: - AI 履歷模板名稱(常見雙詞組合)
293
+"Design Frontier" = "設計前沿";
294
+"Modern Aesthetics" = "現代美學";
295
+"Creative Expressions" = "創意表達";
296
+"Performance Driven" = "績效驅動";
297
+"Innovate Lead" = "創新引領";
298
+"Visionary Leadership" = "遠見領導力";
299
+"Effortless Elegance" = "輕鬆優雅";
300
+"Pure Simplicity" = "純粹簡約";
301
+"Crisp Clarity" = "清晰明晰";
302
+"Artistic Imprint" = "藝術印記";
303
+"Visionary Design" = "遠見設計";
304
+"Modern Vision" = "現代願景";
305
+"Modern Creative" = "現代創意";
306
+"Creative Cascade" = "創意層疊";
307
+"Design Dynamo" = "設計動力";
308
+"UI Sculptor" = "介面雕刻";
309
+"Blue Horizon" = "藍色地平線";
310
+"Clear Vision" = "清晰願景";
311
+"Bold Statement" = "大膽宣言";
312
+"Clean Slate" = "清爽起點";
313
+
292 314
 // MARK: - 履歷示範預覽內容
293 315
 "Sarah Johnson" = "李雅婷";
294 316
 "Senior Product Manager" = "資深產品經理";