我正在编写一个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包的正确方法,或者我在一个黑洞中?
非常感谢
编辑: 在Meteor中,是否可以只发布子对象文档的一部分,并在另一个出版物中发布同一子对象的其他部分? Meteor将合并两个独立出版物的子对象字段? 如果没有,也许我的问题就在这里?
首次发布字段:{'foo.bar':1}
{
foo : {
bar : 'hey'
}
}
第二个出版物字段:{'foo.bip':1}
{
foo : {
bip : 'oh'
}
}
在客户端上,查找应该返回此权限吗?
{
foo: {
bar: 'hey',
bip: 'oh
}
}