Sourced from react's releases.
19.3.1 (October 14th, 2026)
React Server Components
- Improve transport protocol (#37845 by
@unstubbableand@eps1lon)
61aa00d
[19.3.x][Flight] Improve transport protocol (#37845)Sourced from react-dom's releases.
19.3.1 (October 14th, 2026)
React Server Components
- Improve transport protocol (#37845 by
@unstubbableand@eps1lon)
61aa00d
[19.3.x][Flight] Improve transport protocol (#37845)Sourced from react-i18next's changelog.
17.0.19
- fix:
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.- fix:
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.17.0.18
- fix(Trans): with
shouldUnescape, the defaultunescapenow turns and&[#160](https://github.com/i18next/react-i18next/issues/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).17.0.17
- perf:
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.
d576d09
17.0.19d69464b
build36e327a
fix(useTranslation): keep t stable for an inline selector keyPrefixf17e708
17.0.18b799c19
build, changelog for 17.0.187a55f56
fix: unescape and  
to a no-break space (#1935)511e1f2
17.0.17699eae3
build5a88fe6
perf(useTranslation): stop resubscribing the i18n listeners on every
renderc4ee2c9
build