Table of Contents
gtkmmアプリケーションでは簡単に多言語を扱うことができます。これには非ヨーロッパ言語である中国語や、右から左へ表記する言語であるアラビア語も含まれます。適切に製作・翻訳されたgtkmmアプリケーションは、実行時にユーザーの環境情報を元に適切な言語を使います。
開発者は必ずしも二つ以上の言語をサポートする必要はありません。しかし、ルールは必ず守ってください。後から手を入れるよりも最初の段階からアプリケーションを正しく開発したほうが簡単です。
翻訳が出来るようにソースコードを書くプロセスは、国際化(Internationalizing)と呼ばれ、しばしばi18nと短縮されます。地域化(Localization)プロセス、同様にl10nと短縮されるプロセスとは、別の言語に翻訳されたテキストをソースコードをもとに提供することです。
国際化プロセスでの主要な作業は、ユーザーの目に触れる文字列を見つけ、翻訳できるようにマークすることです。全ての作業を一気に行う必要はありません。必要なプロジェクトインフラを正しく設定してあれば、アプリケーションはカバーした文字列の数にかかわりなく普通に動作します。
文字列表記はソースコード中に英語で記述されなくてはいけませんが、それをあるマクロで囲んでください。gettextユーティリティ(またはintltool)は、翻訳用にマークされた文字列を抽出し、実行時に翻訳メッセージに置き換えます。
| Note | |
|---|---|
|
以下の説明では、gettextを直接使うのではなく、intltoolを使うことを仮定しています。これは さらに、ここではプロジェクトのビルドにautotools (automake, autoconf) を使用し、gnome-commonの |
プロジェクトのルートディレクトリにpoという名のサブディレクトリを作成してください。ここに全ての翻訳が入るようになります。ディレクトリの中に、LINGUASという名前のファイルとPOTFILES.inという名前のファイルを作成してください。さらに、これは慣習的な作業ですがpoディレクトリにChangeLogファイルを作成し、翻訳者が変更に追随できるようにしてください。
LINGUASにアルファベット順で言語コードを入れておき、どの言語が翻訳されるのか示します(#から始まる行はコメントであり無視されます)。
LINGUASに並べたどの言語コードにも対応する.poファイルがなくてはいけません。ですから、プログラムでドイツ語と日本語の翻訳を利用するのなら、LINGUASファイルはこのようになるでしょう:
# keep this file sorted alphabetically, one language code per line de ja
(こうしておいてさらに、ja.poとde.poファイルをpoディレクトリに入れておきます。それぞれのファイルはそれぞれの言語の翻訳を納めています)。
POTFILES.inは翻訳のためにマークした文字列のある全てのファイルのパスリストです。プロジェクトのルートディレクトリ順に並べてください。例えば、プロジェクトのソースがsrcという名前のサブディレクトリにあり、翻訳したい文字列を持ったファイルがふたつあるとします。POTFILES.inはこのようになるでしょう:
src/main.cc src/other.cc
直接gettextを使う場合、翻訳する文字列をマークできるのはそれらがソースコードファイルの中にあるときだけです。しかし、intltoolを使う場合では、他にも様々なフォーマットのファイルに対して翻訳する文字列をマークすることができます。使えるものにはGladeのUIファイル、XML、.desktopファイルなどが含まれます。ですから、アプリケーションのUIをGladeでデザインしたのならその.gladeファイルもPOTFILES.inのリストに加えてください。
さて、翻訳を入れるための場所はできました。次はintltoolとgettextを初期化する必要があります。以下のコードの'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の最上部で:
poをSUBDIRS変数に加えてください。こうしないと翻訳はビルドされませんし、プログラムを生成したときにインストールされません。
INTLTOOL_FILESを次のように定義してください:
INTLTOOL_FILES = intltool-extract.in \
intltool-merge.in \
intltool-update.in
INTLTOOL_FILESをEXTRA_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を初期化したときに使われます。