Skip to content

Commit ece690d

Browse files
committed
fix-Present the GlobalisationCode and translated it to the local languages as part of the message
1 parent fc579f5 commit ece690d

15 files changed

Lines changed: 98 additions & 10 deletions

File tree

src/app/core/error-handler/error-handler.service.ts

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { MatSnackBar } from '@angular/material/snack-bar';
2929
import { HttpErrorResponse } from '@angular/common/http';
3030
import { Observable, throwError } from 'rxjs';
3131
import { Router } from '@angular/router';
32+
import { TranslateService } from '@ngx-translate/core';
3233

3334
export interface ErrorMessage {
3435
title: string;
@@ -49,7 +50,9 @@ export class ErrorHandlerService {
4950
// eslint-disable-next-line @angular-eslint/prefer-inject
5051
private snackBar: MatSnackBar,
5152
// eslint-disable-next-line @angular-eslint/prefer-inject
52-
private router: Router
53+
private router: Router,
54+
// eslint-disable-next-line @angular-eslint/prefer-inject
55+
private translate: TranslateService
5356
) {}
5457

5558
/**
@@ -189,4 +192,58 @@ export class ErrorHandlerService {
189192
panelClass: ['info-snackbar']
190193
});
191194
}
195+
196+
/**
197+
* Translates a Fineract error response into a single, translated message.
198+
* Falls back to defaultUserMessage when translation keys are missing.
199+
*/
200+
translateFineractError(errorResponse: any): string {
201+
if (!errorResponse || typeof errorResponse !== 'object') {
202+
return '';
203+
}
204+
205+
const messages: string[] = [];
206+
207+
if (errorResponse.userMessageGlobalisationCode) {
208+
const mainMsg = this.getMessageForCode(
209+
errorResponse.userMessageGlobalisationCode,
210+
errorResponse.defaultUserMessage
211+
);
212+
if (mainMsg) {
213+
messages.push(mainMsg);
214+
}
215+
} else if (errorResponse.defaultUserMessage) {
216+
messages.push(errorResponse.defaultUserMessage);
217+
}
218+
if (Array.isArray(errorResponse.errors)) {
219+
errorResponse.errors.forEach((error: any) => {
220+
if (!error || typeof error !== 'object') {
221+
return;
222+
}
223+
if (error.userMessageGlobalisationCode) {
224+
const nestedMsg = this.getMessageForCode(error.userMessageGlobalisationCode, error.defaultUserMessage);
225+
if (nestedMsg) {
226+
messages.push(nestedMsg);
227+
}
228+
} else if (error.defaultUserMessage) {
229+
messages.push(error.defaultUserMessage);
230+
}
231+
});
232+
}
233+
const uniqueMessages = Array.from(new Set(messages.filter((m) => !!m && typeof m === 'string')));
234+
return uniqueMessages.join(' ');
235+
}
236+
237+
private getMessageForCode(code: string, defaultMessage?: string): string {
238+
if (!code) {
239+
return defaultMessage || '';
240+
}
241+
242+
const translated = this.translate.instant(code);
243+
if (translated && translated !== code) {
244+
return translated;
245+
}
246+
247+
return defaultMessage || '';
248+
}
192249
}

src/app/core/http/error-handler.interceptor.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ import { environment } from '../../../environments/environment';
2020
/** Custom Services */
2121
import { Logger } from '../logger/logger.service';
2222
import { AlertService } from '../alert/alert.service';
23-
import { TranslateService } from '@ngx-translate/core'; // Added import for TranslateService
23+
import { TranslateService } from '@ngx-translate/core';
24+
import { ErrorHandlerService } from '../error-handler/error-handler.service';
2425

2526
/** Initialize Logger */
2627
const log = new Logger('ErrorHandlerInterceptor');
@@ -32,6 +33,7 @@ const log = new Logger('ErrorHandlerInterceptor');
3233
export class ErrorHandlerInterceptor implements HttpInterceptor {
3334
private alertService = inject(AlertService);
3435
private translate = inject(TranslateService);
36+
private errorHandlerService = inject(ErrorHandlerService);
3537

3638
/**
3739
* Intercepts a Http request and adds a default error handler.
@@ -45,12 +47,12 @@ export class ErrorHandlerInterceptor implements HttpInterceptor {
4547
*/
4648
private handleError(response: HttpErrorResponse, request: HttpRequest<any>): Observable<HttpEvent<any>> {
4749
const status = response.status;
48-
let errorMessage = response.error.developerMessage || response.message;
49-
if (response.error.errors) {
50-
if (response.error.errors[0]) {
51-
errorMessage = response.error.errors[0].defaultUserMessage || response.error.errors[0].developerMessage;
52-
}
53-
}
50+
const errorBody: any = response.error;
51+
const translatedErrorMessage = this.errorHandlerService.translateFineractError(errorBody);
52+
let errorMessage =
53+
translatedErrorMessage ||
54+
(errorBody && (errorBody.developerMessage || errorBody.defaultUserMessage)) ||
55+
response.message;
5456

5557
const isClientImage404 = status === 404 && request.url.includes('/clients/') && request.url.includes('/images');
5658

@@ -87,15 +89,18 @@ export class ErrorHandlerInterceptor implements HttpInterceptor {
8789
} else if (status === 500) {
8890
this.alertService.alert({
8991
type: 'Internal Server Error',
90-
message: 'Internal Server Error. Please try again later.'
92+
message: errorMessage || 'Internal Server Error. Please try again later.'
9193
});
9294
} else if (status === 501) {
9395
this.alertService.alert({
9496
type: this.translate.instant('error.resource.notImplemented.type'),
9597
message: this.translate.instant('error.resource.notImplemented.message')
9698
});
9799
} else {
98-
this.alertService.alert({ type: 'Unknown Error', message: 'Unknown Error. Please try again later.' });
100+
this.alertService.alert({
101+
type: 'Unknown Error',
102+
message: errorMessage || 'Unknown Error. Please try again later.'
103+
});
99104
}
100105

101106
throw response;

src/assets/translations/cs-CS.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
"Remember me": "Zapamatuj si mě",
55
"error.resource.notImplemented.type": "Nenaimplementovaná chyba",
66
"error.resource.notImplemented.message": "Funkce není implementována!",
7+
"error.msg.platform.service.unavailable": "Server je v současné chvíli neschopen zpracovat požadavek. Zkuste to prosím později.",
8+
"error.msg.database.type.not.supported": "Datový typ není podporován",
79
"errors": {
810
"accountingRule": {
911
"duplicateName": "Omlouváme se, ale účetní pravidlo s tímto názvem již existuje."

src/assets/translations/de-DE.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
"Remember me": "Erinnere dich an mich",
55
"error.resource.notImplemented.type": "Nicht implementierter Fehler",
66
"error.resource.notImplemented.message": "Nicht implementierte Funktion!",
7+
"error.msg.platform.service.unavailable": "Der Server kann die Anfrage derzeit nicht bearbeiten. Bitte versuchen Sie es später erneut.",
8+
"error.msg.database.type.not.supported": "Der Datentyp wird nicht unterstützt",
79
"errors": {
810
"accountingRule": {
911
"duplicateName": "Entschuldigung, aber eine Buchungsregel mit diesem Namen existiert bereits."

src/assets/translations/en-US.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
"Remember me": "Remember me",
55
"error.resource.notImplemented.type": "Not Implemented Error",
66
"error.resource.notImplemented.message": "Not implemented functionality!",
7+
"error.msg.platform.service.unavailable": "The server is currently unable to handle the request, please try again after some time.",
8+
"error.msg.database.type.not.supported": "Data type is not supported",
79
"errors": {
810
"accountingRule": {
911
"duplicateName": "Sorry, but an Accounting Rule with this Name exists already."

src/assets/translations/es-CL.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"APP_NAME": "Mifos® X WebApp",
33
"Logged in as": "Conectado como",
44
"Remember me": "Recordar me",
5+
"error.msg.platform.service.unavailable": "El servidor no puede procesar la solicitud en este momento. Por favor, inténtelo de nuevo más tarde.",
6+
"error.msg.database.type.not.supported": "El tipo de datos no es compatible",
57
"errors": {
68
"accountingRule": {
79
"duplicateName": "Lo sentimos, pero ya existe una regla contable con este nombre."

src/assets/translations/es-MX.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"APP_NAME": "Mifos® X WebApp",
33
"Logged in as": "Conectado como",
44
"Remember me": "Recordar me",
5+
"error.msg.platform.service.unavailable": "El servidor no puede procesar la solicitud en este momento. Por favor, intente más tarde.",
6+
"error.msg.database.type.not.supported": "El tipo de datos no es compatible",
57
"errors": {
68
"accountingRule": {
79
"duplicateName": "Lo sentimos, pero ya existe una regla contable con este nombre."

src/assets/translations/fr-FR.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"APP_NAME": "Mifos® X WebApp",
33
"Logged in as": "connecté en tant que",
44
"Remember me": "Souviens-toi de moi",
5+
"error.msg.platform.service.unavailable": "Le serveur est actuellement incapable de traiter la requête, veuillez réessayer ultérieurement.",
6+
"error.msg.database.type.not.supported": "Le type de données n'est pas pris en charge",
57
"errors": {
68
"accountingRule": {
79
"duplicateName": "Désolé, mais une règle comptable portant ce nom existe déjà."

src/assets/translations/it-IT.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"APP_NAME": "Mifos® X WebApp",
33
"Logged in as": "Collegato come",
44
"Remember me": "Ricordati di me",
5+
"error.msg.platform.service.unavailable": "Il server non può elaborare la richiesta in questo momento. Si prega di riprovare più tardi.",
6+
"error.msg.database.type.not.supported": "Il tipo di dati non è supportato",
57
"errors": {
68
"accountingRule": {
79
"duplicateName": "Spiacenti, ma esiste già una regola contabile con questo nome."

src/assets/translations/ko-KO.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"APP_NAME": "Mifos® X WebApp",
33
"Logged in as": "다음 계정으로 로그인됨",
44
"Remember me": "날 기억해",
5+
"error.msg.platform.service.unavailable": "서버가 현재 요청을 처리할 수 없습니다. 나중에 다시 시도해주세요.",
6+
"error.msg.database.type.not.supported": "지원하지 않는 데이터 유형입니다",
57
"errors": {
68
"accountingRule": {
79
"duplicateName": "죄송합니다. 이미 동일한 이름의 회계 규칙이 존재합니다."

0 commit comments

Comments
 (0)