MENU

基于php框架的多国语言思路

December 9, 2013 • 程序阅读设置

不难知道,想使网站多国语言化,最简单的方法便是直接调用在线翻译。傻子都知道这种做法是做了等于没做,体验一定是非常不佳的。直接机翻,不可行。

在网上查了一下,最正统的解决方法是使用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转换实现。

Archives Tip
QR Code for this page
Tipping QR Code