# i18next v26.4.0 - Product: i18next (https://whatsnew.fyi/product/i18next) - Vendor: i18next - Date: 2026-08-20 - Version: v26.4.0 - Original notes: https://github.com/i18next/i18next/releases/tag/v26.4.0 - Permalink: https://whatsnew.fyi/product/i18next/releases/v26.4.0 What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **changed** — Cache `toResolveHierarchy` results per `(code, fallbackCode)` pair to reduce per-call overhead from ~886 ns to ~41 ns in render-heavy UIs - **changed** — Invalidate the hierarchy cache automatically when `options.fallbackLng` changes through reassignment or in-place array mutation - **changed** — Require calling `i18next.services.languageUtils.clearCache()` manually after runtime mutations of resolution-relevant options (`load`, `lowerCaseLng`, `cleanCode`, `nonExplicitSupportedLngs`) - **changed** — Update all devDependencies and replace `sinon` with `nise` + `vitest.spyOn` in v1 compatibility tests - perf: cache `toResolveHierarchy` results per `(code, fallbackCode)` pair. The hierarchy resolver runs on every `t()` call and calls `Intl.getCanonicalLocales` multiple times, which showed up prominently when profiling render-heavy UIs (e.g. virtualized data grids); with the cache the per-call cost drops from ~886 ns to ~41 ns. The cache is invalidated automatically when `options.fallbackLng` changes (reassignment or in-place array mutation); if you mutate other resolution-relevant options at runtime (`load`, `lowerCaseLng`, `cleanCode`, `nonExplicitSupportedLngs`), call `i18next.services.languageUtils.clearCache()` afterwards. Function-valued `fallbackLng` and per-call array/object `fallbackLng` options are never cached, so dynamic fallbacks keep working as before. Thanks @equaterina ([#2444](https://github.com/i18next/i18next/pull/2444)). - chore: update all devDependencies (Babel stays on 7.x until `@rollup/plugin-babel` supports 8, eslint on 9.x for neostandard). Removed the unused `coveralls` package (CI uses the Coveralls GitHub Action) and replaced `sinon` with `nise` + `vitest.spyOn` in the v1 compatibility tests, which resolves all open `npm audit` findings (0 vulnerabilities) and should close the dependabot alerts on the lockfile.