Не могу получить gettext (php) на работающей Ubuntu - PullRequest
15 голосов
/ 10 марта 2011

Следующий пример работает на Mac OS X с Apache, т.е. я получаю переведенную строку, возвращенную обратно.Но в Ubuntu с lighttpd я получаю оригинальный текст «Неактивный аккаунт».Я попробовал все виды комбинаций различных вариантов окружения без какой-либо удачи.Это не права доступа к файлу, потому что я могу отобразить содержимое файла .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");

?>

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

Ответы [ 2 ]

35 голосов
/ 22 мая 2011

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

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

1 голос
/ 21 декабря 2016

Несмотря на то, что я выполнил шаги, изложенные в принятом ответе, я не смог заставить его работать на 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@ADDRESS>\n"
        "Language-Team: LANGUAGE <LL@li.org>\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 чувствительна к регистру имен папок и файлов.Поэтому убедитесь, что заглавные буквы ведутся так, как показано выше.

...