PHP bindtextdomain не работает - PullRequest
       23

PHP bindtextdomain не работает

0 голосов
/ 18 января 2019

Я пытаюсь настроить интернационализацию в PHP на сервере CentOS с PHP 7.1

Вот моя структура каталогов:

/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 голосов
/ 18 января 2019

Как обсуждалось в комментариях, расширение gettext опирается на стандартные спецификаторы локали, содержащие код языка и региона, то есть ja_JP для "Японский в Японии" или с указанной кодировкой ja_JP.utf-8. Даже если есть псевдоним, такой как japanese, реализация gettext на PHP не принимает это. Обратите внимание, что языковой стандарт должен быть установлен и настроен в вашей системе.

Спецификаторы языка и региона можно найти в IANA language-subtag-registry

Этот код уже должен работать для японского языка:

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

Не забудьте также переименовать каталог в locale/ja_JP.utf8. Убедитесь, что ваши .po файлы хранятся в правильной кодировке, т.е. в этом примере UTF-8, и содержат строку

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

(как вы уже сделали).

...