proyectos language_code español ejemplos django url internationalization

ejemplos - django language_code español



Cambiar de idioma en Django con la redirección de URL traducida (2)

Cuando tuve el mismo problema, implementé una etiqueta de plantilla personalizada (current_url) que, dada la solicitud en contexto, vuelve a generar la url para el idioma activo:

{% load custom_tags %} <ul> {% get_language_info_list for LANGUAGES as languages %} {% for language in languages %} {# IMPORTANT! enclose the ''current_url'' tag in a ''language'' block #} {% language language.code %} <li {% if language.code == LANGUAGE_CODE %}class="active"{% endif %}> <a href="{% current_url %}">{{ language.name_local }}</a> </li> {% endlanguage %} {% endfor %} </ul>

Aquí está el código para la etiqueta personalizada (custom_tags.py):

import six import sys from django.template import Node, TemplateSyntaxError, Library from django.conf import settings register = Library() class CurrentURLNode(Node): def __init__(self, asvar=None): self.asvar = asvar def render(self, context): request = context[''request''] from django.core.urlresolvers import reverse, NoReverseMatch url = '''' try: url = reverse(request.resolver_match.view_name, args=request.resolver_match.args, kwargs=request.resolver_match.kwargs, current_app=context.current_app) except NoReverseMatch: exc_info = sys.exc_info() if settings.SETTINGS_MODULE: project_name = settings.SETTINGS_MODULE.split(''.'')[0] try: url = reverse(project_name + ''.'' + request.resolver_match.view_name, args=request.resolver_match.args, kwargs=request.resolver_match.kwargs, current_app=context.current_app) except NoReverseMatch: if self.asvar is None: six.reraise(*exc_info) else: if self.asvar is None: raise if self.asvar: context[self.asvar] = url return '''' else: return url @register.tag def current_url(parser, token): bits = token.split_contents() bits = bits[1:] asvar = None if len(bits) >= 2 and bits[-2] == ''as'': asvar = bits[-1] bits = bits[:-2] if len(bits): raise TemplateSyntaxError("Unexpected arguments to current_url tag") return CurrentURLNode(asvar)

No es necesario utilizar la vista django ''set_language''. No es necesario realizar una solicitud POST para cambiar el idioma activo. Con solo archivadores html que vinculen todo su contenido internacionalizado, es mejor para SEO.

Tengo la internacionalización correctamente instalada.

Funciona con URL como:

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

En la página de inicio, el cambio de idioma también funciona bien.

- ¿Cual es el problema?

Cuando cambio el idioma en una página traducida, como / en / bookings /, si cambio el idioma a español, me redireccionan a / en / bookings / nuevamente y veo la página en inglés.

Si cambio el prefijo ( como esta respuesta ) la redirección pasa a / es / bookings / eso no existe.

No quiero ser redirigido a la página de inicio.

- ¿Lo que me gusta?

Si estoy en / en / reservas / y cambio al español, quiero que me redirijan a / es / reservas /, para todas las URL traducidas.

¿Cuál es la mejor manera?

Gracias.


Tuve un problema similar, así que envié mi resolución para ahorrarle tiempo.

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

Crear una etiqueta de plantilla para devolver las URL de la ubicación actual en todos los idiomas que admitimos (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

Crear middleware para cambiar el idioma del sitio cuando el usuario haga clic en un enlace alternativo a este sitio secundario pero en otro idioma (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

Agregándolo a (settings.py) justo después de LocaleMiddleware

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

Uso de muestra en la plantilla:

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