python-babel / flask-babel

i18n and l10n support for Flask based on Babel and pytz
https://python-babel.github.io/flask-babel/
Other
444 stars 159 forks source link

Incompatible with multiple apps with different translations #107

Closed asteinlein closed 1 year ago

asteinlein commented 8 years ago

Flask-Babel stores an app instance in self.app, which will be set in init_app() regardless. This means that using the same Babel instance with multiple apps (each app running babel_instance.init_app(app) doesn't work as expected: Only the translations from the last app configured will be used.

davidism commented 8 years ago

For reference, Flask-SQLAlchemy implements a get_app method and uses that anywhere an app is required.

timothyqiu commented 7 years ago

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'].

guydavis commented 1 year ago

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,)