Re: [Zope-dev] How can I force the language for a particular template rendering?

2009-04-17 Thread Marius Gedminas
On Fri, Apr 17, 2009 at 03:35:58PM -0400, Ethan Jucovy wrote:
> How about just monkeypatching the active negotiator?
> 
> {{{
> negotiator = getUtility(zope.i18n.interfaces.INegotiator)
> orig = negotiator.getLanguage
> negotiator.getLanguage = lambda foo, bar: 'fr'
> text = my_page_template()
> negotiator.getLanguage = orig
> }}}
>
> Haven't tested it, but in my (limited) understanding of the I18N system
> something like that ought to work..

Two words: "thread safety".

Zope 3 utilities are global, not thread-local.

Unless you have a persistent utility (theoretically; the default
INegotiator isn't), which would be thread-local.  (And in which case
your example code would try to pickle a bound method---I wonder if
that'd work?  I think it might, but just consider the conflict errors
you'd get if every request did this.)

"Monkey-patching outside unit tests is evil and will explode when you
don't expect" is a good rule of thumb.

Marius Gedminas
-- 
http://pov.lt/ -- Zope 3 consulting and development


signature.asc
Description: Digital signature
___
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )


Re: [Zope-dev] How can I force the language for a particular template rendering?

2009-04-17 Thread Ethan Jucovy
Actually -- for a more proper solution -- I believe
zope.i18n.interfaces.IUserPreferredLanguages is expected to adapt a request
(rather than being a contextless utility) so I bet you could register a
custom IUserPreferredLanguages whose getPreferredLanguages returns ['fr'] on
an IForceLanguage interface, and mark the current request with
IForceLanguage before rendering the template.

egj

On Fri, Apr 17, 2009 at 3:35 PM, Ethan Jucovy wrote:

> How about just monkeypatching the active negotiator?
>
> {{{
> negotiator = getUtility(zope.i18n.interfaces.INegotiator)
> orig = negotiator.getLanguage
> negotiator.getLanguage = lambda foo, bar: 'fr'
> text = my_page_template()
> negotiator.getLanguage = orig
> }}}
>
> Haven't tested it, but in my (limited) understanding of the I18N system
> something like that ought to work..
>
> egj
>
>
> On Fri, Apr 17, 2009 at 3:14 PM, Chris Withers wrote:
>
>> Hi All,
>>
>> What I want to do is best shown in pseudocode:
>>
>> something.setLanguage('fr')
>> text = my_page_template()
>> something.restoreLanguage()
>>
>> ...the reason I want to do this is that the results of that template
>> will not be in the language negotiated for the current user, as the
>> result is then emailed to someone who may not be speaking the same
>> language as them.
>>
>> I can't find a way to specify a target_language that overrides the
>> negotiated language into the ZPT rendering process. Is there such a way?
>>
>> Suggestions welcomed!
>>
>> Chris
>
>
>
___
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )


Re: [Zope-dev] How can I force the language for a particular template rendering?

2009-04-17 Thread Ethan Jucovy
Actually -- for a more proper solution -- I believe
zope.i18n.interfaces.IUserPreferredLanguages is expected to adapt a request
(rather than being a contextless utility) so I bet you could register a
custom IUserPreferredLanguages whose getPreferredLanguages returns ['fr'] on
an IForceLanguage interface, and mark the current request with
IForceLanguage before rendering the template.

egj

On Fri, Apr 17, 2009 at 3:35 PM, Ethan Jucovy wrote:

> How about just monkeypatching the active negotiator?
>
> {{{
> negotiator = getUtility(zope.i18n.interfaces.INegotiator)
> orig = negotiator.getLanguage
> negotiator.getLanguage = lambda foo, bar: 'fr'
> text = my_page_template()
> negotiator.getLanguage = orig
> }}}
>
> Haven't tested it, but in my (limited) understanding of the I18N system
> something like that ought to work..
>
> egj
>
>
> On Fri, Apr 17, 2009 at 3:14 PM, Chris Withers wrote:
>
>> Hi All,
>>
>> What I want to do is best shown in pseudocode:
>>
>> something.setLanguage('fr')
>> text = my_page_template()
>> something.restoreLanguage()
>>
>> ...the reason I want to do this is that the results of that template
>> will not be in the language negotiated for the current user, as the
>> result is then emailed to someone who may not be speaking the same
>> language as them.
>>
>> I can't find a way to specify a target_language that overrides the
>> negotiated language into the ZPT rendering process. Is there such a way?
>>
>> Suggestions welcomed!
>>
>> Chris
>
>
>
___
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )


Re: [Zope-dev] How can I force the language for a particular template rendering?

2009-04-17 Thread Hanno Schlichting
Ethan Jucovy wrote:
> How about just monkeypatching the active negotiator?
> 
> {{{
> negotiator = getUtility(zope.i18n.interfaces.INegotiator)
> orig = negotiator.getLanguage
> negotiator.getLanguage = lambda foo, bar: 'fr'
> text = my_page_template()
> negotiator.getLanguage = orig
> }}}
> 
> Haven't tested it, but in my (limited) understanding of the I18N system
> something like that ought to work..

As the default negotiator is based on the request, it might be possible
to forge a different request object for the template.

Or attach a marker interface to the request and register a different
IUserPreferredLanguages adapter for it. A more specialized version
should take precedence over the normal adapter based on the HTTP header.

Hanno

___
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )


Re: [Zope-dev] How can I force the language for a particular template rendering?

2009-04-17 Thread Ethan Jucovy
How about just monkeypatching the active negotiator?

{{{
negotiator = getUtility(zope.i18n.interfaces.INegotiator)
orig = negotiator.getLanguage
negotiator.getLanguage = lambda foo, bar: 'fr'
text = my_page_template()
negotiator.getLanguage = orig
}}}

Haven't tested it, but in my (limited) understanding of the I18N system
something like that ought to work..

egj

On Fri, Apr 17, 2009 at 3:14 PM, Chris Withers wrote:

> Hi All,
>
> What I want to do is best shown in pseudocode:
>
> something.setLanguage('fr')
> text = my_page_template()
> something.restoreLanguage()
>
> ...the reason I want to do this is that the results of that template
> will not be in the language negotiated for the current user, as the
> result is then emailed to someone who may not be speaking the same
> language as them.
>
> I can't find a way to specify a target_language that overrides the
> negotiated language into the ZPT rendering process. Is there such a way?
>
> Suggestions welcomed!
>
> Chris
___
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )


[Zope-dev] How can I force the language for a particular template rendering?

2009-04-17 Thread Chris Withers
Hi All,

What I want to do is best shown in pseudocode:

something.setLanguage('fr')
text = my_page_template()
something.restoreLanguage()

...the reason I want to do this is that the results of that template 
will not be in the language negotiated for the current user, as the 
result is then emailed to someone who may not be speaking the same 
language as them.

I can't find a way to specify a target_language that overrides the 
negotiated language into the ZPT rendering process. Is there such a way?

Suggestions welcomed!

Chris

-- 
Simplistix - Content Management, Zope & Python Consulting
- http://www.simplistix.co.uk
___
Zope-Dev maillist  -  Zope-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://mail.zope.org/mailman/listinfo/zope-announce
 http://mail.zope.org/mailman/listinfo/zope )