From 77ff22a657f6e73dd9f8da27d6d51b9d6cf18505 Mon Sep 17 00:00:00 2001 From: Alex Boungnaseng Date: Wed, 19 Nov 2025 15:42:07 +0100 Subject: [PATCH 1/2] fix(manager-common-translations): delete duplicate region keys ref: #MANAGER-20207 Signed-off-by: Alex Boungnaseng --- .../translations/region/Messages_fr_FR.json | 286 ------------------ 1 file changed, 286 deletions(-) diff --git a/packages/manager/modules/common-translations/public/translations/region/Messages_fr_FR.json b/packages/manager/modules/common-translations/public/translations/region/Messages_fr_FR.json index b2b5fe85ed57..9dad7ac68f42 100644 --- a/packages/manager/modules/common-translations/public/translations/region/Messages_fr_FR.json +++ b/packages/manager/modules/common-translations/public/translations/region/Messages_fr_FR.json @@ -319,291 +319,5 @@ "region_continent_SHA": "Europe de l'Ouest", "region_continent_CA": "Amérique du Nord", "region_continent_MRS": "Europe de l'Ouest", - "region_continent_PAR": "Europe de l'Ouest", - "region_SBG1": "Strasbourg (SBG1)", - "region_BHS1": "Beauharnois (BHS1)", - "region_GRA1": "Gravelines (GRA1)", - "region_SBG": "Strasbourg", - "region_SBG_micro": "Strasbourg ({{ micro }})", - "region_MRS": "Marseille", - "region_MRS_micro": "Marseille ({{ micro }})", - "region_PAR": "Paris", - "region_PAR_micro": "Paris ({{ micro }})", - "region_BHS": "Beauharnois", - "region_BHS_micro": "Beauharnois ({{ micro }})", - "region_ERI": "Londres", - "region_ERI_micro": "Londres ({{ micro }})", - "region_GRA": "Gravelines", - "region_GRA_micro": "Gravelines ({{ micro }})", - "region_LIM": "Limburg", - "region_LIM_micro": "Limburg ({{ micro }})", - "region_RBX": "Roubaix", - "region_RBX_micro": "Roubaix ({{ micro }})", - "region_WAW": "Varsovie", - "region_WAW_micro": "Varsovie ({{ micro }})", - "region_DE": "Francfort", - "region_DE_micro": "Francfort ({{ micro }})", - "region_UK": "Londres", - "region_UK_micro": "Londres ({{ micro }})", - "region_SGP": "Singapour", - "region_SGP_micro": "Singapour ({{ micro }})", - "region_MUM": "Mumbai", - "region_MUM_micro": "Mumbai ({{ micro }})", - "region_VIN": "Vint Hill", - "region_VIN_micro": "Vint Hill ({{ micro }})", - "region_continent_VIN": "Amérique du Nord", - "region_HIL": "Hillsboro", - "region_HIL_micro": "Hillsboro ({{ micro }})", - "region_continent_HIL": "Amérique du Nord", - "region_OR": "Oregon", - "region_continent_OR": "Amérique du Nord", - "region_OR_micro": "Oregon ({{ micro }})", - "region_VA": "Virginie", - "region_VA_micro": "Virginie ({{ micro }})", - "region_continent_VA": "Amérique du Nord", - "region_SYD": "Sydney", - "region_SYD_micro": "Sydney ({{ micro }})", - "region_TOR": "Toronto", - "region_TOR_micro": "Toronto ({{ micro }})", - "region_continent_TOR": "Amérique du Nord", - "region_US": "États-Unis", - "region_US_micro": "États-Unis ({{ micro }})", - "region_GS": "GS", - "region_MAD": "Madrid", - "region_BRU": "Bruxelles", - "region_DAL": "Dallas", - "region_continent_DAL": "Amérique du Nord", - "region_SHA_micro": "Gravelines (SHADOW-EU-1)", - "region_GS_micro": "Gridscale ({{ micro }})", - "region_MAD_micro": "Madrid ({{ micro }})", - "region_BRU_micro": "Bruxelles ({{ micro }})", - "region_DAL_micro": "Dallas ({{ micro }})", - "region_PRG": "Prague", - "region_PRG_micro": "Prague ({{ micro }})", - "region_continent_PRG": "Europe centrale", - "region_AMS": "Amsterdam", - "region_AMS_micro": "Amsterdam ({{ micro }})", - "region_continent_AMS": "Europe de l'Ouest", - "region_MIL": "Milan", - "region_MIL_micro": "Milan ({{ micro }})", - "region_continent_MIL": "Europe du Sud", - "region_ZRH": "Zurich", - "region_ZRH_micro": "Zurich ({{ micro }})", - "region_continent_ZRH": "Europe de l'Ouest", - "region_LAX": "Los Angeles", - "region_LAX_micro": "Los Angeles ({{ micro }})", - "region_continent_LAX": "Amérique du Nord", - "region_CHI": "Chicago", - "region_CHI_micro": "Chicago ({{ micro }})", - "region_continent_CHI": "Amérique du Nord", - "region_NYC": "New York", - "region_NYC_micro": "New York ({{ micro }})", - "region_continent_NYC": "Amérique du Nord", - "region_MIA": "Miami", - "region_MIA_micro": "Miami ({{ micro }})", - "region_continent_MIA": "Amérique du Nord", - "region_PAO": "Palo Alto", - "region_PAO_micro": "Palo Alto ({{ micro }})", - "region_continent_PAO": "Amérique du Nord", - "region_DEN": "Denver", - "region_DEN_micro": "Denver ({{ micro }})", - "region_continent_DEN": "Amérique du Nord", - "region_ATL": "Atlanta", - "region_ATL_micro": "Atlanta ({{ micro }})", - "region_continent_ATL": "Amérique du Nord", - "region_RBA": "Rabat", - "region_RBA_micro": "Rabat ({{ micro }})", - "region_continent_RBA": "Afrique", - "region_TYO": "Tokyo", - "region_TYO_micro": "Tokyo ({{ micro }})", - "region_continent_TYO": "APAC", - "region_BLR": "Bangalore", - "region_BLR_micro": "Bangalore ({{ micro }})", - "region_continent_BLR": "APAC", - "region_DXB": "Dubai", - "region_DXB_micro": "Dubai ({{ micro }})", - "region_continent_DXB": "Moyen Orient", - "region_JKT": "Djakarta", - "region_JKT_micro": "Djakarta ({{ micro }})", - "region_continent_JKT": "APAC", - "region_LUX": "Luxembourg", - "region_LUX_micro": "Luxembourg ({{ micro }})", - "region_continent_LUX": "Europe de l'Ouest", - "region_MEX": "Mexico", - "region_MEX_micro": "Mexico ({{ micro }})", - "region_continent_MEX": "Amérique Centrale", - "region_SAO": "São Paulo", - "region_SAO_micro": "São Paulo ({{ micro }})", - "region_continent_SAO": "Amérique du Sud", - "region_TUN": "Tunis", - "region_TUN_micro": "Tunis ({{ micro }})", - "region_continent_TUN": "Afrique du Nord", - "region_AUS": "Austin", - "region_AUS_micro": "Austin ({{ micro }})", - "region_continent_AUS": "Amérique du Nord", - "region_BOS": "Boston", - "region_BOS_micro": "Boston ({{ micro }})", - "region_continent_BOS": "Amérique du Nord", - "region_SEA": "Seattle", - "region_SEA_micro": "Seattle ({{ micro }})", - "region_continent_SEA": "Amérique du Nord", - "region_BUH": "Bucarest", - "region_BUH_micro": "Bucarest ({{ micro }})", - "region_continent_BUH": "Europe centrale", - "region_PHL": "Philadelphie", - "region_PHL_micro": "Philadelphie ({{ micro }})", - "region_continent_PHL": "Amérique du Nord", - "region_BKK": "Bangkok", - "region_BKK_micro": "Bangkok ({{ micro }})", - "region_continent_BKK": "APAC", - "region_BUE": "Buenos Aires", - "region_BUE_micro": "Buenos Aires ({{ micro }})", - "region_continent_BUE": "Amérique du Sud", - "region_AKL": "Auckland", - "region_AKL_micro": "Auckland ({{ micro }})", - "region_continent_AKL": "APAC", - "region_HEL": "Helsinki", - "region_HEL_micro": "Helsinki ({{ micro }})", - "region_continent_HEL": "Europe du Nord", - "region_HOU": "Houston", - "region_HOU_micro": "Houston ({{ micro }})", - "region_continent_HOU": "Amérique du Nord", - "region_SOF": "Sofia", - "region_SOF_micro": "Sofia ({{ micro }})", - "region_continent_SOF": "Europe centrale", - "region_OSL": "Oslo", - "region_OSL_micro": "Oslo ({{ micro }})", - "region_continent_OSL": "Europe du Nord", - "region_STO": "Stockholm", - "region_STO_micro": "Stockholm ({{ micro }})", - "region_continent_STO": "Europe du Nord", - "region_TPE": "Taipei", - "region_TPE_micro": "Taipei ({{ micro }})", - "region_continent_TPE": "APAC", - "region_SCL": "Santiago", - "region_SCL_micro": "Santiago ({{ micro }})", - "region_continent_SCL": "Amérique du Sud", - "region_SEL": "Seoul", - "region_SEL_micro": "Seoul ({{ micro }})", - "region_continent_SEL": "APAC", - "region_BOG": "Bogota", - "region_BOG_micro": "Bogota ({{ micro }})", - "region_continent_BOG": "Amérique du Sud", - "region_LAG": "Lagos", - "region_LAG_micro": "Lagos ({{ micro }})", - "region_continent_LAG": "Afrique", - "region_CPT": "Le Cap", - "region_CPT_micro": "Le Cap ({{ micro }})", - "region_continent_CPT": "Afrique", - "region_NBO": "Nairobi", - "region_NBO_micro": "Nairobi ({{ micro }})", - "region_continent_NBO": "Afrique", - "region_ABJ": "Abidjan", - "region_ABJ_micro": "Abidjan ({{ micro }})", - "region_continent_ABJ": "Afrique", - "region_CAI": "Le Caire", - "region_CAI_micro": "Le Caire ({{ micro }})", - "region_continent_CAI": "Afrique", - "region_DOH": "Doha", - "region_DOH_micro": "Doha ({{ micro }})", - "region_continent_DOH": "Moyen Orient", - "region_LAU": "Lausanne", - "region_LAU_micro": "Lausanne ({{ micro }})", - "region_continent_LAU": "Europe de l'Ouest", - "region_CPH": "Copenhague", - "region_CPH_micro": "Copenhague ({{ micro }})", - "region_continent_CPH": "Europe du Nord", - "region_LIS": "Lisbonne", - "region_LIS_micro": "Lisbonne ({{ micro }})", - "region_continent_LIS": "Europe du Sud", - "region_MEL": "Melbourne", - "region_MEL_micro": "Melbourne ({{ micro }})", - "region_continent_MEL": "APAC", - "region_ICD": "New Delhi", - "region_ICD_micro": "New Delhi ({{ micro }})", - "region_continent_ICD": "APAC", - "region_OSA": "Osaka", - "region_OSA_micro": "Osaka ({{ micro }})", - "region_continent_OSA": "APAC", - "region_KUL": "Kuala Lumpur", - "region_KUL_micro": "Kuala Lumpur ({{ micro }})", - "region_continent_KUL": "APAC", - "region_MNL": "Manille", - "region_MNL_micro": "Manille ({{ micro }})", - "region_continent_MNL": "APAC", - "region_SGN": "Ho Chi Minh", - "region_SGN_micro": "Ho Chi Minh ({{ micro }})", - "region_continent_SGN": "APAC", - "region_VIE": "Vienne", - "region_VIE_micro": "Vienne ({{ micro }})", - "region_continent_VIE": "Europe de l'Ouest", - "region_DLN": "Dublin", - "region_DLN_micro": "Dublin ({{ micro }})", - "region_continent_DLN": "Europe de l'Ouest", - "region_VAN": "Vancouver", - "region_VAN_micro": "Vancouver ({{ micro }})", - "region_continent_VAN": "Amérique du Nord", - "region_TLV": "Tel Aviv-yafo", - "region_TLV_micro": "Tel Aviv-yafo ({{ micro }})", - "region_continent_TLV": "Moyen Orient", - "region_MNC": "Manchester", - "region_MNC_micro": "Manchester ({{ micro }})", - "region_continent_MNC": "Europe de l'Ouest", - "region_CLT": "Charlotte", - "region_CLT_micro": "Charlotte ({{ micro }})", - "region_continent_CLT": "Amérique du Nord", - "region_BNA": "Nashville", - "region_BNA_micro": "Nashville ({{ micro }})", - "region_continent_BNA": "Amérique du Nord", - "region_SLC": "Salt Lake City", - "region_SLC_micro": "Salt Lake City ({{ micro }})", - "region_continent_SLC": "Amérique du Nord", - "region_STL": "Saint-Louis", - "region_STL_micro": "Saint-Louis ({{ micro }})", - "region_continent_STL": "Amérique du Nord", - "region_IND": "Indianapolis", - "region_IND_micro": "Indianapolis ({{ micro }})", - "region_continent_IND": "Amérique du Nord", - "region_IST": "Istanbul", - "region_IST_micro": "Istanbul ({{ micro }})", - "region_PHX": "Phoenix", - "region_PHX_micro": "Phoenix ({{ micro }})", - "region_continent_PHX": "Amérique du Nord", - "region_continent_IST": "Moyen Orient", - "region_localize": "Localiser", - "region_location_SBG": "Europe centrale (France)", - "region_location_WAW": "Europe centrale (Pologne)", - "region_location_BHS": "Amérique du Nord (Canada)", - "region_location_ERI": "Europe de l'Ouest (Grande-Bretagne)", - "region_location_GRA": "Europe de l'Ouest (France)", - "region_location_PAR": "Europe de l'Ouest (France)", - "region_location_GS": "Western Europe", - "region_location_MAD": "Western Europe", - "region_location_BRU": "Western Europe", - "region_location_LIM": "Europe centrale (Allemagne)", - "region_location_RBX": "Europe de l'Ouest (France)", - "region_location_DE": "Europe centrale (Allemagne)", - "region_location_UK": "Europe de l'Ouest (Grande-Bretagne)", - "region_location_SGP": "Asie Pacifique (Singapour)", - "region_location_MUM": "Asie Pacifique (Mumbai)", - "region_location_SYD": "Océanie (Australie)", - "region_location_US": "États-Unis", - "region_location_DAL": "États-Unis", - "region_continent_SBG": "Europe centrale", - "region_continent_WAW": "Europe centrale", - "region_continent_BHS": "Amérique du Nord", - "region_continent_GRA": "Europe de l'Ouest", - "region_continent_RBX": "Europe de l'Ouest", - "region_continent_GS": "Europe de l'Ouest", - "region_continent_MAD": "Europe du Sud", - "region_continent_BRU": "Europe de l'Ouest", - "region_continent_DE": "Europe centrale", - "region_continent_UK": "Europe de l'Ouest", - "region_continent_SGP": "Asie Pacifique", - "region_continent_MUM": "Asie Pacifique", - "region_continent_SYD": "Océanie", - "region_continent_SHA": "Europe de l'Ouest", - "region_continent_CA": "Amérique du Nord", - "region_continent_MRS": "Europe de l'Ouest", "region_continent_PAR": "Europe de l'Ouest" } From aea8e4f92dcdcf491f442adab9228c5af59877b2 Mon Sep 17 00:00:00 2001 From: Alex Boungnaseng Date: Wed, 19 Nov 2025 15:50:28 +0100 Subject: [PATCH 2/2] fix(manager-wiki): correct use translated migro region translations ref: #MANAGER-20207 Signed-off-by: Alex Boungnaseng --- .../useTranslatedMicroRegions.spec.tsx | 95 ++++++++++++++++++- .../region/useTranslatedMicroRegions.tsx | 18 ++-- packages/manager-wiki/.storybook/i18n.ts | 23 ++++- packages/manager-wiki/.storybook/main.tsx | 9 +- 4 files changed, 127 insertions(+), 18 deletions(-) diff --git a/packages/manager-ui-kit/src/hooks/region/__tests__/useTranslatedMicroRegions.spec.tsx b/packages/manager-ui-kit/src/hooks/region/__tests__/useTranslatedMicroRegions.spec.tsx index b7bdd6252d7a..145891f0b4fd 100644 --- a/packages/manager-ui-kit/src/hooks/region/__tests__/useTranslatedMicroRegions.spec.tsx +++ b/packages/manager-ui-kit/src/hooks/region/__tests__/useTranslatedMicroRegions.spec.tsx @@ -1,13 +1,18 @@ import { renderHook } from '@testing-library/react'; import { vitest } from 'vitest'; +import { NAMESPACES } from '@ovh-ux/manager-common-translations'; + import { getMacroRegion, isLocalZone } from '../Regions.utils'; import { useTranslatedMicroRegions } from '../useTranslatedMicroRegions'; +const mockExists = vitest.fn(); +const mockT = vitest.fn((key: string) => key); + vitest.mock('react-i18next', () => ({ useTranslation: () => ({ - t: (key: string) => key, - i18n: { exists: () => true }, + t: mockT, + i18n: { exists: mockExists }, }), })); @@ -38,8 +43,88 @@ describe('getMacroRegion', () => { }); describe('useTranslatedMicroRegions', () => { - it('returns translated region', () => { - const { result } = renderHook(() => useTranslatedMicroRegions()); - expect(result.current.translateMicroRegion('WES-1')).toBe('region_WES_micro'); + beforeEach(() => { + mockExists.mockClear(); + mockT.mockClear(); + }); + + describe('translateMicroRegion', () => { + it('returns translated micro region when translation exists', () => { + mockExists.mockReturnValue(true); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateMicroRegion('WES-1'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_WES_micro`); + expect(mockT).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_WES_micro`, { + micro: 'WES-1', + }); + expect(translated).toBe(`${NAMESPACES.REGION}:region_WES_micro`); + }); + + it('returns empty string when translation does not exist', () => { + mockExists.mockReturnValue(false); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateMicroRegion('WES-1'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_WES_micro`); + expect(mockT).not.toHaveBeenCalled(); + expect(translated).toBe(''); + }); + + it('handles local zone regions correctly', () => { + mockExists.mockReturnValue(true); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateMicroRegion('EU-WEST-LZ-MAD-A'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_MAD_micro`); + expect(mockT).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_MAD_micro`, { + micro: 'EU-WEST-LZ-MAD-A', + }); + expect(translated).toBe(`${NAMESPACES.REGION}:region_MAD_micro`); + }); + }); + + describe('translateMacroRegion', () => { + it('returns translated macro region when translation exists', () => { + mockExists.mockReturnValue(true); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateMacroRegion('WES-1'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_WES`); + expect(mockT).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_WES`); + expect(translated).toBe(`${NAMESPACES.REGION}:region_WES`); + }); + + it('returns empty string when translation does not exist', () => { + mockExists.mockReturnValue(false); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateMacroRegion('WES-1'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_WES`); + expect(mockT).not.toHaveBeenCalled(); + expect(translated).toBe(''); + }); + }); + + describe('translateContinentRegion', () => { + it('returns translated continent region when translation exists', () => { + mockExists.mockReturnValue(true); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateContinentRegion('WES-1'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_continent_WES`); + expect(mockT).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_continent_WES`); + expect(translated).toBe(`${NAMESPACES.REGION}:region_continent_WES`); + }); + + it('returns empty string when translation does not exist', () => { + mockExists.mockReturnValue(false); + const { result } = renderHook(() => useTranslatedMicroRegions()); + const translated = result.current.translateContinentRegion('WES-1'); + + expect(mockExists).toHaveBeenCalledWith(`${NAMESPACES.REGION}:region_continent_WES`); + expect(mockT).not.toHaveBeenCalled(); + expect(translated).toBe(''); + }); }); }); diff --git a/packages/manager-ui-kit/src/hooks/region/useTranslatedMicroRegions.tsx b/packages/manager-ui-kit/src/hooks/region/useTranslatedMicroRegions.tsx index 22248c36a593..d08c84437daf 100644 --- a/packages/manager-ui-kit/src/hooks/region/useTranslatedMicroRegions.tsx +++ b/packages/manager-ui-kit/src/hooks/region/useTranslatedMicroRegions.tsx @@ -9,23 +9,23 @@ export const useTranslatedMicroRegions = () => { return { translateMicroRegion: (region: string) => { - const macro = getMacroRegion(region); - if (i18n.exists(`region:region_${macro}_micro`)) { - return t(`region_${macro}_micro`, { micro: region }); + const macro = getMacroRegion(region)?.toUpperCase(); + if (i18n.exists(`${NAMESPACES.REGION}:region_${macro}_micro`)) { + return t(`${NAMESPACES.REGION}:region_${macro}_micro`, { micro: region }); } return ''; }, translateMacroRegion: (region: string) => { - const macro = getMacroRegion(region); - if (i18n.exists(`region:region_${macro}`)) { - return t(`region_${macro}`); + const macro = getMacroRegion(region)?.toUpperCase(); + if (i18n.exists(`${NAMESPACES.REGION}:region_${macro}`)) { + return t(`${NAMESPACES.REGION}:region_${macro}`); } return ''; }, translateContinentRegion: (region: string) => { - const macro = getMacroRegion(region); - if (i18n.exists(`region:region_continent_${macro}`)) { - return t(`region_continent_${macro}`); + const macro = getMacroRegion(region)?.toUpperCase(); + if (i18n.exists(`${NAMESPACES.REGION}:region_continent_${macro}`)) { + return t(`${NAMESPACES.REGION}:region_continent_${macro}`); } return ''; }, diff --git a/packages/manager-wiki/.storybook/i18n.ts b/packages/manager-wiki/.storybook/i18n.ts index 8ebb4c85921a..7e6eda6c93d5 100644 --- a/packages/manager-wiki/.storybook/i18n.ts +++ b/packages/manager-wiki/.storybook/i18n.ts @@ -1,14 +1,31 @@ +/// import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; +import I18NextHttpBackend from 'i18next-http-backend'; -i18n.use(initReactI18next).init({ +i18n +.use(initReactI18next) +.use(I18NextHttpBackend) +.use({ + type: 'postProcessor', + name: 'normalize', + process: (value: string) => (value ? value.replace(/&/g, '&') : value), +}) +.init({ fallbackLng: 'fr_FR', interpolation: { escapeValue: false, }, - resources: { - en: {}, + defaultNS: 'common', + ns: ['common'], + backend: { + loadPath: (lngs: string[], namespaces: string[]) => { + const [lng] = lngs; + const [ns] = namespaces; + return `${import.meta.env.BASE_URL}translations/${ns}/Messages_${lng}.json`; + }, }, + postProcess: 'normalize', }); export default i18n; diff --git a/packages/manager-wiki/.storybook/main.tsx b/packages/manager-wiki/.storybook/main.tsx index ebd6c5aecdf9..926856fcf984 100644 --- a/packages/manager-wiki/.storybook/main.tsx +++ b/packages/manager-wiki/.storybook/main.tsx @@ -23,7 +23,14 @@ const config: StorybookConfig = { }, }, }, - staticDirs: ['./public/assets', './public'], + staticDirs: [ + './public/assets', + './public', + { + from: '../../manager/modules/common-translations/public/translations', + to: '/translations/@ovh-ux/manager-common-translations', + }, + ], docs: { autodocs: true, defaultName: 'Technical information',