Closed asteinlein closed 1 year ago
For reference, Flask-SQLAlchemy implements a get_app
method and uses that anywhere an app is required.
The same goes for localeselector
and timezoneselector
. They are bound to the Babel instance, so can't be configured separately for different apps 😢
FYI, Flask-SQLAlchemy and Flask-Mail store app specific states in app.extensions['NAME']
.
Hi, I am trying out version 3.0 that was just released and am hitting the deprecation in __init__.py
of a Flask app of:
@babel.localeselector
def get_locale():
....
What is the recomended approach to use instead of above, to be compatible with Flask-Babel v3.0? Thanks!
EDIT: As best I can tell, before the upgrade with the old decorator, this get_locale
method was getting called per-request. After the upgrade (dropping the decorator line), the method is no longer called and my app pages are no longer translated.
EDIT2: Sorry, my mistake. I found the answer digging into the diffs made to the documentation above. Leaving the answer for any others who hit this on upgrade to v3.0.
My old code:
babel = Babel(app)
@babel.localeselector
def get_locale():
...
Changed to work with Flask-Babel v3.0:
def get_locale():
...
babel = Babel(app, locale_selector=get_locale,)
Flask-Babel stores an app instance in
self.app
, which will be set ininit_app()
regardless. This means that using the same Babel instance with multiple apps (each app runningbabel_instance.init_app(app)
doesn't work as expected: Only the translations from the last app configured will be used.