i18next-cli 1.71.2 → 1.72.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
@@ -316,6 +316,10 @@ Synchronizes secondary language files against your primary language file, adding
316
316
  npx i18next-cli sync
317
317
  ```
318
318
 
319
+ **Options:**
320
+ - `--changed-only`: Only sync the keys that changed on the current git branch. The primary-language files are diffed against the merge-base with the base branch, and only added/modified keys are propagated to the secondary languages; nothing is removed. Changed keys are scoped per source file (the same bare key name in another namespace does not match), and when any plural variant of a key changed, all its plural forms are included (target languages often need more CLDR plural forms than the source). Requires git and JSON/JSON5/YAML translation files
321
+ - `--base <ref>`: Base branch/ref for `--changed-only` (default: auto-detect `origin/HEAD`, then `main`, then `master`). In CI, make sure the base branch is fetched — e.g. `actions/checkout` with `fetch-depth: 0`
322
+
319
323
  ### `lint`
320
324
  Analyzes your source code for internationalization issues. Can run without a config file.
321
325
 
@@ -741,6 +745,8 @@ npx i18next-cli locize-sync [options]
741
745
  - `--auto-translate <true|false>`: Trigger AI/MT auto-translation of newly synced keys. Requires auto-translation in your Locize project (enabled by default for new projects; runs once the project is subscribed or an AI/MT provider is configured)
742
746
  - `--auto-translate-review <true|false>`: Route auto-translated segments through the review workflow for languages that have review enabled
743
747
  - `--auto-translate-languages <lng1,lng2>`: Restrict auto-translation to these target languages (defaults to all)
748
+ - `--changed-only`: Only sync and auto-translate the keys that changed on the current git branch compared to the base branch — ideal for translating just a pull request's diff instead of the whole project. The source-language files are diffed against the merge-base with the base branch; key creation, value updates and auto-translation are restricted to those keys, and deletions are skipped. Keys are scoped per namespace file, and when any plural variant of a key changed, all its plural forms are included. Requires git and locize-cli >= 12.7
749
+ - `--base <ref>`: Base branch/ref for `--changed-only` (default: auto-detect `origin/HEAD`, then `main`, then `master`). In CI, make sure the base branch is fetched — e.g. `actions/checkout` with `fetch-depth: 0`
744
750
 
745
751
  The same options can be set persistently in the `locize` block of your config:
746
752
 
@@ -753,6 +759,8 @@ export default defineConfig({
753
759
  autoTranslate: true,
754
760
  autoTranslateReview: false,
755
761
  autoTranslateLanguages: ['de', 'fr'],
762
+ changedOnly: true, // only sync keys changed vs. the base branch
763
+ changedOnlyBase: 'main', // optional; auto-detected when omitted
756
764
  },
757
765
  });
758
766
  ```
@@ -921,6 +929,11 @@ export default defineConfig({
921
929
  // Namespaces to ignore during extraction, status, and sync operations.
922
930
  // Useful for monorepos where shared namespaces are managed elsewhere.
923
931
  // Keys using these namespaces will be excluded from processing.
932
+ // An ignored namespace can still act as a `fallbackNS` source: its
933
+ // translations are read (never written) for fallback accounting. If it
934
+ // lives in its own file outside a merged output (`mergeNamespaces: true`),
935
+ // use an `output` function that maps that namespace to its path, e.g.
936
+ // output: (lng, ns) => ns === 'shared' ? `locales/${lng}/${ns}.json` : `locales/${lng}.json`
924
937
  ignoreNamespaces: ['shared', 'common'], // Optional
925
938
 
926
939
  // When true (default), the extractor also scans code comments for t(...) / Trans examples and will extract keys found there.
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.71.2'); // This string is replaced with the actual version at build time by rollup
40
+ .version('1.72.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
@@ -187,10 +187,18 @@ program
187
187
  .command('sync')
188
188
  .description('Synchronize secondary language files with the primary language file.')
189
189
  .option('-q, --quiet', 'Suppress spinner and output')
190
+ .option('--changed-only', 'Only sync keys that changed on the current git branch compared to the base branch (requires git). Removals are skipped.')
191
+ .option('--base <ref>', 'Base git branch/ref for --changed-only (default: auto-detect origin/HEAD, then main, then master).')
190
192
  .action(async (options) => {
191
193
  const cfgPath = program.opts().config;
192
194
  const config$1 = await config.ensureConfig(cfgPath);
193
- await syncer.runSyncer(config$1, { quiet: !!options.quiet });
195
+ try {
196
+ await syncer.runSyncer(config$1, { quiet: !!options.quiet, changedOnly: !!options.changedOnly, base: options.base });
197
+ }
198
+ catch (error) {
199
+ console.error(node_util.styleText('red', error instanceof Error ? error.message : String(error)));
200
+ process.exit(1);
201
+ }
194
202
  });
195
203
  program
196
204
  .command('migrate-config [configPath]')
@@ -331,6 +339,8 @@ program
331
339
  .option('--auto-translate <true|false>', 'Trigger AI/MT auto-translation of newly synced keys (requires auto-translation enabled in your Locize project; on by default for new projects).')
332
340
  .option('--auto-translate-review <true|false>', 'Route auto-translated segments through the review workflow for languages that have review enabled.')
333
341
  .option('--auto-translate-languages <lng1,lng2>', 'Restrict auto-translation to these target languages (comma separated; defaults to all languages).')
342
+ .option('--changed-only', 'Only sync and auto-translate keys that changed on the current git branch compared to the base branch (requires git; deletions are skipped).')
343
+ .option('--base <ref>', 'Base git branch/ref for --changed-only (default: auto-detect origin/HEAD, then main, then master).')
334
344
  .action(async (options) => {
335
345
  const cfgPath = program.opts().config;
336
346
  const config$1 = await config.ensureConfig(cfgPath);
@@ -1017,8 +1017,9 @@ async function reattributeFallbackNsKeys(keysByNS, noNsToken, config, primaryLan
1017
1017
  const pluralSeparator = config.extract.pluralSeparator ?? '_';
1018
1018
  // Same merged-output detection as the per-locale loop in getTranslations.
1019
1019
  const shouldMerge = config.extract.mergeNamespaces || (typeof config.extract.output === 'string' ? !config.extract.output.includes('{{namespace}}') : false);
1020
+ const mergedPrimaryPath = node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, primaryLanguage));
1020
1021
  const mergedPrimaryFile = shouldMerge
1021
- ? (await fileUtils.loadTranslationFile(node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, primaryLanguage))) || {})
1022
+ ? (await fileUtils.loadTranslationFile(mergedPrimaryPath) || {})
1022
1023
  : null;
1023
1024
  const catalogCache = new Map();
1024
1025
  const loadPrimaryCatalog = async (ns, isFallback) => {
@@ -1026,9 +1027,19 @@ async function reattributeFallbackNsKeys(keysByNS, noNsToken, config, primaryLan
1026
1027
  let catalog = catalogCache.get(cacheKey);
1027
1028
  if (!catalog) {
1028
1029
  if (mergedPrimaryFile) {
1030
+ catalog = mergedPrimaryFile[ns];
1031
+ if (catalog === undefined) {
1032
+ // The namespace may live in its own file outside the merged one
1033
+ // (split out and hidden via `ignoreNamespaces`, #287). Only
1034
+ // reachable when `output` resolves it to a separate path.
1035
+ const nsPath = node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, primaryLanguage, ns));
1036
+ if (nsPath !== mergedPrimaryPath) {
1037
+ catalog = (await fileUtils.loadTranslationFile(nsPath)) ?? undefined;
1038
+ }
1039
+ }
1029
1040
  // In merged mode the fallback keys may live at the top level when the
1030
1041
  // file is not namespaced (same resolution as the status command).
1031
- catalog = mergedPrimaryFile[ns] ?? (isFallback ? mergedPrimaryFile : {});
1042
+ catalog ??= (isFallback ? mergedPrimaryFile : {});
1032
1043
  }
1033
1044
  else {
1034
1045
  catalog = await fileUtils.loadTranslationFile(node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, primaryLanguage, ns))) || {};
@@ -236,6 +236,14 @@ function buildArgs(command, config, cliOptions) {
236
236
  if (languages)
237
237
  commandArgs.push('--auto-translate-languages', languages);
238
238
  }
239
+ // Requires locize-cli >= 12.7 (older versions reject the unknown option).
240
+ const changedOnly = cliOptions.changedOnly ?? locizeConfig.changedOnly;
241
+ if (changedOnly === true || changedOnly === 'true') {
242
+ commandArgs.push('--changed-only', 'true');
243
+ const gitBase = cliOptions.base ?? locizeConfig.changedOnlyBase;
244
+ if (gitBase)
245
+ commandArgs.push('--base', gitBase);
246
+ }
239
247
  }
240
248
  // Derive a sensible base path for locize from the configured output.
241
249
  // If output is a string template we can strip the language placeholder.
@@ -238,8 +238,16 @@ async function generateStatusReport(config) {
238
238
  }
239
239
  const contextVariantsByNs = new Map();
240
240
  const nestedReferenceKeysByNs = new Map();
241
+ // Absolute path of the merged translation file for a locale. A function
242
+ // `output` is called WITHOUT a namespace — the same way `extract` resolves
243
+ // the merged file it writes — so hybrid layouts (one merged file plus a few
244
+ // split-out namespace files) resolve correctly (#287). String templates keep
245
+ // the historical defaultNS substitution for the {{namespace}} placeholder.
246
+ const getMergedPath = (locale) => node_path.resolve(process.cwd(), typeof config.extract.output === 'function'
247
+ ? fileUtils.getOutputPath(config.extract.output, locale)
248
+ : fileUtils.getOutputPath(config.extract.output, locale, (defaultNS === false ? 'translation' : (defaultNS || 'translation'))));
241
249
  const primaryMergedForScan = mergeNamespaces
242
- ? ((await fileUtils.loadTranslationFile(node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, primaryLanguage, (defaultNS === false ? 'translation' : (defaultNS || 'translation')))))) || {})
250
+ ? ((await fileUtils.loadTranslationFile(getMergedPath(primaryLanguage))) || {})
243
251
  : null;
244
252
  const collectNestedRefsFromValue = (value, refNs, bucket, seen) => {
245
253
  if (typeof value === 'string') {
@@ -322,28 +330,53 @@ async function generateStatusReport(config) {
322
330
  const namespaces = new Map();
323
331
  const mergedTranslations = mergeNamespaces
324
332
  // When merging namespaces we need to load the combined translation file.
325
- // The combined file lives under the regular output pattern and must include a namespace.
326
- // If defaultNS is explicitly false, fall back to the conventional "translation" file name.
327
- ? await fileUtils.loadTranslationFile(node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, locale, (defaultNS === false ? 'translation' : (defaultNS || 'translation'))))) || {}
333
+ ? await fileUtils.loadTranslationFile(getMergedPath(locale)) || {}
328
334
  : null;
335
+ // Load fallbackNS catalogs once per locale (looked up in order, like the
336
+ // i18next runtime). The per-namespace loop below skips a namespace's own
337
+ // entry.
338
+ const fallbackCatalogs = new Map();
339
+ for (const fallbackNs of fallbackNamespaces) {
340
+ if (mergeNamespaces) {
341
+ // In merged mode the fallback keys normally live in the merged file
342
+ // under the fallback namespace.
343
+ let catalog = mergedTranslations?.[fallbackNs];
344
+ if (catalog === undefined) {
345
+ // The fallback namespace may live in its own file outside the merged
346
+ // one (split out and hidden via `ignoreNamespaces`, #287). Only
347
+ // reachable when `output` resolves it to a separate path.
348
+ const nsPath = node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, locale, fallbackNs));
349
+ if (nsPath !== getMergedPath(locale)) {
350
+ catalog = (await fileUtils.loadTranslationFile(nsPath)) ?? undefined;
351
+ }
352
+ }
353
+ if (catalog === undefined && isPrimary && ignoreNamespaces.has(fallbackNs)) {
354
+ console.warn(`⚠️ fallbackNS "${fallbackNs}" is listed in ignoreNamespaces, but no translations for it were found — keys resolving through it will be reported as absent. If the namespace lives in its own file, use an \`output\` function that maps it to that path.`);
355
+ }
356
+ // If it's still not found, fall back to the top level of the merged
357
+ // file (flat, non-namespaced merged files).
358
+ fallbackCatalogs.set(fallbackNs, catalog ?? mergedTranslations ?? {});
359
+ }
360
+ else {
361
+ const nsPath = node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, locale, fallbackNs));
362
+ const catalog = await fileUtils.loadTranslationFile(nsPath);
363
+ if (!catalog && isPrimary && ignoreNamespaces.has(fallbackNs)) {
364
+ console.warn(`⚠️ fallbackNS "${fallbackNs}" is listed in ignoreNamespaces, but no translations for it were found at "${nsPath}" — keys resolving through it will be reported as absent.`);
365
+ }
366
+ fallbackCatalogs.set(fallbackNs, catalog || {});
367
+ }
368
+ }
329
369
  for (const [ns, keysInNs] of keysByNs.entries()) {
330
370
  const translationsForNs = mergeNamespaces
331
371
  // If mergedTranslations is a flat object (no nested namespace) prefer the root object
332
372
  // when mergedTranslations[ns] is missing.
333
373
  ? (mergedTranslations?.[ns] ?? mergedTranslations ?? {})
334
374
  : await fileUtils.loadTranslationFile(node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, locale, ns))) || {};
335
- // Load fallbackNS translations if configured (looked up in order, like the i18next runtime)
336
375
  const fallbackTranslationsList = [];
337
376
  for (const fallbackNs of fallbackNamespaces) {
338
377
  if (ns === fallbackNs)
339
378
  continue;
340
- if (mergeNamespaces) {
341
- // In merged mode, fallbackNS keys are in mergedTranslations under the fallback namespace
342
- fallbackTranslationsList.push(mergedTranslations?.[fallbackNs] ?? mergedTranslations ?? {});
343
- }
344
- else {
345
- fallbackTranslationsList.push(await fileUtils.loadTranslationFile(node_path.resolve(process.cwd(), fileUtils.getOutputPath(config.extract.output, locale, fallbackNs))) || {});
346
- }
379
+ fallbackTranslationsList.push(fallbackCatalogs.get(fallbackNs));
347
380
  }
348
381
  let translatedInNs = 0;
349
382
  let emptyInNs = 0;
@@ -11,6 +11,7 @@ var fileUtils = require('./utils/file-utils.js');
11
11
  var funnelMsgTracker = require('./utils/funnel-msg-tracker.js');
12
12
  var nestedObject = require('./utils/nested-object.js');
13
13
  var pluralRules = require('./utils/plural-rules.js');
14
+ var gitChangedKeys = require('./utils/git-changed-keys.js');
14
15
 
15
16
  /**
16
17
  * Synchronizes translation files across different locales by ensuring all secondary
@@ -44,6 +45,10 @@ var pluralRules = require('./utils/plural-rules.js');
44
45
  */
45
46
  async function runSyncer(config, options = {}) {
46
47
  const internalLogger = options.logger ?? new logger.ConsoleLogger();
48
+ // Resolved before the try/catch below on purpose: an unusable git setup
49
+ // must fail the command (clear message, non-zero exit) instead of being
50
+ // logged and swallowed like a regular sync error.
51
+ const gitCompare = options.changedOnly ? gitChangedKeys.resolveGitCompareRef(options.base) : null;
47
52
  const spinner = wrapOra.createSpinnerLike('Running i18next locale synchronizer...\n', { quiet: !!options.quiet, logger: options.logger });
48
53
  try {
49
54
  const primaryLanguage = config.extract.primaryLanguage || config.locales[0] || 'en';
@@ -81,6 +86,23 @@ async function runSyncer(config, options = {}) {
81
86
  }
82
87
  const primaryKeys = nestedObject.getNestedKeys(primaryTranslations, keySeparator ?? '.');
83
88
  const primaryKeySet = new Set(primaryKeys);
89
+ // --changed-only: diff this primary file against its state at the git
90
+ // compare ref. The changed set is scoped to THIS file so the same bare
91
+ // key name in another namespace does not cross-match.
92
+ let isChangedKey = null;
93
+ if (gitCompare) {
94
+ const oldContent = gitChangedKeys.readFileAtRef(gitCompare.compareRef, primaryPath);
95
+ const oldTranslations = oldContent === null ? {} : gitChangedKeys.parseTranslationContent(oldContent, primaryPath);
96
+ const changedKeys = new Set();
97
+ for (const key of primaryKeys) {
98
+ const newValue = nestedObject.getNestedValue(primaryTranslations, key, keySeparator ?? '.');
99
+ const oldValue = nestedObject.getNestedValue(oldTranslations, key, keySeparator ?? '.');
100
+ if (oldValue === undefined || JSON.stringify(oldValue) !== JSON.stringify(newValue)) {
101
+ changedKeys.add(key);
102
+ }
103
+ }
104
+ isChangedKey = gitChangedKeys.makeChangedKeyMatcher(changedKeys, config.extract.pluralSeparator ?? '_');
105
+ }
84
106
  // 3. For each secondary language, sync the current namespace
85
107
  for (const lang of secondaryLanguages) {
86
108
  const secondaryPath = fileUtils.getOutputPath(output, lang, ns);
@@ -170,17 +192,25 @@ async function runSyncer(config, options = {}) {
170
192
  const existingValue = nestedObject.getNestedValue(existingSecondaryTranslations, key, keySeparator ?? '.');
171
193
  // Only preserve non-empty values; an empty string was likely a
172
194
  // placeholder left by a previous (buggy) sync run and should not
173
- // be perpetuated.
174
- if (existingValue !== '' && existingValue != null) {
195
+ // be perpetuated. Under --changed-only nothing is ever dropped.
196
+ if ((existingValue !== '' && existingValue != null) || isChangedKey) {
175
197
  nestedObject.setNestedValue(newSecondaryTranslations, key, existingValue, keySeparator ?? '.');
176
198
  handledKeys.add(key);
177
199
  }
178
200
  }
201
+ else if (isChangedKey) {
202
+ // --changed-only: removals are out of scope, keep obsolete keys as-is
203
+ const existingValue = nestedObject.getNestedValue(existingSecondaryTranslations, key, keySeparator ?? '.');
204
+ nestedObject.setNestedValue(newSecondaryTranslations, key, existingValue, keySeparator ?? '.');
205
+ }
179
206
  // else: obsolete key — omit it from the output
180
207
  }
181
208
  // Pass 2: new primary keys not yet in the secondary file
182
209
  for (const key of primaryKeys) {
183
210
  if (!handledKeys.has(key)) {
211
+ // --changed-only: only propagate keys that changed on this branch
212
+ if (isChangedKey && !isChangedKey(key))
213
+ continue;
184
214
  const primaryValue = nestedObject.getNestedValue(primaryTranslations, key, keySeparator ?? '.');
185
215
  const valueToSet = defaultValue.resolveDefaultValue(defaultValue$1, key, ns, lang, primaryValue);
186
216
  nestedObject.setNestedValue(newSecondaryTranslations, key, valueToSet, keySeparator ?? '.');
@@ -0,0 +1,139 @@
1
+ 'use strict';
2
+
3
+ var node_child_process = require('node:child_process');
4
+ var node_util = require('node:util');
5
+ var node_path = require('node:path');
6
+ var json5Parser = require('@croct/json5-parser');
7
+ var yaml = require('yaml');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var yaml__default = /*#__PURE__*/_interopDefault(yaml);
12
+
13
+ const runGit = (args) => node_child_process.execFileSync('git', args, {
14
+ stdio: ['ignore', 'pipe', 'pipe'],
15
+ encoding: 'utf8',
16
+ maxBuffer: 50 * 1024 * 1024,
17
+ });
18
+ const CI_FETCH_HINT = 'In CI, make sure the checkout is not shallow and includes the base branch — e.g. actions/checkout with "fetch-depth: 0".';
19
+ /**
20
+ * Resolves the git ref to compare against for --changed-only.
21
+ *
22
+ * Returns the resolved base branch (for messaging) and the merge-base of that
23
+ * ref and HEAD — the commit where the current branch diverged — so commits
24
+ * landing on the base branch after the branch point are not attributed to this
25
+ * branch (the semantics of `git diff base...HEAD`). Falls back to the base tip
26
+ * when merge-base cannot be computed (e.g. shallow clones).
27
+ *
28
+ * Throws with an actionable message when git is unavailable, the cwd is not
29
+ * inside a repository, or no base ref can be resolved.
30
+ */
31
+ function resolveGitCompareRef(base) {
32
+ try {
33
+ runGit(['--version']);
34
+ }
35
+ catch {
36
+ throw new Error('--changed-only requires git, but the "git" command was not found. Install git or remove --changed-only to sync the whole project.');
37
+ }
38
+ try {
39
+ runGit(['rev-parse', '--git-dir']);
40
+ }
41
+ catch {
42
+ throw new Error(`--changed-only requires a git repository, but "${process.cwd()}" is not inside one. Run the sync inside your repository or remove --changed-only to sync the whole project.`);
43
+ }
44
+ const candidates = base
45
+ ? [base, `origin/${base}`]
46
+ : ['origin/HEAD', 'main', 'origin/main', 'master', 'origin/master'];
47
+ let resolvedBase;
48
+ for (const candidate of candidates) {
49
+ try {
50
+ runGit(['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`]);
51
+ resolvedBase = candidate;
52
+ break;
53
+ }
54
+ catch { /* try the next candidate */ }
55
+ }
56
+ if (!resolvedBase) {
57
+ if (base) {
58
+ throw new Error(`--changed-only could not resolve the base ref "${base}" (also tried "origin/${base}"). Fetch it first (git fetch origin ${base}). ${CI_FETCH_HINT}`);
59
+ }
60
+ throw new Error(`--changed-only could not auto-detect a base branch (tried origin/HEAD, main and master). Pass one explicitly with --base <ref>. ${CI_FETCH_HINT}`);
61
+ }
62
+ let compareRef;
63
+ try {
64
+ compareRef = runGit(['merge-base', resolvedBase, 'HEAD']).trim();
65
+ }
66
+ catch { /* fall back to the base tip below */ }
67
+ if (!compareRef) {
68
+ console.warn(node_util.styleText('yellow', `could not find the merge-base of ${resolvedBase} and HEAD — comparing against ${resolvedBase} directly. On shallow CI clones (actions/checkout default fetch-depth: 1) deepen the fetch for exact results.`));
69
+ compareRef = resolvedBase;
70
+ }
71
+ return { base: resolvedBase, compareRef };
72
+ }
73
+ /**
74
+ * Returns the content of a file at the given ref, or `null` when the file did
75
+ * not exist there (a file new on this branch). Existence is checked via
76
+ * cat-file's exit code instead of matching `git show`'s stderr, which is
77
+ * localized.
78
+ */
79
+ function readFileAtRef(compareRef, filePath) {
80
+ const rel = node_path.isAbsolute(filePath) ? node_path.relative(process.cwd(), filePath) : filePath;
81
+ // "./" makes the path relative to the cwd instead of the repo root
82
+ const gitPath = `${compareRef}:./${rel.split(node_path.sep).join('/')}`;
83
+ try {
84
+ runGit(['cat-file', '-e', gitPath]);
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ return runGit(['show', gitPath]);
90
+ }
91
+ /**
92
+ * Parses translation file content from a string (git blob) using the same
93
+ * parsers as loadTranslationFile. JS/TS resource modules cannot be evaluated
94
+ * from git history, so --changed-only does not support them.
95
+ */
96
+ function parseTranslationContent(content, filePath) {
97
+ const ext = node_path.extname(filePath).toLowerCase();
98
+ if (ext === '.json')
99
+ return JSON.parse(content);
100
+ if (ext === '.json5')
101
+ return json5Parser.JsonParser.parse(content, json5Parser.JsonObjectNode).toJSON();
102
+ if (ext === '.yaml' || ext === '.yml')
103
+ return yaml__default.default.parse(content);
104
+ throw new Error(`--changed-only cannot diff "${filePath}": only JSON, JSON5 and YAML translation files are supported (JS/TS resource modules cannot be parsed from git history).`);
105
+ }
106
+ const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
107
+ /**
108
+ * Builds a matcher deciding whether a key belongs to the changed set.
109
+ *
110
+ * Plural grouping: when ANY variant of a base key changed, ALL variants of
111
+ * that base key match. Source and target languages have different CLDR plural
112
+ * category counts (en: one/other; ar: zero..other), so an exact-key match
113
+ * would drop the target-only forms. Covers cardinal and ordinal CLDR suffixes
114
+ * plus the legacy v3 forms (_plural, _0, _1, ...). Kept in sync with the
115
+ * sister copy in locize-cli (src/gitChangedKeys.js).
116
+ *
117
+ * The caller is expected to keep changed sets scoped per source FILE: the same
118
+ * bare key name in two files (e.g. each email template having its own
119
+ * `subject`) must not cross-match.
120
+ */
121
+ function makeChangedKeyMatcher(changedKeys, pluralSeparator = '_') {
122
+ const s = escapeRegExp(pluralSeparator);
123
+ const pluralSuffixRegex = new RegExp(`(?:${s}ordinal)?${s}(?:zero|one|two|few|many|other|plural|\\d+)$`);
124
+ const baseChanged = new Set();
125
+ for (const key of changedKeys) {
126
+ baseChanged.add(key.replace(pluralSuffixRegex, ''));
127
+ }
128
+ return (key) => {
129
+ if (changedKeys.has(key))
130
+ return true;
131
+ const base = key.replace(pluralSuffixRegex, '');
132
+ return base !== key && baseChanged.has(base);
133
+ };
134
+ }
135
+
136
+ exports.makeChangedKeyMatcher = makeChangedKeyMatcher;
137
+ exports.parseTranslationContent = parseTranslationContent;
138
+ exports.readFileAtRef = readFileAtRef;
139
+ exports.resolveGitCompareRef = resolveGitCompareRef;
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.71.2'); // This string is replaced with the actual version at build time by rollup
34
+ .version('1.72.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
@@ -181,10 +181,18 @@ program
181
181
  .command('sync')
182
182
  .description('Synchronize secondary language files with the primary language file.')
183
183
  .option('-q, --quiet', 'Suppress spinner and output')
184
+ .option('--changed-only', 'Only sync keys that changed on the current git branch compared to the base branch (requires git). Removals are skipped.')
185
+ .option('--base <ref>', 'Base git branch/ref for --changed-only (default: auto-detect origin/HEAD, then main, then master).')
184
186
  .action(async (options) => {
185
187
  const cfgPath = program.opts().config;
186
188
  const config = await ensureConfig(cfgPath);
187
- await runSyncer(config, { quiet: !!options.quiet });
189
+ try {
190
+ await runSyncer(config, { quiet: !!options.quiet, changedOnly: !!options.changedOnly, base: options.base });
191
+ }
192
+ catch (error) {
193
+ console.error(styleText('red', error instanceof Error ? error.message : String(error)));
194
+ process.exit(1);
195
+ }
188
196
  });
189
197
  program
190
198
  .command('migrate-config [configPath]')
@@ -325,6 +333,8 @@ program
325
333
  .option('--auto-translate <true|false>', 'Trigger AI/MT auto-translation of newly synced keys (requires auto-translation enabled in your Locize project; on by default for new projects).')
326
334
  .option('--auto-translate-review <true|false>', 'Route auto-translated segments through the review workflow for languages that have review enabled.')
327
335
  .option('--auto-translate-languages <lng1,lng2>', 'Restrict auto-translation to these target languages (comma separated; defaults to all languages).')
336
+ .option('--changed-only', 'Only sync and auto-translate keys that changed on the current git branch compared to the base branch (requires git; deletions are skipped).')
337
+ .option('--base <ref>', 'Base git branch/ref for --changed-only (default: auto-detect origin/HEAD, then main, then master).')
328
338
  .action(async (options) => {
329
339
  const cfgPath = program.opts().config;
330
340
  const config = await ensureConfig(cfgPath);
@@ -1015,8 +1015,9 @@ async function reattributeFallbackNsKeys(keysByNS, noNsToken, config, primaryLan
1015
1015
  const pluralSeparator = config.extract.pluralSeparator ?? '_';
1016
1016
  // Same merged-output detection as the per-locale loop in getTranslations.
1017
1017
  const shouldMerge = config.extract.mergeNamespaces || (typeof config.extract.output === 'string' ? !config.extract.output.includes('{{namespace}}') : false);
1018
+ const mergedPrimaryPath = resolve(process.cwd(), getOutputPath(config.extract.output, primaryLanguage));
1018
1019
  const mergedPrimaryFile = shouldMerge
1019
- ? (await loadTranslationFile(resolve(process.cwd(), getOutputPath(config.extract.output, primaryLanguage))) || {})
1020
+ ? (await loadTranslationFile(mergedPrimaryPath) || {})
1020
1021
  : null;
1021
1022
  const catalogCache = new Map();
1022
1023
  const loadPrimaryCatalog = async (ns, isFallback) => {
@@ -1024,9 +1025,19 @@ async function reattributeFallbackNsKeys(keysByNS, noNsToken, config, primaryLan
1024
1025
  let catalog = catalogCache.get(cacheKey);
1025
1026
  if (!catalog) {
1026
1027
  if (mergedPrimaryFile) {
1028
+ catalog = mergedPrimaryFile[ns];
1029
+ if (catalog === undefined) {
1030
+ // The namespace may live in its own file outside the merged one
1031
+ // (split out and hidden via `ignoreNamespaces`, #287). Only
1032
+ // reachable when `output` resolves it to a separate path.
1033
+ const nsPath = resolve(process.cwd(), getOutputPath(config.extract.output, primaryLanguage, ns));
1034
+ if (nsPath !== mergedPrimaryPath) {
1035
+ catalog = (await loadTranslationFile(nsPath)) ?? undefined;
1036
+ }
1037
+ }
1027
1038
  // In merged mode the fallback keys may live at the top level when the
1028
1039
  // file is not namespaced (same resolution as the status command).
1029
- catalog = mergedPrimaryFile[ns] ?? (isFallback ? mergedPrimaryFile : {});
1040
+ catalog ??= (isFallback ? mergedPrimaryFile : {});
1030
1041
  }
1031
1042
  else {
1032
1043
  catalog = await loadTranslationFile(resolve(process.cwd(), getOutputPath(config.extract.output, primaryLanguage, ns))) || {};
@@ -229,6 +229,14 @@ function buildArgs(command, config, cliOptions) {
229
229
  if (languages)
230
230
  commandArgs.push('--auto-translate-languages', languages);
231
231
  }
232
+ // Requires locize-cli >= 12.7 (older versions reject the unknown option).
233
+ const changedOnly = cliOptions.changedOnly ?? locizeConfig.changedOnly;
234
+ if (changedOnly === true || changedOnly === 'true') {
235
+ commandArgs.push('--changed-only', 'true');
236
+ const gitBase = cliOptions.base ?? locizeConfig.changedOnlyBase;
237
+ if (gitBase)
238
+ commandArgs.push('--base', gitBase);
239
+ }
232
240
  }
233
241
  // Derive a sensible base path for locize from the configured output.
234
242
  // If output is a string template we can strip the language placeholder.
@@ -232,8 +232,16 @@ async function generateStatusReport(config) {
232
232
  }
233
233
  const contextVariantsByNs = new Map();
234
234
  const nestedReferenceKeysByNs = new Map();
235
+ // Absolute path of the merged translation file for a locale. A function
236
+ // `output` is called WITHOUT a namespace — the same way `extract` resolves
237
+ // the merged file it writes — so hybrid layouts (one merged file plus a few
238
+ // split-out namespace files) resolve correctly (#287). String templates keep
239
+ // the historical defaultNS substitution for the {{namespace}} placeholder.
240
+ const getMergedPath = (locale) => resolve(process.cwd(), typeof config.extract.output === 'function'
241
+ ? getOutputPath(config.extract.output, locale)
242
+ : getOutputPath(config.extract.output, locale, (defaultNS === false ? 'translation' : (defaultNS || 'translation'))));
235
243
  const primaryMergedForScan = mergeNamespaces
236
- ? ((await loadTranslationFile(resolve(process.cwd(), getOutputPath(config.extract.output, primaryLanguage, (defaultNS === false ? 'translation' : (defaultNS || 'translation')))))) || {})
244
+ ? ((await loadTranslationFile(getMergedPath(primaryLanguage))) || {})
237
245
  : null;
238
246
  const collectNestedRefsFromValue = (value, refNs, bucket, seen) => {
239
247
  if (typeof value === 'string') {
@@ -316,28 +324,53 @@ async function generateStatusReport(config) {
316
324
  const namespaces = new Map();
317
325
  const mergedTranslations = mergeNamespaces
318
326
  // When merging namespaces we need to load the combined translation file.
319
- // The combined file lives under the regular output pattern and must include a namespace.
320
- // If defaultNS is explicitly false, fall back to the conventional "translation" file name.
321
- ? await loadTranslationFile(resolve(process.cwd(), getOutputPath(config.extract.output, locale, (defaultNS === false ? 'translation' : (defaultNS || 'translation'))))) || {}
327
+ ? await loadTranslationFile(getMergedPath(locale)) || {}
322
328
  : null;
329
+ // Load fallbackNS catalogs once per locale (looked up in order, like the
330
+ // i18next runtime). The per-namespace loop below skips a namespace's own
331
+ // entry.
332
+ const fallbackCatalogs = new Map();
333
+ for (const fallbackNs of fallbackNamespaces) {
334
+ if (mergeNamespaces) {
335
+ // In merged mode the fallback keys normally live in the merged file
336
+ // under the fallback namespace.
337
+ let catalog = mergedTranslations?.[fallbackNs];
338
+ if (catalog === undefined) {
339
+ // The fallback namespace may live in its own file outside the merged
340
+ // one (split out and hidden via `ignoreNamespaces`, #287). Only
341
+ // reachable when `output` resolves it to a separate path.
342
+ const nsPath = resolve(process.cwd(), getOutputPath(config.extract.output, locale, fallbackNs));
343
+ if (nsPath !== getMergedPath(locale)) {
344
+ catalog = (await loadTranslationFile(nsPath)) ?? undefined;
345
+ }
346
+ }
347
+ if (catalog === undefined && isPrimary && ignoreNamespaces.has(fallbackNs)) {
348
+ console.warn(`⚠️ fallbackNS "${fallbackNs}" is listed in ignoreNamespaces, but no translations for it were found — keys resolving through it will be reported as absent. If the namespace lives in its own file, use an \`output\` function that maps it to that path.`);
349
+ }
350
+ // If it's still not found, fall back to the top level of the merged
351
+ // file (flat, non-namespaced merged files).
352
+ fallbackCatalogs.set(fallbackNs, catalog ?? mergedTranslations ?? {});
353
+ }
354
+ else {
355
+ const nsPath = resolve(process.cwd(), getOutputPath(config.extract.output, locale, fallbackNs));
356
+ const catalog = await loadTranslationFile(nsPath);
357
+ if (!catalog && isPrimary && ignoreNamespaces.has(fallbackNs)) {
358
+ console.warn(`⚠️ fallbackNS "${fallbackNs}" is listed in ignoreNamespaces, but no translations for it were found at "${nsPath}" — keys resolving through it will be reported as absent.`);
359
+ }
360
+ fallbackCatalogs.set(fallbackNs, catalog || {});
361
+ }
362
+ }
323
363
  for (const [ns, keysInNs] of keysByNs.entries()) {
324
364
  const translationsForNs = mergeNamespaces
325
365
  // If mergedTranslations is a flat object (no nested namespace) prefer the root object
326
366
  // when mergedTranslations[ns] is missing.
327
367
  ? (mergedTranslations?.[ns] ?? mergedTranslations ?? {})
328
368
  : await loadTranslationFile(resolve(process.cwd(), getOutputPath(config.extract.output, locale, ns))) || {};
329
- // Load fallbackNS translations if configured (looked up in order, like the i18next runtime)
330
369
  const fallbackTranslationsList = [];
331
370
  for (const fallbackNs of fallbackNamespaces) {
332
371
  if (ns === fallbackNs)
333
372
  continue;
334
- if (mergeNamespaces) {
335
- // In merged mode, fallbackNS keys are in mergedTranslations under the fallback namespace
336
- fallbackTranslationsList.push(mergedTranslations?.[fallbackNs] ?? mergedTranslations ?? {});
337
- }
338
- else {
339
- fallbackTranslationsList.push(await loadTranslationFile(resolve(process.cwd(), getOutputPath(config.extract.output, locale, fallbackNs))) || {});
340
- }
373
+ fallbackTranslationsList.push(fallbackCatalogs.get(fallbackNs));
341
374
  }
342
375
  let translatedInNs = 0;
343
376
  let emptyInNs = 0;
@@ -9,6 +9,7 @@ import { getOutputPath, loadTranslationFile, inferFormatFromPath, loadRawJson5Co
9
9
  import { shouldShowFunnel, recordFunnelShown } from './utils/funnel-msg-tracker.js';
10
10
  import { getNestedKeys, getNestedValue, setNestedValue } from './utils/nested-object.js';
11
11
  import { safePluralRules } from './utils/plural-rules.js';
12
+ import { resolveGitCompareRef, readFileAtRef, parseTranslationContent, makeChangedKeyMatcher } from './utils/git-changed-keys.js';
12
13
 
13
14
  /**
14
15
  * Synchronizes translation files across different locales by ensuring all secondary
@@ -42,6 +43,10 @@ import { safePluralRules } from './utils/plural-rules.js';
42
43
  */
43
44
  async function runSyncer(config, options = {}) {
44
45
  const internalLogger = options.logger ?? new ConsoleLogger();
46
+ // Resolved before the try/catch below on purpose: an unusable git setup
47
+ // must fail the command (clear message, non-zero exit) instead of being
48
+ // logged and swallowed like a regular sync error.
49
+ const gitCompare = options.changedOnly ? resolveGitCompareRef(options.base) : null;
45
50
  const spinner = createSpinnerLike('Running i18next locale synchronizer...\n', { quiet: !!options.quiet, logger: options.logger });
46
51
  try {
47
52
  const primaryLanguage = config.extract.primaryLanguage || config.locales[0] || 'en';
@@ -79,6 +84,23 @@ async function runSyncer(config, options = {}) {
79
84
  }
80
85
  const primaryKeys = getNestedKeys(primaryTranslations, keySeparator ?? '.');
81
86
  const primaryKeySet = new Set(primaryKeys);
87
+ // --changed-only: diff this primary file against its state at the git
88
+ // compare ref. The changed set is scoped to THIS file so the same bare
89
+ // key name in another namespace does not cross-match.
90
+ let isChangedKey = null;
91
+ if (gitCompare) {
92
+ const oldContent = readFileAtRef(gitCompare.compareRef, primaryPath);
93
+ const oldTranslations = oldContent === null ? {} : parseTranslationContent(oldContent, primaryPath);
94
+ const changedKeys = new Set();
95
+ for (const key of primaryKeys) {
96
+ const newValue = getNestedValue(primaryTranslations, key, keySeparator ?? '.');
97
+ const oldValue = getNestedValue(oldTranslations, key, keySeparator ?? '.');
98
+ if (oldValue === undefined || JSON.stringify(oldValue) !== JSON.stringify(newValue)) {
99
+ changedKeys.add(key);
100
+ }
101
+ }
102
+ isChangedKey = makeChangedKeyMatcher(changedKeys, config.extract.pluralSeparator ?? '_');
103
+ }
82
104
  // 3. For each secondary language, sync the current namespace
83
105
  for (const lang of secondaryLanguages) {
84
106
  const secondaryPath = getOutputPath(output, lang, ns);
@@ -168,17 +190,25 @@ async function runSyncer(config, options = {}) {
168
190
  const existingValue = getNestedValue(existingSecondaryTranslations, key, keySeparator ?? '.');
169
191
  // Only preserve non-empty values; an empty string was likely a
170
192
  // placeholder left by a previous (buggy) sync run and should not
171
- // be perpetuated.
172
- if (existingValue !== '' && existingValue != null) {
193
+ // be perpetuated. Under --changed-only nothing is ever dropped.
194
+ if ((existingValue !== '' && existingValue != null) || isChangedKey) {
173
195
  setNestedValue(newSecondaryTranslations, key, existingValue, keySeparator ?? '.');
174
196
  handledKeys.add(key);
175
197
  }
176
198
  }
199
+ else if (isChangedKey) {
200
+ // --changed-only: removals are out of scope, keep obsolete keys as-is
201
+ const existingValue = getNestedValue(existingSecondaryTranslations, key, keySeparator ?? '.');
202
+ setNestedValue(newSecondaryTranslations, key, existingValue, keySeparator ?? '.');
203
+ }
177
204
  // else: obsolete key — omit it from the output
178
205
  }
179
206
  // Pass 2: new primary keys not yet in the secondary file
180
207
  for (const key of primaryKeys) {
181
208
  if (!handledKeys.has(key)) {
209
+ // --changed-only: only propagate keys that changed on this branch
210
+ if (isChangedKey && !isChangedKey(key))
211
+ continue;
182
212
  const primaryValue = getNestedValue(primaryTranslations, key, keySeparator ?? '.');
183
213
  const valueToSet = resolveDefaultValue(defaultValue, key, ns, lang, primaryValue);
184
214
  setNestedValue(newSecondaryTranslations, key, valueToSet, keySeparator ?? '.');
@@ -0,0 +1,130 @@
1
+ import { execFileSync } from 'node:child_process';
2
+ import { styleText } from 'node:util';
3
+ import { isAbsolute, relative, sep, extname } from 'node:path';
4
+ import { JsonParser, JsonObjectNode } from '@croct/json5-parser';
5
+ import yaml from 'yaml';
6
+
7
+ const runGit = (args) => execFileSync('git', args, {
8
+ stdio: ['ignore', 'pipe', 'pipe'],
9
+ encoding: 'utf8',
10
+ maxBuffer: 50 * 1024 * 1024,
11
+ });
12
+ const CI_FETCH_HINT = 'In CI, make sure the checkout is not shallow and includes the base branch — e.g. actions/checkout with "fetch-depth: 0".';
13
+ /**
14
+ * Resolves the git ref to compare against for --changed-only.
15
+ *
16
+ * Returns the resolved base branch (for messaging) and the merge-base of that
17
+ * ref and HEAD — the commit where the current branch diverged — so commits
18
+ * landing on the base branch after the branch point are not attributed to this
19
+ * branch (the semantics of `git diff base...HEAD`). Falls back to the base tip
20
+ * when merge-base cannot be computed (e.g. shallow clones).
21
+ *
22
+ * Throws with an actionable message when git is unavailable, the cwd is not
23
+ * inside a repository, or no base ref can be resolved.
24
+ */
25
+ function resolveGitCompareRef(base) {
26
+ try {
27
+ runGit(['--version']);
28
+ }
29
+ catch {
30
+ throw new Error('--changed-only requires git, but the "git" command was not found. Install git or remove --changed-only to sync the whole project.');
31
+ }
32
+ try {
33
+ runGit(['rev-parse', '--git-dir']);
34
+ }
35
+ catch {
36
+ throw new Error(`--changed-only requires a git repository, but "${process.cwd()}" is not inside one. Run the sync inside your repository or remove --changed-only to sync the whole project.`);
37
+ }
38
+ const candidates = base
39
+ ? [base, `origin/${base}`]
40
+ : ['origin/HEAD', 'main', 'origin/main', 'master', 'origin/master'];
41
+ let resolvedBase;
42
+ for (const candidate of candidates) {
43
+ try {
44
+ runGit(['rev-parse', '--verify', '--quiet', `${candidate}^{commit}`]);
45
+ resolvedBase = candidate;
46
+ break;
47
+ }
48
+ catch { /* try the next candidate */ }
49
+ }
50
+ if (!resolvedBase) {
51
+ if (base) {
52
+ throw new Error(`--changed-only could not resolve the base ref "${base}" (also tried "origin/${base}"). Fetch it first (git fetch origin ${base}). ${CI_FETCH_HINT}`);
53
+ }
54
+ throw new Error(`--changed-only could not auto-detect a base branch (tried origin/HEAD, main and master). Pass one explicitly with --base <ref>. ${CI_FETCH_HINT}`);
55
+ }
56
+ let compareRef;
57
+ try {
58
+ compareRef = runGit(['merge-base', resolvedBase, 'HEAD']).trim();
59
+ }
60
+ catch { /* fall back to the base tip below */ }
61
+ if (!compareRef) {
62
+ console.warn(styleText('yellow', `could not find the merge-base of ${resolvedBase} and HEAD — comparing against ${resolvedBase} directly. On shallow CI clones (actions/checkout default fetch-depth: 1) deepen the fetch for exact results.`));
63
+ compareRef = resolvedBase;
64
+ }
65
+ return { base: resolvedBase, compareRef };
66
+ }
67
+ /**
68
+ * Returns the content of a file at the given ref, or `null` when the file did
69
+ * not exist there (a file new on this branch). Existence is checked via
70
+ * cat-file's exit code instead of matching `git show`'s stderr, which is
71
+ * localized.
72
+ */
73
+ function readFileAtRef(compareRef, filePath) {
74
+ const rel = isAbsolute(filePath) ? relative(process.cwd(), filePath) : filePath;
75
+ // "./" makes the path relative to the cwd instead of the repo root
76
+ const gitPath = `${compareRef}:./${rel.split(sep).join('/')}`;
77
+ try {
78
+ runGit(['cat-file', '-e', gitPath]);
79
+ }
80
+ catch {
81
+ return null;
82
+ }
83
+ return runGit(['show', gitPath]);
84
+ }
85
+ /**
86
+ * Parses translation file content from a string (git blob) using the same
87
+ * parsers as loadTranslationFile. JS/TS resource modules cannot be evaluated
88
+ * from git history, so --changed-only does not support them.
89
+ */
90
+ function parseTranslationContent(content, filePath) {
91
+ const ext = extname(filePath).toLowerCase();
92
+ if (ext === '.json')
93
+ return JSON.parse(content);
94
+ if (ext === '.json5')
95
+ return JsonParser.parse(content, JsonObjectNode).toJSON();
96
+ if (ext === '.yaml' || ext === '.yml')
97
+ return yaml.parse(content);
98
+ throw new Error(`--changed-only cannot diff "${filePath}": only JSON, JSON5 and YAML translation files are supported (JS/TS resource modules cannot be parsed from git history).`);
99
+ }
100
+ const escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
101
+ /**
102
+ * Builds a matcher deciding whether a key belongs to the changed set.
103
+ *
104
+ * Plural grouping: when ANY variant of a base key changed, ALL variants of
105
+ * that base key match. Source and target languages have different CLDR plural
106
+ * category counts (en: one/other; ar: zero..other), so an exact-key match
107
+ * would drop the target-only forms. Covers cardinal and ordinal CLDR suffixes
108
+ * plus the legacy v3 forms (_plural, _0, _1, ...). Kept in sync with the
109
+ * sister copy in locize-cli (src/gitChangedKeys.js).
110
+ *
111
+ * The caller is expected to keep changed sets scoped per source FILE: the same
112
+ * bare key name in two files (e.g. each email template having its own
113
+ * `subject`) must not cross-match.
114
+ */
115
+ function makeChangedKeyMatcher(changedKeys, pluralSeparator = '_') {
116
+ const s = escapeRegExp(pluralSeparator);
117
+ const pluralSuffixRegex = new RegExp(`(?:${s}ordinal)?${s}(?:zero|one|two|few|many|other|plural|\\d+)$`);
118
+ const baseChanged = new Set();
119
+ for (const key of changedKeys) {
120
+ baseChanged.add(key.replace(pluralSuffixRegex, ''));
121
+ }
122
+ return (key) => {
123
+ if (changedKeys.has(key))
124
+ return true;
125
+ const base = key.replace(pluralSuffixRegex, '');
126
+ return base !== key && baseChanged.has(base);
127
+ };
128
+ }
129
+
130
+ export { makeChangedKeyMatcher, parseTranslationContent, readFileAtRef, resolveGitCompareRef };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18next-cli",
3
- "version": "1.71.2",
3
+ "version": "1.72.0",
4
4
  "description": "A unified, high-performance i18next CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AAid7B,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAqBnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AA0d7B,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -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;AA8tC9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,oBAA4B,EAC5B,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6K9B"}
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;AAyuC9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,oBAA4B,EAC5B,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6K9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"locize.d.ts","sourceRoot":"","sources":["../src/locize.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AA0HtD;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;gBAED,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;CAMhF;AAOD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBlD;AAoND,eAAO,MAAM,aAAa,GAAI,QAAQ,oBAAoB,EAAE,aAAa,GAAG,kBAAiD,CAAA;AAC7H,eAAO,MAAM,iBAAiB,GAAI,QAAQ,oBAAoB,EAAE,aAAa,GAAG,kBAAqD,CAAA;AACrI,eAAO,MAAM,gBAAgB,GAAI,QAAQ,oBAAoB,EAAE,aAAa,GAAG,kBAAoD,CAAA"}
1
+ {"version":3,"file":"locize.d.ts","sourceRoot":"","sources":["../src/locize.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AA0HtD;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;gBAED,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAO;CAMhF;AAOD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBlD;AA2ND,eAAO,MAAM,aAAa,GAAI,QAAQ,oBAAoB,EAAE,aAAa,GAAG,kBAAiD,CAAA;AAC7H,eAAO,MAAM,iBAAiB,GAAI,QAAQ,oBAAoB,EAAE,aAAa,GAAG,kBAAqD,CAAA;AACrI,eAAO,MAAM,gBAAgB,GAAI,QAAQ,oBAAoB,EAAE,aAAa,GAAG,kBAAoD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAmC,MAAM,YAAY,CAAA;AAYvF;;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;AAyHD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAoDzF;AAsoBD;;GAEG;AACH,UAAU,aAAa;IACrB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAuE/F"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAmC,MAAM,YAAY,CAAA;AAYvF;;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;AAyHD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAoDzF;AA4pBD;;GAEG;AACH,UAAU,aAAa;IACrB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,eAAe,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAuE/F"}
package/types/syncer.d.ts CHANGED
@@ -32,5 +32,7 @@ import type { I18nextToolkitConfig, Logger } from './types.js';
32
32
  export declare function runSyncer(config: I18nextToolkitConfig, options?: {
33
33
  quiet?: boolean;
34
34
  logger?: Logger;
35
+ changedOnly?: boolean;
36
+ base?: string;
35
37
  }): Promise<void>;
36
38
  //# sourceMappingURL=syncer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../src/syncer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAO9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBA+LnD"}
1
+ {"version":3,"file":"syncer.d.ts","sourceRoot":"","sources":["../src/syncer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAQ9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,SAAS,CAC7B,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,iBA2NzF"}
package/types/types.d.ts CHANGED
@@ -342,6 +342,14 @@ export interface I18nextToolkitConfig {
342
342
  autoTranslateReview?: boolean;
343
343
  /** Restrict auto-translation to these target languages (sync only; defaults to all languages) */
344
344
  autoTranslateLanguages?: string[];
345
+ /**
346
+ * Only sync and auto-translate keys that changed on the current git branch
347
+ * compared to the base branch (sync only; requires git and locize-cli >= 12.7).
348
+ * Deletions are skipped.
349
+ */
350
+ changedOnly?: boolean;
351
+ /** Base git branch/ref for changedOnly (default: auto-detect origin/HEAD, then main, then master) */
352
+ changedOnlyBase?: string;
345
353
  };
346
354
  }
347
355
  type MaybePromise<T> = T | Promise<T>;
@@ -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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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Resolves the git ref to compare against for --changed-only.
3
+ *
4
+ * Returns the resolved base branch (for messaging) and the merge-base of that
5
+ * ref and HEAD — the commit where the current branch diverged — so commits
6
+ * landing on the base branch after the branch point are not attributed to this
7
+ * branch (the semantics of `git diff base...HEAD`). Falls back to the base tip
8
+ * when merge-base cannot be computed (e.g. shallow clones).
9
+ *
10
+ * Throws with an actionable message when git is unavailable, the cwd is not
11
+ * inside a repository, or no base ref can be resolved.
12
+ */
13
+ export declare function resolveGitCompareRef(base?: string): {
14
+ base: string;
15
+ compareRef: string;
16
+ };
17
+ /**
18
+ * Returns the content of a file at the given ref, or `null` when the file did
19
+ * not exist there (a file new on this branch). Existence is checked via
20
+ * cat-file's exit code instead of matching `git show`'s stderr, which is
21
+ * localized.
22
+ */
23
+ export declare function readFileAtRef(compareRef: string, filePath: string): string | null;
24
+ /**
25
+ * Parses translation file content from a string (git blob) using the same
26
+ * parsers as loadTranslationFile. JS/TS resource modules cannot be evaluated
27
+ * from git history, so --changed-only does not support them.
28
+ */
29
+ export declare function parseTranslationContent(content: string, filePath: string): Record<string, any>;
30
+ /**
31
+ * Builds a matcher deciding whether a key belongs to the changed set.
32
+ *
33
+ * Plural grouping: when ANY variant of a base key changed, ALL variants of
34
+ * that base key match. Source and target languages have different CLDR plural
35
+ * category counts (en: one/other; ar: zero..other), so an exact-key match
36
+ * would drop the target-only forms. Covers cardinal and ordinal CLDR suffixes
37
+ * plus the legacy v3 forms (_plural, _0, _1, ...). Kept in sync with the
38
+ * sister copy in locize-cli (src/gitChangedKeys.js).
39
+ *
40
+ * The caller is expected to keep changed sets scoped per source FILE: the same
41
+ * bare key name in two files (e.g. each email template having its own
42
+ * `subject`) must not cross-match.
43
+ */
44
+ export declare function makeChangedKeyMatcher(changedKeys: Set<string>, pluralSeparator?: string): (key: string) => boolean;
45
+ //# sourceMappingURL=git-changed-keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-changed-keys.d.ts","sourceRoot":"","sources":["../../src/utils/git-changed-keys.ts"],"names":[],"mappings":"AAcA;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAE,IAAI,CAAC,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CA2CzF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUlF;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAM/F;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,eAAe,SAAM,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAYhH"}