@lingui/react 4.0.0-next.2 → 4.0.0-next.3

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.
@@ -16,13 +16,13 @@ const I18nProvider = _ref => {
16
16
  let {
17
17
  i18n,
18
18
  defaultComponent,
19
- forceRenderOnLocaleChange = true,
20
19
  children
21
20
  } = _ref;
21
+ const latestKnownLocale = React.useRef(i18n.locale);
22
22
  /**
23
23
  * We can't pass `i18n` object directly through context, because even when locale
24
24
  * or messages are changed, i18n object is still the same. Context provider compares
25
- * reference identity and suggested workaround is create a wrapper object every time
25
+ * reference identity and suggested workaround is to create a wrapper object every time
26
26
  * we need to trigger re-render. See https://reactjs.org/docs/context.html#caveats.
27
27
  *
28
28
  * Due to this effect we also pass `defaultComponent` in the same context, instead
@@ -30,15 +30,11 @@ const I18nProvider = _ref => {
30
30
  *
31
31
  * We can't use useMemo hook either, because we want to recalculate value manually.
32
32
  */
33
- const makeContext = () => ({
33
+ const makeContext = React.useCallback(() => ({
34
34
  i18n,
35
35
  defaultComponent
36
- });
37
- const getRenderKey = () => {
38
- return forceRenderOnLocaleChange ? i18n.locale || "default" : "default";
39
- };
40
- const [context, setContext] = React.useState(makeContext()),
41
- [renderKey, setRenderKey] = React.useState(getRenderKey());
36
+ }), [i18n, defaultComponent]);
37
+ const [context, setContext] = React.useState(makeContext());
42
38
 
43
39
  /**
44
40
  * Subscribe for locale/message changes
@@ -46,29 +42,29 @@ const I18nProvider = _ref => {
46
42
  * I18n object from `@lingui/core` is the single source of truth for all i18n related
47
43
  * data (active locale, catalogs). When new messages are loaded or locale is changed
48
44
  * we need to trigger re-rendering of LinguiContext.Consumers.
49
- *
50
- * We call `setContext(makeContext())` after adding the observer in case the `change`
51
- * event would already have fired between the inital renderKey calculation and the
52
- * `useEffect` hook being called. This can happen if locales are loaded/activated
53
- * async.
54
45
  */
55
46
  React.useEffect(() => {
56
- const unsubscribe = i18n.on("change", () => {
47
+ const updateContext = () => {
48
+ latestKnownLocale.current = i18n.locale;
57
49
  setContext(makeContext());
58
- setRenderKey(getRenderKey());
59
- });
60
- if (renderKey === "default") {
61
- setRenderKey(getRenderKey());
50
+ };
51
+ const unsubscribe = i18n.on("change", updateContext);
52
+
53
+ /**
54
+ * unlikely, but if the locale changes before the onChange listener
55
+ * was added, we need to trigger a rerender
56
+ * */
57
+ if (latestKnownLocale.current !== i18n.locale) {
58
+ updateContext();
62
59
  }
63
- if (forceRenderOnLocaleChange && renderKey === "default") {
64
- console.log("I18nProvider did not render. A call to i18n.activate still needs to happen or forceRenderOnLocaleChange must be set to false.");
65
- }
66
- return () => unsubscribe();
67
- }, []);
68
- if (forceRenderOnLocaleChange && renderKey === "default") return null;
60
+ return unsubscribe;
61
+ }, [makeContext]);
62
+ if (!latestKnownLocale.current) {
63
+ process.env.NODE_ENV === "development" && console.log("I18nProvider rendered `null`. A call to `i18n.activate` needs to happen in order for translations to be activated and for the I18nProvider to render." + "This is not an error but an informational message logged only in development.");
64
+ return null;
65
+ }
69
66
  return /*#__PURE__*/React.createElement(LinguiContext.Provider, {
70
- value: context,
71
- key: renderKey
67
+ value: context
72
68
  }, children);
73
69
  };
74
70
 
@@ -243,6 +239,7 @@ function Trans(props) {
243
239
  }
244
240
 
245
241
  exports.I18nProvider = I18nProvider;
242
+ exports.LinguiContext = LinguiContext;
246
243
  exports.Trans = Trans;
247
244
  exports.useLingui = useLingui;
248
245
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/I18nProvider.tsx","../../src/format.ts","../../src/Trans.tsx"],"sourcesContent":["import React, { ComponentType, FunctionComponent } from \"react\"\nimport { I18n } from \"@lingui/core\"\nimport { TransRenderProps } from \"./Trans\"\n\nexport type I18nContext = {\n i18n: I18n\n defaultComponent?: ComponentType<TransRenderProps>\n}\n\nexport type I18nProviderProps = I18nContext & {\n forceRenderOnLocaleChange?: boolean\n children?: React.ReactNode\n}\n\nconst LinguiContext = React.createContext<I18nContext>(null)\n\nexport function useLingui(): I18nContext {\n const context = React.useContext<I18nContext>(LinguiContext)\n\n if (process.env.NODE_ENV !== \"production\") {\n if (context == null) {\n throw new Error(\"useLingui hook was used without I18nProvider.\")\n }\n }\n\n return context\n}\n\nexport const I18nProvider: FunctionComponent<I18nProviderProps> = ({\n i18n,\n defaultComponent,\n forceRenderOnLocaleChange = true,\n children,\n}) => {\n /**\n * We can't pass `i18n` object directly through context, because even when locale\n * or messages are changed, i18n object is still the same. Context provider compares\n * reference identity and suggested workaround is create a wrapper object every time\n * we need to trigger re-render. See https://reactjs.org/docs/context.html#caveats.\n *\n * Due to this effect we also pass `defaultComponent` in the same context, instead\n * of creating a separate Provider/Consumer pair.\n *\n * We can't use useMemo hook either, because we want to recalculate value manually.\n */\n const makeContext = () => ({\n i18n,\n defaultComponent,\n })\n const getRenderKey = () => {\n return (\n forceRenderOnLocaleChange ? i18n.locale || \"default\" : \"default\"\n ) as string\n }\n\n const [context, setContext] = React.useState<I18nContext>(makeContext()),\n [renderKey, setRenderKey] = React.useState<string>(getRenderKey())\n\n /**\n * Subscribe for locale/message changes\n *\n * I18n object from `@lingui/core` is the single source of truth for all i18n related\n * data (active locale, catalogs). When new messages are loaded or locale is changed\n * we need to trigger re-rendering of LinguiContext.Consumers.\n *\n * We call `setContext(makeContext())` after adding the observer in case the `change`\n * event would already have fired between the inital renderKey calculation and the\n * `useEffect` hook being called. This can happen if locales are loaded/activated\n * async.\n */\n React.useEffect(() => {\n const unsubscribe = i18n.on(\"change\", () => {\n setContext(makeContext())\n setRenderKey(getRenderKey())\n })\n if (renderKey === \"default\") {\n setRenderKey(getRenderKey())\n }\n if (forceRenderOnLocaleChange && renderKey === \"default\") {\n console.log(\n \"I18nProvider did not render. A call to i18n.activate still needs to happen or forceRenderOnLocaleChange must be set to false.\"\n )\n }\n return () => unsubscribe()\n }, [])\n\n if (forceRenderOnLocaleChange && renderKey === \"default\") return null\n\n return (\n <LinguiContext.Provider value={context} key={renderKey}>\n {children}\n </LinguiContext.Provider>\n )\n}\n","import React from \"react\"\n\n// match <tag>paired</tag> and <tag/> unpaired tags\nconst tagRe = /<([a-zA-Z0-9]+)>(.*?)<\\/\\1>|<([a-zA-Z0-9]+)\\/>/\nconst nlRe = /(?:\\r\\n|\\r|\\n)/g\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nconst voidElementTags = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true,\n menuitem: true,\n}\n\n/**\n * `formatElements` - parse string and return tree of react elements\n *\n * `value` is string to be formatted with <tag>Paired<tag/> or <tag/> (unpaired)\n * placeholders. `elements` is a array of react elements which indexes\n * correspond to element indexes in formatted string\n */\nfunction formatElements(\n value: string,\n elements: { [key: string]: React.ReactElement<any> } = {}\n): string | Array<any> {\n const uniqueId = makeCounter(0, \"$lingui$\")\n const parts = value.replace(nlRe, \"\").split(tagRe)\n\n // no inline elements, return\n if (parts.length === 1) return value\n\n const tree = []\n\n const before = parts.shift()\n if (before) tree.push(before)\n\n for (const [index, children, after] of getElements(parts)) {\n let element = elements[index]\n\n if (!element || (voidElementTags[element.type as string] && children)) {\n if (!element) {\n console.error(\n `Can't use element at index '${index}' as it is not declared in the original translation`\n )\n } else {\n console.error(\n `${element.type} is a void element tag therefore it must have no children`\n )\n }\n\n // ignore problematic element but push its children and elements after it\n element = React.createElement(React.Fragment)\n }\n\n tree.push(\n React.cloneElement(\n element,\n { key: uniqueId() },\n\n // format children for pair tags\n // unpaired tags might have children if it's a component passed as a variable\n children ? formatElements(children, elements) : element.props.children\n )\n )\n\n if (after) tree.push(after)\n }\n\n return tree\n}\n\n/*\n * `getElements` - return array of element indexes and element childrens\n *\n * `parts` is array of [pairedIndex, children, unpairedIndex, textAfter, ...]\n * where:\n * - `pairedIndex` is index of paired element (undef for unpaired)\n * - `children` are children of paired element (undef for unpaired)\n * - `unpairedIndex` is index of unpaired element (undef for paired)\n * - `textAfter` is string after all elements (empty string, if there's nothing)\n *\n * `parts` length is always multiply of 4\n *\n * Returns: Array<[elementIndex, children, after]>\n */\nfunction getElements(parts) {\n if (!parts.length) return []\n\n const [paired, children, unpaired, after] = parts.slice(0, 4)\n\n return [[paired || unpaired, children || \"\", after]].concat(\n getElements(parts.slice(4, parts.length))\n )\n}\n\nconst makeCounter =\n (count = 0, prefix = \"\") =>\n () =>\n `${prefix}_${count++}`\n\nexport { formatElements }\n","import React from \"react\"\n\nimport { useLingui } from \"./I18nProvider\"\nimport { formatElements } from \"./format\"\n\nexport type TransRenderProps = {\n id?: string\n translation?: React.ReactNode\n children?: React.ReactNode\n message?: string | null\n isTranslated?: boolean\n}\n\nexport type TransProps = {\n id: string\n message?: string\n values?: Record<string, unknown>\n components?: { [key: string]: React.ElementType | any }\n formats?: Record<string, unknown>\n children?: React.ReactNode\n component?: React.ComponentType<TransRenderProps>\n render?: (props: TransRenderProps) => React.ReactElement<any, any> | null\n}\n\nexport function Trans(props: TransProps): React.ReactElement<any, any> | null {\n const { i18n, defaultComponent } = useLingui()\n const { render, component, id, message, formats } = props\n\n const values = { ...(props.values || {}) }\n const components = { ...(props.components || {}) }\n\n if (values) {\n /*\n Related discussion: https://github.com/lingui/js-lingui/issues/183\n\n Values *might* contain React elements with static content.\n They're replaced with <INDEX /> placeholders and added to `components`.\n\n Example:\n Translation: Hello {name}\n Values: { name: <strong>Jane</strong> }\n\n It'll become \"Hello <0 />\" with components=[<strong>Jane</strong>]\n */\n\n Object.keys(values).forEach((key) => {\n const value = values[key]\n if (!React.isValidElement(value)) return\n\n const index = Object.keys(components).length\n\n components[index] = value\n values[key] = `<${index}/>`\n })\n }\n\n const _translation: string =\n i18n && typeof i18n._ === \"function\"\n ? i18n._(id, values, { message, formats })\n : id // i18n provider isn't loaded at all\n\n const translation = _translation\n ? formatElements(_translation, components)\n : null\n\n if (render === null || component === null) {\n // Although `string` is a valid react element, types only allow `Element`\n // Upstream issue: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544\n return translation as unknown as React.ReactElement<any, any>\n }\n\n const FallbackComponent = (defaultComponent ||\n React.Fragment) as React.ComponentType<any>\n\n const i18nProps = {\n id,\n message,\n translation,\n isTranslated: id !== translation && message !== translation,\n }\n\n // Validation of `render` and `component` props\n if (render && component) {\n console.error(\n \"You can't use both `component` and `render` prop at the same time. `component` is ignored.\"\n )\n } else if (render && typeof render !== \"function\") {\n console.error(\n `Invalid value supplied to prop \\`render\\`. It must be a function, provided ${render}`\n )\n } else if (component && typeof component !== \"function\") {\n // Apparently, both function components and class components are functions\n // See https://stackoverflow.com/a/41658173/1535540\n console.error(\n `Invalid value supplied to prop \\`component\\`. It must be a React component, provided ${component}`\n )\n return <FallbackComponent {...i18nProps}>{translation}</FallbackComponent>\n }\n\n // Rendering using a render prop\n if (typeof render === \"function\") {\n // Component: render={(props) => <a title={props.translation}>x</a>}\n return render(i18nProps)\n }\n\n // `component` prop has a higher precedence over `defaultComponent`\n const Component = (component || FallbackComponent) as React.ComponentType<any>\n const DefaultComponent = defaultComponent\n\n return DefaultComponent && !component ? (\n <DefaultComponent {...i18nProps}>{translation}</DefaultComponent>\n ) : (\n <Component>{translation}</Component>\n )\n}\n"],"names":["LinguiContext","React","createContext","useLingui","context","useContext","process","env","NODE_ENV","Error","I18nProvider","i18n","defaultComponent","forceRenderOnLocaleChange","children","makeContext","getRenderKey","locale","setContext","useState","renderKey","setRenderKey","useEffect","unsubscribe","on","console","log","tagRe","nlRe","voidElementTags","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","menuitem","formatElements","value","elements","uniqueId","makeCounter","parts","replace","split","length","tree","before","shift","push","index","after","getElements","element","type","error","createElement","Fragment","cloneElement","key","props","paired","unpaired","slice","concat","count","prefix","Trans","render","component","id","message","formats","values","components","Object","keys","forEach","isValidElement","_translation","_","translation","FallbackComponent","i18nProps","isTranslated","Component","DefaultComponent"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/I18nProvider.tsx","../../src/format.ts","../../src/Trans.tsx"],"sourcesContent":["import React, { ComponentType, FunctionComponent } from \"react\"\nimport { I18n } from \"@lingui/core\"\nimport { TransRenderProps } from \"./Trans\"\n\nexport type I18nContext = {\n i18n: I18n\n defaultComponent?: ComponentType<TransRenderProps>\n}\n\nexport type I18nProviderProps = I18nContext & {\n children?: React.ReactNode\n}\n\nexport const LinguiContext = React.createContext<I18nContext>(null)\n\nexport function useLingui(): I18nContext {\n const context = React.useContext<I18nContext>(LinguiContext)\n\n if (process.env.NODE_ENV !== \"production\") {\n if (context == null) {\n throw new Error(\"useLingui hook was used without I18nProvider.\")\n }\n }\n\n return context\n}\n\nexport const I18nProvider: FunctionComponent<I18nProviderProps> = ({\n i18n,\n defaultComponent,\n children,\n}) => {\n const latestKnownLocale = React.useRef<string | undefined>(i18n.locale)\n /**\n * We can't pass `i18n` object directly through context, because even when locale\n * or messages are changed, i18n object is still the same. Context provider compares\n * reference identity and suggested workaround is to create a wrapper object every time\n * we need to trigger re-render. See https://reactjs.org/docs/context.html#caveats.\n *\n * Due to this effect we also pass `defaultComponent` in the same context, instead\n * of creating a separate Provider/Consumer pair.\n *\n * We can't use useMemo hook either, because we want to recalculate value manually.\n */\n const makeContext = React.useCallback(\n () => ({\n i18n,\n defaultComponent,\n }),\n [i18n, defaultComponent]\n )\n\n const [context, setContext] = React.useState<I18nContext>(makeContext())\n\n /**\n * Subscribe for locale/message changes\n *\n * I18n object from `@lingui/core` is the single source of truth for all i18n related\n * data (active locale, catalogs). When new messages are loaded or locale is changed\n * we need to trigger re-rendering of LinguiContext.Consumers.\n */\n React.useEffect(() => {\n const updateContext = () => {\n latestKnownLocale.current = i18n.locale\n setContext(makeContext())\n }\n const unsubscribe = i18n.on(\"change\", updateContext)\n\n /**\n * unlikely, but if the locale changes before the onChange listener\n * was added, we need to trigger a rerender\n * */\n if (latestKnownLocale.current !== i18n.locale) {\n updateContext()\n }\n return unsubscribe\n }, [makeContext])\n\n if (!latestKnownLocale.current) {\n process.env.NODE_ENV === \"development\" &&\n console.log(\n \"I18nProvider rendered `null`. A call to `i18n.activate` needs to happen in order for translations to be activated and for the I18nProvider to render.\" +\n \"This is not an error but an informational message logged only in development.\"\n )\n return null\n }\n\n return (\n <LinguiContext.Provider value={context}>{children}</LinguiContext.Provider>\n )\n}\n","import React from \"react\"\n\n// match <tag>paired</tag> and <tag/> unpaired tags\nconst tagRe = /<([a-zA-Z0-9]+)>(.*?)<\\/\\1>|<([a-zA-Z0-9]+)\\/>/\nconst nlRe = /(?:\\r\\n|\\r|\\n)/g\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nconst voidElementTags = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true,\n menuitem: true,\n}\n\n/**\n * `formatElements` - parse string and return tree of react elements\n *\n * `value` is string to be formatted with <tag>Paired<tag/> or <tag/> (unpaired)\n * placeholders. `elements` is a array of react elements which indexes\n * correspond to element indexes in formatted string\n */\nfunction formatElements(\n value: string,\n elements: { [key: string]: React.ReactElement<any> } = {}\n): string | Array<any> {\n const uniqueId = makeCounter(0, \"$lingui$\")\n const parts = value.replace(nlRe, \"\").split(tagRe)\n\n // no inline elements, return\n if (parts.length === 1) return value\n\n const tree = []\n\n const before = parts.shift()\n if (before) tree.push(before)\n\n for (const [index, children, after] of getElements(parts)) {\n let element = elements[index]\n\n if (!element || (voidElementTags[element.type as string] && children)) {\n if (!element) {\n console.error(\n `Can't use element at index '${index}' as it is not declared in the original translation`\n )\n } else {\n console.error(\n `${element.type} is a void element tag therefore it must have no children`\n )\n }\n\n // ignore problematic element but push its children and elements after it\n element = React.createElement(React.Fragment)\n }\n\n tree.push(\n React.cloneElement(\n element,\n { key: uniqueId() },\n\n // format children for pair tags\n // unpaired tags might have children if it's a component passed as a variable\n children ? formatElements(children, elements) : element.props.children\n )\n )\n\n if (after) tree.push(after)\n }\n\n return tree\n}\n\n/*\n * `getElements` - return array of element indexes and element childrens\n *\n * `parts` is array of [pairedIndex, children, unpairedIndex, textAfter, ...]\n * where:\n * - `pairedIndex` is index of paired element (undef for unpaired)\n * - `children` are children of paired element (undef for unpaired)\n * - `unpairedIndex` is index of unpaired element (undef for paired)\n * - `textAfter` is string after all elements (empty string, if there's nothing)\n *\n * `parts` length is always multiply of 4\n *\n * Returns: Array<[elementIndex, children, after]>\n */\nfunction getElements(parts) {\n if (!parts.length) return []\n\n const [paired, children, unpaired, after] = parts.slice(0, 4)\n\n return [[paired || unpaired, children || \"\", after]].concat(\n getElements(parts.slice(4, parts.length))\n )\n}\n\nconst makeCounter =\n (count = 0, prefix = \"\") =>\n () =>\n `${prefix}_${count++}`\n\nexport { formatElements }\n","import React from \"react\"\n\nimport { useLingui } from \"./I18nProvider\"\nimport { formatElements } from \"./format\"\n\nexport type TransRenderProps = {\n id?: string\n translation?: React.ReactNode\n children?: React.ReactNode\n message?: string | null\n isTranslated?: boolean\n}\n\nexport type TransProps = {\n id: string\n message?: string\n values?: Record<string, unknown>\n components?: { [key: string]: React.ElementType | any }\n formats?: Record<string, unknown>\n children?: React.ReactNode\n component?: React.ComponentType<TransRenderProps>\n render?: (props: TransRenderProps) => React.ReactElement<any, any> | null\n}\n\nexport function Trans(props: TransProps): React.ReactElement<any, any> | null {\n const { i18n, defaultComponent } = useLingui()\n const { render, component, id, message, formats } = props\n\n const values = { ...(props.values || {}) }\n const components = { ...(props.components || {}) }\n\n if (values) {\n /*\n Related discussion: https://github.com/lingui/js-lingui/issues/183\n\n Values *might* contain React elements with static content.\n They're replaced with <INDEX /> placeholders and added to `components`.\n\n Example:\n Translation: Hello {name}\n Values: { name: <strong>Jane</strong> }\n\n It'll become \"Hello <0 />\" with components=[<strong>Jane</strong>]\n */\n\n Object.keys(values).forEach((key) => {\n const value = values[key]\n if (!React.isValidElement(value)) return\n\n const index = Object.keys(components).length\n\n components[index] = value\n values[key] = `<${index}/>`\n })\n }\n\n const _translation: string =\n i18n && typeof i18n._ === \"function\"\n ? i18n._(id, values, { message, formats })\n : id // i18n provider isn't loaded at all\n\n const translation = _translation\n ? formatElements(_translation, components)\n : null\n\n if (render === null || component === null) {\n // Although `string` is a valid react element, types only allow `Element`\n // Upstream issue: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544\n return translation as unknown as React.ReactElement<any, any>\n }\n\n const FallbackComponent = (defaultComponent ||\n React.Fragment) as React.ComponentType<any>\n\n const i18nProps = {\n id,\n message,\n translation,\n isTranslated: id !== translation && message !== translation,\n }\n\n // Validation of `render` and `component` props\n if (render && component) {\n console.error(\n \"You can't use both `component` and `render` prop at the same time. `component` is ignored.\"\n )\n } else if (render && typeof render !== \"function\") {\n console.error(\n `Invalid value supplied to prop \\`render\\`. It must be a function, provided ${render}`\n )\n } else if (component && typeof component !== \"function\") {\n // Apparently, both function components and class components are functions\n // See https://stackoverflow.com/a/41658173/1535540\n console.error(\n `Invalid value supplied to prop \\`component\\`. It must be a React component, provided ${component}`\n )\n return <FallbackComponent {...i18nProps}>{translation}</FallbackComponent>\n }\n\n // Rendering using a render prop\n if (typeof render === \"function\") {\n // Component: render={(props) => <a title={props.translation}>x</a>}\n return render(i18nProps)\n }\n\n // `component` prop has a higher precedence over `defaultComponent`\n const Component = (component || FallbackComponent) as React.ComponentType<any>\n const DefaultComponent = defaultComponent\n\n return DefaultComponent && !component ? (\n <DefaultComponent {...i18nProps}>{translation}</DefaultComponent>\n ) : (\n <Component>{translation}</Component>\n )\n}\n"],"names":["LinguiContext","React","createContext","useLingui","context","useContext","process","env","NODE_ENV","Error","I18nProvider","i18n","defaultComponent","children","latestKnownLocale","useRef","locale","makeContext","useCallback","setContext","useState","useEffect","updateContext","current","unsubscribe","on","console","log","tagRe","nlRe","voidElementTags","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","menuitem","formatElements","value","elements","uniqueId","makeCounter","parts","replace","split","length","tree","before","shift","push","index","after","getElements","element","type","error","createElement","Fragment","cloneElement","key","props","paired","unpaired","slice","concat","count","prefix","Trans","render","component","id","message","formats","values","components","Object","keys","forEach","isValidElement","_translation","_","translation","FallbackComponent","i18nProps","isTranslated","Component","DefaultComponent"],"mappings":"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"}
@@ -14,13 +14,13 @@ const I18nProvider = _ref => {
14
14
  let {
15
15
  i18n,
16
16
  defaultComponent,
17
- forceRenderOnLocaleChange = true,
18
17
  children
19
18
  } = _ref;
19
+ const latestKnownLocale = React.useRef(i18n.locale);
20
20
  /**
21
21
  * We can't pass `i18n` object directly through context, because even when locale
22
22
  * or messages are changed, i18n object is still the same. Context provider compares
23
- * reference identity and suggested workaround is create a wrapper object every time
23
+ * reference identity and suggested workaround is to create a wrapper object every time
24
24
  * we need to trigger re-render. See https://reactjs.org/docs/context.html#caveats.
25
25
  *
26
26
  * Due to this effect we also pass `defaultComponent` in the same context, instead
@@ -28,15 +28,11 @@ const I18nProvider = _ref => {
28
28
  *
29
29
  * We can't use useMemo hook either, because we want to recalculate value manually.
30
30
  */
31
- const makeContext = () => ({
31
+ const makeContext = React.useCallback(() => ({
32
32
  i18n,
33
33
  defaultComponent
34
- });
35
- const getRenderKey = () => {
36
- return forceRenderOnLocaleChange ? i18n.locale || "default" : "default";
37
- };
38
- const [context, setContext] = React.useState(makeContext()),
39
- [renderKey, setRenderKey] = React.useState(getRenderKey());
34
+ }), [i18n, defaultComponent]);
35
+ const [context, setContext] = React.useState(makeContext());
40
36
 
41
37
  /**
42
38
  * Subscribe for locale/message changes
@@ -44,29 +40,29 @@ const I18nProvider = _ref => {
44
40
  * I18n object from `@lingui/core` is the single source of truth for all i18n related
45
41
  * data (active locale, catalogs). When new messages are loaded or locale is changed
46
42
  * we need to trigger re-rendering of LinguiContext.Consumers.
47
- *
48
- * We call `setContext(makeContext())` after adding the observer in case the `change`
49
- * event would already have fired between the inital renderKey calculation and the
50
- * `useEffect` hook being called. This can happen if locales are loaded/activated
51
- * async.
52
43
  */
53
44
  React.useEffect(() => {
54
- const unsubscribe = i18n.on("change", () => {
45
+ const updateContext = () => {
46
+ latestKnownLocale.current = i18n.locale;
55
47
  setContext(makeContext());
56
- setRenderKey(getRenderKey());
57
- });
58
- if (renderKey === "default") {
59
- setRenderKey(getRenderKey());
60
- }
61
- if (forceRenderOnLocaleChange && renderKey === "default") {
62
- console.log("I18nProvider did not render. A call to i18n.activate still needs to happen or forceRenderOnLocaleChange must be set to false.");
48
+ };
49
+ const unsubscribe = i18n.on("change", updateContext);
50
+
51
+ /**
52
+ * unlikely, but if the locale changes before the onChange listener
53
+ * was added, we need to trigger a rerender
54
+ * */
55
+ if (latestKnownLocale.current !== i18n.locale) {
56
+ updateContext();
63
57
  }
64
- return () => unsubscribe();
65
- }, []);
66
- if (forceRenderOnLocaleChange && renderKey === "default") return null;
58
+ return unsubscribe;
59
+ }, [makeContext]);
60
+ if (!latestKnownLocale.current) {
61
+ process.env.NODE_ENV === "development" && console.log("I18nProvider rendered `null`. A call to `i18n.activate` needs to happen in order for translations to be activated and for the I18nProvider to render." + "This is not an error but an informational message logged only in development.");
62
+ return null;
63
+ }
67
64
  return /*#__PURE__*/React.createElement(LinguiContext.Provider, {
68
- value: context,
69
- key: renderKey
65
+ value: context
70
66
  }, children);
71
67
  };
72
68
 
@@ -240,5 +236,5 @@ function Trans(props) {
240
236
  return DefaultComponent && !component ? /*#__PURE__*/React.createElement(DefaultComponent, i18nProps, translation) : /*#__PURE__*/React.createElement(Component, null, translation);
241
237
  }
242
238
 
243
- export { I18nProvider, Trans, useLingui };
239
+ export { I18nProvider, LinguiContext, Trans, useLingui };
244
240
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/I18nProvider.tsx","../../src/format.ts","../../src/Trans.tsx"],"sourcesContent":["import React, { ComponentType, FunctionComponent } from \"react\"\nimport { I18n } from \"@lingui/core\"\nimport { TransRenderProps } from \"./Trans\"\n\nexport type I18nContext = {\n i18n: I18n\n defaultComponent?: ComponentType<TransRenderProps>\n}\n\nexport type I18nProviderProps = I18nContext & {\n forceRenderOnLocaleChange?: boolean\n children?: React.ReactNode\n}\n\nconst LinguiContext = React.createContext<I18nContext>(null)\n\nexport function useLingui(): I18nContext {\n const context = React.useContext<I18nContext>(LinguiContext)\n\n if (process.env.NODE_ENV !== \"production\") {\n if (context == null) {\n throw new Error(\"useLingui hook was used without I18nProvider.\")\n }\n }\n\n return context\n}\n\nexport const I18nProvider: FunctionComponent<I18nProviderProps> = ({\n i18n,\n defaultComponent,\n forceRenderOnLocaleChange = true,\n children,\n}) => {\n /**\n * We can't pass `i18n` object directly through context, because even when locale\n * or messages are changed, i18n object is still the same. Context provider compares\n * reference identity and suggested workaround is create a wrapper object every time\n * we need to trigger re-render. See https://reactjs.org/docs/context.html#caveats.\n *\n * Due to this effect we also pass `defaultComponent` in the same context, instead\n * of creating a separate Provider/Consumer pair.\n *\n * We can't use useMemo hook either, because we want to recalculate value manually.\n */\n const makeContext = () => ({\n i18n,\n defaultComponent,\n })\n const getRenderKey = () => {\n return (\n forceRenderOnLocaleChange ? i18n.locale || \"default\" : \"default\"\n ) as string\n }\n\n const [context, setContext] = React.useState<I18nContext>(makeContext()),\n [renderKey, setRenderKey] = React.useState<string>(getRenderKey())\n\n /**\n * Subscribe for locale/message changes\n *\n * I18n object from `@lingui/core` is the single source of truth for all i18n related\n * data (active locale, catalogs). When new messages are loaded or locale is changed\n * we need to trigger re-rendering of LinguiContext.Consumers.\n *\n * We call `setContext(makeContext())` after adding the observer in case the `change`\n * event would already have fired between the inital renderKey calculation and the\n * `useEffect` hook being called. This can happen if locales are loaded/activated\n * async.\n */\n React.useEffect(() => {\n const unsubscribe = i18n.on(\"change\", () => {\n setContext(makeContext())\n setRenderKey(getRenderKey())\n })\n if (renderKey === \"default\") {\n setRenderKey(getRenderKey())\n }\n if (forceRenderOnLocaleChange && renderKey === \"default\") {\n console.log(\n \"I18nProvider did not render. A call to i18n.activate still needs to happen or forceRenderOnLocaleChange must be set to false.\"\n )\n }\n return () => unsubscribe()\n }, [])\n\n if (forceRenderOnLocaleChange && renderKey === \"default\") return null\n\n return (\n <LinguiContext.Provider value={context} key={renderKey}>\n {children}\n </LinguiContext.Provider>\n )\n}\n","import React from \"react\"\n\n// match <tag>paired</tag> and <tag/> unpaired tags\nconst tagRe = /<([a-zA-Z0-9]+)>(.*?)<\\/\\1>|<([a-zA-Z0-9]+)\\/>/\nconst nlRe = /(?:\\r\\n|\\r|\\n)/g\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nconst voidElementTags = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true,\n menuitem: true,\n}\n\n/**\n * `formatElements` - parse string and return tree of react elements\n *\n * `value` is string to be formatted with <tag>Paired<tag/> or <tag/> (unpaired)\n * placeholders. `elements` is a array of react elements which indexes\n * correspond to element indexes in formatted string\n */\nfunction formatElements(\n value: string,\n elements: { [key: string]: React.ReactElement<any> } = {}\n): string | Array<any> {\n const uniqueId = makeCounter(0, \"$lingui$\")\n const parts = value.replace(nlRe, \"\").split(tagRe)\n\n // no inline elements, return\n if (parts.length === 1) return value\n\n const tree = []\n\n const before = parts.shift()\n if (before) tree.push(before)\n\n for (const [index, children, after] of getElements(parts)) {\n let element = elements[index]\n\n if (!element || (voidElementTags[element.type as string] && children)) {\n if (!element) {\n console.error(\n `Can't use element at index '${index}' as it is not declared in the original translation`\n )\n } else {\n console.error(\n `${element.type} is a void element tag therefore it must have no children`\n )\n }\n\n // ignore problematic element but push its children and elements after it\n element = React.createElement(React.Fragment)\n }\n\n tree.push(\n React.cloneElement(\n element,\n { key: uniqueId() },\n\n // format children for pair tags\n // unpaired tags might have children if it's a component passed as a variable\n children ? formatElements(children, elements) : element.props.children\n )\n )\n\n if (after) tree.push(after)\n }\n\n return tree\n}\n\n/*\n * `getElements` - return array of element indexes and element childrens\n *\n * `parts` is array of [pairedIndex, children, unpairedIndex, textAfter, ...]\n * where:\n * - `pairedIndex` is index of paired element (undef for unpaired)\n * - `children` are children of paired element (undef for unpaired)\n * - `unpairedIndex` is index of unpaired element (undef for paired)\n * - `textAfter` is string after all elements (empty string, if there's nothing)\n *\n * `parts` length is always multiply of 4\n *\n * Returns: Array<[elementIndex, children, after]>\n */\nfunction getElements(parts) {\n if (!parts.length) return []\n\n const [paired, children, unpaired, after] = parts.slice(0, 4)\n\n return [[paired || unpaired, children || \"\", after]].concat(\n getElements(parts.slice(4, parts.length))\n )\n}\n\nconst makeCounter =\n (count = 0, prefix = \"\") =>\n () =>\n `${prefix}_${count++}`\n\nexport { formatElements }\n","import React from \"react\"\n\nimport { useLingui } from \"./I18nProvider\"\nimport { formatElements } from \"./format\"\n\nexport type TransRenderProps = {\n id?: string\n translation?: React.ReactNode\n children?: React.ReactNode\n message?: string | null\n isTranslated?: boolean\n}\n\nexport type TransProps = {\n id: string\n message?: string\n values?: Record<string, unknown>\n components?: { [key: string]: React.ElementType | any }\n formats?: Record<string, unknown>\n children?: React.ReactNode\n component?: React.ComponentType<TransRenderProps>\n render?: (props: TransRenderProps) => React.ReactElement<any, any> | null\n}\n\nexport function Trans(props: TransProps): React.ReactElement<any, any> | null {\n const { i18n, defaultComponent } = useLingui()\n const { render, component, id, message, formats } = props\n\n const values = { ...(props.values || {}) }\n const components = { ...(props.components || {}) }\n\n if (values) {\n /*\n Related discussion: https://github.com/lingui/js-lingui/issues/183\n\n Values *might* contain React elements with static content.\n They're replaced with <INDEX /> placeholders and added to `components`.\n\n Example:\n Translation: Hello {name}\n Values: { name: <strong>Jane</strong> }\n\n It'll become \"Hello <0 />\" with components=[<strong>Jane</strong>]\n */\n\n Object.keys(values).forEach((key) => {\n const value = values[key]\n if (!React.isValidElement(value)) return\n\n const index = Object.keys(components).length\n\n components[index] = value\n values[key] = `<${index}/>`\n })\n }\n\n const _translation: string =\n i18n && typeof i18n._ === \"function\"\n ? i18n._(id, values, { message, formats })\n : id // i18n provider isn't loaded at all\n\n const translation = _translation\n ? formatElements(_translation, components)\n : null\n\n if (render === null || component === null) {\n // Although `string` is a valid react element, types only allow `Element`\n // Upstream issue: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544\n return translation as unknown as React.ReactElement<any, any>\n }\n\n const FallbackComponent = (defaultComponent ||\n React.Fragment) as React.ComponentType<any>\n\n const i18nProps = {\n id,\n message,\n translation,\n isTranslated: id !== translation && message !== translation,\n }\n\n // Validation of `render` and `component` props\n if (render && component) {\n console.error(\n \"You can't use both `component` and `render` prop at the same time. `component` is ignored.\"\n )\n } else if (render && typeof render !== \"function\") {\n console.error(\n `Invalid value supplied to prop \\`render\\`. It must be a function, provided ${render}`\n )\n } else if (component && typeof component !== \"function\") {\n // Apparently, both function components and class components are functions\n // See https://stackoverflow.com/a/41658173/1535540\n console.error(\n `Invalid value supplied to prop \\`component\\`. It must be a React component, provided ${component}`\n )\n return <FallbackComponent {...i18nProps}>{translation}</FallbackComponent>\n }\n\n // Rendering using a render prop\n if (typeof render === \"function\") {\n // Component: render={(props) => <a title={props.translation}>x</a>}\n return render(i18nProps)\n }\n\n // `component` prop has a higher precedence over `defaultComponent`\n const Component = (component || FallbackComponent) as React.ComponentType<any>\n const DefaultComponent = defaultComponent\n\n return DefaultComponent && !component ? (\n <DefaultComponent {...i18nProps}>{translation}</DefaultComponent>\n ) : (\n <Component>{translation}</Component>\n )\n}\n"],"names":["LinguiContext","React","createContext","useLingui","context","useContext","process","env","NODE_ENV","Error","I18nProvider","i18n","defaultComponent","forceRenderOnLocaleChange","children","makeContext","getRenderKey","locale","setContext","useState","renderKey","setRenderKey","useEffect","unsubscribe","on","console","log","tagRe","nlRe","voidElementTags","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","menuitem","formatElements","value","elements","uniqueId","makeCounter","parts","replace","split","length","tree","before","shift","push","index","after","getElements","element","type","error","createElement","Fragment","cloneElement","key","props","paired","unpaired","slice","concat","count","prefix","Trans","render","component","id","message","formats","values","components","Object","keys","forEach","isValidElement","_translation","_","translation","FallbackComponent","i18nProps","isTranslated","Component","DefaultComponent"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/I18nProvider.tsx","../../src/format.ts","../../src/Trans.tsx"],"sourcesContent":["import React, { ComponentType, FunctionComponent } from \"react\"\nimport { I18n } from \"@lingui/core\"\nimport { TransRenderProps } from \"./Trans\"\n\nexport type I18nContext = {\n i18n: I18n\n defaultComponent?: ComponentType<TransRenderProps>\n}\n\nexport type I18nProviderProps = I18nContext & {\n children?: React.ReactNode\n}\n\nexport const LinguiContext = React.createContext<I18nContext>(null)\n\nexport function useLingui(): I18nContext {\n const context = React.useContext<I18nContext>(LinguiContext)\n\n if (process.env.NODE_ENV !== \"production\") {\n if (context == null) {\n throw new Error(\"useLingui hook was used without I18nProvider.\")\n }\n }\n\n return context\n}\n\nexport const I18nProvider: FunctionComponent<I18nProviderProps> = ({\n i18n,\n defaultComponent,\n children,\n}) => {\n const latestKnownLocale = React.useRef<string | undefined>(i18n.locale)\n /**\n * We can't pass `i18n` object directly through context, because even when locale\n * or messages are changed, i18n object is still the same. Context provider compares\n * reference identity and suggested workaround is to create a wrapper object every time\n * we need to trigger re-render. See https://reactjs.org/docs/context.html#caveats.\n *\n * Due to this effect we also pass `defaultComponent` in the same context, instead\n * of creating a separate Provider/Consumer pair.\n *\n * We can't use useMemo hook either, because we want to recalculate value manually.\n */\n const makeContext = React.useCallback(\n () => ({\n i18n,\n defaultComponent,\n }),\n [i18n, defaultComponent]\n )\n\n const [context, setContext] = React.useState<I18nContext>(makeContext())\n\n /**\n * Subscribe for locale/message changes\n *\n * I18n object from `@lingui/core` is the single source of truth for all i18n related\n * data (active locale, catalogs). When new messages are loaded or locale is changed\n * we need to trigger re-rendering of LinguiContext.Consumers.\n */\n React.useEffect(() => {\n const updateContext = () => {\n latestKnownLocale.current = i18n.locale\n setContext(makeContext())\n }\n const unsubscribe = i18n.on(\"change\", updateContext)\n\n /**\n * unlikely, but if the locale changes before the onChange listener\n * was added, we need to trigger a rerender\n * */\n if (latestKnownLocale.current !== i18n.locale) {\n updateContext()\n }\n return unsubscribe\n }, [makeContext])\n\n if (!latestKnownLocale.current) {\n process.env.NODE_ENV === \"development\" &&\n console.log(\n \"I18nProvider rendered `null`. A call to `i18n.activate` needs to happen in order for translations to be activated and for the I18nProvider to render.\" +\n \"This is not an error but an informational message logged only in development.\"\n )\n return null\n }\n\n return (\n <LinguiContext.Provider value={context}>{children}</LinguiContext.Provider>\n )\n}\n","import React from \"react\"\n\n// match <tag>paired</tag> and <tag/> unpaired tags\nconst tagRe = /<([a-zA-Z0-9]+)>(.*?)<\\/\\1>|<([a-zA-Z0-9]+)\\/>/\nconst nlRe = /(?:\\r\\n|\\r|\\n)/g\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\nconst voidElementTags = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true,\n menuitem: true,\n}\n\n/**\n * `formatElements` - parse string and return tree of react elements\n *\n * `value` is string to be formatted with <tag>Paired<tag/> or <tag/> (unpaired)\n * placeholders. `elements` is a array of react elements which indexes\n * correspond to element indexes in formatted string\n */\nfunction formatElements(\n value: string,\n elements: { [key: string]: React.ReactElement<any> } = {}\n): string | Array<any> {\n const uniqueId = makeCounter(0, \"$lingui$\")\n const parts = value.replace(nlRe, \"\").split(tagRe)\n\n // no inline elements, return\n if (parts.length === 1) return value\n\n const tree = []\n\n const before = parts.shift()\n if (before) tree.push(before)\n\n for (const [index, children, after] of getElements(parts)) {\n let element = elements[index]\n\n if (!element || (voidElementTags[element.type as string] && children)) {\n if (!element) {\n console.error(\n `Can't use element at index '${index}' as it is not declared in the original translation`\n )\n } else {\n console.error(\n `${element.type} is a void element tag therefore it must have no children`\n )\n }\n\n // ignore problematic element but push its children and elements after it\n element = React.createElement(React.Fragment)\n }\n\n tree.push(\n React.cloneElement(\n element,\n { key: uniqueId() },\n\n // format children for pair tags\n // unpaired tags might have children if it's a component passed as a variable\n children ? formatElements(children, elements) : element.props.children\n )\n )\n\n if (after) tree.push(after)\n }\n\n return tree\n}\n\n/*\n * `getElements` - return array of element indexes and element childrens\n *\n * `parts` is array of [pairedIndex, children, unpairedIndex, textAfter, ...]\n * where:\n * - `pairedIndex` is index of paired element (undef for unpaired)\n * - `children` are children of paired element (undef for unpaired)\n * - `unpairedIndex` is index of unpaired element (undef for paired)\n * - `textAfter` is string after all elements (empty string, if there's nothing)\n *\n * `parts` length is always multiply of 4\n *\n * Returns: Array<[elementIndex, children, after]>\n */\nfunction getElements(parts) {\n if (!parts.length) return []\n\n const [paired, children, unpaired, after] = parts.slice(0, 4)\n\n return [[paired || unpaired, children || \"\", after]].concat(\n getElements(parts.slice(4, parts.length))\n )\n}\n\nconst makeCounter =\n (count = 0, prefix = \"\") =>\n () =>\n `${prefix}_${count++}`\n\nexport { formatElements }\n","import React from \"react\"\n\nimport { useLingui } from \"./I18nProvider\"\nimport { formatElements } from \"./format\"\n\nexport type TransRenderProps = {\n id?: string\n translation?: React.ReactNode\n children?: React.ReactNode\n message?: string | null\n isTranslated?: boolean\n}\n\nexport type TransProps = {\n id: string\n message?: string\n values?: Record<string, unknown>\n components?: { [key: string]: React.ElementType | any }\n formats?: Record<string, unknown>\n children?: React.ReactNode\n component?: React.ComponentType<TransRenderProps>\n render?: (props: TransRenderProps) => React.ReactElement<any, any> | null\n}\n\nexport function Trans(props: TransProps): React.ReactElement<any, any> | null {\n const { i18n, defaultComponent } = useLingui()\n const { render, component, id, message, formats } = props\n\n const values = { ...(props.values || {}) }\n const components = { ...(props.components || {}) }\n\n if (values) {\n /*\n Related discussion: https://github.com/lingui/js-lingui/issues/183\n\n Values *might* contain React elements with static content.\n They're replaced with <INDEX /> placeholders and added to `components`.\n\n Example:\n Translation: Hello {name}\n Values: { name: <strong>Jane</strong> }\n\n It'll become \"Hello <0 />\" with components=[<strong>Jane</strong>]\n */\n\n Object.keys(values).forEach((key) => {\n const value = values[key]\n if (!React.isValidElement(value)) return\n\n const index = Object.keys(components).length\n\n components[index] = value\n values[key] = `<${index}/>`\n })\n }\n\n const _translation: string =\n i18n && typeof i18n._ === \"function\"\n ? i18n._(id, values, { message, formats })\n : id // i18n provider isn't loaded at all\n\n const translation = _translation\n ? formatElements(_translation, components)\n : null\n\n if (render === null || component === null) {\n // Although `string` is a valid react element, types only allow `Element`\n // Upstream issue: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544\n return translation as unknown as React.ReactElement<any, any>\n }\n\n const FallbackComponent = (defaultComponent ||\n React.Fragment) as React.ComponentType<any>\n\n const i18nProps = {\n id,\n message,\n translation,\n isTranslated: id !== translation && message !== translation,\n }\n\n // Validation of `render` and `component` props\n if (render && component) {\n console.error(\n \"You can't use both `component` and `render` prop at the same time. `component` is ignored.\"\n )\n } else if (render && typeof render !== \"function\") {\n console.error(\n `Invalid value supplied to prop \\`render\\`. It must be a function, provided ${render}`\n )\n } else if (component && typeof component !== \"function\") {\n // Apparently, both function components and class components are functions\n // See https://stackoverflow.com/a/41658173/1535540\n console.error(\n `Invalid value supplied to prop \\`component\\`. It must be a React component, provided ${component}`\n )\n return <FallbackComponent {...i18nProps}>{translation}</FallbackComponent>\n }\n\n // Rendering using a render prop\n if (typeof render === \"function\") {\n // Component: render={(props) => <a title={props.translation}>x</a>}\n return render(i18nProps)\n }\n\n // `component` prop has a higher precedence over `defaultComponent`\n const Component = (component || FallbackComponent) as React.ComponentType<any>\n const DefaultComponent = defaultComponent\n\n return DefaultComponent && !component ? (\n <DefaultComponent {...i18nProps}>{translation}</DefaultComponent>\n ) : (\n <Component>{translation}</Component>\n )\n}\n"],"names":["LinguiContext","React","createContext","useLingui","context","useContext","process","env","NODE_ENV","Error","I18nProvider","i18n","defaultComponent","children","latestKnownLocale","useRef","locale","makeContext","useCallback","setContext","useState","useEffect","updateContext","current","unsubscribe","on","console","log","tagRe","nlRe","voidElementTags","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","menuitem","formatElements","value","elements","uniqueId","makeCounter","parts","replace","split","length","tree","before","shift","push","index","after","getElements","element","type","error","createElement","Fragment","cloneElement","key","props","paired","unpaired","slice","concat","count","prefix","Trans","render","component","id","message","formats","values","components","Object","keys","forEach","isValidElement","_translation","_","translation","FallbackComponent","i18nProps","isTranslated","Component","DefaultComponent"],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -27,10 +27,10 @@ type I18nContext = {
27
27
  defaultComponent?: ComponentType<TransRenderProps>;
28
28
  };
29
29
  type I18nProviderProps = I18nContext & {
30
- forceRenderOnLocaleChange?: boolean;
31
30
  children?: React.ReactNode;
32
31
  };
32
+ declare const LinguiContext: React.Context<I18nContext>;
33
33
  declare function useLingui(): I18nContext;
34
34
  declare const I18nProvider: FunctionComponent<I18nProviderProps>;
35
35
 
36
- export { I18nContext, I18nProvider, I18nProviderProps, Trans, TransProps, TransRenderProps, useLingui };
36
+ export { I18nContext, I18nProvider, I18nProviderProps, LinguiContext, Trans, TransProps, TransRenderProps, useLingui };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lingui/react",
3
- "version": "4.0.0-next.2",
3
+ "version": "4.0.0-next.3",
4
4
  "sideEffects": false,
5
5
  "description": "React components for translations",
6
6
  "main": "./build/cjs/index.js",
@@ -54,10 +54,10 @@
54
54
  },
55
55
  "dependencies": {
56
56
  "@babel/runtime": "^7.20.13",
57
- "@lingui/core": "^4.0.0-next.2"
57
+ "@lingui/core": "^4.0.0-next.3"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@testing-library/react": "^11.0.4"
61
61
  },
62
- "gitHead": "556ab57e20c2ac9d384a22424c6a90c2ba0dd133"
62
+ "gitHead": "29cad1bdcc781994ac4d496e5c4937795423d405"
63
63
  }