2012-04-29 9 views
5

Pyramid documentation हमें दिखाता है कि दृश्यों के अंदर i18n का उपयोग कैसे करें (और templates as well)। लेकिन विचारों और टेम्पलेट्स के बाहर इसका उपयोग कैसे किया जाता है, जहां हमारे पास वर्तमान request (उदाहरण के लिए, forms और models) तक कोई पहुंच नहीं है?विचारों और टेम्पलेट्स के बाहर पिरामिड i18n का उपयोग कैसे करें?

@ माइकल ने request को मॉडल और रूपों में पास करने के लिए कहा। लेकिन क्या यह सही है? मेरा मतलब है कि फॉर्म फ़ील्ड __init__() विधि कॉल से पहले परिभाषित करता है, मॉडल के साथ ही। वे विचारों से कोई पैरामीटर नहीं दिख रहा है ...

Pylons में हम बस get_lang() और set_lang() का उपयोग करें और माता पिता के नियंत्रक में बेहतर भाषा को परिभाषित करने और उसके बाद ugettext() और किसी भी जगह हम चाहते हैं में ungettext() का उपयोग यह request से सीधे हर बुला बिना कर सकता है संभव समय (विचारों में)।

पिरामिड में ऐसा कैसे करें? ध्यान दें कि भाषा उपयोगकर्ता की सेटिंग्स (सत्र, कुकीज़, डीबी, आदि) से सेट की जानी चाहिए।

उत्तर

3

मेरा समाधान फॉर्म क्लास बनाने के लिए है जब स्थानीयकरणकर्ता के साथ पैरामीटर के रूप में इसकी आवश्यकता होती है। उदाहरण

forms.py

class FormFactory(object): 

    def __init__(self, localizer): 
     self.localizer = localizer 
     _ = self.localizer 
     self.required_msg = _(u'This field is required.') 
     self.invalid_email_msg = _(u'Invalid email address.') 
     self.password_not_match_msg = _(u'Password must match') 

    def make_contact_form(self): 
     _ = self.localizer 
     class ContactForm(Form): 
      email = TextField(_(u'Email address'), [ 
       validators.Required(self.required_msg), 
       validators.Email(self.invalid_email_msg) 
      ]) 
      content = TextAreaField(_(u'Content'), [ 
       validators.Required(self.required_msg) 
      ]) 
     return ContactForm 

जब आप प्रपत्र

@view_config(route_name='front_pages.contact_us', 
      renderer='myweb:templates/front_pages/contact_us.genshi') 
def contact_us(request): 
    """Display contact us form or send mail 

    """ 
    _ = get_localizer(request) 

    factory = FormFactory(_) 
    ContactForm = factory.make_contact_form() 
    form = ContactForm(request.params) 
    return dict(form=form) 

आप देख सकते हैं, हम ध्यान में रखते हुए localizer मिलता है, और यह FormFactory के पास के रूप में उपयोग करने की आवश्यकता के लिए, फिर उस कारखाने के साथ एक फार्म बनाएँ। ऐसा करके, फ़ॉर्म में सभी संदेशों को वर्तमान लोकेल भाषा के साथ बदल दिया गया था।

इसी तरह, आप मॉडल के साथ भी ऐसा ही कर सकते हैं।

2

क्या आपको अभी तक pyramid.18n.get_localizer मिला है?

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/i18n.html#using-a-localizer

+0

'get_localizer में इस तर्क रख सकते हैं 'fr' के रूप में यह सेट हो जाएगा() को पैरामीटर 'अनुरोध' की आवश्यकता है, इसलिए इसका मतलब है कि मैं इसे केवल दृश्य फ़ंक्शन (या कक्षा) के अंदर उपयोग कर सकता हूं। लेकिन बाहरी विचारों का उपयोग कैसे करें? –

+1

वैसे आप इसे अपने फॉर्म/मॉडल में पास करके 'अनुरोध' तक पहुंचते हैं, या 'get_current_request() 'का उपयोग करते हैं या आप अपना खुद का स्थानीयकरण करते हैं क्योंकि वह लिंक' make_localizer' के माध्यम से कहता है। 'अनुरोध' निर्धारित करता है कि स्थानीयकरणकर्ता द्वारा लोकेल का उपयोग किस प्रकार किया जाना चाहिए, और यदि आप उस व्यवहार को बनाए रखना चाहते हैं तो स्पष्ट रूप से आपको 'अनुरोध' की आवश्यकता है। –

+0

ऐसा लगता है कि आपने "अनुवाद कैसे करें" के लिए "विचारों/टेम्पलेट्स के बाहर अनुवाद कैसे करें" से प्रश्न बदल दिया है। मुझे लगता है कि मैंने जवाब में आपके मूल प्रश्न का उत्तर दिया और पिरामिड इस तरह के संबंध में टिप्पणियों का उत्तर दिया। यह जानने के लिए कि पिरामिड अनुवाद कैसे करता है, आपको पूरे पृष्ठ को पढ़ना चाहिए क्योंकि यह वास्तव में "अभ्यास में" में से अधिकांश को कवर करता है। –

1

वास्तव में मैं इस बहुत ही समस्या थी। मैं क्या कर रहा था यह देखने के लिए कि डिफ़ॉल्ट लोकेल वार्ताकार कैसे काम करता है - यह दिए गए अनुरोध ऑब्जेक्ट पर LOCALE संपत्ति की तलाश करता है। तो स्थानीयकरण बनाने के लिए बस एक डमी का उपयोग करें। आप यह मान भी संचित कर सकता है, यदि आप

def my_get_localizer(locale=None): 
    request = Request({}) 
    request._LOCALE_ = locale 

    return get_localizer(request) 

वैकल्पिक रूप से चाहते हैं, irc चैनल #pyramid @ freenode में शामिल होने और पर्याप्त वहाँ लोग परेशान के लिए 2 अलग दस्तावेज कार्यों में get_localizer की कार्यक्षमता (get_localizer और get_localizer_for_locale_name) विभाजित करने के लिए हमें आनंद लेने के लिए;)

इसके अलावा, ध्यान दें कि पिरामिड ट्रांसलेशनश्रेणी आलसी हैं, इसलिए आप जितनी चाहें उतनी देर तक अनुवाद कर सकते हैं, उदाहरण के लिए

class MyModel(Base): 
    description = TranslationString("My model number ${number}") 

... 

def view(request): 
    m = MyModel() 
    localizer = get_localizer(request) 
    description = localizer.translate(m.description, mapping={'number': 1}) 

सिडेनोट: पिलों 'i18n उम्र में खोले गए कीड़े का सबसे खराब कर सकता था। Set_lang, get_lang हैक वास्तव में भयानक था, और गधे में दर्द क्योंकि हमें उपयोगकर्ताओं को अपनी मूल भाषाओं में ईमेल भेजने की आवश्यकता थी और फिर भाषा को वापस बहाल करने की कोशिश की ... भी, यह अनुरोध के बाहर कुछ भी अनुवाद करने के लिए असंभव था एक अनुवादक या रजिस्ट्री के रूप में एक पिलोन कार्यक्रम तब मौजूद नहीं था।

0

आप एक स्थानीयकरण कर सकते हैं, और फिर तदनुसार एक टेम्पलेट का अनुवाद कर सकते हैं।

जब स्थानीयकरणकर्ता बनाते हैं, तो आप उस लांग को पारित कर सकते हैं (चाहे आपके पास डीबी या अन्यथा हो)। उम्मीद है कि यह मदद कर सकता है।

स्पष्टता रखने के लिए, मैं नीचे

from pyramid.i18n import make_localizer, TranslationStringFactory 
from mako.template import Template 
from mako.lookup import TemplateLookup 
import os 

absolute_path = os.path.dirname(os.path.realpath(__file__)) 
tsf = TranslationStringFactory('your_domain') 
mako_lookup = TemplateLookup(directories=['/']) 
template = Template(filename=template_path, lookup=mako_lookup) 

localizer = make_localizer("fr", [absolute_path + '/../locale/']) 

def auto_translate(*args, **kwargs): 
    return localizer.translate(tsf(*args, **kwargs)) 

# Pass _ pointer (translate function) to the context 
_ = auto_translate 

context.update({ 
    "_": _ 
}) 

html = template.render(**context) 

संपादित तुम भी एक छोटे से समारोह

def get_translator(lang): 
    """ 
    Useful when need to translate outside of queries (no pointer to request) 
    :param lang: 
    :return: 
    """ 
    localizer = make_localizer(lang, [absolute_path + '/../locale/']) 

    def auto_translate(*args, **kwargs): 
     return localizer.translate(tsf(*args, **kwargs)) 

    _ = auto_translate 

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