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扩展” 的解决方法
Apr 16 PHP
PHP中使用asort进行中文排序失效的问题处理
Aug 18 PHP
php将textarea数据提交到mysql出现很多空格的解决方法
Dec 19 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
thinkphp autoload 命名空间自定义 namespace
Jul 17 PHP
Yii框架上传图片用法总结
Mar 28 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
thinkphp3.2中实现phpexcel导出带生成图片示例
Feb 14 PHP
php表单文件iframe异步上传实例讲解
Jul 26 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
php实现简单的守护进程创建、开启与关闭操作
Aug 13 PHP
PHP实现随机发放扑克牌
Apr 21 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 源代码压缩小工具
2009/12/22 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
关于PHP开发的9条建议
2015/07/27 PHP
php查询及多条件查询
2017/02/26 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
js调用flash的效果代码
2008/04/26 Javascript
jquery.ui.draggable中文文档
2009/11/24 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
简单的jquery拖拽排序效果实现代码
2011/09/20 Javascript
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
自动化测试读写64位操作系统的注册表
2016/08/15 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
JSON生成Form表单的方法示例
2018/11/21 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
在微信小程序中使用vant的方法
2019/06/07 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
使用Python处理Excel表格的简单方法
2018/06/07 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python常用爬虫代码总结方便查询
2019/02/25 Python
python3字符串操作总结
2019/07/24 Python
python模块常用用法实例详解
2019/10/17 Python
基于python实现从尾到头打印链表
2019/11/02 Python
李维斯法国官网:Levi’s法国
2019/07/13 全球购物
应届生新闻编辑求职信
2013/11/19 职场文书
研究生求职推荐信范文
2013/11/30 职场文书
事业单位请假制度
2014/01/13 职场文书
青年文明号复核材料
2014/02/11 职场文书
四议两公开实施方案
2014/03/28 职场文书
高中生个性发展自我评价
2015/03/09 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Python+Appium实现自动抢微信红包
2021/05/21 Python
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸