不同环境下的php gettext目录结构

不同环境下的php gettext目录结构,php,internationalization,gettext,php-gettext,Php,Internationalization,Gettext,Php Gettext,我正在使用gettext实现php文件的国际化。我有两台服务器;沙盒服务器和发布服务器。在沙盒服务器中,类似于locale/LC\u MESSAGES/en的目录不起作用,我应该使用locale/LC\u MESSAGES/en\u GB。但使用“en_GB”在我的生产服务器上不起作用,“en”也可以正常工作。对于一些语言,如葡萄牙语,我有pt_pt和pt_BR(巴西葡萄牙语)。所以我更喜欢使用“A_B”结构 我不知道gettext如何检测这些文件夹。是否有使用相同文件夹结构的标准方法?如果您在

我正在使用
gettext
实现php文件的国际化。我有两台服务器;沙盒服务器和发布服务器。在沙盒服务器中,类似于
locale/LC\u MESSAGES/en
的目录不起作用,我应该使用
locale/LC\u MESSAGES/en\u GB
。但使用“en_GB”在我的生产服务器上不起作用,“en”也可以正常工作。对于一些语言,如葡萄牙语,我有pt_pt和pt_BR(巴西葡萄牙语)。所以我更喜欢使用“A_B”结构


我不知道
gettext
如何检测这些文件夹。是否有使用相同文件夹结构的标准方法?

如果您在Linux上运行代码,
gettext
仅适用于操作系统上已安装的区域设置。这意味着,如果将语言环境设置为
en_GB
,那么如果唯一安装的语言环境是
en_GB.utf8
en_US
,则无法获得翻译

在两个环境中都尝试此操作,并比较结果:

locale -a
它为您提供了所有已安装区域设置的列表:

en_US
en_US.ISO8859-1
en_US.ISO8859-15
en_US.US-ASCII
en_GB
en_GB.utf8
de_DE

de_DE.utf8
C
POSIX
现在,您需要确保两个环境都安装了相同的区域设置;如果需要
en_US.utf8
en_AU
en_AU.utf8
,可以基于现有的区域设置创建缺少的区域设置(阅读
localedef
手册页了解详细信息):

另外,下面是在PHP上使用
gettext
的步骤:

<?php

    // Set language to German
    putenv('LC_ALL=de_DE.utf8');
    setlocale(LC_ALL, 'de_DE.utf8');

    // Specify location of translation tables
    bindtextdomain("myPHPApp", "./locale");

    // Choose domain
    textdomain("myPHPApp");

    // Translation is looking for in ./locale/de_DE.utf8/LC_MESSAGES/myPHPApp.mo now

    // Print a test message
    echo gettext("Welcome to My PHP Application");

    // Or use the alias _() for gettext()
    echo _("Have a nice day");

?>

谢谢你的完整回复,谢尔文!虽然我没有安全的shell访问我的服务器来运行这些命令,但我将尝试使用echo setlocale(LC_ALL,0);而是在我的php脚本中。我还担心其他进程会改变语言环境。我读了一些关于它的资料,我们有一些python和rails应用程序。locale是一个系统范围的参数,还是仅仅与php/apache进程相关?非常欢迎。实际上,
putnav()
仅限于当前请求,
setlocale()
仅限于当前脚本。这些不会影响操作系统或其他进程。脚本运行完成后,值将返回到默认值。这就是为什么语言应该以其他方式在整个会话中保持不变的原因。回答得好!注意:“
setlocale()
仅限于当前脚本”--我猜这也(实际上)意味着当前请求(实际上是PHP执行上下文),而不仅仅是脚本,因此如果您包含另一个脚本,或者从另一个脚本包含此脚本,则不需要在每个PHP文件(脚本)中设置区域设置。
<?php

    // Set language to German
    putenv('LC_ALL=de_DE.utf8');
    setlocale(LC_ALL, 'de_DE.utf8');

    // Specify location of translation tables
    bindtextdomain("myPHPApp", "./locale");

    // Choose domain
    textdomain("myPHPApp");

    // Translation is looking for in ./locale/de_DE.utf8/LC_MESSAGES/myPHPApp.mo now

    // Print a test message
    echo gettext("Welcome to My PHP Application");

    // Or use the alias _() for gettext()
    echo _("Have a nice day");

?>
<?php

  // Set language to German written in Latin-1
  putenv('LC_ALL=de_DE.ISO8859-1');
  setlocale(LC_ALL, 'de_DE.ISO8859-1');

?>