无法使用gettext将翻译字符串附加到自身
下面的代码没有正常工作
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'