パート1はじめに
最初は、記事のルートとエラーとの戦いでもっと言及したかったのですが、国際化のトピックは非常に広範であったため、彼女だけに投稿することにしました。 フレームワーク内で一般的なgettextツールを使用します。
すべての翻訳は、2つの部分に分けることができます。
a)拡張子が.pyのファイル内に直接あるもの-すべては簡単です。
b)そしてテンプレートにあるもの-小さな自転車を書かなければなりません:)。
それでは、翻訳管理プロセスを自動化する必要があります。
猫へようこそ。
Pythonファイルからの翻訳フレーズ
翻訳システムが機能するために、翻訳を扱う関数をインポートします。引数として、翻訳するモジュールの名前を引数として渡します。 次に、この関数を_()として呼び出し、翻訳されたフレーズを引数として渡します。
import core.union; _ = core.union.get_trans('module') _('text')
テンプレートからのフレーズの翻訳
テンプレートに翻訳関数を渡すための次のフラグメントをレンダリングするrender_templ関数に貼り付けます。
p['gettext'] = get_trans(module) p['_'] = get_trans(module)
その結果、以下が得られます。
def render_templ(template, **kwarg): template = jinja.get_template(template) module = split_templ_name( template)[0] kwarg['gettext'] = get_trans(module) kwarg['_'] = get_trans(module) kwarg['context'] = context() return template.render(**kwarg)
環境のコンテキストをテンプレートに渡して、各関数で渡さないようにすることもできます。
次に、翻訳を扱う関数があります。
langs = {} def load_lng(path, module_name, lang): """ """ if not module_name in langs[lang]: langs[lang][module_name] = [] path = os.path.join( path, module_name, 'locale') if module_name else os.path.join (path, 'locale') if os.path.isdir(path): t = gettext.translation('_', path, [cur_lang()], codeset='UTF-8') langs[lang][module_name].append(t) def get_lng(module): """ . """ lang = cur_lang() if not lang in langs: langs[lang] = {} if not module in langs[lang]: langs[lang][module] = [] load_lng(os.path.join (settings.lib_path,'app'), module, lang) load_lng(os.path.join (os.getcwd(),'app'), module, lang) if not module: load_lng(os.path.join (os.getcwd()), '', lang) return langs[lang][module] def trans(module, s): """ , """ if type(s) == str: s = s.decode('UTF-8') translated = s lng = get_lng(module) if lng: for i in reversed(lng): translated = i.gettext(s).decode('UTF-8')
gettextを使用する
テンプレート{{_( 'text')}}に書き込んだ後、翻訳を自動化する必要があります。 / app / module / ru / LS_MESSAGESフォルダーにある_.mo、_。poファイルを取得する必要があります。
_.mo-gettextが翻訳を読み込むコンパイル済みファイル。
_.po-このモデルに従った翻訳者のソースコードを含むファイル:
#: /path/modul/templ/base.tpl:25 msgid "text" msgstr "" # .
これらのファイルは、コンソールからの標準コマンドによって管理されます。
xgettext-翻訳のためにファイルから行を収集します。
msginit-特定の言語_.poの翻訳ファイルを作成します。
msgfmt-_.moバイナリファイルにコンパイルします。
msgmerge-翻訳ファイルを更新します。
しかし、第一に、私はすべてを自動化し、毎回いくつかのコマンドを書くのではなく、第二に、xgettextはテンプレートでは動作せず、* .pyファイルでのみ動作します、少なくとも彼はそのような機会を見つけませんでした。
したがって、1つのコマンドでこれらすべてのアクションを実行する小さなユーティリティを作成します。
まとめ
このフレームワークは、モジュール構造、標準化、および内部化を備えています。 実行可能なフレームワークを作成するには、デバッグを追加し、ルートと静的変数を操作するだけです。 その後、管理パネル、データ表示などの主要コンポーネントの作成を開始できます。
今のところすべてです。
使用材料
gettextの性質についてPythonでのgettextの概要gettextおよびjinja2Pythonおよびgettextのドキュメント継続