アプリケーション固有のコンテンツのグローバリゼーション。

Python Babel、Flask Babel、および Jinja2 のテンプレートを使用することで、アプリケーション固有のコンテンツをグローバル化します。

アプリケーション固有のコンテンツのグローバル化を支援するための以下のテクノロジーへのリンクを使用してください。

  • Babel (http://babel.pocoo.org/) は、Python の標準グローバリゼーション・パッケージです。
  • Flask-Babel (https://pythonhosted.org/Flask-Babel/) は、Flask に対する拡張です。
  • Jinja2/Babel の統合 (http://jinja.pocoo.org/docs/dev/integration/) では、Jinja2 テンプレートで Babel を使用する方法が説明されています。

主なコンセプト

この例では、Flask-Babel ピップ パッケージとその従属パッケージを、アプリケーションの src_deps/pip/ ディレクトリーにインストールします。 Flask-Babel パッケージは、pybabel ツールを提供しており、これを使用することで Flask ベースのアプリケーション用の翻訳ファイルを作成できます。

QRadar® は、要求ヘッダーの Accept-Languages ヘッダー属性を介して、ユーザーの設定済みロケールをアプリケーションに渡します。

Flask-Babel パッケージを使用して、アプリケーションで使用するグローバリゼーション・テキスト値を作成するには、以下のワークフローを使用します。

  1. pybabel ツールを使用して、通常は .pot ファイルにロケール・キーを抽出します。
  2. pybabel ツールを使用して、サポートする言語セットごとにテンプレート .po ファイルを作成します。
  3. .po ファイルを編集して完成させます。 つまり、すべてのキーを、テキスト値の言語固有バリアントに翻訳します。
  4. pybabel ツールを使用して、完成した .po ファイルを .mo ファイルのバイナリー・セットにコンパイルします。このバイナリー・セットは、Flask Python コードまたは Jinja2 テンプレートで使用できます。

前提条件

この例を実行するには、以下の Python パッケージをアプリケーションの src_deps/pip/ ディレクトリーにインストールする必要があります。

  • pytz-2015.6-py2.py3-none-any.whl
  • Babel-2.1.1-py2.py3-none-any.whl
  • speaklater-1.3.tar.gz
  • Flask-Babel-0.9.tar.gz

また、以下の内容を含む ordering.txt ファイルを src_deps/pip/ ディレクトリーに作成する必要があります。

pytz-2015.6-py2.py3-none-any.whl
Babel-2.1.1-py2.py3-none-any.whl
speaklater-1.3.tar.gz
Flask-Babel-0.9.tar.gz
注: SDK が提供する仮想環境内から pip install -d src_deps/pip flask-babel コマンドを使用して、Flask-Babel の依存関係をダウンロードします。

可能な限り、 .tar ファイル (tar.gz) ソース・ファイルの代わりに、Python wheel (whl) ファイルをバンドルしてください。一部の未加工の Python ソース・パッケージ .tar ファイルでは、gcc コンパイラーなど、アプリコードをホストする基本Dockerコンテナが持っていないツールを使用する必要があるものがあります。

ローカル・システムで、パッケージ・ソース tarball から Python wheel ファイルを作成します。 以下に例を示します。

tar -xvzf some_package.tar.gz
python setup.py sdist bdist_wheel

Jinja2 テンプレート: app/templates/index.html

この例は、HelloWorld サンプル・アプリケーションを基にしています。 元の HTML テンプレートは、ハードコーディングされた英語固有のテキスト値を使用して作成されています。 以下の例では、Flask-Babel から gettext 関数を使用する Jinja2 ディレクティブで英語ロケール・ストリング値をラップしています。 以下に例を示します。

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>{{title}} - Main</title>
  <link rel="stylesheet" href="static/css/style.css">
</head>

<body>
<div id="pageheader" class="pagebanner">
<p>{{ _( 'IBM QRadar Application : Hello World' ) }}</p>
</div>

<div id="contentpane">
  <p>{{ _( 'Hello! and Welcome to the first Qradar app
           served from the AppFramework/Docker instance on your console' ) }}</p>
</div>

<div class="news-wrapper">
    <p class="quote">{{ _( 'Hello World' ) }}</p>
</div>

</body>
</html>

この例では、gettext 関数に省略表現の別名を使用しています。 完全形式も使用できます。 以下に例を示します。

 {{ gettext( '...') }} 

このメソッドは、アプリケーションを素早く作成し、プロトタイプ化する便利なメカニズムを備えています。 後で戻ってロケール対応にすることができます。 キーとして実際の初期テキストを使用することで、テンプレートを判読可能な状態にします。

注: ディレクティブを囲む空白文字は除去します。 例えば、HTML<span>, <div>、またはその他の要素を使用することを検討してください。 pybabel ツールで、すべてのキー値を抽出するのはやや困難です。

pybabel の構成

検査対象のソース・ファイルを認識するように pybabel ツールを構成する必要があります。

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

この例では、 pybabel は、 app/ フォルダー内のすべての Python ソース・ファイル、および app/templates/ フォルダーの任意のサブディレクトリー内のすべての HTML ファイルを検査するように構成されています。

pybabel ツールは、babel.pyファイルを使用して、アプリケーション内のどのディレクトリやファイルを調べれば翻訳可能なエントリーがあるかどうかを知ることができます。ローカルの .pot ファイルにビルドするために、 *.py ファイルおよび Jinja2 テンプレートで gettext (..) エントリーと _(..) エントリーを検索します。

.pot ファイルを作成します。

.pot ファイルを作成するには、コマンド行を開き、app/ フォルダー内から以下のコマンドを入力します。

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

message.pot ファイルが app/ フォルダーに作成されます。 このファイルの内容は、以下のファイルに類似したものになります。

# Translations template for PROJECT.
# Copyright (C) 2015 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
#
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2015-10-07 21:27+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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"

#: templates/index.html:11
msgid "IBM QRadar Application : Hello World"
msgstr ""

#: templates/index.html:15
msgid ""
"Hello! and Welcome to the first Qradar app served from the "
"AppFramework/Docker instance on your console"
msgstr ""

#: templates/index.html:19
msgid "Hello World"
msgstr ""

msgid エントリーをキーとして使用できます。

.po ファイルを作成します。

スペイン語、フランス語、および英語用の個々の言語固有の .po ファイルを作成します。コマンド行から、app/ フォルダー内から以下のコマンドを入力します。

pybabel init -i messages.pot -d translations -l es
pybabel init -i messages.pot -d translations -l fr
pybabel init -i messages.pot -d translations -l en
pybabel init -i messages.pot -d translations -l ja

これらのコマンドを使用すると、以下の場所に翻訳ファイルが作成されます。

  • app/translations/es/LC_Messages/messages.po
  • app/translations/fr/LC_Messages/messages.po
  • app/translations/en/LC_Messages/messages.po
  • app/translations/ja/LC_Messages/messages.po

以下の例は、生成される app/translations/es/LC_Messages/messages.po ファイルです。

# Spanish translations for PROJECT.
# Copyright (C) 2015 ORGANIZATION
# This file is distributed under the same license as the PROJECT project.
# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
#
#
msgid ""
msgstr ""
"Project-Id-Version: PROJECT VERSION\n"
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
"POT-Creation-Date: 2015-10-07 16:02+0100\n"
"PO-Revision-Date: 2015-10-07 16:04+0100\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: es <LL@li.org>\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"

#: templates/index.html:11
msgid "IBM QRadar Application : Hello World"
msgstr ""

#: templates/index.html:15
msgid "Hello! and Welcome to the first Qradar app served from the "
"AppFramework/Docker instance on your console"
msgstr ""

#: templates/index.html:19
msgid "Hello World"
msgstr ""


.po ファイルを編集します。

.po ファイルを編集して、QRadar がアプリケーションのコンテンツを翻訳するために使用する言語固有のテキスト・ストリングを追加します。.po ファイル内の msgid ごとに、msgstr 値をターゲット言語で入力する必要があります。

以下の例は、app/translations/es/LC_Messages/messages.po ファイルからのコード・スニペットです。

#: templates/index.html:19
msgid "Hello World"
msgstr "Hola Mundo"

.mo ファイルを作成します。

.mo ファイルを作成するには、コマンド・ラインを開き、app/ フォルダー内から以下のコマンドを入力します。

pybabel compile -d translation

このコマンドは、すべての .po ファイルを以下の場所にある .mo ファイルにコンパイルします。

  • app/translations/es/LC_Messages/messages.mo
  • app/translations/fr/LC_Messages/messages.mo
  • app/translations/en/LC_Messages/messages.mo
  • app/translations/ja/LC_Messages/messages.mo

QRadar GUI アプリケーション・フレームワーク には、 app/translations/ フォルダーのサブディレクトリー内でロケール固有のファイルを検索するデフォルトの Flask 環境が用意されています。

アプリケーションがサポートする UTF-8 エンコード・ロケールを指定するには、 config.py ファイルを app/ フォルダーに追加します。 このファイルには、以下の例に類似する内容が含まれます。

# -*- coding: utf-8 -*-
# ...
# available languages
LANGUAGES = {
    'en': 'English',
    'es': 'Español',
    'fr': 'Français',
    'ja': '日本語'
}

このグローバリゼーション・サポート・ファイルは、指定したロケールごとに QRadar.mo ファイルを見つけるのに役立ちます。

.mo ファイルを作成した後、これらのリソースをアプリに同梱したくない場合は、.poファイル、.potファイル、および babel.py ファイルを削除できます。

views.py

__author__ = 'IBM'

from flask import render_template, send_from_directory, request
from app import app
from flask.ext.babel import gettext   1 
from config import LANGUAGES
from qpylib import qpylib

from flask.ext.babel import Babel   
babel = Babel(app)   2 

@babel.localeselector   3 
def get_locale():
    return request.accept_languages.best_match(LANGUAGES.keys())

@app.route('/')
@app.route('/index')
def index():
    qpylib.log(request.headers.get('Accept-Language', ''))
    return render_template("index.html", title = "QApp1 : Hello World !")

以下のリストで、views.py コード・スニペットの内容について説明します。

  1. gettext メソッドが Babel パッケージからインポートされます。この行はオプションですが、python tierから離れた場所でロケール・テキストを使用する場合に役立ちます。 この例の Jinja2 テンプレートでは、キー値を抽出するために gettext メソッドが使用されています。
  2. アプリケーションでロケール固有テキストをレンダリングできるようにするために、Flask アプリケーションが Babel コンテキストに組み入れられます。
  3. このコードでは、Babel localeselector 装飾子パターンがすべてのルート (つまり、QRadar から到着するすべての要求) に適用されます。デコレーターは、 app/config.py ファイルに定義されているロケールを使用して、最適な言語固有のキー・ファイルを着信要求に接続します。