在Django视图中设置语言代码

1 投票
1 回答
779 浏览
提问于 2025-04-15 22:18

我该如何在Django的视图中设置语言代码呢?

我正在发送一个HttpResponse,里面包含了python-date.strftime("%A")

%A表示星期几(比如说'星期一'),但我想要用瑞典语来显示星期几,而不是英语。

1 个回答

0

关于 locale 的文档提到,频繁更改地区设置并不是个好主意:

在某些库的例程中调用 setlocale() 通常是不明智的,因为这会影响到整个程序。保存和恢复地区设置几乎同样糟糕:这会消耗资源,并且会影响到在设置恢复之前运行的其他线程。

如果你的整个应用程序都可以使用瑞典地区设置,那就只需设置一次,之后就可以继续了。另一方面,如果你只想让某一页面使用瑞典地区设置,或者需要根据请求来切换地区设置,那么 locale 和相应的 datetime.strftime 就不适合了。造成这种限制的原因是,Python 在调用 strftime 时会进入 C 运行时,而这个运行时对频繁变化的地区设置不太友好。

如果你的需求相对简单,最好的办法是自己写一个函数,按照你想要的格式来处理日期,而不依赖于 strftime 的地区特定格式 {%a, %A, %b, %B, %c, %p}。这可能需要你建立一个地区特定的月份/日期名称列表,但这并不算太麻烦。

下面是一个非常基础的实现,它可以在英语和法语之间切换(我没有安装瑞典地区设置 ;)),并处理 %a%b,其他的则调用 datetime.strftime 来处理:

import datetime

def wrap_strftime(d, fmt, locale = "en"):
    """
    Preprocess a strftime format so we can pass in the locale.

    >>> dt = datetime.datetime(2010, 1, 1)
    >>> wrap_strftime(dt, "%a %b %d, %Y")
    'Fri Jan 01, 2010'
    >>> wrap_strftime(dt, "%a %b %d, %Y", "fr")
    'Ven jan 01, 2010'
    """

    data = {
        "fr": {
            "%a": ['Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam', 'Dim'],
            "%b": [
                'jan', 'f\xc3\xa9v', 'mar', 'avr', 'mai', 'jui',
                'jul', 'ao\xc3\xbb', 'sep', 'oct', 'nov', 'd\xc3\xa9c'
            ],
        },
        "en": {
            "%a": ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
            "%b": [
                'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'
            ],
        },
    }

    getters = {
        "%a": lambda dt: dt.weekday(),
        "%b": lambda dt: dt.month - 1,
    }


    for pattern in data[locale]:
        getter = getters[pattern]
        fmt = fmt.replace(pattern, data[locale][pattern][getter(d)])

    return d.strftime(fmt)

if __name__ == "__main__":
    import doctest
    doctest.testmod()

你可能还想看看 Babel,它比尝试包装 strftime 要强大得多,并且可以让你做一些事情,比如:

>>> from babel.dates import format_datetime
>>> import datetime
>>> format_datetime(datetime.datetime.now(), "EEE dd MMM yyyy", locale="fr")
u'lun. 03 mai 2010'

撰写回答