如何避免依赖名称与python中的全局转换函数_()冲突?

时间:2014-09-12 17:47:43

标签: localization wxpython

我正在尝试国际化/翻译一个以wx.App()实现的python应用程序。我的工作大部分都在工作 - 我在正确的地方看到翻译。但是有一个显示停止错误:在难以预测的时间崩溃,例如:

Traceback: ...
    self.SetStatusText(_('text to be translated here'))
TypeError: 'numpy.ndarray' object is not callable

我怀疑应用程序的一个或多个依赖项(有很多)正在破坏全局翻译函数_()。一种可能的方法是在解包元组时使用_作为虚拟变量的名称(这是相当普遍的做法)。我确定它不是我的应用程序正在这样做,所以我怀疑它的依赖性。有没有办法“捍卫”这个,或以其他方式处理这个问题?

我怀疑这是一种常见的情况,因此人们已经研究出如何正确处理它。否则,我会使用非标准名称,例如_translate,而不是_。我认为这样可行,但更冗长,更难阅读。例如,

1 个答案:

答案 0 :(得分:0)

从上面我看不出有什么问题。

在我的wxPython应用程序中没有I18N的问题我确实使用matplotlib和numpy(不广泛)。

您能否提供完整的追溯和/或一个显示问题的小型可运行样本。

顺便说一句,你有没有在wxPython凤凰文档中看到这个页面,最后给出了一些其他的参考资料。 wxpython.org/Phoenix/docs/html/internationalization.html

啊哈,如果翻译有效,那么你会遇到Python窃取“”的问题,你可以通过这样做来解决这个问题:

安装自定义displayhook以防止Python将global _(下划线)设置为上次计算的表达式的值。如果我们不这样做,我们的_到gettext的映射可能会被覆盖。这在使用PyShell的交互式调试中很有用/需要。

通过在App模块中定义来执行此操作:

def _displayHook(obj):
    """Custom display hook to prevent Python stealing '_'."""
    if obj is not None:
        print repr(obj)

然后在你的wx.App.OnInit方法中执行:

# work around for Python stealing "_"
sys.displayhook = _displayHook