""" Backend Localization Handler Manages server-side translations using Flask-Babel """ from flask import request, session from flask_babel import Babel, gettext, ngettext, lazy_gettext import os import logging logger = logging.getLogger(__name__) # Supported languages SUPPORTED_LANGUAGES = ['en', 'fr', 'es', 'de', 'it', 'cs', 'nl', 'hi', 'fa', 'ar', 'ru', 'uk', 'zh_CN', 'zh_HK', 'ja', 'pt', 'ko', 'tr', 'pl', 'he'] DEFAULT_LANGUAGE = 'en' # Global babel instance babel = None def init_babel(app): """Initialize Babel with Flask app""" global babel # Configure Babel app.config['LANGUAGES'] = { 'en': 'English', 'fr': 'Français', 'es': 'Español', 'de': 'Deutsch', 'it': 'Italiano', 'cs': 'Čeština', 'nl': 'Nederlands', 'hi': 'हिन्दी', 'fa': 'فارسی', 'ar': 'العربية', 'ru': 'Русский', 'uk': 'Українська', 'zh_CN': '简体中文', 'zh_HK': '繁體中文', 'ja': '日本語', 'pt': 'Português', 'ko': '한국어', 'tr': 'Türkçe', 'pl': 'Polski', 'he': 'עברית' } app.config['BABEL_DEFAULT_LOCALE'] = DEFAULT_LANGUAGE app.config['BABEL_DEFAULT_TIMEZONE'] = 'UTC' babel = Babel() babel.init_app(app, locale_selector=get_current_language) logger.info("Babel initialized successfully") return babel def get_current_language(): """Get current language from various sources""" # 1. Check URL parameter (for testing) if request and request.args.get('lang') in SUPPORTED_LANGUAGES: return request.args.get('lang') # 2. Check cookie if request and request.cookies.get('lang') in SUPPORTED_LANGUAGES: return request.cookies.get('lang') # 3. Check session if session.get('language') in SUPPORTED_LANGUAGES: return session.get('language') # 4. Check user preferences (if authenticated) try: from backend.auth_utils import get_current_user_info user_info = get_current_user_info() if user_info and user_info.get('preferred_language') in SUPPORTED_LANGUAGES: return user_info['preferred_language'] except: pass # User not authenticated or error getting user info # 5. Check Accept-Language header if request: browser_lang = request.accept_languages.best_match(SUPPORTED_LANGUAGES) if browser_lang: return browser_lang # 6. Fallback to default return DEFAULT_LANGUAGE def set_language(language): """Set language for current session""" if language in SUPPORTED_LANGUAGES: session['language'] = language return True return False def get_supported_languages(): """Get list of supported languages""" return SUPPORTED_LANGUAGES def is_supported_language(language): """Check if language is supported""" return language in SUPPORTED_LANGUAGES # Convenience functions for translations def _(text): """Translate text (alias for gettext)""" return gettext(text) def _n(singular, plural, num): """Translate text with pluralization (alias for ngettext)""" return ngettext(singular, plural, num) def _l(text): """Lazy translation (alias for lazy_gettext)""" return lazy_gettext(text) # Common translations for the application COMMON_TRANSLATIONS = { # Authentication 'login': _l('Login'), 'logout': _l('Logout'), 'register': _l('Register'), 'username': _l('Username'), 'password': _l('Password'), 'email': _l('Email'), 'first_name': _l('First Name'), 'last_name': _l('Last Name'), # Navigation 'home': _l('Home'), 'settings': _l('Settings'), 'status': _l('Status'), 'about': _l('About'), # Common actions 'save': _l('Save'), 'cancel': _l('Cancel'), 'delete': _l('Delete'), 'edit': _l('Edit'), 'search': _l('Search'), 'export': _l('Export'), 'import': _l('Import'), # Messages 'success': _l('Success'), 'error': _l('Error'), 'warning': _l('Warning'), 'loading': _l('Loading...'), 'saved_successfully': _l('Saved successfully'), 'deleted_successfully': _l('Deleted successfully'), 'invalid_request': _l('Invalid request'), 'unauthorized': _l('Unauthorized'), 'not_found': _l('Not found'), 'server_error': _l('Server error'), # Warranties 'warranties': _l('Warranties'), 'warranty': _l('Warranty'), 'product_name': _l('Product Name'), 'purchase_date': _l('Purchase Date'), 'warranty_duration': _l('Warranty Duration'), 'expiration_date': _l('Expiration Date'), 'vendor': _l('Vendor'), 'status': _l('Status'), 'active': _l('Active'), 'expired': _l('Expired'), 'expiring_soon': _l('Expiring Soon'), 'lifetime': _l('Lifetime'), } def get_translation(key, default=None): """Get translation for a key with fallback""" if key in COMMON_TRANSLATIONS: return str(COMMON_TRANSLATIONS[key]) return default or key def format_error_message(error_type, details=None): """Format error messages with localization""" error_messages = { 'validation_error': _('Validation error'), 'authentication_error': _('Authentication error'), 'authorization_error': _('Authorization error'), 'not_found_error': _('Resource not found'), 'server_error': _('Internal server error'), 'file_too_large': _('File is too large'), 'invalid_file_type': _('Invalid file type'), } message = error_messages.get(error_type, _('An error occurred')) if details: message += f": {details}" return message