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安全性问题中的:Null 字符问题
Jun 21 PHP
PHP实现抓取Google IP并自动修改hosts文件
Feb 12 PHP
PHP+Mysql+jQuery文件下载次数统计实例讲解
Oct 10 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 PHP
基于PHP如何把汉字转化为拼音
Dec 11 PHP
win7安装php框架Yii的方法
Jan 25 PHP
php自定义函数转换html标签示例
Sep 29 PHP
php mysql_list_dbs()函数用法示例
Mar 29 PHP
PHP实现可精确验证身份证号码的工具类示例
May 31 PHP
thinkPHP实现基于ajax的评论回复功能
Jun 22 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
May 02 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
使用openssl实现rsa非对称加密算法示例
2014/01/24 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
PHP中多维数组的foreach遍历示例
2014/06/13 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
关于JavaScript的面向对象和继承有利新手学习
2013/01/11 Javascript
Jquery选择子控件&quot;大于号&quot;和&quot; &quot;区别介绍及使用示例
2013/06/25 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
浅谈jQuery页面的滚动位置scrollTop、scrollLeft
2015/05/19 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
分享JavaScript与Java中MD5使用两个例子
2015/12/23 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
微信小程序实现页面下拉刷新和上拉加载功能详解
2018/12/03 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
操作按钮悬浮固定在微信小程序底部的实现代码
2019/08/02 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
详解Python的Lambda函数与排序
2016/10/25 Python
python正则实现提取电话功能
2018/02/24 Python
Python实现定时备份mysql数据库并把备份数据库邮件发送
2018/03/08 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
2018/11/30 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
德国购买健身器材:AsVIVA
2017/08/09 全球购物
Cotton On香港网站:澳洲时装连锁品牌
2018/11/01 全球购物
幼儿园教研活动方案
2014/01/19 职场文书
平面设计师岗位职责
2014/09/18 职场文书
银行客户经理岗位职责
2015/04/09 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
基于Redission的分布式锁实战
2022/08/14 Redis