Подтвердить что ты не робот

Symfony2: сообщение HTML внутри перевода

В messages.en.yml у меня есть

confirmed: Congrats %username%, your account is now activated.

Но я хочу добавить "bold" к примеру... как я могу это сделать?

confirmed: Congrats <span class='bold'>%username%</span>, your account is now activated.   

Конечно, я мог бы использовать два предложения в этом примере, например

first: Congrats
second: , your account ... 

и внутри twig используют тег html, но это кажется очень грязным.

4b9b3361

Ответ 1

Обновление 2

В таких случаях я начал использовать вот так:

confirmed: Congrats %start_link%%username%%end_link%, your account is now activated

Так как разделение проблем поддерживается, этот способ настоятельно рекомендуется.


Update

В YAML я использовал такие переводы без проблем:

trans.key: click <a href="%url%">here</a> to continue

Несмотря на то, что переводы и дизайн должны быть разделены, всегда есть ситуации, в которых вы должны использовать html-теги внутри файлов перевода, так как это также видно в таких огромных проектах, как Facebook и Twitter.

В таких ситуациях вы можете использовать формат XLIFF, который рекомендуется по Symfony. Внутри файла перевода:

<trans-unit id="1">
   <source>confirmed</source>
   <target>Congrats <![CDATA[<span class='bold'>%username%</span>]]> , your account is now activated.</target>
</trans-unit>

Ответ 2

Мой подход, хотя и уродлив, но по крайней мере уважает разделение проблем. Фильтр Escape используется для выхода из переменной, что делает конечный результат довольно безопасным для XSS, поскольку все остальные источники считаются жестко закодированными.

  • translations.yml

    points: You have %num% points left.
    
  • template.html.twig

    {% set pointsFormatted = '<span class="points">' ~ num | escape ~ '</span>' %}
    {{ 'pages.score.points' | trans({'%num%' : pointsFormatted}) | raw }}
    

Ответ 3

Я только что нашел что-то, вы можете использовать это в своем файле YAML:

    mind: >
        <i>Mind is a nice thing to have</i>

Значит, этот знак " > " в ​​первой строке достигает этого. Я думаю, что это было бы предпочтительным способом, лучше, чем обработка эскапапов и т.д. В TWIG.

Я посмотрел его сейчас, и это на самом деле функция YAML. Проверить здесь:)

Кроме того, есть более ранний вопрос со схожим вопросом: Как я могу заставить YAML игнорировать необработанный HTML в том же файле.

Ответ 4

Twig Raw Filter

Я не знаю, был ли это вариант еще в 2013 году, но при использовании перевода вы можете применить фильтр raw, имеющий эту строку перевода:

confirmed: Congrats <span class='bold'>%username%</span>, 
           your account is now activated.

И используйте его в twig следующим образом:

 {{ 'confirmed'|trans|raw }}

Это не приведет к вызову html внутри строки и отобразит имя пользователя как полужирное.

Обновление. Я не видел комментариев в первый раз, но Рванлаак предложил исходное решение фильтра.

Проблемы безопасности

Обратите внимание, что содержимое этих строк перевода не должно предоставляться пользователям, поскольку оно может открыть ваше приложение для атак XSS. Использование необработанного фильтра позволяет выполнять JavaScript, если злоумышленник может вводить пользовательские данные в строки перевода (например, переводы на основе сообщества)

Разделение проблем

Использование исходного фильтра не соответствует разделению проблем, поскольку содержимое и стиль связаны друг с другом. Как отметил Ферхад, используя свой метод, разделение беспокойства будет сохранено. Но в моем случае я предпочел использовать простой сырой фильтр. Я чувствовал, что для моего случая, метод Ферхада был немного переборщим для меня, хотя было бы более рекомендуемым его способом.

Ответ 5

некоторый yml:

dashboard:
    hello: Hello <b>%username%</b>

+

{{ 'dashboard.hello'|trans({'%username%': app.user.username}, 'General') | raw }}

this | сырая часть работала для меня

Ответ 6

Файлы переводов предназначены для переводов, дизайн и макет являются частью слоя вида (а именно: движок шаблона (ветка)). Вы можете разбить его на две части: congrats и account.activated.

Ответ 7

Удержание HTML-материала в переводах неверно, потому что переводчики обычно нарушают его. Но если вам это действительно нужно:

Twig:

{% trans %}confirmed{% endtrans %}

Файл перевода Ямл:

confirmed: 'Congrats <span class="bold">%username%</span>, your account is now activated.'

Обсуждение этого: https://github.com/symfony/symfony/issues/2713