# 浅谈自由及开源软件翻译

推荐先阅读《大陆简中自由软件本地化工作指南》进行适当了解

细节日后补充

# 翻译工具

最重要的一环，是翻译质量的决定性因素  
机器翻译、翻译记忆、本地化平台等都会在此处提及

# 本地化平台

> 由于懒得遣词造句，所以暂时使用了ChatGPT生成的文本作为评价，请多见谅（

本地化平台是指用于进行软件或应用本地化工作（i18n）的在线或离线工具或服务。其功能包括提取需要本地化的文本、翻译文本、校对文本、测试本地化软件等。本地化平台通常提供了多种语言的支持和多种翻译方式，如机器翻译和人工翻译。

本地化平台主要由开发者/开发团队决定，以方便其它志愿者进行本地化工作。本地化平台可以帮助开源项目开发者和开源软件翻译志愿者更加高效地进行本地化工作，提高软件或应用的全球市场竞争力（面向市场化产品）和用户体验。在开展本地化工作时，需要考虑目标用户群体的语言和文化背景，遵守翻译的一些基本规则，并进行本地化测试，以确保软件或应用能够在不同语言和文化环境下正常运行和使用。

<p class="callout danger">专有（非开源）的本地化平台，多半是要向开发者/开发团队收取托管费用的，此处仅以翻译者视角进行反馈，故不考虑托管费用与开发者使用体验问题。</p>

此处列出的主要是常见于本地化开源软件的本地化平台。当然也有不使用本地化平台的开发者/开发团队，不过需要考虑很多问题：比如翻译者与开发者之间的对接工作、翻译文件的复核与提交等。

### [<bdi>Crowdin</bdi>](https://crowdin.com/)

#### SSO

支持SSO，可以通过OAuth、LDAP、SAML等多种方式与现有的身份验证系统集成，方便用户快速登录和使用平台。

补充：Google、GitHub、Bitbucket

#### 功能

提供了丰富的本地化管理功能，包括：多语言支持、翻译记忆库、自动化翻译、机器翻译、术语管理、校对、审阅等等。用户可以轻松管理项目和团队，快速发布本地化版本。

#### 使用难度

具有良好的用户体验和易用性，适合开源软件翻译者和非专业人士使用。同时，平台还提供了多种语言界面、丰富的文档和视频教程，帮助用户更好地了解和使用平台。

#### 软件举例

Flutter、Kubernetes、Nextcloud、Trello、Joomla、WordPress、GitLab等

### [<bdi>POEditor</bdi>](https://poeditor.com/)

#### SSO

#### 功能

#### 使用难度

#### 软件举例

PHPMailer、Bootstrap、React、Angular、Laravel、Vue.js等

### [Transifex](https://www.transifex.com/)

#### SSO

#### 功能

#### 使用难度

#### 软件举例

### [Weblate](http://weblate.org/)（最常见&amp;最推荐）

#### SSO

Weblate 支持基于 OpenID 或者 OAuth 2.0 的单点登录(SSO)，这意味着用户可以直接使用自己的社交媒体或者企业认证登录 Weblate，无需再进行繁琐的注册过程，简化了用户的使用流程。

补充：Google、Facebook、Slack、GitHub、Bitbucket、GitLab、 Microsoft Azure Active Directory等

#### 功能

Weblate 提供了丰富的功能来帮助开源软件的翻译团队更加高效地管理和协作：

- 支持多种翻译文件格式，包括 Gettext、PO、XLIFF 等。
- 支持机器翻译和术语库，可以提高翻译效率。
- 支持用户自定义工作流和翻译状态。
- 支持评论和问题追踪，可以更好地协作和交流。
- 支持版本控制系统(Git、Mercurial、Subversion等)集成，可以与代码库紧密结合。
- 支持 Webhook 和 API，方便与其他工具集成。
- ...

#### 使用难度

Weblate 的界面简洁明了，易于使用。它提供了一系列视频教程和文档，用户可以轻松上手。与其他平台相比，Weblate 的使用难度相对较低，用户界面友好，学习成本较小。

注：游客也可以给出翻译建议（如果功能开放），上手难度极低（指点点点）。

#### 软件举例

Django、Debian、LibreOffice、VLC等

#### 优势

1. 自由定制和修改：由于 Weblate 是一个开源软件，用户可以自由修改和扩展功能，以满足自己的特定需求。
2. 支持自托管：Weblate 可以自己托管在自己的服务器上，用户可以完全掌控数据和安全性，而不必将翻译数据和其他敏感信息上传到第三方平台。
3. 社区支持：作为一个开源软件，Weblate 有一个庞大的用户社区，用户可以在社区中寻求帮助、提出问题、报告错误，甚至参与软件开发和贡献。

# 辅助翻译工具

> 个人找到的一些用于辅助翻译的工具，注意不是用来直接翻译的工具

### 站点

#### 张海大佬的翻译库

[https://translations.zhanghai.me/](https://translations.zhanghai.me/)

#### Reverso Context

语境翻译

[https://context.reverso.net/translation/](https://context.reverso.net/translation/)

### 工具

#### Autocorrect

[huacnlee/autocorrect: A linter and formatter to help you to improve copywriting, correct spaces, words, and punctuations between CJK (Chinese, Japanese, Korean). (github.com)](https://github.com/huacnlee/autocorrect)

> AutoCorrect 的愿景是提供一套标准化的文案较正方案。以便于在各类场景（例如：撰写书籍、文档、内容发布、项目源代码...）里面应用，让使用者轻松实现标准化、专业化的文案输出 / 校正。

网页版：[AutoCorrect (huacnlee.github.io)](https://huacnlee.github.io/autocorrect/)

#### AI 辅助翻译

不推荐直接作为译文，可做参考

[ryanhex53/gpt-po: command tool for translate po files by using openai api](https://github.com/ryanhex53/gpt-po)

[preset-io/ai18n: Translate .po files using the openai api](https://github.com/preset-io/ai18n)

# 翻译流程

使用好的翻译工作流程可以事半功倍

# 本地化平台离线翻译流程

### 缘由

<div class="paragraph" id="bkmrk-%E6%9C%89%E7%82%B9%E6%87%92-%E5%B0%B1%E8%AE%A9-deepseek-r1-%E6%80%BB">有点懒 就让 DeepSeek-R1 总结了（</div>#### 灵活性与工具适配性

<div class="paragraph" id="bkmrk-%E7%A6%BB%E7%BA%BF%E7%BF%BB%E8%AF%91%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8%E6%9B%B4%E4%B8%93%E4%B8%9A%E7%9A%84%E6%9C%AC%E5%9C%B0%E5%8C%96%E5%B7%A5%E5%85%B7%EF%BC%8C%E8%BF%99%E4%BA%9B">离线翻译允许使用更专业的本地化工具，这些工具支持术语库、翻译记忆库（TM）、机器翻译集成等高级功能，能显著提升翻译效率和一致性。</div>#### 网络与协作限制

<div class="paragraph" id="bkmrk-%E5%9C%A8%E7%BD%91%E7%BB%9C%E4%B8%8D%E5%8F%AF%E9%9D%A0%E6%88%96%E5%8F%97%E9%99%90%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0%E5%8C%96%E5%B9%B3">在网络不可靠或受限的情况下，使用本地化平台在线翻译可能无法得到流畅的使用体验。</div>#### 性能与效率优化

<div class="paragraph" id="bkmrk-%E5%AF%B9%E4%BA%8E%E8%B6%85%E5%A4%A7%E5%9E%8B%E9%A1%B9%E7%9B%AE%EF%BC%88%E5%A6%82%E6%95%B0%E4%B8%87%E6%9D%A1%E7%BF%BB%E8%AF%91%E9%A1%B9%EF%BC%89%EF%BC%8C%E7%BD%91%E9%A1%B5%E7%AB%AF">对于超大型项目（如数万条翻译项），网页端操作可能卡顿，本地工具处理速度更快。</div>#### 复杂文件处理需求

<div class="paragraph" id="bkmrk-%E6%96%87%E4%BB%B6%E5%8F%AF%E8%83%BD%E9%9C%80%E8%A6%81%E8%84%9A%E6%9C%AC%E5%8C%96%E5%A4%84%E7%90%86%EF%BC%88%E5%A6%82%E6%89%B9%E9%87%8F%E6%9B%BF%E6%8D%A2%E5%8D%A0%E4%BD%8D%E7%AC%A6">文件可能需要脚本化处理（如批量替换占位符、调整变量格式），本地工具（如 Python 脚本、正则表达式工具）更灵活。</div>### 流程

<div class="paragraph" id="bkmrk-%E5%A4%A7%E8%87%B4%E5%88%86%E4%B8%BA%E4%B8%89%E4%B8%AA%E6%AD%A5%E9%AA%A4%EF%BC%9A">大致分为三个步骤：</div>1. 从远程下载模板文件
2. 本地使用相关工具进行翻译（所谓离线只是脱离在线平台，并非不联网）
3. 从本地上传译文文件

<div class="paragraph" id="bkmrk-%E5%85%B6%E4%B8%AD%E5%80%BC%E5%BE%97%E6%B3%A8%E6%84%8F%E7%9A%84%E7%82%B9%EF%BC%9A">其中值得注意的点：</div>- 选择适当翻译格式进行上传/下载，比如 Crowdin/Transifex（付费）仅支持通用格式 XLIFF
- 合理使用客户端，加速操作流程（后面会提及大部分命令行客户端）
- 合理使用辅助翻译工具，加速翻译流程（见 [AI 用于软件翻译流程](https://wiki.qunn.eu/books/fbd79/page/ai)）

### Weblate

#### WEB

<div class="paragraph" id="bkmrk-%E8%A7%81-downloading-and-up">见 [Downloading and uploading translations - Weblate latest documentation](https://docs.weblate.org/en/latest/user/files.html)</div>#### CLI

<div class="paragraph" id="bkmrk-%E4%BD%BF%E7%94%A8-weblateorg%2Fwlc%3A-w">使用 [WeblateOrg/wlc: Weblate command line client](https://github.com/WeblateOrg/wlc)</div>```shell
# https://docs.weblate.org/en/latest/wlc.html#getting-started 
vim ~/.config/weblate

# e.g. weblate/website/zh_Hans
$PROJECT=weblate;$COMPONENT=website;$LANGUAGE=zh_Hans

# show translation progress
wlc [stats/show] $PROJECT/$COMPONENT/$LANGUAGE

# download translation file
wlc download $PROJECT/$COMPONENT/$LANGUAGE -c po -o $PROJECT-$COMPONENT_$LANGUAGE.po

# do some translations here

# upload translation file
wlc upload $PROJECT/$COMPONENT/$LANGUAGE -i $PROJECT-$COMPONENT_$LANGUAGE.po [--method {translate/suggest/fuzzy}]
```

### Crowdin

#### WEB

<div class="paragraph" id="bkmrk-%E8%A7%81-offline-translatio">见 [Offline Translation | Crowdin Docs](https://support.crowdin.com/offline-translation/)</div><div class="paragraph" id="bkmrk-%E4%B8%BA%E4%BA%86%E5%B0%86-xliff-%E6%A0%BC%E5%BC%8F%E8%BD%AC%E8%87%B3%E5%90%88%E9%80%82%E7%9A%84%E7%BF%BB%E8%AF%91%E6%A0%BC"><div class="paragraph">为了将 XLIFF 格式转至合适的翻译格式，推荐配合 [The essential toolkit for localization engineers | Translate Toolkit](https://toolkit.translatehouse.org/)</div></div>#### CLI

<div class="paragraph" id="bkmrk-%E4%BD%BF%E7%94%A8-crowdin%2Fcrowdin-c">使用 [crowdin/crowdin-cli: A command-line client for the Crowdin API](https://github.com/crowdin/crowdin-cli)</div><div class="paragraph" id="bkmrk-%E9%9C%80%E8%A6%81%E5%88%86%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE%EF%BC%8C%E8%80%8C%E4%B8%94%E4%B8%8D%E6%94%AF%E6%8C%81%E6%8C%87%E5%AE%9A-xlif">需要分项目配置，而且不支持指定 XLIFF 格式 (?)，不太推荐</div>```shell
# https://crowdin.github.io/crowdin-cli/configuration
crowdin init
# or
export $CROWDIN_PERSONAL_TOKEN=[REDACTED];export $CROWDIN_PROJECT_ID=[REDACTED]

# show translation and proofreading progress
crowdin status -l zh-CN

# download translation file
crowdin download translations -l zh-CN

# do some translations here

# upload translation file
crowdin upload translations -l zh-CN

```

### Transifex

#### WEB

<div class="paragraph" id="bkmrk-%E8%A7%81-translate-offline-">见 [Translate Offline | Transifex Help Center](https://help.transifex.com/en/articles/6240596-translate-offline)</div><div class="paragraph" id="bkmrk-%E4%B8%BA%E4%BA%86%E5%B0%86%E5%8E%9F%E8%B5%84%E6%BA%90%E7%9A%84%E6%A0%BC%E5%BC%8F%EF%BC%88%E6%88%96%E8%AE%A2%E9%98%85%E4%BD%BF%E7%94%A8-xlif"><div class="paragraph">为了将原资源的格式（或订阅使用 XLIFF 格式）转至合适的翻译格式，推荐配合 [The essential toolkit for localization engineers | Translate Toolkit](https://toolkit.translatehouse.org/)</div></div>#### CLI

<div class="paragraph" id="bkmrk-%E4%BD%BF%E7%94%A8-transifex%2Fcli%3A-th">使用 [transifex/cli: The Transifex command-line client](https://github.com/transifex/cli)</div><div class="paragraph" id="bkmrk-%E9%9C%80%E8%A6%81%E5%88%86%E9%A1%B9%E7%9B%AE%E9%85%8D%E7%BD%AE%EF%BC%8C%E8%80%8C%E4%B8%94%E4%BD%BF%E7%94%A8-xliff-%E6%A0%BC">需要分项目配置，而且使用 XLIFF 格式需要订阅，不太推荐</div>```shell
# https://github.com/transifex/cli?tab=readme-ov-file#usage
tx init && vim .tx/config
# or
export $TX_TOKEN=[REDACTED]

# show translation and proofreading progress
tx status [resource_id]

# download translation file
tx pull -l zh-CN

# do some translations here

# upload translation file
tx push -l zh-CN

```

### Translation Project

<div class="paragraph" id="bkmrk-%E5%8F%82%E8%80%83-translators-and-t">参考 [Translators and the TP](https://translationproject.org/html/translators.html)</div>#### CLI

<div class="paragraph" id="bkmrk-%E4%BD%BF%E7%94%A8-translation-softw">使用 [Translation software and other projects](https://translationproject.org/html/software.html)</div>```
./sendpo.sh POFILE
```

# AI 用于软件翻译流程

### 选择翻译格式

<div class="paragraph" id="bkmrk-%E9%A1%BA%E4%BE%BF%E5%88%97%E4%B8%BE%E4%B8%80%E4%BA%9B%E8%B4%A8%E9%87%8F%E8%BE%83%E9%AB%98%E7%9A%84%E9%A1%B9%E7%9B%AE">顺便列举一些质量较高的项目</div>#### 基于 GNU gettext PO

<div class="paragraph" id="bkmrk-gnu-gettext-%E6%98%AF%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B9%BF%E6%B3%9B%E7%9A%84%E8%87%AA">GNU gettext 是使用最广泛的自由软件国际化工具之一，且在 Weblate 中有很好的支持。</div><div class="paragraph" id="bkmrk-%E8%BF%99%E4%B8%AA%E5%9C%A8%E7%94%A8%EF%BC%8C%E5%AD%90%E5%91%BD%E4%BB%A4%E6%AF%94%E8%BE%83%E5%A5%BD%E7%94%A8%EF%BC%8Cprompt-">这个在用，子命令比较好用，prompt 设置合理，支持自定义提示、词典、上下文</div><div class="paragraph" id="bkmrk-ryanhex53%2Fgpt-po%3A-co">[ryanhex53/gpt-po: command tool for translate po files by using openai api](https://github.com/ryanhex53/gpt-po)</div><div class="paragraph" id="bkmrk-%E8%BF%99%E4%B8%AA%E6%9C%89%E5%89%8D%E7%AB%AF%EF%BC%8C%E4%BB%8E-gpt-po-issue">这个有前端，从 gpt-po issue 里看到的</div><div class="paragraph" id="bkmrk-leolivier%2Fauto-po-ly">[leolivier/auto-po-lyglot: The goal of this project is to use various LLMs to help translate po files using a first already translated file to provide context for short pieces of text otherwise very ambiguous.](https://github.com/leolivier/auto-po-lyglot)</div><div class="paragraph" id="bkmrk-%E4%B8%80%E8%88%AC%EF%BC%8C%E4%B8%8D%E8%BF%87%E6%9C%89-pypi">一般，不过有 pypi</div><div class="paragraph" id="bkmrk-pescheckit%2Fpython-gp">[pescheckit/python-gpt-po: This tool, powered by OpenAI's GPT-4, offers a sophisticated approach to translating .po and .mo files, seamlessly integrating the capabilities of ChatGPT and GPT-3.5 models. It's designed for both bulk and individual file translations, providing a versatile solution for different translation needs.](https://github.com/pescheckit/python-gpt-po)</div>#### 基于 XLIFF

<div class="paragraph" id="bkmrk-xliff-%E6%98%AF%E5%9F%BA%E4%BA%8E-xml-%E7%9A%84%E6%A0%BC%E5%BC%8F%EF%BC%8C%E6%97%A8%E5%9C%A8">XLIFF 是基于 XML 的格式，旨在标准化翻译文件（但是版本间都不兼容，pypi 都没解析库），Crowdin、Transifex（付费） 主要用这个导出/入译文进行离线翻译，条目可带有额外的核准状态</div><div class="paragraph" id="bkmrk-%E5%BB%BA%E8%AE%AE%E8%BF%98%E6%98%AF%E8%BD%AC%E6%8D%A2%E5%88%B0-po-files-%E7%BF%BB%E8%AF%91%E5%90%8E">建议还是转换到 PO Files 翻译后再转回去</div>#### 基于 JSON

<div class="paragraph" id="bkmrk-%E8%BF%99%E4%B8%AA%E9%9C%80%E6%B1%82%E6%AF%94%E8%BE%83%E7%89%B9%E6%AE%8A%EF%BC%8C%E4%B8%80%E8%88%AC%E7%94%A8%E4%BA%8E-js-%E7%9B%B8%E5%85%B3%E9%A1%B9">这个需求比较特殊，一般用于 JS 相关项目</div><div class="paragraph" id="bkmrk-mololab%2Fjson-transla">[mololab/json-translator: jsontt 💡 - AI JSON Translator with GPT + other FREE translation modules to translate your json/yaml files into other languages ✅ Check Readme ✌ Supports GPT / DeepL / Google / Bing / Libre / Argos](https://github.com/mololab/json-translator)</div>### 初翻后人工校对

<div class="paragraph" id="bkmrk-%E6%9C%89%E4%BA%9B%E8%A6%81%E7%82%B9%E9%9C%80%E8%A6%81%E6%B3%A8%E6%84%8F%EF%BC%88ai-%E6%97%A0%E6%B3%95%E6%B3%A8%E6%84%8F%E5%88%B0%E7%9A%84%E7%BF%BB%E8%AF%91">有些要点需要注意（AI 无法注意到的翻译规范细节）：</div>- 同一个术语是否翻译的一致（可能会丢失上下文）
- 人称代词、单复数、易错译词（如账号）
- 是否遵循翻译规范（可使用 autocorrect 快速修正）
- 是否丢失空格、换行符、拆行等 AI 无法注意到的细节

# 翻译细节

一些规范的问题

# 格式问题

有关翻译模版/产物文件的种类，具体可以查询[Weblate的文档](https://docs.weblate.org/en/latest/formats.html)，其中提供了对比表格与各个文件类型的详情。

有时候如果想翻译一个新项目，但是项目提供与支持的翻译模版文件不是你所熟悉/常用的类型，最简单的办法当然是转换为你熟悉的类型，下面这些工具具有转化类型的功能：

- [Translate Toolkit](https://toolkit.translatehouse.org/) 支持转换的类型：[Converters](http://docs.translatehouse.org/projects/translate-toolkit/en/latest/commands/index.html)
- [Qt-Linguist](https://github.com/thurask/Qt-Linguist) 其中的 lconvert 支持转换的类型：Qt .ts -&gt; \*

# 翻译规范

### 参考

#### KDE

[KDE 简体中文团队](https://community.kde.org/KDE_Localization/zh-cn)

[KDE 中文翻译指南](https://kde-china.org/tutorial.html)

#### freeCodeCamp

[翻译流程及规范](https://chinese.freecodecamp.org/forum/t/topic/120)

#### Ubuntu 社区

[Ubuntu 简体中文小组工作指南](http://wiki.ubuntu.org.cn/TranslatorsGuideline)

[自由软件中文化工作指南(L10N)](http://people.ubuntu.com/~happyaron/l10n/l10n-guide-zh-cn.pdf)

#### Fedora 社区

[中文本地化指导](https://fedoraproject.org/wiki/%E4%B8%AD%E6%96%87%E6%9C%AC%E5%9C%B0%E5%8C%96%E6%8C%87%E5%AF%BC)

[L10N/Guide](https://fedoraproject.org/wiki/L10N/Guide)

#### 中文文案排版指北（推荐）

[仓库](https://github.com/sparanoid/chinese-copywriting-guidelines)

[自动校正工具](https://github.com/sparanoid/chinese-copywriting-guidelines#%E5%B7%A5%E5%85%B7)

#### 掘金

[译文排版规则指北](https://github.com/xitu/gold-miner/wiki/%E8%AF%91%E6%96%87%E6%8E%92%E7%89%88%E8%A7%84%E5%88%99%E6%8C%87%E5%8C%97)

### 工具

#### [Autocorrect](https://wiki.qunn.eu/link/17#bkmrk-autocorrect)