如何制作一个持续发布的多语言网站
我的经验
软件通常是可翻译的,因为开发人员意识到了这项工作的价值。
幸运的话,会使用像 Weblate 这样的优质翻译平台,软件的变更会持续传递给译者,翻译也会回传到代码仓库。
软件是冰山露出水面的部分,是我们直接使用的东西,但如果围绕它的所有沟通都是英文的,就很难广泛地传播它。需要有关软件功能、用途和使用方法等方面的说明。
网站是项目沟通的基础,通常是可翻译的。用于创建网站的技术栈相对缺乏标准化,且受到创作者为丰富内容而进行个性化定制的影响,这可以通过一些 HTML 标签来实现。
文档是一个独立的世界,其工具通常来自开发生态系统(技术文档)或协作生态系统(wiki),这些工具很少提供允许协作的国际化前提条件。然而,这个问题与网站的问题非常相似。
最后,更直接的沟通,从新版本变更到社交媒体上推广工具的内容,很少是多语言的。
为什么很少有网站可以被翻译?
要达到良好的翻译水平,需要软件国际化能力来降低开发的工作量和复杂性,以及一个译者可以融入的流畅流程。
网站国际化的前提条件:
- 支持从右到左的书写方式
- 以多语言发布内容而无需修改内部链接
- 允许在任何页面上切换语言
- 考虑
Accept-Language请求头以引导到正确的语言 - 允许世界上任何语言和书写类型
这样说起来似乎很广泛且令人印象深刻,但像 UTF-8 这样的标准、一些 HTML 标签以及考虑了这些需求的工具,就能相当容易地实现。
开发人员所依赖的工具必须包含能够轻松实现国际化的功能,这就是所谓的国际化。如果工具的文档中没有多语言示例或国际化专用部分,请远离它。肯定有更好的选择,没有讨论的余地。
协作前提条件:开发人员必须了解能够方便译者工作的工具,并能轻松使用它们。
- 译者必须能够在不访问任何源代码或软件仓库的情况下进行翻译。
- 译者必须能够在不需要授权的情况下添加自己的语言。
- 译者必须能够在不需要授权的情况下修改翻译。
- 译者必须能够在涉及翻译的变更时收到通知。
- 翻译必须自动部署,无需人工干预。
- 开发团队必须在出现问题时容易联系到(自主 != 自给自足)
正确选择静态网站生成工具
这里只考虑能够从文件生成网站的工具。动态网站是一种非常特殊的复杂性,对于大多数自由软件项目来说并不必要。这甚至是一种不必要的复杂性,可以避免,从而节省维护工作、成本和安全风险。
无需开发专业知识,让我们比较以下三个工具:
- Hugo 有一个关于多语言发布的页面,内容完整,提供示例,这对这个项目很重要 ⇒ 试试 <3
- Jekyll 没有国际化页面,除非接受使用插件并接受其兼容性/复杂性约束 ⇒ 远离!
- Eleventy 有一个国际化页面,所以看起来可行,但非常手动,不能让人放心 ⇒ 远离!
- Pelican 只处理文章的翻译,没有专门的国际化页面,只是一个功能雏形 ⇒ 远离!
- Publii 没有国际化页面 ⇒ 远离!
思考时间很短:您想要一个开箱即用且支持多语言的静态网站?请使用 Hugo。
这并不是针对 Pelican 和 Jekyll,但除了功能比 Hugo 少之外,仅仅是修改待翻译文件头部的前提条件,就已经是自动化的一个障碍。而我们的目标正是全面自动化,尽可能减少工作量!一些项目确实能够用这些工具正确地国际化网站,但需要付出更大的努力,同时可能提供更少的功能(例如,URL 将保持英文而不是被翻译)。
案例研究 - 本博客
为了用真实数据具体实现这项自动化工作,以下是我的需求规格:
- 不需要对源语言的文章进行任何修改
- 使用 Weblate 作为翻译平台
- 添加新文章时无需在 Weblate 中进行配置
- 添加新语言时无需在 Hugo 中进行配置
- 完全自动化的发布
实现的步骤很简单。
找到令人满意的内容组织方式
content/fr将包含网站的所有内容l10n/所有翻译文件l10n/config与 Hugo 翻译相关的待翻译字符串l10n/pot翻译模板(POT 文件)l10n/po/%lang%每种语言的翻译(PO 文件)
格式转换器 po4a 将内容转换为翻译模板(POT 文件)。
一个 Python 脚本将调用 polib 来识别至少有一篇文章翻译达到 80% 以上(源文字翻译百分比)的语言。
另一个 Python 脚本将使用需要翻译的几个配置项(博客名称、博客描述……)来更新 Hugo 的配置。
这是一个可用的临时方案,可以做几件事来简化这个工具链。使用 po4a 的配置文件而不是调用其子命令,并去掉对 polib 的依赖,只保留一个
Python 文件。
为什么不使用 Weblate 的 Markdown 支持?Weblate 是一个翻译平台,转换文件是另一个角色。专用工具比 Weblate
做得更好,分离职责可以减少依赖,从而提高自动化链路演进的自主性。典型例子:po4a 可以被其他工具替代。
结果与经验教训
我们的自由软件社区完全有能力非常容易地制作多语言网站。
然而,缺少文档来解释如何组装现有工具以构建完整的生产链。
因此,本文旨在填补这一空白,并鼓励感兴趣的项目复制这种机制。
这个工具链肯定会被改进和简化,存储在一个专门的小项目中,解释其工作原理以最大化其复用性。目前,请浏览 languages-in-floss 网站的 git 仓库来找到这些脚本。