vue3.2使用i18n实现国际化

什么是 i18n

i18n(internationalization)是“国际化”的简称。由于其首尾分别为 i 和 n ,中间有18 个字符。故简写为 i18n。在vue.js中,有vue i18n国际化插件,可以轻松实现项目国际化的操作。

如何使用 i18n

  • 安装i18n插件
npm install vue-i18n
  • 创建所需语言文件(这里仅以中英文为例)

中文语言文件:zh_CN
英文语言文件:en.ts

1.文件en.ts

// src/i18n/language/en.ts
export default {
    system: {
        title: 'test i18n'
    }
}

2.文件zh_CN.ts

// src/i18n/language/zh_CN.ts
export default {
    system: {
        title: '测试 i18n'
    }
}

  • 配置 i18n index.ts
// src/i18n/index.ts
import {createI18n} from 'vue-i18n'
import zh_CN from './language/zh_CN'
import en from './language/en'

const messages = {
    zh_CN: {...zh_CN},
    en: {...en}
}

// 获取浏览器当前语言
const getCurrentLanguage = () => {
    const language = navigator.language
    const currentLanguage = language.indexOf('zh') !== -1 ? 'zh_CN' : 'en'
    localStorage.setItem('language', currentLanguage)
    return currentLanguage
}

// 创建i18n实例
const i18n = createI18n({
    legacy: false,
    globalInjection: true,
    locale: localStorage.getItem('language') || getCurrentLanguage() || 'zh_CN',
    messages: messages
})

export default i18n
  • 全局注册
import {createApp} from 'vue'
import App from './App.vue'
import i18n from './i18n'

const app = createApp(App)

app.use(i18n)
    .mount('#app')
  • 使用案例
<script setup lang="ts">
import {useI18n} from 'vue-i18n'
import {computed} from 'vue'

// 创建i18n对象
const i18n = useI18n()

// 获取当前语言
const currentLanguage = computed(() => i18n.locale.value)

// 切换语言
const changeLanguage = (language: string) => {
  localStorage.setItem('language', language)
  i18n.locale.value = language
}
</script>

<template>
  <el-dropdown @command="changeLanguage">
    <span class="el-dropdown-link">切换语言</span>
    <template #dropdown>
      <el-dropdown-menu>
        <el-dropdown-item command="zh_CN" :disabled="currentLanguage==='zh_CN'">中  文</el-dropdown-item>
        <el-dropdown-item command="en" :disabled="currentLanguage==='en'">English</el-dropdown-item>
      </el-dropdown-menu>
    </template>
  </el-dropdown>
  <hr/>
<p>{{ $t(`system.title`) }}</p>
</template>

<style scoped lang="scss">
    
</style>
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_何同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值