i18next-cli 1.50.2 → 1.50.4

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/dist/cjs/cli.js CHANGED
@@ -31,7 +31,7 @@ const program = new commander.Command();
31
31
  program
32
32
  .name('i18next-cli')
33
33
  .description('A unified, high-performance i18next CLI.')
34
- .version('1.50.2'); // This string is replaced with the actual version at build time by rollup
34
+ .version('1.50.4'); // 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
@@ -809,29 +809,14 @@ async function getTranslations(keys, objectKeys, config, { syncPrimaryWithDefaul
809
809
  // namespace (internally we keep implicit keys as 'translation').
810
810
  const NO_NS_TOKEN = '__no_namespace__';
811
811
  const keysByNS = new Map();
812
- const nsSep = typeof config.extract.nsSeparator === 'string' ? config.extract.nsSeparator : ':';
813
- const nsNaturalLanguageRegex = new RegExp(`(${chars.map((c) => (c === '?' ? '\\?' : c)).join('|')})`);
814
812
  for (const k of keys.values()) {
815
- let ns = k.ns;
816
- let key = k.key;
817
- // Fix for incorrect splitting of natural language keys containing nsSeparator
818
- // If the namespace contains spaces or looks like natural language, assume it was split incorrectly
819
- // and rejoin it with the key.
820
- if (ns && nsNaturalLanguageRegex.test(ns)) {
821
- key = `${ns}${nsSep}${key}`;
822
- ns = undefined;
823
- }
813
+ const ns = k.ns;
824
814
  const nsKey = (k.nsIsImplicit && config.extract.defaultNS === false)
825
815
  ? NO_NS_TOKEN
826
816
  : String(ns ?? (config.extract.defaultNS ?? 'translation'));
827
817
  if (!keysByNS.has(nsKey))
828
818
  keysByNS.set(nsKey, []);
829
- if (ns !== k.ns || key !== k.key) {
830
- keysByNS.get(nsKey).push({ ...k, ns, key });
831
- }
832
- else {
833
- keysByNS.get(nsKey).push(k);
834
- }
819
+ keysByNS.get(nsKey).push(k);
835
820
  }
836
821
  // Filter out ignored namespaces
837
822
  const ignoreNamespaces = new Set(config.extract.ignoreNamespaces ?? []);
@@ -4,6 +4,10 @@ var astUtils = require('./ast-utils.js');
4
4
 
5
5
  // Helper to escape regex characters
6
6
  const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
7
+ // Checks if a string looks like natural language (contains spaces, punctuation, etc.)
8
+ // Used to prevent splitting keys like "Error message: not found" into namespace + key.
9
+ const naturalLanguageChars = /[ ,?!;]/;
10
+ const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
7
11
  class CallExpressionHandler {
8
12
  pluginContext;
9
13
  config;
@@ -162,11 +166,16 @@ class CallExpressionHandler {
162
166
  const nsSeparator = this.config.extract.nsSeparator ?? ':';
163
167
  if (!ns && nsSeparator && key.includes(nsSeparator)) {
164
168
  const parts = key.split(nsSeparator);
165
- ns = parts.shift();
166
- key = parts.join(nsSeparator);
167
- if (!key || key.trim() === '') {
168
- this.logger.warn(`Skipping key that became empty after namespace removal: '${ns}${nsSeparator}'`);
169
- continue;
169
+ const candidateNs = parts[0];
170
+ // If the candidate namespace looks like natural language (contains spaces,
171
+ // punctuation), assume the separator is part of the key text, not a namespace delimiter.
172
+ if (!looksLikeNaturalLanguage(candidateNs)) {
173
+ ns = parts.shift();
174
+ key = parts.join(nsSeparator);
175
+ if (!key || key.trim() === '') {
176
+ this.logger.warn(`Skipping key that became empty after namespace removal: '${ns}${nsSeparator}'`);
177
+ continue;
178
+ }
170
179
  }
171
180
  }
172
181
  if (!ns && scopeInfo?.defaultNs)
@@ -491,10 +500,16 @@ class CallExpressionHandler {
491
500
  const nsSeparator = this.config.extract.nsSeparator ?? ':';
492
501
  if (nsSeparator && key.includes(nsSeparator)) {
493
502
  const parts = key.split(nsSeparator);
494
- nestedNs = parts.shift();
495
- key = parts.join(nsSeparator);
496
- if (!key || key.trim() === '')
497
- return;
503
+ const candidateNs = parts[0];
504
+ if (!looksLikeNaturalLanguage(candidateNs)) {
505
+ nestedNs = parts.shift();
506
+ key = parts.join(nsSeparator);
507
+ if (!key || key.trim() === '')
508
+ return;
509
+ }
510
+ else {
511
+ nestedNs = this.config.extract.defaultNS;
512
+ }
498
513
  }
499
514
  else {
500
515
  nestedNs = this.config.extract.defaultNS;
@@ -1,5 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ // Checks if a string looks like natural language (contains spaces, punctuation, etc.)
4
+ const naturalLanguageChars = /[ ,?!;]/;
5
+ const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
3
6
  /**
4
7
  * Extracts translation keys from comments in source code using regex patterns.
5
8
  * Supports extraction from single-line (//) and multi-line comments.
@@ -88,15 +91,18 @@ function extractKeysFromComments(code, pluginContext, config, scopeResolver) {
88
91
  const nsSeparator = config.extract.nsSeparator ?? ':';
89
92
  if (!ns && nsSeparator && key.includes(nsSeparator)) {
90
93
  const parts = key.split(nsSeparator);
91
- ns = parts.shift();
92
- key = parts.join(nsSeparator);
93
- // Validate that the key didn't become empty after namespace removal
94
- if (!key || key.trim() === '') {
95
- continue; // Skip keys that become empty after namespace removal
96
- }
97
- // Re-check preservePatterns after namespace processing (namespace-aware)
98
- if (matchesPreserve(key, ns)) {
99
- continue; // Skip processed keys that match preserve patterns
94
+ // If the candidate namespace looks like natural language, don't split
95
+ if (!looksLikeNaturalLanguage(parts[0])) {
96
+ ns = parts.shift();
97
+ key = parts.join(nsSeparator);
98
+ // Validate that the key didn't become empty after namespace removal
99
+ if (!key || key.trim() === '') {
100
+ continue; // Skip keys that become empty after namespace removal
101
+ }
102
+ // Re-check preservePatterns after namespace processing (namespace-aware)
103
+ if (matchesPreserve(key, ns)) {
104
+ continue; // Skip processed keys that match preserve patterns
105
+ }
100
106
  }
101
107
  }
102
108
  // 3. If no explicit namespace found, try to resolve from scope
@@ -3,6 +3,9 @@
3
3
  var jsxParser = require('./jsx-parser.js');
4
4
  var astUtils = require('./ast-utils.js');
5
5
 
6
+ // Checks if a string looks like natural language (contains spaces, punctuation, etc.)
7
+ const naturalLanguageChars = /[ ,?!;]/;
8
+ const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
6
9
  class JSXHandler {
7
10
  config;
8
11
  pluginContext;
@@ -87,9 +90,11 @@ class JSXHandler {
87
90
  // If the key contains a namespace separator, it takes precedence
88
91
  // over the default t ns value
89
92
  if (nsSeparator && key.includes(nsSeparator)) {
90
- let parts;
91
- ([ns, ...parts] = key.split(nsSeparator));
92
- key = parts.join(nsSeparator);
93
+ const parts = key.split(nsSeparator);
94
+ if (!looksLikeNaturalLanguage(parts[0])) {
95
+ ns = parts.shift();
96
+ key = parts.join(nsSeparator);
97
+ }
93
98
  }
94
99
  return {
95
100
  key,
@@ -12,6 +12,13 @@ var fileUtils = require('./utils/file-utils.js');
12
12
  var funnelMsgTracker = require('./utils/funnel-msg-tracker.js');
13
13
  require('./extractor/parsers/jsx-parser.js');
14
14
 
15
+ function classifyValue(value) {
16
+ if (value === undefined || value === null)
17
+ return 'absent';
18
+ if (value === '')
19
+ return 'empty';
20
+ return 'translated';
21
+ }
15
22
  /**
16
23
  * Runs a health check on the project's i18next translations and displays a status report.
17
24
  *
@@ -22,6 +29,11 @@ require('./extractor/parsers/jsx-parser.js');
22
29
  * 4. Displaying a formatted report with key counts, locales, and progress bars.
23
30
  * 5. Serving as a value-driven funnel to introduce the locize commercial service.
24
31
  *
32
+ * Exit behaviour (unchanged): exits 1 when any key is either empty or absent.
33
+ * The output now distinguishes between the two states so developers can tell
34
+ * whether they have a structural problem (absent) or simply pending translation
35
+ * work (empty).
36
+ *
25
37
  * @param config - The i18next toolkit configuration object.
26
38
  * @param options - Options object, may contain a `detail` property with a locale string.
27
39
  * @throws {Error} When unable to extract keys or read translation files
@@ -42,7 +54,7 @@ async function runStatus(config, options = {}) {
42
54
  }
43
55
  }
44
56
  if (hasMissing) {
45
- spinner.fail('Error: Missing translations detected.');
57
+ spinner.fail('Error: Incomplete translations detected.');
46
58
  process.exit(1);
47
59
  }
48
60
  }
@@ -94,6 +106,8 @@ async function generateStatusReport(config) {
94
106
  };
95
107
  for (const locale of secondaryLanguages) {
96
108
  let totalTranslatedForLocale = 0;
109
+ let totalEmptyForLocale = 0;
110
+ let totalAbsentForLocale = 0;
97
111
  let totalKeysForLocale = 0;
98
112
  const namespaces = new Map();
99
113
  const mergedTranslations = mergeNamespaces
@@ -120,6 +134,8 @@ async function generateStatusReport(config) {
120
134
  }
121
135
  }
122
136
  let translatedInNs = 0;
137
+ let emptyInNs = 0;
138
+ let absentInNs = 0;
123
139
  let totalInNs = 0;
124
140
  const keyDetails = [];
125
141
  // Get the plural categories for THIS specific locale
@@ -135,6 +151,26 @@ async function generateStatusReport(config) {
135
151
  return fallbackRules.resolvedOptions().pluralCategories;
136
152
  }
137
153
  };
154
+ /**
155
+ * Resolves the value for a single key, applying the fallback namespace when
156
+ * configured, and classifies it as translated / empty / absent.
157
+ *
158
+ * The fallback is only consulted when the primary value is absent — an empty
159
+ * string is a deliberate placeholder written by `extract` and should not be
160
+ * silently replaced by a fallback value.
161
+ */
162
+ const resolveAndClassify = (key) => {
163
+ const sep = keySeparator ?? '.';
164
+ const primaryValue = nestedObject.getNestedValue(translationsForNs, key, sep);
165
+ const primaryState = classifyValue(primaryValue);
166
+ // Only fall back when the key is genuinely absent from the primary file.
167
+ // An empty string is intentional (placeholder from extract) — don't hide it.
168
+ if (primaryState === 'absent' && fallbackTranslations) {
169
+ const fallbackValue = nestedObject.getNestedValue(fallbackTranslations, key, sep);
170
+ return classifyValue(fallbackValue);
171
+ }
172
+ return primaryState;
173
+ };
138
174
  for (const { key: baseKey, hasCount, isOrdinal, isExpandedPlural } of keysInNs) {
139
175
  if (hasCount) {
140
176
  if (isExpandedPlural) {
@@ -150,15 +186,14 @@ async function generateStatusReport(config) {
150
186
  // Only count this key if it's a plural form used by this locale
151
187
  if (localePluralCategories.includes(category)) {
152
188
  totalInNs++;
153
- let value = nestedObject.getNestedValue(translationsForNs, baseKey, keySeparator ?? '.');
154
- // Fallback lookup
155
- if (!value && fallbackTranslations) {
156
- value = nestedObject.getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
157
- }
158
- const isTranslated = !!value;
159
- if (isTranslated)
189
+ const state = resolveAndClassify(baseKey);
190
+ if (state === 'translated')
160
191
  translatedInNs++;
161
- keyDetails.push({ key: baseKey, isTranslated });
192
+ else if (state === 'empty')
193
+ emptyInNs++;
194
+ else
195
+ absentInNs++;
196
+ keyDetails.push({ key: baseKey, state });
162
197
  }
163
198
  }
164
199
  else {
@@ -170,40 +205,57 @@ async function generateStatusReport(config) {
170
205
  const pluralKey = isOrdinal
171
206
  ? `${baseKey}${pluralSeparator}ordinal${pluralSeparator}${category}`
172
207
  : `${baseKey}${pluralSeparator}${category}`;
173
- let value = nestedObject.getNestedValue(translationsForNs, pluralKey, keySeparator ?? '.');
174
- // Fallback lookup
175
- if (!value && fallbackTranslations) {
176
- value = nestedObject.getNestedValue(fallbackTranslations, pluralKey, keySeparator ?? '.');
177
- }
178
- const isTranslated = !!value;
179
- if (isTranslated)
208
+ const state = resolveAndClassify(pluralKey);
209
+ if (state === 'translated')
180
210
  translatedInNs++;
181
- keyDetails.push({ key: pluralKey, isTranslated });
211
+ else if (state === 'empty')
212
+ emptyInNs++;
213
+ else
214
+ absentInNs++;
215
+ keyDetails.push({ key: pluralKey, state });
182
216
  }
183
217
  }
184
218
  }
185
219
  else {
186
- // It's a simple key
187
220
  totalInNs++;
188
- let value = nestedObject.getNestedValue(translationsForNs, baseKey, keySeparator ?? '.');
189
- // Fallback lookup
190
- if (!value && fallbackTranslations) {
191
- value = nestedObject.getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
192
- }
193
- const isTranslated = !!value;
194
- if (isTranslated)
221
+ const state = resolveAndClassify(baseKey);
222
+ if (state === 'translated')
195
223
  translatedInNs++;
196
- keyDetails.push({ key: baseKey, isTranslated });
224
+ else if (state === 'empty')
225
+ emptyInNs++;
226
+ else
227
+ absentInNs++;
228
+ keyDetails.push({ key: baseKey, state });
197
229
  }
198
230
  }
199
- namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, keyDetails });
231
+ namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, emptyKeys: emptyInNs, absentKeys: absentInNs, keyDetails });
200
232
  totalTranslatedForLocale += translatedInNs;
233
+ totalEmptyForLocale += emptyInNs;
234
+ totalAbsentForLocale += absentInNs;
201
235
  totalKeysForLocale += totalInNs;
202
236
  }
203
- report.locales.set(locale, { totalKeys: totalKeysForLocale, totalTranslated: totalTranslatedForLocale, namespaces });
237
+ report.locales.set(locale, {
238
+ totalKeys: totalKeysForLocale,
239
+ totalTranslated: totalTranslatedForLocale,
240
+ totalEmpty: totalEmptyForLocale,
241
+ totalAbsent: totalAbsentForLocale,
242
+ namespaces,
243
+ });
204
244
  }
205
245
  return report;
206
246
  }
247
+ /**
248
+ * Builds a compact breakdown string like "3 untranslated, 2 absent" for use in
249
+ * summary lines. Returns an empty string when there is nothing to report.
250
+ */
251
+ function buildBreakdown(emptyCount, absentCount) {
252
+ const parts = [];
253
+ if (emptyCount > 0)
254
+ parts.push(node_util.styleText('yellow', `${emptyCount} untranslated`));
255
+ if (absentCount > 0)
256
+ parts.push(node_util.styleText('red', `${absentCount} absent`));
257
+ return parts.join(', ');
258
+ }
207
259
  /**
208
260
  * Main display router that calls the appropriate display function based on options.
209
261
  *
@@ -230,17 +282,10 @@ async function displayStatusReport(report, config, options) {
230
282
  /**
231
283
  * Displays the detailed, grouped report for a single locale.
232
284
  *
233
- * Shows:
234
- * - Overall progress for the locale
235
- * - Progress for each namespace (or filtered namespace)
236
- * - Individual key status (translated/missing) with visual indicators
237
- * - Summary message with total missing translations
238
- *
239
- * @param report - The generated status report data
240
- * @param config - The i18next toolkit configuration object
241
- * @param locale - The locale code to display details for
242
- * @param namespaceFilter - Optional namespace to filter the display
243
- * @param hideTranslated - When true, only untranslated keys are shown
285
+ * Key status icons:
286
+ * ✓ green — translated
287
+ * ~ yellow present in file but empty (needs translation)
288
+ * ✗ red — absent from file entirely (structural problem)
244
289
  */
245
290
  async function displayDetailedLocaleReport(report, config, locale, namespaceFilter, hideTranslated) {
246
291
  if (locale === config.extract.primaryLanguage) {
@@ -259,6 +304,9 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
259
304
  console.log(node_util.styleText('bold', `\nKey Status for "${node_util.styleText('cyan', locale)}":`));
260
305
  const totalKeysForLocale = localeData.totalKeys;
261
306
  printProgressBar('Overall', localeData.totalTranslated, totalKeysForLocale);
307
+ const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
308
+ if (breakdown)
309
+ console.log(` ${breakdown}`);
262
310
  const namespacesToDisplay = namespaceFilter ? [namespaceFilter] : Array.from(localeData.namespaces.keys()).sort();
263
311
  for (const ns of namespacesToDisplay) {
264
312
  const nsData = localeData.namespaces.get(ns);
@@ -266,15 +314,28 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
266
314
  continue;
267
315
  console.log(node_util.styleText(['cyan', 'bold'], `\nNamespace: ${ns}`));
268
316
  printProgressBar('Namespace Progress', nsData.translatedKeys, nsData.totalKeys);
269
- const keysToDisplay = hideTranslated ? nsData.keyDetails.filter(({ isTranslated }) => !isTranslated) : nsData.keyDetails;
270
- keysToDisplay.forEach(({ key, isTranslated }) => {
271
- const icon = isTranslated ? node_util.styleText('green', '✓') : node_util.styleText('red', '✗');
272
- console.log(` ${icon} ${key}`);
317
+ const nsBreakdown = buildBreakdown(nsData.emptyKeys, nsData.absentKeys);
318
+ if (nsBreakdown)
319
+ console.log(` ${nsBreakdown}`);
320
+ const keysToDisplay = hideTranslated
321
+ ? nsData.keyDetails.filter(({ state }) => state !== 'translated')
322
+ : nsData.keyDetails;
323
+ keysToDisplay.forEach(({ key, state }) => {
324
+ if (state === 'translated') {
325
+ console.log(` ${node_util.styleText('green', '✓')} ${key}`);
326
+ }
327
+ else if (state === 'empty') {
328
+ console.log(` ${node_util.styleText('yellow', '~')} ${key} ${node_util.styleText('yellow', '(untranslated)')}`);
329
+ }
330
+ else {
331
+ console.log(` ${node_util.styleText('red', '✗')} ${key} ${node_util.styleText('red', '(absent)')}`);
332
+ }
273
333
  });
274
334
  }
275
335
  const missingCount = totalKeysForLocale - localeData.totalTranslated;
276
336
  if (missingCount > 0) {
277
- console.log(node_util.styleText(['yellow', 'bold'], `\nSummary: Found ${missingCount} missing translations for "${locale}".`));
337
+ const summaryBreakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
338
+ console.log(node_util.styleText(['yellow', 'bold'], `\nSummary: Found ${missingCount} incomplete translations for "${locale}" — ${summaryBreakdown}.`));
278
339
  }
279
340
  else {
280
341
  console.log(node_util.styleText(['green', 'bold'], `\nSummary: 🎉 All keys are translated for "${locale}".`));
@@ -304,7 +365,9 @@ async function displayNamespaceSummaryReport(report, config, namespace) {
304
365
  if (nsLocaleData) {
305
366
  const percentage = nsLocaleData.totalKeys > 0 ? Math.round((nsLocaleData.translatedKeys / nsLocaleData.totalKeys) * 100) : 100;
306
367
  const bar = generateProgressBarText(percentage);
307
- console.log(`- ${locale}: ${bar} ${percentage}% (${nsLocaleData.translatedKeys}/${nsLocaleData.totalKeys} keys)`);
368
+ const breakdown = buildBreakdown(nsLocaleData.emptyKeys, nsLocaleData.absentKeys);
369
+ const suffix = breakdown ? ` — ${breakdown}` : '';
370
+ console.log(`- ${locale}: ${bar} ${percentage}% (${nsLocaleData.translatedKeys}/${nsLocaleData.totalKeys} keys)${suffix}`);
308
371
  }
309
372
  }
310
373
  await printLocizeFunnel();
@@ -333,7 +396,9 @@ async function displayOverallSummaryReport(report, config) {
333
396
  for (const [locale, localeData] of report.locales.entries()) {
334
397
  const percentage = localeData.totalKeys > 0 ? Math.round((localeData.totalTranslated / localeData.totalKeys) * 100) : 100;
335
398
  const bar = generateProgressBarText(percentage);
336
- console.log(`- ${locale}: ${bar} ${percentage}% (${localeData.totalTranslated}/${localeData.totalKeys} keys)`);
399
+ const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
400
+ const suffix = breakdown ? ` — ${breakdown}` : '';
401
+ console.log(`- ${locale}: ${bar} ${percentage}% (${localeData.totalTranslated}/${localeData.totalKeys} keys)${suffix}`);
337
402
  }
338
403
  await printLocizeFunnel();
339
404
  }
package/dist/esm/cli.js CHANGED
@@ -29,7 +29,7 @@ const program = new Command();
29
29
  program
30
30
  .name('i18next-cli')
31
31
  .description('A unified, high-performance i18next CLI.')
32
- .version('1.50.2'); // This string is replaced with the actual version at build time by rollup
32
+ .version('1.50.4'); // This string is replaced with the actual version at build time by rollup
33
33
  // new: global config override option
34
34
  program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
35
35
  program
@@ -807,29 +807,14 @@ async function getTranslations(keys, objectKeys, config, { syncPrimaryWithDefaul
807
807
  // namespace (internally we keep implicit keys as 'translation').
808
808
  const NO_NS_TOKEN = '__no_namespace__';
809
809
  const keysByNS = new Map();
810
- const nsSep = typeof config.extract.nsSeparator === 'string' ? config.extract.nsSeparator : ':';
811
- const nsNaturalLanguageRegex = new RegExp(`(${chars.map((c) => (c === '?' ? '\\?' : c)).join('|')})`);
812
810
  for (const k of keys.values()) {
813
- let ns = k.ns;
814
- let key = k.key;
815
- // Fix for incorrect splitting of natural language keys containing nsSeparator
816
- // If the namespace contains spaces or looks like natural language, assume it was split incorrectly
817
- // and rejoin it with the key.
818
- if (ns && nsNaturalLanguageRegex.test(ns)) {
819
- key = `${ns}${nsSep}${key}`;
820
- ns = undefined;
821
- }
811
+ const ns = k.ns;
822
812
  const nsKey = (k.nsIsImplicit && config.extract.defaultNS === false)
823
813
  ? NO_NS_TOKEN
824
814
  : String(ns ?? (config.extract.defaultNS ?? 'translation'));
825
815
  if (!keysByNS.has(nsKey))
826
816
  keysByNS.set(nsKey, []);
827
- if (ns !== k.ns || key !== k.key) {
828
- keysByNS.get(nsKey).push({ ...k, ns, key });
829
- }
830
- else {
831
- keysByNS.get(nsKey).push(k);
832
- }
817
+ keysByNS.get(nsKey).push(k);
833
818
  }
834
819
  // Filter out ignored namespaces
835
820
  const ignoreNamespaces = new Set(config.extract.ignoreNamespaces ?? []);
@@ -2,6 +2,10 @@ import { lineColumnFromOffset, isSimpleTemplateLiteral, getObjectPropValue, getO
2
2
 
3
3
  // Helper to escape regex characters
4
4
  const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
5
+ // Checks if a string looks like natural language (contains spaces, punctuation, etc.)
6
+ // Used to prevent splitting keys like "Error message: not found" into namespace + key.
7
+ const naturalLanguageChars = /[ ,?!;]/;
8
+ const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
5
9
  class CallExpressionHandler {
6
10
  pluginContext;
7
11
  config;
@@ -160,11 +164,16 @@ class CallExpressionHandler {
160
164
  const nsSeparator = this.config.extract.nsSeparator ?? ':';
161
165
  if (!ns && nsSeparator && key.includes(nsSeparator)) {
162
166
  const parts = key.split(nsSeparator);
163
- ns = parts.shift();
164
- key = parts.join(nsSeparator);
165
- if (!key || key.trim() === '') {
166
- this.logger.warn(`Skipping key that became empty after namespace removal: '${ns}${nsSeparator}'`);
167
- continue;
167
+ const candidateNs = parts[0];
168
+ // If the candidate namespace looks like natural language (contains spaces,
169
+ // punctuation), assume the separator is part of the key text, not a namespace delimiter.
170
+ if (!looksLikeNaturalLanguage(candidateNs)) {
171
+ ns = parts.shift();
172
+ key = parts.join(nsSeparator);
173
+ if (!key || key.trim() === '') {
174
+ this.logger.warn(`Skipping key that became empty after namespace removal: '${ns}${nsSeparator}'`);
175
+ continue;
176
+ }
168
177
  }
169
178
  }
170
179
  if (!ns && scopeInfo?.defaultNs)
@@ -489,10 +498,16 @@ class CallExpressionHandler {
489
498
  const nsSeparator = this.config.extract.nsSeparator ?? ':';
490
499
  if (nsSeparator && key.includes(nsSeparator)) {
491
500
  const parts = key.split(nsSeparator);
492
- nestedNs = parts.shift();
493
- key = parts.join(nsSeparator);
494
- if (!key || key.trim() === '')
495
- return;
501
+ const candidateNs = parts[0];
502
+ if (!looksLikeNaturalLanguage(candidateNs)) {
503
+ nestedNs = parts.shift();
504
+ key = parts.join(nsSeparator);
505
+ if (!key || key.trim() === '')
506
+ return;
507
+ }
508
+ else {
509
+ nestedNs = this.config.extract.defaultNS;
510
+ }
496
511
  }
497
512
  else {
498
513
  nestedNs = this.config.extract.defaultNS;
@@ -1,3 +1,6 @@
1
+ // Checks if a string looks like natural language (contains spaces, punctuation, etc.)
2
+ const naturalLanguageChars = /[ ,?!;]/;
3
+ const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
1
4
  /**
2
5
  * Extracts translation keys from comments in source code using regex patterns.
3
6
  * Supports extraction from single-line (//) and multi-line comments.
@@ -86,15 +89,18 @@ function extractKeysFromComments(code, pluginContext, config, scopeResolver) {
86
89
  const nsSeparator = config.extract.nsSeparator ?? ':';
87
90
  if (!ns && nsSeparator && key.includes(nsSeparator)) {
88
91
  const parts = key.split(nsSeparator);
89
- ns = parts.shift();
90
- key = parts.join(nsSeparator);
91
- // Validate that the key didn't become empty after namespace removal
92
- if (!key || key.trim() === '') {
93
- continue; // Skip keys that become empty after namespace removal
94
- }
95
- // Re-check preservePatterns after namespace processing (namespace-aware)
96
- if (matchesPreserve(key, ns)) {
97
- continue; // Skip processed keys that match preserve patterns
92
+ // If the candidate namespace looks like natural language, don't split
93
+ if (!looksLikeNaturalLanguage(parts[0])) {
94
+ ns = parts.shift();
95
+ key = parts.join(nsSeparator);
96
+ // Validate that the key didn't become empty after namespace removal
97
+ if (!key || key.trim() === '') {
98
+ continue; // Skip keys that become empty after namespace removal
99
+ }
100
+ // Re-check preservePatterns after namespace processing (namespace-aware)
101
+ if (matchesPreserve(key, ns)) {
102
+ continue; // Skip processed keys that match preserve patterns
103
+ }
98
104
  }
99
105
  }
100
106
  // 3. If no explicit namespace found, try to resolve from scope
@@ -1,6 +1,9 @@
1
1
  import { extractFromTransComponent } from './jsx-parser.js';
2
2
  import { lineColumnFromOffset, getObjectPropValue } from './ast-utils.js';
3
3
 
4
+ // Checks if a string looks like natural language (contains spaces, punctuation, etc.)
5
+ const naturalLanguageChars = /[ ,?!;]/;
6
+ const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
4
7
  class JSXHandler {
5
8
  config;
6
9
  pluginContext;
@@ -85,9 +88,11 @@ class JSXHandler {
85
88
  // If the key contains a namespace separator, it takes precedence
86
89
  // over the default t ns value
87
90
  if (nsSeparator && key.includes(nsSeparator)) {
88
- let parts;
89
- ([ns, ...parts] = key.split(nsSeparator));
90
- key = parts.join(nsSeparator);
91
+ const parts = key.split(nsSeparator);
92
+ if (!looksLikeNaturalLanguage(parts[0])) {
93
+ ns = parts.shift();
94
+ key = parts.join(nsSeparator);
95
+ }
91
96
  }
92
97
  return {
93
98
  key,
@@ -10,6 +10,13 @@ import { loadTranslationFile, getOutputPath } from './utils/file-utils.js';
10
10
  import { shouldShowFunnel, recordFunnelShown } from './utils/funnel-msg-tracker.js';
11
11
  import './extractor/parsers/jsx-parser.js';
12
12
 
13
+ function classifyValue(value) {
14
+ if (value === undefined || value === null)
15
+ return 'absent';
16
+ if (value === '')
17
+ return 'empty';
18
+ return 'translated';
19
+ }
13
20
  /**
14
21
  * Runs a health check on the project's i18next translations and displays a status report.
15
22
  *
@@ -20,6 +27,11 @@ import './extractor/parsers/jsx-parser.js';
20
27
  * 4. Displaying a formatted report with key counts, locales, and progress bars.
21
28
  * 5. Serving as a value-driven funnel to introduce the locize commercial service.
22
29
  *
30
+ * Exit behaviour (unchanged): exits 1 when any key is either empty or absent.
31
+ * The output now distinguishes between the two states so developers can tell
32
+ * whether they have a structural problem (absent) or simply pending translation
33
+ * work (empty).
34
+ *
23
35
  * @param config - The i18next toolkit configuration object.
24
36
  * @param options - Options object, may contain a `detail` property with a locale string.
25
37
  * @throws {Error} When unable to extract keys or read translation files
@@ -40,7 +52,7 @@ async function runStatus(config, options = {}) {
40
52
  }
41
53
  }
42
54
  if (hasMissing) {
43
- spinner.fail('Error: Missing translations detected.');
55
+ spinner.fail('Error: Incomplete translations detected.');
44
56
  process.exit(1);
45
57
  }
46
58
  }
@@ -92,6 +104,8 @@ async function generateStatusReport(config) {
92
104
  };
93
105
  for (const locale of secondaryLanguages) {
94
106
  let totalTranslatedForLocale = 0;
107
+ let totalEmptyForLocale = 0;
108
+ let totalAbsentForLocale = 0;
95
109
  let totalKeysForLocale = 0;
96
110
  const namespaces = new Map();
97
111
  const mergedTranslations = mergeNamespaces
@@ -118,6 +132,8 @@ async function generateStatusReport(config) {
118
132
  }
119
133
  }
120
134
  let translatedInNs = 0;
135
+ let emptyInNs = 0;
136
+ let absentInNs = 0;
121
137
  let totalInNs = 0;
122
138
  const keyDetails = [];
123
139
  // Get the plural categories for THIS specific locale
@@ -133,6 +149,26 @@ async function generateStatusReport(config) {
133
149
  return fallbackRules.resolvedOptions().pluralCategories;
134
150
  }
135
151
  };
152
+ /**
153
+ * Resolves the value for a single key, applying the fallback namespace when
154
+ * configured, and classifies it as translated / empty / absent.
155
+ *
156
+ * The fallback is only consulted when the primary value is absent — an empty
157
+ * string is a deliberate placeholder written by `extract` and should not be
158
+ * silently replaced by a fallback value.
159
+ */
160
+ const resolveAndClassify = (key) => {
161
+ const sep = keySeparator ?? '.';
162
+ const primaryValue = getNestedValue(translationsForNs, key, sep);
163
+ const primaryState = classifyValue(primaryValue);
164
+ // Only fall back when the key is genuinely absent from the primary file.
165
+ // An empty string is intentional (placeholder from extract) — don't hide it.
166
+ if (primaryState === 'absent' && fallbackTranslations) {
167
+ const fallbackValue = getNestedValue(fallbackTranslations, key, sep);
168
+ return classifyValue(fallbackValue);
169
+ }
170
+ return primaryState;
171
+ };
136
172
  for (const { key: baseKey, hasCount, isOrdinal, isExpandedPlural } of keysInNs) {
137
173
  if (hasCount) {
138
174
  if (isExpandedPlural) {
@@ -148,15 +184,14 @@ async function generateStatusReport(config) {
148
184
  // Only count this key if it's a plural form used by this locale
149
185
  if (localePluralCategories.includes(category)) {
150
186
  totalInNs++;
151
- let value = getNestedValue(translationsForNs, baseKey, keySeparator ?? '.');
152
- // Fallback lookup
153
- if (!value && fallbackTranslations) {
154
- value = getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
155
- }
156
- const isTranslated = !!value;
157
- if (isTranslated)
187
+ const state = resolveAndClassify(baseKey);
188
+ if (state === 'translated')
158
189
  translatedInNs++;
159
- keyDetails.push({ key: baseKey, isTranslated });
190
+ else if (state === 'empty')
191
+ emptyInNs++;
192
+ else
193
+ absentInNs++;
194
+ keyDetails.push({ key: baseKey, state });
160
195
  }
161
196
  }
162
197
  else {
@@ -168,40 +203,57 @@ async function generateStatusReport(config) {
168
203
  const pluralKey = isOrdinal
169
204
  ? `${baseKey}${pluralSeparator}ordinal${pluralSeparator}${category}`
170
205
  : `${baseKey}${pluralSeparator}${category}`;
171
- let value = getNestedValue(translationsForNs, pluralKey, keySeparator ?? '.');
172
- // Fallback lookup
173
- if (!value && fallbackTranslations) {
174
- value = getNestedValue(fallbackTranslations, pluralKey, keySeparator ?? '.');
175
- }
176
- const isTranslated = !!value;
177
- if (isTranslated)
206
+ const state = resolveAndClassify(pluralKey);
207
+ if (state === 'translated')
178
208
  translatedInNs++;
179
- keyDetails.push({ key: pluralKey, isTranslated });
209
+ else if (state === 'empty')
210
+ emptyInNs++;
211
+ else
212
+ absentInNs++;
213
+ keyDetails.push({ key: pluralKey, state });
180
214
  }
181
215
  }
182
216
  }
183
217
  else {
184
- // It's a simple key
185
218
  totalInNs++;
186
- let value = getNestedValue(translationsForNs, baseKey, keySeparator ?? '.');
187
- // Fallback lookup
188
- if (!value && fallbackTranslations) {
189
- value = getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
190
- }
191
- const isTranslated = !!value;
192
- if (isTranslated)
219
+ const state = resolveAndClassify(baseKey);
220
+ if (state === 'translated')
193
221
  translatedInNs++;
194
- keyDetails.push({ key: baseKey, isTranslated });
222
+ else if (state === 'empty')
223
+ emptyInNs++;
224
+ else
225
+ absentInNs++;
226
+ keyDetails.push({ key: baseKey, state });
195
227
  }
196
228
  }
197
- namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, keyDetails });
229
+ namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, emptyKeys: emptyInNs, absentKeys: absentInNs, keyDetails });
198
230
  totalTranslatedForLocale += translatedInNs;
231
+ totalEmptyForLocale += emptyInNs;
232
+ totalAbsentForLocale += absentInNs;
199
233
  totalKeysForLocale += totalInNs;
200
234
  }
201
- report.locales.set(locale, { totalKeys: totalKeysForLocale, totalTranslated: totalTranslatedForLocale, namespaces });
235
+ report.locales.set(locale, {
236
+ totalKeys: totalKeysForLocale,
237
+ totalTranslated: totalTranslatedForLocale,
238
+ totalEmpty: totalEmptyForLocale,
239
+ totalAbsent: totalAbsentForLocale,
240
+ namespaces,
241
+ });
202
242
  }
203
243
  return report;
204
244
  }
245
+ /**
246
+ * Builds a compact breakdown string like "3 untranslated, 2 absent" for use in
247
+ * summary lines. Returns an empty string when there is nothing to report.
248
+ */
249
+ function buildBreakdown(emptyCount, absentCount) {
250
+ const parts = [];
251
+ if (emptyCount > 0)
252
+ parts.push(styleText('yellow', `${emptyCount} untranslated`));
253
+ if (absentCount > 0)
254
+ parts.push(styleText('red', `${absentCount} absent`));
255
+ return parts.join(', ');
256
+ }
205
257
  /**
206
258
  * Main display router that calls the appropriate display function based on options.
207
259
  *
@@ -228,17 +280,10 @@ async function displayStatusReport(report, config, options) {
228
280
  /**
229
281
  * Displays the detailed, grouped report for a single locale.
230
282
  *
231
- * Shows:
232
- * - Overall progress for the locale
233
- * - Progress for each namespace (or filtered namespace)
234
- * - Individual key status (translated/missing) with visual indicators
235
- * - Summary message with total missing translations
236
- *
237
- * @param report - The generated status report data
238
- * @param config - The i18next toolkit configuration object
239
- * @param locale - The locale code to display details for
240
- * @param namespaceFilter - Optional namespace to filter the display
241
- * @param hideTranslated - When true, only untranslated keys are shown
283
+ * Key status icons:
284
+ * ✓ green — translated
285
+ * ~ yellow present in file but empty (needs translation)
286
+ * ✗ red — absent from file entirely (structural problem)
242
287
  */
243
288
  async function displayDetailedLocaleReport(report, config, locale, namespaceFilter, hideTranslated) {
244
289
  if (locale === config.extract.primaryLanguage) {
@@ -257,6 +302,9 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
257
302
  console.log(styleText('bold', `\nKey Status for "${styleText('cyan', locale)}":`));
258
303
  const totalKeysForLocale = localeData.totalKeys;
259
304
  printProgressBar('Overall', localeData.totalTranslated, totalKeysForLocale);
305
+ const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
306
+ if (breakdown)
307
+ console.log(` ${breakdown}`);
260
308
  const namespacesToDisplay = namespaceFilter ? [namespaceFilter] : Array.from(localeData.namespaces.keys()).sort();
261
309
  for (const ns of namespacesToDisplay) {
262
310
  const nsData = localeData.namespaces.get(ns);
@@ -264,15 +312,28 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
264
312
  continue;
265
313
  console.log(styleText(['cyan', 'bold'], `\nNamespace: ${ns}`));
266
314
  printProgressBar('Namespace Progress', nsData.translatedKeys, nsData.totalKeys);
267
- const keysToDisplay = hideTranslated ? nsData.keyDetails.filter(({ isTranslated }) => !isTranslated) : nsData.keyDetails;
268
- keysToDisplay.forEach(({ key, isTranslated }) => {
269
- const icon = isTranslated ? styleText('green', '✓') : styleText('red', '✗');
270
- console.log(` ${icon} ${key}`);
315
+ const nsBreakdown = buildBreakdown(nsData.emptyKeys, nsData.absentKeys);
316
+ if (nsBreakdown)
317
+ console.log(` ${nsBreakdown}`);
318
+ const keysToDisplay = hideTranslated
319
+ ? nsData.keyDetails.filter(({ state }) => state !== 'translated')
320
+ : nsData.keyDetails;
321
+ keysToDisplay.forEach(({ key, state }) => {
322
+ if (state === 'translated') {
323
+ console.log(` ${styleText('green', '✓')} ${key}`);
324
+ }
325
+ else if (state === 'empty') {
326
+ console.log(` ${styleText('yellow', '~')} ${key} ${styleText('yellow', '(untranslated)')}`);
327
+ }
328
+ else {
329
+ console.log(` ${styleText('red', '✗')} ${key} ${styleText('red', '(absent)')}`);
330
+ }
271
331
  });
272
332
  }
273
333
  const missingCount = totalKeysForLocale - localeData.totalTranslated;
274
334
  if (missingCount > 0) {
275
- console.log(styleText(['yellow', 'bold'], `\nSummary: Found ${missingCount} missing translations for "${locale}".`));
335
+ const summaryBreakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
336
+ console.log(styleText(['yellow', 'bold'], `\nSummary: Found ${missingCount} incomplete translations for "${locale}" — ${summaryBreakdown}.`));
276
337
  }
277
338
  else {
278
339
  console.log(styleText(['green', 'bold'], `\nSummary: 🎉 All keys are translated for "${locale}".`));
@@ -302,7 +363,9 @@ async function displayNamespaceSummaryReport(report, config, namespace) {
302
363
  if (nsLocaleData) {
303
364
  const percentage = nsLocaleData.totalKeys > 0 ? Math.round((nsLocaleData.translatedKeys / nsLocaleData.totalKeys) * 100) : 100;
304
365
  const bar = generateProgressBarText(percentage);
305
- console.log(`- ${locale}: ${bar} ${percentage}% (${nsLocaleData.translatedKeys}/${nsLocaleData.totalKeys} keys)`);
366
+ const breakdown = buildBreakdown(nsLocaleData.emptyKeys, nsLocaleData.absentKeys);
367
+ const suffix = breakdown ? ` — ${breakdown}` : '';
368
+ console.log(`- ${locale}: ${bar} ${percentage}% (${nsLocaleData.translatedKeys}/${nsLocaleData.totalKeys} keys)${suffix}`);
306
369
  }
307
370
  }
308
371
  await printLocizeFunnel();
@@ -331,7 +394,9 @@ async function displayOverallSummaryReport(report, config) {
331
394
  for (const [locale, localeData] of report.locales.entries()) {
332
395
  const percentage = localeData.totalKeys > 0 ? Math.round((localeData.totalTranslated / localeData.totalKeys) * 100) : 100;
333
396
  const bar = generateProgressBarText(percentage);
334
- console.log(`- ${locale}: ${bar} ${percentage}% (${localeData.totalTranslated}/${localeData.totalKeys} keys)`);
397
+ const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
398
+ const suffix = breakdown ? ` — ${breakdown}` : '';
399
+ console.log(`- ${locale}: ${bar} ${percentage}% (${localeData.totalTranslated}/${localeData.totalKeys} keys)${suffix}`);
335
400
  }
336
401
  await printLocizeFunnel();
337
402
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18next-cli",
3
- "version": "1.50.2",
3
+ "version": "1.50.4",
4
4
  "description": "A unified, high-performance i18next CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -57,12 +57,12 @@
57
57
  "@types/inquirer": "^9.0.9",
58
58
  "@types/node": "^25.5.0",
59
59
  "@types/react": "^19.2.14",
60
- "@typescript-eslint/parser": "^8.57.0",
60
+ "@typescript-eslint/parser": "^8.57.1",
61
61
  "@vitest/coverage-v8": "^4.1.0",
62
62
  "eslint": "^9.39.2",
63
63
  "eslint-import-resolver-typescript": "^4.4.4",
64
64
  "eslint-plugin-import": "^2.32.0",
65
- "memfs": "^4.56.11",
65
+ "memfs": "^4.57.1",
66
66
  "neostandard": "^0.13.0",
67
67
  "rollup-plugin-typescript2": "^0.36.0",
68
68
  "typescript": "^5.9.3",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "@croct/json5-parser": "^0.2.2",
74
- "@swc/core": "^1.15.18",
74
+ "@swc/core": "^1.15.21",
75
75
  "chokidar": "^5.0.0",
76
76
  "commander": "^14.0.3",
77
77
  "execa": "^9.6.1",
@@ -84,7 +84,7 @@
84
84
  "minimatch": "^10.2.4",
85
85
  "ora": "^9.3.0",
86
86
  "react": "^19.2.4",
87
- "react-i18next": "^16.5.8",
88
- "yaml": "^2.8.2"
87
+ "react-i18next": "^16.6.1",
88
+ "yaml": "^2.8.3"
89
89
  }
90
90
  }
@@ -1 +1 @@
1
- {"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAy3B9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8J9B"}
1
+ {"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAy3B9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6I9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAM7D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;IACrC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAAsC;gBAG7D,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM,EAC5B,iBAAiB,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAA2B;IAW3E;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,CAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI;IAmYxG;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,oBAAoB;IA6E5B,OAAO,CAAC,wBAAwB;IAyEhC;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IA8BpC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAyMxB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
1
+ {"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAW7D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;IACrC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAAsC;gBAG7D,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM,EAC5B,iBAAiB,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAA2B;IAW3E;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,CAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI;IAyYxG;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,oBAAoB;IAkF5B,OAAO,CAAC,wBAAwB;IAyEhC;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IA8BpC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAyMxB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-parser.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/comment-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC1F,IAAI,CAiJN"}
1
+ {"version":3,"file":"comment-parser.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/comment-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAMzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC1F,IAAI,CAqJN"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,gBAAgB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAI7D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAS9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;;;;;OAQG;IACH,gBAAgB,CAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IAwUjI;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,0BAA0B;IAkIlC;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAevB"}
1
+ {"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,gBAAgB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAQ7D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAS9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;;;;;OAQG;IACH,gBAAgB,CAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IAyUjI;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,0BAA0B;IAkIlC;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAevB"}
package/types/status.d.ts CHANGED
@@ -20,6 +20,11 @@ interface StatusOptions {
20
20
  * 4. Displaying a formatted report with key counts, locales, and progress bars.
21
21
  * 5. Serving as a value-driven funnel to introduce the locize commercial service.
22
22
  *
23
+ * Exit behaviour (unchanged): exits 1 when any key is either empty or absent.
24
+ * The output now distinguishes between the two states so developers can tell
25
+ * whether they have a structural problem (absent) or simply pending translation
26
+ * work (empty).
27
+ *
23
28
  * @param config - The i18next toolkit configuration object.
24
29
  * @param options - Options object, may contain a `detail` property with a locale string.
25
30
  * @throws {Error} When unable to extract keys or read translation files
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAA;AAIpE;;GAEG;AACH,UAAU,aAAa;IACrB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AA4BD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAuBzF"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAA;AAIpE;;GAEG;AACH,UAAU,aAAa;IACrB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAqDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAuBzF"}
package/types/types.d.ts CHANGED
@@ -506,6 +506,14 @@ export interface ExtractedKey {
506
506
  * Empty/undefined if the key doesn't use context.
507
507
  */
508
508
  keyAcceptingContext?: string;
509
+ /**
510
+ * Whether the namespace was derived from splitting the key by nsSeparator.
511
+ * When true, the natural language heuristic may rejoin the namespace and key
512
+ * if the namespace looks like natural language (contains spaces, etc.).
513
+ * When false/undefined, the namespace was explicitly provided (via options,
514
+ * useTranslation scope, etc.) and should not be subject to the heuristic.
515
+ */
516
+ nsFromKeySplit?: boolean;
509
517
  }
510
518
  /**
511
519
  * Result of processing translation files for a specific locale and namespace.
@@ -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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"}