2012-04-04 1 views
1

Нашел пару вопросов (и ответов) на этом: How is internationalization configured for Hogan.js? и т. Д.усы/hogan i18n и принимая во внимание порядок слов

, но не в частности, что учитывает порядок слов. Мне нужна возможность:

  • этап 1. задан ключ -> найти предложение на определенном языке.

  • этап 2. это предложение может содержать {{var}}, которое должно быть
    заменено json-значениями.

этап 2. только общий усы-шаблоны.

Шаг 1 может быть выполнен только с помощью нескольких методов, но я предпочитаю методы, которые не связаны с каким-либо специализированным кодом вне движка Mustache/Hogan (в сочетании с комплектом i18n-ресурсов, конечно). Хоган, кажется, поддерживает это что-то вроде: (из URL выше)

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

Однако совместить 1. и 2. В этом примере я хотел бы translatedStrings[i18nKey] вернуть строку, которая потенциально содержит {{<some expansion>}}, а также.

Кто-то знает об элегантном способе сделать это?

Обоснование: Часто языки отличаются друг от друга в порядке слов и т. Д., Что делает сложные шаблоны без этой способности.

ответ

4

Последняя версия Hogan.js будет обрабатывать теги Mustache внутри результата, полученного от лямбда. Одно небольшое изменение кода в вашем вопросе, однако, является то, что результат должен быть лямбда функции, чтобы изменить строку:

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, который демонстрирует это с последней версией.