MyTetra Share
Делитесь знаниями!
О, смотри-ка какое хорошее место. Дайте два!
Интернационализация, вариант wiki сайта codeigniter.com
15.02.2011
14:55
Текстовые метки: CI, CodeIgniter, i18n, язык
Раздел: Компьютер - Программирование - Язык PHP - CodeIgniter

Как указать идентификатор языка через URI

Приведенное здесь расширение класса поддержки многоязычности позволяет автоматически использовать языковый префикс во всех URL сайта. Префикс можно предварительно определить в конфигурирующем файле или из ссылки, и автоматически подключить нужный файл перевода, причем роутинг будет работать нормально, так как будто никаких префиксов не используется.

Очень часто самый удобный путь указать язык - это включить идентификатор языка в сылку. Например

http://domain.tld/en/controller/method,

http://domain.tld/es/controller/method,

http://domain.tld/de/controller/method/

application/config/routes.php

>-----8<-----

//route example: http://domain.tld/en/controller => http://domain.tld/controller

$route['(\w{2})/(.*)'] = '$2';

$route['(\w{2})'] = $route['default_controller'];

>-----8<-----

application/config/config.php

>-----8<-----

$config['language'] = "english";

//default language abbreviation

$config['language_abbr'] = "en";

//set available language abbreviations

$config['lang_uri_abbr'] = array("es" => "spanish", "en" => "english");

//ignore this language abbreviation

$config['lang_ignore'] = "en";

>-----8<-----

application/libraries/MY_Language.php

>-----8<-----

<?php

if (!defined('BASEPATH')) exit('No direct script access allowed');

/**

* URI Language Identifier

*

* Adds a language identifier prefix to all site_url links

*

* version 0.14 (c) Wiredesignz 2008-07-30

*/

class MY_Language extends CI_Language

{

function MY_Language()

{

parent::CI_Language();

global $RTR;

$index_page = $RTR->config->item('index_page');

$lang_uri_abbr = $RTR->config->item('lang_uri_abbr');

//get the language from uri segment

$lang_abbr = $RTR->uri->segment(1);

//check for invalid abbreviation

if( ! isset($lang_uri_abbr[$lang_abbr]))

{

$base_url = $RTR->config->item('base_url');

$deft_abbr = $RTR->config->item('language_abbr');

//check for abbreviation to be ignored

if ($deft_abbr != $RTR->config->item('lang_ignore'))

{

//check and set the default uri identifier

$index_page .= ($index_page == '') ? "{$deft_abbr}" : "/{$deft_abbr}";

$uri_string = $RTR->uri->uri_string;

//remove an invalid abbreviation from uri

if (strlen($lang_abbr) == 2)

{

$uri_string = str_replace("/{$lang_abbr}", '', $uri_string);

}

//prefix forward-slash to content in uri_string

$uri_string = ($uri_string == '') ? '' : '/'.$uri_string;

//redirect after inserting language id

header("Location:".$base_url.$index_page.$uri_string);

}

//get the language name

$user_lang = $lang_uri_abbr[$deft_abbr];

}

else

{

//get the language name

$user_lang = $lang_uri_abbr[$lang_abbr];

//reset config language to match the user language

$RTR->config->set_item('language', $user_lang);

$RTR->config->set_item('language_abbr', $lang_abbr);

//check for abbreviation to be ignored

if ($lang_abbr != $RTR->config->item('lang_ignore'))

{

//check and set the user uri identifier

$index_page .= ($index_page == '') ? "{$lang_abbr}" : "/{$lang_abbr}";

}

}

//reset the the config index_page value

$index_page .= ($index_page == '') ? '' : '/';

$RTR->config->set_item('index_page', $index_page);

}

}

>-----8<-----

Запомните: Изменение идентификатора языка еще не означает, что язык изменится. Используйте значение переменной $config[‘language’] чтобы определить, какие файлы переводов нужно подключать к вашему приложению или модулю.

Расширенная функция-помощник для показа ссылок на все разрешенные в системе языки.

Если вам необходимо показать ссылку на все языки, которые используются на сайте, вы можете использовать эту функцию-помощник. Добавьте в конфигурируюший файл такие строки:

application/config/config.php

>-----8<-----

//language descriptions

$config['lang_desc']=array("es"=>"Versión en español",

"en" => "English version",

"gl" => "Versión en galego");

>-----8<-----

Создайте файл MY_url_helper.php в вашем приложении со следующим содержимым

MY_url_helper.php

>-----8<-----

<?php

if (!defined('BASEPATH')) exit('No direct script access allowed');

/**

* Alternative languages helper

*

* Returns a string with links to the content in alternative languages

*

* version 0.2

* @author Luis <luis@piezas.org.es>

*/

function alt_site_url($uri = '')

{

$CI =& get_instance();

$actual_lang=$CI->uri->segment(1);

$languages=$CI->config->item('lang_desc');

$ignore_lang=$CI->config->item('lang_ignore');

if (empty($actual_lang))

{

$uri=$ignore_lang.$CI->uri->uri_string();

$actual_lang=$ignore_lang;

}

else

{

if (!array_key_exists($actual_lang,$languages))

{

$uri=$ignore_lang.$CI->uri->uri_string();

$actual_lang=$ignore_lang;

}

else

{

$uri=$CI->uri->uri_string();

$uri=substr_replace($uri,'',0,1);

}

}

$alt_url='';

foreach ($languages as $lang=>$lang_desc)

{

if ($actual_lang!=$lang)

{

$alt_url.='<a href='.config->slash_item('base_url');

if ($lang==$ignore_lang)

{

$new_uri=ereg_replace('^'.$actual_lang,'',$uri);

$new_uri=substr_replace($new_uri,'',0,1);

}

else

{

$new_uri=ereg_replace('^'.$actual_lang,$lang,$uri);

}

$alt_url.=$new_uri;

$alt_url.='">'.$lang_desc.'</a><br />';

}

}

return $alt_url;

}

?>

>-----8<-----

И чтобы показать ссылку на все яыки, в файле вида (view) можно использовать такую конструкцию:

<div id="alternative_languages">

<?php echo alt_site_url();?>

</div>

В результате будет сгенерирован примерно такой код

<div id="alternative_languages">

<a href="http://example.com/mycontroller/myfunction/">English version</a><br />

<a href="http://example.com/gl/mycontroller/myfunction/">Versión en galego</a><br />

</div>

Если вам необходимо показать разные картинки (например, флаги стран) для разных языков, тогда в файл application/config/config.php можно добавить строки

application/config/config.php

>-----8<-----

//language use images

$config['lang_useimg'] = true; //or false to use only text

>-----8<-----

И нужно внести изменения в файл MY_url_helper.php

>-----8<-----

<?php

if (!defined('BASEPATH')) exit('No direct script access allowed');

/**

* Alternative languages helper

*

* Returns a string with links to the content in alternative languages

*

* version 0.2

* @author Luis <luis@piezas.org.es>

* @modified by Ionut <contact@quasiperfect.eu>

*/

function alt_site_url($uri = '')

{

$CI =& get_instance();

$actual_lang=$CI->uri->segment(1);

$languages=$CI->config->item('lang_desc');

$languages_useimg=$CI->config->item('lang_useimg');

$ignore_lang=$CI->config->item('lang_ignore');

if (empty($actual_lang))

{

$uri=$ignore_lang.$CI->uri->uri_string();

$actual_lang=$ignore_lang;

}

else

{

if (!array_key_exists($actual_lang,$languages))

{

$uri=$ignore_lang.$CI->uri->uri_string();

$actual_lang=$ignore_lang;

}

else

{

$uri=$CI->uri->uri_string();

$uri=substr_replace($uri,'',0,1);

}

}

$alt_url='<ul>';

//i use ul because for me formating a list from css is easy

foreach ($languages as $lang=>$lang_desc)

{

if ($actual_lang!=$lang)

{

$alt_url.='<li><a href='.config->slash_item('base_url');

if ($lang==$ignore_lang)

{

$new_uri=ereg_replace('^'.$actual_lang,'',$uri);

$new_uri=substr_replace($new_uri,'',0,1);

}

else

{

$new_uri=ereg_replace('^'.$actual_lang,$lang,$uri);

}

$alt_url.=$new_uri.'">';

if ($languages_useimg){

//change the path on u'r needs

//in images u need to have for example en.gif and so on for every

//language u use

//the language description will be used as alternative

$alt_url.= '<img src="'.base_url().'images/'.$lang.'.gif" alt="'.$lang_desc.'"></a></li>';

}

else

{

$alt_url.= $lang_desc.'</a></li>';

}

}

}

$alt_url.='<ul>';

return $alt_url;

}

?>

>-----8<-----

Так же в этом разделе:
← Содержание ...
 
MyTetra Share v.0.35
Яндекс индекс цитирования