【问题标题】:How to set blank default locale for a flask app?如何为烧瓶应用程序设置空白默认语言环境?
【发布时间】:2017-05-02 05:22:47
【问题描述】:

我正在开发一个烧瓶项目 (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

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

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

我该怎么做?我尝试将配置中的默认语言代码从 'en' 设置为 '' 但显然它不起作用。

【问题讨论】:

  • 好问题 - 正在寻找答案 atm xD

标签: python flask localization internationalization python-babel


【解决方案1】:

您可以使用以下内容。这通过从 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>')

【讨论】:

    猜你喜欢
    • 2016-09-07
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2020-04-05
    • 2014-09-14
    • 2012-02-07
    • 1970-01-01
    相关资源
    最近更新 更多