设置 rootURL 导致页面刷新时出现 404 错误

setting rootURL causing 404 error on page refresh

如果我将语言设置为 rootURL 这有效我可以转到任何 route/subroute 并且当前语言将出现在 url 中,但是在页面刷新浏览器正在尝试从该语言获取应用程序文件夹有什么想法吗? :/ 我正在使用 Ember 1.11.

// 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: '/'
...

您不应将 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;

您可以使用 lang 路由的 afterModel 方法来确定所需的语言环境:

//../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 });
        }
    }
);

顺便说一句,您的 Ember 版本很旧。您可能希望将其升级到 1.13(1.13.x 不会破坏您的应用,2.x 可能)。