WebApp: 多语言站点的设计

风行水上 @ 2013-08-26 18:52:44
标签:

    多语言站点在商务网站、会展网站、文档网站多有需求。比如国内的企业网站,经常需要中文和英文两个版本。

    URL 结构

    几种可能的URL结构

    • http://www.mysite.cn/ # 多域名。维护不方便
    • http://zh.mysite.com/ # 子域名
    • http://mysite.com/zh # 子目录
    • http://mysite.com/?lang=zh # Query 参数

    对于最后一种用Query参数区分的方式,Google是不建议的。

    后台程序

    对于形如"http://mysite.com/zh"这样的URL结构,后台程序使用两个独立的版本自然是最直接的,但也很显然增加了维护成本。

    如果使用同一个后台程序,则必然需要用参数进行区分。使用"http://mysite.com/?lang=zh"这样的方式进行参数传递很直接。

    使用URL Rewrite可以同时兼顾两者:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    
    RewriteRule ^(zh|en)/(.*)$    index.php?lang=$1&page=$2  [QSA,L]
    </IfModule>
    

    数据库表的结构

    对于数据库的查询,主要是解决"fallback"的问题,即如果要查找的语言不存在,则使用默认语言的内容进行替代。

    SQL查询 1:

    SELECT m.* FROM page AS m JOIN
    (SELECT refid, ELT(MAX(FIELD(lang,'zh','en')),'zh','en') as lang FROM page GROUP BY refid) AS t
    ON m.refid=t.refid and m.lang=t.lang 
    WHERE 1
    

    SQL查询 2:

    SELECT m.* FROM page AS m LEFT JOIN 
    page AS t ON m.refid=t.refid AND FIELD(m.lang,'zh','en')<FIELD(t.lang,'zh','en')
    WHERE t.id IS NULL
    

    上面两个SQL查询的实质都是查找分组内的“最大”行。( The Rows Holding the Group-wise Maximum of a Certain Column

    TODO

    网络资源

    标签:

      分享到:
      comments powered by Disqus

      23/26ms