ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

GitLens 本地化完整指南:从消息提取、复数规则到多语言目录维护

GitLens 本地化完整指南:从消息提取、复数规则到多语言目录维护 开发工具版本控制【免费下载链接】vscode-gitlensSupercharge Git inside VS Code and unlock untapped knowledge within each repository — Visualize code authorship at a glance via Git blame annotations and CodeLens, seamlessly navigate and explore Git repositories, gain valuable insights via rich visualizations and powerful comparison commands, and so much more项目地址https://gitcode.com/gh_mirrors/vs/vscode-gitlens点击查看免费下载本文是 GitLensvscode-gitlens扩展本地化体系的实战指南以仓库中 l10n/README.md 为骨架结合 docs/localization.md、scripts/localization.mjs、scripts/localization-chunks.mjs 与 packages/utils/src/plural.ts 等源码展开。读完本文你将掌握 GitLens 双目录manifest runtime消息体系的结构、新增或更新一门语言的完整流程、ICU 复数块plural block的翻译规则、pnpm run check:l10n校验链路的实现原理以及面向 zh-cn / zh-tw / es 的术语约定与基于 OpenCC 的派生工作流。本地化体系概览两类消息目录l10n/目录存放 GitLens 运行时的消息目录message catalogs。整个本地化体系建立在两类文件之上它们来源不同、用途不同、存放位置也不同文件仓库根目录内容翻译文件package.nls.json清单manifest文本命令标题、设置项描述、视图名称package.nls.locale.jsonl10n/bundle.l10n.json运行时文本通知、快速选择quick picks、工具提示tooltips、webviewl10n/bundle.l10n.locale.json两个英文文件都是由源码自动生成的严禁手工编辑。以当前仓库快照为例l10n/bundle.l10n.json包含约 6800 余条运行时英文消息package.nls.json包含约 2300 条清单文本简体中文运行时目录l10n/bundle.l10n.zh-cn.json已覆盖约 6785 条剩余缺口由 VS Code 按消息粒度回退到英文。语言标识遵循 VS Code 语言包language pack的命名de、es、fr、it、ja、ko、pt-br、ru、zh-cn、zh-tw等。GitLens 跟随 VS Code 的显示语言没有独立的 GitLens 语言设置项唯一的例外是既有的日期区域date-locale设置仍单独控制日期格式化见 docs/localization.md 开头。新增或更新一门语言的完整流程按以下步骤为 GitLens 添加一种新语言或更新既有语言把对应的英文文件复制成语言文件如package.nls.json→package.nls.zh-cn.json、l10n/bundle.l10n.json→l10n/bundle.l10n.zh-cn.json只翻译值values。键必须逐字节保持一致包括标点和尾部空格。保留每一个{0}/{name}占位符。可以根据语言习惯重排或重复占位符但不能删除或改名。运行时目录中值如果是对象{ message: …, comment: […] }说明comment里带翻译者提示翻译message并把译文以纯字符串形式存在同一键下——VS Code 的扩展宿主按原样读取语言目录不会解包对象只有英文源保留对象形式。merge命令会自动完成这一展平flatten。允许部分翻译。VS Code 按消息粒度回退到英文所以新语言可以增量落地。运行pnpm run check:l10n。该检查会对未知键、缺失或改名占位符、过时条目报错check:l10n脚本定义见 package.json 的 scripts 段。数量消息count message的键本身就是工程侧写入的复数块规则见下一节。校验链路的源码视角pnpm run check:l10n实际执行的是 scripts/localization.mjs 的check分支它会做三件事重新提取运行时目录并与l10n/bundle.l10n.json比对extractCatalog()递归扫描src与packages下除node_modules、dist、out、__tests__、fixtures、scripts之外的*.ts/*.js源文件用vscode/l10n-dev的getL10nJson提取消息不一致即报 Runtime catalog is stale要求先跑pnpm run generate:l10n检查 manifest 引用扫描package.json中所有%…%形式的引用是否都能在package.nls.json中解析checkReferences校验全部语言目录对package.nls.locale.json与l10n/bundle.l10n.locale.json逐一执行validateTranslations()检查未知键、空译文、占位符集合是否与英文源一致effectivePlaceholders连嵌套复数块里的选择器也会计入、以及复数块结构是否合法。单元测试覆盖了这些规则validateTranslations允许重排/重复占位符与部分翻译、拒绝缺失/新增/空/过时翻译、接受英文源中的复数块、接受比英语多 CLDR 类别的译文见 scripts/tests/localization.test.mjs。ICU 复数块Plural Block翻译规则数量消息的键本身就是由添加该消息的工程师写好的复数块例如{count, plural, one{{count} file changed} other{{count} files changed}}翻译时第一个逗号之前的部分这里的count必须原样保留——它命名的是该消息自己的占位符选择器不是要翻译的文本逐个翻译已经存在的每个category{...}分支one{...}、other{...}翻译方式与普通消息相同并在分支内部重复那个占位符{count}英文源只写one和other因此大部分消息只需要翻译这两个分支。如果你的语言需要比英语更多的 CLDR 复数类别——如俄语的few/many、阿拉伯语的zero/two——就为你的语言补充所需分支zero、one、two、few、many、other。other分支必须有且必须保留双形式语言法语、德语、中文等只需翻译已有分支即可精确数量可用N定位如0{no files changed}它优先于该数量本应落入的 CLDR 类别pnpm run check:l10n会像校验普通翻译一样校验每个复数块必须有other分支、分支名合法、两侧占位符一致。一个句子可以有多个计数如{0} commit behind, {1} commits ahead会看到两个复数块或并列、或一个嵌套在另一个的分支里。按上述规则独立翻译每个块——一个块只需要为自己对应的计数提供类别。已有复数块的消息必须保持复数块即使你的语言只有两种形式、且每种分支在“one/other”下最终译出来都一样也不要把它展平成纯文本。运行时如何解析复数块packages/utils/src/plural.ts 中的formatPlural()是复数块的运行时解析器该模块刻意不导入vscode或vscode/l10n保持纯净以便在扩展宿主、webview 与各包中复用用Intl.PluralRules按当前 UI 语言把计数归类getPluralCategory支持setPluralLocale显式指定分支选择顺序为N精确匹配 → CLDR 类别 →other见selectBranch选择器不是数字时回退other并告警一次块可以出现在模板任意位置、出现多次、也可以嵌套resolve递归处理选中分支体中的嵌套块块外的普通{placeholder}与块内占位符统一替换未知占位符原样保留数字用日期区域的数字格式化器输出。工程侧的对应规则写代码的人如何产出复数块在 docs/localization.md数量消息必须通过formatPlural(l10n.t({count, plural, one{...} other{...}}), { count })渲染require-format-plurallint 规则会拦截直接传给l10n.t()的复数块消息。校验脚本 scripts/localization.mjs 用纯.mjs重新实现了这套语法parsePluralBlocks/checkPluralBlocks两处需保持同步。不要翻译的内容以下内容在翻译时必须原样保留Git 语法与标志--force、author:、HEAD~1命令 ID 与设置键settings keys$(icon)codicon 记号产品名GitLens、GitKraken、Launchpad、Commit Graph占位符内部的任何内容\n换行符与 Markdown 链接语法。工程侧在 docs/localization.md 有更细的编码约束宿主代码从vscode导入l10nwebview 与可复用包从vscode/l10n导入必须使用字面量完整消息并把变化的数据作为参数传入禁止用模板表达式或拼接作为消息键webview 中禁止用unsafeHTML渲染翻译富链接场景改用gitlens/components/localizedContent.js的localizedContent。XLIFF 往返与伪本地化较大的翻译工程可使用vscode/l10n-dev做 XLIFF 往返pnpm exec vscode-l10n-dev generate-xlf pnpm exec vscode-l10n-dev import-xlf导入后清单目录放在仓库根目录运行时目录放在l10n/文件夹vscode/l10n-dev的输出目录选项不会替你区分这两处见 docs/localization.md。伪本地化Pseudo Localization用于不借助真实翻译来检验界面布局pnpm run generate:l10n:pseudo该命令执行 scripts/localization.mjs 的pseudo分支调用getL10nPseudoLocalized生成package.nls.qps-ploc.json与l10n/bundle.l10n.qps-ploc.json。一个重要的实现细节getL10nPseudoLocalized按{\S\}匹配占位符无法把复数块识别为一个整体会破坏plural关键字与分支结构因此脚本先用pseudoLocalizeValue预处理——块的选择器、plural关键字、分支名与大括号原样穿过只对真正的文本消息正文与每个分支内的文字嵌套块递归处理做伪本地化。生成的伪目录被 git 忽略、也不打入 VSIX。使用方式安装微软的 Pseudo Language Pack把Configure Display Language设为qps-ploc并重载。在 VS Code 中查看翻译效果安装目标语言的微软语言包Microsoft language pack将Configure Display Language切换为该语言并重载若只想看布局、没有真实译文就用上面的伪本地化流程。仓库还提供浏览器级回归测试pnpm run test:localization:browser用 Playwright Chromium 验证“翻译后的标记仍是纯文本、多行 tooltip/确认框保留换行、富链接仍可用”见 scripts/tests/localization.browser.test.mjs其wipStats用例用带复数块的中文/法文等译文在真实 Chromium 中渲染。首次运行需pnpm exec playwright install chromium。Review 与 CI 门槛新语言在对外宣传为“受支持”之前必须经过人工评审。提交流程为带着两个语言文件package.nls.locale.json与l10n/bundle.l10n.locale.json开 Pull Request目录校验catalog check会在 CI 中自动执行。pnpm run check:l10n也被包含在总检查pnpm run check里。分块翻译工作流Chunked Translation对于完全没有现存翻译或积压大量新消息的语言scripts/localization-chunks.mjs 把工作拆成一个个可独立翻译的小文件node scripts/localization-chunks.mjs split zh-cn # 把未翻译条目写成 .work/l10n-chunks/zh-cn/ 下的 chunk 文件 node scripts/localization-chunks.mjs merge zh-cn # 把翻译好的 chunk 合并进两个语言文件 node scripts/localization-chunks.mjs prune zh-cn # 丢弃英文消息已不存在的条目三个子命令的语义与源码实现一一对应split locale扫描两个源目录package.nls.json与l10n/bundle.l10n.json找出语言文件中缺失的键按默认600 条/块写成catalog-NN.json清单目录为manifest-NN.json运行时目录为bundle-NN.json默认输出到.work/l10n-chunks/locale/。可用--size N调整块大小、--dir D指定输出目录。翻译者只需翻译每个 chunk 里的values规则同上键逐字节一致、占位符{0}、{name}、codicon、花括号包裹的片段保留、空白与 Markdown 原样、产品名不译。译文写回同名文件merge locale读取所有manifest-NN.json/bundle-NN.json对每个 chunk 先调用validateTranslations校验复用与pnpm run check:l10n相同的规则任一 chunk 有错就整体中止且不写入任何内容通过后把条目折入语言文件保留既有翻译并把{ message, comment }对象展平为纯字符串因为扩展宿主不解包对象合并完成后提示运行pnpm run check:l10nprune locale当英文源消息被编辑/删除后旧译文会变成未知键并导致目录校验失败prune把这些孤儿条目从语言文件中移除。当英文源变化时重新运行split它会拿新目录与语言文件做 diff只产出包含未翻译条目的 chunk。术语约定Terminology Conventions语言包的好坏取决于一致性。建议为每种语言维护术语表并全局统一尽量与该语言的 VS Code 语言包对齐。简体中文目录zh-cn与繁体中文目录zh-tw采用如下基线Englishzh-cnzh-twcommit提交認可branch分支分支tag标签標籤stash贮藏擱置stage暂存暫存rebase变基重定基底cherry-pick拣选挑揀pull拉取提取fetch提取擷取pull request拉取请求提取要求merge request合并请求合併請求checkout检出簽出revert还原還原discard放弃捨棄drop丢弃丟棄undo撤消復原remote远程遠端repository仓库儲存庫worktree工作树工作樹working tree工作树工作樹workspace工作区工作區merge base合并基合併基底blame追溯追溯review/reviewer审查/审查者審查/審查者provider提供程序提供者account帐户帳戶agent代理代理output channel输出通道輸出通道注意working tree检出的工作目录与worktreegit 功能共用一词与 VS Code 的处理一致只有workspace译为 工作区/工作區。因此 Working changes 译为 工作树更改 / 工作樹變更。跨语言目录须保持的不变量GitLens、GitKraken、Launchpad、Copilot是不透明品牌名保持不译git 语法、git 配置键如blame.ignoreRevsFile以及 git 自身的commit-graph维护命令同样不译。但表面上像英文、实为描述性功能名Worktrees、Repository Health、Inline Blame不是品牌名要翻译描述性的 GitKraken 功能名需要翻译zh-cn 示例Commit Graph → 提交图Visual History → 可视化历史Visual File History → 可视化文件历史Cloud Patch → 云补丁Inspect → 检查器Compose/Recompose → 撰写/重新撰写Composer → 撰写器Focus → 聚焦Repository Health → 仓库健康状况对 graph 的泛指the Graph、小写 commit graph、scope the graph使用同一译法。作为视图名词的Inspect译为 检查器Inspect Commit Details → 在检查器中查看提交详情作动词的inspect保持动词消息里引用的命令名如 GitLens: Open Commit Graph、Add a Show Commit Graph command、Scope to Worktree 设置描述必须与该命令在package.nls.locale.json中的已翻译标题一致——用户界面里只会看到翻译后的标题英文名指向的是用户界面中不存在的东西。查表对照不要把引号里的名字留在英文也不要另造措辞。command:URI 与#setting#引用保持原样未翻译但无处不在的源词仍需一致处理英文说 Message 但实际指提交消息时按 Commit Message 的译法翻译标点跟随目标语言而非源语言中文文本后的冒号用全角无法推送{0}中文括号用全角zh-cn 用“…”引号、zh-tw 用「…」。代码段、URL、Markdown 链接标题与command:URI 内保持 ASCII 标点。西班牙语es约定以 VS Code 西班牙语语言包microsoft/vscode-loc为基准它解决了与中文的决定性差异git 动词与操作保持英文——commit、stash、pull、push、fetch、rebase、cherry-pick、checkout、squashVS Code es 用Hacer commit、aplicar stash。它们是不变的阳性名词el commit、el stash与hacer搭配hacer checkout de la rama、hará force push。派生词要翻译uncommitted →sin commitstaged/unstaged →preparado/sin preparar绝不用 staged/stagingdetached →desasociadochecked out →con checkout activoforce push →forzar push/un force push。周边名词翻译如下Englishesgenderbranchramaftagetiquetafremoteremotomrepositoryrepositoriomworktreeárbol de trabajoLaunchpad Worktrees 中亦同mmerge (n.)fusiónfmerge targetdestino de fusiónmcheckout (n.)checkout覆盖 VS Code 的 desproteger——其含义像解除保护mdiscarddescartar也用于drop stash—revert (v./n.)revertir / reversiónfprunepodar / poda不用depurar——本目录用它表示debugffoldplegar—fork pointpunto de bifurcaciónmlocateubicar不用buscar——那是 search—pull requestsolicitud de incorporación de cambiosfblameblame—语域register用usted¿Desea…?deles绝不用 dáles成对的 ¿…?/¡…!按钮与菜单标签用不定式Hacer cherry-pick…设置描述用第三人称Especifica…、Muestra…。功能名按前述策略翻译Grafo de commits、Historial visual、Historial visual de archivos、parche en la nube、Inspector、Redactar/Redactor、Enfoque、Salud del repositorio。es 特有的风险是未知占位符内容与性数一致优先采用不随占位符变形的句式Se eliminó: {0}。从 zh-cn 派生 zh-tw 的机械化流程对于共享字符集的 CJK 语言新变体可以机械化派生而非重新翻译先把现有目录用OpenCCs2twpprofileASCII、键与占位符不受影响跑一遍再套用目标语言的术语表。OpenCC 不是仓库依赖需本地安装做一次性运行。两个来自 zh-tw 派生过程的顺序约束先转换 fetch提取→擷取再转换 pull拉取→提取这样 Confirm Pull{0}Fetching{1} 这类混合句子才能正确映射真正有歧义的词要按英文源门控zh-cn 提交同时对应commit与submitzh-cn 放弃同时对应discard与give up。s2twp能可靠转换字符但只覆盖部分词汇。首版 zh-tw 目录对以下大陆用词做了二次处理派生时应一并应用歧义词按英文键门控zh-cn 残留zh-twzh-cn 残留zh-tw更改變更列表清單當前目前詳情 / 詳細資訊詳細資料應用 (apply; 非 應用程式)套用令牌權杖會話工作階段標籤頁索引標籤生成產生響應回應訪問存取身份身分配置設定高亮醒目提示賬戶帳戶佈局版面配置釋出 (publish)發佈文本文字檢測偵測構建建置終端終端機後臺背景自定義自訂新建新增獲取取得證書憑證日誌 / 更新日誌記錄 / 變更記錄許可權權限反饋意見反應工具欄 / 狀態欄工具列 / 狀態列瞭解了解批註註釋提供程式提供者…「…」派生过程中的已知陷阱词级替换造成复合词翻倍文件资源管理器 → 檔案 檔案總管 檔案檔案總管误抓子串迷你图minimap不是 the graphblame.ignoreRevsFile是配置键不能动复合术语误映射拉取请求必须变成 提取要求而不是 提取請求。因此派生后要打印每一条改动并重新运行pnpm run check:l10n——键与占位符集合不会因转换漂移ASCII 不受影响但语义可能出错。运行与验证建议改动英文源码消息后先pnpm run generate:l10n重新生成运行时目录再pnpm run check:l10n校验若同时改了贡献点文本先pnpm run generate:contributions同步package.nls.json翻译者提交前pnpm run check:l10n是底线门槛合并/裁剪 chunk 后尤其要跑涉及 webview 富文本、多行 tooltip 时pnpm run test:localization提取/校验/初始化与字面量消息 lint 规则与pnpm run test:localization:browser真实 Chromium 渲染双保险需要更细的提取/校验实现可研读 scripts/localization.mjs 与 packages/utils/src/plural.tsvscode/l10n-dev的 Unicode 转义解码缺陷由 patches/vscode__l10n-dev0.0.35.patch 修复上游 0.0.35 会丢失四位转义的最后一位数字、并在占位符后找错码点转义的闭合花括号提取回归测试会对比键与 JavaScript 运行时字符串。赞分享开发工具版本控制【免费下载链接】vscode-gitlensSupercharge Git inside VS Code and unlock untapped knowledge within each repository — Visualize code authorship at a glance via Git blame annotations and CodeLens, seamlessly navigate and explore Git repositories, gain valuable insights via rich visualizations and powerful comparison commands, and so much more项目地址https://gitcode.com/gh_mirrors/vs/vscode-gitlens点击查看免费下载相关推荐laravel-mongodb验证规则本地化多语言错误消息支持laravel mongodb验证规则本地化多语言错误消息支持 在全球化应用开发中用户可能来自不同地区使用不同语言。为提升用户体验应用需要根据用户的语言后端数据库Brackets 多语言本地化指南从新增语言到维护翻译的完整流程基于 src/nls/README.mdBrackets 多语言本地化指南从新增语言到维护翻译的完整流程基于 src/nls/README.md Brackets 是一款用 JavaScript开发工具代码编辑器桌面应用Create T3 App 文档多语言协作指南从翻译提交到本地化维护的完整工作流Create T3 App 文档多语言协作指南从翻译提交到本地化维护的完整工作流 本文面向希望为 Create T3 App 官方文档贡献翻译的开发者系统讲开发工具CLI代码生成上一篇GitHub_Trending/reg/register贡献者访谈核心开发者分享项目历程下一篇Theatre状态管理最佳实践避免过度设计创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表