版本控制下的Gettext .po文件

Ren*_*soo 35 git version-control diff gettext po-file

目前在项目上使用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"
Run Code Online (Sandbox Code Playgroud)

当然,一个简单的解决方法是在xgettext输出中禁用filename/linenumber注释的生成.但实际上我发现这些文件名在翻译时非常有用.

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

Ale*_*own 25

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

myVersionControl diff REV1 REV2 filea | grep -v '^..#'
Run Code Online (Sandbox Code Playgroud)

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

我不知道你使用的版本控制系统,但git(例如)允许你预处理diff的输入并删除某些文件类型的注释行(感谢VonC),查看man gitattributes并搜索执行二进制文件的文本差异.这是要保存的示例脚本的主体/usr/local/bin/strippocomments,它将执行此操作:

grep -v '^#:' $1
Run Code Online (Sandbox Code Playgroud)

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

*.po diff=podiff
Run Code Online (Sandbox Code Playgroud)

以及.git/config存储库中的文件:

[diff "podiff"]
    textconv = /usr/local/bin/strippocomments
Run Code Online (Sandbox Code Playgroud)

然后使用git diff不应包含任何以#:.开头的行.

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

  • 我想要注意的是regexp应该是'^#:'而不仅仅是'^#',因为还有其他形式为'#,fuzzy',你需要实际看到它. (4认同)

Pet*_*aut 20

gitattributes/ textconv做法是正确的道路要走.我想提供一个更好的解决方案,用于进行预处理的工具.

.gitattributes:

*.po    diff=po
Run Code Online (Sandbox Code Playgroud)

.gitconfig:

[diff "po"]
    textconv=msgcat --no-location --no-wrap --sort-output
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,与.gitattributes`和`.gitignore`不同,源代码树*中的`.gitconfig`*不会被Git解析.你必须使用`〜/ .gitconfig`或`.git/config`. (2认同)

bia*_*lix 7

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

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


Von*_*onC 7

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

[diff "mypodiff"]
    command = mypodiff
*.po   diff=mypodiff
Run Code Online (Sandbox Code Playgroud)

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