Django - 防止模板中可用语言名称的翻译

6

我在settings.py中设置了可用的语言

LANGUAGE_CODE = 'en'
LANGUAGES = (
    ('fr', _('French')),
    ('en', _('English')),
)

当我在模板中进行循环时,我认为django通过{{ lang.1 }}向我提供翻译后的名称是预期行为。但是我不希望语言名称被翻译,所以我已经按照以下设置更改了我的settings.py:

LANGUAGES = (
        ('fr', 'Francais'),
        ('en', 'English'),
    )

我仍然在获取翻译后的语言名称。你有什么想法吗? {% get_available_languages as languages %} 模板标签自动翻译列表项吗?如果是这样,那么在循环可用语言时如何使用未翻译的语言名称?

----编辑---

我已经检查了django的get_available_languages模板标签代码。 我认为它是在这里翻译的:

class GetAvailableLanguagesNode(Node):
    def __init__(self, variable):
        self.variable = variable

    def render(self, context):
        context[self.variable] = [(k, translation.ugettext(v)) for k, v in settings.LANGUAGES]
        return ''

也许我需要编写自己的模板标签...

你是否再次运行了 runserver? - JuniorCompressor
是的,我再次运行了我的服务器... - ratata
如果我写 ('en', 'test'),例如,它会正常工作并返回预期的 'test'。 - ratata
看起来你已经回答了自己的问题。你应该编写自己的模板标签,或直接访问settings.LANGUAGES。 - Håken Lid
2个回答

5

这次没有黑科技

根据翻译文档,您可以在模板或Python代码中使用可用的语言工具。

在模板中,使用get_language_info模板标签:

{% get_language_info for "pl" as lang %}

Language code: {{ lang.code }}<br />
Name of language: {{ lang.name_local }}<br />
Name in English: {{ lang.name }}<br />
Bi-directional: {{ lang.bidi }}
Name in the active language: {{ lang.name_translated }}

它可以与其他标签结合使用,构建一个机制,使您能够更改语言

{% for lang_code, lang_name in languages %}  
   {% if lang_code != LANGUAGE_CODE %}      
     {% get_language_info for lang_code as lang_info %}
     {% language lang_code %}                            
     {% url request.resolver_match.url_name as no_slug %}
     {% url request.resolver_match.url_name slug=object.slug as yes_slug %}  
     <p>Link to: {% firstof yes_slug no_slug %} Local name: {{ lang_info.name_local }}</p>
     {% endlanguage %}
   {% endif %}
 {% endfor %}

此线程中,可以在视图中实现相同的结果。
否则,您可以在代码中使用get_language_info,如下所示:
>>>from django.utils.translation import get_language_info
>>>li = get_language_info('en')
>>>print(li)
{'bidi': False, 'code': 'en', 'name': 'English', 'name_local': 'English'}

并在以下示例的上下文中使用它:

from django.utils import translation

def welcome_translated(language):
    cur_language = translation.get_language()
    try:
        translation.activate(language)
        text = translation.ugettext('welcome')
    finally:
        translation.activate(cur_language)
    return text

如果我写('en', 'test'),例如它运行并返回了预期的'test'。
谢谢!这个想法提出了以下的解决方案。
LANGUAGES = (
        ('fr', 'Francais'),
        ('en', ' English'),
    )

注意在单词“English”之前添加了空格。


0

我遇到了同样的问题(希望语言名称在其自己的翻译中),只需在传递到模板之前在视图中重新定义语言变量:

   from django.utils.translation import get_language_info
   languages = [(lang[0], get_language_info(lang[0])['name_local'] for lang in settings.LANGUAGES]

这基本上允许快速拥有一个语言代码和名称的变量,以进行自己的翻译,即:

   [('en', 'English'), ('fr', 'Français')]

我猜在自定义模板标签中使用同一行代码也可以完成工作。希望能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接