我已命名实用程序,并希望为以后的i18n用法标记名称。这是正确的方法吗?
<utility
name="Home"
i18n:attributes="name"
provides=".interfaces..."
factory=".shortcut...." />
答案 0 :(得分:10)
该实用程序的名称不是可翻译的消息ID,而是内部技术ID。您不能将其用于翻译目的。
如果查看zope.component.zcml,您可以看到该指令的接口包含:
class IUtilityDirective(IBasicComponentInformation):
"""Register a utility."""
name = zope.schema.TextLine(
title=_("Name"),
description=_("Name of the registration. This is used by"
" application code when locating a utility."),
required=False)
如果您查看示例http://wiki.zope.org/zope3/zcml.html,它将告诉您属性必须是MessageID才能在ZCML中翻译。
如果你有一个带有MessageID类型属性的ZCML指令,你需要做的就是为ZCML文件定义一个i18n:domain。 ZCML机器基于它们是正确的类型,知道哪些属性可以自行翻译。所以你不需要任何额外的标记来记录你在TAL中需要的任何属性。
所有这一切,如果您在Plone内部工作并使用i18ndude提取消息,它将不会从ZCML文件中提取任何消息 - 只是因为在ZCML中没有定义任何消息,这实际上也显示在Plone中的任何位置UI。
如果您有实用程序并希望为它们提供可翻译的名称,请为它们指定title属性,例如:
from zope.i18nmessageid import MessageFactory
_ = MessageFactory('mydomain')
class MyShortCut(object):
title = _('My shortcut')
并在UI中使用title属性。
答案 1 :(得分:6)
你不想这样做。 name
属性适用于应用程序,而不是最终用户,需要保持稳定。
如果你翻译它,那么你也必须在你的代码中翻译所有命名的查找!
可以使用i18n_domain="domain"
元素上的<configure>
标记翻译标题和说明。