注意,这个教程是不需要对typecho进行二次开发的,而且适用于国际化的企业官网开发或者是一些有多语言切换需求的其它类型网站。另外我之前也写过一个类似的文章,不过当时那种采用的简单if/else判断,可以说又别扭还麻烦,最近的一些项目刚好对这个需求进行了整体的优化,所以决定整理成文章。
教程开始
在这之前,肯定是需要准备好模板,或者是已经有了现成的模板。
1.在模板目录创建lang.php文件,代码如下:
array("zh","tw","en"),//这里对应的是不同语言的缩写
"fullLang1" => array("首页","首頁","Home"),
"fullLang2" => array("技术","技術","Technology"),
"fullLang3" => array("生态","生態","Ecology"),
"fullLang4" => array("新闻","新聞","news"),
"fullLang5" => array("关于","關於","about"),
"fullLang6" => array("输入文章关键字","輸入文章關鍵字","Enter article keywords"),
//网站头尾部文案结束
/*****************************************/
//网站全局文案(单页简介,全站简介)
"mainLang1" => array("","",""),//网站标题
"mainLang2" => array("","",""),//网站关键词,英文逗号隔开
"mainLang3" => array("","",""),//网站简介
//网站全局文案结束
/*****************************************/
//首页文案
//后面省略
);
?>
添加语言的方式很简单,就是在数组后面继续加就行。
2.编辑模板的其它文件,将$this->need改为include。
如引用头部的代码:
$this->need('header.php');
改为
include 'header.php';
因为实际的测试发现,typecho自带的$this->need无法传递cookie,导致语言切换失效。
3.编辑全局头部文件header.php,将第一行修改为如下代码:
$v) {
setcookie($var .'['.$k.']', $v, $time, $path, $domain, $s);
}
} else {
setcookie($var,$value, $time, $path, $domain, $s);
}
}
$cookietime= time()+3600;
$langid = $this->options->langid;
$lang = $langText["langc"][$langid];
if(isset($_COOKIE["lang"])){
if(isset($_GET['lang'])){
if(preg_match("/^[a-zA-Z\s]+$/",$_GET['lang'])){
$lang = $_GET['lang'];
}
cookie("lang", $lang, $cookietime,'/');
$lang = $_COOKIE["lang"];
}else{
$lang = $_COOKIE["lang"];
}
}else{
if(isset($_GET['lang'])){
if(preg_match("/^[a-zA-Z\s]+$/",$_GET['lang'])){
$lang = $_GET['lang'];
}
cookie("lang", $lang, $cookietime,'/');
$lang = $_COOKIE["lang"];
}
}
$langarr = $langText["langc"];
$num = count($langarr);
for($i=0;$i<$num;$i++){
if($langarr[$i]==$lang){
$langid = $i;
}
}
?>
上方的代码引入了lang.php,并且定义了cookie存储方法,以及获取当前语言,切换语言等,其中$langid就是负责在语言数组中定位。
4.调用多语言字段,这个很简单,因为在lang.php中定义了字段名称和值,所以模板中调用标签如下,以fullLang1为例
至于网站的标题,关键词,简介,则是在function.php中增加如下代码:
先加入这个方法
//根据当前语言获取独立页面标题
function pageTitle($title,$langid){
$titleArr = explode( ",",$title);
echo $titleArr[$langid];
}
然后在themeFields方法中,加入如下:
$SEOtitle = new Typecho_Widget_Helper_Form_Element_Text('SEOtitle', NULL, NULL, _t('SEO标题'), _t('在这里填入当前页面或文章的SEO标题,用于搜索引擎识别(如果不填则自动调用文章或独立页面标题。对于独立页面,请填入英文逗号分割的三种语言,如:中文,繁体,英语)。'));
$layout->addItem($SEOtitle);
$SEOkeywords = new Typecho_Widget_Helper_Form_Element_Text('SEOkeywords', NULL, NULL, _t('SEO关键字'), _t('在这里填入当前文章的SEO关键字,请用英文逗号隔开。(如果是独立页面,则不填)'));
$layout->addItem($SEOkeywords);
$SEOdescription = new Typecho_Widget_Helper_Form_Element_Textarea('SEOdescription', NULL, NULL, _t('SEO简介'), _t('在这里填入当前页面或文章的SEO简介(如果是独立页面,则不填)。'));
$layout->addItem($SEOdescription);
这里的原理就是,标题写成根据逗号分割的形式,然后再根据当前语言id调用出来,而发布文章的时候,肯定一次只能发布一种语言,但是创建单页的时候,是可以设置单页模板,调用语言标签的,这就是我的思路逻辑,当然实际情况可以自行修改。
最后,在header.php中将原本的标题,关键词,简介的区域,改为如下:
is('index')){ ?>
archiveTitle(array(
'category' => _t('分类 %s 下的文章'),
'search' => _t('包含关键字 %s 的文章'),
'tag' => _t('标签 %s 下的文章'),
'author' => _t('%s 发布的文章')
), '', ' - '); ?>
" />
" />
is('post')){ ?>
fields->SEOtitle == ""){ ?>
title() ?> -
fields->SEOtitle();?> -
fields->SEOkeywords == ""){ ?>
" />
" />
fields->SEOdescription == ""){ ?>
is('page')){ ?>
fields->SEOtitle,$langid) ?> -
-
" />
" />
这样就可以实现单页,首页,和文章的多语言切换了。
5.如果要在网页的js中获取当前语言,可以在hader.php中写如下代码:
这样后面引入的js就可以直接读取这两个字段获取当前语言和语言id,用来做其它处理了。
6.实现用户手动语言切换
首页在页面上添加下面代码,或者根据现有模板自己做下拉框。
<div class="lang-box">
<a href="javascript:;" onclick="changeLang('tw')">繁體中文</a>
</div>
<div class="lang-box">
<a href="javascript:;" onclick="changeLang('en')">English</a>
</div>
定义一个js方法changeLang,这里我引入了jquery,反正核心只是一个get请求,怎么来都行。
function changeLang(lang){
$.get("?lang="+lang, function(result){
location.reload();
});
}
教程结束,总之最后的效果很不错,后期的扩展也非常方便,基本上不需要写啥if判断什么的。
评论 (0)