【问题标题】:Unable to append a translated string to himself with gettext无法使用 gettext 将翻译后的字符串附加到自己
【发布时间】:2014-05-17 09:28:25
【问题描述】:

以下代码不起作用

from django.utils.translation import gettext_lazy as _ 

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

我得到以下异常:

cannot concatenate 'str' and '__proxy__' objects

真的不可能给自己附加一个“翻译”的字符串吗?

【问题讨论】:

  • 有什么异常?
  • @KrzysztofSzularz 我收到了cannot concatenate 'str' and '__proxy__' objects error
  • 这在 Django 4 中发生了变化:现在上面的工作,但它立即转换为str

标签: python django gettext


【解决方案1】:

您不能连接两个字符串,而是创建一个新字符串(无论如何,您的 + 操作已经是这种情况,因为字符串是不可变的):

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】:

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

    >>> 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 的替代方案

    对于 django 2.0,这将不起作用 - string_concat 在 Django 2.0 中被删除(感谢@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)
    

    结果中的惰性翻译只会在以下情况下转换为字符串 结果本身在字符串中使用(通常在模板渲染中 时间)。

    【讨论】:

    • 你为什么要翻译约翰列侬 ;) (开个玩笑,很好的答案:))
    • FWIW, string_concat 在 Django 2.0 中被删除。
    【解决方案3】:

    我们可以使用 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2012-09-13
      • 2015-06-04
      相关资源
      最近更新 更多