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 相关文章推荐
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
PHP number_format() 函数定义和用法
Jun 01 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
Yii针对添加行的增删改查操作示例
Oct 18 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
php实时倒计时功能实现方法详解
Feb 27 PHP
php传值方式和ajax的验证功能
Mar 27 PHP
通过php动态传数据到highcharts
Apr 05 PHP
Yii框架实现的验证码、登录及退出功能示例
May 20 PHP
关于PHP中interface的用处详解
Jul 26 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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筛选不存在的图片资源
2015/04/28 PHP
PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法
2015/11/11 PHP
thinkphp关于简单的权限判定方法
2017/04/03 PHP
javascript FormatNumber函数实现方法
2008/12/30 Javascript
$(document).ready(function() {})不执行初始化脚本
2014/06/19 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
原生js编写基于面向对象的分页组件
2016/12/05 Javascript
详解jQuery中的事件
2016/12/14 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
[50:29]2014 DOTA2华西杯精英邀请赛 5 24 DK VS iG
2014/05/26 DOTA
关于Tensorflow分布式并行策略
2020/02/03 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
用pip给python安装matplotlib库的详细教程
2021/02/24 Python
英国婴儿及儿童产品商店:TigerParrot
2019/03/04 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
客户表扬信范文
2014/01/10 职场文书
党支部书记岗位责任制
2014/02/11 职场文书
庆七一活动总结
2014/08/27 职场文书
出差报告怎么写
2014/11/06 职场文书
处级干部考察材料
2014/12/24 职场文书
经营目标责任书
2015/05/08 职场文书
红与黑读书笔记
2015/06/29 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
Redis如何实现分布式锁
2021/08/23 Redis
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android