How do I explicitly specify language of email I want to send?

倾然丶 夕夏残阳落幕 提交于 2021-01-27 13:17:23

问题


I have a custom user model that have a preferred_language field. I want all the emails (activation and password reset) to be sent translated to the language that user specified in profile.

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

    preferred_language = models.PositiveSmallIntegerField(choices=LANGUAGE_CHOICES, default=2,
                                                          verbose_name=_("Preferred language"))

I thought about setting custom email class but didn't saw in navive djoser's classes any points where I could explicitly set the language of outcome emails despite of ready-to-be-translated style of email templates:

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

Reset password view (which's refference is settings.EMAIL.activation used in ActivationEmail class above):

class ResetPassword(ActionViewMixin, generics.GenericAPIView):
    ...

    def send_password_reset_email(self, user):
        context = {'user': user}
        to = [get_user_email(user)]
        settings.EMAIL.password_reset(self.request, context).send(to)

    def send_activation_email(self, user):
        context = {'user': user}
        to = [get_user_email(user)]
        settings.EMAIL.activation(self.request, context).send(to)

回答1:


In your case I would use the override context manager that stores the current language on enter (in order to sent the email) and restores it on exit.

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)


来源:https://stackoverflow.com/questions/58146547/how-do-i-explicitly-specify-language-of-email-i-want-to-send

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!