Meteor - 与自定义i18n集合中的字段冲突,仅与多个出版物

时间:2016-06-03 05:43:28

标签: meteor internationalization

我正在编写一个i18n集合,但我对发布中已翻译字段的字段选项有疑问。

我正在使用TAPi18n,但不使用TAPi18n-db。 我的DBi18n集合包的工作方式如下:

首先,数据库中的结构就像这样:

{
   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属性。

  • 找到返回正常光标(我们不处理结果)

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

  • 获取返回已处理的文档,如下所示:[{key:'about',slug:'about',title:'About'},...]

它运作良好!!

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

这是我的问题:翻译的字段未发布,但正常的字段是。 如果我评论菜单出版物(我放一个静态菜单),它正在工作,我可以看到内容页面的翻译字段!
激活菜单发布后,我可以看到主页的翻译字段,因为该页面未在菜单中发布。

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

https://bitbucket.org/Molosc/meteor-dbi18n-example

在标题模板中,如果删除或评论发布块代码,您将看到当前页面的标题值,但如果它被激活,则翻译将消失(除非翻译后的字段已在菜单中发布)出版!)

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

我失去了4天,所以我希望有人能帮我找到并解决问题。

与此同时,我很有兴趣知道这种做法的方法。 我正在使用这个例子的结构和DBi18n包的正确方法,或者我在一个黑洞中?

DBi18n包在这里:https://bitbucket.org/Molosc/meteor-dbi18n-example/src/2946093f5e7f794322124678c81976d56622995a/packages/dbi18n/?at=master

非常感谢

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

首次发布字段:{'foo.bar':1}

{
   foo : {
      bar : 'hey'
   }
}

第二个出版物字段:{'foo.bip':1}

{
   foo : {
      bip : 'oh'
   }
}

在客户端上,查找应该返回此权限吗?

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

0 个答案:

没有答案