vue3+typescript+pinia+element plus实现多语言切换

1,366 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情 >>

背景

让网站实现多语言切换.

技术栈: vue3.2、typescript、pinia、localStorage、element-plus、vue-i18n

vue3国际化

npm i vue-i18n

配置

在src目录下新建locales文件,新建zh-cn.ts、en.ts、index.ts。

//zh-ch.ts
export default {
  buttons: {
    login: '登录'
  },
  menus: {
    home: '首页'
  }
}
//en.ts
export default {
  buttons: {
    login: 'Login'
  },
  menus: {
    home: 'Home'
  }
}
//index.ts
import { createI18n } from 'vue-i18n'
import zhCn from './zh-cn'
import en from './en'

// 创建 i18n
const i18n = createI18n({
  legacy: false,
  globalInjection: true, // 全局模式,可以直接使用 $t
  locale: localStorage.getItem('lang') || 'zhCn',
  messages: {
    zhCn,
    en
  }
})

export default i18n

在main.ts中引入

import i18n from './locales'

createApp(App).use(il8n)

使用

在template中使用

{{ $t('menus.home') }}

在typescript中使用

import i18n from '@/locales';
console.log(i18n.global.t('menus.home'));

element使用国际化

import zhCn from 'element-plus/lib/locale/lang/zh-cn';
const locale = ref(az)

<el-config-provider :locale="locale">
  <router-view />
</el-config-provider>

语言切换

利用i18n+pinia+localStorage实现

安装pinia

yarn add pinia 或者 npm install pinia

在main.ts中引入pinia

import {createPinia} from 'pinia'
app.use(createPinia())

在src下边新建store文件夹,在store文件夹下新建module新建locales.ts,实现模块化,在store文件夹下新建index.ts

//index.ts
import useLocales from './module/locales'

export default function useStore(){
  return {
    locales: useLocales()
  }
}
//module/locales
import { defineStore } from 'pinia'
import i18n from '@/locales'

export const useStore = defineStore('app', {
  state: () => {
    return {
      locale: localStorage.getItem('lang') || 'zhCn'
    }
  },
  actions: {
    SET_LOCALE(locale: any){
      console.log(locale)
      this.locale = locale;
      localStorage.setItem('lang', locale);
      i18n.global.locale.value = locale
    }
  }
})

export default useStore

在页面中引入

import useStore from '@/store/index';
const store = useStore();
const localChange = (value: string) => {
  store.locales.SET_LOCALE(value);
};

elementplus同步更新

//app.vue
import zhCn from 'element-plus/lib/locale/lang/zh-cn';
import en from 'element-plus/lib/locale/lang/en';
import useStore from './store/index'

<el-config-provider :locale="useStore().locales.$state.locale === 'zhCn'?zhCn:en">
  <router-view />
</el-config-provider>