2010-04-17 10 views
12

Yönetici panelinde, yöneticinin siparişle ilgili bilgileri bu siparişte listelenen belirli kişilere göndermesine izin veren bir eylemi olan bir Sipariş modelim var. Her kişi dil kümesi vardır ve bu mesaj olarak gönderilecektir gerekiyordu dildirDjango: yönetici panelinden gönderilen iletinin dilini değiştirme

ben kullanıyorum ne kısa versiyonu:.

from django.utils.translation import ugettext as _ 
from django.core.mail import EmailMessage 

lang = method_that_gets_customer_language() 

body = _("Dear mister X, here is the information you requested\n") 
body += some_order_information 

subject = _("Order information") 

email = EmailMessage(subject, body, '[email protected]', ['[email protected]']) 
email.send() 

kullandığı dil hakkında müşteri bilgisi var lang. Varsayılan dil en-us, çeviriler Fransızca (fr) ve Almanca (de).

langbody ve subject için belirtilen dil için çeviriyi kullanmanın bir yolu var mı? Örneğin: lang, 'de' dir. Konu ve beden, 'de' çeviri dosyalarında belirtilen dizeleri almalıdır.

düzenleme:

bir çözüm bulundu. Bu o body değişkeni sürer Ne

from django.utils import translation 
from django.utils.translation import ugettext as _ 


body = "Some text in English" 
translation.activate('de') 
print "%s" % _(body) 
translation.activate('en') 

, o zaman dili İngilizce olarak döndürür yazdırır, Alman onu çevirir.

şey

gibi
body = _("Some text in English") 
translation.activate('de') 
print "%s" % body 

olsa İngilizce metni yazdırır. aktive eğer/çeviri devre dışı bırakılması sorunu (?) çözmek için uygun bir yoldur

+0

Düzeltme: Oooops, üzgünüm. Bugün kafamda kesinlikle yanlış bir şey var. –

+2

translation.deactivate() translation.activate ('en') 'den daha iyi olabilir. –

+0

Teşekkür ederim. Bu işlevi görmedim. – yoshi

cevap

0

Emin değilim

ben depolamak konular/beden/dil/tür alanlar için bazı modeli oluşturmak için çalışacaklarını ifade sorunla karşı karşıya olsaydı. Bazı kod taslak:

class ClientMessageTemplate(models.Model): 
    language = model.CharField(choices=AVAIALBLE_LANGUAGES,...) 
    subject = models.CharField(...) 
    body = models.CharField(...) 
    type = models.CharField(choices=AVAILABLE_MESSAGE_TYPES) 

Sonra kolayca retreive olabilir türüne ve müşterinin diline tabanını ihtiyaç ClientMessageTemplate.

Bu çözümün avantajı, tüm verilerin yönetici arayüzü aracılığıyla korunabilmesi ve her seferinde bir şey değiştiğinde ileti dosyalarını yeniden derlemenize gerek olmamasıdır.

2

Python 2.6 kullanıyorsanız (veya __future__'dan with_statement'u aldıktan sonra Python 2.5), aşağıdaki içerik yöneticisini rahatınız için kullanabilirsiniz. kullanım

from contextlib import contextmanager 
from django.utils import translation 

@contextmanager 
def language(lang): 
    if lang and translation.check_for_language(lang): 
     old_lang = translation.get_language() 
     translation.activate(lang) 

    try: 
     yield 
    finally: 
     if lang: 
      translation.activate(old_lang) 

Örnek:

Bu durumda bir şey güvenli olmanın yararı vardır
message = _('English text') 
with language('fr'): 
    print unicode(message) 

bir istisna yanı sıra Django varsayılan yerine parçacığının eski dilini geri atar.