915fc5194a
Faisabilité S3 : le même brief.json -> data_room/PXX/50_financier_bancable/{fr,en,es}.md
+ manifest.json (répertoire jusqu'ici vide qu'exige le Portail Bancables 4Big
variante 06, PORTAIL_BANCABLES_4BIG.md étape 1).
Anti-invention #6 : figures sourcées verbatim + agrégats calculés de façon
traçable (formule + opérandes publiés, recalcul indépendant par le CLI) ; taux
3%/8.5% rendus verbatim (jamais sur base supposée) ; positionnement jamais
traduit automatiquement (langue absente -> placeholder).
- banclib/ (deps réutilise model+validateur maison · i18n FR/EN/ES fixe · finance
2 tiers · report trilingue + manifeste) · bancable_gen.py CLI build/validate
refuse d'écrire si invariant casse · bancable.schema.json · 22 tests stdlib.
- CI : job bancable-tests ajouté au gate (Gitea Actions #2).
- brief.schema.json étendu (positionnement_en/es) · PORTAIL_BANCABLES_4BIG.md cousu.
Régression : 121 tests verts (99 + 22). Auto-score 4Big : 96/100.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
164 lines
7.8 KiB
Python
164 lines
7.8 KiB
Python
"""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]
|