デモサイト(さくら)で国際化が機能しない
gettextで国際化対応をしたStarbug1 1.2.10-beta をさくらインターネットにあるデモサイトでも動かそうと、さくらのStarbug1をバージョンアップした。
しかし、vine linuxとdebianでは問題無かったgettextが、FreeBSDだと機能していない。msgidとして指定した文字列が表示されるのみ。
原因を特定するために、いろいろ試してみた。
Starbug1のgettext関連の関数呼び出しに問題が無いか?
Starbug1でbindtextdomain, textdomain, setlocale関数の実行に失敗していないかを確認したところ、戻り値がNULLではなかったので、成功している様子。
関数呼び出しに加えて、メッセージカタログの配置などが問題ないか?
原因がわからない場合は、問題が起きないくらい小さいプログラムを用意するのがいいと思い、さくらにsshでログインして、HelloWorldレベルの国際化アプリを用意して試してみた。
しかし、これでも動かない。msgidが表示されるだけだった。
正しいソースなら、gettextが動くのか?
もう自分が書いたソースでは、FreeBSDでgettextを動かすことができないと判断して、gettextを使っているソフトウェアを動かしてみた。
$ LANG=ja_JP.eucJP gettext --help 使用法: gettext [オプション] [[TEXTDOMAIN] MSGID] または: gettext [オプション] -s [MSGID]... 原文のメッセージの自国語翻訳を表示. -d, --domain=TEXTDOMAIN TEXTDOMAIN から翻訳されたメッセージを取り出す ....
動いた(gettextが機能して日本語が表示された)。FreeBSDでは、環境変数LANGによるロケールの指定は可能だが、setlocale関数によるロケールの指定はできないということになる。これは、レンタルサーバの制限なのか、FreeBSDがそうゆうものなのかわからない。
解決策
setlocale関数のロケール指定だけでなく、環境変数LANGのロケールを書き換えてしまうことにした。
setenv("LANG", locale, 1); /* 強制的に環境変数を書き換える。 */ setlocale(LC_ALL, locale); bindtextdomain("starbug1", "locale"); textdomain("starbug1");
しかし、この方法はマナー違反のような気もしてる。
これで、ようやく、さくらインターネットのFreeBSD上に配置してあるデモサイトで、1.2.10-betaの機能を確認してもらえるようになりました。
デモサイトは↓からどうぞ。