|
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') |
|
|