import os
from twisted.python import util
from nevow import inevow,loaders,rend,tags
from nevow.i18n import _,I18NConfig
LOCALE_DIR = util.sibpath(__file__, 'locale')
langs = [d for d in os.listdir(LOCALE_DIR) if d != '.svn']
langs.sort()
class Common(rend.Page):
addSlash = True
def renderHTTP(self, ctx):
# We're only overriding renderHTTP to look for a 'lang' query parameter
# without cluttering up the messages renderer, below.
# If 'lang' is present then we "force" the translation language. This
# simulates how user preferences from the session might be used to
# override the browser's language settings.
lang = ctx.arg('lang')
if lang is not None:
ctx.remember([lang], inevow.ILanguages)
# Let the base class handle it, really.
return rend.Page.renderHTTP(self, ctx)
def render_langs(self, ctx, data):
"""Render a list of links to select from the available translations.
"""
out = [T.a(href=url.here.remove('lang'))['default'], ' | ']
for lang in langs:
out.append(T.a(href=url.here.replace('lang', lang))[lang])
out.append(' | ')
return out[:-1]
class Page(Common):
def render_message(self, ctx, data):
"""Render a localised message. The _(..) construct looks the
translation up at render time.
"""
return ctx.tag.clear()[_('Hello')]
def render_formatstrings(self, ctx, data):
return ctx.tag.clear()[
"Demonstration of i18n'ed string formatting: ",
_("%(first)d plus %(second)c equals %(result)c, or %(roman)s in roman numbers")
% { 'first': 1,
'second': '1',
'result': 50,
'roman': 'II',
},
]
docFactory = loaders.stan(
T.html[
T.body[
T.p['Select your preferred language: ', T.directive('langs')],
T.p[render_message],
T.p[render_formatstrings],
],
],
)
def preparePage(pageFactory):
root = pageFactory()
# Configure the I18N stuff
root.remember(I18NConfig(domain='test', localeDir=LOCALE_DIR), inevow.II18NConfig)
return root
def createResource():
return preparePage(Page)
|