需求
- 默认访问与浏览器相同语言的页面
- 使用便于 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'); ?>
。
手册