2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

56.1. 致翻译人员 #

PostgreSQL 程序(服务器和客户端)可以使用您喜欢的语言显示消息 — 前提是这些消息已经被翻译。创建和维护翻译过的消息集需要那些精通自己的语言并希望为 PostgreSQL 项目做出贡献的人的帮助。您完全不必成为程序员也能做到这一点。本节将解释如何提供帮助。

56.1.1. 要求 #

我们不会评判您的语言技能 — 本节是关于软件工具的。理论上,您只需要一个文本编辑器。但这仅仅是在您不想尝试翻译过的消息的罕见情况下。配置源代码树时,请确保使用 --enable-nls 选项。这还会检查 libintl 库和 msgfmt 程序,所有最终用户都需要它们。要测试您的工作,请遵循安装说明中适用的部分。

如果您想开始一项新的翻译工作,或者想进行消息目录合并(稍后会描述),您将分别需要 xgettextmsgmerge 程序,以及 GNU 兼容的实现。稍后,我们将尽量安排,以便您使用打包好的源代码分发版时,将不需要 xgettext。(如果从 Git 工作,您仍然需要它。)目前推荐使用 GNU Gettext 0.10.36 或更高版本。

您本地的 gettext 实现应该附带自己的文档。其中一些可能会在下面的内容中重复,但要了解更多细节,您应该查阅那里。

56.1.2. 概念 #

原始(英文)消息及其(可能)翻译的等价物的配对保存在 消息目录 中,每个程序(尽管相关程序可以共享一个消息目录)和每种目标语言都有一个。消息目录有两种文件格式:第一种是 PO 文件(Portable Object 的缩写),它是一个具有特殊语法的纯文本文件,翻译人员会编辑它。第二种是 MO 文件(Machine Object 的缩写),它是一个从相应的 PO 文件生成的二进制文件,并在国际化程序运行时使用。翻译人员不处理 MO 文件;事实上几乎没有人处理。

消息目录文件的扩展名不出所料地是 .po.mo。基础名称要么是附带它的程序的名称,要么是文件所属的语言,具体取决于情况。这有点令人困惑。例如 psql.po(psql 的 PO 文件)或 fr.mo(法语的 MO 文件)。

PO 文件的文件格式在此处说明

# comment

msgid "original string"
msgstr "translated string"

msgid "more original"
msgstr "another translated"
"string can be broken up like this"

...

msgid 行从程序源代码中提取。(不一定如此,但这是最常见的方式。)msgstr 行最初为空,由翻译人员填入有用的字符串。字符串可以包含 C 风格的转义字符,并且可以像此处所示那样跨越多行。(下一行必须从行首开始。)

# 字符表示注释。如果 # 字符后面紧跟着空格,那么这是翻译人员维护的注释。也可能存在自动注释,其 # 字符后面紧跟着非空格字符。这些由各种处理 PO 文件的工具维护,旨在帮助翻译人员。

#. automatic comment
#: filename.c:1023
#, flags, flags

#. 风格的注释是从消息使用的源文件中提取的。程序员可能为翻译人员插入了信息,例如关于预期的对齐。#: 注释指示了消息在源代码中使用的确切位置。翻译人员不必查看程序源代码,但如有关于正确翻译的疑问,则可以查看。#, 注释包含描述消息的标志。目前有两个标志:fuzzy(模糊)如果在程序源代码更改后消息可能已过时,则设置为此标志。然后翻译人员可以验证它并可能删除模糊标志。请注意,模糊消息不会提供给最终用户。另一个标志是 c-format,它表示消息是一个 printf 风格的格式模板。这意味着翻译也应该是一个具有相同数量和类型占位符的格式字符串。有一些工具可以验证这一点,它们依赖于 c-format 标志。

56.1.3. 创建和维护消息目录 #

好的,那么如何创建一个 空白 的消息目录呢?首先,进入包含您想翻译的消息的程序的目录。如果存在 nls.mk 文件,则说明该程序已为翻译做好准备。

如果已经有一些 .po 文件,那么已经有人进行了一些翻译工作。文件名是 language.po,其中 languageISO 639-1 两字母语言代码(小写),例如 fr.po 表示法语。如果确实需要每种语言有多个翻译工作,那么文件名也可以是 language_region.po,其中 regionISO 3166-1 两字母国家代码(大写),例如 pt_BR.po 表示巴西的葡萄牙语。如果您找到了想要的语言,就可以开始处理该文件了。

如果您需要开始一项新的翻译工作,请先运行命令

make init-po

这将创建一个名为 progname.pot 的文件。(.pot 是为了区别于 生产中 的 PO 文件。T 代表 模板。)将此文件复制到 language.po 并编辑它。为了让新语言为人所知,还要编辑 po/LINGUAS 文件,并在已列出的语言旁边添加语言(或语言和国家)代码,例如:

de fr

(当然,可以出现其他语言。)

随着底层程序或库的更改,程序员可能会更改或添加消息。在这种情况下,您无需从头开始。而是运行命令

make update-po

这将创建一个新的空白消息目录文件(您开始使用的 pot 文件),并将其与现有的 PO 文件合并。如果合并算法不确定某个特定消息,它会将其标记为 fuzzy(模糊),如上所述。新的 PO 文件将以 .po.new 扩展名保存。

56.1.4. 编辑 PO 文件 #

PO 文件可以使用常规文本编辑器进行编辑。也有一些专门的 PO 文件编辑器,它们可以通过特定于翻译的功能来帮助这个过程。Emacs 有一个(不出所料的)PO 模式,它可能非常有用。

翻译人员只能更改 msgstr 指令后面的引号之间的区域,添加注释,并修改 fuzzy 标志。

PO 文件不需要完全填写。如果没有可用翻译(或翻译为空),软件将自动回退到原始字符串。提交不完整的翻译以包含在源代码树中没有问题;这为其他人捡起您的工作留下了空间。但是,我们鼓励您在进行合并后优先删除模糊条目。请记住,模糊条目不会被安装;它们只作为可能正确翻译的参考。

以下是一些在编辑翻译时需要注意的事项

  • 确保如果原始字符串以换行符结尾,则翻译字符串也以换行符结尾。同样,制表符等也是如此。

  • 如果原始字符串是 printf 格式字符串,翻译也必须是。翻译还必须具有相同数量和顺序的格式说明符。有时语言的自然规则会使这不可能或至少很尴尬。在这种情况下,您可以修改格式说明符,如下所示:

    msgstr "Die Datei %2$s hat %1$u Zeichen."
    

    然后,第一个占位符将实际使用列表中的第二个参数。digits$ 需要紧跟在 % 之后,在任何其他格式修饰符之前。(此功能实际上存在于 printf 系列函数中。您可能以前没听说过它,因为它除了消息国际化之外几乎没有其他用途。)

  • 如果原始字符串包含语言上的错误,请报告它(或在程序源代码中自己修复),然后正常翻译。当程序源代码更新后,可以合并更正后的字符串。如果原始字符串包含事实错误,请报告它(或自己修复),并且不要翻译它。相反,您可以在 PO 文件中用注释标记该字符串。

  • 保持原始字符串的风格和语调。特别是,不是句子的消息(cannot open file %s)可能不应该以大写字母开头(如果您的语言区分大小写)或以句点结尾(如果您的语言使用标点符号)。阅读 第 55.3 节 可能会有所帮助。

  • 如果您不知道消息的含义,或者消息含糊不清,请在开发人员邮件列表中询问。很可能讲英语的最终用户也可能不理解它或觉得它含糊不清,所以最好改进该消息。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表单 报告文档问题。