翻訳のために文字列をマークする

文字列表記はソースコードの中では英語で書かなくてはいけませんが、それらをgettext()の呼び出しで囲んでください。そうした文字列は翻訳のために抽出され、実行時にオリジナルの英語の代わりに翻訳を使えるようになります。

GNU gettextパッケージを使えば、ソースコード中の文字列のマーク、翻訳のための抽出、アプリケーションでの翻訳文字列の使用を行うことができます。

ところで、Glibではgettext()の補助マクロには短いラッパー関数が使い易い形で定義されています。マクロを使うには<glibmm/i18n.h>ヘッダをインクルードし、このように:

display_message("Getting ready for i18n.");

display_message(_("Getting ready for i18n."));

で置き換えてください。

参考として、コードに存在する全ての文字列を含むようなファイルを生成することが可能です。これには翻訳用にマークされていない文字列も含まれ、ファイルネームと行番号の参照も付きます。そのようなファイルをmy-stringsという名前で生成するには、次のコマンドをソースコードのディレクトリ内で実行してください:

xgettext -a -o my-strings --omit-header *.cc *.h

最後に、プログラムが現在のロケールにあわせて翻訳を使えるように、このコードをmain.ccファイルの先頭に加えてください。これはgettextを初期化するものです。

bindtextdomain(GETTEXT_PACKAGE, PROGRAMNAME_LOCALEDIR);
bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
textdomain(GETTEXT_PACKAGE);

gettextの仕組み

intltool / xgettextスクリプトは文字列を抽出し、それらをmypackage.potファイルに納めます。アプリケーションの翻訳者が文字列の翻訳を作成するには、まずこの.potファイルをlocalename.poファイルにコピーすることで行います。ロケールは言語とそのエンコーディングを、日時や数字フォーマットを含めて識別します。後からソースコードのテキストが変更された場合、msmergeスクリプトが、再生成された.potファイルからlocalename.poを更新するのに使われます。

インストールの段階では.poはバイナリフォーマットに変換され(.moという拡張子になります)、ロケールファイルのためのシステム全般のディレクトリに配置されます。例えば、/usr/share/locale/などにです。

アプリケーションが動作すると、gettextライブラリはこのシステム全般のディレクトリをチェックし、ユーザーのロケール環境にあう.moファイルがあるかどうか探します(ロケールは例えば、bashコンソールから"export LANG=de_DE.UTF-8"として設定することができます)。そしてプログラムがgettext呼び出しに差し掛かると、ライブラリはその文字列の翻訳を探します。何も見つからなければオリジナルの文字列が使われます。

翻訳をテストして追加する

以上のことがうまくいったとして、また別に新たなロケールのための翻訳を追加したくなるかもしれません。そうするにはプロジェクトのpoサブディレクトリに移動し、次のコマンドを実行してください:

intltool-update --pot

これはprogramname.potという名前のファイルを生成します。このファイルをlanguagecode.poとしてde.poとかhu.poなどのようにコピーしてください。それからその言語コードをLINGUASに加えます。.poファイルにはヘッダと英語の文字列のリストが入っています。翻訳文字列を入力するためのスペースもあります。この.poファイルのエンコーディングがUTF-8になっているかどうか確認してください(ヘッダで指定していますが中身もそうしてください)。

[Note] Note

.poの中で、文字列を曖昧である(fuzzy)とマークすることもできます。そうした翻訳はオリジナルの文字列を置き換えません。文字列を表示するにはただfuzzyタグを除去してください。

リソース

国際化と地域化プロセスの基礎にあるものについてより詳しい情報は、以下のもので説明されており、実例があります: