Update i18next (major) - #2196
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/major-i18next
branch
from
September 20, 2026 16:52
8b83556 to
666fa8c
Compare
This branch has not been deployed
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.
This PR contains the following updates:
^25.0.0→^26.0.0^16.0.0→^17.0.0Release Notes
i18next/i18next (i18next)
v26.4.2Compare Source
$&,$`,$'and$$inside a nested value ($t(key)) now stay literal.nest()handed the resolved value straight toString.replaceas the replacement argument, so those sequences were read as replacement patterns:$&re-inserted the$t(...)match,$`/$'inserted the text before / after it, and$$collapsed to$. Throught()the$&case was worse than a wrong string: the nested lookup resets the shared nesting regexp, so the re-inserted$t(...)was matched again on every pass andt()never returned — also under the defaultescapeValue: truewhen the value arrives via a variable forwarded through nesting options ($t(key, { "name": "{{name}}" })with a name containing$&). The value is now$-escaped at theString.replacecall, the same guardinterpolate()already has, and a non-string value returned by a formatter in the nesting chain ($t(key, myFormat)) is stringified before that. Nested values are still not HTML-escaped (#854). Thanks @mahirhir (#2447).v26.4.1Compare Source
keyPrefixoverload ofgetFixedT()is now available underenableSelector: 'strict'. Its constraint was gated ontrue | 'optimize'only, so under'strict'it collapsed tonever, the overload dropped out, and the returnedtsilently lost itskeyPrefixscope (t(($) => $.deep)failed withProperty 'deep' does not exist on type '{}'). The same call already typechecked undertrueand'optimize'. Thanks @hovelopin (#2446).v26.4.0Compare Source
toResolveHierarchyresults per(code, fallbackCode)pair. The hierarchy resolver runs on everyt()call and callsIntl.getCanonicalLocalesmultiple 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 whenoptions.fallbackLngchanges (reassignment or in-place array mutation); if you mutate other resolution-relevant options at runtime (load,lowerCaseLng,cleanCode,nonExplicitSupportedLngs), calli18next.services.languageUtils.clearCache()afterwards. Function-valuedfallbackLngand per-call array/objectfallbackLngoptions are never cached, so dynamic fallbacks keep working as before. Thanks @equaterina (#2444).@rollup/plugin-babelsupports 8, eslint on 9.x for neostandard). Removed the unusedcoverallspackage (CI uses the Coveralls GitHub Action) and replacedsinonwithnise+vitest.spyOnin the v1 compatibility tests, which resolves all opennpm auditfindings (0 vulnerabilities) and should close the dependabot alerts on the lockfile.v26.3.6Compare Source
typescriptpeer dependency range (^5 || ^6 || ^7). Withtypescript@7.0.2in a project,npm installfailed with anERESOLVEpeer conflict. The published types are TS7-compatible as-is: everytest/typescriptsuite produces identical results under 6.0 and 7.0.2. Reported in react-i18next#1927, thanks @andikapradanaarif.v26.3.5Compare Source
$t()nesting options blocks that span multiple lines are now parsed.nest()decided where the nested key ends by testingmatch[1]with/{.*}/, whose dot does not cross line breaks — so a$t(key, { ... })options object containing a newline was treated as having no options, mis-split as formatters, and the nested lookup ran without its options (placeholders stayed unresolved). The nesting regexp itself already matches newlines inside$t(...); adding thes(dotAll) flag makes multiline options behave like the single-line form. Thanks @spokodev (#2440).getUsedParamsDetails(thereturnDetails: truepath) no longer mutates the passedreplaceobject. It wrotecountstraight ontooptions.replaceso the returnedusedParamswould include it — a caller reusing onereplaceobject acrosst()calls then carried a stalecountinto later interpolations (e.g. a previous call'scount: 5rendered instead of the current call's value). The details are now built from a copy;usedParamsstill includescount. Thanks @spokodev (#2441).skipOnVariables: true+escapeValue: true, a{{placeholder}}carried inside an interpolated value now stays literal even when the value contains escapable characters. The skip logic advanced the regexlastIndexby the raw value length, but the escaped text written into the string is longer, solastIndexlanded inside the inserted value and a trailing{{placeholder}}in it got interpolated — leaking another in-scope variable that should have stayed literal (values without escapable characters were already skipped correctly). The advance now uses the escaped length that is actually written, and the regex-safe$-doubling is applied only at theString.replacecall so it can't distort the length arithmetic. Thanks @spokodev (#2442).v26.3.4Compare Source
deepExtend(used byaddResourceBundle(..., deep, overwrite)) no longer recurses into inherited properties. It checked key existence with theinoperator, which walks the prototype chain, so a source key matching an inherited built-in (e.g.hasOwnProperty,toString) caused recursion into the sharedObject.prototypefunction and, withoverwrite: true, could overwrite e.g.Object.prototype.hasOwnProperty.callwith a non-callable value — corrupting a shared built-in process-wide (DoS). Existence is now checked withObject.prototype.hasOwnProperty.call, so such keys are copied as plain own data instead. This complements the existing__proto__/constructorguard and is also strictly more correct for an own-property merge. Only affects applications that pass attacker-controlled data withdeep: trueandoverwrite: true; no standard backend/integration does this. Distinct from CVE-2026-48713 / CVE-2026-48714 (different packages,setPathmechanism). See advisory GHSA-6jcc-5g8w-32mx, CVSS 5.9 (CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:H). Thanks to zx (Jace) @manus-use for the responsible disclosure.v26.3.3Compare Source
t($ => $.arr, { returnObjects: true, context })on a JSON array of heterogeneous objects now preserves each element's full shape (e.g.{ transKey1: string; transKey2: string }[]) instead of collapsing to a union of partial element types. Two type-level causes: (1)FilterKeysevaluated the whole array element type at once, sokeyof (A | B)only saw the keys common to every element — it now distributes over the object union and filters each element independently; (2) when TypeScript merges mismatched array element types it injects phantom optionalundefinedkeys (e.g.transKey1_withContext?: undefinedon elements that don't define it), which the context-detection helpers mistook for real context variants — they now skip keys typed asundefined. Also adds a dedicatedcontext+returnObjects: trueselector overload usingconst Fn+ReturnType<Fn>, soTargetis no longer collapsed tounknownviaApplyTarget. Resolves Problem 1 of #2398 (Problem 2 was already fixed on master). Thanks @sauravgupta-dotcom (#2438). Fixes #2398.v26.3.2Compare Source
join(separator: ', ')) now work at any position in the chain, not just first. Previously the comma-in-parens reassembly only repairedformats[0], so{{v, uppercase, join(separator: ', ')}}split thejoin(...)option on the inner comma and never rejoined it, producing corrupt output. Replaced the first-position-only repair with a position-independent pass that re-joins fragments until each open paren closes. Thanks @spokodev (#2437).v26.3.1Compare Source
t()with akeyPrefixno longer pollutes its return type with sibling keys' values. A regression in 26.3.0 — the[Res] extends [never]guards added toKeysBuilderWithReturnObjects/KeysBuilderWithoutReturnObjectsturned the builders into deferred conditional types, soKeyPrefix<Ns>stopped resolving to a literal union andkeyPrefixinference widened to the whole namespace. Symptom:useTranslation(ns, { keyPrefix: 'a.b' })thent('title')would resolve to'<a.b>.title' | '<other.path>.title' | ...instead of just the scoped value. Affected everyreact-i18nextuser usingkeyPrefix. Restored to the eager 26.2.0 form. The same-namespace conflict handling from #2434 still works via_DropConflictKeysat the merge layer (inoptions.d.ts). Thanks @aaronrosenthal (#2436).v26.3.0Compare Source
ResourceNamespaceMap— a separate mergeable augmentation surface for namespace resource types, designed for monorepos where multiple packages each want to contribute their own namespaces. Previously, every package had to coordinate on a singleCustomTypeOptions.resourcesdeclaration (or fall back to typing dependency namespaces asany) becauseresourcesis a single property of an interface and TypeScript reports TS2717 when two declarations of the same property disagree. The new interface merges naturally acrossdeclare module 'i18next'blocks, so each package can ship its owni18next.d.tsindependently. Per-property merge handles same-namespace contributions from multiple packages, and same-key/different-literal conflicts are silently dropped to avoid poisoningt()overload resolution. Fully backwards-compatible — existingCustomTypeOptions.resourcesaugmentations continue to work, and both surfaces can coexist. Scalar options (defaultNS,returnNull,enableSelector, etc.) still belong onCustomTypeOptions. Thanks @sh3xu (#2434). Fixes #2409.v26.2.0Compare Source
parseInterpolationTypeOption (defaulttrue). When set tofalseinCustomTypeOptions, the type-level extractor stops parsing translation strings for{{variable}}patterns. Required byi18next-icuusers — the default extractor mistakes ICU MessageFormat nested-brace plurals like{count, plural, one {{count} row} other {{count} rows}}for an interpolation block and demands a phantom variable name. The flag is type-only; runtime interpolation is governed byInterpolationOptionsand is unaffected. Fixes i18next-icu#85.enableSelectoronInitOptionssoi18next.init({ enableSelector: 'strict' })typechecks without a module augmentation. The runtime already readsopts?.enableSelectorfrom init options; this lands the matching type declaration next to the other selector-resolution knobs. Acceptsfalse | true | 'optimize' | 'strict'. Thanks @Faithfinder (#2431)v26.1.0Compare Source
enableSelector: 'strict'(TypeOptions + runtime option). Opt-in mode that drops the flattened-primary form fromNsResourceat the type level — every namespace (primary included) is exposed only under its own key on$, uniformly across single- and multi-ns hooks. At runtime, a leading selector path segment matching the scope's namespace list is always rewritten as a namespace prefix, including the primary. Eliminates the silent-miss surface area wheret($ => $.primary.foo)typechecks but doesn't resolve under the default mode (see #2429). Backward-compatible: defaultenableSelector: false | true | 'optimize'behavior is unchanged. Note: strict mode is incompatible with the #2405 pattern (keys whose names match sibling namespaces) — those users should stay on default mode.v26.0.10Compare Source
getFixedTaccepts a fourth optionalfixedOptsargument carryingscopeNs— the full namespace list the boundtwas created for. The selector API usesscopeNsto detect when a path's first segment is a namespace prefix, without changing resolution scope. Resolution still uses the boundns(a single primary string in the typical react-i18next setup), so plaint('key')lookups stay isolated to the primary namespace exactly as before — onlyt($ => $.secondaryNs.foo)selectors now route correctly underuseTranslation([nsA, nsB]). Fixes the runtime side of #2429 for thereact-i18nextdefault-nsModecase. The 4th argument is opt-in: existing 3-arggetFixedT(lng, ns, keyPrefix)callers see no behavior change.v26.0.9Compare Source
string | number(wasstring). i18next stringifies values at runtime, so requiring callers to wrap numbers inString(...)for plain{{var}}placeholders was unnecessary friction — and could mask the real problem when a non-string value was passed alongside multiple interpolation slots (thet()overload resolution would fall through to the 3-arg form and report a confusing "not assignable to string" error against the options object). Typed format specifiers like{{x, number}},{{x, currency}},{{x, datetime}}, etc. keep their precise types; this only relaxes the no-format default. Thecountvariable remainsnumber-onlyv26.0.8Compare Source
ExistsFunctionshape so plain arrow functions can again be assigned toExistsFunction-typed variables (TypeScript cannot infer type predicates through multi-overload assignment). Directi18next.exists(key)calls still narrowkeytoSelectorKey— the predicate is now declared inline oni18n.exists. Custom wrappers that want the narrowing can type themselves astypeof i18next.exists2425v26.0.7Compare Source
missingKeydebug log now shows the actual plural-resolved key (e.g.foo.bar_manyfor Polishcount: 14) instead of the base key — making it obvious which plural category was expected and missing 2423@babel/runtimeruntime dependency. The build no longer generates any@babel/runtimeimports, so the package is unused by consumers. Rollup now usesbabelHelpers: 'bundled'so any helpers that are ever needed in the future will be inlined rather than imported externally 2424dist/esm/i18next.bundled.js. It was byte-identical todist/esm/i18next.jsbecause no helpers were being imported 2424v26.0.6Compare Source
Security release — all issues found via an internal audit.
escapeValue: falsewith interpolated variables inside a$t(key, { ... "{{var}}" ... })nesting-options block. In that narrow combination, attacker-controlled string values containing"can break out of the JSON options literal and inject additional nesting options (e.g. redirectlng/ns). The defaultescapeValue: trueconfiguration is unaffected because HTML-escaping neutralises the quote beforeJSON.parse. See the security note in the Nesting docs for the full pattern and mitigationsregexEscapetounescapePrefix/unescapeSuffixon par with the other interpolation delimiters. Prevents ReDoS (catastrophic-backtracking) when a misconfigured delimiter contains regex metacharacters, and fixes silent breakage of the{{- var}}syntax when the delimiter contains characters like(,[,..env*and*.pem/*.keyfiles in.gitignorev26.0.5Compare Source
cloneInstance().changeLanguage()no longer fails to update language state when the target language is not yet loaded — a race betweeninit()'s deferredload()and the user'schangeLanguage()could overwriteisLanguageChangingTo, causingsetLngPropsto be skipped 2422v26.0.4Compare Source
{{price, currency(EUR)}}are now correctly resolved to their base format type (e.g.numberforcurrency) instead of falling back tostring2378v26.0.3Compare Source
addResourceBundlenow accepts an optional 6thoptionsparameter ({ silent?: boolean; skipCopy?: boolean }) matching the runtime API 2419v26.0.2Compare Source
t("key", {} as TOptions)no longer produces a type error — the context constraint now bypasses strict checking whencontextisunknown(e.g. fromTOptions) 2418v26.0.1Compare Source
getFixedTaccepts a fourth optionalfixedOptsargument carryingscopeNs— the full namespace list the boundtwas created for. The selector API usesscopeNsto detect when a path's first segment is a namespace prefix, without changing resolution scope. Resolution still uses the boundns(a single primary string in the typical react-i18next setup), so plaint('key')lookups stay isolated to the primary namespace exactly as before — onlyt($ => $.secondaryNs.foo)selectors now route correctly underuseTranslation([nsA, nsB]). Fixes the runtime side of #2429 for thereact-i18nextdefault-nsModecase. The 4th argument is opt-in: existing 3-arggetFixedT(lng, ns, keyPrefix)callers see no behavior change.v26.0.0Compare Source
This is a major breaking release:
Breaking Changes
initImmediateoption — the backward-compatibility mapping frominitImmediatetoinitAsync(introduced in v24) has been removed. UseinitAsyncinstead.interpolation.formatfunction — the old monolithic format function (interpolation: { format: (value, format, lng) => ... }) is no longer supported. The built-in Formatter (or a custom Formatter module via.use()) is now always used. Migrate to the new formatting approach usingi18next.services.formatter.add()or.addCached()for custom formatters.showSupportNoticeoption and all related internal suppression logic (globalThis.__i18next_supportNoticeShown,I18NEXT_NO_SUPPORT_NOTICEenv var). See our blog post for the full story.simplifyPluralSuffixoption — this option was unused by the core PluralResolver (which relies entirely onIntl.PluralRules). It only had an effect in the old v1/v2/v3 compatibility layer. The v4 test compatibility layer now defaults totrueinternally.@babel/polyfillfrom devDependencies.Improvements
indexOf() > -1/indexOf() < 0with.includes()(~40+ occurrences)indexOf() === 0with.startsWith()where appropriatevarwithconst,'' + objectwithString(object),.substring()with.slice().apply(observer, [event, ...args])with direct callobserver(event, ...args).call(this, ...)in BackendConnector retry logicarray-callback-returnin LanguageUtilsgetBestMatchFromCodeseslint-disablecomments from source filesonce()method for one-time event subscriptionscheckedLoadedForcache to Translator instance, preventing cross-instance state leakageBackendModulegeneric parameter naming inconsistency between CJS and ESM type definitionsonce()method toi18nandResourceStoretype interfacestest.projectsconfigi18next/react-i18next (react-i18next)
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
valuesprop on<Trans />now only requires interpolation variables for the specifici18nKey, not all variables in the namespace 1913v17.0.1Compare Source
>= 26.0.1(forgot to do it in last version)interpolation.formattoi18n.services.formatter.add()(i18next v26)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
Configuration
📅 Schedule: (UTC)
* 0-3 * * 1)🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.