2012-11-29 7 views
14

私はDjango 1.4に移植している既存の多言語Djangoアプリケーションを持っています。 I18nのサポートは現在、いくつかの醜いハックに基づいています。私はDjangoに組み込まれたi18nモジュールを使用したいと思います。Django i18nデフォルトの言語(パスプレフィックスなし)

1つの制約は、すでに存在するURLを変更したくないということです。このサイトはしばらくの間アクティブだったし、そこへの外部リンクがあるので、壊れたりリダイレクトしたりしたくない。他の言語は、ドメイン名に接頭辞を使用しながら、英語のコンテンツは、サイトのルートにある:

英語のURL:

/ 
/articles/ 
/suggestions/ 

スペインのURL:

/es/ 
/es/articulos/ 
/es/sugerencias/ 
のURLスキームは、このように動作します

私はDjango 1.4のi18nモジュールを使って翻訳されたページを手に入れましたが、実際にはすべての英語のURLを/ en /の下に置きたいと思っています。私は、英語版のための非国際化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%}タグは動作しません。 。

接頭辞のない英語のURLを達成するにはどうすればよいですか?

+0

だけの質問は:gettextのFOあなたの '_'非怠惰なバージョンですか?つまり、 'django.utils.translation import ugettext as _' –

+0

いいえ、それは怠惰なバージョンです:django.utils.translation.ugettext_lazy –

+0

あなたはnon-lazyバージョンでそれを試してみることができますか? –

答えて

9

UPDATE:(

  • 代替i18n_patterns作成したサイトの主要言語の接頭辞はありません:読み取り回答怒鳴るは、Djangoの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)] 

上記のコードは、上で提供されています:私は同様の問題を解決するために、固I18N-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接頭辞in-url-patterns –

+2

「i18n_patterns(* urls、prefix_default_language = True)」のkwargを完全に見落としてしまいました。 – PvdL

11

Django 1.10はそれをネイティブにサポートしています。彼らはドキュメントに言うように:

i18n_patterns(*のURL、prefix_default_language = Trueの

この関数は、ルートURLconfの中で使用することができ、Djangoが自動的に現在のアクティブな言語コードを付加しますすべてのURLパターンはi18n_patterns()に定義されています。

prefix_default_languageをFalseに設定すると、既定の言語(LANGUAGE_CODE)からプレフィックスが削除されます。これは、現在のURLが変更されないように、既存のサイトに翻訳を追加する場合に便利です。

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

関連する問題