簡體   English   中英

Django模板:在其中翻譯帶有HTML的文本塊的最佳實踐

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM