组件库中怎么使用vue-i18n

其他教程   发布日期:2025年04月06日   浏览次数:104

这篇文章主要介绍了组件库中怎么使用vue-i18n的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇组件库中怎么使用vue-i18n文章都会有所收获,下面我们一起来看看吧。

    项目中使用 i18n

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

    1. import Vue from 'vue'
    2. import VueI18n from 'vue-i18n'
    3. Vue.use(VueI18n)
    4. // 准备翻译的语言环境信息
    5. const messages = {
    6. en: {
    7. message: {
    8. hello: 'hello world'
    9. }
    10. },
    11. ja: {
    12. message: {
    13. hello: 'こんにちは、世界'
    14. }
    15. }
    16. }
    17. // 通过选项创建 VueI18n 实例
    18. const i18n = new VueI18n({
    19. locale: 'ja', // 设置地区
    20. messages, // 设置地区信息
    21. })
    22. // 通过 `i18n` 选项创建 Vue 实例
    23. new Vue({ i18n }).$mount('#app')
    1. <template>
    2. <div id="app">
    3. <p>{{ $t("message.hello") }}</p>
    4. </div>
    5. </template>

    组件库中使用 i18n

    需求

    • 组件库代码中配置

      1. i18n
      ,并在组件中注册和使用
    • 页面中若使用

      1. i18n
      ,可以合并和覆盖组件库的
      1. i18n
      配置
      1. element-ui
      1. i18n
      在组件库中注册,页面无需再注册
    • 页面切换语言时,组件库和

      1. element-ui
      的语言也一起切换

    未添加 i18n 前的组件库

    正常组件库的入口文件,是一个很标准的

    1. export
    ,供页面进行
    1. Vue.use()
    调用。

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

    1. i18n
    的代码做对比。
    1. const components = {}; // 具体封装的组件这里不做赘述
    2. const install = function (Vue, options = {}) {
    3. Object.keys(components).forEach((key) => {
    4. Vue.component(key, components[key]);
    5. });
    6. };
    7. /* istanbul ignore if */
    8. if (typeof window !== 'undefined' && window.Vue) {
    9. install(window.Vue);
    10. }
    11. export default {
    12. version,
    13. install,
    14. ...components
    15. };

    组件库 i18n 的配置文件

    先在

    1. ./lang
    路径下新建语言文件,如
    1. en.js
    1. zh-CN.js
    等(数据格式参考
    1. vue-i18n
    1. import Vue from 'vue';
    2. import VueI18n from 'vue-i18n';
    3. Vue.use(VueI18n)
    4. // 配置从文件读取
    5. const req = require.context('./lang', false, /.js$/)
    6. const modules = req.keys().map(k => {
    7. let name = k.match(/./(.+).js/)[1]
    8. return {
    9. name: name,
    10. webLocale: req(k).default,
    11. elementLocale: require(`element-ui/lib/locale/lang/${name}`).default // 加入 element 的 i18n
    12. }
    13. })
    14. // 注册 i18n
    15. let i18n = new VueI18n({
    16. locale: 'zh-CN',
    17. messages: getMessages(),
    18. })
    19. // 对外暴露的合并配置项的方法
    20. export function i18nLocale(config, lang = 'zh-CN') {
    21. i18n = new VueI18n({
    22. locale: lang,
    23. messages: getMessages(config),
    24. })
    25. return i18n;
    26. }
    27. // 合并方法
    28. function getMessages(config = []) {
    29. return modules.reduce((sum, item) => {
    30. let conf = config.find(m => m.locale === item.name) || {};
    31. let locale = conf.locale || item.name;
    32. sum[locale] = {
    33. ...item.elementLocale, // element 的语言配置
    34. ...item.webLocale, // 组件库的语言配置
    35. ...conf.message, // 页面的语言配置
    36. }
    37. return sum;
    38. }, {})
    39. }
    40. export default i18n;

    组件库的输出文件

    1. import i18n, { vueI18nLocale } from './locale';
    2. import element from 'element-ui';
    3. const components = {}; // 具体封装的组件这里不做赘述
    4. // 传入一个 options ,为了将 element 的国际化合并方法传入组件库
    5. // 经实验,element 的国际化合并在页面触发有效,在组件库中触发无效,故此操作
    6. const install = function (Vue, options = {}) {
    7. Object.keys(components).forEach((key) => {
    8. Vue.component(key, components[key]);
    9. });
    10. // 在页面使用组件库,进行 Vue.use 的时候注册,能保证相同的 Vue 实例
    11. // 这句是关键!不能使用 Vue.prototype.$i18n = i18n; 会报错,报错原因是与 vue-i18n 内部的变量重名,故这里使用 $i18n_ 代替,但这不影响页面使用 $i18n
    12. Object.defineProperty(Vue.prototype, '$i18n_', {
    13. get() {
    14. // 此 this 为页面 vue 实例,若页面配置了国际化,则使用页面的实例,否则用组件库的国际化
    15. return this.$i18n || i18n;
    16. },
    17. configurable: true
    18. });
    19. // 在此注册 element,并将页面传入的国际化合并方法,继续传入到 element
    20. Vue.use(element, {
    21. i18n: options.i18n || ((key, value) => i18n.t(key, value))
    22. });
    23. };
    24. /* istanbul ignore if */
    25. if (typeof window !== 'undefined' && window.Vue) {
    26. install(window.Vue);
    27. }
    28. export default {
    29. version,
    30. vueI18nLocale, // 导出合并语言配置项的方法
    31. install,
    32. ...components
    33. };

    组件库中使用 i18n

    因为命名问题,只能使用

    1. this.$i18n_
    而不是
    1. this.$i18n
    1. <div v-bind="$i18n_.t('textPart.textNum')"></div>

    项目中使用组件库和 i18n

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

    页面展示和切换 i18n

    这里能展示

    1. element
    、组件库、页面 的语言变量,切换语言也是三者一起切换
    1. <template>
    2. <div>
    3. <!-- 两种写法返回值相同 -->
    4. <div v-bind="$t('textPart.textNum')"></div>
    5. <div v-bind="$i18n.t('textPart.textNum')"></div>
    6. <div @click="changeI18n">切换语言</div>
    7. </div>
    8. </template>
    9. <script>
    10. export default {
    11. data() {
    12. return {};
    13. },
    14. methods: {
    15. changeI18n() {
    16. // 这里的 this.$i18n 包含了 element、组件库、页面 的 i18n
    17. // 然后这里还有一个 this.$i18n_ ,是单独组件库的 i18n
    18. this.$i18n.locale = 'en';
    19. }
    20. }
    21. };

    以上就是组件库中怎么使用vue-i18n的详细内容,更多关于组件库中怎么使用vue-i18n的资料请关注九品源码其它相关文章!