57.1. 针对翻译人员#
PostgreSQL程序(服务器和客户端)可以以您喜欢的语言发出消息——如果这些消息已翻译。创建和维护翻译的消息集需要那些精通母语并希望为PostgreSQL贡献力量的人员的帮助。您完全不必成为一名程序员才能做到这一点。本节将说明如何提供帮助。
57.1.1. 要求#
我们不会评判您的语言技能——本节讨论的是软件工具。从理论上讲,您只需要一个文本编辑器。但这仅在您不想试用翻译的消息时才有可能。在配置源代码树时,务必使用--enable-nls
选项。这还将检查libintl库和msgfmt
程序,所有最终用户无论如何都需要它们。要试用您的工作,请按照安装说明中适用的部分进行操作。
如果您想启动新的翻译工作或想执行消息目录合并(稍后描述),您将分别需要 GNU 兼容实现中的程序xgettext
和msgmerge
。稍后,我们将设法安排好,以便如果您使用打包的源代码分发版,您将不需要xgettext
。(如果从 Git 工作,您仍然需要它。)当前建议使用GNU Gettext 0.10.36或更高版本。
您本地的 gettext 实现应附带其自己的文档。其中一些内容可能在以下内容中重复,但对于其他详细信息,您应该在那里查找。
57.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
。然后,翻译人员可以验证此消息并可能删除 fuzzy 标志。请注意,模糊消息不会提供给最终用户。另一个标志是c-format
,它表示消息是printf
样式的格式模板。这意味着翻译也应该是具有相同数量和类型占位符的格式字符串。有一些工具可以验证这一点,这些工具以 c-format 标志为关键。
57.1.3. 创建和维护消息目录#
好的,那么如何创建一个“空白”消息目录?首先,进入包含要翻译其消息的程序的目录。如果存在文件nls.mk
,则此程序已准备好进行翻译。
如果已经有一些.po
文件,则有人已经完成了一些翻译工作。这些文件被命名为*
language*.po
,其中*language
是ISO 639-1 双字母语言代码(小写),例如,法语为fr.po
。如果确实需要为每种语言进行多次翻译工作,则这些文件还可以命名为*
language*_*
region*.po
,其中region
*是ISO 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
扩展名。
57.1.4. 编辑 PO 文件#
可以使用常规文本编辑器编辑 PO 文件。还有几个专门用于 PO 文件的编辑器,它们可以通过特定于翻译的功能来帮助完成此过程。Emacs 中有一个(不出所料)PO 模式,这可能非常有用。
翻译人员只能更改 msgstr 指令后引号之间的区域,添加注释并更改模糊标记。
PO 文件不必完全填写。如果没有翻译(或翻译为空),软件将自动回退到原始字符串。将不完整的翻译提交到源代码树中是没有问题的;这为其他人提供了接手您工作的机会。但是,我们鼓励您在合并后优先删除模糊条目。请记住,模糊条目不会被安装;它们仅作为可能正确翻译的参考。
以下是编辑翻译时需要记住的一些事项
确保如果原件以换行符结尾,翻译也以换行符结尾。对于制表符等也是如此。
如果原件是
printf
格式字符串,翻译也需要如此。翻译还需要按相同顺序具有相同的格式说明符。有时语言的自然规则会让这变得不可能或至少很尴尬。在这种情况下,您可以像这样修改格式说明符msgstr "Die Datei %2$s hat %1$u Zeichen."
然后第一个占位符实际上将使用列表中的第二个参数。
需要紧跟 %,在任何其他格式操作符之前。(此功能确实存在于digits
$printf
函数系列中。您可能以前没有听说过它,因为除了消息国际化之外,它几乎没有用处。)如果原始字符串包含语言错误,请报告该错误(或在程序源代码中自行修复),然后正常翻译。当程序源代码更新后,可以合并更正后的字符串。如果原始字符串包含事实错误,请报告该错误(或自行修复),不要翻译它。相反,您可以在 PO 文件中使用注释标记该字符串。
保持原始字符串的风格和语调。具体来说,不是句子(
无法打开文件 %s
)的消息可能不应该以大写字母开头(如果您的语言区分大小写)或以句号结尾(如果您的语言使用标点符号)。阅读 第 56.3 节 可能会有所帮助。如果您不知道消息的含义,或者它模棱两可,请在开发人员邮件列表中询问。很有可能说英语的最终用户也可能不理解它或觉得它模棱两可,因此最好改进消息。