站点本地化
OTel 网站使用 Hugo 的 多语言框架 来支持页面本地化。英语是默认语言,美国英语是默认的(隐式)本地化。支持的本地化语言越来越多,如顶部导航栏的语言下拉菜单所示。
翻译指南
翻译英文网站页面时,我们建议您遵循本节提供的指南。
摘要
✅ 推荐
❌ 不推荐
标题 ID
为确保标题锚点在不同本地化版本之间保持一致,翻译标题时
- 如果标题有显式 ID,请保留该 ID。标题 ID 语法写在标题文本之后,使用类似
{ #some-id }的语法。 - 否则,明确声明一个与原始英文标题自动生成的 ID 相对应的标题 ID。
链接
不要翻译链接引用。这适用于外部链接、网站页面路径以及本地资源(如图片)的路径。
唯一例外是链接到您本地版本特有的外部页面(例如 https://en.wikipedia.org)。通常这意味着用您本地语言的代码替换 URL 中的 en。
OTel 网站仓库有一个自定义的渲染链接钩子,Hugo 使用它来转换指向文档页面的绝对链接路径。/docs/some-page 形式的链接会根据页面语言代码进行本地化,在渲染链接时将路径加上页面语言代码前缀。例如,从日语页面渲染时,上面的示例路径将变成 /docs/some-page。
链接定义标签
本地化作者可以选择是否翻译 Markdown 链接定义的标签。如果您选择保留英文标签,请遵循本节的指南。
例如,考虑以下 Markdown
[Hello], world! Welcome to the [OTel website][].
[hello]: https://code.org/helloworld
[OTel website]: https://opentelemetry.org.cn
在法语中,这将翻译为
[Bonjour][hello], le monde! Bienvenue sur le [site OTel][OTel website].
[hello]: https://code.org/helloworld
[OTel website]: https://opentelemetry.org.cn
图片和图表
除非您在图片中本地化文本,否则不要复制图片文件2。
要翻译Mermaid图表中的文本。
包含文件
要翻译 _includes 目录下的页面片段,就像翻译其他页面内容一样。
短代码
截至 2025 年 2 月,我们正在从短代码迁移到包含文件,以支持共享页面内容。
一些基础短代码包含英文文本,您可能需要对其进行本地化——这尤其适用于包含在layouts/_shortcodes/docs中的短代码。
如果您需要创建短代码的本地化版本,请将其放在 layouts/_shortcodes/xx 下,其中 xx 是您本地化的语言代码。然后,使用与原始基础短代码相同的相对路径。
跟踪本地化页面的偏差
维护本地化页面时面临的主要挑战之一是识别相应的英文页面何时已更新。本节解释了我们如何处理这个问题。
default_lang_commit 前端字段
编写本地化页面时,例如 content/<some-path>/page.md,此翻译基于对应英文版本页面在 content/en/<some-path>/page.md 的特定main 分支提交。在此仓库中,每个本地化页面都在本地化页面的前端中标识英文页面提交,如下所示:
---
title: Your localized page title
# ...
default_lang_commit: <most-recent-commit-hash-of-default-language-page>
---
上面的前端将在 content/<some-path>/page.md 中。提交哈希将对应于 main 分支中 content/en/<some-path>/page.md 的最新提交。
跟踪英文页面的更改
随着英文页面更新,您可以通过运行以下命令来跟踪需要更新的相应本地化页面:
$ npm run check:i18n
1 1 content/en/docs/platforms/kubernetes/_index.md - content/docs/platforms/kubernetes/_index.md
...
您可以通过提供如下路径来限制目标页面到一个或多个本地化语言:
npm run check:i18n -- content/zh
查看更改详情
对于任何需要更新的本地化页面,您可以使用 -d 标志并提供您的本地化页面路径来查看相应英文页面的差异详情,或者省略路径以查看所有页面。例如:
$ npm run check:i18n -- -d content/docs/platforms/kubernetes
diff --git a/content/en/docs/platforms/kubernetes/_index.md b/content/en/docs/platforms/kubernetes/_index.md
index 3592df5d..c7980653 100644
--- a/content/en/docs/platforms/kubernetes/_index.md
+++ b/content/en/docs/platforms/kubernetes/_index.md
@@ -1,7 +1,7 @@
---
title: OpenTelemetry with Kubernetes
linkTitle: Kubernetes
-weight: 11
+weight: 350
description: Using OpenTelemetry with Kubernetes
---
为新页面添加 default_lang_commit
在为您的本地化创建页面时,请记住在页面前端添加 default_lang_commit 以及来自 main 的适当提交哈希。
如果您的页面翻译基于 main 中 <hash> 的英文页面,则运行以下命令以使用提交 <hash> 自动将 default_lang_commit 添加到您的页面文件的前端。如果您的页面当前与 main 的 HEAD 同步,您可以将 HEAD 作为参数指定。例如:
npm run check:i18n -- -n -c 1ca30b4d content/ja
npm run check:i18n -- -n -c HEAD content/docs/concepts
要列出缺少哈希键的本地化页面文件,请运行:
npm run check:i18n -- -n
为现有页面更新 default_lang_commit
在更新您的本地化页面以匹配相应英文页面所做的更改时,请确保您也更新 default_lang_commit 提交哈希。
如果您的本地化页面现在对应于 main 中 HEAD 的英文版本,则删除前端中的提交哈希值,然后运行上一节中给出的添加命令以自动刷新 default_lang_commit 字段值。
如果您已批量更新了所有已偏差的本地化页面,您可以使用 -c 标志后跟提交哈希或‘HEAD’(使用 main@HEAD)来更新这些文件的提交哈希。
npm run check:i18n -- -c <hash> <PATH-TO-YOUR-NEW-FILES>
npm run check:i18n -- -c HEAD <PATH-TO-YOUR-NEW-FILES>
当您使用 HEAD 作为哈希说明符时,脚本将使用您本地环境中 main 的 HEAD 的哈希。如果您希望 HEAD 对应于 GitHub 中的 main,请确保您已获取并拉取 main。
偏差状态
运行 npm run fix:i18n:status 为已发生偏差的目标本地化页面添加前端字段 drifted_from_default。该字段将很快用于在已相对于英文版本发生偏差的页面顶部显示横幅。
脚本帮助
有关该脚本的更多详细信息,请运行 npm run check:i18n -- -h。
新的本地化
有兴趣为 OTel 网站启动新的本地化吗?请联系维护者表达您的兴趣,例如通过 GitHub 讨论或通过 Slack #otel-docs-localization 频道。本节介绍了启动新本地化所涉及的步骤。
您不必是 OpenTelemetry 项目的现有贡献者即可启动新的本地化。但是,在您满足成为已建立成员和审批者要求之前,您无法被添加为OpenTelemetry GitHub 组织的成员或您本地化的审批者组的成员,具体要求请参见成员资格指南。
在您获得审批者身份之前,您可以通过添加“LGTM”(Looks Good To Me)评论来表示您对本地化 PR 的批准。在此启动阶段,维护者将把您的审查视为您已是审批者。
1. 组建本地化团队
创建本地化就是发展一个活跃且支持性的社区。要为 OpenTelemetry 网站启动新的本地化,您需要
- 一位熟悉您语言的本地化导师,例如CNCF 术语表或Kubernetes 网站的活跃审批者。
- 至少两名潜在贡献者。
2. 本地化启动:创建问题
在本地化团队到位或正在形成时,创建一个包含以下任务列表的问题:
查找您想添加的语言的官方ISO 639-1 代码。在本节的其余部分,我们将此语言代码称为
LANG_ID。如果您不确定使用哪个标签,尤其是在选择子区域时,请咨询维护者。确定导师和潜在贡献者的 GitHub 用户名。
在新问题中包含以下任务列表作为开头的评论:
- [ ] Language info: - ISO 639-1 language code: `LANG_ID` - Language name: ADD_NAME_HERE - [ ] Locale team info: - [ ] Locale mentor: @GITHUB_HANDLE1, @GITHUB_HANDLE2, ... - [ ] Contributors: @GITHUB_HANDLE1, @GITHUB_HANDLE2, ... - [ ] Read through [Localization](https://opentelemetry.org.cn/docs/contributing/localization/) and all other pages in the Contributing section - [ ] Localize site homepage (only) to YOUR_LANGUAGE_NAME and submit a PR. For details, see [Localize the homepage](https://opentelemetry.org.cn/docs/contributing/localization/#homepage). - [ ] OTel maintainers: - [ ] Update Hugo config for `LANG_ID` - [ ] Configure cSpell and other tooling support - [ ] Create an issue label for `lang:LANG_ID` - [ ] Create org-level group for `LANG_ID` approvers - [ ] Update components owners for `content/LANG_ID` - [ ] Create an issue to track the localization of the **glossary**. Add the issue number here. For details, see [Localize the glossary](https://opentelemetry.org.cn/docs/contributing/localization/#glossary).
3. 本地化主页
提交一个拉取请求,其中包含网站主页的翻译,*仅此内容*,文件名为 content/LANG_ID/_index.md。确保维护者拥有编辑您 PR 的必要权限,因为他们将在您的 PR 中添加其他更改,以启动您的本地化项目。
您的第一个 PR 合并后,维护者将设置问题标签、组织级别组和组件所有者。
4. 本地化术语表
第二个需要本地化的页面是术语表。这对本地化读者来说是关键页面,因为它定义了可观测性,特别是 OpenTelemetry 中使用的关键术语。如果您的语言中没有这些术语,这一点尤其重要。
有关指导,请参阅 Ali Dowair 在 Write the Docs 2024 的演讲视频:《翻译的艺术:如何本地化 Kubernetes 文档到阿拉伯语》 Ali Dowair。
5. 分小批次本地化剩余的网站页面
本地化团队应分小批量提交工作。也就是说,请保持PR小,最好仅限于一个或几个小文件。较小的 PR 更容易审查,因此通常会更快地合并。
OTel 维护者清单
Hugo
更新 Hugo 的 LANG_ID 配置。在
config/_default/hugo.yaml的languages中添加LANG_ID的相应条目- 通过
config/_default/module-template.yaml更新module.mounts。至少,为content添加单个source-target条目。一旦本地化语言有足够的内容,请考虑仅为en回退页面添加条目。
拼写
查找可用的 NPM 包 @cspell/dict-LANG_ID 格式的 cSpell 词典。如果您的方言或地区没有可用的词典,请选择最接近的地区。
如果没有可用的词典,则跳过此小节的其余部分。否则:
- 将 NPM 包添加为开发依赖项,例如:
npm install --save-dev @cspell/dict-bn。 - 创建
.cspell/LANG_ID-words.txt作为LANG_ID的站点本地词典单词。 - 在
.cspell.yml中,为以下项添加条目:importdictionaryDefinitionsdictionaries:在此处添加两个条目,一个用于LANG_ID,一个用于LANG_ID-words.txt
其他工具支持
- Prettier 支持:如果
LANG_ID在 Prettier 中支持不佳,请向.prettierignore添加忽略规则
审批者和维护者指南
包含语义更改的 PR 不应跨越多个区域设置
审批者应确保进行文档页面语义更改的PR不应跨越多个区域设置。语义更改是指影响页面内容含义的更改。我们的文档本地化流程确保各区域设置的审批者将及时审查英文语言的编辑,以确定更改是否适合其区域设置,以及如何最好地将其纳入其区域设置。如果需要更改,区域设置审批者将通过其各自的区域设置特定 PR 来进行。
纯粹的编辑性更改跨越多个区域设置是可以的
纯粹的编辑性页面更新是指不影响现有内容且可以跨越多个区域设置的更改。这些包括:
- 链接维护:当页面移动或删除时修复损坏的链接路径。
- 资源更新:更新指向已移动的外部资源的链接。
- 定向内容添加:在已偏差文件中添加特定的新定义或部分,当无法更新整个文件时。
链接修复和资源更新
例如,有时英文文档的更改可能导致非英语本地化语言出现链接检查失败。当文档页面被移动或删除时,就会发生这种情况。
在这种情况下,对每个出现链接路径失败的非英语页面进行以下更新:
- 更新链接引用到新的页面路径。
- 在
default_lang_commit前端行的末尾添加# patchedYAML 注释。 - 不要对文件进行其他更改。
- 重新运行
npm run check:links并确保没有链接失败。
当一个指向已移动(但否则在语义上未更改)资源(如 GitHub 文件)的外部链接导致链接检查失败时,请考虑:
- 从 refcache 中删除损坏的链接
- 使用本节前面描述的方法跨所有本地化语言更新链接。
对已偏差文件的定向内容添加
当向已偏差英文版本的本地化文件添加特定新内容时,您可以选择进行定向更新,而不是更新整个文件。例如,当一个新术语如“基数”(cardinality)添加到英文术语表中时,您可以只将该术语添加到本地化术语表中,而不处理其他已偏差的内容。
以下是此定向更新工作流程的示例:
- 仅将“基数”定义块添加到本地化术语表中
- 通过在
default_lang_commit行末尾添加# patched作为注释来更新前端 - 保持所有其他现有内容不变
- 在 PR 描述中,清楚地记录:
- 添加的具体内容(“基数”定义)
- 该文件在其他内容方面仍有偏差
- 定向更新的理由(例如,“为本地化读者提供关键的新术语,而无需进行完整文件同步”)
这种方法能够对本地化内容进行渐进式改进,同时保持对文件仍需要未来关注以与英文版本完全同步的认知。