ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Lazydocker 怎么新增一种界面语言?从 pkg/i18n 翻译集到快捷键文档生成的完整流程

2026/9/10 22:17:39 拓冰建站 浏览量
Lazydocker 怎么新增一种界面语言?从 pkg/i18n 翻译集到快捷键文档生成的完整流程 Lazydocker 怎么新增一种界面语言从 pkg/i18n 翻译集到快捷键文档生成的完整流程【免费下载链接】lazydockerThe lazier way to manage everything docker项目地址: https://gitcode.com/GitHub_Trending/la/lazydockerlazydocker 的界面文案全部走pkg/i18n下的翻译集机制每种语言对应一个TranslationSet实现注册进GetTranslationSets()后应用启动时按配置的语言码合并出最终文案快捷键速查表docs/keybindings/Keybindings_语言码.md则由脚本从翻译集自动生成。因此新增一种界面语言是一条明确的链路新建语言翻译文件 → 注册语言码 → 用辅助脚本核对漏翻的键 → 运行应用验证 → 重新生成快捷键文档。本文按这条链路给出每一步要改的文件、要跑的命令和判断结果的方法。前提已按 go.mod 的要求安装 Go 工具链go 1.22toolchaingo1.23.6并已拉取 lazydocker 源码到本地。按 CONTRIBUTING.md 的说明本地运行 lazydocker 使用go run main.go或go run -modvendor main.go后者对应不修改~/.bashrc的 vendor 方案。先看懂 i18n 的四处关键代码新增语言前先确认以下四个事实它们决定了后面每一步怎么改翻译键的完整清单在 pkg/i18n/english.go。TranslationSet结构体定义全部界面文案字段PruningStatus、ConfirmQuit、FocusContainers等englishSet()给出每个字段的英文默认值是所有语言的基础集。语言注册表在 pkg/i18n/i18n.go 的GetTranslationSets()返回语言码 - 翻译集的 map当前注册了pl、nl、de、tr、en、fr、zh、es、pt九个键。这个 map 是应用识别语言的唯一依据NewTranslationSetFromConfig()只接受出现在该 map 中的语言码查不到时回退到en并返回错误Language not found: 语言码。语言码是前缀匹配。NewTranslationSet()对配置值做strings.HasPrefix(language, languageCode)判断所以配置里写zh_CN这类地区变体能命中zh配置为auto时则通过jibber_jabber检测系统语言。基础集与语言集是合并关系。NewTranslationSet()先取englishSet()作为 baseSet再用mergo.Merge(..., mergo.WithOverride)把匹配到的语言集叠上去。对照 pkg/i18n/chinese.go 可以看到chineseSet()并没有给TranslationSet的每个字段都赋值文件中甚至有注释掉的键语言集只需翻译自己覆盖的部分。第一步新建语言翻译文件仿照现有语言文件新建pkg/i18n/你的语言.go。以中文为例pkg/i18n/chinese.go 的结构是package i18n func chineseSet() TranslationSet { return TranslationSet{ PruningStatus: 修剪中, RemovingStatus: 移除中, // 其余字段按需翻译…… } }新增语言时做两件事把函数名改成语言码Set()例如ruSet()把字面值换成目标语言的翻译。字段名必须与 pkg/i18n/english.go 中TranslationSet的定义逐一对应字段名写错会直接编译失败这是最快的报错反馈。第二步把新语言注册进GetTranslationSets()回到 pkg/i18n/i18n.go在GetTranslationSets()返回的 map 中加一行func GetTranslationSets() map[string]TranslationSet { return map[string]TranslationSet{ pl: polishSet(), // ……原有语言…… ru: russianSet(), } }注册之后NewTranslationSetFromConfig()才会接受这个语言码快捷键生成脚本的循环也会自动包含它——两者共用这一个注册表所以不需要在别处重复登记。第三步用辅助脚本核对漏翻的字段仓库提供了 scripts/translations/get_required_translations.go它遍历GetTranslationSets()中每个语言集用反射列出取值为空字符串的字段名。在项目根目录运行go run scripts/translations/get_required_translations.go输出按语言码分组每个语言下面列出尚未翻译的字段名即TranslationSet中该语言集没有赋值的键。用它来核对新语言翻译了多少、还差哪些翻译补齐后重跑对应条目应从该语言的分节中消失。第四步运行应用验证界面文案按 CONTRIBUTING.md 的方式在仓库根目录运行应用go run main.go # 或 vendor 模式 go run -modvendor main.go然后把 lazydocker 配置里的语言项改为新语言码再重启。配置项见 docs/Config.md 中的language: auto示例auto表示自动检测系统语言改成你的新语言码如ru即可带地区后缀的写法如ru_RU依赖第二步提到的前缀匹配同样会命中ru。验证时的两个判断信号都来自 pkg/i18n/i18n.go界面菜单、状态文案显示为新语言说明注册和翻译集都生效如果语言码拼错不在GetTranslationSets()中应用回退英文界面并产生错误Language not found: 语言码——这正是忘了注册或语言码写错时的固定现象。注意一个文档间的不一致docs/Config.md 中language项的注释只列了auto | en | pl | nl | de | tr少于代码中实际注册的九个语言。以GetTranslationSets()为准注释列表未包含fr、zh、es、pt属文档滞后。第五步重新生成快捷键文档界面语言注册后对应的快捷键速查表Keybindings_语言码.md由生成脚本产出不能手写。pkg/cheatsheet/generate.go 的逻辑是遍历i18n.GetTranslationSets()的每个语言码逐个os.Setenv(LC_ALL, lang)后构建应用、组装GetInitialKeybindings()输出到GetKeybindingsDir()该目录固定为仓库根下的docs/keybindings见 pkg/cheatsheet/validate.go 的GetKeybindingsDir()。副作用提示generate会对所有已注册语言重新生成并覆盖docs/keybindings/下的Keybindings_*.md文件不只你新增的那一种运行前确保该目录内容可以安全覆盖。在项目根目录执行go run scripts/cheatsheet/main.go generate成功时终端打印Generated cheatsheets in 仓库根/docs/keybindings见 scripts/cheatsheet/main.go。产物头部自带更新说明例如 docs/keybindings/Keybindings_zh.md 第一行This file is auto-generated. To update, make the changes in the pkg/i18n directory and then rungo run scripts/cheatsheet/main.go generatefrom the project root.打开新生成的Keybindings_语言码.md检查菜单分组标题Global/Containers 等取自GlobalTitle、ContainersTitle等字段和快捷键描述是否为目标语言——这些都直接引用你翻译的字段值。用check命令做一致性校验scripts/cheatsheet/main.go 还接受check子命令对应 pkg/cheatsheet/validate.go 的Check()它先清空并在系统临时目录下创建lazydocker_cheatsheet工作目录注意会删除并重建该临时目录在其中重新生成全部速查表再与docs/keybindings/现有内容逐文件对比go run scripts/cheatsheet/main.go check一致时打印Cheatsheets are up to date不一致时打印 unified diffExpected 为新生成内容Actual 为仓库现有文件提示运行go run scripts/cheatsheet/main.go generate并提交结果然后以退出码 1 结束如果重跑 generate 后文件没有任何变化脚本提示 rebase 到 master 再试。这个命令适合放在提交前跑一遍只要pkg/i18n或键位绑定改过而忘了重新生成diff 会直接指出哪个语言的文件过期。边界与限制语言的支持范围由两处代码共同决定GetTranslationSets()决定哪些语言码可用TranslationSet结构体决定有哪些键可翻。新增键在englishSet加字段后所有已注册语言都可能需要补翻用第三步的脚本逐语言核对。快捷键文档只覆盖GetInitialKeybindings()中带Description的绑定空描述的绑定会被 pkg/cheatsheet/generate.go 跳过viewName为空时归入global分组。翻译缺字段只会影响展示文案不会让生成脚本报错。贡献流程按 CONTRIBUTING.md 走 Pull Request从master建分支改完代码后确认文档同步更新本场景即重新生成docs/keybindings/提交 PR。【免费下载链接】lazydockerThe lazier way to manage everything docker项目地址: https://gitcode.com/GitHub_Trending/la/lazydocker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考