Django异步发送邮件与通知场景下的国际化本地化实现问题
方案1:User模型新增language字段(工业界通用最优方案)
- 用户语言偏好本身就是用户核心属性的一部分,存储在User表完全符合数据模型设计规范,不存在冗余问题,也远比你想象的更优雅
- 落地逻辑无感知:可以在Django中间件中自动读取每次请求的
accept-language头,更新对应用户的language字段,不需要用户手动操作,也不需要修改现有业务逻辑 - 配合Django内置的翻译上下文管理器,异步任务切换语言仅需几行代码:
from django.utils import translation @shared_task def send_notification(user_id): user = User.objects.get(id=user_id) with translation.override(user.language): # 此处所有翻译函数都会自动适配用户偏好语言 content = _("您有一条新通知") # 执行邮件/推送发送逻辑
- 扩展性极强,后续如果要开放用户自定义语言设置功能,直接复用该字段即可,不需要调整底层逻辑
方案2:缓存存储语言偏好(不想修改User模型的替代方案)
- 可以借助你已经部署的Redis存储用户语言偏好,键格式可设置为
user:lang:{user_id},过期时间设为30天 - 同样在Django中间件中,每次用户请求时自动更新对应缓存的
accept-language值 - 定时任务触发时,先从Redis读取对应用户的语言偏好,缓存失效时回退到系统默认语言即可
- 该方案缺点是用户长期不登录的话,缓存失效后只能使用默认语言,数据可靠性低于存储在User表
方案3:翻译逻辑前移(纯前端展示类通知适用)
- 后端发送的通知仅存国际化标识和动态参数,例如
{"msg_key": "new_bulk_email", "params": {"count": 12}},不存翻译后的实际文本 - 不管是浏览器推送还是站内通知,都由前端拉取到内容后,根据当前浏览器语言自行翻译,后端完全不需要处理语言逻辑
- 该方案不适用于邮件类场景,因为邮件内容需要后端直接生成完整文本
内容的提问来源于stack exchange,提问作者Hafnernuss
相关产品推荐
相关产品推荐

