2011-08-31 5 views
3

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() 

그리고 "잘못된"언어로 된 페이지가 있습니다.

내가 물어 봅니다. 왜죠? 나는 그 코드를 스스로 만들지 않았다. 정말 같은 일을해야합니까 - 모든 예 middleware에 요청/응답을 수정하기 때문에 나는 다음 예

에서있어? Django은 요청간에 언어를 재설정하고 각 요청 후에 다시 "추측"하려고합니까?

한 번 설정하는 나의 방법은 왜 작동하지 않습니까?

앨런

업데이트 (신 드리 Guðmundsson에서) 첫번째 응답 후 : 내가 로그 검사 할 때

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'이 아닌 '012'을 표시합니다.

갱신 2 :이보기를 처리 한 후 발생하는 사실은 무엇을

: 내용은 내가 1 {{ LANGUAGE_CODE }} 후 이동 2 페이지 영어 에서 '엉을'이다 '엉' 1 페이지이보기가 리디렉션 {{언어 코드}}이다 콘텐츠는 에스토니아어입니다. 2 번째 {{LANGUAGE_CODE}}이 (가) 'en'이고 3 번째 페이지가 'en'이고 콘텐츠가 영어로되어 있으며 다시 영어로 유지됩니다.

그래서 "올바른"언어로 페이지를 유지하려면 내 middleware을 만들어야 만합니다 ... 내 질문은 - 왜?

갱신 3은 :

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이 켜져 있고 각 매개 변수에 필요한 매개 변수를 넣기 때문에 정상적으로 작동합니다.

내가 처음에 질문 한 내용은 작동 방식입니다. 그리고 나중에 WHY라는 질문을했습니다. 자, 생각해 봅니다. 문제는 - 실제로 각각의 언어를 설정해야만합니까 request/responsemiddleware과 같은 코드를 사용하고 middlewares과 같이 할 수 있습니까?

+0

로그인 후 첫 페이지의'request'Session [ 'django_language']'값은 무엇입니까? –

+0

'en'- 브라우저 언어가 영어이므로 내 브라우저에서 가져옵니다. –

+0

@ 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) 더 나은 설명을 ... –

답변

4

제안/답변 :

내가 그 또한 몇 가지 이상한 행동을 가지고!

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware', 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

미들웨어 프로세스 요청 및 응답에 대한 책임이 있다고하고, 추가 :이 그림을 위해 존재하는 경우, 나는 'LocaleMiddleware'두 번 검사를 추가 잊고 있었기 때문에이처럼 내 'MIDDLEWARE_CLASSES'외모가 어떻게 언어!

또한 'Sindri Guðmundsson'의 코드를 유지하십시오.

편집 조금 더

! LocaleMiddleware를 살펴보면 :

def process_request(self, request): 
    language = translation.get_language_from_request(request) 
    translation.activate(language) 
    request.LANGUAGE_CODE = translation.get_language() 

그래서 질문입니다! 왜 장고가 필요하니?! 답변 : {{LANGUAGE_CODE}}을 (를) 사용하는 경우 REQUEST에서 읽으므로 LANGUAGE_CODE가 요청에 포함되어야합니다! 그렇지 않으면! 그것은 그것을 돌려주지 않을 것이다! 그래서이 미들웨어가 존재하는 이유입니다!

""" 
This is a very simple middleware that parses a request 
and decides what translation object to install in the current 
thread context. This allows pages to be dynamically 
translated to the language the user desires (if the language 
is available, of course). 
""" 

는 또한 문서를 확인하십시오 : 미들웨어의 실제 소스 코드에 주석을 그것을 확인 https://docs.djangoproject.com/en/1.3/topics/i18n/deployment/#how-django-discovers-language-preference 장고 CMS는 당신이 '돈 경우, 사용하는 어떤 언어를 결정하는 request.LANGUAGE_CODE를 사용

+0

당신은 절대적으로 정확합니다 - 나는 미들웨어 클래스에서 장고 dms 다국어 URL 미들웨어와 함께있을 때 시스템이 올바르게 메시지를 던지기 시작했다는 것을 기억한다면 그 미들웨어 원인을 제거했습니다. –

+0

그래서 다시 돌려 놓고 작동하는지 확인하십시오! 만약 그렇다면, 나는 u =에서 여기에 기뻐할 것입니다.) –

+0

문제는 - 나는 그것을 원하지 않으며 질문은 - 왜 내가 그러한 미들웨어를 필요로하고 왜 그 쿠키를 설정함으로써 작동하지 않는가? 하지만 시몬스가 대답하고 원격으로 당신이 그것을 하나의 미들웨어가 각 요청에 대해 이렇게하고 장고가 작동하는 방법이 필요합니다. –

1

밖으로 set_language 확인 django.views.i18n에서, 라인 (33) 당신은 세션에서 사용자의 언어 코드를 설정해야합니다 :

if hasattr(request, 'session'): 
    request.session['django_language'] = lang_code 
else: 
    response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) 
+1

도 작동하지 않습니다. 내가 사용하는 코드로 질문을 추가하십시오. –

0

t는 GET 또는 POST 매개 변수에서 특정 언어를 묻습니다.

Django CMS는 미들웨어 인 MultilingualURLMiddleware를 사용하여 request.LANGUAGE_CODE를 설정합니다.

미들웨어는 먼저 url에서 언어 접두사를 찾은 다음 언어에 세션 키를 찾습니다.

다른 언어를 원할 경우 세션 변수에서 한번 설정할 수 있지만 MultilingualURLMiddleware는 요청할 때마다 request.LANGUAGE_CODE를 계속 설정합니다.

+0

MMyeah, 그래서 당신이 말하는 것은 각각의 모든 요청에 ​​대해 LANGUAGE_CODE를 설정하는 미들웨어가 없기 때문에 django dms가 기본 언어로 설정 했으므로 "비난받을 것"입니다 음식물? –

관련 문제