web-dev-qa-db-ja.com

Djangoテンプレート:HTMLを含むテキストブロックを翻訳するためのベストプラクティス

Djangoテンプレートで、HTMLを含むブロックをどのように翻訳しますか?例:

{% trans "Please" %}
    <a href="{% url login %}?next={{ currentUrlPath }}">
        {% trans "log in" %}
    </a>
{% trans "in order to use MyApplicationName." %}

翻訳された文字列を分割すると、いつでもテンプレートのHTMLを変更できますが、次のように1つの翻訳文字列に入れる方が理にかなっていると思います。

{% url login as loginUrl %}
{% blocktrans %}
    Please
    <a href="{{ loginUrl }}?next={{ currentUrlPath }}">
        log in
    </a>
    in order to use MyApplicationName.
{% endblocktrans %}

ただし、HTMLマークアップは翻訳文字列に含まれています。つまり、HTML(アンカーのCSSクラスなど)を変更する場合は、言語ごとに文字列を再翻訳する必要があります。

より良い選択肢はありますか?

32
AndiDog

から ドキュメント

{%trans%}内の文字列内にテンプレート変数を混在させることはできません。翻訳に変数(プレースホルダー)を含む文字列が必要な場合は、代わりに{%blocktrans%}を使用してください。

次に、blocktransの下:

テンプレート式を変換するには(たとえば、オブジェクト属性にアクセスしたり、テンプレートフィルターを使用したり)、変換ブロック内で使用するために式をローカル変数にバインドする必要があります。例:

{% blocktrans with article.price as amount %}
That will cost $ {{ amount }}.
{% endblocktrans %}

{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}

このようにして、翻訳された文字列にプレースホルダーがあります。あなたの場合:

{% blocktrans with login_object.anchor as anchor %}
    Please {{ anchor|safe }}log in</a> in order to use MyApplicationName.
{% endblocktrans %}

ビュー関数でanchorに入るテキストを生成する必要があります。これにより、翻訳された文字列から除外されます。

20
Mike DeSimone

文全体を1つの翻訳文字列に入れる方が理にかなっているだけでなく、翻訳者が文を細かく分割したときに正しい文を取得することが不可能な場合があります。文のさまざまな部分が、時制、ケース、性別など、互いに影響し合う可能性があることに注意してください。言うまでもなく、他の言語は英語とは異なる動作をします。たとえば、「お願いします」という言葉は、要求を行うときと要求を行うときでは異なる可能性があります。

翻訳者がターゲット言語で正しい文を作成できるように、翻訳文字列には常に完全な文を使用してください。

Mike DeSimoneが正しい推奨を行います、私はそれに1つだけ微調整します:

{% blocktrans with login_object.anchor_attr as anchor_attr %}
    Please <a {{ anchor_attr|safe }}>log in</a> in order to use MyApplicationName.
{% endblocktrans %}

これにより、翻訳文字列のHTMLのバランスが保たれます。文字列に開始タグがないと、文字列のエラーのように見えやすくなります。

11
Ned Batchelder

私は、あらゆる翻訳に対して一定である部分的なフラグメントのみに対して便利なソリューションを提供できます。

この場合、カスタムテンプレートタグを使用するときに.poファイル内でHTMLまたはCSSを使用しないようにすることができます次のような

@register.filter( name='safewrap' )
def safewrap( val, arg ):
    return val.format( arg )
safewrap.is_safe = True

...

{% blocktrans with sum2="<a href='mysite.com/offer'>{0}</a>"|safewrap:sum %}
    It costs {{sum2}} dollars.
{% endblocktrans %}

したがって、.poファイルには次のものがあります。

It costs %(sum2)s dollars.

しかし、それは難しい質問です-翻訳を必要とする部分的なフラグメントをどうするか(あなたの場合のように)。

8
sergzach