Repository navigation
chore(deps): update react-i18next to 17.1.9 - #22
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
March 28, 2026 14:05
e940920 to
a04f770
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
March 31, 2026 06:32
a04f770 to
ac80de2
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
April 15, 2026 14:02
ac80de2 to
0a69e43
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
April 17, 2026 07:57
0a69e43 to
ff3c5cd
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
April 27, 2026 16:52
ff3c5cd to
798ae75
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
May 7, 2026 06:35
798ae75 to
27cd3d9
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
May 14, 2026 15:35
27cd3d9 to
1c05b5a
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
May 14, 2026 22:46
1c05b5a to
3a9021a
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
July 9, 2026 18:40
3a9021a to
7aaf189
Compare
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
July 15, 2026 23:32
7aaf189 to
c05569c
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
July 23, 2026 00:00
c05569c to
b41a12b
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
August 20, 2026 11:55
b41a12b to
bb3cce1
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
September 1, 2026 14:48
bb3cce1 to
65d1887
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
September 13, 2026 18:56
65d1887 to
c275f86
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
September 21, 2026 22:45
c275f86 to
295c664
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 6, 2026 17:38
295c664 to
3db830d
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 15, 2026 20:45
3db830d to
b6a1ca5
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 16, 2026 07:13
b6a1ca5 to
9dde3d2
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 16, 2026 16:32
9dde3d2 to
9e0417a
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 17, 2026 14:43
9e0417a to
599b2b4
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 17, 2026 22:46
599b2b4 to
84c7277
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
2 times, most recently
from
October 23, 2026 00:07
bbfde72 to
5bbe10b
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 23, 2026 18:00
5bbe10b to
2708124
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 23, 2026 23:40
2708124 to
4411717
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 24, 2026 06:55
4411717 to
0cb1e0a
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 24, 2026 10:33
0cb1e0a to
163b915
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 24, 2026 18:34
163b915 to
360a055
Compare
renovate
Bot
force-pushed
the
renovate/react-i18next-17.x
branch
from
October 25, 2026 18:21
360a055 to
ea4c04e
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
This PR body was truncated due to platform limits.
This PR contains the following updates:
16.5.2→17.1.9Release Notes
i18next/react-i18next (react-i18next)
v17.1.9Compare Source
nsarray are now picked up. The hook used the array itself as theuseMemodependency list, and React only compares the entries both lists have in common when its length changes, so going fromuseTranslation(['nsA'])touseTranslation(['nsA', 'nsB'])kept returning['nsA']: React warned that the dependency array changed size,nsBwas never loaded, and withnsMode: 'fallback'keys only innsBrendered as the key. Removing a namespace kept the old list the same way. The namespaces are now compared by content, so a growing list loads the new namespace (suspending until it is loaded, as switching from'nsA'to'nsB'already does) andtuses it. Lists that keep their length behave as before. Thanks @lprnmns (#1945).v17.1.8Compare Source
formatis no longer dropped.Transreadsformatin an interpolation object as the formatter name ({{ value, format }}), so with{{ format }}as the only key nothing was left:<Trans>Export as {{ format }}</Trans>warnedTRANS_INVALID_OBJand used the default stringExport asinstead ofExport as {{format}}. Whenformatis the object's only key it is now treated as the variable.{{ value, format }}works as before. Without ani18nKey, the key derived from the children changes accordingly, fromExport astoExport as {{format}}. i18next-cli serializesTranschildren with react-i18next, so extracting with this version produces the same key. Thanks @Pharex38 (#1944).v17.1.7Compare Source
"Write &#​169; to get &#​169;"renderedWrite © to get ©instead ofWrite &#​169; to get ©, and&#​60;rendered<instead of&#​60;. This also hit interpolated values withescapeValue: true, where a value containing&#​60;is escaped to&#​60;. Escaped named entities like&lt;already stayed<, as browsers andTransdecode them. Unknown named entities and entities above U+10FFFF still stay as written. Thanks @Pharex38 (#1943).v17.1.6Compare Source
countpassed intOptionsis now used.TransspreadtOptionsand then set its owncountprop, so a count only intOptionswas overwritten withundefined:<Trans i18nKey="items" tOptions={{ count: 5 }} />rendered the keyitemsinstead of5 items, and with childrenTranscould pick the wrong plural form. Likecontext,Transnow falls back totOptions.count, handled the same way as thecountprop. Acountprop, a count in the children orvalues.countstill take precedence, andtOptionsis not modified. Thanks @nk-batman21 (#1942).v17.1.5Compare Source
Transnow falls back to the last key when none of them has a translation, ast()does. It used the array itself asdefaultValue, which i18next handles as an object, so<Trans i18nKey={['notifications.crm_item_created', 'crm_item_created']} components={[<strong />]} />renderedkey 'crm_item_created (en)' returned an object instead of string.instead ofcrm_item_created. An array of selectors falls back to the key of the last selector. The first key that has a translation still wins, andchildren,defaultsandtOptions.defaultValueare used as before. WithsaveMissing, these calls now report the missing key, like a singlei18nKeydoes. Thanks @nk-batman21 (#1941).v17.1.4Compare Source
allowObjectInHTMLChildren, thechildrenof HTML elements now use React's own type (DOMAttributes<T>['children']) instead of theReactI18NextChildren | Iterable<ReactI18NextChildren>union. Both accept the same children, so nothing compiles differently. For default installs the globalHTMLAttributesaugmentation now repeats whatever@types/reactdeclares, so changes in React's types flow through instead of meeting a copy, and type errors on element children no longer list an extraIterable<...>. WithallowObjectInHTMLChildren: truenothing changes. First step of #1928.v17.1.3Compare Source
"Hello 👋 <0>friend</0> &#​127881;"rendered U+F44B and U+F389, private-use glyphs that usually show as a box, instead of 👋 and 🎉: the decoder usedString.fromCharCode, which keeps only the low 16 bits of the code point. This shows up with translations that a TMS or CMS exports HTML-encoded. Entities above U+10FFFF, which are no valid code points, now stay as written instead of becoming U+0000. Entities below U+10000, including surrogate pairs written as two entities, decode as before. Thanks @nk-batman21 (#1940).v17.1.2Compare Source
<Trans i18nKey="welcome">Welcome</Trans>with"Welcome <1>friend</1>"renderedWelcome e, anddefaults="Hi <1>there</1>"with the childHirenderedHi i. The fallback for a single object of components ({{ 1: <strong /> }}) looked the tag up on the string and rendered one of its characters. It now applies only when that child is an object, so{{ 1: <strong /> }}renders as before, and the tag falls back to its inner text, as it already did with several children or with a number or an element as the only child. This also stops a single-entry array child holdingnull({[null]}, e.g. from a.mapthat returnednull) from throwingCannot read properties of null. Thanks @Cayan (#1939).v17.1.1Compare Source
componentsas an object with index keys, the component for key0is now rendered.components={{ 0: <a href={path} /> }}with"You're eligible. <0>Get started here.</0>"rendered the text without the link, a self-closing<0/>rendered nothing, and in<0>a <1>b</1></0>both elements were lost, while keys1and up and the array form worked. The object was passed on as the indexed children, so<0>resolved to the object itself. It is now looked up by key, like a named components map. This also fixes an arraycomponentsnext toreact.transDefaultProps.components, which the merge turns into such an object ({ Bold, 0, 1 }) and so lost its first entry, and a self-closing named tag in a mixed object ({ 0: <a />, Bold: <b /> }with<Bold/>), which rendered as the text<Bold />. Arrays, named maps and index objects starting at1render as before. Thanks @nk-batman21 (#1938).v17.1.0Compare Source
parseInterpolation: 'icu'(or'mf2') type option (i18next v26.5.0), thevaluesofIcuTransandIcuTransWithoutContextare typed from the message ofi18nKey, like the options oft(): a misspelled argument, a value of the wrong type or a value meant for another key is a type error.valueswasRecord<string, any>before, and still is with any otherparseInterpolationsetting.valuesstays optional, as onTrans.useTranslation'standTransvaluesget the checks from i18next's types without changes here.IcuTransandIcuTransWithoutContextnow infer the literali18nKey(consttype parameter, asTransdoes), so props that depend on the key are checked against that key instead of all keys of the namespace.v17.0.21Compare Source
valuesnow win overinterpolation.defaultVariables, as they do int().IcuTransmerged them the other way round, so<IcuTrans values={{ user: 'John Doe' }} />rendered the configured default variableuserinstead ofJohn Doe.Transhad the same inverted merge and is fixed too. Compatibility note: only names that are set both invaluesand indefaultVariablesrender differently.react-i18next/IcuTransWithoutContext(with types) for React Server Components. ImportingIcuTransWithoutContextfromreact-i18nextin a Server Component could fail the build withcreateContext is not a function, because the main entry creates the React context when it is loaded. Likereact-i18next/TransWithoutContext, the new entry point does not.dist/es/package.jsonnow declares"sideEffects": false, like the rootpackage.jsonalready did. Bundlers use the nearestpackage.json, so the ESM build counted as having side effects and unused exports were kept: an app that only usesTransstill bundledIcuTranswith its HTML entity decoder,useTranslationanduse-sync-external-store. With esbuild, aTrans-only bundle (React and i18next external) goes from 20.9 KB to 11.6 KB minified, 8.3 KB to 5.0 KB gzipped.icu.macroBabel macro is now marked as deprecated in favour of usingIcuTransdirectly. It fails on Babel 8 (t.jSXIdentifier is not a function),<Plural count={count}>renders the raw ICU message, and a Reactkeyon<Plural>/<Select>becomes an ICU case. It keeps working on Babel 7 and is not removed. TheIcuTransdocs page has a corrected example and props table and covers Server Components.v17.0.20Compare Source
useTranslationno longer suspends when a missing namespace is loaded by a synchronous backend. WithuseSuspense(the default), a namespace that wasn't in the store yet always made the component throw the loading promise, even when the backend had already delivered the resources while that promise was being created. React then showed theSuspensefallback and rendered again right away, which appears as a fallback flash (a white flash in React Native) and costs performance. The hook now starts the load first, checks the store again and only suspends if the namespace is still missing. This helps every backend that calls back synchronously, for examplei18next-resources-to-backendwith a static resources object or a loader that returns the data directly. Async backends, and an instance that isn't initialized yet, still suspend as before. Thanks @oblador (#1937).v17.0.19Compare Source
useTranslationwith an inline selectorkeyPrefix(useTranslation('ns', { keyPrefix: ($) => $.role })) returned a newton every render, so every effect,useCallbackanduseMemodepending ontran again each time. The cachedtwas compared against thekeyPrefixfunction itself, and an inline arrow is a new function on every render. It is now compared against the key the selector resolves to (with the same options and namespace listgetFixedTresolves it with), sotkeeps its identity as long as the resolved prefix does, just like a stringkeyPrefix. A selector that resolves to a different key still gets a newt, and i18next still resolves the selector on eachtcall as before. Fixes #1936.useTranslationkept returning the previoustwhen only the namespace (useTranslation('a')→useTranslation('b')) or only the i18n instance (another instance with the same language, via props orI18nextProvider) changed on a mounted component. Thattkept resolving against the old namespace or instance until something else (the language, the ready state, a bound i18n event) produced a new one. Both are now part of the check that decides whether the cachedtcan be reused.v17.0.18Compare Source
shouldUnescape, the defaultunescapenow turns and&#​160;into a no-break space (U+00A0) instead of a regular space (U+0020). The regular space dropped what the entity is for:u násor10 kmcould wrap across lines, and consecutive s collapsed into one space. This also matchesIcuTrans, whose entity decoder already mapped to U+00A0. Compatibility note: only affectsshouldUnescape; snapshots or exacttextContentcomparisons of such text now contain U+00A0 (Testing Library's default normalizer still matches it as a space). A customreact.unescapefunction can restore the old mapping for text nodes. Thanks @lprnmns (#1935).v17.0.17Compare Source
useTranslationno longer unsubscribes and resubscribes its i18n listeners on every render. Thesubscribecallback handed touseSyncExternalStoredepended on the merged options object, which is rebuilt wheneverpropsis a new object: with no options (the{}default), with options passed inline (useTranslation('ns', { keyPrefix })), and throughwithTranslationand<Translation>. A newsubscribemakes React resubscribe, so each render of each caller rani18n.offandi18n.onin an extra effect. It now depends only on the instance and thebindI18n/bindI18nStoreevent names. No updates were ever missed, because React re-checks the snapshot after resubscribing; this only removes the churn, which adds up with many mounted components that re-render often. Reported via next-i18next#2349.v17.0.16Compare Source
i18nKeythat points into a secondary namespace ofuseTranslationnow resolves the same wayt()does. Withconst { t } = useTranslation(['ns1', 'ns2']),t($ => $.ns2.message)works since 17.0.7, but<Trans t={t} i18nKey={$ => $.ns2.message} />rendered the raw key (or its children).Transalways passed annsoption tot, filled fromt.ns(the primary namespace only), and an explicitnsmakes i18next's fixedtskip the hook's full namespace list (scopeNs). WhenTransorTransWithoutContextgets atthat carries its own namespace and nonsprop, it now leavesnsout and lets thattapply its own. String keys,keyPrefix,nsMode: 'fallback', an explicitnsprop andTranswithout atprop behave as before. Compatibility note: if the primary namespace has a nested object named like a secondary namespace (ns1→ns2.message),Transnow resolves$ => $.ns2.messagetons2:message, ast()already does. Fixes #1933.v17.0.15Compare Source
<wrap></wrap>), a component array (<0></0>), or indexed JSX children (<1></1>). This matches the existing behavior for two or more children and self-closing tags. React represents one JSX child as an element and multiple children as an array; the previous array-only check silently rendered the one-child case empty. Compatibility note: when that sole element contains an interpolation object, the restored raw children can expose an existing React rendering limitation as an error instead of silently rendering empty; the same shape already errors with two children. Fixes #1932.v17.0.14Compare Source
i18nobject returned byuseTranslationwas only refreshed wheni18n.languagechanged, so aresolvedLanguage(orlanguages) change of its own kept handing components the previous snapshot. That happens whenever the translations for the current language arrive after the switch — i18next resolves to the fallback until its store has them — and components readingi18n.resolvedLanguage(language switchers, for example) then stayed one switch behind. The cached wrapper is now keyed on all three language fields, which are exactly the ones the surroundinguseMemoalready depends on; wrapper identity still only changes when the language state does, so the caching from #1885 is unaffected. Reported via next-i18next#2348.v17.0.13Compare Source
keyPrefixoverload ofuseTranslation()is now available underenableSelector: 'strict'.useTranslationwas gated ontrue | 'optimize'only, so under'strict'it resolved to the legacy signature and the selector overload disappeared entirely (keyPrefix: ($) => $.ns.foofailed withType '($: any) => any' is not assignable to type 'undefined').Transalready handled all three modes. Companion to the same fix forgetFixedTin i18next#2446. Thanks @hovelopin (#1930).v17.0.12Compare Source
icu.macronodes (<Trans>Welcome, {name}!</Trans>,<Select>,<Plural>withouti18nKey) rendered an empty string since 17.0.0. The macro now emits<IcuTrans defaultTranslation="…">without a key andIcuTranspassedundefinedtot(), which returns''. LikeTrans,IcuTransnow usesdefaultTranslationas the key wheni18nKeyis not provided.v17.0.11Compare Source
html-parse-stringifyupdated to^4.0.1. The parser powering<Trans>is now actively maintained under the i18next org (i18next/html-parse-stringify) after years without upstream releases. 4.x brings modern dual ESM/CJS packaging with anexportsmap, zero runtime dependencies, reworked TypeScript types and a long list of parser fixes (literal<in text, multiline/CRLF attribute values, comments containing>, doctype handling, quote-aware bracket handling).escapeLiteralLessThanscanner (~80 lines) is replaced by the parser's newallowedTagsoption with identical semantics: only numbered tags, kept basic HTML tags and known component names are parsed as markup, any other tag-shaped sequence in the translation stays literal text. Rendered output is unchanged (all 493 tests pass, including the #1880 and #1893 escaping cases).v17.0.10Compare Source
useTranslationandTrans"You will need to pass in an i18next instance" warnings now match theuseSSRwording, mentioning the props/context alternatives and the most common unexplained cause at scale: duplicate react-i18next copies in monorepo setups. TheTransvariant also referenced the internali18nextReactModulename; it now points to the publicinitReactI18nextAPI.SUSPENDED_WHILE_LOADING, logged once) right beforeuseTranslationsuspends while translations are loading. With the defaultuseSuspense: trueand no<Suspense>boundary this previously surfaced as a blank screen or a cryptic React error; the warning now names both fixes (add a<Suspense>boundary or setreact.useSuspense: false). No-op in production builds; theprocess.env.NODE_ENVcheck is wrapped so runtimes without aprocessglobal (raw ESM in the browser, some edge runtimes) stay silent instead of throwing.@types/react@next/@types/react-dom@next, so the next React major's type changes (like the React 18TFunctionResult/children wave) surface before user reports.v17.0.9Compare Source
typescriptpeer dependency range (^5 || ^6 || ^7). Withtypescript@7.0.2in a project,npm installfailed with anERESOLVEpeer conflict. Fixes #1927, thanks @andikapradanaarif.<Trans t={t} ns="ns" …>with atfromuseTranslation(['ns'])now typechecks under TypeScript 7. TS7 intersects theNsinference candidates coming from thetprop (readonly ['ns']) and thensprop ('ns') into an unsatisfiable'ns' & readonly ['ns'], where TS6 resolved them. Thensprop onTransProps,TransSelectorPropsandIcuTransWithoutContextPropsnow also accepts a single namespace out of an array-typedNs(Ns | (Ns extends readonly (infer S extends string)[] ? S : never)) — which matches runtime behavior and is unchanged under TS5/TS6.v17.0.8Compare Source
<Trans i18nKey={$ => ...}>now typechecks underenableSelector: 'strict'. TheTranscomponent's conditional type was gated on_EnableSelector extends true | 'optimize', excluding'strict'and falling back to the legacy string-key signature. Runtime was already correct (it callskeyFromSelector(i18nKey)whenevertypeof i18nKey === 'function'); this is a type-only fix that widens the conditional to include'strict'. Thanks @Faithfinder (#1921)v17.0.7Compare Source
useTranslation([nsA, nsB, ...])now passes its full namespace list togetFixedTvia the newscopeNsopt (requiresi18next≥ v26.0.10). This makes selector calls with a secondary-namespace prefix resolve correctly under defaultnsMode:t($ => $.nsB.foo)previously missed silently because the boundnswas the primary string only and i18next's selector rewrite needed an array. Resolution semantics are unchanged — plaint('key')lookups still stay isolated to the primary namespace by default; usensMode: 'fallback'to opt into multi-ns fallback resolution as before. Fixes i18next#2429 foruseTranslation-based callers.v17.0.6Compare Source
nodesToStringoutput format consumed byi18next-cli's extractor while still rendering 1919 correctlynodesToStringproduced, which inadvertently changed the extracted translation strings for keep-tags wrapping non-keep React elements<N>placeholders nested inside a keep-tag are scoped to that tag's own original React children (matching kept tags by name and positional occurrence at each level), so the translation string format produced bynodesToStringis unchangedv17.0.5Compare Source
<Trans />no longer breaks child rendering when a kept HTML node (transKeepBasicHtmlNodesFor) wraps a non-keep React element 1919 — superseded by 17.0.6, which keeps the same runtime fix without changing thenodesToStringoutputv17.0.4Compare Source
React does not recognize the 'i18nIsDynamicList' prop on a DOM elementwarning 1915v17.0.3Compare Source
React.Fragmentinside<Trans />1914v17.0.2Compare Source
valuesnow win overinterpolation.defaultVariables, as they do int().IcuTransmerged them the other way round, so<IcuTrans values={{ user: 'John Doe' }} />rendered the configured default variableuserinstead ofJohn Doe.Transhad the same inverted merge and is fixed too. Compatibility note: only names that are set both invaluesand indefaultVariablesrender differently.react-i18next/IcuTransWithoutContext(with types) for React Server Components. ImportingIcuTransWithoutContextfromreact-i18nextin a Server Component could fail the build withcreateContext is not a function, because the main entry creates the React context when it is loaded. Likereact-i18next/TransWithoutContext, the new entry point does not.dist/es/package.jsonnow declares"sideEffects": false, like the rootpackage.jsonalready did. Bundlers use the nearestpackage.json, so the ESM build counted as having side effects and unused exports were kept: an app that only usesTransstill bundledIcuTranswith its HTML entity decoder,useTranslationanduse-sync-external-store. With esbuild, aTrans-only bundle (React and i18next external) goes from 20.9 KB to 11.6 KB minified, 8.3 KB to 5.0 KB gzipped.icu.macroBabel macro is now marked as deprecated in favour of usingIcuTransdirectly. It fails on Babel 8 (t.jSXIdentifier is not a function),<Plural count={count}>renders the raw ICU message, and a Reactkeyon<Plural>/<Select>becomes an ICU case. It keeps working on Babel 7 and is not removed. TheIcuTransdocs page has a corrected example and props table and covers Server Components.v17.0.1Compare Source
useTranslationwith an inline selectorkeyPrefix(useTranslation('ns', { keyPrefix: ($) => $.role })) returned a newton every render, so every effect,useCallbackanduseMemodepending ontran again each time. The cachedtwas compared against thekeyPrefixfunction itself, and an inline arrow is a new function on every render. It is now compared against the key the selector resolves to (with the same options and namespace listgetFixedTresolves it with), sotkeeps its identity as long as the resolved prefix does, just like a stringkeyPrefix. A selector that resolves to a different key still gets a newt, and i18next still resolves the selector on eachtcall as before. Fixes #1936.useTranslationkept returning the previoustwhen only the namespace (useTranslation('a')→useTranslation('b')) or only the i18n instance (another instance with the same language, via props orI18nextProvider) changed on a mounted component. Thattkept resolving against the old namespace or instance until something else (the language, the ready state, a bound i18n event) produced a new one. Both are now part of the check that decides whether the cachedtcan be reused.v17.0.0Compare Source
Potentially breaking changes
transKeepBasicHtmlNodesFornow correctly preserves HTML tag names when children contain interpolations or mixed content 230<strong>{{name}}</strong>was incorrectly serialized as<1>{{name}}</1>— the tag name was only preserved for plain string childreni18nKeyis provided)Other changes
16.6.6
>= 25.10.9to match required type exports (ConstrainTarget,ApplyTarget,GetSource) used byTransSelector191116.6.5
useTranslationno longer matches whenkeyPrefixis absent, fixingdefaultNS: falsewith explicitnsoption 241216.6.4
16.6.3
TransSelectoroverloads into a single signature sotypeof Transremains extendable 190916.6.2
useTranslationnow accepts selector functions askeyPrefixwith full type-safe key narrowing whenenableSelectoris enabled 236716.6.1
<Trans i18nKey={sk} />to accept aSelectorKey236416.6.0
tis called beforereadywithuseSuspense: false1896valuesprop on<Trans />component — interpolation variables are now inferred from the translation string when custom types are configured 177216.5.8
16.5.7
<Trans>component withenableSelector: truedoes not support multiple selectors for fallbacks 190716.5.6
useSSRwheninit()hasn't been called beforeuseSSR— now logs a warning instead of throwing 160416.5.5
useSSR,getInitialPropsandTranslationwhen no i18next instance is available (e.g. in monorepo setups with duplicatereact-i18nextcopies) — now logs a clear warning instead of throwing 160416.5.4
16.5.3
16.5.2
16.5.1
nodesToString(runtime + TypeScript typings) to supporti18next-cli(i18next/i18next-cli#155)16.5.0
transDefaultPropsto set default props for the Trans component (e.g.tOptions,shouldUnescape,values) 189516.4.1
&quot;/&#​39;. 189316.4.0
<Trans count>prop: optional - infer count from children 189116.3.5
16.3.4
<Trans>1887, by still trying to fix element.ref access issue with react 19 184616.3.3
16.3.2
16.3.1
16.3.0
16.2.4
16.2.3
16.2.2
16.2.1
16.2.0
16.1.6
16.1.5
16.1.4
16.1.3
16.1.2
16.1.1
IcuTranscomponent 187316.1.0
IcuTranscomponent 186916.0.1
16.0.0
15.7.4
15.7.3
15.7.2
15.7.1
15.7.0
15.6.1
avoid exception when passing bindI18n: false 1856
15.6.0
fix: passing components as object should still allow for indexed matching of children 1854
15.5.3
chore: update
@babel/runtime185115.5.2
fix element.ref access issue with react 19 1846
15.5.1
add typescript as optional peer dependency 1843
15.5.0
feat: use const type parameters for useTranslation() 1842
15.4.1
fix: unique key warning on componentized element 1835
15.4.0
feat: add meta with codes on warnings to allow conditional logging 1826
15.3.0
Uses the i18next logger instead of the default console logger, if there is a valid i18next instance. Now the debug i18next option is respected, and you can also inject your own logger module: https://www.i18next.com/misc/creating-own-plugins#logger
15.2.0
This version may be breaking if you still use React < v18 with TypeScript.
For JS users this version is equal to v15.1.4
15.1.4
15.1.3
15.1.2
15.1.1
15.1.0
<Trans />warns 'Each child in a list should have a unique "key" prop.' for react 19 180615.0.3
15.0.2
15.0.1
15.0.0
14.1.3
14.1.2
14.1.1
14.1.0
Trans): add typechecking on context prop 1732 (might break if using "internal"TransorTransProps)14.0.8
14.0.7
14.0.6
14.0.5
14.0.4
14.0.3
14.0.2
14.0.1
CustomInstanceExtensions171314.0.0
13.5.0
13.4.1
13.4.0
13.3.2
13.3.1
13.3.0
13.2.2
13.2.1
13.2.0
13.1.2
13.1.1
13.1.0
13.0.3
13.0.2
13.0.1
13.0.0
12.3.1
12.3.0
12.2.2
12.2.1
12.2.0
12.1.5
12.1.4
12.1.3
12.1.2
12.1.1
12.1.0
12.0.0
11.18.6
11.18.5
11.18.4
11.18.3
11.18.2
11.18.1
11.18.0
11.17.4
11.17.3
11.17.2
11.17.1
11.17.0
11.16.11
11.16.10
11.16.9
11.16.8
11.16.7
11.16.6
11.16.5
11.16.4
11.16.3
11.16.2
11.16.1
11.16.0
11.15.7
11.15.6
11.15.5
11.15.4
11.15.3
11.15.2
11.15.1
11.15.0
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.