2011-02-28 47 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]