我正在使用gettext
对我的php文件进行国际化。我有两台服务器;沙箱服务器和发布服务器。在沙箱服务器中,locale/LC_MESSAGES/en
之类的目录不起作用,我应该使用locale/LC_MESSAGES/en_GB
。但是使用“en_GB”它在我的生产服务器上不起作用,“en”工作正常。对于像葡萄牙语这样的语言我有pt_PT和pt_BR(巴西葡萄牙语)。所以我更喜欢使用“A_B”结构。
我不知道gettext
如何检测这些文件夹。是否有使用相同文件夹结构的标准方法?
答案 0 :(得分:4)
如果您在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
的{{3}}:
<?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');
?>