php gettext翻译不适用于Debian

时间:2014-10-13 11:46:41

标签: php debian gettext php-gettext

(我已经看过the other questions,但他们的回答对我没有帮助)

我有一个使用php gettext进行翻译的应用程序,并且已经在OSX和FreeBSD上工作了多年。当我尝试将其移植到Debian 7.6 32bit(Linux debian32bit 3.2.0-4-686-pae #1 SMP Debian 3.2.60-1+deb7u3 i686 GNU/Linux)时,一切正常,但翻译除外。我已将问题归结为CLI单线程:

env LANG=nl_NL.UTF-8 php -r 'var_dump(bindtextdomain("foo","locale")); var_dump(textdomain("foo")); var_dump(getenv("LANG")); var_dump(_("low"));'

locale/nl/LC_MESSAGES/foo.mo包含low的荷兰语翻译,即。 laag

在OSX Maverick上:

string(34) "/Users/foobar/workspace/bar/locale"
string(5) "foo"
string(11) "nl_NL.UTF-8"
string(4) "laag" <-- Success!

在FreeBSD 10 64bit上:

string(24) "/usr/local/foobar/locale"
string(5) "foo"
string(11) "nl_NL.UTF-8"
string(4) "laag" <-- Success!

然而,在Debian 7上:

string(19) "/home/foobar/locale"
string(5) "foo"
string(11) "nl_NL.UTF-8"
string(3) "low" <-- Failure!

安装了php-gettext:

$ php -i | egrep -i 'PHP version|gettext'
PHP Version => 5.4.4-14+deb7u14
gettext
GetText Support => enabled

locale -a给出:

C
C.UTF-8
en_US.utf8
nl_NL.utf8
POSIX

所以我尝试了nl_NL.utf8而不是nl_NL.UTF-8:结果相同。

我尝试将foo.mo文件放在locale/nl_NL/LC_MESSAGES下,结果相同。

我尝试使用locale的绝对路径,而不是当前工作目录的路径相对路径,结果相同。

我在这里不知所措。有关如何进行的任何建议吗?

1 个答案:

答案 0 :(得分:3)

原来我没有发现环境变量LANGUAGE,它优先于LANG并且在我的Debian机器上设置,但在其他设备上没有设置。

来自gettext documentation

  

当程序查找与语言环境相关的值时,它会根据以下环境变量按优先级顺序执行此操作:

     
      
  1. 语言
  2.   
  3. LC_ALL
  4.   
  5. LC_xxx,根据所选的区域设置类别:LC_CTYPE,LC_NUMERIC,LC_TIME,LC_COLLATE,LC_MONETARY,LC_MESSAGES,......
  6.   
  7. LANG
  8.   

此外,在我的最小示例中,必须调用setlocale才能使其在所有计算机上都能正常工作。 (我在我的原始代码中做到了这一点,但不知道是不是需要让gettext在我的其他机器上工作,所以我把它留了出来。)

因此,最后,以下内容适用于所有计算机:

php -r 'var_dump(putenv("LANGUAGE=nl_NL.UTF-8")); var_dump(bindtextdomain("foo","locale")); var_dump(textdomain("foo")); var_dump(setlocale(LC_ALL,"nl_NL.UTF-8")); var_dump(_("low"));'