| import os |
| import subprocess |
| from flask import request, session, jsonify |
| from flask_babel import Babel |
|
|
|
|
| def get_languages_from_dir(directory): |
| """Return a list of directory names in the given directory.""" |
| return [name for name in os.listdir(directory) |
| if os.path.isdir(os.path.join(directory, name))] |
|
|
|
|
| BABEL_DEFAULT_LOCALE = 'en_US' |
| BABEL_LANGUAGES = get_languages_from_dir('translations') |
|
|
|
|
| def create_babel(app): |
| """Create and initialize a Babel instance with the given Flask app.""" |
| babel = Babel(app) |
| app.config['BABEL_DEFAULT_LOCALE'] = BABEL_DEFAULT_LOCALE |
| app.config['BABEL_LANGUAGES'] = BABEL_LANGUAGES |
|
|
| babel.init_app(app, locale_selector=get_locale) |
| compile_translations() |
|
|
|
|
| def get_locale(): |
| """Get the user's locale from the session or the request's accepted languages.""" |
| return session.get('language') or request.accept_languages.best_match(BABEL_LANGUAGES) |
|
|
|
|
| def get_languages(): |
| """Return a list of available languages in JSON format.""" |
| return jsonify(BABEL_LANGUAGES) |
|
|
|
|
| def compile_translations(): |
| """Compile the translation files.""" |
| result = subprocess.run( |
| ['pybabel', 'compile', '-d', 'translations'], |
| stdout=subprocess.PIPE, |
| ) |
|
|
| if result.returncode != 0: |
| raise Exception( |
| f'Compiling translations failed:\n{result.stdout.decode()}') |
|
|
| print('Translations compiled successfully') |
|
|