2014-12-04 82 views
2

我知道如何讓Python本地化函數的輸出,至少涉及到任何字符串。這裏有很多很好的問題。我想做一些更愚蠢的事情,但也更基本。是否可以在Python中翻譯函數,方法等?

實際上,大多數(流行的)語言都是這種或那種英語的障礙。好的,我們處理這個問題。但是當創建我的自己的的東西呢?

class Tomato: 
    def __init__(self,color): 
     self.color = color 

令人高興的是,我可以再做

> T = Tomato('red') 
> T.color 
'red' 

假設我要本地化不夠出彩的名字,但color本身 - 或Tomato。所以別人可以做,例如在德國

> T = Tomate('rot') 
> T.farbe 
'rot' 

不必懂英語,或者,讓我有寫僅暴露串到用戶的一些應用程序接口。

如何將一個人包裹在gettext或朋友的原始東西?它甚至有可能嗎?我假設答案是否定的,否則我會找到答案。但是......有什麼語言可以支持這種事情嗎?這看起來非常有用。 (如果這是一個愚蠢的問題,請不要欺騙我,相反,請解釋爲什麼這種事情似乎甚至不在雷達屏幕上。)

+0

「是否有一個能夠支持這個任何語言?」是的,Perl:https://metacpan.org/pod/Lingua::tlhInganHol::Ighun – davidism 2014-12-04 05:56:24

+0

對於那些投票結束 - 嗯,爲什麼?這不是一個合法的編程問題?如果這是一個重複,我很樂意遵守這一點。 – kcrisman 2014-12-04 15:32:56

回答

3

是的,不知道你可以做出這種動態,但下面就來看看:

怪異的類型()行爲是由

http://www.jeffknupp.com/blog/2013/12/28/improve-your-python-metaclasses-and-dynamic-classes-with-type/

class Tomato(object): 
    def __init__(self,color): 
     self.color = color 
T = Tomato('red') 
T.color 


di_trad = {"Tomato": "Tomate"} 

def xlator(self, attrname): 
    di = {"farbe":"color"} 
    attr_eng = di.get(attrname,attrname) 
    return getattr(self, attr_eng) 

這個工程......但僅僅是因爲TOMATE是硬編碼......你不會想要做的啓發這個,但它是向你展示基本的想法。

Tomate = type("Tomate",(Tomato,),dict(__getattr__=xlator)) 
t = Tomate('rot') 
print t.farbe 

#to me this is the weak point ... emitting arbitrary dynamic classnames 
#into the current module. mind you, we really want to do this against 
#say an import german module... 
# and we want to allow drive which classes we translate dynamically as well 

下面是同樣的動態世代,但沒有關於Tomato或Tomate的編碼。通過循環字典並分配給翻譯支持模塊,您可以推動翻譯。

di_class_trad = {"Tomato" :"Tomate"} 

import german 
for engname, tradname in di_class_trad.items(): 
    cls_ = globals().get(engname) 
    setattr(german, tradname, type(tradname,(cls_,),dict(__getattr__=xlator))) 
    #in any case 

t2 = german.Tomate("blau") 
print t2.farbe 

,輸出:

腐 布勞

順便說一句,在german.py的內容,上面只是:

pass 

而且,翻譯程序是由字典驅動的,所以理論上它非常有活力。

我會將所有屬性保留在一個字典中,而不是每個類字典。然後,當你通過farbe/color,height /höhe,width/breite翻譯對時,你需要檢查翻譯類(番茄)是否具有該屬性(寬度),然後將它的翻譯分配給類Tomate。

關於動態屬性,這是對Sublime Text作爲屬性框架生成的調整。如果您對xlator詞典循環開着它和分配的財產,以目標類,誰知道,它可能工作...

def farbe(): 
    doc = "The farbe property." 
    def fget(self): 
     return self.color 
    def fset(self, value): 
     self.color = value 
    def fdel(self): 
     del self.color 
    return locals() 


#farbe = property(**farbe()) 
#would this work? 
setattr(tgt_class,"farbe", property(**farbe())) 

可愛的,但同樣,不知道有多少真正的使用,這將是,除非您將實際的用戶可見翻譯功能保留爲非常基本的操作。這可能有助於將Tomate分配給類型調用中的第二個祖先類,以添加一些大腦以保持理智。

setattr(german, tradname, type(tradname,(cls_,SanityManagerClass),dict(__getattr__=xlator)) 
+4

有趣嗎?是。實際的。 Glaube Ich nicht。 – 2014-12-04 06:19:43

+0

非常有趣(第二種方式),謝謝。你認爲有可能*沒有*德文模塊*和硬編碼嗎?我不假設。 – kcrisman 2014-12-04 15:34:27

+0

我不知道如何在當前模塊的名稱空間中設置新類,我認爲使用語言模塊更清潔。回覆。硬編碼,如果你忽視Tomate直接設置的第一個探索性部分,實際上有限的編碼 - 事情是由2個字典驅動的。我認爲真正的缺點是:Tomate的farb無法通過目錄(Tomate)發現(可能動態生成屬性會這樣做),翻譯會掩蓋原始類/屬性名稱,並且支持僅限於獲取屬性(再次屬性可以幫助)。請記住 – 2014-12-04 17:46:48

相關問題