|
|||||||
Интернационализация, вариант wiki сайта codeigniter.com
Время создания: 15.02.2011 14:55
Текстовые метки: CI, CodeIgniter, i18n, язык
Раздел: Компьютер - Программирование - Язык PHP - CodeIgniter
Запись: xintrea/mytetra_syncro/master/base/0000003422/text.html на raw.github.com
|
|||||||
|
|||||||
Как указать идентификатор языка через 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<----- |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|