关于网站多语言的实现

时间:2021-11-08 13:47:39

目前见到的网站多语言支持有两种:

  1. 两个视图,即制作两个版本的视图文件。比如项目分两个模块,样式什么的都一样,视图不一样。

  2. 通过存session,记录当前语言版本,然后调用不同的文字配置文件,显示不同的语言文字。如thinkphp的多语言实现方法。

其实在一开始看到thinkphp的源码是通过session实现时,我就有想过通过另一种方法,有点结合两个方法的意思。

第一种方法分两个模块,但是controller什么的都一样,修改起来就很麻烦,两个模块都得一起改动。

第二种方法,虽然现在我们网站是这样做的,但是视图里都是变量,文字全存在配置文件里,看着变扭,修改的时候通过文字找位置也麻烦,所有文字全部存变量的形式在配置文件中,取名也麻烦

我自己的想法是借用thinkphp的多语言实现方法,只是最后不读取文字配置文件,而是在渲染视图时,先判断语言版本,再渲染对应的视图。虽然修改视图两个都需要改,但是整体我感觉更舒服容易维护。


class IndexController extends Controller
{

public function index()
{

if(session('lang') == 'us')
{
return $this->fetch('index_us');
}else{
return $this->fetch('index_cn');
}
}
}

//一劳永逸的方法是修改fetch源代码,在fetch()内部进行判断,然后自动组成对应语言的视图文件名。简单举例:

class Controller
{

//原函数
/*
protected function fetch($template = '', $vars = [], $replace = [], $config = [])
{
return $this->view->fetch($template, $vars, $replace, $config);
}
*/


//修改
protected function fetch($template = '', $vars = [], $replace = [], $config = [])
{

$lang = session('?lang') ? session('lang') : 'cn';
$template .= '_'.$lang;
return $this->view->fetch($template, $vars, $replace, $config);
}
}

因为功力尚浅,得出如此结论,可能随着阅历提升,会找到更好的办法,仅此作为学习记录