我有一个PHP站点。现在,我需要将它“转换”成一个多语言的网站,增加一个选项,用户将能够选择他们喜欢的语言。假设我想要2种语言作为乞丐,然后在需要的时候用一种聪明的方法来添加新的语言。
数据库与语言文件……
我知道有两种选择。
1)可以根据用户的首选语言,每次使用带有语言、翻译等的MySQL数据库表从数据库中检索数据,这就意味着需要大量的数据库请求。
2)我可以使用define命令使用外部语言PHP文件(就像有些电子商务框架将不同的语言文件放入语言文件夹,如fr.php、eng.php等)。
还有什么更好的?答案必须基于以下论点及其利弊。
1)最佳表现
2)灵活性
3)更有效率
4)智能方式
5)资源使用(CPU、内存等)
在我的例子中,谷歌网站的翻译工具并不是一个合适的解决方案。
发布于 2012-04-06 17:11:17
在我看来,数据库解决方案是非常昂贵的,并不是真正需要的。也许你的网站有静态的(不变的)语言短语。在这种情况下,您应该使用语言数组将它们存储为$array['key'] = 'phrase',并能够通过全局的方法检索它们。就像这样:
class Lang {
private static $loaded;
private static $array;
private static function set($key, $value) {
self::$array[$key] = $value;
}
public static function get($key, $default = 'empty') {
$lang = LANG;
$file = "lang/$lang.php";
if (!in_array($lang, self::$array) and file_exists($file)) {
include($file);
self::$loaded[] = $lang;
}
return (isset(self::$array[$key])
? self::$array[$key]
: $default;
}
}现在您只需将语言文件存储为lang/en.php或lang/it.php.其中包含如下内容:self::set('MY_KEY', 'This is a phrase');,然后将LANG设置为每个请求的正确请求。我使用了一个常量的LANG,但是还有其他方法来存储全局的东西。
您可以也可能是首选使用非静态类.例如:
class Lang {
private $lang;
public function __construct($lang) {
$file = "lang/{$lang}.php";
if (file_exists($file))
include($file);
}
private function set($key, $value) {
$this->lang[$key] = $value;
}
public function get($key, $default = 'empty') {
return (isset($this->lang[$key])
? $this->lang[$key]
: $default;
}
}但是,每次需要时,都应该使用依赖项注入来注入这个类。一个用法示例:
$lang = new Lang('en');
$lang->get('LANG_KEY');https://stackoverflow.com/questions/10046610
复制相似问题