使用存储在MySQL中的多语言字段标题的最佳方法是什么?

时间:2015-12-31 12:14:41

标签: php html mysql

我在不同语言的MySQL表“menuLang”中存储字段或菜单项的正确标题。

作为样本:

language = 1,text[1] = "Welcome",text[2] = "Good bye"
language = 2,text[1] = "Willkommen",text[2] = "Auf Wiedersehen"

我希望在程序代码中输出变量(文本),具体取决于语言。

用户可以选择通过鼠标单击标志按钮来更改整个网页。

我不确定什么是快速的,不会花费很多资源并且效率很高。

我不知道如何做到的一般方法。我检查了互联网,但没有找到好的答案。

1 个答案:

答案 0 :(得分:0)

其他人建议您查看gettext / poedit系统进行本地化。这是一个很好的建议。

如果您肯定会使用MySQL,看起来您需要一个这样的表:

language_id    message_id     message_text
    1             1           Welcome
    2             1           Bienvenue
    3             1           Wilkommen
    1             2           See you later
    2             2           Au revoir
    3             2           Auf Wiedersehen
    1             3           File not found             

您可能还需要为每个用户提供“语言选择”属性。例如,您的language_id表中可能有一个名为user的列。

最后,如果您的本地化工作与现实世界中的大多数工作相似,那么您将拥有一种完整的语言,而其他语言将缺少一些条目。请参阅我的示例中的最后一行。我的示例中默认语言为language_id = 1

然后,当您需要消息文本时,您会知道message_iduser_id。您可以执行此查询以查找文本。

 SELECT generic.message_id,
        COALESCE(local.message_text,generic.message_text) message_text
   FROM message generic
   LEFT JOIN (
            SELECT message_text, message_id, user_id
              FROM user
              LEFT JOIN message ON message.language_id = user.language_id
             ) local ON generic.message_id = local.message_id
                    AND local.user_id = ???user_id???
 WHERE generic.language_id = 1
   AND generic.message_id = ???message_id??

COALESCE()函数接收本地化消息(如果存在),如果不存在,则接受普通消息。

编辑 :(查询中的缺陷已修复。)您也可以使用已编辑的查询,省略该行

   AND generic.message_id = ???message_id???

获取包含所有消息的表,如果可能则进行本地化。这是一个小提琴http://sqlfiddle.com/#!9/37e2e/2/0