小胡子/ hogan i18n并考虑词序

时间:2012-04-04 19:50:43

标签: internationalization mustache templating hogan.js

发现了几个问题(和答案):How is internationalization configured for Hogan.js? ,等等。

但非特别考虑到词序。我需要能力:

  • 步骤1.给出一个键 - >用特定语言查找句子。

  • 第2步。这句话可能包含{{var}},需要为 用json-values代替。

步骤2.单独是一般的胡子模板。

步骤1.可以使用多种技术单独完成,但我更喜欢不涉及Mustache / Hogan引擎之外的任何专用代码的技术(当然,结合i18n资源包)。 Hogan似乎支持这一点,例如:(来自上面的url)

var template = "{{#i18n}}Name{{/i18n}}: {{username}}",
    context = {
       username: "Jean Luc",
       i18n: function (i18nKey) {return translatedStrings[i18nKey];}
    };

但是,要结合1.和2.在此示例中,我希望translatedStrings[i18nKey]返回一个可能包含{{<some expansion>}}的字符串。

有人知道这样做的优雅方式吗?

理由: 通常,语言在单词顺序等方面存在很大差异,这使得复杂的模板没有这种能力。

1 个答案:

答案 0 :(得分:4)

最新版本的Hogan.js将处理从lambda返回的结果中的Mustache标记。然而,对你问题中代码的一个小改动是,lambda的结果应该是一个函数,以便修改字符串:

var translatedStrings = { name: "Nom {{rank}}" };

var template = "{{#i18n}}name{{/i18n}}: {{username}}",
    context = {
        username: "Jean Luc",
        rank: 'Captain',
        i18n: function() {
            return function (i18nKey) {return translatedStrings[i18nKey];};
        }
    };

document.write(Hogan.compile(template).render(context));​ // Nom Captain: Jean Luc

我创建了一个jsfiddle,用最新版本演示了这一点。