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

标签 php windows apache gettext

我需要本地化一个仅限 Windows 的 PHP Web 应用程序,我正在评估 gettext extension但我最难尝试让它在我的 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 并使用任何其他库。)


进一步测试:

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

  • Apache 版本似乎无关紧要(命令行解释器也会发生这种情况)。
  • PHP 版本似乎无关紧要(还在我的 PC 上尝试了最新的 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

这明确地证明了我的计算机具有正确的 Assets ,但也让我想知道为什么 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';

最佳答案

这是一个 issue这已经被承认并且partially fixed由 PHP 团队提供。

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

总结:

  • 非线程安全构建已于 2014 年 11 月 21 日st 修复在源代码树中。
  • 线程安全构建(例如 Apache 模块)还没有,而且目前也没有明确的解决方案。

关于php - Gettext 将始终使用系统默认语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569362/

相关文章:

php - mysqli_fetch_array() 期望参数 1 为 mysqli_result, boolean 值

php - 如果投票为 0,则投票结果查询未获取候选人

linux - 如何在Apache服务器上正确使用域名托管网页?

node.js - 将 apache 日志文件通过管道传输到 Nodejs 中

php - ffmpeg命令视频和音频的输出视频文件不匹配

php - 通过格式化 JSON 数组输出

c++ - 考虑到我有一个引用该控件的 CWnd 对象,有没有办法获取对 MFC 对话框上所有子窗口或控件的引用?

c# - 将 .NET 应用程序添加到注册表以在重启后启动以完成某些操作

Windows 批处理文件 - 管道到 FIND

javascript - 此服务器上禁止 : You don't have permission to access/questions. php