@magic-translate/react 1.17.3 → 1.19.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.
package/README.md CHANGED
@@ -110,6 +110,36 @@ export const Search = () => {
110
110
  `t` returns the original text until the translation has loaded, and the
111
111
  component re-renders once it has.
112
112
 
113
+ ### Variables
114
+
115
+ Wrap values that change, such as names or counts, in `v()`. The text around
116
+ them is translated once as a template, `You have {0} unread messages`, and
117
+ cached, however many different values it is shown with. The values themselves
118
+ are never sent to the API.
119
+
120
+ ```tsx
121
+ import { T, v } from '@magic-translate/react';
122
+
123
+ <T>
124
+ Hello {v(user.name)}, you have {v(count)} unread messages
125
+ </T>;
126
+ ```
127
+
128
+ The placeholders are numbered in order, and a translation can move them to
129
+ wherever the language needs them. `v()` can also hold a React component, such
130
+ as a link.
131
+
132
+ With `t`, use a tagged template. Every `${}` value is treated the same way:
133
+
134
+ ```tsx
135
+ const t = useTranslate();
136
+
137
+ t`You have ${count} unread messages`;
138
+ ```
139
+
140
+ Without `v()`, a value is translated as part of the text, so every different
141
+ value is a new translation.
142
+
113
143
  ### Options per translation
114
144
 
115
145
  Both the component and `t` can override the target language and the formality:
@@ -120,6 +150,17 @@ Both the component and `t` can override the target language and the formality:
120
150
  <input placeholder={t('Your name', { lang: 'fr', formality: 'formal' })} />
121
151
  ```
122
152
 
153
+ An `id` lets you edit one use of a text on its own in the webapp, e.g. to
154
+ translate the same "Save" differently on two buttons. Its edited translation
155
+ stays when the text changes. Ids are unique within your account and at most 128
156
+ characters.
157
+
158
+ ```tsx
159
+ <T id="checkout-save">Save</T>
160
+
161
+ <button title={t('Save', { id: 'checkout-save' })} />
162
+ ```
163
+
123
164
  ### Switching languages
124
165
 
125
166
  `useLanguageSwitcher` reads and changes the current language. Every `<T>`
@@ -1,6 +1,6 @@
1
1
  import React, { PropsWithChildren } from 'react';
2
- import { TranslateOptions } from '@magic-translate/core';
3
- export type TranslateProps = TranslateOptions;
2
+ import { TextOptions } from '@magic-translate/core';
3
+ export type TranslateProps = TextOptions;
4
4
  export declare const Translate: React.FunctionComponent<PropsWithChildren<TranslateProps>>;
5
- export declare const T: React.FunctionComponent<React.PropsWithChildren<TranslateOptions>>;
5
+ export declare const T: React.FunctionComponent<React.PropsWithChildren<TextOptions>>;
6
6
  //# sourceMappingURL=Translate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Translate.d.ts","sourceRoot":"","sources":["../../src/components/Translate.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EACZ,iBAAiB,EAKlB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,gBAAgB,EAAe,MAAM,uBAAuB,CAAC;AAGtE,MAAM,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAuB9C,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAC7C,iBAAiB,CAAC,cAAc,CAAC,CAuFlC,CAAC;AAEF,eAAO,MAAM,CAAC,oEAAY,CAAC"}
1
+ {"version":3,"file":"Translate.d.ts","sourceRoot":"","sources":["../../src/components/Translate.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAEZ,iBAAiB,EAMlB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,WAAW,EAAe,MAAM,uBAAuB,CAAC;AAIjE,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC;AA6CzC,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,iBAAiB,CAC7C,iBAAiB,CAAC,cAAc,CAAC,CAoGlC,CAAC;AAEF,eAAO,MAAM,CAAC,+DAAY,CAAC"}
@@ -1,10 +1,24 @@
1
1
  import parse from 'html-react-parser';
2
- import React, { useCallback, useEffect, useState, useRef, } from 'react';
2
+ import React, { Fragment, useCallback, useEffect, useState, useRef, } from 'react';
3
3
  import { renderToString } from 'react-dom/server';
4
4
  import { libraryName } from '@magic-translate/core';
5
5
  import { useMagicTranslate } from '../hooks/use-magic-translate';
6
+ import { extractVariables, fillPlaceholders, Variable } from './Variable';
7
+ // Values are put back as React nodes, never parsed as HTML, so a value cannot
8
+ // inject markup.
9
+ const renderTranslation = (translation, values) => values.length === 0
10
+ ? parse(translation)
11
+ : parse(translation, {
12
+ replace: (node) => {
13
+ if (node.type !== 'text' || !/\{\d+\}/.test(node.data))
14
+ return;
15
+ return (React.createElement(React.Fragment, null, fillPlaceholders(node.data, values).map((part, i) => (React.createElement(Fragment, { key: i }, part)))));
16
+ },
17
+ });
6
18
  const assertChildIsNotAReactComponent = (child) => {
7
- if ('type' in child && typeof child.type === 'function') {
19
+ if ('type' in child &&
20
+ typeof child.type === 'function' &&
21
+ child.type !== Variable) {
8
22
  let errorMsg = 'React components are not allowed inside `<T>...</T>` components.';
9
23
  if ('displayName' in child.type) {
10
24
  errorMsg += ` The component found inside the T component is ${child.type.displayName}.`;
@@ -12,24 +26,36 @@ const assertChildIsNotAReactComponent = (child) => {
12
26
  throw new Error(errorMsg);
13
27
  }
14
28
  };
15
- export const Translate = ({ children, lang, formality }) => {
29
+ export const Translate = ({ children, lang, formality, id }) => {
16
30
  const { dataLoader, language } = useMagicTranslate();
17
31
  const [translation, setTranslation] = useState(null);
18
32
  const lastRequestId = useRef(0);
19
- // `lang` and `formality` are destructured rather than kept as a rest object
33
+ const { template, values } = extractVariables(children);
34
+ // `lang`, `formality` and `id` are destructured rather than kept as a rest object
20
35
  // so that they can be depended on by value: a rest object is a fresh
21
36
  // reference on every render and would rebuild `translate` each time.
22
37
  const translate = useCallback((toTranslate) => {
23
38
  // make sure that we only ever use the response of the most resent request.
24
39
  const requestId = Math.random();
25
40
  lastRequestId.current = requestId;
26
- dataLoader.load({ text: toTranslate, lang, formality }).then((t) => {
41
+ dataLoader.load({ text: toTranslate, lang, formality, id }).then((t) => {
27
42
  if (lastRequestId.current === requestId) {
28
43
  setTranslation(t);
29
44
  }
30
45
  });
31
- }, [dataLoader, lang, formality]);
46
+ }, [dataLoader, lang, formality, id]);
32
47
  useEffect(() => {
48
+ // The values change without the template changing, so they never cause a
49
+ // new translation.
50
+ if (values.length > 0) {
51
+ React.Children.forEach(children, (child) => {
52
+ if (child && typeof child === 'object') {
53
+ assertChildIsNotAReactComponent(child);
54
+ }
55
+ });
56
+ translate(renderToString(React.createElement(React.Fragment, null, template)));
57
+ return;
58
+ }
33
59
  // single child
34
60
  if (React.Children.count(children) === 0) {
35
61
  return;
@@ -73,8 +99,8 @@ export const Translate = ({ children, lang, formality }) => {
73
99
  }
74
100
  // `language` is not read here, but a language switch has to re-translate
75
101
  // the children, so it stays an explicit trigger.
76
- }, [children, language, translate]);
77
- return React.createElement(React.Fragment, null, translation ? parse(translation) : children);
102
+ }, [children, template, values.length, language, translate]);
103
+ return React.createElement(React.Fragment, null, translation ? renderTranslation(translation, values) : children);
78
104
  };
79
105
  export const T = Translate;
80
106
  //# sourceMappingURL=Translate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Translate.js","sourceRoot":"","sources":["../../src/components/Translate.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Translate.js","sourceRoot":"","sources":["../../src/components/Translate.tsx"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { act, render, waitFor } from '@testing-library/react';
2
2
  import { MagicTranslateProvider } from '../context/MagicTranslateContext';
3
3
  import React, { useState } from 'react';
4
4
  import { T } from './Translate';
5
+ import { v } from './Variable';
5
6
  import { Language } from '@magic-translate/core';
6
7
  const tick = () => new Promise((resolve) => setTimeout(resolve));
7
8
  const ExampleComponent = () => React.createElement(React.Fragment, null, "Some component");
@@ -40,6 +41,20 @@ describe('Translate', () => {
40
41
  // then
41
42
  expect(mockFn).toHaveBeenCalledWith([{ text: 'test', lang: Language.ZH }]);
42
43
  });
44
+ it('should load the same text under different ids separately', async () => {
45
+ // given
46
+ render(React.createElement(Wrapper, null,
47
+ React.createElement(T, null, "Save"),
48
+ React.createElement(T, { id: "checkout" }, "Save")));
49
+ await act(async () => {
50
+ await tick();
51
+ });
52
+ // then
53
+ expect(mockFn).toHaveBeenCalledWith([
54
+ { text: 'Save' },
55
+ { text: 'Save', id: 'checkout' },
56
+ ]);
57
+ });
43
58
  it('should call the loader with multiple contents', async () => {
44
59
  // given
45
60
  render(React.createElement(Wrapper, null,
@@ -190,5 +205,143 @@ describe('Translate', () => {
190
205
  expect(mockFn).toHaveBeenCalledTimes(2);
191
206
  });
192
207
  });
208
+ describe('variables', () => {
209
+ it('should send a template with numbered placeholders', async () => {
210
+ // given
211
+ render(React.createElement(Wrapper, null,
212
+ React.createElement(T, null,
213
+ "You have ",
214
+ v(3),
215
+ " unread messages")));
216
+ await act(async () => {
217
+ await tick();
218
+ });
219
+ // then
220
+ expect(mockFn).toHaveBeenCalledWith([
221
+ { text: 'You have {0} unread messages' },
222
+ ]);
223
+ });
224
+ it('should number the placeholders in order, including inside HTML', async () => {
225
+ // given
226
+ render(React.createElement(Wrapper, null,
227
+ React.createElement(T, null,
228
+ "Hello ",
229
+ React.createElement("b", null, v('Ann')),
230
+ ", you have ",
231
+ v(2),
232
+ " messages")));
233
+ await act(async () => {
234
+ await tick();
235
+ });
236
+ // then
237
+ expect(mockFn).toHaveBeenCalledWith([
238
+ { text: 'Hello <b>{0}</b>, you have {1} messages' },
239
+ ]);
240
+ });
241
+ it('should put the values into the translation', async () => {
242
+ // given
243
+ const { getByTestId } = render(React.createElement(Wrapper, null,
244
+ React.createElement("div", { "data-testid": "wrapper" },
245
+ React.createElement(T, null,
246
+ "Hello ",
247
+ React.createElement("b", null, v('Ann')),
248
+ ", you have ",
249
+ v(2),
250
+ " messages"))));
251
+ await act(async () => {
252
+ await tick();
253
+ });
254
+ // then
255
+ await waitFor(() => expect(getByTestId('wrapper').innerHTML).toBe('Translated: Hello <b>Ann</b>, you have 2 messages'));
256
+ });
257
+ it('should put the values where the translation moved them', async () => {
258
+ // given
259
+ const reorderingLoader = () => (content) => Promise.resolve(content.map(() => '{1} Nachrichten für {0}'));
260
+ const { getByTestId } = render(React.createElement(MagicTranslateProvider, { _loaderFactory: reorderingLoader, language: lang, apiKey: "test-api-key" },
261
+ React.createElement("div", { "data-testid": "wrapper" },
262
+ React.createElement(T, null,
263
+ "Hello ",
264
+ v('Ann'),
265
+ ", you have ",
266
+ v(2),
267
+ " messages"))));
268
+ await act(async () => {
269
+ await tick();
270
+ });
271
+ // then
272
+ await waitFor(() => expect(getByTestId('wrapper').textContent).toBe('2 Nachrichten für Ann'));
273
+ });
274
+ it('should show the values before the translation has loaded', () => {
275
+ // given
276
+ const { getByTestId } = render(React.createElement(Wrapper, null,
277
+ React.createElement("div", { "data-testid": "wrapper" },
278
+ React.createElement(T, null,
279
+ "You have ",
280
+ v(3),
281
+ " unread messages"))));
282
+ // then
283
+ expect(getByTestId('wrapper').textContent).toBe('You have 3 unread messages');
284
+ });
285
+ it('should insert a value as text, not as HTML', async () => {
286
+ // given
287
+ const { getByTestId } = render(React.createElement(Wrapper, null,
288
+ React.createElement("div", { "data-testid": "wrapper" },
289
+ React.createElement(T, null,
290
+ "Hello ",
291
+ v('<img src=x onerror=alert(1)>')))));
292
+ await act(async () => {
293
+ await tick();
294
+ });
295
+ // then
296
+ await waitFor(() => expect(getByTestId('wrapper').textContent).toBe('Translated: Hello <img src=x onerror=alert(1)>'));
297
+ expect(getByTestId('wrapper').querySelector('img')).toBeNull();
298
+ });
299
+ it('should allow a react component as a value', async () => {
300
+ // given
301
+ const { getByTestId } = render(React.createElement(Wrapper, null,
302
+ React.createElement("div", { "data-testid": "wrapper" },
303
+ React.createElement(T, null,
304
+ "See ",
305
+ v(React.createElement(ExampleComponent, null))))));
306
+ await act(async () => {
307
+ await tick();
308
+ });
309
+ // then
310
+ expect(mockFn).toHaveBeenCalledWith([{ text: 'See {0}' }]);
311
+ await waitFor(() => expect(getByTestId('wrapper').textContent).toBe('Translated: See Some component'));
312
+ });
313
+ it('should not translate again when only a value changes', async () => {
314
+ // given
315
+ const Counter = () => {
316
+ const [count, setCount] = useState(1);
317
+ return (React.createElement(React.Fragment, null,
318
+ React.createElement("button", { onClick: () => setCount(count + 1) }, "add"),
319
+ React.createElement("div", { "data-testid": "wrapper" },
320
+ React.createElement(T, null,
321
+ "You have ",
322
+ v(count),
323
+ " unread messages"))));
324
+ };
325
+ const { getByRole, getByTestId } = render(React.createElement(Wrapper, null,
326
+ React.createElement(Counter, null)));
327
+ await act(async () => {
328
+ await tick();
329
+ });
330
+ // when
331
+ await act(async () => {
332
+ getByRole('button').click();
333
+ await tick();
334
+ });
335
+ // then
336
+ expect(mockFn).toHaveBeenCalledTimes(1);
337
+ expect(getByTestId('wrapper').textContent).toBe('Translated: You have 2 unread messages');
338
+ });
339
+ it('should still reject other react components', () => {
340
+ expect(() => render(React.createElement(Wrapper, null,
341
+ React.createElement(T, null,
342
+ v(1),
343
+ React.createElement(ExampleComponent, null))))).toThrow('ExampleComponent');
344
+ });
345
+ });
193
346
  });
194
347
  //# sourceMappingURL=Translate.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Translate.test.js","sourceRoot":"","sources":["../../src/components/Translate.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Translate.test.js","sourceRoot":"","sources":["../../src/components/Translate.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import React, { ReactElement, ReactNode } from 'react';
2
+ export interface VariableProps {
3
+ value: ReactNode;
4
+ }
5
+ export declare const Variable: ({ value }: VariableProps) => React.JSX.Element;
6
+ /**
7
+ * Marks a value inside `<T>` that should not be translated, such as a name or a
8
+ * count. The text around it is translated once as a template, e.g.
9
+ * `You have {0} unread messages`, and cached no matter what the value is.
10
+ *
11
+ * ```tsx
12
+ * <T>You have {v(count)} unread messages</T>
13
+ * ```
14
+ */
15
+ export declare const v: (value: ReactNode) => ReactElement<VariableProps>;
16
+ /**
17
+ * Replaces every `v()` in `children`, including those nested in HTML elements,
18
+ * with a numbered placeholder. Placeholders are numbered in the order they
19
+ * appear, so the same `<T>` always produces the same template.
20
+ */
21
+ export declare const extractVariables: (children: ReactNode) => {
22
+ template: ReactNode;
23
+ values: ReactNode[];
24
+ };
25
+ /**
26
+ * Puts the values back into a translated text. A placeholder without a value is
27
+ * left as it is.
28
+ */
29
+ export declare const fillPlaceholders: <V>(text: string, values: readonly V[]) => (string | V)[];
30
+ //# sourceMappingURL=Variable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Variable.d.ts","sourceRoot":"","sources":["../../src/components/Variable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,eAAO,MAAM,QAAQ,GAAI,WAAW,aAAa,sBAAiB,CAAC;AAEnE;;;;;;;;GAQG;AACH,eAAO,MAAM,CAAC,GAAI,OAAO,SAAS,KAAG,YAAY,CAAC,aAAa,CAE9D,CAAC;AAOF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,UAAU,SAAS,KAClB;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,SAAS,EAAE,CAAA;CAsC5C,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAChC,MAAM,MAAM,EACZ,QAAQ,SAAS,CAAC,EAAE,KACnB,CAAC,MAAM,GAAG,CAAC,CAAC,EAYd,CAAC"}
@@ -0,0 +1,68 @@
1
+ import React from 'react';
2
+ export const Variable = ({ value }) => React.createElement(React.Fragment, null, value);
3
+ /**
4
+ * Marks a value inside `<T>` that should not be translated, such as a name or a
5
+ * count. The text around it is translated once as a template, e.g.
6
+ * `You have {0} unread messages`, and cached no matter what the value is.
7
+ *
8
+ * ```tsx
9
+ * <T>You have {v(count)} unread messages</T>
10
+ * ```
11
+ */
12
+ export const v = (value) => (React.createElement(Variable, { value: value }));
13
+ const PLACEHOLDER = /\{(\d+)\}/g;
14
+ const isVariable = (node) => React.isValidElement(node) && node.type === Variable;
15
+ /**
16
+ * Replaces every `v()` in `children`, including those nested in HTML elements,
17
+ * with a numbered placeholder. Placeholders are numbered in the order they
18
+ * appear, so the same `<T>` always produces the same template.
19
+ */
20
+ export const extractVariables = (children) => {
21
+ const values = [];
22
+ const walk = (nodes) =>
23
+ // Adjacent text is joined so the template reads "You have {0} messages"
24
+ // rather than having React's `<!-- -->` separators between the parts.
25
+ (React.Children.map(nodes, (node) => {
26
+ if (isVariable(node)) {
27
+ values.push(node.props.value);
28
+ return `{${values.length - 1}}`;
29
+ }
30
+ if (React.isValidElement(node) &&
31
+ typeof node.type === 'string' &&
32
+ node.props.children !== undefined) {
33
+ return React.cloneElement(node, undefined, ...walk(node.props.children));
34
+ }
35
+ return node;
36
+ }) ?? []).reduce((joined, node) => {
37
+ const last = joined[joined.length - 1];
38
+ const isText = typeof node === 'string' || typeof node === 'number';
39
+ if (isText && (typeof last === 'string' || typeof last === 'number')) {
40
+ joined[joined.length - 1] = `${last}${node}`;
41
+ }
42
+ else {
43
+ joined.push(node);
44
+ }
45
+ return joined;
46
+ }, []);
47
+ const template = walk(children);
48
+ return { template: values.length > 0 ? template : children, values };
49
+ };
50
+ /**
51
+ * Puts the values back into a translated text. A placeholder without a value is
52
+ * left as it is.
53
+ */
54
+ export const fillPlaceholders = (text, values) => {
55
+ const parts = [];
56
+ // `split` with a capturing group puts the placeholder numbers at odd indexes.
57
+ text.split(PLACEHOLDER).forEach((part, i) => {
58
+ if (i % 2 === 0) {
59
+ if (part)
60
+ parts.push(part);
61
+ return;
62
+ }
63
+ const index = Number(part);
64
+ parts.push(index < values.length ? values[index] : `{${part}}`);
65
+ });
66
+ return parts;
67
+ };
68
+ //# sourceMappingURL=Variable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Variable.js","sourceRoot":"","sources":["../../src/components/Variable.tsx"],"names":[],"mappings":"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"}
@@ -1,4 +1,17 @@
1
1
  import { DataLoaderLoadParams } from '@magic-translate/core';
2
- export declare function useTranslate(): (text: string, params?: Omit<DataLoaderLoadParams, 'text'>) => string;
2
+ export interface TranslateFunction {
3
+ (text: string, params?: Omit<DataLoaderLoadParams, 'text'>): string;
4
+ /**
5
+ * As a tagged template, every `${}` value is left untranslated and the text
6
+ * around it is translated once as a template, e.g. `You have {0} unread
7
+ * messages`:
8
+ *
9
+ * ```ts
10
+ * t`You have ${count} unread messages`
11
+ * ```
12
+ */
13
+ (strings: TemplateStringsArray, ...values: unknown[]): string;
14
+ }
15
+ export declare function useTranslate(): TranslateFunction;
3
16
  export declare const useT: typeof useTranslate;
4
17
  //# sourceMappingURL=use-translate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-translate.d.ts","sourceRoot":"","sources":["../../src/hooks/use-translate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,wBAAgB,YAAY,IAAI,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,KACxC,MAAM,CAuCV;AAED,eAAO,MAAM,IAAI,qBAAe,CAAC"}
1
+ {"version":3,"file":"use-translate.d.ts","sourceRoot":"","sources":["../../src/hooks/use-translate.ts"],"names":[],"mappings":"AAEA,OAAO,EAAc,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGzE,MAAM,WAAW,iBAAiB;IAChC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACpE;;;;;;;;OAQG;IACH,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;CAC/D;AAMD,wBAAgB,YAAY,IAAI,iBAAiB,CA4DhD;AAED,eAAO,MAAM,IAAI,qBAAe,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { useMagicTranslate } from './use-magic-translate';
2
2
  import { useCallback, useMemo, useState } from 'react';
3
3
  import { cacheKeyFn } from '@magic-translate/core';
4
+ import { fillPlaceholders } from '../components/Variable';
5
+ const isTemplateStringsArray = (value) => Array.isArray(value) && 'raw' in value;
4
6
  export function useTranslate() {
5
7
  const { dataLoader, apiKey, language, sourceLanguage } = useMagicTranslate();
6
8
  const [translations, setTranslations] = useState(new Map());
@@ -17,10 +19,17 @@ export function useTranslate() {
17
19
  });
18
20
  });
19
21
  }, [cacheFn, dataLoader, lookup]);
20
- return (text, params = {}) => {
22
+ const translate = (text, params) => {
21
23
  load(text, params);
22
24
  return lookup(text, params) ?? text;
23
25
  };
26
+ return ((textOrStrings, ...rest) => {
27
+ if (!isTemplateStringsArray(textOrStrings)) {
28
+ return translate(textOrStrings, rest[0] ?? {});
29
+ }
30
+ const template = textOrStrings.reduce((acc, part, i) => (i === 0 ? part : `${acc}{${i - 1}}${part}`), '');
31
+ return fillPlaceholders(translate(template, {}), rest.map(String)).join('');
32
+ });
24
33
  }
25
34
  export const useT = useTranslate;
26
35
  //# sourceMappingURL=use-translate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-translate.js","sourceRoot":"","sources":["../../src/hooks/use-translate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,UAAU,EAAwB,MAAM,uBAAuB,CAAC;AAEzE,MAAM,UAAU,YAAY;IAI1B,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC7E,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,IAAI,GAAG,EAAkB,CAC1B,CAAC;IAEF,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,EAClD,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CACnC,CAAC;IAEF,MAAM,MAAM,GAAG,WAAW,CACxB,CAAC,IAAY,EAAE,SAA6C,EAAE,EAAE,EAAE,CAChE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,EAChD,CAAC,YAAY,EAAE,OAAO,CAAC,CACxB,CAAC;IAEF,MAAM,IAAI,GAAG,WAAW,CACtB,CAAC,IAAY,EAAE,SAA6C,EAAE,EAAE,EAAE;QAChE,IAAI,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;YACxD,eAAe,CAAC,CAAC,GAAG,EAAE,EAAE;gBACtB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;gBAEnD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;YACtB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,EACD,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,CAC9B,CAAC;IAEF,OAAO,CAAC,IAAY,EAAE,SAA6C,EAAE,EAAE,EAAE;QACvE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAEnB,OAAO,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,YAAY,CAAC"}
1
+ {"version":3,"file":"use-translate.js","sourceRoot":"","sources":["../../src/hooks/use-translate.ts"],"names":[],"mappings":"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"}
@@ -77,5 +77,51 @@ describe('Translate', () => {
77
77
  // previous language
78
78
  expect(mockFn).toHaveBeenCalledTimes(2);
79
79
  });
80
+ describe('tagged template', () => {
81
+ it('should send a template with numbered placeholders', async () => {
82
+ // given
83
+ const { result } = renderHook(() => useTranslate(), { wrapper });
84
+ const count = 3;
85
+ // when
86
+ let text = '';
87
+ act(() => {
88
+ text = result.current `You have ${count} unread ${'new'} messages`;
89
+ });
90
+ expect(text).toBe('You have 3 unread new messages');
91
+ await tick();
92
+ // then
93
+ expect(mockFn).toHaveBeenCalledWith([
94
+ { text: 'You have {0} unread {1} messages' },
95
+ ]);
96
+ });
97
+ it('should put the values into the translation', async () => {
98
+ // given
99
+ const { result, rerender } = renderHook(() => useTranslate(), {
100
+ wrapper,
101
+ });
102
+ const count = 3;
103
+ await act(async () => {
104
+ expect(result.current `You have ${count} unread messages`).toBe('You have 3 unread messages');
105
+ });
106
+ await act(async () => {
107
+ await tick();
108
+ });
109
+ rerender();
110
+ // then
111
+ expect(result.current `You have ${count} unread messages`).toBe('Translated: You have 3 unread messages');
112
+ expect(result.current `You have ${7} unread messages`).toBe('Translated: You have 7 unread messages');
113
+ expect(mockFn).toHaveBeenCalledTimes(1);
114
+ });
115
+ it('should return the values in the source text until the translation has loaded', () => {
116
+ // given
117
+ const { result } = renderHook(() => useTranslate(), { wrapper });
118
+ // then
119
+ let text = '';
120
+ act(() => {
121
+ text = result.current `You have ${3} unread messages`;
122
+ });
123
+ expect(text).toBe('You have 3 unread messages');
124
+ });
125
+ });
80
126
  });
81
127
  //# sourceMappingURL=use-translate.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-translate.test.js","sourceRoot":"","sources":["../../src/hooks/use-translate.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"use-translate.test.js","sourceRoot":"","sources":["../../src/hooks/use-translate.test.tsx"],"names":[],"mappings":"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"}