from flask import Flask, request, session from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from flask_login import LoginManager from flask_cors import CORS from flask_babel import Babel, gettext as _ from config.config import Config # Initialize extensions db = SQLAlchemy() migrate = Migrate() login_manager = LoginManager() cors = CORS() babel = Babel() def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) # Initialize extensions with app db.init_app(app) migrate.init_app(app, db) login_manager.init_app(app) cors.init_app(app) # Login manager configuration login_manager.login_view = 'auth.login' login_manager.login_message = 'Por favor inicia sesión para acceder a esta página.' login_manager.login_message_category = 'info' # Import models to ensure they are registered from app.models import user # Register blueprints from app.routes import auth_bp, classrooms_bp, main_bp, schedule_bp, genetic_bp, genetic_web_bp app.register_blueprint(auth_bp, url_prefix="/") app.register_blueprint(classrooms_bp, url_prefix="/classrooms") app.register_blueprint(main_bp, url_prefix="/") app.register_blueprint(schedule_bp, url_prefix="/schedule") app.register_blueprint(genetic_bp) app.register_blueprint(genetic_web_bp) # Language selector function def get_locale(): # 1. Check if language is explicitly set in URL parameters lang = request.args.get('lang') if lang and lang in app.config['LANGUAGES']: return lang # 2. Check if user is authenticated and has a configured language in profile from flask_login import current_user if current_user.is_authenticated and getattr(current_user, 'preferred_language', None): if current_user.preferred_language in app.config['LANGUAGES']: return current_user.preferred_language # 3. Check if language is stored in session (e.g. manual switcher) if 'language' in session and session['language'] in app.config['LANGUAGES']: return session['language'] # 4. Check browser language preference by default (especially on login/guest) return request.accept_languages.best_match(app.config['LANGUAGES']) or app.config['BABEL_DEFAULT_LOCALE'] # Babel context processor @app.context_processor def inject_conf_vars(): return dict( languages=app.config['LANGUAGES'], current_lang=str(get_locale()) ) # Configure Babel babel.init_app(app, locale_selector=get_locale) return app