在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标签,但这看起来很脏。
答案 0 :(得分:24)
在这种情况下,我开始像这样使用:
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)
我不知道这是否是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.'
答案 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))。您可以将其拆分为两部分:congrats
和account.activated
。