yii2框架-多语言版本切换(十三)

来源:互联网 发布:数控车床编程语言 编辑:程序博客网 时间:2024/05/22 02:01

上一节说到关于国际化i18n的方面的基础知识,下面我们就运用这些知识解决一下关于多语言版本之间的切换如何实现。有两种方法,下面主要是说一下利用cookie和session的方法实现的方式。下面就利用中文和英文之间的切换具体例子。

(1)利用cookie实现多语言版本。

首先我们要知道yii2框架是以英文作为源语言的,其他的语言作为目标语言的。所以在语言文件中是一对多的关系,源语言对应多种需要转换的目标语言,也就是有多个不同的语言版本。

我们在@app/messages可以作为我们存放不同语言文件的文件夹,在该文件夹下面建立对应的语言文件夹,比如zh-CN文件夹,代表中文,那么我们现在在文件夹下面建立一个语言文件,叫language.php。那么在@app/messages/zh-CN/language.php:

<?phpreturn [     'Language' => '语言',     'Chinese' => '中文',     'English' => '英文',];


语言文件设置好了,那么我们在导航栏上展示出一个语言切换的下拉列表。

我们可以在视图文件上利用use yii\bootstrap\NavBar和yii\boostrap\Nav.php来完成

<?php

    NavBar::begin([        'brandLabel' => 'My Company',        'brandUrl' => Yii::$app->homeUrl,        'options' => [            'class' => 'navbar-inverse navbar-fixed-top',        ],    ]);    echo Nav::widget([        'options' => ['class' => 'navbar-nav navbar-right'],        'items' => [           [            'label' => Yii::t('app','Language'),            'dropDownOptions' => ['id' => 'drow-language','style' => 'min-width:90px;'],            'items' => [                   ['label' => Yii::t('app','Chinese'), 'options' =>['data-language' =>'zh-CN','style'=>'cursor:pointer']],                                      ['label' => Yii::t('app','English'), 'options' =>['data-language' =>'en-US','style'=>'cursor:pointer']],            ],         ]        ]);   NavBar::end();?>


视图文件完成后,'data-language' =>'zh-CN',就是每一个语言版本对应的值。接下来就是我们点击选择语言,然后获取语言版本的值,保存在cookie中,然后可以重新reload该url,在入口文件或者在配置文件中通过cookie重新获取语言版本值,最后就可以切换到不同的语言版本了。

要将语言版本值保存在cookie中,则需要引入一个jquery.cookie.js文件。那么我们在asset文件夹下的AppAsset.php中

class AppAsset extends AssetBundle{    public $basePath = '@webroot';    public $baseUrl = '@web';    public $css = [        'css/site.css',    ];    public $js = [        'js/jquery.cookie.js',    ];    public $depends = [        'yii\web\YiiAsset',        'yii\bootstrap\BootstrapAsset',    ];


那么在视图文件中可以通过绑定点击下拉框的语言版本的时间来获取对应的值。

<?php $this->endBody() ?><?php $this->beginBlock('language') ?>    $(function(){        $('#drow-language li').on('click',function(){            var language = $(this).attr('data-language');            $.cookie('language',language,{'path':'/');            window.location.reload();        });    });<?php $this->endBlock() ?><?php $this->registerJs($this->blocks['language'], \yii\web\View::POS_END); ?><

这里利用数据块的形式来执行注册js的代码。至此点击选择语言版本已经可以实现将值保存在cookie中了,并且重新reload,那么可以在入口文件处获取该值,并且赋值给app应用的langage属性。特别注意的是path设置cookie在整个网站中可以使用,如果没有设置,只默认在当前的url中可以使用。

$application = new yii\web\Application($config);$application->language = isset($_COOKIE['language']) ? $_COOKIE['language'] : 'zh-CN';$application->run();
如果不想在这里改动也可以在配置文件设置。

'language' => isset($_COOKIE['language']) ? $_COOKIE['language'] : 'zh-CN',
ok,整个语言版本的切换利用cookie的实现方式就完成了,比如点击Chinese语言,则变成中文




(2)利用session实现

利用session实现的话,就不需要jquery.cookie.js文件了,不过引入也无所谓,可能有其他的用处。

视图文件就有些地方需要改变一下,其他不变,变成如下:

[     'label' => Yii::t('language','Language'),      'dropDownOptions' => ['id' => 'drow-language','style' => 'min-width:90px;'],      'items' => [             ['label' => Yii::t('language','Chinese'), 'url' =>['/order/language', 'language' =>'zh-CN']],                                ['label' => Yii::t('language','English'), 'url' =>['/order/language', 'language' => 'en-US']],       ],],

主要的改变就是添加‘url'的属性,把原来的options属性删除。

那么在OrderController.php中定义操作

public function actionLanguage($language) {$session = Yii::$app->session;$session->open();if(isset($language)){           Yii::$app->session['language'] = $language;      }      //切换完语言哪来的返回到哪里,即reload    $this->goBack(Yii::$app->request->headers['Referer'])}

语言版本的值就保存在session中,那么在入口文件处也要做处理:

$application = new yii\web\Application($config);$application->language = isset(Yii::$app->session['language']) ? Yii::$app->session['language'] : 'zh-CN';$application->run();
那么在session中处理语言版本的切换也就完成了。





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 自考本科档案一直在自己手里怎么办 想考警校可身高差两公分怎么办 没读完初中现在想继续夜大怎么办 美国签证确认页姓和名写错了怎么办 单位不承认非法辞退说我旷工怎么办 工作了和同事在一起住宿舍怎么办 教会的事情商量是起冲突怎么办 转转购买的产品是坏的怎么办 二年级的学生反应太迟钝怎么办? 特别胖的人运动一半体力不支怎么办 怀孕了在胸透门口站了很久怎么办 自己觉的色弱但高考体检正常怎么办 高考体检不合格怎么办会影响录取吗 老婆起诉我离婚我不想离怎么办 中考结束了成绩差的学生怎么办 我儿了眼角模不好了怎么办 打了2次催产针没反应怎么办 高中体检学生隐私被同学看到怎么办 要出去旅游刚好遇上月经期怎么办 兵检的时候还在高中怎么办 人流后带上环20天白带很黄怎么办 武警义务兵训练的时候没合格怎么办 小孩考试考的不好·家长怎么办 怀孕了不小心碰了屁股疼怎么办 新密职教中心开学军训有点慌怎么办 房产证是士兵证办的退伍后怎么办 士兵证办的银行卡退伍了怎么办 看左上牙后引发上颌窦炎怎么办 老板克扣进件加班工资应该怎么办 医生给婴儿按嘴巴碰到喉咙痛怎么办 事故逃逸人死对方要钱太多怎么办 毕业工作未满一年辞职档案怎么办 淘宝上买的东西客服不理怎么办 蚂蚁借呗还款后没显示还款怎么办 王者荣耀什么英雄都打的很烂怎么办 军校参加了政审体检误了怎么办 如果老板搬迁不给工人补偿怎么办 下面的毛很多又掉的厉害怎么办? 想去美国开饭店要怎么办签证 在沙漠中旅游如果车子坏了该怎么办 小磨床平面磨出来很粗怎么办