wxWidgets(wxWindows)ではロケールの設定が簡単にできますので,
様々な言語に対応したアプリケーションを簡単に作成できます.
上の図のように,同じバイナリが元でも実行環境の言語設定によって
表示する文字列を変えることができます.
が,日本語アプリケーションを英語に対応させようとすると
うまくいかない部分が出ました・・・.
それと,UNIXの場合は全て推測です.実際に試してないので要注意です.
wxWidgetsでロケールの設定をする時に重要になるクラスが「wxLocale」です.
ロケールに関する設定はこのクラスを通して全てする事になります(多分).
このクラスを初期化する時に与えてやるパラメータは,使用する言語です.
wxLANGUAGE_DEFAULTを渡してやれば実行環境に合わせた言語にしてくれるようです.
この場合,Windowsなら「地域と言語のオプション」*1
,X.orgなら「.xsession」のLANGUAGEを見ているような気がします.
*2
もし,どんな環境でも日本語・英語が良い!という方は, 「wxLANGUAGE_JAPANESE」
みたいな指定もできます.が,通常はDEFAULTを使って問題はないと思います.
初期化のタイミングですが,ロケールを参照するより早く初期化しなければなりません.
で,コマンドライン引数の処理の段階でロケールを参照する事があるようなので
wxApp::OnInit()よりも早く初期化しなければなりません.
素直な方法ではこれは難しいのですが
class MyApp : public wxApp
{
wxLocale m_Locale;
public:
///OnInitが呼ばれる前にlocaleを作る
MyApp() : m_Locale(wxLANGUAGE_DEFAULT){}
//続く
こんな感じにするのが流行のようです.
これでwxLocaleの初期化は完了です.
メッセージカタログとは多言語に変換する為に参照する辞書のような物です.
元の言語が英語の場合,それに対応する日本語を保存しておきます.
このカタログに使われる.moファイルは憎っき*3gettextが使う物と互換性のある物です.
よって,xgettextやpoEdit*4といったソフトでメッセージカタログを作成する事ができます.
poEditではGUI環境で複数のメッセージカタログの管理も可能でとても便利です.
メッセージカタログの詳しい作り方は今度書きます.ごめんなさい.
./locale/ja/LC_MESSAGES/catalog.mo
というファイルを作っておいてください.UNIXなら「/usr/local/share/locale/ja/LC_MESSAGES/catalog.mo」の方が行儀いいかも.
まずはメッセージカタログの場所を指定してやります.
UNIXの場合「/usr/local/share/locale/ja/LC_MESSAGES/」に置いてやれば勝手に探してきてくれますが,
Windowsではそういう場所が決まっていないので,自分で指定してやります.
m_Locale.AddCatalogLookupPathPrefix(wxT("locale\\"));
こんな感じ.第1引数にlocaleフォルダの位置を書きます.
メッセージカタログは
<指定したフォルダ>/<言語(jaとかes)>/LC_MESSAGES/*.mo <指定したフォルダ>/LC_MESSAGES/*.mo
な場所に置く事になります.
次にwxLocaleクラスにどのメッセージカタログを使用するかを登録してやります.
m_Locale.AddCatalog(wxT("catalog"));
こんな感じ.この処理はwxApp::OnInit()内でOKです.
第1引数にはカタログの名前を入れます.
<指定したフォルダ>/<言語(jaとかes)>/LC_MESSAGES/*.mo
の*の部分に入る単語を入れてあげればOKです.
実行時に翻訳する文字列は,_()マクロで囲んでやればOKです.
_("hello, world!")
こんな感じです.こうしておくと,メッセージカタログを読んで実行時に勝手に別の言語にしてくれます.
#include <wx/wxprec.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
//ここまではwxWidgetを使う為のおまじない
class MyApp : public wxApp
{
wxLocale m_Locale;
public:
///OnInitが呼ばれる前にlocaleを作る
MyApp() : m_Locale(wxLANGUAGE_DEFAULT){}
bool OnInit();
};
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
//ここから始まる
//ロケール関係
#ifdef __WXMSW__ //Windowsだけ
// wxMSW 2.4.0 does not search the directory of the executable
// by default.
//カタログのパスを指定
m_Locale.AddCatalogLookupPathPrefix(wxT("locale\\"));
#endif
m_Locale.AddCatalog(wxT("catarog"));
wxFrame *frame = new wxFrame((wxFrame*)NULL, -1, _("hello, world!"));
frame->Show(TRUE); //表示
SetTopWindow(frame); //トップウィンドウに指定
return true;
}
これだけでできちゃいます.意外と簡単.
よく分かりません.poEditはShift-JISに対応していないので,
ソースコードをUTF-8で保存する必要がありますが,
VC+wxWidgets+UTF-8の組み合わせは動かない・・・.ちょっと調べてみます.
分からない内は英語版を作って,日本語訳を考える事になります.最悪.
プログラミングに戻る