代码之家  ›  专栏  ›  技术社区  ›  Pierre-Jean Coudert

如何在模板内强制翻译成给定的语言?

  •  5
  • Pierre-Jean Coudert  · 技术社区  · 14 年前

    在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中存在一个专用标签?

    4 回复  |  直到 8 年前
        1
  •  9
  •   zalew    14 年前

    模板标签/传输到.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>
    
        2
  •  13
  •   gdvalderrama    8 年前

    来自Django版本 1.6 有一个 language 模板标记,这样您就可以简单地传递所需的语言代码:

    {% language "de" %}my block to translate{% endlanguage %}
    
        3
  •  3
  •   Pierre-Jean Coudert    14 年前

    这是Zalew代码的修改版本,允许将模板变量用于locale参数:

    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
  •  -3
  •   Eduard Luca    10 年前

    你可以用 trans 模板内的模板标记,用于将字符串转换为所需语言:

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

    你必须要 USE_I18N 设置为 True 里面 settings.py 文件。

    然后你定义 LANGUAGE_CODE 控制整个网站的默认语言并添加 LocaleMiddleware 上课给你 MIDDLEWARE_CLASSES . 退房 How Django Discovers Language Preference 文档中的节。