2010-05-03 77 views
1

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

我要发送一个HttpResponse其中包含一个python-date.strftime("%A")

%A是一天(例如“星期一”),但我想用瑞典语代替英文而不是英文。

回答

0

locale的文档表明,与现场太多摆弄是一个坏主意:

它通常是一个坏主意,叫 的setlocale()在某些库例程, 因为它的副作用它会影响整个程序的 。保存和恢复 它几乎一样糟糕:它是昂贵的 并影响其他线程发生 在设置已被 恢复之前运行。

如果您的整个应用程序使用瑞典语语言环境都可以,您应该只设置一次,然后继续使用。另一方面,如果您只希望该页面使用瑞典语区域设置,或者您需要能够打开每个请求的基础,则locale以及因此datetime.strftime不是必行之路。这个限制的原因似乎是python调用到C运行时的strftime,这对于频繁更改的区域设置来说效果不佳。

如果您的需求相对有限,最好的办法是编写自己的函数,根据需要编写日期格式,而不必依赖于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'