メールのカタログを使う

序言:序言

♪the gettext 翻訳システムは、アプリケーションで使用されている任意の文字列をローカル化することができます。方法は、次のような関数にパッケージすることです。 gettext(str) そして ngettext(singular, plural, num) それがそうです。簡潔にするために gettext 関数は一般に別名 _(str) このように書くことができます

print(_("Hello"))

それだけではない。

print("Hello")

文字列“Hello”を局所化できるようにする。

メッセージリストは,アプリケーションで使用されるこのような局所化可能なメッセージの翻訳集合である.これらは一般にPO(携帯オブジェクト)とMO(機器オブジェクト)ファイルに格納され,そのフォーマットはGNUで定義される. gettext ツールとGNU translation project それがそうです。

メッセージリストを構築する一般的な過程を以下に示す.

  • 道具を使う(例えば xgettext )コードベースから局所化可能な文字列を抽出し、POT(POテンプレート)ファイルに書き込む。

  • 特定の領域に設定されたPOTファイル(例えば、“en_US”)をコピーし、メッセージの翻訳を開始する。

  • 道具を使って msgfmt 領域設定POファイルをバイナリMOファイルにコンパイルするには、以下の操作を実行してください。

  • 後で、コード変更に翻訳を更新する必要がある場合には、POTファイルを再生成し、領域設定に固有の様々なPOファイルに変更を統合して、例えば使用することができます。 msgmerge

Pythonは提供しました gettext モジュールは標準ライブラリの一部として,アプリケーションが適切に生成されたMOファイルを使用できるようにする.

として gettext アプリケーション·メッセージを翻訳するために堅固で良好なサポートを得た基礎を提供したが、Babelは車輪を再発明するのではなく、このインフラストラクチャを再利用し、Pythonアプリケーションのためのメッセージディレクトリを構築することを容易にした。

メッセージ抽出.

Babelが提供する機能は xgettext プログラムは、Pythonソースファイルから抽出することを内蔵しているだけで、簡単な拡張機構を用いて他のファイルフォーマットのサポートを追加することができます。

似ていない xgettext これは、通常、ファイル毎に1回呼び出されるので、Babelではメッセージ抽出のためのルーチンでディレクトリを動作させる。文書に基づく方法は xgettext クラスはプロジェクトをうまく処理する. Makefile Pythonプロジェクトはあまり使用されていません make したがって、多くのPythonプロジェクトからなる非均一ソースファイル集合からメッセージを抽出するための異なる機構が必要となる。

メールが単一のファイルではなくディレクトリに基づいて抽出する場合には、どのような方法でどのファイルを処理すべきかを構成する方法が必要である。例えば多くのプロジェクトには .html ファイルのうちのいくつかは、局所化可能なメッセージを含まない静的HTMLファイルであってもよく、他のファイルは、そうであってもよい。 Jinja2 テンプレート、他のテンプレートが含まれている可能性があります Genshi テンプレートをマークする。異なるテンプレート言語を用いたHTML文書(どのような理由でも)を混在させる項目もある.したがって,ソースファイルからメッセージを抽出する方式は,ファイル拡張子だけでなく,正確な方法で制御する必要がある.

Babelは,1つのプロファイルを受け取ってファイルの抽出方法へのこのマッピングを指定し,以下のようになる.

先端.先端.

Babelは、その使用するメッセージディレクトリにアクセスするための2つの異なるフロントエンドを提供する。

あなたがどれを選ぶかはあなたのプロジェクトの性質にかかっています。現代のPythonプロジェクトの多くの場合、distutils/setuptools統合が便利かもしれません。

抽出方式マッピングと構成

抽出方法のBabelにおけるファイルへのマッピングはプロファイルによって行われる.このファイルは、拡張グローバル·パターンを抽出方法の名前にマッピングし、パターンごとに様々なオプション(どのオプションが特定の抽出方法に依存して利用可能か)を設定することもできます。

例えば、以下の構成は、ルートタグテンプレートとテキストテンプレートからのメッセージ抽出を追加する。

# Extraction from Python source files

[python: **.py]

# Extraction from Genshi HTML and text templates

[genshi: **/templates/**.html]
ignore_tags = script,style
include_attrs = alt title summary

[genshi: **/templates/**.txt]
template_class = genshi.template:TextTemplate
encoding = ISO-8819-15

# Extraction from JavaScript files

[javascript: **.js]
extract_messages = $._, jQuery._

プロファイル文法は一般的なフォーマットに基づいている .INI Windowsシステム上のファイル、そして ConfigParser Python標準ライブラリのモジュールです。節名(方括弧で囲まれた文字列)は,抽出方法の名前を指定し,拡張グローバルパターンを指定し,その抽出手法を用いるべきファイルを指定し,コロンで区切る.部分中のオプションは抽出方法に渡される.利用可能なオプションは、使用する抽出方法に依存する。

この構成で用いられる拡張グローバルモデルは,多くのshellが提供するグローバルモデルと同様である.1つの星号. (* )は任意の数の文字のワイルドカード(パス名コンポーネントデリミタ“/”を除く)であり,疑問符である (? )単一文字のみに一致します。さらに次の2つの星文字は (** )ワイルドカードを任意のディレクトリレベルに一致させるために使用することができ、したがって、パターン **.txt 拡張子のファイルと一致します .txt どんなカタログにもあります。

# あるいは…。 ; 文字は無視され,アノテーションに用いることができる.空行も無視される。

注釈

BABELが提供するコマンドを使用してメッセージ抽出を実行している場合、統合することができます setup.py スクリプトは、この構成、すなわちキーワードパラメータとして異なる方法で提供することもできます。 setup() 機能します。見 総エージェント/インストールツール統合 より多くの情報を得ることができます

デフォルト抽出方法

バベルタは内蔵の抽出器をいくつか持っています python (Pythonソースファイルからメッセージを抽出します)、 javascript そして、 ignore (何も抽出しません)。

♪the python デフォルトの場合,抽出器はGLOBモードにマッピングされる. **.py これは全ての機能に適用されることを意味します .py どのディレクトリにも拡張子があります。自分のマッピング構成を指定した場合、このデフォルトマッピングは破棄されますので、(上の例に示すように)明示的にマッピングに追加する必要があります。

参考抽出方法

短い抽出方法名(“genshi”)を使用できるようにするためには pkg_resources 実装されており、この抽出方法を実現するソフトウェアパッケージは、そのメタデータと共にインストールする必要がある( egg-info )。

何らかの理由でこれができない場合には,マッピング配置のExtract部分に短い名前を完全に限定された関数名にマッピングする必要がある.例:

# Some custom extraction method

[extractors]
custom = mypackage.module:extract_custom

[custom: **.ctm]
some_option = foo

内蔵抽出方法にご注意ください python そして ignore デフォルトで利用可能であっても pkg_resources インストールされていません。メソッドではそれらを明示的に定義する. [extractors] 一節です。

文字抽出方法

局所化可能な手法を抽出するための新しい手法を追加することは容易である.まず、以下のインタフェースに適合する関数を実現する必要があります。

def extract_xxx(fileobj, keywords, comment_tags, options):
    """Extract messages from XXX files.

    :param fileobj: the file-like object the messages should be extracted
                    from
    :param keywords: a list of keywords (i.e. function names) that should
                     be recognized as translation functions
    :param comment_tags: a list of translator tags to search for and
                         include in the results
    :param options: a dictionary of additional options (optional)
    :return: an iterator over ``(lineno, funcname, message, comments)``
             tuples
    :rtype: ``iterator``
    """

注釈

この関数が生成するタプル中の任意の文字列は unicode 対象、または str 純ASCII文字のオブジェクトを用いた.これは、ソースが他の符号化を使用する文字列を含む場合、それを復号することが抽出器によって実現される動作であることを意味する。 unicode 物体です。

次に、あなたはこの関数を入口点として登録しなければならない。あなたのが必要です setup.py 使用するスクリプト setuptools そして,必要なメタデータとともに実装するソフトウェアパッケージである.この点を解決しましたら、以下のようなものを追加してください setup.py スクリプト:

def setup(...

    entry_points = """
    [babel.extractors]
    xxx = your.package:extract_xxx
    """,

つまり、あなたの抽出方法を入口ポイントグループに追加します。 babel.extractors ここで,入口点の名前は人間が抽出方法を参照するために用いる名前であり,値は実際の抽出を実現するモジュールと関数の名前(コロンで区切られている)である.

注釈

図に示すように Referencing Extraction Methods したがって、宣言入口点は、ユーザが依然として抽出関数を直接参照することができるので、厳密な要求ではない。しかし、可能性がある限り、構成をより便利にするために、入口点が宣言されなければならない。

訳者評

まず、レビューラベルとは何か。Commentsタグは,コメントで検索するテキスト抄録であり,python前のコメントのみで検索する. gettext 呼び出しは,次の例を示す.

# NOTE: This is a comment about `Foo Bar`
_('Foo Bar')

以上の例のアノテーションタグは NOTE: このタグの翻訳機は This is a comment about `Foo Bar `.

ディレクトリテンプレート内の結果出力は、以下のようになる。

#. This is a comment about `Foo Bar`
#: main.py:2
msgid "Foo Bar"
msgstr ""

なぜこれが必要なのかと聞くかもしれません

この簡単な例を考えてみてください;あなたは“マニュアル”というメニューを持っています。これがどういう意味か知っていますが、翻訳者はこれを見ると、あなたの意味を知りたくなります。

  1. 文書やヘルプマニュアル、または

  2. 人手で操作する必要がありますか。

これは最も簡単な場合であり,注釈(“インストールマニュアル”のような)を翻訳することは,状況を明らかにし,翻訳者を効率的にするのに役立つ.

注釈

翻訳者の注釈を抽出できるかどうかは使用する抽出方法に依存する.Babelが提供するPython抽出器は確かにこの機能を実現しているが、他の機能は実現できない可能性がある。