用户
 找回密码
 入住 CI 中国社区
搜索
查看: 5793|回复: 3
收起左侧

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

[复制链接]
发表于 2012-6-23 04:32:21 | 显示全部楼层 |阅读模式
本帖最后由 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()) 可以添加新数组。貌似也可以使用。


发表于 2012-6-23 05:17:52 | 显示全部楼层
LZ大半夜的还起来发帖。。。。。
 楼主| 发表于 2012-6-23 16:46:59 | 显示全部楼层
呵呵,最近事多,只能夜里赶项目。 正好写完了,就 复制粘贴上来。
发表于 2012-6-24 22:49:34 | 显示全部楼层
有时间可以看看Ionize,多语言,SEO,都支持,并且非常简单。
我也是刚刚接触CI和Ionize,还没有做出来过东西。

本版积分规则