3

.po ファイルのメッセージをマージ/更新/削除する必要があり、メッセージ、複数形、場所、コンテキスト、コメントを含む .po ファイルを完全に解析できる Python パッケージが必要です。

ファイル間の違いをチェックする簡単なツールを作りたいです。また、いくつかの GUI は既に使用できますが、新しい翻訳を追加したり、使用されていない翻訳を削除したりするツールがあるかどうかはわかりません。

いくつかの記事を検索しましたが、その方法が見つかりませんでした。適切な翻訳を維持するために、.po を完全に解析する Python パッケージ (他の言語も可能) またはツールを推奨してください。

4

3 に答える 3

2

.poファイルを読み取るのに派手なツールは必要ありません。これらは、基本的にメッセージ/翻訳のペアを含むプレーン テキスト ファイルです。

#: buttons.c:425
msgid "Extra"
msgstr "Thêm"

#: buttons.c:433
msgid "Help"
msgstr "Trợ giúp"

それらを比較するための簡単なツールとして、 を使用することをお勧めしdiff -uます。

.mo拡張子付きのバイナリ形式があります。gettext-tools パッケージのプログラムを使用してmsgunfmt、プレーン テキストに戻すことができます。

.poファイルから id/translation ペアを抽出することは難しくありません:

In [1]: po = '''#: buttons.c:425
   ...: msgid "Extra"
   ...: msgstr "Thêm"
   ...: 
   ...: #: buttons.c:433
   ...: msgid "Help"
   ...: msgstr "Trợ giúp"
   ...: 
   ...: '''

In [2]: import re

In [3]: re.findall('^msgid \"(.*)\"', po, re.MULTILINE)
Out[3]: ['Extra', 'Help']

In [4]: re.findall('^msgstr \"(.*)\"', po, re.MULTILINE)
Out[4]: ['Th\xc3\xaam', 'Tr\xe1\xbb\xa3 gi\xc3\xbap']

In [5]: zip(re.findall('^msgid \"(.*)\"[^\"]*', po, re.MULTILINE), re.findall('^msgstr \"(.*)\"[^\"]*', po, re.MULTILINE))
Out[5]: [('Extra', 'Th\xc3\xaam'), ('Help', 'Tr\xe1\xbb\xa3 gi\xc3\xbap')]

^とを使用して、re.MULTILINEコメントアウトされたメッセージがここに表示されないようにしています。健全性チェックとして、メッセージ ID とメッセージ文字列を含むリストが同じ長さであることを確認してください。

編集:ランダムな順序付けと使用に関して有効なポイントがありますdiff。しかし、上記のコードを使用して、古いファイルと新しいファイルの両方の (メッセージ ID、翻訳) タプルのリストを作成でき.poます。difflib.unified_diffこれらのリストを message-id でソートすると、違いを印刷するために使用できます。

例えば:

In [1]: import re, itertools, difflib

#I've used cpaste to input two pieces of a .po file, the latter with some changes

In [4]: orig_po
Out[4]: '#: mixedgauge.c:64\nmsgid "Passed"\nmsgstr "\xc4\x90\xe1\xbb\x97"\n\n#: mixedgauge.c:67\nmsgid "Completed"\nmsgstr "Ho\xc3\xa0n to\xc3\xa0n"\n\n#: mixedgauge.c:70\nmsgid "Checked"\nmsgstr "\xc4\x90\xc3\xa3 ki\xe1\xbb\x83m tra"\n\n#: mixedgauge.c:73\nmsgid "Done"\nmsgstr "Ho\xc3\xa0n t\xe1\xba\xa5t"\n\n#: mixedgauge.c:76\nmsgid "Skipped"\nmsgstr "B\xe1\xbb\x8b b\xe1\xbb\x8f qua"\n\n#: mixedgauge.c:79\nmsgid "In Progress"\nmsgstr "\xc4\x90ang ch\xe1\xba\xa1y"\n\n#: mixedgauge.c:85\nmsgid "N/A"\nmsgstr "Kh\xc3\xb4ng c\xc3\xb3"\n\n#: mixedgauge.c:193\nmsgid "Overall Progress"\nmsgstr "To\xc3\xa0n ti\xe1\xba\xbfn h\xc3\xa0nh"\n'

In [5]: changed_po
Out[5]: '#: mixedgauge.c:64\nmsgid "Passed"\nmsgstr "\xc4\x90\xe1\xbb\x97"\n\n#: mixedgauge.c:193\nmsgid "Overall Progres"\nmsgstr "To\xc3\xa0n ti\xe1\xba\xbfn h\xc3\xa0nh"\n\n#: mixedgauge.c:67\nmsgid "Completed"\nmsgstr "Ho\xc3\xa0na to\xc3\xa0n"\n\n#: mixedgauge.c:76\nmsgid "Skipped"\nmsgstr "B\xe1\xbb\x8b b\xe1\xbb\x8f qua"\n\n#: mixedgauge.c:79\nmsgid "In Progress"\nmsgstr "\xc4\x90ang ch\xe1\xba\xa1y"\n\n#: mixedgauge.c:85\nmsgid "N/A"\nmsgstr "Kh\xc3\xb4ng c\xc3\xb3e"\n\n#: mixedgauge.c:70\nmsgid "Checked"\nmsgstr "\xc4\x90\xc3\xa3 ki\xe1\xbb\x83m tra"\n\n#: mixedgauge.c:73\nmsgid "Done"\nmsgstr "Ho\xc3\xa0n t\xe1\xba\xa5t"\n'

# Making a list of tuples

In [6]: orig_list = zip(re.findall('^(msgid \".*\")', orig_po, re.MULTILINE), re.findall('^(msgstr \".*\")', orig_po, re.MULTILINE))

In [7]: changed_list = zip(re.findall('^(msgid \".*\")', changed_po, re.MULTILINE), re.findall('^(msgstr \".*\")', changed_po, re.MULTILINE))

# Sort them by the message-id

In [8]: orig_list.sort(key=lambda t: t[0])

In [9]: changed_list.sort(key=lambda t: t[0])

# Now flatten the list

In [10]: orig_string_list = [i for i in itertools.chain(*orig_list)]

In [11]: changed_string_list = [i for i in itertools.chain(*changed_list)]

In [12]: orig_list[0:3]
Out[12]: [('msgid "Checked"', 'msgstr "\xc4\x90\xc3\xa3 ki\xe1\xbb\x83m tra"'), ('msgid "Completed"', 'msgstr "Ho\xc3\xa0n to\xc3\xa0n"'), ('msgid "Done"', 'msgstr "Ho\xc3\xa0n t\xe1\xba\xa5t"')]

In [13]: orig_string_list[0:6]
Out[13]: ['msgid "Checked"', 'msgstr "\xc4\x90\xc3\xa3 ki\xe1\xbb\x83m tra"', 'msgid "Completed"', 'msgstr "Ho\xc3\xa0n to\xc3\xa0n"', 'msgid "Done"', 'msgstr "Ho\xc3\xa0n t\xe1\xba\xa5t"']

# print the diff

In [14]: for l in difflib.unified_diff(orig_string_list, changed_string_list, fromfile='original', tofile='changed'):
   ....:     print l
   ....:     
--- original

+++ changed

@@ -1,14 +1,14 @@

 msgid "Checked"
 msgstr "Đã kiểm tra"
 msgid "Completed"
-msgstr "Hoàn toàn"
+msgstr "Hoàna toàn"
 msgid "Done"
 msgstr "Hoàn tất"
 msgid "In Progress"
 msgstr "Đang chạy"
 msgid "N/A"
-msgstr "Không có"
-msgid "Overall Progress"
+msgstr "Không cóe"
+msgid "Overall Progres"
 msgstr "Toàn tiến hành"
 msgid "Passed"
 msgstr "Đỗ"
于 2013-03-24T17:02:46.680 に答える
2

babelモジュールを試してみてください。とりわけ.poパーサーが含まれていますbabel.messages.catalogbabel.messages.pofile

于 2013-03-25T18:45:26.547 に答える