3

在我的网站上使用 Flask + Jinja2 和 Flask-Babel 进行翻译。该站点有两种语言(取决于 URL),我想添加一个链接以在它们之间切换。要正确执行此操作,我需要获取当前语言环境的名称,但我在文档中没有找到这样的功能。它存在吗?

4

3 回答 3

5

其他答案说您必须实现 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']

然后,我在 Flaskapp定义中添加了以下行:

app.jinja_env.globals['get_locale'] = get_locale

现在您可以get_locale()从模板中调用。

于 2019-09-11T19:49:23.703 回答
4

最后,我使用了这个解决方案:将get_locale无论如何都应该定义的函数添加到 Jinja2 全局变量中,然后像任何其他函数一样在模板中调用它。

于 2013-05-05T13:48:40.483 回答
1

您有责任将用户的语言环境存储在数据库的会话中。Flask-babel不会为您执行此操作,因此您应该实现get_locale方法 forflask-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'])
于 2013-05-05T11:55:02.327 回答