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

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

问题描述

我已正确安装国际化.

它适用于以下网址:

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

在主页中,语言切换也很好.

In the home page the language switching works fine too.

- 有什么问题?

当我更改翻译页面中的语言时,例如/en/bookings/,如果我将语言转换为西班牙语 (es),我会再次重定向到/en/bookings/,并且我会看到英文页面.

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

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.

- 我喜欢什么?

如果我在/en/bookings/并切换到西班牙语,我想重定向到/es/reservas/,以获取所有翻译后的网址.

最好的方法是什么?

谢谢.

推荐答案

我有类似的问题,所以我发送我的解决方案以节省您的时间.

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

main(urls.py)

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)

(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'),
]

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

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

创建中间件以在用户单击该子站点的替代链接时更改站点语言,但使用不同的语言(中间件.py)

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

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

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',
]

模板中的示例用法:

{% 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 %}

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

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