网上实现方式最多的是采用hooks:即在pre_controller挂勾点,做一个hooks处理,从url中获取出语言段
但是当我在使用该方法的时候,却遇到了不少问题,因为我做了HMVC扩展,可能是因为这个原因,使得hooks总是报错,于是我改成了以下思路:
1、开启URL重写
1)修改application/config/config.php
$config['index_page'] = ""; $config['uri_protocol'] = "AUTO"
2)修改php.ini
cgi.fix_pathinfo = 0
3)开启apache的url重写模块
4)在项目根目录新建.htaccess文件,内容如下:
RewriteEngine On RewriteCond %{REQUEST_URI} ^/system.* RewriteRule ^(.*)$ index.php?/$1 [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)$ index.php?/$1 [L]
5)重启apache
2、修改application/config/routes.php,新增后边两行
$route['default_controller'] = "home"; $route['404_override'] = ''; //定义语言选择路由 $route['(en)(:any)'] = "$2"; $route['en'] = "home";
3、在application/core/下新建MY_Controller类并继承自CI_Controller:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class MY_Controller extends CI_Controller { function __construct(){ parent::__construct(); $my_lang = $this->uri->segment(1); $this->config->set_item('lang_path',''); //默认语言为中文Chinese if ($my_lang=='en') { //动态设置当前语言为'en' $this->config->set_item('language', $my_lang); //将语言段自动配置到url $this->config->set_item('lang_path',$my_lang.'/'); } $this->load->helper('language'); } }
4、所有需要用到判别language的控制器,均继承自我自己创建的MY_Controller类
class User extends MY_Controller
5、在控制器中加载语言文件,如:加载application/languages/en/error_lang.php
$this->lang->load('error'); $errmsg = array( 'error' => lang('error_login_failed') );
6、在对应的语言模板中输出
<?=$error?>
7、地址栏输入:
yourwebsite/en 显示英文模板
yourwebsite/ 显示默认语言模板 默认语言模板在application/config/config.php 配置$config['language']项即可
8、完成