2017-07-04 103 views
0

如果我设置语言,将把rootURL这个作品我能够去任何路由/ subroute和当前的语言将出现在URL,但页面刷新浏览器是从语言试图获取应用夹什么想法? :/我使用Ember 1.11。设置,将把rootURL导致404错误页面刷新

// router.coffee 

`import Ember from 'ember';` 
`import config from './config/environment';` 

Router = Ember.Router.extend 
    location: config.locationType 
    rootURL: '/' + localStorage.getItem('locale') + '/' 

// config/environment.js 

module.exports = function(environment) { 
    var ENV = { 
    locationType: 'history', 
    baseURL: '/' 
... 

enter image description here

回答

1

为此,你不应该使用rootURL。相反,创建将成为家长给所有其他路由的路由:

//../app/router.js 

import Ember from 'ember'; 
import config from './config/environment'; 
var Router = Ember.Router.extend(
    { 
     location: config.locationType 
    } 
); 
Router.map(
    function() 
    { 
     this.route(
      'lang', { path: '/:lang' }, function() 
      { 
       this.route('index', { path: '/' }); 
       this.route('404', { path: '/*wildcard' }); 
       this.route('your-route-name'); 
      } 
     ); 
    } 
); 
export default Router; 

比你可以使用方法途径langafterModel来确定所需的语言:

//../app/routes/lang.js 
import config from '../config/environment'; 
export default Ember.Route.extend(
    { 
     afterModel: function (params) 
     { 
      var allowedLocales = config.i18n.allowedLocales; 
      var defaultLocale = config.i18n.defaultLocale; 
      this.set(
       'i18n.locale', 
       params && params.lang && allowedLocales.indexOf(params.lang) > -1 ? params.lang : defaultLocale 
      ); 
     } 
    } 
); 

而且在index路线,你需要从浏览器设置或使用默认的检测用户的语言环境:

//../app/routes/index.js 
import config from '../config/environment'; 
export default Ember.Route.extend(
    { 
     beforeModel: function() 
     { 
      var allowedLanguages = config.i18n.allowedLocales; 
      var language = config.i18n.defaultLocale; 
      if (navigator.languages) { 
       for (let lang of navigator.languages) { 
        if (allowedLanguages.indexOf(lang) > -1) { 
         language = lang; 
         break; 
        } 
       } 
      } else { 
       if (navigator.language) { 
        language = navigator.language; 
       } else { 
        if (navigator.userLanguage) { 
         language = navigator.userLanguage; 
        } 
       } 
      } 
      this.transitionTo('lang.index', { lang: language }); 
     } 
    } 
); 

顺便说一句,你的灰烬版本是很老。你可能想升级到1.13(1.13.x不应该打破你的应用程序,2.x可以)。

+0

THX我做这样的事情了,但需要很大的变化,我需要改变所有链接到助手,然后'transitionTo','transitionToRoute','modelFor'了,毕竟,我需要确保url正确更新的每一条路由,因为如果我从'your-route-name'的页面将语言更改为俄语(这将刷新页面),例如,我将在URL中具有'en.your-route-name'刷新:/ – varto

+0

'this.transitionTo(“lang.index”,{郎咸平:语言});'你能请解释为什么这条线不能只是字符串这样,我有无限循环只能如果我这样做'this.transitionTo ('lang.index',language);' – varto

+1

@varto我从我的博客文章中复制了我在2015-07-19发布的代码。当时它工作。很遗憾,现在无法检查。可能api被改变了。根据最近的胡言乱语,“this.transitionTo('lang.index',language);'是正确的。 –