From 4e07c69a856e38c7964e8cdb4972c44be1f56d68 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Fri, 10 Jul 2026 19:42:51 +0200 Subject: [PATCH] =?UTF-8?q?feat(tableau):=20traduire=20les=20libell=C3=A9s?= =?UTF-8?q?=20de=20filtre=20AG=20Grid=20en=20fran=C3=A7ais=20(#41)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Menu de filtre de colonne (Contient, Égal à, Vide, ET/OU, etc.) traduit via l'option native AG Grid localeText, exposée par dashGridOptions. N'affecte pas l'apparence de base conservée au Lot 1 (aucun thème/CSS custom) — uniquement le texte des libellés. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/figures.py | 38 +++++++++++++++++++++++++++++++++++++- tests/test_figures.py | 21 +++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/figures.py b/src/figures.py index 974e902..bdfb690 100644 --- a/src/figures.py +++ b/src/figures.py @@ -1069,10 +1069,45 @@ def get_top_org_table(data, org_type: str, extra_columns: list, filters: bool = ) +# Libellés du menu de filtre AG Grid, traduits en français (option native +# AG Grid localeText, exposée via dashGridOptions — n'affecte pas l'apparence +# de base conservée au Lot 1, seulement le texte). +AG_GRID_LOCALE_FR = { + # Filtres texte / nombre / date + "contains": "Contient", + "notContains": "Ne contient pas", + "equals": "Égal à", + "notEqual": "Différent de", + "startsWith": "Commence par", + "endsWith": "Se termine par", + "blank": "Vide", + "notBlank": "Non vide", + "empty": "Choisir une option", + "lessThan": "Inférieur à", + "lessThanOrEqual": "Inférieur ou égal à", + "greaterThan": "Supérieur à", + "greaterThanOrEqual": "Supérieur ou égal à", + "inRange": "Entre", + "inRangeStart": "de", + "inRangeEnd": "à", + # Chrome du menu de filtre + "filterOoo": "Filtrer...", + "applyFilter": "Appliquer", + "resetFilter": "Réinitialiser", + "clearFilter": "Effacer", + "cancelFilter": "Annuler", + "andCondition": "ET", + "orCondition": "OU", + "noRowsToShow": "Aucune ligne à afficher", + "loadingOoo": "Chargement...", +} + + def ag_grid(grid_id: str, column_defs: list[dict]) -> "dag.AgGrid": """Grille AG Grid server-side (infinite) pour la page Tableau. - Apparence de base d'AG Grid (aucun thème custom au Lot 1). + Apparence de base d'AG Grid (aucun thème custom au Lot 1) ; libellés + de filtre traduits en français via localeText. """ return dag.AgGrid( id=grid_id, @@ -1086,6 +1121,7 @@ def ag_grid(grid_id: str, column_defs: list[dict]) -> "dag.AgGrid": "rowBuffer": 0, "infiniteInitialRowCount": 100, "suppressCellFocus": True, + "localeText": AG_GRID_LOCALE_FR, }, columnSize="responsiveSizeToFit", style={"height": "70vh", "width": "100%"}, diff --git a/tests/test_figures.py b/tests/test_figures.py index 2b62ea1..23b8383 100644 --- a/tests/test_figures.py +++ b/tests/test_figures.py @@ -349,3 +349,24 @@ def test_bounds_to_center_zoom_center_is_bbox_midpoint(): center, _ = bounds_to_center_zoom(40.0, 0.0, 50.0, 4.0) assert center == [45.0, 2.0] + + +def test_ag_grid_locale_text_translates_common_filter_labels(): + from src.figures import ag_grid + + grid = ag_grid("tableau_grid", []) + locale_text = grid.dashGridOptions["localeText"] + + assert locale_text["equals"] == "Égal à" + assert locale_text["contains"] == "Contient" + assert locale_text["blank"] == "Vide" + assert locale_text["notBlank"] == "Non vide" + + +def test_ag_grid_keeps_base_appearance(): + """Pas de thème/className custom au Lot 1 (spec de design).""" + from src.figures import ag_grid + + grid = ag_grid("tableau_grid", []) + + assert getattr(grid, "className", None) in (None, "")