Во-первых, я очень доволен Ритмом! Отличная работа для чего-то бесплатного.
Недавно я начал интернационализировать свои шаблоны с помощью Rythm, и некоторые вещи кажутся более громоздкими, чем нужно. Мне интересно, есть ли лучший способ сделать то, что я пытаюсь сделать.
1. Цепочка тегов на @i18n()
Это не работает:
@i18n("about.text").nl2br()@i18n("about.text").mytransformer()
Обходной путь для этого:
@assign(newvar){@i18n("about.text")}
@newvar.nl2br()
Это работает, но некрасиво.
2. @i18n() экранирован в javascript
Если у меня есть раздел
<script>
var s = '@description';
</script>
тогда Rythm прекрасно избежит любых ' или " в этом описании. Однако, когда я использую:
<script>
var s = '@i18n("description")';
</script>
побег не делается. Я также пытался сделать:
var s = '@i18n("description").escape("js")';
а также
var s = '@escapeJS(){@i18n("description")}';
но оба не работают (см. выше). Что снова работает, так это использование
@assign(desc){@i18n("description")}
...
var s = '@desc';
3. Использование тега внутри @i18n() в качестве аргумента
Иногда мне нужна ссылка внутри переведенной строки, например:
about.text=See my profile here <a href="{0}">{1}</a>
Я хотел бы использовать это в шаблоне следующим образом:
@i18n("about.txt",@genlink("person",person.getId()),person)
Примечание. person здесь является аргументом шаблона типа Person. @genlink — это удобный шаблон (или тег) для создания ссылки с помощью поиска. В настоящее время я использую следующее решение:
@assign(lnk){<a href='@genlink("person",person.getId())'>@person</a>}
@i18n("about.txt",lnk)
Обратите внимание, что языковой ресурс изменился на: about.text=See my profile here {0} В любом случае это, вероятно, лучший способ написать строку ресурса, но было бы неплохо, если бы я мог каким-то образом избавиться от @assign() и написать это:
@i18n("about.text","<a href='@genlink("person",person.getId())'>@person</a>")
Изменить:
Я попробовал ваши предложения и был только частично успешным.
- Цепочка на
@i18n()
выполнение @("about.text".i18n()) работает, тогда как выполнение @("about.text".i18n().nl2br()) не работает и жалуется на отсутствующий параметр для @i18n(). Если я добавлю отсутствующий параметр так: @("about.txt".i18n("").nl2br()) он жалуется, что nl2br() не определен для String
Что мне помогло: @s().i18n("about.txt").nl2br()
Еще более странно, когда я запускаю вашу скрипку в Chrome, она работает отлично. Когда я запускаю его на Mac/Safari, я получаю ту же ошибку, которую я только что описал: см. снимок экрана: < img src="https://i.stack.imgur.com/tR1k9.png" alt="Скриншот Rythm Safari">
@i18n()экранировано в javascript
Работает, как вы объяснили!
- Использование тега внутри
@i18n()в качестве аргумента
понял. Текущее решение с @assign() подходит для одноразовых операций. Использование @def() является более подходящим общим решением.