"""Libellés FR/EN/ES du dossier financier bancable (fixes · sourcés CLAUDE.md). Les trois langues du dossier bancable sont IMPOSÉES par le Portail Bancables 4Big (`PORTAIL_BANCABLES_4BIG.md` : « Boutons langues FR 🇨🇦 · EN 🇺🇸 · ES 🇩🇴 »). Chaque colonne de ce dictionnaire est une traduction FIXE de libellés de gabarit : aucun libellé ne provient du brief, donc aucune donnée projet n'est traduite « à la volée » (ce qui serait une invention #6). Les seules chaînes libres du dossier (positionnement commercial) proviennent du brief, langue par langue, et restent en placeholder si absentes — jamais traduites automatiquement. """ from __future__ import annotations # Ordre canonique des langues (drapeaux = ceux du Portail Bancables 4Big). LANGS = ["fr", "en", "es"] LANG_FLAG = {"fr": "🇨🇦", "en": "🇺🇸", "es": "🇩🇴"} LANG_NOM = {"fr": "Français", "en": "English", "es": "Español"} LABELS: dict[str, dict[str, str]] = { "fr": { "doc_title": "Dossier financier bancable", "confidential": ( "⚠️ CONFIDENTIEL — diffusion restreinte. Document destiné aux " "personnes ressource (banquiers, notaires, investisseurs, CPA/UAF, " "ministères). Ne pas indexer, ne pas rediffuser." ), "synthetic": ( "⚠️ FIXTURE SYNTHÉTIQUE — données fictives de test. NE JAMAIS " "publier ni transmettre (CLAUDE.md #6)." ), "sec_positioning": "1. Positionnement", "sec_sourced": "2. Données financières sourcées", "sec_typologies": "3. Grille tarifaire par typologie", "sec_derived": "4. Agrégats & emplois — calculs traçables", "sec_canonical": "5. Paramètres canoniques OTO", "lbl_cout_construction": "Coût de construction total", "lbl_revenu_brut": "Revenu brut de vente projeté", "lbl_marge": "Marge projetée", "lbl_taux": "Taux de conversion USD↔DOP", "lbl_regime_fiscal": "Régime fiscal", "lbl_total_unites": "Total d'unités (Σ quantités typologies)", "lbl_valeur_catalogue_usd": "Valeur catalogue du programme (USD)", "lbl_valeur_catalogue_dop": "Valeur catalogue du programme (DOP)", "lbl_point_equilibre_unites": "Point d'équilibre pré-vente (en unités)", "lbl_edition": "Frais d'édition documentaire", "lbl_marketing": "Budget marketing", "lbl_point_equilibre_pct": "Point d'équilibre pré-vente", "lbl_devises": "Devises", "lbl_paiement": "Moyen de paiement", "lbl_format_doc": "Format des documents", "th_typologie": "Typologie", "th_quantite": "Nb unités", "th_prix_usd": "Prix « à partir de » (USD)", "th_prix_dop": "Prix (DOP)", "th_soustotal": "Sous-total catalogue (USD)", "note_calcule": "calculé", "note_fixe": "fixe", "note_missing": "Champs 🔴 manquants (non inventés · #6)", "note_taux_source": "source", "note_generated": "Projet", "word_units": "unités", "word_rounded": "arrondi supérieur", "word_base": "base à confirmer (non documentée · #9)", "word_none": "à confirmer (faisabilité en cours)", }, "en": { "doc_title": "Bankable financial dossier", "confidential": ( "⚠️ CONFIDENTIAL — restricted distribution. Intended for resource " "persons (bankers, notaries, investors, CPA/UAF, ministries). Do not " "index, do not redistribute." ), "synthetic": ( "⚠️ SYNTHETIC FIXTURE — fictional test data. NEVER publish or share " "(CLAUDE.md #6)." ), "sec_positioning": "1. Positioning", "sec_sourced": "2. Sourced financial data", "sec_typologies": "3. Price grid by unit type", "sec_derived": "4. Aggregates & uses of funds — traceable computations", "sec_canonical": "5. OTO canonical parameters", "lbl_cout_construction": "Total construction cost", "lbl_revenu_brut": "Projected gross sales revenue", "lbl_marge": "Projected margin", "lbl_taux": "USD↔DOP conversion rate", "lbl_regime_fiscal": "Tax regime", "lbl_total_unites": "Total units (Σ unit-type quantities)", "lbl_valeur_catalogue_usd": "Programme catalogue value (USD)", "lbl_valeur_catalogue_dop": "Programme catalogue value (DOP)", "lbl_point_equilibre_unites": "Pre-sale break-even (in units)", "lbl_edition": "Document edition fee", "lbl_marketing": "Marketing budget", "lbl_point_equilibre_pct": "Pre-sale break-even", "lbl_devises": "Currencies", "lbl_paiement": "Payment method", "lbl_format_doc": "Document format", "th_typologie": "Unit type", "th_quantite": "Units", "th_prix_usd": "Price “from” (USD)", "th_prix_dop": "Price (DOP)", "th_soustotal": "Catalogue subtotal (USD)", "note_calcule": "computed", "note_fixe": "fixed", "note_missing": "Missing 🔴 fields (never invented · #6)", "note_taux_source": "source", "note_generated": "Project", "word_units": "units", "word_rounded": "rounded up", "word_base": "base to be confirmed (undocumented · #9)", "word_none": "to be confirmed (feasibility in progress)", }, "es": { "doc_title": "Expediente financiero bancable", "confidential": ( "⚠️ CONFIDENCIAL — distribución restringida. Destinado a personas " "recurso (banqueros, notarios, inversionistas, CPA/UAF, ministerios). " "No indexar, no redistribuir." ), "synthetic": ( "⚠️ DATOS SINTÉTICOS — datos ficticios de prueba. NUNCA publicar ni " "compartir (CLAUDE.md #6)." ), "sec_positioning": "1. Posicionamiento", "sec_sourced": "2. Datos financieros con fuente", "sec_typologies": "3. Tabla de precios por tipología", "sec_derived": "4. Agregados y usos — cálculos trazables", "sec_canonical": "5. Parámetros canónicos OTO", "lbl_cout_construction": "Costo total de construcción", "lbl_revenu_brut": "Ingreso bruto de ventas proyectado", "lbl_marge": "Margen proyectado", "lbl_taux": "Tasa de conversión USD↔DOP", "lbl_regime_fiscal": "Régimen fiscal", "lbl_total_unites": "Total de unidades (Σ cantidades por tipología)", "lbl_valeur_catalogue_usd": "Valor de catálogo del programa (USD)", "lbl_valeur_catalogue_dop": "Valor de catálogo del programa (DOP)", "lbl_point_equilibre_unites": "Punto de equilibrio de preventa (en unidades)", "lbl_edition": "Cargo de edición documental", "lbl_marketing": "Presupuesto de marketing", "lbl_point_equilibre_pct": "Punto de equilibrio de preventa", "lbl_devises": "Monedas", "lbl_paiement": "Medio de pago", "lbl_format_doc": "Formato de documentos", "th_typologie": "Tipología", "th_quantite": "Unidades", "th_prix_usd": "Precio «desde» (USD)", "th_prix_dop": "Precio (DOP)", "th_soustotal": "Subtotal catálogo (USD)", "note_calcule": "calculado", "note_fixe": "fijo", "note_missing": "Campos 🔴 faltantes (nunca inventados · #6)", "note_taux_source": "fuente", "note_generated": "Proyecto", "word_units": "unidades", "word_rounded": "redondeo superior", "word_base": "base por confirmar (no documentada · #9)", "word_none": "por confirmar (factibilidad en curso)", }, } def t(lang: str, key: str) -> str: """Libellé traduit. Lève KeyError si la clé n'existe pas (bug de gabarit).""" return LABELS[lang][key]