Adding empty string to proxy object will convert it to normal string. Example:
>>> ugettext_lazy("The Beatles frontmen") + ""
u'The Beatles frontmen'
but if you need to concatenate several proxies, then each of them (except first) needs to be converted to string first, example:
>>> ugettext_lazy("The Beatles frontmen ") + (ugettext_lazy('John Lennon') + " ")
+ (ugettext_lazy('played guitar') + "")
u'The Beatles frontmen John Lennon played guitar'
Alternative for Django <=1.9
For django 2.0 this won't work - string_concat is removed in Django 2.0 (thanks to @Dzhuang).
If you really need to concatenate lazy translatable strings, django supports this:
you can use django.utils.translation.string_concat(), which creates a
lazy object that concatenates its contents and converts them to
strings only when the result is included in a string. For example:
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)
the lazy translations in result will only be converted to strings when
result itself is used in a string (usually at template rendering
time).