В некоторых проекта есть необходимость сделать мультиязычную поддержку сайта. Сегодня мы рассмотрим как это можно реализовать в фреймворке 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. Коды языков можно узнать здесь.