typecho多语言切换完美实现方案,支持三种以上语言

本文阅读 5 分钟
广告

注意,这个教程是不需要对typecho进行二次开发的,而且适用于国际化的企业官网开发或者是一些有多语言切换需求的其它类型网站。另外我之前也写过一个类似的文章,不过当时那种采用的简单if/else判断,可以说又别扭还麻烦,最近的一些项目刚好对这个需求进行了整体的优化,所以决定整理成文章。

教程开始

在这之前,肯定是需要准备好模板,或者是已经有了现成的模板。

1.在模板目录创建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("","",""),//网站简介
     //网站全局文案结束
     /*****************************************/
     //首页文案
    //后面省略

    );
 ?>

添加语言的方式很简单,就是在数组后面继续加就行。

2.编辑模板的其它文件,将$this->need改为include。

如引用头部的代码:

$this->need('header.php');

改为

include 'header.php';

因为实际的测试发现,typecho自带的$this->need无法传递cookie,导致语言切换失效。

3.编辑全局头部文件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就是负责在语言数组中定位。

4.调用多语言字段,这个很简单,因为在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 } ?>

这样就可以实现单页,首页,和文章的多语言切换了。

5.如果要在网页的js中获取当前语言,可以在hader.php中写如下代码:

<script>
    var langid = "<?php echo $langid ?>";
    var lang = "<?php echo $lang ?>";
</script>

这样后面引入的js就可以直接读取这两个字段获取当前语言和语言id,用来做其它处理了。

6.实现用户手动语言切换

首页在页面上添加下面代码,或者根据现有模板自己做下拉框。

<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判断什么的。

ask-g35c62d03d_640.jpg

本文来自投稿,不代表本站立场,如若转载,请注明出处:https://www.ruletree.club/archives/2644/
typecho利用CodeMirror实现后台页面编辑代码高亮
« 上一篇 09-17
RuleApi,基于Typcho程序开发的多功能API,开源发布
下一篇 » 12-04
广告

发表评论

V注册会员 L评论等级
R7 条回复
  1. 老龙王VLv.2 说道:
    2022-09-23     Android /    Chrome

    非常巧妙,点赞。

  2. yjprolusVLv.1 说道:
    2022-02-21     Win 10 /    Chrome

    太牛了哈哈哈

  3. luoli5250225VLv.1 说道:
    2021-11-22     Win 10 /    Chrome

    大佬,该怎么联系你,有扣扣么,或者群么

    1. 不暇VLv.6 说道:
      2021-12-04     Android /    Chrome

      @luoli5250225

      在网站最低部就有,或者直接qq里搜索规则之树。

      1. 微风吹过VLv.4 说道:
        2022-11-30     Android /    Chrome

        @不暇

        能分层发布吗

  4. 呆哥Lv.1 说道:
    2021-11-18     iPhone /    QQ浏览器

    好家伙

没有更多评论了

作者信息

热门文章

标签TAG

热评文章