35

messages.en.yml、私は持っています

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

しかし、例としてユーザー名を「太字」にしたい...どうすればこれを作成できますか?

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

もちろん、この例では次のように 2 つの文を使用できます。

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

翻訳とデザインは分けておく必要がありますが、Facebook や Twitter などの大規模なプロジェクトでも見られるように、翻訳ファイル内で html タグを使用しなければならない場合が常にあります。

そのような場合、 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

小枝の生フィルター

これが 2013 年にオプションだったかどうかはわかりませんが、翻訳を使用する場合、この翻訳文字列を持つraw twig フィルターを適用できます。

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

そして、次のように小枝で使用します:

 {{ 'confirmed'|trans|raw }}

これにより、文字列内の html がエスケープされず、ユーザー名が太字で表示されます。

更新: コメントを初めて見たわけではありませんが、Rvanlaak は最初に raw フィルター ソリューションを提案していました。

セキュリティ上の問題

アプリケーションをXSS 攻撃にさらす可能性があるため、これらの翻訳文字列のコンテンツはユーザーが提供してはならないことに注意してください。raw フィルターを使用すると、悪意のあるユーザーがカスタム データを翻訳文字列に入力できる場合 (コミュニティ ベースの翻訳など)、JavaScript を実行できます。

関心事の分離

raw フィルターを使用すると、コンテンツとスタイルが結合されているため、関心の分離に準拠しません。Ferhad が述べたように、彼の方法を使用すると、関心の分離が維持されます。しかし、私の場合は、単純な raw フィルターを使用することを好みました。私の場合、Ferhad の方法は少しやり過ぎだと感じましたが、彼の方法の方がより推奨されます。

于 2015-11-09T02:18:29.203 に答える
6

私のアプローチはまだ醜いですが、少なくとも関心の分離を尊重しています。エスケープ フィルターは、変数をエスケープするために使用されます。他のすべてのソースはハードコードされていると見なされるため、最終結果は XSS からかなり安全になります。

  • 翻訳.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 }}
    
于 2016-04-04T09:25:13.660 に答える
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

状況によって書式設定の大幅な違いが必要な場合は、言語ごとに個別の twig スニペットを使用できます。これについて少しブログを書きました。

{# 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

翻訳ファイルは翻訳用で、デザインとレイアウトはビュー レイヤーの一部です (つまり、テンプレート エンジン (小枝))。congratsとの 2 つに分割できますaccount.activated

于 2013-02-15T09:52:11.100 に答える