1

これが私がやろうとしていることです:「_」関数を使用して、gettext互換の方法でzmipythonスクリプトのi18nサポートを有効にしたいです。

これが私がこれまでにしたことです。Zope製品のモジュールで、次のコマンドを実行します。

import gettext, __builtin__    
t = gettext.translation('myDomain', LOCALESPATH, languages=['de'], fallback=True)
__builtin__._ = t.gettext

(制限のない)外部メソッドで_を呼び出すと正常に機能し、期待どおりに翻訳が返されます。

def testI18n():
  return _('text to be translated')

RestrictedPythonを使用してコードを実行するZope「スクリプト(Python)」でこれを試してみると、「グローバル名'_'が定義されていません」というNameErrorが発生します。

これは私の回避策です:

from myModule import myTranslator as _
print _('text to be translated')
return printed

これはうまく機能します(もちろん、myModuleはPythonスクリプトで許可されている必要があります)。

しかし、制限されたPythonスクリプトに組み込み関数として_を含める方法があるかどうか、およびRestrictedPython.Guardsでsafe_builtinsを拡張できるかどうかに興味があります。

4

1 に答える 1

3

まず第一に、Zopeはすでにgettext互換のi18nパッケージを.の形式で利用できますzope.i18n。これはすでにZope自体の一部であり、個別にインストールする必要はありません。

__builtin__第二に、 ;をいじくりまわさないでください。メッセージファクトリをモジュールにインポートして、名前を付けるだけ_です。

Zope製品__init__.pyに、このためのメッセージファクトリを追加します。

from zope.i18nmessageid import MessageFactory
from AccessControl import ModuleSecurityInfo

YourDomainMessageFactory = MessageFactory('your.domain')

ModuleSecurityInfo('your.packagename').declarePublic('YourDomainMessageFactory')

これで、制限されたファイルを含む、プロジェクトのPythonファイルのいずれかにインポートできるメッセージIDファクトリができました。

from your.packagename import YourDomainMessageFactory as _

message = _('Your message to be translated')

_コードでローカル名として引き続き使用されていることに注意してください。

メッセージカタログを少量のZCMLに登録します。

<configure
    xmlns:i18n="http://namespaces.zope.org/i18n">

    <i18n:registerTranslations directory="locales" />

</configure>

ここで、はファイルlocalesが存在するディレクトリのサブディレクトリです。登録されたディレクトリ内のファイルを検索し、オプションでファイルを検索することを期待します。ファイルは、必要に応じて自動的にファイルにコンパイルされます。configure.zcmlzope.i18n<REGION>/LC_MESSAGES/yourdomain.mo<REGION>/LC_MESSAGES/yourdomain.po.po.mo

ZPTページテンプレートはzope.i18nデフォルトでメッセージカタログを使用します。ZPTi18nのサポートを参照してください。

何かを手動で翻訳する必要がある場合は、次のzope.i18n.translate関数を使用してください。

from zope.i18n import translate

message = _('Your message to be translated')
print translate(message, target_language='de')

Plone i18nのマニュアルのほとんどは、一般的なZopeアプリケーションに適用されます。

どうしても物事を突き刺すことができなけれ__builtins__ばならない場合は、必ず直接操作してくださいRestrictedPython.Guards.safe_builtins。それは辞書です:

from RestrictedPython.Guards import safe_builtins

safe_builtins['_'] = t.gettext
于 2012-09-28T16:52:14.803 に答える