Доступ к нетранслированному содержимому Django ugettext_lazy
Я ищу разумный способ перейти к нетранслированному контенту строки ugettext_lazy
. Я нашел два пути, но я не доволен одним из них:
the_string = ugettext_lazy('the content')
the_content = the_string._proxy____args[0] # ewww!
или
from django.utils.translation import activate, get_language
from django.utils.encoding import force_unicode
the_string = ugettext_lazy('the content')
current_lang = get_language()
activate('en')
the_content = force_unicode(the_string)
activate(current_lang)
Первая часть кода обращается к атрибуту, который явно помечен как закрытый, поэтому не известно, как долго этот код будет работать. Второе решение слишком многословно и медленно.
Конечно, в реальном коде определение строки ugettext_lazy
и кода, который обращается к нему, находится в милях.
Ответы
Ответ 1
Еще два варианта. Не очень элегантный, но не закрытый апи и не медленный.
-
Номер один, укажите свой собственный ugettext_lazy:
from django.utils import translation
def ugettext_lazy(str):
t = translation.ugettext_lazy(str)
t.message = str
return t
>>> text = ugettext_lazy('Yes')
>>> text.message
"Yes"
>>> activate('lt')
>>> unicode(text)
u"Taip"
>>> activate('en')
>>>> unicode(text)
u"Yes"
-
Номер два: переработайте свой код. Определите нетранслируемые сообщения отдельно от того, где вы их используете:
gettext = lambda s: s
some_text = gettext('Some text')
lazy_translated = ugettext_lazy(text)
untranslated = some_text
Ответ 2
Это лучшая версия вашего второго решения
from django.utils import translation
the_string = ugettext_lazy('the content')
with translation.override('en'):
content = unicode(the_string)
Ответ 3
Вы можете сделать это (но не должны):
the_string = ugettext_lazy('the content')
the_string._proxy____args[0]