2012-11-29 13 views
14

मेरे पास एक मौजूदा बहुभाषी Django ऐप है जो मैं Django 1.4 पर पोर्ट कर रहा हूं। I18n समर्थन वर्तमान में कुछ बदसूरत हैक्स पर आधारित है, मैं इसे Django के अंतर्निहित i18n मॉड्यूल का उपयोग करना चाहता हूं।डीजेगो i18n पथ उपसर्ग के बिना डिफ़ॉल्ट भाषा

एक बाधा है कि मैं यूआरएल उस जगह में पहले से ही कर रहे हैं बदलने के लिए नहीं करना चाहती है। यह साइट थोड़ी देर के लिए सक्रिय रही है और इसके लिए बाहरी लिंक हैं कि मैं 'तोड़ना या पुनर्निर्देशित करना नहीं चाहता हूं। यूआरएल योजना इस तरह काम करता है: अंग्रेजी सामग्री, साइट के रूट पर है, जबकि अन्य भाषाओं डोमेन नाम में उपसर्गों का उपयोग करें:

अंग्रेजी यूआरएल:

/ 
/articles/ 
/suggestions/ 

स्पेनिश यूआरएल:

/es/ 
/es/articulos/ 
/es/sugerencias/ 

मुझे अनुवादित पृष्ठ Django 1.4 के i18n मॉड्यूल के साथ काम कर रहे हैं, लेकिन वास्तव में, वास्तव में, वास्तव में, वास्तव में सभी अंग्रेजी यूआरएल/en/मैं अंग्रेजी संस्करण के लिए गैर अंतरराष्ट्रीयकरण यूआरएल को परिभाषित करने सहित कुछ भिन्न हैक्स, की कोशिश की है:

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 सही ढंग से हल करता है, लेकिन {% यूआरएल%} टैग रिवर्स संकल्प करने के लिए काम नहीं करता है ।

गैर-प्रीफ़िक्स्ड अंग्रेजी-भाषा यूआरएल को पूरा करने का सबसे अच्छा तरीका क्या है?

+0

सिर्फ एक सवाल: अपने '_' गैर आलसी gettext के लिए संस्करण है? i.e. 'django.utils.translation आयात ugettext से _' –

+0

नहीं, यह आलसी संस्करण है: django.utils.translation.ugettext_lazy –

+0

क्या आप इसे गैर-आलसी संस्करण के साथ आज़मा सकते हैं और देख सकते हैं कि यह काम करता है या नहीं? –

उत्तर

9

अद्यतन: पढ़ें जवाब bellow, जैंगो 1.10 यह देशी रूप

मैं इस समस्या का सामना करना पड़ा और इस तरह से हल का समर्थन करता है:

  • एक वैकल्पिक i18n_patterns बनाया गया है कि साइट मुख्य भाषा उपसर्ग नहीं है (settings.LANGUAGE_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)] 

ऊपर कोड पर उपलब्ध है: https://gist.github.com/cauethenorio/4948177

+0

'django.conf.urls से आयात पैटर्न' मौजूद नहीं है – PvdL

+1

@PvdL नए django संस्करणों के लिए आपको मूल समाधान का उपयोग करना चाहिए: https://docs.djangoproject.com/en/1.10/topics/i18n/translation/# भाषा-उपसर्ग-इन-यूआरएल-पैटर्न –

+2

धन्यवाद, 'i18n_patterns (* urls, prefix_default_language = True) ' – PvdL

11

Django 1.10 इसे मूल रूप से समर्थन करता है।वे दस्तावेज़ में कहते हैं के रूप में:

i18n_patterns (* यूआरएल, prefix_default_language = सच)

यह समारोह एक रूट URLconf में इस्तेमाल किया जा सकता और Django स्वचालित रूप से करने के लिए मौजूदा सक्रिय भाषा कोड पहले जोड़ें जाएगा सभी यूआरएल पैटर्न i18n_patterns() के भीतर परिभाषित किए गए हैं।

ffse को prefix_default_language को सेट करना डिफ़ॉल्ट भाषा से उपसर्ग को हटा देता है (LANGUAGE_CODE)। मौजूदा साइट पर अनुवाद जोड़ते समय यह उपयोगी हो सकता है ताकि वर्तमान यूआरएल बदले नहीं जाएंगे।

स्रोत: https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#language-prefix-in-url-patterns

संबंधित मुद्दे