在Django中获取当前语言环境

5

在 Django 应用程序中,轻松获取当前语言(例如 en):django.utils.translation.get_lanaguage()。

但是,如何获取当前的本地化信息(例如 en_US 或 en_GB)?

4个回答

4
你试过使用to_locale()函数吗?
from django.utils.translation import to_locale, get_language
to_locale(get_language())

1
如果语言是'en',那么to_locale(get_language())仍然只会输出'en'。 - user3834658
to_locale的文档说明:将语言名称(en-us)转换为区域设置名称(en_US)。如果'to_lower'为True,则最后一个组件会变成小写(en_us)......因此,它期望一个语言名称,即语言+国家。我的问题是,区域设置包含语言和国家,因此无法仅从语言中提取。 - user3834658

2
在相关的(虚拟)环境中:
python
>>> import locale
>>> locale.getlocale()

最初的回答
例如:('en_GB','UTF-8')

2

语言区域设置(至少在Django中)之间的区别只是格式问题。 enen-us都是语言,如果en-us是当前选择的语言,则get_language()将返回该语言。

因此,您的问题似乎是Django没有按照您的预期设置当前语言。 Django使用长列表尝试确定要使用的语言的技术,因此建议您逐步查看该列表,以了解为什么语言不符合您的预期。

例如:

如果基本语言可用但未指定子语言,则Django使用基本语言。 例如,如果用户指定de-at(奥地利德语),但Django仅有de可用,则Django使用de


2

Django的django.utils.translation.to_locale()函数期望一个类似en-us的"语言名称",并将其转换为类似en_US的"区域名称"。

源代码:https://github.com/django/django/blob/master/django/utils/translation/init.py#L271-L284

它基本上只是进行一些字符串操作。

如果你的"语言名称"只是一个简单的语言代码,比如en,它将返回en。如果你想将en转换为类似en_US.UTF8的区域设置,你将需要编写自己的to_locale()函数。你需要确定你想要的语言代码en对应的区域设置。例如:

LANG_TO_LOCALE = {
    'en': 'en_US.UTF8',
    'nl': 'nl_NL.UTF8',
    'es': 'es_ES.UTF8'
}

def lang_to_locale(language_code):
    return LANG_TO_LOCALE.get(language_code)

根据您的喜好,您可能希望获取语言代码en的区域设置en_GB.UTF8而不是en_US.UTF8

然后可以将其用于在Python中设置区域设置:

import locale
locale.setlocale(locale.LC_ALL, lang_to_locale('nl'))

然后您可以以所需的语言获取月份名称:

from datetime import datetime
print(datetime.strftime(datetime.now(), '%B'))  # Prints month name in Dutch

为了使其正常工作,您需要在系统上安装适当的区域设置包。在Ubuntu上,您可以使用sudo dpkg-reconfigure locales来完成此操作。


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