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.php 中添加如下代码:

$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 )来实现,有兴趣的朋友可以测试一下。

相关文章: