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

时间:2014-05-17 09:28:26

标签: python django gettext

以下代码无效

from django.utils.translation import gettext_lazy as _ 

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

我得到以下异常:

cannot concatenate 'str' and '__proxy__' objects

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

3 个答案:

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