Мультиязычность на CodeIgniter

Июль 02

Существует ни один вариант реализации мультиязычности на сайте.
Кто-то может реализовывать это через базу данных, кто-то через специализированные файы, кто-то просто через многомерные массивы.

В CodeIgniter мультиязычность реализована довольно таки просто.
В папки application/language создается папка с нужным языком (если их будет несколько), например russian и туда кладется php файл с массивом соответствий. Например вот так

CodeIgniter language

Чтобы перевести ту или иную строку должна быть подгружена библиотека 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;
}

Добавилась проверка на наличие языка в подгрузке, что теперь позволит спокойно использовать изменять язык в любом участке кода.

На этом пожалуй все, успехов!

3 коммент.

  1. Спасибо, очень пригодилось для перевода кабинета пользователя для русскоязычных пользователей на буржуйском сайте :)

  2. Да, действительно, очень полезно! Спасибо, пригодилось!

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

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

*

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>