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新手上路(四)
Oct 09 PHP
那些年一起学习的PHP(一)
Mar 21 PHP
php调用方法mssql_fetch_row、mssql_fetch_array、mssql_fetch_assoc和mssql_fetch_objcect读取数据的区别
Aug 08 PHP
有道搜索和IP138的IP的API接口(PHP应用)
Nov 29 PHP
php 无法加载mcrypt.dll的解决办法
Apr 03 PHP
PHP异常处理Exception类
Dec 11 PHP
CI框架中redis缓存相关操作文件示例代码
May 17 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
PHP程序员学习使用Swoole的理由
Jun 24 PHP
微信JSSDK分享功能图文实例详解
Apr 08 PHP
PHP7中I/O模型内核剖析详解
Apr 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
基于curl数据采集之单页面并行采集函数get_htmls的使用
2013/04/28 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
jquery text()要注意啦
2009/10/30 Javascript
js与jquery获取父级元素,子级元素,兄弟元素的实现方法
2014/01/09 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
JavaScript声明变量时为什么要加var关键字
2014/09/29 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
JS实现调用本地摄像头功能示例
2018/05/18 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
Vue的编码技巧与规范使用详解
2019/08/28 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
动态实现element ui的el-table某列数据不同样式的示例
2021/01/22 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
Python中内建函数的简单用法说明
2016/05/05 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
2018/04/17 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
python实现简单俄罗斯方块
2020/03/13 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
python 实现图片裁剪小工具
2021/02/02 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
计算机求职信
2013/12/01 职场文书
辩论赛主持词
2014/03/18 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
中国梦读书活动总结
2014/07/10 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
2014教师党员自我评议总结
2014/09/19 职场文书
捐款感谢信
2015/01/20 职场文书
仰望星空观后感
2015/06/10 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
NodeJs内存占用过高的排查实战记录
2021/05/10 NodeJs
Golang并发操作中常见的读写锁详析
2021/08/30 Golang