Не удается получить gettext (php) на Ubuntu, работающем

Следующий пример работает в Mac OS X с Apache, т.е. я возвращаю обратно переведенную строку. Но на Ubuntu с lighttpd я получаю исходный текст "Неактивная учетная запись". Я пробовал всевозможные комбинации переменных varialbes без везения. Это не разрешения файлов, потому что я могу выделить содержимое файла .mo.

<?php

//$locale = 'sv_SE.UTF-8';
$locale = 'sv_SE';

$dir = dirname(__FILE__);

// File permission is apparantly not a problem as this works...
//echo file_get_contents($dir . '/sv_SE/LC_MESSAGES/flattr.mo');

putenv("LANG=$locale");
putenv("LANGUAGE=$locale");
putenv("LC_ALL=$locale");
putenv("LC_MESSAGES=$locale");
setlocale(LC_ALL, $locale);
setlocale(LC_MESSAGES, $locale);
//setlocale(LANG, $locale);
//setlocale(LANGUAGE, $locale);

bindtextdomain('flattr', $dir);
//bind_textdomain_codeset("flattr", 'UTF-8');
textdomain('flattr');

echo _("Inactive account");

?>

У кого-нибудь есть идеи?

Ответы

Ответ 1

У меня была та же проблема. Я опишу, что я сделал, чтобы исправить это на Ubuntu 10.10.

1) убедитесь, что у вас установлен "gettext" ,

sudo apt-get install gettext

В качестве альтернативы вы можете установить "php-gettext", если "gettext" не может быть установлен. Пакет "php-gettext" не требуется, если у вас уже установлен "gettext" .

2) Затем создайте локаль для своего языка. В этом примере я буду использовать 'sv_SE'. Найдите поддерживаемые локали в '/usr/share/i18n/SUPPORTED',

less /usr/share/i18n/SUPPORTED

Вы найдете несколько строк, начинающихся с 'sv_SE',

sv_SE.UTF-8 UTF-8
sv_SE ISO-8859-1
sv_SE.ISO-8859-15 ISO-8859-15

Это означает, что у вас есть несколько вариантов генерации локали для sv_SE. Один из вариантов не имеет периода (.) В его имени (т.е. sv_SE ISO-8859-1); это набор символов по умолчанию для этой локали. Чтобы сгенерировать языковой стандарт для набора символов по умолчанию, выполните следующую команду:

sudo locale-gen sv_SE

Если вы хотите сгенерировать эту локаль для набора символов UTF-8, запустите эту команду,

sudo locale-gen sv_SE.UTF-8

Перезапустите Apache после генерации локалей (иначе он не найдет вновь созданные локали),

sudo service apache2 restart

3) Наконец, обновите свой PHP script в соответствии с созданной вами локали. Если вы создали локаль для 'sv_SE',

setlocale (LC_ALL, "sv_SE" );

Но если вы создали эквивалент UTF-8 этого языка, используйте

setlocale (LC_ALL, "sv_SE.UTF-8" );

Теперь все должно работать.

Ответ 2

Хотя я выполнил шаги, изложенные в принятом ответе, я не мог заставить его работать над Ubuntu 14.04 LTS. Я должен был сделать две важные вещи:

(1) Прежде чем генерировать файл messages.mo, я должен был указать в message.po явно UTF-8 для charset:

msgid   ""
msgstr  "Project-Id-Version: PACKAGE VERSION\n"
        "Report-Msgid-Bugs-To: \n"
        "POT-Creation-Date: 2016-12-19 16:28+0530\n"
        "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
        "Last-Translator: FULL NAME <[email protected]>\n"
        "Language-Team: LANGUAGE <[email protected]>\n"
        "Language: \n"
        "MIME-Version: 1.0\n"
        "Content-Type: text/plain; charset=UTF-8\n"    <---------change here
        "Content-Transfer-Encoding: 8bit\n"

(2) Я должен был поддерживать такое же имя папки, как и локаль. Например, я установил Kannada, запустив sudo locale-gen kn_IN. Это сгенерировало kn_IN.UTF-8. Обратите внимание на заглавные буквы и дефис в UTF-8. Я использовал это имя при установке языка в моем PHP скрипт и для имени папки, где я помещал файл messages.mo:

PHP скрипт:

// I18N support information
$locale = "kn_IN.UTF-8";       <----------change here
putenv("LANG=".$locale); 
putenv("LC_ALL=".$locale);
setlocale(LC_ALL, $locale);

$domain = 'messages';
bindtextdomain($domain, "./Locale");
bind_textdomain_codeset($domain, 'UTF-8');
textdomain($domain);

Имя папки:

project_folder
    /Locale
        /kn_IN.UTF-8      <------change here
            /LC_MESSAGES
                /messages.mo

Ubuntu учитывает регистр имен папок и файлов. Поэтому убедитесь, что заглавные буквы сохранены, как показано выше.

Справочный документ, который указал мне в правильном направлении: https://sendy.co/forum/discussion/935/translation-not-being-picked-up-on-ubuntu/p1