class render_jinja in contrib/template.py should be improved.

17 views
Skip to first unread message

Zhang Huangbin

unread,
Mar 12, 2009, 5:01:06 AM3/12/09
to web.py
Hi, all.

currently, render_jinja is not support Jinja2 i18n extension, maybe we
should improve it.
----
# original code
class render_jinja:
"""Rendering interface to Jinja2 Templates

Example:

render= render_jinja('templates')
render.hello(name='jinja2')
"""
def __init__(self, *a, **kwargs):
from jinja2 import Environment,FileSystemLoader
self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs))

def __getattr__(self, name):
# Assuming all templates end with .html
path = name + '.html'
t = self._lookup.get_template(path)
return t.render
----

We should add 'extentions' and 'globals' in __init__ so that we can
use Jinja2 extensions:
----
from gettext import gettext as _

...skip some code here...
def __init__(self, *a, **kwargs):
from jinja2 import Environment,FileSystemLoader
self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs), extensions=['jinja2.ext.i18n'])
self._lookup.globals = {'_':_}
----

Template file:
----
{{ _('Hello') }} world.
----

Can we make 'render_jinja' accept 'extensions' while define render?

Thanks very much.

Zhang Huangbin

unread,
Mar 12, 2009, 5:11:24 AM3/12/09
to web.py
Dirty patch is here:
----
--- web/contrib/template.py 2009-02-20 16:33:17.000000000 +0800
+++ web/contrib/template.py 2009-03-12 17:10:07.000000000 +0800
@@ -81,9 +81,10 @@
render= render_jinja('templates')
render.hello(name='jinja2')
"""
- def __init__(self, *a, **kwargs):
+ def __init__(self, extensions=[], globals={}, *a, **kwargs):
from jinja2 import Environment,FileSystemLoader
- self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs))
+ self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs), extensions=extensions)
+ self._lookup.globals = globals

def __getattr__(self, name):
# Assuming all templates end with .html
----

Anand Chitipothu

unread,
Mar 12, 2009, 5:24:48 AM3/12/09
to we...@googlegroups.com
How about this?

diff --git a/web/contrib/template.py b/web/contrib/template.py
index 2642d65..7495d39 100644
--- a/web/contrib/template.py
+++ b/web/contrib/template.py
@@ -82,8 +82,12 @@ class render_jinja:
render.hello(name='jinja2')
"""
def __init__(self, *a, **kwargs):
+ extensions = kwargs.pop('extensions', [])
+ globals = kwargs.pop('globals', {})
+


from jinja2 import Environment,FileSystemLoader
- self._lookup = Environment(loader=FileSystemLoader(*a, **kwargs))
+ self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs), extensions=extensions)

+ self._lookup.globals.update(globals)

Zhang Huangbin

unread,
Mar 12, 2009, 5:28:22 AM3/12/09
to web.py


On Mar 12, 5:24 pm, Anand Chitipothu <anandol...@gmail.com> wrote:
> How about this?

Tested, and it works. :)

Anand Chitipothu

unread,
Mar 12, 2009, 5:30:54 AM3/12/09
to we...@googlegroups.com

Zhang Huangbin

unread,
Mar 12, 2009, 9:44:06 AM3/12/09
to web.py


On Mar 12, 5:30 pm, Anand Chitipothu <anandol...@gmail.com> wrote:
> > Tested, and it works. :)
>
> pushed.
>
> http://github.com/webpy/webpy/commit/eeaa3ff2f8c2fd420a2125da19797dc0...

Hi, Anand.

I'm so sorry, it seems it doesn't translate msg in template files. :(

Zhang Huangbin

unread,
Mar 13, 2009, 1:14:57 AM3/13/09
to web.py
I tested Jinja2 i18n extension support in Juno[1] framework, it works
[2]. but it doesn't translate messages in webpy:

----
# Add 'translations' in __init__.

class render_jinja:
def __init__(self, *a, **kwargs):
extensions = kwargs.pop('extensions', [])
translations = kwargs.pop('translations', None)
globals = kwargs.pop('globals', {})

from jinja2 import Environment,FileSystemLoader
self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs), extensions=extensions)
if translations is not None:
self._lookup.install_gettext_translations(translations)
self._lookup.globals.update(globals)

def __getattr__(self, name):
# Assuming all templates end with .html
path = name + '.html'
t = self._lookup.get_template(path, globals={'_':_})
return t.render
----

in code.py
----
from web.contrib.template import render_jinja
import gettext
from gettext import gettext as _

gettext.install('appname', 'i18n', unicode=1)
lang_zh = gettext.translation('appname', 'i18n', languages=['zh_CN'])

render = render_jinja(
'templates',
extensions=['jinja2.ext.i18n'],
translations=lang_zh,
encoding = 'utf-8',
globals={'_': _,}
)

----

template file:
----
{{ _('Whitelist') }}
----

Translated msg in i18n/zh_CN/LC_MESSAGES/appname.po:
----
msgid "Whitelist"
msgstr "translated msg: whitelist"
----

Use msgfmt to convert po file:
----
# msgfmt -o i18n/zh_CN/LC_MESSAGES/appname.mo i18n/zh_CN/LC_MESSAGES/
appname.po
----

Refer to Jinja2 documentation[3], it should work. but doesn't. I'm
confused. :(

[1] Juno framework:
http://github.com/breily/juno/tree/master

[2] Localization?
http://groups.google.com/group/juno-framework/browse_thread/thread/b46d246ad525768f

[3] Jinja2 i18n extensions:
http://jinja.pocoo.org/2/documentation/extensions#id1

Zhang Huangbin

unread,
Mar 13, 2009, 1:43:18 AM3/13/09
to web.py


On Mar 13, 1:14 pm, Zhang Huangbin <michaelbi...@gmail.com> wrote:
> ----
>     def __getattr__(self, name):
>         # Assuming all templates end with .html
>         path = name + '.html'
>         t = self._lookup.get_template(path, globals={'_':_})
>         return t.render
> ----

Sorry, 'globals=xxx' should be removed here. and finally, it works
now.

Just add 'translations' in render_jinja:
----
class render_jinja:
def __init__(self, *a, **kwargs):
extensions = kwargs.pop('extensions', [])
translations = kwargs.pop('translations', None) # Add
this line.
globals = kwargs.pop('globals', {})

from jinja2 import Environment,FileSystemLoader
self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs), extensions=extensions)
if translations is not None: # Add this line
self._lookup.install_gettext_translations(translations) #
Add this line
self._lookup.globals.update(globals)
----

in code.py:
----
from web.contrib.template import render_jinja
import gettext
from gettext import gettext as _

translation = gettext.translation('iredadmin', 'i18n', languages=
['zh_CN'])

render = render_jinja(
'templates',
extensions=['jinja2.ext.i18n'],
translations=lang_zh,
encoding = 'utf-8',
)
----

Zhang Huangbin

unread,
Mar 13, 2009, 1:49:21 AM3/13/09
to web.py
Dirty patch:
----
--- web/contrib/template.py 2009-03-12 21:19:04.000000000 +0800
+++ web/contrib/template.py 2009-03-13 13:34:45.000000000 +0800
@@ -83,10 +83,13 @@
"""
def __init__(self, *a, **kwargs):
extensions = kwargs.pop('extensions', [])
+ translations = kwargs.pop('translations', None)
globals = kwargs.pop('globals', {})

from jinja2 import Environment,FileSystemLoader
self._lookup = Environment(loader=FileSystemLoader(*a,
**kwargs), extensions=extensions)
+ if translations is not None:
+ self._lookup.install_gettext_translations(translations)
self._lookup.globals.update(globals)

def __getattr__(self, name):
----
Reply all
Reply to author
Forward
0 new messages