PHP bindtextdomain失败

时间:2019-01-18 10:20:07

标签: php internationalization gettext

我正在尝试在运行PHP 7.1的CentOS服务器上用PHP设置国际化

这是我的目录结构:

/home/project/public_html/locale/japanese/LC_MESSAGES/messages.po 
/home/project/public_html/locale/japanese/LC_MESSAGES/messages.mo
/home/project/public_html/index.php

messages.po包含该行(除其他外):

"Language: japanese\n"
"Content-Type: text/plain; charset=UTF-8\n"

我有以下代码:

$check_putenv = putenv("LC_ALL=japanese");
if (!$check_putenv) {
    echo "Warning: putenv LC_ALL failed!\n";
}

$check_putenv2 = putenv("LANGUAGE=japanese");
if (!$check_putenv2) {
    echo "Warning: putenv LANGUAGE failed!\n";
}    

$check_locale = setlocale(LC_MESSAGES, 'japanese');
if (!$check_locale) {
    echo "Warning: Failed to set locale japanese!\n";
}
$check_bind = bindtextdomain("messages", "/home/project/public_html/locale");
if (!$check_bind) {
    echo "Warning: Failed to bind text domain!\n";
}
$check_textdomain = textdomain("messages");
if ($check_textdomain !== "messages") {
    echo "Warning: Failed to set text domain!\n";
}

输出为

Warning: Failed to bind text domain!

locale -a返回(以及其他)

ja_JP
ja_JP.utf8
japanese

知道什么地方可能出问题吗?

1 个答案:

答案 0 :(得分:2)

如评论中所述, gettext 扩展依赖于包含语言和区域代码的标准语言环境说明符,即ja_JP表示“日本日语”或具有指定的编码{ {1}}。即使存在ja_JP.utf-8之类的别名,gettext的PHP实现也不接受该别名。请注意,必须在系统上安装和配置语言环境。

语言和区域说明符可以在IANA language-subtag-registry

中找到

此代码已经适用于日语:

japanese

请记住也将目录重命名为$dir = $_SERVER['DOCUMENT_ROOT'] . '/locale'; $domain = 'messages'; $locale = 'ja_JP.utf8'; $codeset = 'UTF-8'; setlocale( LC_MESSAGES, $locale); bindtextdomain($domain, $dir); textdomain($domain); bind_textdomain_codeset($domain, $codeset); 。确保您的.po文件以正确的编码存储,即在此示例中为locale/ja_JP.utf8,并包含以下行

UTF-8

(已经完成)。