@ichaingo/link 1.5.7-beta → 1.5.8

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/dist/index.js CHANGED
@@ -1,1936 +1,12 @@
1
1
  'use client';
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import Link from "next/link";
4
- import { useRouter, usePathname, useSearchParams } from "next/navigation";
5
- import React, { useEffect, useContext, useState, useCallback, useTransition, useMemo } from "react";
4
+ import { usePathname } from "@ichaingo/i18n/navigation";
5
+ import { useLocale } from "next-intl";
6
+ import { useRouter, useSearchParams } from "next/navigation";
7
+ import { useTransition, useMemo } from "react";
6
8
  import { useProgressBar } from "@ichaingo/providers/TopProgressBarProvider";
7
9
  import { twMerge } from "tailwind-merge";
8
- var _a;
9
- function _mergeNamespaces$1(n, m) {
10
- for (var i = 0; i < m.length; i++) {
11
- const e = m[i];
12
- if (typeof e !== "string" && !Array.isArray(e)) {
13
- for (const k in e) {
14
- if (k !== "default" && !(k in n)) {
15
- const d = Object.getOwnPropertyDescriptor(e, k);
16
- if (d) {
17
- Object.defineProperty(n, k, d.get ? d : {
18
- enumerable: true,
19
- get: () => e[k]
20
- });
21
- }
22
- }
23
- }
24
- }
25
- }
26
- return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }));
27
- }
28
- function isPromise(value) {
29
- return Boolean(value && typeof value.then === "function");
30
- }
31
- function valueOrPromise(value, callback) {
32
- if (isPromise(value)) {
33
- return Promise.resolve(value).then(callback);
34
- } else {
35
- return callback(value);
36
- }
37
- }
38
- function handleRegularOrAsyncErr(onError, createError, callback) {
39
- function handle(e) {
40
- const error = createError(e);
41
- onError.emit(error);
42
- console.error(error);
43
- throw error;
44
- }
45
- try {
46
- const result = callback();
47
- if (isPromise(result)) {
48
- return result.catch(handle);
49
- }
50
- return result;
51
- } catch (e) {
52
- handle(e);
53
- }
54
- }
55
- function missingOptionError(option) {
56
- const options = (Array.isArray(option) ? option : [option]).map((val) => `'${val}'`);
57
- const lastPart = options.slice(-2).join(" or ");
58
- const firstPart = options.slice(0, -2);
59
- const stringifiedOptions = [...firstPart, lastPart].join(", ");
60
- return `Tolgee: You need to specify ${stringifiedOptions} option`;
61
- }
62
- function isObject(item) {
63
- return typeof item === "object" && !Array.isArray(item) && item !== null;
64
- }
65
- function getFallback(value) {
66
- if (typeof value === "string") {
67
- return [value];
68
- }
69
- if (Array.isArray(value)) {
70
- return value;
71
- }
72
- return void 0;
73
- }
74
- function getFallbackArray(value) {
75
- return getFallback(value) || [];
76
- }
77
- function getFallbackFromStruct(language, fallbackLanguage) {
78
- if (isObject(fallbackLanguage)) {
79
- return getFallbackArray(fallbackLanguage === null || fallbackLanguage === void 0 ? void 0 : fallbackLanguage[language]);
80
- } else {
81
- return getFallbackArray(fallbackLanguage);
82
- }
83
- }
84
- function unique(arr) {
85
- return Array.from(new Set(arr));
86
- }
87
- function sanitizeUrl(url) {
88
- return url ? url.replace(/\/+$/, "") : url;
89
- }
90
- function getErrorMessage(error) {
91
- if (typeof error === "string") {
92
- return error;
93
- } else if (typeof (error === null || error === void 0 ? void 0 : error.message) === "string") {
94
- return error.message;
95
- }
96
- }
97
- const defaultFetchFunction = (input, options) => fetch(input, options);
98
- function headersInitToRecord(headersInit) {
99
- return Object.fromEntries(new Headers(headersInit).entries());
100
- }
101
- const createFetchFunction = (fetchFn = defaultFetchFunction) => {
102
- return (input, init) => {
103
- let headers = headersInitToRecord(init === null || init === void 0 ? void 0 : init.headers);
104
- if (headers["x-api-key"]) {
105
- headers = Object.assign({ "x-tolgee-sdk-type": "JS", "x-tolgee-sdk-version": "prerelease" }, headers);
106
- }
107
- return fetchFn(input, Object.assign(Object.assign({}, init), { headers }));
108
- };
109
- };
110
- const EventEmitter = (type, isActive) => {
111
- let handlers = [];
112
- return {
113
- listen(handler) {
114
- const handlerWrapper = (e) => {
115
- handler(e);
116
- };
117
- handlers.push(handlerWrapper);
118
- return {
119
- unsubscribe() {
120
- handlers = handlers.filter((i) => handlerWrapper !== i);
121
- }
122
- };
123
- },
124
- emit(data) {
125
- if (isActive()) {
126
- handlers.forEach((handler) => handler({ type, value: data }));
127
- }
128
- }
129
- };
130
- };
131
- function EventEmitterCombined(isActive) {
132
- let handlers = [];
133
- let queue = [];
134
- function solveQueue() {
135
- if (queue.length === 0) {
136
- return;
137
- }
138
- const queueCopy = queue;
139
- queue = [];
140
- handlers.forEach((handler) => {
141
- handler(queueCopy);
142
- });
143
- }
144
- return Object.freeze({
145
- listen(handler) {
146
- const handlerWrapper = (events) => {
147
- handler(events);
148
- };
149
- handlers.push(handlerWrapper);
150
- return {
151
- unsubscribe() {
152
- handlers = handlers.filter((i) => handlerWrapper !== i);
153
- }
154
- };
155
- },
156
- emit(e, delayed) {
157
- if (isActive()) {
158
- if (isActive()) {
159
- queue.push(e);
160
- if (!delayed) {
161
- solveQueue();
162
- } else {
163
- setTimeout(solveQueue, 0);
164
- }
165
- }
166
- }
167
- }
168
- });
169
- }
170
- function Events() {
171
- let emitterActive = true;
172
- function isActive() {
173
- return emitterActive;
174
- }
175
- const self2 = Object.freeze({
176
- onPendingLanguageChange: EventEmitter("pendingLanguage", isActive),
177
- onLanguageChange: EventEmitter("language", isActive),
178
- onLoadingChange: EventEmitter("loading", isActive),
179
- onFetchingChange: EventEmitter("fetching", isActive),
180
- onInitialLoaded: EventEmitter("initialLoad", isActive),
181
- onRunningChange: EventEmitter("running", isActive),
182
- onCacheChange: EventEmitter("cache", isActive),
183
- onPermanentChange: EventEmitter("permanentChange", isActive),
184
- onError: EventEmitter("error", isActive),
185
- onUpdate: EventEmitterCombined(isActive),
186
- setEmitterActive(active) {
187
- emitterActive = active;
188
- },
189
- on: (event, handler) => {
190
- switch (event) {
191
- case "pendingLanguage":
192
- return self2.onPendingLanguageChange.listen(handler);
193
- case "language":
194
- return self2.onLanguageChange.listen(handler);
195
- case "loading":
196
- return self2.onLoadingChange.listen(handler);
197
- case "fetching":
198
- return self2.onFetchingChange.listen(handler);
199
- case "initialLoad":
200
- return self2.onInitialLoaded.listen(handler);
201
- case "running":
202
- return self2.onRunningChange.listen(handler);
203
- case "cache":
204
- return self2.onCacheChange.listen(handler);
205
- case "update":
206
- return self2.onUpdate.listen(handler);
207
- case "permanentChange":
208
- return self2.onPermanentChange.listen(handler);
209
- case "error":
210
- return self2.onError.listen(handler);
211
- }
212
- }
213
- });
214
- self2.onInitialLoaded.listen((e) => self2.onUpdate.emit(e, false));
215
- self2.onLanguageChange.listen((e) => self2.onUpdate.emit(e, false));
216
- self2.onCacheChange.listen((e) => self2.onUpdate.emit(e, true));
217
- return self2;
218
- }
219
- class RecordFetchError extends Error {
220
- constructor(descriptor, cause, isDev = false) {
221
- const { language, namespace } = descriptor;
222
- super(`Tolgee: Failed to fetch record for "${language}"${namespace && ` and "${namespace}"`}`);
223
- this.cause = cause;
224
- this.isDev = isDev;
225
- this.name = "RecordFetchError";
226
- this.language = language;
227
- this.namespace = namespace;
228
- }
229
- }
230
- class LanguageDetectorError extends Error {
231
- constructor(message, cause) {
232
- super(message);
233
- this.cause = cause;
234
- this.name = "LanguageDetectorError";
235
- }
236
- }
237
- class LanguageStorageError extends Error {
238
- constructor(message, cause) {
239
- super(message);
240
- this.cause = cause;
241
- this.name = "LanguageStorageError";
242
- }
243
- }
244
- const flattenTranslationsToMap = (data) => {
245
- const result = /* @__PURE__ */ new Map();
246
- Object.entries(data).forEach(([key, value]) => {
247
- if (value === void 0 || value === null) {
248
- return;
249
- }
250
- if (typeof value === "object") {
251
- flattenTranslationsToMap(value).forEach((flatValue, flatKey) => {
252
- result.set(key + "." + flatKey, flatValue);
253
- });
254
- return;
255
- }
256
- result.set(key, value);
257
- });
258
- return result;
259
- };
260
- const flattenTranslations = (data) => {
261
- return Object.fromEntries(flattenTranslationsToMap(data).entries());
262
- };
263
- const decodeCacheKey = (key) => {
264
- const [firstPart, ...rest] = key.split(":");
265
- const secondPart = rest.join(":");
266
- return { language: firstPart, namespace: secondPart || "" };
267
- };
268
- const encodeCacheKey = ({ language, namespace }) => {
269
- if (namespace) {
270
- return `${language}:${namespace}`;
271
- } else {
272
- return language;
273
- }
274
- };
275
- function Cache(events, backendGetRecord, backendGetDevRecord, withDefaultNs, isInitialLoading, fetchingObserver, loadingObserver) {
276
- const asyncRequests = /* @__PURE__ */ new Map();
277
- const cache = /* @__PURE__ */ new Map();
278
- let staticData = {};
279
- let version = 0;
280
- function addRecordInternal(descriptor, data, recordVersion) {
281
- const cacheKey = encodeCacheKey(descriptor);
282
- cache.set(cacheKey, {
283
- data: flattenTranslations(data),
284
- version: recordVersion
285
- });
286
- events.onCacheChange.emit(decodeCacheKey(cacheKey));
287
- }
288
- async function fetchProd(keyObject) {
289
- function handleError(e) {
290
- const error = new RecordFetchError(keyObject, e);
291
- events.onError.emit(error);
292
- console.error(error);
293
- throw error;
294
- }
295
- const dataFromBackend = backendGetRecord(keyObject);
296
- if (isPromise(dataFromBackend)) {
297
- const result = await dataFromBackend.catch(handleError);
298
- if (result !== void 0) {
299
- return result;
300
- }
301
- }
302
- const staticDataValue = staticData[encodeCacheKey(keyObject)];
303
- if (typeof staticDataValue === "function") {
304
- try {
305
- return await staticDataValue();
306
- } catch (e) {
307
- handleError(e);
308
- }
309
- } else {
310
- return staticDataValue;
311
- }
312
- }
313
- async function fetchData(keyObject, isDev) {
314
- let result = void 0;
315
- if (isDev) {
316
- try {
317
- result = await backendGetDevRecord(keyObject);
318
- } catch (e) {
319
- const error = new RecordFetchError(keyObject, e, true);
320
- events.onError.emit(error);
321
- console.warn(error);
322
- }
323
- }
324
- if (!result) {
325
- result = await fetchProd(keyObject);
326
- }
327
- return result;
328
- }
329
- const self2 = Object.freeze({
330
- addStaticData(data) {
331
- if (Array.isArray(data)) {
332
- for (const record of data) {
333
- const key = encodeCacheKey(record);
334
- const existing = cache.get(key);
335
- if (!existing || existing.version === 0) {
336
- addRecordInternal(record, flattenTranslations(record.data), 0);
337
- }
338
- }
339
- } else if (data) {
340
- staticData = Object.assign(Object.assign({}, staticData), data);
341
- Object.entries(data).forEach(([key, value]) => {
342
- if (typeof value !== "function") {
343
- const descriptor = decodeCacheKey(key);
344
- const existing = cache.get(key);
345
- if (!existing || existing.version === 0) {
346
- addRecordInternal(descriptor, flattenTranslations(value), 0);
347
- }
348
- }
349
- });
350
- }
351
- },
352
- invalidate() {
353
- asyncRequests.clear();
354
- version += 1;
355
- },
356
- addRecord(descriptor, data) {
357
- addRecordInternal(descriptor, flattenTranslations(data), version);
358
- },
359
- exists(descriptor, strict = false) {
360
- const record = cache.get(encodeCacheKey(descriptor));
361
- if (record && strict) {
362
- return record.version === version;
363
- }
364
- return Boolean(record);
365
- },
366
- getRecord(descriptor) {
367
- const descriptorWithNs = withDefaultNs(descriptor);
368
- const cacheKey = encodeCacheKey(descriptorWithNs);
369
- const cacheRecord = cache.get(cacheKey);
370
- if (!cacheRecord) {
371
- return void 0;
372
- }
373
- return Object.assign(Object.assign({}, descriptorWithNs), { cacheKey, data: cacheRecord.data });
374
- },
375
- getAllRecords() {
376
- const entries = Array.from(cache.entries());
377
- return entries.map(([key]) => self2.getRecord(decodeCacheKey(key)));
378
- },
379
- getTranslation(descriptor, key) {
380
- var _a2;
381
- return (_a2 = cache.get(encodeCacheKey(descriptor))) === null || _a2 === void 0 ? void 0 : _a2.data[key];
382
- },
383
- getTranslationNs(namespaces, languages, key) {
384
- var _a2;
385
- for (const namespace of namespaces) {
386
- for (const language of languages) {
387
- const value = (_a2 = cache.get(encodeCacheKey({ language, namespace }))) === null || _a2 === void 0 ? void 0 : _a2.data[key];
388
- if (value !== void 0 && value !== null) {
389
- return [namespace];
390
- }
391
- }
392
- }
393
- return unique(namespaces);
394
- },
395
- getTranslationFallback(namespaces, languages, key) {
396
- var _a2;
397
- for (const namespace of namespaces) {
398
- for (const language of languages) {
399
- const value = (_a2 = cache.get(encodeCacheKey({ language, namespace }))) === null || _a2 === void 0 ? void 0 : _a2.data[key];
400
- if (value !== void 0 && value !== null) {
401
- return value;
402
- }
403
- }
404
- }
405
- return void 0;
406
- },
407
- changeTranslation(descriptor, key, value) {
408
- var _a2;
409
- const record = (_a2 = cache.get(encodeCacheKey(descriptor))) === null || _a2 === void 0 ? void 0 : _a2.data;
410
- if (record) {
411
- record[key] = value;
412
- events.onCacheChange.emit(Object.assign(Object.assign({}, descriptor), { key }));
413
- }
414
- },
415
- isFetching(ns) {
416
- if (isInitialLoading()) {
417
- return true;
418
- }
419
- if (ns === void 0) {
420
- return asyncRequests.size > 0;
421
- }
422
- const namespaces = getFallbackArray(ns);
423
- return Boolean(Array.from(asyncRequests.keys()).find((key) => namespaces.includes(decodeCacheKey(key).namespace)));
424
- },
425
- isLoading(language, ns) {
426
- const namespaces = getFallbackArray(ns);
427
- if (isInitialLoading()) {
428
- return true;
429
- }
430
- const pendingCacheKeys = Array.from(asyncRequests.keys());
431
- return Boolean(pendingCacheKeys.find((key) => {
432
- const descriptor = decodeCacheKey(key);
433
- return (!namespaces.length || namespaces.includes(descriptor.namespace)) && !self2.exists({
434
- namespace: descriptor.namespace,
435
- language
436
- });
437
- }));
438
- },
439
- async loadRecords(descriptors, options) {
440
- const withPromises = descriptors.map((descriptor) => {
441
- const keyObject = withDefaultNs(descriptor);
442
- const cacheKey = encodeCacheKey(keyObject);
443
- if (options === null || options === void 0 ? void 0 : options.useCache) {
444
- const exists = self2.exists(keyObject, true);
445
- if (exists) {
446
- return Object.assign(Object.assign({}, keyObject), { new: false, cacheKey, data: self2.getRecord(keyObject).data });
447
- }
448
- }
449
- const existingPromise = asyncRequests.get(cacheKey);
450
- if (existingPromise) {
451
- return Object.assign(Object.assign({}, keyObject), { new: false, promise: existingPromise, cacheKey });
452
- }
453
- const dataPromise = fetchData(keyObject, !(options === null || options === void 0 ? void 0 : options.noDev)) || Promise.resolve(void 0);
454
- asyncRequests.set(cacheKey, dataPromise);
455
- return Object.assign(Object.assign({}, keyObject), { new: true, promise: dataPromise, cacheKey });
456
- });
457
- fetchingObserver.notify();
458
- loadingObserver.notify();
459
- const promisesToWait = withPromises.map((val) => val.promise).filter(Boolean);
460
- const fetchedData = await Promise.all(promisesToWait);
461
- withPromises.forEach((value) => {
462
- var _a2;
463
- if (value.promise) {
464
- value.data = flattenTranslations((_a2 = fetchedData[0]) !== null && _a2 !== void 0 ? _a2 : {});
465
- fetchedData.shift();
466
- }
467
- const promiseChanged = asyncRequests.get(value.cacheKey) !== value.promise;
468
- if (value.new && !promiseChanged) {
469
- asyncRequests.delete(value.cacheKey);
470
- if (value.data) {
471
- self2.addRecord(value, value.data);
472
- } else if (!self2.getRecord(value)) {
473
- self2.addRecord(value, {});
474
- }
475
- }
476
- });
477
- fetchingObserver.notify();
478
- loadingObserver.notify();
479
- return withPromises.map((val) => {
480
- var _a2;
481
- return {
482
- language: val.language,
483
- namespace: val.namespace,
484
- data: (_a2 = val.data) !== null && _a2 !== void 0 ? _a2 : {},
485
- cacheKey: val.cacheKey
486
- };
487
- });
488
- }
489
- });
490
- return self2;
491
- }
492
- function __rest(s, e) {
493
- var t = {};
494
- for (var p in s)
495
- if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
496
- t[p] = s[p];
497
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
498
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
499
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
500
- t[p[i]] = s[p[i]];
501
- }
502
- return t;
503
- }
504
- const defaultObserverOptions = {
505
- tagAttributes: {
506
- textarea: ["placeholder"],
507
- input: ["value", "placeholder"],
508
- img: ["alt"],
509
- "*": ["aria-label", "title"]
510
- },
511
- restrictedElements: ["script", "style"],
512
- highlightKeys: ["Alt"],
513
- highlightColor: "rgb(255, 0, 0)",
514
- highlightWidth: 5,
515
- inputPrefix: "%-%tolgee:",
516
- inputSuffix: "%-%",
517
- passToParent: ["option", "optgroup"],
518
- fullKeyEncode: false
519
- };
520
- const DEFAULT_FORMAT_ERROR = "invalid";
521
- const DEFAULT_API_URL = "https://app.tolgee.io";
522
- const DEFAULT_MISSING_TRANSLATION = ({ key }) => key;
523
- const defaultValues = {
524
- observerOptions: defaultObserverOptions,
525
- observerType: "invisible",
526
- onFormatError: DEFAULT_FORMAT_ERROR,
527
- apiUrl: DEFAULT_API_URL,
528
- autoLoadRequiredData: true,
529
- fetch: createFetchFunction(),
530
- onTranslationMissing: DEFAULT_MISSING_TRANSLATION
531
- };
532
- const combineOptions = (...states) => {
533
- let result = {};
534
- states.forEach((state) => {
535
- result = Object.assign(Object.assign(Object.assign({}, result), state), { observerOptions: Object.assign(Object.assign({}, result.observerOptions), state === null || state === void 0 ? void 0 : state.observerOptions) });
536
- });
537
- return result;
538
- };
539
- function initState(options, previousState) {
540
- const initialOptions = combineOptions(defaultValues, previousState === null || previousState === void 0 ? void 0 : previousState.initialOptions, options);
541
- initialOptions.apiUrl = sanitizeUrl(initialOptions.apiUrl);
542
- if (options === null || options === void 0 ? void 0 : options.fetch) {
543
- initialOptions.fetch = createFetchFunction(options.fetch);
544
- }
545
- return {
546
- initialOptions,
547
- activeNamespaces: (previousState === null || previousState === void 0 ? void 0 : previousState.activeNamespaces) || /* @__PURE__ */ new Map(),
548
- language: previousState === null || previousState === void 0 ? void 0 : previousState.language,
549
- pendingLanguage: previousState === null || previousState === void 0 ? void 0 : previousState.language,
550
- isInitialLoading: false,
551
- isRunning: false
552
- };
553
- }
554
- function Plugins(getLanguage, getInitialOptions, getAvailableLanguages, getFallbackNamespaces, getTranslationNs, getTranslation, changeTranslation, events) {
555
- const plugins = {
556
- ui: void 0
557
- };
558
- const instances = {
559
- formatters: [],
560
- finalFormatter: void 0,
561
- observer: void 0,
562
- devBackend: void 0,
563
- backends: [],
564
- ui: void 0,
565
- languageDetector: void 0,
566
- languageStorage: void 0
567
- };
568
- const onClick = async ({ keysAndDefaults, target }) => {
569
- var _a2;
570
- const withNs = keysAndDefaults.map(({ key, ns, defaultValue }) => {
571
- return {
572
- key,
573
- defaultValue,
574
- fallbackNamespaces: getFallbackNamespaces(ns),
575
- namespace: getTranslationNs({ key, ns })[0],
576
- translation: getTranslation({
577
- key,
578
- ns
579
- })
580
- };
581
- });
582
- (_a2 = instances.ui) === null || _a2 === void 0 ? void 0 : _a2.handleElementClick(withNs, target);
583
- };
584
- const findPositions = (key, ns) => {
585
- var _a2;
586
- return ((_a2 = instances.observer) === null || _a2 === void 0 ? void 0 : _a2.findPositions(key, ns)) || [];
587
- };
588
- function translate(props) {
589
- const translation = getTranslation({
590
- key: props.key,
591
- ns: props.ns
592
- });
593
- return self2.formatTranslation(Object.assign(Object.assign({}, props), { translation, formatEnabled: true }));
594
- }
595
- function getCommonProps() {
596
- return { fetch: getInitialOptions().fetch };
597
- }
598
- function setObserver(observer) {
599
- instances.observer = observer === null || observer === void 0 ? void 0 : observer();
600
- }
601
- function hasObserver() {
602
- return Boolean(instances.observer);
603
- }
604
- function addFormatter(formatter2) {
605
- if (formatter2) {
606
- instances.formatters.push(formatter2);
607
- }
608
- }
609
- function setFinalFormatter(formatter2) {
610
- instances.finalFormatter = formatter2;
611
- }
612
- function setUi(ui) {
613
- plugins.ui = ui;
614
- }
615
- function hasUi() {
616
- return Boolean(plugins.ui);
617
- }
618
- function setLanguageStorage(storage) {
619
- instances.languageStorage = storage;
620
- }
621
- function setLanguageDetector(detector) {
622
- instances.languageDetector = detector;
623
- }
624
- function storageLoadLanguage() {
625
- return handleRegularOrAsyncErr(events.onError, (e) => new LanguageStorageError("Tolgee: Failed to load language", e), () => {
626
- var _a2;
627
- return (_a2 = instances.languageStorage) === null || _a2 === void 0 ? void 0 : _a2.getLanguage(getCommonProps());
628
- });
629
- }
630
- function detectLanguage2() {
631
- if (!instances.languageDetector) {
632
- return void 0;
633
- }
634
- const availableLanguages = getAvailableLanguages();
635
- return handleRegularOrAsyncErr(events.onError, (e) => new LanguageDetectorError("Tolgee: Failed to detect language", e), () => {
636
- var _a2;
637
- return (_a2 = instances.languageDetector) === null || _a2 === void 0 ? void 0 : _a2.getLanguage(Object.assign({ availableLanguages }, getCommonProps()));
638
- });
639
- }
640
- function addBackend(backend) {
641
- if (backend) {
642
- instances.backends.push(backend);
643
- }
644
- }
645
- function setDevBackend(backend) {
646
- instances.devBackend = backend;
647
- }
648
- function addPlugin(tolgeeInstance, plugin) {
649
- const pluginTools = Object.freeze({
650
- setFinalFormatter,
651
- addFormatter,
652
- setObserver,
653
- hasObserver,
654
- setUi,
655
- hasUi,
656
- setDevBackend,
657
- addBackend,
658
- setLanguageDetector,
659
- setLanguageStorage
660
- });
661
- plugin(tolgeeInstance, pluginTools);
662
- }
663
- const self2 = Object.freeze({
664
- addPlugin,
665
- findPositions,
666
- run() {
667
- var _a2, _b;
668
- const { apiKey, apiUrl, projectId, observerOptions, tagNewKeys, filterTag } = getInitialOptions();
669
- instances.ui = (_a2 = plugins.ui) === null || _a2 === void 0 ? void 0 : _a2.call(plugins, {
670
- apiKey,
671
- apiUrl,
672
- projectId,
673
- highlight: self2.highlight,
674
- changeTranslation,
675
- findPositions,
676
- onPermanentChange: (data) => events.onPermanentChange.emit(data),
677
- tagNewKeys,
678
- filterTag
679
- });
680
- (_b = instances.observer) === null || _b === void 0 ? void 0 : _b.run({
681
- mouseHighlight: Boolean(instances.ui),
682
- options: observerOptions,
683
- translate,
684
- onClick
685
- });
686
- },
687
- stop() {
688
- var _a2;
689
- instances.ui = void 0;
690
- (_a2 = instances.observer) === null || _a2 === void 0 ? void 0 : _a2.stop();
691
- },
692
- getLanguageStorage() {
693
- return instances.languageStorage;
694
- },
695
- getInitialLanguage() {
696
- const availableLanguages = getAvailableLanguages();
697
- const languageOrPromise = storageLoadLanguage();
698
- return valueOrPromise(languageOrPromise, (language) => {
699
- if ((!availableLanguages || availableLanguages.includes(language)) && language) {
700
- return language;
701
- }
702
- return detectLanguage2();
703
- });
704
- },
705
- setStoredLanguage(language) {
706
- return handleRegularOrAsyncErr(events.onError, (e) => new LanguageStorageError("Tolgee: Failed to store language", e), () => {
707
- var _a2;
708
- return (_a2 = instances.languageStorage) === null || _a2 === void 0 ? void 0 : _a2.setLanguage(language, getCommonProps());
709
- });
710
- },
711
- getDevBackend() {
712
- return instances.devBackend;
713
- },
714
- getBackendRecord: async ({ language, namespace }) => {
715
- for (const backend of instances.backends) {
716
- const data = await backend.getRecord(Object.assign({
717
- language,
718
- namespace
719
- }, getCommonProps()));
720
- if (data !== void 0) {
721
- return data;
722
- }
723
- }
724
- return void 0;
725
- },
726
- getBackendDevRecord: async ({ language, namespace }) => {
727
- var _a2;
728
- const { apiKey, apiUrl, projectId, filterTag } = getInitialOptions();
729
- if (!apiKey || !apiUrl || !self2.hasDevBackend()) {
730
- return void 0;
731
- }
732
- return (_a2 = instances.devBackend) === null || _a2 === void 0 ? void 0 : _a2.getRecord(Object.assign({
733
- apiKey,
734
- apiUrl,
735
- projectId,
736
- language,
737
- namespace,
738
- filterTag
739
- }, getCommonProps()));
740
- },
741
- getLanguageDetector() {
742
- return instances.languageDetector;
743
- },
744
- retranslate() {
745
- var _a2;
746
- (_a2 = instances.observer) === null || _a2 === void 0 ? void 0 : _a2.retranslate();
747
- },
748
- highlight: (key, ns) => {
749
- var _a2, _b;
750
- return ((_b = (_a2 = instances.observer) === null || _a2 === void 0 ? void 0 : _a2.highlight) === null || _b === void 0 ? void 0 : _b.call(_a2, key, ns)) || { unhighlight() {
751
- } };
752
- },
753
- unwrap(text) {
754
- var _a2;
755
- if (instances.observer) {
756
- return (_a2 = instances.observer) === null || _a2 === void 0 ? void 0 : _a2.unwrap(text);
757
- }
758
- return { text, keys: [] };
759
- },
760
- wrap(params) {
761
- var _a2;
762
- if (instances.observer) {
763
- return (_a2 = instances.observer) === null || _a2 === void 0 ? void 0 : _a2.wrap(params);
764
- }
765
- return params.translation;
766
- },
767
- hasDevBackend() {
768
- return Boolean(self2.getDevBackend());
769
- },
770
- formatTranslation(_a2) {
771
- var _b;
772
- var { formatEnabled } = _a2, props = __rest(_a2, ["formatEnabled"]);
773
- const { key, translation, defaultValue, noWrap, params, ns, orEmpty } = props;
774
- const formattableTranslation = translation !== null && translation !== void 0 ? translation : defaultValue;
775
- let translationMissingResult = "";
776
- if (translation === void 0 || translation === null) {
777
- translationMissingResult = getInitialOptions().onTranslationMissing(props);
778
- }
779
- let result = formattableTranslation !== null && formattableTranslation !== void 0 ? formattableTranslation : orEmpty ? "" : translationMissingResult;
780
- const language = getLanguage();
781
- const isFormatEnabled = formatEnabled || !((_b = instances.observer) === null || _b === void 0 ? void 0 : _b.outputNotFormattable);
782
- const wrap = (result2) => {
783
- if (instances.observer && !noWrap) {
784
- return instances.observer.wrap({
785
- key,
786
- translation: result2,
787
- defaultValue,
788
- params,
789
- ns
790
- });
791
- }
792
- return result2;
793
- };
794
- result = wrap(result);
795
- try {
796
- if (formattableTranslation && language && isFormatEnabled) {
797
- for (const formatter2 of instances.formatters) {
798
- result = formatter2.format({
799
- translation: result,
800
- language,
801
- params
802
- });
803
- }
804
- }
805
- if (instances.finalFormatter && formattableTranslation && language && isFormatEnabled) {
806
- result = instances.finalFormatter.format({
807
- translation: result,
808
- language,
809
- params
810
- });
811
- }
812
- } catch (e) {
813
- console.error(e);
814
- const errorMessage = getErrorMessage(e) || DEFAULT_FORMAT_ERROR;
815
- const onFormatError = getInitialOptions().onFormatError;
816
- const formatErrorType = typeof onFormatError;
817
- if (formatErrorType === "string") {
818
- result = onFormatError;
819
- } else if (formatErrorType === "function") {
820
- result = onFormatError(errorMessage, props);
821
- } else {
822
- result = DEFAULT_FORMAT_ERROR;
823
- }
824
- result = wrap(result);
825
- }
826
- return result;
827
- }
828
- });
829
- return self2;
830
- }
831
- const ValueObserver = (initialValue, valueGetter, handler) => {
832
- let previousValue = initialValue;
833
- return Object.freeze({
834
- init(value) {
835
- previousValue = value;
836
- },
837
- notify() {
838
- const value = valueGetter();
839
- if (previousValue !== value) {
840
- handler(value);
841
- }
842
- previousValue = value;
843
- }
844
- });
845
- };
846
- function State(onLanguageChange, onPendingLanguageChange, onRunningChange) {
847
- let state = initState();
848
- let devCredentials = void 0;
849
- const self2 = Object.freeze({
850
- init(options) {
851
- state = initState(options, state);
852
- },
853
- isRunning() {
854
- return state.isRunning;
855
- },
856
- setRunning(value) {
857
- if (state.isRunning !== value) {
858
- state.isRunning = value;
859
- onRunningChange.emit(value);
860
- }
861
- },
862
- isInitialLoading() {
863
- return state.isInitialLoading;
864
- },
865
- setInitialLoading(value) {
866
- state.isInitialLoading = value;
867
- },
868
- getLanguage() {
869
- return state.language || state.initialOptions.language;
870
- },
871
- setLanguage(language) {
872
- if (state.language !== language) {
873
- state.language = language;
874
- onLanguageChange.emit(language);
875
- }
876
- },
877
- getPendingLanguage() {
878
- return state.pendingLanguage || self2.getLanguage();
879
- },
880
- setPendingLanguage(language) {
881
- if (state.pendingLanguage !== language) {
882
- state.pendingLanguage = language;
883
- onPendingLanguageChange.emit(language);
884
- }
885
- },
886
- getInitialOptions() {
887
- return Object.assign(Object.assign({}, state.initialOptions), devCredentials);
888
- },
889
- addActiveNs(ns) {
890
- const namespaces = getFallbackArray(ns);
891
- namespaces.forEach((namespace) => {
892
- const value = state.activeNamespaces.get(namespace);
893
- if (value !== void 0) {
894
- state.activeNamespaces.set(namespace, value + 1);
895
- } else {
896
- state.activeNamespaces.set(namespace, 1);
897
- }
898
- });
899
- },
900
- removeActiveNs(ns) {
901
- const namespaces = getFallbackArray(ns);
902
- namespaces.forEach((namespace) => {
903
- const value = state.activeNamespaces.get(namespace);
904
- if (value !== void 0 && value > 1) {
905
- state.activeNamespaces.set(namespace, value - 1);
906
- } else {
907
- state.activeNamespaces.delete(namespace);
908
- }
909
- });
910
- },
911
- getRequiredNamespaces() {
912
- return unique([
913
- self2.getDefaultNs(),
914
- ...state.initialOptions.ns || [],
915
- ...getFallbackArray(state.initialOptions.fallbackNs),
916
- ...state.activeNamespaces.keys()
917
- ]);
918
- },
919
- getFallbackLangs(lang) {
920
- const language = lang || self2.getLanguage();
921
- if (!language) {
922
- return [];
923
- }
924
- return unique([
925
- language,
926
- ...getFallbackFromStruct(language, state.initialOptions.fallbackLanguage)
927
- ]);
928
- },
929
- getFallbackNs() {
930
- return getFallbackArray(state.initialOptions.fallbackNs);
931
- },
932
- getNs() {
933
- var _a2, _b;
934
- return ((_a2 = state.initialOptions.ns) === null || _a2 === void 0 ? void 0 : _a2.length) ? state.initialOptions.ns : [(_b = state.initialOptions.defaultNs) !== null && _b !== void 0 ? _b : ""];
935
- },
936
- getDefaultNs(ns) {
937
- var _a2, _b, _c;
938
- return ns === void 0 ? (_c = (_a2 = state.initialOptions.defaultNs) !== null && _a2 !== void 0 ? _a2 : (_b = state.initialOptions.ns) === null || _b === void 0 ? void 0 : _b[0]) !== null && _c !== void 0 ? _c : "" : ns;
939
- },
940
- getAvailableLanguages() {
941
- if (state.initialOptions.availableLanguages) {
942
- return state.initialOptions.availableLanguages;
943
- } else if (state.initialOptions.staticData) {
944
- const languagesFromStaticData = Object.keys(state.initialOptions.staticData).map((key) => decodeCacheKey(key).language);
945
- return Array.from(new Set(languagesFromStaticData));
946
- }
947
- },
948
- getAvailableNs() {
949
- return state.initialOptions.availableNs;
950
- },
951
- withDefaultNs(descriptor) {
952
- return {
953
- namespace: descriptor.namespace === void 0 ? self2.getDefaultNs() : descriptor.namespace,
954
- language: descriptor.language
955
- };
956
- },
957
- overrideCredentials(credentials) {
958
- if (credentials) {
959
- devCredentials = Object.assign(Object.assign({}, credentials), { apiUrl: sanitizeUrl(credentials.apiUrl) });
960
- } else {
961
- devCredentials = void 0;
962
- }
963
- }
964
- });
965
- return self2;
966
- }
967
- function parseCombinedOptions(_a2) {
968
- var { ns, noWrap, orEmpty, params, language } = _a2, rest = __rest(_a2, ["ns", "noWrap", "orEmpty", "params", "language"]);
969
- const options = {
970
- ns,
971
- noWrap,
972
- orEmpty,
973
- language
974
- };
975
- return Object.assign(Object.assign({}, options), { params: Object.assign({}, rest) });
976
- }
977
- const getTranslateProps = (keyOrProps, ...params) => {
978
- let result = {};
979
- let options;
980
- if (typeof keyOrProps === "object") {
981
- result = keyOrProps;
982
- } else {
983
- result.key = keyOrProps;
984
- if (typeof params[0] === "string") {
985
- result.defaultValue = params[0];
986
- options = params[1];
987
- } else if (typeof params[0] === "object") {
988
- options = params[0];
989
- }
990
- }
991
- if (options) {
992
- result = Object.assign(Object.assign({}, parseCombinedOptions(options)), result);
993
- }
994
- return result;
995
- };
996
- function Controller({ options }) {
997
- const events = Events();
998
- const fetchingObserver = ValueObserver(false, () => cache.isFetching(), events.onFetchingChange.emit);
999
- const loadingObserver = ValueObserver(false, () => self2.isLoading(), events.onLoadingChange.emit);
1000
- const state = State(events.onLanguageChange, events.onPendingLanguageChange, events.onRunningChange);
1001
- const pluginService = Plugins(state.getLanguage, state.getInitialOptions, state.getAvailableLanguages, getDefaultAndFallbackNs, getTranslationNs, getTranslation, changeTranslation, events);
1002
- const cache = Cache(events, pluginService.getBackendRecord, pluginService.getBackendDevRecord, state.withDefaultNs, state.isInitialLoading, fetchingObserver, loadingObserver);
1003
- if (options) {
1004
- init(options);
1005
- }
1006
- let runPromise;
1007
- events.onUpdate.listen(() => {
1008
- if (state.isRunning()) {
1009
- pluginService.retranslate();
1010
- }
1011
- });
1012
- function getFallbackNs() {
1013
- return state.getFallbackNs();
1014
- }
1015
- function getDefaultNs(ns) {
1016
- return state.getDefaultNs(ns);
1017
- }
1018
- function getDefaultAndFallbackNs(ns) {
1019
- return unique([...getFallbackArray(getDefaultNs(ns)), ...getFallbackNs()]);
1020
- }
1021
- function getRequiredNamespaces(ns) {
1022
- return unique([
1023
- ...getFallbackArray(ns !== null && ns !== void 0 ? ns : getDefaultNs()),
1024
- ...state.getRequiredNamespaces()
1025
- ]);
1026
- }
1027
- function changeTranslation(descriptor, key, value) {
1028
- const keyObject = state.withDefaultNs(descriptor);
1029
- const previousValue = cache.getTranslation(keyObject, key);
1030
- cache.changeTranslation(keyObject, key, value);
1031
- return {
1032
- revert() {
1033
- cache.changeTranslation(keyObject, key, previousValue);
1034
- }
1035
- };
1036
- }
1037
- function init(options2) {
1038
- state.init(options2);
1039
- cache.addStaticData(state.getInitialOptions().staticData);
1040
- }
1041
- function getRequiredDescriptors(lang, ns) {
1042
- const languages = state.getFallbackLangs(lang);
1043
- const namespaces = getRequiredNamespaces(ns);
1044
- const result = [];
1045
- languages.forEach((language) => {
1046
- namespaces.forEach((namespace) => {
1047
- result.push({ language, namespace });
1048
- });
1049
- });
1050
- return result;
1051
- }
1052
- function getMissingDescriptors(lang, ns) {
1053
- return getRequiredDescriptors(lang, ns).filter((descriptor) => !cache.exists(descriptor, true));
1054
- }
1055
- function getMatrixRecords(options2) {
1056
- let languages = [];
1057
- let namespaces = [];
1058
- if (Array.isArray(options2.languages)) {
1059
- languages = options2.languages;
1060
- } else if (options2.languages === "all") {
1061
- const availableLanguages = self2.getAvailableLanguages();
1062
- if (!availableLanguages) {
1063
- throw new Error(missingOptionError("availableLanguages"));
1064
- }
1065
- languages = availableLanguages;
1066
- }
1067
- if (Array.isArray(options2.namespaces)) {
1068
- namespaces = options2.namespaces;
1069
- } else if (options2.namespaces === "all") {
1070
- const availableNs = self2.getAvailableNs();
1071
- if (!availableNs) {
1072
- throw new Error(missingOptionError("availableNs"));
1073
- }
1074
- namespaces = availableNs;
1075
- }
1076
- const records = [];
1077
- languages.forEach((language) => {
1078
- namespaces.forEach((namespace) => {
1079
- records.push({ language, namespace });
1080
- });
1081
- });
1082
- return records;
1083
- }
1084
- function getTranslationNs({ key, ns }) {
1085
- const languages = state.getFallbackLangs();
1086
- const namespaces = getDefaultAndFallbackNs(ns !== null && ns !== void 0 ? ns : void 0);
1087
- return cache.getTranslationNs(namespaces, languages, key);
1088
- }
1089
- function getTranslation({ key, ns, language }) {
1090
- const namespaces = getDefaultAndFallbackNs(ns !== null && ns !== void 0 ? ns : void 0);
1091
- const languages = state.getFallbackLangs(language);
1092
- return cache.getTranslationFallback(namespaces, languages, key);
1093
- }
1094
- function loadInitial() {
1095
- const data = valueOrPromise(initializeLanguage(), () => {
1096
- const missingDescriptors = getMissingDescriptors();
1097
- if (missingDescriptors.length && state.getInitialOptions().autoLoadRequiredData) {
1098
- return cache.loadRecords(missingDescriptors, { useCache: true });
1099
- }
1100
- });
1101
- if (isPromise(data)) {
1102
- state.setInitialLoading(true);
1103
- fetchingObserver.notify();
1104
- loadingObserver.notify();
1105
- return Promise.resolve(data).then(() => {
1106
- state.setInitialLoading(false);
1107
- fetchingObserver.notify();
1108
- loadingObserver.notify();
1109
- events.onInitialLoaded.emit();
1110
- });
1111
- } else {
1112
- events.onInitialLoaded.emit();
1113
- }
1114
- }
1115
- function initializeLanguage() {
1116
- const existingLanguage = state.getLanguage();
1117
- if (existingLanguage) {
1118
- return;
1119
- }
1120
- const languageOrPromise = pluginService.getInitialLanguage();
1121
- return valueOrPromise(languageOrPromise, (lang) => {
1122
- const language = lang || state.getInitialOptions().defaultLanguage;
1123
- language && state.setLanguage(language);
1124
- });
1125
- }
1126
- function checkCorrectConfiguration() {
1127
- const languageComputable = pluginService.getLanguageDetector() || pluginService.getLanguageStorage();
1128
- if (languageComputable) {
1129
- const availableLanguages = state.getAvailableLanguages();
1130
- if (!availableLanguages) {
1131
- throw new Error(missingOptionError("availableLanguages"));
1132
- }
1133
- }
1134
- if (!state.getLanguage() && !state.getInitialOptions().defaultLanguage) {
1135
- throw new Error(missingOptionError(["defaultLanguage", "language"]));
1136
- }
1137
- }
1138
- const self2 = Object.freeze(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, events), state), pluginService), cache), {
1139
- init,
1140
- getTranslation,
1141
- changeTranslation,
1142
- getTranslationNs,
1143
- getDefaultAndFallbackNs,
1144
- findPositions: pluginService.findPositions,
1145
- getRequiredDescriptors,
1146
- async changeLanguage(language) {
1147
- if (state.getPendingLanguage() === language && state.getLanguage() === language) {
1148
- return;
1149
- }
1150
- state.setPendingLanguage(language);
1151
- if (state.isRunning() && state.getInitialOptions().autoLoadRequiredData) {
1152
- await cache.loadRecords(getRequiredDescriptors(language), {
1153
- useCache: true
1154
- });
1155
- }
1156
- if (language === state.getPendingLanguage()) {
1157
- state.setLanguage(language);
1158
- await pluginService.setStoredLanguage(language);
1159
- }
1160
- },
1161
- async addActiveNs(ns, forget) {
1162
- if (!forget) {
1163
- state.addActiveNs(ns);
1164
- }
1165
- if (state.isRunning()) {
1166
- await cache.loadRecords(getRequiredDescriptors(void 0, ns), {
1167
- useCache: true
1168
- });
1169
- }
1170
- },
1171
- async loadRecord(descriptor, options2) {
1172
- var _a2;
1173
- return (_a2 = (await self2.loadRecords([descriptor], options2))[0]) === null || _a2 === void 0 ? void 0 : _a2.data;
1174
- },
1175
- isLoading(ns) {
1176
- return cache.isLoading(state.getLanguage(), ns);
1177
- },
1178
- isLoaded(ns) {
1179
- const language = state.getLanguage();
1180
- if (!language) {
1181
- return false;
1182
- }
1183
- const languages = state.getFallbackLangs(language);
1184
- const namespaces = getRequiredNamespaces(ns);
1185
- const result = [];
1186
- languages.forEach((language2) => {
1187
- namespaces.forEach((namespace) => {
1188
- if (!cache.exists({ language: language2, namespace })) {
1189
- result.push({ language: language2, namespace });
1190
- }
1191
- });
1192
- });
1193
- return result.length === 0;
1194
- },
1195
- t: (...args) => {
1196
- const params = getTranslateProps(...args);
1197
- const translation = getTranslation(params);
1198
- return pluginService.formatTranslation(Object.assign(Object.assign({}, params), { translation }));
1199
- },
1200
- isDev() {
1201
- return Boolean(state.getInitialOptions().apiKey && state.getInitialOptions().apiUrl);
1202
- },
1203
- async loadRequired(options2) {
1204
- if (!(options2 === null || options2 === void 0 ? void 0 : options2.language)) {
1205
- await initializeLanguage();
1206
- }
1207
- const requiredRecords = getRequiredDescriptors(options2 === null || options2 === void 0 ? void 0 : options2.language);
1208
- return self2.loadRecords(requiredRecords, options2);
1209
- },
1210
- async loadMatrix(options2) {
1211
- const records = getMatrixRecords(options2);
1212
- return self2.loadRecords(records, options2);
1213
- },
1214
- run() {
1215
- checkCorrectConfiguration();
1216
- if (!state.isRunning()) {
1217
- state.setRunning(true);
1218
- pluginService.run();
1219
- runPromise = loadInitial();
1220
- }
1221
- return Promise.resolve(runPromise);
1222
- },
1223
- stop() {
1224
- if (state.isRunning()) {
1225
- pluginService.stop();
1226
- state.setRunning(false);
1227
- }
1228
- }
1229
- }));
1230
- return self2;
1231
- }
1232
- function createTolgee(options) {
1233
- const controller = Controller({
1234
- options
1235
- });
1236
- if (controller.isDev()) {
1237
- controller.invalidate();
1238
- }
1239
- function withRestart(callback) {
1240
- const wasRunning = controller.isRunning();
1241
- wasRunning && controller.stop();
1242
- callback();
1243
- controller.isDev() && controller.invalidate();
1244
- wasRunning && controller.run();
1245
- }
1246
- const self2 = Object.freeze({
1247
- /**
1248
- * Listen to tolgee events.
1249
- */
1250
- on: controller.on,
1251
- /**
1252
- * Turn off/on events emitting. Is on by default.
1253
- */
1254
- setEmitterActive: controller.setEmitterActive,
1255
- /**
1256
- * @return current language if set.
1257
- */
1258
- getLanguage: controller.getLanguage,
1259
- /**
1260
- * `pendingLanguage` represents language which is currently being loaded.
1261
- * @return current `pendingLanguage` if set.
1262
- */
1263
- getPendingLanguage: controller.getPendingLanguage,
1264
- /**
1265
- * Change current language.
1266
- * - if not running sets `pendingLanguage`, `language` to the new value
1267
- * - if running sets `pendingLanguage` to the value, fetches necessary data and then changes `language`
1268
- *
1269
- * @return Promise which is resolved when `language` is changed.
1270
- */
1271
- changeLanguage: controller.changeLanguage,
1272
- /**
1273
- * Temporarily change translation in cache.
1274
- * @return object with revert method.
1275
- */
1276
- changeTranslation: controller.changeTranslation,
1277
- /**
1278
- * Adds namespace(s) list of active namespaces. And if tolgee is running, loads required data.
1279
- */
1280
- addActiveNs: controller.addActiveNs,
1281
- /**
1282
- * Remove namespace(s) from active namespaces.
1283
- *
1284
- * Tolgee internally counts how many times was each active namespace added,
1285
- * so this method will remove namespace only if the counter goes down to 0.
1286
- */
1287
- removeActiveNs: controller.removeActiveNs,
1288
- /**
1289
- * Load records which would be loaded by `run` function
1290
- *
1291
- * You can provide language if not previously set on tolgee instance
1292
- */
1293
- loadRequired: controller.loadRequired,
1294
- /**
1295
- * Load records in matrix (languages x namespaces)
1296
- */
1297
- loadMatrix: controller.loadMatrix,
1298
- /**
1299
- * Manually load multiple records from `Backend` (or `DevBackend` when in dev mode)
1300
- *
1301
- * It loads data together and adds them to cache in one operation, to prevent partly loaded state.
1302
- */
1303
- loadRecords: controller.loadRecords,
1304
- /**
1305
- * Manually load record from `Backend` (or `DevBackend` when in dev mode)
1306
- */
1307
- loadRecord: controller.loadRecord,
1308
- /**
1309
- * Prefill static data
1310
- */
1311
- addStaticData: controller.addStaticData,
1312
- /**
1313
- * Get record from cache.
1314
- */
1315
- getRecord: controller.getRecord,
1316
- /**
1317
- * Get all records from cache.
1318
- */
1319
- getAllRecords: controller.getAllRecords,
1320
- /**
1321
- * @param ns optional list of namespaces that you are interested in
1322
- * @return `true` if there are data that need to be fetched.
1323
- */
1324
- isLoaded: controller.isLoaded,
1325
- /**
1326
- * Returns descriptors of records needed for instance to be `loaded`
1327
- */
1328
- getRequiredDescriptors: controller.getRequiredDescriptors,
1329
- /**
1330
- * @return `true` if tolgee is loading initial data (triggered by `run`).
1331
- */
1332
- isInitialLoading: controller.isInitialLoading,
1333
- /**
1334
- * @param ns optional list of namespaces that you are interested in
1335
- * @return `true` if tolgee is loading some translations for the first time.
1336
- */
1337
- isLoading: controller.isLoading,
1338
- /**
1339
- * @param ns optional list of namespaces that you are interested in
1340
- * @return `true` if tolgee is fetching some translations.
1341
- */
1342
- isFetching: controller.isFetching,
1343
- /**
1344
- * @return `true` if tolgee is running.
1345
- */
1346
- isRunning: controller.isRunning,
1347
- /**
1348
- * Changes internal state to running: true and loads initial files.
1349
- * Runs runnable plugins mainly Observer if present.
1350
- */
1351
- run: controller.run,
1352
- /**
1353
- * Changes internal state to running: false and stops runnable plugins.
1354
- */
1355
- stop: controller.stop,
1356
- /**
1357
- * Returns translated and formatted key.
1358
- * If Observer is present and tolgee is running, wraps result to be identifiable in the DOM.
1359
- */
1360
- t: controller.t,
1361
- /**
1362
- * Highlight keys that match selection.
1363
- */
1364
- highlight: controller.highlight,
1365
- /**
1366
- * Find positions of keys in the DOM.
1367
- */
1368
- findPositions: controller.findPositions,
1369
- /**
1370
- * @return current Tolgee options.
1371
- */
1372
- getInitialOptions: controller.getInitialOptions,
1373
- /**
1374
- * Tolgee is in dev mode if `DevTools` plugin is used and `apiKey` + `apiUrl` are specified.
1375
- * @return `true` if tolgee is in dev mode.
1376
- */
1377
- isDev: controller.isDev,
1378
- /**
1379
- * Wraps translation if there is `Observer` plugin
1380
- */
1381
- wrap: controller.wrap,
1382
- /**
1383
- * Unwrap translation
1384
- */
1385
- unwrap: controller.unwrap,
1386
- /**
1387
- * Override creadentials passed on initialization.
1388
- *
1389
- * When called in running state, tolgee stops and runs again.
1390
- */
1391
- overrideCredentials(credentials) {
1392
- withRestart(() => controller.overrideCredentials(credentials));
1393
- },
1394
- /**
1395
- * Add tolgee plugin after initialization.
1396
- *
1397
- * When called in running state, tolgee stops and runs again.
1398
- */
1399
- addPlugin(plugin) {
1400
- if (plugin) {
1401
- withRestart(() => controller.addPlugin(self2, plugin));
1402
- }
1403
- },
1404
- /**
1405
- * Updates options after instance creation. Extends existing options,
1406
- * so it only changes the fields, that are listed.
1407
- *
1408
- * When called in running state, tolgee stops and runs again.
1409
- */
1410
- updateOptions(options2) {
1411
- if (options2) {
1412
- withRestart(() => controller.init(options2));
1413
- }
1414
- }
1415
- });
1416
- return self2;
1417
- }
1418
- const TolgeeCore = () => {
1419
- const state = {
1420
- plugins: [],
1421
- options: {}
1422
- };
1423
- const tolgeeChain = Object.freeze({
1424
- use(plugin) {
1425
- state.plugins.push(plugin);
1426
- return tolgeeChain;
1427
- },
1428
- updateDefaults(options) {
1429
- state.options = combineOptions(state.options, options);
1430
- return tolgeeChain;
1431
- },
1432
- init(options) {
1433
- const tolgee = createTolgee(combineOptions(state.options, options));
1434
- state.plugins.forEach(tolgee.addPlugin);
1435
- return tolgee;
1436
- }
1437
- });
1438
- return tolgeeChain;
1439
- };
1440
- const ERROR_PARAM_EMPTY = 0, ERROR_UNEXPECTED_CHAR = 1, ERROR_UNEXPECTED_END = 2;
1441
- class FormatError extends Error {
1442
- constructor(code, index, text) {
1443
- let error;
1444
- let hint = "";
1445
- if (code === ERROR_PARAM_EMPTY) {
1446
- error = "Empty parameter";
1447
- } else if (code === ERROR_UNEXPECTED_CHAR) {
1448
- error = "Unexpected character";
1449
- hint = "Did you forget to use FormatIcu to render ICU message syntax?";
1450
- } else {
1451
- error = "Unexpected end";
1452
- }
1453
- super(`Tolgee parser: ${error} at ${index} in "${text}"` + (hint ? "\n" + hint : ""));
1454
- this.code = code;
1455
- this.index = index;
1456
- }
1457
- }
1458
- function isWhitespace(ch) {
1459
- return /\s/.test(ch);
1460
- }
1461
- const STATE_TEXT = 0, STATE_ESCAPE_MAYBE = 1, STATE_ESCAPE = 2, STATE_PARAM = 3, STATE_PARAM_AFTER = 4;
1462
- const END_STATES = /* @__PURE__ */ new Set([
1463
- STATE_ESCAPE,
1464
- STATE_ESCAPE_MAYBE,
1465
- STATE_TEXT
1466
- ]);
1467
- const CHAR_ESCAPE = "'";
1468
- const ESCAPABLE = /* @__PURE__ */ new Set(["{", "}", CHAR_ESCAPE]);
1469
- const isAllowedInParam = (char) => {
1470
- return /[0-9a-zA-Z_]/.test(char);
1471
- };
1472
- function formatParser(translation) {
1473
- let state = STATE_TEXT;
1474
- let text = "";
1475
- let param = "";
1476
- let ch = "";
1477
- const texts = [];
1478
- const params = [];
1479
- let i = 0;
1480
- function parsingError(code) {
1481
- throw new FormatError(code, i, translation);
1482
- }
1483
- const addText = () => {
1484
- texts.push(text);
1485
- text = "";
1486
- };
1487
- const addParamChar = () => {
1488
- if (!isAllowedInParam(ch)) {
1489
- parsingError(ERROR_UNEXPECTED_CHAR);
1490
- }
1491
- param += ch;
1492
- };
1493
- const addParam = () => {
1494
- if (param === "") {
1495
- parsingError(ERROR_PARAM_EMPTY);
1496
- }
1497
- params.push(param);
1498
- param = "";
1499
- };
1500
- for (i = 0; i < translation.length; i++) {
1501
- ch = translation[i];
1502
- switch (state) {
1503
- case STATE_TEXT:
1504
- if (ch === CHAR_ESCAPE) {
1505
- text += ch;
1506
- state = STATE_ESCAPE_MAYBE;
1507
- } else if (ch === "{") {
1508
- addText();
1509
- state = STATE_PARAM;
1510
- } else {
1511
- text += ch;
1512
- state = STATE_TEXT;
1513
- }
1514
- break;
1515
- case STATE_ESCAPE_MAYBE:
1516
- if (ESCAPABLE.has(ch)) {
1517
- text = text.slice(0, -1) + ch;
1518
- state = STATE_ESCAPE;
1519
- } else {
1520
- text += ch;
1521
- state = STATE_TEXT;
1522
- }
1523
- break;
1524
- case STATE_ESCAPE:
1525
- if (ch === CHAR_ESCAPE) {
1526
- state = STATE_TEXT;
1527
- } else {
1528
- text += ch;
1529
- state = STATE_ESCAPE;
1530
- }
1531
- break;
1532
- case STATE_PARAM:
1533
- if (ch === "}") {
1534
- addParam();
1535
- state = STATE_TEXT;
1536
- } else if (!isWhitespace(ch)) {
1537
- addParamChar();
1538
- state = STATE_PARAM;
1539
- } else if (param !== "") {
1540
- addParam();
1541
- state = STATE_PARAM_AFTER;
1542
- }
1543
- break;
1544
- case STATE_PARAM_AFTER:
1545
- if (ch == "}") {
1546
- state = STATE_TEXT;
1547
- } else if (isWhitespace(ch)) {
1548
- state = STATE_PARAM_AFTER;
1549
- } else {
1550
- parsingError(ERROR_UNEXPECTED_CHAR);
1551
- }
1552
- }
1553
- }
1554
- if (!END_STATES.has(state)) {
1555
- parsingError(ERROR_UNEXPECTED_END);
1556
- }
1557
- addText();
1558
- return [texts, params];
1559
- }
1560
- function formatter(translation, params) {
1561
- const [texts, pars] = formatParser(translation);
1562
- const result = [texts[0]];
1563
- for (let i = 1; i < texts.length; i++) {
1564
- const parameter = params === null || params === void 0 ? void 0 : params[pars[i - 1]];
1565
- if (parameter === void 0) {
1566
- throw new Error(`Missing parameter "${pars[i - 1]}" in "${translation}"`);
1567
- }
1568
- result.push(String(parameter));
1569
- result.push(texts[i]);
1570
- }
1571
- return result.join("");
1572
- }
1573
- function createFormatSimple() {
1574
- return {
1575
- format: ({ translation, params }) => formatter(translation, params)
1576
- };
1577
- }
1578
- const FormatSimple = () => (tolgee, tools) => {
1579
- tools.setFinalFormatter(createFormatSimple());
1580
- return tolgee;
1581
- };
1582
- var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
1583
- var text_min = {};
1584
- (function(scope) {
1585
- function B(r, e) {
1586
- var f;
1587
- return r instanceof Buffer ? f = r : f = Buffer.from(r.buffer, r.byteOffset, r.byteLength), f.toString(e);
1588
- }
1589
- var w = function(r) {
1590
- return Buffer.from(r);
1591
- };
1592
- function h(r) {
1593
- for (var e = 0, f = Math.min(256 * 256, r.length + 1), n = new Uint16Array(f), i = [], o = 0; ; ) {
1594
- var t = e < r.length;
1595
- if (!t || o >= f - 1) {
1596
- var s = n.subarray(0, o), m = s;
1597
- if (i.push(String.fromCharCode.apply(null, m)), !t)
1598
- return i.join("");
1599
- r = r.subarray(e), e = 0, o = 0;
1600
- }
1601
- var a = r[e++];
1602
- if ((a & 128) === 0)
1603
- n[o++] = a;
1604
- else if ((a & 224) === 192) {
1605
- var d = r[e++] & 63;
1606
- n[o++] = (a & 31) << 6 | d;
1607
- } else if ((a & 240) === 224) {
1608
- var d = r[e++] & 63, l2 = r[e++] & 63;
1609
- n[o++] = (a & 31) << 12 | d << 6 | l2;
1610
- } else if ((a & 248) === 240) {
1611
- var d = r[e++] & 63, l2 = r[e++] & 63, R = r[e++] & 63, c = (a & 7) << 18 | d << 12 | l2 << 6 | R;
1612
- c > 65535 && (c -= 65536, n[o++] = c >>> 10 & 1023 | 55296, c = 56320 | c & 1023), n[o++] = c;
1613
- }
1614
- }
1615
- }
1616
- function F(r) {
1617
- for (var e = 0, f = r.length, n = 0, i = Math.max(32, f + (f >>> 1) + 7), o = new Uint8Array(i >>> 3 << 3); e < f; ) {
1618
- var t = r.charCodeAt(e++);
1619
- if (t >= 55296 && t <= 56319) {
1620
- if (e < f) {
1621
- var s = r.charCodeAt(e);
1622
- (s & 64512) === 56320 && (++e, t = ((t & 1023) << 10) + (s & 1023) + 65536);
1623
- }
1624
- if (t >= 55296 && t <= 56319)
1625
- continue;
1626
- }
1627
- if (n + 4 > o.length) {
1628
- i += 8, i *= 1 + e / r.length * 2, i = i >>> 3 << 3;
1629
- var m = new Uint8Array(i);
1630
- m.set(o), o = m;
1631
- }
1632
- if ((t & 4294967168) === 0) {
1633
- o[n++] = t;
1634
- continue;
1635
- } else if ((t & 4294965248) === 0)
1636
- o[n++] = t >>> 6 & 31 | 192;
1637
- else if ((t & 4294901760) === 0)
1638
- o[n++] = t >>> 12 & 15 | 224, o[n++] = t >>> 6 & 63 | 128;
1639
- else if ((t & 4292870144) === 0)
1640
- o[n++] = t >>> 18 & 7 | 240, o[n++] = t >>> 12 & 63 | 128, o[n++] = t >>> 6 & 63 | 128;
1641
- else
1642
- continue;
1643
- o[n++] = t & 63 | 128;
1644
- }
1645
- return o.slice ? o.slice(0, n) : o.subarray(0, n);
1646
- }
1647
- var u = "Failed to ", p = function(r, e, f) {
1648
- if (r)
1649
- throw new Error("".concat(u).concat(e, ": the '").concat(f, "' option is unsupported."));
1650
- };
1651
- var x = typeof Buffer == "function" && Buffer.from;
1652
- var A = x ? w : F;
1653
- function v() {
1654
- this.encoding = "utf-8";
1655
- }
1656
- v.prototype.encode = function(r, e) {
1657
- return p(e && e.stream, "encode", "stream"), A(r);
1658
- };
1659
- function U(r) {
1660
- var e;
1661
- try {
1662
- var f = new Blob([r], { type: "text/plain;charset=UTF-8" });
1663
- e = URL.createObjectURL(f);
1664
- var n = new XMLHttpRequest();
1665
- return n.open("GET", e, false), n.send(), n.responseText;
1666
- } finally {
1667
- e && URL.revokeObjectURL(e);
1668
- }
1669
- }
1670
- var O = !x && typeof Blob == "function" && typeof URL == "function" && typeof URL.createObjectURL == "function", S = ["utf-8", "utf8", "unicode-1-1-utf-8"], T = h;
1671
- x ? T = B : O && (T = function(r) {
1672
- try {
1673
- return U(r);
1674
- } catch (e) {
1675
- return h(r);
1676
- }
1677
- });
1678
- var y = "construct 'TextDecoder'", E = "".concat(u, " ").concat(y, ": the ");
1679
- function g(r, e) {
1680
- p(e && e.fatal, y, "fatal"), r = r || "utf-8";
1681
- var f;
1682
- if (x ? f = Buffer.isEncoding(r) : f = S.indexOf(r.toLowerCase()) !== -1, !f)
1683
- throw new RangeError("".concat(E, " encoding label provided ('").concat(r, "') is invalid."));
1684
- this.encoding = r, this.fatal = false, this.ignoreBOM = false;
1685
- }
1686
- g.prototype.decode = function(r, e) {
1687
- p(e && e.stream, "decode", "stream");
1688
- var f;
1689
- return r instanceof Uint8Array ? f = r : r.buffer instanceof ArrayBuffer ? f = new Uint8Array(r.buffer) : f = new Uint8Array(r), T(f, this.encoding);
1690
- };
1691
- scope.TextEncoder = scope.TextEncoder || v;
1692
- scope.TextDecoder = scope.TextDecoder || g;
1693
- })(typeof window !== "undefined" ? window : typeof commonjsGlobal !== "undefined" ? commonjsGlobal : commonjsGlobal);
1694
- const FastTextEncoding = /* @__PURE__ */ _mergeNamespaces$1({
1695
- __proto__: null,
1696
- default: text_min
1697
- }, [text_min]);
1698
- (_a = console.assert) == null ? void 0 : _a.call(console, FastTextEncoding);
1699
- function listen(type, callback) {
1700
- const handler = (e) => {
1701
- var _a2, _b;
1702
- if (type.includes((_a2 = e.data) == null ? void 0 : _a2.type)) {
1703
- callback((_b = e.data) == null ? void 0 : _b.data);
1704
- }
1705
- };
1706
- window.addEventListener("message", handler, false);
1707
- return {
1708
- unsubscribe() {
1709
- window.removeEventListener("message", handler);
1710
- }
1711
- };
1712
- }
1713
- function sendAndRecieve({
1714
- message,
1715
- recievingMessage,
1716
- data,
1717
- attempts = 1,
1718
- timeout = 300
1719
- }) {
1720
- let cancelled = false;
1721
- const makeAttempt = () => new Promise((resolve, reject) => {
1722
- const listener = listen(recievingMessage, handler);
1723
- window.postMessage({ type: message, data }, window.origin);
1724
- const timer = setTimeout(expire, timeout);
1725
- function handler(data2) {
1726
- clearTimeout(timer);
1727
- removeEventListener();
1728
- resolve(data2);
1729
- }
1730
- function removeEventListener() {
1731
- listener.unsubscribe();
1732
- }
1733
- function expire() {
1734
- removeEventListener();
1735
- reject();
1736
- }
1737
- });
1738
- const getData = async () => {
1739
- for (let i = 0; i < attempts; i++) {
1740
- if (cancelled) {
1741
- return new Promise(() => {
1742
- });
1743
- }
1744
- try {
1745
- const result = await makeAttempt();
1746
- return result;
1747
- } catch (e) {
1748
- continue;
1749
- }
1750
- }
1751
- if (!cancelled) {
1752
- throw `Didn't recieve ${recievingMessage.join(" or ")} in time.`;
1753
- }
1754
- return new Promise(() => {
1755
- });
1756
- };
1757
- return {
1758
- cancel() {
1759
- cancelled = true;
1760
- },
1761
- promise: getData()
1762
- };
1763
- }
1764
- function Handshaker() {
1765
- let cancelLast = void 0;
1766
- async function update(data) {
1767
- cancelLast == null ? void 0 : cancelLast();
1768
- const { cancel, promise } = sendAndRecieve({
1769
- message: "TOLGEE_READY",
1770
- recievingMessage: ["TOLGEE_PLUGIN_READY", "TOLGEE_PLUGIN_UPDATED"],
1771
- data,
1772
- attempts: 4
1773
- });
1774
- cancelLast = cancel;
1775
- return promise;
1776
- }
1777
- return {
1778
- update
1779
- };
1780
- }
1781
- const IN_CONTEXT_FILE = "tolgee-in-context-tools.umd.min.js";
1782
- const IN_CONTEXT_UMD_NAME = "@tolgee/in-context-tools";
1783
- const IN_CONTEXT_EXPORT_NAME = "InContextTools";
1784
- const CDN_URL = "https://cdn.jsdelivr.net/npm";
1785
- function injectScript(src) {
1786
- return new Promise((resolve, reject) => {
1787
- const script = document.createElement("script");
1788
- script.src = src;
1789
- script.addEventListener("load", () => resolve());
1790
- script.addEventListener("error", (e) => reject(e.error));
1791
- document.head.appendChild(script);
1792
- });
1793
- }
1794
- let injectPromise = null;
1795
- function loadInContextLib(version) {
1796
- if (!injectPromise) {
1797
- injectPromise = injectScript(
1798
- `${CDN_URL}/@tolgee/web@${version}/dist/${IN_CONTEXT_FILE}`
1799
- ).then(() => {
1800
- return window[IN_CONTEXT_UMD_NAME][IN_CONTEXT_EXPORT_NAME];
1801
- });
1802
- }
1803
- return injectPromise;
1804
- }
1805
- const API_KEY_LOCAL_STORAGE = "__tolgee_apiKey";
1806
- const API_URL_LOCAL_STORAGE = "__tolgee_apiUrl";
1807
- function getCredentials() {
1808
- const apiKey = sessionStorage.getItem(API_KEY_LOCAL_STORAGE) || void 0;
1809
- const apiUrl = sessionStorage.getItem(API_URL_LOCAL_STORAGE) || void 0;
1810
- if (!apiKey || !apiUrl) {
1811
- return void 0;
1812
- }
1813
- return {
1814
- apiKey,
1815
- apiUrl
1816
- };
1817
- }
1818
- function clearSessionStorage() {
1819
- sessionStorage.removeItem(API_KEY_LOCAL_STORAGE);
1820
- sessionStorage.removeItem(API_URL_LOCAL_STORAGE);
1821
- }
1822
- function onDocumentReady(callback) {
1823
- if (document.readyState !== "loading") {
1824
- Promise.resolve().then(() => {
1825
- callback();
1826
- });
1827
- } else if (document.addEventListener) {
1828
- document.addEventListener("DOMContentLoaded", callback);
1829
- }
1830
- }
1831
- let BrowserExtensionPlugin = () => (tolgee) => tolgee;
1832
- const sessionStorageAvailable = () => {
1833
- if (typeof window === "undefined") {
1834
- return false;
1835
- }
1836
- try {
1837
- return typeof sessionStorage !== "undefined" && sessionStorage;
1838
- } catch (err) {
1839
- console.error("sessionStorage not available", err);
1840
- return false;
1841
- }
1842
- };
1843
- if (sessionStorageAvailable()) {
1844
- BrowserExtensionPlugin = () => (tolgee) => {
1845
- const handshaker = Handshaker();
1846
- const getConfig = () => ({
1847
- // prevent extension downloading ui library
1848
- uiPresent: true,
1849
- uiVersion: void 0,
1850
- // tolgee mode
1851
- mode: tolgee.isDev() ? "development" : "production",
1852
- // pass credentials
1853
- config: {
1854
- apiUrl: tolgee.getInitialOptions().apiUrl || "",
1855
- apiKey: tolgee.getInitialOptions().apiKey || ""
1856
- }
1857
- });
1858
- const getTolgeePlugin = async () => {
1859
- const InContextTools = await loadInContextLib(
1860
- "prerelease"
1861
- );
1862
- return (tolgee2) => {
1863
- const credentials2 = getCredentials();
1864
- tolgee2.addPlugin(InContextTools({ credentials: credentials2 }));
1865
- return tolgee2;
1866
- };
1867
- };
1868
- tolgee.on("running", ({ value: isRunning }) => {
1869
- if (isRunning) {
1870
- onDocumentReady(() => {
1871
- handshaker.update(getConfig()).catch(clearSessionStorage);
1872
- });
1873
- }
1874
- });
1875
- const credentials = getCredentials();
1876
- if (credentials) {
1877
- getTolgeePlugin().then((plugin) => {
1878
- tolgee.addPlugin(plugin);
1879
- }).catch((e) => {
1880
- console.error("Tolgee: Failed to load in-context tools");
1881
- console.error(e);
1882
- });
1883
- }
1884
- return tolgee;
1885
- };
1886
- }
1887
- function Tolgee() {
1888
- return TolgeeCore().use(BrowserExtensionPlugin());
1889
- }
1890
- const DevTools = () => (tolgee) => tolgee;
1891
- let ProviderInstance;
1892
- const getProviderInstance = () => {
1893
- if (!ProviderInstance) {
1894
- ProviderInstance = React.createContext(void 0);
1895
- }
1896
- return ProviderInstance;
1897
- };
1898
- let globalContext;
1899
- function getGlobalContext() {
1900
- return globalContext;
1901
- }
1902
- const useTolgeeContext = () => {
1903
- const TolgeeProviderContext = getProviderInstance();
1904
- const context = useContext(TolgeeProviderContext) || getGlobalContext();
1905
- if (!context) {
1906
- throw new Error("Couldn't find tolgee instance, did you forgot to use `TolgeeProvider`?");
1907
- }
1908
- return context;
1909
- };
1910
- const useRerender = () => {
1911
- const [instance, setCounter] = useState(0);
1912
- const rerender = useCallback(() => {
1913
- setCounter((num) => num + 1);
1914
- }, [setCounter]);
1915
- return { instance, rerender };
1916
- };
1917
- const useTolgee = (events) => {
1918
- const { tolgee } = useTolgeeContext();
1919
- useRerender();
1920
- useEffect(() => {
1921
- return () => {
1922
- };
1923
- }, [void 0]);
1924
- return tolgee;
1925
- };
1926
- function l() {
1927
- const e = process.env.NEXT_PUBLIC_TOLGEE_API_KEY, o = process.env.NEXT_PUBLIC_TOLGEE_API_URL;
1928
- return Tolgee().use(FormatSimple()).use(DevTools()).updateDefaults({
1929
- apiKey: e,
1930
- apiUrl: o
1931
- });
1932
- }
1933
- l().init();
1934
10
  const LinkBar = ({
1935
11
  href,
1936
12
  isOldProject,
@@ -1948,8 +24,7 @@ const LinkBar = ({
1948
24
  const searchParams = useSearchParams();
1949
25
  const [, startTransition] = useTransition();
1950
26
  const { start } = useProgressBar();
1951
- const { getLanguage } = useTolgee();
1952
- const locale = getLanguage() || "";
27
+ const locale = useLocale();
1953
28
  const isExternalLink = (url) => {
1954
29
  if (baseUrl.includes(".ichatgo.ai") && target !== "_blank" || url.includes(".ichatgo.ai")) return false;
1955
30
  if (baseUrl === "" && !/^(https?:\/\/|\/\/)/.test(url)) return false;