Aurelia验证与i18n?

时间:2016-10-19 00:27:01

标签: aurelia aurelia-validation aurelia-i18n

有没有人让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一起工作的工作示例,请传递一个链接。谢谢!

3 个答案:

答案 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"