フラスコは、グローバル化したアプリケーションを開発します

C#の世界のpythonには常に、人々に同じ機能と同じ効果を安堵感を与え、価格だけの1/10以下を支払う必要があり、それはチェンが提唱するPythonの哲学の力がもたらしたと考えられます。

私はそれは悲惨なように記述することができ、ASP.NETの深いグローバルな経験を覚えています。.NETは、リソースのグローバル化に関連して得られた資源のベアラ・フォーマットとしてXML形式のリソースファイルの使用は、あるので、C#の命名規則に厳密ラインを採用する必要があります。このような行動は、この複雑さの「名前」でのリソースの使用に増加するであろう。私は前に、問題が何であるかと思っていないが、まだ多国籍バージョンに翻訳またはリソースファイルが巨大なワークロードを直面するであろう更新しません。
そして、グローバル化のASP.NET公式勧告はさらに欺瞞的慣行である、それは単に「迅速かつ義務」である極端に、だけでなく、地獄のような終わることはありませんメンテナンスに分類していたんでした。

彼らはグローバルなアプローチのためのまともなweb2pyのと少しだけ接触を見つけるまでまたは、直接グローバルASP.NETの長期的な発展のために使用された検索キーの天然資源、何らミドルネームのキーワードが、言葉をweb2pyのありません私はプロジェクトのは間違いないが、我々が処理する脳に大きな穴を開くことですがあります。また、デフォルトのテンプレート言語を作ることは、このプロセスに必要な作業の膨大な量がまだ手動で処理されているので、私はより良いアプリケーションを探しています。

それはフラスコに会ったまで、フラスコ-バベルこのプラグイン。これは始めるために10分を引き継いだ、とそれが使用するだけでエキサイティングなことを見る-シンプル、使いやすいです。

フラスコ-バベルはのフラスコであるバベルのプラグインは、それはいくつかの非常に印象的な機能を備えています。

  • コード・ページからの自動検索とキーワードグローバルリソースを抽出し、デフォルトの辞書を生成します
  • 同期させ、グローバルリソースファイルを変換するコマンドラインツールのシリーズを提供
  • リソースファイルは共通にコンパイルすることができ*.mo辞書を維持するために、他のエディタで、フォーマット
  • コードページには、リソースにアクセスする方法することができgettext()_()
  • あなたは自動的に現在の地域の言語を切り替えることができます

フラスコ・バベルの使い方

フラスコ-バベルは、フラスコのアプリケーションコンテキストにロード

from flask import Flask
from flask.ext.babel import Babel

app = Flask(__name__)
app.config.from_pyfile('babel.cfg')
babel = Babel(app)

babel.cfg プロファイル

babel.cfg バベルは、それが固定された構成で、ルートディレクトリフラスコプロジェクトの設定ファイルに配置され、以下の公式は、文言をお勧めします。

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_

必要が変更する場合フラスコ-資産は、プラグインした場合extensions、設定を

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_,webassets.ext.jinja2.AssetsExtension

gettext()/_()

そして、あなたはjiniaの中にPythonコードまたはページ内で使用できるgettext()メソッド参照グローバルリソース。実際には、この時点で、我々はすべてのリソースファイルを持っていないが、それは最も魅力的な場所バベルである-最初に使用して、リソースを生成します。

これは、Pythonコードでそのまま使用することができます gettext()

from flask import Flask, render_template

from flaskext.babel import Babel, gettext as _

app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'zh'
babel = Babel(app)

@app.route('/')
def hello():
    s = _("Saturday")
    return render_template('index.html', day=day)

if __name__ == '__main__':
    app.debug = True
    app.run()

上記のコードでは、_("Saturday")内のリソースから名前を取得することですSaturdayリソースファイルは、地域に対応していない場合は、リソースまたは直接出力を見つけることができません"Saturday"

神社は、テンプレートで使用されます。

<p>{{ _("Hello, world!") }}</p>
<p>{{ _("It's %(day)s today", day=day) }}</p>

同様に、コードの他のモジュールにこのグローバルリソースに2つの方法で使用されています。

生成された翻訳テンプレート

これは非常に重要なステップが、また、バベル、ほとんどの時間節約のステップの努力です。バベルはからのコードとテンプレートを描画することができgettext()、すべてのリソースとデフォルトのテンプレート言語に名を生成します。あらゆるニーズは現地の言語に翻訳することができた後、このテンプレートが生成されます。

ただ、コマンドラインで次のコマンドを入力します

$ pybabel extract -F babel.cfg -o messages.pot .

プロジェクトのルートディレクトリフラスコの下に生成されるmessages.potデフォルトのテンプレート言語

翻訳テンプレート

次のステップは、地域の言語リソースファイルからの変換用のデフォルトのテンプレートを指定して、コマンドラインに対処することです:

$ pybabel init -i messages.pot -d translations -l zh

この命令の結果はに従って実行されるmessages.pot(中国語(ZH)リソースファイルmessage.poに生成される)translationsディレクトリ。

次のようにディレクトリ構造は次のとおりです。

.
├── babel.cfg
├── messages.pot
├── static
├── templates
└── translations
      └── zh
           └── LC_MESSAGES
                  └─ message.po
      

message.poそれは今あなたができる、オープンと関連した翻訳作業対象のリソースファイルです。*.poファイルは単にテキストを直接編集することができているか、いくつかの特別な経口プログラミングツールは、となっている選択することができます。私は以上を推奨していますPOEdit

645016-20151123093117545-672420583.png

注意指定した場合は、地域面積ではなく、地域のフルネーム、とき速記を使用する必要がありますを参照する場合zh-CN(簡体字中国語)を直接使用上、zhまたは命令のエラー。

message.po ファイル

以下は、あるmessage.opコンテンツ

# Chinese translations for PROJECT.
# Copyright (C) 2015 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# Ray <csharp2002@hotmail>, 2015.
#, fuzzy

msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: [email protected]\n"
"POT-Creation-Date: 2015-03-29 22:46+0800\n"
"PO-Revision-Date: 2015-03-29 21:49+0800\n"
"Last-Translator: Ray <[email protected]>\n"
"Language-Team: zh <[email protected]>\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: Babel 1.3\n"

#: views.py:103
#,fuzzy, python-format
msgid "Articles tagged with:%(value)s"
msgstr "标记%(value)s主题的文章"

注意,fuzzyあなたがするリソースファイルをコンパイルする必要がある場合は、このキーワードを*.mo使用すると、それを削除する必要がある場合は、それ以外のリソースファイルコンパイラは、コンパイルせずに直接全体のリソースファイルを無視します。

リソースをコンパイルします

コンパイルプロセスは、単に次のコマンドを実行する必要があり、非常にシンプルでtranslations、すべて*.poのファイルをバイナリにコンパイルされる*.moリソースファイル。

$ pybabel compile -d translations

デフォルトのテンプレートを更新

私たちのプログラムのリソースは自然にリソースファイルの変更であることをバインドされたコンテンツを変更し、維持する必要性でなければならないので、これは、確かに開発者のための機能性の非常にバベル酒です。我々はN言語のコピーを翻訳するときには、手が、その後非常に恐ろしい仕事のプロセスで行うためのツールなしだろう。幸いなことに、私たちは、次のコマンドを実行する必要があり、バベルは、デフォルトのテンプレートファイルと、このテンプレートから生成されたすべてのすべてのリソースを更新します。

$ pybabel update -i messages.pot -d translations

エリア切り替え

フラスコ・バベルのデフォルトが読み込まれflask.g.lang、自動的に使用の現在のロケールの要求コンテキストを切り替えます。しかし、多くのシナリオでは、我々は、手動で、我々が追加する必要があり、その場合には、現在の地域の言語、変更する必要があるget_local()機能を:

from flask import g, request

@babel.localeselector
def get_locale():
    # 如果在g对象内有登入的用户对象则从用户对象中读取 locale 区域信息
    user = getattr(g, 'user', None)
    if user is not None:
        return user.locale
    
    # 此方法只需要返会一个区域字符串
    return request.accept_languages.best_match(['de', 'fr', 'en'])


@babel.timezoneselector
def get_timezone():
    """此函数与 get_locale 类似,只是向babel提供获取时区的设置"""
    user = getattr(g, 'user', None)
    if user is not None:
        return user.timezone

これら二つの機能を提供した後、呼び出しgettextバベル時には、それらを自動的に呼び出します。ここではデコレータによる@babel.localeselector@babel.timezoneselector書き換え同様の機能を実現するが、書かれたコードの量の割合が少ないクラスを書きます。

概要

あなたは慎重にフラスコ・バベル文書を読み取ることができる、より詳細に理解する必要がある場合はもちろん、バベルよりも多くのAPIは、ここで、これらの中で提供します。ここで私はノートを作るために、ほとんどの従来の使用状況レコードバベルを目的としただけでなく、より多くの人々が友人のフラスコを使用していると共有します。

ます。https://www.cnblogs.com/Ray-liang/p/4987455.htmlで再現

おすすめ

転載: blog.csdn.net/weixin_33895604/article/details/94195959