PHP MySQL多语言网站

PHP MySQL多语言网站,php,mysql,Php,Mysql,我试图通过从MySQL表中提取信息来建立一个英语和法语网站,但我被卡住了。我认为这种询问对我来说太超前了。我的想法是创建一个表,翻译两种语言,并为它们分配一个ID 这是桌子 然后我有另一个表,人们将“Topic”输入数据库。因此,当我将页面切换到法语时,表的内容将以法语显示 当我们在英文版的时候,我希望输出是这个 然后,当它是法语页面时,它被选中 有没有办法让它工作或者有更简单的方法来显示没有理由在数据库中保留lang模式,请尝试在您的lang中包含文件。没有理由在数据库中保留lang模式,请尝

我试图通过从MySQL表中提取信息来建立一个英语和法语网站,但我被卡住了。我认为这种询问对我来说太超前了。我的想法是创建一个表,翻译两种语言,并为它们分配一个ID

这是桌子

然后我有另一个表,人们将“Topic”输入数据库。因此,当我将页面切换到法语时,表的内容将以法语显示

当我们在英文版的时候,我希望输出是这个

然后,当它是法语页面时,它被选中


有没有办法让它工作或者有更简单的方法来显示

没有理由在数据库中保留lang模式,请尝试在您的lang中包含文件。

没有理由在数据库中保留lang模式,请尝试在lang中包含文件。

您不应该在每次有人加载页面时更改表内容,这将导致性能灾难;-)但是您可以进行SQL连接查询

如果你在法文版,你会的

SELECT l.French FROM topic AS t
JOIN lang AS l ON t.Topic = l.id
WHERE t.EMP_ID = $emp_id;
还有你的英语

SELECT l.English FROM topic AS t
JOIN lang AS l ON t.Topic = l.id
WHERE t.EMP_ID = $emp_id;

您不应该在每次有人加载页面时更改表内容,这将导致性能灾难;-)但是您可以进行SQL连接查询

如果你在法文版,你会的

SELECT l.French FROM topic AS t
JOIN lang AS l ON t.Topic = l.id
WHERE t.EMP_ID = $emp_id;
还有你的英语

SELECT l.English FROM topic AS t
JOIN lang AS l ON t.Topic = l.id
WHERE t.EMP_ID = $emp_id;

我认为最简单的方法是使用每种语言:

法语:

CREATE VIEW empl_fr 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.French as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
CREATE VIEW empl_en 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.English as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
英语:

CREATE VIEW empl_fr 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.French as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
CREATE VIEW empl_en 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.English as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
然后您可以查询您的主题,如:

SELECT * FROM empl_fr 


更完善的方法是使用两种语言创建视图,并使用语言参数查询视图

我认为最简单的方法是使用每种语言:

法语:

CREATE VIEW empl_fr 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.French as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
CREATE VIEW empl_en 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.English as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
英语:

CREATE VIEW empl_fr 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.French as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
CREATE VIEW empl_en 
    AS 
    SELECT 
         emp.EMP_ID as EMP_ID
       , lang.English as Topic
    FROM employee emp, language lang
    WHERE emp.Topic = lang.id
然后您可以查询您的主题,如:

SELECT * FROM empl_fr 


更充分的方法是创建一个具有两种语言的视图,并使用语言参数查询您的视图,以使您的站点可扩展并易于支持未来的其他语言;我建议按照预期的方式使用MySQL,并创建一个关系模式

如果您有主题,并且主题标题是可翻译的,那么您将需要三个表:一个
主题
表,一个
语言
表,以及一个连接这两个表的表

您的主题表很简单:您只需要一个主键和任何其他独立于语言的列(例如
创建的
修改的
等)。对于
语言
表,再次存储主键、语言名称,可能还存储ISO短代码以实现一致的命名/标识

最后,连接表(可以称为
语言\u主题
)是关联发生的地方。您将有两个外键(
topic\u id
language\u id
)和另一个实际保存本地化值的列

例如,如果英语是语言ID 1,法语是语言ID 2,那么您的表可以如下所示:

+----------+-------------+----------------+
| topic_id | language_id | value          |
+----------+-------------+----------------+
| 1        | 1           | Verbal Warning |
| 1        | 2           | Avis verbal    |
+----------+-------------+----------------+
如您所见,一个主题在这个表中可以有多行,每种语言有一条记录来提供翻译


我知道这也许不能完全回答您的问题,但应该让您在如何最好地存储数据方面走上正确的道路。未来无需修改数据库模式即可轻松添加语言。

为了使您的站点可扩展并易于支持未来的其他语言;我建议按照预期的方式使用MySQL,并创建一个关系模式

如果您有主题,并且主题标题是可翻译的,那么您将需要三个表:一个
主题
表,一个
语言
表,以及一个连接这两个表的表

您的主题表很简单:您只需要一个主键和任何其他独立于语言的列(例如
创建的
修改的
等)。对于
语言
表,再次存储主键、语言名称,可能还存储ISO短代码以实现一致的命名/标识

最后,连接表(可以称为
语言\u主题
)是关联发生的地方。您将有两个外键(
topic\u id
language\u id
)和另一个实际保存本地化值的列

例如,如果英语是语言ID 1,法语是语言ID 2,那么您的表可以如下所示:

+----------+-------------+----------------+
| topic_id | language_id | value          |
+----------+-------------+----------------+
| 1        | 1           | Verbal Warning |
| 1        | 2           | Avis verbal    |
+----------+-------------+----------------+
如您所见,一个主题在这个表中可以有多行,每种语言有一条记录来提供翻译


我知道这也许不能完全回答您的问题,但应该让您在如何最好地存储数据方面走上正确的道路。将来可以很容易地添加语言,而无需修改数据库模式。

正如另一个答案中所建议的,最好将语言字符串存储在文件中,并使用Javascript加载它们。我建议使用,这是一个非常有用且易于使用的JS库。这真的很简单:

/* en.json */
{
    "home":{
        "title":"Hello, world !",
        "welcomeMessage":"Welcome to my great website !"
    }
}

/* fr.json */
{
    "home":{
        "title":"Bonjour !",
        "welcomeMessage":"Bienvenue sur mon superbe site web"
    }
}
在html代码中:

<!-- head and other stuffs... -->
<script type="text/javascript" src="i18next.js"></script>

<body onload="translate()">
    <h1 i18n-data="home.title"></h1>
    <p i18n-data="home.welcomeMessage"></p>
</body>

这样,您的网站将运行得更快(更少的数据库调用),并且更容易添加/更新一些字符串。希望它能有所帮助:)

正如另一个答案所建议的,最好将语言字符串存储在文件中,并使用Javascript加载它们。我建议使用,这是一个非常有用且易于使用的JS库。这真的很简单:

/* en.json */
{
    "home":{
        "title":"Hello, world !",
        "welcomeMessage":"Welcome to my great website !"
    }
}

/* fr.json */
{
    "home":{
        "title":"Bonjour !",
        "welcomeMessage":"Bienvenue sur mon superbe site web"
    }
}
在html代码中:

<!-- head and other stuffs... -->
<script type="text/javascript" src="i18next.js"></script>

<body onload="translate()">
    <h1 i18n-data="home.title"></h1>
    <p i18n-data="home.welcomeMessage"></p>
</body>

这样,您的网站将运行得更快(更少的数据库调用),并且更容易添加/更新一些字符串。希望能有所帮助:)

这是有争议的。如果您需要添加一种语言或编辑一些常量,那么使用一些与DB一起工作的adminpanel比手动编辑某些文本文件中的某些行更容易完成。当然,还有另一个例子,比如Wordpress,它有lang文件和一个特殊的编辑器。因为编辑起来很困难,如果你想在你的页面上获得更多的lang,你需要再添加一个“select…”。在里面