zcode-pro 0.20.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -38,6 +38,49 @@ export async function getConfig(force = false) {
38
38
  }
39
39
  export function clearConfigCache() { configCache = { value: null, at: 0 }; }
40
40
 
41
+ // 会话快捷切换的默认键位(按住 alt 再按);settings 的“快捷键”标签页可改,
42
+ // 配置存在 config.shortcuts,未写的项回退到这里
43
+ export const DEFAULT_SHORTCUTS = {
44
+ switchLast: 'z', // 立即切到上次会话
45
+ switchPrev: 'x', // 弹窗中上移
46
+ switchNext: 'c', // 弹窗中下移
47
+ switchRecent: 'e', // 打开最近 10 条
48
+ switchAttention: 'r', // 打开运行中 / 未查看
49
+ };
50
+
51
+ // —— ZCode 版本判断(按官方版本启用/停用功能)——
52
+ // 版本来源:启动器从 app.asar 读出后写进 bootstrap(window.__ZCODEPRO__.zcodeVersion),
53
+ // helper 的 /config 响应也附加同名字段。读不到时为空串,各判断保持旧行为。
54
+ export function zcodeAppVersion() {
55
+ const v = liveBoot().zcodeVersion;
56
+ return typeof v === 'string' && v ? v : '';
57
+ }
58
+
59
+ export function zcodeVersionGte(version, major, minor, patch = 0) {
60
+ const m = String(version || '').match(/^(\d+)\.(\d+)\.(\d+)/);
61
+ if (!m) return false;
62
+ const a = Number(m[1]), b = Number(m[2]), c = Number(m[3]);
63
+ return a > major || (a === major && (b > minor || (b === minor && c >= patch)));
64
+ }
65
+
66
+ // 官方“编辑项目”(修改项目名称 + 多文件夹)自 3.16.1 起提供
67
+ export function officialRenameSupported() {
68
+ return zcodeVersionGte(zcodeAppVersion(), 3, 16, 1);
69
+ }
70
+
71
+ // 新侧栏检测(3.16.1 起“虚拟项目”重构,workspace-item 系列节点已下线):
72
+ // 版本 >= 3.16.1,或页面出现 section[data-project-id] 项目行(覆盖版本读不到的
73
+ // 构建)。一旦命中即记住——同一会话内侧栏不会退回旧结构。
74
+ let newSidebarCached = false;
75
+ export function isNewProjectSidebar() {
76
+ if (newSidebarCached) return true;
77
+ if (officialRenameSupported()) { newSidebarCached = true; return true; }
78
+ try {
79
+ if (document.querySelector('section[data-project-id]')) { newSidebarCached = true; return true; }
80
+ } catch { /* ignore */ }
81
+ return false;
82
+ }
83
+
41
84
  const zh = {
42
85
  settingsTitle: 'ZCode Pro',
43
86
  tabFeatures: '功能',
@@ -84,7 +127,7 @@ const zh = {
84
127
  syncRecLink: '坚果云 WebDAV',
85
128
  syncRecSuffix: ':登录与密码填“应用密码”,不是账号密码。',
86
129
  syncIncludeZcp: 'ZCode Pro 设置',
87
- syncIncludeZcpDesc: '功能开关、样式调整、项目别名与代理设置;同步配置与凭据本身不参与同步。',
130
+ syncIncludeZcpDesc: '功能开关、样式调整与代理设置;同步配置与凭据本身不参与同步。项目别名不同步(官方已支持改项目名)。',
88
131
  syncIncludeModel: '模型设置',
89
132
  syncIncludeModelDesc: '自定义供应商与模型配置(config.json 与 provider_config.json,含 API Key)。账号登录的凭据(如 BigModel 订阅)不参与同步,各机器用各自账号登录。',
90
133
  syncUpload: '上传到云端',
@@ -157,7 +200,7 @@ const zh = {
157
200
  featureTaskOrder: '侧边栏会话拖动排序',
158
201
  featureTaskOrderDesc: '让置顶、项目与分组中的会话拖动后记住顺序,刷新后保持。',
159
202
  featureSessionSwitch: '会话快捷切换',
160
- featureSessionSwitchDesc: 'alt+z 在当前与上次会话间来回切换;按住 alt 再按 x/c 弹出最近会话列表前后选择,松开 alt 切换(类 alt+tab)。',
203
+ featureSessionSwitchDesc: '{last} 在当前与上次会话间来回切换;按住 alt 再按 {prev}/{next} 弹出最近会话列表前后选择(初始 10 条,{next} 到底再加载 5 条),{recent} 直接打开最近 10 条,{attention} 打开运行中与运行完未查看的任务;方向键同样可选,Enter 或松开 alt 切换(类 alt+tab)',
161
204
  featureTitleLock: '重命名会话名锁定',
162
205
  featureTitleLockDesc: '手动重命名过的会话不再被自动标题覆盖:会话有新回答后界面可能改显自动标题,重启后又变回,本功能让侧栏始终显示重命名后的名字。',
163
206
  tabTitleGen: '任务名提示词',
@@ -184,8 +227,8 @@ const zh = {
184
227
  titleGenTesting: '生成中…',
185
228
  titleGenTestOk: '生成结果:',
186
229
  titleGenTestFailed: '生成失败',
187
- featureWsRunning: '折叠项目运行提示(实验性)',
188
- featureWsRunningDesc: '折叠的项目里仍有会话在运行时,项目图标旋转提示;全部结束或展开项目后恢复。期间每 60 秒在后台短暂展开该项目复核运行状态再收起,会话行不显示,仅项目位置可能有约四分之一秒的轻微高度起伏。',
230
+ featureWsRunning: '折叠时任务运行中提示',
231
+ featureWsRunningDesc: '有会话在运行时,折叠的项目与“任务”“已置顶”等分区头显示与任务运行中同款的加载图标,全部结束后消失。',
189
232
  tabPerformance: '性能',
190
233
  perfDesc: 'ZCode 为每个打开过的项目常驻一个会话进程,应用自身不会回收,项目多了内存占用就高。开启后,长时间未使用且没有任务在跑的项目会被自动释放:会话记录不受影响,再次打开时自动恢复,仅首次回复有几秒等待。正在使用的项目、运行中的会话与后台命令、定时任务都不会被回收。后台命令检测依赖系统进程信息(Linux / macOS / Windows 各走系统自带工具),检测不可用时功能自动停用。',
191
234
  featureIdleReclaim: '空闲项目内存回收',
@@ -213,10 +256,40 @@ const zh = {
213
256
  userFontDesc: '会话中提问内容的字体;选“默认”时跟随界面字体。',
214
257
  assistantFontName: '回答字体',
215
258
  assistantFontDesc: '会话中回答正文的字体(代码块仍用等宽字体);选“默认”时跟随界面字体。',
216
- switcherHint: 'x / c 选择,松开 alt 切换,Esc 取消',
259
+ switcherHint: '{prev} / {next} 或 ↑ / ↓ 选择,Enter 或松开 alt 切换,Esc 取消',
217
260
  switcherCurrent: '当前',
218
261
  switcherEmpty: '暂无上次会话(切换过会话后可用)',
219
262
  switcherFailed: '未能切换到该会话(可能已删除)',
263
+ switcherMore: '还有 {n} 条 · 按 c 加载',
264
+ switcherRunning: '运行中',
265
+ switcherUnseen: '未查看',
266
+ switcherAttentionHint: '运行中 / 运行完未查看的任务 · {prev} / {next} 或 ↑ / ↓ 选择,Enter 或松开 alt 切换',
267
+ switcherAttentionEmpty: '暂无运行中或未查看的任务',
268
+ tabShortcuts: '快捷键',
269
+ hkTitle: '会话快捷切换',
270
+ hkAltZ: '在当前与上次使用的会话间来回切换',
271
+ hkAltX: '弹窗中上移高亮(更早的会话)',
272
+ hkAltC: '弹窗中下移高亮(更新的会话);到底且还有更多时加载 5 条并选中新加载的第一条',
273
+ hkAltE: '打开最近 10 条任务列表',
274
+ hkAltR: '打开正在运行与运行完未查看的任务列表',
275
+ hkArrow: '弹窗打开时移动高亮(与 alt + {prev} / alt + {next} 同规则)',
276
+ hkEnter: '确认切换到高亮的会话',
277
+ hkEsc: '取消并关闭弹窗',
278
+ hkRelease: '移动过高亮时松开即切换;从未移动则弹窗保持打开,继续选择',
279
+ hkReleaseKey: '松开 alt',
280
+ hkModify: '修改',
281
+ hkRecording: '按下新键…',
282
+ hkInvalid: '快捷键只支持单个字母或数字',
283
+ hkConflict: 'alt+{k} 已用于“{name}”',
284
+ hkSaved: '快捷键已更新',
285
+ hkNameLast: '切换上次会话',
286
+ hkNamePrev: '上移高亮',
287
+ hkNameNext: '下移高亮',
288
+ hkNameRecent: '最近 10 条',
289
+ hkNameAttention: '运行中 / 未查看',
290
+ hkEditHint: '点击“修改”后按下新按键(字母或数字),Esc 取消',
291
+ hkReset: '重置为默认',
292
+ hkResetDone: '已恢复默认键位',
220
293
  featureFileActions: '文件菜单增强',
221
294
  featureFileActionsDesc: '在会话中文件链接的右键菜单里新增“默认应用打开”与“打开所在目录”。',
222
295
  featureImageCopy: '图片右键复制',
@@ -225,17 +298,16 @@ const zh = {
225
298
  imageCopied: '图片已复制到剪贴板',
226
299
  imageCopyFailed: '复制图片失败',
227
300
  openFolderItem: '打开文件夹',
301
+ openFolderPrimary: '主目录',
228
302
  copyPathItem: '复制路径',
229
303
  pathCopied: '路径已复制到剪贴板',
230
304
  pathCopyFailed: '复制路径失败',
231
305
  fileOpenDefault: '默认应用打开',
232
306
  fileReveal: '打开所在目录',
233
- featurePinnedExpand: '置顶会话保持项目折叠(实验性)',
234
- featurePinnedExpandDesc: '点击折叠项目的置顶会话后将其保持折叠。受限于应用机制,项目会先短暂展开再缩起。',
235
- featureAutoUpdatePlugins: '自动更新 zcode-plugins 插件',
236
- featureAutoUpdatePluginsDesc: '启动时自动检查并更新已安装的 zcode-plugins 插件(只升级不安装,卸载不会被撤销),更新在新会话生效。',
237
- pluginsUpdateTitle: '插件更新 · zcode-plugins',
238
- pluginsCheckNow: '检查并更新',
307
+ featureAutoUpdatePlugins: '自动更新',
308
+ featureAutoUpdatePluginsRepo: 'duanluan/zcode-plugins',
309
+ featureAutoUpdatePluginsDesc: '',
310
+ pluginsCheckNow: '检查更新',
239
311
  pluginsUpdating: '正在更新插件…',
240
312
  pluginsUpToDate: '插件已是最新',
241
313
  pluginsUpdatesFound: '{n} 个插件可更新',
@@ -313,6 +385,8 @@ const zh = {
313
385
  hrUsageNone: '当前没有走 headroom 的供应商,未切换',
314
386
  headroomLoadFailed: '读取 Headroom 配置失败',
315
387
  headroomStatusTitle: '运行状态',
388
+ hrInstRunning: '运行中',
389
+ hrInstStopped: '未运行',
316
390
  headroomStatusLoadFailed: '读取运行状态失败',
317
391
  headroomProxyUp: '代理运行中',
318
392
  headroomProxyDown: '代理未运行',
@@ -340,7 +414,7 @@ const zh = {
340
414
  headroomStoppedWarn: '代理已停止;指向 127.0.0.1 的供应商将无法连接',
341
415
  headroomBackend: '压缩设备',
342
416
  headroomBackendAuto: '自动 · 显卡优先',
343
- headroomBackendCpu: 'CPU · 省电',
417
+ headroomBackendCpu: '省电 · CPU 优先',
344
418
  headroomBackendNative: '(原生值)',
345
419
  headroomBackendDesc: '自动:headroom 选最快设备(CUDA/MPS 显卡优先);CPU:强制 CPU 压缩,省电且不占显存。也支持 headroom 原生值(onnx、pytorch_mps 等)。切换会重启代理立即生效。',
346
420
  headroomPower: '省电自动切换',
@@ -378,6 +452,30 @@ const zh = {
378
452
  aliasSaved: '别名已更新',
379
453
  aliasCleared: '已恢复真实名称',
380
454
  aliasHint: '磁盘目录名不变:终端、文件管理器与其他引用真实路径的界面仍显示原名。',
455
+ featureProjectMenuDescNew: '项目“更多”菜单中的打开文件夹与复制路径。官方已支持修改项目名称(编辑项目),自定义别名已停用。',
456
+ aliasMigrateTitle: '迁移项目别名',
457
+ aliasMigrateDesc: '当前 ZCode 已支持修改项目名称(项目“更多”菜单 → 编辑项目),自定义别名功能已停用。可把已保存的别名写入官方项目名称,勾选要迁移的项目;迁移只改项目名称,磁盘目录不受影响。',
458
+ aliasMigrateItemHint: '迁移后将作为项目名称保存(可随时在“编辑项目”中再改)。仅无标记的条目可勾选;已迁移、已并入、项目已删除、本机不存在(旧机器路径)以及项目已重命名的都不可勾选——要改这些项目的名字,直接用项目“更多”菜单里的“编辑项目”。',
459
+ aliasMigrateStateDone: '已迁移',
460
+ aliasMigrateStateMerged: '已并入「{name}」',
461
+ aliasMigrateStateDeleted: '项目已删除',
462
+ aliasMigrateStateMissing: '本机不存在',
463
+ aliasMigrateStateRenamed: '项目已重命名',
464
+ aliasMigrateDeadSummary: '已失效 {n} 条(本机不存在 / 项目已删除,多为设置同步带来的旧机器路径)',
465
+ aliasMigrateClearDead: '清除失效条目',
466
+ aliasMigrateDeadCleared: '已清除 {n} 条失效别名',
467
+ aliasMigrateDeadClearFailed: '部分失效别名未能清除,请重试',
468
+ aliasMigrateGo: '迁移所选',
469
+ aliasMigrateRunning: '迁移中…',
470
+ aliasMigrateProgress: '正在迁移 {i}/{n}:{name}',
471
+ aliasMigrateStateFailed: '失败',
472
+ aliasMigrateSkip: '暂不迁移',
473
+ aliasMigrateDone: '已迁移 {n} 个别名',
474
+ aliasMigratePartial: '{n} 个已迁移,{m} 个未成功;未成功的可稍后在 ZCode Pro 设置中重试',
475
+ aliasMigrateAllFailed: '别名迁移未成功,可稍后在 ZCode Pro 设置中重试',
476
+ aliasMigrateCardName: '别名迁移',
477
+ aliasMigrateCardDesc: '官方已支持修改项目名称,还有 {n} 个自定义别名未迁移。',
478
+ aliasMigrateRun: '迁移',
381
479
  taskOrderSaved: '顺序已更新',
382
480
  qqGroupTitle: 'QQ 群:428403354',
383
481
  qqGroupDesc: '问题反馈与交流',
@@ -450,7 +548,7 @@ const en = {
450
548
  syncRecLink: 'Jianguoyun WebDAV',
451
549
  syncRecSuffix: ' — use the app password, not your account password.',
452
550
  syncIncludeZcp: 'ZCode Pro settings',
453
- syncIncludeZcpDesc: 'Feature toggles, style adjustments, project aliases and the proxy setting; the sync config and credentials themselves are never synced.',
551
+ syncIncludeZcpDesc: 'Feature toggles, style adjustments and the proxy setting; the sync config and credentials themselves are never synced. Project aliases are not synced (renaming is built in now).',
454
552
  syncIncludeModel: 'Model settings',
455
553
  syncIncludeModelDesc: 'Custom providers and model config (config.json and provider_config.json, API keys included). Account sign-in credentials (e.g. the BigModel subscription) are not synced; each computer signs in with its own account.',
456
554
  syncUpload: 'Upload',
@@ -523,7 +621,7 @@ const en = {
523
621
  featureTaskOrder: 'Sidebar session drag ordering',
524
622
  featureTaskOrderDesc: 'Makes session drags in Pinned, Projects and Groups persist across refreshes.',
525
623
  featureSessionSwitch: 'Session quick switch',
526
- featureSessionSwitchDesc: 'alt+z toggles between the current and the last session; hold alt and press x/c to move the highlight across recently used sessions, release alt to switch (like alt+tab).',
624
+ featureSessionSwitchDesc: '{last} toggles between the current and the last session; hold alt and press {prev}/{next} to move the highlight across recently used sessions (10 shown initially, pressing {next} at the bottom loads 5 more), {recent} opens the last 10 directly, {attention} opens running / finished-but-unseen tasks; arrow keys also move the highlight, Enter or release alt to switch (like alt+tab)',
527
625
  featureTitleLock: 'Keep renamed session titles',
528
626
  featureTitleLockDesc: 'Sessions you renamed keep their custom title: after new replies the app may show an auto-generated title instead, which reverts after a restart; this keeps the renamed title in the sidebar.',
529
627
  tabTitleGen: 'Task name prompt',
@@ -550,8 +648,8 @@ const en = {
550
648
  titleGenTesting: 'Generating…',
551
649
  titleGenTestOk: 'Result: ',
552
650
  titleGenTestFailed: 'Generation failed',
553
- featureWsRunning: 'Running indicator on collapsed projects (experimental)',
554
- featureWsRunningDesc: 'Spins a collapsed project\'s icon while any of its sessions is still running; stops when they all finish or the project is expanded. While spinning, the project is briefly re-expanded in the background every 60 s to re-check and then collapsed — rows stay hidden, with only a subtle quarter-second height ripple at the project.',
651
+ featureWsRunning: 'Running indicator when collapsed',
652
+ featureWsRunningDesc: 'Shows the same spinning loader as running tasks on collapsed projects and on section headers (“Tasks”, “Pinned”) while any session is running; clears when they all finish.',
555
653
  tabPerformance: 'Performance',
556
654
  perfDesc: 'ZCode keeps a session process resident for every project you have opened and never reclaims it, so memory grows with projects. When enabled, projects unused for a while with nothing running release their memory automatically: sessions are untouched and reload when reopened, with a few seconds wait on the first reply. The project in use, running sessions, background commands and scheduled tasks are never reclaimed. Background-command detection reads system process info via built-in tools (Linux / macOS / Windows); when unavailable, the feature disables itself.',
557
655
  featureIdleReclaim: 'Idle project memory reclaim',
@@ -579,10 +677,40 @@ const en = {
579
677
  userFontDesc: 'Font of question text in conversations; "default" follows the UI font.',
580
678
  assistantFontName: 'Answer font',
581
679
  assistantFontDesc: 'Font of answer text in conversations (code blocks stay monospaced); "default" follows the UI font.',
582
- switcherHint: 'x / c to choose, release alt to switch, Esc to cancel',
680
+ switcherHint: '{prev} / {next} or ↑ / ↓ to choose, Enter or release alt to switch, Esc to cancel',
583
681
  switcherCurrent: 'current',
584
682
  switcherEmpty: 'No previous session yet (available after you switch sessions)',
585
683
  switcherFailed: 'Failed to switch to that session (it may have been deleted)',
684
+ switcherMore: '{n} more · press c to load',
685
+ switcherRunning: 'running',
686
+ switcherUnseen: 'unseen',
687
+ switcherAttentionHint: 'Running / finished but unseen tasks · {prev} / {next} or ↑ / ↓ to choose, Enter or release alt to switch',
688
+ switcherAttentionEmpty: 'No running or unseen tasks',
689
+ tabShortcuts: 'Shortcuts',
690
+ hkTitle: 'Session quick switch',
691
+ hkAltZ: 'Toggle between the current and the last-used session',
692
+ hkAltX: 'Move the highlight up (earlier sessions) in the popup',
693
+ hkAltC: 'Move the highlight down (recent sessions); at the bottom it loads 5 more and highlights the first newly loaded entry',
694
+ hkAltE: 'Open the last 10 tasks',
695
+ hkAltR: 'Open running / finished-but-unseen tasks',
696
+ hkArrow: 'Move the highlight while the popup is open (same rules as alt + {prev} / alt + {next})',
697
+ hkEnter: 'Switch to the highlighted session',
698
+ hkEsc: 'Cancel and close the popup',
699
+ hkRelease: 'Releasing alt switches once the highlight has moved; otherwise the popup stays open for further selection',
700
+ hkReleaseKey: 'release alt',
701
+ hkModify: 'Change',
702
+ hkRecording: 'press a key…',
703
+ hkInvalid: 'Shortcuts accept a single letter or digit only',
704
+ hkConflict: 'alt+{k} is already used by "{name}"',
705
+ hkSaved: 'Shortcut updated',
706
+ hkNameLast: 'last session',
707
+ hkNamePrev: 'move up',
708
+ hkNameNext: 'move down',
709
+ hkNameRecent: 'last 10 tasks',
710
+ hkNameAttention: 'running / unseen',
711
+ hkEditHint: 'Click "Change", press a new key (letter or digit); Esc cancels',
712
+ hkReset: 'Reset to defaults',
713
+ hkResetDone: 'Shortcuts reset to defaults',
586
714
  featureFileActions: 'File menu actions',
587
715
  featureFileActionsDesc: 'Adds "Open with default app" and "Reveal in file manager" to the right-click menu of file links in chat.',
588
716
  featureImageCopy: 'Image right-click copy',
@@ -591,17 +719,16 @@ const en = {
591
719
  imageCopied: 'Image copied to the clipboard.',
592
720
  imageCopyFailed: 'Failed to copy the image.',
593
721
  openFolderItem: 'Open folder',
722
+ openFolderPrimary: 'primary',
594
723
  copyPathItem: 'Copy path',
595
724
  pathCopied: 'Path copied to the clipboard.',
596
725
  pathCopyFailed: 'Failed to copy the path.',
597
726
  fileOpenDefault: 'Open with default app',
598
727
  fileReveal: 'Reveal in file manager',
599
- featurePinnedExpand: 'Keep projects collapsed for pinned sessions (experimental)',
600
- featurePinnedExpandDesc: 'Keeps the project collapsed after clicking a pinned session. Note: it briefly expands first, then collapses.',
601
- featureAutoUpdatePlugins: 'Auto-update zcode-plugins plugins',
602
- featureAutoUpdatePluginsDesc: 'Checks and updates installed zcode-plugins plugins on startup (updates only — never installs; uninstalled plugins stay uninstalled). Updates apply to new sessions.',
603
- pluginsUpdateTitle: 'Plugin updates · zcode-plugins',
604
- pluginsCheckNow: 'Check & update',
728
+ featureAutoUpdatePlugins: 'Auto-update',
729
+ featureAutoUpdatePluginsRepo: 'duanluan/zcode-plugins',
730
+ featureAutoUpdatePluginsDesc: '',
731
+ pluginsCheckNow: 'Check for updates',
605
732
  pluginsUpdating: 'Updating plugins…',
606
733
  pluginsUpToDate: 'Plugins are up to date',
607
734
  pluginsUpdatesFound: '{n} plugin(s) can be updated',
@@ -679,6 +806,8 @@ const en = {
679
806
  hrUsageNone: 'No providers route through headroom; nothing changed',
680
807
  headroomLoadFailed: 'Failed to load the Headroom config',
681
808
  headroomStatusTitle: 'Status',
809
+ hrInstRunning: 'running',
810
+ hrInstStopped: 'down',
682
811
  headroomStatusLoadFailed: 'Failed to load the status',
683
812
  headroomProxyUp: 'Proxy running',
684
813
  headroomProxyDown: 'Proxy down',
@@ -706,7 +835,7 @@ const en = {
706
835
  headroomStoppedWarn: 'Proxy stopped; providers pointing at 127.0.0.1 cannot connect.',
707
836
  headroomBackend: 'Compression device',
708
837
  headroomBackendAuto: 'Auto · GPU first',
709
- headroomBackendCpu: 'CPU · power saving',
838
+ headroomBackendCpu: 'Power saving · CPU first',
710
839
  headroomBackendNative: ' (native)',
711
840
  headroomBackendDesc: 'Auto lets headroom pick the fastest device (CUDA/MPS); CPU forces CPU compression (power saving, no VRAM). Native headroom values (onnx, pytorch_mps, …) also work. Switching restarts the proxy to apply.',
712
841
  headroomPower: 'Power-save auto switch',
@@ -744,6 +873,30 @@ const en = {
744
873
  aliasSaved: 'Alias updated.',
745
874
  aliasCleared: 'Real name restored.',
746
875
  aliasHint: 'The directory name on disk is unchanged: terminals, file managers and other path-based UI still show the real name.',
876
+ featureProjectMenuDescNew: 'Open folder and copy path in the project "More" menu. Renaming is built in since ZCode 3.16.1 ("Edit project"), so the custom alias is retired.',
877
+ aliasMigrateTitle: 'Migrate project aliases',
878
+ aliasMigrateDesc: 'This ZCode supports renaming projects (project "More" menu → Edit project), so the custom alias feature is retired. Write your saved aliases into the official project names by picking the projects below; only the project name changes, folders on disk are untouched.',
879
+ aliasMigrateItemHint: 'The alias becomes the project name (re-editable anytime via "Edit project"). Only unmarked entries can be checked; migrated, merged, deleted, not-on-this-machine and manually-renamed ones cannot — to rename those projects, use "Edit project" in the project "More" menu directly.',
880
+ aliasMigrateStateDone: 'Migrated',
881
+ aliasMigrateStateMerged: 'Merged into "{name}"',
882
+ aliasMigrateStateDeleted: 'Project deleted',
883
+ aliasMigrateStateMissing: 'Not on this machine',
884
+ aliasMigrateStateRenamed: 'Project renamed',
885
+ aliasMigrateDeadSummary: '{n} stale entries (not on this machine / project deleted — usually old-machine paths from settings sync)',
886
+ aliasMigrateClearDead: 'Clear stale entries',
887
+ aliasMigrateDeadCleared: 'Removed {n} stale alias(es)',
888
+ aliasMigrateDeadClearFailed: 'Some stale aliases could not be removed; please retry',
889
+ aliasMigrateGo: 'Migrate selected',
890
+ aliasMigrateRunning: 'Migrating…',
891
+ aliasMigrateProgress: 'Migrating {i}/{n}: {name}',
892
+ aliasMigrateStateFailed: 'Failed',
893
+ aliasMigrateSkip: 'Not now',
894
+ aliasMigrateDone: 'Migrated {n} alias(es)',
895
+ aliasMigratePartial: '{n} migrated, {m} failed; retry the rest later in ZCode Pro settings',
896
+ aliasMigrateAllFailed: 'Alias migration failed; retry later in ZCode Pro settings',
897
+ aliasMigrateCardName: 'Alias migration',
898
+ aliasMigrateCardDesc: 'Project renaming is built in now; {n} custom alias(es) are not migrated yet.',
899
+ aliasMigrateRun: 'Migrate',
747
900
  taskOrderSaved: 'Order updated.',
748
901
  qqGroupTitle: 'QQ group: 428403354',
749
902
  qqGroupDesc: 'Feedback & discussion',