Email 如何明确指定要发送的电子邮件的语言?

Email 如何明确指定要发送的电子邮件的语言?,email,internationalization,django-i18n,djoser,Email,Internationalization,Django I18n,Djoser,我有一个自定义的用户模型,它有一个首选语言字段。我希望所有的电子邮件(激活和密码重置)被发送到翻译成语言,用户指定的配置文件 class CustomUser(AbstractBaseUser, PermissionsMixin): ... LANGUAGE_CHOICES = ( (1, "English"), (2, "Русский") ) preferred_language = models.PositiveSmallI

我有一个自定义的用户模型,它有一个
首选语言
字段。我希望所有的电子邮件(激活和密码重置)被发送到翻译成语言,用户指定的配置文件

class CustomUser(AbstractBaseUser, PermissionsMixin):
    ...
    LANGUAGE_CHOICES = (
        (1, "English"),
        (2, "Русский")
    )

    preferred_language = models.PositiveSmallIntegerField(choices=LANGUAGE_CHOICES, default=2,
                                                          verbose_name=_("Preferred language"))
我曾考虑过设置自定义电子邮件类,但在navive djoser的类中,我没有看到任何可以明确设置结果电子邮件语言的点,尽管电子邮件模板具有随时可翻译的风格:

class ActivationEmail(BaseEmailMessage):
    template_name = 'email/activation.html'

    def get_context_data(self):
        context = super(ActivationEmail, self).get_context_data()

        user = context.get('user')
        context['uid'] = utils.encode_uid(user.pk)
        context['token'] = default_token_generator.make_token(user)
        context['url'] = settings.ACTIVATION_URL.format(**context)
        return context
重置密码视图(其参考是上面ActivationEmail类中使用的
settings.EMAIL.activation
):


在您的情况下,我将使用上下文管理器,它在enter上存储当前语言(以便发送电子邮件),并在退出时恢复

from django.utils import translation


def send_password_reset_email(self, user):
    context = {'user': user}
    to = [get_user_email(user)]
    lang_code = user.lang_code  # retrieve user's language code here
    with translation.override(lang_code):
        settings.EMAIL.password_reset(self.request, context).send(to)

def send_activation_email(self, user):
    context = {'user': user}
    to = [get_user_email(user)]
    lang_code = user.lang_code  # retrieve user's language code here
    with translation.override(lang_code):
        settings.EMAIL.activation(self.request, context).send(to)

何时将电子邮件发送给用户?点击按钮后,或在与网站交互(如交易、通讯、注册等)后自动完成。注册后,点击“密码重置按钮B”。我使用djoser端点。免责声明:我从未使用过
djoser
。您是否介意显示实际发送电子邮件的文件(可能是
views.py
),或者
djoser
会自动执行此操作,并且您希望在发送电子邮件之前设置语言?是的,我已经在问题的底部提供了它。我假定您的电子邮件模板(无论是
.txt
还是
.html
)包含标记为翻译的字符串(即它们包含
{%trans“text”%}
等),对吗?非常感谢!这周我会试试,如果一切顺利的话,我会给你一笔赏金!这与赏金无关。这是关于让它工作!!!等待好消息!我将在一周内从假期回来并实施它。哦!好啊节日快乐,瓦西里。对不起,我不知道。玩得高兴很高兴我能帮忙!事实上,我的电子邮件也有同样的问题,我用了一种更复杂的方法来实现它,直到我找到了这个方便的上下文管理器,很多样板代码都消失了!
from django.utils import translation


def send_password_reset_email(self, user):
    context = {'user': user}
    to = [get_user_email(user)]
    lang_code = user.lang_code  # retrieve user's language code here
    with translation.override(lang_code):
        settings.EMAIL.password_reset(self.request, context).send(to)

def send_activation_email(self, user):
    context = {'user': user}
    to = [get_user_email(user)]
    lang_code = user.lang_code  # retrieve user's language code here
    with translation.override(lang_code):
        settings.EMAIL.activation(self.request, context).send(to)