【问题标题】:vue-i18n sharedMessages based on component values doesn't seem to be working基于组件值的 vue-i18n sharedMessages 似乎不起作用
【发布时间】:2020-01-17 17:38:00
【问题描述】:

我们有一些 VueJS 组件,它们为我们可以根据路由参数从服务器获取的所有资源呈现内容。所有资源都由它们自己的类表示(为此我们使用vue-api-query)。

基本上,我们拥有的任何资源都定义如下:


export default class Invoices extends Model {
    resource() {
        return 'invoices';
    }

    get i18n() {
        return {
            en: {
                resource: 'Invoice | Invoices'
            },
            nl: {
                resource: 'Factuur | Facturen'
            }
        };
    }
}

当我们有一个特定于资源的组件时,我们希望执行以下操作:


<template>
   <div>
      Title could go here: Lis of all {{$tc('resource', 2}}
    </div>
</template>

<script>
    import models from './models';

    export default {
        data() {
            return {
                resource: new models[this.$route.params.resource](); 
            };
        }, 
        i18n: {
            sharedMessages: this.resource.i18n
        }
    }   

这似乎不起作用。 我还尝试使用函数拉入 sharedMessages:

i18n: {
    sharedMessages: () => { return this.resource.i18n; }
}

这也没有解决。 看起来我们无法以这种方式使用它。 我仔细检查并打印 `{{resource.i18n.en.resource}} 正确打印了我期望的字符串。

对我正在监督或根本不受支持的任何想法以及获得我们正在寻找的结果的解决方法?

刚刚也为它创建了一个CodeSandBox

再次感谢! 大卫

【问题讨论】:

  • 嗨大卫,我不知道我是否完全理解,但是如果你想改变语言,你只需要设置:this.$i18n.locale = 'en' 对吗?由于您从路由器获取语言,您可以在某些生命周期方法(例如创建)中设置它。
  • 嗨 - 感谢您的回复,但您没有得到问题。问题是我无法从组件中的 this.resource.i18n 加载 sharedMessages。这基本上就是我想要实现的目标。有关 sharedMessages 选项的文档可在 kazupon.github.io/vue-i18n/guide/… 获得

标签: javascript vue.js vue-i18n


【解决方案1】:

你在这里只漏掉了一件事。 i18n 在 vue 组件中的 data() 之前工作。所以 this.resource 不起作用。

要解决它,你可以像下面这样使用它:

export default {
  name: "App",
  data() {
    return {
      resource: new TestClass()
    };
  },
  i18n: {
    messages: {
      en: {
        local: "Local message in English"
      },
      nl: {
        local: "Lokaal bericht in het Nederlands"
      }
    },
    sharedMessages: new TestClass().i18n,
  }
};

如果你想继续处理数据,你可以使用mergeLocaleMessage。

import i18n from '@/i18n.js'; //your plugin path.
i18n.mergeLocaleMessage(i18n.locale, this.resource.i18n[i18n.locale]);

【讨论】:

  • 嘿-我知道,但这实际上是我的主要问题。此示例中的 TestClass 是通过属性传入的类。我尝试通过将问题缩小到我们真正需要的范围来简化问题:在 sharedMessages 中使用属性(通过道具或数据)...
  • @DavidHeremans,所以在这种情况下,您可以使用 mergeLocaleMessage。我将编辑我的答案。
  • 这也不起作用,因为该寄存器适用于全局 i18n。当我在页面上有两个组件(例如两个网格)时,第二次合并将覆盖第一次合并的消息。我们从 mergeLocaleMessage 移到 sharedMessages 以尝试解决此问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
相关资源
最近更新 更多