37

目前在项目上使用 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 文件差异的人。建议?

4

4 回答 4

27

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

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

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

我不知道您使用什么版本控制系统,但 git(例如)允许您预处理 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 diff 不应包含任何以#:.

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

于 2010-01-07T15:04:06.257 回答
24

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

.gitattributes

*.po    diff=po

.gitconfig

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

msgcatgettext 包中的一个有用的工具。它有许多可供您使用的选项。该选项--no-location尤其是您要过滤掉行号差异的选项。xgettext如果和/或msgmerge和/或您的编辑器不断以令人讨厌的方式重新格式化字符串,其他选项可能会很有用。(在这种情况下,最好将这些相同的选项传递给这些工具,然后重新配置您的编辑器。)

于 2012-07-02T09:27:33.160 回答
7

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

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

于 2010-01-07T16:56:37.337 回答
7

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

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

使用mypodiff脚本调用任何diff能够过滤掉您想要的行的工具

于 2010-01-08T07:21:15.287 回答