From 7715d5f717672974120047fb2e406133b44b2f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 27 Jul 2025 04:32:40 +0200 Subject: [PATCH 01/10] Save files without trailing whitespace --- libretranslate/app.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/libretranslate/app.py b/libretranslate/app.py index ff02bd7..58907fc 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -173,11 +173,11 @@ def filter_unique(seq, extra): def detect_translatable(src_texts): if isinstance(src_texts, list): return any(detect_translatable(t) for t in src_texts) - + for ch in src_texts: if not (ord(ch) in emojis): return True - + # All emojis return False @@ -259,7 +259,7 @@ def create_app(args): return max(req_cost, int(math.ceil(getattr(request, 'duration', 0) / args.req_time_cost))) else: return req_cost - + def get_limits_key_func(): if args.api_keys: def func(): @@ -358,7 +358,7 @@ def create_app(args): 'alternatives': [], 'detectedLanguage': { 'confidence': 100, 'language': 'en' } }), 200)) - + if (args.require_api_key_fingerprint and key_missing): if flood.fingerprint_mismatch(ip, get_fingerprint()): @@ -470,7 +470,7 @@ def create_app(args): api_secret = secret.get_current_secret_js() else: api_secret = secret.get_bogus_secret_js() - + response = Response(render_template("app.js.template", url_prefix=args.url_prefix, get_api_key_link=args.get_api_key_link, @@ -516,8 +516,8 @@ def create_app(args): type: string description: Supported target language codes """ - return jsonify([{"code": model2iso(l.code), - "name": _lazy(l.name), + return jsonify([{"code": model2iso(l.code), + "name": _lazy(l.name), "targets": model2iso(language_pairs.get(l.code, [])) } for l in languages]) @@ -586,7 +586,7 @@ def create_app(args): default: 0 example: 3 required: false - description: Preferred number of alternative translations + description: Preferred number of alternative translations - in: formData name: api_key schema: @@ -704,7 +704,7 @@ def create_app(args): abort(400, description=_("Invalid request: missing %(name)s parameter", name='source')) if not target_lang: abort(400, description=_("Invalid request: missing %(name)s parameter", name='target')) - + try: num_alternatives = max(0, int(num_alternatives)) except ValueError: @@ -743,7 +743,7 @@ def create_app(args): if batch: request.req_cost = max(1, len(q)) - + translatable = detect_translatable(src_texts) if translatable: if source_lang == "auto": @@ -753,7 +753,7 @@ def create_app(args): detected_src_lang = {"confidence": 100.0, "language": source_lang} else: detected_src_lang = {"confidence": 0.0, "language": "en"} - + src_lang = next(iter([l for l in languages if l.code == detected_src_lang["language"]]), None) if src_lang is None: @@ -790,10 +790,10 @@ def create_app(args): else: translated_text = text # Cannot translate, send the original text back alternatives = [] - + batch_results.append(translated_text) batch_alternatives.append(alternatives) - + result = {"translatedText": batch_results} if source_lang == "auto": @@ -818,7 +818,7 @@ def create_app(args): else: translated_text = q # Cannot translate, send the original text back alternatives = [] - + result = {"translatedText": translated_text} if source_lang == "auto": From 3f9a991b5219d2fe1f103fc6318d7f24067bebc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 27 Jul 2025 04:33:06 +0200 Subject: [PATCH 02/10] Use werkzeug middleware for prefix to fix the path of static files Closes #601 --- libretranslate/app.py | 15 +++++---------- libretranslate/main.py | 5 ++++- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/libretranslate/app.py b/libretranslate/app.py index 58907fc..7026cc1 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -189,8 +189,8 @@ def create_app(args): from libretranslate.language import load_languages - swagger_url = args.url_prefix + "/docs" # Swagger UI (w/o trailing '/') - api_url = args.url_prefix + "/spec" + swagger_url = "/docs" # Swagger UI (w/o trailing '/') + api_url = "/spec" bp = Blueprint('Main app', __name__) @@ -1270,10 +1270,8 @@ def create_app(args): if args.debug: app.config["TEMPLATES_AUTO_RELOAD"] = True - if args.url_prefix: - app.register_blueprint(bp, url_prefix=args.url_prefix) - else: - app.register_blueprint(bp) + + app.register_blueprint(bp) limiter.init_app(app) @@ -1302,9 +1300,6 @@ def create_app(args): # Call factory function to create our blueprint swaggerui_blueprint = get_swaggerui_blueprint(swagger_url, api_url) - if args.url_prefix: - app.register_blueprint(swaggerui_blueprint, url_prefix=swagger_url) - else: - app.register_blueprint(swaggerui_blueprint) + app.register_blueprint(swaggerui_blueprint) return app diff --git a/libretranslate/main.py b/libretranslate/main.py index 4a279c7..c8a8e8e 100644 --- a/libretranslate/main.py +++ b/libretranslate/main.py @@ -4,6 +4,7 @@ import sys from libretranslate.app import create_app from libretranslate.default_values import DEFAULT_ARGUMENTS as DEFARGS +from werkzeug.middleware.dispatcher import DispatcherMiddleware def get_args(): @@ -255,7 +256,9 @@ def get_args(): def main(): args = get_args() - app = create_app(args) + app = DispatcherMiddleware(None, { + args.url_prefix: create_app(args) + }) if '--wsgi' in sys.argv: return app From e8b94765b434862913e9fbd1541ae53268a95bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 27 Jul 2025 04:33:28 +0200 Subject: [PATCH 03/10] Improve prefix arg description --- libretranslate/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretranslate/main.py b/libretranslate/main.py index c8a8e8e..cd6581c 100644 --- a/libretranslate/main.py +++ b/libretranslate/main.py @@ -246,7 +246,7 @@ def get_args(): "--url-prefix", default=DEFARGS['URL_PREFIX'], type=str, - help="Add prefix to URL: example.com:5000/url-prefix/", + help="Add a prefix like /url-prefix to URL: example.com:5000/url-prefix/", ) args = parser.parse_args() if args.url_prefix and not args.url_prefix.startswith('/'): From 7b6f505df8c069a74658f4fd5a15d3e8c21651c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 27 Jul 2025 05:03:49 +0200 Subject: [PATCH 04/10] Fix prefix of js file, improve error reporting --- libretranslate/templates/app.js.template | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/libretranslate/templates/app.js.template b/libretranslate/templates/app.js.template index f3c1ec0..0b66d61 100644 --- a/libretranslate/templates/app.js.template +++ b/libretranslate/templates/app.js.template @@ -54,7 +54,7 @@ document.addEventListener('DOMContentLoaded', function(){ const langsRequest = new XMLHttpRequest(); langsRequest.open("GET", BaseUrl + "/languages", true); - + settingsRequest.onload = function() { if (this.status >= 200 && this.status < 400) { self.settings = JSON.parse(this.response); @@ -79,18 +79,18 @@ document.addEventListener('DOMContentLoaded', function(){ } } } else { - self.error = {{ _e("Cannot load %(url)s", url="/frontend/settings") }}; + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/frontend/settings") }}; self.loading = false; } }; settingsRequest.onerror = function() { - self.error = {{ _e("Cannot load %(url)s", url="/frontend/settings") }}; + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/frontend/settings") }}; self.loading = false; }; langsRequest.onerror = function() { - self.error = {{ _e("Cannot load %(url)s", url="/languages") }}; + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/languages") }}; self.loading = false; }; @@ -284,7 +284,7 @@ document.addEventListener('DOMContentLoaded', function(){ }; request.onerror = function() { - self.error = {{ _e("Cannot load %(url)s", url="/translate") }}; + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/translate") }}; self.loadingTranslation = false; }; @@ -354,7 +354,7 @@ document.addEventListener('DOMContentLoaded', function(){ }; request.onerror = function() { - self.error = {{ _e("Cannot load %(url)s", url="/suggest") }}; + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/suggest") }}; self.loadingTranslation = false; }; @@ -443,7 +443,7 @@ document.addEventListener('DOMContentLoaded', function(){ } translateFileRequest.onerror = function() { - const message = {{ _e("Cannot load %(url)s", url="/translate_file") }}; + const message = {{ _e("Cannot load %(url)s", url=url_prefix + "/translate_file") }}; self.error = message; self.loadingFileTranslation = false; self.inputFile = false; @@ -497,7 +497,7 @@ function handleLangsResponse(self, response) { self.handleInput(new Event('none')) } } else { - self.error = {{ _e("Cannot load %(url)s", url="/languages") }}; + self.error = {{ _e("Cannot load %(url)s", url=url_prefix + "/languages") }}; } self.loading = false; From c89ff000eb00243149fa3d5a8444a6f0aa652893 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sandro=20J=C3=A4ckel?= Date: Sun, 27 Jul 2025 06:00:08 +0200 Subject: [PATCH 05/10] Fix home naivation when clicking on logo when using url prefix --- libretranslate/templates/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libretranslate/templates/index.html b/libretranslate/templates/index.html index 2ad0fee..e288cec 100644 --- a/libretranslate/templates/index.html +++ b/libretranslate/templates/index.html @@ -60,7 +60,7 @@