Yii2语言国际化自动配置详解


Posted in PHP onAugust 22, 2018

如何实现语言国际自动化,大家可能觉得自动化,是不是不需要配置就自动切换,这个思路我之前也想过,能不能根据IP来判断地理位置然后确定其语言,网上找过一个"IpToCountry"相关的,有兴趣的可以搜索出来看看,他会提供一个ip对照的表,每隔一段时间会更新一次,不过这个暂时没做,后面考虑尝试下

这里我们说下Yii2如何实现,因为我们上面的一篇文章分享做了语言国际化的配置,也将对应的语言翻译了出来,下面就是需要根据条件来做切换

从配置文件我们知道只需要更改language这个配置值就可以了,但是要在哪里更改呢。这里我的操作步骤如下

我想整体对项目的所有内容进行语言国际化,唯一我能想到的是修改控制器,有的说是修改 入口文件,我觉得修改入口文件有点破坏框架结构了。

第一步 创建一个AppController

继承yii/web/Controller,实现如下

<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;

class AppController extends Controller
{
  public function init()
  {
    if (isset(Yii::$app->session['_lang'])) {
      Yii::$app->language = Yii::$app->session['_lang'];
    }

    parent::init();
  }
}

第二步 将所有自己的控制器都继承AppController

做类似如下操作,我这里只是举了一个BlogController的例子

class BlogController extends AppController

第三步 实现设置多语言的处理

我这里在我的控制器SiteController加了如下Action

public function actionLanguage($language)
{
  Yii::$app->session['_lang'] = $language;
  $redirectUrl = Yii::$app->request->headers['Referer'];
  if (!$redirectUrl) {
    $redirectUrl = Yii::$app->homeUrl;
  }
  return $this->redirect($redirectUrl);
}

每次需要修改语言的话,只要将语言传入actionLanguage,就会更改session中_lang的值,然后每个控制器在调用的时候都会先去更改项目的language

第四步 前端UI修改

通过在前端加个修改的逻辑,方便前端访问者进行更改语言设置

<ul class="nav navbar-nav navbar-right">
 <li class="dropdown">
  <a href="j#" rel="external nofollow" data-target="#" class="dropdown-toggle" data-toggle="dropdown">
   {{ Yii.t('app', 'Language') }}
   <b class="caret"></b> 
  </a>
  <ul class="dropdown-menu">
   <li
    class="{% if app.session['_lang'] == 'zh-CN' %}active{% endif %}"
   >
    <a
     href="{{ url(['site/language'], { 'language': 'zh-CN' })}}" rel="external nofollow" 
    >{{ Yii.t('app', 'Chinese') }}</a>
   </li>
   <li
    class="{% if app.session['_lang'] == 'en-US' %}active{% endif %}"
   >
    <a 
     href="{{ url(['site/language'], { 'language': 'en-US' })}}" rel="external nofollow" 
    >{{ Yii.t('app', 'English') }}</a>
   </li>
  </ul>
 </li>
</ul>

我这里使用的Twig模板。

到这里就都设置完了,可以正常切换语言了。后面如果又加了新的内容进去的话,可以直接执行上文中提到的命令

./yii message/extract @app/config/i18n.php

如有不理解的地方可以加群详细了解

ps:使用yii生成映射目录

./yii message/extract @app/config/i18n.php

使用以上命令,实际上就是按照i18n.php中给定的参数,执行扫描操作,将所有形如Yii::t('app', 'xxx')这样语句中的xxx取出,放入映射文件中。

这时,在common/messages中会有zh-CN文件夹生成,里面的app.php即为映射文件。

app.php

return [
  'OpenId' => 'OpenId',
  'UserId' => '用户id',
  'UserName' => '用户名',
  'UserPortrait' => '用户头像',
  'About' => '关于我们',
  'Are you sure you want to delete this item?' => '确定要删除?',
  'Contact' => '联系方式',
  'Create' => '创建',
  'Create Myuser' => '创建用户',
  'Delete' => '删除',
  'Home' => '首页',
  'Login' => '登录',
  'My Company' => '我的网站',
  'Myusers' => '用户',
  'Reset' => '重置',
  'Search' => '搜索',
  'Update' => '更新',
  'Update {modelClass}: ' => '更新用户-',
];

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
加速XP搜索功能堪比vista
Mar 22 PHP
通过dbi使用perl连接mysql数据库的方法
Apr 16 PHP
简单分析ucenter 会员同步登录通信原理
Aug 25 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
php读取远程gzip压缩网页的方法
Dec 29 PHP
php根据生日计算年龄的方法
Jul 13 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
Oct 08 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
YII框架关联查询操作示例
Apr 29 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
PHP实现负载均衡的加权轮询方法分析
Aug 22 #PHP
PHP实现负载均衡session共享redis缓存操作示例
Aug 22 #PHP
PHP封装的完整分页类示例
Aug 21 #PHP
php代码调试利器firephp安装与使用方法分析
Aug 21 #PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 #PHP
PHP依赖注入原理与用法分析
Aug 21 #PHP
PHP 二维array转换json的实例讲解
Aug 21 #PHP
You might like
PHP执行速率优化技巧小结
2008/03/15 PHP
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php实现批量修改文件名称的方法
2016/07/23 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
js TextArea的选中区域处理
2010/12/28 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
PhantomJS快速入门教程(服务器端的 JavaScript API 的 WebKit)
2015/08/06 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
JS使用正则表达式找出最长连续子串长度
2017/10/26 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
Python修改MP3文件的方法
2015/06/15 Python
用python代码将tiff图片存储到jpg的方法
2018/12/04 Python
详解python-图像处理(映射变换)
2019/03/22 Python
详解Anaconda 的安装教程
2020/09/23 Python
只要五步 就可以用HTML5/CSS3快速制作便签贴特效(图)
2012/06/04 HTML / CSS
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
英国工作场所设备购买网站:Slingsby
2019/05/03 全球购物
UNIX命令速查表
2012/03/10 面试题
大专自我鉴定范文
2013/10/01 职场文书
导购员的岗位职责
2014/02/08 职场文书
车辆工程专业求职信
2014/04/28 职场文书
标准版离职证明书
2014/09/12 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
乡镇防汛工作汇报
2014/10/28 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
python之django路由和视图案例教程
2021/07/26 Python