2016-03-04 66 views
1

我正在處理我的Aurelia組件的i18n。我想渲染翻譯服務器端,因爲我們的翻譯存儲在CMS中,並且可以在部署後進行更新。我已經成功地編寫了一個Java WebFilter,它可以攔截對Aurelia模板的請求並在返回模板之前轉換字符串。配置模板加載器以傳遞額外參數

所有這些都很有效,直到用戶切換語言。這是作爲整頁刷新實現的,首選語言存儲在服務器端會話中。所以模板解析器確實會選擇語言改變。問題在於Aurelia模板已經被緩存在客戶端,並且在其中有錯誤的翻譯。

現在我已經採取的一種解決方法是禁用模板的緩存。但理想情況下,我希望瀏覽器緩存模板,直到語言發生變化時再次請求模板。

一個簡單的解決方案是將語言添加到模板請求的URL。這樣一旦語言發生變化,緩存的模板就不會被使用。 (如果用戶決定改回語言,我們可以再次從緩存中加載它們!)

我試過實現這個,但是我在(默認)加載器上找不到任何文檔。我可以配置它將語言作爲參數添加到模板URL嗎?或者我可以創建一個自定義加載器來添加此行爲?

回答

2

嘗試添加以下內容到main.js猴修補模板加載器的語言查詢字符串邏輯:

import {TextTemplateLoader} from 'aurelia-loader-default'; 

// capture the standard logic in a new "standardLoadTemplate" method. 
TextTemplateLoader.prototype.standardLoadTemplate = TextTemplateLoader.prototype.loadTemplate; 
// intercept calls to "loadTemplate" and add the query string before calling the standard method. 
TextTemplateLoader.prototype.loadTemplate = function(loader, entry) { 
    entry.address += '?' + 'en-US'; // todo: set based on currently selected language 
    return this.standardLoadTemplate(loader, entry); 
}; 

export function configure(aurelia) { 
    ... 

下面是一個例子:https://gist.run/?id=de8ec2de79511bf9e873

+0

好極了!非常感謝你。 –

+0

未來人們發現這種情況的注意事項:對JS文件做相同的處理相對容易。只需爲SystemJS編寫一個插件,例如'exports.locate = function(load){return load.address +'?lang ='+ curLang; };'並將其註冊到你的config.js中:'meta:{「myapp/*」:{loader:「lang-loader」}} –