我已經命名實用程序,並希望爲以後的國際化使用標記名稱。這是正確的方式嗎?* .zcml文件得到解析i18n明智嗎?
<utility
name="Home"
i18n:attributes="name"
provides=".interfaces..."
factory=".shortcut...." />
我已經命名實用程序,並希望爲以後的國際化使用標記名稱。這是正確的方式嗎?* .zcml文件得到解析i18n明智嗎?
<utility
name="Home"
i18n:attributes="name"
provides=".interfaces..."
factory=".shortcut...." />
該實用程序的名稱不是可翻譯的消息標識,而是內部技術標識。您不能將其用於翻譯目的。
如果你看看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屬性。
你不想這樣做。 name
屬性用於應用程序使用,而不是最終用戶,並且需要保持穩定。
如果你翻譯它,那麼你將不得不翻譯所有命名的查找整個你的代碼!
標題和描述可被翻譯,使用<configure>
元件上的i18n_domain="domain"
標記。
正確,我看到只是想將其標記爲可以在實際代碼中稍後使用的翻譯功能。 – iElectric
這是我的第二選擇,因爲它大致打破了DRY原則:)感謝您的精心解答! – iElectric
實用程序的名稱是技術標識,它不是標題。一個實用程序不知道它註冊了哪個名稱,就像任何對象實例不知道它分配給哪個變量名稱一樣。這是關注的分離。 –