1

我有一个 PHP 网站。现在我需要通过添加一个选项将其“转换”为多语言网站,用户可以在其中选择他们喜欢的语言。假设我想要 2 种语言作为开始,然后在需要时以一种聪明的方式添加新语言。

数据库 VS 语言文件...

据我所知,有两种选择。

1)我可以使用带有语言、翻译等的 MySQL 数据库表,并且每次都根据用户的首选语言从数据库中检索数据,这意味着大量的数据库请求。

2)我可以使用define命令使用外部语言PHP文件(比如一些将不同语言文件放入语言文件夹的电子商务框架,如fr.php eng.php等)

什么是更好的?答案必须基于以下论点及其优缺点。

1) 最佳性能

2) 灵活性

3) 更高效

4)智能方式

5)资源使用(CPU,内存等)

PS 网站的谷歌翻译工具对我来说不是一个合适的解决方案。

4

1 回答 1

2

老实说,数据库解决方案非常昂贵,并不是真正需要的。您的网站可能有静态(不会改变)的语言短语。在这种情况下,您应该使用语言数组将它们存储为$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.phpor 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');
于 2012-04-06T17:11:17.167 回答