2011-08-01 4 views
3

私は名前のついたユーティリティを持っていて、後でi18nの使用のために名前をマークしたいと思います。これは正しい方法ですか?* * .zcmlファイルは賢明に解析されますか?

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

答えて

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用を見れば、それは属性のタイプのメッセージIDであることが必要であることを教えてくれますZCMLで翻訳可能です。

MessageIDタイプの属性を持つZCMLディレクティブがある場合は、ZCMLファイルのi18n:ドメインを定義するだけです。 ZCML機構は、正しいタイプであることに基づいて、どの属性がそれ自体が翻訳可能であるかを知っている。したがって、TALに必要な属性を書き留めるために余分なマークアップは必要ありません。

Ploneの内部でi18ndudeを使ってメッセージを抽出すると、ZCMLファイルからメッセージを抽出することはできません。つまり、ZCMLで定義されているメッセージが1つもないからです。 Plone UI。

あなたはユーティリティを持っていると、彼らに翻訳可能な名前をつけるように、彼らにtitle属性を与えたい場合:

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

class MyShortCut(object): 

    title = _('My shortcut') 

とUIにtitle属性を使用します。

+0

それは私の第二の選択だった、それは大まかにドライ原則を破るように:)精巧な答えをありがとう! – iElectric

+0

ユーティリティの名前は技術的なIDです。タイトルではありません。また、どのオブジェクトインスタンスにどの変数名が割り当てられているかわからないので、ユーティリティは登録された名前ではわかりません。これは懸念の分離です。 –

6

あなたはそうしたくありません。 name属性はエンドユーザではなくアプリケーションで使用するためのもので、安定している必要があります。

翻訳した場合、名前付きルックアップもすべて翻訳する必要があります。

タイトルおよび説明は、<configure>要素のi18n_domain="domain"マーカーを使用して翻訳できます。

+0

正しいですが、後で実際のコードで使用できるように変換できるとマークするのは難しいです。 – iElectric

関連する問題