diff --git a/libretranslate/app.py b/libretranslate/app.py index d2a9415..69752b6 100644 --- a/libretranslate/app.py +++ b/libretranslate/app.py @@ -789,17 +789,18 @@ def create_app(args): if source_lang == "auto": candidate_langs = detect_languages(src_texts) detected_src_lang = candidate_langs[0] + src_lang = get_language_with_fallback(detected_src_lang["language"], languages) else: detected_src_lang = {"confidence": 100.0, "language": source_lang} + src_lang = next((l for l in languages if l.code == source_lang), None) else: detected_src_lang = {"confidence": 0.0, "language": "en"} - - src_lang = get_language_with_fallback(detected_src_lang["language"], languages) + src_lang = next((l for l in languages if l.code == "en"), None) if src_lang is None: abort(400, description=_("%(lang)s is not supported", lang=source_lang)) - tgt_lang = get_language_with_fallback(target_lang, languages) + tgt_lang = next((l for l in languages if l.code == target_lang), None) if tgt_lang is None: abort(400, description=_("%(lang)s is not supported",lang=target_lang)) @@ -977,12 +978,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 = get_language_with_fallback(source_lang, languages) + src_lang = next((l for l in languages if l.code == source_lang), None) if src_lang is None and source_lang != "auto": abort(400, description=_("%(lang)s is not supported", lang=source_lang)) - tgt_lang = get_language_with_fallback(target_lang, languages) + tgt_lang = next((l for l in languages if l.code == target_lang), None) if tgt_lang is None: abort(400, description=_("%(lang)s is not supported", lang=target_lang)) diff --git a/libretranslate/language.py b/libretranslate/language.py index cc7ae24..a2f3d91 100644 --- a/libretranslate/language.py +++ b/libretranslate/language.py @@ -54,7 +54,9 @@ def get_language_with_fallback(lang_code, languages): language_variants = { 'pt': ['pb'], - 'pb': ['pt'] + 'pb': ['pt'], + 'zh': ['zt'], + 'zt': ['zh'] } fallbacks = language_variants.get(lang_code, []) diff --git a/libretranslate/tests/test_api/test_language_variant_fallback.py b/libretranslate/tests/test_api/test_language_variant_fallback.py index 5a9a58d..e9ab858 100644 --- a/libretranslate/tests/test_api/test_language_variant_fallback.py +++ b/libretranslate/tests/test_api/test_language_variant_fallback.py @@ -29,11 +29,11 @@ def client_with_pt(app_with_pt): return app_with_pt.test_client() -def test_portuguese_fallback_pb_to_pt(client_with_pt): - response = client_with_pt.post("/translate", data={ - "q": "Hello", - "source": "en", - "target": "pb", +def test_auto_detect_fallback_pt_to_pb(client_with_pb): + response = client_with_pb.post("/translate", data={ + "q": "Olá mundo", + "source": "auto", + "target": "en", "format": "text" }) @@ -43,7 +43,21 @@ def test_portuguese_fallback_pb_to_pt(client_with_pt): assert len(response_json["translatedText"]) > 0 -def test_portuguese_fallback_pt_to_pb(client_with_pb): +def test_auto_detect_fallback_pb_to_pt(client_with_pt): + response = client_with_pt.post("/translate", data={ + "q": "Olá mundo", + "source": "auto", + "target": "en", + "format": "text" + }) + + response_json = json.loads(response.data) + assert response.status_code == 200 + assert "translatedText" in response_json + assert len(response_json["translatedText"]) > 0 + + +def test_explicit_language_no_fallback(client_with_pb): response = client_with_pb.post("/translate", data={ "q": "Hello", "source": "en", @@ -52,6 +66,6 @@ def test_portuguese_fallback_pt_to_pb(client_with_pb): }) response_json = json.loads(response.data) - assert response.status_code == 200 - assert "translatedText" in response_json - assert len(response_json["translatedText"]) > 0 + assert response.status_code == 400 + assert "error" in response_json +