{"_id":"@embra/i18n","_rev":"11-e03518b8670208f81a35e4d7f81d2a03","name":"@embra/i18n","dist-tags":{"latest":"0.1.0"},"versions":{"0.0.1":{"name":"@embra/i18n","version":"0.0.1","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.1","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"79414971dfe70157359878a0ffe09bb9334e4b45","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.1.tgz","fileCount":24,"integrity":"sha512-MIsugRDGTVtp2CvLN+V5lgXGdL+V2Gj4o+Nyw3FmQJRhLpIzUHZroEXwSR5pYvDWiFjCnVChMt5cmebnFRLYMw==","signatures":[{"sig":"MEUCIEZkfw7txvloogHrkqnd+a6RmEZ294kLaPRGQenDHRWcAiEA/cmGB4EWlaRJhIlKgyVbrlXt8uwXFCG9NXvDMppSdKg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63011},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.ts","default":"./dist/react.js"}}},"gitHead":"33f318f4da80bc201aea841c336a79410623c3bc","scripts":{"docs":"typedoc --options typedoc.json && prettier --ignore-path .prettierignore --write docs && export-size-svg","lint":"eslint && prettier --check .","test":"vitest","build":"tsup --config tsup.config.ts && tsup --config tsup.react.config.ts","release":"commit-and-tag-version","test:ci":"vitest --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"eslint --fix && prettier --write .","ts-check":"tsc --noEmit","test:coverage":"vitest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"straybugs","email":"straybugs@gmail.com"},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"10.9.3","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","typesVersions":{"*":{"react":["dist/react.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","react":"^19.2.0","eslint":"^9.37.0","vitest":"^3.2.2","typedoc":"^0.28.13","prettier":"^3.6.2","react-dom":"^19.2.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/react":"^19.2.0","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.0","@embra/reactivity":"^0.0.4","@vitest/coverage-v8":"^3.2.4","vite-tsconfig-paths":"^5.1.4","@wopjs/eslint-config":"^0.1.42","@testing-library/react":"^16.3.0","commit-and-tag-version":"^12.6.0"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.1_1759684271298_0.12150875221453239","host":"s3://npm-registry-packages-npm-production"}},"0.0.2":{"name":"@embra/i18n","version":"0.0.2","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.2","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"7b06ebbbcc75a772165b62a9df4e327f1d0afe74","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.2.tgz","fileCount":24,"integrity":"sha512-Uo2bK66C139+zcC17qBqYEQS9Z5lt4iSS8wWky7ZUlMIg1C1WLhS9xSvHPqAXMEZFpXJcmyn0CriaLJFd9EwRQ==","signatures":[{"sig":"MEQCIAm5BQCp+78faBYsdoegih5/krcu/GJC6RIlsjxsAd3EAiAnxtUba8onpaxcTCBxqw2L2fnEwESTyg6aW0nUoWPccg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63620},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.ts","default":"./dist/react.js"}}},"gitHead":"ca55e1a49e693d0ca7f04f05bd58f68604209d65","scripts":{"docs":"typedoc --options typedoc.json && prettier --ignore-path .prettierignore --write docs && export-size-svg","lint":"eslint && prettier --check .","test":"vitest","build":"tsup --config tsup.config.ts && tsup --config tsup.react.config.ts","release":"commit-and-tag-version","test:ci":"vitest --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"eslint --fix && prettier --write .","ts-check":"tsc --noEmit","test:coverage":"vitest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"straybugs","email":"straybugs@gmail.com"},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"10.9.3","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","typesVersions":{"*":{"react":["dist/react.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","react":"^19.2.0","eslint":"^9.37.0","vitest":"^3.2.2","typedoc":"^0.28.13","prettier":"^3.6.2","react-dom":"^19.2.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/react":"^19.2.0","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.0","@embra/reactivity":"^0.0.4","@vitest/coverage-v8":"^3.2.4","vite-tsconfig-paths":"^5.1.4","@wopjs/eslint-config":"^0.1.42","@testing-library/react":"^16.3.0","commit-and-tag-version":"^12.6.0"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.2_1759925398166_0.412629573873309","host":"s3://npm-registry-packages-npm-production"}},"0.0.3":{"name":"@embra/i18n","version":"0.0.3","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.3","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"1dfe16db0c4cedcf0d733e8199b2e8d813ef5b49","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.3.tgz","fileCount":24,"integrity":"sha512-mslooCSOh2+aP+6AoNVBGClCQP2PbRSR5ivZcKRellaCsQmvBr0IDgloLHfHOnUxtTbmkaYjydzfjswerRm0fg==","signatures":[{"sig":"MEQCIGbBYVnoeY1/lqh1NKGUpF2pJIYlWRtoWTxhKBe5dz4DAiANTmKjbNEv3UZL3g4/88JFRnkeWt894burzeXAPw6c6w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":63590},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.ts","default":"./dist/react.js"}}},"gitHead":"caf071bf00c566a766c070a349940ac4a3d4813b","scripts":{"docs":"typedoc --options typedoc.json && prettier --ignore-path .prettierignore --write docs && export-size-svg","lint":"eslint && prettier --check .","test":"vitest","build":"tsup --config tsup.config.ts && tsup --config tsup.react.config.ts","release":"commit-and-tag-version","test:ci":"vitest --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"eslint --fix && prettier --write .","ts-check":"tsc --noEmit","test:coverage":"vitest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"straybugs","email":"straybugs@gmail.com"},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"10.9.3","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","typesVersions":{"*":{"react":["dist/react.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","react":"^19.2.0","eslint":"^9.37.0","vitest":"^3.2.2","typedoc":"^0.28.13","prettier":"^3.6.2","react-dom":"^19.2.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/react":"^19.2.0","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.0","@embra/reactivity":"^0.0.4","@vitest/coverage-v8":"^3.2.4","vite-tsconfig-paths":"^5.1.4","@wopjs/eslint-config":"^0.1.42","@testing-library/react":"^16.3.0","commit-and-tag-version":"^12.6.0"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.3_1759926627598_0.6408013730567224","host":"s3://npm-registry-packages-npm-production"}},"0.0.4":{"name":"@embra/i18n","version":"0.0.4","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.4","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"28da00c654abcc37b253fa03bb6e4d2910149757","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.4.tgz","fileCount":24,"integrity":"sha512-o0Q+RsW5VxDWwQ6aCd3CgcyDsEWGxejPFp8DmrUGXHv6uCgrPzt184Ocswpuj3/4C+3ItvnaGr4t+Zr8eHiqqA==","signatures":[{"sig":"MEUCIQDjBuO3b+OGMVuKftrolIKf+/Sjubuu8fQvBs/RvgiTTAIgf5WnkVUYEvlikNGMkX6IjMrgAjxwbXfWYf+q5fmcNXo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":65625},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.ts","default":"./dist/react.js"}}},"gitHead":"511de13a9ad9596ae976316db09fc7ca432daaa7","scripts":{"docs":"typedoc --options typedoc.json && prettier --ignore-path .prettierignore --write docs && export-size-svg","lint":"eslint && prettier --check .","test":"vitest","build":"tsup --config tsup.config.ts && tsup --config tsup.react.config.ts","release":"commit-and-tag-version","test:ci":"vitest --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"eslint --fix && prettier --write .","ts-check":"tsc --noEmit","test:coverage":"vitest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"straybugs","email":"straybugs@gmail.com"},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"10.9.3","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"22.20.0","typesVersions":{"*":{"react":["dist/react.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.0","react":"^19.2.0","eslint":"^9.37.0","vitest":"^3.2.2","typedoc":"^0.28.13","prettier":"^3.6.2","react-dom":"^19.2.0","typescript":"^5.9.3","@types/node":"^24.6.2","@types/react":"^19.2.0","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.0","@embra/reactivity":"^0.0.4","@vitest/coverage-v8":"^3.2.4","vite-tsconfig-paths":"^5.1.4","@wopjs/eslint-config":"^0.1.42","@testing-library/react":"^16.3.0","commit-and-tag-version":"^12.6.0"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.4_1760085911985_0.17862413556148216","host":"s3://npm-registry-packages-npm-production"}},"0.0.5":{"name":"@embra/i18n","version":"0.0.5","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.5","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"b62f07351bcd2cad8f0dbdee3e70e045cc5688c6","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.5.tgz","fileCount":24,"integrity":"sha512-ZsgNRn4pClkFkMQVZ/OC0r9LDsGA+qiIFCCoIrPgx2kwPY+Yc6ZNN1RGCCoe3P+2UKuU7MgNUUWqBmEyDUF+Lw==","signatures":[{"sig":"MEUCIQCIiMYC0uB02Tbwi7+KJt5H2ILAWW/v8tYysDeoMJ1JWQIgAZ0Noq43qzjodDiS2LHHOncZmDg9rmRuujxCy7m13EI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":68035},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.ts","default":"./dist/react.js"}}},"gitHead":"e78042a6fb4e5f68b9e4d161bd86c91477963079","scripts":{"docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","lint":"biome check","test":"vitest","build":"tsup --config tsup.config.ts && tsup --config tsup.react.config.ts","lint:ci":"biome ci","release":"commit-and-tag-version","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"biome check --write","ts-check":"tsc --noEmit","ts-watch":"tsc --noEmit -w","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"11.9.0","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","typesVersions":{"*":{"react":["dist/react.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^28.1.0","react":"^19.2.4","vitest":"^4.0.6","typedoc":"^0.28.17","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.3.5","@types/react":"^19.2.14","@biomejs/biome":"^2.4.4","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.3","@wopjs/gzip-size":"^0.1.5","@embra/reactivity":"^0.0.7","@vitest/coverage-v8":"^4.0.18","vite-tsconfig-paths":"^6.1.1","@wopjs/eslint-config":"^0.1.61","@testing-library/react":"^16.3.2","commit-and-tag-version":"^12.6.1"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.5_1773137097872_0.9677759670738153","host":"s3://npm-registry-packages-npm-production"}},"0.0.6":{"name":"@embra/i18n","version":"0.0.6","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.6","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"c52312b6be681f69ba59b3fdba02479dd2fadd1c","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.6.tgz","fileCount":24,"integrity":"sha512-YCfYo2LF9s8IdEy3iQwLTbLeaa6TmjVhzLv9eSTf5xzrpmKxahfrrm9CE9h6TQYf3Cugf53dWgt/OnI9/f6xLQ==","signatures":[{"sig":"MEQCIG8jHTYqvykgYjhbMlYBmkoWIFPL5Zxzd3hsq60v7OTOAiBSg1DPDwCytoJF2lI76/GilM87ZsblnT2ONjEWLmm1WQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":69072},"main":"./dist/index.js","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.ts","default":"./dist/index.js"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.ts","default":"./dist/react.js"}}},"gitHead":"157968c206e2910ac38e121d96823c1d4891d630","scripts":{"docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","lint":"biome check","test":"vitest","build":"tsup --config tsup.config.ts && tsup --config tsup.react.config.ts","lint:ci":"biome ci","release":"commit-and-tag-version","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"biome check --write","ts-check":"tsc --noEmit","ts-watch":"tsc --noEmit -w","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"11.9.0","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.0","typesVersions":{"*":{"react":["dist/react.d.ts"]}},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.5.1","jsdom":"^28.1.0","react":"^19.2.4","vitest":"^4.0.6","typedoc":"^0.28.17","react-dom":"^19.2.4","typescript":"^5.9.3","@types/node":"^25.3.5","@types/react":"^19.2.14","@biomejs/biome":"^2.4.4","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.3","@wopjs/gzip-size":"^0.1.5","@embra/reactivity":"^0.0.7","@vitest/coverage-v8":"^4.0.18","vite-tsconfig-paths":"^6.1.1","@wopjs/eslint-config":"^0.1.61","@testing-library/react":"^16.3.2","commit-and-tag-version":"^12.6.1"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.6_1773224825363_0.4964633086646133","host":"s3://npm-registry-packages-npm-production"}},"0.0.7":{"name":"@embra/i18n","version":"0.0.7","keywords":["internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.7","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"5bed2d14230c776cca2a520d28cd715dbbb57b45","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.7.tgz","fileCount":20,"integrity":"sha512-NVp0Ka02oxp4CpPJgkPT6KupjVWxC98WcFA8hERFTBjeIJRB8KfJL6mwvXKtU8KZ5+KEAwqzlKGdDo4W+yTDLQ==","signatures":[{"sig":"MEYCIQDoUDwzMjbF0ilTthPTNDh2NKSRbqtnY+FtuWWlKrWazwIhALBgTCvyeAnWmWloF8rXaIa6jh9xpmyT2LLSLOOOQ3eJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":55959},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.cts","default":"./dist/react.cjs"}}},"gitHead":"bc55a6489fd60708d2b50b150b8bfcd3fd96ae1a","scripts":{"docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","lint":"biome check","test":"vitest","build":"tsdown --config tsdown.config.ts && tsdown --config tsdown.react.config.ts","lint:ci":"biome ci","release":"commit-and-tag-version","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"biome check --write","ts-check":"tsc --noEmit","ts-watch":"tsc --noEmit -w","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"11.11.0","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","typesVersions":{"*":{"react":["dist/react.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"jsdom":"^29.0.1","react":"^19.2.4","tsdown":"^0.21.7","vitest":"^4.0.6","typedoc":"^0.28.18","react-dom":"^19.2.4","typescript":"^6.0.2","@types/node":"^25.5.0","@types/react":"^19.2.14","@biomejs/biome":"^2.4.10","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.3","@embra/reactivity":"^0.0.7","@vitest/coverage-v8":"^4.1.2","vite-tsconfig-paths":"^6.1.1","@testing-library/react":"^16.3.2","commit-and-tag-version":"^12.7.1"},"peerDependencies":{"react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.7_1775204318445_0.266333315730902","host":"s3://npm-registry-packages-npm-production"}},"0.0.8":{"name":"@embra/i18n","version":"0.0.8","keywords":["astro","astro-component","internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.8","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"908568461bea565fb7d2414889728edc5aaccf04","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.8.tgz","fileCount":24,"integrity":"sha512-ilnIkpu6UQfLE+4GDEO9hKx6bqTvPR571XsiipfK55bWQgCJ02G+RwSHjHpHTr6Haoiy/AbiPHTBs3UXh1pWdw==","signatures":[{"sig":"MEQCIA0205q5OILeF77CDHdwvkD3W3odkPrq/kzt5fycHPlCAiBfL38cnTXnv4D/TXDbgaZkj9clMuw321zVHcNTZyJW+Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":62074},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./astro":{"types":"./src/astro/index.d.ts","import":"./src/astro/index.js","default":"./src/astro/index.js"},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.cts","default":"./dist/react.cjs"}},"./astro/Trans.astro":"./src/astro/Trans.astro"},"gitHead":"f3c56f91663571044c49110ba9718813358001d2","scripts":{"docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","lint":"biome check","test":"vitest","build":"tsdown --config tsdown.config.ts && tsdown --config tsdown.react.config.ts","lint:ci":"biome ci","release":"commit-and-tag-version","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"biome check --write","ts-check":"tsc --noEmit","ts-watch":"tsc --noEmit -w","astro-check":"astro-check --minimumSeverity error","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"11.13.0","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","typesVersions":{"*":{"react":["dist/react.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"astro":"^6.4.0","jsdom":"^29.1.1","react":"^19.2.5","tsdown":"^0.21.10","vitest":"^4.0.6","typedoc":"^0.28.19","react-dom":"^19.2.5","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@astrojs/check":"^0.9.9","@biomejs/biome":"^2.4.13","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.3","@embra/reactivity":"^0.0.8","@vitest/coverage-v8":"^4.1.5","@testing-library/react":"^16.3.2","commit-and-tag-version":"^12.7.1"},"peerDependencies":{"astro":">=4.0.0","react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"astro":{"optional":true},"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.8_1779992728129_0.3050690824984055","host":"s3://npm-registry-packages-npm-production"}},"0.0.9":{"name":"@embra/i18n","version":"0.0.9","keywords":["astro","astro-component","internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.9","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"42d252a6a05d355cdbe2d711af2e1581c60111e7","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.9.tgz","fileCount":24,"integrity":"sha512-tzNR7u72SRtsrKUCggA7lxt+T+OPLr+OW0w+5ZpgRynELQCsADYvnlwplL461IznfHBKwpcYmajHAEi1HAhutw==","signatures":[{"sig":"MEUCIQCsGzkN+QyDPfcIVY0CTWoi5g6retTkL0/mdaV9/VHrYQIgCL26NHrhYbMheVqnxDNQ/t0DodRjxh8VzW3BKsai7Eg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":62311},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./astro":{"types":"./src/astro/index.d.ts","import":"./src/astro/index.js","default":"./src/astro/index.js"},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.cts","default":"./dist/react.cjs"}},"./astro/Trans.astro":"./src/astro/Trans.astro"},"gitHead":"971e4dee3d6f316c3805688eed4e6dd58885762f","scripts":{"docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","lint":"biome check","test":"vitest","build":"tsdown --config tsdown.config.ts && tsdown --config tsdown.react.config.ts","lint:ci":"biome ci","release":"commit-and-tag-version","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"biome check --write","ts-check":"tsc --noEmit","ts-watch":"tsc --noEmit -w","astro-check":"astro-check --minimumSeverity error","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"11.13.0","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","typesVersions":{"*":{"react":["dist/react.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"astro":"^6.4.0","jsdom":"^29.1.1","react":"^19.2.5","tsdown":"^0.21.10","vitest":"^4.0.6","typedoc":"^0.28.19","react-dom":"^19.2.5","typescript":"^6.0.3","@types/node":"^25.6.0","@types/react":"^19.2.14","@astrojs/check":"^0.9.9","@biomejs/biome":"^2.4.13","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.3","@embra/reactivity":"^0.0.8","@vitest/coverage-v8":"^4.1.5","@testing-library/react":"^16.3.2","commit-and-tag-version":"^12.7.1"},"peerDependencies":{"astro":">=4.0.0","react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"astro":{"optional":true},"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.9_1780216671904_0.9164881816724455","host":"s3://npm-registry-packages-npm-production"}},"0.0.10":{"name":"@embra/i18n","version":"0.0.10","keywords":["astro","astro-component","internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"author":{"url":"https://github.com/crimx/","name":"CRIMX","email":"straybugs@gmail.com"},"license":"MIT","_id":"@embra/i18n@0.0.10","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"homepage":"https://github.com/embrajs/i18n#readme","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"dist":{"shasum":"39ca942f044abb232781d6c56217b8be7735ee42","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.0.10.tgz","fileCount":24,"integrity":"sha512-fp/F+dEQtPnqMh5T+hb5kGPU9xguwmrjUZuCMW3z8kdVUWQr6dek+36sqoVBXsYAb/zdd3L5D2i1W2Zv7CQg1A==","signatures":[{"sig":"MEQCIEFj8mYZDdplkDnJRzIym4lRxwDA0Ke6Io2D5E57eJi7AiA8J/RmTUZh/2zaF14q6DnsofBmGH1gB3M5Fy3h4kWSpQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":64674},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.cts","module":"./dist/index.mjs","exports":{".":{"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./astro":{"types":"./src/astro/index.d.ts","import":"./src/astro/index.js","default":"./src/astro/index.js"},"./react":{"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"},"require":{"types":"./dist/react.d.cts","default":"./dist/react.cjs"}},"./astro/Trans.astro":"./src/astro/Trans.astro"},"gitHead":"c17668b2c7e4d16fec94ae511c4b4cdf46032755","scripts":{"docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","lint":"biome check","test":"vitest","build":"tsdown --config tsdown.config.ts && tsdown --config tsdown.react.config.ts","lint:ci":"biome ci","release":"commit-and-tag-version","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","lint:fix":"biome check --write","ts-check":"tsc --noEmit","ts-watch":"tsc --noEmit -w","astro-check":"astro-check --minimumSeverity error","test:coverage":"vitest run --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"repository":{"url":"git+https://github.com/embrajs/i18n.git","type":"git"},"_npmVersion":"11.13.0","description":"A lightweight, reactive internationalization library.","directories":{},"sideEffects":false,"_nodeVersion":"24.16.0","typesVersions":{"*":{"react":["dist/react.d.cts"]}},"_hasShrinkwrap":false,"devDependencies":{"astro":"^6.4.2","jsdom":"^29.1.1","react":"^19.2.7","tsdown":"^0.22.1","vitest":"^4.0.6","typedoc":"^0.28.19","react-dom":"^19.2.7","typescript":"^6.0.3","@types/node":"^25.9.1","@types/react":"^19.2.16","@astrojs/check":"^0.9.9","@biomejs/biome":"^2.4.16","export-size-svg":"^0.0.7","@types/react-dom":"^19.2.3","@embra/reactivity":"^0.0.8","@vitest/coverage-v8":"^4.1.8","@testing-library/react":"^16.3.2","commit-and-tag-version":"^12.7.3"},"peerDependencies":{"astro":">=4.0.0","react":">=18.0.0","@types/react":">=18.0.0","@embra/reactivity":"<=1"},"peerDependenciesMeta":{"astro":{"optional":true},"react":{"optional":true},"@types/react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/i18n_0.0.10_1780388118051_0.9596816334866707","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@embra/i18n","version":"0.1.0","description":"A lightweight, reactive internationalization library.","repository":{"type":"git","url":"git+https://github.com/embrajs/i18n.git"},"type":"module","main":"./dist/index.cjs","module":"./dist/index.mjs","types":"./dist/index.d.cts","typesVersions":{"*":{"react":["dist/react.d.cts"]}},"exports":{".":{"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"},"import":{"types":"./dist/index.d.mts","default":"./dist/index.mjs"}},"./react":{"require":{"types":"./dist/react.d.cts","default":"./dist/react.cjs"},"import":{"types":"./dist/react.d.mts","default":"./dist/react.mjs"}},"./astro":{"types":"./src/astro/index.d.ts","import":"./src/astro/index.js","default":"./src/astro/index.js"},"./astro/Trans.astro":"./src/astro/Trans.astro"},"sideEffects":false,"author":{"name":"CRIMX","email":"straybugs@gmail.com","url":"https://github.com/crimx/"},"scripts":{"prepublishOnly":"npm run build","lint":"biome check","lint:fix":"biome check --write","lint:ci":"biome ci","ts-check":"tsc --noEmit","astro-check":"astro-check --minimumSeverity error","ts-watch":"tsc --noEmit -w","docs":"typedoc --options typedoc.json && biome format --write --config-path=biome.docs.json --files-ignore-unknown=true docs && export-size-svg","test":"vitest","test:coverage":"vitest run --coverage","test:ci":"vitest run --coverage --coverage.reportsDirectory='./docs/coverage'","build":"tsdown --config tsdown.config.ts && tsdown --config tsdown.react.config.ts","release":"commit-and-tag-version"},"keywords":["astro","astro-component","internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"license":"MIT","devDependencies":{"@astrojs/check":"^0.9.9","@biomejs/biome":"^2.5.1","@embra/reactivity":"^0.0.8","@testing-library/react":"^16.3.2","@types/node":"^26.0.1","@types/react":"^19.2.17","@types/react-dom":"^19.2.3","@vitest/coverage-v8":"^4.1.9","astro":"^7.1.3","commit-and-tag-version":"^12.7.3","export-size-svg":"^0.0.7","jsdom":"^29.1.1","react":"^19.2.7","react-dom":"^19.2.7","tsdown":"^0.22.3","typedoc":"^0.28.19","typescript":"^6.0.3","vitest":"^4.0.6"},"peerDependencies":{"@embra/reactivity":"<=1","@types/react":">=18.0.0","astro":">=4.0.0","react":">=18.0.0"},"peerDependenciesMeta":{"@types/react":{"optional":true},"astro":{"optional":true},"react":{"optional":true}},"gitHead":"20e76f078bc77d9ad3ceebfc76462d3369cfaf7d","_id":"@embra/i18n@0.1.0","bugs":{"url":"https://github.com/embrajs/i18n/issues"},"homepage":"https://github.com/embrajs/i18n#readme","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-hUTwk6UtuWxAFmHmchsojcjNsip9I7O/uLC8wv0kPg33vDfRyvZMFSqlwAX8/QrcN5BH37CqjwAxdmCUtbNIag==","shasum":"9e7ea882c157562fbf49974b834f2d5766ca3ef6","tarball":"https://registry.npmjs.org/@embra/i18n/-/i18n-0.1.0.tgz","fileCount":24,"unpackedSize":65007,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@embra%2fi18n@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAxvUEg5OP+spxEyC3cao7McqbtMVW+/nKjrLuGgFLRXAiEA122bXOYr9uhe8hvRu0dw1P22QmIDzXFCPAcn4PbDyeQ="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:3f70ad9f-72ab-436e-99ca-36c09bbeed77"}},"directories":{},"maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/i18n_0.1.0_1784775176650_0.03585627907679978"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-05T17:11:11.093Z","modified":"2026-07-23T02:52:57.166Z","0.0.1":"2025-10-05T17:11:11.490Z","0.0.2":"2025-10-08T12:09:58.334Z","0.0.3":"2025-10-08T12:30:27.805Z","0.0.4":"2025-10-10T08:45:12.181Z","0.0.5":"2026-03-10T10:04:58.068Z","0.0.6":"2026-03-11T10:27:05.507Z","0.0.7":"2026-04-03T08:18:38.635Z","0.0.8":"2026-05-28T18:25:28.278Z","0.0.9":"2026-05-31T08:37:52.034Z","0.0.10":"2026-06-02T08:15:18.187Z","0.1.0":"2026-07-23T02:52:56.811Z"},"bugs":{"url":"https://github.com/embrajs/i18n/issues"},"author":{"name":"CRIMX","email":"straybugs@gmail.com","url":"https://github.com/crimx/"},"license":"MIT","homepage":"https://github.com/embrajs/i18n#readme","keywords":["astro","astro-component","internationalization","i18n","translation","localization","l10n","globalization","gettext","observable","react","reactive"],"repository":{"type":"git","url":"git+https://github.com/embrajs/i18n.git"},"description":"A lightweight, reactive internationalization library.","maintainers":[{"name":"straybugs","email":"straybugs@gmail.com"}],"readme":"# [@embra/i18n](https://github.com/embrajs/i18n)\n\n<p align=\"center\">\n  <img width=\"200\" src=\"https://raw.githubusercontent.com/embrajs/i18n/main/assets/logo.svg\">\n</p>\n\n[![Docs](https://img.shields.io/badge/Docs-read-%23fdf9f5)](https://embrajs.github.io/i18n)\n[![Build Status](https://github.com/embrajs/i18n/actions/workflows/build.yml/badge.svg)](https://github.com/embrajs/i18n/actions/workflows/build.yml)\n[![npm-version](https://img.shields.io/npm/v/@embra/i18n.svg)](https://www.npmjs.com/package/@embra/i18n)\n[![Coverage Status](https://embrajs.github.io/i18n/coverage-badges/@embra/i18n.svg)](https://embrajs.github.io/i18n/coverage/)\n\nA lightweight, reactive internationalization library.\n\n![export size](https://embrajs.github.io/i18n/assets/export-size.svg)\n\n## Install\n\n```bash\nnpm add @embra/reactivity @embra/i18n\n```\n\n## Features\n\n- Subscribable reactive `lang$`, `t$` and `locales$`.\n- Lightweight and fast `t()` translation.\n- Nested locale messages.\n- Message formatting and pluralization.\n- Easy dynamic locale loading.\n- Locale namespaces.\n- First-class React support.\n\n## Usage\n\nCreate an I18n instance with static locales:\n\n```ts\nimport { I18n, type Locales } from \"@embra/i18n\";\n\nconst locales: Locales = {\n  en: {\n    stock: {\n      fruit: \"apple\",\n    },\n  },\n};\n\nconst i18n = new I18n(\"en\", locales);\ni18n.t(\"stock.fruit\"); // apple\n\n// add more locales later\nconst zhCN = await import(`./locales/zh-CN.json`);\ni18n.addLocale(\"zh-CN\", zhCN);\n\n// or replace all locales manually\nconst zhTW = await import(`./locales/zh-TW.json`);\ni18n.locales$.set({ \"zh-TW\": zhTW });\n```\n\nYou can also create an `I18n` instance with preloaded dynamic locales:\n\n```ts\nimport { I18n } from \"@embra/i18n\";\n\nconst i18n = await I18n.preload(\"en\", lang => import(`./locales/${lang}.json`));\n// Locale `./locales/en.json` is preloaded\n\nawait i18n.switchLang(\"zh-CN\"); // Locale `./locales/zh-CN.json` is loaded\n```\n\n### Detect Language\n\nYou can detect language of browser/nodejs via `detectLang`. [BCP 47 tags and sub-tags](https://www.rfc-editor.org/rfc/rfc4647.html#section-3.4) are supported.\n\n```ts\nimport { detectLang } from \"@embra/i18n\";\n\ndetectLang(); // \"en-US\"\n\nconst i18n = await I18n.preload(\n  // language sub-tag is matched\n  detectLang([\"en\", \"zh-CN\"]) || \"zh-TW\", // \"en\"\n  lang => import(`./locales/${lang}.json`),\n);\n```\n\n### Message Formatting\n\nMessage keys are surrounded by double curly brackets:\n\n```ts\nimport { I18n, type Locales } from \"@embra/i18n\";\n\nconst locales: Locales = {\n  en: {\n    stock: {\n      fruit: \"apple\",\n    },\n    fav_fruit: \"I love {{fruit}}\",\n  },\n};\n\nconst i18n = new I18n(\"en\", locales);\nconst fruit = i18n.t(\"stock.fruit\"); // apple\ni18n.t(\"fav_fruit\", { fruit }); // I love apple\n```\n\nPlaceholders without a corresponding value are preserved. This allows the remaining placeholders to be processed later, such as by the [`Trans` component](#trans-component):\n\n```ts\ni18n.t(\"fav_fruit\", {}); // I love {{fruit}}\n```\n\nIt also works with array:\n\n```ts\nimport { I18n, type Locales } from \"@embra/i18n\";\n\nconst locales: Locales = {\n  en: {\n    fav_fruit: \"I love {{0}} and {{1}}\",\n  },\n};\n\nconst i18n = new I18n(\"en\", locales);\ni18n.t(\"fav_fruit\", [\"apple\", \"banana\"]); // I love apple and banana\n```\n\n### Pluralization\n\nYou can easily do pluralization with [Modifier Matching](#modifier-matching).\n\n```ts\nimport { I18n, type Locales } from \"@embra/i18n\";\n\nconst locales: Locales = {\n  en: {\n    apple: \"{{@}} apples\", // fallback\n    \"apple@0\": \"No apple\", // matching { \"@\": 0 } or { \"@\": \"0\" }\n    \"apple@1\": \"An apple\", // matching { \"@\": 1 } or { \"@\": \"1\" }\n  },\n};\n\nconst i18n = new I18n(\"en\", locales);\ni18n.t(\"apples\", { \"@\": 0 }); // No apple\ni18n.t(\"apples\", { \"@\": 1 }); // An apple\ni18n.t(\"apples\", { \"@\": 3 }); // 3 apples\n```\n\n### Modifier Matching\n\nYou can use `@` to match different modifiers.\n\nFor example:\n\n```ts\ni18n.t(\"a.b.c\", { \"@\": \"d\" });\n```\n\nIt will look for `\"a.b.c@d\"` and fallback to `\"a.b.c\"` if not found.\n\nSee [Pluralization](#pluralization) for more examples.\n\n### Reactive I18n\n\n`i18n.lang$`, `i18n.t$` and `i18n.locales$` are subscribable values.\n\nSee [@embra/reactivity](https://github.com/embrajs/reactivity) for more details.\n\n```js\ni18n.lang$.reaction(lang => {\n  // logs lang on changed\n  console.log(lang);\n});\n\ni18n.lang$.subscribe(lang => {\n  // logs lang immediately and on changed\n  console.log(lang);\n});\n```\n\n### Namespace\n\nI18n instance is cheap to create. You can create multiple instances for different namespaces.\n\n```ts\nimport { I18n } from \"@embra/i18n\";\n\n// Module Login\nasync function moduleLogin() {\n  const i18n = await I18n.preload(\"en\", lang => import(`./locales/login/${lang}.json`));\n\n  console.log(i18n.t(\"password\"));\n}\n\n// Module About\nasync function moduleAbout() {\n  const i18n = await I18n.preload(\"en\", lang => import(`./locales/about/${lang}.json`));\n\n  console.log(i18n.t(\"author\"));\n}\n```\n\n## Hot Module Replacement\n\nTo use [Vite HMR](https://vitejs.dev/guide/api-hmr.html) for locales:\n\n```ts\nconst i18n = await I18n.preload(\"en\", lang => import(`./locales/${lang}.json`));\n\nif (import.meta.hot) {\n  import.meta.hot.accept([\"./locales/en.json\", \"./locales/zh-CN.json\"], ([en, zhCN]) => {\n    i18n.locales$.set({\n      ...i18n.locales,\n      en: en?.default || i18n.locales.en,\n      \"zh-CN\": zhCN?.default || i18n.locales[\"zh-CN\"],\n    });\n  });\n}\n```\n\n## Dynamic Import\n\nAlthough you can simply use `import()` to dynamically load locales, with bundler API you can do more.\n\nFor example with Vite you can use [glob import](https://vitejs.dev/guide/features.html#glob-import) to statically get info of all locales.\nThis way allows you to add or remove locales without changing source code.\n\n```ts\nimport { I18n, detectLang, type Locale, type LocaleLang } from \"@embra/i18n\";\n\nexport const i18nLoader = (): Promise<I18n> => {\n  const localeModules = import.meta.glob<boolean, string, Locale>(\"./locales/*.json\", { import: \"default\" });\n\n  const localeLoaders = Object.keys(localeModules).reduce(\n    (loaders, path) => {\n      if (localeModules[path]) {\n        const langMatch = path.match(/\\/([^/]+)\\.json$/);\n        if (langMatch) {\n          loaders[langMatch[1]] = localeModules[path];\n        }\n      }\n      return loaders;\n    },\n    {} as Record<LocaleLang, () => Promise<Locale>>,\n  );\n\n  const langs = Object.keys(localeLoaders);\n\n  return I18n.preload(detectLang(langs) || (localeLoaders.en ? \"en\" : langs[0]), lang => localeLoaders[lang]());\n};\n```\n\n## React\n\n- `<I18nProvider>` to provide `i18n` context for descendant components.\n- `useTranslate` hook to subscribe and get the latest `i18n.t`.\n- `useLang` hook to subscribe and get the latest `i18n.lang`.\n- `useI18n` hook to subscribe and get the latest `i18n` instance.\n- `<Trans>` component to insert React elements into translation template messages.\n\n```tsx\nimport { I18n } from \"@embra/i18n\";\nimport { I18nProvider, useTranslate } from \"@embra/i18n/react\";\n\nconst i18n = new I18n(\"en\", { en: { fruit: \"apple\" } });\n\nconst MyComponent = () => {\n  const t = useTranslate();\n  return <div>{t(\"fruit\")}</div>;\n};\n\nconst App = () => {\n  return (\n    <I18nProvider i18n={i18n}>\n      <MyComponent />\n    </I18nProvider>\n  );\n};\n```\n\n### Cascading I18nProvider\n\nYou can nest multiple `<I18nProvider>`s to create cascading i18n contexts.\n\n```tsx\nimport { I18n } from \"@embra/i18n\";\nimport { I18nProvider, useTranslate } from \"@embra/i18n/react\";\n\nconst baseI18n = new I18n(\"en\", { en: { confirm: \"Confirm\" } });\nconst loginI18n = new I18n(\"en\", { en: { login: \"Login\" } });\n\nconst MyComponent = () => {\n  const t = useTranslate();\n  return (\n    <div>\n      <button>{t(\"confirm\")}</button>\n      <button>{t(\"login\")}</button>\n    </div>\n  );\n};\n\nconst App = () => {\n  return (\n    <I18nProvider i18n={baseI18n}>\n      <I18nProvider i18n={loginI18n}>\n        <MyComponent />\n      </I18nProvider>\n    </I18nProvider>\n  );\n};\n```\n\n### Trans Component\n\nTo insert React elements into the translation message:\n\n```tsx\nimport { I18n, I18nProvider } from \"@embra/i18n\";\nimport { Trans, useTranslate } from \"@embra/i18n/react\";\n\nconst locales = {\n  en: {\n    author: \"CRIMX\",\n    fruit: \"apple\",\n    eat: \"{{name}} eats {{fruit}}.\",\n  },\n};\n\nconst i18n = new I18n(\"en\", locales);\n\nconst MyComponent = () => {\n  const t = useTranslate();\n\n  return (\n    <Trans message={t(\"eat\")}>\n      <strong data-t-slot=\"name\">{t(\"author\")}</strong>\n      <i style={{ color: \"red\" }} data-t-slot=\"fruit\">\n        {t(\"fruit\")}\n      </i>\n    </Trans>\n  );\n};\n\nconst App = () => {\n  return (\n    <I18nProvider i18n={i18n}>\n      <MyComponent />\n    </I18nProvider>\n  );\n};\n```\n\n↓Outputs:\n\n```tsx\n<>\n  <strong data-t-slot=\"name\">CRIMX</strong> eats <i style={{ color: \"red\" }} data-t-slot=\"fruit\">apple</i>.\n<>\n```\n\n`data-t-slot` can be ignored if there is only one placeholder.\n\n```tsx\n<Trans message=\"a{{b}}c\">\n  <h1>B</h1>\n</Trans>\n```\n\n↓Outputs:\n\n```tsx\n<>\n  a<h1>B</h1>c\n</>\n```\n\n## Astro\n\nFor static Astro pages, create cached translation helpers and get `t` from the route language:\n\n```astro\n---\nimport { createStaticI18n } from \"@embra/i18n/astro\";\n\nconst locales = {\n  en: {\n    title: \"Fruit stock\",\n    author: \"CRIMX\",\n    fruit: \"apple\",\n    eat: \"{{name}} eats {{fruit}}.\",\n  },\n  zh: {\n    title: \"水果库存\",\n    author: \"CRIMX\",\n    fruit: \"苹果\",\n    eat: \"{{name}} 吃 {{fruit}}。\",\n  },\n};\n\nconst { getT } = createStaticI18n({ locales, fallback: \"en\" });\nconst t = getT(Astro.params.lang);\n---\n\n<h1>{t(\"title\")}</h1>\n```\n\n`fallback` is used as the default language when `lang` is omitted and as the fallback language when a key is missing.\n\nUse the Astro `<Trans>` component when a translated message needs Astro slots:\n\n```astro\n---\nimport { createStaticI18n, Trans } from \"@embra/i18n/astro\";\n\nconst { getT } = createStaticI18n({ locales, fallback: \"en\" });\nconst t = getT(Astro.params.lang);\n---\n\n<Trans message={t(\"eat\")}>\n  <strong slot=\"name\">{t(\"author\")}</strong>\n  <i slot=\"fruit\" style=\"color: red\">{t(\"fruit\")}</i>\n</Trans>\n```\n\n↓Outputs:\n\n```html\n<strong>CRIMX</strong> eats <i style=\"color: red\">apple</i>.\n```\n\nThe default slot can be used when there is only one placeholder:\n\n```astro\n<Trans message=\"a{{b}}c\">\n  <strong>B</strong>\n</Trans>\n```\n\n`@embra/i18n/astro` is rendered by Astro at build time or on the server. It does not add client-side language switching by itself; use a framework island if the translated component needs to update in the browser.\n\n## VSCode Extension\n\n`@embra/i18n` is compatible with [i18n Ally](https://github.com/lokalise/i18n-ally), a popular VSCode extension for i18n. You can use it to manage your locale files.\n\n## For AI Coding Agents\n\n`@embra/i18n` includes an [llms.txt](./llms.txt) quick guide for AI coding agents.\n\nAdd this to `AGENTS.md` or `CLAUDE.md` in projects that should implement i18n with `@embra/i18n`:\n\n```md\nImplement internationalization with `@embra/i18n`. Usage reference: `node_modules/@embra/i18n/llms.txt`.\n```\n","readmeFilename":"README.md"}