i18n for Zope中的Python脚本(受限Python)

2024-10-02 20:38:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我要做的是:我想用一种与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。守卫. 在


Tags: 模块方法函数import脚本zope产品方式
1条回答
网友
1楼 · 发布于 2024-10-02 20:38:24

首先,Zope已经以^{}的形式为您提供了与gettext兼容的i18n包。这已经是Zope本身的一部分,不需要单独安装。在

第二,不要乱搞__builtin__;只需将消息工厂导入模块并将其命名为_。在

在您的Zope产品__init__.py中,您为此添加了一个消息工厂:

from zope.i18nmessageid import MessageFactory
from AccessControl import ModuleSecurityInfo

YourDomainMessageFactory = MessageFactory('your.domain')

ModuleSecurityInfo('your.packagename').declarePublic('YourDomainMessageFactory')

现在您有了一个可以导入到任何项目python文件中的消息id工厂,包括受限制的文件:

^{pr2}$

请注意,我们仍然使用_作为代码中的本地名称。在

您可以使用少量的ZCML注册邮件目录:

<configure
    xmlns:i18n="http://namespaces.zope.org/i18n">

    <i18n:registerTranslations directory="locales" />

</configure>

其中localesconfigure.zcml文件所在目录的子目录。zope.i18n期望在注册目录中找到<REGION>/LC_MESSAGES/yourdomain.mo和可选的<REGION>/LC_MESSAGES/yourdomain.po文件;.po文件会根据需要自动编译为.mo文件。在

ZPT页面模板默认使用zope.i18n消息目录,请参见ZPT i18n support。在

如果需要手动翻译某些内容,请使用zope.i18n.translate函数:

from zope.i18n import translate

message = _('Your message to be translated')
print translate(message, target_language='de')

大多数Plone i18n manual适用于一般的Zope应用程序。在

如果你绝对有能力把东西插入__builtins__,那么就直接操纵RestrictedPython.Guards.safe_builtins;这是一本字典:

from RestrictedPython.Guards import safe_builtins

safe_builtins['_'] = t.gettext

相关问题 更多 >