@tolgee/core 5.10.2 → 5.11.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.
Files changed (37) hide show
  1. package/dist/tolgee.cjs.js +24 -12
  2. package/dist/tolgee.cjs.js.map +1 -1
  3. package/dist/tolgee.cjs.min.js +1 -1
  4. package/dist/tolgee.cjs.min.js.map +1 -1
  5. package/dist/tolgee.esm.js +24 -12
  6. package/dist/tolgee.esm.js.map +1 -1
  7. package/dist/tolgee.esm.min.js +1 -1
  8. package/dist/tolgee.esm.min.js.map +1 -1
  9. package/dist/tolgee.esm.min.mjs +1 -1
  10. package/dist/tolgee.esm.min.mjs.map +1 -1
  11. package/dist/tolgee.esm.mjs +24 -12
  12. package/dist/tolgee.esm.mjs.map +1 -1
  13. package/dist/tolgee.umd.js +24 -12
  14. package/dist/tolgee.umd.js.map +1 -1
  15. package/dist/tolgee.umd.min.js +1 -1
  16. package/dist/tolgee.umd.min.js.map +1 -1
  17. package/lib/Controller/Cache/Cache.d.ts +2 -2
  18. package/lib/Controller/Controller.d.ts +5 -3
  19. package/lib/Controller/Events/Events.d.ts +2 -1
  20. package/lib/Controller/Plugins/Plugins.d.ts +4 -4
  21. package/lib/Controller/State/State.d.ts +1 -0
  22. package/lib/Controller/State/initState.d.ts +5 -1
  23. package/lib/Controller/State/observerOptions.d.ts +4 -0
  24. package/lib/TolgeeCore.d.ts +2 -3
  25. package/lib/types/events.d.ts +10 -1
  26. package/lib/types/general.d.ts +1 -0
  27. package/lib/types/plugin.d.ts +12 -5
  28. package/package.json +2 -2
  29. package/src/Controller/Cache/Cache.ts +3 -4
  30. package/src/Controller/Controller.ts +10 -1
  31. package/src/Controller/Events/Events.ts +8 -1
  32. package/src/Controller/Plugins/Plugins.ts +22 -7
  33. package/src/Controller/State/initState.ts +7 -0
  34. package/src/Controller/State/observerOptions.ts +6 -0
  35. package/src/types/events.ts +17 -1
  36. package/src/types/general.ts +5 -0
  37. package/src/types/plugin.ts +17 -3
@@ -1,8 +1,8 @@
1
- import { CacheDescriptor, CacheDescriptorInternal, CacheDescriptorWithKey, NsFallback, TranslationsFlat, TranslationValue, TreeTranslationsData, BackendGetRecord, BackendGetDevRecord } from '../../types';
1
+ import { CacheDescriptor, CacheDescriptorInternal, CacheDescriptorWithKey, NsFallback, TranslationsFlat, TranslationValue, TreeTranslationsData, BackendGetRecordInternal } from '../../types';
2
2
  import { EventEmitterInstance } from '../Events/EventEmitter';
3
3
  import { TolgeeStaticData } from '../State/initState';
4
4
  import { ValueObserverInstance } from '../ValueObserver';
5
- export declare function Cache(onCacheChange: EventEmitterInstance<CacheDescriptorWithKey>, backendGetRecord: BackendGetRecord, backendGetDevRecord: BackendGetDevRecord, withDefaultNs: (descriptor: CacheDescriptor) => CacheDescriptorInternal, isInitialLoading: () => boolean, fetchingObserver: ValueObserverInstance<boolean>, loadingObserver: ValueObserverInstance<boolean>): Readonly<{
5
+ export declare function Cache(onCacheChange: EventEmitterInstance<CacheDescriptorWithKey>, backendGetRecord: BackendGetRecordInternal, backendGetDevRecord: BackendGetRecordInternal, withDefaultNs: (descriptor: CacheDescriptor) => CacheDescriptorInternal, isInitialLoading: () => boolean, fetchingObserver: ValueObserverInstance<boolean>, loadingObserver: ValueObserverInstance<boolean>): Readonly<{
6
6
  addStaticData(data: TolgeeStaticData | undefined): void;
7
7
  invalidate(): void;
8
8
  addRecord(descriptor: CacheDescriptorInternal, data: TreeTranslationsData): void;
@@ -1,4 +1,4 @@
1
- import { CacheDescriptor, NsFallback, TolgeeOptions, TFnType, KeyAndNamespacesInternal } from '../types';
1
+ import { CacheDescriptor, NsFallback, TolgeeOptions, TFnType, KeyAndNamespacesInternal, TranslationDescriptor } from '../types';
2
2
  declare type StateServiceProps = {
3
3
  options?: Partial<TolgeeOptions>;
4
4
  };
@@ -36,8 +36,8 @@ export declare function Controller({ options }: StateServiceProps): Readonly<{
36
36
  getInitialLanguage: () => string | Promise<string | undefined> | Promise<string | Promise<string | undefined> | undefined> | undefined;
37
37
  setStoredLanguage: (language: string) => void;
38
38
  getDevBackend: () => import("../types").BackendDevMiddleware | undefined;
39
- getBackendRecord: import("../types").BackendGetRecord;
40
- getBackendDevRecord: import("../types").BackendGetRecord;
39
+ getBackendRecord: import("../types").BackendGetRecordInternal;
40
+ getBackendDevRecord: import("../types").BackendGetRecordInternal;
41
41
  getLanguageDetector: () => import("../types").LanguageDetectorMiddleware | undefined;
42
42
  retranslate: () => void;
43
43
  highlight: import("../types").HighlightInterface;
@@ -76,6 +76,7 @@ export declare function Controller({ options }: StateServiceProps): Readonly<{
76
76
  observerType: "invisible" | "text";
77
77
  observerOptions: import("./State/observerOptions").ObserverOptionsInternal;
78
78
  onFormatError: import("../types").OnFormatError;
79
+ fetch: import("../types").FetchFn;
79
80
  };
80
81
  removeActiveNs: (ns: NsFallback) => void;
81
82
  getRequiredNamespaces: () => string[];
@@ -93,6 +94,7 @@ export declare function Controller({ options }: StateServiceProps): Readonly<{
93
94
  onRunningChange: import("./Events/EventEmitter").EventEmitterInstance<boolean>;
94
95
  onCacheChange: import("./Events/EventEmitter").EventEmitterInstance<import("../types").CacheDescriptorWithKey>;
95
96
  onUpdate: import("./Events/EventEmitterSelective").EventEmitterSelectiveInstance;
97
+ onPermanentChange: import("./Events/EventEmitter").EventEmitterInstance<TranslationDescriptor>;
96
98
  setEmitterActive: (active: boolean) => void;
97
99
  on: import("../types").TolgeeOn<keyof import("../types").EventType>;
98
100
  }>;
@@ -1,4 +1,4 @@
1
- import { CacheDescriptorWithKey, TolgeeOn } from '../../types';
1
+ import { CacheDescriptorWithKey, TolgeeOn, TranslationDescriptor } from '../../types';
2
2
  export declare function Events(getFallbackNs: () => string[], getDefaultNs: () => string): Readonly<{
3
3
  onPendingLanguageChange: import("./EventEmitter").EventEmitterInstance<string>;
4
4
  onLanguageChange: import("./EventEmitter").EventEmitterInstance<string>;
@@ -8,6 +8,7 @@ export declare function Events(getFallbackNs: () => string[], getDefaultNs: () =
8
8
  onRunningChange: import("./EventEmitter").EventEmitterInstance<boolean>;
9
9
  onCacheChange: import("./EventEmitter").EventEmitterInstance<CacheDescriptorWithKey>;
10
10
  onUpdate: import("./EventEmitterSelective").EventEmitterSelectiveInstance;
11
+ onPermanentChange: import("./EventEmitter").EventEmitterInstance<TranslationDescriptor>;
11
12
  setEmitterActive(active: boolean): void;
12
13
  on: TolgeeOn<keyof import("../../types").EventType>;
13
14
  }>;
@@ -1,5 +1,5 @@
1
- import { BackendDevMiddleware, BackendGetRecord, TranslatePropsInternal, HighlightInterface, LanguageDetectorMiddleware, LanguageStorageMiddleware, ChangeTranslationInterface, WrapperWrapProps, Unwrapped, KeyAndNamespacesInternal, TolgeePlugin, TolgeeInstance, TolgeeOptionsInternal } from '../../types';
2
- export declare function Plugins(getLanguage: () => string | undefined, getInitialOptions: () => TolgeeOptionsInternal, getAvailableLanguages: () => string[] | undefined, getTranslationNs: (props: KeyAndNamespacesInternal) => string[], getTranslation: (props: KeyAndNamespacesInternal) => string | undefined, changeTranslation: ChangeTranslationInterface): Readonly<{
1
+ import { BackendDevMiddleware, TranslatePropsInternal, HighlightInterface, LanguageDetectorMiddleware, LanguageStorageMiddleware, ChangeTranslationInterface, WrapperWrapProps, Unwrapped, KeyAndNamespacesInternal, TolgeePlugin, TolgeeInstance, TolgeeOptionsInternal, BackendGetRecordInternal, TranslationDescriptor } from '../../types';
2
+ export declare function Plugins(getLanguage: () => string | undefined, getInitialOptions: () => TolgeeOptionsInternal, getAvailableLanguages: () => string[] | undefined, getTranslationNs: (props: KeyAndNamespacesInternal) => string[], getTranslation: (props: KeyAndNamespacesInternal) => string | undefined, changeTranslation: ChangeTranslationInterface, onPermanentChange: (props: TranslationDescriptor) => void): Readonly<{
3
3
  addPlugin: (tolgeeInstance: TolgeeInstance, plugin: TolgeePlugin) => void;
4
4
  run(): void;
5
5
  stop(): void;
@@ -7,8 +7,8 @@ export declare function Plugins(getLanguage: () => string | undefined, getInitia
7
7
  getInitialLanguage(): string | Promise<string | undefined> | Promise<string | Promise<string | undefined> | undefined> | undefined;
8
8
  setStoredLanguage(language: string): void;
9
9
  getDevBackend(): BackendDevMiddleware | undefined;
10
- getBackendRecord: BackendGetRecord;
11
- getBackendDevRecord: BackendGetRecord;
10
+ getBackendRecord: BackendGetRecordInternal;
11
+ getBackendDevRecord: BackendGetRecordInternal;
12
12
  getLanguageDetector(): LanguageDetectorMiddleware | undefined;
13
13
  retranslate(): void;
14
14
  highlight: HighlightInterface;
@@ -26,6 +26,7 @@ export declare function State(onLanguageChange: EventEmitterInstance<string>, on
26
26
  observerType: "invisible" | "text";
27
27
  observerOptions: import("./observerOptions").ObserverOptionsInternal;
28
28
  onFormatError: import("../../types").OnFormatError;
29
+ fetch: import("../../types").FetchFn;
29
30
  };
30
31
  addActiveNs(ns: NsFallback): void;
31
32
  removeActiveNs(ns: NsFallback): void;
@@ -1,4 +1,4 @@
1
- import { FallbackGeneral, FallbackLanguageOption, TreeTranslationsData, OnFormatError } from '../../types';
1
+ import { FallbackGeneral, FallbackLanguageOption, TreeTranslationsData, OnFormatError, FetchFn } from '../../types';
2
2
  import { ObserverOptions, ObserverOptionsInternal } from './observerOptions';
3
3
  export declare const DEFAULT_FORMAT_ERROR = "invalid";
4
4
  export declare const DEFAULT_API_URL = "https://app.tolgee.io";
@@ -71,6 +71,10 @@ export declare type TolgeeOptionsInternal = {
71
71
  * Define what to display in case of formatting error. (Default: 'invalid')
72
72
  */
73
73
  onFormatError: OnFormatError;
74
+ /**
75
+ * Define custom fetch function, used for fetching the translations
76
+ */
77
+ fetch: FetchFn;
74
78
  };
75
79
  export declare type TolgeeOptions = Partial<Omit<TolgeeOptionsInternal, 'observerOptions'>> & {
76
80
  observerOptions?: ObserverOptions;
@@ -35,6 +35,10 @@ export declare type ObserverOptionsInternal = {
35
35
  * Html elements which will pass click listener to their parent (default: ['option', 'optgroup'])
36
36
  */
37
37
  passToParent: (keyof HTMLElementTagNameMap)[] | ((node: Element) => boolean);
38
+ /**
39
+ * Encodes full key info into the invisble characters (default: false)
40
+ */
41
+ fullKeyEncode: boolean;
38
42
  };
39
43
  export declare type ObserverOptions = Partial<ObserverOptionsInternal>;
40
44
  export declare type ModifierKey = 'Alt' | 'Control' | 'Shift' | 'Meta';
@@ -134,9 +134,7 @@ declare function createTolgee(options: TolgeeOptions): Readonly<{
134
134
  language?: string | undefined;
135
135
  defaultLanguage?: string | undefined;
136
136
  availableLanguages?: string[] | undefined;
137
- fallbackLanguage?: import("./types").FallbackLanguageOption; /**
138
- * Turn off/on events emitting. Is on by default.
139
- */
137
+ fallbackLanguage?: import("./types").FallbackLanguageOption;
140
138
  ns?: string[] | undefined;
141
139
  fallbackNs?: import("./types").FallbackGeneral;
142
140
  defaultNs: string;
@@ -144,6 +142,7 @@ declare function createTolgee(options: TolgeeOptions): Readonly<{
144
142
  observerType: "invisible" | "text";
145
143
  observerOptions: import("./types").ObserverOptionsInternal;
146
144
  onFormatError: import("./types").OnFormatError;
145
+ fetch: import("./types").FetchFn;
147
146
  };
148
147
  /**
149
148
  * Tolgee is in dev mode if `DevTools` plugin is used and `apiKey` + `apiUrl` are specified.
@@ -17,7 +17,7 @@ export declare type ListenerEvent<T> = {
17
17
  value: T;
18
18
  };
19
19
  export declare type Listener<T> = (e: ListenerEvent<T>) => void;
20
- export declare type TolgeeEvent = 'language' | 'pendingLanguage' | 'loading' | 'fetching' | 'initialLoad' | 'running' | 'cache' | 'update';
20
+ export declare type TolgeeEvent = 'language' | 'pendingLanguage' | 'loading' | 'fetching' | 'initialLoad' | 'running' | 'cache' | 'update' | 'permanentChange';
21
21
  export interface EventType {
22
22
  language: string;
23
23
  pendingLanguage: string;
@@ -27,6 +27,7 @@ export interface EventType {
27
27
  running: boolean;
28
28
  cache: CacheDescriptorWithKey;
29
29
  update: void;
30
+ permanentChange: CacheDescriptorWithKey;
30
31
  }
31
32
  export declare type TolgeeOn<E extends keyof EventType = keyof EventType> = {
32
33
  /**
@@ -62,5 +63,13 @@ export declare type TolgeeOn<E extends keyof EventType = keyof EventType> = {
62
63
  * Emitted when cache changes.
63
64
  */
64
65
  (event: 'cache', handler: Listener<CacheDescriptorWithKey>): Subscription;
66
+ /**
67
+ * Translation was changed or created via dev tools
68
+ */
69
+ (event: 'permanentChange', handler: Listener<CacheDescriptorWithKey>): Subscription;
65
70
  (event: E, handler: unknown): Subscription;
66
71
  };
72
+ export declare type TranslationDescriptor = {
73
+ key: string;
74
+ namespace: string | undefined;
75
+ };
@@ -32,4 +32,5 @@ export declare type TFnType<T = DefaultParamType, R = string, K extends string =
32
32
  (props: TranslateProps<T, K>): R;
33
33
  };
34
34
  export declare type KeyAndNamespacesInternal = Pick<TranslatePropsInternal, 'key' | 'ns' | 'language'>;
35
+ export declare type FetchFn = (input: string | URL, init?: RequestInit | undefined) => Promise<Response>;
35
36
  export {};
@@ -1,21 +1,26 @@
1
1
  import { ChangeTranslationInterface, TreeTranslationsData } from './cache';
2
- import { NsFallback, NsType, TranslateParams, TranslatePropsInternal } from './general';
2
+ import { FetchFn, NsFallback, NsType, TranslateParams, TranslatePropsInternal } from './general';
3
3
  import type { ObserverOptionsInternal } from '../Controller/State/observerOptions';
4
4
  import { TolgeeInstance } from '../TolgeeCore';
5
+ import { TranslationDescriptor } from './events';
5
6
  export declare type BackendDevProps = {
6
7
  apiUrl?: string;
7
8
  apiKey?: string;
8
9
  projectId?: number | string;
9
10
  };
11
+ export declare type CommonProps = {
12
+ fetch: FetchFn;
13
+ };
10
14
  export declare type BackendGetRecordProps = {
11
15
  language: string;
12
16
  namespace?: string;
13
17
  };
14
- export declare type BackendGetRecord = (data: BackendGetRecordProps) => Promise<TreeTranslationsData | undefined> | undefined;
18
+ export declare type BackendGetRecord = (data: BackendGetRecordProps & CommonProps) => Promise<TreeTranslationsData | undefined> | undefined;
15
19
  export interface BackendMiddleware {
16
20
  getRecord: BackendGetRecord;
17
21
  }
18
- export declare type BackendGetDevRecord = (data: BackendGetRecordProps & BackendDevProps) => Promise<TreeTranslationsData | undefined> | undefined;
22
+ export declare type BackendGetDevRecord = (data: BackendGetRecordProps & CommonProps & BackendDevProps) => Promise<TreeTranslationsData | undefined> | undefined;
23
+ export declare type BackendGetRecordInternal = (data: BackendGetRecordProps & BackendDevProps) => Promise<TreeTranslationsData | undefined> | undefined;
19
24
  export declare type BackendDevMiddleware = {
20
25
  getRecord: BackendGetDevRecord;
21
26
  };
@@ -56,13 +61,14 @@ export declare type ObserverMiddleware = () => {
56
61
  };
57
62
  export declare type LanguageDetectorProps = {
58
63
  availableLanguages: string[];
64
+ fetch: FetchFn;
59
65
  };
60
66
  export declare type LanguageDetectorMiddleware = {
61
67
  getLanguage: (props: LanguageDetectorProps) => string | undefined | Promise<string | undefined>;
62
68
  };
63
69
  export declare type LanguageStorageMiddleware = {
64
- getLanguage: () => string | undefined | Promise<string | undefined>;
65
- setLanguage: (language: string) => void | Promise<void>;
70
+ getLanguage: (props: CommonProps) => string | undefined | Promise<string | undefined>;
71
+ setLanguage: (language: string, props: CommonProps) => void | Promise<void>;
66
72
  };
67
73
  export declare type DevCredentials = undefined | {
68
74
  apiUrl?: string;
@@ -110,6 +116,7 @@ export declare type UiProps = {
110
116
  highlight: HighlightInterface;
111
117
  findPositions: (key?: string | undefined, ns?: NsFallback) => KeyPosition[];
112
118
  changeTranslation: ChangeTranslationInterface;
119
+ onPermanentChange: (props: TranslationDescriptor) => void;
113
120
  };
114
121
  export declare type UiKeyOption = {
115
122
  key: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tolgee/core",
3
- "version": "5.10.2",
3
+ "version": "5.11.0",
4
4
  "description": "Library providing ability to translate messages directly in context of developed application.",
5
5
  "main": "./dist/tolgee.cjs.js",
6
6
  "module": "./dist/tolgee.esm.js",
@@ -68,5 +68,5 @@
68
68
  "access": "public"
69
69
  },
70
70
  "sideEffects": false,
71
- "gitHead": "38d4c0acf8a1bb14976fac3b9391afde580ee261"
71
+ "gitHead": "66aec0547ab6d28c0be0958f0dede3e4fde230fa"
72
72
  }
@@ -6,8 +6,7 @@ import {
6
6
  TranslationsFlat,
7
7
  TranslationValue,
8
8
  TreeTranslationsData,
9
- BackendGetRecord,
10
- BackendGetDevRecord,
9
+ BackendGetRecordInternal,
11
10
  } from '../../types';
12
11
  import { getFallbackArray, unique } from '../../helpers';
13
12
  import { EventEmitterInstance } from '../Events/EventEmitter';
@@ -30,8 +29,8 @@ type StateCache = Map<string, CacheRecord>;
30
29
 
31
30
  export function Cache(
32
31
  onCacheChange: EventEmitterInstance<CacheDescriptorWithKey>,
33
- backendGetRecord: BackendGetRecord,
34
- backendGetDevRecord: BackendGetDevRecord,
32
+ backendGetRecord: BackendGetRecordInternal,
33
+ backendGetDevRecord: BackendGetRecordInternal,
35
34
  withDefaultNs: (descriptor: CacheDescriptor) => CacheDescriptorInternal,
36
35
  isInitialLoading: () => boolean,
37
36
  fetchingObserver: ValueObserverInstance<boolean>,
@@ -6,6 +6,7 @@ import {
6
6
  TFnType,
7
7
  NsType,
8
8
  KeyAndNamespacesInternal,
9
+ TranslationDescriptor,
9
10
  } from '../types';
10
11
  import { Cache } from './Cache/Cache';
11
12
  import { getFallbackArray } from '../helpers';
@@ -44,7 +45,8 @@ export function Controller({ options }: StateServiceProps) {
44
45
  state.getAvailableLanguages,
45
46
  getTranslationNs,
46
47
  getTranslation,
47
- changeTranslation
48
+ changeTranslation,
49
+ onPermanentChange
48
50
  );
49
51
 
50
52
  const cache = Cache(
@@ -105,6 +107,13 @@ export function Controller({ options }: StateServiceProps) {
105
107
  };
106
108
  }
107
109
 
110
+ function onPermanentChange(props: TranslationDescriptor) {
111
+ events.onPermanentChange.emit({
112
+ key: props.key,
113
+ namespace: props.namespace,
114
+ });
115
+ }
116
+
108
117
  function init(options: Partial<TolgeeOptions>) {
109
118
  state.init(options);
110
119
  cache.addStaticData(state.getInitialOptions().staticData);
@@ -1,6 +1,10 @@
1
1
  import { EventEmitter } from './EventEmitter';
2
2
  import { EventEmitterSelective } from './EventEmitterSelective';
3
- import { CacheDescriptorWithKey, TolgeeOn } from '../../types';
3
+ import {
4
+ CacheDescriptorWithKey,
5
+ TolgeeOn,
6
+ TranslationDescriptor,
7
+ } from '../../types';
4
8
 
5
9
  export function Events(
6
10
  getFallbackNs: () => string[],
@@ -21,6 +25,7 @@ export function Events(
21
25
  onRunningChange: EventEmitter<boolean>(isActive),
22
26
  onCacheChange: EventEmitter<CacheDescriptorWithKey>(isActive),
23
27
  onUpdate: EventEmitterSelective(isActive, getFallbackNs, getDefaultNs),
28
+ onPermanentChange: EventEmitter<TranslationDescriptor>(isActive),
24
29
  setEmitterActive(active: boolean) {
25
30
  emitterActive = active;
26
31
  },
@@ -42,6 +47,8 @@ export function Events(
42
47
  return self.onCacheChange.listen(handler as any);
43
48
  case 'update':
44
49
  return self.onUpdate.listen(handler as any);
50
+ case 'permanentChange':
51
+ return self.onPermanentChange.listen(handler as any);
45
52
  }
46
53
  }) as TolgeeOn,
47
54
  });
@@ -1,7 +1,6 @@
1
1
  import { getErrorMessage, isPromise, valueOrPromise } from '../../helpers';
2
2
  import {
3
3
  BackendDevMiddleware,
4
- BackendGetRecord,
5
4
  BackendMiddleware,
6
5
  FormatterMiddleware,
7
6
  ObserverMiddleware,
@@ -22,6 +21,8 @@ import {
22
21
  TolgeeOptionsInternal,
23
22
  FormatErrorHandler,
24
23
  FindPositionsInterface,
24
+ BackendGetRecordInternal,
25
+ TranslationDescriptor,
25
26
  } from '../../types';
26
27
  import { DEFAULT_FORMAT_ERROR } from '../State/initState';
27
28
 
@@ -31,7 +32,8 @@ export function Plugins(
31
32
  getAvailableLanguages: () => string[] | undefined,
32
33
  getTranslationNs: (props: KeyAndNamespacesInternal) => string[],
33
34
  getTranslation: (props: KeyAndNamespacesInternal) => string | undefined,
34
- changeTranslation: ChangeTranslationInterface
35
+ changeTranslation: ChangeTranslationInterface,
36
+ onPermanentChange: (props: TranslationDescriptor) => void
35
37
  ) {
36
38
  const plugins = {
37
39
  ui: undefined as UiMiddleware | undefined,
@@ -81,6 +83,10 @@ export function Plugins(
81
83
  });
82
84
  }
83
85
 
86
+ function getCommonProps() {
87
+ return { fetch: getInitialOptions().fetch };
88
+ }
89
+
84
90
  function setObserver(observer: ObserverMiddleware | undefined) {
85
91
  instances.observer = observer?.();
86
92
  }
@@ -126,6 +132,7 @@ export function Plugins(
126
132
 
127
133
  return instances.languageDetector.getLanguage({
128
134
  availableLanguages,
135
+ ...getCommonProps(),
129
136
  });
130
137
  }
131
138
 
@@ -168,6 +175,7 @@ export function Plugins(
168
175
  highlight: self.highlight,
169
176
  changeTranslation,
170
177
  findPositions,
178
+ onPermanentChange,
171
179
  });
172
180
 
173
181
  instances.observer?.run({
@@ -189,7 +197,9 @@ export function Plugins(
189
197
 
190
198
  getInitialLanguage() {
191
199
  const availableLanguages = getAvailableLanguages();
192
- const languageOrPromise = instances.languageStorage?.getLanguage();
200
+ const languageOrPromise = instances.languageStorage?.getLanguage(
201
+ getCommonProps()
202
+ );
193
203
 
194
204
  return valueOrPromise(languageOrPromise, (language) => {
195
205
  if (
@@ -203,7 +213,7 @@ export function Plugins(
203
213
  },
204
214
 
205
215
  setStoredLanguage(language: string) {
206
- instances.languageStorage?.setLanguage(language);
216
+ instances.languageStorage?.setLanguage(language, getCommonProps());
207
217
  },
208
218
 
209
219
  getDevBackend() {
@@ -212,7 +222,11 @@ export function Plugins(
212
222
 
213
223
  getBackendRecord: (({ language, namespace }) => {
214
224
  for (const backend of instances.backends) {
215
- const data = backend.getRecord({ language, namespace });
225
+ const data = backend.getRecord({
226
+ language,
227
+ namespace,
228
+ ...getCommonProps(),
229
+ });
216
230
  if (isPromise(data)) {
217
231
  return data?.catch((e) => {
218
232
  // eslint-disable-next-line no-console
@@ -225,7 +239,7 @@ export function Plugins(
225
239
  }
226
240
  }
227
241
  return undefined;
228
- }) as BackendGetRecord,
242
+ }) as BackendGetRecordInternal,
229
243
 
230
244
  getBackendDevRecord: (({ language, namespace }) => {
231
245
  const { apiKey, apiUrl, projectId } = getInitialOptions();
@@ -235,8 +249,9 @@ export function Plugins(
235
249
  projectId,
236
250
  language,
237
251
  namespace,
252
+ ...getCommonProps(),
238
253
  });
239
- }) as BackendGetRecord,
254
+ }) as BackendGetRecordInternal,
240
255
 
241
256
  getLanguageDetector() {
242
257
  return instances.languageDetector;
@@ -3,6 +3,7 @@ import {
3
3
  FallbackLanguageOption,
4
4
  TreeTranslationsData,
5
5
  OnFormatError,
6
+ FetchFn,
6
7
  } from '../../types';
7
8
  import { sanitizeUrl } from '../../helpers';
8
9
  import {
@@ -97,6 +98,11 @@ export type TolgeeOptionsInternal = {
97
98
  * Define what to display in case of formatting error. (Default: 'invalid')
98
99
  */
99
100
  onFormatError: OnFormatError;
101
+
102
+ /**
103
+ * Define custom fetch function, used for fetching the translations
104
+ */
105
+ fetch: FetchFn;
100
106
  };
101
107
 
102
108
  export type TolgeeOptions = Partial<
@@ -120,6 +126,7 @@ const defaultValues: TolgeeOptionsInternal = {
120
126
  observerType: 'invisible',
121
127
  onFormatError: DEFAULT_FORMAT_ERROR,
122
128
  apiUrl: DEFAULT_API_URL,
129
+ fetch: (input, options) => fetch(input, options),
123
130
  };
124
131
 
125
132
  export const combineOptions = <T extends TolgeeOptions>(
@@ -43,6 +43,11 @@ export type ObserverOptionsInternal = {
43
43
  * Html elements which will pass click listener to their parent (default: ['option', 'optgroup'])
44
44
  */
45
45
  passToParent: (keyof HTMLElementTagNameMap)[] | ((node: Element) => boolean);
46
+
47
+ /**
48
+ * Encodes full key info into the invisble characters (default: false)
49
+ */
50
+ fullKeyEncode: boolean;
46
51
  };
47
52
 
48
53
  export type ObserverOptions = Partial<ObserverOptionsInternal>;
@@ -63,4 +68,5 @@ export const defaultObserverOptions: ObserverOptionsInternal = {
63
68
  inputPrefix: '%-%tolgee:',
64
69
  inputSuffix: '%-%',
65
70
  passToParent: ['option', 'optgroup'],
71
+ fullKeyEncode: false,
66
72
  };
@@ -27,7 +27,8 @@ export type TolgeeEvent =
27
27
  | 'initialLoad'
28
28
  | 'running'
29
29
  | 'cache'
30
- | 'update';
30
+ | 'update'
31
+ | 'permanentChange';
31
32
 
32
33
  export interface EventType {
33
34
  language: string;
@@ -38,6 +39,7 @@ export interface EventType {
38
39
  running: boolean;
39
40
  cache: CacheDescriptorWithKey;
40
41
  update: void;
42
+ permanentChange: CacheDescriptorWithKey;
41
43
  }
42
44
 
43
45
  export type TolgeeOn<E extends keyof EventType = keyof EventType> = {
@@ -81,5 +83,19 @@ export type TolgeeOn<E extends keyof EventType = keyof EventType> = {
81
83
  * Emitted when cache changes.
82
84
  */
83
85
  (event: 'cache', handler: Listener<CacheDescriptorWithKey>): Subscription;
86
+
87
+ /**
88
+ * Translation was changed or created via dev tools
89
+ */
90
+ (
91
+ event: 'permanentChange',
92
+ handler: Listener<CacheDescriptorWithKey>
93
+ ): Subscription;
94
+
84
95
  (event: E, handler: unknown): Subscription;
85
96
  };
97
+
98
+ export type TranslationDescriptor = {
99
+ key: string;
100
+ namespace: string | undefined;
101
+ };
@@ -58,3 +58,8 @@ export type KeyAndNamespacesInternal = Pick<
58
58
  TranslatePropsInternal,
59
59
  'key' | 'ns' | 'language'
60
60
  >;
61
+
62
+ export type FetchFn = (
63
+ input: string | URL,
64
+ init?: RequestInit | undefined
65
+ ) => Promise<Response>;
@@ -1,5 +1,6 @@
1
1
  import { ChangeTranslationInterface, TreeTranslationsData } from './cache';
2
2
  import {
3
+ FetchFn,
3
4
  NsFallback,
4
5
  NsType,
5
6
  TranslateParams,
@@ -7,6 +8,7 @@ import {
7
8
  } from './general';
8
9
  import type { ObserverOptionsInternal } from '../Controller/State/observerOptions';
9
10
  import { TolgeeInstance } from '../TolgeeCore';
11
+ import { TranslationDescriptor } from './events';
10
12
 
11
13
  export type BackendDevProps = {
12
14
  apiUrl?: string;
@@ -14,13 +16,17 @@ export type BackendDevProps = {
14
16
  projectId?: number | string;
15
17
  };
16
18
 
19
+ export type CommonProps = {
20
+ fetch: FetchFn;
21
+ };
22
+
17
23
  export type BackendGetRecordProps = {
18
24
  language: string;
19
25
  namespace?: string;
20
26
  };
21
27
 
22
28
  export type BackendGetRecord = (
23
- data: BackendGetRecordProps
29
+ data: BackendGetRecordProps & CommonProps
24
30
  ) => Promise<TreeTranslationsData | undefined> | undefined;
25
31
 
26
32
  export interface BackendMiddleware {
@@ -28,6 +34,10 @@ export interface BackendMiddleware {
28
34
  }
29
35
 
30
36
  export type BackendGetDevRecord = (
37
+ data: BackendGetRecordProps & CommonProps & BackendDevProps
38
+ ) => Promise<TreeTranslationsData | undefined> | undefined;
39
+
40
+ export type BackendGetRecordInternal = (
31
41
  data: BackendGetRecordProps & BackendDevProps
32
42
  ) => Promise<TreeTranslationsData | undefined> | undefined;
33
43
 
@@ -82,6 +92,7 @@ export type ObserverMiddleware = () => {
82
92
 
83
93
  export type LanguageDetectorProps = {
84
94
  availableLanguages: string[];
95
+ fetch: FetchFn;
85
96
  };
86
97
 
87
98
  export type LanguageDetectorMiddleware = {
@@ -91,8 +102,10 @@ export type LanguageDetectorMiddleware = {
91
102
  };
92
103
 
93
104
  export type LanguageStorageMiddleware = {
94
- getLanguage: () => string | undefined | Promise<string | undefined>;
95
- setLanguage: (language: string) => void | Promise<void>;
105
+ getLanguage: (
106
+ props: CommonProps
107
+ ) => string | undefined | Promise<string | undefined>;
108
+ setLanguage: (language: string, props: CommonProps) => void | Promise<void>;
96
109
  };
97
110
 
98
111
  export type DevCredentials =
@@ -150,6 +163,7 @@ export type UiProps = {
150
163
  highlight: HighlightInterface;
151
164
  findPositions: (key?: string | undefined, ns?: NsFallback) => KeyPosition[];
152
165
  changeTranslation: ChangeTranslationInterface;
166
+ onPermanentChange: (props: TranslationDescriptor) => void;
153
167
  };
154
168
 
155
169
  export type UiKeyOption = {