Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中的视图内设置语言代码_Python_Django - Fatal编程技术网

Python 在django中的视图内设置语言代码

Python 在django中的视图内设置语言代码,python,django,Python,Django,如何在视图中设置语言代码(在django中) 我正在发送一个HttpResponse,其中包含一个python date.strftime(“%a”) %A是一天(例如“星期一”),但我想用瑞典语而不是英语来表示这一天。的文档表明,过多地修改语言环境是个坏主意: 打电话通常不是个好主意 某些库例程中的setlocale(), 因为作为副作用,它会影响 整个计划。保存和恢复 它几乎同样糟糕:它很贵 并影响发生的其他线程 在设置完成之前运行 恢复 如果您的整个应用程序都可以使用瑞典语言环境,那么您只

如何在视图中设置语言代码(在django中)

我正在发送一个
HttpResponse
,其中包含一个
python date.strftime(“%a”)

%A
是一天(例如“星期一”),但我想用瑞典语而不是英语来表示这一天。

的文档表明,过多地修改语言环境是个坏主意:

打电话通常不是个好主意 某些库例程中的setlocale(), 因为作为副作用,它会影响 整个计划。保存和恢复 它几乎同样糟糕:它很贵 并影响发生的其他线程 在设置完成之前运行 恢复

如果您的整个应用程序都可以使用瑞典语言环境,那么您只需设置一次即可。另一方面,如果您只希望该页面使用瑞典语言环境,或者您需要能够根据每个请求进行切换,
locale
,因此
datetime.strftime
是不可取的。这种限制的原因似乎是python调用了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()
您可能还想查看哪一个比尝试包装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'