不难知道,想使网站多国语言化,最简单的方法便是直接调用在线翻译。傻子都知道这种做法是做了等于没做,体验一定是非常不佳的。直接机翻,不可行。
在网上查了一下,最正统的解决方法是使用gettext扩展,然而我没有接触过,这里就不提它了。本文中的方案,我们从一个请求开始。
请求执行到调度器之前,使用一段代码判断cookie中有无语言项并判断其合法性(是否有这个语言)。若cookie中无而已登录账户,则将本账户指定的语言写入cookie。若仍无,跳转至语言选择页面。有的情况下,将语种写入常量LANG。程序继续执行到控制器,View层模版均需为不同的语言编写不同文件,如某路径为"Tpl/cn/index_index.tpl"。动态输出的内容也需要处理。为了避免空间复杂度太大,我们为每个控制器(必要时为某些方法)单独编写语言文件。形如:
<?php
return array(
'key'=>'value'
);
选定一个目录存放语言文件,如某文件路径Lib/Lang/cn/user.php
。编写一个函数importLang()
用于导入语言文件;编写一个函数Lang()
用于调用语言。伪代码如下:
<?php
/**
*@param $key mixed(string/array)
*/
function Lang($key){
static $list;
if(is_array($key)){
$list=$key;
return;
}
else{
$res=isset($list[$key])?$list[$key]:NULL;
return $res;
}
}
/**
*@param $path string
*/
function importLang($path){
//设框架根目录为常量PATH
$path=PATH.'Lib/Lang/'.LANG.'/'.$path.'.php';
Lang(require($path));
return;
}
考虑当Lib/Lang/cn/test.php
含有return array('HW'=>'你好世界!');
时,依次执行importLang('test');echo Lang('HW');
。此时应有输出你好世界!
。
此外,当方法有涉及数据库的动态输出时,应针对不同的语言建立不同字段,有必要时可分表。中文的简繁转换,可简单地通过客户端使用JavaScript转换实现。