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

55.1. 面向翻译人员 #

PostgreSQL 程序(服务器和客户端)可以以您喜欢的语言发出其消息——如果这些消息已被翻译。创建和维护翻译后的消息集需要那些精通自己语言并愿意为 PostgreSQL 项目做出贡献的人的帮助。您完全不需要成为程序员才能做到这一点。本节说明如何提供帮助。

55.1.1. 要求 #

我们不会评判您的语言技能——本节讲的是软件工具。理论上,您只需要一个文本编辑器。但这只是一种可能性,即您不想尝试自己翻译的消息的情况。当您配置源代码树时,请确保使用 --enable-nls 选项。这还将检查 libintl 库和 msgfmt 程序,所有最终用户都需要这些程序。要尝试您的工作,请按照安装说明中的相关部分操作。

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

您当地的 gettext 实现应该附带自己的文档。其中一部分可能与以下内容重复,但有关更多详细信息,您应该参考该文档。

55.1.2. 概念 #

原始(英语)消息及其(可能)翻译后的等效项对保存在 消息目录中,每个程序(虽然相关的程序可以共享一个消息目录)和每种目标语言都有一个。消息目录有两种文件格式:第一种是 PO 文件(代表可移植对象),它是一个包含翻译人员编辑的特殊语法的纯文本文件。第二种是 MO 文件(代表机器对象),它是由相应的 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 标志。

55.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 文件合并。如果合并算法对特定消息不确定,它会将其标记为 模糊,如上所述。新的 PO 文件将以 .po.new 扩展名保存。

55.1.4. 编辑 PO 文件 #

PO 文件可以使用常规文本编辑器进行编辑。还有一些专门用于 PO 文件的编辑器,可以帮助使用翻译特定功能完成此过程。不出意外的是,Emacs 有一个 PO 模式,它非常有用。

翻译人员只应更改 msgstr 指令后引号之间的区域,添加注释并更改模糊标志。

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

以下是一些编辑翻译时要牢记的事项

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

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

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

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

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

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

  • 如果您不理解某个消息的含义,或者该消息模棱两可,请在开发者邮件列表中询问。很可能说英语的最终用户也可能无法理解或发现它模棱两可,因此最好改进该消息。

提交更正

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