Как я делал мультиязычность модулем на Codeigniter + HMVC

от автора

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


Комментарии

Добавить комментарий

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