news 2026/10/1 7:57:44

Helium 浏览器 UI 国际化翻译规范:i18n/prompt.md 全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Helium 浏览器 UI 国际化翻译规范:i18n/prompt.md 全解析
  • 桌面应用

【免费下载链接】helium-chromium

Private, fast, and honest web browser

项目地址:https://gitcode.com/GitHub_Trending/he/helium-chromium
点击查看免费下载

导读

Helium 是一个基于 Chromium 的浏览器项目,其 UI 界面字符串的国际化(i18n)工作流由 i18n/prompt.md 这份"翻译提示词"文档驱动——它不是给人看的说明,而是喂给 LLM 的翻译指令模板。本篇文章将逐条拆解这份 prompt 的 11 条翻译规则与输入/输出格式契约,并结合仓库中真实的源码(devutils/i18n_generate.py、devutils/i18n_translate.py)、数据文件(i18n/source.gen.json、i18n/languages.json)与 70 余个语言翻译文件,帮助你完整理解 Helium 的 UI 字符串翻译体系,并掌握可直接复用的浏览器类产品翻译提示词工程方法。

一、prompt 在 Helium 翻译流水线中的位置

要理解这份 prompt 的价值,先要看它在整个 i18n 管线中扮演什么角色。Helium 的翻译流程是"从补丁提取 → LLM 翻译 → 回写 Chromium"三段式:

  1. 提取(generate):./devutils/i18n.py generate会克隆三个平台仓库(windows/macos/linux)与 onboarding 仓库,读取所有patches/series中触碰到.grd/.grdp文件的补丁,用 unidiff 解析 diff hunk,把新增或改动的 GRIT<message>单元抽取为 JSON 条目,输出到 i18n/source.gen.json。每条记录包含name(如IDS_SETTINGS_PERFORMANCE_*)、source(来自哪个 GRD 文件)、context(用途说明)与message(英文原文)。实现细节见 devutils/i18n_generate.py。
  2. 翻译(translate):./devutils/i18n.py translate调用i18n_translate.py,加载 i18n/prompt.md 作为 system prompt,把语言名与语言代码替换进{{language_name}}/{{language_code}}占位符(devutils/i18n_translate.py),再将待翻译字符串的 JSON 数组作为 user 消息发送给 LLM(OpenAI 兼容的 completions API,或通过--cmd指定的命令行后端)。模型返回纯 JSON 后经解析、校验,合并写回i18n/translations/<lang>.json。
  3. 应用(apply):utils/i18n_apply.py将翻译结果按 fingerprint 写入 Chromium 的 XTB 文件(utils/i18n_apply.py),供浏览器编译时使用。

也就是说,这份 prompt 是"翻译质量"的直接决定者:LLM 的每一句译文都严格受它约束。

二、输入与输出契约:模型需要遵守的数据格式

输入:JSON 数组

模型收到的用户消息是一个 JSON 数组,每个对象包含三个字段:

  • name:字符串标识符(如IDS_IMPORTED_FROM_BOOKMARK_FOLDER),不可翻译、不可改动,用于回写时与源文件匹配;
  • context:该字符串在界面中的使用位置与用途描述,指导选词与语气;
  • message:需要翻译的英文源字符串。

需要注意两点:

  • 某些条目带有"translate": false标记,它们是已经翻译好的上下文示例,用于帮助模型对齐既有风格与术语,不要翻译。这对应i18n_translate.py中build_payload的逻辑——它会把待翻译字符串前后各 2 条邻近条目一起打包进 payload,已翻译的邻近条目就标记为translate: false充当语境参考(devutils/i18n_translate.py)。
  • 同一个name可能多次出现,携带不同的message(平台或上下文变体),此时要逐条独立翻译,不能因为名字相同就复用或跳过。

输出:严格顺序的 JSON 数组

模型必须只输出一个 JSON 数组,且保持与输入相同的顺序,每个待翻译条目对应一个对象:

  • name:原字符串标识符(原样保留);
  • message:默认(中性)形式的译文;
  • feminine/masculine:仅当目标语言有语法性别、且译文在面向女性/男性用户时会发生变化时才提供,与message相同则省略。

文档给出了法语例子:翻译 "Imported from X" 时,message为默认(阳性)形式"Importé depuis X",feminine为"Importée depuis X"(过去分词随性别变化)。像 "Add search engine" 这类无性别变化的按钮文案,两个字段都要省略。仓库里的法语翻译文件正好印证了这一约定,例如 i18n/translations/fr.json 中:

{ "name": "IDS_IMPORTED_FROM_BOOKMARK_FOLDER", "source": "Imported from <ph name=\"BROWSER_NAME\">$1<ex>Helium</ex></ph>", "message": "Importé depuis <ph name=\"BROWSER_NAME\">$1<ex>Helium</ex></ph>", "feminine": "Importée depuis <ph name=\"BROWSER_NAME\">$1<ex>Helium</ex></ph>" }

输出时的硬性约束还有一条:译文中的英文双引号必须转义为\",或替换为符合目标语言习惯的引号(如法语的«»、德语的„"、日语的「」),否则未转义的双引号会破坏 JSON。此外模型不得输出任何额外文字、解释或 Markdown 格式。i18n_translate.py在解析侧也有兜底:fixup_json会剥离 json ``` 代码围栏并自动修复未转义的双引号(devutils/i18n_translate.py),parse_response则校验字段白名单(仅允许name/message/feminine/masculine)、缺失条目和顺序(devutils/i18n_translate.py)。

翻译文件的落盘格式

模型输出经save_translations合并后,最终写入i18n/translations/<lang>.json的条目结构与 prompt 的输出稍有不同——多了source字段(英文原文)用于内容匹配。匹配按name+source内容而非数组位置进行(i18n/README.md),且source.gen.json中字符串一旦变化,旧译文就会被find_untranslated判定为"过时"并触发重新翻译(devutils/i18n_translate.py)。

三、十一条翻译规则逐条拆解

1. 占位符(<ph>标签)必须原样保留

源字符串中形如<ph name="BROWSER_NAME">$1<ex>Helium</ex></ph>的占位符用于在运行时注入动态值(这里是浏览器名称)。规则要求:

  • 不翻译、不重排、不修改<ph>标签内的任何内容;
  • 译文必须完整保留这些标签(可整体移动其位置,但不能改动内部)。

例如 i18n/source.gen.json 中的IDS_IMPORTED_FROM_BOOKMARK_FOLDER:"Imported from <ph name=\"BROWSER_NAME\">$1<ex>Helium</ex></ph>"。俄语翻译 i18n/translations/ru.json 将其译为"Импортировано из <ph name=\"BROWSER_NAME\">$1<ex>Helium</ex></ph>"——标签被完整搬到译文中。

这套机制在i18n_apply.py中还有对应的"反向转换":把 GRD 风格的<ph name="X">...内容...</ph>正则替换为 XTB 格式的<ph name="X" />(utils/i18n_apply.py),因此模型侧保留的标签名必须与源完全一致。

2. 品牌名永不翻译

"Helium" 是产品名,任何语言都不得翻译。其他品牌名(如 "uBlock Origin")同样保持原样。而非品牌的功能名与布局名(如内存节省模式、标签页、书签等)在目标语言有自然说法时应翻译。仓库中大量字符串都是这个模式,比如法语文件把 "Helium services" 译为 "Services Helium"——Helium 保留,services 本地化。

3. 语域(Register):礼貌、自然,遵循目标语言的敬称惯例

要求使用礼貌、自然的 UI 语域,既不俚语化也不法律文书化。规则明确列出各语言的第二人称选择:

  • 区分敬称/非敬称的语言用敬称:法语用 "vous",德语用 "Sie",俄语用 "вы";
  • 目标区域习惯非正式口吻的(如西班牙语 "tú")则用非正式形式;
  • 不区分正式程度的语言用中性措辞。

法语翻译中大量 "vous" 形式(如 i18n/translations/fr.json 的 "Vos onglets inactifs redeviennent automatiquement actifs lorsque vous y retournez.")就是这条规则的直接体现。

4. 简洁:长度与原文匹配,不增删信息

按钮标签与菜单项要简洁,描述性文案可以稍长,但不得添加原文没有的信息。这是"忠实翻译"在 UI 场景的落地:界面文案的长度直接影响布局与可用性。

5. 语境与大小写:用context字段指导选词

context字段描述了字符串的使用位置(如 "Title for the dialog shown when Full Disk Access is needed..."),模型应据此选择词义与语气。同时要保留有意义的 UI 大小写风格——Title Case、全大写、句子式标签——并转换为目标语言最自然的对应惯例(很多非拉丁字母语言并无英文式大小写,需按本族习惯处理)。

6. 技术术语:保持不译或使用浏览器既有标准译法

URL、HTTPS、DNS 等技术术语除非目标语言有成熟的浏览器 UI 等价词,否则保持原文。通用计算词汇("bookmarks"、"tabs"、"downloads")应使用主流浏览器在该语言中确立的标准译法。这条规则加上第 10 条一起,保证了 Helium 的术语与 Chrome/Chromium 生态保持一致,避免同词不同译造成的割裂感。

7. 键盘快捷键:键名与符号按目标语言/平台惯例保留

Ctrl、Shift、Tab 等键名及符号(如+、→)在绝大多数语言中保持英文/拉丁字母形式,无需本地化。这与 Chromium 的键位展示机制一致,键名改动会导致快捷键提示失效。

8. 语言正字法:俄语要用 ё

规则特别点名俄语(ru):该写 ё 的地方必须写 ё,用 е 替代会被视为不正确或产生歧义。例如 i18n/translations/ru.json 中的 "выгружает" 系列译文对 ё/е 的处理即遵循此规则。这是"本地化质量"而非"翻译正确性"的层面,但直接影响母语者的观感。

9. 意图与语法角色:命令像命令,设置像标签,帮助像描述

  • 命令与按钮要读起来像动作("Copy"、"Open"、"Reset");
  • 设置项要读起来像标签或开关("Allow automatic updates");
  • 帮助文本要读起来像描述。

并且要使用目标语言正常的命令形式——例如俄语 UI 命令常用完成体动词:"Скопировать"(完成体)而非 "Копировать"(未完成体)。这要求译者不仅懂语言,还要懂该语言 UI 的惯例。

10. 浏览器风格:贴合 Chromium/Chrome 既有译法

Helium 是 Chromium 系浏览器,常见浏览器概念的术语与措辞应参考目标语言 Chromium/Chrome 风格的既有翻译。这一条把第 6 条"标准译法"落实到具体参照系,是保证 Helium 70 多种语言(i18n/languages.json 列出 74 个 locale)整体一致性的关键。

11. ICU 复数消息:语法保留,只翻括号内文本

这是最技术性、也最容易翻错的一条。部分消息使用 ICU MessageFormat 复数语法,例如:

{MINUTES, plural, =1 {minute} other {minutes}}

规则要求把以下内容当作语法保留:参数名(MINUTES)、关键字plural、精确数字选择器(=0、=1)、复数类别选择器(zero、one、two、few、many、other)、offset:n、#字符及花括号。只翻译每个选择器花括号内的人类可读文本。#表示"插入按区域格式化的数量",必须原样保留,且原文没有时不得擅自添加。

不要假设所有语言只有英语式的单复数两态。具体做法是:

  1. 保留源中的所有精确数字分支(如=0、=1);
  2. 始终保留other;
  3. 使用目标语言 CLDR 基数复数类别——源中缺失的类别要补上,源中属于英语但目标语言不用的类别(如one、few、many)要移除;
  4. 复数类别归属查询 Unicode CLDR Language Plural Rules chart;
  5. 精确数字选择器优先于语言类别匹配:=1只指数字 1,而one类别还可能覆盖 21、31 等。

文档用俄语给出完整示例:源中的{MINUTES, plural, =1 {minute} other {minutes}}应译为:

{MINUTES, plural, =1 {минута} one {минута} few {минуты} many {минут} other {минуты}}

其中=1处理数字 1,one处理 21、31 等,few处理 2–4、22–24 等,many处理 0、5–20、25–30 等。注意:俄语示例只是机制演示,不是照抄模板——具体类别与措辞必须按{{language_code}}对应的语言而定。最后还要保留消息意图:如果原文省略数字(因为数字单独显示在 UI 上),译文也不要硬把数字塞回去。

source.gen.json中有不少真实 ICU 复数消息,例如崩溃报告对话框的"{COUNT, plural, =1 {Would you like to send a crash report?} other {Would you like to send # crash reports?}}"与扩展调试提示的"{NUM_EXTENSIONS, plural, =1 {This extension is debugging your browser:} other {These extensions are debugging your browser:}}"——前者是英文 only=1/other两分支,译成俄语等语言时必须按 CLDR 补出few/many等类别。

四、从 prompt 到仓库数据:一条规则的具体落地

以规则 1(占位符)与规则 11(ICU 复数)为例,串联起整个仓库:

  • 提取端:i18n_generate.py从补丁的 GRD/GRDP diff 中抽取<message>单元,name/desc/meaning取自 XML 属性,context由 desc 经name_substitution_utils.replace_text处理(devutils/i18n_generate.py),message 原文保留全部<ph>标签与 ICU 语法。
  • 翻译端:prompt 作为 system 消息约束 LLM 遵守上述 11 条;translate子命令通过--language fr de指定目标语言(缺省翻译 i18n/languages.json 中全部 74 个 locale),--from-file可离线导入人工/第三方翻译,--cmd或环境变量I18N_TRANSLATE_CMD可替换 LLM 后端(devutils/i18n_translate.py)。
  • 落盘端:校验通过后写入i18n/translations/<lang>.json,feminine/masculine按模型输出决定是否保留;source字段记录原文供内容匹配。
  • 应用端:utils/i18n_apply.py依据name+source找到 GRD/GRDP 的父 GRD 文件(find_parent_grd通过<part file="...">反查,onboarding 字符串固定挂在generated_resources.grd,见 utils/i18n_apply.py),把<ph>转成 XTB 空标签形式后写入对应语言的.xtb,最终参与浏览器编译。

五、对贡献者与翻译审校者的实践要点

结合 i18n/README.md 的流程说明,这份 prompt 对应的协作规范如下:

  • 不要直接提交新语言翻译的 PR:项目按批次批量运行翻译(README 中明确说明)。但修正既有字符串错误的 PR 是欢迎的。
  • 审校者关注点正是 prompt 核心规则的镜像:相对source的准确性、<ph>占位符的完整保留、语域合适度、品牌名未翻译。
  • 语言所有者机制:母语者可在 i18n/owners.yml 中申请成为某语言文件的审校负责人,配合批次机制保证长期质量。
  • 开发侧:新增字符串后用./devutils/i18n.py generate重新生成 i18n/source.gen.json,但不要自行生成机器翻译,交给维护者批量处理;翻译应用则用utils/i18n_apply.py(两者均可用-h查看完整参数)。

六、可复用的翻译提示词工程要点

如果要在自己的浏览器类产品中复刻这套方案,prompt 的设计可总结为以下可迁移原则:

  1. 把"输入/输出格式"写成机器可校验的契约:输入字段定义(name/context/message)、输出字段定义(name/message/feminine/masculine)、顺序要求、引号转义规则、禁出额外文本——全部写成明确指令,配合解析侧校验(字段白名单 + 缺失检测 + 顺序校验)实现闭环。
  2. 把"术语一致性"拆成多条可执行规则:品牌名禁译、技术术语保留、通用词用主流浏览器标准译法、风格对齐 Chromium——每一条都对应一个可检查点。
  3. 把"复数"单独成条并给出示例:ICU MessageFormat 最容易翻坏,规则需要明确"哪些是语法、哪些是文本",并提供俄语这类复杂复数语言的最小示例,同时强调"示例仅为机制演示"。
  4. 把"语境"显式交给模型:context字段 + 邻近已翻译条目(translate: false)双重语境,显著提升选词准确率。
  5. 把"质量红线"前置:语域(敬称惯例)、简洁度(不增删信息)、意图(命令/设置/描述的语法角色)都在 prompt 里一次性约束,而非事后人工返工。

结语

i18n/prompt.md 是一份高度工程化的 LLM 翻译指令:它把品牌保留、占位符保护、语域选择、术语对齐、ICU 复数、性别变体、JSON 契约等十余个维度压缩进一份模板,再由 devutils/i18n_translate.py 的解析与校验逻辑兜底。理解这份文档,不仅等于理解了 Helium 全部 74 个语言翻译文件(i18n/translations/)的生产方式,也等于掌握了一套可复用的"浏览器 UI 翻译提示词"范本。

  • 桌面应用

【免费下载链接】helium-chromium

Private, fast, and honest web browser

项目地址:https://gitcode.com/GitHub_Trending/he/helium-chromium
点击查看免费下载

相关推荐

上一篇:airi 项目实战:VueUse useFps 响应式帧率(FPS)监控与性能可视化指南
下一篇:Paperless-ngx 文档协作功能:多人编辑与冲突解决

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 7:57:43

OpenRig开源模拟驾驶座舱DIY方案:铝型材搭建高仿真赛车支架

如果你最近在模拟赛车社区里转&#xff0c;应该会频繁看到一个词&#xff1a;openrig。它不是某个成品支架的品牌&#xff0c;而是一套开源的高仿真驾驶模拟座舱DIY方案&#xff0c;围绕铝型材搭建座椅、踏板、方向盘和显示器的固定框架&#xff0c;图纸、BOM、装配逻辑全部开放…

作者头像 李华
网站建设 2026/10/1 7:57:12

GEO视角下AI搜索的信任门槛:企业知识库如何成为权威信源

一、大模型搜索中知识图谱与实体的四个常见问题大模型搜索的普及正在改变企业获取曝光的方式。当用户向豆包、DeepSeek、Kimi等平台提问时&#xff0c;AI不再返回链接列表&#xff0c;而是直接生成整合后的答案。这背后依赖的是知识图谱与实体关系的匹配&#xff0c;但企业普遍…

作者头像 李华
网站建设 2026/10/1 7:55:43

为什么以小博大是可能的?《一人企业方法论》V2.1底层逻辑与实战指南

为什么以小博大是可能的&#xff1f;《一人企业方法论》V2.1底层逻辑与实战指南 在数字化时代&#xff0c;个人创业不再需要庞大的资金和团队&#xff0c;一人企业正成为一种全新的商业形态。《一人企业方法论》V2.1版本深入剖析了如何通过系统化思维和现代工具&#xff0c;实…

作者头像 李华
网站建设 2026/10/1 7:55:03

paperclip:打造跨平台命令行剪贴板历史管理器

我把 paperclip 写出来&#xff0c;最初其实只是因为每天高频的 CtrlC / CtrlV 让我彻底受够了系统自带剪贴板的短视。复制完一段代码&#xff0c;再复制第二段&#xff0c;第一段就再也找不回来了&#xff1b;好不容易在浏览器里参考了一段配置&#xff0c;想粘贴到终端里&…

作者头像 李华