ember 应用程序的国际化

Internationalization of ember application

我正在使用 ember-i18n 库进行国际化,并希望将当前语言环境保存在如下路径中:

domain.com - 默认为空 en

doman.com/es, doman.com/de- 另一个

为此我尝试使用 rootURL

Router.reopen({
  rootURL: '/' ('es' or 'de')
});

问题:当rootURL不为空时,应用程序无法重定向并失败并出现错误:ember.debug.js:4903 Uncaught Error: Assertion Failed: Path / does not start with the provided rootURL /es/

问题: 重定向的最佳解决方案是什么,所有逻辑都将保留在 emebr 中,因此我无法将此逻辑移至 nginx 等中

另一种选择是创建包装器路由,如下所示:

this.route(
    'lang', { path: '/:lang' }, function (){..}
);

这个解决方案看起来不太好:

  1. link-to 助手将需要 lang 参数
  2. lang 不能为空(默认语言)

更新:我知道如何动态更改 rootURL,但不能自动重定向。

找到解决方案,在实例初始化器中描述这个逻辑

    export function initialize(app) {
  var router = app.lookup('router:main');
  var i18n = app.lookup('service:i18n');

  var path = window.location.pathname;
  var currentLang = ENV.i18n.defaultLocale;
  var newPath = '';

  var LangFromPath = path.match('^/([a-z]{2})(?:/|$)');
  if (LangFromPath && LangFromPath[1]){
    currentLang = (ENV.i18n.allowedLocales.indexOf(LangFromPath[1]) > -1) ? LangFromPath[1] : currentLang;
  }

  if (currentLang != ENV.i18n.defaultLocale) {
    var newPath = '/' + currentLang + '/';
  }

  router.rootURL = newPath;
  i18n.set('locale', currentLang);

  if (newPath && path.indexOf(newPath) === -1) {
      window.location.pathname = newPath;
  }

}