PHP bindtextdomain fails

旧巷老猫 提交于 2019-12-12 20:28:18

问题


I am trying to setup internationalization in PHP on a CentOS server running PHP 7.1

Here is my directory structure:

/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

the messages.po containst the line (among others):

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

I have the following code:

$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";
}

the output is

Warning: Failed to bind text domain!

locale -a returns (among others)

ja_JP
ja_JP.utf8
japanese

any idea what could be wrong?


回答1:


As discussed in the comments, the gettext extension relies on the standard locale specifiers containing the language and region code, i.e. ja_JP for "Japanese in Japan" or with the specified encoding ja_JP.utf-8. Even if there is an alias like japanese, the PHP implementation of gettext does not accept this. Note that the locale has to be installed and configured on your system.

Language and region specifiers can be found in IANA language-subtag-registry

This code already should work for the Japanese language:

$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);

Remember to also rename your directory into locale/ja_JP.utf8. Ensure your .po files are stored with the correct encoding, i.e. UTF-8 in this example, and contain the line

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

(as you already have done).



来源:https://stackoverflow.com/questions/54251911/php-bindtextdomain-fails

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!