如何正确使用 git 的 gettext?

How to use correctly gettext with git?

我开发并分发了一个小应用程序;现在我想用 gettext 添加 i18n 支持。我看到 gettext 需要 运行 几个命令并生成各种文件(并在源代码中包含新字符串时更新它们)。

让 gettext 与典型的 git 工作流程交互的常用方法是什么?我应该自己生成 .pot 文件并将其包含在存储库中,还是应该在构建时由我的 Makefile 自动生成? .mo 个文件呢?同样,我是否需要在我的构建脚本中包含 msgmerge,或者我只是将其结果添加到版本控制文件中?

我正在使用 C++、一个手写的 Makefile(没有 automake)和 github,以防万一。

我不确定这是否适合 SO。

然而,答案是"it's up to you"。项目是双向的,每种方式都有利有弊。这在很大程度上取决于 (a) 你有多少贡献者,以及 (b) 你想让其他人能够直接从你的 Git 存储库构建的容易程度。

如果您签入派生文件,则其他人无需在其系统上安装任何这些额外工具即可构建软件(但是,请参阅下面的警告)。但是,如果您有多个贡献者,并且他们的工具版本不尽相同,您可能会遇到虚假的文件更改,因为这些派生文件在重新生成时略有不同,然后提交。

如果您不签入派生文件,那么您的存储库会更干净,抽象地说,更多 "correct"(就像您不希望人们签入编译期间生成的目标文件一样).然而,任何想要构建代码的人都需要自己安装一套工具。在 GNU/Linux 系统上,这是非常微不足道的,但在其他一些系统上却并非如此。通常做出此选择的人会提供一个 shell 脚本,该脚本将 "prep" 源目录。

第一种方法的一个注意事项:即使您签入所有派生文件,您也可能需要编写 运行 某种 "prep" 脚本,假设您正在使用 make 并编写makefiles 让你的 gettext 文件保持最新:Git 不保留时间戳,所以如果你想避免在克隆或检出后重建派生文件,你需要 运行 一点脚本将 touch 文件以正确的顺序确保 make 知道它们是最新的。

FWIW,我个人从不将任何派生文件签入我的存储库。我承认这会让一些用户的生活变得困难,但我认为这是正确的做事方式。

这里涉及到三种类型的文件,全部生成,至少是一种。

  1. 包含主消息目录的 .pot PO 模板文件。这在我知道的每个项目中都处于版本控制之下,尽管它是严格口头生成的并且是多余的。

  2. 带有单独翻译的 .po 文件。它们有时会生成,有时不会。当您使用 msgmerge 合并新字符串时,它们会生成。但是,当您的译员发回新译文时,他们却不是。您必须将它们置于版本控制之下,因为它们包含翻译。

  3. .po 文件编译成的 .mo 文件。不要将它们置于版本控制之下,而是将它们与版本(源代码和二进制文件)一起发布。

更重要的是 Makefile 中的逻辑。 None 上述文件应自动生成,但只能按需生成。否则,每当您编辑源文件时,您的 po/ 目录就会变脏。

恕我直言,最好的做法是确保在没有安装 gettext 工具(xgettext、msgmerge、msgfmt)的情况下可以构建 git 克隆。确保它们仅按需调用。

gettext libint-perl 的 Perl 绑定(免责声明:我是作者)包含一个示例 po 目录和一个完整的 Makefile:https://github.com/gflohr/libintl-perl/tree/master/sample/simplecal/po。您可以直接在您的项目中使用该 Makefile。您只需为您选择的编程语言修改 xgettext 调用。