Vue + Vant + i18n 实现国际化及语言切换

库版本
packageversion
vue2.6.11
vant2.12.6
vue-i18n8.23.0

最近一个用 react-mobile 的小型 IM App 被客户吐槽UI,所以现在用传说Vue中最漂漂的 Vant 重构一下,没办法,react实在是没有省心又好看的移动端库了[手动哭脸T_T],所以喽,搞起!

第一步:导出 i18n 模块

模块代码如下:

import Vue from "vue";
import VueI18n from "vue-i18n";

import { getLanguage } from "@/utils/cookies";

// Vant built-in lang
import { Locale } from 'vant';
import enUS from "vant/es/locale/lang/en-US";
import zhCN from "vant/es/locale/lang/zh-CN";
import zhTW from "vant/es/locale/lang/zh-TW";
import jaJP from "vant/es/locale/lang/ja-JP";

// User defined lang
import enUsLocale from "./en_US";
import zhCnLocale from "./zh_CN";
import zhTwLocale from "./zh_TW";
import jaJpLocale from "./ja_JP";

Vue.use(VueI18n);

const messages = {
  'zh-CN': {
    ...zhCN,
    ...zhCnLocale
  },
  'zh-TW': {
    ...zhTW,
    ...zhTwLocale
  },
  'en-US': {
    ...enUS,
    ...enUsLocale
  },
  'ja-JP': {
    ...jaJP,
    ...jaJpLocale
  }
};

export const getLocale = () => {
  const cookieLanguage = getLanguage();
  if (cookieLanguage) {
    document.documentElement.lang = cookieLanguage;
    return cookieLanguage;
  }

  const language = navigator.language.toLowerCase();
  const locales = Object.keys(messages);
  for (const locale of locales) {
    if (language.indexOf(locale) > -1) {
      document.documentElement.lang = locale;
      return locale;
    }
  }

  // Default language is english
  return "en-US";
};

const CURRENT_LANG = getLocale();
// first entry
Locale.use(CURRENT_LANG, messages[CURRENT_LANG])

const i18n = new VueI18n({
  locale: CURRENT_LANG,
  messages
});

export default i18n;

业务语言包结构如下:

export default {
    appHeader: {
        title: 'Vue App'
    },
    langSelect: {
        pickerTitle: '当前语言',
    }
};

getLanguage 是使用 js-cookie 封装的方法,cookie.js 代码如下:

import Cookies from 'js-cookie'

// App
const languageKey = 'language'
export const getLanguage = () => Cookies.get(languageKey)
export const setLanguage = (language) => Cookies.set(languageKey, language)

i18n模块关键点

引入 vant 内置默认语言包:
import enUS from "vant/es/locale/lang/en-US"
import zhCN from "vant/es/locale/lang/zh-CN"
......
引入项目业务组件语言包:
import enUsLocale from "./en_US"
......
语言包整合成 messages 对象然后添加到 i18n 实例中,导出的 i18n 实例里设置的 locale 属性仅设置组件内置的语言显示,业务组件语言显示需要使用 vant导出的 Local.use 方法进行切换。

第二步:把 i18n 挂载到 Vue 实例

main.js 里引入 i18n 模块,添加到 Vue 实例中。

import Vue from "vue";

import "@/registerServiceWorker";
import App from "@/App.vue";
import router from "@/router";
import store from "@/store";
import i18n from '@/lang';

import 'amfe-flexible';

Vue.config.productionTip = false;

new Vue({
  router,
  store,
  i18n,
  render: h => h(App)
}).$mount("#app");

第三步:语言切换组件逻辑

逻辑代码如下:

<template>
  <van-popup
    v-model="showPicker"
    v-bind="popupConfig"
  >
    <van-picker
      show-toolbar
      item-height="1rem"
      swipe-duration="300"
      :title="$t('langSelect.pickerTitle')"
      :columns="langs"
      :default-index="defaultIndex"
      @confirm="onConfirm"
      @cancel="onClose"
    />
  </van-popup>
</template>

<script>
import { Popup, Picker, Toast, Locale } from 'vant';
import { setLanguage } from "@/utils/cookies";

export default {
  name: "LangSelect",
  components: {
    [Popup.name]: Popup,
    [Picker.name]: Picker,
    [Toast.name]: Toast
  },
  props: {
    popupConfig: {
      type: Object,
      default: () => ({
        overlay: true,
        position: 'bottom',
        duration: 0.3,
        closeOnPopstate: true,
        transitionAppear: true,
        safeAreaInsetBottom: true
      })
    }
  },
  data() {
    return {
      langs: [
        {
          text: '中文(简体)',
          value: 'zh-CN'
        },
        {
          text: '中文(繁体)',
          value: 'zh-TW'
        },
        {
          text: 'English',
          value: 'en-US'
        },
        {
          text: '日本語',
          value: 'ja-JP'
        },
        // {
        //   text: 'Español',
        //   value: 'en-US'
        // },
        // {
        //   text: '한국어',
        //   value: 'en-US'
        // },
        // {
        //   text: 'Italiano',
        //   value: 'en-US'
        // }
      ]
    };
  },
  computed: {
    showPicker: {
      get() {
        return this.$store.getters.langPicker;
      },
      set(val) {
        this.$store.dispatch('app/toggleLangPicker', val);
      }
    },
    defaultIndex() {
      return this.langs.findIndex(item => item.value === this.$i18n.locale) || 0;
    }
  },
  methods: {
    onConfirm({ value }) {
      // Vant basic
      Locale.use(value, this.$i18n.messages[value]);
      // Business component
      this.$i18n.locale = value;
      // Cookie
      setLanguage(value);
    },
    onClose() {
      this.$store.dispatch('app/toggleLangPicker', false)
    }
  }
};
</script>
语言包在组件中的使用要点:
  • 进行到这一步,在 template 中使用 $t('langSelect.pickerTitle') 就已经可以获取到自己设置的语言包了,逻辑代码中一样使用 this.$t('langSelect.pickerTitle') 即可拿到。
  • 我代码里使用的是 Vant 的 Popup + Picker 封装的公用组件,需要注意语言切换的时候需要同时切换业务组件和内置组件的语言包,即使用:
    Local.use('xxx', {...})
    this.$i18n.locale = 'xxx' || 'en-US'

效果图:
switch language

OK,vue + vant 的国际化到这就 over 了,对上述功能点有疑惑或者有更好的建议,欢迎留言~~

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3 TS Vite Element Plus I18n开源项目是一个基于Vue3和TypeScript的快速开发框架,它集成了Element Plus组件库和国际化功能。 Vue3是目前最新的Vue版本,它带来了很多新的特性和改进,比如更好的性能、更强大的类型推断和优化的渲染逻辑。使用Vue3可以让开发者拥有更好的开发体验和更高效的编码方式。 TS是TypeScript的缩写,它是JavaScript的超集,为JavaScript添加了静态类型检查和其他新特性。使用TypeScript可以更早地发现代码错误,并提供更好的代码提示和重构能力,提高了代码的可维护性和可读性。 Vite是一个由Evan You(Vue的创造者)开发的新一代前端构建工具,它具有极快的冷启动和热重载能力,能够大大提升开发效率。使用Vite可以快速搭建起整个项目的开发环境。 Element Plus是一套基于Vue3的UI组件库,它提供了丰富的常用组件和样式,可以帮助开发者快速搭建精美的界面。Element Plus基于Vue3的语法进行了优化,提供了更好的性能和更丰富的功能。 I18n国际化的缩写,它是指将应用程序适配到不同的语言和地区。开源项目中的I18n功能可以帮助开发者轻松实现语言支持,提供了翻译和切换语言的功能。 综上所述,Vue3 TS Vite Element Plus I18n开源项目是一个强大的开发框架,它集成了最新的Vue版本、TypeScript、快速开发工具Vite、Element Plus组件库和国际化功能。使用这个项目可以大大提高前端开发的效率和质量,特别适合构建大型和多语言的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

超喜欢你呦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值