赞
踩
实现功能: vue3后台管理系统页面引入i18n国际化实现页面中英文切换
$ npm install vue-i18n
i18n/i18n.ts
import { createApp } from 'vue' import App from '../App.vue' import { createI18n } from 'vue-i18n' //引入vue-i18n组件 import enLocale from 'element-plus/es/locale/lang/en' import zhLocale from 'element-plus/es/locale/lang/zh-cn' import en from './locale/en' import zh from './locale/zh-CN' const language = ( (navigator.language ? navigator.language : navigator.userLanguage) || "zh" ).toLowerCase(); const messages={ en: { ...en, ...enLocale }, zh: { ...zh, ...zhLocale } } const i18n = createI18n({ locale: language.split("-")[0] || "zh", // 设置默认语言 messages, }); export default i18n;
i18n/locale/en.ts
export default {
language: {
China: 'China',
English: 'English',
},
message: {
Home: 'Home',
SystemManage: 'System Manage',
RouterManage: 'Router Manage'
}
}
i18n/i18n.ts/zh-CN.ts
export default {
language: {
China: '中文',
English: '英文',
},
message: {
Home: '首页',
SystemManage: '系统管理',
RouterManage: '路由管理'
}
}
main.ts
import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store/index' import i18n from './i18n/i18n' import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import './styles/index.scss' createApp(App).use(ElementPlus,{ i18n:(key,value) => i18n.t(key,value), }) createApp(App) .use(store) .use(router) .use(i18n) .use(ElementPlus) .mount('#app')
模版中
<span>{{ $t('language.China') }}</span>
<el-option
v-for="item in languageOptions"
:key="item.value"
:label="$t(item.label)"
:value="item.value"
/>
js中
import { getCurrentInstance } from "vue";
import { useI18n } from 'vue-i18n'//要在js中使用国际化
// 语言切换
function change(val) {
const { proxy } = getCurrentInstance();
const languageChange = (val: String) => {
proxy.$i18n.locale = val === '0' ? 'zh' : val === '1' ? 'en' : ''
}
}
// 获取值
const { t } = useI18n();
console.log(t('message.Home')) // 首页
例子——头部组件
<template> <div class="header"> <kb-humburger @toggleClick="toggleClick" /> <div class="header-right"> <el-select class="language-select" v-model="languageValue" @change="languageChange"> <el-option v-for="item in languageOptions" :key="item.value" :label="$t(item.label)" :value="item.value" /> </el-select> <el-dropdown> <span class="el-dropdown-link"> <el-avatar shape="square" :size="30" :src='`@import "@/assets/portrait.png"`' /> <i class="el-icon-arrow-down el-icon--right"></i> </span> <template #dropdown> <el-dropdown-menu> <el-dropdown-item>{{ $t('language.China') }}</el-dropdown-item> <el-dropdown-item>Action 2</el-dropdown-item> <el-dropdown-item>Action 3</el-dropdown-item> <el-dropdown-item disabled>Action 4</el-dropdown-item> <el-dropdown-item divided>Action 5</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </div> </div> </template> <script lang="ts"> import KbHumburger from '@/components/KbHamburger.vue' import { ref } from 'vue' import { useStore } from 'vuex' import { ArrowDown } from '@element-plus/icons-vue' import { getCurrentInstance } from "vue"; import { useI18n } from 'vue-i18n'//要在js中使用国际化 export default { components: { KbHumburger, ArrowDown }, setup() { const isCollapse = ref(true) const store = useStore() const toggleClick = () => { store.dispatch('toggleSideBar') } const { proxy } = getCurrentInstance(); const languageValue = ref('0') const { t } = useI18n(); const languageOptions = [ { value: '0', label: 'language.China', }, { value: '1', label: 'language.English', }, ] const languageChange = (val: String) => { proxy.$i18n.locale = val === '0' ? 'zh' : val === '1' ? 'en' : '' } return { toggleClick, languageValue, languageOptions, languageChange } } } </script> <style lang="scss" scoped> .header { height: 100%; display: flex; align-items: center; justify-content: space-between; background: #fff; .el-dropdown-link { display: flex; align-items: center } .header-right { display: flex; justify-content: space-between; width: 160px; .language-select { width: 100px; } } } </style>
资料:i18n文档
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。