【问题标题】:Django: How to force translation into a given language inside a template?Django:如何强制翻译成模板内的给定语言?
【发布时间】:2011-03-11 17:04:54
【问题描述】:

在 Django 模板中,我需要将一些字符串翻译成特定语言(不同于当前语言)。

我需要这样的东西:

{% tans_to "de" "my string to translate" %}
or
{% blocktrans_to "de" %}my bloc to translate {% endblocktrans_to %}

强制翻译成德语。

我知道我可以在视图中调用以下代码:

gettext.translation('django', 'locale', ['de'], fallback=True).ugettext("my string to translate")

我需要创建一个特定的模板标签吗?还是在 Django 中已经存在一个专门的标签?

【问题讨论】:

    标签: django django-templates internationalization gettext


    【解决方案1】:

    您可以在模板中使用trans 模板标签将字符串翻译成所需的语言:

    {% load i18n %}
    {% trans "Hello" %}
    

    您必须在settings.py 文件中将USE_I18N 设置为True

    然后您定义LANGUAGE_CODE 来控制整个站点的默认语言,并将LocaleMiddleware 类添加到您的MIDDLEWARE_CLASSES。查看文档中的 How Django Discovers Language Preference 部分。

    【讨论】:

    • the_void,我知道“trans”标签。我需要的是一种更改特定字符串翻译的当前语言的方法。
    【解决方案2】:

    模板标签/trans_to.py:

    from django.utils import translation
    from django.utils.translation import ugettext
    from django.template import Library, Node,  Variable, TemplateSyntaxError
    register = Library()
    
    class TransNode(Node):
        def __init__(self, value, lc):
            self.value = Variable(value)
            self.lc = lc
    
        def render(self, context):        
            translation.activate(self.lc)
            val = ugettext(self.value.resolve(context))        
            translation.deactivate()        
            return val
    
    def trans_to(parser, token):
        try:
            tag_name, value, lc = token.split_contents()
        except ValueError:
            raise TemplateSyntaxError, "%r tag requires arguments" % token.contents.split()[0]
        if not (lc[0] == lc[-1] and lc[0] in ('"', "'")):
            raise TemplateSyntaxError, "%r locale should be in quotes" % tag_name 
        return TransNode(value, lc[1:-1])
    
    register.tag('trans_to', trans_to)
    

    html:

    {% load trans_to %}
    {# pass string #}   
    <p>{% trans_to "test" "de" %}</p>
    <p>{% trans "test" %}</p>
    {# pass variable #}
    {% with "test" as a_variable %}
    <p>{% trans_to a_variable "de" %}</p>
    <p>{% trans a_variable %}</p>       
    {% endwith %}
    

    结果:

    <p>test in deutsch</p>
    <p>test</p>
    <p>test in deutsch</p>
    <p>test</p>
    

    【讨论】:

    • 谢谢 zalew。我会尽快测试。
    • 怎么样?任何错误?喜欢吗?
    • 酷。有时间可能会写blocktrans版本,现在太忙了。很高兴我能帮上忙。
    • 您可以使用新的translation.override上下文管理器stackoverflow.com/a/22944260/247696,而不是运行translation.activate然后translation.deactivate
    【解决方案3】:

    这是 Zalew 代码的修改版本,它允许使用模板变量作为语言环境参数:

    from django.utils import translation
    from django.template import Library, Node,  Variable, TemplateSyntaxError
    register = Library()
    
    class TransNode(Node):
        def __init__(self, value, lc):
            self.value = Variable(value)
            self.lc =  Variable(lc)
    
        def render(self, context):
            translation.activate(self.lc.resolve(context))
            val = translation.ugettext(self.value.resolve(context))        
            translation.deactivate()
            return val
    
    def trans_to(parser, token):
        """ 
        force translation into a given language
          usage : {% trans_to "string to translate" locale %}
        """
        try:
            tag_name, value, lc = token.split_contents()
        except ValueError:
                raise TemplateSyntaxError, '%r tag usage: {%% trans_to "string to translate" locale %%}' % token.contents.split()[0]
        return TransNode(value, lc)
    
    register.tag('trans_to', trans_to)
    

    【讨论】:

      【解决方案4】:

      从 Django 版本 1.6 开始,有一个 language 模板标签,因此您可以简单地传递所需的语言代码:

      {% language "de" %}my block to translate{% endlanguage %}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-27
        • 2014-12-20
        • 2014-07-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多