Как справиться с плюрализмом в Хогане

Я использую Hogan.js, который совместим со спецификацией усов. И у меня возникли проблемы с реализацией надежного способа плюрализации. Я хотел бы продолжать использовать Hogan и использовать http://i18next.com/ для обработки i18n

делать что-то подобное работает для простых случаев

TPL:

{{#plural(count)}}
  I have {{count}} apples!
{{/plural(count)}}

данные:

{
  count: 2,
  'plural(count)': function () {
    return function () {
      return _t[arguments[0].trim()][this['count']]
    }
  }
}

это требует анализа / сканирования / рендеринга отдельными шагами, чтобы иметь возможность генерировать все требуемые множественные методы (множественное число (key.val) и т. д.), но это нормально, это нужно сделать только один раз при загрузке сервера.

это нарушает такие вещи, как

{{#Plural(key.nested)}}

это будет соответствовать, если данные выглядят как

{
  'plural(key': {
    'val)': ...
  }
}

это также требует от меня ручного поиска значений из контекста, что не является серьезной проблемой, но есть некоторые случаи с лямбда / частями, которые невозможно решить

для отображений перевода по умолчанию все гораздо менее сложно, и с этим легко справиться

1 ответ

Решение

Хорошо, я нашел способ решить эту проблему:

var tpl_data = fs.readFileSync('./tpl/test.hjs', 'utf8');
var scan = Hogan.scan(tpl_data);
var tree = Hogan.parse(scan);
var gen = Hogan.generate(tree, tpl_data, {asString:false});
var out = gen.render(data);

переделывать дерево, заменяя все tag ключи к i18nгде n соответствует вашему образцу /i18n .+/

я использую {{#i18n {count: count, text: 'I have <%count%> apples!'} }} и тому подобное, чтобы добавить параметры для i18next, чтобы я соответствовал всем nначинается с i18n

добавить i18n в Hogan.codegen

Hogan.codegen.i18n = function (node, context) {
  context.code += 't.b(t.v(t.i18n("' + esc(node.n) + '",c,p,0)));';
}

добавить i18n метод к прототипу Hogan.Template

Hogan.Template.prototype.i18n = function (key, ctx, partials, returnFound) {
  //here the ctx is an array with from right to left the render scopes
  // most right is the most inner scope, most left is the full render data
  //1. get the config from the key, 
  //2. get the values out of the scope
  //3. get the values for the translation
  //4. lookup the translation, and repleace the values in the translation
  //5. return the translated string
};

обратите внимание, что внутри Hogan.Template.prototype.i18n вы можете получить доступ ко всем методам шаблона

Другие вопросы по тегам