Explorar el Código

Add Simplified Chinese localization and refine locale UX.

Introduce zh-Hans strings, register the locale in Xcode, keep Indeed and Settings language names in English, refresh the default chat greeting when the UI language changes, and translate PDF-related copy for Chinese.

Co-authored-by: Cursor <cursoragent@cursor.com>
AhtashamShahzad1 hace 4 días
padre
commit
550e49d7b3

+ 1 - 0
App for Indeed.xcodeproj/project.pbxproj

@@ -102,6 +102,7 @@
102 102
 				en,
103 103
 				Base,
104 104
 				ar,
105
+				"zh-Hans",
105 106
 			);
106 107
 			mainGroup = 27D852772FB1D367008DF557;
107 108
 			minimizedProjectReferenceProxies = 1;

+ 3 - 0
App for Indeed/AppMarketingLinks.swift

@@ -11,6 +11,9 @@ enum AppMarketingLinks {
11 11
     /// Canonical app name; keep in sync with `INFOPLIST_KEY_CFBundleDisplayName` in the Xcode target.
12 12
     static let displayName = "App for Indeed"
13 13
 
14
+    /// Indeed® brand mark — always Latin “Indeed”, never transliterated in UI.
15
+    static let indeedBrandName = "Indeed"
16
+
14 17
     /// Numeric App Store app ID from App Store Connect (e.g. `1234567890`).
15 18
     static var macAppStoreURL: URL? {
16 19
         guard let appID = resolvedAppStoreAppID else { return nil }

+ 13 - 4
App for Indeed/Services/AppLocalization.swift

@@ -8,9 +8,10 @@
8 8
 
9 9
 import Foundation
10 10
 
11
-enum AppLanguage: String, CaseIterable {
12
-    case english = "English"
13
-    case arabic = "Arabic"
11
+enum AppLanguage: CaseIterable {
12
+    case english
13
+    case arabic
14
+    case chineseSimplified
14 15
 
15 16
     var localeIdentifier: String {
16 17
         switch self {
@@ -18,23 +19,31 @@ enum AppLanguage: String, CaseIterable {
18 19
             return "en"
19 20
         case .arabic:
20 21
             return "ar"
22
+        case .chineseSimplified:
23
+            return "zh-Hans"
21 24
         }
22 25
     }
23 26
 
24 27
     static var systemLanguage: AppLanguage {
25 28
         let preferred = Locale.preferredLanguages.first ?? "en"
29
+        if preferred.lowercased().hasPrefix("zh") {
30
+            return .chineseSimplified
31
+        }
26 32
         for language in AppLanguage.allCases where preferred.hasPrefix(language.localeIdentifier) {
27 33
             return language
28 34
         }
29 35
         return .english
30 36
     }
31 37
 
38
+    /// Settings language picker labels — fixed English names, not localized.
32 39
     var localizedDisplayName: String {
33 40
         switch self {
34 41
         case .english:
35 42
             return "English"
36 43
         case .arabic:
37
-            return "العربية"
44
+            return "Arabic"
45
+        case .chineseSimplified:
46
+            return "Chinese (Simplified)"
38 47
         }
39 48
     }
40 49
 }

+ 19 - 4
App for Indeed/Views/DashboardView.swift

@@ -286,6 +286,18 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
286 286
         reloadSavedJobsListings()
287 287
         rebuildFeatureShortcutCards()
288 288
         trailingLoadMoreJobsButton?.title = L("Show more jobs")
289
+        refreshWelcomeChatMessageForCurrentLanguage()
290
+    }
291
+
292
+    /// Updates the default assistant greeting when the user changes language before starting a conversation.
293
+    private func refreshWelcomeChatMessageForCurrentLanguage() {
294
+        guard chatMessages.count == 1,
295
+              chatMessages[0].role == "assistant",
296
+              chatMessages[0].attachedJobs == nil else { return }
297
+        let welcome = L(Self.welcomeChatMessageKey)
298
+        guard chatMessages[0].content != welcome else { return }
299
+        chatMessages[0] = ChatMessage(role: "assistant", content: welcome)
300
+        rebuildChatUI()
289 301
     }
290 302
 
291 303
     private func refreshSidebarItemTitles() {
@@ -944,7 +956,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
944 956
 
945 957
     private func jobListingHostSubtitle(_ job: JobListing) -> String {
946 958
         guard let raw = job.url, let url = URL(string: raw), let host = url.host?.lowercased() else {
947
-            return L("Indeed")
959
+            return AppMarketingLinks.indeedBrandName
948 960
         }
949 961
         if host.hasPrefix("www.") {
950 962
             return String(host.dropFirst(4))
@@ -2514,6 +2526,9 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2514 2526
         textView.insertionPointColor = Theme.primaryText
2515 2527
     }
2516 2528
 
2529
+    private static let welcomeChatMessageKey =
2530
+        "Tell me what role you want and I will return job descriptions, key skills, and a quick fit summary."
2531
+
2517 2532
     private func resetChatState() {
2518 2533
         removeInlineChatThinkingRow()
2519 2534
         trailingLoadMoreJobsRow = nil
@@ -2521,7 +2536,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2521 2536
         chatMessages.removeAll()
2522 2537
         lastSearchResults.removeAll()
2523 2538
         clearChatStack()
2524
-        let welcome = L("Tell me what role you want and I will return job descriptions, key skills, and a quick fit summary.")
2539
+        let welcome = L(Self.welcomeChatMessageKey)
2525 2540
         chatMessages.append(ChatMessage(role: "assistant", content: welcome))
2526 2541
         appendChatBubble(text: welcome, isUser: false)
2527 2542
     }
@@ -2828,7 +2843,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2828 2843
         rowHost.layer?.cornerRadius = 8
2829 2844
         rowHost.restingBackgroundColor = isSelected ? Theme.selectionFill : nil
2830 2845
         rowHost.hoverBackgroundColor = isSelected ? Theme.selectionFillHover : Theme.sidebarRowHoverFill
2831
-        rowHost.setAccessibilityLabel(L("Indeed"))
2846
+        rowHost.setAccessibilityLabel(AppMarketingLinks.indeedBrandName)
2832 2847
         rowHost.setAccessibilityRole(.button)
2833 2848
         rowHost.setAccessibilitySelected(isSelected)
2834 2849
         rowHost.setAccessibilityHelp(L("Open Indeed to search and apply for jobs"))
@@ -2847,7 +2862,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
2847 2862
         icon.widthAnchor.constraint(equalToConstant: Self.sidebarNavIconSize).isActive = true
2848 2863
         icon.heightAnchor.constraint(equalToConstant: Self.sidebarNavIconSize).isActive = true
2849 2864
 
2850
-        let text = NSTextField(labelWithString: L("Indeed"))
2865
+        let text = NSTextField(labelWithString: AppMarketingLinks.indeedBrandName)
2851 2866
         text.font = .systemFont(ofSize: 14, weight: .medium)
2852 2867
         text.textColor = isSelected ? Theme.brandBlue : Theme.secondaryText
2853 2868
         text.refusesFirstResponder = true

+ 2 - 4
App for Indeed/ar.lproj/Localizable.strings

@@ -6,8 +6,6 @@
6 6
 "Delete" = "حذف";
7 7
 "Remove" = "إزالة";
8 8
 "Dismiss" = "تجاهل";
9
-"English" = "الإنجليزية";
10
-"Arabic" = "العربية";
11 9
 
12 10
 // MARK: - شاشة الإطلاق
13 11
 "AI-POWERED" = "مدعوم بالذكاء الاصطناعي";
@@ -28,8 +26,8 @@
28 26
 "Profile" = "الملف الشخصي";
29 27
 "Settings" = "الإعدادات";
30 28
 "Premium" = "مميز";
31
-"Indeed" = "إنديد";
32
-"Open Indeed to search and apply for jobs" = "افتح إنديد للبحث عن الوظائف والتقديم عليها";
29
+"Indeed" = "Indeed";
30
+"Open Indeed to search and apply for jobs" = "افتح Indeed للبحث عن الوظائف والتقديم عليها";
33 31
 
34 32
 // MARK: - لوحة المعلومات / الرئيسية
35 33
 "Welcome" = "مرحباً";

+ 0 - 2
App for Indeed/en.lproj/Localizable.strings

@@ -6,8 +6,6 @@
6 6
 "Delete" = "Delete";
7 7
 "Remove" = "Remove";
8 8
 "Dismiss" = "Dismiss";
9
-"English" = "English";
10
-"Arabic" = "Arabic";
11 9
 
12 10
 // MARK: - Launch Screen
13 11
 "AI-POWERED" = "AI-POWERED";

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

@@ -0,0 +1,354 @@
1
+/* Localizable.strings (简体中文) */
2
+
3
+
4
+// MARK: - 通用
5
+"OK" = "确定";
6
+"Cancel" = "取消";
7
+"Delete" = "删除";
8
+"Remove" = "移除";
9
+"Dismiss" = "关闭";
10
+
11
+// MARK: - 启动屏幕
12
+"AI-POWERED" = "人工智能驱动";
13
+"Find your perfect job with the power of AI." = "借助人工智能的力量,找到您的理想工作。";
14
+"Starting up…" = "启动中…";
15
+"Loading progress" = "加载进度";
16
+
17
+// MARK: - 启动状态
18
+"Checking your Pro subscription…" = "正在检查您的专业版订阅…";
19
+"Loading premium plans from the App Store…" = "正在从 App Store 加载高级计划…";
20
+"Preparing your job search workspace…" = "正在准备您的工作搜索空间…";
21
+"Almost ready…" = "即将就绪…";
22
+
23
+// MARK: - 侧边栏
24
+"Home" = "首页";
25
+"Saved Jobs" = "已保存的工作";
26
+"CV Maker" = "简历制作器";
27
+"Profile" = "个人资料";
28
+"Settings" = "设置";
29
+"Premium" = "高级版";
30
+"Indeed" = "Indeed";
31
+"Open Indeed to search and apply for jobs" = "打开 Indeed 搜索并申请工作";
32
+
33
+// MARK: - 仪表盘 / 首页
34
+"Welcome" = "欢迎";
35
+"Send" = "发送";
36
+"Clear chat" = "清空聊天";
37
+"Remove all messages and start a new conversation" = "删除所有消息并开始新对话";
38
+"Ask for roles, skills, salary, or job descriptions..." = "询问职位、技能、薪资或职位描述...";
39
+"Ask AI" = "询问人工智能";
40
+"1 reply left" = "剩余 1 次回复";
41
+"Apply" = "申请";
42
+"Save" = "保存";
43
+"Saved" = "已保存";
44
+"Remove from saved" = "从已保存中移除";
45
+"Show more jobs" = "显示更多工作";
46
+"This area is not available in the preview build. Use Home to search jobs." = "此区域在预览版中不可用。请使用首页搜索工作。";
47
+"Save jobs from Home to see them here." = "从首页保存的工作将显示在此处。";
48
+"No saved jobs yet. Search on Home, then tap Save on a listing." = "暂无已保存的工作。在首页搜索,然后点击列表上的保存。";
49
+"Tell me what role you want and I will return job descriptions, key skills, and a quick fit summary." = "告诉我您想要的职位,我将返回职位描述、关键技能和快速匹配摘要。";
50
+"1 saved position" = "1 个已保存职位";
51
+"Delete this profile?" = "删除此个人资料?";
52
+"Find roles similar to: " = "查找类似职位:";
53
+"Find jobs at company: " = "查找公司职位:";
54
+"Find jobs that require skill: " = "查找需要该技能的工作:";
55
+"match" = "匹配";
56
+"matches" = "匹配";
57
+
58
+// MARK: - 功能快捷方式
59
+"Role" = "职位";
60
+"Explore similar or better job roles" = "探索相似或更好的职位";
61
+"Company" = "公司";
62
+"Find opportunities at other companies" = "寻找其他公司的机会";
63
+"Skill" = "技能";
64
+"Match jobs that fit your skills" = "匹配适合您技能的工作";
65
+
66
+// MARK: - 专业版 / 订阅
67
+"Upgrade to Pro" = "升级到专业版";
68
+"You're on Pro" = "您正在使用专业版";
69
+"Unlimited AI matches, smart alerts, and interview prep—all in one place." = "无限人工智能匹配、智能提醒和面试准备——所有这些都在一处。";
70
+"Manage billing, renewals, and plans in Premium." = "在高级版中管理账单、续订和计划。";
71
+"Try Pro" = "试用专业版";
72
+"Manage Subscription" = "管理订阅";
73
+"Premium Plans" = "高级计划";
74
+"Unlock unlimited access to premium tools and boost your productivity." = "解锁无限访问高级工具,提升您的生产力。";
75
+"Continue with free plan" = "继续使用免费计划";
76
+"Restore Purchase" = "恢复购买";
77
+"You're subscribed" = "您已订阅";
78
+"Thank you — Pro features are now available." = "感谢您 — 专业版功能现已可用。";
79
+"Pro" = "专业版";
80
+"Purchases restored" = "购买已恢复";
81
+"Your subscription is active." = "您的订阅有效。";
82
+"No subscription found" = "未找到订阅";
83
+"There was nothing to restore for this Apple ID." = "此 Apple ID 没有可恢复的内容。";
84
+"Something went wrong" = "出错了";
85
+"That subscription isn’t available from the App Store right now." = "该订阅目前无法从 App Store 获得。";
86
+"Unlimited AI job search on Home" = "首页无限人工智能工作搜索";
87
+"Save jobs & open listings in-app" = "保存工作并在应用内打开列表";
88
+"CV Maker, profiles & PDF export" = "简历制作器、个人资料和便携式文档导出";
89
+"Role, company & skill shortcuts" = "职位、公司和技能快捷方式";
90
+
91
+// MARK: - 付费墙计划
92
+"Weekly" = "每周";
93
+"Flexible and commitment-free" = "灵活且无承诺";
94
+"Monthly" = "每月";
95
+"Balanced for regular productivity" = "为常规生产力平衡设计";
96
+"Yearly" = "每年";
97
+"Best value for long-term users" = "长期用户的最佳价值";
98
+"/ week" = "/周";
99
+"/ month" = "/月";
100
+"/ year" = "/年";
101
+"3 days free trial" = "3天免费试用";
102
+"Perfect for short-term job hunts" = "非常适合短期求职";
103
+"Cancel anytime" = "随时取消";
104
+"Best for regular job seekers" = "最适合常规求职者";
105
+"Priority support" = "优先支持";
106
+"Lowest effective monthly cost" = "最低有效月成本";
107
+"Ideal for long-term use" = "非常适合长期使用";
108
+
109
+// MARK: - 付费墙信任
110
+"Secure Payments" = "安全支付";
111
+"Your payment is 100% secure." = "您的支付 100% 安全。";
112
+"Cancel Anytime" = "随时取消";
113
+"No commitment, cancel anytime." = "无承诺,随时取消。";
114
+"24/7 Support" = "24/7 支持";
115
+"We're here to help you anytime." = "我们随时为您提供帮助。";
116
+"Privacy First" = "隐私优先";
117
+"Your data is safe with us." = "您的数据在我们这里很安全。";
118
+
119
+// MARK: - 设置
120
+"Appearance" = "外观";
121
+"Theme" = "主题";
122
+"Language" = "语言";
123
+"Share App" = "分享应用";
124
+"More Apps" = "更多应用";
125
+"About" = "关于";
126
+"Website" = "网站";
127
+"Support" = "支持";
128
+"Terms of Use" = "使用条款";
129
+"Privacy Policy" = "隐私政策";
130
+"System" = "跟随系统";
131
+"Light" = "浅色";
132
+"Dark" = "深色";
133
+
134
+// MARK: - 个人资料
135
+"Profiles" = "个人资料";
136
+"Add new profile" = "添加新资料";
137
+"Create and manage CV profiles. Each profile stores your details on this Mac." = "创建和管理简历资料。每个资料都会将您的详细信息存储在此 Mac 上。";
138
+"No profiles yet. Tap “Add new profile” to create your first one." = "暂无个人资料。点击“添加新资料”创建您的第一个资料。";
139
+"Build CV" = "制作简历";
140
+"Edit" = "编辑";
141
+"Untitled profile" = "未命名资料";
142
+"No contact details yet" = "暂无联系方式";
143
+"← Profiles" = "← 个人资料";
144
+
145
+// MARK: - 资料编辑器
146
+"Save Profile  →" = "保存资料 →";
147
+"← All profiles" = "← 所有资料";
148
+"New profile" = "新建资料";
149
+"Edit profile" = "编辑资料";
150
+"Profile Name *" = "资料名称 *";
151
+"Marketing Director Profile" = "市场总监资料";
152
+"Personal Information" = "个人信息";
153
+"Full Name *" = "全名 *";
154
+"John Doe" = "张三";
155
+"Email *" = "电子邮件 *";
156
+"john@example.com" = "zhangsan@example.com";
157
+"Phone" = "电话";
158
+"+1 (555) 123-4567" = "+86 123 4567 8901";
159
+"Job Title *" = "职位名称 *";
160
+"Software Engineer" = "软件工程师";
161
+"Address" = "地址";
162
+"123 Main St, City, State, ZIP" = "示例街道 123 号,城市,省份,邮政编码";
163
+"Certificates / Rewards" = "证书 / 奖项";
164
+"List your certificates and awards..." = "列出您的证书和奖项...";
165
+"Interests" = "兴趣爱好";
166
+"List your interests and hobbies..." = "列出您的兴趣和爱好...";
167
+"Languages" = "语言";
168
+"List languages you speak (e.g., English - Native, Spanish - Fluent)..." = "列出您所说的语言(例如:中文 - 母语,英语 - 流利)...";
169
+"Career Summary" = "职业摘要";
170
+"Brief overview of your professional background and key achievements..." = "您的专业背景和主要成就的简要概述...";
171
+"Referral (Optional)" = "推荐人(可选)";
172
+"Referred by (Company/Person Name)" = "推荐人(公司/个人名称)";
173
+"If someone referred you for this job, enter their name or company here" = "如果有人推荐您申请此职位,请在此处输入其姓名或公司";
174
+"Work Experience" = "工作经历";
175
+"Education" = "教育背景";
176
+"+ Add Another" = "+ 添加另一个";
177
+"Complete required fields" = "填写必填字段";
178
+"Remove experience" = "删除经历";
179
+"Remove education" = "删除教育";
180
+"Company Name *" = "公司名称 *";
181
+"Duration *" = "持续时间 *";
182
+"Description" = "描述";
183
+"e.g., Software Engineer" = "例如:软件工程师";
184
+"e.g., Google" = "例如:谷歌";
185
+"e.g., Jan 2020 - Present" = "例如:2020年1月 - 至今";
186
+"Describe your responsibilities and achievements..." = "描述您的职责和成就...";
187
+"Degree / program *" = "学位 / 专业 *";
188
+"Institution *" = "院校 *";
189
+"Year *" = "年份 *";
190
+"e.g., BSc Computer Science" = "例如:计算机科学学士";
191
+"e.g., MIT" = "例如:清华大学";
192
+"e.g., 2020" = "例如:2020";
193
+"Profile name" = "资料名称";
194
+"Full Name" = "全名";
195
+"Email" = "电子邮件";
196
+"Job Title" = "职位名称";
197
+
198
+// MARK: - 简历制作器
199
+"Templates" = "模板";
200
+"Polished layouts with live previews — pick a style that fits your story." = "精美的布局,实时预览 — 选择适合您故事的风格。";
201
+"Use Template & Select Profile  →" = "使用模板并选择资料 →";
202
+"All" = "全部";
203
+"No templates yet for this category." = "此类别暂无模板。";
204
+"Pick a template" = "选择模板";
205
+"Select a template first, then choose a profile to continue." = "先选择模板,然后选择个人资料以继续。";
206
+"Fetching AI-curated templates…" = "正在获取人工智能策划的模板…";
207
+"Couldn’t load AI templates — showing the built-in gallery." = "无法加载人工智能模板 — 显示内置图库。";
208
+"Design-Based" = "基于设计";
209
+"Profession-Based" = "基于职业";
210
+"Professional" = "专业";
211
+"Modern" = "现代";
212
+"Creative" = "创意";
213
+"Minimal" = "简约";
214
+"Executive" = "高管";
215
+"ATS layout" = "ATS 布局";
216
+"Sidebar left" = "左侧边栏";
217
+"Sidebar right" = "右侧边栏";
218
+
219
+// MARK: - 简历预览
220
+"CV preview" = "简历预览";
221
+"Export PDF…" = "导出便携式文档…";
222
+"Layout matches the CV Maker thumbnail for this template. Export a PDF that matches what you see here (fonts, columns, colours, and rules)." = "布局与此模板的简历制作器缩略图匹配。导出与您在此处看到的内容匹配的便携式文档(字体、列、颜色和规则)。";
223
+"The résumé could not be rendered to PDF (empty output). Try scrolling the preview so it lays out, then export again." = "无法将简历渲染为便携式文档(输出为空)。尝试滚动预览使其布局完整,然后再次导出。";
224
+"Couldn’t save PDF" = "无法保存便携式文档";
225
+"Your name" = "您的姓名";
226
+"Professional headline" = "专业标题";
227
+"Experience" = "经历";
228
+"Highlights" = "亮点";
229
+"Summary" = "摘要";
230
+"Contact" = "联系方式";
231
+"Skills" = "技能";
232
+"Tools" = "工具";
233
+"Languages & more" = "语言及其他";
234
+"Certificates" = "证书";
235
+"Referrals" = "推荐";
236
+"Professional Summary" = "专业摘要";
237
+"Selected Experience" = "精选经历";
238
+"Core Competencies" = "核心能力";
239
+"Impact" = "影响力";
240
+"Add contact in your profile" = "在您的个人资料中添加联系方式";
241
+"Add contact details in your profile" = "在您的个人资料中添加详细联系方式";
242
+"Add a career summary or interests in your profile to populate this column." = "在您的个人资料中添加职业摘要或兴趣爱好以填充此列。";
243
+"CV" = "简历";
244
+"Open to relocation" = "愿意异地搬迁";
245
+"STRENGTHS" = "优势";
246
+"PORTFOLIO SNAPSHOT" = "作品集概览";
247
+"Close" = "关闭";
248
+"/ day" = "/天";
249
+"/ %d days" = "/%d天";
250
+"/ %d weeks" = "/%d周";
251
+"/ %d months" = "/%d个月";
252
+"/ %d years" = "/%d年";
253
+
254
+// MARK: - 简历模板名称
255
+"Paper White" = "纯白";
256
+"Swiss" = "瑞士";
257
+"Mono" = "单色";
258
+"Airy" = "通透";
259
+"Tabular" = "表格";
260
+"Facet" = "刻面";
261
+"Corporate" = "企业";
262
+"Atlas" = "地图";
263
+"Ledger" = "账本";
264
+"Harbor" = "港湾";
265
+"Clear Path" = "清晰路径";
266
+"Pinstripe" = "细条纹";
267
+"Briefing" = "简报";
268
+"Quorum" = "法定人数";
269
+"Docket" = "待办";
270
+"Conduit" = "管道";
271
+"Principal" = "校长";
272
+"Charter" = "宪章";
273
+"Vertex" = "顶点";
274
+"Linea" = "线条";
275
+"Prism" = "棱镜";
276
+"Circuit" = "电路";
277
+"North" = "北方";
278
+"Axis" = "轴线";
279
+"Marigold" = "金盏花";
280
+"Ember" = "余烬";
281
+"Lattice" = "格栅";
282
+"Bloom" = "绽放";
283
+"Studio" = "工作室";
284
+"Kite" = "风筝";
285
+"Regent" = "摄政";
286
+"Monarch" = "君主";
287
+"Sterling" = "纯正";
288
+"Summit" = "顶峰";
289
+"Estate" = "庄园";
290
+"Chairman" = "主席";
291
+"Blue Ocean" = "蓝海";
292
+
293
+// MARK: - 简历演示预览内容
294
+"Sarah Johnson" = "李雅婷";
295
+"Senior Product Manager" = "高级产品经理";
296
+"Group PM, Consumer Growth & Activation" = "产品经理组负责人,消费者增长与激活";
297
+"Google · Mountain View, CA · 2019 – Present" = "谷歌 · 加利福尼亚州山景城 · 2019 – 至今";
298
+"Stanford University" = "斯坦福大学";
299
+"M.S. Management Science & Engineering" = "管理科学与工程硕士";
300
+"2014 – 2016" = "2014 – 2016";
301
+"Mountain View, CA" = "加利福尼亚州山景城";
302
+"Product leader shipping roadmap, discovery, and analytics for high-scale consumer experiences." = "产品负责人,负责大规模消费者体验的产品路线图、发现和分析。";
303
+"Defined multi-year platform strategy with exec stakeholders and quarterly OKRs." = "与高管利益相关者共同制定多年平台战略和季度 OKR。";
304
+"Partnered with engineering and design to launch experiments improving activation by 12%." = "与工程和设计团队合作推出实验,使激活率提高了 12%。";
305
+"Stood up quarterly business reviews with finance and GTM, aligning spend to north-star metrics." = "与财务和 GTM 团队建立季度业务评审,使支出与北极星指标对齐。";
306
+"Presented roadmap shifts to the leadership team and translated trade-offs into clear investment asks." = "向领导团队展示路线图的转变,并将权衡转化为清晰的投资需求。";
307
+"Figma · SQL · Amplitude · Jira · BigQuery" = "Figma · SQL · Amplitude · Jira · BigQuery";
308
+"Product Strategy" = "产品策略";
309
+"A/B Testing" = "A/B 测试";
310
+"Roadmapping" = "路线图规划";
311
+"CONTACT" = "联系方式";
312
+"SKILLS" = "技能";
313
+"PROFILE" = "个人资料";
314
+"EXPERIENCE" = "经历";
315
+"EDUCATION" = "教育背景";
316
+"SUMMARY" = "摘要";
317
+"PROFESSIONAL SUMMARY" = "专业摘要";
318
+"SELECTED EXPERIENCE" = "精选经历";
319
+"CORE COMPETENCIES" = "核心能力";
320
+"TOOLS" = "工具";
321
+"IMPACT" = "影响力";
322
+
323
+// MARK: - 工作浏览器
324
+"Return to the previous screen" = "返回上一屏幕";
325
+
326
+// MARK: - 错误
327
+"We couldn't reach the server. Check your internet connection and try again." = "无法连接服务器。请检查您的网络连接后重试。";
328
+"The search was cancelled. Try again when you're ready." = "搜索已取消。准备就绪后请重试。";
329
+"Something went wrong while searching. Please try again in a moment." = "搜索时出错。请稍后再试。";
330
+"Job search is unavailable." = "工作搜索不可用。";
331
+
332
+// MARK: - 提示
333
+"This profile will be removed from this Mac." = "此个人资料将从这台 Mac 上移除。";
334
+
335
+// MARK: - 格式化字符串
336
+"Loading %@" = "正在加载 %@";
337
+"Loading %@. %@" = "正在加载 %@。%@";
338
+"Starting %@…" = "正在启动 %@…";
339
+"%d replies left" = "剩余 %d 次回复";
340
+"%d saved positions" = "%d 个已保存职位";
341
+"“%@” will be removed from this Mac." = "“%@” 将从这台 Mac 上移除。";
342
+"%@ isn’t available yet" = "%@ 尚不可用";
343
+"I couldn't find new matches for “%@”. Try a different angle or a more specific keyword." = "我找不到“%@”的新匹配。请尝试不同的角度或更具体的关键词。";
344
+"No jobs found for “%@”. Try another title, skill, company, or location." = "未找到“%@”的工作。请尝试其他职位名称、技能、公司或地点。";
345
+"Here are %d more %@ for “%@”." = "这是“%@”的另外 %d 个 %@。";
346
+"Found %d %@ for “%@”. Tap Apply to open the listing or Save to revisit later." = "找到 %d 个“%@”的 %@。点击申请打开列表,或点击保存以便稍后查看。";
347
+"Get %@" = "获取 %@";
348
+"You chose the “%@” template. Tap Build CV on a profile to preview your résumé with that layout." = "您选择了“%@”模板。点击个人资料上的制作简历,使用该布局预览您的简历。";
349
+"Experience %d" = "经历 %d";
350
+"Education %d" = "教育 %d";
351
+"Please fill in: %@." = "请填写:%@。";
352
+
353
+// MARK: - 多行文本
354
+"Add your Mac App Store IDs in the target’s build settings:\n• AppStoreAppID — numeric app ID from App Store Connect\n• AppStoreDeveloperID — numeric developer ID (for your other apps page)" = "在目标的构建设置中添加您的 Mac App Store ID:\n• AppStoreAppID — 来自 App Store Connect 的数字应用 ID\n• AppStoreDeveloperID — 数字开发者 ID(用于您的其他应用页面)";