我知道Django首先從瀏覽器標題中爲網站選擇默認語言,然後使用該語言顯示頁面,如果它匹配來自設置的可能選擇。Django語言環境如何在視圖之間工作
我想要做的是更改&在用戶登錄後設置該語言。我已經爲用戶提供了默認設置的表單。登錄後,從defaultSettings
型號中挑選默認語言。而我做的是:
d = DefaultSettings.objects.filter(user = request.user)
if len(d) > 0 and d[0].has_default_language:
from django.utils import translation
translation.activate(d[0].default_language)
request.LANGUAGE_CODE = translation.get_language()
和我所看到的是「錯誤的」語言頁面。
這讓我問 - 爲什麼?我沒有自己編寫代碼。我是從下面的例子
- Detect the language & django locale-url
- https://github.com/Torte/django-urli18n/blob/master/urli18n/middleware.py
- https://github.com/divio/django-cms/blob/develop/cms/middleware/multilingual.py
由於所有這些例子修改請求/響應在middleware
- 我真的需要做的一樣嗎?請求Django
重置請求之間的語言,並嘗試在每次請求後再次「猜測」它?
爲什麼我的設置方式一次沒有工作?
艾倫
更新(從辛德里古德蒙德森)第一響應後:
if form.is_valid ():
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
redirect_to = settings.LOGIN_REDIRECT_URL
if not form.cleaned_data [ 'remember_me' ]:
request.session.set_expiry (0)
from django.contrib.auth import login
login (request, form.get_user ())
if request.session.test_cookie_worked ():
request.session.delete_test_cookie ()
set_lang_to_user_default_language(request)
response = HttpResponseRedirect (redirect_to)
d = DefaultSettings.objects.filter(user = request.user)
if len(d) > 0 and d[0].has_default_language:
from django.utils import translation
translation.activate(d[0].default_language)
logger.debug(translation.get_language())
request.LANGUAGE_CODE = translation.get_language()
if hasattr(request, 'session'):
logger.debug('set django_language')
request.session['django_language'] = translation.get_language()
else:
logger.debug('set response cookie')
response.set_cookie(settings.LANGUAGE_COOKIE_NAME, translation.get_language())
return response
當我檢查日誌,我看到:
DEBUG 2011-09-01 09:08:13,379 et
DEBUG 2011-09-01 09:08:13,379 set django_language
但是,當我在一個視圖檢查模板,我在那裏打印出{{ LANGUAGE_CODE }}
,那麼它顯示'en'不是'et'
UPDATE2:
處理這一觀點後實際發生的事情是: 第1頁,其中這個觀點重定向到{{LANGUAGE_CODE}}是「恩」的內容是英語 第2頁,我第一次{{ LANGUAGE_CODE }}
之後走的是「恩」但內容在愛沙尼亞語 第二頁,我在第二個{{LANGUAGE_CODE}}之後去的是'en',並且內容再次以英文顯示,並保持英文。
所以它看起來像我必須創建我自己的middleware
保持頁面在「正確的」語言......我的問題是 - 爲什麼?
UPDATE3:我的語言設置是這樣的:
LANGUAGES = (
('et', gettext('Estonian')),
('en', gettext('English')),
('ru', gettext('Russian')),
('lv', gettext('Latvian')),
('lt', gettext('Lithuanian')),
('fi', gettext('Finnish')),
)
但經過進一步調查,我想我找到了一個解決方法。我在此項目中使用django-cms
,並關閉了cms.middleware.multilingual.MultilingualURLMiddleware,並遇到了上述問題。當我再次打開它時,一切正常 - 但它工作得很好,因爲middleware
已打開,它將所需參數放入每個響應中。
我最初問我的問題是 - 它是如何工作的。之後我問了問題。現在,我認爲,問題是 - 是否真的必須爲每個request/response
設置語言,如middleware
所做的那樣,並且與示例middlewares
一樣嗎?
登錄後第一頁的request.session ['django_language']'的價值是什麼? –
'en' - 它從我的瀏覽器中擷取它 - 因爲我的瀏覽器語言是英語。 –
@Zayatss;你的'settings.LANGUAGES'如何佈置?如果'et'不在那裏,django會回退到使用瀏覽器的語言。 'settings.LANGUAGES'應該是元組的元組,'((lang_code,lang_name),...)'請參閱[this](https://code.djangoproject.com/browser/django/trunk/django/utils/翻譯/ trans_real.py#L366)爲更好的解釋... –