2012-07-05 73 views
7

我正在使用i18n_patterns將當前lang_code的前綴添加到我的網址。django i18n_patterns隱藏URL的默認lang_code

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

這allowes我得到的URL像/en/about-us//pl/about-us/等。 我的默認語言爲pl

LANGUAGE_CODE = 'pl' 

我想網址喜歡/美國/客戶端瀏覽我的網站在拋光lenguage 。有沒有什麼辦法可以從默認lang_code的url中隱藏lang_code前綴?

+0

你有沒有發現如何做到這一點呢?我也很想知道它! – Javaaaa 2012-09-03 22:25:38

回答

0

這是我的解決方案:

創建Django的中間件:django_app/lib目錄/中間件/ 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 

它的讀取請求的GET參數,而且如果它有lang屬性,然後切換語言。例:/約-US/LANG = PL

包含此中間件的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

我面對這個問題,解決了這個辦法:

  • 創建一種替代i18n_patterns,它們不以站點主要語言爲前綴(在settings.LANGUAGE_CODE中定義)。

  • 創建了一個只使用URL前綴語言激活當前語言的替代中間件。

我沒有看到使用這種技術的任何副作用。

代碼:

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

上面的代碼可以用: https://gist.github.com/cauethenorio/4948177

1

你可能要檢查yawd-translations這正是這麼做的。如果您不關心額外的功能(從db管理語言),您可以查看urls.translation_patterns方法和middleware.TranslationMiddleware以查看如何完成。

0

Django >=1.10可以處理這個本地。在i18n_patterns函數中有一個新的prefix_default_language參數。

設置prefix_default_languageFalse從 刪除前綴的默認語言(LANGUAGE_CODE)。將 翻譯添加到現有網站以便當前網址不會更改時,這非常有用。

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

實施例:

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

example.com/contact-us/的響應將是在英國和捷克example.com/cs/contact-us/