2010-01-05 118 views
35

當前在項目中使用Gettext並且.po文件在版本控制下很好地保持 。版本控制下的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文件差異的人。 建議?

+0

您也可以嘗試將該更改分成2個更改:一個更新元數據,一個更新元數據翻譯。然後,您可以忽略元數據更改。 – 2010-07-09 21:30:38

回答

25

一個簡單的修復方法是應用grep過濾器從所查看的diff中刪除註釋元數據。你可以做到這一點的版本控制diff工具的輸出

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

,或者您可能能夠指示版本控制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的差異應該那麼不包括任何以#:開頭的行。

請注意,使用此方法從git diff生成的差異不應用於修補 - 但git format-patch仍將使用默認差異,因此爲電子郵件生成的修補程序仍然可以。

+0

看來,我的git不支持--ignore-matching-lines選項。使用版本1.6.5.2 – 2010-01-07 15:20:21

+0

但用grep過濾差異確實會產生更多更乾淨的輸出。我怎麼沒有想到我自己呢?當然,當我通過控制檯界面以外的東西來查看差異時,這並沒有幫助,但它確實解決了大部分問題。 – 2010-01-07 15:28:44

+0

好吧,我採取了一個刺的方法,它基於事實,我希望在過去的許多事情會發揮作用!然而,git diff非常靈活,可以做到這一點。 – 2010-01-07 15:36:50

7

GNU gettext包有許多有用的實用程序來執行PO文件的各種任務。有msgcmp比較兩個PO文件,msgcomm選擇公共/唯一的消息,msgattrib選擇/過濾/轉換現有的PO文件。取決於您實際需要的PO文件差異,我認爲您需要使用msgattrib或msgcomm。

如果您只需要比較兩個沒有關於文件/行註釋的PO文件,那麼使用簡單的腳本來grep並保存在臨時目錄中就可以完成舊的和新的PO文件。

7

你可以看看由custom diff a .gitattribute file提供,如指定爲po文件一個特殊的差異

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

mypodiff腳本中調用任何diff工具能夠過濾掉你娃Wnt信號

線的不同選擇
+0

謝謝,設法得到這個工作。有點棘手的部分是獲取正確的外部diff命令的參數順序。 – 2010-01-08 11:21:19

+0

順便說一句,有沒有辦法讓'gxt-show'和'git-log'(可能還有其他的)運行命令時總是選擇'--ext-diff'。在使用'git-diff'時,外部diff命令應用於.po文件,但我很少使用該命令,對於其他我需要添加'--ext-diff'選項的命令。 – 2010-01-08 11:26:33

+0

我會說:'git alias'可以幫助你。通過定義別名,可以將相關選項添加到這些命令中。 – VonC 2010-01-08 11:28:29

19

gitattributes/textconv方法是正確的選擇。我想提供一個更好的解決方案,用於執行預處理的工具。

.gitattributes

*.po diff=po 

.gitconfig

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

msgcat從gettext包是有一個有用的工具。它有許多可供選擇的選項。選項--no-location尤其是您想要過濾行號差異的選項。如果xgettext和/或msgmerge和/或您的編輯器以煩人的方式重新格式化字符串,其他選項可能會有用。 (在這種情況下,將相同的選項傳遞給這些工具並重新配置編輯器也是一件好事。)

+2

請注意,與'.gitattributes'和'.gitignore'不同,源樹中的'.gitconfig' *不會被Git解析。您必須使用'〜/ .gitconfig'或'.git/config'。 – ulidtko 2013-09-22 20:46:13