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