更新前までに翻訳していたテキストがそのまま保持される。
成果物
Python.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コマンド+手動翻訳の方法なら安定して使えそう。