【问题标题】:What's the purpose of ugettext_noop in Django?Django 中 ugettext_noop 的目的是什么?
【发布时间】:2017-03-29 04:52:57
【问题描述】:

正如this section of Translation | Django documentation 中提到的,函数ugettext_noop 是一个用于国际化的实用函数:

ugettext_noop(消息)

标记要翻译的字符串,但现在不翻译。这个可以 用于将字符串存储在应该保留在 基础语言(因为它们可能在外部使用)并且将是 稍后翻译。

另外,this answer 提供了一个使用示例:

import logging
from django.http import HttpResponse
from django.utils.translation import ugettext as _, ugettext_noop as _noop

def view(request):
    msg = _noop("An error has occurred")
    logging.error(msg)
    return HttpResponse(_(msg))

尽管有这些文档,但我仍然不明白为什么要将字符串标记为可提取以进行翻译。对我来说ugettext_noop似乎只是一个提醒,即便如此,提醒程序员一些字符串(在这种情况下为msg)稍后翻译的目的是什么?

【问题讨论】:

    标签: python django internationalization translation django-i18n


    【解决方案1】:

    一旦我有一项任务来制作事件日志并将其消息存储在数据库中。它必须支持 i18n。所以首先我用ugettext_noop 函数标记了所有事件日志消息。在这种情况下,它们在添加到数据库之前没有被翻译。但同时它们被添加到 *.po 文件中。

    在此示例中,ugettextugettext_lazy 函数应仅在从数据库中提取消息后使用。

    【讨论】:

    • 如果消息在添加到数据库之前没有被翻译,那你为什么用ugettext_noop标记它们呢?同样,在上面的例子中,为什么不直接写msg = "An error has occurred"
    • 如果我不使用 ugettext_noop 标记它,它们将不会被写入 *.po 文件。当我需要首先翻译消息时,我从数据库中获取适当的行,然后执行以下操作: ugettext(event_log_row.msg) 所以以这种方式使用ugettext 不会在 *.po 文件中添加 msg。跨度>
    • 所以msg 不会出现在.po 文件中的原因是它作为变量而不是字符串文字传递给ugettext,所以django-admin makemessages 不会能够检测到它。用ugettext_noop 包装字符串文字可以解决这个问题。我说的对吗?
    • 但是当您使用该函数时,它会将文本添加到.po 文件中。但是,如果您稍后删除文本,则 po 文件中的翻译也会被删除。这意味着我们必须在代码中保持“可见”ugettext_noop() 函数。如果我按照你的例子:(1)你用ugettext_noop()包裹了每个字符串,所以你在.po文件中有这个。 (2)您将所有字符串移入数据库(3)当您从数据库中读取时,您调用ugettext_lazy() 进行翻译。这没关系,但是你对用ugettext_noop() 包裹的所有字符串做了什么?你不能删除它们吧?
    • 当然,如果你删除ugettext_noop,那么适当的字符串将从.po文件中删除。
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 2015-06-23
    • 2011-11-14
    • 1970-01-01
    • 2018-04-05
    • 2011-05-26
    相关资源
    最近更新 更多