vue-i18n国际化多语言与多套UI组件库使用(Element Plus、Ant Design Vue、Naive UI)

8 篇文章 0 订阅

技术栈:Vue3+TypeScript+Vite+SCSS+(Element Plus、Ant Design Vue、Naive UI)

demo源码:Vue3 UI Lang

因调研需要,需在同一个项目中集成好几种UI组件库的多语言实现,查看各种组件库的表现情况,以便选定组件库。

注意:这只在调研过程中会如此,实际开发项目中极少存在一个项目中集成多个UI组件库的情况。

本demo实际试验阿拉伯语、法语、葡萄牙语、英语、中文五种语言。

VUE3+TypeScript+vue-i18n的项目基架参考本博客 VUE3 +TypeScript + i18n多语言结合使用

Element Plus

安装

npm install element-plus --save

main.ts 引入

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// ...
app.use(ElementPlus)

utils/common 获取当前语言

export const getCurrLang = () => {
  const localLang: string = navigator.language.split('-')[0]; // 浏览器语言
  const storageLang: string | null = sessionStorage.getItem("language"); // 本地存储语言
  return storageLang || localLang || 'en';
}

lang/index 多语言源

import { createI18n } from 'vue-i18n'
import { getCurrLang } from "@/utils/common"

// elementPlus
import EleAr from 'element-plus/dist/locale/ar.mjs'
import EleFr from 'element-plus/dist/locale/fr.mjs'
import ElePt from 'element-plus/dist/locale/pt.mjs'
import EleEn from 'element-plus/dist/locale/en.mjs'
import EleZhCn from 'element-plus/dist/locale/zh-cn.mjs'

const messages = {
  ar: {
    ele: EleAr
  },
  fr: {
    ele: EleFr
  },
  pt: {
    ele: ElePt
  },
  en: {
    ele: EleEn
  },
  zh: {
    ele: EleZhCn
  },
}
const i18n = createI18n({
  globalInjection: true, // 全局注入
  locale: getCurrLang(), // 当前语言
  messages,
  legacy: false,
})

export default i18n

App.vue 全局配置国际化

<script setup lang="ts">
import { computed } from 'vue';
import { RouterView } from 'vue-router'
import { ElConfigProvider } from 'element-plus'

import i18n from './lang';
const locale = computed(() => (i18n.global.messages.value[i18n.global.locale.value]))
console.log(i18n.global.messages.value[i18n.global.locale.value]) // 语言包中的当前语言环境包配置
console.log(i18n.global.messages.value) // 语言包完整配置
console.log(i18n.global.locale.value) // 当前语言环境
</script>

<template>
  <el-config-provider :locale="locale.ele">
    <RouterView />
  </el-config-provider>
</template>
<style scoped></style>

由此,就可在页面中使用涉及到国际化的组件了,比如el-color-pickerel-date-pickerel-time-pickerel-imageel-tree-selectel-popconfirmel-emptyel-calendarel-tableel-paginationel-page-header等。

效果

中文:
Element Plus 中文
阿拉伯语:
Element Plus 阿拉伯语

Ant Design Vue

安装

npm i ant-design-vue -S
npm i unplugin-vue-components unplugin-auto-import -D // 按需引入需要的插件

vite.config.js 配置

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import Components from 'unplugin-vue-components/vite'
import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    Components({
      resolvers: [
        AntDesignVueResolver({
          importStyle: 'less', // 一定要开启这个配置项
        }),
      ],
    })
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url)),
      'vue-i18n': 'vue-i18n/dist/vue-i18n.cjs.js',
    }
  }
})

lang/index 多语言源

import { createI18n } from 'vue-i18n'
import { getCurrLang } from "@/utils/common"

// Ant Design Vue
import AntAr from 'ant-design-vue/es/locale/ar_EG.js'
import AntFr from 'ant-design-vue/es/locale/fr_FR.js'
import AntPt from 'ant-design-vue/es/locale/pt_PT.js'
import AntEn from 'ant-design-vue/es/locale/en_US.js'
import AntZh from 'ant-design-vue/es/locale/zh_CN.js'

const messages = {
  ar: {
    ant: AntAr,
  },
  fr: {
    ant: AntFr,
  },
  pt: {
    ant: AntPt,
  },
  en: {
    ant: AntEn,
  },
  zh: {
    ant: AntZh,
  },
}

const i18n = createI18n({
  globalInjection: true, // 全局注入
  locale: getCurrLang(),
  messages,
  legacy: false,
})

export default i18n

App.vue 全局配置国际化

<script setup lang="ts">
import { computed } from 'vue';
import { RouterView } from 'vue-router'

import i18n from './lang';
const locale = computed(() => (i18n.global.messages.value[i18n.global.locale.value]))
console.log(i18n.global.messages.value[i18n.global.locale.value])
console.log(i18n.global.messages.value)
console.log(i18n.global.locale.value)
</script>

<template>
   <a-config-provider :locale="locale.ant">
      <RouterView />
   </a-config-provider>
</template>
<style scoped></style>

效果

中文:
ant design 中文

阿拉伯语:
ant design 阿拉伯语

Naive UI

安装

npm i -D naive-ui
npm i -D vfonts // 安装字体

lang/index 多语言源

import { createI18n } from 'vue-i18n'
import { getCurrLang } from "@/utils/common"

// native UI
import { arDZ, frFR, ptBR, zhCN, enUS, } from 'naive-ui'

const messages = {
  ar: {
    nai: arDZ,
  },
  fr: {
    nai: frFR,
  },
  pt: {
    nai: ptBR,
  },
  en: {
    nai: enUS,
  },
  zh: {
    nai: zhCN,
  },
}

const i18n = createI18n({
  globalInjection: true, //全局生效$t
  locale: getCurrLang(),
  messages,
  legacy: false,
})

export default i18n

App.vue 全局配置国际化

<script setup lang="ts">
import { computed } from 'vue';
import { RouterView } from 'vue-router'
import { NConfigProvider,NMessageProvider } from 'naive-ui'

import i18n from './lang';
const locale = computed(() => (i18n.global.messages.value[i18n.global.locale.value]))
console.log(i18n.global.messages.value[i18n.global.locale.value])
console.log(i18n.global.messages.value)
console.log(i18n.global.locale.value)
</script>

<template>
      <n-config-provider :locale="locale.nai">
        <n-message-provider>
          <RouterView />
        </n-message-provider>
      </n-config-provider>
</template>
<style scoped></style>

效果

中文:
Naive UI中文
阿拉伯语:
Naive UI 阿拉伯语

最后

此处只编写了部分代码,完整源码请查看文章开始部分git链接。
此处只针对多语言文本进行调研,部分语言会有左对齐、右对齐的差异,这里并不包含这部分内容。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值