From e5e09f0f307b3ecadc03bdd2a504309531fecb28 Mon Sep 17 00:00:00 2001 From: sepehr Date: Tue, 1 Sep 2026 20:55:31 +0200 Subject: [PATCH] feat(pptx,ui): retentative mauvaise ecriture pour PowerPoint + lien liste RTL interface - PowerPoint beneficie du garde-fou de retentative (arabe livre pour du persan etc.), comme Word, Excel et PDF - l'interface : la liste des locales RTL renvoie desormais explicitement a la reference serveur (core/languages.py) pour eviter tout oubli lors d'un futur ajout de langue d'affichage --- frontend/src/lib/i18n.tsx | 5 +++++ translators/pptx_translator.py | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/i18n.tsx b/frontend/src/lib/i18n.tsx index e914d85..91c5dfa 100644 --- a/frontend/src/lib/i18n.tsx +++ b/frontend/src/lib/i18n.tsx @@ -44,6 +44,11 @@ const VALID_LOCALES: ReadonlyArray = [ ]; const DEFAULT_LOCALE: Locale = "en"; +// Locales d'affichage écrites de droite à gauche. Doit couvrir toutes les +// locales RTL de VALID_LOCALES — la référence côté serveur est +// RTL_LANGUAGES dans core/languages.py (ar, he, fa, ur, ku, ps, ug, sd, +// yi, dv, ckb) : toute nouvelle locale RTL ajoutée à VALID_LOCALES doit +// figurer ici, sinon l'interface restera affichée de gauche à droite. const RTL_LOCALES: ReadonlyArray = ["ar", "fa"]; type TranslationParams = Record; diff --git a/translators/pptx_translator.py b/translators/pptx_translator.py index 8af4a73..a3ff684 100644 --- a/translators/pptx_translator.py +++ b/translators/pptx_translator.py @@ -619,6 +619,24 @@ class PowerPointTranslator: ) miss_pos += 1 + # Wrong-script guard: re-ask once (with a reinforced instruction) + # for translations delivered in the wrong alphabet — e.g. Arabic + # delivered for a Persian target. + from translators.segments import retry_wrong_script + + def _retry_translate(retry_texts, hint): + if self._provider is not None: + return self._translate_with_provider( + retry_texts, target_language, source_language, extra_prompt=hint + ) + return self._translate_with_legacy( + retry_texts, target_language, source_language + ) + + translated, _script_fixed = retry_wrong_script( + texts, translated, target_language, _retry_translate + ) + recorder = getattr(self, "_segment_recorder", None) if recorder is not None: recorder.record_pairs(zip(texts, translated)) @@ -632,7 +650,8 @@ class PowerPointTranslator: return dict(self._translation_stats) def _translate_with_provider( - self, texts: List[str], target_language: str, source_language: str + self, texts: List[str], target_language: str, source_language: str, + extra_prompt: Optional[str] = None, ) -> List[str]: """Translate using the TranslationProvider.translate_batch() interface.""" from services.providers.base import TranslationProvider as NewTranslationProvider @@ -650,6 +669,10 @@ class PowerPointTranslator: if is_new_style: from services.providers.schemas import TranslationRequest custom_prompt = getattr(self, "_custom_prompt", None) + if extra_prompt: + custom_prompt = ( + f"{custom_prompt}\n\n{extra_prompt}" if custom_prompt else extra_prompt + ) metadata = {"custom_prompt": custom_prompt} if custom_prompt else None requests = [