时间:13-10-20 栏目:ZenCart 作者:admin 评论:7 点击: 21,169 次
ZenCart1.3 1.5系统,本身有多语言功能,但是多语言网站是在同一个域名下,通过URL动态参数切换的,这种方式针对目标客户体验不是很好,也不利于SEO。
本文介绍一种ZenCart的多语言绑定子目录方法,可以实现不同的子目录下不同的语言,并且切换语言时能准确定位到对应语言的URL。
希望可以对需要建多语言站的朋友有所帮助。
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]
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']),'/'); } }
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'); } } }
/** * 多语言绑定子目录重写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; }
如果需要针对特定的浏览器客户访问,自动切换到指定语言访问可以在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]
到这里,多语言绑定到子目录方式已经设定完毕。
当客户访问:
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多语言绑定子目录方法
------====== 本站公告 ======------
联系信息:
电话:19970108113(微信同号) QQ:3142401606
支付宝:https://me.alipay.com/lxq73061
相关插件程序等信息均会在站内发布,敬请关注。
不错!谢谢分享,有空时试一下。
2013-10-21 11:43 am这个方法的确能实现多语言子目录,但是会出现用户无法注册和无法购物的问题,不懂楼主有解决的方法没
2013-12-25 10:50 pm我给客户做的网站是没有你说的这个问题的。
2014-01-21 5:39 pm博主。求教育,我装的是1.39H英文版本。有伪静态插件,我一步一步按照你的方法 改了4个文件 失败了,切换前天空白
2014-05-07 11:46 am我怀疑是我第4个 出问题了,前面3个很好改。 我又试了试 还是不行
2014-05-07 11:51 am会不会是我在本地环境 才不行?
2014-05-07 11:53 am针对有朋友将/en/改为直接/目录时出现切换到英语不成功,可以将文章第2步中第7行改为如下代码:
if($LANGUAGE_DIR==”||strlen($LANGUAGE_DIR)>2)$LANGUAGE_DIR=’en’;
2015-02-06 4:04 pm