多语言PHP站点

多语言PHP站点,php,mysql,database,Php,Mysql,Database,我有一个PHP网站。现在,我需要通过添加一个选项将其“转换”为多语言站点,用户可以在其中选择自己喜欢的语言。比如说,我想要两种语言,然后是一种在需要时添加新语言的智能方法 数据库与语言文件… 我知道有两种选择 1) 我可以使用带有语言、翻译等的MySQL数据库表,每次都基于用户的首选语言从数据库检索数据,这意味着大量的数据库请求 2) 我可以使用define命令使用外部语言PHP文件(例如,一些电子商务框架将不同语言的文件放入语言文件夹,如fr.PHP eng.PHP等) 什么更好?答案必须基于

我有一个PHP网站。现在,我需要通过添加一个选项将其“转换”为多语言站点,用户可以在其中选择自己喜欢的语言。比如说,我想要两种语言,然后是一种在需要时添加新语言的智能方法

数据库与语言文件…

我知道有两种选择

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

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

什么更好?答案必须基于以下论点及其利弊

1) 最佳性能

2) 灵活性

3) 更有效率

4) 智能方式

5) 资源使用率(CPU、内存等)


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

老实说,数据库解决方案非常昂贵,并不真正需要。可能你的网站有静态(不改变)的语言短语。在这种情况下,您应该使用一个语言数组将它们存储为
$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');

在我的工作中,我们总是使用语言文件。它们驻留在服务器上,可以通过框架轻松访问,下载它们的响应时间几乎为零。如果您的数据库或任何东西出现故障(无论是维护还是其他),至少您的语言将始终可供用户使用。这并不是说将其放入数据库不是一个好主意,我只是在另一方面有更多的经验。看看这个问题: