Ne zaman ugettext_lazy kullanmalıyım?


141

Ugettext ve ugettext_lazyçeviri için bir sorum var . Modellerde ugettext_lazyugettext görünümlerinde kullanmam gerektiğini öğrendim . Ama kullanmam gereken başka yerler var ugettext_lazymı? Form tanımları ne olacak? Aralarında performans farkı var mı?

Düzenleme: Ve bir şey daha. Bazen yerine ugettext_lazy, ugettext_noopkullanılır. Belgelerin dediği gibi, ugettext_noopdizeler yalnızca çeviri için işaretlenir ve bunları kullanıcıya göstermeden önce mümkün olan en son anda çevrilir, ancak burada biraz kafam karıştı, bu ne ugettext_lazyyapmaz? Modellerim ve formlarımda hangisini kullanmam gerektiğine karar vermek hala zor.

Yanıtlar:


197

ugettext() vs. ugettext_lazy()

Formlar veya modeller gibi tanımlarda kullanmalısınız ugettext_lazyçünkü bu tanımların kodu yalnızca bir kez yürütülür (çoğunlukla django'nun başlangıcında); ugettext_lazydizeleri tembel bir şekilde çevirir, yani, örneğin. bir modeldeki bir öznitelik adına her eriştiğinizde, dize yeni çevrilir - bu tamamen mantıklıdır çünkü django başlatıldığından beri bu modele farklı dillerde bakabilirsiniz!

Görünümlerde ve benzer işlev çağrılarında sorunsuz olarak kullanabilirsiniz ugettext, çünkü görünüm her çağrıldığında ugettextyeni yürütülür, böylece her zaman talebe uyan doğru çeviriyi alırsınız!

ilişkin ugettext_noop()

As Bryce onun cevabını işaret, bu fonksiyon işaretleri çeviri için çıkarılabilir olarak bir dize ancak çevrilmemiş dize döndürür gelmez. Bu, dizeyi iki yerde kullanmak için yararlıdır - çevrilmiş ve çevrilmemiş. Aşağıdaki örneğe bakın:

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
Bence bu Django'nun belgelerindeki açıklamadan daha anlaşılır. Teşekkürler @Bernhard.
Utku

14
Teşekkürler! Ayrıca zaman açıklamak yararlı olacaktır değil böyle .Kapağı, dize birleştirme ve diğerleri "" gibi bir dize bekliyoruz şeyler geçirmeden olduğu gibi, ugettext_lazy kullanmak; tembel bir proxy nesnesi bu durumlarda çalışmaz. Aksi takdirde, bu cevap her zaman ugettext_lazy kullanarak güvende olduğunuzu gösterir.
mrooney

4
@mrooney bu durumlarda daha az önemlidir, çünkü yanlış dil çevirisini sessizce döndürmek yerine, bunları yaparsanız size bir hata verecektir. Ayrıca, "" .replace öğesini ugettext_lazy ile kullanabilirsiniz, sonuçta str () öğesini çağırmanız yeterlidir, örneğin lazytext = ugettext_lazy ('merhaba') ve daha sonra str (lazytext) .replace kullanın.
fabspro

1
Ne hakkında msg = "An error has occurred"; logging.error(msg);return HttpResponse(_(msg))? why need _noop ?olmadan eğer _noop, Django dize ihtiyacı çeviri bulunamadı olacak?
16:16, WeizhongTu

1
Çeviri değişkenler üzerinde çalışır. Yine, burada aynı dokümanlar örneği , neden _noop?
16:31, WeizhongTu


5

Tembel sürüm, dize yerine bir proxy nesnesi döndürür ve bazı durumlarda beklendiği gibi çalışmaz. Örneğin:

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')

çünkü son satır JSON içine lst nesnesini serileştirmek ve "istemci" için bir dize yerine bir proxy nesnesi olurdu başarısız olur . Proxy nesnesi json'a serileştirilemez.


2
Bu durumlarda ugettext kullanmalısınız.
00'da 12:32
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.