有没有人让Aurelia Validation使用i18n插件处理多语言错误消息?当我添加Aurelia文档http://aurelia.io/hub.html#/doc/article/aurelia/validation/latest/validation-basics/12中的代码时,我的应用程序甚至不会启动。
这是我的 main.js :
import environment from './environment';
import {I18N} from 'aurelia-i18n';
import XHR from 'i18next-xhr-backend';
import {ValidationMessageProvider} from 'aurelia-validation';
//Configure Bluebird Promises.
//Note: You may want to use environment-specific configuration.
Promise.config({
warnings: {
wForgottenReturn: false
}
});
export function configure(aurelia) {
aurelia.use
.standardConfiguration()
.feature('resources')
.plugin('aurelia-validation');
aurelia.use.plugin('aurelia-i18n', (instance) => {
// register backend plugin
instance.i18next.use(XHR);
// adapt options to your needs (see http://i18next.com/docs/options/)
instance.setup({
backend: {
loadPath: '/locales/{{lng}}/{{ns}}.json',
},
lng : 'en',
ns: ['translation'],
defaultNS: 'translation',
attributes : ['t','i18n'],
fallbackLng : 'en',
debug : false
});
});
// Straight from Aurelia Documentation
const i18n = aurelia.container.get(i18n);
ValidationMessageProvider.prototype.getMessage = function(key) {
const translation = i18n.tr(`errorMessages.${key}`);
return this.parser.parseMessage(translation);
};
// Straight from Aurelia Documentation
ValidationMessageProvider.prototype.getDisplayName = function(propertyName) {
return i18n.tr(propertyName);
};
if (environment.debug) {
aurelia.use.developmentLogging();
}
if (environment.testing) {
aurelia.use.plugin('aurelia-testing');
}
aurelia.start().then(() => aurelia.setRoot());
}
我得到的错误是vendor-bundle.js:3394 Error: key/value cannot be null or undefined. Are you trying to inject/register something that doesn't exist with DI?(…)
如果我删除标记为// Straight from Aurelia Documentation
的两个部分,它可以正常工作(但只能使用一种语言)。
如果您在我的代码中看到错误,请指出。或者,如果你有一个使用aurelia-validation和aurelia-i18n一起工作的工作示例,请传递一个链接。谢谢!
答案 0 :(得分:2)
也涉及这个问题。它似乎是行
// Straight from Aurelia Documentation
const i18n = aurelia.container.get(i18n);
正在(或更有可能创建){/ 1}}的不同实例而不是
i18n
我通过直接从aurelia.use.plugin('aurelia-i18n', (instance) =>
获取i18n
实例来解决这个问题,如下所示(这是打字稿,但同样的原则适用于纯js):
aurelia.use.plugin()
答案 1 :(得分:1)
使用导入的I18N代替:
const i18n = aurelia.container.get(I18N);
但事实上,i18n之后似乎停止了工作。我的解决方案是在第一次注入时更新第一页(app.js)中的i18n单例实例:
constructor(i18n) {
this.i18n = i18n;
this.initAureliaSingletons();
}
/**
* Some configurations breaks in 'main.js'
* singletons can be configure here
* @return {void}
*/
initAureliaSingletons() {
const i18n = this.i18n;
ValidationMessageProvider.prototype.getMessage = function(key) {
const translation = i18n.tr(`validation-${key}`);
return this.parser.parseMessage(translation);
};
}
答案 2 :(得分:0)
我把它放在我的主要上并且它有效。我认为诀窍是使用在插件初始化中初始化的变量:
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
(...)
android:theme="@style/AppTheme"