【问题标题】:Gettext .po files under version control版本控制下的 Gettext .po 文件
【发布时间】:2010-01-05 13:46:01
【问题描述】:

目前在项目中使用 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 输出中的文件名/行号 cmets。但我实际上发现 这些文件名在翻译时非常有用。

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

【问题讨论】:

  • 您也可以尝试将该更改拆分为 2 个更改:一个更新元数据,另一个更新翻译。然后您可以忽略元数据更改。

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


【解决方案1】:

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

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

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

我不知道您使用什么版本控制系统,但是 git(例如)允许您预处理输入以区分 并删除某些文件类型的注释行(感谢 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 仍将使用默认差异,因此为电子邮件生成的补丁仍然可以。

【讨论】:

  • 看来我的 git 不支持 --ignore-matching-lines 选项。使用版本 1.6.5.2
  • 但是使用 grep 过滤差异确实会产生更清晰的输出。我自己怎么没有想到呢?当然,当我通过控制台界面以外的其他方式查看差异时,这无济于事,但它确实解决了大部分问题。
  • 好的,我相信它会起作用,因为我希望过去能起作用的很多东西实际上都起作用了!但是,git diff 非常灵活,可能可以做到。
  • 我想指出,正则表达式应该是 '^#:' 而不仅仅是 '^#',因为还有其他形式如 '#,fuzzy' 你需要实际查看。
  • 感谢使用 textconv 的提示 - 这比使用 command = mypodiff 好得多。
【解决方案2】:

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

.gitattributes:

*.po    diff=po

.gitconfig:

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

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

【讨论】:

  • 请注意,与.gitattributes.gitignore 不同,源代码树中的.gitconfig 不会被 Git 解析。您必须使用~/.gitconfig.git/config
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 谢谢,设法让这个工作。有点棘手的部分是让外部 diff 命令的参数顺序正确。
    • 顺便说一句,在运行命令 git-showgit-log(可能还有其他命令)时,有没有办法让选项 --ext-diff 始终打开。使用git-diff时,外部diff命令适用于.po文件,但我很少使用该命令,对于其他我需要添加--ext-diff选项。
    • 我想说:git alias 可以帮助你。通过定义别名,您可以为这些命令添加相关选项。
    • 感谢您的提示,帮助我修复了我的提交。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2012-04-26
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多