Не удалось добавить переведенную строку к себе с помощью gettext

следующий код не работает

from django.utils.translation import gettext_lazy as _ 

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

Я получаю следующее исключение:

cannot concatenate 'str' and '__proxy__' objects

действительно ли невозможно добавить" переведенную " строку к себе ?

2 ответов


вы не можете объединить две строки, но создать новую (что уже имеет место с вашим + операция в любом случае, так как строка неизменяема):

from django.utils.translation import gettext_lazy as _ 

stringtest = _("First string")
stringtest = "%s %s" % (stringtest, _(" Second string"))
print stringtest

проблема gettext_lazy возвращает прокси-объект, так как он обычно используется для перевода строки в определении класса (в атрибуте models для exemple) и не предназначен для использования в коде представления, как вы делаете прямо сейчас. Прокси-объект имеет метод, чтобы перевести его в str объект, но это не строка.

Если вам это действительно не нужно _lazy специфичность, вы можете просто использовать gettext в ваших представлениях, который возвращает простую строку:

>>> from django.utils.translation import gettext as _
>>> _("str1 ") + _("str2")
'str1 str2'

Если вам действительно нужно объединить ленивые переводимые строки, django поддерживает это:

можно использовать Джанго.а utils.перевод.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)

ленивые переводы в результате будут преобразованы только в строки, когда сам результат используется в строке (обычно при рендеринге шаблонов время.)

EDIT:

Я нашел более простое и легко запоминающееся решение проблемы - добавление пустой строки в прокси-объект преобразует его в обычную строку. Пример:

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