Главная > Новости > Многоязычность в проектах на php средствами gettext

Многоязычность в проектах на php средствами gettext

Давно хотел написать про то, как использовать многоязычность с помощью gettext, наконец-то дошли руки, сам юзаю эту технологию наверно года 4. Материала по нему в сети полно, но на практике не всегда это дело работает сразу, причина находится очень долго и гугл в этом не всегда помощник. Опишу всю технологию с нуля и со всеми возможными припонами, с которыми столкнулся я.
При написании своей CMS мне понадобилось, чтобы интерфейс можно было переводить на любые языки. По старинке, текст в скриптах выносили в переменные, которые хранились в отдельном файле, под нужный язык подключали файл с нужным языком – не айс.
Библиотека Gettext намного облегчает задачу, можно в скриптах писать текст на привычном вам языке, но вот в таком виде: echo gettext(“Привет!”);
Так же можно делать так: _(“Привет!”);, но как показала практика, на некоторых серверах такая конструкция не прокатила, и еще не всегда проходит, когда текст в одинарных кавычках (‘), поэтому лучше всегда использовать echo gettext(“Привет”);
После того, как в вашей программе весь текст выводится в таком виде, вам потребуется этот текст как то передать переводчику. Для этого качаем бесплатную программу poedit. Есть версии под все распространенные ОСи.
Ставим прогу, запускаем, жмем Файл -> Создать каталог
В закладке Информация о проекте заполняем все поля, кроме Формы множественного числа, закладке Пути вставляем путь до своего проекта, жмем ок. Далее, меню Каталог -> Обновить из исходного кода, программа просканирует все файлы вашего проекта на наличие gettext, и выведет его в две колонки, колонка исходная и колонка перевода. На этом этапе может возникнуть ошибка, в которой будет что то про кодировку UTF-8, если у вас скрипты в этой кодировке, тогда идем в меню Файл – Установки – Парсер – PHP – Править – Поле: кодировка исходного кода меняем на –from-code=UTF-8, сохраняем и повторяем процедуру с обновлением каталога. После этого у вас сформировался файл с расширением .po – вот этот файл с программкой poedit передаете переводчику, он переводит и возвращает вам обратно, при пересохранении файла создается файл с расширением .mo – это бинарник, который и будет налету переводит наш проект на другой язык.
И так, в папке своего проекта создаем папку locale, допустим нам надо проект перевести с русского на английский, в папке locale создаем подпапку en, в ней LC_MESSAGES, куда кладем файлик с расширением .mo, пусть он будет messages.mo, имя файла важно для последующего подключения.
В начале своих скриптов, прописываем код:

//$_SESSION['lang'] - пусть в данной переменной передается

//выбранный язык ru или en
$charsets = array( 'ru' => 'ru_RU', 'en' => 'en_US' );
$locale = $charsets[$_SESSION['lang']];
$domain = 'messages';  //значение этой переменной должно совпадать с именем .mo файла
$locale_path = dirname(__FILE__).'/locale'; //путь к папке locale, должен быть полным, в моем случае dirname(__FILE__)
putenv('LC_ALL='.$locale);
putenv('LANG='.$locale);
putenv('LANGUAGE='.$locale);

if  (!setlocale (LC_ALL, $locale.'.utf8', $locale.'.utf-8',  $locale.'.UTF8', $locale.'.UTF-8', $_SESSION['lang'].'.utf-8',  $_SESSION['lang'].'.UTF-8', $_SESSION['lang'])) {
// Set current locale
setlocale(LC_MESSAGES, '');
}
bindtextdomain($domain, $locale_path);
bind_textdomain_codeset($domain, 'UTF-8'); //в случае если у вас utf-8
textdomain($domain);

И это все, далее текст echo gettext(“Привет!”); при значении $_SESSION['lang']=’en’ должен выводиться на английском Hello!
Если это не произошло…
1)проверяем, не включен ли на хостинге безопасный режим safe_mode, включен – вырубаем
если не помогло, то
2) пробуем заменить все LC_ALL, на LC_MESSAGES,
если не помогло, то
3) нужно убедиться, что на сервере стоит нужная локаль, если есть доступ к серверу по шелу, тогда вам поможет посмотреть список всех локалей команда locale -a, для английского языка это en_US.utf8, если локали нет, ее надо поставить, тут уже в гугл или саппорт.
если не помогло, то
4) возможно папку en надо переименовать в имя локали, вот тут надо перебрать все комбинации: en_US.utf8, en_US, en_US.utf-8, en_US.UTF8, en_US.UTF-8
С другими ситуациями я уже не сталкивался, поэтому если и это не сработало, придется вам “раскуривать” самостоятельно.

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Categories: Новости Tags: ,
  1. Пока что нет комментариев.
*