我是一个webapp (任务管理器)的开发者。
这个应用程序必须有多种语言版本。因此,用户有常用的语言下拉菜单来切换到不同的语言。
我不得不构建一个以MySQL作为后端的自定义翻译系统,因为我有特定的约束。
系统上的主表(包括一些记录作为示例)是translation表:
id | language_id | string_id | message
1 | en | WELCOME | welcome
2 | it | WELCOME | benvenuto 我可以编写一个函数getTranslatedMessage,它将获得string_id作为输入,并将_检测当前语言_进行数据库查询并检索一行_返回翻译后的消息
这样的系统的问题是会给数据库带来很大的压力。如果我在一个页面上有20个字符串要翻译,那么每个页面加载将有20个对数据库的查询。
您是否认为我应该走这条路,因为它是最干净和最简单的,使用memcache保存每个getTranslatedMessage输出的结果,并使用language_id和string_id作为memcache条目的键?
你会用一种不同的方式来做吗?
我在想,也许可以在启动时将一种语言的所有消息加载到全局数组$lang中。
任何建议都将是非常受欢迎的,因为这个组件将是我的应用程序中的关键。
谢谢,
丹
发布于 2011-03-05 20:15:00
这不是应用程序数据。它不属于数据库。(请看osCommerce作为一个很好的例子来说明不要遵循这条道路)。因为您已经计划一下子读取它,所以您可以很好地将应用程序UI文本存储在文件中。
冗长的getTranslatedMessage()函数名和助记符消息ids也不是一个好主意。使用原始的英语句子,而不是大写的缩写。并使翻译函数调用变得不那么麻烦。否则,一旦超出了预期的20个字符串,就会使您的应用程序更加不便。(OTOH如果您想从心理上限制翻译的数量,msgid和长函数名是合适的。)
这是一个无聊的建议。但是你应该考虑使用原生PHP gettext functions。它们有很多缺点,但不适用于此目的。
发布于 2011-03-05 20:13:20
您的表中有多少条记录?如果没有太多(<10000),当然必须将其加载到一个数组中,然后从该数组中获取变量。
$LANG = array();
$result = mysql_query("SELECT string_id, message FROM translation");
while ($row = mysql_fetch_row($result))
$LANG[$row[0]] = $row[1];
function __($id) {
global $LANG;
return (isset($LANG[$id])) ? $LANG[$id] : $id;
}使用名称__()而不是getTranslatedMessage。这要简单得多。
发布于 2011-03-05 20:14:18
对于多语言网站,我使用全局字典,散列表放在不同的文件中。例如:
-带有英文翻译的文件
$lang['hello'] = 'Hello';-带有德语翻译的文件
$lang['hello'] = 'Hallo';我只是包含了所需的文件。我认为这是相当便宜的资源和快速。添加另一种语言文件(即使是web表单)并使用它也很容易。
https://stackoverflow.com/questions/5203664
复制相似问题