Plone *.zcml文件是否按i18n进行解析?

Plone *.zcml文件是否按i18n进行解析?,plone,zope,zcml,Plone,Zope,Zcml,我已经命名了实用程序,并希望为以后的i18n使用标记名称。这条路对吗 <utility name="Home" i18n:attributes="name" provides=".interfaces..." factory=".shortcut...." /> 您不想这样做。name属性用于应用程序使用,而不是最终用户,需要稳定 如果你翻译它,那么你将不得不通过你的代码翻译所有命名的查找 可以使用元素上的i18n\u domain=“domain”标记翻译标题和说

我已经命名了实用程序,并希望为以后的i18n使用标记名称。这条路对吗

<utility
  name="Home"
  i18n:attributes="name"
  provides=".interfaces..."
  factory=".shortcut...." />

您不想这样做。
name
属性用于应用程序使用,而不是最终用户,需要稳定

如果你翻译它,那么你将不得不通过你的代码翻译所有命名的查找


可以使用
元素上的
i18n\u domain=“domain”
标记翻译标题和说明。

实用程序的名称不是可翻译的消息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)
例如,如果您看一看,它会告诉您属性的类型必须是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属性。

正确,我只是想将其标记为translate,以便以后在实际代码中使用。这是我的第二个选择,因为它大致打破了枯燥的原则:)感谢您详细的回答!实用程序的名称是技术id,而不是标题。一个实用程序不知道它是用哪个名称注册的,就像任何对象实例都不知道它被分配到哪个变量名一样。这是关注点的分离。