最小限の労力で、プロジェクトはさまざまな言語に適応します。 Djangoには、新しい言語の追加、テキストの個々のセクションの翻訳の修正および追加などを行うのに十分な豊富なツールセットがあります。
プロジェクトが元々国際化を目的としていない場合、状況はまったく異なって見えます。 ローカル行が完全に散らばっている巨大なファイルの配列。それらの多くは異なるファイルに複製されています。 これらすべての行を1つのファイルに集め、ソートし、ソースファイルの内容をメッセージ識別子に置き換えることは、大きな恩恵のない仕事です。
このタスクに直面して、私は手動でそれを行うと、それが気にならなければ退屈で死ぬことに気付きました。 同時に、私の人生を少なくとも半分は楽にしてくれるツールがまだないことを知って驚きました。 仕事の4日間-django-make-i18nプロジェクトが誕生しました。
すべての作業は、Pythonの1つのかなり大きなスクリプトによって行われます。 Python(2.7を使用)に加えて、スクリプト自体はpolibのみに依存し、django環境を必要としません。
スクリプトを初めて起動してプロジェクトディレクトリで起動すると、django.poファイルのドラフトが作成されます。このファイルには、検出されたすべての行がローカル(デフォルトではロシア語)言語で含まれています。 キャッチされた文字列はmsgstrセクションに配置され、msgidには初期値「編集が必要[nnn]」が入力されます。
ソースファイルは変更されず、代わりに、ソースプロジェクトの隣に並行ファイルが作成され、ディレクトリ名に.i18n拡張子が追加されます。
次に、django.poファイルを調べて「逆翻訳」を行う必要があります。つまり、初期msgid値を英語のわかりやすい同等の値に置き換えます。 すべてのmsgid行が一意の値のままであることを確認する必要があるだけです。
スクリプトの2回目の実行では、django.poファイルを分析し、元のローカル行ではなく、翻訳サブシステムへの呼び出しの置換を実行します。 たとえば、次のコードを含むviews.pyファイルがあるとします。
if request.method == 'POST': # If the form has been submitted... post = True logging.info('POST ') request_form = RequestVideoForm(request.POST) if request_form.is_valid(): # All validation rules pass logging.info(' ') ok = True send_request(request,request_form,request.region.urlname,'feedback@doroga.tv') message = u' ' request_form = None # clean form else: message = u' '
スクリプトの最初の実行後、django.poは次の内容の行を表示します。
msgid "NEEDS TO BE EDITED [333]" msgstr "POST " msgid "NEEDS TO BE EDITED [334]" msgstr " " msgid "NEEDS TO BE EDITED [335]" msgstr " " msgid "NEEDS TO BE EDITED [336]" msgstr " "
django.poファイルで何も変更しない場合、スクリプトの2回目の実行後、views.pyファイルのコピーが作成され、およそ次の行が含まれます。
if request.method == 'POST': # If the form has been submitted... post = True logging.info(_('NEEDS TO BE EDITED [333]')) request_form = RequestVideoForm(request.POST) if request_form.is_valid(): # All validation rules pass logging.info(_('NEEDS TO BE EDITED [334]')) ok = True send_request(request,request_form,request.region.urlname,'feedback@doroga.tv') message = _('NEEDS TO BE EDITED [335]') request_form = None # clean form else: message = _('NEEDS TO BE EDITED [336]') else: logging.info(_('NEEDS TO BE EDITED [337]')) request_form = RequestVideoForm(auto_id=True)
次のようにdjango.poの行に入力してみましょう。
msgid "POST request has been found" msgstr "POST " msgid "Form is valid" msgstr " " msgid "Your request has just been sent" msgstr " " msgid "Fix form data" msgstr " "
スクリプトを再度実行します。次の形式のかなり許容できるコードを取得します。
if request.method == 'POST': # If the form has been submitted... post = True logging.info(_('POST request has been found')) request_form = RequestVideoForm(request.POST) if request_form.is_valid(): # All validation rules pass logging.info(_('Form is valid')) ok = True send_request(request,request_form,request.region.urlname,'feedback@doroga.tv') message = _('Your request has just been sent') request_form = None # clean form else: message = _('Fix form data')
さらに、スクリプトは、国際化パッケージのインポートコードをファイルの先頭に追加します。
from django.utils.translation import ugettext as _
誤ってこれを忘れた場合に備えて。
言語の詳細とdjangoの使用を考慮して、同じ操作がhtmlおよびjsファイルに対して実行されます。 これにより、JavaScript用のdjangojs.poファイルが作成されます。
メッセージをコンパイルするために残ります:
python manage.py compilemessages --all
出来上がり-あなたのプロジェクトは国際化の準備ができています。 もちろん、djangoの下での国際化自体の詳細はまだたくさんありますが、それらはこの記事の範囲外です。