복붙노트

[PYTHON] Django 전환, 코드 블록을위한 언어 전환, 하나의 언어로 번역 수행

PYTHON

Django 전환, 코드 블록을위한 언어 전환, 하나의 언어로 번역 수행

나는 사용자에게 이메일을 보내는 작업자 프로세스를 사용하는 장고 프로젝트를 가지고있다. 작업자 프로세스는 rabbitmq 서버를 청취하고 보낼 전자 메일, 템플릿 변수, 보낼 전자 메일 주소 등에 대한 모든 세부 정보를 가져옵니다. 전자 메일 본문은 장고 템플리트 및 render_to_string으로 작성됩니다.

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

그러나 전자 메일은 다른 백그라운드 작업자 프로세스에서 렌더링되고 전송되기 때문에 정상적인 장고 언어 감지 프로세스가 적용되지 않습니다. 사용자 세션이 없으며 쿠키를 볼 수도없고 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 translations / gettext를 특정 언어 코드로 전환하여 _ ()가 해당 언어 코드를 사용하도록하려면 무엇을 넣어야합니까?

해결법

  1. ==============================

    1.언어를 전환하는 가장 간단한 방법은 다음과 같습니다.

    언어를 전환하는 가장 간단한 방법은 다음과 같습니다.

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

    이 프로세스 / 스레드의 나머지 실행에 대한 컨텍스트가 변경됨에 따라주의해야합니다.

  2. ==============================

    2.@SteveMayne이 주석에서 지적했듯이 (이제는 대답할만한 가치가있다.) 컨텍스트 관리자 translator.override (Django 1.6에서 작동하며 이전 버전에서는 확인하지 않았다)를 사용할 수있다.

    @SteveMayne이 주석에서 지적했듯이 (이제는 대답할만한 가치가있다.) 컨텍스트 관리자 translator.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에 내장되어있어 의존성을 줄입니다 ...

  3. ==============================

    3.컨텍스트 관리자를 사용하여 좋은 방법으로 언어를 강제 할 수 있습니다.

    컨텍스트 관리자를 사용하여 좋은 방법으로 언어를 강제 할 수 있습니다.

    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 force_lang('en'):
        ...
    
  4. ==============================

    4.django-i18next (https://pypi.python.org/pypi/django-i18next)를 사용하면 간단합니다.

    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 %}
    
  5. ==============================

    5.django 문서 설명 방법을 설명합니다.

    django 문서 설명 방법을 설명합니다.

  6. from https://stackoverflow.com/questions/5258715/django-switching-for-a-block-of-code-switch-the-language-so-translations-are-d by cc-by-sa and MIT license