2011-08-01 12 views

回答

10

該實用程序的名稱不是可翻譯的消息標識,而是內部技術標識。您不能將其用於翻譯目的。

如果你看看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:域。 ZCML機制知道哪些屬性可以根據它們的正確類型進行翻譯。所以你不需要任何額外的標記來記錄你在TAL中需要的任何屬性。所有這一切說,如果你在Plone內部工作並使用i18ndude來提取消息,它將不會從ZCML文件中提取任何消息 - 這僅僅是因爲在ZCML中沒有定義單個消息,這實際上也顯示在Plone UI。

如果你有事業和想給他們翻譯的名字,給他們一個title屬性,如:

from zope.i18nmessageid import MessageFactory 
_ = MessageFactory('mydomain') 

class MyShortCut(object): 

    title = _('My shortcut') 

,並在UI使用title屬性。

+0

這是我的第二選擇,因爲它大致打破了DRY原則:)感謝您的精心解答! – iElectric

+0

實用程序的名稱是技術標識,它不是標題。一個實用程序不知道它註冊了哪個名稱,就像任何對象實例不知道它分配給哪個變量名稱一樣。這是關注的分離。 –

6

你不想這樣做。 name屬性用於應用程序使用,而不是最終用戶,並且需要保持穩定。

如果你翻譯它,那麼你將不得不翻譯所有命名的查找整個你的代碼!

標題和描述可被翻譯,使用<configure>元件上的i18n_domain="domain"標記。

+0

正確,我看到只是想將其標記爲可以在實際代碼中稍後使用的翻譯功能。 – iElectric