Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

55.1. 致翻译者 #

55.1.1. 要求
55.1.2. 概念
55.1.3. 创建并维护消息目录
55.1.4. 编辑 PO 文件

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"

...

msgil 行从程序源中提取。(它们无需进行提取,但这最常见。)msgid 行最初为空,由翻译者用有用的字符串填充。字符串可以包含 C 风格的转义字符,并可以跨行延续,如图所示。(下一行必须从行首开始。)

#字符引入注释。如果空白紧跟 #字符,则此注释由翻译者维护。还可以有自动注释,它紧随 #后有一个非空白字符。这些是由对 PO 文件进行操作的各种工具维护的,旨在帮助翻译者。

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

#. 样式的注释从使用消息的源文件中提取。程序员可能会为翻译者插入信息,例如有关预期对齐方式的信息。#:注释指示消息在源中使用的确切位置。翻译者不必查看程序源,但如果有关于正确翻译的疑问,可以查看。#,注释包含以某种方式描述消息的标记。目前有两种标记:如果由于程序源中的更改,消息可能已过时,则设置 模糊。然后,翻译者可以对此进行验证,并可能删除模糊标记。注意,模糊消息不会提供给最终用户。另一个标记是 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 文件中使用注释标记这个字符串。

  • 保持原文的风格和语调。特别是,不是句子(无法打开文件 %s)的消息可能不应该以大写字母开头(如果你的语言区分字母大小写)或以句点结尾(如果你的语言使用标点符号)。阅读 第 54.3 节 可能会对你有所帮助。

  • 如果你不知道某个消息是什么意思,或者它含糊不清,请在开发人员邮件列表中提问。英语母语的最终用户也很有可能不理解或发现它含糊不清,因此最好改进这个消息。