なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

wxWidgetsでの日本語の表示

追記:2012/01/23 現在wxWidgetsはソースをUTF-8で書けば日本語をそのままwxStringに入れることができます。よって以下の記述はアプリケーションの国際化のためだと思ってください。国際化ってのはひとつのアプリケーションで英語、ドイツ語、フランス語バージョンを作れるってことね。


===


さて、wxWidgets自体は導入できたが、アプリケーションに日本語を表示させるにはどうしたらよいのか。以下のサイトを見ると、その工程がめんどくさいことだけはわかる。
wxWidgetsでの国際化(翻訳) | あるデベロッパーの空間
プログラミング/C_C++/wxWidgets/多国語対応にしてみる - Flightless wing

とにかくそのままでは日本語を表示できないので、
たとえば一番簡単なHelloWorldのコードなら「_T("Minimal wxWidgets App")」→「_("Minimal wxWidgets App")」と編集して

$ xgettext --from-code=utf-8 -k"_" minimal.cpp  //messages.poができる
$ msginit --locale=ja --input=messages.po      //ja.poができる。適当なエディタ編集

※xgettextを使うにはgettextが必要。まず最初にmsysのsourceforgeで配布されてるバイナリを使おうとしたんだが、依存関係の欠如でうまくいかなかった。じゃあソースからコンパイルできるのかってことで、やってみたけどこれがまたキツイ。0.17はバグがあるので手直しが必要。gettextMinGWだけでコンパイルすることはできるんかね…?。公式のREADMEにmno-cygwinオプションを使ってconfigureするよう書いてある。gettextにはlibiconvが必要なので、もしgettextをソースからコンパイルする場合はiconvをまず作らなければいけない(…はず?)。自分は諦めてcygwinからxgettextを使った。cygwinの最初のセットアップでgettextのパッケージを入れておいたので普通に使えた。(もちろんcygwinとmsysをいちいち起動するのではなく、環境変数cygwinを追加しておくのですよ。。。)

2011/09/03追記:xgettextはmingwのパッケージにちゃんと含まれている。ビルドしなくてもよい。

"Content-Type: text/plain; charset=ASCII\n" → "Content-Type: text/plain; charset=UTF-8\n"

#: minimal.cpp:35
msgid "hello, world!"
msgstr "こんにちは、世界!"

※ja.poを編集したあとファイルの文字コードUTF-8に変えるのだが、その時にファイルの先頭にバイナリ単位でゴミが混じる。バイナリエディタでその部分を削る必要がある。
※追記:私はTeraPadを使っているのだが、保存時にUTF-8とUTF-8Nを選べる。普通のUTF-8にはファイルの先頭に目印となるコードがつくらしい(参考:utf8とutf8Nって? (タスクマザー))。こいつがmsgfmtを使う際に邪魔になる。この現象に困っているのは日本人だけではないことがググッたらわかるのだが…とりあえずUTF-8Nで保存しておけばいいでしょう。

試しにここプログラミング/C_C++/wxWidgets/多国語対応にしてみる - Flightless wingにあるコードをちょっといじって

$ msgfmt ja.po -o minimal.mo

あとはコードの中で指定した位置にminimal.moを置いてコンパイルすればいけるはず。

ここまでの行程はMinGW/MSYS での wxWidgets について - PukiWikiここにも書いているように、最初のwxWidgetsコンパイルの際に --enable-unicodeを指定しておく必要があると思う。