【实操】vue3+elementUI+i18n国际化多语言切换

实现功能: vue3后台管理系统页面引入i18n国际化实现页面中英文切换

一、界面展示

【中文界面】

在这里插入图片描述

【英文界面】

在这里插入图片描述

二、实现过程

【第一步:安装i8n】

$ npm install vue-i18n

【第二步:创建i8n文件夹】

在这里插入图片描述

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中引入】

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文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值