2011-02-28 8 views
13

Estoy buscando una forma sensata de acceder al contenido no traducido de una cadena de caracteres ugettext_lazy. He encontrado dos maneras, pero no estoy feliz con cualquiera de los dos:Acceda al contenido no traducido de ugettext_lazy de Django

the_string = ugettext_lazy('the content') 
the_content = the_string._proxy____args[0] # ewww! 

o

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) 

La primera pieza de código de acceso a un atributo que se ha marcado explícitamente como privada, así que no hay diciendo cuánto tiempo funcionará este código. La segunda solución es demasiado prolija y lenta.

Por supuesto, en el código real, la definición de la cadena ied ugettext_lazy y el código que accede a ella son millas appart.

Respuesta

6

Otras dos opciones. No es muy elegante, pero no api privado y no es lento.

  • Número uno, definir sus propias 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" 
    
  • Número dos: rediseñar su código. Definir mensajes sin traducir por separado de donde se los utiliza:

    gettext = lambda s: s 
    some_text = gettext('Some text') 
    
    lazy_translated = ugettext_lazy(text) 
    untranslated = some_text 
    
5

Esta es la mejor versión de su segunda solución

from django.utils import translation 

the_string = ugettext_lazy('the content') 
with translation.override('en'): 
    content = unicode(the_string) 
+0

Es el mejor cuando la traducción de langauage está activa (francés) y queremos texto 'en' del texto traducido. Gracias. –

0

Usted puede hacer eso (pero no debe):

the_string = ugettext_lazy('the content') 
the_string._proxy____args[0] 
Cuestiones relacionadas