Pythonでgettextによるメッセージ国際化を用いる上でのgettext.install()に関する追加メモ(後半)
「Pythonでgettextによるメッセージ国際化を用いる上でのgettext.install()に関する追加メモ(前半)」の続きとして、「Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(作業の流れと動作確認・前半)」と同様の例を貼り付ける。
下の例は文字列についてメンバ関数format()を用いているため、実行にはバージョン2.6以上(3系含む)のPythonが必要。
[任意]ファイル名: bin/gettexttest2.py
#! /usr/bin/python # -*- coding: utf-8 -*- import gettext import os # ドメイン(パッケージ)名と.moファイルの場所を指定して、gettextを使用できるようにする # 引数namesはgettext.ngettext()を組み込み名前空間に組み込んで「ngettext」として使えるようにする指定 # (組み込み名前空間は「.」を付けずに表現可能な名前空間) # gettext,ngettext,lgettextのいずれかを含む文字列のシーケンス(リストやタプル)を指定 gettext.install ('gettexttest2', os.path.join (os.path.dirname (os.path.dirname (os.path.realpath (os.path.realpath (__file__)))), 'share', 'locale'), names=('ngettext',)) # gettext.install()を使用しない場合の一連の処理 # from gettext import gettext as _ # 組み込み名前空間の_()関数としてgettext.gettext()関数を用いる # from gettext import ngettext # gettext.ngettext()関数を組み込み名前空間に組み込む # gettext.bindtextdomain ('gettexttest2', os.path.join (os.path.dirname (os.path.dirname (os.path.realpath (__file__))), 'share', 'locale')) # gettext.textdomain ('gettexttest2') # 通常のメッセージ # TRANSLATORS: comment string print (_('message')) # フォーマット str = 'test' print (_('string: {0}').format (str)) # 数の表現 # ngettext()は単数用パターンと複数用パターンを扱える # 「gettext.ngettext()」とすると英語のままとなる items = 1 # 単数扱い print (ngettext ('{0:d} item', '{0:d} items', items).format (items)) items = 2 # 複数扱い print (ngettext ('{0:d} item', '{0:d} items', items).format (items)) items = 0 # 複数扱い print (ngettext ('{0:d} item', '{0:d} items', items).format (items)) # 順番が逆転する例 # バージョン2.6系以上で使用可能な文字列メソッドformat()では順番が指定できるので # 翻訳文字列側で数字を入れ替えることができる # 波括弧に名前が含まれる場合はキーワード引数で中身を指定する形(辞書ではない) aaa = 'A' bbb = 'B' print (_('{0} by {1}').format (aaa, bbb)) print (_('{xxx} by {yyy}').format (xxx=aaa, yyy=bbb))
xgettextで生成した.potフファイルは下のようになる。
[任意]ファイル名: po/gettexttest2.pot
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR myname # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: gettexttest2 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-02-22 00:00+0900\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" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #. TRANSLATORS: comment string #: ../bin/gettexttest2.py:21 msgid "message" msgstr "" #: ../bin/gettexttest2.py:25 msgid "string: {0}" msgstr "" #: ../bin/gettexttest2.py:31 ../bin/gettexttest2.py:33 #: ../bin/gettexttest2.py:35 msgid "{0:d} item" msgid_plural "{0:d} items" msgstr[0] "" msgstr[1] "" #: ../bin/gettexttest2.py:43 msgid "{0} by {1}" msgstr "" #: ../bin/gettexttest2.py:44 msgid "{xxx} by {yyy}" msgstr ""
下は上の.potファイルをもとに翻訳したファイルの例。
[任意]ファイル名: po/ja.po エンコーディング: UTF-8
# Japanese translations for gettexttest2 package. # Copyright (C) 2011 myname # This file is distributed under the same license as the gettexttest2 package. # <myname@domain.tld>, 2011. # msgid "" msgstr "" "Project-Id-Version: gettexttest2 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-02-22 00:00+0900\n" "PO-Revision-Date: 2011-02-22 00:00+0900\n" "Last-Translator: <myname@domain.tld>\n" "Language-Team: Japanese\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #. TRANSLATORS: comment string #: ../bin/gettexttest2.py:21 msgid "message" msgstr "メッセージ" #: ../bin/gettexttest2.py:25 msgid "string: {0}" msgstr "文字列: {0}" #: ../bin/gettexttest2.py:31 ../bin/gettexttest2.py:33 #: ../bin/gettexttest2.py:35 msgid "{0:d} item" msgid_plural "{0:d} items" msgstr[0] "{0:d} 個の項目" #: ../bin/gettexttest2.py:43 msgid "{0} by {1}" msgstr "{1} による {0}" #: ../bin/gettexttest2.py:44 msgid "{xxx} by {yyy}" msgstr "{yyy} による {xxx}"
下は実行例。「xgettext()」として呼び出した部分(「個の項目」を含む行)が日本語になっていることが分かる。
メッセージ 文字列: test 1 個の項目 2 個の項目 0 個の項目 B による A B による A
関連記事:
- Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(作業の流れと動作確認・前半)
- Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(作業の流れと動作確認・後半)
- Pythonでgettextを使用してNLS(Native Language Support)によるメッセージの国際化を行う(Pythonのコードについて)
- Pythonのimport文について
- バージョン2.6/3.0系以上のPythonにおける新しい文字列のフォーマット付けについて(前半)
- バージョン2.6/3.0系以上のPythonにおける新しい文字列のフォーマット付けについて(後半)
- Pythonでgettextによるメッセージ国際化を用いる上でのgettext.install()に関する追加メモ(前半)
使用したバージョン:
- Python 2.6.6, 3.1.2