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

[优化] CI创建多语言站点一点心得

[复制链接]
发表于 2012-8-7 15:50:24 | 显示全部楼层 |阅读模式
本帖最后由 onenature 于 2012-8-7 16:19 编辑

多语言站点创建方法见:  http://codeigniter.org.cn/forums/forum.php?mod=viewthread&tid=5041

在坛子里学习, 要回报于坛子里. @zycbob 通过路由和钩子实现多语言的方法很方便. 用起来呼呼生风. 这就把使用中碰到的两个问题和人家交流下.

首先是关于语言自动加载的问题.

在CI系统中, 所有 config 目录里的配置都先于 pre_controller 钩子事件. 什么意思呢? 对于多语言来说, 就是我们配置的语言包已经加载后, 系统才确定用户访问的是哪种语言.

问题来了. 具体表现就是不论你URI里指定何种语言, 最终呈现的都会是 config 里指定的默认语言(注意, 这里只限自动加载的语言文件). 所以在利用钩子实现语言识别的同时, 我们还要对自动加载语言进行一些处理. 代码很简单, 如下:

PHP复制代码
if(file_exists(include(APPPATH.'config/autoload.php'))){
                        include(APPPATH.'config/autoload.php');
                        if(isset($autoload) && isset($autoload['language2']))
                        {
                                $this->load->language($autoload['language2']);
                        }
                }
复制代码


我在 autoload.php 里新增一个变量(language2)来替换掉 CI 原有的 language 来管理需要自动加载的语言, 主要是为了减少不必要的重复操作.

第二个问题, URI和路由规则. 当然, 这个其实也算不了什么问题

在多语言环境下, 明确指定当前是何种语言还是有必要的. 所以当没有明确指定语言时应该将页面重定向到默认语言, 而当指定的语言不在支持列表中时也可以转向默认语言.

当这样对URI进行统一后有几个好处:
  • 便于监测
  • 精简路由脚本

具体代码. 我这里只修改了 set_lang 方法:
PHP复制代码
$lan_list = Array('en','cn'); // 支持的语言列表
                $my_lang = $this->uri->segment(1); // 从URI中获取语言标记,如 'en','cn', etc.
                $default = config_item('language'); // 系统默认使用的语言
               
                // 如果语言不在支持列表中则跳转到默认语言
                // 这里有两种情况: 没有设置语言和语言不在支持列表
                if (array_search($my_lang, $lan_list) === FALSE)
                {
                        redirect($default . '/' . $this->uri->uri_string());
                }
                $this->config->set_item('language', $my_lang);
               
                // 自动加载语言
                // 需要在 config/autoload.php 文件中新增一个设置, 名称随意.
                // $autoload['language2'] = Array()
                if(file_exists(include(APPPATH.'config/autoload.php'))){
                        include(APPPATH.'config/autoload.php');
                        if(isset($autoload) && isset($autoload['language2']))
                        {
                                $this->load->language($autoload['language2']);
                        }
                }
复制代码

更多还可以上这了解: http://www.rijiyuelei.me/2012/08/ci-based-multi-language-site/




本版积分规则