给ecshop添加可选择多语言
需求: 前台默认使用英文(en_us),可选择使用中文(zh_cn),同时英文页面依然是英文。 思路: 通过在访问的url上加上 lang=zh_cn变量来使用中文,没有lang变量的时候使用默认的语言 方案: 当url没有lang变量的时候,如果已登录用户设置了$_SESSION['lang'],
需求:
前台默认使用英文(en_us),可选择使用中文(zh_cn),同时英文页面依然是英文。
思路:
通过在访问的url上加上 lang=zh_cn变量来使用中文,没有lang变量的时候使用默认的语言
方案:
当url没有lang变量的时候,如果已登录用户设置了$_SESSION['lang'],则使用$_SESSION['lang']作为默认语言,如果未登录用户设置了$_COOKIE['lang'],则使用$_COOKIE['lang']作为默认语言,否则使用’en_us’作为默认语言。
实现:
0、使程序支持url传入lang=zh_cn或lang=en_us后加载该语言包
打开includes/init.php,在代码$_CFG = load_config();后加代码:
$_CFG['lang'] = 'en_us'; // 前台默认使用英语 $langList = array('zh_cn', 'en_us'); // 允许使用的语言 if (!empty($_REQUEST['lang']) && in_array($_REQUEST['lang'], $langList)) { $_CFG['lang'] = $_REQUEST['lang']; // 通过URL传递的语言参数 }
然后在
if ((DEBUG_MODE & 1) == 1)
之前加上:
// 如果用户自定义默认语言则重新加载语言 if (empty($_REQUEST['lang']) || !in_array($_REQUEST['lang'], $langList)) { if (!empty($_SESSION['lang']) && in_array($_SESSION['lang'], $langList) && $_SESSION['lang'] != $_CFG['lang']) { $_CFG['lang'] = $_SESSION['lang']; require(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/common.php'); $smarty->assign('lang', $_LANG); } else if (!empty($_COOKIE['lang']) && in_array($_COOKIE['lang'], $langList) && $_COOKIE['lang'] != $_CFG['lang']) { $_CFG['lang'] = $_COOKIE['lang']; require(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/common.php'); $smarty->assign('lang', $_LANG); } }
1、实现在url后面添加语言标识的函数
/** * url添加语言标识 */ function url_lang($url) { if (!empty($_GET['lang']) && $url[0] != '#' && !preg_match("/[&?]lang=(.*?)/", $url)) { $anchor = strstr($url, '#'); // 锚需要放在请求变量之后 if($anchor) { $url = str_replace($anchor, '', $url); //去掉锚 } // url中已经有请求变量这加上"&lang=$_GET['lang']",否则加上 "?lang=$_GET['lang']" $url .= (strpos($url, '?') !== false ? '&' : '?').'lang='.$_GET['lang']; $url .= $anchor; //加上锚 } return $url; }
2、修改build_uri()函数
//在return $uri;前加上:
$uri = url_lang($uri);
3、添加在模板中将变量如{$var}改为{$var|url}的方式让程序自动识别是否需要加上lang=zh_cn|en_us
在cls_template::get_val()函数的default:之前添加一个case,代码如下:
case 'url' : $p = 'url_lang(' . $p . ', 1)'; break;
4、在模板中加上站内链接可识别是否需要加上lang=zh_cn|en_us(站外链接不需要加)
4.1 在模板中以单个变量作为url的,把{$xxx}改为{$xxx|url}
4.2 在模板中以多个变量作为url并且没有其他字符串的,把第一个变量改为{$xxx|url}
4.3 在模板中以变量混合字符串作为url的,在url尾部根据需要加上
{if $smarty.get.lang}&lang={$smarty.get.lang}{/if} 或 {if $smarty.get.lang}?lang={$smarty.get.lang}{/if}
5、修改前台程序中的跳转url
————————————
方案2:如果只需要一个页面设置语言,其它页面同时跟着变,这样就容日很多,我们可以通过cookie来就可以了
1、设置语言
在需要设置语言的url上加上 lang=xxx&set_lang=1
2、使用不同语言
/* 载入系统参数 */ $_CFG = load_config(); // simon: 选择使用语言 $_CFG['lang'] = 'en_us'; // 前台默认使用英语 // 港澳台浏览器默认使用繁体中文 if(preg_match("/(zh\\-tw)|(zh\\-hk)|(zh\\-mo)|(zh\\-hant)/i", $_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $_CFG['lang'] = 'zh_tw'; } // 大陆和新加坡版本浏览器默认使用简体中文 elseif(preg_match("/(zh\\-cn)|(zh\\-sg)|(zh\\-hans)/i", $_SERVER['HTTP_ACCEPT_LANGUAGE'])) { $_CFG['lang'] = 'zh_cn'; } if (!empty($_REQUEST['lang']) || !empty($_COOKIE['lang'])){ $lang = empty($_REQUEST['lang']) ? $_COOKIE['lang'] : $_REQUEST['lang']; if(in_array($lang, array('zh_cn', 'zh_tw', 'en_us'))) { $_CFG['lang'] = $lang; // 通过URL传递的语言参数 } } /* 载入语言文件 */ require(ROOT_PATH . 'languages/' . $_CFG['lang'] . '/common.php'); // 默认语言设置 if(!empty($_GET['set_lang'])) { setcookie('lang', $_CFG['lang'], time()+30*24*3600); }
原文地址:给ecshop添加可选择多语言, 感谢原作者分享。