分类 Vue 下的文章

Vue国际化

本文介绍Vue如何做国际化,包括vue-i18n, element ui 等国际化配置,搭配vuex, localStorage使用,切换语言无需刷新页面。

前言

项目基于@vue/cli3脚手架搭建,如果你没有自己的项目框架,建议使用这个脚手架(传送门)。有了项目框架后,先安装Vue国际化组件库vue-i18n,然后看一下项目结构图:


i18n文件夹的标准结构就是这样,可以照着在自己的项目中创建好对应的文件。i18n/index.js 是国际化入口配置文件。zh-CN/index.js, en-US/index.js 分别为中文和英文具体的文案文件,接下来挨个分析。

工具方法文件

文件位置:src/util.js

// 设置localStorage
export const setStorage = function(key, obj) {
    let json = JSON.stringify(obj) window.localStorage.setItem(key, json)
} 

// 获取localStorage
export const getStorage = function(key) {
    const str = window.localStorage.getItem(key) if (!str) {
        return null
    }
    return JSON.parse(str)
}

// 移除localStorage
export const removeStorage = function(key) {
    window.localStorage.removeItem(key)
}

// 获取浏览器默认语言
export const getBrowserLang = function() {
    let browserLang = navigator.language ? navigator.language: navigator.browserLanguage let defaultBrowserLang = ''
    if (browserLang.toLowerCase() === 'cn' || browserLang.toLowerCase() === 'zh' || browserLang.toLowerCase() === 'zh-cn') {
        defaultBrowserLang = 'zh-CN'
    } else {
        defaultBrowserLang = 'en-US'
    }
    return defaultBrowserLang
}

vue-i18n组件库入口文件配置

文件位置:src/i18n/index.js

使用localStorage存储用户选择的语言,方便用户下次进来不用再做切换操作。属性名为'lang',值为'zh-CN' 'en-US',分别代表中文、英文。

// 引入必要的库
import Vue from 'vue'
import VueI18n from 'vue-i18n'
// 引入element ui国际化文件
import elen from 'element-ui/lib/locale/lang/en'
import elcn from 'element-ui/lib/locale/lang/zh-CN'

// 引入工具函数
import { getStorage, removeStorage, getBrowserLang } from '@/util'

// 引入项目中需要用到的中英文文案配置js
import enLocale from './en-US'
import cnLocale from './zh-CN'

// 使用vue-i18n库
Vue.use(VueI18n)

// 获取当前语言(初始化时localStorage里没有存语言,默认为浏览器当前的语言)
const lang = getStorage('lang') || getBrowserLang()

// 组合element ui 和 项目自身的文案文件
const messages = {
    'en-US': {
        ...elen,
        ...enLocale
    },
    'zh-CN': {
        ...elcn,
        ...cnLocale
    }
}
// 创建vueI18n实例并输出,在main.js中调用
const i18n = new VueI18n({
    locale: lang,
    messages
})

export default i18n

文件位置:src/i18n/zh-CN/index.js

export default {  
    login: {    
        username: '用户名'  
    }
}

文件位置:src/i18n/en-US/index.js

export default {  
    login: {    
        username: 'username'  
    }
}

举个例子在登录页面组件中,用户名字段区分中英文。使用 {{ $t('login.username') }} 替换具体的文案即可。另外在js代码中通过 this.$t('login.username') 调用。

<el-form-item>
  {{ $t('login.username') }}<el-input v-model="form.username"></el-input>
</el-form-item>

main.js 引入 i18n 配置文件

import i18n from './i18n'

new Vue({
    router,
    i18n,
    store,
    render: h = >h(App)
}).$mount('#app')

语言切换组件

文件位置:src/views/component/Lang.vue

<template>
  <div>
    <el-dropdown @command="handleSetLang" trigger="click">
      <div class="lang-active">
        <div v-for="(lang, i) in langs" :key="`LangActive${i}`" v-show="lang.key === activeLang">{{ lang.value }}
          <i class="el-icon-arrow-down el-icon--right"></i></div>
      </div>
      <el-dropdown-menu slot="dropdown">
        <el-dropdown-item v-for="(lang, i) in langs" :key="`Lang${i}`" :command="lang.key">
          <span class="text">{{ lang.value }}</span></el-dropdown-item>
      </el-dropdown-menu>
    </el-dropdown>
  </div>
</template>

<script>
  import {
    mapGetters,
    mapMutations
  } from 'vuex';

  export default {
    name: 'Lang',
    components: {},
    data() {
      return {
        langs: [{
          key: 'zh-CN',
          value: '中文'
        },
        {
          key: 'en-US',
          value: 'EngLish'
        },
        ],
      }
    },
    computed: {
      ...mapGetters({
        activeLang: 'language'
      })
    },
    created() {},
    mounted() {},
    methods: {
      ...mapMutations(['setLanguage']),
      handleSetLang(lang) {
        // 设置i18n.locale 组件库会按照上面的配置使用对应的文案文件
        this.$i18n.locale = lang
        // 提交mutations 
        this.setLanguage(lang)
      }
    }
  }</script> 

使用element uidropdown 组件,大致效果如下,样式可自行调整


点击下拉菜单,调用 handleSetLang 方法,设置 this.i18n.locale 。如果 handleSetLang 方法里只写这句也可以实现语言切换效果,不过语言状态没有保存,刷新页面会重置到初始语言,这样肯定不是我们想要的。因此需要结合 localStoragevuex。如果对vuex不熟悉,可以先去官方文档学习一下。如果你的项目没有用到vuex,也可以只使用 localStorage 通过刷新页面来更新视图。代码如下:

handleSetLang(lang) {
    // 设置 i18n.locale
    this.$i18n.locale = lang 
    // 使用 localStorage 存储语言状态
    setStorage('lang', lang)
    // 刷新页面更新视图
    window.location.reload()
}

vuex相关配置

文件位置:src/store/index.js 建一个 language 模块,用来响应式更新语言。

import Vue from 'vue'
import Vuex from 'vuex'
import language from './modules/language'

Vue.use(Vuex) 

export default new Vuex.Store({
    modules: {
        language
    }
})

文件位置:src/store/language.js

import {
    getStorage,
    setStorage,
    getBrowserLang
}
from '@/util'

export default {
    state: {
    language: getStorage('lang') || getBrowserLang() // 项目初始化时,默认为浏览器的语言
    },
    getters: {
        language: state = > state.language
    },
    mutations: {
    setLanguage: (state, language) = > {
        state.language = language 
            setStorage('lang', language)
        },
    }
}

总结

使用 vue-i18n 组件库,在语言切换组件中设置 this.$i18n.locale ,vue-i18n 会根据配置文件使用对应的中英文文案文件。配合 localStorage 和 vuex 做到存储用户语言设置并动态更新,无需刷新页面。

vite vue-ts 配置 “@” 路径别名

序章、版本

"@types/node": "^16.9.1"
"vite": "^2.5.4"
"@vitejs/plugin-vue": "^1.6.1"
"@vue/compiler-sfc": "^3.2.6"
"vue-tsc": "^0.2.2"
"typescript": "^4.3.2"

只要实现了,没有报错,版本不一样也无所谓

一、安装依赖

npm i @types/node -D

二、修改 vite.config.js

import { defineConfig } from 'vite'
import { resolve } from 'path'

export default defineConfig {
    // ...
    resolve: {
        alias: {
            "@": resolve(__dirname, 'src'), // 路径别名
        },
        extensions: ['.js', '.json', '.ts'] // 使用路径别名时想要省略的后缀名,可以自己 增减
    }
    // ...
}

vite 官方文档中 不建议忽略 .vue 后缀的文,所以在 import 引入文件的时候需要加 .vue
https://cn.vitejs.dev/config/#resolve-extensions

import HelloWorld from '@/components/HelloWorld.vue'

三、修改tsconfig.json

{
    "compilerOptions" : {
        // ...
        "baseUrl": ".", // 用于设置解析非相对模块名称的基本目录,相对模块不会受到baseUrl的影响
        "paths": { // 用于设置模块名到基于baseUrl的路径映射
            "@/*": ["src/*"]
        }
        // ...
    }
}

vue项目打包增加版本信息

目标

在Vue项目打包后的 dist/index.html 文件中写入本地打包的git信息。方便测试确定线上当前的版本信息。

实施步骤

提取git相关信息

在构建时需要获取git相关的信息,这些信息都需要使用git命令来获取。在node中,要执行一段命令行脚本需要使用child_process模块

在项目build目录下新建 gitInfo.js 文件,文件内容如下:

const child_process = require('child_process')

const formatDate = function(date) {
    function pad(value) {
        return (value < 10 ? '0':'') + value
    }

    let year = date.getFullYear();
    let month = pad(date.getMonth() + 1);
    let day = pad(date.getDate());
    let hour = pad(date.getHours());
    let minutes = pad(date.getMinutes());
    let seconds = pad(date.getSeconds());

    return year + "-" + month + "-" + day + " " + hour + ":" + minutes + ":" + seconds
}

// git 最后一次提交的 Head
const commit = child_process.execSync('git show -s --format=%H').toString().trim()
const commitUserName = child_process.execSync('git show -s --format=%cn').toString().trim()
const commitUserMail = child_process.execSync('git show -s --format=%ce').toString().trim()
const commitDate = formatDate(new Date(child_process.execSync(`git show -s --format=%cd`).toString()))
const buildDate = formatDate(new Date())
const branch = child_process.execSync('git rev-parse --abbrev-ref HEAD').toString().replace(/\s+/, '')

module.exports = {commit, commitUserName, commitUserMail, commitDate, buildDate, branch}

配置 vue.config.js

在 vue.config.js 文件中引入 gitInfo.js 文件。

const gitInfo = require('./gitInfo.js')

chainWebpack: (config) => {
    // ...
    config.plugin('html').tap(args => {
        args[0].gitInfo = gitInfo
        return args
    })
},

index.html添加信息

接着在 index.html 文件中添加版本信息

<meta name="author"      content="<%= htmlWebpackPlugin.options.gitInfo.commitUserName %>">
<meta name="createdAt"   content="<%= htmlWebpackPlugin.options.gitInfo.commitDate %>">
<meta name="generatedAt" content="<%= htmlWebpackPlugin.options.gitInfo.buildDate %>">
<meta name="version"     content="<%= htmlWebpackPlugin.options.gitInfo.commit %>">
<meta name="branch"      content="<%= htmlWebpackPlugin.options.gitInfo.branch %>">

Vue 打包时带上 Git 的版本号

Vue 打包时带上 Git 的版本号

Webpack插件

git-revision-webpack-plugin

git-revision-webpack-plugin:可在构建过程中生成VERSION和COMMITHASH文件的Webpack插件。

官网: https://developer.aliyun.com/mirror/npm/package/git-revision-webpack-plugin

安装

Webpack 4及以上版本

// 使用npm
npm install --save-dev git-revision-webpack-plugin
// 使用yarn
yarn add -D git-revision-webpack-plugin

配置

使用vue.config.js

const GitRevisionPlugin = require('git-revision-webpack-plugin')
const gitRevisionPlugin = new GitRevisionPlugin({
  versionCommand: 'describe --always --tags'
})

const vueConfig = {
  publicPath: '/',
  configureWebpack: {
    plugins: [
      gitRevisionPlugin
    ],
    output: {
      filename: "[name].[git-revision-hash].js"
    }
  }
}

直接使用webpack

// 省略代码
const GitRevisionPlugin = require('git-revision-webpack-plugin')
const gitRevisionPlugin = new GitRevisionPlugin({
  versionCommand: 'describe --always --tags'
})

const webpackConfig = merge(baseWebpackConfig, {
    //省略代码
    plugins: [
        // http://vuejs.github.io/vue-loader/en/workflow/production.html
        gitRevisionPlugin
    //省略代码
    ],
    output: {
        filename: "[name].[git-revision-hash].js"
    }
})