(我已经看过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
的绝对路径,而不是当前工作目录的路径相对路径,结果相同。
我在这里不知所措。有关如何进行的任何建议吗?
答案 0 :(得分:3)
原来我没有发现环境变量LANGUAGE
,它优先于LANG
并且在我的Debian机器上设置,但在其他设备上没有设置。
当程序查找与语言环境相关的值时,它会根据以下环境变量按优先级顺序执行此操作:
- 语言
- LC_ALL
- LC_xxx,根据所选的区域设置类别:LC_CTYPE,LC_NUMERIC,LC_TIME,LC_COLLATE,LC_MONETARY,LC_MESSAGES,......
- LANG
醇>
此外,在我的最小示例中,必须调用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"));'