国际化(i18n)
Apothem 文档站点如何声明其语言区域集合、发出 hreflang 备用语言链接、处理从右到左的渲染,并诚实地揭示翻译缺口。
本页面记录了 Apothem 文档站点如何处理多语言:它所声明的语言区域集合、
它所发出的 hreflang 机制、它的从右到左就绪状态,以及各语言区域翻译的
诚实现状。
决策摘要
- 平台:Next.js App Router + Fumadocs。 站点从
site/构建而来。 语言区域集合在site/lib/i18n.ts中声明,备用语言链接机制位于site/lib/hreflang.ts。 - 语言区域集合:已声明。 由十二个语言区域组成的现代开发者集合 被声明为规范的真实来源,以英文作为源语言区域。
- 各语言区域路由:尚未启用。 在仅有英文内容时就为整个集合启用带 语言区域前缀的路由,会产生十一条无内容的路由,它们会静默回退到英文 源。这正是 i18n 纪律所禁止的那种静默的「仅英文」漂移,因此在经过审校的 翻译内容落地之前,路由保持单一语言区域。
hreflang机制:已激活。 每个页面都会发出一组<link rel="alternate">, 覆盖每个已撰写内容的语言区域,加上一个x-default回退。尚待翻译的 语言区域会被省略 —— 绝不指向英文回退 —— 这样搜索引擎就会被准确地 告知该翻译不存在。- 从右到左就绪状态:已就位。 共享样式表全程使用逻辑 CSS 属性,
因此一旦阿拉伯语内容落地,阿拉伯语页面会在
dir="rtl"下正确渲染。 - 机器翻译策略:未经审校的不发布。 没有任何机器翻译的页面正文会被 发布。翻译由机器播种,并在任何语言区域被标记为已翻译之前以人工审校 为闸门。
语言区域集合
现代开发者集合声明了十二个语言区域。英文在站点根目录提供;十一个目标 语言区域被声明出来,以使技术栈具备国际化就绪能力,并让翻译缺口显式 而非静默。
| 代码 | 路径 | 语言 | 方向 | 内容 |
|---|---|---|---|---|
en | / | 英文 | LTR | 已翻译(源) |
zh-CN | /zh-cn/ | 简体中文 | LTR | 待定 |
es | /es/ | 西班牙文 | LTR | 待定 |
pt-BR | /pt-br/ | 巴西葡萄牙文 | LTR | 待定 |
fr | /fr/ | 法文 | LTR | 待定 |
de | /de/ | 德文 | LTR | 待定 |
ja | /ja/ | 日文 | LTR | 待定 |
ko | /ko/ | 韩文 | LTR | 待定 |
ru | /ru/ | 俄文 | LTR | 待定 |
id | /id/ | 印尼文 | LTR | 待定 |
ar | /ar/ | 阿拉伯文 | RTL | 待定 |
hi | /hi/ | 印地文 | LTR | 待定 |
该集合是唯一的真实来源;对它的修订须经过深思熟虑的决策,绝不通过静默 编辑进行。
hreflang 如何工作
site/lib/hreflang.ts 构建了 alternates.languages 映射,Next.js 将其渲染进
每个页面的 <head>。它的构建遵循一条规则:仅当某语言区域已撰写内容时,
才发出该语言区域的备用语言链接。由于英文是当今唯一已翻译的语言区域,
每个页面恰好发出两条链接:
<link rel="alternate" hreflang="en" href="https://apothem.ahmedgad.com/..." />
<link rel="alternate" hreflang="x-default" href="https://apothem.ahmedgad.com/..." />页面的 canonical 链接始终是它自身的 URL —— 它绝不跨语言区域指向。
随着某语言区域的内容落地,并且其状态在 site/lib/i18n.ts 中翻转为已翻译,
该语言区域的 hreflang 链接便开始自动发出,并在同一变更集中启用该语言
区域的路由。
从右到左渲染
阿拉伯语是该集合的从右到左语言区域。站点已为其做好准备:
- 仅使用逻辑 CSS 属性。 共享样式表与组件使用逻辑属性
(
margin-inline-start、padding-inline-end、text-align: start、inset-inline-start),而非物理属性(margin-left、text-align: left)。 逻辑属性在dir="rtl"下自动翻转,因此同一份样式表能正确服务于两个 方向。 - 方向属性。 一旦阿拉伯语内容落地,阿拉伯语页面会在
<html>元素上 设置dir="rtl"并与lang="ar"并列。 - 双向内容。 混合方向的字符串 —— 例如阿拉伯语段落中的一条英文命令
—— 会被包裹在
<bdi>中,使嵌入的从左到右段在从右到左的流中正确渲染。
添加一种翻译
要将站点翻译成集合中的某个语言区域:
- 为该语言区域撰写经过审校的翻译页面。
- 在
site/lib/i18n.ts中将该语言区域的内容状态翻转为已翻译。 - 它的
hreflang链接开始发出,且其路由变得可达。
在某语言区域的翻译被撰写并审校完成之前,保持英文页面为真实来源。 没有任何机器翻译内容会未经审校就发布。
当前状态与通往已翻译语料库的路径
如今站点已具备国际化就绪能力,但内容上仅有英文。基础设施 —— 集合声明、
hreflang 机制、逻辑 CSS 从右到左就绪 —— 已就位;但各语言区域的翻译
语料库尚未就位。完全翻译的语料库属于功能层级的工作:每个语言区域的
页面先由机器播种,然后经人工审校,并且一个发布只有在每个语言区域都
通过其审校阈值之后,才算国际化生产就绪。在那之前,集合已被声明、缺口
可见,且没有任何未经审校的翻译会发布。