@tolgee/ngx 6.4.1-prerelease.43dd4fa5.0 → 6.5.0

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, NgZone, Injectable, ChangeDetectorRef, Pipe, input, ElementRef, Renderer2, computed, effect, Directive, makeEnvironmentProviders, provideAppInitializer } from '@angular/core';
2
+ import { InjectionToken, Injectable, Inject, Pipe, Component, Input, APP_INITIALIZER, NgModule } from '@angular/core';
3
3
  import { Observable } from 'rxjs';
4
4
  import { getTranslateProps } from '@tolgee/web';
5
5
  export * from '@tolgee/web';
@@ -7,64 +7,35 @@ export * from '@tolgee/web';
7
7
  const TOLGEE_INSTANCE = new InjectionToken('tolgee.instance');
8
8
 
9
9
  class TranslateService {
10
+ _tolgee;
11
+ _ngZone;
10
12
  runPromise;
11
- _ngZone = inject(NgZone);
12
- #tolgeeOrPromise = inject(TOLGEE_INSTANCE);
13
- #resolvedTolgee;
13
+ constructor(_tolgee, _ngZone) {
14
+ this._tolgee = _tolgee;
15
+ this._ngZone = _ngZone;
16
+ }
14
17
  get tolgee() {
15
- if (this.#resolvedTolgee) {
16
- // If it's still a promise, throw error
17
- if (this.#resolvedTolgee instanceof Promise) {
18
- throw new Error('Tolgee instance is not yet resolved. Call start() first or wait for app initialization.');
19
- }
20
- return this.#resolvedTolgee;
21
- }
22
- // If it's a promise, this is a synchronous access before resolution
23
- if (this.#tolgeeOrPromise instanceof Promise) {
24
- throw new Error('Tolgee instance is not yet resolved. Call start() first or wait for app initialization.');
25
- }
26
- this.#resolvedTolgee = this.#tolgeeOrPromise;
27
- return this.#resolvedTolgee;
18
+ return this._tolgee;
28
19
  }
29
20
  /**
30
21
  * Starts Tolgee if not started.
31
22
  *
32
- * The Tolgee is run outside NgZone. The triggered events don't
33
- * trigger the change the detection when listening directly via Tolgee.on.
23
+ * The Tolgee is run outside NgZone. The triggered events, doesn't
24
+ * trigger the change detection, when listening directly via Tolgee.on.
34
25
  *
35
26
  * However, all the emitting methods (on, translate, languageAsync)
36
27
  * in this class are emitting back in Angular's NgZone,
37
28
  * so the change detection works fine.
38
29
  */
39
30
  async start() {
40
- // If tolgee was provided as a promise, resolve it first
41
- if (!this.#resolvedTolgee) {
42
- if (this.#tolgeeOrPromise instanceof Promise) {
43
- // Assign the promise immediately to prevent redundant awaits
44
- this.#resolvedTolgee = this.#tolgeeOrPromise;
45
- }
46
- else {
47
- // Eagerly cache the resolved instance
48
- this.#resolvedTolgee = this.#tolgeeOrPromise;
49
- }
50
- }
51
- // Await resolution if it's a promise
52
- if (this.#resolvedTolgee instanceof Promise) {
53
- this.#resolvedTolgee = await this.#resolvedTolgee;
54
- }
55
31
  if (!this.isSSR()) {
56
- try {
57
- await this.runIfNotRunning();
58
- }
59
- catch (error) {
60
- console.error('Tolgee failed to start:', error);
61
- }
32
+ await this.runIfNotRunning();
62
33
  }
63
34
  }
64
35
  /**
65
- * Returns translation asynchronously, this method always returns
36
+ * Returns translation asynchronously, this method always return
66
37
  */
67
- translate(...args) {
38
+ translate = (...args) => {
68
39
  // @ts-ignore
69
40
  const params = getTranslateProps(...args);
70
41
  return new Observable((subscriber) => {
@@ -72,9 +43,7 @@ class TranslateService {
72
43
  const translate = async () => {
73
44
  await loadPromise;
74
45
  const translated = this.tolgee.t(params);
75
- this._ngZone.run(() => {
76
- subscriber.next(translated);
77
- });
46
+ subscriber.next(translated);
78
47
  };
79
48
  // noinspection JSIgnoredPromiseFromCall
80
49
  translate();
@@ -84,10 +53,10 @@ class TranslateService {
84
53
  subscription.unsubscribe();
85
54
  };
86
55
  });
87
- }
56
+ };
88
57
  /**
89
- * Instantly returns a translated value. May return undefined or outdated value.
90
- * Use only when you cannot use translate pipe.
58
+ * Instantly returns translated value. May return undefined or outdated value.
59
+ * Use only when you cannot use translate.
91
60
  */
92
61
  instant = (...args) => {
93
62
  // @ts-ignore
@@ -102,7 +71,7 @@ class TranslateService {
102
71
  }
103
72
  /**
104
73
  * Returns an observable emitting current language.
105
- * It instantly emits the current language
74
+ * It instantly emits current language
106
75
  */
107
76
  get languageAsync() {
108
77
  return new Observable((subscriber) => {
@@ -115,7 +84,7 @@ class TranslateService {
115
84
  }
116
85
  /**
117
86
  * Changes the current language
118
- * @param lang The new current language (e.g., en, en-US)
87
+ * @param lang The new current language (e.g. en, en-US)
119
88
  * @return Promise<void> Resolves when translations
120
89
  * for given language are loaded
121
90
  */
@@ -123,9 +92,9 @@ class TranslateService {
123
92
  return this.tolgee.changeLanguage(lang);
124
93
  }
125
94
  /**
126
- * Returns observable emitting when a specified event is triggered.
95
+ * Returns observable emitting when specified event is triggered.
127
96
  *
128
- * It's a wrapper of Tolgee. 'on' method. The emmit is triggered inside ngZone,
97
+ * It's a wrapper of Tolgee.on method. The emmit is triggered inside ngZone,
129
98
  * so change detection should work properly.
130
99
  *
131
100
  * @param event the event to listen
@@ -141,18 +110,7 @@ class TranslateService {
141
110
  });
142
111
  }
143
112
  ngOnDestroy() {
144
- const tolgeeInstance = this.#resolvedTolgee || this.#tolgeeOrPromise;
145
- if (tolgeeInstance instanceof Promise) {
146
- // If Tolgee is still resolving, stop it when it resolves
147
- tolgeeInstance
148
- .then((instance) => instance?.stop())
149
- .catch(() => {
150
- // Ignore errors if the promise was rejected
151
- });
152
- }
153
- else if (tolgeeInstance) {
154
- tolgeeInstance.stop();
155
- }
113
+ this.tolgee.stop();
156
114
  }
157
115
  async runIfNotRunning() {
158
116
  if (!this.runPromise) {
@@ -165,29 +123,36 @@ class TranslateService {
165
123
  isSSR() {
166
124
  return typeof window === 'undefined';
167
125
  }
168
- static ɵfac = function TranslateService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TranslateService)(); };
126
+ static ɵfac = function TranslateService_Factory(t) { return new (t || TranslateService)(i0.ɵɵinject(TOLGEE_INSTANCE), i0.ɵɵinject(i0.NgZone)); };
169
127
  static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: TranslateService, factory: TranslateService.ɵfac, providedIn: 'root' });
170
128
  }
171
129
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TranslateService, [{
172
130
  type: Injectable,
173
131
  args: [{ providedIn: 'root' }]
174
- }], null, null); })();
132
+ }], () => [{ type: undefined, decorators: [{
133
+ type: Inject,
134
+ args: [TOLGEE_INSTANCE]
135
+ }] }, { type: i0.NgZone }], null); })();
175
136
 
176
137
  class TranslatePipe {
138
+ translateService;
139
+ _cdr;
177
140
  value = '';
178
141
  previousHash;
179
142
  subscription;
180
- translateService = inject(TranslateService);
181
- _cdr = inject(ChangeDetectorRef);
143
+ constructor(translateService, _cdr) {
144
+ this.translateService = translateService;
145
+ this._cdr = _cdr;
146
+ }
182
147
  ngOnDestroy() {
183
148
  this.unsubscribe();
184
149
  }
185
- transform(...args) {
150
+ transform = (...args) => {
186
151
  // @ts-ignore
187
152
  const params = getTranslateProps(...args);
188
153
  const { key } = params;
189
- if (!key) {
190
- return '';
154
+ if (!key || key.length === 0) {
155
+ return key;
191
156
  }
192
157
  const newHash = this.hash(params);
193
158
  if (this.previousHash === newHash) {
@@ -196,7 +161,7 @@ class TranslatePipe {
196
161
  this.previousHash = newHash;
197
162
  this.translate(params);
198
163
  return this.value;
199
- }
164
+ };
200
165
  hash(props) {
201
166
  return JSON.stringify([props, this.translateService.tolgee.getLanguage()]);
202
167
  }
@@ -217,7 +182,7 @@ class TranslatePipe {
217
182
  this._cdr.detectChanges();
218
183
  });
219
184
  }
220
- static ɵfac = function TranslatePipe_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TranslatePipe)(); };
185
+ static ɵfac = function TranslatePipe_Factory(t) { return new (t || TranslatePipe)(i0.ɵɵdirectiveInject(TranslateService, 16), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef, 16)); };
221
186
  static ɵpipe = /*@__PURE__*/ i0.ɵɵdefinePipe({ name: "translate", type: TranslatePipe, pure: false });
222
187
  }
223
188
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TranslatePipe, [{
@@ -225,81 +190,189 @@ class TranslatePipe {
225
190
  args: [{
226
191
  name: 'translate',
227
192
  pure: false,
193
+ standalone: false,
228
194
  }]
229
- }], null, null); })();
195
+ }], () => [{ type: TranslateService }, { type: i0.ChangeDetectorRef }], null); })();
230
196
 
231
- class TDirective {
232
- key = input(...(ngDevMode ? [undefined, { debugName: "key" }] : []));
233
- ns = input(...(ngDevMode ? [undefined, { debugName: "ns" }] : []));
234
- params = input(...(ngDevMode ? [undefined, { debugName: "params" }] : []));
235
- default = input(...(ngDevMode ? [undefined, { debugName: "default" }] : []));
236
- noWrap = input(false, ...(ngDevMode ? [{ debugName: "noWrap" }] : []));
237
- language = input(...(ngDevMode ? [undefined, { debugName: "language" }] : []));
197
+ const _c0 = ["t", ""];
198
+ class TComponent {
199
+ ref;
200
+ translateService;
201
+ key;
202
+ ns;
203
+ params;
204
+ default;
205
+ noWrap = false;
206
+ language;
238
207
  /**
239
- * When true, the innerHTML property of an element is set.
208
+ * When true, innerHTML property of element is set.
240
209
  * Use only when you're sure the HTML is sanitized.
241
210
  */
242
- isHtml = input(false, ...(ngDevMode ? [{ debugName: "isHtml" }] : []));
243
- ref = inject(ElementRef);
244
- translate = inject(TranslateService);
245
- renderer = inject(Renderer2);
246
- translateParams = computed(() => ({
247
- key: this.key(),
248
- ns: this.ns(),
249
- params: this.params(),
250
- defaultValue: this.default(),
251
- noWrap: this.noWrap(),
252
- language: this.language(),
253
- }), ...(ngDevMode ? [{ debugName: "translateParams" }] : []));
254
- constructor() {
255
- effect((onCleanup) => {
256
- const params = this.translateParams();
257
- const subscription = this.translate
258
- .translate(params)
259
- .subscribe((translated) => {
260
- this.setElementContent(translated);
261
- });
262
- // cleanup when params change or directive is destroyed
263
- onCleanup(() => subscription.unsubscribe());
211
+ isHtml = false;
212
+ subscription;
213
+ initialized;
214
+ constructor(ref, translateService) {
215
+ this.ref = ref;
216
+ this.translateService = translateService;
217
+ }
218
+ ngOnInit() {
219
+ // noinspection JSIgnoredPromiseFromCall
220
+ this.subscribe();
221
+ this.renderInstantValue();
222
+ }
223
+ ngOnChanges() {
224
+ // noinspection JSIgnoredPromiseFromCall
225
+ this.subscribe();
226
+ }
227
+ ngOnDestroy() {
228
+ this.unsubscribe();
229
+ }
230
+ renderInstantValue() {
231
+ // get initial value first
232
+ const translated = this.translateService.instant({
233
+ ...this.getTranslateProps(),
234
+ orEmpty: true,
235
+ });
236
+ this.setElementContent(translated);
237
+ }
238
+ getTranslateProps() {
239
+ return {
240
+ key: this.key,
241
+ ns: this.ns,
242
+ params: this.params,
243
+ defaultValue: this.default,
244
+ noWrap: this.noWrap,
245
+ language: this.language,
246
+ };
247
+ }
248
+ unsubscribe() {
249
+ this.subscription?.unsubscribe();
250
+ }
251
+ async subscribe() {
252
+ this.unsubscribe();
253
+ this.subscription = this.translateService
254
+ .translate(this.getTranslateProps())
255
+ .subscribe((translated) => {
256
+ this.setElementContent(translated);
257
+ this.initialized = true;
264
258
  });
265
259
  }
266
260
  setElementContent(translated) {
267
- if (this.isHtml()) {
268
- this.renderer.setProperty(this.ref.nativeElement, 'innerHTML', translated);
269
- }
270
- else {
271
- this.renderer.setProperty(this.ref.nativeElement, 'textContent', translated);
261
+ if (this.isHtml) {
262
+ this.getElement().innerHTML = translated;
263
+ return;
272
264
  }
265
+ this.getElement().textContent = translated;
266
+ }
267
+ getElement() {
268
+ return this.ref.nativeElement;
273
269
  }
274
- static ɵfac = function TDirective_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TDirective)(); };
275
- static ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: TDirective, selectors: [["", "t", ""]], inputs: { key: [1, "key"], ns: [1, "ns"], params: [1, "params"], default: [1, "default"], noWrap: [1, "noWrap"], language: [1, "language"], isHtml: [1, "isHtml"] } });
270
+ static ɵfac = function TComponent_Factory(t) { return new (t || TComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(TranslateService)); };
271
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TComponent, selectors: [["", "t", ""]], inputs: { key: "key", ns: "ns", params: "params", default: "default", noWrap: "noWrap", language: "language", isHtml: "isHtml" }, features: [i0.ɵɵNgOnChangesFeature], attrs: _c0, decls: 0, vars: 0, template: function TComponent_Template(rf, ctx) { }, encapsulation: 2 });
276
272
  }
277
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TDirective, [{
278
- type: Directive,
273
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TComponent, [{
274
+ type: Component,
279
275
  args: [{
280
276
  selector: '[t]',
277
+ template: ``,
278
+ standalone: false
279
+ }]
280
+ }], () => [{ type: i0.ElementRef }, { type: TranslateService }], { key: [{
281
+ type: Input
282
+ }], ns: [{
283
+ type: Input
284
+ }], params: [{
285
+ type: Input
286
+ }], default: [{
287
+ type: Input
288
+ }], noWrap: [{
289
+ type: Input
290
+ }], language: [{
291
+ type: Input
292
+ }], isHtml: [{
293
+ type: Input
294
+ }] }); })();
295
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TComponent, { className: "TComponent", filePath: "lib/t.component.ts", lineNumber: 18 }); })();
296
+
297
+ class LoaderComponent {
298
+ html;
299
+ static ɵfac = function LoaderComponent_Factory(t) { return new (t || LoaderComponent)(); };
300
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: LoaderComponent, selectors: [["ng-component"]], inputs: { html: "html" }, decls: 1, vars: 1, consts: [[1, "loader-template", 3, "innerHTML"]], template: function LoaderComponent_Template(rf, ctx) { if (rf & 1) {
301
+ i0.ɵɵelement(0, "div", 0);
302
+ } if (rf & 2) {
303
+ i0.ɵɵproperty("innerHTML", ctx.html, i0.ɵɵsanitizeHtml);
304
+ } }, encapsulation: 2 });
305
+ }
306
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LoaderComponent, [{
307
+ type: Component,
308
+ args: [{
309
+ template: `
310
+ <div class="loader-template" [innerHTML]="html"></div>
311
+ `,
312
+ standalone: false,
281
313
  }]
282
- }], () => [], { key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: false }] }], ns: [{ type: i0.Input, args: [{ isSignal: true, alias: "ns", required: false }] }], params: [{ type: i0.Input, args: [{ isSignal: true, alias: "params", required: false }] }], default: [{ type: i0.Input, args: [{ isSignal: true, alias: "default", required: false }] }], noWrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "noWrap", required: false }] }], language: [{ type: i0.Input, args: [{ isSignal: true, alias: "language", required: false }] }], isHtml: [{ type: i0.Input, args: [{ isSignal: true, alias: "isHtml", required: false }] }] }); })();
314
+ }], null, { html: [{
315
+ type: Input
316
+ }] }); })();
317
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(LoaderComponent, { className: "LoaderComponent", filePath: "lib/loader.component.ts", lineNumber: 9 }); })();
283
318
 
284
- function provideTolgee(factory) {
285
- return makeEnvironmentProviders([
286
- {
287
- provide: TOLGEE_INSTANCE,
288
- useFactory: factory,
289
- },
290
- TranslateService,
291
- provideAppInitializer(() => inject(TranslateService).start()),
292
- ]);
319
+ class NgxTolgeeModule {
320
+ static ɵfac = function NgxTolgeeModule_Factory(t) { return new (t || NgxTolgeeModule)(); };
321
+ static ɵmod = /*@__PURE__*/ i0.ɵɵdefineNgModule({ type: NgxTolgeeModule });
322
+ static ɵinj = /*@__PURE__*/ i0.ɵɵdefineInjector({ providers: [
323
+ {
324
+ provide: APP_INITIALIZER,
325
+ useFactory: (service) => {
326
+ return async () => await service.start();
327
+ },
328
+ deps: [TranslateService],
329
+ multi: true,
330
+ },
331
+ ] });
293
332
  }
333
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NgxTolgeeModule, [{
334
+ type: NgModule,
335
+ args: [{
336
+ declarations: [TranslatePipe, TComponent, LoaderComponent],
337
+ exports: [TranslatePipe, TComponent],
338
+ providers: [
339
+ {
340
+ provide: APP_INITIALIZER,
341
+ useFactory: (service) => {
342
+ return async () => await service.start();
343
+ },
344
+ deps: [TranslateService],
345
+ multi: true,
346
+ },
347
+ ],
348
+ }]
349
+ }], null, null); })();
350
+ (function () { (typeof ngJitMode === "undefined" || ngJitMode) && i0.ɵɵsetNgModuleScope(NgxTolgeeModule, { declarations: [TranslatePipe, TComponent, LoaderComponent], exports: [TranslatePipe, TComponent] }); })();
294
351
 
295
- const namespaceResolver = async (route) => {
296
- const service = inject(TranslateService);
297
- const namespace = route?.data?.tolgeeNamespace;
298
- if (namespace === undefined) {
299
- console.warn(`No namespace provided. Please add tolgeeNamespace to your route data.\nIf you really want to lazy load default namespace set tolgeeNamespace to empty string`);
352
+ class NamespaceResolver {
353
+ service;
354
+ constructor(service) {
355
+ this.service = service;
300
356
  }
301
- await service.tolgee.addActiveNs(namespace, true);
302
- };
357
+ async resolve(route) {
358
+ const ns = this.getNamespace(route);
359
+ await this.service.tolgee.addActiveNs(ns, true);
360
+ }
361
+ getNamespace(route) {
362
+ const namespace = route?.data?.tolgeeNamespace;
363
+ if (namespace === undefined) {
364
+ console.warn('No namespace provided. Please add tolgeeNamespace to your route data. \n' +
365
+ 'If you really want to lazy load default namespace set tolgeeNamespace to empty string');
366
+ }
367
+ return namespace;
368
+ }
369
+ static ɵfac = function NamespaceResolver_Factory(t) { return new (t || NamespaceResolver)(i0.ɵɵinject(TranslateService)); };
370
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: NamespaceResolver, factory: NamespaceResolver.ɵfac, providedIn: 'root' });
371
+ }
372
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(NamespaceResolver, [{
373
+ type: Injectable,
374
+ args: [{ providedIn: 'root' }]
375
+ }], () => [{ type: TranslateService }], null); })();
303
376
 
304
377
  /*
305
378
  * Public API Surface of ngx-tolgee
@@ -309,5 +382,5 @@ const namespaceResolver = async (route) => {
309
382
  * Generated bundle index. Do not edit.
310
383
  */
311
384
 
312
- export { TDirective, TOLGEE_INSTANCE, TranslatePipe, TranslateService, namespaceResolver, provideTolgee };
385
+ export { NamespaceResolver, NgxTolgeeModule, TComponent, TOLGEE_INSTANCE, TranslatePipe, TranslateService };
313
386
  //# sourceMappingURL=tolgee-ngx.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"tolgee-ngx.mjs","sources":["../../../projects/ngx-tolgee/src/lib/tolgee-instance-token.ts","../../../projects/ngx-tolgee/src/lib/translate.service.ts","../../../projects/ngx-tolgee/src/lib/translate.pipe.ts","../../../projects/ngx-tolgee/src/lib/t.directive.ts","../../../projects/ngx-tolgee/src/lib/provide-tolgee.ts","../../../projects/ngx-tolgee/src/lib/namespace.resolver.ts","../../../projects/ngx-tolgee/src/public-api.ts","../../../projects/ngx-tolgee/src/tolgee-ngx.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { TolgeeInstance } from '@tolgee/web';\n\nexport const TOLGEE_INSTANCE = new InjectionToken<\n TolgeeInstance | Promise<TolgeeInstance>\n>('tolgee.instance');\n","import { Injectable, OnDestroy, NgZone, inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n CombinedOptions,\n DefaultParamType,\n EventType,\n getTranslateProps,\n ListenerEvent,\n TFnType,\n TolgeeInstance,\n TranslateProps,\n TranslationKey,\n} from '@tolgee/web';\nimport { TOLGEE_INSTANCE } from './tolgee-instance-token';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslateService implements OnDestroy {\n private runPromise: Promise<void>;\n private readonly _ngZone = inject(NgZone);\n\n readonly #tolgeeOrPromise = inject(TOLGEE_INSTANCE);\n #resolvedTolgee: TolgeeInstance | Promise<TolgeeInstance> | undefined;\n\n get tolgee(): TolgeeInstance {\n if (this.#resolvedTolgee) {\n // If it's still a promise, throw error\n if (this.#resolvedTolgee instanceof Promise) {\n throw new Error(\n 'Tolgee instance is not yet resolved. Call start() first or wait for app initialization.'\n );\n }\n return this.#resolvedTolgee;\n }\n\n // If it's a promise, this is a synchronous access before resolution\n if (this.#tolgeeOrPromise instanceof Promise) {\n throw new Error(\n 'Tolgee instance is not yet resolved. Call start() first or wait for app initialization.'\n );\n }\n\n this.#resolvedTolgee = this.#tolgeeOrPromise;\n return this.#resolvedTolgee;\n }\n\n /**\n * Starts Tolgee if not started.\n *\n * The Tolgee is run outside NgZone. The triggered events don't\n * trigger the change the detection when listening directly via Tolgee.on.\n *\n * However, all the emitting methods (on, translate, languageAsync)\n * in this class are emitting back in Angular's NgZone,\n * so the change detection works fine.\n */\n public async start(): Promise<void> {\n // If tolgee was provided as a promise, resolve it first\n if (!this.#resolvedTolgee) {\n if (this.#tolgeeOrPromise instanceof Promise) {\n // Assign the promise immediately to prevent redundant awaits\n this.#resolvedTolgee = this.#tolgeeOrPromise;\n } else {\n // Eagerly cache the resolved instance\n this.#resolvedTolgee = this.#tolgeeOrPromise;\n }\n }\n\n // Await resolution if it's a promise\n if (this.#resolvedTolgee instanceof Promise) {\n this.#resolvedTolgee = await this.#resolvedTolgee;\n }\n\n if (!this.isSSR()) {\n try {\n await this.runIfNotRunning();\n } catch (error) {\n console.error('Tolgee failed to start:', error);\n }\n }\n }\n\n translate(props: TranslateProps): Observable<string>;\n translate(\n key: TranslationKey,\n options?: CombinedOptions<string>\n ): Observable<string>;\n translate(\n key: TranslationKey,\n defaultValue?: string,\n options?: CombinedOptions<string>\n ): Observable<string>;\n /**\n * Returns translation asynchronously, this method always returns\n */\n translate(...args: any[]): Observable<string> {\n // @ts-ignore\n const params = getTranslateProps(...args);\n return new Observable<string>((subscriber) => {\n const loadPromise = this.tolgee.addActiveNs(params.ns);\n const translate = async () => {\n await loadPromise;\n const translated = this.tolgee.t(params);\n this._ngZone.run(() => {\n subscriber.next(translated);\n });\n };\n\n // noinspection JSIgnoredPromiseFromCall\n translate();\n\n const subscription = this.tolgee.on('update', translate);\n\n return () => {\n this.tolgee.removeActiveNs(params.ns);\n subscription.unsubscribe();\n };\n });\n }\n\n /**\n * Instantly returns a translated value. May return undefined or outdated value.\n * Use only when you cannot use translate pipe.\n */\n public readonly instant: TFnType<DefaultParamType, string, TranslationKey> = (\n ...args\n ) => {\n // @ts-ignore\n const params = getTranslateProps(...args);\n return this.tolgee.t(params);\n };\n\n /**\n * Returns current language\n */\n get language(): string {\n return this.tolgee.getLanguage();\n }\n\n /**\n * Returns an observable emitting current language.\n * It instantly emits the current language\n */\n get languageAsync(): Observable<string> {\n return new Observable((subscriber) => {\n subscriber.next(this.tolgee.getLanguage());\n const subscription = this.on('language').subscribe((value) => {\n subscriber.next(value.value);\n });\n\n return () => subscription.unsubscribe();\n });\n }\n\n /**\n * Changes the current language\n * @param lang The new current language (e.g., en, en-US)\n * @return Promise<void> Resolves when translations\n * for given language are loaded\n */\n public changeLanguage(lang: string) {\n return this.tolgee.changeLanguage(lang);\n }\n\n /**\n * Returns observable emitting when a specified event is triggered.\n *\n * It's a wrapper of Tolgee. 'on' method. The emmit is triggered inside ngZone,\n * so change detection should work properly.\n *\n * @param event the event to listen\n */\n on<Event extends keyof EventType>(event: Event) {\n return new Observable<ListenerEvent<Event, EventType[Event]>>(\n (subscriber) => {\n const subscription = this.tolgee.on(event, (value) => {\n this._ngZone.run(() => {\n subscriber.next(value as any);\n });\n });\n return () => subscription.unsubscribe();\n }\n );\n }\n\n ngOnDestroy(): void {\n const tolgeeInstance = this.#resolvedTolgee || this.#tolgeeOrPromise;\n\n if (tolgeeInstance instanceof Promise) {\n // If Tolgee is still resolving, stop it when it resolves\n tolgeeInstance\n .then((instance) => instance?.stop())\n .catch(() => {\n // Ignore errors if the promise was rejected\n });\n } else if (tolgeeInstance) {\n tolgeeInstance.stop();\n }\n }\n\n private async runIfNotRunning() {\n if (!this.runPromise) {\n this.runPromise = this._ngZone.runOutsideAngular(() => {\n return this.tolgee.run();\n });\n }\n await this.runPromise;\n }\n\n private isSSR() {\n return typeof window === 'undefined';\n }\n}\n","import {\n ChangeDetectorRef,\n inject,\n OnDestroy,\n Pipe,\n PipeTransform,\n} from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { Subscription } from 'rxjs';\nimport {\n getTranslateProps,\n CombinedOptions,\n TranslateProps,\n TranslationKey,\n} from '@tolgee/web';\n\n@Pipe({\n name: 'translate',\n pure: false,\n})\nexport class TranslatePipe implements PipeTransform, OnDestroy {\n private value = '';\n private previousHash: string;\n\n private subscription: Subscription;\n\n private readonly translateService = inject(TranslateService);\n private readonly _cdr = inject(ChangeDetectorRef);\n\n ngOnDestroy(): void {\n this.unsubscribe();\n }\n\n transform(props: TranslateProps<string, TranslationKey>): string;\n transform(key: TranslationKey, options?: CombinedOptions<string>): string;\n transform(\n key: TranslationKey,\n defaultValue?: string,\n options?: CombinedOptions<string>\n ): string;\n transform(...args: any[]): string {\n // @ts-ignore\n const params = getTranslateProps(...args);\n\n const { key } = params;\n\n if (!key) {\n return '';\n }\n\n const newHash = this.hash(params);\n if (this.previousHash === newHash) {\n return this.value;\n }\n\n this.previousHash = newHash;\n\n this.translate(params);\n\n return this.value;\n }\n\n private hash(props: TranslateProps) {\n return JSON.stringify([props, this.translateService.tolgee.getLanguage()]);\n }\n\n private unsubscribe() {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n private translate(props: TranslateProps) {\n this.value = this.translateService.instant({ ...props, orEmpty: true });\n this.subscribe(props);\n }\n\n private subscribe(props: TranslateProps) {\n this.unsubscribe();\n this.subscription = this.translateService\n .translate(props)\n .subscribe((r) => {\n this.value = r;\n this._cdr.detectChanges();\n });\n }\n}\n","import {\n Directive,\n ElementRef,\n input,\n inject,\n effect,\n computed,\n Renderer2,\n} from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { TranslateParams, TranslateProps, TranslationKey } from '@tolgee/web';\n\n@Directive({\n selector: '[t]',\n})\nexport class TDirective {\n key = input<TranslationKey>();\n ns = input<string>();\n params = input<TranslateParams<any>>();\n default = input<string>();\n noWrap = input<boolean>(false);\n language = input<string>();\n /**\n * When true, the innerHTML property of an element is set.\n * Use only when you're sure the HTML is sanitized.\n */\n isHtml = input<boolean>(false);\n\n private ref = inject<ElementRef<HTMLElement>>(ElementRef);\n private translate = inject(TranslateService);\n private renderer = inject(Renderer2);\n\n private translateParams = computed<TranslateProps>(() => ({\n key: this.key(),\n ns: this.ns(),\n params: this.params(),\n defaultValue: this.default(),\n noWrap: this.noWrap(),\n language: this.language(),\n }));\n\n constructor() {\n effect((onCleanup) => {\n const params = this.translateParams();\n\n const subscription = this.translate\n .translate(params)\n .subscribe((translated) => {\n this.setElementContent(translated);\n });\n\n // cleanup when params change or directive is destroyed\n onCleanup(() => subscription.unsubscribe());\n });\n }\n\n private setElementContent(translated: string) {\n if (this.isHtml()) {\n this.renderer.setProperty(this.ref.nativeElement, 'innerHTML', translated);\n } else {\n this.renderer.setProperty(this.ref.nativeElement, 'textContent', translated);\n }\n }\n}\n","import {\n EnvironmentProviders,\n inject,\n makeEnvironmentProviders,\n provideAppInitializer,\n} from '@angular/core';\nimport { TolgeeInstance } from '@tolgee/web';\nimport { TOLGEE_INSTANCE } from './tolgee-instance-token';\nimport { TranslateService } from './translate.service';\n\nexport function provideTolgee(\n factory: () => TolgeeInstance | Promise<TolgeeInstance>\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: TOLGEE_INSTANCE,\n useFactory: factory,\n },\n TranslateService,\n provideAppInitializer(() => inject(TranslateService).start()),\n ]);\n}\n","import { ResolveFn } from '@angular/router';\nimport { TranslateService } from './translate.service';\nimport { inject } from '@angular/core';\n\nexport const namespaceResolver: ResolveFn<void> = async (route) => {\n const service = inject(TranslateService);\n const namespace = route?.data?.tolgeeNamespace;\n if (namespace === undefined) {\n console.warn(\n `No namespace provided. Please add tolgeeNamespace to your route data.\\nIf you really want to lazy load default namespace set tolgeeNamespace to empty string`\n );\n }\n\n await service.tolgee.addActiveNs(namespace, true);\n};\n","/*\n * Public API Surface of ngx-tolgee\n */\nexport * from './lib/translate.service';\nexport * from './lib/translate.pipe';\nexport * from './lib/t.directive';\n\nexport * from './lib/provide-tolgee';\nexport * from './lib/tolgee-instance-token';\n\nexport * from '@tolgee/web';\nexport * from './lib/namespace.resolver';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tolgee-ngx.mjs","sources":["../../../projects/ngx-tolgee/src/lib/tolgee-instance-token.ts","../../../projects/ngx-tolgee/src/lib/translate.service.ts","../../../projects/ngx-tolgee/src/lib/translate.pipe.ts","../../../projects/ngx-tolgee/src/lib/t.component.ts","../../../projects/ngx-tolgee/src/lib/loader.component.ts","../../../projects/ngx-tolgee/src/lib/ngx-tolgee.module.ts","../../../projects/ngx-tolgee/src/lib/namespace.resolver.ts","../../../projects/ngx-tolgee/src/public-api.ts","../../../projects/ngx-tolgee/src/tolgee-ngx.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { TolgeeInstance } from '@tolgee/web';\n\nexport const TOLGEE_INSTANCE = new InjectionToken<TolgeeInstance>(\n 'tolgee.instance'\n);\n","import { Inject, Injectable, OnDestroy, NgZone } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport {\n DefaultParamType,\n EventType,\n getTranslateProps,\n ListenerEvent,\n TFnType,\n TolgeeInstance,\n TranslationKey,\n} from '@tolgee/web';\nimport { TOLGEE_INSTANCE } from './tolgee-instance-token';\n\n@Injectable({ providedIn: 'root' })\nexport class TranslateService implements OnDestroy {\n private runPromise: Promise<void>;\n\n constructor(\n @Inject(TOLGEE_INSTANCE) private _tolgee: TolgeeInstance,\n private _ngZone: NgZone\n ) {}\n\n get tolgee() {\n return this._tolgee;\n }\n\n /**\n * Starts Tolgee if not started.\n *\n * The Tolgee is run outside NgZone. The triggered events, doesn't\n * trigger the change detection, when listening directly via Tolgee.on.\n *\n * However, all the emitting methods (on, translate, languageAsync)\n * in this class are emitting back in Angular's NgZone,\n * so the change detection works fine.\n */\n public async start(): Promise<void> {\n if (!this.isSSR()) {\n await this.runIfNotRunning();\n }\n }\n\n /**\n * Returns translation asynchronously, this method always return\n */\n readonly translate: TFnType<DefaultParamType, Observable<string>, TranslationKey> = (\n ...args\n ) => {\n // @ts-ignore\n const params = getTranslateProps(...args);\n return new Observable<string>((subscriber) => {\n const loadPromise = this.tolgee.addActiveNs(params.ns);\n const translate = async () => {\n await loadPromise;\n const translated = this.tolgee.t(params);\n subscriber.next(translated);\n };\n\n // noinspection JSIgnoredPromiseFromCall\n translate();\n\n const subscription = this.tolgee.on('update', translate)\n\n return () => {\n this.tolgee.removeActiveNs(params.ns);\n subscription.unsubscribe();\n };\n });\n };\n\n /**\n * Instantly returns translated value. May return undefined or outdated value.\n * Use only when you cannot use translate.\n */\n public readonly instant: TFnType<DefaultParamType, string, TranslationKey> = (...args) => {\n // @ts-ignore\n const params = getTranslateProps(...args);\n return this.tolgee.t(params);\n };\n\n /**\n * Returns current language\n */\n get language(): string {\n return this.tolgee.getLanguage();\n }\n\n /**\n * Returns an observable emitting current language.\n * It instantly emits current language\n */\n get languageAsync(): Observable<string> {\n return new Observable((subscriber) => {\n subscriber.next(this.tolgee.getLanguage());\n const subscription = this.on('language').subscribe((value) => {\n subscriber.next(value.value);\n });\n\n return () => subscription.unsubscribe();\n });\n }\n\n /**\n * Changes the current language\n * @param lang The new current language (e.g. en, en-US)\n * @return Promise<void> Resolves when translations\n * for given language are loaded\n */\n public changeLanguage(lang: string) {\n return this.tolgee.changeLanguage(lang);\n }\n\n /**\n * Returns observable emitting when specified event is triggered.\n *\n * It's a wrapper of Tolgee.on method. The emmit is triggered inside ngZone,\n * so change detection should work properly.\n *\n * @param event the event to listen\n */\n on<Event extends keyof EventType>(event: Event) {\n return new Observable<ListenerEvent<Event, EventType[Event]>>((subscriber) => {\n const subscription = this.tolgee.on(event, (value) => {\n this._ngZone.run(() => {\n subscriber.next(value as any);\n });\n });\n return () => subscription.unsubscribe();\n });\n }\n\n ngOnDestroy(): void {\n this.tolgee.stop();\n }\n\n private async runIfNotRunning() {\n if (!this.runPromise) {\n this.runPromise = this._ngZone.runOutsideAngular(() => {\n return this.tolgee.run();\n });\n }\n await this.runPromise;\n }\n\n private isSSR() {\n return typeof window === 'undefined';\n }\n}\n","import {\n ChangeDetectorRef,\n OnDestroy,\n Pipe,\n PipeTransform,\n} from '@angular/core';\nimport { TranslateService } from './translate.service';\nimport { Subscription } from 'rxjs';\nimport {\n getTranslateProps,\n TFnType,\n TranslateProps,\n TranslationKey,\n} from '@tolgee/web';\n\n@Pipe({\n name: 'translate',\n pure: false,\n standalone: false,\n})\nexport class TranslatePipe implements PipeTransform, OnDestroy {\n private value = '';\n private previousHash: string;\n\n private subscription: Subscription;\n\n constructor(\n protected translateService: TranslateService,\n private _cdr: ChangeDetectorRef\n ) {}\n\n ngOnDestroy(): void {\n this.unsubscribe();\n }\n\n readonly transform: TFnType<string, string, TranslationKey> = (...args) => {\n // @ts-ignore\n const params = getTranslateProps(...args);\n const { key } = params;\n\n if (!key || key.length === 0) {\n return key;\n }\n\n const newHash = this.hash(params);\n if (this.previousHash === newHash) {\n return this.value;\n }\n\n this.previousHash = newHash;\n\n this.translate(params);\n\n return this.value;\n };\n\n private hash(props: TranslateProps) {\n return JSON.stringify([props, this.translateService.tolgee.getLanguage()]);\n }\n\n private unsubscribe() {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n private translate(props: TranslateProps) {\n this.value = this.translateService.instant({ ...props, orEmpty: true });\n this.subscribe(props);\n }\n\n private subscribe(props: TranslateProps) {\n this.unsubscribe();\n this.subscription = this.translateService\n .translate(props)\n .subscribe((r) => {\n this.value = r;\n this._cdr.detectChanges();\n });\n }\n}\n","import {\n Component,\n ElementRef,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { TranslateService } from './translate.service';\nimport { TranslateParams, TranslationKey } from '@tolgee/web';\n\n@Component({\n selector: '[t]',\n template: ``,\n standalone: false\n})\nexport class TComponent implements OnInit, OnDestroy, OnChanges {\n @Input() key: TranslationKey;\n @Input() ns: string;\n @Input() params?: TranslateParams<any>;\n @Input() default?: string;\n @Input() noWrap?: boolean = false;\n @Input() language?: string;\n\n /**\n * When true, innerHTML property of element is set.\n * Use only when you're sure the HTML is sanitized.\n */\n @Input() isHtml?: boolean = false;\n\n private subscription: Subscription;\n private initialized: boolean;\n\n constructor(\n private ref: ElementRef,\n private translateService: TranslateService\n ) {}\n\n ngOnInit(): void {\n // noinspection JSIgnoredPromiseFromCall\n this.subscribe();\n this.renderInstantValue();\n }\n\n ngOnChanges(): void {\n // noinspection JSIgnoredPromiseFromCall\n this.subscribe();\n }\n\n ngOnDestroy(): void {\n this.unsubscribe();\n }\n\n private renderInstantValue() {\n // get initial value first\n const translated = this.translateService.instant({\n ...this.getTranslateProps(),\n orEmpty: true,\n });\n this.setElementContent(translated);\n }\n\n private getTranslateProps() {\n return {\n key: this.key,\n ns: this.ns,\n params: this.params,\n defaultValue: this.default,\n noWrap: this.noWrap,\n language: this.language,\n };\n }\n\n private unsubscribe() {\n this.subscription?.unsubscribe();\n }\n\n private async subscribe() {\n this.unsubscribe();\n this.subscription = this.translateService\n .translate(this.getTranslateProps())\n .subscribe((translated) => {\n this.setElementContent(translated);\n this.initialized = true;\n });\n }\n\n private setElementContent(translated: string) {\n if (this.isHtml) {\n this.getElement().innerHTML = translated;\n return;\n }\n this.getElement().textContent = translated;\n }\n\n private getElement() {\n return this.ref.nativeElement as HTMLElement;\n }\n}\n","import { Component, Input } from '@angular/core';\n\n@Component({\n template: `\n <div class=\"loader-template\" [innerHTML]=\"html\"></div>\n `,\n standalone: false,\n})\nexport class LoaderComponent {\n @Input() html: string | undefined;\n}\n","import { APP_INITIALIZER, NgModule } from '@angular/core';\nimport { TranslatePipe } from './translate.pipe';\nimport { TComponent } from './t.component';\nimport { TranslateService } from './translate.service';\nimport { LoaderComponent } from \"./loader.component\";\n\n@NgModule({\n declarations: [TranslatePipe, TComponent, LoaderComponent],\n exports: [TranslatePipe, TComponent],\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: (service: TranslateService) => {\n return async () => await service.start();\n },\n deps: [TranslateService],\n multi: true,\n },\n ],\n})\nexport class NgxTolgeeModule {}\n","import { ActivatedRouteSnapshot } from '@angular/router';\nimport { TranslateService } from './translate.service';\nimport { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class NamespaceResolver {\n constructor(public service: TranslateService) {}\n\n async resolve(\n route: ActivatedRouteSnapshot,\n ): Promise<void> {\n const ns = this.getNamespace(route);\n await this.service.tolgee.addActiveNs(ns, true)\n }\n\n private getNamespace(route: ActivatedRouteSnapshot) {\n const namespace = route?.data?.tolgeeNamespace;\n if (namespace === undefined) {\n console.warn(\n 'No namespace provided. Please add tolgeeNamespace to your route data. \\n' +\n 'If you really want to lazy load default namespace set tolgeeNamespace to empty string'\n );\n }\n return namespace;\n }\n}\n","/*\n * Public API Surface of ngx-tolgee\n */\nexport * from './lib/translate.service';\nexport * from './lib/translate.pipe';\nexport * from './lib/t.component';\n\nexport * from './lib/ngx-tolgee.module';\nexport * from './lib/tolgee-instance-token';\n\nexport * from '@tolgee/web';\nexport * from './lib/namespace.resolver';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TranslateService"],"mappings":"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"}