多语言子域。如何实施?

时间:2011-04-16 17:32:17

标签: php codeigniter subdomain multilingual

我有一个要求,即当用户更改除英语之外的语言时,它需要在URL中显示为子域。例如:

英文网站= www.abc.com
西班牙语网站(美国西班牙语)= esp-us.abc.com
西班牙语网站(西班牙语西班牙语)= esp-es.abc.com

如何实现?我正在使用代码点火器php。我有一个名为L_languages的表,它是语言查找表。它有两列:一列用于语言代码(esp),另一列用于国家代码(us),因此我可以根据用户的语言从数据库中提取它。

但是如何将它写入子域并使这个过程完全由数据库驱动,所以明天如果我添加一个新的语言子域将起作用?

  • 网站在CentOS上运行Apache。

感谢。

2 个答案:

答案 0 :(得分:3)

您可以让HTACCESS执行mod_rewrite规则来识别这些实例,或者您可以在HTACCESS中应用一揽子规则,然后让PHP从中完成繁重的工作。或者是两者的结合。

HTACCESS mod_rewrite解决方案

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www.)?abc.com$ [NC]
RewriteCond %{HTTP_HOST} ^(.+).abc.com$
RewriteRule ^(.*)$ $1?lang=%1 [QSA,L]

使用此规则的示例:

No Change - These are assumed as the Base
http://www.abc.com
  ==> http://www.abc.com
http://abc.com
  ==> http://abc.com
Language Coded Subdomains
http://de.abc.com
  ==> http://de.abc.com/?lang=de
http://esp-es.abc.com
  ==> http://esp-es.abc.com/?lang=esp-es
Language Coded Subdomains with filename & query
http://esp-us.abc.com/filename.htm
  ==> http://esp.us.abc.com/filename.htm?lang=esp-us
http://fr.abc.com/filename.htm?name=value
  ==> http://fr.abc.com/filename.htm?lang=fr&name=value

PHP解决方案

将此代码包含在页面顶部的某个位置(在生成特定于语言的内容之前)。

<?php
$lang = false;
if( preg_match( '/^(.+)\.abc.com$/' , $_SERVER['HTTP_HOST'] , $matches )
    && count( $matches )==2
    && $matches[1]!='www' ){
  $lang = $matches[1];
}

然后,您可以使用$lang变量(如果A)没有子域,则为false,或者B)使用“www”子域。 此外,您可以针对可接受语言数组检查$lang变量的值,如果不存在,则再次将其重置为false。

答案 1 :(得分:0)

您可以使用PHP来提供不同的语言,但如果您希望这些子域工作,则需要配置您的网络服务器(Apache,IIS等)来设置这些子域。您需要将自己选择的网络服务器添加到您的问题中。 :)