Vue3修改Element-plus语言与项目国际化

修改Element-plus默认语言

Element-plus默认语言是英语,可修改为其它语言;

此处 Element-plus 为自动按需导入方式配置;

更多导入方式:Vue3使用Element-plus-CSDN博客

全局配置默认语言参考:国际化 | Element Plus

统一固定设置

在 App.vue 引入 Element-plus 语言包,并使用 el-config-provider 标签

html 复制代码
<script setup>
import { RouterView } from 'vue-router'
import { ElConfigProvider } from 'element-plus'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
</script>

<template>
  <el-config-provider :locale="zhCn">
    <RouterView />
  </el-config-provider>
</template>

动态切换(示例)

仅作学习

html 复制代码
<script setup>
import { ref, computed } from 'vue'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import en from 'element-plus/dist/locale/en.mjs'

const language = ref(zhCn)
const locale = computed(() => (language.value === 'zh-cn' ? zhCn : en))

const toggle = () => {
  language.value = language.value === 'zh-cn' ? 'en' : 'zh-cn'
}
</script>

<template>
  <div>
    <el-button @click="toggle">Switch Language</el-button>
    <br />
    <el-config-provider :locale="locale">
      <el-table :data="[]" />
      <el-pagination :total="100" />
    </el-config-provider>
  </div>
</template>

项目国际化

使用 vue-i18n 模块

安装依赖

bash 复制代码
npm i vue-i18n

创建文件

在 src 目录下创建 locales 目录,里面创建文件:en.js、zh-cn.js、index.js

javascript 复制代码
// en.js

export default {
  login: {
    title: 'Login Form',
    logIn: 'Login',
    username: 'Username',
    password: 'Password'
  }
}
javascript 复制代码
// zh-cn.js

export default {
  login: {
    title: '系统登录',
    logIn: '登录',
    username: '账号',
    password: '密码'
  }
}
javascript 复制代码
// index.js

import { createI18n } from 'vue-i18n'
import elEnLocale from 'element-plus/es/locale/lang/en'
import elZhLocale from 'element-plus/es/locale/lang/zh-cn'
import enLocale from './en'
import zhLocale from './zh-cn'

const messages = {
  en: {
    ...enLocale,
    ...elEnLocale
  },
  'zh-cn': {
    ...zhLocale,
    ...elZhLocale
  }
}

export const getLocale = () => {
  // 获取缓存
  const storLanguage = localStorage.getItem('language')
  // 存在返回当前语言
  if (storLanguage) return storLanguage
  // 不存在 获取系统语言
  const language = (navigator.language || navigator.browserLanguage).toLowerCase()
  const locales = Object.keys(messages)
  for (const locale of locales) {
    if (language.indexOf(locale) > -1) {
      return locale
    }
  }
  // 默认返回简体中文
  return 'zh-cn'
}
const i18n = createI18n({
  globalInjection: true,
  legacy: false,
  locale: getLocale(),
  messages: messages
})
export default i18n

编辑 main.js

挂载 locales/index.js

javascript 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import i18n from '@/locales/index'

const app = createApp(App)

app.use(router)
app.use(i18n)

app.mount('#app')

编辑 App.vue

在 App.vue 使用 el-config-provider 标签配置

html 复制代码
<script setup>
import { RouterView } from 'vue-router'
import { ElConfigProvider } from 'element-plus'
import { useI18n } from 'vue-i18n'
const { locale, messages } = useI18n()
</script>

<template>
  <el-config-provider :locale="messages[locale]">
    <RouterView />
  </el-config-provider>
</template>

创建组件

在 components 创建一个 language.vue 组件

html 复制代码
<script setup>
import { useI18n } from 'vue-i18n'
const { locale } = useI18n()
const languages = [
  { name: 'English', value: 'en' },
  { name: '中文', value: 'zh-cn' }
]
const handleSetLanguage = (lang) => {
  locale.value = lang
  localStorage.setItem('language', lang)
}
</script>

<template>
  <el-button type="" v-for="item in languages" :key="item.value" @click="handleSetLanguage(item.value)">{{ item.name }}</el-button>
</template>

使用组件

在页面 home.vue 使用 language.vue 组件并使用前面配置好的语言;

html 复制代码
<script setup>
import LangSelect from '@/components/lang_select/langSelect.vue'
import { reactive } from 'vue'
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const form = reactive({
  name: ''
})
</script>

<template>
  <LangSelect />

  <div style="margin: 50px">
    {{ t('login.title') }}
  </div>
  <el-form :model="form" label-width="120px">
    <el-form-item :label="t('login.username')">
      <el-input v-model="form.name" :placeholder="t('login.username')" />
    </el-form-item>
  </el-form>

  <div>
    <el-table :data="[]" />
    <el-pagination :total="100" />
  </div>
</template>
相关推荐
徐子颐11 分钟前
从 Vibe Coding 到 Agent Coding:Cursor 2.0 开启下一代 AI 开发范式
前端
小月鸭23 分钟前
如何理解HTML语义化
前端·html
jump6801 小时前
url输入到网页展示会发生什么?
前端
诸葛韩信1 小时前
我们需要了解的Web Workers
前端
brzhang1 小时前
我觉得可以试试 TOON —— 一个为 LLM 而生的极致压缩数据格式
前端·后端·架构
yivifu1 小时前
JavaScript Selection API详解
java·前端·javascript
这儿有一堆花1 小时前
告别 Class 组件:拥抱 React Hooks 带来的函数式新范式
前端·javascript·react.js
十二春秋1 小时前
场景模拟:基础路由配置
前端
六月的可乐2 小时前
实战干货-Vue实现AI聊天助手全流程解析
前端·vue.js·ai编程
一 乐2 小时前
智慧党建|党务学习|基于SprinBoot+vue的智慧党建学习平台(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·学习