2012-11-29 13 views
14

Mam istniejącą wielojęzyczną aplikację Django, którą przesyłam do Django 1.4. Obsługa I18n jest obecnie oparta na kilku brzydkich atakach, chciałbym, aby korzystały z wbudowanych modułów i18n Django.Domyślny język Django i18n bez prefiksów ścieżki

Jednym z ograniczeń jest to, że nie chcę zmieniać adresów URL, które już istnieją. Ta strona była przez jakiś czas aktywna i istnieją linki do niej, których nie chcę łamać ani przekierowywać. Schemat URL działa tak: English treść jest w katalogu głównym witryny, podczas gdy inne języki używać prefiksów w nazwie domeny:

angielskich adresów URL:

/ 
/articles/ 
/suggestions/ 

hiszpańskich adresów URL:

/es/ 
/es/articulos/ 
/es/sugerencias/ 

Mam przetłumaczone strony pracujące z modułami i18n Django 1.4, ale tak naprawdę, naprawdę, naprawdę chcę umieścić wszystkie angielskie adresy URL w/en /. Próbowałem kilka różnych hacków, w tym zdefiniowanie non-zinternacjonalizowany adresy URL dla wersji angielskiej:

def build(callback): 
    return callback('', 
    url(_(r'^$'), home.index, name="home"), 
    url(_(r'^articles/$'), content.article_list, name='article_list'), 
    url(_(r'^suggestions/$'), suggestions.suggestions, name='suggestions'), 
) 

urlpatterns = build(patterns) 
urlpatterns += build(i18n_patterns) 

To sprawia, że ​​adresy URL rozwiązać prawidłowo, ale {% url%} tag zrobić odwrotny rozdzielczość nie działa .

Jaki jest najlepszy sposób na uzyskanie niezindeksowanych adresów URL w języku angielskim?

+0

tylko pytanie: czy Twój '_' non-leniwy wersja fo gettext? tj. 'from django.utils.translation import ugettext jako _' –

+0

Nie, to jest leniwa wersja: django.utils.translation.ugettext_lazy –

+0

czy możesz wypróbować ją z nie-leniwą wersją i sprawdzić, czy działa? –

Odpowiedz

9

UPDATE: Przeczytaj odpowiedź poniżej, Django 1.10 obsługuje on natywnie

I w obliczu tego problemu i rozwiązać w ten sposób:

  • stworzyła alternatywę i18n_patterns że nie prefiks strony głównego języka (zdefiniowane w settings.LANGUAGE_CODE).

  • Utworzono alternatywne oprogramowanie pośredniczące, które używa tylko języka prefiksów adresów URL w celu aktywacji bieżącego języka.

Nie widziałem żadnych skutków ubocznych przy użyciu tej techniki.

Kod:

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

Powyższy kod jest dostępny na: https://gist.github.com/cauethenorio/4948177

+0

'from django.conf.urls import patterns' nie istnieje – PvdL

+1

@PvdL dla nowszych wersji django powinieneś użyć natywnego rozwiązania: https://docs.djangoproject.com/en/1.10/topics/i18n/translation/# prefiks-języka-w-url-wzorach –

+2

Dzięki, całkowicie przeoczyłeś kwarg 'i18n_patterns (* urls, prefix_default_language = True)' – PvdL

11

Django 1.10 obsługuje go natywnie.Jak mówią w dokumencie:

i18n_patterns (* URL, prefix_default_language = True)

Funkcja ta może być używana w URLconf korzeniowego i Django automatycznie dołączana aktualny kod aktywny językową wszystkie wzorce adresów URL zdefiniowane w ramach i18n_patterns().

Ustawienie prefix_default_language na False usuwa prefiks z domyślnego języka (LANGUAGE_CODE). Może to być przydatne przy dodawaniu tłumaczeń do istniejącej strony, aby bieżące adresy URL nie uległy zmianie.

Źródło: https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#language-prefix-in-url-patterns

Powiązane problemy