Gettext无法通过php-cli工作,但可以在php-apache中工作

问题描述 投票:9回答:3

我运行的代码如下:

...
$this->locale = da_DK;
...
putenv("LC_ALL=".$this->locale);
putenv('LANG='.$this->locale);
$res = setlocale(LC_ALL, $this->locale);
if($res != $this->locale){
    throw new Exception("The language could not be set.");
}
bindtextdomain("domain", "./locale");
textdomain("domain");

 echo setlocale(LC_MESSAGES, 0 );
 echo ' ';
 echo __('description');

通过apache2运行它的结果是:

da_DK Beskrivelse

我们想要的。

通过cli运行它:

da_DK Description

如果我们使用英语,那会是正确的。 “ d”在英语翻译中为大写,在原文中为小写(从上下文出发,似乎有点奇怪)

因此gettext可以正常工作,因为它可以翻译字符串,但是以某种方式它忽略了我在脚本中更改语言环境并从英语目录中选择.po文件的方法。

[如果您想知道为什么我在cli脚本上需要区域设置:该脚本用于通过电子邮件发送发票。

我使用:Ubuntu 12.10,PHP 5.4.6-1ubuntu1,Apache 2.2.22和gettext 0.18.1。

php apache internationalization locale gettext
3个回答
21
投票

您必须重置环境变量语言:

putenv(“ LANGUAGE =”);

花点时间找出来。


1
投票

您需要检查bindtextdomain()是否指向php-cli和php-apache中的相同资源文件。我建议,

  1. 回显bindtextdomain()的返回值并查看它们。
  2. 尝试将“ ./locale”替换为绝对路径(例如“ / var / www / yourproject / locale”,并查看其是否有效。

0
投票

我不知道这有多重要,但是...

我刚刚找到了解决[[opposite问题的方法:Gettext无法通过php-apache工作,但可以在php-cli中工作。

也要注意的是,

strftime

本地化无法通过php-apache进行,但是可以在php-cli中进行(在Linux Debian Buster系统上)。语言环境变量没有帮助,因为我没有这样的环境变量。

奇怪的是,我只是禁用了Apache中的

perl

模块,问题消失了。因此,也许任何Apache模块中的一些错误都可能触发此类问题…
© www.soinside.com 2019 - 2024. All rights reserved.