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的5个入手程序
Nov 23 PHP
初级的用php写的采集程序
Mar 16 PHP
php下通过POST还是GET来传值
Jun 05 PHP
php将字符串转化成date存入数据库的两种方式
Apr 28 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
php动态添加url查询参数的方法
Apr 14 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
php 多个变量指向同一个引用($b = &amp;$a)用法分析
Nov 13 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
咖啡语言
2021/03/03 咖啡文化
php中定时计划任务的实现原理
2013/01/08 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
JavaScript中的History历史对象
2008/01/16 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
一个选择最快的服务器转向代码
2009/04/27 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
python实现感知器算法(批处理)
2019/01/18 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python实现一个数组除以一个数的例子
2019/07/20 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Django 创建后台,配置sqlite3教程
2019/11/18 Python
使用TensorFlow搭建一个全连接神经网络教程
2020/02/06 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
keras 自定义loss层+接受输入实例
2020/06/28 Python
英国著名的药妆网站:Escentual
2016/07/29 全球购物
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
党员承诺践诺书
2014/05/20 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
2014年度工作总结报告
2014/12/15 职场文书
Python 如何安装Selenium
2021/05/06 Python
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL