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 开发的 8 个技巧
Jan 02 PHP
php实现首页链接查询 友情链接检查的代码
Jan 05 PHP
基于Zend的Captcha机制的应用
May 02 PHP
php cli换行示例
Apr 22 PHP
PHP利用MySQL保存session的实现思路及示例代码
Sep 09 PHP
PHP过滤黑名单关键字的方法
Dec 01 PHP
PHP语法小结之基础和变量
Nov 22 PHP
PHP中的表达式简述
May 29 PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 PHP
实现PHP搜索加分页
Oct 12 PHP
php实现等比例压缩图片
Jul 26 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 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
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
PHP nl2br函数 将换行字符转成 &amp;lt;br&amp;gt;
2009/08/21 PHP
php 显示指定路径下的图片
2009/10/29 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
利用PHP生成静态html页面的原理
2016/09/30 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
初学JavaScript第二章
2008/09/30 Javascript
Script的加载方法小结
2011/01/12 Javascript
让AJAX不依赖后端接口实现方案
2012/12/03 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
2013/04/24 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
使用Node.js实现HTTP 206内容分片的教程
2015/06/23 Javascript
javascript事件处理模型实例说明
2016/05/31 Javascript
AngularJS入门教程之服务(Service)
2016/07/27 Javascript
js实现导航栏中英文切换效果
2017/01/16 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
Python实现各种排序算法的代码示例总结
2015/12/11 Python
python列表的常用操作方法小结
2016/05/21 Python
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
Python中with及contextlib的用法详解
2017/06/08 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
python如何变换环境
2020/07/21 Python
python操作redis数据库的三种方法
2020/09/10 Python
Python descriptor(描述符)的实现
2020/11/15 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
寒假思想汇报
2014/01/10 职场文书
企业员工培训感言
2014/02/26 职场文书
装修施工安全责任书
2014/07/24 职场文书
公务员学习习总书记“三严三实”思想汇报
2014/09/19 职场文书
校园学雷锋广播稿
2014/10/08 职场文书