В некоторых проекта есть необходимость сделать мультиязычную поддержку сайта. Сегодня мы рассмотрим как это можно реализовать в фреймворке Kohana 3.3.
Изначально в стандартную сборку входит класс интернационализации i18n, отвечающий за мультиязычность.
Итак, для начала нужно в файле bootstrap.php установить язык по умолчанию, сделаем таким языком - русский:
I18n::lang('ru');
Дальше создадим в каталоге application/i18n/ файл ru.php, в нем будет хранится перевод статического текста для русского языка:
<?php defined('SYSPATH') or die('No direct script access.'); return array( 'How much: :one + :two = ?' => 'Сколько будет :one + :two = ?', 'Hello word' => 'Привет мир!', );
И создадим еще файл application/i18n/en.php для перевода текста на английский язык, он будет вторым языком на нашем сайте:
<?php defined('SYSPATH') or die('No direct script access.'); return array( 'Hello word' => 'Hello Word!', );
Дальше нужно в основном контреллере, от которого наследуются остальные, написать код для переключения языка. Значения будут браться сначала из GET запроса, а поcле из Cookie. Если и в Cookie будет пусто, то установится язык по умолчанию:
<?php defined('SYSPATH') or die('No direct script access.'); abstract class Controller_Base extends Controller_Template { public $template = "main"; public function before() { parent::before(); $this->template->content = ''; // если был передан параметр language - устанавливаем этот язык if (Arr::get($_GET, 'language', NULL) != NULL) { I18n::lang(strip_tags(Arr::get($_GET, 'language'))); // меняем текущий язык Cookie::set('language', strip_tags(Arr::get($_GET, 'language'))); // и записываем его в cookie } // если ничего не передали, то пробуем подгрузить язык из cookie elseif(Cookie::get('language', NULL) != NULL){ I18n::lang(Cookie::get('language')); // устанавливаем язык из cookie } // если и в cookie ничего нет, то установится язык по умолчанию, который мы записали в bootstrap.php } }
Теперь в views сделаем вывод переключателя языков и выведем немного текста, для проверки на разных языках:
<?php /** Выбираем полный путь переданый браузером удаляем переменную language чтобы она не дублировалась и для каждого языка добавляем свой language */ $uri = preg_replace("/(\?.*?)$/","",$_SERVER["REQUEST_URI"]); // Удаляем строку с запросом и пути if(isset($_GET['language'])) unset($_GET['language']); // Если нам раньше передавался параметр language - удаляем его $uri .= '?'; // если что-то еще осталось в строке - строим строку с запросом и добавляем его к пути if(!empty($_GET)) { foreach($_GET as $key=>$value) { $uri .= $key .'='. $value .'&'; } } ?> <div class="language"> <a href="<?php echo $uri. 'language=ru' ?>" class="<?php echo I18n::lang() == 'ru' ? 'active' : '' ?>">Рус</a> | <a href="<?php echo $uri. 'language=en' ?>" class="<?php echo I18n::lang() == 'en' ? 'active' : '' ?>">Eng</a> </div> <?php // вывод фразы "Hello word" на установленом языке echo __("Hello word"); ?> <br /> <?php // вывод строки с параметрами echo __("How much: :one + :two = ?",array(':one'=> '1', ':two'=> '2')); ?>
Для добавлениия других языков, нужно создать файлик с переводом в директории application/i18n/ и названием файла {код языка}.php. Также не забудьте добавить в переключатель языка нужную переменную language. Коды языков можно узнать здесь.