{"_id":"@abdess76/i18nkit","_rev":"5-73490c870248c37f57d6bc4a799a269e","name":"@abdess76/i18nkit","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"@abdess76/i18nkit","version":"1.0.0","keywords":["i18n","internationalization","localization","l10n","translation","extract","sync","cli","transloco","angular","primeng","zero-dependency","missing-translations","orphan-keys","plugin"],"author":{"url":"https://github.com/Abdess","name":"Abdessamad DERRAZ"},"license":"MIT","_id":"@abdess76/i18nkit@1.0.0","maintainers":[{"name":"abdess76","email":"derraz.abdessamad@gmail.com"}],"homepage":"https://github.com/Abdess/i18nkit#readme","bugs":{"url":"https://github.com/Abdess/i18nkit/issues"},"bin":{"i18n":"bin/cli.js","i18nkit":"bin/cli.js"},"dist":{"shasum":"402cddb9bab03f7d9d7542a7d203ebded11397e0","tarball":"https://registry.npmjs.org/@abdess76/i18nkit/-/i18nkit-1.0.0.tgz","fileCount":48,"integrity":"sha512-WbBUaMDOwU9uWkTxTD9DQeJn1Ze2xdas30VYYDTHBL3dW8BAmr4IlSuiqt+9MTEWnEWLHmqcyeXwbIrNjHTsxA==","signatures":[{"sig":"MEUCIEEi60FOn7J3ruEVjf6xwb1e9M50EAbPlls0g0U0ZN2mAiEA41VdqQ0trKHZBMYJFAeYJbnipUWz+0SpOlljcy8uyxc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdess76%2fi18nkit@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":154123},"main":"./bin/cli.js","type":"commonjs","types":"./types/index.d.ts","engines":{"npm":">=10.0.0","node":">=22.0.0"},"exports":{".":{"types":"./types/index.d.ts","default":"./bin/cli.js"},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/Abdess","type":"github"},"gitHead":"dec9c8e6f3c5bac0df64b74a512e816106053b89","scripts":{"docs":"jsdoc -c jsdoc.json","lint":"eslint .","test":"node --test tests/**/*.test.js","format":"prettier --write .","prepack":"npm run validate","prepare":"husky","release":"npm version patch && npm publish","version":"npm run format && git add -A","lint:fix":"eslint . --fix","validate":"npm run lint && npm run format:check && npm run typecheck && npm test","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/api","test:watch":"node --test --watch tests/**/*.test.js","postversion":"git push && git push --tags","format:check":"prettier --check .","test:coverage":"node --test --experimental-test-coverage tests/**/*.test.js","prepublishOnly":"npm run validate"},"_npmUser":{"name":"abdess76","email":"derraz.abdessamad@gmail.com"},"devEngines":{"runtime":{"name":"node","onFail":"error","version":">=22.0.0"},"packageManager":{"name":"npm","onFail":"warn","version":">=10.0.0"}},"repository":{"url":"git+https://github.com/Abdess/i18nkit.git","type":"git"},"_npmVersion":"10.9.4","description":"Universal i18n CLI - extract translation keys, sync language files, detect missing translations. Extensible plugin architecture.","directories":{},"lint-staged":{"*.js":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"packageManager":"npm@10.9.2","devDependencies":{"husky":"^9.1.7","jsdoc":"^4.0.4","eslint":"^9.17.0","globals":"^15.14.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.2","lint-staged":"^15.3.0","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18nkit_1.0.0_1767601459736_0.2612049085158674","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@abdess76/i18nkit","version":"1.0.1","keywords":["i18n","internationalization","localization","l10n","translation","extract","sync","cli","transloco","angular","primeng","zero-dependency","missing-translations","orphan-keys","plugin"],"author":{"url":"https://github.com/Abdess","name":"Abdessamad DERRAZ"},"license":"MIT","_id":"@abdess76/i18nkit@1.0.1","maintainers":[{"name":"abdess76","email":"derraz.abdessamad@gmail.com"}],"homepage":"https://github.com/Abdess/i18nkit#readme","bugs":{"url":"https://github.com/Abdess/i18nkit/issues"},"bin":{"i18n":"bin/cli.js","i18nkit":"bin/cli.js"},"dist":{"shasum":"d33f6ef85e6213a842a07d18c1b29ce8eeef84a3","tarball":"https://registry.npmjs.org/@abdess76/i18nkit/-/i18nkit-1.0.1.tgz","fileCount":48,"integrity":"sha512-Ure08FcKWkoBgN/nVRyPIzG8wQ1N8sojCUlHd0Ifh6nQRCgBahWBWYL59cKT3R+dorgO1ZdOwstPIf0lQuuKDA==","signatures":[{"sig":"MEYCIQD6bp4x72K6Oqn0H5LInJyszho7iWbldRF2DRkxVVv1OQIhAL6D4ftSB6MRD8ClVFc6RG76BCTMpjJvHIw8qRnuV1Yk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdess76%2fi18nkit@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":154312},"main":"./bin/cli.js","type":"commonjs","types":"./types/index.d.ts","engines":{"npm":">=10.0.0","node":">=22.0.0"},"exports":{".":{"types":"./types/index.d.ts","default":"./bin/cli.js"},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/Abdess","type":"github"},"gitHead":"54d412ef3ab7f08151045ef1f87d684b40bd6eaf","scripts":{"docs":"jsdoc -c jsdoc.json","lint":"eslint .","test":"node --test tests/**/*.test.js","format":"prettier --write .","prepack":"npm run validate","prepare":"husky","release":"npm version patch && npm publish","version":"npm run format && git add -A","lint:fix":"eslint . --fix","validate":"npm run lint && npm run format:check && npm run typecheck && npm test","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/api","test:watch":"node --test --watch tests/**/*.test.js","postversion":"git push && git push --tags","format:check":"prettier --check .","test:coverage":"node --test --experimental-test-coverage tests/**/*.test.js","prepublishOnly":"npm run validate"},"_npmUser":{"name":"abdess76","email":"derraz.abdessamad@gmail.com"},"devEngines":{"runtime":{"name":"node","onFail":"error","version":">=22.0.0"},"packageManager":{"name":"npm","onFail":"warn","version":">=10.0.0"}},"repository":{"url":"git+https://github.com/Abdess/i18nkit.git","type":"git"},"_npmVersion":"10.9.4","description":"Universal i18n CLI - extract translation keys, sync language files, detect missing translations. Extensible plugin architecture.","directories":{},"lint-staged":{"*.js":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"packageManager":"npm@10.9.2","devDependencies":{"husky":"^9.1.7","jsdoc":"^4.0.4","eslint":"^9.17.0","globals":"^15.14.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.2","lint-staged":"^15.3.0","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18nkit_1.0.1_1767601844986_0.22932480275257494","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@abdess76/i18nkit","version":"1.0.2","keywords":["i18n","internationalization","localization","l10n","translation","extract","sync","cli","transloco","angular","primeng","zero-dependency","missing-translations","orphan-keys","plugin"],"author":{"url":"https://github.com/Abdess","name":"Abdessamad DERRAZ"},"license":"MIT","_id":"@abdess76/i18nkit@1.0.2","maintainers":[{"name":"abdess76","email":"derraz.abdessamad@gmail.com"}],"homepage":"https://github.com/Abdess/i18nkit#readme","bugs":{"url":"https://github.com/Abdess/i18nkit/issues"},"bin":{"i18n":"bin/cli.js","i18nkit":"bin/cli.js"},"dist":{"shasum":"335ec568161a4bfc374fb056d676f27ed958aa33","tarball":"https://registry.npmjs.org/@abdess76/i18nkit/-/i18nkit-1.0.2.tgz","fileCount":48,"integrity":"sha512-cLEYjDNXbat1ONhcd+QmhZHYzhUw5CLNDCz1QupK+GSozcCVxM1hi2hf7THlcdT7R/s4svu7z/P11AogDn59Pg==","signatures":[{"sig":"MEYCIQCVEeqp3RMHPI0LmT5hZm60kyyO6g+OkxYMCkp1txCsfAIhAOwPzpu6F6CtS1HxCOYW/7OZTZ8rRSBFN4IFSz5g5ERH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdess76%2fi18nkit@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":154312},"main":"./bin/cli.js","type":"commonjs","types":"./types/index.d.ts","engines":{"npm":">=10.0.0","node":">=22.0.0"},"exports":{".":{"types":"./types/index.d.ts","default":"./bin/cli.js"},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/Abdess","type":"github"},"gitHead":"df9d6cd01fab2ca097784ae545e134f10fc9b68d","scripts":{"docs":"jsdoc -c jsdoc.json","lint":"eslint .","test":"node --test tests/**/*.test.js","format":"prettier --write .","prepack":"npm run validate","prepare":"husky","release":"npm version patch && npm publish","version":"npm run format && git add -A","lint:fix":"eslint . --fix","validate":"npm run lint && npm run format:check && npm run typecheck && npm test","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/api","test:watch":"node --test --watch tests/**/*.test.js","postversion":"git push && git push --tags","format:check":"prettier --check .","test:coverage":"node --test --experimental-test-coverage tests/**/*.test.js","prepublishOnly":"npm run validate"},"_npmUser":{"name":"abdess76","email":"derraz.abdessamad@gmail.com"},"devEngines":{"runtime":{"name":"node","onFail":"error","version":">=22.0.0"},"packageManager":{"name":"npm","onFail":"warn","version":">=10.0.0"}},"repository":{"url":"git+https://github.com/Abdess/i18nkit.git","type":"git"},"_npmVersion":"10.9.4","description":"Universal i18n CLI - extract translation keys, sync language files, detect missing translations. Extensible plugin architecture.","directories":{},"lint-staged":{"*.js":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"packageManager":"npm@10.9.2","devDependencies":{"husky":"^9.1.7","jsdoc":"^4.0.4","eslint":"^9.17.0","globals":"^15.14.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.2","lint-staged":"^15.3.0","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18nkit_1.0.2_1767605471979_0.467391856038758","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@abdess76/i18nkit","version":"1.0.3","keywords":["i18n","internationalization","localization","l10n","translation","extract","sync","cli","transloco","angular","primeng","zero-dependency","missing-translations","orphan-keys","plugin"],"author":{"url":"https://github.com/Abdess","name":"Abdessamad DERRAZ"},"license":"MIT","_id":"@abdess76/i18nkit@1.0.3","maintainers":[{"name":"abdess76","email":"derraz.abdessamad@gmail.com"}],"homepage":"https://github.com/Abdess/i18nkit#readme","bugs":{"url":"https://github.com/Abdess/i18nkit/issues"},"bin":{"i18nkit":"bin/cli.js"},"dist":{"shasum":"187744572bf1f8100022d4790241216176edb2f6","tarball":"https://registry.npmjs.org/@abdess76/i18nkit/-/i18nkit-1.0.3.tgz","fileCount":48,"integrity":"sha512-+ehI/ICdDU/e3tegmtUS4VZiomr6IXj1Q8xfwBOFlFMKoUpdnaOgPQ8l3ai+TN+iWyaI5Nd4sl5e/GoDykGPGg==","signatures":[{"sig":"MEUCIEdshtQaCKZZn3cqrsROTTcR0EPvry2OZXvOv8CLLAvUAiEAgvd0uQP5Pm9cAykt5i4TUpXFvU3ffIIRKENDJCeIP5k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abdess76%2fi18nkit@1.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":154340},"main":"./bin/cli.js","type":"commonjs","types":"./types/index.d.ts","engines":{"npm":">=10.0.0","node":">=22.0.0"},"exports":{".":{"types":"./types/index.d.ts","default":"./bin/cli.js"},"./package.json":"./package.json"},"funding":{"url":"https://github.com/sponsors/Abdess","type":"github"},"gitHead":"819ca4d07af9c13d856985b88c39c35c352092ed","scripts":{"docs":"jsdoc -c jsdoc.json","lint":"eslint .","test":"node --test tests/**/*.test.js","format":"prettier --write .","prepack":"npm run validate","prepare":"husky","release":"npm version patch && npm publish","version":"npm run format && git add -A","lint:fix":"eslint . --fix","validate":"npm run lint && npm run format:check && npm run typecheck && npm test","typecheck":"tsc --noEmit","docs:serve":"npx serve docs/api","test:watch":"node --test --watch tests/**/*.test.js","postversion":"git push && git push --tags","format:check":"prettier --check .","test:coverage":"node --test --experimental-test-coverage tests/**/*.test.js","prepublishOnly":"npm run validate"},"_npmUser":{"name":"abdess76","email":"derraz.abdessamad@gmail.com"},"devEngines":{"runtime":{"name":"node","onFail":"error","version":">=22.0.0"},"packageManager":{"name":"npm","onFail":"warn","version":">=10.0.0"}},"repository":{"url":"git+https://github.com/Abdess/i18nkit.git","type":"git"},"_npmVersion":"10.9.4","description":"Universal i18n CLI - extract translation keys, sync language files, detect missing translations. Extensible plugin architecture.","directories":{},"lint-staged":{"*.js":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"sideEffects":false,"_nodeVersion":"22.21.1","publishConfig":{"access":"public","registry":"https://registry.npmjs.org/","provenance":true},"_hasShrinkwrap":false,"packageManager":"npm@10.9.2","devDependencies":{"husky":"^9.1.7","jsdoc":"^4.0.4","eslint":"^9.17.0","globals":"^15.14.0","prettier":"^3.4.2","@eslint/js":"^9.17.0","typescript":"^5.7.2","@types/node":"^22.10.2","lint-staged":"^15.3.0","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/i18nkit_1.0.3_1767606892989_0.18094938100261904","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@abdess76/i18nkit","version":"1.0.5","description":"Universal i18n CLI - extract translation keys, sync language files, detect missing translations. Extensible plugin architecture.","author":{"name":"Abdessamad DERRAZ","url":"https://github.com/Abdess"},"license":"MIT","type":"commonjs","exports":{".":{"types":"./types/index.d.ts","default":"./bin/cli.js"},"./package.json":"./package.json"},"bin":{"i18nkit":"bin/cli.js"},"main":"./bin/cli.js","types":"./types/index.d.ts","sideEffects":false,"engines":{"node":">=22.0.0","npm":">=10.0.0"},"devEngines":{"runtime":{"name":"node","version":">=22.0.0","onFail":"error"},"packageManager":{"name":"npm","version":">=10.0.0","onFail":"warn"}},"packageManager":"npm@10.9.2","publishConfig":{"provenance":true,"access":"public","registry":"https://registry.npmjs.org/"},"keywords":["i18n","internationalization","localization","l10n","translation","extract","sync","cli","transloco","angular","primeng","zero-dependency","missing-translations","orphan-keys","plugin"],"repository":{"type":"git","url":"git+https://github.com/Abdess/i18nkit.git"},"bugs":{"url":"https://github.com/Abdess/i18nkit/issues"},"homepage":"https://github.com/Abdess/i18nkit#readme","funding":{"type":"github","url":"https://github.com/sponsors/Abdess"},"scripts":{"test":"node --test tests/**/*.test.js","test:coverage":"node --test --experimental-test-coverage tests/**/*.test.js","test:watch":"node --test --watch tests/**/*.test.js","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write .","format:check":"prettier --check .","typecheck":"tsc --noEmit","validate":"npm run lint && npm run format:check && npm run typecheck && npm test","docs":"jsdoc -c jsdoc.json","docs:serve":"npx serve docs/api","prepare":"husky","prepublishOnly":"npm run validate","prepack":"npm run validate","version":"npm run format && git add -A","postversion":"git push && git push --tags","release":"npm version patch && npm publish"},"devDependencies":{"@eslint/js":"^9.17.0","@types/node":"^22.10.2","clean-jsdoc-theme":"^4.3.0","eslint":"^9.17.0","globals":"^15.14.0","husky":"^9.1.7","jsdoc":"^4.0.4","lint-staged":"^15.3.0","prettier":"^3.4.2","typescript":"^5.7.2"},"lint-staged":{"*.js":["eslint --fix","prettier --write"],"*.{json,md,yml,yaml}":["prettier --write"]},"gitHead":"c7808042b946308bd3feaea10cc7f249d1b3b7f6","_id":"@abdess76/i18nkit@1.0.5","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-oBQXFw0M4gDvCMjKCdfIddNQoUF3abhKyhO9xiCvQGaKjY2cokGC/q9poXDI6S1mcqhi//wPGpEmkEMhuUcyHA==","shasum":"c22f75998e46ed8a97b4ab0acf97b166a5ae66e0","tarball":"https://registry.npmjs.org/@abdess76/i18nkit/-/i18nkit-1.0.5.tgz","fileCount":56,"unpackedSize":202563,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDbg8EvI7SMpLWgM3HZmnTimmvgmEggyNOqi0u5pLlcPgIgQxTzv5pAu/yKpTUnVKIj5S6FifaHLJeISgXpot4m1ws="}]},"_npmUser":{"name":"abdess76","email":"derraz.abdessamad@gmail.com"},"directories":{},"maintainers":[{"name":"abdess76","email":"derraz.abdessamad@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/i18nkit_1.0.5_1767634384939_0.8515085311522279"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-05T08:24:19.621Z","modified":"2026-01-05T17:33:05.312Z","1.0.0":"2026-01-05T08:24:19.880Z","1.0.1":"2026-01-05T08:30:45.115Z","1.0.2":"2026-01-05T09:31:12.162Z","1.0.3":"2026-01-05T09:54:53.132Z","1.0.5":"2026-01-05T17:33:05.086Z"},"bugs":{"url":"https://github.com/Abdess/i18nkit/issues"},"author":{"name":"Abdessamad DERRAZ","url":"https://github.com/Abdess"},"license":"MIT","homepage":"https://github.com/Abdess/i18nkit#readme","keywords":["i18n","internationalization","localization","l10n","translation","extract","sync","cli","transloco","angular","primeng","zero-dependency","missing-translations","orphan-keys","plugin"],"repository":{"type":"git","url":"git+https://github.com/Abdess/i18nkit.git"},"description":"Universal i18n CLI - extract translation keys, sync language files, detect missing translations. Extensible plugin architecture.","maintainers":[{"name":"abdess76","email":"derraz.abdessamad@gmail.com"}],"readme":"# i18nkit\n\n![i18nkit](assets/logo-with-title.png)\n\n[![npm](https://img.shields.io/npm/v/@abdess76/i18nkit.svg)](https://npmjs.com/package/@abdess76/i18nkit)\n[![node](https://img.shields.io/badge/node-%3E%3D22-brightgreen.svg)](https://nodejs.org)\n[![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![zero-deps](https://img.shields.io/badge/dependencies-0-blue.svg)](package.json)\n[![docs](https://img.shields.io/badge/API-docs-blue.svg)](https://abdess.github.io/i18nkit/)\n\n---\n\nUniversal i18n toolkit: extract translation keys, sync language files, detect\nmissing translations. Zero dependencies, extensible via plugins.\n\n## Why i18nkit?\n\nManaging translations is tedious: find hardcoded strings, create translation\nkeys, keep language files in sync. **i18nkit automates it.**\n\n| Problem                          | Solution                       |\n| -------------------------------- | ------------------------------ |\n| Hardcoded strings in templates   | Auto-extract translatable text |\n| Manual pipe/function replacement | Auto-apply in one command      |\n| Missing translations across lang | Sync check with CI integration |\n| Unused keys bloating bundles     | Orphan detection to clean up   |\n| Manual translation copy-paste    | API translation (free + pro)   |\n\n## Current Support\n\n- **Angular + Transloco** - Full support out of the box\n- **PrimeNG components** - Auto-extraction of translatable attributes\n\nExtensible via plugins for other frameworks and libraries.\n\n## Quick Start\n\n### 1. Install\n\n```bash\nnpm install --save-dev @abdess76/i18nkit\n```\n\n### 2. Add scripts to package.json\n\n```json\n{\n  \"scripts\": {\n    \"i18n\": \"i18nkit --lang fr --merge\",\n    \"i18n:apply\": \"i18nkit --auto-apply --init-langs en,fr\",\n    \"i18n:check\": \"i18nkit --check-sync --strict\",\n    \"i18n:orphans\": \"i18nkit --find-orphans --strict\",\n    \"i18n:translate\": \"i18nkit --translate en:fr\",\n    \"i18n:watch\": \"i18nkit --watch\",\n    \"i18n:ci\": \"npm run i18n:check && npm run i18n:orphans\"\n  }\n}\n```\n\n### 3. Run\n\n```bash\n# First time: extract + apply + create language files\nnpm run i18n:apply\n\n# Development: watch mode\nnpm run i18n:watch\n\n# Before commit / CI\nnpm run i18n:ci\n```\n\n## How It Works\n\n**Before:**\n\n```html\n<h1>Welcome to our app</h1>\n<button label=\"Submit\" />\n<input placeholder=\"Enter your name\" />\n```\n\n**After:**\n\n```html\n<h1>{{ 'home.titles.welcome_to_our_app' | transloco }}</h1>\n<button [label]=\"'home.buttons.submit' | transloco\" />\n<input [placeholder]=\"'home.forms.enter_your_name' | transloco\" />\n```\n\n**Generated `en.json`:**\n\n```json\n{\n  \"home\": {\n    \"titles\": { \"welcome_to_our_app\": \"Welcome to our app\" },\n    \"buttons\": { \"submit\": \"Submit\" },\n    \"forms\": { \"enter_your_name\": \"Enter your name\" }\n  }\n}\n```\n\n## Commands\n\n### Core Commands\n\n| Command        | Description                              |\n| -------------- | ---------------------------------------- |\n| `extract`      | Extract i18n strings from source files   |\n| `check-sync`   | Compare language files for missing keys  |\n| `find-orphans` | Find translation keys not used in source |\n| `translate`    | Translate a language file via API        |\n| `watch`        | Watch for file changes and re-run        |\n| `backup`       | Manage backup sessions and restore files |\n\n### NPM Scripts Examples\n\n| Script                   | Command                     | Description                  |\n| ------------------------ | --------------------------- | ---------------------------- |\n| `npm run i18n`           | `--lang fr --merge`         | Extract, merge with existing |\n| `npm run i18n:apply`     | `--auto-apply --init-langs` | Extract + replace + create   |\n| `npm run i18n:check`     | `--check-sync --strict`     | Validate files are in sync   |\n| `npm run i18n:orphans`   | `--find-orphans --strict`   | Find unused keys             |\n| `npm run i18n:translate` | `--translate en:fr`         | Translate via API            |\n| `npm run i18n:watch`     | `--watch`                   | Re-run on file changes       |\n\n## Configuration\n\nCreate `i18nkit.config.js` in your project root:\n\n```javascript\nmodule.exports = {\n  src: 'src/app',\n  i18nDir: 'src/assets/i18n',\n  lang: 'fr',\n  format: 'nested',\n  backup: true,\n  excludedFolders: ['node_modules', 'dist', '.git'],\n};\n```\n\nOr `i18nkit.config.json`:\n\n```json\n{\n  \"src\": \"src/app\",\n  \"i18nDir\": \"src/assets/i18n\",\n  \"lang\": \"fr\",\n  \"format\": \"nested\"\n}\n```\n\n## Supported Patterns\n\n### HTML Templates\n\n| Pattern      | Example                            |\n| ------------ | ---------------------------------- |\n| Text content | `<h1>Welcome</h1>`                 |\n| Attributes   | `alt`, `title`, `placeholder`      |\n| Angular 17+  | `@if`, `@for`, `@switch`, `@defer` |\n\n### Component Libraries\n\n| Library          | Extracted Attributes         |\n| ---------------- | ---------------------------- |\n| PrimeNG          | `label`, `tooltip`, `header` |\n| Angular Material | `placeholder`, `label`       |\n| Bootstrap        | `title`, `alt`               |\n\n## Translation APIs\n\n```bash\n# Free: MyMemory API\nnpm run i18n:translate\n\n# Free with higher rate limit\nnpx i18nkit --translate fr:en --email you@example.com\n\n# Pro: DeepL API (best quality)\nDEEPL_API_KEY=xxx npx i18nkit --translate fr:en --deepl\n```\n\n## CI/CD Integration\n\n### GitHub Actions\n\n```yaml\nname: i18n\non: [push, pull_request]\n\njobs:\n  validate:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: actions/setup-node@v4\n        with:\n          node-version: 22\n      - run: npm ci\n      - run: npm run i18n:ci\n```\n\n## Backup & Restore\n\nSource files are backed up before modification. Full session management with\nrestore, cleanup, and audit capabilities.\n\n### Automatic Backup\n\n```bash\n# Backup enabled by default with --auto-apply\nnpm run i18n:apply\n\n# Disable backup if needed\nnpx i18nkit --auto-apply --no-backup\n\n# Initialize backup structure explicitly\nnpx i18nkit --init-backups --auto-gitignore\n```\n\n### Session Structure\n\n```text\n.i18nkit/\n├── .gitignore              # Auto-managed (excludes backups/, report.json)\n├── report.json             # Current extraction report\n└── backups/\n    └── 2026-01-05_15-39-28_apply_ae9c/\n        ├── manifest.json   # Session metadata with status tracking\n        ├── report.json     # Archived extraction report\n        └── src/            # Original source files\n```\n\n### Session Management\n\n```bash\n# List all backup sessions\nnpx i18nkit --list-backups\n\n# Show detailed info for a session\nnpx i18nkit --backup-info 2026-01-05_15-39-28_apply_ae9c\n```\n\n### Restore from Backup\n\n```bash\n# Restore specific session\nnpx i18nkit --restore 2026-01-05_15-39-28_apply_ae9c\n\n# Restore latest session\nnpx i18nkit --restore-latest\n\n# Preview restore without applying\nnpx i18nkit --restore-latest --dry-run\n```\n\n### Manual Cleanup\n\n```bash\n# Clean old sessions (interactive)\nnpx i18nkit --cleanup-backups\n\n# Keep only last 5 sessions\nnpx i18nkit --cleanup-backups --keep 5\n\n# Remove sessions older than 7 days\nnpx i18nkit --cleanup-backups --max-age 7\n\n# Combine options\nnpx i18nkit --cleanup-backups --keep 3 --max-age 14\n```\n\n### Auto-Cleanup Configuration\n\nOld sessions are automatically cleaned up based on configuration.\n\n```javascript\n// i18nkit.config.js\nmodule.exports = {\n  backup: {\n    enabled: true,\n    maxSessions: 10, // Keep max 10 sessions\n    retentionDays: 30, // Delete sessions older than 30 days\n    autoCleanup: true, // Auto-cleanup on each run\n  },\n};\n```\n\n### Session Status\n\nSessions track their lifecycle status:\n\n| Status        | Description                      |\n| ------------- | -------------------------------- |\n| `pending`     | Session created, not started     |\n| `backing_up`  | Backup in progress               |\n| `in_progress` | Apply operation running          |\n| `completed`   | Successfully finished            |\n| `failed`      | Error occurred (check manifest)  |\n| `restored`    | Files restored from this session |\n\n## Key Mapping\n\nOverride auto-generated keys with `.i18n-keys.json`:\n\n```json\n{\n  \"Welcome to our app\": \"common.welcome\",\n  \"Submit\": \"buttons.submit\",\n  \"Cancel\": \"buttons.cancel\"\n}\n```\n\n## Plugin System\n\ni18nkit is built to be extended. Create plugins for any framework, library, or\ntranslation service.\n\n| Plugin Type  | Purpose                    | Example Use Case   |\n| ------------ | -------------------------- | ------------------ |\n| **parser**   | Extract strings from files | Vue, Svelte, React |\n| **adapter**  | Transform to i18n syntax   | i18next, vue-i18n  |\n| **provider** | Translate via API          | Google, AWS, Azure |\n\n### Quick Example\n\n```javascript\n// plugins/my-parser.js\nmodule.exports = {\n  name: 'parser-vue',\n  type: 'parser',\n  meta: { description: 'Extract from Vue SFC' },\n  extensions: ['.vue'],\n  detect: ctx => ctx.pkg.dependencies?.['vue'],\n  extract(content) {\n    return [{ text: 'Hello', context: 'greeting' }];\n  },\n};\n```\n\n```javascript\n// i18nkit.config.js\nmodule.exports = {\n  plugins: ['./plugins/my-parser.js'],\n};\n```\n\n**Full guide:** [PLUGINS.md](PLUGINS.md)\n\n### Community Plugins\n\nPublish your plugin to npm:\n\n```bash\nnpm publish i18nkit-parser-svelte\n```\n\ni18nkit auto-discovers packages named `i18nkit-*` or `@yourorg/i18nkit-*`.\n\n**Want to contribute?** Check [builtin plugins](bin/plugins/) for reference\nimplementations.\n\n## Options\n\n### Global Options\n\n```text\n--config <path>       Path to config file (default: i18nkit.config.js)\n--src <path>          Source directory (default: src/app)\n--locales <path>      Locales directory (default: src/assets/i18n)\n--default-lang <code> Default language (default: fr)\n--dry-run             Preview changes without writing\n--verbose             Detailed output\n--help, -h            Show help\n--version, -v         Show version\n```\n\n### Extraction Options\n\n```text\n--lang <code>         Language code for output file\n--format <type>       Output format: nested | flat (default: nested)\n--merge               Merge with existing translations\n--auto-apply          Extract AND apply pipes in one command\n--init-langs <codes>  Create language files (e.g., en,fr,es)\n--include-translated  Include already translated strings\n--extract-ts-objects  Extract from TypeScript object literals\n--skip-translated     Skip already translated strings (default: true)\n```\n\n### Validation Options\n\n```text\n--check-sync          Compare language files for missing keys\n--find-orphans        Find unused translation keys\n--strict              Exit with error code 1 on issues\n--ci                  CI mode (strict + json output)\n```\n\n### Translation Options\n\n```text\n--translate <src:tgt> Translate via API (e.g., fr:en)\n--deepl               Use DeepL API (requires DEEPL_API_KEY)\n--mymemory            Use MyMemory API (default)\n--email <email>       Email for MyMemory rate limits\n```\n\n### Backup Options\n\n```text\n--backup              Enable backup before modifications (default)\n--no-backup           Disable backup\n--list-backups        List all backup sessions\n--backup-info <id>    Show backup session details\n--restore [id]        Restore from backup (latest if no id)\n--restore-latest      Restore from most recent backup\n--cleanup-backups     Remove old backup sessions\n--keep <n>            Keep last n sessions (default: 10)\n--max-age <days>      Max session age in days (default: 30)\n--init-backups        Initialize backup directory structure\n--auto-gitignore      Auto-add .i18nkit to .gitignore\n```\n\n### Watch Options\n\n```text\n--watch               Watch mode for file changes\n```\n\n## Exit Codes\n\n| Code | Meaning                                            |\n| ---- | -------------------------------------------------- |\n| 0    | Success                                            |\n| 1    | Missing translations or sync problems (`--strict`) |\n| 2    | Error (file not found, parse error)                |\n\n## API Documentation\n\nFull API reference:\n[abdess.github.io/i18nkit](https://abdess.github.io/i18nkit/)\n\n## Requirements\n\n- Node.js >= 22.0.0\n\n## Contributing\n\ni18nkit welcomes community contributions:\n\n- **Plugins** - Create parsers for new frameworks, adapters for i18n libraries,\n  or providers for translation APIs\n- **Bug reports** - Open an issue with reproduction steps\n- **Feature requests** - Suggest improvements via GitHub issues\n\nSee [PLUGINS.md](PLUGINS.md) for the plugin development guide.\n\n## License\n\nMIT\n\n---\n\n[GitHub](https://github.com/Abdess/i18nkit) ·\n[npm](https://npmjs.com/package/@abdess76/i18nkit) ·\n[Issues](https://github.com/Abdess/i18nkit/issues) · [Plugin Guide](PLUGINS.md)\n","readmeFilename":"README.md"}