php gettext目录结构在不同的环境中

我正在使用gettext为我的PHP文件进行国际化.我有两台服务器;沙箱服务器和发布服务器.在沙盒服务器中,像locale / LC_MESSAGES / en这样的目录不起作用,我应该使用locale / LC_MESSAGES / en_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联机帮助页以了解详细信息):

sudo localedef -c -i en_US -f UTF-8 en_US.utf8
sudo localedef -c -i en_GB -f UTF-8 en_AU
sudo localedef -c -i en_GB -f UTF-8 en_AU.utf8

另外,接下来是在PHP上使用gettext的common best practice

<?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");

?>

虽然您可以简单地删除编码而只删除de_DE,但是在区域设置中使用字符集是一种很好的做法,因为在某些特定情况下,您可能需要支持非Unicode字符集中的内容.见下文

<?PHP

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

?>

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...