Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

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

Anna | 31.05.2014 | нет комментариев

В этой статье я расскажу о том, как я делаю мультиязычные сайты в своих планах на 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);
}

Верю, что статью с реализацией писал не напрасно, кто-то может, обнаружит что – то для себя.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB