55.1. 对于翻译

PostgreSQL 程序(服务器和 Client 端)可以使用您喜欢的语言发布消息-如果消息已翻译。创建和维护翻译后的消息集需要那些会说自己的语言并希望为 PostgreSQL 做出贡献的人们的帮助。您完全不必成为程序员即可执行此操作。本节说明如何提供帮助。

55.1.1. Requirements

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

如果要开始新的翻译工作或要进行消息目录合并(稍后描述),则在与 GNU 兼容的实现中,您将分别需要程序xgettextmsgmerge。稍后,我们将尝试对其进行排列,这样,如果您使用打包的源发行版,则不需要xgettext。 (如果在 Git 上运行,则仍然需要它.)当前建议使用 GNU Gettext 0.10.36 或更高版本。

您本地的 gettext 实现应带有其自己的文档。其中的某些内容可能会在下面的内容中重复,但有关其他详细信息,请查看此处。

55.1.2. Concepts

成对的原始(英文)消息及其(可能)翻译的对等消息保存在消息目录中,每个程序一个(尽管相关程序可以共享消息目录)和每种目标语言。消息目录有两种文件格式:第一种是“ PO”文件(用于可移植对象),这是具有特殊语法的纯文本文件,翻译人员可以对其进行编辑。第二个是“ MO”文件(用于机器对象),它是从相应的 PO 文件生成的二进制文件,在运行国际化程序时使用。译者不处理 MO 文件。实际上几乎没有人这样做。

消息目录文件的 extensions.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 样式的转义字符,并且可以如图所示跨行 continue。 (下一行必须从该行的开头开始.)

#字符引起 Comments。如果空格紧跟在#字符之后,则这是翻译者维护的 Comments。也可以有自动 Comments,该 Comments 在#后面紧跟一个非空白字符。这些由操作 PO 文件的各种工具维护,旨在帮助翻译人员。

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

#。从使用消息的源文件中提取样式 Comments。程序员可能已经为翻译器插入了信息,例如有关预期对齐的信息。 #:Comments 指示消息中使用消息的确切位置。译者无需查看程序源,但如果对正确的翻译有疑问,则可以。 #Comments 包含以某种方式描述消息的标志。当前有两个标志:如果由于程序源的更改而导致消息可能已过时,则设置fuzzy。然后,翻译器可以对此进行验证,并可能删除模糊标志。请注意,模糊消息对最终用户不可用。另一个标志是c-format,表示该消息是printf样式格式的模板。这意味着转换也应该是具有相同数量和类型的占位符的格式字符串。有一些工具可以验证这一点,从而可以取消 c 格式标志。

55 .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使其与“Producing”的 PO 文件区分开.T代表“模板”.)将此文件复制到language.po并进行编辑。为了使新语言可用,还可以编辑文件nls.mk并将语言(或语言和国家/地区)代码添加到如下所示的行中:

AVAIL_LANGUAGES := de fr

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

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

make update-po

这将创建一个新的空白消息目录文件(您开始使用的 Pot 文件)并将其与现有的 PO 文件合并。如果合并算法不确定特定消息,则将其标记为“模糊”,如上所述。新的 PO 文件以.po.newextensions 保存。

55 .1.4. 编辑 PO 文件

可以使用常规文本编辑器来编辑 PO 文件。转换程序仅应在 msgstr 指令后更改引号之间的区域,添加 Comments 并更改模糊标志。 Emacs 有一个(不足为奇的)PO 模式,我发现它非常有用。

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

编辑翻译时,请注意以下几点:

  • 确保如果原始文件以换行符结尾,翻译也可以。选项卡等类似。

  • 如果原始字符串是printf格式的字符串,则也需要翻译。转换还需要具有相同 Sequences 的相同格式说明符。有时,语言的自然规则使这不可能或至少很尴尬。在这种情况下,您可以像这样修改格式说明符:

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

然后,第一个占位符将实际使用列表中的第二个参数。 digits$必须紧跟%之后,再使用其他格式操纵符。 (此功能确实存在于printf函数家族中.您可能以前从未听说过此功能,因为在消息国际化之外几乎没有使用它.)

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

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

  • 如果您不知道消息的含义,或者消息不明确,请在开发人员的邮件列表中询问。最终英语用户也可能不理解它或感到模棱两可,因此最好改善消息。