8

我有一个多语言网站,显示几个(十几个)内容页面,漂亮的网址如下:

example.com              <- home for default language (french)
example.com/biographie   <- page 1
example.com/en           <- home for english language
example.com/en/biography <- page 1 english translation

我想将页面合并在一起并提供完整的 ajax 导航,就像Pitchfork所做的那样。最重要的是保留非 JavaScript 客户端(SEO、社交网络和其他)的页面视图。

服务器提供完整的网页,然后在 Backbone 初始化时,它会预取其他页面并将其注入 DOM 以加快导航速度。当我导航到另一个页面时,我使用 Backbone 内置的 History API 在历史记录中记录新 URL,并更改视图以显示请求的页面。

var Navigator = Backbone.Router.extend({

  routes: {
    "*page":                "showPage",
  },

  showPage: function(page) {
    this.pages[page].show();
  }

}

我遇到的问题是管理 i18n(我的意思是翻译页面)。如何设置我的路由器来处理语言?我应该如何处理语言切换?

routes: {
  "*page":                "showPageFr",
  "en/*page":             "showPageEn",
},

showPageFr: function(page){
  showPage(page, 'fr');
},

showPageEn: function(page){
  showPage(page, 'en');
},

showPage: function(page, lang) {
  // How should I manage 'lang' parameter here ?
  this.pages[page].show();
}

我查看了 i18n JS 框架,但我认为我不需要它,因为我想翻译整个页面内容,而不是一些 UI 元素。所有翻译部分都在服务器端进行管理。

4

2 回答 2

5

感谢 DashK 把我带到了好路上。解决方案是在检测到英语时更改历史根。

var Router = Backbone.Router.extend({
    language: null,

    initialize: function(options){

        this.language = options.language;
        Backbone.history.start({pushState: true, root:'/'+ (this.language ? this.language : '')});
    },

    routes: {
        ":chapter(/*subpage)": "go",
        "" : "go" // match home route
    },

    go: function(chapter, subpage) {

    }
});

// wait for the document to be ready
$(function(){
    var lang;
    if($.url().segment(1) === 'en') { lang = 'en'; }

    new Router({language: lang});
});

router.navigate("some-chapter")然后,当我在代码中使用时,我不必关心语言。

于 2013-02-12T16:28:08.687 回答
3

首先,这是您可以设置路由器以使其保持清洁的方法,希望如此。

您已经BaseRouter可以为法语提取内容,如果您想添加其他语言,则必须BaseRouter使用不同的语言代码覆盖。(见EnglishRouter

// This is the base Router
var BaseRouter = Backbone.Router.extend({
    language: null,
    routes: {
        '*page': 'showPage'
    },

    _bindRoutes: function() {
        // this._bindRoutes() is called in Backbone.Router before
        // initialize(). Overriding native _bindRoutes method to
        // accomodate the custom logic in changing route.
        var me = this;

        if (this.language) {
            console.log('Updating routes for ' + this.language);

            _.each(_.keys(this.routes), function(key) {
                me.routes[me.language + '/' + key] = me.routes[key];
                delete me.routes[key];
            });
        }

        // Call native _bindRoutes method.
        Backbone.Router.prototype._bindRoutes.apply(this, arguments);
    },

    getLanguage: function() {
        return this.language || 'fr';
    },

    showPage: function(page) {
        console.log('Showing ' + page + ' in ' + this.getLanguage());
    }
});

var EnglishRouter = BaseRouter.extend({
    language: 'en'
});

这是与之配套的小提琴:http: //jsfiddle.net/dashk/yTS33/

在为不同页面制定内容策略方面 - 根据您所描述的内容(所有内容而不是正常的特定字符串),可以选择单个字典。(虽然我不认为它很优雅。)但是,当您向网站添加更多语言时,您可能需要考虑根据需要动态加载语言,而不是仅仅将所有语言放在一个文件中。

这是字典的示例:

var PageContent = {
    'fr': {
        'happyPage': 'Happy Page Content in French',
        'fridayPage': 'Friday page Content in French'
    },
    'en': {
        'happyPage': 'Happy Page Content in English',
        'fridayPage': 'Friday page Content in English'
    }
};
于 2013-02-08T22:40:31.847 回答