首页 > 其他分享 >vue项目配置国际化

vue项目配置国际化

时间:2023-11-12 10:03:42浏览次数:29  
标签:lang 国际化 配置 js vue en i18n import message

vue项目配置国际化_ios

1、安装 vue-i18n + js-cookie 插件

npm install vue-i18n -S
npm install js-cookie --save

即在package.json中dependencies节点添加vue-i18n

"vue-i18n": "7.3.2",

2、配置多语言文件

src目录下创建lang目录,存放国际化文件此处包含三个文件,分别是 index.js zh.js en.js

// index.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import Cookies from 'js-cookie'
import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang
import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang
import enLocale from './en'
import zhLocale from './zh'

Vue.use(VueI18n)

const messages = {
  en: {
    ...enLocale,
    ...elementEnLocale
  },
  zh: {
    ...zhLocale,
    ...elementZhLocale
  }
}

const i18n = new VueI18n({
  // 设置语言 选项 en | zh
  locale: Cookies.get('language') || 'en',
  // 设置文本内容
  messages
})

export default i18n
// zh.js
export default {
  login: {
    title: '后台管理系统',
    logIn: '登录',
    username: '账号',
    password: '密码'
  },
  tagsView: {
    refresh: '刷新',
    close: '关闭',
    closeOthers: '关闭其它',
    closeAll: '关闭所有'
  },
  settings: {
    title: '系统布局配置',
    theme: '主题色',
    tagsView: '开启 Tags-View',
    fixedHeader: '固定 Header',
    sidebarLogo: '侧边栏 Logo'
  }
}
// en.js
export default {
  login: {
    title: 'Login Form',
    logIn: 'Log in',
    username: 'Username',
    password: 'Password'
  },
  tagsView: {
    refresh: 'Refresh',
    close: 'Close',
    closeOthers: 'Close Others',
    closeAll: 'Close All'
  },
  settings: {
    title: 'Page style setting',
    theme: 'Theme Color',
    tagsView: 'Open Tags-View',
    fixedHeader: 'Fixed Header',
    sidebarLogo: 'Sidebar Logo'
  }
}

3、引入

在src/main.js中增量添加i18n

import i18n from './lang'

// use添加i18n
Vue.use(Element, {
  i18n: (key, value) => i18n.t(key, value)
})

new Vue({
  i18n,
})

4、创建汉化组件

自定义组件,方便使用,也可不定义直接使用

<template>
  <el-dropdown trigger="click" class="international" @command="handleSetLanguage">
    <div>
      <svg-icon class-name="international-icon" icon-class="language" />
    </div>
    <el-dropdown-menu slot="dropdown">
      <el-dropdown-item :disabled="language==='zh'" command="zh">
        中文
      </el-dropdown-item>
      <el-dropdown-item :disabled="language==='en'" command="en">
        English
      </el-dropdown-item>
    </el-dropdown-menu>
  </el-dropdown>
</template>

<script>
import Cookies from "js-cookie";
export default {
  computed: {
    language() {
      return Cookies.get('language') 
    }
  },
  methods: {
    handleSetLanguage(lang) {
    // 第一个参数是名字,第二个参数是当前的语言,第三个参数是表示 cookie 过期时间,可能是6(天)
      Cookies.set('language',lang,6) 
      if (lang==='en') {
          this.$message({
            message: 'Set language successfully',
            type: 'success'
        })
      }else{
          this.$message({
            message: '设置语言成功',
            type: 'success'
        })
      }
    }
  }
}
</script>

5、登录页使用组件

<template>
	<div class="el-login-head">
     <lang-select class="set-language" />
    </div>
</template>
<script>
import LangSelect from '@/components/LangSelect'

export default {
  name: "Login",
  components: { LangSelect  },
  data(){
  }
};
</script>
<style rel="stylesheet/scss" lang="scss">
.el-login-head {
  height: 40px;
  line-height: 40px;
  position: fixed;
  top: 50px;
  right: 100px;
  width: 100%;
  text-align: right;
}
</style>
//普通文本使用方式: 
{{ $t('login.title') }}
//标签内使用方式:   
:placeholder="$t('login.password')"
//js内使用方式       
this.$t('login.user.password.not.match')

6、在js文件中使用国际化

例:在router中使用国际化

import i18n from '../lang'
export const constantRoutes = [
  {
    path: '/redirect',
    component: Layout,
    hidden: true,
    children: [
      {
        path: '/redirect/:path(.*)',
        component: (resolve) => require(['@/views/redirect'], resolve)
      }
    ]
  },
    {
    path: '/gen',
    component: Layout,
    hidden: true,
    children: [
      {
        path: 'edit',
        component: (resolve) => require(['@/views/tool/gen/editTable'], resolve),
        name: 'GenEdit',
        meta: { title: i18n.t('router.gen') }
      }
    ]
  }
]
// 即在引入后使用
i18n.t('')

7、与后台同步切换语言文件

利用封装的request.js对发给后台的接口Header进行统一处理

import axios from 'axios'
import { Notification, MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import cookie from 'js-cookie'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
axios.defaults.headers['Accept-Language'] = cookie.get('lang')==='en'?'en_US':'zh_CH' || 'en_US'
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 72000000
})
// request拦截器
service.interceptors.request.use(config => {
  // 是否需要设置 token
  const isToken = (config.headers || {}).isToken === false
  if (getToken() && !isToken) {
    config.headers['Authorization'] = 'Bearer ' + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
  }
  return config
}, error => {
    console.log(error)
    Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const message = errorCode[code] || res.data.msg || errorCode['default']
    if (code === 401) {
      MessageBox.confirm(
        '登录状态已过期,您可以继续留在该页面,或者重新登录',
        '系统提示',
        {
          confirmButtonText: '重新登录',
          cancelButtonText: '取消',
          type: 'warning'
        }
      ).then(() => {
        store.dispatch('LogOut').then(() => {
          location.reload() // 为了重新实例化vue-router对象 避免bug
        })
      })
    } else if (code === 500) {
      Message({
        message: message,
        type: 'error'
      })
      return Promise.reject(new Error(message))
    } else if (code !== 200) {
      Notification.error({
        title: message
      })
      return Promise.reject('error')
    } else {
      return res.data
    }
  },
  error => {
    console.log('err' + error)
    Message({
      message: error.message,
      type: 'error',
      duration: 5 * 1000
    })
    return Promise.reject(error)
  }
)

export default service

即在写入Header中

axios.defaults.headers['Accept-Language'] = cookie.get('lang')==='en'?'en_US':'zh_CH' || 'en_US'

标签:lang,国际化,配置,js,vue,en,i18n,import,message
From: https://blog.51cto.com/wen3/8325517

相关文章

  • phpstorm的xdebug配置
    php内置web服务器1.新建一个php内置web服务器的配置。 2.浏览器安装xdebug的插件Ideakey这里选择对应的,然后打开debug 我们可以看到请求的时候带了XDEBUG_SESSION的cookie到服务器,这时候我们的debug基本就是可以工作的。 如果还不行的话,可以尝试打开这个。php远......
  • 牛客[编程题] HJ66 配置文件恢复
    HJ66 配置文件恢复 中等  通过率:36.66%  时间限制:1秒  空间限制:32M  描述有6条配置命令,它们执行的结果分别是:命   令执   行resetreset whatreset boardboard faultboard addwhere to addboard deleteno board at......
  • Vue中的异步更新和 $nextTick
    场景引入需求:当用户点击编辑按钮后,显示一个弹窗,该弹窗有一个文本框,使得文本框自动聚焦看似代码如下:this.isShowEdit=true;//显示输入框this.$refs.inp.focus();//获取焦点代码看似没有问题,显示文本框后,让文本框聚焦,但是在vue中却不能实现,这是由于vue是异步更新Dom的t......
  • vue2.0,把vform666、workFlow开源组件集成到vue-admin-template框架上心得体会
    以上三个都是vue2版本的开源项目,有的已经有vue3版本了,我把他们集成到一起,是出于练习的目的,也是消磨时间。vue-admin-template是一个很基础简洁的后台管理系统框架;vform666是可以用作表单低代码开发的组件项目;workFlow是模仿钉钉的工作流的组件项目,这三个项目在gitee上都能搜索到,......
  • Vue中的ref和$refs
    ref和$refs作用:利用ref和$refs可以用于获取dom元素,或组件实例特点:查找范围->当前组件内(更精确稳定)注意:在操作ref获取dom元素时,最快也得是mounted时期获取,也就是页面渲染之后使用步骤:目标标签-添加ref属性<divref="chartRef">我是div标签</div>通过this.$re......
  • 【爱芯派 Pro 开发板试用体验】+基本使用环境配置
    【爱芯派Pro开发板试用体验】+基本使用环境配置登录系统系统默认为debian系统,插入网线,插入显示器,鼠标、键盘,介绍基础系统使用操作。将M4N-Dock连接上显示器后,可以看到图形化交互界面了。在登录界面,输入用户名root,密码root就可以登录进系统了。进入系统后的界面如下:......
  • Vue2中的父子通信
    父子通信流程图:父组件通过props将数据传递给子组件子组件利用$emit通知父组件修改更新父组件传递子组件注意点但是需要注意的是,通过props传递的数据是只读状态的,也就是说,我们不能去修改这个值。注意:props是只读的,如果直接对props中的数据进行修改,Vue就会发出警告。如果......
  • SonarQube系列-了解认证&授权配置,基于权限模块批量授权
    参考文档:docs.sonarqube.org/latest/inst…概述SonarQube具有许多全局安全功能:认证和授权机制强制身份认证委派认证除此之外,还可在group/user级别配置:查看一个已存在的项目访问项目的源代码管理一个项目(设置排除模式,调整该项目的插件配置等)管理质量配置,质量阈,实例…安全性的另一......
  • linux开发基于iMX6ULL-kernel编译环境配置
    先把内核源码仓库下载下来,然后切换到对应版本的分支 切换分支 查看关于官方提供的编译配置文件有那些 只保留自己需要的其他的都删除 在源码根目录下创建脚本添加如下内容 给脚本添加执行权限后开始编译脚本 编译后出错误,安装对应的库 重新编译 至此内核......
  • Docker容器报权限不足,如何配置权限?
    当Docker容器报告权限不足时,可能是由于容器内部的用户与主机操作系统的用户不匹配导致的。解决这个问题的一种常见方法是在容器内部设置适当的用户和权限。以下是几种配置容器权限的方法:在Dockerfile中配置用户和权限:你可以在Dockerfile中使用USER和RUN命令来配置容器内......