Не удается получить 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");

?>

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


person pthulin    schedule 10.03.2011    source источник
comment
Правильно ли настроен язык в самой ОС? См. Мой предыдущий вопрос, возможно, может помочь stackoverflow.com/questions/1431354/php -gettext-на норвежском языке   -  person fabrik    schedule 10.03.2011
comment
Вы создали локаль для sv_SE? Если нет, добавьте (или раскомментируйте) строку, содержащую sv_SE.UTF-8 в /etc/locale.gen, а затем запустите sudo locale-gen.   -  person Carlos Campderrós    schedule 10.03.2011
comment
sudo locale-gen sv_SE.UTF-8 (а затем перезапустите lighttpd) сработало. Не могли бы вы опубликовать его как ответ на этот вопрос, чтобы я мог отметить его как правильный? Спасибо!   -  person pthulin    schedule 10.03.2011


Ответы (2)


Я столкнулся с той же проблемой. Я опишу, что я сделал, чтобы исправить это в 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-скрипт в соответствии с созданной вами локалью. Если вы сгенерировали локаль для sv_SE,

setlocale (LC_ALL, «sv_SE»);

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

setlocale (LC_ALL, «sv_SE.UTF-8»);

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

person Serrano    schedule 22.05.2011
comment
В Debian оказывается, что есть пакет под названием locales-all, который может предоставить более простой выход без необходимости делать locale-gen вручную. Мне также нужно было apt-get install locales - person kizzx2; 21.11.2012
comment
Потрясающий! Наконец-то решение. Большое спасибо. - person Danilo Radenovic; 11.08.2013

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

(1) Перед созданием файла messages.mo мне пришлось явно указать в message.po UTF-8 для кодировки:

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@ADDRESS>\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) Мне пришлось сохранить то же имя папки, что и установленный языковой стандарт. Например, я установил каннада, запустив 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 чувствителен к регистру имен папок и файлов. Поэтому убедитесь, что заглавные буквы сохранены, как показано выше.

person Adam Ranganathan    schedule 21.12.2016