カテゴリー: SoftwareEngineering

gettextとは

Gettextは、国際化(internationalization(I18N)) と地域化(localization(L10N))のためのライブラリです。

目標

gettextとは何か、どのように使用するかを理解する。

gettextとは何か

gettextはソフトウェアの翻訳のためのライブラリです。PythonやC/C++, Java, PHP, JavaScriptで使用するソフトウェア中の文章を多言語対応させることができます。

pot ファイル

potファイルは、翻訳の為のテンプレートファイルです。このファイルで、翻訳する文章を定義しています。

po ファイル

potフォイルで定義された文章リストを各言語で翻訳したものが、poファイルです。

mo ファイル

moファイルは、poファイルから生成されたバイナリファイルです。

domain(ドメイン)

ドメインは、gettextが翻訳のテンプレをみつけるための識別子であり、固有の名前をつけます。

Pythonにおけるgettextの使い方

gettext モジュールを使用します。

方法1. GNU gettext API

この方法は、LinuxまたはUnixのみで使用することができます。なぜなら、この方法では、環境変数LANGUAGE, LC_ALL, LC_MESSAGESを使用している為です。
参照: GNU gettext API

1. ソースファイル”gettext_test.py”を作成します。

bindtextdomain()の引数’myapplication’がドメインとなります。’locale_dir’は、moファイルのあるディレクトリへのパスです。

import gettext

gettext.bindtextdomain('myapplication', 'locale_dir')
gettext.textdomain('myapplication')
_ = gettext.gettext
print (_('Hello World!'))

2. Python<バージョン>(Python36など)/Tools/i18nというディレクトリにあるpygettext.pyを使って、<ドメイン名>.potファイルを作成します。potファイルmyapplication.pot が指定した”locale_dir”の中に作成されます。

python Python<version>/Tools/i18n/pygettext.py -d myapplication -p locale_dir gettext_test.py

以下が生成されたmyapplication.potです。

# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR ORGANIZATION
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.

msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSIONn"
"POT-Creation-Date: 2020-07-20 01:35+0900n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>n"
"Language-Team: LANGUAGE <LL@li.org>n"
"MIME-Version: 1.0n"
"Content-Type: text/plain; charset=cp932n"
"Content-Transfer-Encoding: 8bitn"
"Generated-By: pygettext.py 1.5n"

#: gettext_test.py:7
msgid "Hello World!"
msgstr ""

3. poファイルを作成し、languageディレクトリに入れます。

potファイルのcharsetをutf-8に変更し、翻訳を入力してmyapplication.poという名前をつけて保存します。今回の例では、日本語の”こんにちは世界!”をmsgstrに入力しました。

# SOME DESCRIPTIVE TITLE.
.
.
.
"Content-Type: text/plain; charset=utf-8n"
.
.
.
#: gettext_test.py:7
msgid "Hello World!"
msgstr "こんにちは世界!"

作成したmyapplication.poを<指定したディレクトリ>/language/LC_MESSAGESというディレクトリの中に入れます。

languageというのは、<language codes>_<country codes>で指定されます。今回は日本語なので、locale_dir/ja_JP/LC_MESSAGESとなります。
language codeとcountry codeのリストはこちらのリンクにあります: ISO-3166 Country Codes and ISO-639 Language Codes

4. poファイルからmoファイルを生成します。Python<バージョン>(Python36など)/Tools/i18n/nmsgfmt.pyを使用します。

python Python<version>/Tools/i18n/msgfmt.py myapplication.p

以下が、最終的なファイル構造となります。

5. gettext_test.pyを実行します

python gettext_test.py
こんにちは世界!

方法2. Class-based API

この方法は、LinuxとUnix、Windowsで使用することができます。
参照: Class-based API

1. “gettext_test.py”を作成する

この方法では、translation()を使用します。引数’myapplication’がドメインであり、’locale_dir’がmoファイルの存在するディレクトリです。

import os
import gettext

_ = gettext.translation(
    domain='myapplication',
    localedir = 'locale_dir',
    languages=['ja_JP'], 
    fallback=True).gettext

print (_('Hello World!'))

残りの処理は、上記の”Method 1. GNU gettext API”と同じです。

2. pygettext.pyを使って<domain>.potを作成します

3. poファイルを作成し、languageディレクトリ<ディレクトリ名>/language/LC_MESSAGESに保存します。

4. Python<バージョン>/Tools/i18n/msgfmt.pyを使って、poファイルからmoファイルを生成します

5. gettext_test.pyを実行します。

python gettext_test.py
こんにちは世界!