gpt4 book ai didi

Django ugettext_lazy、插值和ChoiceField

转载 作者:行者123 更新时间:2023-12-04 12:10:23 26 4
gpt4 key购买 nike

我想要一个带有这些选择的 ChoiceField:

choices = [(1, '1 thing'),
(2, '2 things'),
(3, '3 things'),
...]

我想翻译它。

这不起作用:
choices = [(i, ungettext_lazy('%s thing', '%s things', i) % i) for i in range(1,4)]

因为一旦惰性对象被插入,它就变成了一个 unicode 对象——因为 ChoiceField.choices 在启动时被评估,它的选择将在 Django 启动期间激活的语言中。

我可以用 ugettext_lazy('%s things' % i) ,但这需要对每个数字进行翻译,这很愚蠢。这样做的正确方法是什么?

最佳答案

在 Django 文档中,TranslationWorking with lazy translation objects ,我在这里看到一条评论,似乎解决了您的疑虑。

Using ugettext_lazy() and ungettext_lazy() to mark strings in models and utility functions is a common operation. When you're working with these objects elsewhere in your code, you should ensure that you don't accidentally convert them to strings, because they should be converted as late as possible (so that the correct locale is in effect). This necessitates the use of the helper function described next.



然后他们呈现 django.utils.functional.lazy(func, *resultclasses) ,目前不包含在 django.utils.functional module documentation 中.然而,根据 django.utils.functional.py source code , 它“将任何可调用对象转换为惰性求值的可调用对象......
每次访问都会评估功能。”

修改他们的 example from Other uses of lazy in delayed translations要合并您的代码,以下代码可能适合您。
from django.utils import six  # Python 3 compatibility
from django.utils.functional import lazy
from django.utils.safestring import mark_safe

choices = [
(i, lazy(
mark_safe(ungettext_lazy('%s thing', '%s things', i) % i),
six.text_type
)# lazy()
for i in range(1,4)
]

另外, django.utils.functional module documentation确实提到了一个函数装饰器 allow_lazy(func, *resultclasses) .这使您可以编写自己的函数,该函数将惰性字符串作为参数。 “它修改了函数,以便如果使用延迟翻译作为第一个参数调用它,则函数评估会延迟,直到需要将其转换为字符串。” lazy(func, *resultclasses)不是装饰器,它修改了一个可调用对象。

注意我还没有在 Django 中尝试过这段代码。我只是传递我在文档中找到的内容。希望它会指向你可以使用的东西。

关于Django ugettext_lazy、插值和ChoiceField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13689710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com