Symfony2: HTML inside translation message

后端 未结 9 1757
醉话见心
醉话见心 2020-12-09 02:12

In messages.en.yml, I have

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

But I want to \'bold\' username to

相关标签:
9条回答
  • 2020-12-09 02:13

    Translation files are for translations, design and layout is part of the view layer (namely: template engine (twig)). You can split it into two pieces: congrats and account.activated.

    0 讨论(0)
  • 2020-12-09 02:16

    My approach is although still ugly, but at least respects the separation of concerns. Escape filter is used to escape a variable, making the final result is pretty safe from XSS, because all other sources considered to be hard-coded.

    • 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 }}
      
    0 讨论(0)
  • 2020-12-09 02:17

    Update 2

    In such cases, I started to use like this:

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

    Since separation of concerns is maintained, this way is strongly recommended.


    Update

    In YAML, I have used translations like this without any problem:

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

    Although translations and design should be kept separated there are always some situations that you must use html tags inside translation files as it is also seen in huge projects like Facebook and Twitter.

    In such situations, you can use XLIFF format which is being recommended by Symfony. Inside translation file:

    <trans-unit id="1">
       <source>confirmed</source>
       <target>Congrats <![CDATA[<span class='bold'>%username%</span>]]> , your account is now activated.</target>
    </trans-unit>
    
    0 讨论(0)
  • 2020-12-09 02:17

    some yml:

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

    +

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

    this | raw part worked for me

    0 讨论(0)
  • 2020-12-09 02:17

    We could use separate twig snippets for different languages if situation requires heavy formatting differences. I wrote a little blog on this.

    {# templates/translations/user_message.pl.html.twig #}
    {{ 'msg.my_favourite_language_is' }}<b>{{ 'langnames.elfic_language' | trans | lower }}</b>!
    
    {# templates/translations/user_message.en.html.twig #}
    {{ 'msg.my_favourite_language_is' }}<i>{{ 'langnames.elfic_language' | trans | ucfirst }}</i>!
    
    {# templates/pages/index.html.twig #}
    {% set locale=app.request.locale[:2] %}
    {% include 'translations/calculator_message.' ~ locale ~ '.html.twig' %}
    
    0 讨论(0)
  • 2020-12-09 02:21

    I've just found something out, you can use this in your YAML file:

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

    So this ">" sign in the first row achieves it. I think this would be the preferred way, better than handling the escapes etc in TWIG.

    I've looked it up now and it is actually a YAML feature. Check here :)

    Also, there's an earlier question with similar subject: How can I get YAML to ignore raw HTML in same file.

    0 讨论(0)
提交回复
热议问题