【问题标题】:Django - Preventing translation of available language names in templateDjango - 防止模板中可用语言名称的翻译
【发布时间】:2015-04-27 15:19:04
【问题描述】:

我在 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了吗?
  • 是的,我再次运行我的服务器...
  • 如果我写 ('en', 'test'),例如它可以工作并按预期给出'test'...
  • 好像你已经回答了你自己的问题。您应该只编写自己的模板标签,或直接访问 settings.LANGUAGES。

标签: django django-i18n


【解决方案1】:

这次没有黑客攻击

根据translation documentation,您可以在模板或py​​thon代码中使用可用的语言工具。

在模板中,使用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 }}

它可以与其他标签结合并建立一个机制,让你change languages

{% 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 %}

this thread 中,视图中实现了相同的结果。

否则,您可以在代码中使用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'}

并在following example的上下文中使用它:

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'作为 预计

谢谢!这个想法提出了以下解决方案 hack:

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

注意英文单词前添加的空格。

【讨论】:

    【解决方案2】:

    我有同样的问题(希望语言名称在他们自己的翻译中)并且在将其传递给模板之前简单地在视图中重新定义语言变量:

       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')]
    

    我想同一行将在自定义模板标签中完成这项工作。希望对您有所帮助!

    【讨论】:

      猜你喜欢
      • 2011-01-26
      • 1970-01-01
      • 2012-12-09
      • 2011-03-11
      • 2010-09-16
      • 1970-01-01
      • 2014-07-05
      • 2012-11-13
      相关资源
      最近更新 更多