@chat21/chat21-web-widget 5.1.14 → 5.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -0
- package/package.json +1 -1
- package/src/app/providers/translator.service.ts +101 -62
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
|
@@ -116,77 +116,116 @@ export class TranslatorService {
|
|
|
116
116
|
this.g.lang = browserLang;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
// console.log(`»»»» browserLang `, browserLang, this.g.lang, this.getTranslationFileUrl(browserLang));
|
|
123
|
-
|
|
119
|
+
// URL del file di traduzione locale
|
|
120
|
+
const localUrlLang = this.baseLocation + `/assets/i18n/${browserLang}.json`;
|
|
121
|
+
const localUrlDefaultLang = this.baseLocation + `/assets/i18n/${defaultLanguage}.json`;
|
|
124
122
|
|
|
125
123
|
// Try to load the I18N JSON file for the detected language
|
|
126
124
|
return new Promise((resolve, reject) => {
|
|
127
125
|
const that = this;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
// })
|
|
146
|
-
.pipe(
|
|
147
|
-
catchError((error: any)=>{
|
|
148
|
-
// I18N File failed to load, fall back to default language
|
|
149
|
-
// console.log(`»»»» initI18n !!! Problem with '${browserLang}' language initialization from URL `, this.getTranslationFileUrl(browserLang), ` - ERROR: `, error);
|
|
150
|
-
this._translate.use(defaultLanguage);
|
|
151
|
-
this.http.get(this.getTranslationFileUrl(defaultLanguage)).subscribe((data) => {
|
|
152
|
-
this.translateWithBrowserLang(data['data'], defaultLanguage);
|
|
153
|
-
}, (er) => {
|
|
154
|
-
// failed to load default language from remote - fall back to local default language
|
|
155
|
-
this.logger.error('[TRANSLATOR-SERV] »»»» initI18n Get default language - ERROR ', er);
|
|
156
|
-
this.logger.error('[TRANSLATOR-SERV] »»»» initI18n - »»» loadRemoteTranslations IN ERROR ?', environment.loadRemoteTranslations);
|
|
157
|
-
}, () => {
|
|
158
|
-
resolve(true);
|
|
159
|
-
// console.log('»»»» initI18n Get default language * COMPLETE *');
|
|
160
|
-
});
|
|
161
|
-
return observableThrowError(error);
|
|
126
|
+
|
|
127
|
+
// STEP 1: Carica prima il file di traduzione locale della lingua selezionata
|
|
128
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Loading local translation file: ${localUrlLang}`);
|
|
129
|
+
let loadedFromDefault = false;
|
|
130
|
+
|
|
131
|
+
this.http.get(localUrlLang).pipe(
|
|
132
|
+
catchError((error: any) => {
|
|
133
|
+
// Se il file locale della lingua selezionata non esiste, carica il file locale della lingua di default
|
|
134
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Local file '${browserLang}.json' not found, loading default language from local`);
|
|
135
|
+
loadedFromDefault = true;
|
|
136
|
+
return this.http.get(localUrlDefaultLang).pipe(
|
|
137
|
+
catchError((defaultError: any) => {
|
|
138
|
+
// Se anche il default fallisce, restituisci un Observable vuoto
|
|
139
|
+
this.logger.error(`[TRANSLATOR-SERV] »»»» initI18n Failed to load both '${browserLang}.json' and '${defaultLanguage}.json' - ERROR `, defaultError);
|
|
140
|
+
return observableThrowError(defaultError);
|
|
141
|
+
})
|
|
142
|
+
);
|
|
162
143
|
})
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
144
|
+
).subscribe(
|
|
145
|
+
(localData: any) => {
|
|
146
|
+
// Estrai i dati di traduzione (gestisci sia formato con 'data' che formato diretto)
|
|
147
|
+
const translationData = localData['data'] || localData;
|
|
148
|
+
|
|
149
|
+
// Imposta la lingua di base: se abbiamo caricato dal default locale, usa quello temporaneamente
|
|
150
|
+
const localLangToUse = loadedFromDefault ? defaultLanguage : browserLang;
|
|
151
|
+
this.language = localLangToUse.toLowerCase();
|
|
152
|
+
this.g.lang = localLangToUse;
|
|
153
|
+
this._translate.use(localLangToUse);
|
|
154
|
+
|
|
155
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Local translation loaded successfully for '${localLangToUse}'`);
|
|
156
|
+
this.translateWithBrowserLang(translationData, this.language);
|
|
157
|
+
|
|
158
|
+
// STEP 2: Carica da remoto il file della lingua selezionata (sempre browserLang, non il default)
|
|
159
|
+
// e sovrascrive le traduzioni locali
|
|
160
|
+
if (environment.loadRemoteTranslations) {
|
|
161
|
+
// Usa sempre browserLang per il caricamento remoto, non localLangToUse
|
|
162
|
+
const remoteUrl = this.getTranslationFileUrl(browserLang);
|
|
163
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Attempting to load remote translation for '${browserLang}' from: ${remoteUrl}`);
|
|
164
|
+
|
|
165
|
+
this.http.get(remoteUrl).pipe(
|
|
166
|
+
catchError((remoteError: any) => {
|
|
167
|
+
// Se il caricamento remoto fallisce, mantieni le traduzioni locali già caricate
|
|
168
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Remote translation for '${browserLang}' failed, keeping local translations`, remoteError);
|
|
169
|
+
// Se avevamo caricato il default locale, mantieni la lingua selezionata comunque
|
|
170
|
+
if (loadedFromDefault) {
|
|
171
|
+
this.language = browserLang.toLowerCase();
|
|
172
|
+
this.g.lang = browserLang;
|
|
173
|
+
this._translate.use(browserLang);
|
|
174
|
+
}
|
|
175
|
+
resolve(true);
|
|
176
|
+
return observableThrowError(remoteError);
|
|
177
|
+
})
|
|
178
|
+
).subscribe(
|
|
179
|
+
(remoteData: any) => {
|
|
180
|
+
// Sovrascrivi le traduzioni con quelle remote della lingua selezionata
|
|
181
|
+
if (remoteData && remoteData['data']) {
|
|
182
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Remote translation for '${browserLang}' loaded successfully, overwriting local translations`);
|
|
183
|
+
// Usa sempre la lingua selezionata quando il remoto è disponibile
|
|
184
|
+
this.language = browserLang.toLowerCase();
|
|
185
|
+
this.g.lang = browserLang;
|
|
186
|
+
this._translate.use(browserLang);
|
|
187
|
+
// Usa merge=true per sovrascrivere le chiavi esistenti mantenendo quelle nuove del remoto
|
|
188
|
+
this.translateWithBrowserLang(remoteData['data'], this.language);
|
|
189
|
+
} else if (remoteData && !remoteData['data']) {
|
|
190
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Remote translation empty, keeping local translations`);
|
|
191
|
+
// Se il remoto è vuoto, usa comunque la lingua selezionata se avevamo caricato il default
|
|
192
|
+
if (loadedFromDefault) {
|
|
193
|
+
this.language = browserLang.toLowerCase();
|
|
194
|
+
this.g.lang = browserLang;
|
|
195
|
+
this._translate.use(browserLang);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
resolve(true);
|
|
199
|
+
},
|
|
200
|
+
(remoteError) => {
|
|
201
|
+
// Questo non dovrebbe mai essere chiamato perché catchError risolve già la promise
|
|
202
|
+
// Ma per sicurezza risolvi comunque
|
|
203
|
+
this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Remote translation error handler (should not reach here)`);
|
|
204
|
+
resolve(true);
|
|
205
|
+
},
|
|
206
|
+
() => {
|
|
207
|
+
resolve(true);
|
|
208
|
+
}
|
|
209
|
+
);
|
|
210
|
+
} else {
|
|
211
|
+
// Se le traduzioni remote non sono abilitate, usa la lingua selezionata se avevamo caricato il default
|
|
212
|
+
if (loadedFromDefault) {
|
|
213
|
+
this.language = browserLang.toLowerCase();
|
|
214
|
+
this.g.lang = browserLang;
|
|
215
|
+
this._translate.use(browserLang);
|
|
216
|
+
}
|
|
217
|
+
resolve(true);
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
(error) => {
|
|
221
|
+
// Fallback: se anche il file di default locale non esiste, usa solo la lingua di default senza traduzioni
|
|
222
|
+
this.logger.error(`[TRANSLATOR-SERV] »»»» initI18n Failed to load local translation files - ERROR `, error);
|
|
170
223
|
this.language = defaultLanguage;
|
|
171
224
|
this.g.lang = defaultLanguage;
|
|
172
225
|
this._translate.use(defaultLanguage);
|
|
173
|
-
|
|
174
|
-
this.http.get(this.getTranslationFileUrl(defaultLanguage)).subscribe((defaultdata) => {
|
|
175
|
-
// console.log(`»»»» Successfully initialized '${browserLang}' language.'`, defaultdata);
|
|
176
|
-
this.translateWithBrowserLang(defaultdata['data'], browserLang);
|
|
177
|
-
});
|
|
178
|
-
} else {
|
|
179
|
-
// console.log(`»»»» translateWithBrowserLang '${browserLang}' language.'`);
|
|
180
|
-
this.language = data.lang.toLowerCase();;
|
|
181
|
-
this.translateWithBrowserLang(data.data, this.language);
|
|
226
|
+
resolve(true);
|
|
182
227
|
}
|
|
183
|
-
|
|
184
|
-
this.logger.error(`[TRANSLATOR-SERV] »»»» initI18n Get '${browserLang}' language - ERROR `, error);
|
|
185
|
-
}, () => {
|
|
186
|
-
resolve(true);
|
|
187
|
-
// console.log(`»»»» initI18n Get '${browserLang}' language - COMPLETE`);
|
|
188
|
-
});
|
|
189
|
-
|
|
228
|
+
);
|
|
190
229
|
});
|
|
191
230
|
}
|
|
192
231
|
|