0

我有一个使用Flask-Babel模块的Flask/Dash应用程序。登录并浏览页面后,翻译就像一个魅力。但是,我无法使其适用于始终以英文显示的登录页面。和都包含我为登录页面准备的翻译字符串,因此编译部分似乎工作正常。messages.pomessages.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(...)下面是上面调用的方法的一部分。在 Flask-Babel 与应用程序挂钩之后,我想注意到app.server从上面的代码传递给它(真的不知道这是否很重要):

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
)

我尝试了什么:再次为 Dash() 实例连接 Flask-Babel login_app,但这不起作用(无论如何它仍然是相同的app.server)。

我遇到过类似问题的这个 SO question,但它似乎特定于 Flask-Security 模块(不是我的情况)。

我缺少什么来翻译登录页面?

4

1 回答 1

1

虽然我还没有找到DashFlask-Login的组合在登录页面上无法与Flask-Babel一起使用的直接原因,但我通过解决方法解决了这个问题 - 我正在通过Dash 的回调动态更新生成的 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!')
于 2018-08-21T08:15:50.513 回答