优化多语言支持功能


Optimize function for multiple language support

我已经为我的一个项目创建了自己的多语言支持。我有 3 个不同的数据库表:languageslanguages_variableslanguages_words(如下所示)。

CREATE TABLE IF NOT EXISTS `languages` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_user` int(11) NOT NULL,
  `data_name` text NOT NULL,
  `data_currency` text NOT NULL,
  `is_standard` tinyint(4) NOT NULL,
  `data_note` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)
CREATE TABLE IF NOT EXISTS `languages_variables` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data_name` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)
CREATE TABLE IF NOT EXISTS `languages_words` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_language` int(11) NOT NULL,
  `id_variable` int(11) NOT NULL,
  `data_name` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)

当我想将特定字符串提取到网站时,我将使用一个名为 language() 的函数(如下所示)。 下面的代码中的$user获取有关登录用户的信息,例如用户选择的语言。

使用该函数,我可以简单地调用与language('menu_about') languages_variables的变量(menu_about只是一个变量的示例)。

function language($variable) {
    global $user;

    # DATABAS (kontrollera)
    $check_language = sql("SELECT COUNT(lv.data_name)
                           FROM languages AS l
                           JOIN languages_variables AS lv
                           JOIN languages_words AS lw
                           ON l.id = lw.id_language
                           WHERE lv.data_name = :variable
                           AND lw.id_language = :idlanguage
                          ", Array('idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language']),
                                   'variable' => $variable), 'count');
    # DATABAS (räkna)
    $count_words = sql("SELECT COUNT(lw.id)
                        FROM languages_words AS lw
                        JOIN languages_variables AS lv
                        ON lw.id_variable = lv.id
                        WHERE lw.id_language = :idlanguage
                        AND lv.data_name = :variable
                       ", Array('idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language']),
                                'variable' => $variable), 'count');

    # KONTROLL
    if($check_language == 0 OR $count_words == 0) {
        return $variable;

    # KONTROLL
    } else {
        # DATABAS (hämta)
        $get_languages = sql("SELECT *,
                                     lv.data_name AS name_variable,
                                     lw.data_name AS name_translation
                              FROM languages AS l
                              JOIN languages_variables AS lv
                              JOIN languages_words AS lw
                              ON lv.id = lw.id_variable
                              WHERE lv.data_name = :variable
                              AND lw.id_language = :idlanguage
                             ", Array('variable' => $variable,
                                      'idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language'])));

        # LOOP
        foreach($get_languages AS $language) {
            # KONTROLL
            if($language['name_variable'] == $variable) {
                return $language['name_translation'];
            # KONTROLL
            } else {
                return $variable;
            }
        }
    }
}

问题是网站加载速度非常慢,其中包含language()中的所有内容。特别是当我从数据库中列出很多项目时(例如循环示例)。加载速度从不到 2 秒到不到 10 秒。

有没有另一种更好、更快捷的方法来获取所选语言字符串?

更新我将加载速度从 7-8 秒降低到 3-4 秒。但它仍然太慢了。

function language($variable) {
    # DATABAS (hämta)
    $language = sql("SELECT lv.data_name AS name_variable,
                            lw.data_name AS name_word
                     FROM languages AS l
                     JOIN languages_variables AS lv
                     JOIN languages_words AS lw
                     ON lv.id = lw.id_variable
                     WHERE lv.data_name = :variable
                     AND l.id = :idlanguage
                    ", Array('variable' => $variable,
                             'idlanguage' => ($user['id_language'] == 0 ? '1' : (int)$user['id_language'])), 'fetch');

    return $language['name_word'];
}

我正在考虑使用文件(sv.php,en.php等)而不是数据库。但是用户无法从浏览器翻译网站(如果我不牺牲自己几个小时的鲜血、汗水和眼泪)。

首先使用 Xhprof 分析构建以验证 PHP 性能。对于SQL调用,Google Chrome有一个内置的Web检查器,可以让你知道每个组件需要多长时间(Firebug for Firefox)。

如果您发布日志,它可以大大有助于建议相关的改进领域。