2012-06-30 19 views
13

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

def get_locale_name(request): 
    """ Return the :term:`locale name` associated with the current 
    request (possibly cached).""" 
    locale_name = getattr(request, 'locale_name', None) 
    if locale_name is None: 
     locale_name = negotiate_locale_name(request) 
     request.locale_name = locale_name 
    return locale_name 

लेकिन request attr "local_name" नहीं है, लेकिन यह है "स्वीकार-भाषा" और इतने समारोह get_local_name अनुरोध में "local_name" नहीं मिल रहा है जब , यह एक समारोह कॉल:

def negotiate_locale_name(request): 
    """ Negotiate and return the :term:`locale name` associated with 
    the current request (never cached).""" 
    try: 
     registry = request.registry 
    except AttributeError: 
     registry = get_current_registry() 
    negotiator = registry.queryUtility(ILocaleNegotiator, 
             default=default_locale_negotiator) 
    locale_name = negotiator(request) 

    if locale_name is None: 
     settings = registry.settings or {} 
     locale_name = settings.get('default_locale_name', 'en') 

    return locale_name 

मैं कैसे देख सकता negotiator कोशिश वैश्विक वातावरण से स्थानीय प्राप्त करने के लिए, लेकिन यह है कि config से अपने निर्धारित मूल्य करने के लिए नहीं कर सकते हैं। और मुझे समझ में नहीं आ रहा है कि क्यों पिरामिड अनुरोध के क्षेत्र से सीधे "स्वीकार्य भाषा" लोकेल नहीं मिलता है?

और, मैं लोकेल का सही निर्धारण कैसे कर सकता हूं?

उत्तर

14

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

आपको या तो _LOCALE_ key on the request (उदाहरण के लिए, एक ईवेंट हैंडलर के माध्यम से) सेट करने की आवश्यकता है, या अपना खुद का custom locale negotiator प्रदान करें।

from pyramid.events import NewRequest 
from pyramid.events import subscriber 

@subscriber(NewRequest) 
def setAcceptedLanguagesLocale(event): 
    if not event.request.accept_language: 
     return 
    accepted = event.request.accept_language 
    event.request._LOCALE_ = accepted.best_match(('en', 'fr', 'de'), 'en') 
+0

लेकिन स्वीकृति_भाषा कारण स्वीकार करने से ऑब्जेक्ट को स्वीकार करने की कोई ज़रूरत नहीं है स्वीकार्य है() और स्वीकार्य() के पहले से ही विधि है और विधि स्वयं best_match() है। यह पिरामिड संस्करण 1.2 के लिए प्रयास है बहुत धन्यवाद – Denis

+1

@ डेनिस: आप वास्तव में सही हैं; 'accept_language' पहले से ही 'स्वीकार करें' का एक उदाहरण है। सही किया। –

+0

@ मार्टिजिन पीटर्स वैसे भी धन्यवाद, सभी ठीक काम करते हैं)) – Denis

2

कि request._LOCALE_ काम करता है सिर्फ इसलिए कि डिफ़ॉल्ट रूप से स्थान वार्ताकार एक default_locale_negotiator है ध्यान दें है:

यहाँ NewRequest event और accept_language header का उपयोग कर एक उदाहरण है, webob Accept class का एक उदाहरण है। यदि आपके पास बहुत ही जटिल जांच हैं, उदाहरण के लिए यदि उपयोगकर्ता कुकी मौजूद नहीं है, तो आपको उपयोगकर्ता को डीबी से लाने की ज़रूरत है, न्यूआरक्व्वेस्ट हैंडलर के पास उन अनुरोधों के लिए ओवरहेड है जिनके लिए किसी भी अनुवाद की आवश्यकता नहीं है। उनके लिए आप भी एक कस्टम स्थान वार्ताकार, की तरह उपयोग कर सकते हैं:

def my_locale_negotiator(request): 
    if not hasattr(request, '_LOCALE_'): 
     request._LOCALE_ = request.accept_language.best_match(
      ('en', 'fr', 'de'), 'en') 

    return request._LOCALE_ 


from pyramid.config import Configurator 
config = Configurator() 
config.set_locale_negotiator(my_locale_negotiator) 
0

पिरामिड 1.5 के रूप में, आप वर्तमान स्थान तक पहुंचने के लिए अनुरोध गुणों का उपयोग कर सकते हैं:

request.localizerLocalizer

request.locale का एक उदाहरण request.localizer.locale_name

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