2011-03-10 7 views
11

사용자에게 전자 메일을 보내는 작업자 프로세스를 사용하는 장고 프로젝트가 있습니다. 작업자 프로세스는 rabbitmq 서버를 청취하고 보낼 전자 메일, 템플릿 변수, 보낼 전자 메일 주소 등에 대한 모든 세부 정보를 가져옵니다. 전자 메일 본문은 장고 템플릿 및 render_to_string으로 작성됩니다.Django는 코드 블록을 위해 언어를 변환하여 하나의 언어로 번역합니다.

그러나 국제화하고 싶습니다. 일부 사용자는 영어로 웹 사이트를 사용하고 일부는 다른 언어로 사용하려고합니다. 그들은 그들의 언어로 이메일을 받아야합니다. 전자 메일 제목과 전자 메일 본문에 _(...) 또는 {% blocktrans %} resp가 포함되도록 전자 메일 작업자 프로세스 (django.utils.translations.ugettext/ugettext_lazy 사용)를 시도했습니다.

그러나 전자 메일은 다른 백그라운드 작업자 프로세스에서 렌더링되고 전송되기 때문에 보통 django language detection process이 적용되지 않습니다. 사용자 세션이 없으며 쿠키를 볼 수도없고 http 헤더를 볼 수도 없습니다. rabbitmq 서버에 메시지를 보낼 때 언어 코드를 저장할 수 있습니다.

django/gettext에게 한 번에 해당 언어를 사용하도록 지시하려면 어떻게해야합니까?

전자 메일을 보냅니다 내 기능은 다음과 같습니다

나는 _() 해당 언어 코드를 사용할 수 있도록 특정 언어 코드에 장고 번역/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") 

?

답변

12

간단한 방법이다

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

는이 프로세스/스레드의 실행 나머지의 컨텍스트 변화와 같은이 자르 될.

+2

'django.utils.translation'에는 종료시 원래의 로켈을 자동으로 재설정하는 'override (lang)'컨텍스트 관리자가 있습니다. –

1

은 밝혀 the django docs explain how :

장고 전망 및 템플릿에 사용되는 국제화의 다양한 툴을 제공하지만

, 그것은 장고 특정 코드의 사용을 제한하지 않습니다. Django 번역 메커니즘은 Django가 지원하는 언어로 임의의 텍스트를 번역하는 데 사용될 수 있습니다 (적절한 번역 카탈로그가 존재하는 한). 번역 카탈로그를로드하고 활성화 한 다음 선택한 언어로 텍스트를 번역 할 수 있지만 원래 언어로 전환해야합니다. 번역 카탈로그 활성화는 스레드별로 이루어지며 이러한 변경은 동일한 스레드에서 실행되는 코드에 영향을 미칩니다 . 언어를 전환

+2

예,'django.utils import translation; 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 문을 사용할 수 있습니다 : @SteveMayne 코멘트에서 지적

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

이제 translation.override 클래스에 포함됩니다. 'with translation.override ('en') :' –

25

(그러나 그것은 가치 답변), 이제 컨텍스트 관리자 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

적어도 장고 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 %} 
관련 문제