diff --git a/package.json b/package.json
index 5ae63a524..d730bda61 100644
--- a/package.json
+++ b/package.json
@@ -80,6 +80,7 @@
"colors": "1.4.0",
"core-js": "3.33.3",
"custom-idle-queue": "3.0.1",
+ "deepmerge": "^4.3.1",
"eslint-plugin-sonarjs": "^0.23.0",
"gulp-clean": "^0.4.0",
"gulp-run": "^1.7.1",
diff --git a/projects/ui/ng-package.json b/projects/ui/ng-package.json
index ef5f0140e..ab7900c4a 100644
--- a/projects/ui/ng-package.json
+++ b/projects/ui/ng-package.json
@@ -4,5 +4,5 @@
"lib": {
"entryFile": "./src/public-api.ts"
},
- "allowedNonPeerDependencies": ["@angular/cdk", "@po-ui/style", "@po-ui/ng-schematics"]
+ "allowedNonPeerDependencies": ["@angular/cdk", "@po-ui/style", "@po-ui/ng-schematics", "deepmerge"]
}
diff --git a/projects/ui/package.json b/projects/ui/package.json
index 8669c4ef0..6b1c1c6f4 100644
--- a/projects/ui/package.json
+++ b/projects/ui/package.json
@@ -39,6 +39,7 @@
"@angular-devkit/schematics": "^18",
"@po-ui/style": "0.0.0-PLACEHOLDER",
"rxjs": "~7.8.1",
- "zone.js": "~0.14.4"
+ "zone.js": "~0.14.4",
+ "deepmerge": "^4.3.1"
}
}
diff --git a/projects/ui/src/lib/services/po-i18n/index.ts b/projects/ui/src/lib/services/po-i18n/index.ts
index ae77d94cb..b415823d6 100644
--- a/projects/ui/src/lib/services/po-i18n/index.ts
+++ b/projects/ui/src/lib/services/po-i18n/index.ts
@@ -1,4 +1,5 @@
export * from './interfaces/po-i18n-config.interface';
+export * from './interfaces/po-i18n-config-context.interface';
export * from './interfaces/po-i18n-config-default.interface';
export * from './interfaces/po-i18n-literals.interface';
export * from './po-i18n.pipe';
diff --git a/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config-context.interface.ts b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config-context.interface.ts
new file mode 100644
index 000000000..e8f5184c3
--- /dev/null
+++ b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config-context.interface.ts
@@ -0,0 +1,12 @@
+/**
+ * @description
+ *
+ *
+ *
+ * Interface para a configuração dos contextos do módulo `PoI18nModule`.
+ *
+ * @usedBy PoI18nModule
+ */
+export interface PoI18nConfigContext {
+ [name: string]: { [language: string]: { [literal: string]: string } } | { url: string };
+}
diff --git a/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts
index bda96e402..caf87e7a7 100644
--- a/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts
+++ b/projects/ui/src/lib/services/po-i18n/interfaces/po-i18n-config.interface.ts
@@ -1,4 +1,5 @@
import { PoI18nConfigDefault } from './po-i18n-config-default.interface';
+import { PoI18nConfigContext } from './po-i18n-config-context.interface';
/**
* @description
@@ -76,5 +77,5 @@ export interface PoI18nConfig {
* ```
* > Caso a constante contenha alguma literal que o serviço não possua será utilizado a literal da constante.
*/
- contexts: object;
+ contexts: PoI18nConfigContext;
}
diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts b/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts
index 85993cafa..9156a9e52 100644
--- a/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts
+++ b/projects/ui/src/lib/services/po-i18n/po-i18n-base.service.ts
@@ -191,7 +191,7 @@ export class PoI18nBaseService {
const context = options['context'] ? options['context'] : this.contextDefault;
const literals: Array = options['literals'] ? options['literals'] : [];
- return new Observable(observer => {
+ return new Observable(observer => {
if (this.servicesContext[context]) {
// Faz o processo de busca de um contexto que contém serviço
this.getLiteralsFromContextService(language, context, literals, observer);
diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts b/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts
index f0e5e57a9..8a64af3fa 100644
--- a/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts
+++ b/projects/ui/src/lib/services/po-i18n/po-i18n-config-injection-token.ts
@@ -2,4 +2,4 @@ import { InjectionToken } from '@angular/core';
import { PoI18nConfig } from './interfaces/po-i18n-config.interface';
-export const I18N_CONFIG = new InjectionToken('I18N_CONFIG');
+export const I18N_CONFIG = new InjectionToken>('I18N_CONFIG');
diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts b/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts
index c260d7f1f..c69df861c 100644
--- a/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts
+++ b/projects/ui/src/lib/services/po-i18n/po-i18n.module.ts
@@ -1,4 +1,4 @@
-import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core';
+import { APP_INITIALIZER, ModuleWithProviders, NgModule, Provider } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { PoLanguageService } from './../po-language/po-language.service';
@@ -162,8 +162,10 @@ export class PoI18nModule {
providers: [
{
provide: I18N_CONFIG,
- useValue: config
+ useValue: config,
+ multi: true
},
+ provideI18nConfig(config),
{
provide: APP_INITIALIZER,
useFactory: initializeLanguageDefault,
@@ -180,12 +182,27 @@ export class PoI18nModule {
}
}
-export function initializeLanguageDefault(config: PoI18nConfig, languageService: PoLanguageService) {
- // eslint-disable-next-line sonarjs/prefer-immediate-return
- const setDefaultLanguage = () => {
- if (config.default.language) {
+export function provideI18nConfig(config: PoI18nConfig): Array {
+ return [
+ {
+ provide: I18N_CONFIG,
+ useValue: config,
+ multi: true
+ },
+ {
+ provide: PoI18nService,
+ useFactory: returnPoI18nService,
+ deps: [I18N_CONFIG, HttpClient, PoLanguageService]
+ }
+ ];
+}
+
+export function initializeLanguageDefault(configs: Array, languageService: PoLanguageService) {
+ const config = configs.find(c => c.default); // Busca a configuração com `default`
+
+ return () => {
+ if (config?.default.language) {
languageService.setLanguageDefault(config.default.language);
}
};
- return setDefaultLanguage;
}
diff --git a/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts b/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts
index 701f33240..fe74035e3 100644
--- a/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts
+++ b/projects/ui/src/lib/services/po-i18n/po-i18n.service.ts
@@ -1,5 +1,6 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
+import { all as deepmergeAll } from 'deepmerge';
import { PoLanguageService } from './../po-language/po-language.service';
@@ -14,6 +15,17 @@ import { PoI18nConfig } from './interfaces/po-i18n-config.interface';
export class PoI18nService extends PoI18nBaseService {}
// Função usada para retornar instância para o módulo po-i18n.module
-export function returnPoI18nService(config: PoI18nConfig, http: HttpClient, languageService: PoLanguageService) {
- return new PoI18nService(config, http, languageService);
+export function returnPoI18nService(
+ configs: Array,
+ http: HttpClient,
+ languageService: PoLanguageService
+) {
+ const validatedConfigs = configs.map(config => ({
+ ...config,
+ contexts: config.contexts,
+ default: config.default
+ }));
+ const mergedConfig = deepmergeAll(validatedConfigs);
+
+ return new PoI18nService(mergedConfig, http, languageService);
}