Не удалось добавить переведенную строку к себе с помощью 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'