Gettext将始终使用系统默认语言环境

Álv*_*lez 10 php windows apache gettext

我需要本地化一个仅限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>
Run Code Online (Sandbox Code Playgroud)

在我的情况下,<?=_('codigo_idioma')?>总是打印es_ES@modern.

我有PHP/5.4.5但是我希望它可以在客户拥有的任何合理的最新服务器上运行.

我已经阅读了许多关于即使在Windows上也需要安装语言环境的模糊引用,但没有确切的细节.问题是什么?

(我知道常见的建议是转储ge​​ttext并使用任何其他库.)


进一步测试:

我的代码在另外两台计算机上完美无瑕地运行:32位Windows Vista和32位Windows 7 32位.它在我的计算机(64位Windows 7)和另一台(32位Windows Server 2003)中失败

  • Apache版本似乎无关紧要(它也发生在命令行解释器上).
  • PHP版本似乎无关紧要(在我的电脑中也试过最新的32位PHP/5.5.5).
  • 我的[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls]注册表树与其他七个框相同.

编辑:在命令行上进行测试时,我发现LANG在运行PHP脚本之前设置环境变量最终会更改语言:

C:\>set LANG=en_GB
C:\>php C:\test\gettext.php
Run Code Online (Sandbox Code Playgroud)

这最终证明我的计算机具有正确的资产,但也让我想知道为什么PHP声称putenv()有效,然后忽略它:

var_dump( getenv('LANG'), putenv('LANG=en_GB'), getenv('LANG') );
Run Code Online (Sandbox Code Playgroud)
bool(false)
bool(true)
string(5) "en_GB"
Run Code Online (Sandbox Code Playgroud)

即使这没有任何影响:

$_ENV['LANG'] = 'en_GB';
$_SERVER['LANG'] = 'en_GB';
Run Code Online (Sandbox Code Playgroud)

Álv*_*lez 6

这是一个由PHP团队承认并部分修复问题.

这是一个相当技术性的事情,显然与底层平台处理环境变量(gettext严重依赖)的方式有关.此外,从VC9到VC11的Visual C运行时库中的某些内容已发生变化,影响了所有这些.

总结一下:

  • 2014年11月21 ,源代码树中修复了非线程安全版本.
  • 线程安全版本(例如Apache模块)没有,并且看不到明确的解决方案.