在版本控制下的Gettext .po文件

目前在项目中使用Gettext和.po文件很好地保持在版本控制下。

PO文件当然包含翻译,但除此之外,它们还包含一些元数据 – 有关可翻译string所在的确切文件和行号的信息。

问题是,每次更新PO文件时,元数据的改变都比实际的翻译更多。 这使得以后从版本控制差异中看到真正的变化是很难的 – 你只能看到文件名和行号的无数变化。 像那样:

- #: somefile.js:43 - #: somefile.js:45 - #: somefile.js:118 + #: somefile.js:203 + #: somefile.js:215 msgid "Translate me please" msgstr "Tõlgi mind palun" - #: somefile.js:23 - #: somefile.js:135 + #: otherfile.js:23 + #: otherfile.js:135 msgid "Note" msgstr "Märkus" - #: andThatFile.js:18 #: orThisFile.js:131 - msgid "Before I was like this" - msgstr "Selline olin ma enne" + msgid "I happen to be changed" + msgstr "Paistab, et mind muudeti" 

当然,一个简单的解决方法是在xgettext输出中禁用文件名/ linenumber注释的生成。 但是我真的觉得这些文件名在翻译的时候非常有用。

我当然不可能是唯一不喜欢他的PO文件差异的人。 build议?

一个简单的解决办法是应用grepfilter来从所查看的diff中删除注释元数据。 您可以对版本控制diff实用程序的输出执行此操作:

 myVersionControl diff REV1 REV2 filea | grep -v '^..#' 

或者您可能能够指示版本控制diff实用程序在进行比较之前忽略它们,这可能会导致更可靠和更漂亮的输出:

我不知道你使用的是什么版本控制系统,但是git(例如)允许你对input进行预处理,以区分和删除特定文件types的注释行 (感谢VonC),参见man gitattributes并search执行文本差异二进制文件 。 下面是一个保存为/usr/local/bin/strippocomments的示例脚本的主体:

 grep -v '^#:' $1 

然后,您可以通过将以下内容添加到存储库中的.git/info/attributes文件中,让git使用此脚本来预处理po文件:

 *.po diff=podiff 

和您的存储库中的.git/config文件:

 [diff "podiff"] textconv = /usr/local/bin/strippocomments 

使用git diff应该不包含任何以#:开头的行。

请注意,使用此方法从git diff生成的差异不应用于修补 – 但git format-patch仍将使用默认差异,因此为电子邮件生成的修补程序仍然可以。

gitattributes / textconv方法是正确的select。 我想提供一个更好的解决scheme,用于进行预处理的工具。

.gitattributes

 *.po diff=po 

.gitconfig

 [diff "po"] textconv=msgcat --no-location --no-wrap --sort-output 

从gettext包msgcat是一个有用的工具。 它有一些选项,你可以玩。 选项--no-location特别是你想要过滤行号差异。 如果xgettext和/或msgmerge和/或您的编辑器以烦人的方式重新格式化string,其他选项可能会有用。 (在这种情况下,将相同的选项传递给这些工具并重新configuration编辑器也是一件好事。)

GNU gettext包有许多有用的实用程序来执行PO文件的各种任务。 有msgcmp比较两个PO文件,msgcommselect通用/唯一的消息,msgattribselect/过滤/转换现有的PO文件。 取决于您实际需要从PO文件的差异,我认为你需要使用msgattrib或msgcomm。

如果你只需要比较两个PO文件而没有关于文件/行的评论,那么简单的脚本来grep和保存临时目录,你的新旧PO文件就足够了。

您可以查看自定义diff .gitattribute文件提供的不同选项,例如为po文件指定特殊的diff

 [diff "mypodiff"] command = mypodiff *.po diff=mypodiff 

mypodiff一个脚本调用任何diff工具能够过滤掉你wW的行