@scoutello/i18n-magic 0.29.1 → 0.32.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.
@@ -1 +1 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAYpD,eAAO,MAAM,gBAAgB,GAAU,QAAQ,aAAa,kBA8G3D,CAAA"}
1
+ {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAYpD,eAAO,MAAM,gBAAgB,GAAU,QAAQ,aAAa,kBA+G3D,CAAA"}
@@ -25,11 +25,12 @@ export const translateMissing = async (config) => {
25
25
  answer = existingValue;
26
26
  }
27
27
  else {
28
- answer = await getTextInput(newKey.key);
28
+ answer = await getTextInput(newKey.key, newKey.namespaces);
29
29
  }
30
30
  newKeysWithDefaultLocale.push({
31
31
  key: newKey.key,
32
32
  namespace: newKey.namespace,
33
+ namespaces: newKey.namespaces,
33
34
  value: answer,
34
35
  });
35
36
  }
@@ -55,7 +56,7 @@ export const translateMissing = async (config) => {
55
56
  }
56
57
  for (const namespace of namespaces) {
57
58
  const existingKeys = await loadLocalesFile(loadPath, locale, namespace);
58
- const relevantKeys = newKeysWithDefaultLocale.filter((key) => key.namespace === namespace);
59
+ const relevantKeys = newKeysWithDefaultLocale.filter((key) => key.namespaces?.includes(namespace));
59
60
  if (relevantKeys.length === 0) {
60
61
  continue;
61
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync-locales.d.ts","sourceRoot":"","sources":["../../src/commands/sync-locales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAQpD,eAAO,MAAM,WAAW,GAAU,QAAQ,aAAa,kBAwHtD,CAAA"}
1
+ {"version":3,"file":"sync-locales.d.ts","sourceRoot":"","sources":["../../src/commands/sync-locales.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AASpD,eAAO,MAAM,WAAW,GAAU,QAAQ,aAAa,kBAmMtD,CAAA"}
@@ -1,65 +1,124 @@
1
- import { TranslationError, loadLocalesFile, translateKey, writeLocalesFile, } from "../lib/utils.js";
1
+ import { TranslationError, loadLocalesFile, translateKey, writeLocalesFile, findExistingTranslation, } from "../lib/utils.js";
2
2
  export const syncLocales = async (config) => {
3
- const { loadPath, savePath, defaultLocale, namespaces, locales, context, openai, } = config;
3
+ const { loadPath, savePath, defaultLocale, namespaces, locales, context, openai, disableTranslation, } = config;
4
+ console.log(`šŸ”„ Syncing translations for locales: ${locales.join(", ")}`);
5
+ console.log(`šŸ“¦ Namespaces: ${namespaces.join(", ")}`);
6
+ console.log(`🌐 Default locale: ${defaultLocale}`);
7
+ console.log(`šŸ”§ Translation disabled: ${disableTranslation}`);
4
8
  try {
5
- for (const namespace of namespaces) {
6
- let defaultLocaleKeys;
7
- try {
8
- defaultLocaleKeys = await loadLocalesFile(loadPath, defaultLocale, namespace);
9
- }
10
- catch (error) {
11
- throw new TranslationError(`Failed to load default locale file for namespace "${namespace}"`, defaultLocale, namespace, error instanceof Error ? error : undefined);
12
- }
13
- for (const locale of locales) {
14
- if (locale === defaultLocale)
15
- continue;
9
+ // First, collect all missing keys across all namespaces for each locale
10
+ for (const locale of locales) {
11
+ if (locale === defaultLocale)
12
+ continue;
13
+ console.log(`\nšŸ” Processing locale: ${locale}`);
14
+ // Collect all missing keys for this locale across all namespaces
15
+ const allMissingKeys = {};
16
+ const namespaceKeys = {};
17
+ // Load existing keys for all namespaces
18
+ for (const namespace of namespaces) {
19
+ let defaultLocaleKeys;
16
20
  let localeKeys;
21
+ try {
22
+ defaultLocaleKeys = await loadLocalesFile(loadPath, defaultLocale, namespace);
23
+ }
24
+ catch (error) {
25
+ console.warn(`Warning: Could not load default locale file for ${defaultLocale} (namespace: ${namespace}). Skipping.`);
26
+ continue;
27
+ }
17
28
  try {
18
29
  localeKeys = await loadLocalesFile(loadPath, locale, namespace);
19
30
  }
20
31
  catch (error) {
21
- console.warn(`Warning: Could not load locale file for ${locale} (namespace: ${namespace}). Creating new file.`);
32
+ const filePath = typeof savePath === "string"
33
+ ? savePath.replace("{{lng}}", locale).replace("{{ns}}", namespace)
34
+ : `${locale}/${namespace}.json`;
35
+ console.log(`šŸ“„ Creating new namespace file: ${filePath}`);
22
36
  localeKeys = {};
23
37
  }
24
- const missingKeys = {};
38
+ namespaceKeys[namespace] = localeKeys;
25
39
  // Check which keys from default locale are missing in current locale
26
40
  for (const [key, value] of Object.entries(defaultLocaleKeys)) {
27
41
  if (!localeKeys[key]) {
28
- missingKeys[key] = value;
42
+ if (allMissingKeys[key]) {
43
+ // Key already exists, add this namespace to the list
44
+ allMissingKeys[key].namespaces.push(namespace);
45
+ }
46
+ else {
47
+ // New missing key
48
+ allMissingKeys[key] = {
49
+ value,
50
+ namespaces: [namespace],
51
+ };
52
+ }
29
53
  }
30
54
  }
31
- // If there are missing keys, translate them
32
- if (Object.keys(missingKeys).length > 0) {
33
- console.log(`Found ${Object.keys(missingKeys).length} missing keys in ${locale} (namespace: ${namespace})`);
34
- let translatedValues;
35
- try {
36
- translatedValues = await translateKey({
37
- inputLanguage: defaultLocale,
38
- outputLanguage: locale,
39
- context,
40
- object: missingKeys,
41
- openai,
42
- model: config.model,
43
- });
44
- }
45
- catch (error) {
46
- throw new TranslationError(`Failed to translate keys for locale "${locale}" (namespace: ${namespace})`, locale, namespace, error instanceof Error ? error : undefined);
55
+ }
56
+ const missingKeysList = Object.keys(allMissingKeys);
57
+ if (missingKeysList.length === 0) {
58
+ console.log(`āœ… No missing keys found for ${locale}`);
59
+ continue;
60
+ }
61
+ console.log(`Found ${missingKeysList.length} unique missing keys in ${locale}`);
62
+ // Check for existing translations of these keys in other namespaces
63
+ const keysToTranslate = {};
64
+ const existingTranslations = {};
65
+ for (const key of missingKeysList) {
66
+ const existingValue = await findExistingTranslation(key, namespaces, locale, loadPath);
67
+ if (existingValue) {
68
+ console.log(`šŸ”„ Reusing existing translation for "${key}": "${existingValue}"`);
69
+ existingTranslations[key] = existingValue;
70
+ }
71
+ else {
72
+ keysToTranslate[key] = allMissingKeys[key].value;
73
+ }
74
+ }
75
+ let translatedValues = {};
76
+ // Translate only the keys that don't have existing translations
77
+ if (Object.keys(keysToTranslate).length > 0 && !disableTranslation) {
78
+ console.log(`šŸ”¤ Translating ${Object.keys(keysToTranslate).length} new keys for ${locale}`);
79
+ try {
80
+ translatedValues = await translateKey({
81
+ inputLanguage: defaultLocale,
82
+ outputLanguage: locale,
83
+ context,
84
+ object: keysToTranslate,
85
+ openai,
86
+ model: config.model,
87
+ });
88
+ }
89
+ catch (error) {
90
+ throw new TranslationError(`Failed to translate keys for locale "${locale}"`, locale, undefined, error instanceof Error ? error : undefined);
91
+ }
92
+ }
93
+ // Combine existing translations with new translations
94
+ const allTranslations = { ...existingTranslations, ...translatedValues };
95
+ // Distribute translations to all relevant namespaces
96
+ for (const namespace of namespaces) {
97
+ let hasChanges = false;
98
+ const updatedKeys = { ...namespaceKeys[namespace] };
99
+ for (const key of missingKeysList) {
100
+ if (allMissingKeys[key].namespaces.includes(namespace)) {
101
+ const translation = disableTranslation
102
+ ? ""
103
+ : allTranslations[key] || "";
104
+ updatedKeys[key] = translation;
105
+ hasChanges = true;
47
106
  }
48
- // Merge translated values with existing ones
49
- const updatedLocaleKeys = {
50
- ...localeKeys,
51
- ...translatedValues,
52
- };
107
+ }
108
+ if (hasChanges) {
53
109
  try {
54
- await writeLocalesFile(savePath, locale, namespace, updatedLocaleKeys);
110
+ await writeLocalesFile(savePath, locale, namespace, updatedKeys);
111
+ const addedKeysCount = Object.keys(allMissingKeys).filter((key) => allMissingKeys[key].namespaces.includes(namespace)).length;
112
+ if (disableTranslation) {
113
+ console.log(`šŸ“ Created empty namespace file for ${locale} (${namespace}): ${addedKeysCount} keys`);
114
+ }
115
+ else {
116
+ console.log(`āœ… Updated ${locale} (${namespace}): ${addedKeysCount} keys`);
117
+ }
55
118
  }
56
119
  catch (error) {
57
120
  throw new TranslationError(`Failed to save translations for locale "${locale}" (namespace: ${namespace})`, locale, namespace, error instanceof Error ? error : undefined);
58
121
  }
59
- console.log(`Successfully translated and saved ${Object.keys(missingKeys).length} keys for ${locale} (namespace: ${namespace})`);
60
- }
61
- else {
62
- console.log(`No missing keys found for ${locale} (namespace: ${namespace})`);
63
122
  }
64
123
  }
65
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sync-locales.js","sourceRoot":"","sources":["../../src/commands/sync-locales.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-locales.js","sourceRoot":"","sources":["../../src/commands/sync-locales.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,uBAAuB,GACxB,MAAM,iBAAiB,CAAA;AAExB,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,MAAqB,EAAE,EAAE;IACzD,MAAM,EACJ,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,UAAU,EACV,OAAO,EACP,OAAO,EACP,MAAM,EACN,kBAAkB,GACnB,GAAG,MAAM,CAAA;IAEV,OAAO,CAAC,GAAG,CAAC,wCAAwC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACzE,OAAO,CAAC,GAAG,CAAC,kBAAkB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,sBAAsB,aAAa,EAAE,CAAC,CAAA;IAClD,OAAO,CAAC,GAAG,CAAC,4BAA4B,kBAAkB,EAAE,CAAC,CAAA;IAE7D,IAAI,CAAC;QACH,wEAAwE;QACxE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,KAAK,aAAa;gBAAE,SAAQ;YAEtC,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAA;YAEhD,iEAAiE;YACjE,MAAM,cAAc,GAGhB,EAAE,CAAA;YACN,MAAM,aAAa,GAA2C,EAAE,CAAA;YAEhE,wCAAwC;YACxC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,iBAAyC,CAAA;gBAC7C,IAAI,UAAkC,CAAA;gBAEtC,IAAI,CAAC;oBACH,iBAAiB,GAAG,MAAM,eAAe,CACvC,QAAQ,EACR,aAAa,EACb,SAAS,CACV,CAAA;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CACV,mDAAmD,aAAa,gBAAgB,SAAS,cAAc,CACxG,CAAA;oBACD,SAAQ;gBACV,CAAC;gBAED,IAAI,CAAC;oBACH,UAAU,GAAG,MAAM,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;gBACjE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,QAAQ,GACZ,OAAO,QAAQ,KAAK,QAAQ;wBAC1B,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC;wBAClE,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,OAAO,CAAA;oBACnC,OAAO,CAAC,GAAG,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAA;oBAC1D,UAAU,GAAG,EAAE,CAAA;gBACjB,CAAC;gBAED,aAAa,CAAC,SAAS,CAAC,GAAG,UAAU,CAAA;gBAErC,qEAAqE;gBACrE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBAC7D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrB,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;4BACxB,qDAAqD;4BACrD,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;wBAChD,CAAC;6BAAM,CAAC;4BACN,kBAAkB;4BAClB,cAAc,CAAC,GAAG,CAAC,GAAG;gCACpB,KAAK;gCACL,UAAU,EAAE,CAAC,SAAS,CAAC;6BACxB,CAAA;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;YACnD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAA;gBACpD,SAAQ;YACV,CAAC;YAED,OAAO,CAAC,GAAG,CACT,SAAS,eAAe,CAAC,MAAM,2BAA2B,MAAM,EAAE,CACnE,CAAA;YAED,oEAAoE;YACpE,MAAM,eAAe,GAA2B,EAAE,CAAA;YAClD,MAAM,oBAAoB,GAA2B,EAAE,CAAA;YAEvD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBAClC,MAAM,aAAa,GAAG,MAAM,uBAAuB,CACjD,GAAG,EACH,UAAU,EACV,MAAM,EACN,QAAQ,CACT,CAAA;gBAED,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CACT,wCAAwC,GAAG,OAAO,aAAa,GAAG,CACnE,CAAA;oBACD,oBAAoB,CAAC,GAAG,CAAC,GAAG,aAAa,CAAA;gBAC3C,CAAC;qBAAM,CAAC;oBACN,eAAe,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;gBAClD,CAAC;YACH,CAAC;YAED,IAAI,gBAAgB,GAA2B,EAAE,CAAA;YAEjD,gEAAgE;YAChE,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACnE,OAAO,CAAC,GAAG,CACT,kBAAkB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,iBAAiB,MAAM,EAAE,CAC/E,CAAA;gBAED,IAAI,CAAC;oBACH,gBAAgB,GAAG,MAAM,YAAY,CAAC;wBACpC,aAAa,EAAE,aAAa;wBAC5B,cAAc,EAAE,MAAM;wBACtB,OAAO;wBACP,MAAM,EAAE,eAAe;wBACvB,MAAM;wBACN,KAAK,EAAE,MAAM,CAAC,KAAK;qBACpB,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,IAAI,gBAAgB,CACxB,wCAAwC,MAAM,GAAG,EACjD,MAAM,EACN,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;gBACH,CAAC;YACH,CAAC;YAED,sDAAsD;YACtD,MAAM,eAAe,GAAG,EAAE,GAAG,oBAAoB,EAAE,GAAG,gBAAgB,EAAE,CAAA;YAExE,qDAAqD;YACrD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,IAAI,UAAU,GAAG,KAAK,CAAA;gBACtB,MAAM,WAAW,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,EAAE,CAAA;gBAEnD,KAAK,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;oBAClC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACvD,MAAM,WAAW,GAAG,kBAAkB;4BACpC,CAAC,CAAC,EAAE;4BACJ,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;wBAC9B,WAAW,CAAC,GAAG,CAAC,GAAG,WAAW,CAAA;wBAC9B,UAAU,GAAG,IAAI,CAAA;oBACnB,CAAC;gBACH,CAAC;gBAED,IAAI,UAAU,EAAE,CAAC;oBACf,IAAI,CAAC;wBACH,MAAM,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;wBAEhE,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAChE,cAAc,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CACnD,CAAC,MAAM,CAAA;wBAER,IAAI,kBAAkB,EAAE,CAAC;4BACvB,OAAO,CAAC,GAAG,CACT,uCAAuC,MAAM,KAAK,SAAS,MAAM,cAAc,OAAO,CACvF,CAAA;wBACH,CAAC;6BAAM,CAAC;4BACN,OAAO,CAAC,GAAG,CACT,aAAa,MAAM,KAAK,SAAS,MAAM,cAAc,OAAO,CAC7D,CAAA;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,MAAM,IAAI,gBAAgB,CACxB,2CAA2C,MAAM,iBAAiB,SAAS,GAAG,EAC9E,MAAM,EACN,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;YACtC,MAAM,KAAK,CAAA;QACb,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,iDAAiD,EACjD,SAAS,EACT,SAAS,EACT,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC3C,CAAA;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -46,7 +46,7 @@ export declare const getMissingKeys: ({ globPatterns, namespaces, defaultNamespa
46
46
  * Find existing translation for a key across all namespaces
47
47
  */
48
48
  export declare const findExistingTranslation: (key: string, namespaces: string[], defaultLocale: string, loadPath: string | ((locale: string, namespace: string) => Promise<Record<string, string>>)) => Promise<string | null>;
49
- export declare const getTextInput: (prompt: string) => Promise<string>;
49
+ export declare const getTextInput: (key: string, namespaces?: string[]) => Promise<string>;
50
50
  export declare const checkAllKeysExist: ({ namespaces, defaultLocale, loadPath, locales, context, openai, savePath, disableTranslation, model, }: Configuration) => Promise<void>;
51
51
  export declare class TranslationError extends Error {
52
52
  locale?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
package/dist/lib/utils.js CHANGED
@@ -233,18 +233,22 @@ export const getMissingKeys = async ({ globPatterns, namespaces, defaultNamespac
233
233
  console.log(`šŸ” Found ${keysWithNamespaces.length} total key instances`);
234
234
  // Group keys by namespace
235
235
  const keysByNamespace = {};
236
+ // Track which namespaces each key belongs to
237
+ const keyToNamespaces = {};
236
238
  for (const { key, namespaces: keyNamespaces } of keysWithNamespaces) {
237
239
  for (const namespace of keyNamespaces) {
238
240
  if (!keysByNamespace[namespace]) {
239
241
  keysByNamespace[namespace] = new Set();
240
242
  }
241
243
  const pureKey = getPureKey(key, namespace, namespace === defaultNamespace);
242
- if (pureKey) {
243
- keysByNamespace[namespace].add(pureKey);
244
- }
245
- else if (!key.includes(":")) {
246
- // For file-based namespace assignment, accept keys without namespace prefixes
247
- keysByNamespace[namespace].add(key);
244
+ const finalKey = pureKey || (!key.includes(":") ? key : null);
245
+ if (finalKey) {
246
+ keysByNamespace[namespace].add(finalKey);
247
+ // Track which namespaces this key belongs to
248
+ if (!keyToNamespaces[finalKey]) {
249
+ keyToNamespaces[finalKey] = new Set();
250
+ }
251
+ keyToNamespaces[finalKey].add(namespace);
248
252
  }
249
253
  }
250
254
  }
@@ -252,18 +256,48 @@ export const getMissingKeys = async ({ globPatterns, namespaces, defaultNamespac
252
256
  for (const [namespace, keys] of Object.entries(keysByNamespace)) {
253
257
  console.log(`šŸ“¦ ${namespace}: ${keys.size} unique keys`);
254
258
  }
259
+ // Load all existing keys for all namespaces first
260
+ const existingKeysByNamespace = {};
261
+ for (const namespace of namespaces) {
262
+ existingKeysByNamespace[namespace] = await loadLocalesFile(loadPath, defaultLocale, namespace);
263
+ console.log(Object.keys(existingKeysByNamespace[namespace]).length, "existing keys in", namespace);
264
+ }
265
+ // Track unique missing keys to avoid duplicates
266
+ const uniqueMissingKeys = new Map();
255
267
  // Check for missing keys in each namespace
256
268
  for (const namespace of namespaces) {
257
- const existingKeys = await loadLocalesFile(loadPath, defaultLocale, namespace);
258
- console.log(Object.keys(existingKeys).length, "existing keys in", namespace);
269
+ const existingKeys = existingKeysByNamespace[namespace];
259
270
  const keysForNamespace = keysByNamespace[namespace] || new Set();
260
271
  console.log(`šŸ” Checking ${keysForNamespace.size} keys for namespace ${namespace}`);
261
272
  for (const key of keysForNamespace) {
262
273
  if (!existingKeys[key]) {
263
- newKeys.push({ key, namespace });
274
+ if (uniqueMissingKeys.has(key)) {
275
+ // Add this namespace to the existing entry
276
+ const existing = uniqueMissingKeys.get(key);
277
+ if (existing && !existing.namespaces.includes(namespace)) {
278
+ existing.namespaces.push(namespace);
279
+ }
280
+ }
281
+ else {
282
+ // Create new entry with all namespaces this key belongs to (that are missing)
283
+ const allNamespaces = Array.from(keyToNamespaces[key] || [namespace]).filter((ns) => !existingKeysByNamespace[ns]?.[key]);
284
+ uniqueMissingKeys.set(key, {
285
+ key,
286
+ namespaces: allNamespaces,
287
+ primaryNamespace: namespace,
288
+ });
289
+ }
264
290
  }
265
291
  }
266
292
  }
293
+ // Convert to the expected format
294
+ for (const { key, namespaces: keyNamespaces, primaryNamespace, } of uniqueMissingKeys.values()) {
295
+ newKeys.push({
296
+ key,
297
+ namespace: primaryNamespace,
298
+ namespaces: keyNamespaces,
299
+ });
300
+ }
267
301
  return newKeys;
268
302
  };
269
303
  /**
@@ -283,11 +317,14 @@ export const findExistingTranslation = async (key, namespaces, defaultLocale, lo
283
317
  }
284
318
  return null;
285
319
  };
286
- export const getTextInput = async (prompt) => {
320
+ export const getTextInput = async (key, namespaces) => {
321
+ const namespaceInfo = namespaces && namespaces.length > 0
322
+ ? ` (will be added to: ${namespaces.join(", ")})`
323
+ : "";
287
324
  const input = await prompts({
288
325
  name: "value",
289
326
  type: "text",
290
- message: prompt,
327
+ message: `${key}${namespaceInfo}`,
291
328
  onState: (state) => {
292
329
  if (state.aborted) {
293
330
  process.nextTick(() => {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scoutello/i18n-magic",
3
- "version": "0.29.1",
3
+ "version": "0.32.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "description": "Intelligent CLI toolkit that automates internationalization workflows with AI-powered translations for JavaScript/TypeScript projects",
@@ -64,12 +64,13 @@ export const translateMissing = async (config: Configuration) => {
64
64
  )
65
65
  answer = existingValue
66
66
  } else {
67
- answer = await getTextInput(newKey.key)
67
+ answer = await getTextInput(newKey.key, newKey.namespaces)
68
68
  }
69
69
 
70
70
  newKeysWithDefaultLocale.push({
71
71
  key: newKey.key,
72
72
  namespace: newKey.namespace,
73
+ namespaces: newKey.namespaces,
73
74
  value: answer,
74
75
  })
75
76
  }
@@ -101,8 +102,8 @@ export const translateMissing = async (config: Configuration) => {
101
102
  for (const namespace of namespaces) {
102
103
  const existingKeys = await loadLocalesFile(loadPath, locale, namespace)
103
104
 
104
- const relevantKeys = newKeysWithDefaultLocale.filter(
105
- (key) => key.namespace === namespace,
105
+ const relevantKeys = newKeysWithDefaultLocale.filter((key) =>
106
+ key.namespaces?.includes(namespace),
106
107
  )
107
108
 
108
109
  if (relevantKeys.length === 0) {
@@ -4,6 +4,7 @@ import {
4
4
  loadLocalesFile,
5
5
  translateKey,
6
6
  writeLocalesFile,
7
+ findExistingTranslation,
7
8
  } from "../lib/utils.js"
8
9
 
9
10
  export const syncLocales = async (config: Configuration) => {
@@ -15,87 +16,170 @@ export const syncLocales = async (config: Configuration) => {
15
16
  locales,
16
17
  context,
17
18
  openai,
19
+ disableTranslation,
18
20
  } = config
19
21
 
22
+ console.log(`šŸ”„ Syncing translations for locales: ${locales.join(", ")}`)
23
+ console.log(`šŸ“¦ Namespaces: ${namespaces.join(", ")}`)
24
+ console.log(`🌐 Default locale: ${defaultLocale}`)
25
+ console.log(`šŸ”§ Translation disabled: ${disableTranslation}`)
26
+
20
27
  try {
21
- for (const namespace of namespaces) {
22
- let defaultLocaleKeys: Record<string, string>
28
+ // First, collect all missing keys across all namespaces for each locale
29
+ for (const locale of locales) {
30
+ if (locale === defaultLocale) continue
23
31
 
24
- try {
25
- defaultLocaleKeys = await loadLocalesFile(
26
- loadPath,
27
- defaultLocale,
28
- namespace,
29
- )
30
- } catch (error) {
31
- throw new TranslationError(
32
- `Failed to load default locale file for namespace "${namespace}"`,
33
- defaultLocale,
34
- namespace,
35
- error instanceof Error ? error : undefined,
36
- )
37
- }
32
+ console.log(`\nšŸ” Processing locale: ${locale}`)
38
33
 
39
- for (const locale of locales) {
40
- if (locale === defaultLocale) continue
34
+ // Collect all missing keys for this locale across all namespaces
35
+ const allMissingKeys: Record<
36
+ string,
37
+ { value: string; namespaces: string[] }
38
+ > = {}
39
+ const namespaceKeys: Record<string, Record<string, string>> = {}
41
40
 
41
+ // Load existing keys for all namespaces
42
+ for (const namespace of namespaces) {
43
+ let defaultLocaleKeys: Record<string, string>
42
44
  let localeKeys: Record<string, string>
45
+
43
46
  try {
44
- localeKeys = await loadLocalesFile(loadPath, locale, namespace)
47
+ defaultLocaleKeys = await loadLocalesFile(
48
+ loadPath,
49
+ defaultLocale,
50
+ namespace,
51
+ )
45
52
  } catch (error) {
46
53
  console.warn(
47
- `Warning: Could not load locale file for ${locale} (namespace: ${namespace}). Creating new file.`,
54
+ `Warning: Could not load default locale file for ${defaultLocale} (namespace: ${namespace}). Skipping.`,
48
55
  )
56
+ continue
57
+ }
58
+
59
+ try {
60
+ localeKeys = await loadLocalesFile(loadPath, locale, namespace)
61
+ } catch (error) {
62
+ const filePath =
63
+ typeof savePath === "string"
64
+ ? savePath.replace("{{lng}}", locale).replace("{{ns}}", namespace)
65
+ : `${locale}/${namespace}.json`
66
+ console.log(`šŸ“„ Creating new namespace file: ${filePath}`)
49
67
  localeKeys = {}
50
68
  }
51
69
 
52
- const missingKeys: Record<string, string> = {}
70
+ namespaceKeys[namespace] = localeKeys
53
71
 
54
72
  // Check which keys from default locale are missing in current locale
55
73
  for (const [key, value] of Object.entries(defaultLocaleKeys)) {
56
74
  if (!localeKeys[key]) {
57
- missingKeys[key] = value
75
+ if (allMissingKeys[key]) {
76
+ // Key already exists, add this namespace to the list
77
+ allMissingKeys[key].namespaces.push(namespace)
78
+ } else {
79
+ // New missing key
80
+ allMissingKeys[key] = {
81
+ value,
82
+ namespaces: [namespace],
83
+ }
84
+ }
58
85
  }
59
86
  }
87
+ }
60
88
 
61
- // If there are missing keys, translate them
62
- if (Object.keys(missingKeys).length > 0) {
89
+ const missingKeysList = Object.keys(allMissingKeys)
90
+ if (missingKeysList.length === 0) {
91
+ console.log(`āœ… No missing keys found for ${locale}`)
92
+ continue
93
+ }
94
+
95
+ console.log(
96
+ `Found ${missingKeysList.length} unique missing keys in ${locale}`,
97
+ )
98
+
99
+ // Check for existing translations of these keys in other namespaces
100
+ const keysToTranslate: Record<string, string> = {}
101
+ const existingTranslations: Record<string, string> = {}
102
+
103
+ for (const key of missingKeysList) {
104
+ const existingValue = await findExistingTranslation(
105
+ key,
106
+ namespaces,
107
+ locale,
108
+ loadPath,
109
+ )
110
+
111
+ if (existingValue) {
63
112
  console.log(
64
- `Found ${Object.keys(missingKeys).length} missing keys in ${locale} (namespace: ${namespace})`,
113
+ `šŸ”„ Reusing existing translation for "${key}": "${existingValue}"`,
65
114
  )
115
+ existingTranslations[key] = existingValue
116
+ } else {
117
+ keysToTranslate[key] = allMissingKeys[key].value
118
+ }
119
+ }
66
120
 
67
- let translatedValues: Record<string, string>
68
- try {
69
- translatedValues = await translateKey({
70
- inputLanguage: defaultLocale,
71
- outputLanguage: locale,
72
- context,
73
- object: missingKeys,
74
- openai,
75
- model: config.model,
76
- })
77
- } catch (error) {
78
- throw new TranslationError(
79
- `Failed to translate keys for locale "${locale}" (namespace: ${namespace})`,
80
- locale,
81
- namespace,
82
- error instanceof Error ? error : undefined,
83
- )
84
- }
121
+ let translatedValues: Record<string, string> = {}
122
+
123
+ // Translate only the keys that don't have existing translations
124
+ if (Object.keys(keysToTranslate).length > 0 && !disableTranslation) {
125
+ console.log(
126
+ `šŸ”¤ Translating ${Object.keys(keysToTranslate).length} new keys for ${locale}`,
127
+ )
128
+
129
+ try {
130
+ translatedValues = await translateKey({
131
+ inputLanguage: defaultLocale,
132
+ outputLanguage: locale,
133
+ context,
134
+ object: keysToTranslate,
135
+ openai,
136
+ model: config.model,
137
+ })
138
+ } catch (error) {
139
+ throw new TranslationError(
140
+ `Failed to translate keys for locale "${locale}"`,
141
+ locale,
142
+ undefined,
143
+ error instanceof Error ? error : undefined,
144
+ )
145
+ }
146
+ }
147
+
148
+ // Combine existing translations with new translations
149
+ const allTranslations = { ...existingTranslations, ...translatedValues }
85
150
 
86
- // Merge translated values with existing ones
87
- const updatedLocaleKeys = {
88
- ...localeKeys,
89
- ...translatedValues,
151
+ // Distribute translations to all relevant namespaces
152
+ for (const namespace of namespaces) {
153
+ let hasChanges = false
154
+ const updatedKeys = { ...namespaceKeys[namespace] }
155
+
156
+ for (const key of missingKeysList) {
157
+ if (allMissingKeys[key].namespaces.includes(namespace)) {
158
+ const translation = disableTranslation
159
+ ? ""
160
+ : allTranslations[key] || ""
161
+ updatedKeys[key] = translation
162
+ hasChanges = true
90
163
  }
164
+ }
91
165
 
166
+ if (hasChanges) {
92
167
  try {
93
- await writeLocalesFile(
94
- savePath,
95
- locale,
96
- namespace,
97
- updatedLocaleKeys,
98
- )
168
+ await writeLocalesFile(savePath, locale, namespace, updatedKeys)
169
+
170
+ const addedKeysCount = Object.keys(allMissingKeys).filter((key) =>
171
+ allMissingKeys[key].namespaces.includes(namespace),
172
+ ).length
173
+
174
+ if (disableTranslation) {
175
+ console.log(
176
+ `šŸ“ Created empty namespace file for ${locale} (${namespace}): ${addedKeysCount} keys`,
177
+ )
178
+ } else {
179
+ console.log(
180
+ `āœ… Updated ${locale} (${namespace}): ${addedKeysCount} keys`,
181
+ )
182
+ }
99
183
  } catch (error) {
100
184
  throw new TranslationError(
101
185
  `Failed to save translations for locale "${locale}" (namespace: ${namespace})`,
@@ -104,14 +188,6 @@ export const syncLocales = async (config: Configuration) => {
104
188
  error instanceof Error ? error : undefined,
105
189
  )
106
190
  }
107
-
108
- console.log(
109
- `Successfully translated and saved ${Object.keys(missingKeys).length} keys for ${locale} (namespace: ${namespace})`,
110
- )
111
- } else {
112
- console.log(
113
- `No missing keys found for ${locale} (namespace: ${namespace})`,
114
- )
115
191
  }
116
192
  }
117
193
  }
package/src/lib/utils.ts CHANGED
@@ -362,6 +362,8 @@ export const getMissingKeys = async ({
362
362
 
363
363
  // Group keys by namespace
364
364
  const keysByNamespace: Record<string, Set<string>> = {}
365
+ // Track which namespaces each key belongs to
366
+ const keyToNamespaces: Record<string, Set<string>> = {}
365
367
 
366
368
  for (const { key, namespaces: keyNamespaces } of keysWithNamespaces) {
367
369
  for (const namespace of keyNamespaces) {
@@ -370,11 +372,16 @@ export const getMissingKeys = async ({
370
372
  }
371
373
 
372
374
  const pureKey = getPureKey(key, namespace, namespace === defaultNamespace)
373
- if (pureKey) {
374
- keysByNamespace[namespace].add(pureKey)
375
- } else if (!key.includes(":")) {
376
- // For file-based namespace assignment, accept keys without namespace prefixes
377
- keysByNamespace[namespace].add(key)
375
+ const finalKey = pureKey || (!key.includes(":") ? key : null)
376
+
377
+ if (finalKey) {
378
+ keysByNamespace[namespace].add(finalKey)
379
+
380
+ // Track which namespaces this key belongs to
381
+ if (!keyToNamespaces[finalKey]) {
382
+ keyToNamespaces[finalKey] = new Set()
383
+ }
384
+ keyToNamespaces[finalKey].add(namespace)
378
385
  }
379
386
  }
380
387
  }
@@ -384,16 +391,34 @@ export const getMissingKeys = async ({
384
391
  console.log(`šŸ“¦ ${namespace}: ${keys.size} unique keys`)
385
392
  }
386
393
 
387
- // Check for missing keys in each namespace
394
+ // Load all existing keys for all namespaces first
395
+ const existingKeysByNamespace: Record<string, Record<string, string>> = {}
388
396
  for (const namespace of namespaces) {
389
- const existingKeys = await loadLocalesFile(
397
+ existingKeysByNamespace[namespace] = await loadLocalesFile(
390
398
  loadPath,
391
399
  defaultLocale,
392
400
  namespace,
393
401
  )
402
+ console.log(
403
+ Object.keys(existingKeysByNamespace[namespace]).length,
404
+ "existing keys in",
405
+ namespace,
406
+ )
407
+ }
394
408
 
395
- console.log(Object.keys(existingKeys).length, "existing keys in", namespace)
409
+ // Track unique missing keys to avoid duplicates
410
+ const uniqueMissingKeys = new Map<
411
+ string,
412
+ {
413
+ key: string
414
+ namespaces: string[]
415
+ primaryNamespace: string
416
+ }
417
+ >()
396
418
 
419
+ // Check for missing keys in each namespace
420
+ for (const namespace of namespaces) {
421
+ const existingKeys = existingKeysByNamespace[namespace]
397
422
  const keysForNamespace = keysByNamespace[namespace] || new Set()
398
423
  console.log(
399
424
  `šŸ” Checking ${keysForNamespace.size} keys for namespace ${namespace}`,
@@ -401,11 +426,41 @@ export const getMissingKeys = async ({
401
426
 
402
427
  for (const key of keysForNamespace) {
403
428
  if (!existingKeys[key]) {
404
- newKeys.push({ key, namespace })
429
+ if (uniqueMissingKeys.has(key)) {
430
+ // Add this namespace to the existing entry
431
+ const existing = uniqueMissingKeys.get(key)
432
+ if (existing && !existing.namespaces.includes(namespace)) {
433
+ existing.namespaces.push(namespace)
434
+ }
435
+ } else {
436
+ // Create new entry with all namespaces this key belongs to (that are missing)
437
+ const allNamespaces = Array.from(
438
+ keyToNamespaces[key] || [namespace],
439
+ ).filter((ns) => !existingKeysByNamespace[ns]?.[key])
440
+
441
+ uniqueMissingKeys.set(key, {
442
+ key,
443
+ namespaces: allNamespaces,
444
+ primaryNamespace: namespace,
445
+ })
446
+ }
405
447
  }
406
448
  }
407
449
  }
408
450
 
451
+ // Convert to the expected format
452
+ for (const {
453
+ key,
454
+ namespaces: keyNamespaces,
455
+ primaryNamespace,
456
+ } of uniqueMissingKeys.values()) {
457
+ newKeys.push({
458
+ key,
459
+ namespace: primaryNamespace,
460
+ namespaces: keyNamespaces,
461
+ })
462
+ }
463
+
409
464
  return newKeys
410
465
  }
411
466
 
@@ -437,11 +492,16 @@ export const findExistingTranslation = async (
437
492
  return null
438
493
  }
439
494
 
440
- export const getTextInput = async (prompt: string) => {
495
+ export const getTextInput = async (key: string, namespaces?: string[]) => {
496
+ const namespaceInfo =
497
+ namespaces && namespaces.length > 0
498
+ ? ` (will be added to: ${namespaces.join(", ")})`
499
+ : ""
500
+
441
501
  const input = await prompts({
442
502
  name: "value",
443
503
  type: "text",
444
- message: prompt,
504
+ message: `${key}${namespaceInfo}`,
445
505
  onState: (state) => {
446
506
  if (state.aborted) {
447
507
  process.nextTick(() => {