我要做的是:我想用一种与gettext兼容的方式,使用''''函数,为我的zmipython脚本启用i18n支持。在
以下是我到目前为止所做的。在Zope产品的一个模块中,我运行:
import gettext, __builtin__
t = gettext.translation('myDomain', LOCALESPATH, languages=['de'], fallback=True)
__builtin__._ = t.gettext
在一个(不受限制的)外部方法中调用_u可以正常工作,它会按预期返回转换。在
^{pr2}$如果我在使用RestrictedPython执行代码的Zope“Script(Python)”中尝试此操作,我会得到一个NameError:“global name''uu'is not defined”。在
这是我的解决方法:
from myModule import myTranslator as _
print _('text to be translated')
return printed
这很好用(当然,Python脚本必须允许使用myModule)。在
但是我很好奇,在受限的python脚本中,是否有一种方法可以将u作为内置函数,以及是否可以在中扩展安全内置函数受限制的Python。守卫. 在
首先,Zope已经以^{} 的形式为您提供了与gettext兼容的i18n包。这已经是Zope本身的一部分,不需要单独安装。在
第二,不要乱搞
__builtin__
;只需将消息工厂导入模块并将其命名为_
。在在您的Zope产品
__init__.py
中,您为此添加了一个消息工厂:现在您有了一个可以导入到任何项目python文件中的消息id工厂,包括受限制的文件:
^{pr2}$请注意,我们仍然使用
_
作为代码中的本地名称。在您可以使用少量的ZCML注册邮件目录:
其中
locales
是configure.zcml
文件所在目录的子目录。zope.i18n
期望在注册目录中找到<REGION>/LC_MESSAGES/yourdomain.mo
和可选的<REGION>/LC_MESSAGES/yourdomain.po
文件;.po
文件会根据需要自动编译为.mo
文件。在ZPT页面模板默认使用
zope.i18n
消息目录,请参见ZPT i18n support。在如果需要手动翻译某些内容,请使用
zope.i18n.translate
函数:大多数Plone i18n manual适用于一般的Zope应用程序。在
如果你绝对有能力把东西插入
__builtins__
,那么就直接操纵RestrictedPython.Guards.safe_builtins
;这是一本字典:相关问题 更多 >
编程相关推荐