Django中如何实现Model存储的动态通知文本字段内容的多语言翻译
动态存储字段值多语言翻译实现方案
核心思路是不将翻译完成的静态字符串存入数据库,改为存储可翻译的模板标识与动态参数,在读取通知内容时根据用户当前的语言环境动态生成翻译后的文本,兼容你现有项目的多语言翻译流程。
步骤1:调整Notification模型结构
替换原直接存储文本的text字段,新增模板标识、参数存储字段,新增动态翻译属性:
from django.db import models from django.contrib.auth.models import User import json class Notification(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE,null=True, blank=True) date = models.DateTimeField(auto_now_add=True) # 新增字段:存储翻译模板的原始字符串 msg_key = models.CharField(max_length=100) # 新增字段:存储金额这类动态参数 msg_params = models.JSONField(default=dict) read = models.BooleanField(default=False) @property def text(self): # 读取时根据当前语言环境动态翻译 from django.utils.translation import gettext as _ return _(self.msg_key) % self.msg_params
如果需要兼容历史数据,可保留原text字段,在property中做兼容判断即可。
步骤2:修改视图创建通知的逻辑
不再直接拼接存储完整文本,改为存储模板和参数:
def payment_confirmation(request): if request.method == 'POST': form = paymentForm(request.POST) if form.is_valid(): amount= float(form.cleaned_data['amount']) form.save() notify = Notification.objects.create( user = request.user, msg_key = "%(amount)s $ is added to your wallet", msg_params = {"amount": amount} ) trans = _('Recharge Completed successfully') messages.success(request,trans) return redirect('my_wallet') return HttpResponse("completed")
步骤3:更新翻译配置
所有通知的模板字符串需要被makemessages命令识别,你可以新建一个专门的文件统一管理所有通知模板:
# notifications/translation_strings.py from django.utils.translation import gettext_lazy as _ # 所有通知模板统一写在这里,makemessages会自动扫描 NOTIFICATION_TEMPLATES = [ _("%(amount)s $ is added to your wallet"), # 后续新增的通知模板都加到此列表即可 ]
之后执行python manage.py makemessages、python manage.py compilemessages的流程和你之前翻译静态内容完全一致,正常翻译对应字符串即可。
步骤4:使用方式不变
原有显示通知的代码不需要修改,直接调用notification.text就能拿到对应用户语言的翻译后内容。
备选方案(适合不需要支持用户切换语言的场景)
如果你的业务允许用户切换语言后历史通知不跟着切换语言,可以直接使用django-modeltranslation库给text字段配置多语言版本,创建通知时按当前用户的语言存入对应版本即可,优点是读取性能更高,缺点是历史通知不会随用户语言设置变化更新。
内容的提问来源于stack exchange,提问作者YahyaST18
相关产品推荐
相关产品推荐

