数か月前に gettext を使用していくつかのテストを実行したことを覚えていますが、次のコードは完全に機能しました。
putenv('LANG=l33t');
putenv('LANGUAGE=l33t');
putenv('LC_MESSAGES=l33t');
if (defined('LC_MESSAGES')) // available if PHP was compiled with libintl
{
setlocale(LC_MESSAGES, 'l33t');
}
else
{
setlocale(LC_ALL, 'l33t');
}
bindtextdomain('default', './locale'); // ./locale/l33t/LC_MESSAGES/default.mo
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');
echo _('Hello World!'); // h3110 w0r1d!
これは完全に機能しました (私の記憶が正しければ Windows XP と CentOS で)。これは、システムにインストールされているかどうかを気にすることなく、任意の「ロケール」を使用できるので良かったです。しかし、これはもう機能していないようです。なぜだろうか...
レッドハット + PHP 5.2.11:
さまざまなロケールから前後に切り替えることができ、setlocale()
呼び出しが false を返さない限り (ロケールが利用可能/システムにインストールされている場合)、翻訳は正しく表示されます。
これは完璧ではありません (ロケールの存在をテストせずに、gettext を任意の翻訳ディレクトリに向けることができれば素晴らしいことです) が、許容範囲内です。後でさらにいくつかのテストを実行します。
Windows 7 + PHP 5.3.1 (XAMPP):
setlocale()
、またはなどの有効な Windows ロケールを使用しない限り、 (LC_ALL
の代わりに使用している場合でも)常に false を返します。この場合、ロケールは正しく設定されているようですが、翻訳はまだ表示されません。何百ものタブを開いているので、今はテストできませんが、そのスクリプトへの最初の呼び出しで正しい翻訳が得られると思います (Apache を再起動してもうまくいきません)。LC_MESSAGES
eng
deu
ptg
これがPHP Bug #49349に関連しているかどうかはわかりません。これを数時間テストします。
gettext 拡張機能 ( php-gettextやZend Translate Adapterのような純粋な PHP 実装ではない) を異なるオペレーティング システム間で (おそらくのようなカスタムロケールで) 確実に使用する方法はありますl33t
か?
また、必ず使用する必要がありますsetlocale(LC_ALL, ...)
か?TIME
、NUMERIC
およびMONETARY
(特に)ロケール設定はそのままにしておくことをお勧めします(POSIX
ロケールをデフォルトに設定します)。
setlocale()
アイデアがありました...非常に一般的なロケール ( C
、POSIX
または など) で呼び出しen_US
、ドメインを介して言語を指定することは可能でしょうか? このようなもの:
/lang/C/LC_MESSAGES/domain.pt.mo
/lang/C/LC_MESSAGES/domain.de.mo
/lang/C/LC_MESSAGES/domain.en.mo
/lang/C/LC_MESSAGES/domain2.pt.mo
/lang/C/LC_MESSAGES/domain2.de.mo
/lang/C/LC_MESSAGES/domain2.en.mo
これは *nix および Windows プラットフォームで問題なく動作しますか?