From 05900ff556a592398cc725b69aebfd3a48f54a60 Mon Sep 17 00:00:00 2001 From: Piero Toffanin Date: Wed, 4 Jan 2023 12:15:18 -0500 Subject: [PATCH] Translation scripts --- babel.cfg | 2 ++ compile_translations.py | 16 ++++++++++ libretranslate/app.py | 21 +++++++++++-- .../js/app.js => templates/app.js.template} | 2 +- libretranslate/templates/index.html | 2 +- libretranslate/translations/.gitignore | 1 + requirements.txt | 1 + update_translations.py | 31 +++++++++++++++++++ 8 files changed, 71 insertions(+), 5 deletions(-) create mode 100644 babel.cfg create mode 100755 compile_translations.py rename libretranslate/{static/js/app.js => templates/app.js.template} (99%) create mode 100644 libretranslate/translations/.gitignore create mode 100755 update_translations.py diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 0000000..b335d31 --- /dev/null +++ b/babel.cfg @@ -0,0 +1,2 @@ +[python: **.py] +[jinja2: **/templates/**] \ No newline at end of file diff --git a/compile_translations.py b/compile_translations.py new file mode 100755 index 0000000..55076d3 --- /dev/null +++ b/compile_translations.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +import sys +import os +from babel.messages.frontend import main as pybabel + +if __name__ == "__main__": + translations_dir = os.path.join("libretranslate", "translations") + if not os.path.isdir(translations_dir): + os.makedirs(translations_dir) + + print("Compiling translations") + sys.argv = ["", "compile", "-d", translations_dir] + pybabel() + + + diff --git a/libretranslate/app.py b/libretranslate/app.py index 6375a05..73be457 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -15,6 +15,7 @@ from flask_swagger_ui import get_swaggerui_blueprint from translatehtml import translate_html from werkzeug.utils import secure_filename from werkzeug.exceptions import HTTPException +from flask_babel import Babel, gettext as _ from libretranslate import flood, remove_translated_files, security from libretranslate.language import detect_languages, improve_translation_formatting @@ -53,7 +54,7 @@ def get_req_api_key(): def get_json_dict(request): d = request.get_json() if not isinstance(d, dict): - abort(400, description="Invalid JSON format") + abort(400, description=_("Invalid JSON format")) return d @@ -121,7 +122,7 @@ def create_app(args): # Map userdefined frontend languages to argos language object. if args.frontend_language_source == "auto": frontend_argos_language_source = type( - "obj", (object,), {"code": "auto", "name": "Auto Detect"} + "obj", (object,), {"code": "auto", "name": _("Auto Detect")} ) else: frontend_argos_language_source = next( @@ -294,6 +295,14 @@ def create_app(args): return render_template("javascript-licenses.html") + @bp.route("/static/js/app.js") + @limiter.exempt + def appjs(): + if args.disable_web_ui: + abort(404) + + return render_template("app.js.template") + @bp.get("/languages") @limiter.exempt def langs(): @@ -1002,12 +1011,18 @@ def create_app(args): swag["info"]["version"] = get_version() swag["info"]["title"] = "LibreTranslate" - @app.route(API_URL) @limiter.exempt def spec(): return jsonify(swag) + babel = Babel(app) + @babel.localeselector + def get_locale(): + # TODO: populate from available locales + return request.accept_languages.best_match(['en', 'it']) + + # Call factory function to create our blueprint swaggerui_blueprint = get_swaggerui_blueprint(SWAGGER_URL, API_URL) if args.url_prefix: diff --git a/libretranslate/static/js/app.js b/libretranslate/templates/app.js.template similarity index 99% rename from libretranslate/static/js/app.js rename to libretranslate/templates/app.js.template index 6957b04..1c61fa1 100644 --- a/libretranslate/static/js/app.js +++ b/libretranslate/templates/app.js.template @@ -28,7 +28,7 @@ document.addEventListener('DOMContentLoaded', function(){ detectedLangText: "", - copyTextLabel: "Copy text", + copyTextLabel: {{ _("Copy text") }}, suggestions: false, isSuggesting: false, diff --git a/libretranslate/templates/index.html b/libretranslate/templates/index.html index 6061fd1..cc596cb 100644 --- a/libretranslate/templates/index.html +++ b/libretranslate/templates/index.html @@ -3,7 +3,7 @@ - LibreTranslate - Free and Open Source Machine Translation API + LibreTranslate - {{ _("Free and Open Source Machine Translation API") }} diff --git a/libretranslate/translations/.gitignore b/libretranslate/translations/.gitignore new file mode 100644 index 0000000..d0f6ec9 --- /dev/null +++ b/libretranslate/translations/.gitignore @@ -0,0 +1 @@ +**/*.mo diff --git a/requirements.txt b/requirements.txt index bb13088..f81df00 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ Flask==2.2.2 flask-swagger==0.2.14 flask-swagger-ui==4.11.1 Flask-Limiter==2.6.3 +Flask-Babel==2.0.0 waitress==2.1.2 expiringdict==1.2.2 LTpycld2==0.42 diff --git a/update_translations.py b/update_translations.py new file mode 100755 index 0000000..ecc22d9 --- /dev/null +++ b/update_translations.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python +import sys +import os +from babel.messages.frontend import main as pybabel +from libretranslate.language import load_languages + +# Update strings +if __name__ == "__main__": + translations_dir = os.path.join("libretranslate", "translations") + if not os.path.isdir(translations_dir): + os.makedirs(translations_dir) + + messagespot = os.path.join(translations_dir, "messages.pot") + print("Updating %s" % messagespot) + sys.argv = ["", "extract", "-F", "babel.cfg", "-o", messagespot, "libretranslate"] + pybabel() + + # Load list of languages + print("Loading languages") + languages = [l.code for l in load_languages() if l != "en"] + print(languages) + languages = ["it"] + + for l in languages: + cmd = "init" + if os.path.isdir(os.path.join(translations_dir, l)): + cmd = "update" + + sys.argv = ["", cmd, "-i", messagespot, "-d", translations_dir, "-l", l] + pybabel() +