如何使用Django和pgetttext()在.po文件中获取msgctxt



我正在为一个有英语和西班牙语的预订应用程序编写通知模块。它应该足够灵活,可以处理任何模型和任何状态更改(例如创建、更新、取消等(。

get_subject((函数将使用相关对象的模型名称(例如Appointment(和状态谓词为通知准备一行"subject"。因此,我们应该修改"Appointment 123ABC"或创建"Payment 789XYZ"等。除了考虑西班牙语单词的语法性别外,我还让它在翻译方面发挥作用。因此,"预约123ABC修改"将是"引用a123ABC实施a",而"付款123ABC修改的"将是'Pago123 ABC实施o'。

我知道解决方案是在.po文件中使用pgettext(context,string(和msgctxt,但我不知道如何在准备.po文件时获得manage.py makemessages来添加msgctxt。

我尝试了各种直接编辑.po的方法,但在运行compilemessages时遇到了错误(执行msgfmt失败:backend/loce/es/LC_MESSAGES/django.po:3966:重复的消息定义…(,makemessages无论如何都会覆盖我的编辑。

我不确定我所需要的是po文件的正确格式,还是我需要正确的方式来让makemessages正常工作。任何帮助都将不胜感激。

class Notification(Uuidable, Timestampable):
user = models.ForeignKey(User, related_name='notifications', verbose_name=_('notifications'), on_delete=models.CASCADE)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True)
object_id = models.UUIDField(blank=True, null=True)
content_object = GenericForeignKey('content_type', 'object_id')
subject = models.CharField(max_length=256, verbose_name=_('subject'))
status_type = models.CharField(choices=NOTIFICACTION_STATUS_VERBS, max_length=256, verbose_name=_('status type'))
details = models.TextField(null=True, blank=True, verbose_name=_('details'))
read_at = models.DateTimeField(null=True, blank=True, verbose_name=_('read at'))
email_sent_at = models.DateTimeField(null=True, blank=True, verbose_name=_('email sent at'))
pusher_sent_at = models.DateTimeField(null=True, blank=True, verbose_name=_('pusher sent at'))
def generate_subject(self):
class_name = self.content_object._meta.verbose_name
context = str(class_name).lower()
with translation.override(self.user.locale.split('-')[0]):
class_name_translated = translation.gettext(class_name).capitalize()
status_translated = translation.pgettext(context, str(self.status_type))
subject = f'{class_name_translated} {self.content_object.display_id} {status_translated}'
return subject
def __str__(self):
return self.subject
def get_email_template(self, template_type):
return NOTIFICATION_EMAIL_TEMPLATES[self.content_object.__class__.__name__][self.status_type][template_type]
def save(self, *args, **kwargs):
self.subject = _(self.generate_subject())
return super(Notification, self).save(*args, **kwargs)

来自msgfmt的错误消息表明您对.po文件中的msgctxt使用了错误的语法。它应该是这样的:

msgctxt "abbreviated_weekday"
msgid "Sun"
msgstr ""

但是应该提取字符串,而不是操作.po文件。解决方案是生成一个伪源文件,其中包含对pgettext()的所有必需调用,以便makemessages正确地提取消息。

在您的代码中,对pgettext()的调用在变量中具有消息上下文,而不是字符串文本,当然,xgettext()会忽略此类调用。

最新更新