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

Php 使用存储在MySQL中的多语言字段标题的最佳方式是什么?,php,html,mysql,Php,Html,Mysql,我将字段或菜单项的正确标题存储在不同语言的MySQL表“menuLang”中 作为示例: language = 1,text[1] = "Welcome",text[2] = "Good bye" language = 2,text[1] = "Willkommen",text[2] = "Auf Wiedersehen" 我想在输出的程序代码中有一个变量(文本),具体取决于语言 用户应该可以选择通过鼠标单击标志按钮来更改整个网页 我不确定什么是快速的,不需要花费很多资源,而且是高效的 我不知

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

作为示例:

language = 1,text[1] = "Welcome",text[2] = "Good bye"
language = 2,text[1] = "Willkommen",text[2] = "Auf Wiedersehen"
我想在输出的程序代码中有一个变量(文本),具体取决于语言

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

我不确定什么是快速的,不需要花费很多资源,而且是高效的


我不知道怎么做的一般方法。我查看了互联网,没有找到好的答案。

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

如果你一定要用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             
您可能还需要为每个用户提供“语言选择”属性。例如,在
user
表中可能有一个名为
language\u id
的列

最后,如果您的本地化工作与现实世界中的大多数一样,那么您将拥有一种完整的语言,而其他语言将缺少一些条目。请参见示例中的最后一行。在我的示例中,默认语言具有
language\u id=1

然后,当您需要消息文本时,您将知道
消息id
用户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???

要获取包含所有消息的表,请尽可能本地化。这里有一个提琴

你可能想看看
gettext
很棒的技巧。我已经下载了。感谢所有帮助这一最佳编程问题页面的人,祝他们新年快乐!你所做的是杰出的。对不起,对系统操作人员来说,这是离题的,但现在是时候说出来了!奥利,现在真的很有趣。您使用的字段名与我在MySQL表中使用的字段名完全相同。你怎么知道的?我完全按照你说的做的。有超能力的人不会谈论超能力!2016年快乐!奥利,同意你的想法:但是我如何做到不必在每个文件中都包含这段代码呢?我的想法是只从数据库加载一次数据,使其具有全局可读性,但我认为这样做不是最好的。有没有这样的方法:注册,但要这样做:menuText[7]作为占位符?