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
This commit is contained in:
2026-09-01 20:55:31 +02:00
parent 5d6b19d593
commit e5e09f0f30
2 changed files with 29 additions and 1 deletions

View File

@@ -44,6 +44,11 @@ const VALID_LOCALES: ReadonlyArray<Locale> = [
];
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<Locale> = ["ar", "fa"];
type TranslationParams = Record<string, string | number>;

View File

@@ -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 = [