1

在项目的设置文件中,如果我们想限制 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 项元组有什么意义呢?

4

1 回答 1

1

SettingsDjango 文档描述了第二个值以及如何使用它。

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

双元组中的第二个字符串旨在成为人类可读的语言名称再现。在调用中包装第二个值,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'])
于 2012-11-22T08:11:53.760 回答