chore(deps-dev): Bump i18next-cli from 1.75.3 to 1.77.0 (#2254)

Bumps [i18next-cli](https://github.com/i18next/i18next-cli) from 1.75.3
to 1.77.0.
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/i18next/i18next-cli/blob/main/CHANGELOG.md">i18next-cli's
changelog</a>.</em></p>
<blockquote>
<h2>1.77.0</h2>
<ul>
<li>feat(types): with <code>extract.messageFormat: 'icu'</code> or
<code>'mf2'</code>, a newly generated <code>i18next.d.ts</code> sets
<code>parseInterpolation: 'icu'</code> or <code>'mf2'</code> when the
project's i18next is 26.5.0 or later, so <code>t()</code> options are
type-checked
against the arguments of each message. With i18next 26.2.0 to 26.4.x it
still sets <code>parseInterpolation: false</code>. The
version is read from <code>node_modules/i18next/package.json</code>,
from the working directory upwards (hoisted monorepo
installs count); without an installed i18next it stays
<code>false</code>. The warning for an existing
<code>i18next.d.ts</code> without
<code>parseInterpolation</code> suggests the value for your i18next
version, and an existing file that still sets <code>false</code>
although your i18next supports the typed value gets a hint.</li>
<li>docs(skill): the ICU and MF2 reference describes
<code>parseInterpolation: 'icu'</code> / <code>'mf2'</code>.</li>
</ul>
<h2>1.76.0</h2>
<ul>
<li>feat: new <code>extract.messageFormat</code> option,
<code>'i18next'</code> (default), <code>'icu'</code> (<a
href="https://github.com/i18next/i18next-icu">i18next-icu</a>)
or <code>'mf2'</code> (<a
href="https://github.com/i18next/i18next-mf2">i18next-mf2</a>), for the
syntax of your translation values.</li>
<li>feat(extract): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, <code>extract</code> writes one key per message.
<code>t('photos', '{count, plural, ...}', { count })</code> gave
<code>photos_one</code> and <code>photos_other</code> (plus
<code>_few</code> and <code>_many</code> for languages like Polish),
keys i18next-icu and i18next-mf2 never read, and <code>context</code>
gave <code>_male</code> keys; now it gives <code>photos</code>.
<code>$t()</code> in a value
is no longer read as nesting, and the children of
<code>&lt;Trans&gt;</code> are written with <code>{name}</code> (ICU) or
<code>{$name}</code> (MF2)
instead of <code>{{name}}</code>, which ICU and MF2 rendered as
text.</li>
<li>feat(extract): <code>IcuTrans</code> and
<code>IcuTransWithoutContext</code> are extracted, also when imported
under another name (key from
<code>i18nKey</code>, or <code>defaultTranslation</code> when there is
none), and so are the <code>Trans</code>, <code>Plural</code>,
<code>Select</code> and <code>SelectOrdinal</code>
components of <code>react-i18next/icu.macro</code>, with the message the
macro builds (<code>&lt;Trans&gt;Welcome,
&lt;strong&gt;{name}&lt;/strong&gt;!&lt;/Trans&gt;</code> gives
<code>Welcome, &lt;0&gt;{name}&lt;/0&gt;!</code>). Before,
<code>IcuTrans</code> was
not extracted, and the macro <code>&lt;Trans&gt;</code> was read as
react-i18next <code>Trans</code> and written as
<code>Welcome, &lt;strong&gt;{{name}}&lt;/strong&gt;!</code>, which the
compiled <code>IcuTrans</code> rendered as text.</li>
<li>feat(status): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, a plural or select message counts as one key, so
<code>status</code> no
longer reports missing <code>_few</code> and <code>_many</code>
keys.</li>
<li>feat(instrument): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, <code>instrument</code> writes <code>{name}</code> /
<code>{$name}</code> placeholders, a
<code>count === 1 ? … : …</code> ternary becomes one plural message
instead of <code>defaultValue_one</code> /
<code>defaultValue_other</code>, and
the i18n init file it creates registers <code>i18next-icu</code> (with
<code>intl-messageformat</code> in the install hint) or
<code>i18next-mf2</code>.</li>
<li>feat(extract, instrument): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, the text around converted placeholders
(<code>Trans</code> values, <code>instrument</code>) is
escaped: <code>File '{{name}}' not found</code> becomes <code>File
''{name}' not found</code>, because an apostrophe before <code>{</code>
starts quoted
text in ICU and <code>'{name}'</code> would render as the text
<code>{name}</code>; literal braces are quoted (ICU) or escaped
(MF2).</li>
<li>feat(lint): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, <code>lint</code> parses every value in the
translation files of all
locales and reports, with file, key and line (JSON files):
<ul>
<li>syntax errors with the parser's message (<code>greeting: ICU syntax
error: EXPECT_ARGUMENT_CLOSING_BRACE at column 7</code>),
with a hint when the value contains i18next's <code>{{</code></li>
<li>argument names that differ from the primary language, so a renamed
or missing <code>{name}</code> is caught (<code>#</code> is not an
argument)</li>
<li>plural categories that do not fit the locale, for
<code>plural</code> and <code>selectordinal</code> (MF2:
<code>.match</code> on <code>:number</code> or
<code>:integer</code>). Allowed are the locale's CLDR categories,
required are <code>other</code> plus every category a whole number from
0 to 1000 selects: <code>ru</code> needs <code>one</code>,
<code>few</code> and <code>many</code>, while <code>fr</code>,
<code>es</code>, <code>it</code> and <code>pt</code> may leave out
<code>many</code> (only from
1,000,000) and <code>cs</code> its <code>many</code> (fractions only),
and <code>zero</code> in <code>en</code> is reported as never used.
Exact selectors like
<code>=0</code> are allowed and count for a category when they cover
every whole number it is used for (<code>=1</code> covers
<code>one</code> in
<code>en</code>, not in <code>ru</code>, where <code>one</code> is also
21, 31, ...). For a locale <code>Intl</code> does not know only
<code>other</code> is required.</li>
</ul>
</li>
<li>fix(lint): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, the <code>t()</code> interpolation check reads the
arguments with the same
parser. ICU braces like <code>male {{name}}</code> are no longer taken
for <code>{{name}}</code> interpolation (which reported the
<code>gender</code>
passed to a select as unused), and <code>t('greeting', 'Hello {name}', {
nmae })</code> is reported.</li>
<li>feat(types): with <code>messageFormat: 'icu'</code> or
<code>'mf2'</code>, a newly generated <code>i18next.d.ts</code> sets
<code>parseInterpolation: false</code>
(i18next 26.2.0+), so ICU and MF2 plurals no longer break the type-safe
<code>t</code>. For an existing file without it, <code>types</code>
prints a warning.</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/i18next/i18next-cli/commit/933364ee283b2b6a805ad1ae8c936a01a2de2dae"><code>933364e</code></a>
1.77.0</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/2916f1b31425dcffffc9b2e6abc8436341f36473"><code>2916f1b</code></a>
update i18next deps</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/b7d07e784e4832a0e452afaf4640755461569638"><code>b7d07e7</code></a>
feat(types): write parseInterpolation 'icu' / 'mf2' for i18next 26.5.0
or later</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/71194cce275ba105f399e7d8aa01c7f58d76bdde"><code>71194cc</code></a>
test(lint): platform paths in the ICU/MF2 lint tests, so they pass on
Windows</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/1ea83288d0a247a28cbf87a36f3a516ee7ba4396"><code>1ea8328</code></a>
1.76.0</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/faa93a34705f0ae0cda8866e5e08943ef7579c86"><code>faa93a3</code></a>
fix(extract, instrument): escape ICU/MF2 text, register the plugin in
the ini...</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/a87f01fcb4836935afb840629c9b63f73d7a4839"><code>a87f01f</code></a>
feat(extract, status, instrument): one key per ICU/MF2 message, IcuTrans
and ...</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/e9b1f5642a95a638ff60a2194c0b039d633a1f66"><code>e9b1f56</code></a>
feat(lint, types): ICU and MF2 support with the new
extract.messageFormat option</li>
<li><a
href="https://github.com/i18next/i18next-cli/commit/6d2202d02dbb962c454ee496b12ac865d0027dba"><code>6d2202d</code></a>
README: add Awesome Claude Code badge next to the skill install
badge</li>
<li>See full diff in <a
href="https://github.com/i18next/i18next-cli/compare/v1.75.3...v1.77.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=i18next-cli&package-manager=npm_and_yarn&previous-version=1.75.3&new-version=1.77.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit is contained in:
dependabot[bot]
2026-10-21 13:54:07 +00:00
committed by GitHub
parent b1ffd828ea
commit ccfe624ac6
2 changed files with 39 additions and 10 deletions
+38 -9
View File
@@ -97,7 +97,7 @@
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-react-refresh": "^0.5.7",
"i18next-cli": "^1.75.3",
"i18next-cli": "^1.77.0",
"istanbul": "^0.4.5",
"istanbul-lib-coverage": "^3.2.2",
"nyc": "^18.0.0",
@@ -920,6 +920,23 @@
"node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@formatjs/icu-messageformat-parser": {
"version": "3.5.21",
"resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-3.5.21.tgz",
"integrity": "sha512-Vnl7IOSyMRaP4Pjv48etkT2nlcIwzh4QWIa3hewzGlZZPBbft+TbMir4MijpDViOLN/1hvkGC10oYMuilsG+fw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@formatjs/icu-skeleton-parser": "2.1.12"
}
},
"node_modules/@formatjs/icu-skeleton-parser": {
"version": "2.1.12",
"resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-2.1.12.tgz",
"integrity": "sha512-ca7tZMLpfHX3sUD7hP6gE/qr6Iq89EDd3ZLeRhbsB7r0UD55DGJq+tmFLzrGrnx5StahUevQmQQVtbDRHsfDHA==",
"dev": true,
"license": "MIT"
},
"node_modules/@humanfs/core": {
"version": "0.19.2",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
@@ -6628,9 +6645,9 @@
}
},
"node_modules/i18next": {
"version": "26.4.7",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.7.tgz",
"integrity": "sha512-p/3hqy6EcuqRs6wNwBYwGGC1fzBJSMxV9zMuN814ab/7QjdZbXfjXwuPZdQbngX6KDOTxM01uUiZyqmMB8ghZg==",
"version": "26.5.2",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-26.5.2.tgz",
"integrity": "sha512-6fIXt//2MZNok3tULyjnypxe3vbsy3pV1bVg8p2x3yKrzZvp7z3T+wXx/88LQsATRdhyJeAUAvUxEtxsHdJ29w==",
"funding": [
{
"type": "individual",
@@ -6665,27 +6682,29 @@
}
},
"node_modules/i18next-cli": {
"version": "1.75.3",
"resolved": "https://registry.npmjs.org/i18next-cli/-/i18next-cli-1.75.3.tgz",
"integrity": "sha512-JsQ9i0nVD2YhZEYpVcHAJuZ/jUjfiX5iD8JbIwb8OnzMNWeXySv1TKvTigsGBrfJ4Q6AVh1pNVOMrwTXHAUzaw==",
"version": "1.77.0",
"resolved": "https://registry.npmjs.org/i18next-cli/-/i18next-cli-1.77.0.tgz",
"integrity": "sha512-7gn/2P4QFm7pb/sWvBg9Qr7r8fZyoozhJ9MvgYuBPX/aPUrniMKnhAT2iZHAv++Yg6wRJqnP7KIJsiHcP3Mt8A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@croct/json5-parser": "^0.2.2",
"@formatjs/icu-messageformat-parser": "^3.5.21",
"@swc/core": "^1.16.2",
"chokidar": "^5.0.0",
"commander": "^15.0.0",
"execa": "^10.0.1",
"glob": "^13.0.6",
"i18next": "^26.4.2",
"i18next": "^26.5.0",
"i18next-resources-for-ts": "^2.1.1",
"inquirer": "^14.2.2",
"jiti": "^2.7.0",
"jsonc-parser": "^3.3.1",
"magic-string": "^1.4.2",
"messageformat": "^4.1.0",
"minimatch": "^10.2.6",
"ora": "^9.4.1",
"react-i18next": "^17.0.16",
"react-i18next": "^17.1.0",
"yaml": "^2.9.1"
},
"bin": {
@@ -8665,6 +8684,16 @@
"node": ">= 8"
}
},
"node_modules/messageformat": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/messageformat/-/messageformat-4.1.0.tgz",
"integrity": "sha512-ZLId0BYfsNhC6/MRwVFw1yTLgG9cbJwfTsjYSS2C59PdfJWVRsX7hthADvsXefBtTg2FKso0VAJmMJJOtnJ75w==",
"dev": true,
"license": "Apache-2.0",
"engines": {
"node": "^20.19 || ^22.12 || >=24"
}
},
"node_modules/micromark": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",