Skip to content

feat: 体积会话缓存 + 弹窗本地化修复(中文→本地化、补全俄语)+ 受保护应用迁移预警 - #55

Merged
wzh4869 merged 7 commits into
wzh4869:mainfrom
niazlv:feat/ux-and-localization
Jul 2, 2026
Merged

feat: 体积会话缓存 + 弹窗本地化修复(中文→本地化、补全俄语)+ 受保护应用迁移预警#55
wzh4869 merged 7 commits into
wzh4869:mainfrom
niazlv:feat/ux-and-localization

Conversation

@niazlv

@niazlv niazlv commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

📝 变更说明 | Description

本 PR 汇总 4 项改动(5 个提交)/ This PR bundles 4 changes (5 commits):

  1. 应用体积会话级缓存 | App size session cache (54a4c73)

    • 体积改用会话级缓存(key = 标准化路径),独立于每次重扫重建的列表,修复偶发「计算中」卡死与重扫后体积丢失。
  2. 弹窗中文未本地化修复(结构性)| Popup localization fix (structural) (6dd9ea2)

    • 根因:Localizable.xcstrings 中部分多行键以字面量 \n(反斜杠+n)存储,而 Swift 字面量编译为真实换行符,导致 .localized 查找不匹配并回退到中文源串 —— 表现为标题/按钮已本地化、正文却显示中文。
    • 规范化 16 个多行键(14 个改为真实换行符以匹配运行时查找;删除 2 个已有正确孪生键的孤立重复键),并规范化 271 处译文值。中文(源语言)保持不变。
    • 同时本地化 Stub Portal 启动器「外部存储未连接」系统对话框(运行于 App 进程外,无法用 .localized):原生启动器按系统语言从内置表选择文案(英文兜底),重新编译通用二进制 StubLauncherBinary;bash 兜底改为英文。
  3. 补全俄语界面翻译 | Complete Russian UI translations (b60900e)

    • 结构修复后部分字符串可以解析了,但其俄语译文实为英文(甚至错误的拉丁转写,如 Eto prilozhenie...)。为 57 条用户可见字符串补全规范俄语:弹窗正文、DataDirError/AppMoverError 错误描述、状态徽章悬浮说明、数据目录类型/优先级标签、按钮与空状态。
    • 格式化占位符(%@/%lld/%1$@)与源串完全一致;弹窗内引用的按钮名与实际俄语按钮一致;日志字符串维持英文。
  4. 迁移受保护应用前预警 | Protected-app migration warning (633752f, 780351a)

    • App Store 应用与 root 拥有的应用,其本地副本通常无法被直接删除或替换,自动迁移可能以「权限不足」失败。迁移前检测并弹出预警,建议先在访达手动迁移后再用 AppPorts 创建链接。
    • 新增 4 条 .localized 字符串已加入字符串目录(zh-Hans + en + ru,多行键使用真实换行符),避免再次回退中文。

🔗 关联 Issue | Related Issues

N/A

🧪 测试情况 | Testing

  • 已在本地 Xcode 环境运行通过 | Passed local Xcode build and run(Release xcodebuild ... BUILD SUCCEEDED,应用可正常启动)
  • 如有需要,已运行专项检查 | Ran focused checks(脚本化复核:所有 .localized / Text 的中文键均已在字符串目录中;新增/修改俄语译文的格式化占位符与源串一致;现有键的多语言覆盖无回归
  • 核心功能经过手动验证 | Core functions manually verified(编译与启动已验证;各语言下具体弹窗文案建议目视确认)
  • 修复了可能导致的权限或异常问题 | Fixed potential permission or exception issues(受保护应用迁移权限预警)

🌐 本地化影响 | Localization Impact

  • 本 PR 不涉及任何用户可见文案
  • 如涉及用户可见文案,已同步更新 Localizable.xcstrings
  • 如涉及用户可见文案,本次部分未同步本地化,已在说明中写明原因或后续计划
    • 说明:受保护应用预警新增的 4 条字符串目前仅含 zh-Hans / en / ru,其余 19 种语言暂随源回退,待维护者的 AI 翻译流程补全。因此 LocalizationAuditTests 会报告这 4 个键缺失翻译(共 76 条 finding,全部集中在这 4 个新键,现有键无回归)—— 属预期,且该检查为 advisory 非阻断。
  • 如涉及用户可见文案,已检查至少 zh-Hansen 的实际显示(可选)
  • 如涉及用户可见文案,已运行 LocalizationAuditTests(可选)—— 见上,4 个新键为预期缺失

📸 屏幕截图 | Screenshots (Optional)

受保护应用预警弹窗为新增 UI,可在合并前补充截图。


🤖 Generated with Claude Code

niazlv and others added 5 commits June 30, 2026 10:16
- 新增会话级 sizeCache(key=AppItem.id),独立于扫描结果,重扫不丢失已算体积
- 缓存条目记录 bundle mtime,应用原地更新时自动失效并后台重算
- 所有扫描路径统一走 applySizes:命中项在赋值前填充(无"计算中"闪烁),仅未命中项后台并行计算
- 移除按 name 查找的 recalculateAppSize(同名应用会永久卡在"计算中")与 calculateSizes 开关,体积匹配改为按 id

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
弹窗标题/按钮已本地化但正文仍显示中文,根因是 Localizable.xcstrings
中部分多行键存储为字面量 "\n"(反斜杠+n),而 Swift 字面量编译为真实
换行符,导致 .localized 查找不匹配并回退到中文源串。

- 规范化 16 个多行键:14 个改为真实换行符以匹配运行时查找,删除 2 个
  已有正确孪生键的孤立重复键,并规范化 271 处译文值。中文(源语言)
  保持不变,其余语言现可正确本地化。
- Stub Portal 原生启动器(外部存储未连接对话框)改为按系统语言选择
  文案(英文兜底),重新编译通用二进制 StubLauncherBinary。
- Bash 兜底启动器对话框改为英文。

仅影响新迁移的应用;已迁移的 Stub Portal 在重新迁移前仍使用旧启动器。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
结构性换行键修复后,部分用户可见字符串能正确解析了,但其俄语
译文本身是英文(甚至是错误的拉丁转写,如 "Eto prilozhenie..."),
导致俄语界面里弹窗正文/状态提示/错误信息显示为英文。

为 57 条用户可见字符串补全规范的俄语翻译,覆盖:
- App Store 外部安装、自更新应用迁移、数据目录迁移/还原/规范化等
  确认弹窗正文
- DataDirError / AppMoverError 错误描述
- 状态徽章悬浮说明(Sparkle/Electron/已锁定/未锁定/外部安装)
- 数据目录类型与优先级标签(重要/推荐/可选/自定义等)、按钮与空状态

仅修改 ru 译文值;格式化占位符(%@/%lld/%1$@)与源串完全一致,
弹窗内引用的按钮名与实际俄语按钮一致。日志字符串维持英文。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
App Store 应用与 root 拥有的应用,其本地副本通常无法被直接删除或替换,
自动迁移可能以「权限不足」失败。迁移前检测此类应用并弹出预警,说明可改用
访达手动拖动 + AppPorts 创建链接,用户可选择「仍然迁移」或「取消」。
迁移收尾逻辑抽出为 proceedWithMigration 复用。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
新功能「迁移受保护应用前预警」引入了 4 条经 .localized 的中文字符串,
但未加入字符串目录,非中文界面会回退显示中文(与本次修复的问题同类)。
为以下字符串补充英文与俄语翻译(zh-Hans 源 + en + ru,多行键使用真实换行符):
- 受保护的应用(标题)
- 仍然迁移(按钮)
- 预警正文(App Store / root 受保护说明)
- 迁移失败的权限不足友好提示

其余语言暂随源回退,待后续补全。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Credits must be used to enable repository wide code reviews.

Folder Mirror(本次主改动):迁移/链接 appSuiteFolder 与 singleAppContainer
时,本地不再对整个文件夹做符号链接,而是创建真实文件夹逐项镜像外部套件——
内部每个 .app 为 Stub Portal(真实 .app 壳,可被 Launch Services / Spotlight
索引),其余文件/子目录为指向外部的符号链接,并写入隐藏标记
.appports-folder-portal.plist 记录外部真实路径。

- createFolderMirrorPortal:逐项创建 Stub/符号链接,单项 Stub 失败回退为符号链接
- refreshFolderMirror:rescan 时同步外部套件的新增/删除条目与内部 Stub 版本,
  递归 lsregister 刷新索引;旧版整体符号链接文件夹安全跳过
- localPortalKind / 扫描器据标记识别已链接、孤立链接,体积按外部真实文件夹计算
- 解链删除本地镜像(外部保留),还原复制外部套件回本地为真实文件夹
- 旧版整体符号链接文件夹保持兼容,仅新迁移使用 Folder Mirror

transparentHybrid(原型,feature flag transparentHybridEnabled,默认关闭):
本地为真实 .app 壳 + Stub 启动器,并把 Contents 下未注入的文件/子目录符号链接
镜像到外部真实 app,使硬编码到 /Applications/X.app/Contents/... 的内部路径仍可
解析(需外置磁盘在线)。

测试:AppMigrationServiceTests 15/15、AppScannerTests 11/11;Release 构建通过。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@wzh4869

wzh4869 commented Jul 1, 2026

Copy link
Copy Markdown
Owner

非常感谢你的贡献,今天或明天我会 review 并确认和 #54 是否有冲突💗

@wzh4869

wzh4869 commented Jul 1, 2026

Copy link
Copy Markdown
Owner

@niazlv 我因合并了 #54 ,导致出现了一个俄语翻译的冲突,请完善后告知我合并💗

@niazlv

niazlv commented Jul 1, 2026

Copy link
Copy Markdown
Contributor Author

@wzh4869 冲突已解决并推送啦 ✅

冲突在 Localizable.xcstrings 里键「正在切换本地入口...」的俄语翻译:#54 把它重置成了英文占位,我保留了本 PR 的俄语值「Удаление исходного каталога...」(对应“复制完成 → 删除原目录 → 切换软链”阶段,语义准确)。

已 merge 最新 main,本地 Release 构建通过 ✅。现在应该可以合并了,感谢 💗

@wzh4869
wzh4869 merged commit a9a483f into wzh4869:main Jul 2, 2026
@wzh4869

wzh4869 commented Jul 2, 2026

Copy link
Copy Markdown
Owner

Объединили и ожидается, что выложим на этой неделе, спасибо за ваш вклад 💗

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants