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 <chris@simplistix.co.uk> 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