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 adodb操作mysql数据库
Mar 19 PHP
php入门学习知识点四 PHP正则表达式基本应用
Jul 14 PHP
PHP多个版本的分析解释
Jul 21 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
php强制更新图片缓存的方法
Feb 11 PHP
php中关于socket的系列函数总结
May 18 PHP
PHP制作用户注册系统
Oct 23 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
php使用socket调用http和smtp协议实例小结
Jul 26 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
PHP Trait功能与用法实例分析
Jun 03 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
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
用js格式化金额可设置保留的小数位数
2014/05/09 Javascript
javascript每日必学之继承
2016/02/23 Javascript
JS动态创建元素的两种方法
2016/04/20 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
2018/04/17 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
详解Vue CLI3配置解析之css.extract
2018/09/14 Javascript
vue集成chart.js的实现方法
2019/08/20 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
对Python3中的input函数详解
2018/04/22 Python
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
python获取Pandas列名的几种方法
2019/08/07 Python
Python3的socket使用方法详解
2020/02/18 Python
python 获取字典键值对的实现
2020/11/12 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
法国家具及室内配件店:home24
2017/01/21 全球购物
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
同居协议书范本
2014/04/23 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
银行开户授权委托书格式
2014/10/10 职场文书
银行授权委托书样本
2014/10/13 职场文书
具结保证书
2015/01/17 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers