Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor-与自定义i18n集合中的字段冲突,仅与多个发布冲突_Meteor_Internationalization - Fatal编程技术网

Meteor-与自定义i18n集合中的字段冲突,仅与多个发布冲突

Meteor-与自定义i18n集合中的字段冲突,仅与多个发布冲突,meteor,internationalization,Meteor,Internationalization,我正在编写一个i18n集合,但我对出版物中翻译字段的字段选项有问题 我使用的是TAPi18n,但不是TAPi18n db。 我的DBi18n收集包的工作原理如下: MyCollec.find({'i18n.slug': 'about'}, {lg: 'es', fields: {key: 1, 'i18n.slug': 1, 'i18n.title': 1}}); 首先,数据库中的结构如下所示: { page: 'home', template: 'home' i18n: {

我正在编写一个i18n集合,但我对出版物中翻译字段的字段选项有问题

我使用的是TAPi18n,但不是TAPi18n db。 我的DBi18n收集包的工作原理如下:

MyCollec.find({'i18n.slug': 'about'}, {lg: 'es', fields: {key: 1, 'i18n.slug': 1, 'i18n.title': 1}});
首先,数据库中的结构如下所示:

{
   page: 'home',
   template: 'home'
   i18n: {
      en: {
         name: 'Home', // used in menu
         slug: 'home', // auto generated from en name field
         title: 'Welcome !' // used in content page
      },
      es: {
         name: 'Inicio', // used in menu
         slug: 'inicio', // auto generated from es name field
         title: '¡Bienvenidos!' // used in content page
      }
   }
}, {
   page: 'about',
   template: 'basic'
   i18n: {
      en: {
         name: 'About', // used in menu
         slug: 'about', // auto generated from en name field
         title: 'About us' // used in content page
      },
      es: {
         name: 'Acerca de', // used in menu
         slug: 'acerca-de', // auto generated from es name field
         title: 'Acerca de nosotros' // used in content page
      }
   }
}, {
   ...
}
在服务器上,如果要使用翻译,必须在选项find/findOne中传递lg参数。 在客户机上,如果选项中没有lg参数,它将采用TAPi18n中的当前语言

在这两种环境中,都可以使用特殊的选择器和字段对象调用find/findOne/fetch函数,如下所示:

MyCollec.find({'i18n.slug': 'about'}, {lg: 'es', fields: {key: 1, 'i18n.slug': 1, 'i18n.title': 1}});
DBi18n将调用转换为:

MyCollec.find({'i18n.es.slug': 'about'}, {fields: {key: 1, 'i18n.es.slug': 1, 'i18n.es.title': 1}});
然后,我们在返回结果之前对其进行处理,将所有已翻译字段放在文档的根上,并删除i18n属性

  • find返回普通游标(我们不处理结果)

  • findOne返回处理过的文档,如下所示:{key:'about',slug:'about',title:'about'}

  • fetch返回处理过的文档,如下:[{key:'about',slug:'about',title:'about'},]

而且它工作得很好

但在我的项目中,我有一个奇怪的问题。 首先,我发布菜单页面,其中包含一些翻译字段(slug和name)和另一个普通字段(template…)。 然后我正在做另一个出版物来显示当前页面,带有更多翻译字段(标题、内容等)

这是我的问题:翻译后的字段没有发布,但是普通字段是。 如果我对菜单发布进行注释(我放置了一个静态菜单),它就可以工作了,我可以看到内容页的翻译字段
激活菜单发布后,我可以只看到主页的翻译字段,因为此页面未在菜单中发布

我希望我的解释很清楚,但我不这么认为,所以我制作了一个git,用一个简单的项目来重现这个问题:

在页眉模板中,如果删除或注释发布区代码,您将看到当前页面的标题值,但如果激活,翻译将消失(除非翻译字段已在“发布”菜单中发布!)

所以我认为我的问题是由于字段选项,比如多个发布之间的翻译字段冲突?很奇怪

我损失了4天的时间,所以我希望有人能帮助我找到并解决问题

同时,我很想知道这种方法是如何实现的。 我对这个示例的结构和DBi18n包的理解是正确的,还是我在一个黑洞中

DBi18n包在这里:

多谢各位

编辑: 在Meteor中,是否可以只发布子对象文档的一部分,而在另一个发布中发布同一子对象的其他部分? Meteor将合并两个单独出版物的子对象字段? 如果不是,也许我的问题就在这里

第一个发布字段:{'foo.bar':1}

{
   foo : {
      bar : 'hey'
   }
}
第二个发布字段:{'foo.bip':1}

{
   foo : {
      bip : 'oh'
   }
}
在客户端上,find应该返回这个值,对吗

{
   foo: {
      bar: 'hey',
      bip: 'oh
   }
}

看一看。可能会把事情弄清楚一点。真的很有趣。所以我的问题可能就在这里。有没有办法解决我的问题?您可以将
i18n
子元素传递到顶层,只发布一个子字段,或者转换结果,将其作为顶层属性发送给客户端(通过观察光标)。为什么不使用tap-i18n-db?