一丶模板目录创建lang.php文件,代码如下:
<?php $langText = array( //网站头尾部文案 "langc" => 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("","",""),//网站简介 //网站全局文案结束 /*****************************************/ //首页文案 //后面省略 ); ?> |
添加语言的方法很简单,在数组后面继续添加即可。
二丶修改模板的其它文件,将$this->need改为include。将引用头部的代码如下↓
$this->need('header.php'); |
修改为
include 'header.php'; |
因为实际的测试发现,typecho自带的$this->need无法传递cookie,导致语言切换失效。
三.编辑全局头部文件header.php,将第一行修改为如下代码:
<?php if (!defined('__TYPECHO_ROOT_DIR__')) exit; include 'lang.php'; function cookie($var, $value = '', $time = 0, $path = '', $domain = '', $s = false) { $_COOKIE[$var] = $value; if (is_array($value)) { foreach ($value as $k => $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就是负责在语言数组中定位。
四丶调用多语言字段,这个很简单,因为在lang.php中定义了字段名称和值,所以模板中调用标签如下↓,以fullLang1为例:
<?php echo $langText["fullLang1"][$langid] ?> |
至于网站的标题,关键词,简介,则是在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标题,用于搜索引擎识别(如果不填则自动调用文章或独立页面标题。<font color="red">对于独立页面,请填入英文逗号分割的三种语言,如:中文,繁体,英语</font>)。')); $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中将原本的标题,关键词,简介的区域,改为如下↓
<?php if($this->is('index')){ ?> <title><?php $this->archiveTitle(array( 'category' => _t('分类 %s 下的文章'), 'search' => _t('包含关键字 %s 的文章'), 'tag' => _t('标签 %s 下的文章'), 'author' => _t('%s 发布的文章') ), '', ' - '); ?><?php echo $langText["mainLang1"][$langid] ?></title> <meta name="keywords" content="<?php echo $langText["mainLang2"][$langid] ?>" /> <meta name="description" content="<?php echo $langText["mainLang3"][$langid] ?>" /> <?php }else if($this->is('post')){ ?> <?php if($this->fields->SEOtitle == ""){ ?> <title><?php $this->title() ?> - <?php echo $langText["mainLang1"][$langid] ?></title> <?php }else{ ?> <title><?php $this->fields->SEOtitle();?> - <?php echo $langText["mainLang1"][$langid] ?></title> <?php } ?> <?php if($this->fields->SEOkeywords == ""){ ?> <meta name="keywords" content="<?php $this->title() ?>,<?php echo $langText["mainLang1"][$langid] ?>" /> <?php }else{ ?> <meta name="keywords" content="<?php $this->fields->SEOkeywords();?>,<?php echo $langText["mainLang1"][$langid] ?>" /> <?php } ?> <?php if($this->fields->SEOdescription == ""){ ?> <meta name="description" content="<?php $this->excerpt(150, '...'); ?>" /> <?php }else{ ?> <meta name="description" content="<?php $this->fields->SEOdescription();?>" /> <?php } ?> <?php }else if($this->is('page')){ ?> <title><?php pageTitle($this->fields->SEOtitle,$langid) ?> - <?php echo $langText["mainLang1"][$langid] ?></title> <?php }else{ ?> <title><?php echo $langText["newsLang3"][$langid] ?> - <?php echo $langText["mainLang1"][$langid] ?></title> <meta name="keywords" content="<?php echo $langText["mainLang2"][$langid] ?>" /> <meta name="description" content="<?php echo $langText["mainLang3"][$langid] ?>" /> <?php } ?> |
这样就可以实现单页,首页,和文章的多语言切换了。
五丶如果要在网页的js中获取当前语言,可以在hader.php中写如下↓代码
<script> var langid = "<?php echo $langid ?>"; var lang = "<?php echo $lang ?>"; </script> |
这样后面引入的js就可以直接读取这两个字段获取当前语言和语言id,用来做其它处理了。
六丶实现用户手动语言切换
首页在页面上添加下面代码,或者根据现有模板自己做下拉框。
<div class="lang-list"> <div class="lang-box"> <a href="javascript:;" onclick="changeLang('zh')">简体中文</a> </div> <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> </div> |
定义一个js方法changeLang,这里我引入了jquery,反正核心只是一个get请求,怎么来都行。
function changeLang(lang){ $.get("?lang="+lang, function(result){ location.reload(); }); } |
教程结束,总之最后的效果很不错,后期的扩展也非常方便,基本上不需要写啥if判断什么的。