Gettext不能通过php cli工作,但可以在php apache中工作

Gettext不能通过php cli工作,但可以在php apache中工作,php,apache,internationalization,locale,gettext,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."); }

我运行的代码如下所示:

...
$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可以翻译字符串,但不知何故它忽略了我在脚本中更改了语言环境,并从english目录中选择了.po文件

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

我使用:
Ubuntu 12.10、PHP5.4.6-1ubuntu1、apache 2.2.22和gettext 0.18.1

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

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

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

    putenv(“LANGUAGE=”)


    我花了一段时间才发现。

    我不知道这有多重要,但

    我刚刚找到了一个解决相反问题的方法:Gettext不是通过phpache工作,而是在phpcli中工作

    同样值得关注的是,strftime本地化不是通过php-apache工作,而是在php-cli中工作(在Linux-Debian-buster系统上)

    语言环境变量没有帮助,因为我没有这样的环境变量

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


    因此,任何Apache模块中的某些错误都可能引发此类问题……

    谢谢您的回复。1.返回相同的路径2。使用绝对路径没有帮助。确定。所以这不是我最初怀疑的原因。资源文件和区域设置文件夹的权限如何?运行PHPCLI和Apache的Unix用户都可以读取它们吗?您可以暂时将777之类的完全权限授予他们.Sry,以延长响应时间。我试过了,但没用。遗憾的是,我们可能会使用某种curl解决方案通过apache加载脚本。虽然这个问题的真正原因可能很好:)谢谢你的帮助。哇,谁会知道:)谢谢。有什么解释吗?我遇到了与您描述的完全相同的问题(在cli中工作,而不是通过apache),事实上,我一禁用perl模块,它就工作了!但是为什么呢?