如何在视图中设置语言代码(在django中)?
我发送的HttpResponse
包含python-date.strftime("%A")
。
%A
是当天(例如“星期一”),但我希望用瑞典语代替英语。
答案 0 :(得分: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'