"""i18n: locale resolution + a route to switch UI language. Order: explicit session choice -> authenticated user.locale -> Accept-Language -> default. """ from flask import Blueprint, session, redirect, request, current_app, url_for from flask_login import current_user from app.utils import safe_referrer i18n_bp = Blueprint("i18n", __name__) def select_locale(): supported = current_app.config["SUPPORTED_LOCALES"] # 1. explicit session override lang = session.get("lang") if lang in supported: return lang # 2. authenticated user's stored preference if current_user.is_authenticated and current_user.locale in supported: return current_user.locale # 3. browser preference best = request.accept_languages.best_match(supported) if best: return best # 4. default return current_app.config["DEFAULT_LOCALE"] @i18n_bp.route("/lang/") def set_lang(code): if code in current_app.config["SUPPORTED_LOCALES"]: session["lang"] = code # persist to profile when logged in if current_user.is_authenticated: from app.extensions import db current_user.locale = code db.session.commit() return redirect(safe_referrer(url_for("main.index")))