PHP Custom Webapp翻译系统 - 优化建议

时间:2011-03-05 11:57:55

标签: php translation

我是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和{{1}作为memcache条目的关键?

你会以不同的方式做到这一点吗?

我想在启动时加载全局数组string_id中的语言的所有消息。

任何建议都非常受欢迎,因为这个组件将成为我申请中的关键。

谢谢,

4 个答案:

答案 0 :(得分:3)

您的桌子中有多少条记录?如果你没有太多(< 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。这更容易。

答案 1 :(得分:3)

这不是应用程序数据。它不属于数据库。 (请参阅osCommerce作为不遵循此路径的良好示例)。由于您已经计划一次性阅读它,因此您可以将应用程序UI文本存储在文件中。

冗长的getTranslatedMessage()函数名称和助记符消息ID都不是一个好主意。使用原始英语句子而不是大写缩写。并使翻译函数调用不那么繁琐。否则,一旦超出预期的20个字符串,它将使您的应用程序更加不方便。 (OTOH如果你想在心理上限制翻译量,那么msgid和长函数名是合适的。)

这是无聊的建议。但是你应该考虑使用本机PHP gettext functions。它们有很多缺点,但适合这个目的的不适合。

答案 2 :(得分:2)

对于多语言网站,我使用全局词典,分隔文件中的哈希表。 例如:

---带英文翻译的文件---

$lang['hello'] = 'Hello';

---带德语翻译的文件---

$lang['hello'] = 'Hallo';

我只是要包含所需的文件。 我认为这是非常便宜的资源和快速。可以轻松添加另一种语言文件(即使使用Web表单)并使用它。

答案 3 :(得分:1)

我试图建立自己的基于翻译的系统。

我将我的翻译存储在数据库中,以便于修改它们。然后我使用这段代码创建一个超级全局。 E.x.下面!

$sql = mysql_query("SELECT * FROM `f_translations` where `language` = '".mysql_real_escape_string($setting[language])."'");
while ($a = mysql_fetch_array($sql)) { $name=$a['category'].'-'.$a['name']; $language[$name] = utf8_encode($a['translation']);}

祝你好运!

相关问题