loveinlove 发表于 2012-6-23 04:32:21

多语言系统,切换语言时动态更新config['language']

本帖最后由 loveinlove 于 2012-6-23 16:46 编辑

最近在做简繁双版的OA系统。需要用到语言切换。

原本很简单的使用 $this->lang->load('somelang',$language);进行加载语言。

但是发现系统的一些库语言并没有跟着一起切换。比如上传类,表单验证类等等

本以为要对index.php 动手脚了。但是看了下CodeIgniter.php 的load顺序。思路有了。

需要借助cookies
用户每切换一次语言更新一次cookies
$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
<?phpif ( ! 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()) 可以添加新数组。貌似也可以使用。


exploit 发表于 2012-6-23 05:17:52

LZ大半夜的还起来发帖。。。。。

loveinlove 发表于 2012-6-23 16:46:59

呵呵,最近事多,只能夜里赶项目。 正好写完了,就 复制粘贴上来。

网顺达 发表于 2012-6-24 22:49:34

有时间可以看看Ionize,多语言,SEO,都支持,并且非常简单。
我也是刚刚接触CI和Ionize,还没有做出来过东西。
页: [1]
查看完整版本: 多语言系统,切换语言时动态更新config['language']