【问题标题】:Django: What's the point to have 2-items tuples for the LANGUAGES setting?Django:为 LANGUAGES 设置设置 2 项元组有什么意义?
【发布时间】:2012-08-14 19:42:49
【问题描述】:

在项目的设置文件中,如果我们想限制 i18n 的语言选择,我们应该这样写:

gettext = lambda s: s

LANGUAGES = (
    ('Fr', gettext('French')),
    ('en', gettext('English')),
)

但我是这样写的:

LANGUAGES = (
    ('fr', 'cool dudes'),
    ('en', 'Anglais')
    )

无论我在元组的第二项中添加什么(是否使用“gettext = lambda s: s”),Django 都会在渲染页面的语言选择器中返回“Français”和“English”……我也尝试在该选择器的标题中获取原始语言数据:

{'code':'fr', 'name':'French', 'bidi':False, 'name_local':u'Fran\xe7ais'}
{'code':'en', 'name':'English', 'bidi':False, 'name_local':u'English'}

这让我很困惑,那么为这个设置设置 2 项元组有什么意义呢?

【问题讨论】:

    标签: django internationalization django-settings


    【解决方案1】:

    Django documentation for Settings 描述了第二个值以及如何使用它。

    ...通过这种安排,django-admin.py makemessages 仍然会找到并标记这些字符串以进行翻译,但翻译不会在运行时发生——所以你必须记住将语言包装在在运行时使用 LANGUAGES 的任何代码中的真正 gettext()。

    双元组中的第二个字符串旨在成为人类可读的语言名称再现。将第二个值包装在对gettext() 的调用中,以便将它们标记为可翻译字符串。但是gettext() 的正常实现在设置模块中不可用,因此您必须定义一个虚拟实现,如您的代码所示。如果您希望语言名称本地化,则需要在使用时将值包装在实际的 gettext() 中。

    您没有显示语言选择器 UI 的模板代码。你在用get_language_info()吗?文档给出的示例没有显示它,但在我看来,您需要将name_local 元素包装在_() 中。 (但我还没有测试过。)

    from django.utils.translation import get_language_info
    li = get_language_info('de')
    print(li['name'], _(li['name_local']), li['bidi'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多