我已经为我的一个项目创建了自己的多语言支持。我有 3 个不同的数据库表:languages
、languages_variables
和 languages_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)。
如果您发布日志,它可以大大有助于建议相关的改进领域。