【问题标题】:How do I explicitly specify language of email I want to send?如何明确指定要发送的电子邮件的语言?
【发布时间】:2019-09-28 12:57:00
【问题描述】:

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

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):

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)

【问题讨论】:

  • 邮件什么时候发送给用户?单击按钮后或与网站交互后自动(例如交易、时事通讯、注册等?)。
  • 注册后点击“密码重置按钮”。我使用 djoser 端点。
  • 免责声明:我从未使用过djoser。您是否介意显示实际发送电子邮件的文件(可能是views.py)或djoser 自动执行此操作并且您想在发送电子邮件之前设置语言?
  • 是的,我已经在问题的底部提供了它
  • 我认为您的电子邮件模板(.txt.html)包含标记为翻译的字符串(即它们包含 {% trans "text" %} 等),对吧?

标签: email internationalization django-i18n djoser


【解决方案1】:

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

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)

【讨论】:

  • 非常感谢!这周我会试一试,如果一切顺利的话,我会给你一个赏金!
  • 这与赏金无关。它是关于让它工作!等待好消息!
  • 一周后放假回来实施。
  • 哦!好的!瓦西里节日快乐。对不起,我不知道。玩得开心!
  • 很高兴我能提供帮助!事实上,我的电子邮件也遇到了同样的问题,我用一种更复杂的方式来实现它,直到我找到了这个方便的上下文管理器,现在很多样板代码已经消失了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
相关资源
最近更新 更多