Symfony2:翻译消息中的HTML

时间:2013-02-15 09:48:56

标签: symfony

messages.en.yml,我有

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

但我想以'加粗'用户名为例......我怎么能做到这一点?

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

当然我可以在这个例子中使用两个句子,如

first: Congrats
second: , your account ... 

和内部树枝使用html标签,但这看起来很脏。

9 个答案:

答案 0 :(得分:24)

更新2

在这种情况下,我开始像这样使用:

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

由于维持separation of concerns,强烈建议采用这种方式。


更新

在YAML中,我使用了这样的翻译没有任何问题:

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

尽管翻译和设计应该保持分离,但总有一些情况你必须在翻译文件中使用html标签,因为它也可以在Facebook和Twitter等大型项目中看到。

在这种情况下,您可以使用Symfony的recommended格式的XLIFF格式。内部翻译文件:

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

答案 1 :(得分:6)

Twig的Raw Filter

我不知道这是否是2013年的选项,但在使用翻译时,您可以应用具有此翻译字符串的原始树枝过滤器:

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

并在这样的树枝中使用它:

 {{ 'confirmed'|trans|raw }}

这不会转义字符串中的html,并将用户名显示为粗体。

更新:我没有第一次看到评论,但Rvanlaak首先提出了原始过滤解决方案。

安全问题

请注意,这些翻译字符串的内容不得由用户提供,因为它可能会将您的应用程序打开到XSS attacks。如果恶意用户能够将自定义数据输入到翻译字符串(例如,基于社区的翻译),则使用原始过滤器可以执行JavaScript

关注点分离

使用原始过滤器不符合关注点分离,因为内容和样式绑定在一起。正如Ferhad所说,使用他的方法,将保持关注点的分离。但在我的情况下,我更喜欢使用简单的原始过滤器。我觉得,就我的情况而言,Ferhad的方法对我来说有点矫枉过正,尽管会更推荐他的方式

答案 2 :(得分:5)

我的方法虽然仍然很难看,但至少尊重问题的分离。转义过滤器用于转义变量,使得最终结果在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 :(得分:4)

我刚发现了一些东西,你可以在你的YAML文件中使用它:

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

所以这个“&gt;”第一行中的标志实现了它。我认为这将是首选的方式,比处理TWIG中的转义等更好。

我现在查了一下它实际上是一个YAML功能。 Check here:)

此外,还有一个类似主题的早期问题:How can I get YAML to ignore raw HTML in same file

答案 4 :(得分:1)

一些yml:

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

+

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

这个 |原始部分为我工作

答案 5 :(得分:0)

在翻译中保留HTML内容是错误的,因为翻译人员通常会破坏它。但如果你真的需要它:

嫩枝:

{% trans %}confirmed{% endtrans %}

Yaml翻译文件:

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

讨论这个问题: https://github.com/symfony/symfony/issues/2713

答案 6 :(得分:0)

如果情况需要很大的格式差异,我们可以为不同的语言使用单独的树枝片段。 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' %}

答案 7 :(得分:0)

我认为,这是当今最好的解决方案:

'key'|trans({'%username%': '<strong>' ~ suspiciousVar|escape ~ '</strong>'})|raw

这里唯一的风险是XSS存储在翻译文件中。

答案 8 :(得分:-1)

翻译文件用于翻译,设计和布局是视图层的一部分(即:模板引擎(twig))。您可以将其拆分为两部分:congratsaccount.activated