2010-01-05 100 views
35

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

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

问题是,每次更新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输出 文件名/行号意见产生。但我实际上发现这些文件名在翻译时非常有用。

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

+0

您也可以尝试将该更改分成2个更改:一个更新元数据,一个更新元数据翻译。然后,您可以忽略元数据更改。 – 2010-07-09 21:30:38

回答

25

一个简单的修复方法是应用grep过滤器从所查看的diff中删除注释元数据。你可以做到这一点的版本控制diff工具的输出

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

,或者您可能能够指示版本控制diff工具忽略这些它使比较,这将可能导致之前更可靠和更漂亮输出:

我不知道你用的什么版本控制系统,但混帐(例如)允许您来预处理输入差异比较和删除某些文件类型的注释行(感谢VonC),请参阅man gitattributes并搜索执行二进制文件的文本差异。下面是一个示例脚本主体保存为/usr/local/bin/strippocomments这将做到这一点:

grep -v '^#:' $1 

然后你可以告诉git的使用这个脚本来预处理po文件,通过将以下的文件.git/info/attributes在你的资料库:

*.po diff=podiff 

,并在你的资料库文件.git/config

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

使用git的差异应该那么不包括任何以#:开头的行。

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

+0

看来,我的git不支持--ignore-matching-lines选项。使用版本1.6.5.2 – 2010-01-07 15:20:21

+0

但用grep过滤差异确实会产生更多更干净的输出。我怎么没有想到我自己呢?当然,当我通过控制台界面以外的东西来查看差异时,这并没有帮助,但它确实解决了大部分问题。 – 2010-01-07 15:28:44

+0

好吧,我采取了一个刺的方法,它基于事实,我希望在过去的许多事情会发挥作用!然而,git diff非常灵活,可以做到这一点。 – 2010-01-07 15:36:50

7

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

如果您只需要比较两个没有关于文件/行注释的PO文件,那么使用简单的脚本来grep并保存在临时目录中就可以完成旧的和新的PO文件。

7

你可以看看由custom diff a .gitattribute file提供,如指定为po文件一个特殊的差异

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

mypodiff脚本中调用任何diff工具能够过滤掉你娃Wnt信号

线的不同选择
+0

谢谢,设法得到这个工作。有点棘手的部分是获取正确的外部diff命令的参数顺序。 – 2010-01-08 11:21:19

+0

顺便说一句,有没有办法让'gxt-show'和'git-log'(可能还有其他的)运行命令时总是选择'--ext-diff'。在使用'git-diff'时,外部diff命令应用于.po文件,但我很少使用该命令,对于其他我需要添加'--ext-diff'选项的命令。 – 2010-01-08 11:26:33

+0

我会说:'git alias'可以帮助你。通过定义别名,可以将相关选项添加到这些命令中。 – VonC 2010-01-08 11:28:29

19

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

.gitattributes

*.po diff=po 

.gitconfig

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

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

+2

请注意,与'.gitattributes'和'.gitignore'不同,源树中的'.gitconfig' *不会被Git解析。您必须使用'〜/ .gitconfig'或'.git/config'。 – ulidtko 2013-09-22 20:46:13