在 Django 中记录不正确的翻译

Zul*_*lan 8 python django localization

gettext我经常遇到在尚未设置实际语言的上下文中使用的错误- 而不是使用适当的gettext_lazy.

这些错误可能很难捕获 - 我希望通过适当的日志记录使它们更加明显,甚至可能引发异常。

  • 编写一个在 的情况下记录错误的包装函数是否正确get_language() is None
  • 当然,我们需要强制始终使用这个包装器 - 引入另一种微妙的容易犯错误的方法。一般来说,我认为可以使用猴子补丁,但如果可能的话我想避免这种情况。整个后面的调度django.util.translation看起来已经比较复杂了。有没有一种干净的方法来将这个功能挂在那里?

pri*_*rre -1

您可以为此使用 Django 的内置检查。Django 提供了一个 check_for_language 函数,如果未设置语言,该函数会引发 LanguageStoreNotAvailable 异常。您可以在代码中使用此函数在调用 gettext 或 gettext_lazy 之前检查该语言的可用性。

from django.utils.translation import check_for_language, gettext

def my_function():
    check_for_language()
    return gettext('Hello, world!')
Run Code Online (Sandbox Code Playgroud)

如果未设置语言,则会引发 LanguageStoreNotAvailable 异常。

或者,您可以使用 Django 的 gettext_lazy 函数,该函数返回一个 TranslatableString 对象,当在模板中呈现该对象或在其上调用 force_text 时,该对象将被翻译。这根本不需要调用 gettext,并确保在设置语言之前不会执行翻译。

from django.utils.translation import gettext_lazy

def my_function():
    return gettext_lazy('Hello, world!')
Run Code Online (Sandbox Code Playgroud)

这将返回一个可在代码或模板中使用的 TranslatableString 对象,并且将在渲染时执行翻译。

总的来说,通常最好尽可能使用 gettext_lazy 以避免需要显式检查语言的可用性。这有助于避免细微的错误并使您的代码更加健壮。

  • @Zulan,也许这个答案是使用 ChatGPT 创建的?这个答案和另一个答案(刚刚被删除)之间有一些可疑的相似之处。 (2认同)