5

Pyramidのドキュメントには、ビュー(およびテンプレート)内でi18nを使用する方法が示されています。しかし、現在のビューやテンプレートにアクセスできないビューやテンプレートの外でそれを使用するにはどうすればよいでしょうかrequest(たとえば、informsmodels)。

@Michaelはrequestモデルとフォームに渡すと言いました。しかし、それは正しいですか?つまり、フォームフィールドが__init__()メソッド呼び出しの前に定義されている場合、モデルと同じです。ビューからパラメータは表示されません...

Pylonsでは、親コントローラーで適切な言語を使用get_lang()して定義し、可能な限りいつでも(ビューで)直接呼び出すことなく、任意の場所で使用できます。set_lang()ugettext()ungettext()request

ピラミッドでそれを行う方法は?言語はユーザーの設定(セッション、Cookie、データベースなど)から設定する必要があることに注意してください。

4

4 に答える 4

4

私の解決策は、ローカライザーをパラメーターとして使用して、必要なときにフォームクラスを作成することです。例えば

forms.py

class FormFactory(object):

    def __init__(self, localizer):
        self.localizer = localizer
        _ = self.localizer
        self.required_msg = _(u'This field is required.')
        self.invalid_email_msg = _(u'Invalid email address.')
        self.password_not_match_msg = _(u'Password must match')

    def make_contact_form(self):
        _ = self.localizer
        class ContactForm(Form):
            email = TextField(_(u'Email address'), [
                validators.Required(self.required_msg),
                validators.Email(self.invalid_email_msg)
            ])
            content = TextAreaField(_(u'Content'), [
                validators.Required(self.required_msg)
            ])
        return ContactForm

フォームを使用する必要がある場合

@view_config(route_name='front_pages.contact_us',
             renderer='myweb:templates/front_pages/contact_us.genshi')
def contact_us(request):
    """Display contact us form or send mail

    """
    _ = get_localizer(request)

    factory = FormFactory(_)
    ContactForm = factory.make_contact_form()
    form = ContactForm(request.params)
    return dict(form=form)

ご覧のとおり、ビューにローカライザーを取得し、それをFormFactoryに渡してから、そのファクトリを使用してフォームを作成します。これにより、フォーム内のすべてのメッセージが現在のロケール言語に置き換えられました。

同様に、モデルでも同じことができます。

于 2012-05-12T15:21:21.297 に答える
2

もう見つけましpyramid.18n.get_localizerたか?

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/narr/i18n.html#using-a-localizer

于 2012-04-29T17:41:27.937 に答える
1

実際、私はこれとまったく同じ問題を抱えていました。私がやったことは、デフォルトのロケールネゴシエーターがどのように機能するかを確認することでした-指定されたリクエストオブジェクトでLOCALEプロパティを探します。したがって、ダミーを使用してローカライザーを作成するだけです。必要に応じて、この値もキャッシュできます

def my_get_localizer(locale=None):
    request = Request({})
    request._LOCALE_ = locale

    return get_localizer(request)

または、ircチャネル#pyramid @ freenodeに参加して、get_localizerの機能を2つの別々のドキュメント化された関数(get_localizerとget_localizer_for_locale_name)に分割して楽しむのに十分な人をせがんでください;)

また、Pyramid TranslationStringsは怠惰であるため、好きなだけ遅く翻訳できることに注意してください。

class MyModel(Base):
    description = TranslationString("My model number ${number}")

...

def view(request):
    m = MyModel()
    localizer = get_localizer(request)
    description = localizer.translate(m.description, mapping={'number': 1})

補足:pylonsのi18nは、私が何年にもわたって開いたワームの最悪の缶でした。set_lang、get_langハックは本当にひどいもので、母国語でユーザーにメールを送信してから言語を復元しようとしたため、お尻が痛くなりました...また、リクエスト以外のものを翻訳することは不可能でした当時、翻訳者またはレジストリとしてのpylonsプログラムは存在しませんでした。

于 2012-05-09T19:43:06.103 に答える
0

ローカライザーを作成し、それに応じてテンプレートを翻訳することができます。

ローカライザーを作成するときに、必要なlangを渡すことができます(dbから取得したかどうかに関係なく)。それがお役に立てば幸いです。

わかりやすくするために、以下では「fr」と設定します。

from pyramid.i18n import make_localizer, TranslationStringFactory
from mako.template import Template
from mako.lookup import TemplateLookup
import os

absolute_path = os.path.dirname(os.path.realpath(__file__))
tsf = TranslationStringFactory('your_domain')
mako_lookup = TemplateLookup(directories=['/'])
template = Template(filename=template_path, lookup=mako_lookup)

localizer = make_localizer("fr", [absolute_path + '/../locale/'])

def auto_translate(*args, **kwargs):
    return localizer.translate(tsf(*args, **kwargs))

# Pass _ pointer (translate function) to the context
_ = auto_translate

context.update({
    "_": _
})

html = template.render(**context)

編集 このロジックを小さな関数に入れることもできます

def get_translator(lang):
    """
    Useful when need to translate outside of queries (no pointer to request)
    :param lang:
    :return:
    """
    localizer = make_localizer(lang, [absolute_path + '/../locale/'])

    def auto_translate(*args, **kwargs):
        return localizer.translate(tsf(*args, **kwargs))

    _ = auto_translate

    return _
于 2016-10-13T15:13:49.890 に答える