使用已翻译的网址重定向在Django中切换语言 [英] Switch language in Django with the translated url redirect

查看:148
本文介绍了使用已翻译的网址重定向在Django中切换语言的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经正确地安装了国际化。



它与URL类似:

  / en / bookings / #English 
/ es / reservas / #Spanish

在主页中,语言切换工作正常。



- 有什么问题?



当翻译页面中的语言(如/ en / reservations /)更改语言为西班牙语时,我被重定向到/ en / bookings /再次,我看到页面



如果我更改了前缀(喜欢这个答案)重定向到/ es / reservations /不存在。



我不想被重定向到主页。



- 我喜欢什么?



如果我在/ en / reservations /并切换到西班牙语我想要redi



最好的方法是什么?



谢谢。

解决方案

我有类似的问题,所以我发送我的决议来节省你的时间。 b
$ b

main(urls.py)

  from django.conf.urls import include,url 
from django.conf.urls.i18n import i18n_patterns

urlpatterns = [
url(r'^ i18n /',include('django.conf.urls.i18n') )


urlpatterns + = i18n_patterns(
url(r'^',include('index.urls',namespace ='index')),

(index.urls.py)



来自django.conf.urls的url
从django.views.generic导入TemplateView
从django.utils.translation导入ugettext_lazy为_


urlpatterns = [
url(r'^ $',TemplateView.as_view(template_name ='index / index.html'),name ='index'),
url (_( r'^ python-programming / $'),TemplateView.as_view(template_name ='index / new_page.html'),
name ='new_page'),
]

创建模板标签以返回我们支持的所有语言的当前位置的URL(index.templatetags.helper_tags.py)

从django.template导入库
从django.core.urlresolvers导入解析,反向
从django.utils.translation导入激活,get_language

register = Library()


@ register.simple_tag(took_context = True)
def change_lang(context,lang = * args,** kwargs):

通过指定的语言获取活动页面的URL
用法:{%change_lang'en'%}


path = context ['request']。path
url_parts = resolve(path)

url = path
cur_language = get_language()
尝试:
activate(lang)
url = reverse(url_parts.view_name,k wargs = url_parts.kwargs)
finally:
activate(cur_language)

返回%s%url

创建中间件以更改站点语言,当用户点击替代链接到此子站点,但使用不同的语言
(middleware.py)

从django.utils导入翻译
从django.conf导入设置
从django.utils.deprecation import MiddlewareMixin


class LangBasedOnUrlMiddleware(MiddlewareMixin):

@staticmethod
def process_request(request):

if hasattr(request,'session' )
active_session_lang = request.session.get(translation.LANGUAGE_SESSION_KEY)

如果active_session_lang == request.LANGUAGE_CODE:
返回

如果有( request.LANGUAGE_CODE,用于设置语言的语言.LANGUAGES):
translation.activate(request.LANGUAGE_CODE )
request.session [translation.LANGUAGE_SESSION_KEY] = request.LANGUAGE_CODE

将其添加到settings.py)刚刚在LocaleMiddleware之后

  MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'our_app.middleware.LangBasedOnUrlMiddleware',
]

模板中的用法示例:

  {%load i18n%} 
{%load helper_tags%}
{%get_available_languages as languages%}
{%for lang_code,lang_name in languages%}
< a href ={{request.scheme}}:// {{request.META.HTTP_HOST}} {%change_lang lang_code%}>
{%endfor%}


I have internationalization correctly installed.

It's works with urls like:

/en/bookings/ #English
/es/reservas/ #Spanish

In the home page the language switching works fine too.

- What's the issue?

When I change the language in a translated page, like /en/bookings/, if I turn the language to Spanish (es) I am redirected to /en/bookings/ again and I see the page in English.

If I change the prefix (like this answer) the redirection goes to /es/bookings/ that doesn't exists.

I don't want to be redirected to the home page.

- What I like?

If I am in the /en/bookings/ and switch to Spanish I want to be redirected to /es/reservas/, for all the translated urls.

What is the best way?

Thanks.

解决方案

I had similar problem so I sending my resolution to save Your time.

main(urls.py)

from django.conf.urls import include, url
from django.conf.urls.i18n import i18n_patterns

urlpatterns = [
    url(r'^i18n/', include('django.conf.urls.i18n')), 
]

urlpatterns += i18n_patterns(
    url(r'^', include('index.urls', namespace='index')),
)

(index.urls.py)

from django.conf.urls import url
from django.views.generic import TemplateView
from django.utils.translation import ugettext_lazy as _


urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='index/index.html'), name='index'),
    url(_(r'^python-programming/$'), TemplateView.as_view(template_name='index/new_page.html'),
        name='new_page'),
]

Creating template tag to return urls for current location in all languages that we support (index.templatetags.helper_tags.py)

from django.template import Library
from django.core.urlresolvers import resolve, reverse
from django.utils.translation import activate, get_language

register = Library()


@register.simple_tag(takes_context=True)
def change_lang(context, lang=None, *args, **kwargs):
    """
    Get active page's url by a specified language
    Usage: {% change_lang 'en' %}
    """

    path = context['request'].path
    url_parts = resolve(path)

    url = path
    cur_language = get_language()
    try:
        activate(lang)
        url = reverse(url_parts.view_name, kwargs=url_parts.kwargs)
    finally:
        activate(cur_language)

    return "%s" % url

Creating middleware to change site language when user will click at alternative link to this sub site but in different language (middleware.py)

from django.utils import translation
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin


class LangBasedOnUrlMiddleware(MiddlewareMixin):

    @staticmethod
    def process_request(request):

        if hasattr(request, 'session'):
            active_session_lang = request.session.get(translation.LANGUAGE_SESSION_KEY)

            if active_session_lang == request.LANGUAGE_CODE:
                return

            if any(request.LANGUAGE_CODE in language for language in settings.LANGUAGES):
                translation.activate(request.LANGUAGE_CODE)
                request.session[translation.LANGUAGE_SESSION_KEY] = request.LANGUAGE_CODE

Adding it to (settings.py) just after LocaleMiddleware

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'our_app.middleware.LangBasedOnUrlMiddleware',
]

Sample usage in template:

{% load i18n %}
{% load helper_tags %}
    {% get_available_languages as languages %}
    {% for lang_code, lang_name in languages %}
        <a href="{{ request.scheme }}://{{ request.META.HTTP_HOST }}{% change_lang lang_code %}">
    {% endfor %}

这篇关于使用已翻译的网址重定向在Django中切换语言的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆