烧瓶应用的默认区域设置

时间:2017-05-02 05:22:47

标签: python flask localization internationalization babel

我正在研究一个烧瓶项目(python3)。我的国际化在我的项目中运作良好。这是在create_app工厂中启动的配置方法:

def configure_languages(app):

    # flask-babel
    babel = Babel(app)

    @babel.localeselector
    def get_locale():
        languages = ['en', 'fr', 'de']
        lang = request.args.get('lang')
        if lang is None:
            return g.get('lang_code', app.config['BABEL_DEFAULT_LOCALE'])
        elif lang not in languages:
            return g.get('lang_code', app.config['BABEL_DEFAULT_LOCALE'])
        else:
            g.lang_code = lang
            return g.get('lang_code', app.config['BABEL_DEFAULT_LOCALE'])

    @app.before_request
    def ensure_lang_support():
        lang_code = g.get('lang_code', app.config['BABEL_DEFAULT_LOCALE'])
        if lang_code and lang_code not in app.config['SUPPORTED_LANGUAGES']:
            return abort(404)


    @app.url_defaults
    def set_language_code(endpoint, values):
        if 'lang_code' in values or not g.get('lang_code',
                                              app.config['BABEL_DEFAULT_LOCALE']):
            return
        if app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
            values['lang_code'] = g.get('lang_code',
                                          app.config['BABEL_DEFAULT_LOCALE'])

    @app.url_value_preprocessor
    def get_lang_code(endpoint, values):
        if values is not None:
            g.lang_code = values.pop('lang_code',
                                     app.config['BABEL_DEFAULT_LOCALE'])

这是我定义其中一个蓝图的方式:

frontend_blueprint = Blueprint('frontend', __name__, url_prefix='/<lang_code>')

该应用程序运行正常。我可以在网址中看到语言代码。例如:

http://localhost:5000/en/posts
http://localhost:5000/fr/posts
http://localhost:5000/de/posts

en是我的应用程序配置中的默认语言。

尽管如此,我还有一个问题:

如何将默认语言设为空?

我希望我的网络应用程序默认不显示任何语言代码如果我使用英语:

http://localhost:5000/posts
http://localhost:5000/about
http://localhost:5000/help

只有当我选择某种特定语言(如法语或德语)时,网址才会变成这样:

http://localhost:5000/fr/posts
http://localhost:5000/fr/about
http://localhost:5000/fr/help

http://localhost:5000/de/posts
http://localhost:5000/de/about
http://localhost:5000/de/help

我该怎么做?我尝试在配置中设置默认语言代码&#39; en&#39;到&#39;&#39;但显然它没有用。

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容。这是通过从URL中检测语言并将其存储在全局烧瓶g请求中来实现的,如果未设置语言代码,则默认为浏览器设置。请注意,app.config['LANGUAGES]'必须是包含受支持的语言(例如['en', 'de', 'fr])的列表。

@blueprint.url_defaults
def set_language_code(endpoint, values):
    if 'lang_code' in values or not g.get('lang_code', None):
        return
    # If endpoint expects lang_code, send it forward
    if current_app.url_map.is_endpoint_expecting(endpoint, 'lang_code'):
        values['lang_code'] = g.lang_code

@blueprint.url_value_preprocessor
def get_lang_code(endpoint, values):
    if values is not None:
        # If no language code has been set, get the best language from the browser settings
        default_lang = request.accept_languages.best_match(current_app.config['LANGUAGES'])
        g.lang_code = values.pop('lang_code', default_lang)

@babel.localeselector
def get_locale():
    lang = g.get('lang_code')
    if lang in current_app.config['LANGUAGES']:
        return lang
    else:
        return 'en'

然后将蓝图安装到您的应用程序两次:

app.register_blueprint(blueprint, url_prefix='/')
app.register_blueprint(blueprint, url_prefix='/<lang_code>')
相关问题