【发布时间】:2013-10-24 14:54:46
【问题描述】:
我需要本地化一个仅限 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]注册表树与其他七框相同。
编辑:在命令行测试时,我发现在运行 PHP 脚本之前设置 LANG 环境变量最终会改变语言:
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';
【问题讨论】:
-
您解决了这个问题吗?我有同样的问题(64 位 Win 8.1)。正如你所提到的,如果我在运行脚本之前使用“set LANG”,它就可以工作。我需要让它通过 Apache 工作。
-
@fromvega 一点也不。相同的启用 gettext 的代码在某些 Windows 计算机中有效,而在某些其他计算机中无效——这是我目前所知道的唯一内容。
-
您好。我知道这已经有一段时间了,但是很久以前就点击了这篇文章并记得我对其他类型的环境变量也有类似的问题。您是否尝试过通过 Apache 模块添加环境变量?就像这里说的:httpd.apache.org/docs/2.2/env.html
-
@JorgeCampos 我想您提出了一种解决方法。我想我可以想办法将我的语言选择逻辑从 PHP 会话移动到 Apache(可能使用 cookie),但我想我应该提到我已经用 pure PHP class that reads gettext catalogues 解决了这个问题,并在 gettext 拒绝工作时作为后备财产。此类尚未积极开发,可能缺少一些高级功能,但到目前为止运行良好。
-
是的,这是一种解决方法。当我遇到这样的问题时,我意识到当时的 PHP 遇到了问题,因为它不是进程执行的所有者(在操作系统上的意思)所以我想如果我在调用它的进程上设置变量,它会起作用,并且在当时起作用。但很高兴知道你已经想通了。因此,您应该发布您的解决方案作为答案。正如我的一个朋友常说的:最好的解决方案是你至少可以做到,直到有人与另一个更好的人一起来。 :) 干杯
标签: php windows apache gettext