以下代码无效
from django.utils.translation import gettext_lazy as _
stringtest=_("First string")
stringtest= stringtest + _(" Second string")
print stringtest
我得到以下异常:
cannot concatenate 'str' and '__proxy__' objects
是否真的不可能将“翻译过的”字符串附加到自己身上?
答案 0 :(得分:8)
将空字符串添加到代理对象会将其转换为普通字符串。例如:
>>> 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)
结果中的延迟翻译只会在转换为字符串时 结果本身用于字符串中(通常在模板渲染时使用) 时间)。
答案 1 :(得分:4)
你不能连接你的两个字符串但是创建一个新字符串(无论如何你的+
操作已经是这种情况,因为字符串是不可变的):
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'
答案 2 :(得分:1)
我们可以使用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)