2012-11-29 3 views
14

장고 1.4에 포팅 할 기존 다국어 Django 앱이 있습니다. I18n 지원은 현재 추악한 해킹을 기반으로하고 있으며, 장고에 내장 된 i18n 모듈을 사용하도록하고 싶습니다.Django i18n 경로 접두사가없는 기본 언어

제약 조건 중 하나는 이미 설치된 URL을 변경하고 싶지 않다는 것입니다. 이 사이트는 잠시 동안 활성화되어 있으며, 외부 링크가있어 '깨거나 리디렉션하고 싶지 않습니다. URL이 방식은 다음과 같이 작동

영어의 URL :

/ 
/articles/ 
/suggestions/ 

스페인어 URL을 :

/es/ 
/es/articulos/ 
/es/sugerencias/ 
를 다른 언어 도메인 이름에 접두어를 사용하는 동안 영어 컨텐츠 사이트의 루트에

Django 1.4의 i18n 모듈을 사용하여 번역 된 페이지를 얻었지만 실제로는 정말/en/아래에 모든 영어 URL을 넣고 싶습니다. 나는 영어 버전이 아닌 국제화 URL을 정의를 포함하여 몇 가지 다른 해킹 시도했다 : 이것은 URL이 제대로 해결하게

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) 

을하지만, {%의 URL을 %} 태그가 작동하지 않는 역 해결을 할 수 .

접두사가없는 영어 URL을 얻는 가장 좋은 방법은 무엇입니까?

+0

단지 질문 : gettext에 FO 당신의'_' 비 게으른 버전? 즉'from django.utils.translation import ugettext as _' –

+0

아니요, 게으른 버전입니다 : django.utils.translation.ugettext_lazy –

+0

게으른 버전이 아닌 시도해 볼 수 있습니까? –

답변

9

UPDATE : (

  • 대안 i18n_patterns 만든 사이트의 주요 언어를 접두사하지 않습니다 읽기 응답 우는 소리는, 장고 1.10는 기본적으로

    나는이 문제를 직면하고이 방법으로 해결 지원 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)] 

위의 코드를 볼 수 있습니다 : 나는 비슷한 문제를 해결하기 위해 고체 국제화-URL을 사용 https://gist.github.com/cauethenorio/4948177

+0

'from django.conf.urls import patterns'이 존재하지 않습니다 – PvdL

+1

최신 django 버전의 경우 @PvdL 네이티브 솔루션을 사용해야합니다 : https://docs.djangoproject.com/en/1.10/topics/i18n/translation/# URL 접두사를 - URL 패턴을 –

+2

감사합니다,'i18n_patterns (* urls, prefix_default_language = True) '의 kwarg를 간과했습니다. – PvdL

11

장고 1.10은 기본적으로 지원합니다.그들은 문서에서 말하는 것처럼 :

i18n_patterns (* URL을, prefix_default_language = 진정한)

이 기능은 루트 URLconf에서 사용할 수 있으며, 장고는 자동으로 현재 활성화 된 언어 코드를 앞에 추가합니다 i18n_patterns()에 정의 된 모든 URL 패턴

prefix_default_language를 False로 설정하면 기본 언어 (LANGUAGE_CODE)에서 접두어가 제거됩니다. 현재 URL이 변경되지 않도록 기존 사이트에 번역을 추가 할 때 유용 할 수 있습니다.

출처 : https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#language-prefix-in-url-patterns