zoukankan      html  css  js  c++  java
  • 国际化实现(五)

    国际化支持

    1.安装依赖

    执行以下命令,安装 i18n 依赖。

    npm install vue-i18n --save

    2.添加配置

    2.1 在 src 下新建 i18n 目录,并创建一个 index.js。

    index.js

    import Vue from 'vue'
    import VueI18n from 'vue-i18n'
    
    Vue.use(VueI18n)
     
    // 注册i18n实例并引入语言文件,文件格式等下解析
    const i18n = new VueI18n({
      locale: 'zh_cn',
      messages: {
        'zh_cn': require('@/assets/languages/zh_cn.json'),
        'en_us': require('@/assets/languages/en_us.json')
      }
    })
    
    export default i18n

    2.2 在 assets 目录下面创建连个多语言文件。

    zh_cn.json

    {
        "common": {
            "home": "首页",
            "login": "登录",
            "logout": "退出",
            "doc": "文档",
            "msgCenter": "消息中心",
            "myMsg": "我的消息",
            "config": "配置",           
            "exit": "退出"
        },
        "sys": {
            "sysMng": "系统管理",
            "userMng": "用户管理",
            "deptMng": "机构管理",
            "roleMng": "角色管理",
            "menuMng": "菜单管理",
            "logMng": "日志管理",
            "sysMonitor": "系统监控"
        }
    }

    en_us.json

    {
        "common": {
            "home": "Home",
            "login": "Login",
            "logout": "Logout",
            "doc": "Document",
            "msgCenter": "Message Center",
            "myMsg": "My Message",
            "config": "Config",
            "exit": "Exit"
        },
        "sys": {
            "sysMng": "System Manage",
            "userMng": "User Manage",
            "deptMng": "Dept Manage",
            "roleMng": "Role Manage",
            "menuMng": "Menu Manage",
            "logMng": "Log Manage",
            "sysMonitor": "System Monitor"
        }
    }

    2.3 在 main.js 中引入 i18n 并注入到 vue 对象中。

    import Vue from 'vue'
    import App from './App'
    import router from './router'
    import ElementUI from 'element-ui'
    import 'element-ui/lib/theme-chalk/index.css'
    import api from './http/index'
    import i18n from './i18n'
    
    Vue.config.productionTip = false
    Vue.use(ElementUI)
    Vue.use(api)
    
    /* eslint-disable no-new */
    new Vue({
      el: '#app',
      i18n,
      router,
      components: { App },
      template: '<App/>'
    })

    3.字符引用

    在原本使用字符串的地方,引入国际化字符串。

    把原本的“用户管理”、“菜单管理”等字符串换成如下格式引入。

    3.切换菜单

    在用户信息前边添加一个用于语言切换的菜单,用于切换不同的语言。

    菜单语言切换的时候,修改国际化的设置

    给相关参数初始值

    Home.vue代码

    <template>
        <el-row class="container">
            <el-col :span="24" class="header">
                <el-col :span="5" class="logo" :class="isCollapse?'logo-collapse-width':'logo-width'">
            <img :src="this.logo" /> {{isCollapse?sysName:sysName}}
                </el-col>
                <el-col :span="1">
                    <div class="tools" @click.prevent="collapse">
                        <i class="el-icon-menu"></i>
                    </div>
                        <!-- <i class="fa fa-align-justify"></i> -->
                </el-col>
                <el-col :span="13">
                    <div class="hearNavBar">
              <el-menu :default-active="activeIndex" class="el-menu-demo" background-color="#4b5f6e" text-color="#fff"
                  active-text-color="#ffd04b" mode="horizontal" @select="handleSelectHearNavBar">
                <el-menu-item index="1">首页</el-menu-item>
                <el-menu-item index="2">消息中心</el-menu-item>
                <el-menu-item index="3">订单管理</el-menu-item>
              </el-menu>
                    </div>
                </el-col>
                <el-col :span="5" class="userinfo">
                  <el-dropdown @command="handleCommand">
              <span class="el-dropdown-link lang-inner">
                <span id="language">中文</span><i class="el-icon-arrow-down el-icon--right"></i>
              </span>
              <el-dropdown-menu slot="dropdown">
                <el-dropdown-item command="zh_cn:中文">中文</el-dropdown-item>
                <el-dropdown-item command="en_us:English">English</el-dropdown-item>
              </el-dropdown-menu>
            </el-dropdown>
                    <el-dropdown trigger="hover">
                        <span class="el-dropdown-link userinfo-inner"><img :src="this.userAvatar" /> {{username}}</span>
                        <el-dropdown-menu slot="dropdown">
                            <el-dropdown-item>我的消息</el-dropdown-item>
                            <el-dropdown-item>设置</el-dropdown-item>
                            <el-dropdown-item divided @click.native="logout">退出登录</el-dropdown-item>
                        </el-dropdown-menu>
                    </el-dropdown>
                </el-col>
            </el-col>
            <el-col :span="24" class="main">
                <aside class="aside">
                    <!--导航菜单-->
            <el-menu default-active="1-3" class="el-menu-vertical-demo" @open="handleopen" @close="handleclose" @select="handleselect" :collapse="isCollapse">
              <el-submenu index="1">
                <template slot="title">
                  <i class="el-icon-location"></i>
                  <span slot="title">系统管理</span>
                </template>
                <el-menu-item index="1-1" @click="$router.push('user')">{{$t("sys.userMng")}}</el-menu-item>
                <el-menu-item index="1-2" @click="$router.push('dept')">{{$t("sys.deptMng")}}</el-menu-item>
                <el-menu-item index="1-3" @click="$router.push('role')">{{$t("sys.roleMng")}}</el-menu-item>
                <el-menu-item index="1-4" @click="$router.push('menu')">{{$t("sys.menuMng")}}</el-menu-item>
                <el-menu-item index="1-5" @click="$router.push('log')">{{$t("sys.logMng")}}</el-menu-item>
              </el-submenu>
              <el-submenu index="2">
                 <template slot="title">
                  <i class="el-icon-location"></i>
                  <span slot="title">系统监控</span>
                  </template>
                <el-menu-item index="2-1" @click="$router.push('user')">服务监控</el-menu-item>
                <el-menu-item index="2-2" @click="$router.push('menu')">任务监控</el-menu-item>
              </el-submenu>
              <el-menu-item index="3" disabled>
                <i class="el-icon-document"></i>
                <span slot="title">导航三</span>
              </el-menu-item>
              <el-menu-item index="4">
                <i class="el-icon-setting"></i>
                <span slot="title">导航四</span>
              </el-menu-item>
            </el-menu>
                </aside>
                <section class="content-container">
                    <div class="grid-content bg-purple-light">
                        <el-col :span="24" class="breadcrumb-container">
                            <el-breadcrumb separator="/" class="breadcrumb-inner">
                                <el-breadcrumb-item v-for="item in $route.matched" :key="item.path">
                                    {{ item.name }}
                                </el-breadcrumb-item>
                            </el-breadcrumb>
                        </el-col>
                        <el-col :span="24" class="content-wrapper">
                            <transition name="fade" mode="out-in">
                                <router-view></router-view>
                            </transition>
                        </el-col>
                    </div>
                </section>
            </el-col>
        </el-row>
    </template>
    
    <script>
    import axios from 'axios'
    import mock from '@/mock/index.js';
    export default {
      name: 'Home',
      data() {
        return {
          isCollapse: false,
          sysName: "kitty",
          username: "Louis",
          userAvatar: "",
          logo: "",
          activeIndex: '1'
        };
      },
      methods:{
           handleopen() {
          console.log('handleopen');
          },
          handleclose() {
            console.log('handleclose');
          },
          handleselect(a, b) {
            console.log('handleselect');
          },
          handleSelectHearNavBar(key, keyPath) {
            console.log(key, keyPath)
          },
          //折叠导航栏
          collapse: function() {
            this.isCollapse = !this.isCollapse;
          },
          //语言切换
          handleCommand(command) {
          let array = command.split(':')
          let lang = array[0] === '' ? 'zh_cn' : array[0]
          let label = array[1]
          document.getElementById("language").innerHTML = label
          this.$i18n.locale = lang
          },
          //退出登录
          logout: function() {
            var _this = this;
            this.$confirm("确认退出吗?", "提示", {
              type: "warning"
            })
              .then(() => {
                sessionStorage.removeItem("user");
                this.$router.push("/login");
              })
              .catch(() => {});
          }
      },
      mounted(){
        this.sysName = "I like Kitty";
        this.logo = require("@/assets/logo.png");
        var user = sessionStorage.getItem("user");
        if (user) {
          this.userName = user;
          this.userAvatar = require("@/assets/user.png");
        }
      }
    }
    </script>
    <style scoped lang="scss">
    .container {
      position: absolute;
      top: 0px;
      bottom: 0px;
      left: 0px;
      right: 0px;
       100%;
      .header {
        height: 60px;
        line-height: 60px;
        background: #4b5f6e;
        color: #fff;
        .userinfo {
          text-align: right;
          padding-right: 30px;
          float: right;
          .lang-inner {
            font-size: 15px;
            cursor: pointer;
            color: #fff;
          }
          .userinfo-inner {
            font-size: 20px;
            cursor: pointer;
            padding-left: 15px;
            color: #fff;
            img {
               40px;
              height: 40px;
              border-radius: 10px;
              margin: 10px 0px 10px 10px;
              float: right;
            }
          }
        }
        .logo {
          height: 60px;
          font-size: 22px;
          padding-left: 0px;
          padding-right: 0px;
          border-color: rgba(238, 241, 146, 0.5);
          border-right- 1px;
          border-right-style: solid;
          background: #4b5f6e;
          text-align: left;
          img {
               40px;
              height: 40px;
              border-radius: 0px;
              margin: 10px 10px 10px 10px;
              float: left;
          }
          .txt {
            color: #fff;
          }
        }
        .logo-width {
           230px;
        }
        .logo-collapse-width {
           65px;
        }
        .tools {
          padding-left: 10px;
          padding-right: 10px;
          text-align: center;
           40px;
          height: 60px;
          line-height: 60px;
          cursor: pointer;
        }
        .hearNavBar {
          background: #4b5f6e;
          padding: 0px 0px;
           100%;
          height: 60px;
          line-height: 60px;
          font-size: 29px;
          cursor: pointer;
        }
      }
      .main {
        display: flex;
        position: absolute;
        top: 60px;  
        bottom: 0px;
        overflow: hidden;
        aside {
          flex: 0 0 230px;
           230px;
          .el-menu {
            height: 100%;
            text-align: left;
          }
        }
        .content-container {
          // background: #f1f2f7;
          flex: 1;
          // overflow-y: scroll;
          padding: 0px;
          .breadcrumb-container {
            height: 28px;
            background: #fff;
            border-color: rgba(38, 86, 114, 0.2);
            border-bottom- 1px;
            border-bottom-style: solid;
            background: rgba(99, 138, 161, 0.2);
            .breadcrumb-inner {
              padding-top: 5px;
              padding-bottom: 5px;
              padding-left: 5px;
              text-align: left;
              font-size: 18px;
               100%;
              height: 100%;
              float: left;
            }
          }
          .content-wrapper {
            background-color: #fff;
            box-sizing: border-box;
          }
        }
      }
    }
    </style>
    View Code

    4.启动测试

    选择点击切换英文,导航菜单成功切换到英文。

    5.封装组件

    新建components文件夹,新建LangSelector文件夹,新建index.vue

    index.vue

    <template>
      <el-dropdown class="lang-selector" @command="handleCommand">
        <span class="el-dropdown-link">
          <span id="language">中文</span><i class="el-icon-arrow-down el-icon--right"></i>
        </span>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item command="zh_cn:中文">中文</el-dropdown-item>
          <el-dropdown-item command="en_us:English">English</el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </template>
    
    <script>
      export default {
        methods: {
          // 语言切换
          handleCommand(command) {
            let array = command.split(':')
            let lang = array[0] === '' ? 'zh_cn' : array[0]
            let label = array[1]
            document.getElementById("language").innerHTML = label
            this.$i18n.locale = lang
          }
        }
      }
    </script>

    修改Home.vue文件

    原文出处:https://www.cnblogs.com/xifengxiaoma/ 
    自己整理记录。

  • 相关阅读:
    dp P1103 书本整理 洛谷
    dp 洛谷P1977 出租车拼车 线性dp
    Layui 在新标签中打开页面 / 模拟点击菜单
    布局 基础知识
    SpreadJS 生成报表
    ABP abp zreo 老版本 支持dotnet framework 4.0
    IIS 加载字体
    IIS 登录失败 该登陆名来自不受信任的域,不能与windows身份认证一起使用
    C# WebForm 打开默认页
    IIS 报错 Cannot open database "test4" requested by the login. The login failed. Login failed for user 'IIS APPPOOL est1'.
  • 原文地址:https://www.cnblogs.com/windok/p/10672704.html
Copyright © 2011-2022 走看看