有几种方案来实现网站的多语言版本:
*) 基于url的方案( 比如{locale}.yeenav.com 或者 www.yeenav.com/{locale} )
*) 基于session/cookie的方案( 通过记录用户语言选项在session中来实现切换)
*) 基于theme的方案( 通过切换不同语言版本的theme来实现)
其中基于url的方案更为SEO友好。
下面简单介绍CakePHP中如何实现基于url的方案。
1、url格式
使用iso code3来唯一标识语言
http://www.yeenav.com/
eng/articles/add <-> http://www.yeenav.com/
chi/articles/add
2、添加语言前缀相关路由
CakePHP已经在Router基类中实现了这个方法,我们可以在自己的路由配置文件比如app/config/yeenav_routes中直接调用:
YeenavRouter::localize();
该方法把locale参数自动添加到domain后面,如1所示格式。
3、在settings中添加语言开关:
Config.language: chi
Translate: 1
这代表默认语言为中文,且支持多语言url。
4、添加语言切换的界面链接
<p style="display: inline-block;">
<?php echo $html->link('English', array('locale'=>'eng')); ?>
</p>
<p style="display: inline-block;">
<?php echo $html->link('中文', array('locale'=>'chi')); ?>
</p>
5、把locale写入config
在app/app_controller中添加如下代码:
if (isset($this->params['locale'])) {
Configure::write('Config.language', $this->params['locale']);
}
6、最后一步,自动把语言参数添加到所有网站链接中
在app/app_helper中添加如下方法:
public function url($url = null, $full = false) {
if (!isset($url['locale']) && isset($this->params['locale'])) {
$url['locale'] = $this->params['locale'];
}
return parent::url($url, $full);
}
这样网站就实现了i18n和i10n特性,可见用CakePHP来实现多语言方案是相当容易的。前提是所有的字符串必须遵循__()的编程规范。
如果网站中存在一些动态内容,比如产品描述,那么还需要DB层面的设计(添加语言字段)以支持多语言版本内容的录入。这不在本文涵盖范围。