9

我运行的代码如下所示:

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

4

3 回答 3

22

您必须重置环境变量 LANGUAGE:

putenv("语言=");

我花了一段时间才知道。

于 2012-11-28T15:11:00.850 回答
2

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

  1. 回显 bindtextdomain() 的返回值并查看它们。
  2. 尝试将“./locale”替换为绝对路径(例如“/var/www/yourproject/locale”)并查看它是否有效。
于 2012-11-04T17:19:33.683 回答
1

我不知道这有多少相关性,但是……</p>

我刚刚找到了相反问题的解决方案:Gettext not working through php-apache,但工作在php-cli

还担心,strftime本地化不是通过php-apache工作,而是在php-cli(在 Linux Debian buster 系统上)工作。

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

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

所以也许任何 Apache 模块中的一些错误都可能引发这种问题……</p>

于 2020-06-14T05:25:15.857 回答