vue3+i18n 国际化处理

yarn add vue-i18n

1. 创建i18n文件

/i18n/index.js

import { createI18n } from 'vue-i18n'
import mZhLocale from './lang/zh'
import mEnLocale from './lang/en'
import store from '@/store'

const messages = {
  en: {
    msg: {
      ...mEnLocale
    }
  },
  zh: {
    msg: {
      ...mZhLocale
    }
  }
}

/**
 * 返回当前 lang
 */
function getLanguage() {
  return store && store.getters && store.getters.language
}
const i18n = createI18n({
  // 使用 Composition API 模式,则需要将其设置为false
  legacy: false,
  // 全局注入 $t 函数
  globalInjection: true,
  locale: getLanguage(),
  messages
})

export default i18n

/i18n/lang/zh.js

export default {
  login: {
    title: '用户登录',
    loginBtn: '登录',
  }
}

/i18n/lang/en.js

export default {
  login: {
    title: 'User Login',
    loginBtn: 'Login',
  }
}

 

 2. main.js中引用

 import i18n from '@/i18n';
app
  .use(store)
  .use(router)
  .use(i18n)
  .mount('#app')

 

3. store/index.js

import getters from './getters'
import app from './modules/app'

export default createStore({
  getters,
  modules: {
    app,
  }
})

 

store/getters.js

const getters = {
  language: state => state.app.language,
}
export default getters

 

store/modules/app.js

import { LANG} from '@/constant'
import { getItem, setItem } from '@/utils/storage'
export default {
  namespaced: true,
  state: () => ({
    language: getItem(LANG) || 'zh',
  }),
  mutations: {
    /**
     * 设置国际化
     */
    setLanguage(state, lang) {
      setItem(LANG, lang)
      state.language = lang
    },
  },
  actions: {}
}

 

以上就是基础代码,使用方式如下

在vue文件中

<template>
<h2 class="title">{{ $t('msg.userInfo.title') }}</h2>
</template>
<script setup>
const i18n = useI18n();
i18n.t('msg.login.usernameRule')
</script>

在js文件中

import i18n from '@/i18n'
i18n.global.t('msg.login.passwordRule')

 

posted @ 2021-12-20 17:32  real_zwj  阅读(1027)  评论(0编辑  收藏  举报