Repository: gridsuite/gridstudy-app
Pull request #2802: Add missing translations for AgGrid
Author: login: Tristan-WorkGH
Created: 2025-04-17T07:19:43Z | Merged: 2025-04-23T14:41:06Z

Linked to gridsuite/commons-ui#714


Diff:
diff --git a/package-lock.json b/package-lock.json
index f73b846317..d620a0868d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -11,7 +11,7 @@
             "dependencies": {
                 "@emotion/react": "^11.14.0",
                 "@emotion/styled": "^11.14.0",
-                "@gridsuite/commons-ui": "0.94.0",
+                "@gridsuite/commons-ui": "0.95.0",
                 "@hello-pangea/dnd": "^18.0.1",
                 "@hookform/resolvers": "^4.0.0",
                 "@mui/icons-material": "^5.16.14",
@@ -112,6 +112,12 @@
                 "npm": "^10.9.2"
             }
         },
+        "node_modules/@ag-grid-community/locale": {
+            "version": "33.2.3",
+            "resolved": "https://registry.npmjs.org/@ag-grid-community/locale/-/locale-33.2.3.tgz",
+            "integrity": "sha512-5R/nqCwvnEMPg8OCL9AOokj9qv+6aOvph40cS0+jwNGAJd2v5Z/LSCm2oHJLwyc11PSiIIgwLXq81lp1ymnz2A==",
+            "license": "MIT"
+        },
         "node_modules/@ampproject/remapping": {
             "version": "2.3.0",
             "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
@@ -3336,11 +3342,12 @@
             }
         },
         "node_modules/@gridsuite/commons-ui": {
-            "version": "0.94.0",
-            "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.94.0.tgz",
-            "integrity": "sha512-mI9f/rq1PFV9zqtFf5XdL8JGEphCb4WHkHhElf4TPBGwxz5JxJQqPDsZNF760lbRMhZvGaqaxxoWJC3Rq5imZw==",
+            "version": "0.95.0",
+            "resolved": "https://registry.npmjs.org/@gridsuite/commons-ui/-/commons-ui-0.95.0.tgz",
+            "integrity": "sha512-squCtrVorLTHo0R4DitiHN9EAnuABc02sm1x1q5UstIbRZNPO/wS9YkZMcFO6ce+hJ1KBDSP7rmy5BXnJxswrg==",
             "license": "MPL-2.0",
             "dependencies": {
+                "@ag-grid-community/locale": "^33.1.0",
                 "@hello-pangea/dnd": "^18.0.1",
                 "@react-querybuilder/dnd": "^8.2.0",
                 "@react-querybuilder/material": "^8.2.0",
diff --git a/package.json b/package.json
index e857c16543..696d9414a3 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,7 @@
     "dependencies": {
         "@emotion/react": "^11.14.0",
         "@emotion/styled": "^11.14.0",
-        "@gridsuite/commons-ui": "0.94.0",
+        "@gridsuite/commons-ui": "0.95.0",
         "@hello-pangea/dnd": "^18.0.1",
         "@hookform/resolvers": "^4.0.0",
         "@mui/icons-material": "^5.16.14",
diff --git a/src/components/app-wrapper.jsx b/src/components/app-wrapper.jsx
index 8fd592fdcc..467635a6ae 100644
--- a/src/components/app-wrapper.jsx
+++ b/src/components/app-wrapper.jsx
@@ -55,8 +55,8 @@ import { Provider, useSelector } from 'react-redux';
 import messages_en from '../translations/en.json';
 import messages_fr from '../translations/fr.json';
 import messages_plugins from '../plugins/translations';
-import aggrid_locale_en from '../translations/external/aggrid-locale-en';
-import aggrid_locale_fr from '../translations/external/aggrid-locale-fr';
+import { grid_en } from '../translations/grid-en';
+import { grid_fr } from '../translations/grid-fr';
 import backend_locale_en from '../translations/external/backend-locale-en';
 import backend_locale_fr from '../translations/external/backend-locale-fr';
 import dynamic_mapping_models_en from '../translations/external/dynamic-mapping-models-en';
@@ -305,7 +305,7 @@ const messages = {
         ...commonButtonEn,
         ...componentsEn,
         ...equipmentsEn,
-        ...aggrid_locale_en,
+        ...grid_en,
         ...backend_locale_en,
         ...dynamic_mapping_models_en,
         ...csv_locale_en,
@@ -337,7 +337,7 @@ const messages = {
         ...commonButtonFr,
         ...componentsFr,
         ...equipmentsFr,
-        ...aggrid_locale_fr,
+        ...grid_fr,
         ...backend_locale_fr,
         ...dynamic_mapping_models_fr,
         ...csv_locale_fr,
diff --git a/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx b/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx
index 7a0c770b6e..f3c752a082 100644
--- a/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx
+++ b/src/components/dialogs/line-types-catalog/line-types-catalog-selector-dialog.tsx
@@ -15,6 +15,7 @@ import { suppressEventsToPreventEditMode } from '../commons/utils';
 import { AgGridReact } from 'ag-grid-react';
 import { ColDef } from 'ag-grid-community';
 import { LineTypeInfo } from './line-catalog.type';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 const LineTypesCatalogSelectorDialogTabs = {
     AERIAL_TAB: 0,
@@ -278,6 +279,7 @@ const LineTypesCatalogSelectorDialog: FunctionComponent<LineTypesCatalogSelector
                     rowSelection="single"
                     onSelectionChanged={onSelectionChanged}
                     onGridReady={scrollToPreselectedElement} // Highlights the preselected row when AGGrid is ready
+                    overrideLocales={AGGRID_LOCALES}
                 />
             );
         },
diff --git a/src/components/dialogs/network-modifications/tabular-creation/tabular-creation-form.tsx b/src/components/dialogs/network-modifications/tabular-creation/tabular-creation-form.tsx
index 1f35fb9bf1..4e85262207 100644
--- a/src/components/dialogs/network-modifications/tabular-creation/tabular-creation-form.tsx
+++ b/src/components/dialogs/network-modifications/tabular-creation/tabular-creation-form.tsx
@@ -26,6 +26,7 @@ import Papa from 'papaparse';
 import { ColDef } from 'ag-grid-community';
 import GridItem from '../../commons/grid-item';
 import { useCSVPicker } from 'components/utils/inputs/input-hooks';
+import { AGGRID_LOCALES } from '../../../../translations/not-intl/aggrid-locales';
 
 const TabularCreationForm = () => {
     const intl = useIntl();
@@ -226,6 +227,7 @@ const TabularCreationForm = () => {
                     pagination
                     paginationPageSize={100}
                     suppressDragLeaveHidesColumns
+                    overrideLocales={AGGRID_LOCALES}
                 />
             </Grid>
         </Grid>
diff --git a/src/components/dialogs/network-modifications/tabular-modification/tabular-modification-form.tsx b/src/components/dialogs/network-modifications/tabular-modification/tabular-modification-form.tsx
index 692cad8606..1e26900a48 100644
--- a/src/components/dialogs/network-modifications/tabular-modification/tabular-modification-form.tsx
+++ b/src/components/dialogs/network-modifications/tabular-modification/tabular-modification-form.tsx
@@ -27,6 +27,7 @@ import Papa from 'papaparse';
 import { ColDef } from 'ag-grid-community';
 import GridItem from '../../commons/grid-item';
 import { useCSVPicker } from 'components/utils/inputs/input-hooks';
+import { AGGRID_LOCALES } from '../../../../translations/not-intl/aggrid-locales';
 
 const TabularModificationForm = () => {
     const intl = useIntl();
@@ -224,6 +225,7 @@ const TabularModificationForm = () => {
                     pagination
                     paginationPageSize={100}
                     suppressDragLeaveHidesColumns
+                    overrideLocales={AGGRID_LOCALES}
                 />
             </Grid>
         </Grid>
diff --git a/src/components/dialogs/network-modifications/voltage-init-modification/voltage-init-modification-dialog.tsx b/src/components/dialogs/network-modifications/voltage-init-modification/voltage-init-modification-dialog.tsx
index 3fe2f313c4..74b928b593 100644
--- a/src/components/dialogs/network-modifications/voltage-init-modification/voltage-init-modification-dialog.tsx
+++ b/src/components/dialogs/network-modifications/voltage-init-modification/voltage-init-modification-dialog.tsx
@@ -30,6 +30,7 @@ import { AgGridReact } from 'ag-grid-react';
 import { FetchStatus } from '../../../../services/utils.type';
 import type { ColDef, RowDataUpdatedEvent } from 'ag-grid-community';
 import { suppressEventsToPreventEditMode } from '../../commons/utils';
+import { AGGRID_LOCALES } from '../../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     container: {
@@ -516,6 +517,7 @@ const VoltageInitModificationDialog: FunctionComponent<VoltageInitModificationPr
                             columnDefs={columnDefs}
                             rowSelection="single"
                             onRowDataUpdated={onRowDataUpdated}
+                            overrideLocales={AGGRID_LOCALES}
                         />
                     </Box>
                 </Box>
diff --git a/src/components/dialogs/parameters/dynamicsimulation/curve-parameters.tsx b/src/components/dialogs/parameters/dynamicsimulation/curve-parameters.tsx
index e83b98b6e5..a6a526f07a 100644
--- a/src/components/dialogs/parameters/dynamicsimulation/curve-parameters.tsx
+++ b/src/components/dialogs/parameters/dynamicsimulation/curve-parameters.tsx
@@ -17,6 +17,7 @@ import { AgGridReact } from 'ag-grid-react';
 import { Curve as CurveType } from './curve/dialog/curve-preview';
 import { ValueFormatterParams } from 'ag-grid-community';
 import { Curve } from './dynamic-simulation-utils';
+import { AGGRID_LOCALES } from '../../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     grid: {
@@ -170,6 +171,7 @@ const CurveParameters = ({ path }: { path: string }) => {
                             defaultColDef={defaultColDef}
                             rowSelection={'multiple'}
                             onSelectionChanged={onSelectionChanged}
+                            overrideLocales={AGGRID_LOCALES}
                         />
                     </Box>
                 </Grid>
diff --git a/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/curve-preview.tsx b/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/curve-preview.tsx
index a16729555d..1e4024a323 100644
--- a/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/curve-preview.tsx
+++ b/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/curve-preview.tsx
@@ -12,6 +12,7 @@ import { CustomAGGrid } from '@gridsuite/commons-ui';
 import { ValueFormatterParams } from 'ag-grid-community';
 import { AgGridReact } from 'ag-grid-react';
 import { EQUIPMENT_TYPES } from 'components/utils/equipment-types';
+import { AGGRID_LOCALES } from '../../../../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     grid: {
@@ -137,7 +138,7 @@ const CurvePreview = forwardRef<CurveHandler>((props, ref) => {
         <>
             <Grid item>
                 <Typography sx={styles.h6} variant="h6">
-                    <FormattedMessage id={'DynamicSimulationCurveToAdd'}></FormattedMessage>
+                    <FormattedMessage id={'DynamicSimulationCurveToAdd'} />
                     {` (${selectedRowsLength} / ${rowData.length})`}
                 </Typography>
             </Grid>
@@ -150,7 +151,8 @@ const CurvePreview = forwardRef<CurveHandler>((props, ref) => {
                         defaultColDef={defaultColDef}
                         rowSelection={'multiple'}
                         onSelectionChanged={onSelectionChanged}
-                    ></CustomAGGrid>
+                        overrideLocales={AGGRID_LOCALES}
+                    />
                 </Box>
             </Grid>
         </>
diff --git a/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx b/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx
index 135d27cdcb..f5dee24440 100644
--- a/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx
+++ b/src/components/dialogs/parameters/dynamicsimulation/curve/dialog/equipment-filter.tsx
@@ -19,6 +19,7 @@ import { buildExpertFilter, CURVE_EQUIPMENT_TYPES, NOMINAL_VOLTAGE_UNIT } from '
 import { EQUIPMENT_TYPES } from 'components/utils/equipment-types';
 import { AppState } from 'redux/reducer';
 import { AgGridReact } from 'ag-grid-react';
+import { AGGRID_LOCALES } from '../../../../../../translations/not-intl/aggrid-locales';
 
 export interface GetSelectedEquipmentsHandle {
     api: {
@@ -325,6 +326,7 @@ const EquipmentFilter = forwardRef<GetSelectedEquipmentsHandle, EquipmentFilterP
                                 onSelectionChanged={handleEquipmentSelectionChanged}
                                 loading={isFetching}
                                 overlayLoadingTemplate={intl.formatMessage({ id: 'LoadingRemoteData' })}
+                                overrideLocales={AGGRID_LOCALES}
                             />
                         </Box>
                     </Grid>
diff --git a/src/components/graph/menus/network-modifications/network-modifications-table.tsx b/src/components/graph/menus/network-modifications/network-modifications-table.tsx
index 3a2f0f4125..c454d441cf 100644
--- a/src/components/graph/menus/network-modifications/network-modifications-table.tsx
+++ b/src/components/graph/menus/network-modifications/network-modifications-table.tsx
@@ -32,6 +32,7 @@ import { PARAM_DEVELOPER_MODE } from 'utils/config-params';
 import { useParameterState } from 'components/dialogs/parameters/use-parameters-state';
 import RootNetworkChipCellRenderer from './root-network-chip-cell-renderer';
 import SwitchCellRenderer from './switch-cell-renderer';
+import { AGGRID_LOCALES } from '../../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     container: (theme: Theme) => ({
@@ -203,6 +204,7 @@ const NetworkModificationsTable: React.FC<NetworkModificationsTableProps> = ({
                 onRowDragEnd={onRowDragEnd}
                 rowDragManaged={!isRowDragDisabled}
                 suppressNoRowsOverlay={true}
+                overrideLocales={AGGRID_LOCALES}
             />
         </Box>
     );
diff --git a/src/components/report-viewer/log-table.tsx b/src/components/report-viewer/log-table.tsx
index 6b8e59d048..c54428d286 100644
--- a/src/components/report-viewer/log-table.tsx
+++ b/src/components/report-viewer/log-table.tsx
@@ -34,6 +34,7 @@ import {
     FILTER_DATA_TYPES,
     FILTER_TEXT_COMPARATORS,
 } from '../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type';
+import { AGGRID_LOCALES } from '../../translations/not-intl/aggrid-locales';
 
 const getColumnFilterValue = (array: FilterConfig[] | null, columnName: string): any => {
     return array?.find((item) => item.column === columnName)?.value ?? null;
@@ -371,6 +372,7 @@ const LogTable = ({
                     getRowStyle={rowStyleFormat}
                     onGridReady={onGridReady}
                     defaultColDef={defaultColumnDefinition}
+                    overrideLocales={AGGRID_LOCALES}
                 />
             </Box>
         </Box>
diff --git a/src/components/results/dynamic-security-analysis/dynamic-security-analysis-result-synthesis.tsx b/src/components/results/dynamic-security-analysis/dynamic-security-analysis-result-synthesis.tsx
index 163fbe2b4f..82062678fd 100644
--- a/src/components/results/dynamic-security-analysis/dynamic-security-analysis-result-synthesis.tsx
+++ b/src/components/results/dynamic-security-analysis/dynamic-security-analysis-result-synthesis.tsx
@@ -21,6 +21,7 @@ import { fetchDynamicSecurityAnalysisStatus } from '../../../services/study/dyna
 import { MEDIUM_COLUMN_WIDTH } from '../dynamicsimulation/utils/dynamic-simulation-result-utils';
 import { dynamicSecurityAnalysisResultInvalidations } from '../../computing-status/use-all-computing-status';
 import { useNodeData } from 'components/use-node-data';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     loader: {
@@ -106,6 +107,7 @@ const DynamicSecurityAnalysisResultSynthesis = memo(
                     defaultColDef={defaultColDef}
                     overlayNoRowsTemplate={overlayMessage}
                     enableCellTextSelection
+                    overrideLocales={AGGRID_LOCALES}
                 />
             </>
         );
diff --git a/src/components/results/dynamicsimulation/dynamic-simulation-result-synthesis.tsx b/src/components/results/dynamicsimulation/dynamic-simulation-result-synthesis.tsx
index 8a8f79318e..21cff79cac 100644
--- a/src/components/results/dynamicsimulation/dynamic-simulation-result-synthesis.tsx
+++ b/src/components/results/dynamicsimulation/dynamic-simulation-result-synthesis.tsx
@@ -21,6 +21,7 @@ import { AppState } from '../../../redux/reducer';
 import { CustomAGGrid } from '@gridsuite/commons-ui';
 import { dynamicSimulationResultInvalidations } from '../../computing-status/use-all-computing-status';
 import { useNodeData } from 'components/use-node-data';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     loader: {
@@ -106,6 +107,7 @@ const DynamicSimulationResultSynthesis = memo(
                     defaultColDef={defaultColDef}
                     overlayNoRowsTemplate={overlayMessage}
                     enableCellTextSelection
+                    overrideLocales={AGGRID_LOCALES}
                 />
             </>
         );
diff --git a/src/components/results/dynamicsimulation/dynamic-simulation-result-timeline.tsx b/src/components/results/dynamicsimulation/dynamic-simulation-result-timeline.tsx
index 27fee093f0..a3958cbd42 100644
--- a/src/components/results/dynamicsimulation/dynamic-simulation-result-timeline.tsx
+++ b/src/components/results/dynamicsimulation/dynamic-simulation-result-timeline.tsx
@@ -32,6 +32,7 @@ import {
     FILTER_NUMBER_COMPARATORS,
     FILTER_TEXT_COMPARATORS,
 } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 const styles = {
     loader: {
@@ -181,6 +182,7 @@ const DynamicSimulationResultTimeline = memo(
                     columnDefs={columnDefs}
                     defaultColDef={defaultColDef}
                     overlayNoRowsTemplate={overlayMessage}
+                    overrideLocales={AGGRID_LOCALES}
                 />
             </>
         );
diff --git a/src/components/results/securityanalysis/security-analysis-table.tsx b/src/components/results/securityanalysis/security-analysis-table.tsx
index d103e18114..596477b26d 100644
--- a/src/components/results/securityanalysis/security-analysis-table.tsx
+++ b/src/components/results/securityanalysis/security-analysis-table.tsx
@@ -15,6 +15,7 @@ import { useSelector } from 'react-redux';
 import { AppState } from '../../../redux/reducer';
 import { ComputingType } from '../../computing-status/computing-type';
 import { CustomAGGrid } from '@gridsuite/commons-ui';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 export const SecurityAnalysisTable: FunctionComponent<SecurityAnalysisResultProps> = ({
     rows,
@@ -60,6 +61,7 @@ export const SecurityAnalysisTable: FunctionComponent<SecurityAnalysisResultProp
             defaultColDef={defaultColDef}
             onGridReady={onGridReady}
             overlayNoRowsTemplate={overlayNoRowsTemplate}
+            overrideLocales={AGGRID_LOCALES}
             {...agGridProps}
         />
     );
diff --git a/src/components/results/sensitivity-analysis/sensitivity-analysis-result.tsx b/src/components/results/sensitivity-analysis/sensitivity-analysis-result.tsx
index c692d6a091..5460f89a00 100644
--- a/src/components/results/sensitivity-analysis/sensitivity-analysis-result.tsx
+++ b/src/components/results/sensitivity-analysis/sensitivity-analysis-result.tsx
@@ -33,6 +33,7 @@ import type {
     RowDataUpdatedEvent,
 } from 'ag-grid-community';
 import { Sensitivity } from '../../../services/study/sensitivity-analysis.type';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 function isColDef(col: ColDef | ColGroupDef): col is ColDef {
     return (col as ColDef).field !== undefined;
@@ -263,6 +264,7 @@ function SensitivityAnalysisResult({
                 overlayNoRowsTemplate={message}
                 onGridColumnsChanged={handleGridColumnsChanged}
                 onRowDataUpdated={handleRowDataUpdated}
+                overrideLocales={AGGRID_LOCALES}
                 {...props}
             />
         </div>
diff --git a/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx b/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx
index 2289f356e6..8d0bc1bee8 100644
--- a/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx
+++ b/src/components/results/shortcircuit/shortcircuit-analysis-result-table.tsx
@@ -30,6 +30,7 @@ import {
     FILTER_TEXT_COMPARATORS,
     FilterEnumsType,
 } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-filter.type';
+import { AGGRID_LOCALES } from '../../../translations/not-intl/aggrid-locales';
 
 interface ShortCircuitAnalysisResultProps {
     result: SCAFaultResult[];
@@ -417,6 +418,7 @@ const ShortCircuitAnalysisResultTable: FunctionComponent<ShortCircuitAnalysisRes
                 columnDefs={columns}
                 overlayNoRowsTemplate={message}
                 onRowDataUpdated={handleRowDataUpdated}
+                overrideLocales={AGGRID_LOCALES}
             />
         </Box>
     );
diff --git a/src/components/spreadsheet/config/common-column-definitions.ts b/src/components/spreadsheet/config/common-column-definitions.ts
index 4048a50b43..6a8a934071 100644
--- a/src/components/spreadsheet/config/common-column-definitions.ts
+++ b/src/components/spreadsheet/config/common-column-definitions.ts
@@ -12,7 +12,7 @@ import {
     NumericCellRenderer,
     RowIndexCellRenderer,
 } from '../utils/cell-renderers';
-import { ColDef } from 'ag-grid-community';
+import type { ColDef, IFilterOptionDef } from 'ag-grid-community';
 import CustomHeaderComponent from '../../custom-aggrid/custom-aggrid-header';
 import { CustomAggridComparatorFilter } from '../../custom-aggrid/custom-aggrid-filters/custom-aggrid-comparator-filter';
 import { SPREADSHEET_SORT_STORE } from '../../../utils/store-sort-filter-fields';
@@ -66,12 +66,12 @@ export const enumColumnDefinition = (displayName: string, tab: string): ColDef =
             filterOptions: [
                 {
                     displayKey: 'customInRange',
-                    displayName: 'customInRange',
+                    displayName: 'customInRange', // translation key
                     predicate: (filterValues: string[], cellValue: string) =>
                         // We receive here the filter enum values as a string (filterValue)
                         filterValues[0]?.includes(cellValue) ?? false,
                 },
-            ],
+            ] as IFilterOptionDef[],
         },
         headerComponent: CustomHeaderComponent,
         headerComponentParams: {
@@ -136,7 +136,7 @@ export const booleanColumnDefinition = (displayName: string, tab: string): ColDe
             filterOptions: [
                 {
                     displayKey: 'booleanMatches',
-                    displayName: 'booleanMatches',
+                    displayName: 'booleanMatches', // translation key
                     predicate: (filterValues: string[], cellValue: boolean) => {
                         const filterValue = filterValues.at(0);
                         if (filterValue === undefined) {
@@ -152,7 +152,7 @@ export const booleanColumnDefinition = (displayName: string, tab: string): ColDe
                         return filterValue === BooleanFilterValue.UNDEFINED;
                     },
                 },
-            ],
+            ] as IFilterOptionDef[],
         },
         headerComponent: CustomHeaderComponent,
         headerComponentParams: {
diff --git a/src/components/spreadsheet/equipment-table.style.ts b/src/components/spreadsheet/equipment-table.style.ts
new file mode 100644
index 0000000000..030d18e3b1
--- /dev/null
+++ b/src/components/spreadsheet/equipment-table.style.ts
@@ -0,0 +1,16 @@
+/**
+ * Copyright (c) 2025, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+import type { SxProps, Theme } from '@mui/material';
+
+export const styles = {
+    noBorderRight: {
+        // hides right border for header of "Edit" column due to column being pinned
+        '& .ag-pinned-left-header': {
+            borderRight: 'none',
+        },
+    },
+} as const satisfies Record<string, SxProps<Theme>>;
diff --git a/src/components/spreadsheet/equipment-table.tsx b/src/components/spreadsheet/equipment-table.tsx
index 309d36f3e3..5d12ba5057 100644
--- a/src/components/spreadsheet/equipment-table.tsx
+++ b/src/components/spreadsheet/equipment-table.tsx
@@ -24,6 +24,8 @@ import { CurrentTreeNode, NodeType } from 'components/graph/tree-node.type';
 import { CalculationRowType } from './utils/calculation.type';
 import { isCalculationRow } from './utils/calculation-utils';
 import { useSelector } from 'react-redux';
+import { styles } from './equipment-table.style';
+import { AGGRID_LOCALES } from '../../translations/not-intl/aggrid-locales';
 
 const DEFAULT_ROW_HEIGHT = 28;
 const MAX_CLICK_DURATION = 200;
@@ -178,12 +180,13 @@ export const EquipmentTable: FunctionComponent<EquipmentTableProps> = ({
             onRowClicked={handleRowClicked}
             onModelUpdated={onModelUpdated}
             context={gridContext}
-            shouldHidePinnedHeaderRightBorder={shouldHidePinnedHeaderRightBorder}
             rowHeight={DEFAULT_ROW_HEIGHT}
             loading={isFetching}
             overlayLoadingTemplate={intl.formatMessage({ id: 'LoadingRemoteData' })}
             isExternalFilterPresent={isExternalFilterPresent}
             doesExternalFilterPass={doesExternalFilterPass}
+            sx={shouldHidePinnedHeaderRightBorder ? styles.noBorderRight : undefined}
+            overrideLocales={AGGRID_LOCALES}
         />
     );
 };
diff --git a/src/components/utils/aggrid-rows-handler.ts b/src/components/utils/aggrid-rows-handler.ts
index ba1658164b..0b1a256692 100644
--- a/src/components/utils/aggrid-rows-handler.ts
+++ b/src/components/utils/aggrid-rows-handler.ts
@@ -54,11 +54,7 @@ export const useIntlResultStatusMessages = (intl: IntlShape, hasNoData: boolean
         if (hasNoData) {
             return { noData: intl.formatMessage({ id: 'grid.noRowsToShow' }) };
         }
-        return {
-            noLimitViolation: intl.formatMessage({
-                id: 'grid.noLimitViolation',
-            }),
-        };
+        return { noLimitViolation: intl.formatMessage({ id: 'grid.noLimitViolation' }) };
     }, [intl, hasNoData]);
 
     return useMemo(() => {
diff --git a/src/components/utils/renderTable-ExportCsv.tsx b/src/components/utils/renderTable-ExportCsv.tsx
index d134e0d62a..01671ca43c 100644
--- a/src/components/utils/renderTable-ExportCsv.tsx
+++ b/src/components/utils/renderTable-ExportCsv.tsx
@@ -11,6 +11,7 @@ import { ColDef, GridReadyEvent, RowClassParams, RowDataUpdatedEvent, RowStyle }
 import { CustomAGGrid } from '@gridsuite/commons-ui';
 import { AgGridReact } from 'ag-grid-react';
 import { Box } from '@mui/material';
+import { AGGRID_LOCALES } from '../../translations/not-intl/aggrid-locales';
 
 const styles = {
     gridContainer: {
@@ -84,6 +85,7 @@ export const RenderTableAndExportCsv: FunctionComponent<RenderTableAndExportCsvP
                                 api.showNoRowsOverlay();
                             }
                         }}
+                        overrideLocales={AGGRID_LOCALES}
                     />
                 </Box>
             )}
diff --git a/src/translations/external/aggrid-locale-en.ts b/src/translations/external/aggrid-locale-en.ts
deleted file mode 100644
index 679f737bfb..0000000000
--- a/src/translations/external/aggrid-locale-en.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Copyright (c) 2024, RTE (http://www.rte-france.com)
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-const aggrid_locale_en = {
-    // Comes from the AgGrid external library
-    'grid.noRowsToShow': 'No data',
-    'grid.noCalculation': 'No calculation',
-    'grid.failed': 'Calculation failed',
-    'grid.running': 'In progress...',
-    'grid.noLimitViolation': 'No limit violation',
-    'grid.page': 'Page',
-    'grid.to': 'to',
-    'grid.of': 'of',
-    'grid.firstPage': 'First Page',
-    'grid.previousPage': 'Previous Page',
-    'grid.nextPage': 'Next Page',
-    'grid.lastPage': 'Last Page',
-    'grid.ariaSortableColumn': 'Press ENTER to sort.',
-    'grid.ariaMenuColumn': 'Press CTRL+ENTER to open column menu.',
-};
-
-export default aggrid_locale_en;
diff --git a/src/translations/external/aggrid-locale-fr.ts b/src/translations/external/aggrid-locale-fr.ts
deleted file mode 100644
index c0c0497c43..0000000000
--- a/src/translations/external/aggrid-locale-fr.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * Copyright (c) 2024, RTE (http://www.rte-france.com)
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
-
-const aggrid_locale_fr = {
-    // Comes from the AgGrid external library
-    'grid.contains': 'Contient',
-    'grid.notContains': 'Ne contient pas',
-    'grid.equals': 'Égal à',
-    'grid.notEqual': "N'est pas égal à",
-    'grid.startsWith': 'Commence par',
-    'grid.endsWith': 'Finit par',
-    'grid.blank': 'Vide',
-    'grid.notBlank': "N'est pas vide",
-    'grid.inRange': 'Intervalle',
-    'grid.customInRange': 'Intervalle', // Custom filter for enums
-    'grid.booleanMatches': 'Correspondances booléennes',
-    'grid.lessThan': 'Moins que',
-    'grid.lessThanOrEqual': 'Moins ou égal à',
-    'grid.greaterThan': 'Plus que',
-    'grid.greaterThanOrEqual': 'Plus ou égal à',
-    'grid.andCondition': 'ET',
-    'grid.orCondition': 'OU',
-    'grid.inRangeStart': 'Début',
-    'grid.inRangeEnd': 'Fin',
-    'grid.filterOoo': 'Filtrer...',
-    'grid.noRowsToShow': 'Aucune Donnée',
-    'grid.noCalculation': 'Pas de calcul lancé',
-    'grid.failed': 'Echec du calcul',
-    'grid.running': 'Calcul en cours...',
-    'grid.noLimitViolation': 'Pas de contrainte',
-    'grid.page': 'Page',
-    'grid.to': 'à',
-    'grid.of': 'de',
-    'grid.firstPage': 'Première page',
-    'grid.previousPage': 'Page précédente',
-    'grid.nextPage': 'Page suivante',
-    'grid.lastPage': 'Dernière page',
-    'grid.ariaSortableColumn': 'Appuyez sur ENTRÉE pour trier.',
-    'grid.ariaMenuColumn': 'Appuyez sur CTRL+ENTRÉE pour ouvrir le menu de colonne.',
-    'grid.ariaFilteringOperator': 'Operateur de filtre',
-    'grid.ariaFilterToValue': 'Filtre vers valeur',
-    'grid.ariaFilterValue': 'Valeur de filtre',
-    'grid.ariaLabelTooltip': 'Tooltip',
-    'grid.ariaRowSelectAll': 'Tout sélectionner',
-    'grid.ariaUnchecked': 'Non sélectionné',
-    'grid.ariaHeaderSelection': "Sélection de l'en-tête",
-    'grid.ariaFilterColumn': 'Colonne filtrée',
-};
-
-export default aggrid_locale_fr;
diff --git a/src/translations/grid-en.ts b/src/translations/grid-en.ts
new file mode 100644
index 0000000000..0d611a6df6
--- /dev/null
+++ b/src/translations/grid-en.ts
@@ -0,0 +1,13 @@
+/**
+ * Copyright (c) 2024, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+export const grid_en = {
+    'grid.noCalculation': 'No calculation',
+    'grid.failed': 'Calculation failed',
+    'grid.running': 'In progress...',
+    'grid.noLimitViolation': 'No limit violation',
+};
diff --git a/src/translations/grid-fr.ts b/src/translations/grid-fr.ts
new file mode 100644
index 0000000000..1700c1d18c
--- /dev/null
+++ b/src/translations/grid-fr.ts
@@ -0,0 +1,13 @@
+/**
+ * Copyright (c) 2024, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+export const grid_fr = {
+    'grid.noCalculation': 'Pas de calcul lancé',
+    'grid.failed': 'Echec du calcul',
+    'grid.running': 'Calcul en cours...',
+    'grid.noLimitViolation': 'Pas de contrainte',
+};
diff --git a/src/translations/not-intl/README.txt b/src/translations/not-intl/README.txt
new file mode 100644
index 0000000000..5bd5a705b8
--- /dev/null
+++ b/src/translations/not-intl/README.txt
@@ -0,0 +1 @@
+Translations not use with react-intl system.
diff --git a/src/translations/not-intl/aggrid-locales.ts b/src/translations/not-intl/aggrid-locales.ts
new file mode 100644
index 0000000000..3a68d0d2d0
--- /dev/null
+++ b/src/translations/not-intl/aggrid-locales.ts
@@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2024, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+import { AgGridLocales, LANG_ENGLISH, LANG_FRENCH } from '@gridsuite/commons-ui';
+
+// At the moment, only the French locale is needed
+export const AGGRID_LOCALES = {
+    [LANG_FRENCH]: {
+        noRowsToShow: 'Aucune Donnée',
+    },
+    [LANG_ENGLISH]: {
+        noRowsToShow: 'No data',
+    },
+} as const satisfies AgGridLocales;


Reviews:
user: login: TheMaskedTurtle
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T13:07:23Z
user: login: Tristan-WorkGH
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T13:22:59Z
user: login: Tristan-WorkGH
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T13:24:30Z
user: login: TheMaskedTurtle
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-23T14:28:41Z

Review comments:
diff_hunk: @@ -0,0 +1,15 @@
+/**
+ * Copyright (c) 2024, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+export const grid_fr = {
+    'grid.noCalculation': 'Pas de calcul lancé',
+    'grid.failed': 'Echec du calcul',
+    'grid.running': 'Calcul en cours...',
+    'grid.noLimitViolation': 'Pas de contrainte',
+    'grid.customInRange': 'Intervalle', // Custom filter for enums
+    'grid.booleanMatches': 'Correspondances booléennes',
path: src/translations/grid-fr.ts
user: login: TheMaskedTurtle
body: Do you see these translations anywhere in the app ?
created_at: 2025-04-17T10:03:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -178,12 +180,13 @@ export const EquipmentTable: FunctionComponent<EquipmentTableProps> = ({
             onRowClicked={handleRowClicked}
             onModelUpdated={onModelUpdated}
             context={gridContext}
-            shouldHidePinnedHeaderRightBorder={shouldHidePinnedHeaderRightBorder}
path: src/components/spreadsheet/equipment-table.tsx
user: login: TheMaskedTurtle
body: Why did you replace this system ?
created_at: 2025-04-17T10:04:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -178,12 +180,13 @@ export const EquipmentTable: FunctionComponent<EquipmentTableProps> = ({
             onRowClicked={handleRowClicked}
             onModelUpdated={onModelUpdated}
             context={gridContext}
-            shouldHidePinnedHeaderRightBorder={shouldHidePinnedHeaderRightBorder}
             rowHeight={DEFAULT_ROW_HEIGHT}
             loading={isFetching}
             overlayLoadingTemplate={intl.formatMessage({ id: 'LoadingRemoteData' })}
             isExternalFilterPresent={isExternalFilterPresent}
             doesExternalFilterPass={doesExternalFilterPass}
+            sx={shouldHidePinnedHeaderRightBorder ? styles.noBorderRight : undefined}
path: src/components/spreadsheet/equipment-table.tsx
user: login: TheMaskedTurtle
body: Actually I don't really see the point of this anymore and it is only used in spreadsheet, so maybe we can delete it
created_at: 2025-04-17T10:08:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,17 @@
+/**
+ * Copyright (c) 2024, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+import { AgGridLocales, LANG_ENGLISH, LANG_FRENCH } from '@gridsuite/commons-ui';
+
+// At the moment, only the French locale is needed
+export const AggridLocales = {
path: src/translations/not-intl/aggrid-locales.ts
user: login: TheMaskedTurtle
body: AGGRID_LOCALES ?
created_at: 2025-04-23T13:07:10Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,15 @@
+/**
+ * Copyright (c) 2024, RTE (http://www.rte-france.com)
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+export const grid_fr = {
+    'grid.noCalculation': 'Pas de calcul lancé',
+    'grid.failed': 'Echec du calcul',
+    'grid.running': 'Calcul en cours...',
+    'grid.noLimitViolation': 'Pas de contrainte',
+    'grid.customInRange': 'Intervalle', // Custom filter for enums
+    'grid.booleanMatches': 'Correspondances booléennes',
path: src/translations/grid-fr.ts
user: login: Tristan-WorkGH
body: No, but i don't know if it was left here for future commit or if it was forget. So I choose to let it there for now.
created_at: 2025-04-23T13:22:59Z
author_association: CONTRIBUTOR
diff_hunk: @@ -178,12 +180,13 @@ export const EquipmentTable: FunctionComponent<EquipmentTableProps> = ({
             onRowClicked={handleRowClicked}
             onModelUpdated={onModelUpdated}
             context={gridContext}
-            shouldHidePinnedHeaderRightBorder={shouldHidePinnedHeaderRightBorder}
             rowHeight={DEFAULT_ROW_HEIGHT}
             loading={isFetching}
             overlayLoadingTemplate={intl.formatMessage({ id: 'LoadingRemoteData' })}
             isExternalFilterPresent={isExternalFilterPresent}
             doesExternalFilterPass={doesExternalFilterPass}
+            sx={shouldHidePinnedHeaderRightBorder ? styles.noBorderRight : undefined}
path: src/components/spreadsheet/equipment-table.tsx
user: login: Tristan-WorkGH
body: It's used here: https://github.com/gridsuite/gridstudy-app/blob/46f3cb04c4f931ebcce62d911b0820e1a24b173b/src/components/spreadsheet/table-wrapper.tsx#L570
created_at: 2025-04-23T13:24:30Z
author_association: CONTRIBUTOR

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-04-23T14:14:01Z
body: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=gridsuite_gridstudy-app&pullRequest=2802) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=gridsuite_gridstudy-app&pullRequest=2802&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=gridsuite_gridstudy-app&pullRequest=2802&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=gridsuite_gridstudy-app&pullRequest=2802&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=gridsuite_gridstudy-app&pullRequest=2802&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Duplication on New Code](https://sonarcloud.io/component_measures?id=gridsuite_gridstudy-app&pullRequest=2802&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=gridsuite_gridstudy-app&pullRequest=2802)


author_association: NONE