支持的版本:当前 (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

55.1. 给翻译人员 #

PostgreSQL 程序(服务器和客户端)可以用您喜欢的语言发出消息,前提是这些消息已被翻译。创建和维护翻译的消息集需要那些精通自己的语言并愿意为 PostgreSQL 贡献力量的人们的帮助。您不必是程序员就可以做到这一点。本节解释如何提供帮助。

55.1.1. 要求 #

我们不会评判您的语言技能——本节是关于软件工具的。理论上,您只需要一个文本编辑器。但这只是在您不想尝试翻译后的消息的不太可能的情况下。配置源代码树时,请务必使用 --enable-nls 选项。这还将检查 libintl 库和 msgfmt 程序,所有最终用户无论如何都需要它们。要尝试您的工作,请按照安装说明的适用部分进行操作。

如果您想启动新的翻译工作或想要进行消息目录合并(稍后描述),您将分别需要程序 xgettextmsgmerge,它们是 GNU 兼容的实现。稍后,我们将尝试安排,以便如果您使用打包的源代码发行版,您将不需要 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。然后,翻译人员可以验证这一点,并可能删除 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 指令后引号之间的区域,添加注释并更改 fuzzy 标志。

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

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

  • 请确保如果原文以换行符结尾,翻译也以换行符结尾。制表符等也类似。

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

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

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

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

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

  • 如果您不知道消息的含义,或者消息含义不明确,请在开发人员的邮件列表中提问。英语为母语的最终用户可能也不理解它或觉得它不明确,因此最好改进消息。

提交更正

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