From fd4104da394a407bbfce78fbe75426aa52a38261 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joe=20K=C3=BCng?= Date: Wed, 11 Mar 2026 17:27:28 +0100 Subject: [PATCH] fix(front-end): ssr i18n fix --- frontend/src/app/app.config.ts | 11 ++------ .../app/core/i18n/static-translate.loader.ts | 25 +++++++++++++++++++ frontend/tsconfig.json | 1 + 3 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 frontend/src/app/core/i18n/static-translate.loader.ts diff --git a/frontend/src/app/app.config.ts b/frontend/src/app/app.config.ts index d76c897..418e76c 100644 --- a/frontend/src/app/app.config.ts +++ b/frontend/src/app/app.config.ts @@ -20,10 +20,6 @@ import { TranslateModule, TranslateService, } from '@ngx-translate/core'; -import { - provideTranslateHttpLoader, - TranslateHttpLoader, -} from '@ngx-translate/http-loader'; import { adminAuthInterceptor } from './core/interceptors/admin-auth.interceptor'; import { provideClientHydration, @@ -31,6 +27,7 @@ import { } from '@angular/platform-browser'; import { serverOriginInterceptor } from './core/interceptors/server-origin.interceptor'; import { catchError, firstValueFrom, of } from 'rxjs'; +import { StaticTranslateLoader } from './core/i18n/static-translate.loader'; type SupportedLang = 'it' | 'en' | 'de' | 'fr'; const SUPPORTED_LANGS: readonly SupportedLang[] = ['it', 'en', 'de', 'fr']; @@ -61,16 +58,12 @@ export const appConfig: ApplicationConfig = { provideHttpClient( withInterceptors([serverOriginInterceptor, adminAuthInterceptor]), ), - provideTranslateHttpLoader({ - prefix: './assets/i18n/', - suffix: '.json', - }), importProvidersFrom( TranslateModule.forRoot({ defaultLanguage: 'it', loader: { provide: TranslateLoader, - useClass: TranslateHttpLoader, + useClass: StaticTranslateLoader, }, }), ), diff --git a/frontend/src/app/core/i18n/static-translate.loader.ts b/frontend/src/app/core/i18n/static-translate.loader.ts new file mode 100644 index 0000000..b96cd84 --- /dev/null +++ b/frontend/src/app/core/i18n/static-translate.loader.ts @@ -0,0 +1,25 @@ +import { Injectable } from '@angular/core'; +import { + TranslateLoader, + TranslationObject, +} from '@ngx-translate/core'; +import { Observable, of } from 'rxjs'; +import de from '../../../assets/i18n/de.json'; +import en from '../../../assets/i18n/en.json'; +import fr from '../../../assets/i18n/fr.json'; +import it from '../../../assets/i18n/it.json'; + +const TRANSLATIONS: Record = { + it: it as TranslationObject, + en: en as TranslationObject, + de: de as TranslationObject, + fr: fr as TranslationObject, +}; + +@Injectable() +export class StaticTranslateLoader implements TranslateLoader { + getTranslation(lang: string): Observable { + const normalized = String(lang || 'it').toLowerCase(); + return of(TRANSLATIONS[normalized] ?? TRANSLATIONS['it']); + } +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 5525117..cf6c605 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -14,6 +14,7 @@ "esModuleInterop": true, "experimentalDecorators": true, "moduleResolution": "bundler", + "resolveJsonModule": true, "importHelpers": true, "target": "ES2022", "module": "ES2022"