|
本帖最后由 loveinlove 于 2012-6-23 16:46 编辑
最近在做简繁双版的OA系统。需要用到语言切换。
原本很简单的使用 $this->lang->load('somelang',$language);进行加载语言。
但是发现系统的一些库语言并没有跟着一起切换。比如上传类,表单验证类等等
本以为要对index.php 动手脚了。但是看了下CodeIgniter.php 的load顺序。思路有了。
需要借助cookies
用户每切换一次语言更新一次cookies
PHP复制代码 $language = $this->input->post('some_language');
$language_array = array('sc','tc');
if(!in_array($language, $language_array))
{
$language = 'sc';
}
$lang_cookie = array(
'name' => 'some_lang',
'value' => $language,
'expire' => 0
);
$this->input->set_cookie($lang_cookie);
复制代码
在application/core 中新建MY_Lang.php
PHP复制代码 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class MY_Lang extends CI_Lang
{
public function __construct ()
{
parent ::__construct ();
$this->change_sys_lang();
}
function change_sys_lang ()
{
//lang 核心库在 controller之前load所以不能使用 get_instance,用全局变量
global $CFG;
$my_lang_config =& get_config ();
$lang_array = array('sc','tc');
if (isset($_COOKIE["some_lang"]))
{
$lang = $_COOKIE["some_lang"];
if(!in_array($lang, $lang_array))
{
$lang = 'sc';
}
if($lang != $my_lang_config['language'])
{
$CFG->set_item('language',$lang);
}
}
else
{
if(!in_array($my_lang_config['language'],$lang_array))
{
$CFG->set_item('language','sc');
}
}
}
}
复制代码
如此,在应用中,可以直接$this->lang->load('somelang');没必要再指定语言类。一些类库的语言也能跟着改变。
因为这是内部应用,我没必要兼顾seo,直接cookies存值
多语言站点,还是建议使用 url段落或者子域名区分语言,对seo有利。并且也能省去本cookie。
在看 system/core/config.php 时还发现一个函数 _assign_to_config($items = array()) 可以添加新数组。貌似也可以使用。
|
|