|
本帖最后由 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/
|
|