Имя утилиты - это не переводимый идентификатор сообщения, а внутренний технический идентификатор.Вы не можете использовать его в целях перевода.
Если вы посмотрите на 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.
Если у вас есть директива ZCML с атрибутом типа MessageID, все, что вам нужно сделать, это определитьi18n: домен для файла ZCML.Механизм ZCML сам знает, какие атрибуты можно перевести, основываясь на их правильном типе.Таким образом, вам не нужна дополнительная разметка, чтобы отмечать какие-либо атрибуты, которые вам нужны в TAL.
Все это говорит, что если вы работаете внутри Plone и используете i18ndude для извлечения сообщений, он не извлечет никаких сообщений из ZCML.файлы - просто потому, что в ZCML не определено ни одного сообщения, оно также отображается в любом месте пользовательского интерфейса Plone.
Если у вас есть утилиты и вы хотите дать им переводимые имена, присвойте им атрибут title, например:
from zope.i18nmessageid import MessageFactory
_ = MessageFactory('mydomain')
class MyShortCut(object):
title = _('My shortcut')
и используйте атрибут title в пользовательском интерфейсе.