2011-02-28 124 views
13

我正在寻找一种理解ugettext_lazy ied字符串的未翻译内容的理智方法。我发现了两个方法,但我不开心与任何一个:访问Django的未翻译内容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) 

的第一段代码访问已被明确标记为私有属性,因此不存在告诉这段代码能工作多久。第二种解决方案过于冗长和缓慢。

当然,在实际的代码中,字符串的定义和访问它的代码都是英里数。

回答

6

另外两个选项。不是很优雅,但不是私人API,并不慢。

  • 一把手,定义自己的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 
    
5

这是更好的版本你的第二个解决方案的

from django.utils import translation 

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

这是当语言翻译活动(法语)最好的一个,我们希望来自翻译文本的“en”文本。谢谢。 – 2017-08-09 14:06:23

0

你可以做到这一点(但你不应该):

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