Описывать установку самого CodeIgniter и HMVC не буду, так как эта тема, в общем, то не об этом.
Подготовка Codeigniter
Первым делом, создадим модуль “lang” в каталоге “application/modules/”. Далее создадим в каталоге модуля, каталог для наших контроллеров “controllers”.
Подключим в автозагрузку helper “url”
$autoload['helper'] = array('url');
Теперь займемся настройкой конфигов CodeIgniter и напишем роуты для мультиязычности.
Открываем и добавляем в конец файла: application/config/config.php
$config['default_controller'] = 'welcome'; // контроллер по-умолчанию /* |-------------------------------------------------------------------------- | Language site |-------------------------------------------------------------------------- */ $config['language_site'] = array( 'default' => 'ru', // язык по – умолчанию (загружается первым, если не выбрано другое) /* Языки сайта */ 'ru' => 'Русский', 'en' => 'Английский' /* Если нужно добавляем еще, для примера использую только 2 */ );
Далее, нужно добавить правила в роутер, для того чтобы мы могли работать с нашими контроллерами с указанием языка сайта.
Открываем и редактируем файл: application/config/routes.php
Нам потребуется заменить:
$route['default_controller'] = "welcome";
На:
if (file_exists(APPPATH . 'modules/lang')) { $route['default_controller'] = "lang"; $route['(ru|en)'] = $this->config->item('default_controller'); $route['(ru|en)/(:any)'] = "$2"; } else { $route['default_controller'] = $this->config->item('default_controller'); }
То есть, если у нас есть модуль “lang” то мы будем работать с ним, если его нету, значит мы работаем с одноязычным сайтом.
Я указал, что теперь, контроллер по-умолчанию будет модуль lang. После же, если у нас в URL, выбран язык сайта, то мы показываем пользователю наш дефолтный контроллер указанный в конфиге ($config['default_controller']
).
Работаем с конроллером lang
В каталоге модуля (application/module/lang/controllers/) создаем файл контролера, с именем lang.php, со следующим содержанием:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Lang extends MY_Controller { private $_controller; public function __construct() { parent::__construct(); /* Если не выбран язык, то ставим язык по-умолчанию, * переадресовывая пользователя на правильный URL */ $this->_check_lang(); } } /* End of file welcome.php */ /* Location: ./application/controllers/welcome.php */
В этом файле мы выполняем проверку на использование языка сайта $this->_check_lang();
В данном случае переадресация пользователя на выбранный язык по-умолчанию, будет только для главной страницы.
Сама функция проверки, у меня находится в MY_Controller.
Ту же самую проверку я делаю в __construct() своего главного контроллера (MY_Controller). Для того, чтобы передресовывать пользователя на правильный url с выбранным языком, с любой страницы нашего сайта.
Пример: пользователь открыл специально или по случайности страницу site.com/news/, скрипт направит его, на страницу с выбранным языком сайта, site.com/ru/news
Привожу код функции _check_lang() кодом ниже:
/** * Проверка наличия языка сайта в ссылке * и переедресация на язык по-умолчанию * в случае если мы его там его не нашли */ private function _check_lang() { $lang = $this->config->item('language_site'); /* получаем языки сайта из конфига*/ if (file_exists(APPPATH . 'modules/lang')) { $uri_string = $this->uri->uri_string(); /* получаем строку нашего url */ /* Если мы не находим язык по первому сегменту в нашем url * то переадресовываем пользователя на такую же ссылку только * добавляем в начало, язык сайта по-умолчанию. */ if (!isset($lang[$this->uri->segment(1)])) { redirect($lang['default'].'/'.$uri_string, 'location', 301); } } }
Заключение
Теперь, у меня готов шаблон для работы с многоязычными сайтами. Куда бы пользователь ни заходил, не выбрав язык сайта, мы направим его на «верный путь», с использованием в url языка по-умолчанию.
Язык сайта находится постоянно в первом сегменте URL, получить его можно с помощью
$this->uri->segment(1);
Как использовать полученный язык сайта, каждый уже решит сам. Я работаю с MySQL и создаю разные базы для каждого языка сайта. Исходя из выбранного языка, выбираю в главном контроллере базу с которой работать.
$lang = $this->config->item('language_site'); If ($lang[$this->uri->segment(1)]) { /* Перезаписываю главный объект db на новый */ $this->db = $this->load->database($this->uri->segment(1), TRUE, TRUE); }
Надеюсь, что статью с реализацией писал не зря, кто-то может, найдет что – то для себя.
ссылка на оригинал статьи http://habrahabr.ru/post/199268/
Добавить комментарий