やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

PythonコードをGoogle翻訳で国際化する(pot,po,moファイル既存時は更新する)

更新前までに翻訳していたテキストがそのまま保持される。

成果物

GitHubPython.i18n.Babel.Translate.Google.201709171000

前回

今回

./src/main.pyに以下の翻訳対象を追加した。

print(_('Nice to meet you.'))

次に./res/i18n/script/run.pyを実行して更新。pot, po, moが更新される。上記の文章を翻訳したファイルが作成される。ソースコードに変更がなければ既存ファイル(pot, po, mo)で足りるので翻訳APIは実行されない。(ただしファイルは必ず上書きされる)

$ python run.py 
{'locale': 'en', 'domain': 'hello', 'project': 'test_project', 'version': '1.0', 'copyright_holder': None, 'msgid_bugs_address': None, 'creation_date': datetime.datetime(2017, 9, 17, 10, 55, 24, 816677, tzinfo=tzlocal()), 'revision_date': datetime.datetime(2017, 9, 17, 10, 55, 24, 816677, tzinfo=tzlocal()), 'last_translator': None, 'language_team': None}
{'locale': 'de', 'domain': 'hello', 'project': 'test_project', 'version': '1.0', 'copyright_holder': None, 'msgid_bugs_address': None, 'creation_date': datetime.datetime(2017, 9, 17, 10, 55, 25, 571257, tzinfo=tzlocal()), 'revision_date': datetime.datetime(2017, 9, 17, 10, 55, 25, 571257, tzinfo=tzlocal()), 'last_translator': None, 'language_team': None}
{'locale': 'ja', 'domain': 'hello', 'project': 'test_project', 'version': '1.0', 'copyright_holder': None, 'msgid_bugs_address': None, 'creation_date': datetime.datetime(2017, 9, 17, 10, 55, 25, 587415, tzinfo=tzlocal()), 'revision_date': datetime.datetime(2017, 9, 17, 10, 55, 25, 587415, tzinfo=tzlocal()), 'last_translator': None, 'language_team': None}
HTTP Code: 200
{'sentences': [{'trans': 'Nice to meet you.', 'orig': 'Nice to meet you.', 'backend': 0}], 'src': 'en', 'confidence': 0.35836697, 'ld_result': {'srclangs': ['en'], 'srclangs_confidences': [0.35836697], 'extended_srclangs': ['en']}}
Nice to meet you.
HTTP Code: 200
{'sentences': [{'trans': 'Schön dich zu treffen.', 'orig': 'Nice to meet you.', 'backend': 1}], 'dict': [{'pos': '語句', 'terms': ['Schön, Sie kennen zu lernen.'], 'entry': [{'word': 'Schön, Sie kennen zu lernen.', 'reverse_translation': ['Nice to meet you.']}], 'base_form': 'Nice to meet you.', 'pos_enum': 10}], 'src': 'en', 'confidence': 0.35836697, 'ld_result': {'srclangs': ['en'], 'srclangs_confidences': [0.35836697], 'extended_srclangs': ['en']}}
Schön dich zu treffen.
HTTP Code: 200
{'sentences': [{'trans': 'はじめまして。', 'orig': 'Nice to meet you.', 'backend': 1}, {'translit': 'Hajimemashite.'}], 'dict': [{'pos': '感嘆詞', 'terms': ['始めまして'], 'entry': [{'word': '始めまして', 'reverse_translation': ['Nice to meet you!']}], 'base_form': 'Nice to meet you!', 'pos_enum': 9}], 'src': 'en', 'confidence': 0.35836697, 'ld_result': {'srclangs': ['en'], 'srclangs_confidences': [0.35836697], 'extended_srclangs': ['en']}}
はじめまして。

翻訳されるのは未翻訳テキストのみ(msgstr "")。既存の翻訳済みテキストに関しては翻訳APIが実行されていない。

main.pyを実行すると、翻訳されたテキストが表示される。

$ python main.py 
こんにちは世界 !!
はじめまして。
...

スクリプトを叩くだけで翻訳された!

課題

  • pot, po, moファイルの更新判定を実装する(現在は新規作成のみ)
    • 更新されていない(変更、削除、追加の箇所が一つもない)
      • ファイルを上書きしない
    • 変更されている
      • ファイルを上書きする
      • リビジョンを上げる
  • 翻訳リクエスト回数を減らす工夫をする
    • 同一
    • 原文言語と翻訳言語が同一のときは翻訳しないようにする(原文をそのままmessage.stringに代入する)
    • 1回のリクエストに10件分(1000文字分)の文章を入力するなど
  • 翻訳リクエスト部分の抽象化
  • 異なる翻訳APIの実装

必要性があるか微妙な課題は以下。

解決済み課題

  • 新規作成のとき同一msgidがあると重複回数分だけAPI発行してしまう
    • 一旦potファイルで1件にしてしまい、その後poファイルにしてから翻訳させることで1度のAPI発行にできた
  • pot, po, moファイルの更新を実装する
    • 新規追加、変更、の箇所は新たに翻訳処理を行う
      • 各ファイルを上書きする

開発環境

所感

自動翻訳は一旦終了する。

翻訳APIはいつ使用不能になるかわからない。仕様変更もありうる。今回APIの動作確認日は2017-09-17。残った課題はほぼWebAPIのパフォーマンス問題。実装してもAPIが使えなくなるリスクがあるため、やる気にならない。ローカルだけで翻訳したい。しかし、実装が大変そうで調査にも時間が取られる。翻訳に力を注ぎたいわけではないため今回はここまで。

Babelのpybabelコマンド+手動翻訳の方法なら安定して使えそう。