From 83cc8dd7b88c4a4c5e0a7ffe35b27c6b85aa48fa Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 7 Feb 2026 22:49:42 +0000 Subject: [PATCH] Implement Portuguese language variant fallback for Auto Detect Co-authored-by: pierotofy <1951843+pierotofy@users.noreply.github.com> --- libretranslate/app.py | 12 ++++++------ libretranslate/language.py | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libretranslate/app.py b/libretranslate/app.py index d20104c..d2a9415 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -23,7 +23,7 @@ from werkzeug.http import http_date from werkzeug.utils import secure_filename from libretranslate import flood, remove_translated_files, scheduler, secret, security, storage, cache -from libretranslate.language import model2iso, iso2model, detect_languages, improve_translation_formatting +from libretranslate.language import model2iso, iso2model, detect_languages, improve_translation_formatting, get_language_with_fallback from libretranslate.locales import ( _, _lazy, @@ -794,12 +794,12 @@ def create_app(args): 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) + src_lang = get_language_with_fallback(detected_src_lang["language"], languages) if src_lang is None: abort(400, description=_("%(lang)s is not supported", lang=source_lang)) - tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None) + tgt_lang = get_language_with_fallback(target_lang, languages) if tgt_lang is None: abort(400, description=_("%(lang)s is not supported",lang=target_lang)) @@ -977,12 +977,12 @@ def create_app(args): if os.path.splitext(file.filename)[1] not in frontend_argos_supported_files_format: abort(400, description=_("Invalid request: file format not supported")) - src_lang = next(iter([l for l in languages if l.code == source_lang]), None) + src_lang = get_language_with_fallback(source_lang, languages) if src_lang is None and source_lang != "auto": abort(400, description=_("%(lang)s is not supported", lang=source_lang)) - tgt_lang = next(iter([l for l in languages if l.code == target_lang]), None) + tgt_lang = get_language_with_fallback(target_lang, languages) if tgt_lang is None: abort(400, description=_("%(lang)s is not supported", lang=target_lang)) @@ -1005,7 +1005,7 @@ def create_app(args): src_texts = argostranslatefiles.get_texts(filepath) candidate_langs = detect_languages(src_texts) detected_src_lang = candidate_langs[0] - src_lang = next(iter([l for l in languages if l.code == detected_src_lang["language"]]), None) + src_lang = get_language_with_fallback(detected_src_lang["language"], languages) if src_lang is None: abort(400, description=_("%(lang)s is not supported", lang=detected_src_lang["language"])) diff --git a/libretranslate/language.py b/libretranslate/language.py index 42f8866..1284634 100644 --- a/libretranslate/language.py +++ b/libretranslate/language.py @@ -47,6 +47,24 @@ def load_lang_codes(): languages = load_languages() return tuple(l.code for l in languages) +def get_language_with_fallback(lang_code, languages): + lang = next(iter([l for l in languages if l.code == lang_code]), None) + if lang is not None: + return lang + + language_variants = { + 'pt': ['pb'], + 'pb': ['pt'] + } + + fallbacks = language_variants.get(lang_code, []) + for fallback_code in fallbacks: + fallback_lang = next(iter([l for l in languages if l.code == fallback_code]), None) + if fallback_lang is not None: + return fallback_lang + + return None + def detect_languages(text): # detect batch processing if isinstance(text, list):