मुझे ugettext_lazy का उपयोग कब करना चाहिए?


141

मेरे पास ugettext और ugettext_lazyअनुवाद के लिए उपयोग करने के बारे में एक प्रश्न है । मुझे पता चला कि मॉडल में मुझे उपयोग करना चाहिए ugettext_lazy, जबकि विचारों में बदसूरत। लेकिन क्या कोई अन्य स्थान हैं, जहां मुझे ugettext_lazyभी उपयोग करना चाहिए ? फॉर्म की परिभाषा के बारे में क्या? क्या उनके बीच कोई प्रदर्शन भिन्नता है?

संपादित करें: और एक और बात। कभी कभी, के बजाय ugettext_lazy, ugettext_noopप्रयोग किया जाता है। जैसा कि दस्तावेज़ीकरण कहता है, ugettext_noopस्ट्रिंग्स केवल अनुवाद के लिए चिह्नित की जाती हैं और उपयोगकर्ता को प्रदर्शित करने से पहले नवीनतम संभव मोमेंट पर अनुवादित की जाती हैं, लेकिन मैं यहां थोड़ा भ्रमित हूं, क्या ugettext_lazyऐसा नहीं है? मेरे लिए तय करना अभी भी कठिन है, जिसे मुझे अपने मॉडल और रूपों में उपयोग करना चाहिए।

जवाबों:


197

ugettext() बनाम ugettext_lazy()

फॉर्म या मॉडल जैसी परिभाषाओं में आपको उपयोग करना चाहिए ugettext_lazyक्योंकि इस परिभाषा के कोड को केवल एक बार निष्पादित किया जाता है (ज्यादातर django के स्टार्टअप पर); ugettext_lazyस्ट्रिंग्स का अनुवाद आलसी अंदाज़ में करते हैं, जिसका अर्थ है, जैसे। हर बार जब आप एक मॉडल पर एक विशेषता के नाम का उपयोग करते हैं, तो स्ट्रिंग नव-अनुवादित होगा-जो पूरी तरह से समझ में आता है क्योंकि आप इस मॉडल को विभिन्न भाषाओं में देख रहे होंगे क्योंकि django शुरू किया गया था!

विचारों और समान फ़ंक्शन कॉल में आप ugettextसमस्याओं के बिना उपयोग कर सकते हैं , क्योंकि हर बार दृश्य कहा जाता हैugettext तो उसे नया क्रियान्वित किया जाएगा, इसलिए आपको हमेशा अनुरोध का सही अनुवाद प्राप्त होगा!

के बारे में ugettext_noop()

जैसा कि ब्रायस ने अपने जवाब में कहा, यह फ़ंक्शन अनुवाद के लिए एक्स्ट्रेक्टेबल के रूप में एक स्ट्रिंग को चिह्नित करता है लेकिन अनट्रेंडेड स्ट्रिंग को वापस करता है। यह दो स्थानों पर स्ट्रिंग का उपयोग करने के लिए उपयोगी है - अनुवादित और अनारक्षित। निम्नलिखित उदाहरण देखें:

import logging
from django.http import HttpResponse
from django.utils.translation import ugettext as _, ugettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))

16
यह मेरी राय में Django के प्रलेखन में स्पष्टीकरण से अधिक समझ में आता है। धन्यवाद @ बर्नहार्ड
उट्टू

14
धन्यवाद! यह समझाने में भी मददगार होगा कि कब ugettext_lazy का उपयोग किया जाए, जैसे कि इसे उन चीजों से पास करते समय जो "स्ट्रिंग" जैसे स्ट्रिंग की अपेक्षा करते हैं। एक आलसी प्रॉक्सी वस्तु उन मामलों में काम नहीं करेगी। अन्यथा यह उत्तर बताता है कि आप हमेशा केवल ugettext_lazy का उपयोग करके सुरक्षित हैं।
मैरोनी

4
@ उन मामलों को कम करें क्योंकि वे गलत भाषा अनुवाद वापस करने के बजाय, यदि आप उन्हें करते हैं तो आप उन्हें एक त्रुटि देंगे। इसके अलावा, आप "" .replace का उपयोग ugettext_lazy के साथ कर सकते हैं, आपको बस str () परिणाम पर कॉल करना होगा जैसे कि lazytext = ugettext_lazy ('hello') और फिर बाद में str (lazytext) .replace का उपयोग करें।
फैबस्प्रो

1
msg = "An error has occurred"; logging.error(msg);return HttpResponse(_(msg))? why need _नोप के बारे में क्या है ?अगर बिना _noop, django को स्ट्रिंग की आवश्यकता के अनुवाद नहीं मिलेगा?
वीज़हंगटू

1
अनुवाद चर पर काम करता है। फिर, यहाँ एक समान उदाहरण डॉक्स है , तो क्यों _noop?
WeizhongTu

17

_Noop का एक उत्कृष्ट उपयोग है, जब आप डेवलपर्स के लिए अंग्रेजी में एक संदेश लॉग करना चाहते हैं, लेकिन अनुवादित स्ट्रिंग को एक दर्शक के लिए प्रस्तुत करते हैं। इसका एक उदाहरण http://blog.bessas.me/posts/use-gettext-in-django/ पर है


4
लिंक टूट गया है ...
nalzok

5

आलसी संस्करण एक स्ट्रिंग के बजाय एक प्रॉक्सी ऑब्जेक्ट देता है और कुछ स्थिति में यह अपेक्षा के अनुरूप काम नहीं करेगा। उदाहरण के लिए:

def get(self, request, format=None):
   search_str = request.GET.get('search', '')
   data = self.search(search_str)
   lst = []
   lst.append({'name': ugettext_lazy('Client'), 'result': data})
   return HttpResponse(json.dumps(lst), content_type='application/json')

विफल हो जाएगा क्योंकि बहुत अंतिम पंक्ति JSON में लेस्ट ऑब्जेक्ट को क्रमबद्ध करने की कोशिश करेगी और "क्लाइंट" के लिए एक स्ट्रिंग के बजाय इसमें एक प्रॉक्सी ऑब्जेक्ट होगा। प्रॉक्सी ऑब्जेक्ट जसन में क्रमबद्ध नहीं है।


2
आपको इन मामलों में ugettext का उपयोग करना चाहिए।
सुदिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.