2012-07-05 8 views
7

Sto usando i18n_patterns per aggiungere un prefisso del codice di lang corrente al mio URL.django i18n_patterns nasconde il codice di default lang_code dall'url

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

E allowes me per ottenere gli URL come /en/about-us/, /pl/about-us/ ecc .. La mia lingua di default è pl

LANGUAGE_CODE = 'pl' 

voglio URL del tipo/chi-siamo/per i clienti osservazione il mio sito in lenguage polacco . C'è un modo per nascondere il prefisso lang_code dall'URL per default lang_code?

+0

Hai scoperto come fare ancora? Mi piacerebbe saperlo anche io! – Javaaaa

risposta

0

Questa è la mia soluzione:

Crea django middleware: 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 

E 'leggere il parametro get della richiesta e se ha lang, per poi passare la lingua . Es .:/chi-siamo/lang = pl

Includere questo middleware per 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

Ho affrontato questo problema e risolto in questo modo:

  • Creato un'alternativa i18n_patterns che non prefisso la lingua principale del sito (definita in settings.LANGUAGE_CODE).

  • Creato un middleware alternativo che utilizza solo la lingua dei prefissi URL per attivare la lingua corrente.

Non ho visto alcun effetto collaterale utilizzando questa tecnica.

Il codice:

# 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)] 

Il codice di cui sopra è disponibile su: https://gist.github.com/cauethenorio/4948177

1

Si potrebbe voler controllare yawd-translations che fa esattamente questo. Se non ti interessa la funzionalità extra (gestisci le lingue da db), puoi dare un'occhiata al metodo urls.translation_patterns e allo middleware.TranslationMiddleware per vedere come può essere fatto.

6

Ecco un pacchetto molto semplice: django-solid-i18n-urls

Dopo l'installazione, gli URL senza prefisso lingua sarà sempre usare il linguaggio di default, che è specificato nel settings.LANGUAGE_CODE. I reindirizzamenti non si verificheranno.

Se l'url avrà il prefisso di lingua, verrà utilizzata questa lingua.

Anche risposto qui: https://stackoverflow.com/a/16580467/821594.

0

Django >=1.10 può gestire questo in modo nativo. C'è un nuovo argomento prefix_default_language nella funzione i18n_patterns.

Impostazione prefix_default_language-False rimuove il prefisso dal la lingua predefinita (LANGUAGE_CODE). Ciò può essere utile quando si aggiungono le traduzioni al sito esistente in modo che gli URL correnti non cambino.

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

Esempio:

# 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 risposta di example.com/contact-us/ sarà in inglese e example.com/cs/contact-us/ in ceco.

Problemi correlati