【问题标题】:Is it possible to translate function, methods, etc. in Python?是否可以在 Python 中翻译函数、方法等?
【发布时间】:2014-12-04 05:15:12
【问题描述】:

我知道如何让 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 或朋友中来做 ?甚至可能吗?我假设答案是否定的,否则我会找到的。但是......是否有任何语言可以支持这种事情?这似乎非常有用。 (如果这是一个愚蠢的问题,请不要嘲笑我,而是请解释为什么这种事情似乎甚至不在雷达屏幕上。)

【问题讨论】:

    标签: python localization internationalization gettext


    【解决方案1】:

    是的,不知道你能做到多动态,但看看这里:

    奇怪的 type() 行为是受

    启发的

    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 的硬编码。与上面的想法相同,但是您通过循环遍历 dict 并分配给翻译支持模块来驱动翻译。

    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 翻译对时,您需要在将翻译 breite 分配给 Tomate 类之前检查翻译的类 (Tomato) 是否具有该属性 (width)。

    关于动态属性,这是对 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))
    

    【讨论】:

    • 有趣吗?是的。实际的。 Glaube Ich nicht。
    • 非常有趣(第二种方式),谢谢。你认为有可能没有 german 模块 硬编码吗?我想不会。
    • 我不知道如何将新类设置到当前模块的命名空间中,我认为使用语言模块更干净。关于。硬编码,如果您忽略直接设置 Tomate 的第一个探索部分,实际上硬编码是有限的 - 事情是由 2 个字典驱动的。我认为真正的缺点是:无法通过 dir(Tomate) 发现 Tomate 的 farb(也许动态生成属性会这样做),存在翻译掩盖原始类/属性名称的风险,并且支持仅限于获取属性(再次属性可能会有所帮助)。
    • 请记住。 “import German”也可以用动态模块加载器代替。即 tgt_module = import_translation("german")。海龟一路向下。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 2014-01-30
    • 1970-01-01
    • 2023-04-10
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多