【发布时间】:2013-05-05 11:45:44
【问题描述】:
在我的网站上使用 Flask + Jinja2 和 Flask-Babel 进行翻译。该站点有两种语言(取决于 URL),我想添加一个链接以在它们之间切换。要正确执行此操作,我需要获取当前语言环境的名称,但我在文档中没有找到这样的功能。它存在吗?
【问题讨论】:
标签: python jinja2 gettext python-babel
在我的网站上使用 Flask + Jinja2 和 Flask-Babel 进行翻译。该站点有两种语言(取决于 URL),我想添加一个链接以在它们之间切换。要正确执行此操作,我需要获取当前语言环境的名称,但我在文档中没有找到这样的功能。它存在吗?
【问题讨论】:
标签: python jinja2 gettext python-babel
其他答案说您必须实现 babel 的 get_locale() 函数,并且您应该将其添加到 Jinja2 全局变量中,但他们没有说明如何。所以,我所做的是:
我实现了get_locale()函数如下:
from flask import request, current_app
@babel.localeselector
def get_locale():
try:
return request.accept_languages.best_match(current_app.config['LANGUAGES'])
except RuntimeError: # Working outside of request context. E.g. a background task
return current_app.config['BABEL_DEFAULT_LOCALE']
然后,我在我的 Flask app 定义中添加了以下行:
app.jinja_env.globals['get_locale'] = get_locale
现在您可以从模板中调用get_locale()。
【讨论】:
最后,我使用了这个解决方案:将无论如何都应该定义的get_locale 函数添加到 Jinja2 全局变量中,然后像任何其他函数一样在模板中调用它。
【讨论】:
您有责任将用户的语言环境存储在数据库中的会话中。 Flask-babel 不会为您执行此操作,因此您应该为 flask-babel 实现 get_locale 方法,以便能够找到您用户的语言环境。
这是来自flask-babel 文档的get_locale 示例:
from flask import g, request
@babel.localeselector
def get_locale():
# if a user is logged in, use the locale from the user settings
user = getattr(g, 'user', None)
if user is not None:
return user.locale
# otherwise try to guess the language from the user accept
# header the browser transmits. We support de/fr/en in this
# example. The best match wins.
return request.accept_languages.best_match(['de', 'fr', 'en'])
【讨论】: