需求:
前台默认使用英文(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添加可选择多语言, 感谢原作者分享。
