Erw*_*wan 8 python django gettext
以下代码无效
from django.utils.translation import gettext_lazy as _
stringtest=_("First string")
stringtest= stringtest + _(" Second string")
print stringtest
Run Code Online (Sandbox Code Playgroud)
我得到以下异常:
cannot concatenate 'str' and '__proxy__' objects
Run Code Online (Sandbox Code Playgroud)
是否真的不可能将"翻译"字符串附加到自己身上?
将空字符串添加到代理对象会将其转换为普通字符串.例:
>>> ugettext_lazy("The Beatles frontmen") + ""
u'The Beatles frontmen'
Run Code Online (Sandbox Code Playgroud)
但是如果你需要连接多个代理,那么每个代理(除了第一个)都需要首先转换为字符串,例如:
>>> ugettext_lazy("The Beatles frontmen ") + (ugettext_lazy('John Lennon') + " ")
+ (ugettext_lazy('played guitar') + "")
u'The Beatles frontmen John Lennon played guitar'
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
结果本身在字符串中使用时(通常在模板渲染时),结果中的延迟转换将仅转换为字符串.
您不能将两个字符串连接在一起,而是创建一个新的字符串(+无论如何,由于字符串是不可变的,因此您的操作已经是这样):
from django.utils.translation import gettext_lazy as _
stringtest = _("First string")
stringtest = "%s %s" % (stringtest, _(" Second string"))
print stringtest
Run Code Online (Sandbox Code Playgroud)
问题是gettext_lazy返回一个代理对象,因为它通常用于转换类定义中的字符串(例如,在models属性中),而不能像现在所做的那样设计用于视图代码中。代理对象具有将其转换为str对象的方法,但是它不是字符串。
如果您确实不需要这种_lazy特性,则可以gettext在视图中使用它,它返回纯字符串:
>>> from django.utils.translation import gettext as _
>>> _("str1 ") + _("str2")
'str1 str2'
Run Code Online (Sandbox Code Playgroud)
我们可以使用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)
Run Code Online (Sandbox Code Playgroud)