我正在研究一个烧瓶项目(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;但显然它没有用。
提前致谢。
答案 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>')