Skip to content

国际化

国际化

介绍

在 Vue3 项目中实现国际化 (i18n) 通常使用vue-i18n库,它提供了完整的国际化解决方案,支持组件内本地化、动态语言切换、复数形式等高级功能。

文件:package.json

json
"dependencies": {
    ...
	"vue-i18n": "9.10.2",
    ...
}

配置默认语言

文件:src\store\modules\locale.ts,配置 currentLocale 为其他语言。

ts
export const useLocaleStore = defineStore('locales', {
  state: (): LocaleState => {
    return {
      currentLocale: {
        lang: wsCache.get(CACHE_KEY.LANG) || 'zh-CN',
        elLocale: elLocaleMap[wsCache.get(CACHE_KEY.LANG) || 'zh-CN']
      },
      // 多语言
      localeMap: [
        {
          lang: 'zh-CN',
          name: '简体中文'
        },
        {
          lang: 'en',
          name: 'English'
        }
      ]
    }
  },
  getters: {
    getCurrentLocale(): LocaleDropdownType {
      return this.currentLocale
    },
    getLocaleMap(): LocaleDropdownType[] {
      return this.localeMap
    }
  },
  actions: {
    setCurrentLocale(localeMap: LocaleDropdownType) {
      // this.locale = Object.assign(this.locale, localeMap)
      this.currentLocale.lang = localeMap?.lang
      this.currentLocale.elLocale = elLocaleMap[localeMap?.lang]
      wsCache.set(CACHE_KEY.LANG, localeMap?.lang)
    }
  }
})

语言文件

目前项目中的语言都是没有拆分,目录:src\locales

sh
locales/
|-- en.ts
`-- zh-CN.ts

image-20250628101700258

语言文件导入逻辑说明

  • 在 src/plugins/vueI18n/index.ts 内可以看到,这会导入 src/locales 文件语言包。
ts
const defaultLocal = await import(`../../locales/${locale.lang}.ts`)

使用示例

引入项目自带的 useI18n,注意不要引入 vue-i18n 的 useI18n

vue
<template>
	<div key="2" class="text-3xl text-white">{{ t('login.welcome') }}</div>
    <div key="3" class="mt-5 text-14px font-normal text-white">
      {{ t('login.message') }}
    </div>
</template>
<script lang="ts" setup>
    const { t } = useI18n()
</script>

文件:src\types\auto-imports.d.ts ,配置了自动引入

ts
export {}
declare global {
	...
    const useI18n: typeof import('@/hooks/web/useI18n')['useI18n']
    ...
}

切换语言:切换语言需要使用 src/hooks/web/useLocale.ts

ts
import { useLocale } from '@/hooks/web/useLocale'
const { changeLocale } = useLocale()

changeLocale('en')