返回顶部
首页 > 资讯 > 前端开发 > JavaScript >组件库中使用vue-i18n国际化的案例详解
  • 810
分享到

组件库中使用vue-i18n国际化的案例详解

vue-i18n国际化vue-i18n国际化使用 2023-05-18 08:05:24 810人浏览 安东尼
摘要

目录前言项目中使用 i18n组件库中使用 i18n需求未添加 i18n 前的组件库组件库 i18n 的配置文件组件库的输出文件组件库中使用 i18n项目中使用组件库和 i18n页面展

前言

看了 Vue-i18n 以及网上大部分相关文章,大多都是在讲 vue-i18n 在页面(项目)中的应用。至少目前,还没有看到哪篇文章是讲 vue-i18n 在组件库中的应用的,特别是再结合 element-ui 的国际化。

以下是个人在封装的组件库中使用 vue-i18n 的记录,也供有相关需求的同学参考。

项目中使用 i18n

不赘述,这里只是做个比较参考,直接抄官方文档

import Vue from 'vue'
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
// 准备翻译的语言环境信息
const messages = {
  en: {
    message: {
      hello: 'hello world'
    }
  },
  ja: {
    message: {
      hello: 'こんにちは、世界'
    }
  }
}
// 通过选项创建 VueI18n 实例
const i18n = new VueI18n({
  locale: 'ja', // 设置地区
  messages, // 设置地区信息
})
// 通过 `i18n` 选项创建 Vue 实例
new Vue({ i18n }).$mount('#app')
<template>  
  <div id="app">
    <p>{{ $t("message.hello") }}</p>
  </div>
</template>
复制代码

组件库中使用 i18n

需求

  • 组件库代码中配置 i18n ,并在组件中注册和使用
  • 页面中若使用 i18n,可以合并和覆盖组件库的 i18n 配置
  • element-uii18n 在组件库中注册,页面无需再注册
  • 页面切换语言时,组件库和 element-ui 的语言也一起切换

未添加 i18n 前的组件库

正常组件库的入口文件,是一个很标准的 export ,供页面进行 Vue.use() 调用。

这个模块没有特殊意义,只是作为基础代码展示,以及与下面加入 i18n 的代码做对比。

const components = {}; // 具体封装的组件这里不做赘述
const install = function (Vue, options = {}) {
  Object.keys(components).forEach((key) => {
    Vue.component(key, components[key]);
  });
};

if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue);
}
export default {
  version,
  install,
  ...components
};

组件库 i18n 的配置文件

先在 ./lang 路径下新建语言文件,如 en.jszh-CN.js 等(数据格式参考 vue-i18n

import Vue from 'vue';
import VueI18n from 'vue-i18n';
Vue.use(VueI18n)
// 配置从文件读取
const req = require.context('./lang', false, /.js$/)
const modules = req.keys().map(k => {
  let name = k.match(/./(.+).js/)[1]
  return {
    name: name,
    WEBLocale: req(k).default,
    elementLocale: require(`element-ui/lib/locale/lang/${name}`).default // 加入 element 的 i18n
  }
})
// 注册 i18n
let i18n = new VueI18n({
  locale: 'zh-CN',
  messages: getMessages(),
})
// 对外暴露的合并配置项的方法
export function i18nLocale(config, lang = 'zh-CN') {
  i18n = new VueI18n({
    locale: lang,
    messages: getMessages(config),
  })
  return i18n;
}
// 合并方法
function getMessages(config = []) {
  return modules.reduce((sum, item) => {
    let conf = config.find(m => m.locale === item.name) || {};
    let locale = conf.locale || item.name;
    sum[locale] = {
      ...item.elementLocale, // element 的语言配置
      ...item.webLocale, // 组件库的语言配置
      ...conf.message, // 页面的语言配置
    }
    return sum;
  }, {})
}
export default i18n;

组件库的输出文件

import i18n, { vueI18nLocale } from './locale';
import element from 'element-ui';
const components = {}; // 具体封装的组件这里不做赘述
// 传入一个 options ,为了将 element 的国际化合并方法传入组件库
// 经实验,element 的国际化合并在页面触发有效,在组件库中触发无效,故此操作
const install = function (Vue, options = {}) {
  Object.keys(components).forEach((key) => {
    Vue.component(key, components[key]);
  });
  // 在页面使用组件库,进行 Vue.use 的时候注册,能保证相同的 Vue 实例
  // 这句是关键!不能使用 Vue.prototype.$i18n = i18n; 会报错,报错原因是与 vue-i18n 内部的变量重名,故这里使用 $i18n_ 代替,但这不影响页面使用 $i18n
  Object.defineProperty(Vue.prototype, '$i18n_', {
    get() {
      // 此 this 为页面 vue 实例,若页面配置了国际化,则使用页面的实例,否则用组件库的国际化
      return this.$i18n || i18n;
    },
    configurable: true
  });
  // 在此注册 element,并将页面传入的国际化合并方法,继续传入到 element
  Vue.use(element, {
    i18n: options.i18n || ((key, value) => i18n.t(key, value))
  });
};

if (typeof window !== 'undefined' && window.Vue) {
  install(window.Vue);
}
export default {
  version,
  vueI18nLocale, // 导出合并语言配置项的方法
  install,
  ...components
};

组件库中使用 i18n

因为命名问题,只能使用 this.$i18n_ 而不是 this.$i18n

<div v-bind="$i18n_.t('textPart.textNum')"></div>

项目中使用组件库和 i18n

import Vue from 'vue';
import web from '../src/index'; // 组件库,无需再引用 element
// 页面的国际化配置,同样需要新建对应的语言文件
const req = require.context('./lang', false, /.js$/);
const localeConfig = req.keys().map((k) => {
  let name = k.match(/./(.+).js/)[1];
  return {
    locale: name, // 需要与组件库的语言类型一一对应
    message: req(k).default
  };
});
// 使用组件库暴露的合并配置项方法,获得新的 i18n 实例
// 该 i18n 包含了组件库的 i18n 和 页面的 i18n 
const i18n = web.i18nLocale(localeConfig, 'zh-CN');
// 注册组件库的同时,传入 element 的国际化合并方法
// 此时,该 i18n 包含了 element、组件库、页面 的 i18n
Vue.use(web, {
  i18n: (key, value) => i18n.t(key, value)
});
export default new Vue({
  el: '#app',
  router,
  i18n, // 将 i18n 注册到页面 vue 实例
  components: { App },
  template: '<App/>'
});

页面展示和切换 i18n

这里能展示 element、组件库、页面 的语言变量,切换语言也是三者一起切换

<template>
  <div>
    <!-- 两种写法返回值相同 -->
    <div v-bind="$t('textPart.textNum')"></div>
    <div v-bind="$i18n.t('textPart.textNum')"></div>
    <div @click="changeI18n">切换语言</div>
  </div>
</template>
<script>
  export default {
    data() {
      return {};
    },
    methods: {
      changeI18n() {
        // 这里的 this.$i18n 包含了 element、组件库、页面 的 i18n
        // 然后这里还有一个 this.$i18n_ ,是单独组件库的 i18n
        this.$i18n.locale = 'en';
      }
    }
  };

最后

至此,实现了 vue-i18n 在组件库中的应用,同时联合了 element-ui 实现了三方 i18n 的展示和切换。

最关键的是 Object.defineProperty 这个方法,以及 element 国际化的双层传参,前者解决了组件库与页面 i18n 的统一,后者将 elementi18n 纳入整个体系当中。事后回想,可谓精妙。

到此这篇关于组件库中使用 vue-i18n 国际化的文章就介绍到这了,更多相关vue-i18n 国际化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 组件库中使用vue-i18n国际化的案例详解

本文链接: https://lsjlt.com/news/211822.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 组件库中使用vue-i18n国际化的案例详解
    目录前言项目中使用 i18n组件库中使用 i18n需求未添加 i18n 前的组件库组件库 i18n 的配置文件组件库的输出文件组件库中使用 i18n项目中使用组件库和 i18n页面展...
    99+
    2023-05-18
    vue-i18n 国际化 vue-i18n 国际化使用
  • vue项目中vue-i18n和element-ui国际化开发实现的示例分析
    这篇文章主要介绍vue项目中vue-i18n和element-ui国际化开发实现的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在vue构建的项目中,我们常用element-...
    99+
    2024-04-02
  • PHP国际化组件中的国际化日历类怎么用
    这篇文章主要介绍“PHP国际化组件中的国际化日历类怎么用”,在日常操作中,相信很多人在PHP国际化组件中的国际化日历类怎么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP国际化组件中的国际化日历类怎么用...
    99+
    2023-06-20
  • 网站国际化多语言处理工具i18n安装使用方法图文详解
    目录一、首先安装i18n二、创建语言包文件三、main.js引入i18n四、修改App.vue文件五、页面使用接下来继续完善,加上切换语言按钮最后使用方法,按照上图1234顺序即可总...
    99+
    2024-04-02
  • Vue子组件调用父组件方法案例详解
    一、直接在子组件中通过this.$parent.event来调用父组件的方法 <!-- 父组件 --> <template> <div> ...
    99+
    2024-04-02
  • Vue中子组件向父组件传值$emit、.sync的案例详解
    目录父组件子组件案例父组件子组件v-model首先我们可先了解一个父组件向子组件传值的一个案例:将父组件请求的后端数据传值给子组件props 因为通过属性传值是单向的,有时候我们需要...
    99+
    2024-04-02
  • vue中this.$emit使用方法的实际案例
    目录需求:1新增页面2 新增页面中点击关联项目弹出的页面3实现效果总结this.$emit()主要用于子组件向父组件传值。 下面就给大家举一个实际开发中使用到的案例。 需求: 点击关...
    99+
    2023-02-10
    vue this.$emit作用 vue this.$emit
  • vue中i18n的安装与几种使用方式详解
    目录vue中i18n安装项目中的使用使用方式 组件里使用使用方式js总结介绍 Vue I18n 是 Vue.js 的国际化插件。它可以轻松地将一些本地化功能集成到你的 Vue.js ...
    99+
    2024-04-02
  • Vue使用Swiper的案例详解
    Vue使用Swiper看这一篇就够了 此案例实现需求 完成swiper动态异步数据下的slide渲染自定义分页器样式解决loop:true设置时的事件丢失问题swiper鼠标移入/移...
    99+
    2024-04-02
  • vue中router-view组件的使用详解
    在开发vue项目中经常需要实现一个页面里面可以切换着展现不同的组件页面 例如:下图中通过点击侧边栏不同的组件路由到不同的组件页,而侧边栏和顶部部分是不变的,切换的只是组件页面。 这...
    99+
    2024-04-02
  • Vue+Element switch组件的使用示例代码详解
    代码如下所示: <el-table-column label="商品状态" align="center"> <template slot-sco...
    99+
    2024-04-02
  • ElementUI中Tree组件使用案例讲解
    目录案例一:1.1后端准备工作1.2前端代码2.1后端准备2.2前端代码首先官网上的树形控件教程地址为Element - The world's most popular V...
    99+
    2022-12-09
    ElementUI中Tree组件使用 ElementUI中Tree组件
  • 为全球受众定制应用程序:Vue 的国际化解决方案
    i18n 库 Vue.js 社区开发了 Vue.js 国际化库 (i18n),它提供了一套全面的工具来管理多语言应用程序。i18n 库的主要功能包括: 加载和管理翻译消息 根据当前语言设置格式化消息 支持多语言切换 提供用于格式化数字、...
    99+
    2024-04-02
  • vue之监听器的使用案例详解
    第一种,用jquery的ajax发请求  用户注册时,判断用户名不能重复,可以用到监听器。监听器,用watch,需要监听哪个值的变化,就把这个值,放在watch里面。&#...
    99+
    2024-04-02
  • Vue中点击url下载文件的案例详解
    目录代码实现使用注意封装自定义指令将url转成bold,在创建a标签下载blob 代码实现 在src 下面的 directive 文件夹下新建目录 downLoadUrl ...
    99+
    2024-04-02
  • vue中keepAlive组件的作用和使用方法详解
    前言 在面试的时候,很多面试官再问vue的时候可能就会提一嘴,你知道keep-alive有什么作用吗? keep-alive是vue内置的一个组件,而这个组件的作用就是能够缓存不活动...
    99+
    2024-04-02
  • vue 内置组件 component 的用法示例详解
    目录component is 内置组件切换方法一:component is 内置组件切换方法二:component is 内置组件切换方法一: component组件(单独拿出一个组...
    99+
    2022-11-13
    vue 内置组件 component vue  component用法
  • 一文带你详解Vue中的组件化编程
    本篇文章带大家聊聊Vue中的组件化编程,分享一下对vue组件化的一个理解,最主要的单文件组件,希望对大家有所帮助!组件化让我越来越感觉到框架的力量了一.模块与组件,模块化与组件化对组件的理解如果以我们原来编写一个网页的方式依赖关系混乱我就不...
    99+
    2023-05-14
    Vue 组件化
  • vue组件生命周期钩子使用示例详解
    目录组件生命周期图组件生命周期钩子1、beforeCreate2、created3、beforeMount4、mounted5、beforeUpdate6、updated7...
    99+
    2024-04-02
  • Vue 可拖拽组件Vue Smooth DnD的使用详解
    目录简介和 Demo 展示API: Container属性生命周期回调事件API: Draggable实战简介和 Demo 展示 最近需要有个拖拽列表的需求,发现一个简单好用的 Vu...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作