在我的网站上使用Flask + Jinja2和Flask-Babel进行翻译。该网站有两种语言(取决于URL),我想添加一个链接在它们之间切换。要正确执行此操作,我需要获取当前语言环境的名称,但我没有在文档中找到此类函数。它是否存在?
答案 0 :(得分:3)
最后,我使用了这个解决方案:添加get_locale
函数,无论如何应该定义到Jinja2全局变量,然后像其他任何函数一样在模板中调用它。
答案 1 :(得分:1)
您有责任将用户的区域设置存储在数据库的会话中。 Flask-babel
不会为您执行此操作,因此您应该为get_locale
实施flask-babel
方法,以便能够找到用户的区域设置。
这是来自get_locale
文档的flask-babel
的示例:
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'])
答案 2 :(得分:1)
其他答案表明您必须实现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()
。