CI 多国语言

需求

  1. 默认访问与浏览器相同语言的页面
  2. 使用便于 SEO 的链接形式
  • sample.com/ - 默认简体中文
  • sample.com/sc/ - 简体中文
  • sample.com/tc/ - 繁体中文
  • sample.com/en/ - 英语

URL 路由

修改路由配置文件 application/config/routes.php ,末尾添加内容:

$route['en'] = 'welcome';
$route['tc'] = 'welcome';
$route['sc'] = 'welcome';
$route['en/(.+)'] = '$1';
$route['tc/(.+)'] = '$1';
$route['sc/(.+)'] = '$1';

打开 hook 功能

修改配置文件 application/config/config.php,启用$config['enable_hooks'] = TRUE;,设置$config['base_url'] = 'http://example.com/';为网站的域名。

修改 hook 配置文件 application/config/hooks.php,末尾添加内容:

$hook['pre_controller'][] = array(
    'class'    => 'LanguageClass',
    'function' => 'set_language',
    'filename' => 'Languageclass.php',
    'filepath' => 'hooks'
);

编写功能

新建文件 application/hooks/Languageclass.php:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class LanguageClass extends CI_Controller {

    public function set_language()
    {
        // 获取 url 第一段字符
        $url_lang = strtolower( $this->uri->segment(1) );
        

        // 如果没有指定语言,使用浏览器默认语言,并跳转(简体除外)
        if ( ! $url_lang ) 
        {
            // 判断浏览器语言
            $l = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4);
            if ( preg_match("/zh-c/i", $l) )
                $l = 'sc';
            else if ( preg_match("/en/i", $l) )
            {
                $l = 'en';
                // 如果是英语浏览器,跳转到 .com/en 下
                $this->load->helper('url');
                Header( "HTTP/1.1 301 Moved Permanently" ) ;
                Header( "Location: ".base_url('en') );
            }
            else if ( preg_match("/zh/i", $l) )
            {
                $l = 'tc';
                $this->load->helper('url');
                // 如果是繁体浏览器,跳转到 .com/tc 下
                Header( "HTTP/1.1 301 Moved Permanently" ) ;
                Header( "Location: ".base_url('tc') );
            }
            else
                $l = 'sc'; // 默认为简体中文
        }
        else if ( $url_lang == 'en' )
            $l = 'en';
        else if ( $url_lang == 'tc' )
            $l = 'tc';
        else if ( $url_lang == 'sc' )
            $l = 'sc';
        else
            $l = 'sc';


        // 动态修改配置文件的默认语言
        $this->config->set_item('language', $l);
    }
 
}

使用

在 application/language/ 下新建目录 en、sc、tc,每个目录中添加文件 ui_lang.php,内容如下:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

$lang['ui_title']       = '指定语言的字符';

注意:application/language 中所有新建的语言目录都需要到 system/language/english/ 中把 CI 本身所需要的语言文件全部复制过来,也可去 github 上下载已经翻译的语言文件。

在需要用到的控制器文件中$this->lang->load('ui');载入所需要的 _lang.php 文件,在视图文件中输出<?php echo $this->lang->line('ui_title'); ?>

手册

标签: 多国语言, CodeIgniter