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编程语言开发动态WAP页面
Oct 09 PHP
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
php 判断数组是几维数组
Mar 20 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
php写入、删除与复制文件的方法
Jun 20 PHP
5款适合PHP使用的HTML编辑器推荐
Jul 03 PHP
Laravel5.1数据库连接、创建数据库、创建model及创建控制器的方法
Mar 29 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
利用php操作memcache缓存的基础方法示例
Aug 02 PHP
php中对象引用和复制实例分析
Aug 14 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 数组基础知识小结
2010/08/20 PHP
php实现单链表的实例代码
2013/03/22 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
Thinkphp 3.2框架使用Redis的方法详解
2019/10/24 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
从jQuery.camelCase()学习string.replace() 函数学习
2011/09/13 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
初始Nodejs
2014/11/08 NodeJs
浅谈JavaScript 的执行顺序
2015/08/07 Javascript
深入分析jsonp协议原理
2015/09/26 Javascript
通过js获取上传的图片信息(临时保存路径,名称,大小)然后通过ajax传递给后端的方法
2015/10/01 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
javascript笔记之匿名函数和闭包
2017/02/06 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
关于vue项目中搜索节流的实现代码
2019/09/17 Javascript
layui实现显示数据表格、搜索和修改功能示例
2020/06/03 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
Django filter动态过滤与排序实现过程解析
2020/11/26 Python
Django项目在pycharm新建的步骤方法
2021/03/02 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
html5实现图片转圈的动画效果——让页面动起来
2017/10/16 HTML / CSS
高中生学习生活的自我评价
2013/10/09 职场文书
体育专业个人求职信范文
2013/12/27 职场文书
计算机专业毕业生自荐信范文
2014/03/06 职场文书
选秀节目策划方案
2014/06/06 职场文书
施工安全汇报材料
2014/08/17 职场文书
司机工作自我鉴定
2014/09/19 职场文书
店面出租协议书范本
2014/11/28 职场文书
工作推荐信模板
2015/03/25 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
详解Redis主从复制实践
2021/05/19 Redis
Vue3.0写自定义指令的简单步骤记录
2021/06/27 Vue.js