Мультиязычность на CodeIgniter
Июль 02
Существует ни один вариант реализации мультиязычности на сайте.
Кто-то может реализовывать это через базу данных, кто-то через специализированные файы, кто-то просто через многомерные массивы.
В CodeIgniter мультиязычность реализована довольно таки просто.
В папки application/language создается папка с нужным языком (если их будет несколько), например russian и туда кладется php файл с массивом соответствий. Например вот так
Чтобы перевести ту или иную строку должна быть подгружена библиотека language и соответствующий массив с языковыми значениями. Чтобы не писать длинную строку вида $this->lang->line('some_key') я предпочитаю использовать функцию lang(); хэлпера language.
Теперь от теории к практике!
Делая бэкенд веб-сайта BasaPress перед мной встала задача динамически менять язык при отправке того или иного письма.
К моему удивлению действия в виде $this->lang->load(filename, language); перед тем как отработает шаблон письма ничего не давали.
Погуглив немного можно наткнуться на всякие различные i18n модули, библиотеки и прочие фичи, которые расширяют функционал. Но загвоздка в том, что меня устраивает как работает CI, загвоздка лишь в том, что он не хочет подгружать язык в определенном участке кода.
Взглянув на метод load класса CI_Lang сразу становится ясно в чем дело
if (in_array($langfile, $this->is_loaded, TRUE))
{
return;
}
т.е., к примеру если мы по умолчанию загрузили general_lang.php с английской версией, а потом где-то нам понадобилось перейти на general_lang.php с русской версией, наличие значения в переменной is_loaded не позволит осуществить подгрузку. Немного странно почему разработчики CI не учли этот момент. Ведь плодить файлы с разными именами, чтобы перевести одно и то же слово – это далеко не лучший вариант.
К счастью все правится довольно просто и быстро.
В случае с CodeIgniter 2.0 библиотека lang лежит в папке system/core. Нам необходимо переопределить метод load(). Для этого создадим файл в application/core MY_Lang.php
Далее, все что нужно – унаследовать класс CI_Lang
class MY_Lang extends CI_Lang
{
…
}
и скопировать внутрь полностью метод load().
После чего немного поправим код вот таким образом.
if (in_array($langfile, $this->is_loaded, TRUE) && !$idiom)
{
return;
}
Добавилась проверка на наличие языка в подгрузке, что теперь позволит спокойно использовать изменять язык в любом участке кода.
На этом пожалуй все, успехов!


Спасибо, очень пригодилось для перевода кабинета пользователя для русскоязычных пользователей на буржуйском сайте
Да, действительно, очень полезно! Спасибо, пригодилось!
Всегда пожалуйста! Думаю на выходных выложу еще какую-нибудь не менее полезную статейку