http://www.onebound.cn/wp-content/themes/cross-apple/assets/images/slider/01.png
ZenCart1.3 1.5系统,本身有多语言功能,但是多语言网站是在同一个域名下,通过URL动态参数切换的,这种方式针对目标客户体验不是很好,也不利于SEO。
本文介绍一种ZenCart的多语言绑定子目录方法,可以实现不同的子目录下不同的语言,并且切换语言时能准确定位到对应语言的URL。
希望可以对需要建多语言站的朋友有所帮助。
一、操作步骤
1. .htaccess 添加以下代码到 RewriteBase / 下,有其他语言代码请一并添加
RewriteRule ^(cn|es|en|fr|ru|it|de|ar)$ /$1/ [R=301,L]
RewriteRule ^(cn|es|en|fr|ru|it|de|ar)/$ index\.php [L]
2. 添加以下代码到includes/configure.php下
define('DIR_TO_LANGUAGE',TRUE);
if(DIR_TO_LANGUAGE===true){
list(,$LANGUAGE_DIR,$LANGUAGE_URL) = explode('/',$_SERVER["REQUEST_URI"]);
$LANGUAGE_DIR = strtolower($LANGUAGE_DIR);
if($LANGUAGE_DIR=='')$LANGUAGE_DIR='en';
define('LANGUAGE_DIR',$LANGUAGE_DIR);
if(isset($_REQUEST['main_page']) && strpos($_REQUEST['main_page'],'/')){
$_REQUEST['main_page']=$_GET['main_page']=trim(str_replace($LANGUAGE_DIR.'/','',$_REQUEST['main_page']),'/');
}
}
3. 添加以下代码到includes/init_includes/init_languages.php下
if(DIR_TO_LANGUAGE===true && !isset($_GET['language'])){
if(LANGUAGE_DIR!=$_SESSION['languages_code']){
if(!$lng) $lng = new language();
if (array_key_exists($LANGUAGE_DIR,$lng->catalog_languages)) {
$lng->set_language($LANGUAGE_DIR);
$_SESSION['language'] = (zen_not_null($lng->language['directory']) ? $lng->language['directory'] : 'english');
$_SESSION['languages_id'] = (zen_not_null($lng->language['id']) ? $lng->language['id'] : 1);
$_SESSION['languages_code'] = (zen_not_null($lng->language['code']) ? $lng->language['code'] : 'en');
}
}
}
4. 添加以下代码到includes/functions/html_output.php 并将原文件中的function zen_href_link(修改为function zen_href_link_old(
/**
* 多语言绑定子目录重写zen_href_link方法
*/
function zen_href_link($page = '', $parameters = '', $connection =
'NONSSL', $add_session_id = true, $search_engine_safe = true, $static =
false, $use_dir_ws_catalog = true,$languages_code=null) {
$link = zen_href_link_old($page, $parameters, $connection, $add_session_id, $search_engine_safe, $static, $use_dir_ws_catalog);
if(DIR_TO_LANGUAGE===true && $languages_code!==false){
if ( !(preg_match('/(.+)\.(html?|xml|css|js|png|jpe?g|gif|bmp|tiff?|ico|gz|zip|rar)$/i', $page)) ) {
//指定要切换语言时
/*
以下内容支持不同语言不同的URL
article_id
pages_id
products_id
cPath
manufacturers_id
pID
id=*/
if(strpos($parameters,'language=')!==false
&&(strpos($parameters,'id=')!==false||strpos($parameters,'pID=')!==false||strpos($parameters,'cPath=')!==false)
){
$tmp = @explode('language=', $parameters);
$tmp = @explode('&', $tmp[1]);
$languages_code = $tmp[0];
$sefu = explode(",", preg_replace( '/ +/', '', SEO_URLS_ONLY_IN ));
if((SEO_URLS_ONLY_IN!="") && !in_array($page,$sefu)) {
}else{
if (!isset($GLOBALS['seo_urls_'.$code]) && !is_object($GLOBALS['seo_urls_'.$code])) {
if(!$GLOBALS['lng'] || !is_object($GLOBALS['lng'])) $GLOBALS['lng'] = new language();
if (array_key_exists($languages_code,$GLOBALS['lng']->catalog_languages)) {
$GLOBALS['seo_urls_'.$languages_code] = &new SEO_URL($GLOBALS['lng']->catalog_languages[$languages_code]['id']);
}
}
if($GLOBALS['seo_urls_'.$languages_code]){
$link = $GLOBALS['seo_urls_'.$languages_code]->href_link($page,
$parameters, $connection, $add_session_id, $static,
$use_dir_ws_catalog);
}
}
}
//EOF
if($languages_code===null){
$languages_code = $_SESSION['languages_code'];
}
if ($connection == 'NONSSL') {
$base_link = HTTP_SERVER;
} elseif ($connection == 'SSL') {
if (ENABLE_SSL == 'true') {
$base_link = HTTPS_SERVER ;
} else {
$base_link = HTTP_SERVER;
}
}
$link = str_replace($base_link,$base_link.'/'.$languages_code,$link);
}
}
return $link;
}
二、其他
1. 自动识别浏览器语言
如果需要针对特定的浏览器客户访问,自动切换到指定语言访问可以在ZENCART后台开启“LANGUAGE_DEFAULT_SELECTOR”参数,或者使用.htaccess 里的语言识别代码:
RewriteCond %{HTTP:Accept-Language} ^zh.*$ [NC]
RewriteRule ^/?$ /zh/ [R=301,L]
RewriteCond %{HTTP:Accept-Language} ^en.*$ [NC]
RewriteRule ^/?$ /en/ [R=301,L]
RewriteCond %{HTTP:Accept-Language} ^ch.*$ [NC]
RewriteRule ^/?$ /cht/ [R=301,L]
到这里,多语言绑定到子目录方式已经设定完毕。
2. 前台效果
当客户访问:
http://www.vcphp.com/cn/brands1-c-15/
http://www.vcphp.com/cn/lids-atlanta-hawks-snaback-hat-nwf6091-mitchell-ness-for-chea-p-34.html
时会自动切换为中文,并且此页面所有链接都是带/cn/目录的,对搜索引擎的收录非常有利。
访问:
http://www.vcphp.com/es/brands1-c-15/
http://www.vcphp.com/es/taas-atlanta-hawks-snaback-hat-nwf6091-mitchell-ness-en-vuelos-p-34.html
时是西班牙语,注意URL文字已经是西班牙语的了。
访问:
http://www.vcphp.com/en/brands1-c-15/
http://www.vcphp.com/brands1-c-15/
则是默认英语。
三、关于多语言绑定子域名
使用子域名方式绑定语言同样可以参考上列代码。