多语言站点在商务网站、会展网站、文档网站多有需求。比如国内的企业网站,经常需要中文和英文两个版本。
几种可能的URL结构
对于最后一种用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