2013-01-17 157 views
3

如何處理翻譯中的HTML?我想用HTML翻譯句子。例如這樣的字符串([login]是鏈接):Django i18n翻譯html文本

Please [login] to view your profile. 

我不想打擾我翻譯翻譯與使用HTML文本交織在一起。另一方面,我不想打擾在我的視圖中創建所有鏈接,就像在this question中建議的那樣。因此,理想情況下,我希望僅有模板的解決方案具有製作HTML的靈活性,同時允許翻譯人員僅使用文本字符串。

例如,該僞代碼實現了這些要求:

{% render as login_html %} 
    <a href="{{ url 'login' }}?next={{ request.path|urlencode }}"> 
     {% trans "Login" %} 
    </a> 
{% endrender %} 

{% blocktrans with login=login_html %} 
    Please {{ login }} to view your profile. 
{% endblocktrans %} 

首先,將登錄HTML呈現並作爲login_url存儲。然後在我的blocktrans中,我可以簡單地使用{{ login }}給予呈現的登錄HTML。是否有解決這個問題的(類似的)解決方案,還是需要自定義模板標籤?

+0

您的解決方案翻譯兩次。 –

+0

這是爲什麼? '{{login}}'是一個變量,不會被翻譯(再次)。 – bouke

+0

除了這不是模板i18n的工作方式。 –

回答

1

我創建了一個通用的render標籤來做到這一點:

from classytags.arguments import Argument, Flag 
from classytags.core import Options 
from classytags.helpers import AsTag 
from django import template 
from django.utils.safestring import mark_safe 

register = template.Library() 


class Render(AsTag): 
    """ 
    Renders the block contents to be used elsewhere in the template. 

    Example usage: 

     {% render as login_url %} 
      <a href="{% url 'login' %}">{% trans "Login" %}</a> 
     {% endrender %} 

     {% blocktrans %} 
      Please {{ login_url }} for more information. 
     {% endblocktrans %} 

    It will automatically strip leading and trailing whitespace, use `nowrap` 
    to disable this behaviour: 

     {% render nostrip as varname %} . . . {% endrender %} 
    """ 
    options = Options(
     Flag('strip', default=True, false_values=['nostrip']), 
     'as', 
     Argument('varname', resolve=False, required=True), 
     blocks=[('endrender', 'nodelist')], 
    ) 

    def get_value(self, context, nodelist, strip, **kwargs): 
     value = nodelist.render(context) 
     if strip: 
      value = value.strip() 
     return mark_safe(value) 
register.tag(Render) 

當翻譯情況下使用(例如{% trans "Login" context "login_url" %}),譯者將擁有翻譯工作有極大的控制,同時還沒有與HTML困擾。

msgctxt "login_url" 
msgid "Login" 
msgstr "" 

#, python-format 
msgid "Please %(login_url)s for more information." 
msgstr ""