35

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 标签,但这看起来很脏。

4

9 回答 9

27

更新 2

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

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

由于维护了关注点分离,因此强烈推荐这种方式。


更新

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

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

尽管翻译和设计应该保持分离,但在某些情况下,您必须在翻译文件中使用 html 标签,这在 Facebook 和 Twitter 等大型项目中也可以看到。

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

<trans-unit id="1">
   <source>confirmed</source>
   <target>Congrats <![CDATA[<span class='bold'>%username%</span>]]> , your account is now activated.</target>
</trans-unit>
于 2013-02-15T10:02:27.283 回答
11

Twig 的原始过滤器

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

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

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

 {{ 'confirmed'|trans|raw }}

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

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

安全问题

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

关注点分离

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

于 2015-11-09T02:18:29.203 回答
6

我的方法虽然仍然丑陋,但至少尊重了关注点的分离。转义过滤器用于转义变量,使最终结果对 XSS 非常安全,因为所有其他来源都被认为是硬编码的。

  • 翻译.yml

    points: You have %num% points left.
    
  • 模板.html.twig

    {% set pointsFormatted = '<span class="points">' ~ num | escape ~ '</span>' %}
    {{ 'pages.score.points' | trans({'%num%' : pointsFormatted}) | raw }}
    
于 2016-04-04T09:25:13.660 回答
4

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

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

所以第一行中的这个“>”符号实现了它。我认为这将是首选方式,比在 TWIG 中处理转义等更好。

我现在查了一下,它实际上是一个 YAML 功能。 在这里检查:)

此外,还有一个类似主题的较早问题:如何让 YAML 忽略同一文件中的原始 HTML

于 2015-11-03T17:58:46.080 回答
1

一些yml:

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

+

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

这个| 原始部分对我有用

于 2017-04-22T18:47:22.367 回答
1

在我看来,这是今天最好的解决方案:

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

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

于 2019-11-29T16:00:21.097 回答
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

于 2016-08-24T08:27:55.793 回答
0

如果情况需要大量格式差异,我们可以为不同的语言使用单独的树枝片段。我为此写了一个小博客。

{# 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' %}
于 2018-08-17T23:33:06.427 回答
-1

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

于 2013-02-15T09:52:11.100 回答