vue-i18n 语言国际化

本文详细介绍Vue3中使用vue-i18n进行多语言国际化配置的方法,包括安装、注册、使用及切换语言的实现,同时对比Vue2的配置方式。

Vue3

1.安装vue-i18n

npm install vue-i18n@next -S

2.注册到Vue

lang/index.ts

import { createI18n } from 'vue-i18n';

import zh from './zh.json';
import en from './en.json';

// 创建i18n实例
const i18n: any = createI18n({
  legacy: false, // 使用Composition API,这里必须设置为false
  globalInjection: true, // 全局注入 $t 函数
  global: true,
  locale: getLocal(),
  fallbackLocale: 'zh', // 默认语言
  messages: { zh, en }
});

/**
 * 获取本地语言标识
 * @returns {string}
 */
function getLocal() {
  const locale = localStorage.getItem('lang');
  // 如果缓存中存在,则直接返回
  if (locale) {
    return locale;
  } else {
    // 否则使用默认
    const defaultLocale = 'zh';
    // 设置缓存
    localStorage.setItem('lang', defaultLocale);
    return defaultLocale;
  }
}

export default i18n;

注:如果导入json提示错误,在shims-vue.d.ts声明文件中加入以下内容
declare module '*.json' {
const value: any;
export default value;
}

在main.ts中引入lang/index.ts

import { createApp } from 'vue';
import App from './App.vue';
import i18n from '@/lang';
const app = createApp(App);
app.use(i18n).mount('#app');

3.使用方法

vue3使用
<template>
    <div> {{ $t('name') }} </div>
</template>

<script>
import i18n from '@/lang';
const { locale, t } = i18n.global;

export default defineComponent({
  setup() {
    console.log(locale.value);
    console.log(t('name'));
    console.log(this.$i18n.locale);
    console.log(this.$t('name'));
  }
})
</script>

切换语言

<template>
  <div>
    <button @click="changeLang('en')">English</button>
    <button @click="changeLang('zh')">中文</button>
    <button @click="toggleLang">Toggle Language</button>
    <p>{{ $t('name') }}</p>
  </div>
</template>

<!-- 组合式 -->
<script setup>
import i18n from '@/lang';
const { locale, t } = i18n.global;

const changeLang = (val) => {
  locale.value = val;
  localStorage.setItem("lang", val);
};

const toggleLanguage = () => {
  let val = locale.value === 'en' ? 'zh' : 'en';
  locale.value = val;
  localStorage.setItem("lang", val);
};
</script>

<!-- 选项式
<script >
import { defineComponent } from 'vue';
export default defineComponent({
  watch: {
    '$i18n.locale': {
      handler(lang) {
        console.log(lang);
        console.log(this.$i18n);
        document.title = this.$t('common.add');
      },
      immediate: true
    }
  },
  methods: {
    toggleLang() {
      this.$i18n.locale = this.$i18n.locale === 'en' ? 'zh' : 'en';
      console.log(this.$t('name'));
    }
  }
});
</script>
-->

开发Vue3 自定义i18n插件

plugins/i18n.js

import { reactive } from 'vue';
import messages from '../languages';
import elm_zh from 'element-plus/es/locale/lang/zh-cn';
import elm_en from 'element-plus/es/locale/lang/en';

// 获取本地语言标识
const getLocal = () => {
  const locale = window.localStorage.getItem('lang');
  // 如果缓存中存在,则直接返回
  if (locale) {
    return locale;
  } else {
    // 否则使用默认
    const defaultLocale = 'zh';
    // 设置缓存
    window.localStorage.setItem('lang', defaultLocale);
    return defaultLocale;
  }
};

// 创建翻译器对象
const createTranslator = (messages) => {
  const state = reactive({
    locale: getLocal(), // 默认语言
    messages: {
      zh: { ...messages.zh, ...elm_zh },
      en: { ...messages.en, ...elm_en },
    },
  });

  const translate = (key) => {
    const message = state.messages[state.locale];
    const keys = key.split('.');
    return keys.reduce((o, i) => {
      if (o) {
        return o[i];
      }
    }, message);
  };

  return {
    state,
    translate,
  };
};

// 定义插件
const i18nPlugin = {
  install(app) {
    const translator = createTranslator(messages);

    // 注入 $i18n 对象
    app.provide('$i18n', translator);

    // 在应用程序实例上暴露 $t 方法
    app.config.globalProperties.$translate = (key) => {
      return translator.translate(key);
    };
  },
};

export default i18nPlugin;

main.js

import i18nPlugin from './plugins/i18n';
app.use(i18nPlugin);

Vue2

1.安装vue-i18n

npm install vue-i18n -S

2.注册到Vue

import Vue from 'vue';
import VueI18n from 'vue-i18n';
Vue.use(VueI18n);

// 准备翻译的语言环境信息
const locales = {
    zh: {
        name: '你好,世界'
    },
    en: {
        name: 'hello world'
    }
};
//或者从外部json文件导入
//const zh = require('./lang/zh.json');
//const en = require('./lang/en.json');
//const locales = { zh, en };


const i18n = new VueI18n({
    locale: 'zh',
    messages: locales
});

// 通过 `i18n` 选项创建 Vue 实例
new Vue({ i18n }).$mount('#app')

3.使用方法

<template>
    <div> {{ $t('name') }} </div>
</template>

<script>
export default ({
 data() {
 	return { }
 },
 computed: {
   getLocalName() {
   	 return this.$t('name')
   } 
 }
})
</script>

切换语言

<template>
  <div>
    <button @click="changeLang('en')">English</button>
    <button @click="changeLang('zh')">中文</button>
    <button @click="toggleLang">Toggle Language</button>
    <p>{{ $t('name') }}</p>
  </div>
</template>

<script>
export default {
  methods: {
    changeLang(locale) {
      this.$i18n.locale = locale;
    },
    toggleLang() {
      this.$i18n.locale = this.$i18n.locale === 'en' ? 'zh' : 'en';
    }
  }
};
</script>

其他

在代码中可实时显示翻译结果的插件
Vue3中,国际化插件vue-i18n使用记录,配合VSCode自动化翻译插件i18n Ally

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值