mirror of
https://github.com/DRYTRIX/TimeTracker.git
synced 2026-01-04 02:30:01 -06:00
- Integrate Flask-Babel and i18n utilities; initialize in app factory - Add `preferred_language` to `User` with Alembic migration (011_add_user_preferred_language) - Add `babel.cfg` and `scripts/extract_translations.py` - Add `translations/` for en, de, fr, it, nl, fi - Update templates to use `_()` and add language picker in navbar/profile - Respect locale in routes and context processors; persist user preference - Update requirements and Docker/Docker entrypoint for Babel/gettext support - Minor copy and style adjustments across pages Migration: run `alembic upgrade head`
85 lines
3.2 KiB
Python
85 lines
3.2 KiB
Python
from flask import g, request, current_app
|
|
from flask_babel import get_locale
|
|
from app.models import Settings
|
|
from app.utils.timezone import get_timezone_offset_for_timezone
|
|
|
|
def register_context_processors(app):
|
|
"""Register context processors for the application"""
|
|
|
|
@app.context_processor
|
|
def inject_settings():
|
|
"""Inject settings into all templates"""
|
|
try:
|
|
from app import db
|
|
# Check if we have an active database session
|
|
if db.session.is_active:
|
|
settings = Settings.get_settings()
|
|
return {
|
|
'settings': settings,
|
|
'currency': settings.currency,
|
|
'timezone': settings.timezone
|
|
}
|
|
except Exception as e:
|
|
# Log the error but continue with defaults
|
|
print(f"Warning: Could not inject settings: {e}")
|
|
pass
|
|
|
|
# Return defaults if settings not available
|
|
return {
|
|
'settings': None,
|
|
'currency': 'EUR',
|
|
'timezone': 'Europe/Rome'
|
|
}
|
|
|
|
@app.context_processor
|
|
def inject_globals():
|
|
"""Inject global variables into all templates"""
|
|
try:
|
|
from app import db
|
|
# Check if we have an active database session
|
|
if db.session.is_active:
|
|
settings = Settings.get_settings()
|
|
timezone_name = settings.timezone if settings else 'Europe/Rome'
|
|
else:
|
|
timezone_name = 'Europe/Rome'
|
|
except Exception as e:
|
|
# Log the error but continue with defaults
|
|
print(f"Warning: Could not inject globals: {e}")
|
|
timezone_name = 'Europe/Rome'
|
|
|
|
# Determine app version from environment or config
|
|
try:
|
|
import os
|
|
from app.config import Config
|
|
env_version = os.getenv('APP_VERSION')
|
|
# If running in GitHub Actions build, prefer tag-like versions
|
|
version_value = env_version or getattr(Config, 'APP_VERSION', None) or 'dev-0'
|
|
except Exception:
|
|
version_value = 'dev-0'
|
|
|
|
# Current locale code (e.g., 'en', 'de')
|
|
try:
|
|
current_locale = str(get_locale())
|
|
except Exception:
|
|
current_locale = 'en'
|
|
# Normalize to short code for comparisons (e.g., 'en' from 'en_US')
|
|
short_locale = (current_locale.split('_', 1)[0] if current_locale else 'en')
|
|
available_languages = current_app.config.get('LANGUAGES', {}) or {}
|
|
current_language_label = available_languages.get(short_locale, short_locale.upper())
|
|
|
|
return {
|
|
'app_name': 'Time Tracker',
|
|
'app_version': version_value,
|
|
'timezone': timezone_name,
|
|
'timezone_offset': get_timezone_offset_for_timezone(timezone_name),
|
|
'current_locale': current_locale,
|
|
'current_language_code': short_locale,
|
|
'current_language_label': current_language_label,
|
|
'config': current_app.config
|
|
}
|
|
|
|
@app.before_request
|
|
def before_request():
|
|
"""Set up request-specific data"""
|
|
g.request_start_time = request.start_time if hasattr(request, 'start_time') else None
|