2012-07-05 19 views
7

Estoy usando i18n_patterns para agregar un prefijo de lang_code actual a mi url.django i18n_patterns ocultar lang_code predeterminado de url

urlpatterns += i18n_patterns('', 
    url(r'^', include('blaszczakphoto2.gallery.urls')), 
) 

Se allowes que consiga URLs como /en/about-us/, etc .. /pl/about-us/ Mi idioma por defecto es pl

LANGUAGE_CODE = 'pl' 

Quiero URL como/about-us/para los clientes visión mi sitio en lenguage polaco . ¿Hay alguna forma de ocultar el prefijo lang_code de url para lang_code predeterminado?

+0

¿Ya descubriste cómo hacer esto? ¡Me encantaría saberlo también! – Javaaaa

Respuesta

0

Esta es mi solución:

Crear middleware Django: django_app/lib/middleware/locale.py

from django.utils import translation 

    class SwitchLanguageMiddleware(object): 

     def process_request(self, request): 
      lang = request.GET.get('lang', '') 

      if lang: 
       translation.activate(lang) 
       request.LANGUAGE_CODE = translation.get_language() 

     def process_response(self, request, response): 
      request.session['django_language'] = translation.get_language() 
      if 'Content-Language' not in response: 
       response['Content-Language'] = translation.get_language() 
      translation.deactivate() 

      return response 

se lee el parámetro GET de la solicitud y si tiene atributo lang, a continuación, cambiar el lenguaje . Ej .:/quienes-somos/lang = pl

Incluir este middleware a settings.py:?

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.common.CommonMiddleware', 

    'django_app.libs.middleware.locale.SwitchLanguageMiddleware', 
) 
1

me enfrentaba a este problema y lo resolvió de esta manera:

  • creado una alternativa i18n_patterns que no prefijan el idioma principal del sitio (definido en settings.LANGUAGE_CODE).

  • Se creó un middleware alternativo que solo usa el idioma de los prefijos de URL para activar el idioma actual.

No vi ningún efecto secundario con esta técnica.

El código:

# coding: utf-8 
""" 
Cauê Thenório - cauelt(at)gmail.com 

This snippet makes Django do not create URL languages prefix (i.e. /en/) 
for the default language (settings.LANGUAGE_CODE). 

It also provides a middleware that activates the language based only on the URL. 
This middleware ignores user session data, cookie and 'Accept-Language' HTTP header. 

Your urls will be like: 

In your default language (english in example): 

    /contact 
    /news 
    /articles 

In another languages (portuguese in example): 

    /pt/contato 
    /pt/noticias 
    /pt/artigos 

To use it, use the 'simple_i18n_patterns' instead the 'i18n_patterns' 
in your urls.py: 

    from this_sinppet import simple_i18n_patterns as i18n_patterns 

And use the 'SimpleLocaleMiddleware' instead the Django's 'LocaleMiddleware' 
in your settings.py: 

    MIDDLEWARE_CLASSES = (
    ... 
     'this_snippet.SimpleLocaleMiddleware' 
    ... 
    ) 

Works on Django >=1.4 
""" 

import re 

from django.conf import settings 
from django.conf.urls import patterns 
from django.core.urlresolvers import LocaleRegexURLResolver 
from django.middleware.locale import LocaleMiddleware 
from django.utils.translation import get_language, get_language_from_path 
from django.utils import translation 


class SimpleLocaleMiddleware(LocaleMiddleware): 

    def process_request(self, request): 

     if self.is_language_prefix_patterns_used(): 
      lang_code = (get_language_from_path(request.path_info) or 
         settings.LANGUAGE_CODE) 

      translation.activate(lang_code) 
      request.LANGUAGE_CODE = translation.get_language() 


class NoPrefixLocaleRegexURLResolver(LocaleRegexURLResolver): 

    @property 
    def regex(self): 
     language_code = get_language() 

     if language_code not in self._regex_dict: 
      regex_compiled = (re.compile('', re.UNICODE) 
           if language_code == settings.LANGUAGE_CODE 
           else re.compile('^%s/' % language_code, re.UNICODE)) 

      self._regex_dict[language_code] = regex_compiled 
     return self._regex_dict[language_code] 


def simple_i18n_patterns(prefix, *args): 
    """ 
    Adds the language code prefix to every URL pattern within this 
    function, when the language not is the main language. 
    This may only be used in the root URLconf, not in an included URLconf. 

    """ 
    pattern_list = patterns(prefix, *args) 
    if not settings.USE_I18N: 
     return pattern_list 
    return [NoPrefixLocaleRegexURLResolver(pattern_list)] 

El código anterior se encuentra disponible en: https://gist.github.com/cauethenorio/4948177

1

Es posible que desee comprobar yawd-translations que hace exactamente eso. Si no le importa la funcionalidad adicional (administre los idiomas de db), puede echar un vistazo al método urls.translation_patterns y al middleware.TranslationMiddleware para ver cómo se puede hacer.

6

Aquí es un paquete muy simple: django-solid-i18n-urls

Después de la configuración, las direcciones URL sin prefijo de idioma siempre utilizar un lenguaje predeterminado, que se especifica en settings.LANGUAGE_CODE. Los redireccionamientos no ocurrirán.

Si url tendrá un prefijo de idioma, se usará este idioma.

También se ha respondido aquí: https://stackoverflow.com/a/16580467/821594.

0

Django >=1.10 puede manejar esto de forma nativa. Hay un nuevo argumento prefix_default_language en la función i18n_patterns.

Configuración prefix_default_language-False elimina el prefijo de el idioma por defecto (LANGUAGE_CODE). Esto puede ser útil al agregar traducciones al sitio existente para que las URL actuales no cambien.

Fuente:https://docs.djangoproject.com/en/dev/topics/i18n/translation/#language-prefix-in-url-patterns

Ejemplo:

# Main urls.py: 
urlpatterns = i18n_patterns(
    url(r'^', include('my_app.urls', namespace='my_app')), 
    prefix_default_language=False 
) 

# my_app.urls.py: 
url(r'^contact-us/$', ...), 

# settings: 
LANGUAGE_CODE = 'en' # Default language without prefix 

LANGUAGES = (
    ('en', _('English')), 
    ('cs', _('Czech')), 
) 

La respuesta de example.com/contact-us/ será en Inglés y en example.com/cs/contact-us/ Checa.

Cuestiones relacionadas