Flask-Babel 无法在登录页面上工作
Flask-Babel not working on the login page
我有一个 Flask/Dash app that uses the Flask-Babel 模块。登录并浏览页面后,翻译就像一个魅力。但是,我无法让它始终以英文显示的登录页面工作。 messages.po
和 messages.mo
都包含我为登录页面准备的翻译字符串,所以编译部分似乎工作正常。
这是我的 app.py
的一个片段(带有硬编码的西班牙语选项):
import dash
from dash.dependencies import Input, Output
from flask import Flask, request
from flask_babel import Babel
# some more imports...
# (...)
def main():
update_dataframes()
app = dash.Dash(
"MyApp",
url_base_pathname='/summary',
static_folder="static",
sharing=True,
csrf_protect=False
)
# Hook Flask-Babel to the app
babel = Babel(app.server)
@babel.localeselector
def get_locale():
# return request.accept_languages.best_match(context.config['LANGUAGES'].keys())
return 'es'
# App layout
app.layout = build_app_layout(context)
# Setup callbacks
setup_callbacks(app)
setup_login(app, app.server, context.config)
# Start Dash/Flask app
app.server.run(
port=context.config['DEPLOY']['SERVER_PORT'],
debug=context.config['DEPLOY']['SERVER_DEBUG'],
threaded=context.config['DEPLOY']['SERVER_THREADED']
)
# Interval tread to update all dataframes
ThreadPoolExecutor(max_workers=1).submit(update_dataframes_thread)
if __name__ == '__main__':
main()
下面是上面调用的 setup_login(...)
方法的一部分。我想注意到 app.server
从上面的代码传递给它,after Flask-Babel 已经连接到应用程序(不知道这是否重要很多):
from dash_flask_login import FlaskLoginAuth
from flask_login import LoginManager, UserMixin, login_user, logout_user
# (...)
login_app = Dash(
name='login-app',
url_base_pathname='/login',
server=app.server
)
我尝试了什么: 再次为 login_app
Dash() 实例连接 Flask-Babel,但这没有用(无论如何它仍然是一样的app.server
).
我遇到过 this SO question 类似的问题,但它似乎特定于 Flask-Security 模块(不是我的情况)。
翻译登录页面我缺少什么?
尽管我还没有找到 Dash 和 Flask-Login 的组合不能与 [= 一起使用的直接原因16=]Flask-Babel 在登录页面上,我用一个变通方法解决了这个问题——我在加载页面后通过 Dash's callback decorator 动态更新生成的 HTML 组件。该函数只是将原始英文 some_string
替换为 gettext(some_string)
标记,该标记在回调中被正确检测到。通过这种方式,页面以英文加载并立即得到翻译,因为回调开始起作用。最小示例:
app.layout = html.Div(
[
html.H1('Hello World!', id='h1'),
html.Div(html.A('login', href='/login')
]
)
# Display the message translated to another language
@app.callback(
Output('h1', 'children'),
[Input('url', 'search')]
)
def translate_message(children):
return gettext('Hello World!')
我有一个 Flask/Dash app that uses the Flask-Babel 模块。登录并浏览页面后,翻译就像一个魅力。但是,我无法让它始终以英文显示的登录页面工作。 messages.po
和 messages.mo
都包含我为登录页面准备的翻译字符串,所以编译部分似乎工作正常。
这是我的 app.py
的一个片段(带有硬编码的西班牙语选项):
import dash
from dash.dependencies import Input, Output
from flask import Flask, request
from flask_babel import Babel
# some more imports...
# (...)
def main():
update_dataframes()
app = dash.Dash(
"MyApp",
url_base_pathname='/summary',
static_folder="static",
sharing=True,
csrf_protect=False
)
# Hook Flask-Babel to the app
babel = Babel(app.server)
@babel.localeselector
def get_locale():
# return request.accept_languages.best_match(context.config['LANGUAGES'].keys())
return 'es'
# App layout
app.layout = build_app_layout(context)
# Setup callbacks
setup_callbacks(app)
setup_login(app, app.server, context.config)
# Start Dash/Flask app
app.server.run(
port=context.config['DEPLOY']['SERVER_PORT'],
debug=context.config['DEPLOY']['SERVER_DEBUG'],
threaded=context.config['DEPLOY']['SERVER_THREADED']
)
# Interval tread to update all dataframes
ThreadPoolExecutor(max_workers=1).submit(update_dataframes_thread)
if __name__ == '__main__':
main()
下面是上面调用的 setup_login(...)
方法的一部分。我想注意到 app.server
从上面的代码传递给它,after Flask-Babel 已经连接到应用程序(不知道这是否重要很多):
from dash_flask_login import FlaskLoginAuth
from flask_login import LoginManager, UserMixin, login_user, logout_user
# (...)
login_app = Dash(
name='login-app',
url_base_pathname='/login',
server=app.server
)
我尝试了什么: 再次为 login_app
Dash() 实例连接 Flask-Babel,但这没有用(无论如何它仍然是一样的app.server
).
我遇到过 this SO question 类似的问题,但它似乎特定于 Flask-Security 模块(不是我的情况)。
翻译登录页面我缺少什么?
尽管我还没有找到 Dash 和 Flask-Login 的组合不能与 [= 一起使用的直接原因16=]Flask-Babel 在登录页面上,我用一个变通方法解决了这个问题——我在加载页面后通过 Dash's callback decorator 动态更新生成的 HTML 组件。该函数只是将原始英文 some_string
替换为 gettext(some_string)
标记,该标记在回调中被正确检测到。通过这种方式,页面以英文加载并立即得到翻译,因为回调开始起作用。最小示例:
app.layout = html.Div(
[
html.H1('Hello World!', id='h1'),
html.Div(html.A('login', href='/login')
]
)
# Display the message translated to another language
@app.callback(
Output('h1', 'children'),
[Input('url', 'search')]
)
def translate_message(children):
return gettext('Hello World!')