Chapter 24. 国際化と地域化

Table of Contents

gtkmmアプリケーションでは簡単に多言語を扱うことができます。これには非ヨーロッパ言語である中国語や、右から左へ表記する言語であるアラビア語も含まれます。適切に製作・翻訳されたgtkmmアプリケーションは、実行時にユーザーの環境情報を元に適切な言語を使います。

開発者は必ずしも二つ以上の言語をサポートする必要はありません。しかし、ルールは必ず守ってください。後から手を入れるよりも最初の段階からアプリケーションを正しく開発したほうが簡単です。

翻訳が出来るようにソースコードを書くプロセスは、国際化(Internationalizing)と呼ばれ、しばしばi18nと短縮されます。地域化(Localization)プロセス、同様にl10nと短縮されるプロセスとは、別の言語に翻訳されたテキストをソースコードをもとに提供することです。

国際化プロセスでの主要な作業は、ユーザーの目に触れる文字列を見つけ、翻訳できるようにマークすることです。全ての作業を一気に行う必要はありません。必要なプロジェクトインフラを正しく設定してあれば、アプリケーションはカバーした文字列の数にかかわりなく普通に動作します。

文字列表記はソースコード中に英語で記述されなくてはいけませんが、それをあるマクロで囲んでください。gettextユーティリティ(またはintltool)は、翻訳用にマークされた文字列を抽出し、実行時に翻訳メッセージに置き換えます。

プロジェクトを準備する

[Note] Note

以下の説明では、gettextを直接使うのではなく、intltoolを使うことを仮定しています。これはGNOME用に特別に製作されたものです。intltoolgettext()関数を使ってソースコードから文字列を抽出しますが、それだけではなく他のファイルの文字列にも標準のgettext.pot/.poファイルを入れ込むことができます。他のファイルには、例えばデスクトップメニューの説明ファイルやGladeファイルのようなGUIリソースファイルがあります。

さらに、ここではプロジェクトのビルドにautotools (automake, autoconf) を使用し、gnome-common./autogen.shという、その他のツールやintltool初期化の面倒をみてくれるツールを使うことも仮定します。

プロジェクトのルートディレクトリにpoという名のサブディレクトリを作成してください。ここに全ての翻訳が入るようになります。ディレクトリの中に、LINGUASという名前のファイルとPOTFILES.inという名前のファイルを作成してください。さらに、これは慣習的な作業ですがpoディレクトリにChangeLogファイルを作成し、翻訳者が変更に追随できるようにしてください。

LINGUASにアルファベット順で言語コードを入れておき、どの言語が翻訳されるのか示します(#から始まる行はコメントであり無視されます)。 LINGUASに並べたどの言語コードにも対応する.poファイルがなくてはいけません。ですから、プログラムでドイツ語と日本語の翻訳を利用するのなら、LINGUASファイルはこのようになるでしょう:

# keep this file sorted alphabetically, one language code per line
de
ja

(こうしておいてさらに、ja.pode.poファイルをpoディレクトリに入れておきます。それぞれのファイルはそれぞれの言語の翻訳を納めています)。

POTFILES.inは翻訳のためにマークした文字列のある全てのファイルのパスリストです。プロジェクトのルートディレクトリ順に並べてください。例えば、プロジェクトのソースがsrcという名前のサブディレクトリにあり、翻訳したい文字列を持ったファイルがふたつあるとします。POTFILES.inはこのようになるでしょう:

src/main.cc
src/other.cc

直接gettextを使う場合、翻訳する文字列をマークできるのはそれらがソースコードファイルの中にあるときだけです。しかし、intltoolを使う場合では、他にも様々なフォーマットのファイルに対して翻訳する文字列をマークすることができます。使えるものにはGladeのUIファイル、XML、.desktopファイルなどが含まれます。ですから、アプリケーションのUIをGladeでデザインしたのならその.gladeファイルもPOTFILES.inのリストに加えてください。

さて、翻訳を入れるための場所はできました。次はintltoolgettextを初期化する必要があります。以下のコードの'programname'の部分をプロジェクトのプログラム名で置き換え、configure.acに加えてください。

IT_PROG_INTLTOOL([0.35.0])

GETTEXT_PACKAGE=programname
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], ["$GETTEXT_PACKAGE"],
                   [The domain to use with gettext])
AM_GLIB_GNU_GETTEXT

PROGRAMNAME_LOCALEDIR=[${datadir}/locale]
AC_SUBST(PROGRAMNAME_LOCALEDIR)

このPROGRAMNAME_LOCALEDIR変数はこの後Makefile.amファイルで使われます。これはソースコードでgettextを初期化したときに使われるマクロを定義するものです。

Makefile.amの最上部で:

  • poSUBDIRS変数に加えてください。こうしないと翻訳はビルドされませんし、プログラムを生成したときにインストールされません。

  • INTLTOOL_FILESを次のように定義してください:

    INTLTOOL_FILES = intltool-extract.in \
                     intltool-merge.in \
                     intltool-update.in

  • INTLTOOL_FILESEXTRA_DISTファイルリストに加えてください。こうすることでmake distとしたとき、これらのコマンドがソースTarボールのなかに含まれるようになります。

  • DISTCLEANFILESを更新してください:

    DISTCLEANFILES = ... intltool-extract \
                     intltool-merge \
                     intltool-update \
                     po/.intltool-merge-cache

プロジェクトのsrc/Makefile.amにおいて、AM_CPPFLAGSに以下のマクロ定義を加えて更新してください:

AM_CPPFLAGS = ... -DPROGRAMNAME_LOCALEDIR=\"${PROGRAMNAME_LOCALEDIR}\"

このマクロはソースコードでgettextを初期化したときに使われます。