2012-07-05 109 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/