首页 前端知识 VUE3 TypeScript i18n多语言结合使用

VUE3 TypeScript i18n多语言结合使用

2024-08-14 00:08:06 前端知识 前端哥 114 498 我要收藏

VUE3 +TypeScript + i18n多语言结合使用

1、安装i18n

npm install vue-i18n@9

2、配置多语言文件

在src目录下创建lang文件夹,内部创建index.ts【多语言入口文件】 、zh.ts【中文语言配置】、en.ts【英文语言配置】。
结构如下:
|-src
|— assets
|— components
|— lang
|— index.ts
|— zh.ts
|— en.ts

1. index.ts

import { createI18n } from 'vue-i18n' // 引入i18n创建多语言对象
import zhLocale from './zh'; // 引入中文对应语言配置
import enLocale from './en'; // 引入英文对应语言配置

const messages = {
    zh: zhLocale,
    en: enLocale
}

const localLang = navigator.language.split('-')[0]; // 获取浏览器语言环境
const storageLang = window.localStorage.getItem('locale')?.split('"')[1].split('"')[0].toLocaleLowerCase() || 'en'; // 获取localStorage本地语言环境
const c = (storageLang.toLocaleLowerCase() !== 'zh' && storageLang.toLocaleLowerCase() !== 'en') ? 'en' : storageLang; // 如果localStorage语言环境既不是中文也不是英文就取为英文

const i18n = createI18n({
    globalInjection: true, // 开启全局多语言渗透
    locale: c || localLang || 'en', // 语言环境
    messages, // 语言配置字段
    legacy: false, // // 使用 vue3 组合式API 时必须设置为 false
})

export default i18n

2. zh.ts

export default {
  common: {
    add: "新增",
    edit: "编辑",
    delete: "删除"
  }
}

3. en.ts

export default {
  common: {
    add: "Add",
    edit: "Edit",
    delete: "Delete"
  }
}

其他语种配置同理

3、挂在到VUE上

main.ts

import { createApp } from 'vue
import App from './App.vue'
import './registerServiceWorker'
import router from './router'
import store from './store'

import i18n from '@/lang/index' // 多语言引入

const app = createApp(App);

app.use(store).use(router).use(i18n).mount('#app') // 使用i18n
app.config.globalProperties.$t = i18n.global.t // 挂载到全局,DOM上能使用$t使用

4、使用

由于上一步使用了app.config.globalProperties挂载到全局,所有vue页面都可用$t来使用。
比如:

<template>
  <div :style="{ boxShadow: 'var(--el-box-shadow-lighter)' }" id="topBar">
    <span class="vertical-middle">{{ $t('common.label1') }}</span>
  </div>
</template>

但是,在ts中,直接使用是不行的,需要另外引入,setup 有两种写法。

<script lang="ts">
import { defineComponent, ref } from 'vue';
import { useI18n } from 'vue-i18n' // 多语言


export default defineComponent({
  name: 'LeftMenu',
  setup() {
    const { t } = useI18n() // t方法取出,t('code')使用
    const menuList = [
      { id: '1', icon: 'Connection', title: t('tenant.label1'), path: '/tenant' }, 
      { id: '2', icon: 'Iphone', title: t('android.label1'), path: '/android' },
      { id: '3', icon: 'Iphone', title: t('androidManage.label1'), path: '/androidManage' },
      { id: '4', icon: 'Iphone', title: t('orderManage.label1'), path: '/orderManage' }
    ]
    return {
      menuList
    }
  },

})

</script>

或者

<script setup lang="ts">
import { defineComponent, ref } from 'vue';
import { useI18n } from 'vue-i18n' // 多语言

const { t } = useI18n() // t方法取出,t('code')使用
const menuList = [
  { id: '1', icon: 'Connection', title: t('tenant.label1'), path: '/tenant' }, 
  { id: '2', icon: 'Iphone', title: t('android.label1'), path: '/android' },
  { id: '3', icon: 'Iphone', title: t('androidManage.label1'), path: '/androidManage' },
  { id: '4', icon: 'Iphone', title: t('orderManage.label1'), path: '/orderManage' }
]

</script>
转载请注明出处或者链接地址:https://www.qianduange.cn//article/15495.html
标签
评论
发布的文章

HTML5 地理定位

2024-08-20 09:08:58

HTML5 的真相(一)

2024-08-20 09:08:31

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!