unstale

npm / i18next-cli

i18next-cli

What changed in i18next-cli 1, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-25.

30 breaking1 security55 new APIs and options2 performance36 behavior and defaults12 tooling118 fixes and other

See which of these apply to your code, ranked, in your agent:

npx @unstale/cli init

@unstale/cli 0.2.6 on npm

i18next-cli 1254 changes

Breaking changes 30

  • Plural forms of flat keys stay flat in secondary locales; existing nested copies are removed on the next extract.

    1.80.4release notes

  • Spaces on one side of placeholders such as {{ name}} are trimmed.

    1.80.2release notes

  • A <Trans> interpolation variable named format is extracted as {{format}} instead of being dropped. Requires react-i18next ^17.1.8.

    1.80.1release notes

  • Lint interprets language codes containing underscores as hyphenated codes when determining required plural categories.

    1.78.0release notes

  • Lint requires other and every category selected by whole numbers below one million; exact selectors count only when they select a few small numbers.

    1.78.0release notes

  • With ICU or MF2, text around converted placeholders is escaped, and literal braces are quoted or escaped for the selected format.

    1.76.0release notes

  • Depth now counts from the type selected by an indexed access, rather than from its declared wrapper type.

    1.75.0release notes

  • Commented template literals no longer extract placeholders as keys; matching existing keys are kept even with removeUnusedKeys, while patterns without a static part are ignored.

    1.74.8release notes

  • The shorthand ns option now resolves like its long form instead of filing the key under the default namespace.

    1.74.3release notes

  • Files are visited in sorted path order, so conflicting defaults resolve consistently and unchanged source trees produce stable catalogs. The kept default may change once if sources contain conflicts.

    1.74.2release notes

  • Named type aliases are no longer resolved to their first member, avoiding arbitrary namespace attribution for app-wide unions.

    1.70.3release notes

  • Calls to t() inside fenced code blocks in doc comments are no longer extracted as real call sites.

    1.70.1release notes

  • status and extract now resolve useTranslation calls with a dynamic namespace and a literal ?? or || fallback to the statically known fallback namespace instead of defaultNS.

    1.70.0release notes

  • When false, the generated i18next.d.ts derives the default namespace from generated resources, avoiding types that silently accept any string. Locale-named resource files still emit false.

    1.67.9release notes

  • Lint detection now flags any two or more adjacent translation units rendered as direct siblings, including adjacent <Trans> components and {t(...)} expressions.

    1.67.2release notes

  • Adds a default-enabled lint check for translated-string concatenation in JavaScript and sentences split across multiple <Trans> components; set false to disable it.

    1.67.0release notes

  • When a locale is requested, the pass/fail result is based only on that locale; primary locales fail only on absent keys, while secondary locales fail on any untranslated or absent key.

    1.64.2release notes

  • The option now accepts true or false, allowing you to sync all languages with --src-lng-only false; omitting it preserves locize-cli's true default.

    1.61.1release notes

  • The status command now checks the primary language and reports missing keys with a non-zero exit code; empty-string placeholders count as present.

    1.61.0release notes

  • The directive now suppresses the entire following JSX element, including nested children, in both lint and instrument commands.

    1.60.0release notes

  • Unparseable JSON/JSON5/YAML files that exist on disk now throw instead of returning null, stopping the command before it can overwrite their contents; .ts/.js resource files remain lenient.

    1.59.1release notes

  • Scoped i18n method calls that do not match a configured function pattern are no longer extracted as translation keys; matching calls still inherit namespace and keyPrefix scope.

    1.56.7release notes

  • The <Trans> bare-identifier diagnostic now uses logger.error and is prefixed with Error:, allowing build tooling to treat it as fatal.

    1.56.4release notes

  • Detects hardcoded strings in JSX expression containers, applying the same acceptance and ignore rules as raw text.

    1.56.2release notes

  • When nsSeparator is false, the merged-path loop treats any defaultNS-keyed bucket as top-level, including keys from useTranslation() with no arguments.

    1.50.7release notes

  • Files with unsupported extensions that no plugin handles are silently skipped instead of throwing an ExtractorError.

    1.50.0release notes

  • Nesting conflicts are now reported as errors instead of silently skipping the key.

    1.46.4release notes

  • The extractor should fail on error, so extraction errors are no longer silently tolerated.

    1.45.0release notes

  • When a config file exists but fails to load, the CLI exits with a non-zero code instead of prompting to create a new one.

    1.42.10release notes

  • Interpolation lint checks the translated value, not just the key, when key and value differ.

    1.42.10release notes

Security 1

  • Potential API-key output is masked for the locize command, reducing the risk of exposing keys in console output.

    1.47.4release notes

New APIs and options 55

  • Writes current lint issues to a baseline so lint reports and fails only on new issues while the file exists.

    1.80.0release notes

  • Sets an alternate path for the lint baseline file.

    1.80.0release notes

  • Compares i18next translation placeholders, nested references and tags across locales; set to 'error' to fail or 'off' to disable the check.

    1.80.0release notes

  • Controls how values identical to the primary language are counted and whether they trigger a warning or are ignored.

    1.80.0release notes

  • Selects the translation value syntax: i18next by default, or ICU or MF2.

    1.76.0release notes

  • Sets how many levels of nested object members are followed when a dynamic key reads a typed value; defaults to 5.

    1.75.0release notes

  • Offers to append an Internationalization section to AGENTS.md and, when present, CLAUDE.md; no files are written unless the developer agrees. Use --no-agent-note to skip the question.

    1.73.0release notes

  • Supplies the Locize project id and skips the signup page and credential prompts; LOCIZE_PROJECTID can supply the same value.

    1.73.0release notes

  • Runs init without the wizard and uses detected defaults for questions not answered by the supplied options, enabling scripted setup.

    1.73.0release notes

  • Syncs and AI-auto-translates only keys changed on the current Git branch versus the base branch; deletions are skipped and changed plural keys include all plural forms.

    1.72.0release notes

  • Configures changed-only syncing for locize.

    1.72.0release notes

  • Sets the base branch for changed-only locize syncing.

    1.72.0release notes

  • Propagates only primary-language keys added or modified on the branch to secondary language files; obsolete keys are left in place. Supports JSON, JSON5 and YAML files.

    1.72.0release notes

  • Adds glob patterns for keys that status should not report or fail on; extract is unchanged.

    1.71.0release notes

  • Set acceptedTags to 'all' to lint every JSX tag, including custom components; ignoredTags and transComponents still take precedence, and the unset default is unchanged.

    1.69.0release notes

  • Adds --unused to report translation keys that are no longer used in source code. The command does not modify files and exits non-zero when unused keys are found or source files fail to parse.

    1.68.0release notes

  • Adds an opt-in lint check that flags punctuation glued onto a translation; it accepts the same values as checkConcatenation and defaults to 'off'.

    1.67.3release notes

  • Accepts severity levels: 'error' makes the lint command exit non-zero, 'warn' reports non-failing warnings, and 'off' disables the check. Boolean values remain supported.

    1.67.1release notes

  • Lint issues can carry an optional severity of 'error' or 'warning'; plugins may set it, and omitted severity defaults to 'error'.

    1.67.0release notes

  • Adds the locize sort preset, matching locize-published key order so extract followed by locize-sync/locize-download avoids spurious reorder diffs.

    1.66.0release notes

  • The init wizard can scaffold an inlang project with project.inlang/settings.json derived from i18next configuration and recommend the Sherlock VS Code extension; existing settings are not overwritten.

    1.63.0release notes

  • A new supercommand orchestrates detection, configuration, instrumentation, extraction, Locize setup and sync, then downloads asynchronous translations. It is safe to re-run.

    1.62.0release notes

  • Adds a CDN type option supporting standard and pro.

    1.62.0release notes

  • Adds CI mode, which skips instrumentation unless combined with --yes.

    1.62.0release notes

  • Adds a dry-run flag to the localize command.

    1.62.0release notes

  • Adds a namespace option to the localize command.

    1.62.0release notes

  • Prints a copy-paste prompt for AI coding agents to perform the same steps via individual CLI commands.

    1.62.0release notes

  • Adds a flag to skip instrumentation.

    1.62.0release notes

  • Adds a flag to skip Locize setup.

    1.62.0release notes

  • Adds a flag to skip translation.

    1.62.0release notes

  • Adds an update-values flag to the localize command.

    1.62.0release notes

  • Adds a yes flag to the localize command.

    1.62.0release notes

  • Adds a pass-through flag to enable or disable automatic translation.

    1.62.0release notes

  • Adds a pass-through flag to select languages for automatic translation.

    1.62.0release notes

  • Adds a pass-through flag to configure automatic translation review.

    1.62.0release notes

  • Adds a configuration option for staging or self-hosted Locize API endpoints.

    1.62.0release notes

  • Adds a configuration option for automatic translation.

    1.62.0release notes

  • Adds a configuration option for selecting automatic translation languages.

    1.62.0release notes

  • Adds a configuration option for automatic translation review.

    1.62.0release notes

  • The localize flow is also available for programmatic use.

    1.62.0release notes

  • Setting this option to false lets you sync all languages instead of only the source language.

    1.61.1release notes

  • The types command can use --ci to compare generated TypeScript definitions with files on disk without writing, exiting non-zero when they are out of date. It cannot be combined with --watch.

    1.59.0release notes

  • The --with-types flag regenerates TypeScript definitions in the same process after extraction when translation files change, avoiding two parallel watch processes.

    1.58.0release notes

  • The init wizard now asks which translation backend to use, offering local files, Locize, or other/skip.

    1.57.0release notes

  • Choosing Locize opens its signup page, prompts for a Project ID and optional API key, and writes a locize block matching the shape consumed by Locize commands.

    1.57.0release notes

  • Accepts 'strict', applying leading-namespace rewrites uniformly across hook scopes and emitting enableSelector: "strict" in generated i18next.d.ts.

    1.56.12release notes

  • Adds the locale field to the TranslationResult object passed to the afterSync plugin hook, so plugins no longer need to reverse-engineer this value from the file path.

    1.53.2release notes

  • Adds the namespace field to the TranslationResult object passed to the afterSync plugin hook, so plugins no longer need to reverse-engineer this value from the file path.

    1.53.2release notes

  • Optionally derive TypeScript namespaces from paths relative to types.basePath, enabling nested namespaces; omitting it preserves existing behavior.

    1.53.0release notes

  • Adds an opt-in flag that trusts default values inferred from keys, including plain key-as-text usage and keyPrefix-derived values, while preserving strict sync behavior by default.

    1.52.0release notes

  • Set to true to generate all six CLDR plural forms for every language, including the primary language, for a consistent set of keys across locales.

    1.51.0release notes

  • Adds a plugin hook to observe every key extraction before deduplication.

    1.48.0release notes

  • Adds an option to detect conflicting default values for the same key; true or 'warn' logs, while 'error' throws.

    1.48.0release notes

  • Adds a command that wraps hardcoded strings with t(), injects useTranslation() hooks in React components, generates an i18n init file, and imports it into the project's entry point.

    1.47.0release notes

  • Adds hideTranslated to show only untranslated keys in the detail status view.

    1.43.0release notes

Performance 2

  • Files without translation-related calls or components are no longer parsed and walked a second time for keys, reducing extraction time on large trees while preserving constants pre-scan behavior.

    1.74.2release notes

  • The extract command no longer scales quadratically with the number of keys; a 4-minute run on a ~11,500-key monorepo drops to seconds, with byte-identical output.

    1.71.2release notes

Behavior and default changes 36

  • The default source glob now includes .mjs for init, detected configs without one, and migrate-config when the old config has no input; existing configs are unchanged.

    1.79.1release notes

  • With MF2, lint warns when pattern whitespace at the start or end differs from the primary language; the warning does not fail the run.

    1.78.0release notes

  • With ICU or MF2, extraction writes one key per message, avoids treating $t() as nesting, and uses format-appropriate placeholders in <Trans> children.

    1.76.0release notes

  • With ICU or MF2, plural and select messages count as one key, so status no longer reports missing plural-suffix keys.

    1.76.0release notes

  • More implicitly typed values expand to their finite set of keys, including object members, unions and intersections, generic object types, const-object or enum values, and array elements.

    1.74.3release notes

  • The default ignore for node_modules is dropped when an extract.input pattern mentions it, allowing dependency declarations or package sources to be resolved or extracted.

    1.74.0release notes

  • The skill no longer presumes Locize; it asks the developer whether to manage translations with Locize or keep files in the repository.

    1.73.0release notes

  • The agent prompt asks whether to use Locize or keep translation files in the repository, and only creates a Locize project or requests an API key if Locize is chosen. It creates config with init --yes instead of the wizard.

    1.73.0release notes

  • The help output now ends with a one-line hint for installing the i18next-localization Agent Skill.

    1.72.4release notes

  • After status, extract, and sync, the hint is now a single line naming the untranslated-key gap and the command to fill it; it appears only when secondary locales have untranslated keys.

    1.72.3release notes

  • status now warns when a fallback namespace listed in ignoreNamespaces has translations that cannot be found, rather than silently reporting keys as absent.

    1.71.3release notes

  • Resolves finite string-literal unions through iterated array element types, expanding template translation keys for supported array methods.

    1.67.8release notes

  • Instrumentation now leaves module-scope string candidates untouched and reports a warning pointing to the hook alternative; strings inside plain functions are still instrumented.

    1.67.7release notes

  • Concatenation issues are warnings and do not fail the run; the lint command exits non-zero only when there are errors.

    1.67.0release notes

  • Locize funnel/tip messages are suppressed when CI=true or stdout is not a TTY, and the once-per-24h cooldown applies even when translation files are newly created.

    1.66.0release notes

  • fallbackNS accepts an array of namespaces, looked up in order; this is supported by extract, status, and the TypeScript types generator.

    1.65.0release notes

  • Trailing wildcards now match any method on an object, and are also honored by the linter and rename-key.

    1.64.0release notes

  • Automatic translation is enabled by default for new Locize projects and only runs when the reference language is updated; translation happens asynchronously on the Locize side.

    1.62.0release notes

  • Maps the project-not-found sync error for projects without languages to guidance to update locize-cli or add languages in project settings.

    1.62.0release notes

  • Locize commands now resolve credentials from environment variables after CLI options and the locize config block, then forward them as explicit flags, avoiding stale ~/.locize settings redirecting operations.

    1.62.0release notes

  • During the first sync, languages from configuration are created automatically; target languages need not be added in the UI, and any write-capable key works.

    1.62.0release notes

  • When enabled, context variants from the primary locale are copied to every secondary locale as empty placeholders, while existing secondary values remain untouched.

    1.56.0release notes

  • The translation report now includes context variants found in the primary translation file for base keys used with a dynamic context value.

    1.56.0release notes

  • Prints a per-file diff of added, removed, and changed keys when CI fails because files would be updated, making failures actionable without reproducing them locally.

    1.55.0release notes

  • Infers function return types from function bodies when no explicit annotation is present, including across files, so statically resolvable values can be extracted as keys.

    1.55.0release notes

  • A warning is emitted when types.basePath is misconfigured and translation files fall outside the specified base directory.

    1.53.0release notes

  • The default useTranslationNames now includes getT and useT, so keys from next-i18next v16 App Router hooks are extracted into the specified namespace instead of defaultNS.

    1.51.6release notes

  • The status output distinguishes untranslated keys (present with an empty value) from absent keys (missing entirely); both still cause a non-zero exit.

    1.50.3release notes

  • A warning is emitted when an explicitly listed non-native extension is not handled by a plugin, helping catch forgotten or misconfigured plugins.

    1.50.1release notes

  • The extractor captures as const array literals and expands their values when used in .map() or .forEach() callbacks.

    1.49.1release notes

  • Exported as const arrays and type aliases are shared across files, enabling resolution of imported constants and type aliases.

    1.49.1release notes

  • The extractor resolves namespaces from const and identifier expressions without custom plugins.

    1.49.0release notes

  • The extractor handles object props as namespaces.

    1.47.12release notes

  • Locize CLI calls now fall back to npx.

    1.47.10release notes

  • locize-migrate now internally always uses --download true.

    1.47.5release notes

  • The interactive prompt was improved for the locize command.

    1.47.3release notes

Tooling 12

  • Generated i18next.d.ts now selects the typed ICU or MF2 parseInterpolation value based on the installed i18next version; warnings and hints for existing files also reflect the supported value.

    1.77.0release notes

  • With ICU or MF2, writes format-appropriate placeholders, converts count ternaries into one plural message, and registers the matching plugin in the generated i18n init file.

    1.76.0release notes

  • With ICU or MF2, parses translation values across locales and reports syntax errors, argument mismatches, and plural categories that do not fit the locale.

    1.76.0release notes

  • With ICU or MF2, newly generated declarations set parseInterpolation: false for i18next 26.2.0+; types warns if an existing file lacks it.

    1.76.0release notes

  • Extraction now uses typed component props and binds typed array members in iteration, so translation keys in map callbacks, loops, and destructured props are extracted.

    1.74.7release notes

  • Finite dynamic keys now resolve through renaming imports, including type aliases, enums, interfaces, as-const arrays, and helper functions.

    1.74.0release notes

  • React is no longer a runtime dependency; the CLI resolves React from the consuming project through react-i18next, avoiding a nested duplicate copy.

    1.73.2release notes

  • extract now warns when a <Trans> component contains a bare identifier JSX child and points users to the {{cat}} form with a values prop.

    1.56.3release notes

  • Generated type files use a combined default interface declaration and a type-only import, making them compatible with TypeScript's verbatimModuleSyntax option without changing the interface's type identity.

    1.54.0release notes

  • Plugins can return transformed JS/TS code for any file type, including .svelte and .vue, and the extractor parses it using TSX syntax.

    1.50.0release notes

  • The extractor improves TS type-aware resolution for finite dynamic keys, including template unions, const maps, and helper returns.

    1.49.0release notesrelease notes

  • Adds a linter plugin to i18next-cli.

    1.44.0release notes

Fixes and other changes 118

  • rename-key now renames calls with a string default value, and moving a key to another namespace keeps the default value.

    1.80.4release notes

  • Renaming flat keys now writes the new key where the next extract would put it and removes the old key regardless of how the file stores it.

    1.80.3release notes

  • No longer throws on plural keys whose base name is constructor, toString, or another such name, or is also an object.

    1.80.2release notes

  • Keys containing the key separator stay flat during sync, preserving translations; status, localize and rename-key also find their values.

    1.80.2release notes

  • Interpolation parsing now matches i18next behavior for unescaped placeholders and names outside the previous character set, avoiding false or missed interpolation issues.

    1.80.0release notes

  • Files with JSX are parsed with the same JSX fallback as .js files in extract, instrument, and lint; extract also includes them in its constants pre-scan.

    1.79.0release notes

  • With ICU or MF2, the t() interpolation check uses the same parser, avoiding false interpolation reports and catching misspelled arguments.

    1.76.0release notes

  • Extracts IcuTrans and IcuTransWithoutContext, including when imported under another name, using i18nKey or defaultTranslation as the key.

    1.76.0release notes

  • Extracts its Trans, Plural, Select and SelectOrdinal components using the message built by the macro.

    1.76.0release notes

  • Options passed through a variable are read like inline options during extraction, including plural keys, context, ns, and defaultValue; variables are resolved within their own file.

    1.75.3release notes

  • Declarations with the same name in different files now resolve to the module the file imports them from, preventing extraction from depending on file order.

    1.75.2release notes

  • Extraction now resolves imported references to an exported as const object, including t(LABELS.save) and Object.keys(LABELS).

    1.75.1release notes

  • Extraction now resolves values typed as keyof typeof MAP to the map's keys, enabling template keys such as label.save and label.cancel.

    1.75.1release notes

  • Extraction now resolves types and values accessed through namespace imports, including namespaces re-exported from a barrel.

    1.75.1release notes

  • Numeric keys now resolve in object types and indexed access types, enabling extraction from openapi-typescript response types.

    1.75.0release notes

  • Selector i18nKey values on <Trans t={t}> now route into the hook's namespaces like t() does, preventing duplicated namespaces during extraction.

    1.74.7release notes

  • Extraction now binds elements when iterating inline array literals, so translation keys using those elements are extracted.

    1.74.6release notes

  • Extraction resolves nested object type members, including through references, optional chaining, destructuring, and indexed access types, up to five levels below the declared type.

    1.74.6release notes

  • Values typed as arrays of a string union now resolve to the union's values, allowing extraction of every key in map and for-of usage without a type assertion.

    1.74.5release notes

  • Conditional namespace arguments now resolve to the namespaces in their branches, so extracted keys are filed in each branch’s primary namespace, including for <Trans t={t}>.

    1.74.4release notes

  • Dynamic keys declared in files without translation calls are resolved after all files have been scanned, removing file-order dependence.

    1.74.3release notes

  • The shorthand defaultValue option is no longer ignored.

    1.74.3release notes

  • The shorthand keyPrefix option now resolves like its long form instead of being lost.

    1.74.3release notes

  • Extraction no longer drops keys, plural forms, default values, key arrays, selectors, or option values when they are wrapped in parentheses.

    1.74.1release notes

  • The extractor now statically resolves non-string-literal default values from module-scope consts, object maps, or enums instead of dropping them; ambiguous expressions still fall back to the key.

    1.73.3release notes

  • Object literals in as const arrays are now captured, resolving destructured properties in for...of loops and forEach callbacks.

    1.72.2release notes

  • Dynamic keys built from for...of loop variables are now extracted because the loop variable is bound while the loop body is walked.

    1.72.2release notes

  • Destructuring a known as const object now resolves its property for dynamic keys.

    1.72.2release notes

  • The interactive instrument prompt now uses Inquirer’s select prompt type instead of the removed list type, preventing a crash.

    1.72.1release notes

  • status and extract now find a fallback namespace at its per-namespace path when it is missing from a merged file, supporting hybrid layouts.

    1.71.3release notes

  • A function output resolves the merged file without a namespace, matching what extract writes and allowing hybrid layouts.

    1.71.3release notes

  • .reduce() and .reduceRight() over an as const array now bind the element callback parameter, allowing extraction without a (typeof ERRORS)[number] cast.

    1.71.1release notes

  • When ns is a function parameter, it resolves to its string default or, without a default, the first member of its inline union type.

    1.70.4release notes

  • TFunction members are now found inside intersection types, including optional t properties and overload implementation signatures.

    1.70.3release notes

  • Namespace detection now resolves union, generic, and local type aliases for TFunction, and local const arrays for useTranslation, like inline arrays.

    1.70.2release notes

  • A local wrapper forwarding its first parameter as the key to a scoped translation function inherits that function's namespace and keyPrefix.

    1.70.1release notes

  • Parameters typed as ReturnType<typeof useTranslation<'ns', 'keyPrefix'>>['t'] are treated like TFunction<'ns', 'keyPrefix'> for namespace detection.

    1.70.1release notes

  • status and extract now honor TFunction namespace and key-prefix types on destructured parameters, including types supplied through a local interface or type alias.

    1.70.0release notes

  • Accepts FunctionBody nodes from @swc/core 1.16, restoring selector calls with block bodies, return-type inference from function bodies, and React component-boundary detection for useTranslation() and <Trans> injection.

    1.69.2release notes

  • Lint reports hardcoded strings at the line indicated by the AST node span, fixing incorrect line numbers and allowing line-based ignore directives to suppress the intended issues.

    1.69.1release notes

  • Key sorting is now transitive, making extract idempotent and preventing key order from flipping across extract/download cycles.

    1.67.8release notes

  • The generated import is inserted after the preceding import’s line, with a leading newline when that import ends at EOF without one.

    1.67.7release notes

  • Directories whose names match input globs no longer abort the run with EISDIR.

    1.67.6release notes

  • Corrects line and column locations for files containing multi-byte characters; the span-base correction also fixes locations in files with leading multi-byte comments for the linter and instrumenter.

    1.67.5release notes

  • Extraction now expands keys for finite string-literal unions that reach a key through interface- or object-typed function parameters, including destructured, renamed, defaulted, and member-accessed values.

    1.67.4release notes

  • Extraction now ignores <Trans> components without an i18nKey expression or non-whitespace children, preventing an empty-string translation key.

    1.66.2release notes

  • ConsoleLogger.error no longer swallows its optional second argument, so plugin-hook failures print the caught error instead of a bare message.

    1.66.1release notes

  • ConsoleLogger.warn no longer swallows its optional second argument, so plugin-hook failures print the caught error instead of a bare message.

    1.66.1release notes

  • Extraction now attributes keys found in fallback namespaces there, preserving them from removeUnusedKeys; non-empty values in the requesting namespace remain intentional overrides, and empty placeholders are cleaned up.

    1.65.0release notes

  • A scoped failure message now names the requested locale, making the reason for failure clear.

    1.64.2release notes

  • When disablePlurals is true, a key used with count is satisfied by either its plural variants or the bare key, matching the runtime resolution chain.

    1.64.1release notes

  • Plural categories reachable only for out-of-range values are treated as optional, so missing or empty variants no longer fail the check; categories reachable by typical counts remain required.

    1.64.1release notes

  • The command now pins @inlang/plugin-i18next@6.2.1, restoring Sherlock inline annotations, hovers, and message extraction for i18next projects.

    1.63.1release notes

  • The CJS build now uses automatic interop to unwrap default exports at runtime, fixing crashes in spinner-using commands with ESM-only dependencies.

    1.62.0release notes

  • Declared as a direct dependency at ^26.3.0, matching react-i18next's peer requirement so package managers that don't auto-install peers get a compatible copy.

    1.58.3release notes

  • Loaded lazily and defensively only when serializing <Trans> children, so incompatible versions no longer crash unrelated CLI commands and Trans serialization degrades gracefully with a warning.

    1.58.3release notes

  • instrument no longer breaks multi-line imports when injecting the useTranslation import.

    1.58.2release notes

  • The types command now accepts .yaml, .yml, and .json5 input files, avoiding SyntaxError when using these translation sources.

    1.58.1release notes

  • types --watch uses chokidar's awaitWriteFinish option, preventing mid-write triggers when another process rewrites translation files.

    1.58.0release notes

  • For multi-namespace useTranslation hooks, selector paths beginning with a secondary namespace are routed to that namespace's file; primary-prefixed paths and single-namespace hooks are unaffected.

    1.56.11release notes

  • For multi-namespace useTranslation hooks, selector paths beginning with a secondary namespace are routed to that namespace's file; primary-prefixed paths and single-namespace hooks are unaffected.

    1.56.11release notes

  • lint now sets type to hardcoded on hardcoded-string issues, so consumers can reliably distinguish them with issue.type === 'hardcoded'.

    1.56.10release notes

  • Propagates namespace and keyPrefix from useTranslationNames-listed calls stored on class fields and later destructured in methods, so translated keys are extracted with the correct namespace.

    1.56.9release notes

  • With --sync-primary, <Trans> defaults now update for keys containing an underscore that are not plural or context variants.

    1.56.8release notes

  • With --sync-all --trust-derived, locale-specific plural variants are preserved instead of being cleared when absent from the primary locale.

    1.56.6release notes

  • Extraction now walks both branches of ternary and short-circuit logical selector bodies, preserving referenced keys instead of pruning them.

    1.56.5release notes

  • The bare-identifier diagnostic now points only to the {{x}} + values={{ x }} fix, removing a misleading suggestion to inline the value.

    1.56.5release notes

  • extract now resolves constant identifiers passed as the namespace or keyPrefix argument, using the same resolution logic as useTranslation.

    1.56.3release notes

  • status now includes keys referenced only through nested $t(...) references in the primary translation file, including plural and context variants, so translation gaps in secondary locales are reported.

    1.56.1release notes

  • When enabled, keys referenced through $t(...) in existing translation values are preserved, including plural and context variants; secondary locales receive the correct CLDR plural skeleton on first extract.

    1.56.0release notes

  • Propagates defaultNs and keyPrefix from custom translation hooks to inner t() calls accessed via a member expression, preventing keys from falling back to the default namespace.

    1.54.2release notes

  • Secondary locale translations are no longer cleared for explicit defaults when the code-provided default still matches the primary locale value.

    1.54.1release notes

  • Selector API extraction now resolves dynamic bracket expressions and captures function parameter type annotations, preventing possible keys from being incorrectly treated as unused and removed.

    1.53.1release notes

  • With --sync-all --trust-derived, secondary locale values are cleared only when syncing would actually update the primary locale.

    1.52.1release notes

  • Fixes repeated runs producing different results for keys with derived default values, preventing the primary locale from being unexpectedly rewritten.

    1.51.9release notes

  • Dynamic bracket expressions in the selector API are resolved into all possible keys, preventing valid keys from being treated as unused and removed during extraction.

    1.51.8release notes

  • Fixes --sync-all not clearing secondary locale translations when mergeNamespaces is enabled.

    1.51.7release notes

  • The extractor now uses the full enum type when a variable has both a type annotation and an initializer, extracting all enum values.

    1.51.5release notes

  • Now correctly preserves HTML tag names when children contain interpolations or mixed content.

    1.51.4release notes

  • Directories with file-like extensions are silently skipped instead of producing a misleading warning.

    1.51.3release notes

  • With nsSeparator: false and multiple namespaces, default namespace keys are now kept under translation instead of being placed at the top level.

    1.51.2release notes

  • Plural forms are now limited to the union of CLDR categories needed by configured locales, rather than always generating all six forms.

    1.51.1release notes

  • defaultValues are now applied consistently to extra plural forms.

    1.51.1release notes

  • Unrecognized custom locale codes now fall back to English plural rules instead of throwing a RangeError.

    1.50.8release notes

  • With nsSeparator: false, implicit-namespace keys in a merged single-file layout are routed to the top level instead of being wrapped under defaultNS.

    1.50.6release notes

  • When removeUnusedKeys: true, sort: false preserves the existing key order and appends new keys at the end.

    1.50.6release notes

  • The extract and sync commands silence all non-essential output in quiet mode, including promotional messages.

    1.50.5release notes

  • Namespaces containing spaces are no longer rejected by the natural-language heuristic when explicitly provided; the check applies only to namespaces derived by splitting a key string.

    1.50.4release notes

  • The TypeScript signature now allows returning undefined to opt out of transformation, matching the intended pattern.

    1.50.0release notes

  • Fixes inconsistent plural key ordering in JSON locale files produced by sync and extract --ci.

    1.49.7release notes

  • Sync no longer clears locale-specific plural forms such as _many in secondary locales, preventing status from reporting missing translations.

    1.49.6release notes

  • The extractor improves namespace resolution from const and identifier expressions.

    1.49.4release notes

  • Fixes the disablePlurals flag being ignored when extracting languages.

    1.49.3release notes

  • Imports in d.ts files now include file extensions.

    1.49.2release notes

  • The extractor now resolves the namespace when ns is a const variable, matching the existing useTranslation(IDENTIFIER) behavior.

    1.49.1release notes

  • Type aliases referenced by declare const and useState destructuring patterns now resolve after the alias is captured, fixing ordering-dependent failures.

    1.49.1release notes

  • Indexed access types now resolve correctly through TsParenthesizedType wrappers emitted by SWC.

    1.49.1release notes

  • The extractor resolves and safely handles constants across files.

    1.48.1release notes

  • The extractor handles typed expressions.

    1.47.11release notes

  • The instrumenter was improved regarding the i18n init file.

    1.47.9release notes

  • The instrumenter was improved regarding the Trans component.

    1.47.8release notes

  • Fixes false positives when checkInterpolationParams encounters variable t() options.

    1.47.7release notes

  • Prefixes the nesting conflict message.

    1.47.6release notes

  • checkInterpolationParams now supports interpolation parameters using the {{param, format}} syntax.

    1.47.1release notes

  • Fixed expanded plurals losing location information.

    1.46.2release notes

  • Fixed extraction with keySeparator creating empty string segments.

    1.46.2release notes

  • Extraction now uses the inline count property of the Trans component.

    1.46.0release notes

  • Fixes Identifier handling in the getObjectPropValue utility.

    1.42.12release notes

  • Fixes insufficient evaluation of namespace and keyPrefix scope.

    1.42.11release notes

  • Interpolation lint reports the correct line number for each duplicate t() call.

    1.42.10release notes

  • Reverts the overly greedy multi-segment namespace glob behavior that matched unrelated locale files and could overwrite existing translations with empty objects.

    1.42.9release notes

  • The linter checkInterpolationParams now ignores i18next variables.

    1.42.8release notes

  • The extractor now respects ignoreNamespaces when removeUnusedKeys is true.

    1.42.8release notes

  • Fixed handling of multi-segment namespaces when matching output paths and recovering namespace paths.

    1.42.6release notes

  • Corrects the base offset for files with leading whitespace or comments because Module.span.start points to the first token, not byte 0.

    1.42.5release notes

  • Span offsets in onVisitNode are now file-relative instead of accumulating across files, so spans stay within the source file length.

    1.42.4release notes

  • The linter improves checkInterpolationParams handling when an object is used as a value.

    1.42.3release notes

  • Fixes extractor serialization of <Trans> when the project and CLI use different React versions, such as React 18.

    1.42.2release notes