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