3

我在一个多语言网站上工作,我有文章可能会或可能不会是网站所在的所有语言。用户也可以注册并选择首选语言。

我的问题如下,当显示一篇文章时,我希望它以这种方式显示:如果用户已登录,则显示他选择的语言,如果一篇文章不是他的语言,请尝试以英语显示否则,如果它不存在法语,那么德语等。

这是我的文章表:

news_id |  lang  |   title  |  text  |
      1 |    en  |  News en |  bla.. |
      1 |    fr  |  News fr |  bla.. |
      2 |    en  |   New en |  bla.. |
      3 |    fr  |   Nws fr |  bla.. |

我不知道如何在 mysql 中执行此操作。

我希望你能理解我的问题,我真的不知道如何更清楚地解释它。

4

2 回答 2

3

您需要加入用户偏好表,以获得所需的语言。然后按顺序使用该信息:

select a.*
from articles a cross join
     (select up.*
      from UserPreferences up
      where up.userid = <whatever you want>
     ) up
order by (case when a.lang = up.prefland then 0
               when a.lang = 'en' then 1
               when a.lang = 'fr' then 2
               else 3 end) asc

这个特定的顺序首先是首选语言,然后是英语,然后是法语。要获得首选的第一个,请删除后两个“when”子句。

于 2012-08-03T14:38:14.447 回答
1

尽管 Gordon 的回答在技术上是正确的,但我会向您推荐一种稍微不同的方法:您可以添加另一个表(我们称之为它language),它定义了所用语言集的偏序

        language
--------------------------
|  id  |  name  |  rank  |
--------------------------
    1      en       1
    2      fr       2
    3      de       3
    4      nl       4

该表的数据集现在确定您网站语言的部分顺序。要在您的查询中使用它,您可以执行以下操作:

  SELECT a.*
    FROM article a
       , language b
   WHERE a.id = [xxx]
     AND a.lang = b.name
ORDER BY (a.lang = [session.lang]) DESC,
         b.rank ASC
   LIMIT 1

你问有什么意义?
好吧,以这种方式设置,一旦您需要将一组语言的部分顺序更改为不同的东西,您就不必更新查询以反映该更改。诚然,只需几个查询,这不会太麻烦,但是一旦你建立了几十个语言感知查询,它就会咬你的脚。

于 2012-08-03T15:07:59.367 回答