i18next-cli 1.66.2 → 1.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -307,12 +307,30 @@ npx i18next-cli sync
307
307
  ```
308
308
 
309
309
  ### `lint`
310
- Analyzes your source code for internationalization issues like hardcoded strings. Can run without a config file.
310
+ Analyzes your source code for internationalization issues. Can run without a config file.
311
311
 
312
312
  ```bash
313
313
  npx i18next-cli lint
314
314
  ```
315
315
 
316
+ **What it checks:**
317
+
318
+ - **Hardcoded strings** *(error)* — user-facing text in JSX elements and attributes that isn't wrapped in `t()`/`<Trans>`.
319
+ - **Interpolation parameters** *(error)* — mismatches between `{{placeholders}}` in a translation and the params passed to `t()` (missing or unused). Toggle with `lint.checkInterpolationParams` (default: `true`).
320
+ - **String concatenation** *(warning)* — translated strings glued together with `+`, or a sentence split across multiple `<Trans>` components. This breaks in languages that reorder or inflect the pieces; use a single key with placeholders instead. Reported as a **warning** — it is printed but does **not** fail the run / CI (exit code stays `0` unless there are errors). Toggle with `lint.checkConcatenation` (default: `true`).
321
+
322
+ ```jsx
323
+ // ⚠️ Flagged — word order can't be translated
324
+ t('greeting') + ', ' + name
325
+ <p><Trans>Hello</Trans> and <Trans>World</Trans></p>
326
+
327
+ // ✅ Preferred — one key, placeholders
328
+ t('greeting', { name }) // "Hello, {{name}}"
329
+ <Trans i18nKey="greeting">Hello {{name}}</Trans>
330
+ ```
331
+
332
+ The linter exits non-zero only when it finds **errors**; a run with only warnings succeeds.
333
+
316
334
  To suppress warnings for code you intentionally aren't translating yet, use the [`i18next-instrument-ignore` directive](#suppressing-detection-with-i18next-instrument-ignore) — the same comment recognized by the `instrument` command.
317
335
 
318
336
  ### `instrument`
@@ -927,6 +945,10 @@ export default defineConfig({
927
945
 
928
946
  /** Enable linting for interpolation parameter errors in translation calls (default: true) */
929
947
  checkInterpolationParams: true,
948
+
949
+ /** Enable linting for string concatenation involving translated strings (default: true).
950
+ * Reported as a warning — it does not fail the run / CI. */
951
+ checkConcatenation: true,
930
952
  },
931
953
 
932
954
  // TypeScript type generation
package/dist/cjs/cli.js CHANGED
@@ -37,7 +37,7 @@ const program = new commander.Command();
37
37
  program
38
38
  .name('i18next-cli')
39
39
  .description('A unified, high-performance i18next CLI.')
40
- .version('1.66.2'); // This string is replaced with the actual version at build time by rollup
40
+ .version('1.67.0'); // This string is replaced with the actual version at build time by rollup
41
41
  // new: global config override option
42
42
  program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
43
43
  program
@@ -103,6 +103,67 @@ function isI18nextOptionKey(key) {
103
103
  return true;
104
104
  return false;
105
105
  }
106
+ // Builds the full dotted callee name (e.g. 'i18n.t', 'tProps.label') and the
107
+ // bare last segment ('t', 'label') for a CallExpression, so both exact and
108
+ // wildcard function patterns can be matched against it.
109
+ function getCalleeNames(node) {
110
+ let calleeName = '';
111
+ let fullCalleeName = '';
112
+ if (node.callee) {
113
+ if (node.callee.type === 'Identifier') {
114
+ calleeName = node.callee.value || node.callee.name || '';
115
+ fullCalleeName = calleeName;
116
+ }
117
+ else if (node.callee.type === 'MemberExpression') {
118
+ const parts = [];
119
+ let current = node.callee;
120
+ let computed = false;
121
+ while (current?.type === 'MemberExpression') {
122
+ if (current.property?.type === 'Identifier') {
123
+ parts.unshift(current.property.value || current.property.name);
124
+ }
125
+ else {
126
+ computed = true;
127
+ break;
128
+ }
129
+ current = current.object;
130
+ }
131
+ if (!computed) {
132
+ if (current?.type === 'ThisExpression') {
133
+ parts.unshift('this');
134
+ }
135
+ else if (current?.type === 'Identifier') {
136
+ parts.unshift(current.value || current.name);
137
+ }
138
+ else {
139
+ parts.length = 0;
140
+ }
141
+ }
142
+ if (node.callee.property?.type === 'Identifier') {
143
+ calleeName = node.callee.property.value || node.callee.property.name;
144
+ }
145
+ fullCalleeName = parts.length ? parts.join('.') : calleeName;
146
+ }
147
+ }
148
+ return { calleeName, fullCalleeName };
149
+ }
150
+ // Returns true when a CallExpression's callee matches one of the configured
151
+ // translation functions (config.extract.functions, default ['t', '*.t']).
152
+ function isTranslationCall(node, config) {
153
+ if (!node || node.type !== 'CallExpression')
154
+ return false;
155
+ const { calleeName, fullCalleeName } = getCalleeNames(node);
156
+ const fnPatterns = config.extract.functions || ['t', '*.t'];
157
+ for (const pattern of fnPatterns) {
158
+ if (functionMatcher.matchesFunctionPattern(fullCalleeName, pattern))
159
+ return true;
160
+ // Backwards-compatible: '*.X' also matches a call whose last segment is X
161
+ // (covers computed member expressions where the full chain is unavailable).
162
+ if (pattern.startsWith('*.') && calleeName === pattern.slice(2))
163
+ return true;
164
+ }
165
+ return false;
166
+ }
106
167
  // Helper to lint interpolation parameter errors in t() calls
107
168
  function lintInterpolationParams(ast, code, config, translationValues) {
108
169
  const issues = [];
@@ -142,61 +203,7 @@ function lintInterpolationParams(ast, code, config, translationValues) {
142
203
  }
143
204
  // Modularized CallExpression handler
144
205
  function handleCallExpression(node, ancestors) {
145
- // Build the full dotted callee name (e.g. 'i18n.t', 'tProps.label') as well as
146
- // the bare last segment ('t', 'label') so both exact and wildcard patterns match.
147
- let calleeName = '';
148
- let fullCalleeName = '';
149
- if (node.callee) {
150
- if (node.callee.type === 'Identifier') {
151
- calleeName = node.callee.value || node.callee.name || '';
152
- fullCalleeName = calleeName;
153
- }
154
- else if (node.callee.type === 'MemberExpression') {
155
- const parts = [];
156
- let current = node.callee;
157
- let computed = false;
158
- while (current?.type === 'MemberExpression') {
159
- if (current.property?.type === 'Identifier') {
160
- parts.unshift(current.property.value || current.property.name);
161
- }
162
- else {
163
- computed = true;
164
- break;
165
- }
166
- current = current.object;
167
- }
168
- if (!computed) {
169
- if (current?.type === 'ThisExpression') {
170
- parts.unshift('this');
171
- }
172
- else if (current?.type === 'Identifier') {
173
- parts.unshift(current.value || current.name);
174
- }
175
- else {
176
- parts.length = 0;
177
- }
178
- }
179
- if (node.callee.property?.type === 'Identifier') {
180
- calleeName = node.callee.property.value || node.callee.property.name;
181
- }
182
- fullCalleeName = parts.length ? parts.join('.') : calleeName;
183
- }
184
- }
185
- const fnPatterns = config.extract.functions || ['t', '*.t'];
186
- let matches = false;
187
- for (const pattern of fnPatterns) {
188
- if (functionMatcher.matchesFunctionPattern(fullCalleeName, pattern)) {
189
- matches = true;
190
- break;
191
- }
192
- // Backwards-compatible: '*.X' also matches a call whose last segment is X
193
- // (covers computed member expressions where the full chain is unavailable).
194
- if (pattern.startsWith('*.') && calleeName === pattern.slice(2)) {
195
- matches = true;
196
- break;
197
- }
198
- }
199
- if (matches) {
206
+ if (isTranslationCall(node, config)) {
200
207
  // Support both .expression and direct node for arguments
201
208
  const arg0raw = node.arguments?.[0];
202
209
  const arg1raw = node.arguments?.[1];
@@ -299,6 +306,129 @@ function lintInterpolationParams(ast, code, config, translationValues) {
299
306
  }
300
307
  return issues;
301
308
  }
309
+ /**
310
+ * Detects string concatenation involving translated strings — an i18n
311
+ * anti-pattern because word order and grammar differ across languages, so
312
+ * gluing translated fragments together produces ungrammatical output in
313
+ * languages that reorder, inflect, or gender the pieces.
314
+ *
315
+ * Flags two patterns:
316
+ * JS — a `+` expression where an operand is a t() call:
317
+ * t('greeting') + ', ' + name
318
+ * JSX — a sentence split across ≥2 <Trans> components joined by literal text:
319
+ * <p><Trans>Hello</Trans> and <Trans>World</Trans></p>
320
+ *
321
+ * The fix in both cases is a single key with placeholders:
322
+ * t('greeting', { name }) / <Trans i18nKey="greeting">Hello {{name}}</Trans>
323
+ *
324
+ * Enabled by default; disable via `lint.checkConcatenation: false`.
325
+ */
326
+ function lintConcatenation(ast, code, config) {
327
+ const issues = [];
328
+ if (config.lint?.checkConcatenation === false)
329
+ return issues;
330
+ const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
331
+ const lineOf = (node) => {
332
+ const start = node?.span?.start;
333
+ if (typeof start === 'number') {
334
+ const pos = astUtils.lineColumnFromOffset(code, start);
335
+ if (pos)
336
+ return pos.line;
337
+ }
338
+ // ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
339
+ return 1;
340
+ };
341
+ // Is `node` a translated-string operand of a concatenation? True when it is a
342
+ // t() call, or a `+` chain that itself contains one. Deliberately does NOT
343
+ // descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
344
+ // (numeric +, t() used only as a lookup argument) is not flagged.
345
+ const isTranslatedConcatOperand = (node) => {
346
+ let n = node?.expression ?? node;
347
+ // Unwrap parenthesis / TS assertion wrappers.
348
+ while (n && (n.type === 'ParenthesisExpression' || n.type === 'TsAsExpression' || n.type === 'TsNonNullExpression' || n.type === 'TsConstAssertion')) {
349
+ n = n.expression;
350
+ }
351
+ if (!n)
352
+ return false;
353
+ if (isTranslationCall(n, config))
354
+ return true;
355
+ if (n.type === 'BinaryExpression' && n.operator === '+') {
356
+ return isTranslatedConcatOperand(n.left) || isTranslatedConcatOperand(n.right);
357
+ }
358
+ return false;
359
+ };
360
+ const getJsxName = (el) => {
361
+ const nameNode = el?.opening?.name ?? el?.name;
362
+ if (!nameNode)
363
+ return null;
364
+ if (nameNode.type === 'JSXIdentifier' || nameNode.type === 'Identifier')
365
+ return nameNode.value ?? nameNode.name ?? null;
366
+ // e.g. Foo.Trans → use the last segment
367
+ if (nameNode.type === 'JSXMemberExpression')
368
+ return nameNode.property?.value ?? nameNode.property?.name ?? null;
369
+ return null;
370
+ };
371
+ const walk = (node, parent) => {
372
+ if (!node || typeof node !== 'object')
373
+ return;
374
+ // JS: `+` concatenation involving a t() call. Only report the outermost `+`
375
+ // of a chain (skip when the parent is also a `+`) so one chain = one issue.
376
+ if (node.type === 'BinaryExpression' && node.operator === '+') {
377
+ const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
378
+ if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
379
+ issues.push({
380
+ text: 'Avoid string concatenation in translations. Use a single string with placeholders instead.',
381
+ line: lineOf(node),
382
+ type: 'concatenation',
383
+ severity: 'warning',
384
+ });
385
+ }
386
+ }
387
+ // JSX: a sentence split across ≥2 <Trans> components joined by literal text.
388
+ if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
389
+ let transCount = 0;
390
+ let firstTrans = null;
391
+ let hasLiteralText = false;
392
+ for (const child of node.children) {
393
+ if (!child || typeof child !== 'object')
394
+ continue;
395
+ if (child.type === 'JSXElement') {
396
+ const name = getJsxName(child);
397
+ if (name && transComponents.has(name.toLowerCase())) {
398
+ transCount++;
399
+ if (!firstTrans)
400
+ firstTrans = child;
401
+ }
402
+ }
403
+ else if (child.type === 'JSXText' && child.value.trim() !== '') {
404
+ hasLiteralText = true;
405
+ }
406
+ }
407
+ if (transCount >= 2 && hasLiteralText && firstTrans) {
408
+ issues.push({
409
+ text: 'Avoid splitting a sentence across multiple <Trans> components. Use a single <Trans> with placeholders instead.',
410
+ line: lineOf(firstTrans),
411
+ type: 'concatenation',
412
+ severity: 'warning',
413
+ });
414
+ }
415
+ }
416
+ for (const key of Object.keys(node)) {
417
+ if (key === 'span')
418
+ continue;
419
+ const child = node[key];
420
+ if (Array.isArray(child)) {
421
+ for (const item of child)
422
+ walk(item, node);
423
+ }
424
+ else if (child && typeof child === 'object') {
425
+ walk(child, node);
426
+ }
427
+ }
428
+ };
429
+ walk(ast, null);
430
+ return issues;
431
+ }
302
432
  const recommendedAcceptedTags = jsxAttributes.acceptedTags.map(s => s.toLowerCase());
303
433
  const recommendedAcceptedAttributes = jsxAttributes.translatableAttributes.map(s => s.toLowerCase());
304
434
  const defaultIgnoredAttributes = jsxAttributes.ignoredAttributeLowerSet;
@@ -426,7 +556,9 @@ class Linter extends node_events.EventEmitter {
426
556
  const hardcodedStrings = findHardcodedStrings(ast, code, config);
427
557
  // Collect interpolation parameter issues
428
558
  const interpolationIssues = lintInterpolationParams(ast, code, config, translationValues);
429
- let allIssues = [...hardcodedStrings, ...interpolationIssues];
559
+ // Collect string-concatenation issues
560
+ const concatenationIssues = lintConcatenation(ast, code, config);
561
+ let allIssues = [...hardcodedStrings, ...interpolationIssues, ...concatenationIssues];
430
562
  // Filter issues suppressed by ignore-directive comments.
431
563
  // i18next-instrument-ignore-next-line → suppresses the single next line
432
564
  // i18next-instrument-ignore → suppresses the whole next JSX element
@@ -441,7 +573,10 @@ class Linter extends node_events.EventEmitter {
441
573
  }
442
574
  }
443
575
  const files = Object.fromEntries(issuesByFile.entries());
444
- const data = { success: totalIssues === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
576
+ // `success` reflects errors only warning-severity issues (e.g. string
577
+ // concatenation) are reported but do not fail the run / CI.
578
+ const errorCount = Array.from(issuesByFile.values()).flat().filter(i => i.severity !== 'warning').length;
579
+ const data = { success: errorCount === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
445
580
  this.emit('done', data);
446
581
  return data;
447
582
  }
@@ -564,28 +699,37 @@ async function runLinterCli(config, options = {}) {
564
699
  spinner.text = event.message;
565
700
  });
566
701
  try {
567
- const { success, message, files } = await linter.run();
568
- if (!success) {
702
+ const { message, files } = await linter.run();
703
+ const fileEntries = Object.entries(files);
704
+ const allIssues = fileEntries.flatMap(([, issues]) => issues);
705
+ const hasErrors = allIssues.some(i => i.severity !== 'warning');
706
+ const hasWarnings = allIssues.some(i => i.severity === 'warning');
707
+ // Summary line: fail on errors, warn when only warnings, succeed when clean.
708
+ if (hasErrors)
569
709
  spinner.fail(node_util.styleText(['red', 'bold'], message));
570
- // Print detailed report after spinner fails
571
- for (const [file, issues] of Object.entries(files)) {
572
- if (internalLogger.info)
573
- internalLogger.info(node_util.styleText('yellow', `\n${file}`));
574
- else
575
- console.log(node_util.styleText('yellow', `\n${file}`));
576
- issues.forEach(({ text, line, type }) => {
577
- const label = type === 'interpolation' ? 'Interpolation issue' : 'Found hardcoded string';
578
- if (typeof internalLogger.info === 'function')
579
- internalLogger.info(` ${node_util.styleText('gray', `${line}:`)} ${node_util.styleText('red', 'Error:')} ${label}: "${text}"`);
580
- else
581
- console.log(` ${node_util.styleText('gray', `${line}:`)} ${node_util.styleText('red', 'Error:')} ${label}: "${text}"`);
582
- });
583
- }
584
- process.exit(1);
585
- }
586
- else {
710
+ else if (hasWarnings)
711
+ spinner.warn(node_util.styleText(['yellow', 'bold'], message));
712
+ else
587
713
  spinner.succeed(node_util.styleText(['green', 'bold'], message));
714
+ // Detailed report — colour each line by severity (red Error / yellow Warning).
715
+ for (const [file, issues] of fileEntries) {
716
+ if (internalLogger.info)
717
+ internalLogger.info(node_util.styleText('yellow', `\n${file}`));
718
+ else
719
+ console.log(node_util.styleText('yellow', `\n${file}`));
720
+ issues.forEach(({ text, line, type, severity }) => {
721
+ const label = type === 'interpolation' ? 'Interpolation issue' : type === 'concatenation' ? 'String concatenation' : 'Found hardcoded string';
722
+ const tag = severity === 'warning' ? node_util.styleText('yellow', 'Warning:') : node_util.styleText('red', 'Error:');
723
+ const detail = ` ${node_util.styleText('gray', `${line}:`)} ${tag} ${label}: "${text}"`;
724
+ if (typeof internalLogger.info === 'function')
725
+ internalLogger.info(detail);
726
+ else
727
+ console.log(detail);
728
+ });
588
729
  }
730
+ // Only errors fail the process; warning-only runs exit 0.
731
+ if (hasErrors)
732
+ process.exit(1);
589
733
  }
590
734
  catch (error) {
591
735
  const wrappedError = linter.wrapError(error);
package/dist/esm/cli.js CHANGED
@@ -31,7 +31,7 @@ const program = new Command();
31
31
  program
32
32
  .name('i18next-cli')
33
33
  .description('A unified, high-performance i18next CLI.')
34
- .version('1.66.2'); // This string is replaced with the actual version at build time by rollup
34
+ .version('1.67.0'); // This string is replaced with the actual version at build time by rollup
35
35
  // new: global config override option
36
36
  program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
37
37
  program
@@ -7,7 +7,7 @@ import { styleText } from 'node:util';
7
7
  import { ConsoleLogger } from './utils/logger.js';
8
8
  import { createSpinnerLike } from './utils/wrap-ora.js';
9
9
  import { acceptedTags, translatableAttributes, ignoredTags, ignoredAttributeLowerSet } from './utils/jsx-attributes.js';
10
- import { findFirstTokenIndex, normalizeASTSpans, buildByteToCharMap, convertSpansToCharIndices, collectIgnoredLineRanges } from './extractor/parsers/ast-utils.js';
10
+ import { findFirstTokenIndex, normalizeASTSpans, buildByteToCharMap, convertSpansToCharIndices, collectIgnoredLineRanges, lineColumnFromOffset } from './extractor/parsers/ast-utils.js';
11
11
  import { matchesFunctionPattern } from './extractor/utils/function-matcher.js';
12
12
 
13
13
  /**
@@ -101,6 +101,67 @@ function isI18nextOptionKey(key) {
101
101
  return true;
102
102
  return false;
103
103
  }
104
+ // Builds the full dotted callee name (e.g. 'i18n.t', 'tProps.label') and the
105
+ // bare last segment ('t', 'label') for a CallExpression, so both exact and
106
+ // wildcard function patterns can be matched against it.
107
+ function getCalleeNames(node) {
108
+ let calleeName = '';
109
+ let fullCalleeName = '';
110
+ if (node.callee) {
111
+ if (node.callee.type === 'Identifier') {
112
+ calleeName = node.callee.value || node.callee.name || '';
113
+ fullCalleeName = calleeName;
114
+ }
115
+ else if (node.callee.type === 'MemberExpression') {
116
+ const parts = [];
117
+ let current = node.callee;
118
+ let computed = false;
119
+ while (current?.type === 'MemberExpression') {
120
+ if (current.property?.type === 'Identifier') {
121
+ parts.unshift(current.property.value || current.property.name);
122
+ }
123
+ else {
124
+ computed = true;
125
+ break;
126
+ }
127
+ current = current.object;
128
+ }
129
+ if (!computed) {
130
+ if (current?.type === 'ThisExpression') {
131
+ parts.unshift('this');
132
+ }
133
+ else if (current?.type === 'Identifier') {
134
+ parts.unshift(current.value || current.name);
135
+ }
136
+ else {
137
+ parts.length = 0;
138
+ }
139
+ }
140
+ if (node.callee.property?.type === 'Identifier') {
141
+ calleeName = node.callee.property.value || node.callee.property.name;
142
+ }
143
+ fullCalleeName = parts.length ? parts.join('.') : calleeName;
144
+ }
145
+ }
146
+ return { calleeName, fullCalleeName };
147
+ }
148
+ // Returns true when a CallExpression's callee matches one of the configured
149
+ // translation functions (config.extract.functions, default ['t', '*.t']).
150
+ function isTranslationCall(node, config) {
151
+ if (!node || node.type !== 'CallExpression')
152
+ return false;
153
+ const { calleeName, fullCalleeName } = getCalleeNames(node);
154
+ const fnPatterns = config.extract.functions || ['t', '*.t'];
155
+ for (const pattern of fnPatterns) {
156
+ if (matchesFunctionPattern(fullCalleeName, pattern))
157
+ return true;
158
+ // Backwards-compatible: '*.X' also matches a call whose last segment is X
159
+ // (covers computed member expressions where the full chain is unavailable).
160
+ if (pattern.startsWith('*.') && calleeName === pattern.slice(2))
161
+ return true;
162
+ }
163
+ return false;
164
+ }
104
165
  // Helper to lint interpolation parameter errors in t() calls
105
166
  function lintInterpolationParams(ast, code, config, translationValues) {
106
167
  const issues = [];
@@ -140,61 +201,7 @@ function lintInterpolationParams(ast, code, config, translationValues) {
140
201
  }
141
202
  // Modularized CallExpression handler
142
203
  function handleCallExpression(node, ancestors) {
143
- // Build the full dotted callee name (e.g. 'i18n.t', 'tProps.label') as well as
144
- // the bare last segment ('t', 'label') so both exact and wildcard patterns match.
145
- let calleeName = '';
146
- let fullCalleeName = '';
147
- if (node.callee) {
148
- if (node.callee.type === 'Identifier') {
149
- calleeName = node.callee.value || node.callee.name || '';
150
- fullCalleeName = calleeName;
151
- }
152
- else if (node.callee.type === 'MemberExpression') {
153
- const parts = [];
154
- let current = node.callee;
155
- let computed = false;
156
- while (current?.type === 'MemberExpression') {
157
- if (current.property?.type === 'Identifier') {
158
- parts.unshift(current.property.value || current.property.name);
159
- }
160
- else {
161
- computed = true;
162
- break;
163
- }
164
- current = current.object;
165
- }
166
- if (!computed) {
167
- if (current?.type === 'ThisExpression') {
168
- parts.unshift('this');
169
- }
170
- else if (current?.type === 'Identifier') {
171
- parts.unshift(current.value || current.name);
172
- }
173
- else {
174
- parts.length = 0;
175
- }
176
- }
177
- if (node.callee.property?.type === 'Identifier') {
178
- calleeName = node.callee.property.value || node.callee.property.name;
179
- }
180
- fullCalleeName = parts.length ? parts.join('.') : calleeName;
181
- }
182
- }
183
- const fnPatterns = config.extract.functions || ['t', '*.t'];
184
- let matches = false;
185
- for (const pattern of fnPatterns) {
186
- if (matchesFunctionPattern(fullCalleeName, pattern)) {
187
- matches = true;
188
- break;
189
- }
190
- // Backwards-compatible: '*.X' also matches a call whose last segment is X
191
- // (covers computed member expressions where the full chain is unavailable).
192
- if (pattern.startsWith('*.') && calleeName === pattern.slice(2)) {
193
- matches = true;
194
- break;
195
- }
196
- }
197
- if (matches) {
204
+ if (isTranslationCall(node, config)) {
198
205
  // Support both .expression and direct node for arguments
199
206
  const arg0raw = node.arguments?.[0];
200
207
  const arg1raw = node.arguments?.[1];
@@ -297,6 +304,129 @@ function lintInterpolationParams(ast, code, config, translationValues) {
297
304
  }
298
305
  return issues;
299
306
  }
307
+ /**
308
+ * Detects string concatenation involving translated strings — an i18n
309
+ * anti-pattern because word order and grammar differ across languages, so
310
+ * gluing translated fragments together produces ungrammatical output in
311
+ * languages that reorder, inflect, or gender the pieces.
312
+ *
313
+ * Flags two patterns:
314
+ * JS — a `+` expression where an operand is a t() call:
315
+ * t('greeting') + ', ' + name
316
+ * JSX — a sentence split across ≥2 <Trans> components joined by literal text:
317
+ * <p><Trans>Hello</Trans> and <Trans>World</Trans></p>
318
+ *
319
+ * The fix in both cases is a single key with placeholders:
320
+ * t('greeting', { name }) / <Trans i18nKey="greeting">Hello {{name}}</Trans>
321
+ *
322
+ * Enabled by default; disable via `lint.checkConcatenation: false`.
323
+ */
324
+ function lintConcatenation(ast, code, config) {
325
+ const issues = [];
326
+ if (config.lint?.checkConcatenation === false)
327
+ return issues;
328
+ const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
329
+ const lineOf = (node) => {
330
+ const start = node?.span?.start;
331
+ if (typeof start === 'number') {
332
+ const pos = lineColumnFromOffset(code, start);
333
+ if (pos)
334
+ return pos.line;
335
+ }
336
+ // ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
337
+ return 1;
338
+ };
339
+ // Is `node` a translated-string operand of a concatenation? True when it is a
340
+ // t() call, or a `+` chain that itself contains one. Deliberately does NOT
341
+ // descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
342
+ // (numeric +, t() used only as a lookup argument) is not flagged.
343
+ const isTranslatedConcatOperand = (node) => {
344
+ let n = node?.expression ?? node;
345
+ // Unwrap parenthesis / TS assertion wrappers.
346
+ while (n && (n.type === 'ParenthesisExpression' || n.type === 'TsAsExpression' || n.type === 'TsNonNullExpression' || n.type === 'TsConstAssertion')) {
347
+ n = n.expression;
348
+ }
349
+ if (!n)
350
+ return false;
351
+ if (isTranslationCall(n, config))
352
+ return true;
353
+ if (n.type === 'BinaryExpression' && n.operator === '+') {
354
+ return isTranslatedConcatOperand(n.left) || isTranslatedConcatOperand(n.right);
355
+ }
356
+ return false;
357
+ };
358
+ const getJsxName = (el) => {
359
+ const nameNode = el?.opening?.name ?? el?.name;
360
+ if (!nameNode)
361
+ return null;
362
+ if (nameNode.type === 'JSXIdentifier' || nameNode.type === 'Identifier')
363
+ return nameNode.value ?? nameNode.name ?? null;
364
+ // e.g. Foo.Trans → use the last segment
365
+ if (nameNode.type === 'JSXMemberExpression')
366
+ return nameNode.property?.value ?? nameNode.property?.name ?? null;
367
+ return null;
368
+ };
369
+ const walk = (node, parent) => {
370
+ if (!node || typeof node !== 'object')
371
+ return;
372
+ // JS: `+` concatenation involving a t() call. Only report the outermost `+`
373
+ // of a chain (skip when the parent is also a `+`) so one chain = one issue.
374
+ if (node.type === 'BinaryExpression' && node.operator === '+') {
375
+ const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
376
+ if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
377
+ issues.push({
378
+ text: 'Avoid string concatenation in translations. Use a single string with placeholders instead.',
379
+ line: lineOf(node),
380
+ type: 'concatenation',
381
+ severity: 'warning',
382
+ });
383
+ }
384
+ }
385
+ // JSX: a sentence split across ≥2 <Trans> components joined by literal text.
386
+ if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
387
+ let transCount = 0;
388
+ let firstTrans = null;
389
+ let hasLiteralText = false;
390
+ for (const child of node.children) {
391
+ if (!child || typeof child !== 'object')
392
+ continue;
393
+ if (child.type === 'JSXElement') {
394
+ const name = getJsxName(child);
395
+ if (name && transComponents.has(name.toLowerCase())) {
396
+ transCount++;
397
+ if (!firstTrans)
398
+ firstTrans = child;
399
+ }
400
+ }
401
+ else if (child.type === 'JSXText' && child.value.trim() !== '') {
402
+ hasLiteralText = true;
403
+ }
404
+ }
405
+ if (transCount >= 2 && hasLiteralText && firstTrans) {
406
+ issues.push({
407
+ text: 'Avoid splitting a sentence across multiple <Trans> components. Use a single <Trans> with placeholders instead.',
408
+ line: lineOf(firstTrans),
409
+ type: 'concatenation',
410
+ severity: 'warning',
411
+ });
412
+ }
413
+ }
414
+ for (const key of Object.keys(node)) {
415
+ if (key === 'span')
416
+ continue;
417
+ const child = node[key];
418
+ if (Array.isArray(child)) {
419
+ for (const item of child)
420
+ walk(item, node);
421
+ }
422
+ else if (child && typeof child === 'object') {
423
+ walk(child, node);
424
+ }
425
+ }
426
+ };
427
+ walk(ast, null);
428
+ return issues;
429
+ }
300
430
  const recommendedAcceptedTags = acceptedTags.map(s => s.toLowerCase());
301
431
  const recommendedAcceptedAttributes = translatableAttributes.map(s => s.toLowerCase());
302
432
  const defaultIgnoredAttributes = ignoredAttributeLowerSet;
@@ -424,7 +554,9 @@ class Linter extends EventEmitter {
424
554
  const hardcodedStrings = findHardcodedStrings(ast, code, config);
425
555
  // Collect interpolation parameter issues
426
556
  const interpolationIssues = lintInterpolationParams(ast, code, config, translationValues);
427
- let allIssues = [...hardcodedStrings, ...interpolationIssues];
557
+ // Collect string-concatenation issues
558
+ const concatenationIssues = lintConcatenation(ast, code, config);
559
+ let allIssues = [...hardcodedStrings, ...interpolationIssues, ...concatenationIssues];
428
560
  // Filter issues suppressed by ignore-directive comments.
429
561
  // i18next-instrument-ignore-next-line → suppresses the single next line
430
562
  // i18next-instrument-ignore → suppresses the whole next JSX element
@@ -439,7 +571,10 @@ class Linter extends EventEmitter {
439
571
  }
440
572
  }
441
573
  const files = Object.fromEntries(issuesByFile.entries());
442
- const data = { success: totalIssues === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
574
+ // `success` reflects errors only warning-severity issues (e.g. string
575
+ // concatenation) are reported but do not fail the run / CI.
576
+ const errorCount = Array.from(issuesByFile.values()).flat().filter(i => i.severity !== 'warning').length;
577
+ const data = { success: errorCount === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
443
578
  this.emit('done', data);
444
579
  return data;
445
580
  }
@@ -562,28 +697,37 @@ async function runLinterCli(config, options = {}) {
562
697
  spinner.text = event.message;
563
698
  });
564
699
  try {
565
- const { success, message, files } = await linter.run();
566
- if (!success) {
700
+ const { message, files } = await linter.run();
701
+ const fileEntries = Object.entries(files);
702
+ const allIssues = fileEntries.flatMap(([, issues]) => issues);
703
+ const hasErrors = allIssues.some(i => i.severity !== 'warning');
704
+ const hasWarnings = allIssues.some(i => i.severity === 'warning');
705
+ // Summary line: fail on errors, warn when only warnings, succeed when clean.
706
+ if (hasErrors)
567
707
  spinner.fail(styleText(['red', 'bold'], message));
568
- // Print detailed report after spinner fails
569
- for (const [file, issues] of Object.entries(files)) {
570
- if (internalLogger.info)
571
- internalLogger.info(styleText('yellow', `\n${file}`));
572
- else
573
- console.log(styleText('yellow', `\n${file}`));
574
- issues.forEach(({ text, line, type }) => {
575
- const label = type === 'interpolation' ? 'Interpolation issue' : 'Found hardcoded string';
576
- if (typeof internalLogger.info === 'function')
577
- internalLogger.info(` ${styleText('gray', `${line}:`)} ${styleText('red', 'Error:')} ${label}: "${text}"`);
578
- else
579
- console.log(` ${styleText('gray', `${line}:`)} ${styleText('red', 'Error:')} ${label}: "${text}"`);
580
- });
581
- }
582
- process.exit(1);
583
- }
584
- else {
708
+ else if (hasWarnings)
709
+ spinner.warn(styleText(['yellow', 'bold'], message));
710
+ else
585
711
  spinner.succeed(styleText(['green', 'bold'], message));
712
+ // Detailed report — colour each line by severity (red Error / yellow Warning).
713
+ for (const [file, issues] of fileEntries) {
714
+ if (internalLogger.info)
715
+ internalLogger.info(styleText('yellow', `\n${file}`));
716
+ else
717
+ console.log(styleText('yellow', `\n${file}`));
718
+ issues.forEach(({ text, line, type, severity }) => {
719
+ const label = type === 'interpolation' ? 'Interpolation issue' : type === 'concatenation' ? 'String concatenation' : 'Found hardcoded string';
720
+ const tag = severity === 'warning' ? styleText('yellow', 'Warning:') : styleText('red', 'Error:');
721
+ const detail = ` ${styleText('gray', `${line}:`)} ${tag} ${label}: "${text}"`;
722
+ if (typeof internalLogger.info === 'function')
723
+ internalLogger.info(detail);
724
+ else
725
+ console.log(detail);
726
+ });
586
727
  }
728
+ // Only errors fail the process; warning-only runs exit 0.
729
+ if (hasErrors)
730
+ process.exit(1);
587
731
  }
588
732
  catch (error) {
589
733
  const wrappedError = linter.wrapError(error);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18next-cli",
3
- "version": "1.66.2",
3
+ "version": "1.67.0",
4
4
  "description": "A unified, high-performance i18next CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAA;AA8SpG,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;SACpC;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAiD,CAAA;AAC7F,eAAO,MAAM,6BAA6B,EAAE,MAAM,EAAqD,CAAA;AAKvG,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAQ;gBAET,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAE,MAA4B;IAM/E,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;IAkIT,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAWnC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,0BAA0B;YAUpB,qBAAqB;YAgBrB,uBAAuB;CAgBtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBAkCnD"}
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAA;AA2apG,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;SACpC;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAiD,CAAA;AAC7F,eAAO,MAAM,6BAA6B,EAAE,MAAM,EAAqD,CAAA;AAKvG,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAQ;gBAET,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAE,MAA4B;IAM/E,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;IAuIT,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAWnC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,0BAA0B;YAUpB,qBAAqB;YAgBrB,uBAAuB;CAgBtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBA0CnD"}
package/types/types.d.ts CHANGED
@@ -219,6 +219,13 @@ export interface I18nextToolkitConfig {
219
219
  ignore?: string | string[];
220
220
  /** Enable linting for interpolation parameter errors in translation calls (default: true) */
221
221
  checkInterpolationParams?: boolean;
222
+ /** Enable linting for string concatenation involving translated strings (default: true).
223
+ *
224
+ * Flags patterns like `t('greeting') + ', ' + name` and sentences split across
225
+ * multiple `<Trans>` components joined by literal text, which break in languages
226
+ * that reorder or inflect the pieces. Use a single key with placeholders instead.
227
+ */
228
+ checkConcatenation?: boolean;
222
229
  };
223
230
  /** Configuration options for TypeScript type generation */
224
231
  types?: {
@@ -314,7 +321,10 @@ export interface LintIssue {
314
321
  /** Line number where the issue was found */
315
322
  line: number;
316
323
  /** Issue category */
317
- type?: 'hardcoded' | 'interpolation';
324
+ type?: 'hardcoded' | 'interpolation' | 'concatenation';
325
+ /** Severity of the issue. Defaults to 'error' (fails the lint run / CI); 'warning' is
326
+ * reported but does not fail the run. Concatenation issues are reported as warnings. */
327
+ severity?: 'error' | 'warning';
318
328
  }
319
329
  /**
320
330
  * Context object provided to linter plugin hooks.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}