next-auto-i18n 0.7.1 → 0.7.3
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/DOCUMENTATION.md +38 -35
- package/README.md +19 -5
- package/dist/cli/doc-generator.d.ts +1 -2
- package/dist/cli/doc-generator.d.ts.map +1 -1
- package/dist/cli/doc-generator.js +0 -11
- package/dist/cli/doc-generator.js.map +1 -1
- package/dist/cli/index.js +279 -22
- package/dist/cli/index.js.map +1 -1
- package/dist/generator/index.d.ts +0 -17
- package/dist/generator/index.d.ts.map +1 -1
- package/dist/generator/index.js +0 -9
- package/dist/generator/index.js.map +1 -1
- package/dist/injector/layout-injector.d.ts +0 -1
- package/dist/injector/layout-injector.d.ts.map +1 -1
- package/dist/injector/layout-injector.js +0 -1
- package/dist/injector/layout-injector.js.map +1 -1
- package/dist/injector/locale-structure-injector.d.ts +0 -4
- package/dist/injector/locale-structure-injector.d.ts.map +1 -1
- package/dist/injector/locale-structure-injector.js +0 -11
- package/dist/injector/locale-structure-injector.js.map +1 -1
- package/dist/injector/middleware-injector.d.ts.map +1 -1
- package/dist/injector/middleware-injector.js +0 -6
- package/dist/injector/middleware-injector.js.map +1 -1
- package/dist/injector/request-injector.d.ts.map +1 -1
- package/dist/injector/request-injector.js +0 -2
- package/dist/injector/request-injector.js.map +1 -1
- package/dist/injector/routing-injector.d.ts.map +1 -1
- package/dist/injector/routing-injector.js +0 -2
- package/dist/injector/routing-injector.js.map +1 -1
- package/dist/rewriter/const-rewriter.d.ts.map +1 -1
- package/dist/rewriter/const-rewriter.js +0 -8
- package/dist/rewriter/const-rewriter.js.map +1 -1
- package/dist/rewriter/index.d.ts +0 -12
- package/dist/rewriter/index.d.ts.map +1 -1
- package/dist/rewriter/index.js +0 -10
- package/dist/rewriter/index.js.map +1 -1
- package/dist/rewriter/jsx-rewriter.d.ts +0 -10
- package/dist/rewriter/jsx-rewriter.d.ts.map +1 -1
- package/dist/rewriter/jsx-rewriter.js +0 -16
- package/dist/rewriter/jsx-rewriter.js.map +1 -1
- package/dist/scanner/ast-parser.d.ts +0 -1
- package/dist/scanner/ast-parser.d.ts.map +1 -1
- package/dist/scanner/ast-parser.js +0 -1
- package/dist/scanner/ast-parser.js.map +1 -1
- package/dist/scanner/index.d.ts +0 -1
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/index.js +0 -4
- package/dist/scanner/index.js.map +1 -1
- package/dist/scanner/string-extractor.d.ts +0 -1
- package/dist/scanner/string-extractor.d.ts.map +1 -1
- package/dist/scanner/string-extractor.js +0 -19
- package/dist/scanner/string-extractor.js.map +1 -1
- package/dist/translator/deepl.d.ts.map +1 -1
- package/dist/translator/deepl.js +0 -1
- package/dist/translator/deepl.js.map +1 -1
- package/dist/translator/index.d.ts.map +1 -1
- package/dist/translator/index.js +0 -2
- package/dist/translator/index.js.map +1 -1
- package/package.json +1 -1
package/DOCUMENTATION.md
CHANGED
|
@@ -273,28 +273,37 @@ next-auto-i18n add-locale zh
|
|
|
273
273
|
|
|
274
274
|
### `next-auto-i18n extract`
|
|
275
275
|
|
|
276
|
-
Scans the project, translates all strings, and generates a Markdown integration guide — **without modifying any source file**.
|
|
276
|
+
Scans the project, translates all strings, and generates a Markdown integration guide — **without modifying any source file**.
|
|
277
277
|
|
|
278
278
|
```bash
|
|
279
|
-
next-auto-i18n extract
|
|
280
|
-
next-auto-i18n extract --locale en,es
|
|
281
|
-
next-auto-i18n extract --out docs/i18n-guide.md
|
|
279
|
+
next-auto-i18n extract # Interactive (asks locale if no config)
|
|
280
|
+
next-auto-i18n extract --locale en,es # Skip locale prompt
|
|
281
|
+
next-auto-i18n extract --out docs/i18n-guide.md # Custom output path
|
|
282
|
+
next-auto-i18n extract --inject # Also configure Next.js after extraction
|
|
283
|
+
next-auto-i18n extract --switcher # Inject only the Language Switcher widget
|
|
284
|
+
next-auto-i18n extract --no-module-scope # Exclude module-scope const strings entirely
|
|
282
285
|
```
|
|
283
286
|
|
|
284
287
|
| Flag | Description |
|
|
285
288
|
|------|-------------|
|
|
286
|
-
| `--locale <locales>` | Comma-separated target locales (used if no
|
|
289
|
+
| `--locale <locales>` | Comma-separated target locales (used if no config file exists) |
|
|
287
290
|
| `--out <path>` | Output path for the Markdown guide (default: `i18n-guide.md`) |
|
|
291
|
+
| `--inject` | Runs the full Next.js setup after translation: `next.config`, `middleware.ts`, `i18n/routing.ts`, `i18n/request.ts`, `app/[locale]/` structure, Language Switcher |
|
|
292
|
+
| `--switcher` | Injects only the floating Language Switcher component (without `--inject`) |
|
|
293
|
+
| `--no-module-scope` | Excludes strings declared inside module-scope `const` from detection and translation |
|
|
288
294
|
|
|
289
295
|
**What it does:**
|
|
290
296
|
|
|
291
297
|
1. Scans your project for translatable strings (same AST engine as `init`)
|
|
292
|
-
2.
|
|
293
|
-
3.
|
|
294
|
-
4.
|
|
295
|
-
5.
|
|
298
|
+
2. *(if `--no-module-scope`)* Detects and filters out module-scope strings before key generation
|
|
299
|
+
3. Generates/updates `messages/<sourceLocale>.json` with stable key merge
|
|
300
|
+
4. Translates to all target locales via DeepL (incremental — only new strings)
|
|
301
|
+
5. Detects module-scope strings that require manual integration (unless `--no-module-scope`)
|
|
302
|
+
6. *(if `--inject`)* Configures the full Next.js i18n infrastructure
|
|
303
|
+
7. *(if `--switcher`)* Injects the Language Switcher component
|
|
304
|
+
8. Generates `i18n-guide.md` with full integration instructions
|
|
296
305
|
|
|
297
|
-
**What it does
|
|
306
|
+
**What it never does:** modify any `.tsx`/`.ts`/`.jsx`/`.js` source file.
|
|
298
307
|
|
|
299
308
|
**Generated guide contents:**
|
|
300
309
|
|
|
@@ -302,38 +311,29 @@ next-auto-i18n extract --out docs/i18n-guide.md # Custom output path
|
|
|
302
311
|
- List of generated translation files
|
|
303
312
|
- Usage examples (Client Component with `useTranslations`, Server Component with `getTranslations`)
|
|
304
313
|
- Module-scope strings section with before/after code examples
|
|
305
|
-
- Per-file
|
|
314
|
+
- Per-file tables: line number, type, original text, key, ready-to-paste replacement code
|
|
306
315
|
- Complete key reference table
|
|
307
316
|
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
```
|
|
311
|
-
▸ Configuration
|
|
312
|
-
✓ Configuration chargée (fr → en, es)
|
|
313
|
-
|
|
314
|
-
▸ Scan du projet
|
|
315
|
-
✓ 47 strings trouvées dans 12 fichiers
|
|
316
|
-
components/Hero.tsx 8 strings
|
|
317
|
-
components/Navbar.tsx 5 strings
|
|
318
|
-
...
|
|
317
|
+
---
|
|
319
318
|
|
|
320
|
-
|
|
321
|
-
✓ 42 clés → ./messages/fr.json
|
|
319
|
+
### `next-auto-i18n extract sync`
|
|
322
320
|
|
|
323
|
-
|
|
324
|
-
✓ 84 strings traduites
|
|
325
|
-
./messages/en.json
|
|
326
|
-
./messages/es.json
|
|
321
|
+
Sub-command of `extract`. Rescans the project, integrates new strings, and synchronises translations — **without rewriting source files**. Uses the same stable key merge as `sync`.
|
|
327
322
|
|
|
328
|
-
|
|
329
|
-
|
|
323
|
+
```bash
|
|
324
|
+
next-auto-i18n extract sync # Rescan + update JSON + translate
|
|
325
|
+
next-auto-i18n extract sync --inject # + configure Next.js after sync
|
|
326
|
+
next-auto-i18n extract sync --switcher # + inject the Language Switcher
|
|
327
|
+
next-auto-i18n extract sync --no-module-scope # Exclude module-scope strings
|
|
328
|
+
```
|
|
330
329
|
|
|
331
|
-
|
|
332
|
-
|
|
330
|
+
| Flag | Description |
|
|
331
|
+
|------|-------------|
|
|
332
|
+
| `--inject` | Runs full Next.js setup after synchronisation |
|
|
333
|
+
| `--switcher` | Injects only the Language Switcher component |
|
|
334
|
+
| `--no-module-scope` | Excludes module-scope strings from detection and translation |
|
|
333
335
|
|
|
334
|
-
|
|
335
|
-
Consultez le guide pour intégrer les traductions manuellement.
|
|
336
|
-
```
|
|
336
|
+
Requires an existing `auto-i18n.config.json` and `messages/<sourceLocale>.json` (run `init` or `extract` first).
|
|
337
337
|
|
|
338
338
|
---
|
|
339
339
|
|
|
@@ -953,6 +953,9 @@ The test suite covers all modules:
|
|
|
953
953
|
- [x] `next-auto-i18n sync` — rescan and incremental update (stable key merge)
|
|
954
954
|
- [x] `next-auto-i18n missing` — report untranslated keys
|
|
955
955
|
- [x] `next-auto-i18n extract` — translate + generate guide without touching source
|
|
956
|
+
- [x] `next-auto-i18n extract sync` — incremental sync without source rewrite
|
|
957
|
+
- [x] `--inject` / `--switcher` options on `extract` and `extract sync`
|
|
958
|
+
- [x] `--no-module-scope` option to exclude const module-scope strings
|
|
956
959
|
- [x] Floating language switcher widget (auto-injected, customizable)
|
|
957
960
|
- [x] Automatic `next-intl` dependency installation
|
|
958
961
|
- [x] `app/[locale]/` structure auto-creation (required by next-intl App Router)
|
package/README.md
CHANGED
|
@@ -75,16 +75,30 @@ next-auto-i18n sync
|
|
|
75
75
|
|
|
76
76
|
### `next-auto-i18n extract`
|
|
77
77
|
|
|
78
|
-
Traduit toutes les strings et genere un **guide d'integration Markdown** — sans modifier aucun fichier source.
|
|
78
|
+
Traduit toutes les strings et genere un **guide d'integration Markdown** — sans modifier aucun fichier source.
|
|
79
79
|
|
|
80
80
|
```bash
|
|
81
|
-
next-auto-i18n extract
|
|
82
|
-
next-auto-i18n extract --out docs/i18n-guide.md
|
|
83
|
-
next-auto-i18n extract --locale en,es
|
|
81
|
+
next-auto-i18n extract # guide genere dans i18n-guide.md
|
|
82
|
+
next-auto-i18n extract --out docs/i18n-guide.md # chemin personnalise
|
|
83
|
+
next-auto-i18n extract --locale en,es # langues cibles (si pas de config)
|
|
84
|
+
next-auto-i18n extract --inject # configure aussi Next.js (next.config, middleware, routing...)
|
|
85
|
+
next-auto-i18n extract --switcher # injecte uniquement le Language Switcher
|
|
86
|
+
next-auto-i18n extract --no-module-scope # ignore les strings dans les const module-scope
|
|
84
87
|
```
|
|
85
88
|
|
|
86
89
|
Le guide genere inclut : exemples d'utilisation Client/Server Component, tableaux par fichier (ligne, type, cle, code a copier-coller), section dedicee aux strings module-scope.
|
|
87
90
|
|
|
91
|
+
### `next-auto-i18n extract sync`
|
|
92
|
+
|
|
93
|
+
Rescanne le projet, integre les nouvelles strings et synchronise les traductions — **sans réécrire les fichiers source**. Meme merge stable que `sync`.
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
next-auto-i18n extract sync # rescan + mise a jour JSON + traduction
|
|
97
|
+
next-auto-i18n extract sync --inject # + configure Next.js apres synchronisation
|
|
98
|
+
next-auto-i18n extract sync --switcher # + injecte le Language Switcher
|
|
99
|
+
next-auto-i18n extract sync --no-module-scope # exclut les strings module-scope
|
|
100
|
+
```
|
|
101
|
+
|
|
88
102
|
### `next-auto-i18n add-locale <locale>`
|
|
89
103
|
|
|
90
104
|
Ajoute une nouvelle langue et traduit toutes les cles existantes.
|
|
@@ -204,7 +218,7 @@ Un composant flottant est automatiquement genere dans `components/LanguageSwitch
|
|
|
204
218
|
## Developpement
|
|
205
219
|
|
|
206
220
|
```bash
|
|
207
|
-
git clone https://github.com/stvekoulo/
|
|
221
|
+
git clone https://github.com/stvekoulo/auto-i18n.git
|
|
208
222
|
cd next-auto-i18n
|
|
209
223
|
npm install
|
|
210
224
|
npm test # vitest
|
|
@@ -4,14 +4,13 @@ export interface FileDocEntry {
|
|
|
4
4
|
/** Chemin relatif depuis projectRoot (pour l'affichage). */
|
|
5
5
|
relPath: string;
|
|
6
6
|
strings: ExtractedString[];
|
|
7
|
-
/** Valeurs des strings au module-scope
|
|
7
|
+
/** Valeurs des strings au module-scope. */
|
|
8
8
|
moduleScopeValues: Set<string>;
|
|
9
9
|
}
|
|
10
10
|
export interface DocOptions {
|
|
11
11
|
projectRoot: string;
|
|
12
12
|
sourceLocale: string;
|
|
13
13
|
targetLocales: string[];
|
|
14
|
-
/** Chemin relatif du dossier messages (pour l'affichage). */
|
|
15
14
|
messagesDir: string;
|
|
16
15
|
keyMap: Map<string, string>;
|
|
17
16
|
files: FileDocEntry[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-generator.d.ts","sourceRoot":"","sources":["../../src/cli/doc-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"doc-generator.d.ts","sourceRoot":"","sources":["../../src/cli/doc-generator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,2CAA2C;IAC3C,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACd;AAgCD,wBAAgB,QAAQ,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CA+JpD;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAGpE"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { writeFile } from 'fs/promises';
|
|
2
|
-
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
3
2
|
function escapeCell(s) {
|
|
4
3
|
return s.replace(/\|/g, '\\|').replace(/[\r\n]+/g, ' ');
|
|
5
4
|
}
|
|
@@ -25,19 +24,16 @@ function replacementCode(s, key) {
|
|
|
25
24
|
}
|
|
26
25
|
return `{t("${key}")}`;
|
|
27
26
|
}
|
|
28
|
-
// ── Markdown builder ───────────────────────────────────────────────────────
|
|
29
27
|
export function buildDoc(options) {
|
|
30
28
|
const { sourceLocale, targetLocales, messagesDir, keyMap, files, date } = options;
|
|
31
29
|
const totalStrings = files.reduce((sum, f) => sum + f.strings.length, 0);
|
|
32
30
|
const totalKeys = keyMap.size;
|
|
33
31
|
const moduleScopeTotal = files.reduce((sum, f) => sum + f.moduleScopeValues.size, 0);
|
|
34
32
|
const L = [];
|
|
35
|
-
// ── En-tête ──────────────────────────────────────────────────────────────
|
|
36
33
|
L.push('# Guide d\'intégration i18n — next-auto-i18n');
|
|
37
34
|
L.push('');
|
|
38
35
|
L.push(`> Généré le **${date}** · ✅ Aucun fichier source modifié.`);
|
|
39
36
|
L.push('');
|
|
40
|
-
// ── Résumé ───────────────────────────────────────────────────────────────
|
|
41
37
|
L.push('## Résumé');
|
|
42
38
|
L.push('');
|
|
43
39
|
L.push(`| | |`);
|
|
@@ -49,7 +45,6 @@ export function buildDoc(options) {
|
|
|
49
45
|
L.push(`| ⚠️ Action manuelle | **${moduleScopeTotal}** string${moduleScopeTotal > 1 ? 's' : ''} module-scope (voir section dédiée) |`);
|
|
50
46
|
}
|
|
51
47
|
L.push('');
|
|
52
|
-
// ── Fichiers générés ─────────────────────────────────────────────────────
|
|
53
48
|
L.push('## Fichiers générés');
|
|
54
49
|
L.push('');
|
|
55
50
|
L.push('| Fichier | Description |');
|
|
@@ -59,7 +54,6 @@ export function buildDoc(options) {
|
|
|
59
54
|
L.push(`| \`${messagesDir}/${locale}.json\` | Traductions (${locale}) |`);
|
|
60
55
|
}
|
|
61
56
|
L.push('');
|
|
62
|
-
// ── Guide d'utilisation ───────────────────────────────────────────────────
|
|
63
57
|
L.push('## Comment utiliser les traductions');
|
|
64
58
|
L.push('');
|
|
65
59
|
L.push('### Composant Client (`\'use client\'`)');
|
|
@@ -87,7 +81,6 @@ export function buildDoc(options) {
|
|
|
87
81
|
L.push('');
|
|
88
82
|
L.push('> 💡 Lancez `npx next-auto-i18n init` pour configurer automatiquement le routing, le middleware et les layouts.');
|
|
89
83
|
L.push('');
|
|
90
|
-
// ── Section module-scope ─────────────────────────────────────────────────
|
|
91
84
|
if (moduleScopeTotal > 0) {
|
|
92
85
|
L.push('---');
|
|
93
86
|
L.push('');
|
|
@@ -116,7 +109,6 @@ export function buildDoc(options) {
|
|
|
116
109
|
L.push('```');
|
|
117
110
|
L.push('');
|
|
118
111
|
}
|
|
119
|
-
// ── Strings par fichier ───────────────────────────────────────────────────
|
|
120
112
|
L.push('---');
|
|
121
113
|
L.push('');
|
|
122
114
|
L.push('## Strings par fichier');
|
|
@@ -134,7 +126,6 @@ export function buildDoc(options) {
|
|
|
134
126
|
L.push(`> ⚠️ **${moduleScopeValues.size}** string${moduleScopeValues.size > 1 ? 's' : ''} module-scope dans ce fichier.`);
|
|
135
127
|
L.push('');
|
|
136
128
|
}
|
|
137
|
-
// Strings auto-remplaçables
|
|
138
129
|
if (autoStrings.length > 0) {
|
|
139
130
|
if (hasModuleScope)
|
|
140
131
|
L.push('**Remplacements automatiques :**');
|
|
@@ -149,7 +140,6 @@ export function buildDoc(options) {
|
|
|
149
140
|
}
|
|
150
141
|
L.push('');
|
|
151
142
|
}
|
|
152
|
-
// Strings module-scope (action manuelle)
|
|
153
143
|
if (manualStrings.length > 0) {
|
|
154
144
|
L.push('**Action manuelle requise (module-scope) :**');
|
|
155
145
|
L.push('');
|
|
@@ -167,7 +157,6 @@ export function buildDoc(options) {
|
|
|
167
157
|
L.push('---');
|
|
168
158
|
L.push('');
|
|
169
159
|
}
|
|
170
|
-
// ── Toutes les clés ───────────────────────────────────────────────────────
|
|
171
160
|
L.push('## Référence complète des clés');
|
|
172
161
|
L.push('');
|
|
173
162
|
L.push(`Toutes les clés générées dans \`${messagesDir}/${sourceLocale}.json\` :`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-generator.js","sourceRoot":"","sources":["../../src/cli/doc-generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwBxC,
|
|
1
|
+
{"version":3,"file":"doc-generator.js","sourceRoot":"","sources":["../../src/cli/doc-generator.ts"],"names":[],"mappings":"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"}
|