2017-07-03 63 views
0

我正在使用骨幹來管理我的路由。我需要實現我的網站上多語言如下:主幹,多語言和根

    在法國
  • :www.example.com
  • 英語:www.example.com/en

而且我有一個額外的根我的網址在生產,所以它給www.example.com/dev或www.example.com/dev/en

根通過我的網絡服務器(節點)提供。它通過以下示例中的<% - 前綴%>變量檢索。

它在localhost上運行良好,但只要我在服務器上傳遞帶有額外根目錄的URL,就無法找到頁面。我正在尋找一種通用的解決方案來管理這兩種情況(使用或不使用root)。

<!DOCTYPE html> 
<html> 
<head> 
... 
</head> 
<body> 

<script type="text/javascript"> 

window.onload = function() 
{  
    let prefix = '<%- prefix %>'.substr(1); 

    var BaseRouter = Backbone.Router.extend({  
     routes: { 

      [prefix + 'imgfocus/:imgid'] : 'imgfocus', 
      [prefix + 'skymap/:obsids'] : 'skymap', 
      // ... 
      }, 

     imgfocus : function(imgid) 
     { 
      navservice.loadScreen({page : 'imgfocus', imgid : imgid}); 
     }, 
     skymap : function(obsids, stateid, tourid) 
     { 
      navservice.loadScreen({page : 'skymap', obsids : parseInt(obsids) === 0 ? undefined : obsids, stateid : stateid, tourid : tourid}); 
     }, 
     /// ... 
    }); 


    let br = new BaseRouter(); 

    for (let i = 0; i < navservice.languages.length; i++) 
     { 
      if (navservice.languages[i] !== '') 
      { 
       for (let key in br.routes) 
       { 
        br.routes[navservice.formatUrl(key, navservice.languages[i]).substr(1)] = br.routes[key]; 
       } 
      } 
     } 
     // language retrieval 
     var language = navservice.getUserLanguage(); 

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

    $(document).on("click", "a:not([data-bypass])", function (evt) { 
     var href = { prop: $(this).prop("href"), attr: $(this).attr("href") }; 
     var root = location.protocol + "//" + location.host + Backbone.history.options.root; 
     if (href.prop && href.prop.slice(0, root.length) === root) { 
      evt.preventDefault(); 
      var route = href.attr; 

      // language retrieval 
      var lang = navservice.getUserLanguage(route); 

      if(lang && route.slice(0,lang.length+1) === "/" + lang) { 
       route = route.slice(lang.length+1); 
      } 

      Backbone.history.navigate(route, {trigger : true}); 
     } 
    }); 
} 

</script> 

回答

0

其實我設法通過在backbone.js中添加日誌並檢查發生了什麼來解決它。

真正的問題是在路由定義中使用'prefix'變量。我刪除它,大部分修復都已完成。

+0

你知道它爲什麼會導致問題嗎? – vassiliskrikonis

+0

其實我並沒有真正理解「root」變量是如何工作的。這是問題。據我瞭解,網址管理如下:[域名] + [根] + [路由]。所以我只是從我的代碼中刪除了「前綴」並將其放入根目錄中。這就是它! – MrFlo

0

創建型動物的模板,然後使用history root選項:

Backbone.history.start({pushState: true, root: "/en/"}) 

更多信息backbone history start