Windows 専用の PHP Web アプリケーションをローカライズする必要があり、gettext 拡張機能を評価していますが、Windows 7 開発ボックスで動作させるのに最も苦労しています。私はProcess Monitorと一緒に試行錯誤を繰り返して貧弱で不正確なドキュメントを克服_()
し、コンピューターのデフォルト ロケール (私の場合は現代スペイン語) に対応する *.po カタログから表示文字列を作成することができました。別のロケールを設定しようとする試みはすべて、黙って無視されます。
多くの冗長なものを含むテスト スクリプトを作成しました。
<dl><?php
define('DIR_LOCALE', __DIR__ . DIRECTORY_SEPARATOR . 'locale');
bindtextdomain('general', DIR_LOCALE);
bind_textdomain_codeset('general', 'UTF-8');
textdomain('general');
if(!defined('LC_MESSAGES')){
define('LC_MESSAGES', 5);
}
$pruebas = array(
'enu',
'es_ES',
'en_GB',
'english-uk',
'Spanish_Spain.1252',
'esn',
'spanish',
'spanish-modern',
);
foreach($pruebas as $locale){
putenv("LC_ALL=$locale");
setlocale(LC_ALL, $locale);
putenv("LC_MESSAGES=$locale");
setlocale(LC_MESSAGES, $locale);
putenv("LANGUAGE=$locale");
putenv("LANG=$locale");
?>
<dt><?=htmlspecialchars($locale)?></dt>
<dd><?=_('codigo_idioma')?></dd>
<?php } ?>
</dl>
私の場合、<?=_('codigo_idioma')?>
常に印刷されes_ES@modern
ます。
私は PHP/5.4.5 を持っていますが、顧客が所有する適度に最新のサーバーで動作することを期待しています。
Windows でもロケールをインストールする必要があるというあいまいなリファレンスをたくさん読みましたが、正確な詳細はありません。問題は何ですか?
(一般的なアドバイスは、gettext をダンプして他のライブラリを使用することであることは承知しています。)
さらなるテスト:
私のコードは、別の 2 台のコンピューター (32 ビット Windows Vista と 32 ビット Windows 7 32 ビット) で問題なく動作します。私のコンピューター (64 ビット Windows 7) と別のコンピューター (32 ビット Windows Server 2003) で失敗します。
- Apache のバージョンは関係ないようです (コマンドライン インタープリターでも発生します)。
- PHP のバージョンは関係ないようです (最新の 32 ビット PHP/5.5.5 も PC で試しました)。
- 私の
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls]
レジストリ ツリーは、他のセブン ボックスと同じです。
編集:コマンドラインでテストしているときにLANG
、PHP スクリプトを実行する前に環境変数を設定すると、最終的に言語が変更されることがわかりました。
C:\>set LANG=en_GB
C:\>php C:\test\gettext.php
これは、私のコンピューターが正しい資産を持っていることを明確に証明していますが、PHP が機能すると主張しputenv()
、それを無視する理由も不思議に思います。
var_dump( getenv('LANG'), putenv('LANG=en_GB'), getenv('LANG') );
bool(false)
bool(true)
string(5) "en_GB"
これでも何の効果もありません:
$_ENV['LANG'] = 'en_GB';
$_SERVER['LANG'] = 'en_GB';