2012-07-05 5 views
7

Ich benutze die i18n_patterns, um ein Präfix des aktuellen lang_code zu meiner URL hinzuzufügen.django i18n_patterns Standard Lang_code von URL verbergen

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

Es allowes mich Urls wie /en/about-us/ zu bekommen, /pl/about-us/ etc .. Meine Standardsprache ist pl

LANGUAGE_CODE = 'pl' 

ich url wollen wie/about-us/für Kunden meine Seite in der polnischen lenguage sehen . Gibt es eine Möglichkeit, lang_code Präfix von URL für Standard lang_code zu verstecken?

+0

Haben Sie schon herausgefunden, wie das geht? Ich würde es auch gerne wissen! – Javaaaa

Antwort

0

Dies ist meine Lösung:

erstellen 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 

Sie die get Parameter der Anfrage gelesen hat, und wenn es lang -Attribut hat, dann Sprachumschaltung . Bsp .:/about-us/lang = pl

Fügen Sie diese Middleware 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

ich mit diesem Problem konfrontiert und löste diese Art und Weise:

  • eine alternative Erstellt i18n_patterns, die der Hauptsprache der Site nicht vorangestellt sind (definiert in settings.LANGUAGE_CODE).

  • Erstellt eine alternative Middleware, die nur die Sprache der URL-Präfixe verwendet, um die aktuelle Sprache zu aktivieren.

Ich sah keine Nebenwirkung mit dieser Technik.

Der Code:

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

Der obige Code ist ein Angebot auf: https://gist.github.com/cauethenorio/4948177

1

Vielleicht möchten yawd-translations prüfen, welche genau das tut. Wenn Sie sich nicht um die zusätzliche Funktionalität kümmern (Sprachen aus db verwalten), können Sie sich die Methode urls.translation_patterns ansehen und die middleware.TranslationMiddleware, um zu sehen, wie es geht.

6

Hier ist ein sehr einfaches Paket: django-solid-i18n-urls

Nach der Einrichtung Urls ohne Sprache Präfix immer Standardsprache verwendet, ist, dass in settings.LANGUAGE_CODE angegeben. Redirects werden nicht auftreten.

Wenn die URL ein Sprachenpräfix hat, wird diese Sprache verwendet.

Auch hier beantwortet: https://stackoverflow.com/a/16580467/821594.

0

Django >=1.10 kann dies nativ behandeln. Es gibt ein neues prefix_default_language Argument in i18n_patterns Funktion.

Einstellung prefix_default_language-False entfernt das Präfix von die Standardsprache (LANGUAGE_CODE). Dies kann nützlich sein, wenn Sie Übersetzungen in bestehende Websites hinzufügen, damit sich die aktuellen URLs nicht ändern.

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

Beispiel:

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

Die Antwort von example.com/contact-us/ auf Englisch sein und example.com/cs/contact-us/ in Tschechisch.