2011-03-30 139 views
11

我正在安裝model_translation,rosetta,locale_url。但不起作用改變語言。Django:i18n - 更改語言

我的settings.py:

LANGUAGE_CODE = 'ru' 
MODELTRANSLATION_TRANSLATION_REGISTRY = "project.translation" 
TRANSLATION_REGISTRY = "project.translation" 
ugettext = lambda s: s 
LANGUAGES = (
    ('ru', ugettext(u'Russian')), 
    ('uk', ugettext(u'Ukrainian')), 
) 

我的語言切換視圖:

def set_language(request): 
    next = request.REQUEST.get('next', None) 
    if not next: 
     next = request.META.get('HTTP_REFERER', None) 
    if not next: 
     next = '/' 
    response = http.HttpResponseRedirect(next) 
    if request.method == 'GET': 
     lang_code = request.GET.get('language', None) 
     if lang_code and check_for_language(lang_code): 
      if hasattr(request, 'session'): 
       request.session['django_language'] = lang_code 
      else: 
       response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) 
    return response 

模板:

<a href="{% url set_lang %}?lang=uk&next={{request.path}}">Ukranian</a> 

我中間件:

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

但語言切換不起作用。如果我打開鏈接http://localhost/uk/語言切換,但切換到另一頁時 - 語言恢復爲默認語言。 我該怎麼辦?

回答

8

添加translation.activate到您的代碼:

from django.utils import translation 

def set_language(request): 
    next = request.REQUEST.get('next', None) 
    if not next: 
     next = request.META.get('HTTP_REFERER', None) 
    if not next: 
     next = '/' 
    response = http.HttpResponseRedirect(next) 
    if request.method == 'GET': 
     lang_code = request.GET.get('language', None) 
     if lang_code and check_for_language(lang_code): 
      if hasattr(request, 'session'): 
       request.session['django_language'] = lang_code 
      else: 
       response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) 
      translation.activate(lang_code) 
    return response 
+0

好吧,語言的變化工作,但URL始終是「儒」,並沒有更改爲「英國」 =( – Taras 2011-03-31 09:54:38

+0

使用'translation.LANGUAGE_SESSION_KEY'的會話密鑰。 – 2017-01-19 06:17:45

3

使用發表的Torsten代碼,您的網址將不會改變,因爲 '未來' 永遠是像* /RU/ *其他/網址。它永遠不會是無(實際上,如果上面的兩個是無用的)。由於set_cookietranslation.activate,您的語言發生更改。但是,當您點擊您網站中英文的任何其他鏈接時,語言將回到ru。

你可以嘗試從django的set_language內建視圖,如解釋here,或通過嘗試一些替換或類似的東西來處理'下一個'字符串。

6

我遇到了同樣的問題,這是因爲next參數前面加了舊的語言代碼,這可以防止新的語言代碼生效。 (感謝@佩德羅的回答,就此提供線索)。

要解決這個問題,如果您使用模板中的{{ request.path }}{{ request.get_full_path }}(或根本不設置它)重定向到相同的翻譯過的模板,那麼您必須指定下一個,如下切片語言代碼。其餘部分保持爲the docs say

<input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" /> 

我張貼的answer中更詳細解釋這一點並提供兩個功能的例子。

0

你可以試試這個。此代碼將與獲取請求

def set_language(request): 
    from django.utils.translation import activate 
    lang_code = request.GET.get('language', 'en') 
    lang = get_language() 
    if not lang_code: 
     lang_code = request.GET.get('lang_code', settings.LANGUAGE_CODE) 
    next_url = request.META.get('HTTP_REFERER', '') 
    if not is_safe_url(url=next_url, host=request.get_host()): 
     next_url = '/' 
    response = HttpResponseRedirect(next_url) 
    if lang_code and check_for_language(lang_code): 
     if hasattr(request, 'session'): 
      request.session['django_language'] = lang_code 
     response.set_cookie(settings.LANGUAGE_COOKIE_NAME, lang_code) 
     activate(lang_code) 
    return response 

或者您可以使用內置設置語言選項。這將POST請求 https://docs.djangoproject.com/en/dev/topics/i18n/translation/#django.views.i18n.set_language