如何在視圖內(在Django中)設置語言代碼?在django視圖中設置語言代碼
我要發送一個HttpResponse
其中包含一個python-date.strftime("%A")
。
%A
是一天(例如「星期一」),但我想用瑞典語代替英文而不是英文。
如何在視圖內(在Django中)設置語言代碼?在django視圖中設置語言代碼
我要發送一個HttpResponse
其中包含一個python-date.strftime("%A")
。
%A
是一天(例如「星期一」),但我想用瑞典語代替英文而不是英文。
爲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'