Ethan's Blog

不负好时光

CodeIgniter的多语言实现

学习和使用CodeIgniter进行Web开发已经有一段时间了,自己也做过一些项目,对CodeIgniter的各种优缺点也有了更多的认识。最近在对自己以前写的一个网站进行重构,其中要实现的功能之一就是网站的多语言实现。以前采用的方案并没有使用到CodeIgniter的语言类,而是用了比较笨的方法来做这个事情,现在随着姿势水平的提高,将更好的实现方法记录和分享一下。

CodeIgniter的多语言实现将根据网址中代表语言URL段的不同来显示不同语言的界面。整个网站使用一套MVC代码,根据访问的URL的不同加载使用不同的语言文件。网站默认显示语言为中文,URL中代表语言的段缺省,当URL中加入语言标志段en时(http://example.com/en/somethingselse ),则加载显示英语界面。

涉及的知识和代码

准备语言文件

主要涉及语言类(http://codeigniter.org.cn/user_guide/libraries/language.html )。首先将system\language文件夹中的内容拷贝到application\language下,同时,将里面的english文件夹复制一份并重命名为chinese,这样我们就为CodeIgniter准备了两套语言文件。然后分别在english和chinese语言文件夹下新建ethantest_lang.php文件,分别填入以下的语言标志:

for english
<?php
$lang['ethantest_haha'] = "haha";
?>
for chinese
<?php
$lang['ethantest_haha'] = "哈哈";
?>

修改配置文件,设置默认语言

修改application\config\config.php中的语言配置项,我们将网站的默认语言设置为中文($config[‘language’] = ‘chinese’;)。

拓展核心类

拓展核心类(http://codeigniter.org.cn/user_guide/general/core_classes.html#id4 ),涉及的文件主要是application\core\MY_Controller.php。在这个文件中,将拓展CI_Controller类,在控制器初始化前根据网站中语言段的标志,设置网站的语言,并加载语言文件。代码如下:

class Ethantest_Controller extends CI_Controller {

    public function __construct()
    {
        parent::__construct();

        //设置语言
        $my_lang = $this->uri->segment(1);
        if ($my_lang == 'en') {
            $this->config->set_item('language', 'english');
        }
        $this->lang->load('ethantest'); //根据设置的语言相应去加载名为ethantest_lang.php的语言文件
    }
}

控制器中使用拓展的核心类

在前一步中,我们使用Ethantest_Controller拓展了CI_Controller,为控制器添加了根据URL中不同语言字段标志来加载语言文件,如果我们要使用这个特性的话,那么在所有的控制器中编写代码的时候,应使用经过拓展的核心类Ethantest_Controller,测试控制器代码如下:

class Welcome extends Ethantest_Controller {

    public function __construct()
    {
        parent::__construct();
    }

    public function haha()
    {
        $this->load->helper('language');
        echo lang('ethantest_haha');
    }

配置URL路由

为了使用户访问http://example.com/welcome/hahahttp://example.com/en/welcome/haha 都能定位到Welcome控制器下的haha方法,需要配置好URL路由(http://codeigniter.org.cn/user_guide/general/routing.html ),使用正则表达式来进行匹配,向application\config\routes.ph中添加如下代码:

$route['en/(:any)']     = "$1";

测试

至此,一个小小的多语言测试网站已经搭建好了,访问 http://example.com/welcome/haha 页面,网站将使用默认的语言,加载默认的语言文件,页面将输出“哈哈”;访问 http://example.com/en/welcome/haha 页面,网站将使用英语,加载english语言文件,页面将输出“haha”。

更多的工作

在正式的测试环境中, 我们当然不会在控制器中直接输出字符,一般来说都是在view文件中使用lang函数,为了程序方便,我们可以在autoload中设置自动加载语言辅助函数。在我们自定义的语言文件ethantest_lang.php中,我们也可以添加更多的语言Label,或者按照不同的需求增加新的语言文件,甚至增加支持的其他语言类型,总之,CodeIgniter的多语言实现具有非常大的灵活性和可拓展性。

CodeIgniter的多语言实现一个比较重要的步骤是根据URL字段设置网站语言并加载相应的语言文件,在本文中,是用拓展核心类的方案来实现的,实际上根据CodeIgniter的文档,还可以通过钩子 – 扩展框架核心(http://codeigniter.org.cn/user_guide/general/hooks.html )来实现,有兴趣的朋友可以测试一下。

相关推荐

发表评论

电子邮件地址不会被公开。 必填项已用*标注