版本控制下的Gettext .po文件

时间:2010-01-05 13:46:02

标签: git version-control diff gettext po-file

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

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

问题是每次更新PO文件的元数据 比实际翻译更改了很多。这样做 真的很难以后从版本控制diff看到实际上是什么 改变了 - 你只看到文件名和行的无数变化 数字。像那样:

- #: 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输出中的filename / linenumber注释。但我实际上找到了 这些文件名在翻译时非常有用。

我肯定不会是唯一一个不喜欢他的PO文件差异的人。 建议?

4 个答案:

答案 0 :(得分:25)

一个简单的解决方法是应用grep过滤器从已查看的差异中删除评论元数据。您可以对版本控制差异实用程序的输出执行此操作:

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

或者您可以在进行比较之前指示版本控制差异实用程序忽略这些,这可能会产生更可靠和更漂亮的输出:

我不知道您使用的版本控制系统,但git(例如)允许您预处理diff 的输入并删除某些文件类型的注释行(感谢VonC),请参阅man gitattributes并搜索执行二进制文件的文本差异。这是保存为/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仍将使用默认差异,因此为电子邮件生成的补丁仍然可以。

答案 1 :(得分:20)

gitattributes / textconv方法是正确的方法。我想为进行预处理的工具提供更好的解决方案。

.gitattributes

*.po    diff=po

.gitconfig

[diff "po"]
    textconv=msgcat --no-location --no-wrap --sort-output
来自gettext包的

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

答案 2 :(得分:7)

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

如果你只需要比较两个PO文件而没有关于文件/行的注释,那么简单的脚本grep并保存在temp dir中你的新旧PO文件就足够了。

答案 3 :(得分:7)

您可以查看custom diff a .gitattribute file提供的不同选项,例如为po文件指定特殊差异

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

使用mypodiff脚本调用任何diff工具,可以过滤掉你想要的行