PHP MySQL多语言网站

时间:2013-08-30 08:59:10

标签: php mysql

我正在尝试通过从MySQL表中提取信息来构建英语和法语网站但我被困住了。我觉得那种查询对我来说太先进了。我的想法是拥有一个翻译了两种语言的表格并为其分配ID。

这是表格lang

+--------+-------------------+----------------------+
| id     | English           | French               |
+--------+-------------------+----------------------+
| 1      | Verbal Warning    | Avis verbal          |
| 2      | Written Warning   | Avis écrit           |
| 3      | Evaluation        | Évaluation           |
| 4      | Other (specify)   | Autres (spécifiez)   |
+--------+-------------------+----------------------+

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

+-----------+---------+
| EMP_ID    | Topic   |
+-----------+---------+
| 845689    |  4      |
| 185648    |  3      |
| 485497    |  1      |
| 416798    |  2      |
+-----------+---------+

当我们在英文页面

时,我希望将输出放在表格中
+-----------+------------------+
| EMP_ID    | Topic            |
+-----------+------------------+
| 845689    |  Other (specify) |
| 185648    |  Evaluation      |
| 485497    |  Verbal Warning  |
| 416798    |  Written Warning |
+-----------+------------------+

然后选择法语页面。

+-----------+---------------------+
| EMP_ID    | Topic               |
+-----------+---------------------+
| 845689    |  Autres (spécifiez) |
| 185648    |  Évaluation         |
| 485497    |  Avis verbal        |
| 416798    |  Avis écrit         |
+-----------+---------------------+

有没有办法让它发挥作用或有更简单的方法来展示

5 个答案:

答案 0 :(得分:3)

正如另一个答案中所建议的那样,最好将语言字符串存储在文件中,并使用Javascript加载它们。我建议使用i18next,这是一个非常有用且易于使用的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>

在你的函数JS文件中:

function translate() {
    i18n.init({
        resGetPath:'en.json',
        getAsync:false
    }).done(function(){
        $('[data-i18n]').i18n();
    });
}

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

答案 1 :(得分:1)

没有理由在数据库中保留lang架构,而是尝试用lang包含文件。

答案 2 :(得分:0)

每次有人加载可能是性能灾难的页面时,你不应该更改表内容;-)但是你可以创建一个SQL Join Query。

如果您在法语页面上,那么

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;

答案 3 :(得分:0)

我认为每种语言最简单的方法是create a view

法语:

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 

SELECT * FROM empl_en

使用两种语言创建视图并使用语言参数查询视图的方法更为标准

答案 4 :(得分:0)

使您的网站可扩展且易于支持未来的其他语言;我建议以预期的方式使用MySQL并创建一个关系模式。

如果您有主题,并且主题标题可以翻译,那么您将需要三个表:topics表,languages表和连接这两个表的表。

您的主题表很简单:您只需要一个主键和任何其他与语言无关的列(例如createdmodified等)。对于languages表,再次存储主键,语言名称,以及用于一致命名/标识的ISO短代码。

最后,您的连接表(可以称为languages_topics)是关联发生的位置。您将拥有两个外键(topic_idlanguage_id)以及另一个实际保存本地化值的列。

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

+----------+-------------+----------------+
| topic_id | language_id | value          |
+----------+-------------+----------------+
| 1        | 1           | Verbal Warning |
| 1        | 2           | Avis verbal    |
+----------+-------------+----------------+

如您所见,一个主题在此表中可以有多行,每种语言都有一个记录来提供翻译。

我知道这可能不会完全回答您的问题,但应该为您提供最佳存储数据的正确途径。可以在将来轻松添加语言,而无需修改数据库架构。