ZenCart多语言绑定子目录方法

时间:13-10-20 栏目:ZenCart 作者:admin 评论:7 点击: 19,848 次

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.site.com/cn/brands1-c-15/

http://www.site.com/cn/lids-atlanta-hawks-snaback-hat-nwf6091-mitchell-ness-for-chea-p-34.html

时会自动切换为中文,并且此页面所有链接都是带/cn/目录的,对搜索引擎的收录非常有利。

 

访问:

http://www.site.com/es/brands1-c-15/

http://www.site.com/es/taas-atlanta-hawks-snaback-hat-nwf6091-mitchell-ness-en-vuelos-p-34.html

时是西班牙语,注意URL文字已经是西班牙语的了。

访问:

http://www.site.com/en/brands1-c-15/
http://www.site.com/brands1-c-15/

则是默认英语。

三、关于多语言绑定子域名

使用子域名方式绑定语言同样可以参考上列代码。

声明: 本文由( admin )原创编译,转载请保留链接: ZenCart多语言绑定子目录方法

ZenCart多语言绑定子目录方法:目前有7 条留言

  1. 4楼
    支持:

    不错!谢谢分享,有空时试一下。

    2013-10-21 11:43 am [回复]
  2. 地板
    行云:

    这个方法的确能实现多语言子目录,但是会出现用户无法注册和无法购物的问题,不懂楼主有解决的方法没

    2013-12-25 10:50 pm [回复]
    • admin:

      我给客户做的网站是没有你说的这个问题的。

      2014-01-21 5:39 pm [回复]
  3. 板凳
    学校:

    博主。求教育,我装的是1.39H英文版本。有伪静态插件,我一步一步按照你的方法 改了4个文件 失败了,切换前天空白

    2014-05-07 11:46 am [回复]
    • 学校:

      我怀疑是我第4个 出问题了,前面3个很好改。 我又试了试 还是不行

      2014-05-07 11:51 am [回复]
    • 学校:

      会不会是我在本地环境 才不行?

      2014-05-07 11:53 am [回复]
  4. 沙发
    admin:

    针对有朋友将/en/改为直接/目录时出现切换到英语不成功,可以将文章第2步中第7行改为如下代码:

    if($LANGUAGE_DIR==”||strlen($LANGUAGE_DIR)>2)$LANGUAGE_DIR=’en’;

    2015-02-06 4:04 pm [回复]

发表评论


------====== 本站公告 ======------
联系信息:
电话:19970108113(微信同号) QQ:3142401606
支付宝:https://me.alipay.com/lxq73061
相关插件程序等信息均会在站内发布,敬请关注。

读者排行