[英]Django templates: Best practice for translating text block with HTML in it
在Django模板中,我如何翻譯包含HTML的塊? 例如:
{% trans "Please" %}
<a href="{% url login %}?next={{ currentUrlPath }}">
{% trans "log in" %}
</a>
{% trans "in order to use MyApplicationName." %}
拆分翻譯的字符串允許我隨時更改模板中的HTML,但我想將它放入單個翻譯字符串會更有意義,如下所示:
{% url login as loginUrl %}
{% blocktrans %}
Please
<a href="{{ loginUrl }}?next={{ currentUrlPath }}">
log in
</a>
in order to use MyApplicationName.
{% endblocktrans %}
但是HTML標記在翻譯字符串中,即如果我想更改HTML(例如錨的CSS類),我必須重新翻譯每種語言的字符串。
還有更好的選擇嗎?
來自文檔 :
在{%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
中的文本。 這使它遠離你翻譯的字符串。
將整個句子放在一個翻譯字符串中不僅更有意義,翻譯者在分割成片段時也不可能得到正確的句子。 請記住,句子的不同部分可以相互影響,包括時態,案例,性別等。 更不用說其他語言的行為與英語不同。 例如,“請”這個詞在提出請求和提出要求時可能會有所不同。
始終在翻譯字符串中使用完整的句子,以便翻譯人員可以使用目標語言制作正確的句子。
Mike DeSimone提出了正確的建議,我只想做一個調整:
{% blocktrans with login_object.anchor_attr as anchor_attr %}
Please <a {{ anchor_attr|safe }}>log in</a> in order to use MyApplicationName.
{% endblocktrans %}
這使得翻譯字符串中的HTML保持平衡。 如果沒有字符串中的開始標記,它很容易看起來像字符串中的錯誤。
我可以為只有部分片段提供方便的解決方案,這些片段對於任何翻譯都是常量
在這種情況下,您可以避免在使用自定義模板標記時使用.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.
但這是一個棘手的問題 - 如何處理需要翻譯的部分片段(如你的情況)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.