@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 CHANGED
@@ -7,6 +7,9 @@
7
7
  *Tiledesk SRL*
8
8
 
9
9
 
10
+ # 5.1.15
11
+ - **changed**: Load local translations before remote ones
12
+
10
13
  # 5.1.14
11
14
  - **bug-fixed**: stopped loading local language json file
12
15
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chat21/chat21-web-widget",
3
3
  "author": "Tiledesk SRL",
4
- "version": "5.1.14",
4
+ "version": "5.1.15",
5
5
  "license": "MIT",
6
6
  "homepage": "https://www.tiledesk.com",
7
7
  "repository": {
@@ -116,77 +116,116 @@ export class TranslatorService {
116
116
  this.g.lang = browserLang;
117
117
  }
118
118
 
119
-
120
-
121
- // const languageUrl = this.getTranslationFileUrl(browserLang);
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
- this.http.get(this.getTranslationFileUrl(browserLang))
129
-
130
- // .catch((error: any) => {
131
- // // I18N File failed to load, fall back to default language
132
- // // console.log(`»»»» initI18n !!! Problem with '${browserLang}' language initialization from URL `, error.url, ` - ERROR: `, error);
133
- // this._translate.use(defaultLanguage);
134
- // this.http.get(this.getTranslationFileUrl(defaultLanguage)).subscribe((data) => {
135
- // this.translateWithBrowserLang(data['_body'], defaultLanguage);
136
- // }, (er) => {
137
- // // failed to load default language from remote - fall back to local default language
138
- // this.logger.error('[TRANSLATOR-SERV] »»»» initI18n Get default language - ERROR ', er);
139
- // this.logger.error('[TRANSLATOR-SERV] »»»» initI18n - »»» loadRemoteTranslations IN ERROR ?', environment.loadRemoteTranslations);
140
- // }, () => {
141
- // resolve(true);
142
- // // console.log('»»»» initI18n Get default language * COMPLETE *');
143
- // });
144
- // return Observable.throw(error);
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
- .subscribe((data: any) => {
165
- // I18N File loaded successfully, we can proceed
166
- // console.log(`»»»» Successfully initialized '${browserLang}' language.'`, data.data);
167
- this.logger.debug(`[TRANSLATOR-SERV] »»»» initI18n Successfully initialized '${browserLang}' language from URL'`, this.getTranslationFileUrl(browserLang));
168
- if (!data.data || data.data === undefined || data.data === '') {
169
- browserLang = defaultLanguage;
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
- // console.log('»»»» translateWithBrowserLang ', this.getTranslationFileUrl(defaultLanguage));
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
- }, (error) => {
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