把界面语言从 15 种收敛到 6 种 —— 保留全部键均有实际译文的 6 种。 Interface languages narrowed from 15 to 6 — the ones whose strings are all actually translated.

垂直切片 / Vertical slices

切片一 · 译文与语言清单一致 Language accuracy

上一版的情况是:15 种语言里有 12 种的法律类正文实际是英文占位 —— 键在、目录在、值与英文一字不差。用户切到自己的语言,看到的仍是看不懂的 法律说明。而这方面的文本需要准确:本项目对数据收集、令牌存储、 加速责任的承诺都写在这些文本里。

以下 6 种语言的键全部有实际译文,予以保留:

  • zh 简体中文(原始表述)
  • zh_TW 繁體中文
  • en English
  • de Deutsch
  • fr Français
  • ru Русский

移除 ja ko es pt ar hi th vi id。 加回某个语种的前提是其全部键都有实际译文,而非复用英文。 OgLI18n.locales 的注释里写明了这条规矩。

切片二 · 三处语言清单必须一致 Consistency guard

根因在这里。语言清单散在三处,任两处不同步都会出事, 而且两种故障方向相反、都很难在排查时想到根源:

  • OgLI18n.locales(Dart 运行时清单)
  • assets/i18n/ 下的目录
  • pubspec.yaml 的 assets 声明

pubspec 多声明 → 构建期「资源不存在」直接失败; pubspec 少声明 → 构建通过,运行时该语言全是裸键名。

后者的表现是:打出来的包能安装运行,但该语言下显示的是键名(如 settings.theme)。 v6.4.0 删了 9 个语言目录,若不同步 pubspec,踩的就是第一种。

tool/i18n_scan.py --check 新增该项检查。负向验证:故意在 pubspec 加一个 不存在的语言目录 → 报「pubspec.yaml 声明但目录不存在(构建必失败)」, 退出码 1。

新增 / Added

  • 语言清单三处一致成为 CI 门禁:OgLI18n.locales × assets/i18n/ 目录 × pubspec.yaml 的 assets 声明,逐项比对,不一致即失败(退出码 1,已负向验证)。

变更 / Changed

  • 界面语言由 15 种收敛为 6 种:zh / zh_TW / en / de / fr / ru。 同步更新 OgLI18n.locales、pubspec.yaml、README.md、docs/USAGE.md、 docs/I18N.md。
  • 仓库页选项卡按语种分别处理(此前各语言混杂、口径不一):
    • zh / zh_TW:Code / Issues / Pull requests / Actions 保留英文, 其余(分支 / 提交 / 设置)照常用中文。
    • de / fr / ru:译为各自语言的对应词。此前这些语言里混着英文残留 —— 例如 fr 的 pulls 原是 Pull Requests、releases 原是 Releases, 现已分别改为 Demandes de tirage / Versions。
    • 测试相应更新:语种数 15 → 6,并保留「中文语境下 GitHub 术语必须保持英文」 这条断言。
  • 繁体中文修正少量沿用大陆用法的词:Gist 片段 → Gist 程式碼片段、 我的加速 → 我的加速節點。

修复 / Fixed

  • OgLProjectInfo.licenseUrl 仍指向 AGPL-3.0:v6.3.0 换了许可, 标识(licenseId)与名称(licenseName)都改了,地址漏改,还指向 www.gnu.org/licenses/agpl-3.0.html。该常量目前无引用(死常量),但一旦有人 用它生成「查看许可」链接,就会把用户送到一份与实际许可无关的全文。 已改为 https://www.apache.org/licenses/LICENSE-2.0。
  • 私有仓库大图预览「用了 raw 却不带令牌」:超过 1 MB 改用 raw 链接时, 代码写成 headers: proxied || !repoPrivate ? null : const <String, String>{} —— 注释说「未走代理且私有仓库才带认证头」,实际给的是空 map,一个头都没带。 私有仓库必然 404,而界面显示成「文件过大,无法在内置预览中加载」, 把认证失败误报成文件过大。现在真的去取一步令牌。
  • 私有仓库被「加速已开启 → 不弹窗」规则误伤:raw 族的加速门槛本就是 「内置通道 + 公开仓库」,私有仓库的 raw 永远不加速。旧代码只要检测到加速 开着就不弹窗、直接走 raw,私有仓库用户于是什么都看不到就掉进上面那个必然失败 的分支。现已显式排除私有仓库。
  • 私有仓库的音频「播放」按钮点了必然失败:该按钮把 raw 地址交给系统播放器, 而系统播放器没有本应用的令牌。私有仓库现在只给「下载」。
  • 法律全文弹窗写死 height: 460:小屏 / 大字体 / 横屏下会溢出。 改为按视口比例给上限。
  • 新增键 common.previewLoadFailed(6 语言),把「加载失败」与「文件过大」 区分开 —— 超过 1 MB 已有专门面板处理,走到 errorBuilder 说明是认证 / 限流 / 网络问题,说成「文件过大」会让人往错的方向排查。

    已知限制 / Known limitations

  • 音频不做内置播放:Contents API 对超过 1 MB 的文件不返回内容,音频必然超限。 预览页对公开仓库给「播放」(交系统播放器),私有仓库给「下载」。
  • Linux 裸放安装包仍缺失:rpm(arm64)因 Ubuntu 的 rpm 缺少 aarch64 平台 定义、无法在 x86_64 宿主上交叉构建;两个 AppImage 因 appimagetool 未接受到 ARCH 环境变量而退出码 1。三种包在 zip / 7z 里都齐全,功能不缺, 只是未裸放直传。
  • 私有仓库的 raw 内容无法走加速(README 仓库内图片、仓库文件):raw 端点 没有签名机制,交给代理等于送令牌。这是硬约束,不是取舍。
  • macOS / iOS 自 v5.6.0 起弃用。
  • Linux 需要 glibc ≥ 2.35(Ubuntu 22.04 一代及以上)。

产物 / Artifacts

Android arm64-v8a / armeabi-v7a / x86_64 / universal-APK / AAB、 Windows x64 / arm64、Linux x64 / arm64,每份均含 zip 与 7z。

Linux 裸放安装包

与 v6.2.0 / v6.3.0 相同,仍为 3 / 6:

  amd64 / x86_64 arm64
.deb ✅ ✅
.rpm ✅ ❌ Ubuntu 的 rpm 缺少 aarch64 平台定义,无法交叉构建
.AppImage ❌ ❌ appimagetool 声称未收到 ARCH,退出码 1

三种包在 zip / 7z 里都齐全,功能不缺,只是未裸放直传。


下载 / Download

本版本共 23 个构件产物。

Android

文件 大小
OGL-v6.4.0-Android.AAB.7z 60 MB
OGL-v6.4.0-Android.AAB.zip 62 MB
OGL-v6.4.0-Android.arm64-v8a.7z 8.0 MB
OGL-v6.4.0-Android.arm64-v8a.zip 11 MB
OGL-v6.4.0-Android.armeabi-v7a.7z 8.0 MB
OGL-v6.4.0-Android.armeabi-v7a.zip 10 MB
OGL-v6.4.0-Android.universal-APK.7z 20 MB
OGL-v6.4.0-Android.universal-APK.zip 29 MB
OGL-v6.4.0-Android.x86_64.7z 8.5 MB
OGL-v6.4.0-Android.x86_64.zip 11 MB

Windows

文件 大小
OGL-v6.4.0-Windows.arm64.7z 8.3 MB
OGL-v6.4.0-Windows.arm64.zip 13 MB
OGL-v6.4.0-Windows.x64.7z 9.5 MB
OGL-v6.4.0-Windows.x64.zip 14 MB

Linux

文件 大小
OGL-v6.4.0-Linux.arm64.7z 7.3 MB
OGL-v6.4.0-Linux.arm64.zip 11 MB
OGL-v6.4.0-Linux.x64.7z 8.1 MB
OGL-v6.4.0-Linux.x64.zip 12 MB

完整列表与校验信息见 Releases v6.4.0。