2011-03-30 140 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