Ритм использует преобразователи и вложенные теги с тегом @i18n.

Во-первых, я очень доволен Ритмом! Отличная работа для чего-то бесплатного.

Недавно я начал интернационализировать свои шаблоны с помощью Rythm, и некоторые вещи кажутся более громоздкими, чем нужно. Мне интересно, есть ли лучший способ сделать то, что я пытаюсь сделать.

1. Цепочка тегов на @i18n()

Это не работает:

  1. @i18n("about.text").nl2br()
  2. @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>")

Изменить:

Я попробовал ваши предложения и был только частично успешным.

  1. Цепочка на @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">

  1. @i18n() экранировано в javascript

Работает, как вы объяснили!

  1. Использование тега внутри @i18n() в качестве аргумента

понял. Текущее решение с @assign() подходит для одноразовых операций. Использование @def() является более подходящим общим решением.


person Jaap Geurts    schedule 04.06.2016    source источник
comment
Сафари вещи интересные. В данный момент у меня не будет времени на это. Просто придерживайтесь своей работы на данный момент   -  person Gelin Luo    schedule 06.06.2016


Ответы (1)


  1. Цепочка на @i18n()

Попробуйте использовать преобразователь .i18n() вместо тега @i18n().

Произнесите изменение @i18n("about.text").nl2br() на @("about.text".i18n().nl2br())

Обратите внимание, что вам нужна пара (), чтобы заключить все выражение, если вы вводите строковый литерал, такой как "about.text", однако, если вы делаете то же самое для переменной, то () можно исключить, например @foo.i18n().nl2br()

  1. @i18n() экранировано в javascript

Опять же, используйте трансформатор .i18n()

  1. Использование тега внутри @i18n() в качестве аргумента

Обработку тегов очень сложно поместить в другой тег или преобразователь. В вашем случае я рекомендую вам использовать встроенный тег

Демонстрацию всех вышеперечисленных пунктов можно найти по адресу http://fiddle.rythmengine.org/#/editor/0c426d5332334db3870b6bd8c0806e66

person Gelin Luo    schedule 05.06.2016