gpt4 book ai didi

python - Zope 中 Python 脚本的 i18n(受限 python)

转载 作者:行者123 更新时间:2023-11-30 23:40:29 31 4
gpt4 key购买 nike

这就是我想要做的:我想使用“_”函数以 gettext 兼容的方式为我的 zmi python 脚本启用 i18n 支持。

这是我到目前为止所做的。在我的 Zope 产品的模块中,我运行:

import gettext, __builtin__    
t = gettext.translation('myDomain', LOCALESPATH, languages=['de'], fallback=True)
__builtin__._ = t.gettext

在(不受限制的)外部方法中调用 _ 工作正常,它会按预期返回翻译。

def testI18n():
return _('text to be translated')

如果我在使用 RestrictedPython 执行其代码的 Zope“脚本 (Python)”中尝试此操作,则会收到 NameError:“全局名称 '_' 未定义”。

这是我的解决方法:

from myModule import myTranslator as _
print _('text to be translated')
return printed

效果很好(当然,Python 脚本必须允许 myModule)。

但我很好奇是否有办法将 _ 作为受限 python 脚本中的内置函数,以及是否可以扩展 RestrictedPython.Guards 中的 safe_builtins。

最佳答案

首先,Zope 已经为您提供了兼容 gettext 的 i18n 软件包,其形式为 zope.i18n 。这已经是 Zope 本身的一部分,无需单独安装。

其次,不要对 __builtin__ 胡思乱想。 ;只需将消息工厂导入到模块中并将其命名为 _ .

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

from zope.i18nmessageid import MessageFactory
from AccessControl import ModuleSecurityInfo

YourDomainMessageFactory = MessageFactory('your.domain')

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

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

from your.packagename import YourDomainMessageFactory as _

message = _('Your message to be translated')

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

您使用少量的 ZCML 注册您的消息目录:

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

<i18n:registerTranslations directory="locales" />

</configure>

哪里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功能:

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

关于python - Zope 中 Python 脚本的 i18n(受限 python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12641463/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com