目前在项目上使用 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 文件差异的人。 有什么建议吗?
最佳答案
一个简单的修复方法是应用 grep 过滤器从查看的差异中删除注释元数据。您可以对版本控制差异实用程序的输出执行此操作:
myVersionControl diff REV1 REV2 filea | grep -v '^..#'
或者您可以指示版本控制差异实用程序在进行比较之前忽略这些,这可能会导致更可靠和更漂亮的输出:
我不知道您使用的是什么版本控制系统,但是 git(例如)允许您预处理 diff 的输入并删除某些文件类型的注释行(感谢 VonC),查看 man gitattributes
并搜索 Performing text diffs of binary files。下面是保存为 /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
仍将使用默认差异,因此会生成补丁用于电子邮件仍然可以。
关于git - 版本控制下的 Gettext .po 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006351/