Nur*_*jan 5 python localization internationalization flask python-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'])
Run Code Online (Sandbox Code Playgroud)
这就是我定义其中一张蓝图的方式:
frontend_blueprint = Blueprint('frontend', __name__, url_prefix='/<lang_code>')
Run Code Online (Sandbox Code Playgroud)
该应用程序运行良好。我可以在 url 中看到语言代码。例如:
http://localhost:5000/en/posts
http://localhost:5000/fr/posts
http://localhost:5000/de/posts
Run Code Online (Sandbox Code Playgroud)
这en是我的应用程序配置中的默认语言。
不过,我有一个问题:
如何将默认语言设为空?
我希望我的网络应用程序默认不显示任何语言代码如果我使用英语:
http://localhost:5000/posts
http://localhost:5000/about
http://localhost:5000/help
Run Code Online (Sandbox Code Playgroud)
只有当我选择某些特定语言(如法语或德语)时,网址才应如下所示:
http://localhost:5000/fr/posts
http://localhost:5000/fr/about
http://localhost:5000/fr/help
Run Code Online (Sandbox Code Playgroud)
或者
http://localhost:5000/de/posts
http://localhost:5000/de/about
http://localhost:5000/de/help
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我试图将配置中的默认语言代码从“en”设置为“”,但显然它不起作用。
您可以使用以下内容。这是通过从 url 检测语言并将其存储在 Flaskg请求全局中来实现的,如果未设置语言代码,则默认为浏览器设置。请注意,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'
Run Code Online (Sandbox Code Playgroud)
然后将蓝图安装到您的应用程序上两次:
app.register_blueprint(blueprint, url_prefix='/')
app.register_blueprint(blueprint, url_prefix='/<lang_code>')
Run Code Online (Sandbox Code Playgroud)