如何在Bottle框架中使用Jinja2 i18n(与Babel一起)

3

我认为在bottle中使用jinja2,只需使用jinja2_template而不是template:

例如:bottle.jinja2_template("mytemplate", dict(name=value, name2=value2))

但是,如果需要i18n jinja扩展,最好如何指定呢?

....install_gettext_translations(

? 使用的是自动完成功能吗

bottle.jinja2_template("mytemplate", dict(name=value, name2=value2), template_lookup=['templates'],'template_settings'=   {'extensions':['jinja2.ext.i18n'],'autoescape': True }))

? 谢谢。

经过进一步思考,我认为我可能需要覆盖Jinja2Template类中的prepare方法,以添加env.install_gettext_translations( ???

更多信息,如果我要手动执行....install_gettext_translations(),可能会:

tenv = Environment(extensions=['jinja2.ext.i18n'])
tenv.install_gettext_translations(gettransobj())

import gettext
import locale 

def gettransobj():
    loc = locale.getlocale()
     # change to reflect where your mo files are
    mofilename = "res/messages_%s.mo" % locale.getdefaultlocale()[0][0:2]
    try:
       trans = gettext.GNUTranslations(open( mofilename, "rb" ) )
    except IOError:
       trans = gettext.NullTranslations()
    return trans

或者对于babel翻译对象,可以使用以下方式:

.....install_gettext_translations(gettransobj(),newstyle=True)

import babel
import locale 

def gettransobj():
  loc = locale.getlocale()
  mofilename = "res/messages_%s.mo" % locale.getdefaultlocale()[0][0:2]
  trans = babel.support.Translations(open( mofilename, "rb" ) )

如果这段代码有些正确,但不确定应该把它放在哪里?对jinja2并不是很熟悉。是只需要在程序顶部或每个bottle.jinja2_template调用时使用一次。
另外,如果有人需要使用babel进行提取,请查看jinja2.ext.babel_extract。
另一种方法是使用类似以下内容的trans obj:
return gettext.translation(domain, localedir=localedir,languages=languages, codeset='utf-8')
1个回答

2
from jinja2 import FileSystemBytecodeCache, Environment
bcc = FileSystemBytecodeCache('/tmp', '%s.cache')

template_settings = {'filters': {
                       'tojson': json_util.dumps
                     },
                    'bytecode_cache': bcc,
                    'extensions': ['jinja2.ext.i18n'],
                    'languages': ['en_US']
                    }

import bottle
from bottle import Jinja2Template
from babel.support import Translations

TEMPLATE_PATH = bottle.TEMPLATE_PATH
DEBUG = bottle.DEBUG
TEMPLATES = {}

class Jinja2BabelTemplate(Jinja2Template):
    def prepare(self, filters=None, tests=None, 
                      languages=['en_US'], 
                      globals={}, **kwargs):
        from jinja2 import Environment, FunctionLoader
        self.env = Environment(loader=FunctionLoader(self.loader), **kwargs)
        #BABEL: this is where we load and install our translations from babel
        translations = Translations.load('translations', languages)
        self.env.install_gettext_translations(translations)
        if filters: self.env.filters.update(filters)
        if tests: self.env.tests.update(tests)
        if globals: self.env.globals.update(globals)
        if self.source:
            self.tpl = self.env.from_string(self.source)
        else:
            self.tpl = self.env.get_template(self.filename)


def jinja_template(*args, **kwargs):
    tpl = args[0] if args else None
    adapter = Jinja2BabelTemplate
    lookup = kwargs.pop('template_lookup', TEMPLATE_PATH)
    languages = kwargs.pop('languages', None)
    tplid = (id(languages), tpl,)
    if tplid not in TEMPLATES or DEBUG:
        settings = kwargs.pop('template_settings', {})
        if languages: settings.update({'languages': languages})    
        if isinstance(tpl, adapter):
            TEMPLATES[tplid] = tpl
            if settings: TEMPLATES[tplid].prepare(**settings)
        elif "\n" in tpl or "{" in tpl or "%" in tpl or '$' in tpl:
            TEMPLATES[tplid] = adapter(source=tpl, lookup=lookup, **settings)
        else:
            TEMPLATES[tplid] = adapter(name=tpl, lookup=lookup, **settings)
    if not TEMPLATES[tplid]:
        abort(500, 'Template (%s) not found' % tpl)
    for dictarg in args[1:]: kwargs.update(dictarg)
    return TEMPLATES[tplid].render(kwargs)

template = functools.partial(jinja_template, 
                            template_settings=template_settings)


#and now you should be able to use the template function above with different languages

@get('/home')
def home():
     data = {}
     return template('home.html', data, languages=['en_US'])

你需要在答案中说明你所做的内容。只是粘贴代码是没有意义的。 - Runcorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接