VUE 配置 i18n
项目中与 i18n 有关的文件的结构
├── main.ts
└── src
└── lang
└── en.ts
└── zh-cn.ts // 文件名最好与 language 的取值保持一致,因为后续获取国际化文本时使用的是文件名
└── test
└── i18n
└── en.ts
└── zh-cn.ts
初始化 i18n 配置文件
import { createI18n } from 'vue-i18n'
const langModules = import.meta.glob('./lang/*.ts', { eager: true })
const i18nModules = import.meta.glob('@/**/i18n/*.ts', { eager: true })
const getFileMessage = (list: any, obj: any) => {
for(let key in list) {
const messages = list[key].default
const path = (key.match(/([^/]+)\.ts/) ?? [])[1] ?? ''
if(messages) {
obj[path] = {
...obj[path],
...messages
}
}
}
}
const getAllLanguage = () => {
const msgObj = {
'en': {
},
'zh-cn': {
}
}
getFileMessage(langModules, msgObj)
getFileMessage(i18nModules, msgObj)
return msgObj
}
const getLocalLanguage = () => {
return sessionStorage.getItem('language') || 'zh-cn'
}
const i18n = createI18n({
legacy: false,
locale: getLocalLanguage(),
messages: await getAllLanguage(),
})
document.getElementsByTagName('html')[0].setAttribute('lang', getLocalLanguage() == 'en' ? 'en' : 'zh')
export default i18n
在 main.ts 中引入 i18n
import { createApp } from 'vue'
import App from './App.vue'
import i18n from '@/i18n/index'
const app = createApp(App)
app.use(i18n)
app.mount('#app')
切换语言按钮代码实现示例
store/index 文件示例
import { defineStore } from 'pinia'
const languageHis: string = sessionStorage.getItem('language') || 'zh-cn'
export default defineStore('layout', {
state: () => {
return {
language: languageHis as string,
}
},
getters: {
getLanguage(): string {
return this.language
}
},
actions: {
setLanguage(language: string, i18n: any) {
this.language = language
i18n.locale.value = language
sessionStorage.setItem('language', language)
}
}
})
vue 文件示例
<template>
<div>
<button @click.prevent="changeLanguage">{{ language }}</button>
</div>
</template>
<script setup lang="ts">
import { computed, ref } from 'vue'
import layoutStore from '@/store/index'
import { useI18n } from 'vue-i18n';
import { useRouter } from 'vue-router';
const router = useRouter()
const i18n = useI18n()
const layoutSe = layoutStore()
const language = computed(() => layoutSe.getLanguage)
const changeLanguage = () => {
layoutSe.setLanguage(language.value == 'en' ? 'zh-cn' : 'en', i18n)
}
</script>