2

我的第一個問題 - 請放輕鬆。我正在使用express,express3-handlebars和i18next-node with node.jsexpress3-handlebars和18next-node - 基於頁面的國際化?

該計劃將使用不同的翻譯命名空間,具體取決於當前正在處理哪個視圖(即哪個句柄文件)。因此,如果我們查看名爲ie(.hbs)的頁面,則i18next將在名爲ie(.json)的相關語言中查找。這使翻譯的組織和協調更容易。

這是我當前如何做它:(?即使這似乎是不必要的 - 把手不會自動暴露哪個文件它的渲染)首先我發送當前頁到車把模板渲染:

res.render(url_base_path, { layout: ("sub"), title: title, currentpage: url_base_path });

然後我訪問要在當前頁面的命名空間中翻譯的變量「greeting」,就像這樣{{t "greeting" page=currentpage }} - 惱人的是,每個頁面上都有10個這樣的變量。不要重複自己,有人嗎?

「T」在express3車把被定義創建()函數,像這樣,helpers: { t: t }

和翻譯功能看起來像這樣

var t = function (i18next_key, options) { 
    var page, result; 
    page = options.hash.page; 
    result = i18next.t(page + ":" + i18next_key); 
    return new hbs.handlebars.SafeString(result); 
}; 

充分披露的緣故,這是什麼當前頁面我的(英語)空間文件看起來像

{ 
    "greeting": "Hello, it appears you're using Internet Explorer, an outdated web browser." 
} 

這個作品,但似乎應該有一個更簡單的解決方案。

我真正想要的只是能夠在車把模板中輸入{{t "greeting"}}來達到相同的效果。這可能沒有重寫核心車把功能?

這裏是i18next文檔頁面 http://i18next.com/pages/doc_features.html

回答

0

我已經回答了我的問題 - 它竟然比我想象得容易。

您可以在我的Handlebars translate helper(duh?)中訪問handlebars實例,因此在助手:renderer = this(爲了清楚起見),然後您可以訪問renderer.currentpage以獲取所需的名稱空間的名稱。請注意,您仍然需要在渲染功能中發送當前頁面(在res.render()上),但是我對它的那一面還可以。

我已經做了這樣的(它可能是在目前這樣的很慢,但它的工作原理正是我想要它):

// Set namespace for translation 
    options.ns = options.ns || bestNamespaceFor(i18n_key); 

    result = i18n.t(i18n_key, options); 
    return new hbs.handlebars.SafeString(result); 

    function bestNamespaceFor(i18n_key){ 
    if (i18n.exists(i18n_key, { ns: renderer.currentpage })) return renderer.currentpage; 
    if (i18n.exists(i18n_key, { ns: renderer.layout })) return renderer.layout; 
    if (i18n.exists(i18n_key, { ns: "common" })) return "common"; 

{{t "my translation key" }}完美的作品,並沒有得到正確的命名空間我在哪裏使用它。