2

(我看过其他问题,但他们的回答 我没有帮助)

我有一个使用 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 64 位上:

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代替当前工作目录的相对路径,结果相同。

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

4

1 回答 1

3

结果我没有发现 environment variable LANGUAGE,它优先于LANG并在我的 Debian 机器上设置,但在其他机器上没有。

gettext 文档

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

  1. LC_ALL
  2. LC_xxx,根据选择的区域设置类别:LC_CTYPE、LC_NUMERIC、LC_TIME、LC_COLLATE、LC_MONETARY、LC_MESSAGES、...

此外,在我的最小示例中,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"));'
于 2014-10-14T21:55:43.857 回答