2011-03-10 8 views
11

मेरे पास एक django प्रोजेक्ट है जो एक कार्यकर्ता प्रक्रिया का उपयोग करता है जो उपयोगकर्ताओं को ईमेल भेजता है। कार्यकर्ता प्रक्रियाएं एक खरगोश सर्वर को सुनती हैं और ईमेल भेजने के लिए सभी विवरण प्राप्त करती हैं, टेम्पलेट चर, ईमेल पते को भेजने के लिए आदि। ईमेल निकाय django टेम्पलेट्स और render_to_string के साथ बनाया गया है।डीजेगो स्विचिंग, भाषा स्विच करें ताकि अनुवाद एक भाषा में किया जा सके

हालांकि मैं इसे अंतर्राष्ट्रीय बनाना चाहता हूं। हमारे कुछ उपयोगकर्ता अंग्रेजी में वेबसाइट का उपयोग करने जा रहे हैं, कुछ अन्य भाषाओं में। उन्हें अपनी भाषा में ईमेल प्राप्त करना चाहिए। मैंने ईमेल कार्यकर्ता प्रक्रिया i18n करने की कोशिश की है (django.utils.translations.ugettext/ugettext_lazy का उपयोग करके), ताकि ईमेल विषय और ईमेल निकाय में _(...) या {% blocktrans%} resp।

हालांकि चूंकि ईमेल को एक अलग पृष्ठभूमि कार्यकर्ता प्रक्रिया में प्रस्तुत किया जाता है और भेजा जाता है, तो सामान्य django language detection process लागू नहीं होता है। इसके लिए कोई उपयोगकर्ता सत्र नहीं है, कोई कुकी या कोई http शीर्षलेख नहीं है। Rabbitmq सर्वर पर संदेश भेजते समय, मैं भाषा कोड

लेकिन मैं उस भाषा का उपयोग करने के लिए django/gettext को कैसे बता सकता हूं।

उदा मेरे समारोह ईमेल भेजता है कि इस प्रकार दिखाई देंगे:

def send_email(details): 
    lang = details['lang'] 
    name = details['name'] 
    email_address = details['email_address'] 

    switch_gettext_to_this_language_what_goes_here(lang): 
    # ????? 
    email_subject = _("Welcome to $SITE") 

क्या मैं में डाल एक विशिष्ट भाषा कोड के लिए Django अनुवाद/gettext स्विच करने के लिए इतना है कि _() कि भाषा कोड का उपयोग करेगा करते हैं?

उत्तर

12

सबसे आसान तरीका है:

from django.utils.translation import activate 
activate('en') 
# do smthg 
activate('pl') 
# do something in other language 

इस रूप में यह इस प्रक्रिया/धागा के निष्पादन के आराम के लिए संदर्भ बदल रहा है के साथ सावधान रहना।

+2

ध्यान दें कि 'django.utils.translation' में अब' ओवरराइड (लैंग) 'संदर्भ प्रबंधक है जो बाहर निकलने पर मूल लोकेल को स्वचालित रूप से रीसेट कर देगा। –

1

बाहर कर देता है the django docs explain how:

जबकि Django विचारों और टेम्प्लेट में उपयोग के लिए i18n उपकरणों के समृद्ध सेट प्रदान करता है, यह Django-विशिष्ट कोड के लिए उपयोग को प्रतिबंधित नहीं करता है। Django अनुवाद तंत्र का उपयोग किसी भी भाषा में मनमानी ग्रंथों का अनुवाद करने के लिए किया जा सकता है जो Django द्वारा समर्थित है (जब तक उचित अनुवाद कैटलॉग मौजूद है)। आप एक अनुवाद कैटलॉग लोड कर सकते हैं, इसे सक्रिय कर सकते हैं और टेक्स्ट को अपनी पसंद की भाषा में अनुवाद कर सकते हैं, लेकिन मूल भाषा में वापस स्विच करना याद रखें, क्योंकि एक अनुवाद कैटलॉग सक्रिय करने के लिए प्रति-थ्रेड आधार पर किया जाता है और इस तरह के परिवर्तन से उसी थ्रेड में चलने वाले कोड को प्रभावित किया जाएगा । भाषा स्विच करने के लिए

+2

हाँ, बस django.utils आयात अनुवाद से 'का उपयोग करें; translation.activate (language_code) ' –

12

आप संदर्भ प्रबंधक का उपयोग कर एक अच्छा तरीका में भाषा के लिए मजबूर कर सकते हैं:

class force_lang: 
    def __init__(self, new_lang): 
     self.new_lang = new_lang 
     self.old_lang = translation.get_language() 
    def __enter__(self): 
     translation.activate(self.new_lang) 
    def __exit__(self, type, value, tb): 
     translation.activate(self.old_lang) 

तो फिर तुम with कथन का उपयोग कर सकते हैं:

with force_lang('en'): 
    ... 
+12

अब इसे अनुवाद.ऑनराइड क्लास में शामिल किया गया है। 'transl.override ('en') के साथ:' –

25

रूप @SteveMayne टिप्पणी में बताया (लेकिन यह एक जवाब के लायक), अब आप संदर्भ प्रबंधक translation.override (Django 1.6 के साथ काम करता है, पिछले संस्करणों के साथ जांच नहीं किया था):

from django.utils import translation 
print(_("Hello")) # Will print to Hello if default = 'en' 

# Make a block where the language will be Danish 
with translation.override('dk'): 
    print(_("Hello")) # print "Hej" 

यह मूल रूप से @bitrut उत्तर की तुलना में एक ही चीज़ का उपयोग करता है लेकिन यह Django में अंतर्निहित है, इसलिए यह कम निर्भरता बनाता है ...

+1

यह कम से कम Django 1.4 पर वापस वापस आ गया है! – Anentropic

+0

ओवरराइड अधिक असफलता है, क्योंकि आपको अपनी सामग्री करने के बाद मूल भाषा सेट करने के बारे में सोचना नहीं है! – benzkji

5

django-i18next (https://pypi.python.org/pypi/django-i18next) का उपयोग करके यह काफी आसान है।

templatetags लोड करें। जो कुछ के लिए

{% load i18n i18next %} 

निम्नलिखित कोड बलों डच स्थान overridelocale ब्लॉक के अंदर डाल दिया है। जो कुछ के लिए

{% overridelocale 'nl' %} 
    <p> 
     <a href="/login/">{% trans "Log in" %}</a> 
    </p> 
{% endoverridelocale %} 

निम्नलिखित कोड बलों रूसी लोकेल overridelocale ब्लॉक के अंदर डाल दिया है।

{% overridelocale 'ru' %} 
    <p> 
     <a href="/login/">{% trans "Log in" %}</a> 
    </p> 
{% endoverridelocale %} 

निम्नलिखित कोड बलों अंग्रेजी स्थान जो कुछ के लिए overridelocale ब्लॉक के अंदर डाल दिया है।

{% overridelocale 'en' %} 
    <p> 
     <a href="/login/">{% trans "Log in" %}</a> 
    </p> 
{% endoverridelocale %} 
संबंधित मुद्दे