2014-12-04 81 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

相关问题