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

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)

是否真的不可能将"翻译"字符串附加到自己身上?

Rob*_*ujo 8

将空字符串添加到代理对象会将其转换为普通字符串.例:

>>> 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)

结果本身在字符串中使用时(通常在模板渲染时),结果中的延迟转换将仅转换为字符串.


Max*_*ant 5

您不能将两个字符串连接在一起,而是创建一个新的字符串(+无论如何,由于字符串是不可变的,因此您的操作已经是这样):

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)


Val*_*sik 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)
Run Code Online (Sandbox Code Playgroud)