无法使用gettext将翻译字符串附加到自身

10 投票
4 回答
3983 浏览
提问于 2025-04-18 06:50

下面的代码没有正常工作

from django.utils.translation import gettext_lazy as _ 

stringtest=_("First string")
stringtest= stringtest + _(" Second string")
print stringtest

我遇到了以下错误:

cannot concatenate 'str' and '__proxy__' objects

真的不可以把一个“翻译过的”字符串加到它自己身上吗?

4 个回答

0

Valery Ramusik的回答让我尝试了一下,发现你也可以这样做:

from django.utils.translation import gettext_lazy as _ 

stringtest = f"{_('First string')} {_(' Second string')}"

如果你想避免使用format_lazy()和其他额外的函数。

5

我们可以使用 format_lazy。

from django.utils.text import format_lazy
from django.utils.translation import gettext_lazy as _ 

msgs_to_concat = [_("First string"), _(" Second string")]

stringtest = format_lazy('{}'*len(msgs_to_concat), *msgs_to_concat)
9

把空字符串加到代理对象上会把它变成普通字符串。举个例子:

>>> ugettext_lazy("The Beatles frontmen") + ""
u'The Beatles frontmen'

但是如果你需要把几个代理对象连接在一起,那么除了第一个对象,其他的都需要先转换成字符串,举个例子:

>>> ugettext_lazy("The Beatles frontmen ") + (ugettext_lazy('John Lennon') + " ") 
    + (ugettext_lazy('played guitar') + "")
u'The Beatles frontmen John Lennon played guitar'

对于Django 1.9及以下版本的替代方案

在Django 2.0中,这个方法就不管用了——因为在Django 2.0中移除了string_concat(感谢@Dzhuang)。

如果你真的需要连接懒加载的可翻译字符串,Django提供了这个功能:

你可以使用 django.utils.translation.string_concat(),这个方法会创建一个懒加载对象,它会在内容被使用在字符串中时才把它们连接起来并转换成字符串。举个例子:

from django.utils.translation import string_concat
from django.utils.translation import ugettext_lazy
...
name = ugettext_lazy('John Lennon')
instrument = ugettext_lazy('guitar')
result = string_concat(name, ': ', instrument)

结果中的懒加载翻译只有在结果本身被用作字符串时(通常是在模板渲染的时候)才会被转换成字符串。

9

你不能直接把两个字符串拼接在一起,而是需要创建一个新的字符串(其实你现在用的+操作已经是在创建新字符串了,因为字符串是不可变的):

from django.utils.translation import gettext_lazy as _ 

stringtest = _("First string")
stringtest = "%s %s" % (stringtest, _(" Second string"))
print stringtest

问题在于gettext_lazy返回的是一个代理对象,因为它通常用于在类定义中翻译字符串(比如在模型属性中),并不是为了在视图代码中使用,就像你现在这样。这个代理对象有一个方法可以把它翻译成str对象,但它本身并不是一个字符串。

如果你不需要这个_lazy的特殊功能,你可以在视图中直接使用gettext,它会返回普通的字符串:

>>> from django.utils.translation import gettext as _
>>> _("str1 ") + _("str2")
'str1 str2'

撰写回答