試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

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

関連記事:

使用したバージョン: