如何使用git正确使用gettext?

时间:2018-06-02 15:52:33

标签: git makefile internationalization gettext

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

让gettext与典型的git工作流交互的常用方法是什么?我应该自己生成import random n = 25 #size of sample elements = set(["GK", "A", "M", "D"]) random_pop = [element for i in xrange(n) for element in random.sample(elements, 1)] >>>random_pop #example run ['M', 'D', 'M', 'M', 'D', 'A', 'M', 'A', 'M', 'GK', 'GK', 'D', 'GK', 'A', 'M', 'D', 'A', 'A', 'GK', 'M', 'D', 'M', 'A', 'GK', 'GK'] 文件并将其包含在存储库中,还是应该在构建时由我的Makefile自动生成?那么.pot个文件怎么样?同样,我是否需要在构建脚本中包含.mo,还是只将其结果添加到版本控制的文件中?

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

2 个答案:

答案 0 :(得分:1)

我不确定这是一个非常正确的问题。

然而,答案是"它取决于你"。项目是双向的,各有利弊。其中很大程度上取决于(a)您拥有多少贡献者,以及(b)您希望其他人能够直接从您的Git存储库构建它是多么容易。

如果您签入派生文件,那么其他人不需要在他们的系统上安装任何这些额外工具来构建软件(但请参阅下面的警告)。但是,如果您有多个贡献者并且他们都没有相同版本的工具,那么您可以获得更改的虚假文件更改,因为这些派生文件会在重新生成时稍有差异然后提交。

如果您没有检查衍生文件,那么您的存储库会更清晰,更抽象,更正确,更正#34; (就像你不希望人们检查编译期间生成的目标文件一样)。但是,任何想要构建代码的人都需要自己安装一套工具。在GNU / Linux系统上,这非常简单,但在其他一些系统上却不是这样。通常,做出这个选择的人提供了一个shell脚本,它将准备好#34;源目录。

使用第一种方法的一个警告:即使你签入了所有衍生文件,你可能还需要编写并运行某种" prep"脚本,假设你正在使用make和write makefile来保持你的gettext文件是最新的:Git没有保留时间戳,所以如果你想在克隆或签出之后避免重建派生文件,你需要运行一个小脚本,以touch个文件的正确顺序,以确保make知道他们是最新的。

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

答案 1 :(得分:1)

这里涉及三种类型的文件,并且它们都是生成的,至少是一种。

  1. 包含主邮件目录的.pot PO模板文件。尽管严格说来,这是我所知道的每个项目的版本控制,但是它是冗余的。

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

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

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

恕我直言,最佳实践是确保无需安装gettext工具(xgettext,msgmerge,msgfmt)就可以构建git克隆。确保仅按需调用它们。

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