Adds i18n/l10n support for Flask applications.
—
Configuration and setup of Flask-Babel for Flask applications, including the main Babel class, domain management, and context utilities.
from typing import List, Optional, Callable, Union
from babel import Locale
from babel.support import Translations, NullTranslations
from pytz import timezone
from werkzeug.datastructures import ImmutableDictThe central controller class for configuring Flask-Babel behavior in Flask applications.
class Babel:
def __init__(self, app=None, date_formats=None, configure_jinja=True, *args, **kwargs):
"""
Creates a new Babel instance.
Parameters:
- app: Flask application instance (optional)
- date_formats: Custom date format mappings (optional)
- configure_jinja: Whether to configure Jinja2 filters automatically (default: True)
"""
def init_app(self, app, default_locale='en', default_domain='messages',
default_translation_directories='translations', default_timezone='UTC',
locale_selector=None, timezone_selector=None):
"""
Initialize Babel for a specific Flask application.
Parameters:
- app: Flask application to configure
- default_locale: Default locale string (default: 'en')
- default_domain: Default message domain (default: 'messages')
- default_translation_directories: Translation directories (default: 'translations')
- default_timezone: Default timezone string (default: 'UTC')
- locale_selector: Function to select locale for requests (optional)
- timezone_selector: Function to select timezone for requests (optional)
"""
def list_translations(self):
"""
Returns list of all locales that have translations.
Returns:
List of babel.Locale objects for available translations
"""
@property
def default_locale(self):
"""Default locale as babel.Locale object"""
@property
def default_timezone(self):
"""Default timezone as pytz.timezone object"""
@property
def domain(self):
"""Message domain as string"""
@property
def domain_instance(self):
"""Domain instance for this Babel configuration"""
default_date_formats: ImmutableDict
"""
Default date format mappings for datetime formatting.
Contains format defaults for datetime, date, time formatting including
short, medium, long, and full format variants.
"""Manage translation domains for organizing message catalogs.
class Domain:
def __init__(self, translation_directories=None, domain='messages'):
"""
Create a localization domain.
Parameters:
- translation_directories: List of directories containing translations
- domain: Domain name string (default: 'messages')
"""
def as_default(self):
"""Set this domain as default for current request"""
def gettext(self, string, **variables):
"""Translate string in this domain"""
def ngettext(self, singular, plural, num, **variables):
"""Translate plural string in this domain"""
def pgettext(self, context, string, **variables):
"""Translate string with context in this domain"""
def lazy_gettext(self, string, **variables):
"""Return lazy-evaluated translation in this domain"""
def lazy_ngettext(self, singular, plural, num, **variables):
"""Return lazy-evaluated plural translation in this domain"""
def npgettext(self, context, singular, plural, num, **variables):
"""Translate string with context and plural forms in this domain"""
def get_translations(self):
"""
Get translations object for this domain.
Returns:
babel.support.Translations or NullTranslations object
"""
def get_translations_cache(self, ctx):
"""
Get translations cache for this domain.
Parameters:
- ctx: Request context
Returns:
Dictionary-like cache object
"""
@property
def translation_directories(self):
"""List of translation directories for this domain"""Access current configuration and context information.
def get_babel(app=None):
"""
Get BabelConfiguration for app.
Parameters:
- app: Flask app (optional, uses current_app if None)
Returns:
BabelConfiguration instance
"""
def get_locale():
"""
Get current locale for request.
Returns:
babel.Locale object or None if outside request context
"""
def get_timezone():
"""
Get current timezone for request.
Returns:
pytz.timezone object or None if outside request context
"""
def get_domain():
"""
Get current Domain instance.
Returns:
Domain object for current request
"""
def refresh():
"""
Refresh cached locale and timezone information.
Useful when changing locale/timezone mid-request.
"""Temporarily override locale settings.
def force_locale(locale):
"""
Context manager to temporarily override locale.
Parameters:
- locale: Locale string (e.g., 'en_US', 'de_DE')
Usage:
with force_locale('de_DE'):
message = gettext('Hello') # Returns German translation
"""Internal configuration structures.
@dataclass
class BabelConfiguration:
"""Application-specific Babel configuration"""
default_locale: str
default_timezone: str
default_domain: str
default_directories: List[str]
translation_directories: List[str]
instance: Babel
locale_selector: Optional[Callable] = None
timezone_selector: Optional[Callable] = Nonefrom flask import Flask
from flask_babel import Babel
babel = Babel()
def create_app():
app = Flask(__name__)
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
babel.init_app(app)
return appfrom flask import request
from flask_babel import Babel
app = Flask(__name__)
@babel.localeselector
def get_locale():
# Check URL parameter first
if 'lang' in request.args:
return request.args['lang']
# Fall back to browser preference
return request.accept_languages.best_match(['en', 'es', 'fr', 'de'])from flask_babel import Domain
# Create domains for different parts of application
admin_domain = Domain(domain='admin')
user_domain = Domain(domain='user')
# Use specific domain
admin_message = admin_domain.gettext('Admin Dashboard')
user_message = user_domain.gettext('Welcome')Install with Tessl CLI
npx tessl i tessl/pypi-flask-babel