Gettext没有通过php-cli工作,但在php-apache中工作

时间:2012-11-04 16:54:56

标签: php apache internationalization locale gettext

我运行的代码如下所示:

...
$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

这是我们想要的。

运行它throgh cli:

da_DK Description

如果我们使用英语,这将是正确的。 'd'在英文翻译中是大写,在源中是小写(从上下文看起来有点奇怪)

因此gettext可以工作,因为它可以翻译字符串,但不知何故它忽略了我在脚本中更改了语言环境并从英语目录中选择了.po文件。

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

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

3 个答案:

答案 0 :(得分:21)

您必须重置环境Variable LANGUAGE:

运行putenv( “LANGUAGE =”);

花了一些时间才发现。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

我刚刚找到了解决相反问题的方法:Gettext无法通过 php-apache 工作,但可以在 php-cli 中工作。< / p>

还值得关注的是, strftime 的本地化不是通过 php-apache 进行的,而是在 php-cli 上进行的(在Linux Debian Buster系统上)。

LANGUAGE环境变量没有帮助,因为我没有这样的环境变量。

奇怪的是,我只是禁用了Apache中的 perl 模块,问题消失了。

因此,也许任何Apache模块中的一些错误都可能触发此类问题……