Contents Up Previous Next

国際化

アプリケーションの国際化 (略して i18n) には単にテキストメッセージを他のメッセージに翻訳すること以上のことが含まれます。日付や時間、通貨の形式も変更する必要がありますし、ある言語は左から右へ、別の言語では右から左へ表記するでしょう。文字コードも異なりますし、他にもたくさんのことを変更する必要がありますが、これは必要な最初のステップです。wxWidgets は wxLocale クラスを使用したメッセージ翻訳機能を提供しており、wxWidgets 自体がいくつかの言語に完全に翻訳されています。最新の翻訳版は wxWidgets のホームページを参照してください。そして、あなたが wxWidgets をまだ翻訳されていない言語に翻訳した場合、私達はそれを将来のバージョンに含めることを喜んで承認するでしょう!

wxWidgets の採用している国際化の方法は GNU gettext パッケージの方式に従っています。wxWidgets では gettext のカタログとバイナリ互換性のあるメッセージカタログを使用します。これにより、メッセージカタログを扱う際に gettext のすべてのプログラムを使用できます。しかし、実行時には追加のライブラリは必要ないため、メッセージカタログの他には何も配布する必要がないことに注意してください。

プログラム開発を行なっている間はメッセージカタログを扱うために gettext パッケージが必要となります。注意: gettext バージョン < 0.10 はバグが多いため、最新版を利用するべきです!

メッセージカタログには次の 2 種類があります: 拡張子が .po でテキスト形式のソースカタログと、ソースカタログから msgfmt プログラム (gettext パッケージの一部です) を使って生成する、拡張子が .mo のバイナリカタログです。プログラム実行時にはバイナリファイルだけが必要です。

プログラムの国際化にはいくつかのステップが含まれます:

  1. wxGetTranslation か、それと同じように _() マクロを利用してプログラム中のテキストを 翻訳する
  2. 翻訳対象の文字列をプログラム中から抽出する: これには前のステップで行った作業の結果を利用します。なぜなら、文字列の抽出に使用する xgettext プログラムが標準的な _() や (-k オプションを使用することで) wxGetTranslation を識別し、それらの中にある文字列をすべて抽出してくれるためです。代わりに -a オプションを使用することもできますが、そうするとまったく翻訳する必要のない文字列が大量に見つかることになるでしょう。これにより、テキスト形式のメッセージカタログ (.po ファイル) が生成されます。
  3. 前のステップで抽出した文字列を別の言語に翻訳する。これは .po ファイルを編集することで行います。
  4. .po ファイルをプログラムから使用される .mo ファイルにコンパイルする。
  5. あなたのプログラムと一緒に .mo ファイルを対象システム内の適切な場所 (wxStandardPaths::GetLocalizedResourcesDir(wxStandardPaths::ResourceCat_Messages) の返却する場所) にインストールする。このデフォルトの場所にメッセージカタログをインストールしない場合、明示的に AddCatalogLookupPathPrefix() を使用することで wxWidgets がその場所を探すようになります。ただし、デフォルトのディレクトリを使用することを強く推奨します。
  6. 与えられた言語の文字列を使用するように、プログラム内で適切なロケールを設定する: wxLocale を参照してください。

GNU gettext のドキュメントも参照してください。これは wxWidgets の配布物の中にある docs/html/index.htm からリンクしています。

非英語アプリケーションの作成 も参照してください。文字コードに関連した問題について取り組む場合には。

最後に、国際化を実際にどういう風に行うのかを示す例として i18n サンプル を参照してください。

メニューアクセラレータの翻訳

もしメニューラベル内のアクセラレータの修飾子名 ( Ctrl、Alt、Shift) を翻訳した場合、アクセラレータが動作しなくなることに気がつくでしょう。 メッセージカタログでは、修飾子の名前を小文字にしたもの (ctrl、alt、shift) とは別の名前に翻訳する必要があります。これによって、 wxWidgets がそれらの名前を翻訳されたものとして認識できるようになります。修飾子の翻訳について、今のところ wxWidgets はすべてに対応しているわけではありません。Backspace、End、Insert といった特殊キーの名前が翻訳された場合、wxWidgets はまだ取り扱うことができません。