{"_id":"@composy/i18n-vanilla","name":"@composy/i18n-vanilla","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"@composy/i18n-vanilla","version":"0.0.1","description":"Vanilla JavaScript DOM adapter for @composy/i18n-core.","keywords":["i18n","internationalization","localization","vanilla","dom","typescript"],"author":{"name":"ldesign"},"license":"MIT","type":"module","sideEffects":false,"exports":{".":{"types":"./es/index.d.ts","import":"./es/index.js","require":"./lib/index.cjs","default":"./es/index.js"},"./dom":{"types":"./es/dom/index.d.ts","import":"./es/dom/index.js","require":"./lib/dom/index.cjs","default":"./es/dom/index.js"},"./dom/*":{"types":"./es/dom/*.d.ts","import":"./es/dom/*.js","require":"./lib/dom/*.cjs","default":"./es/dom/*.js"},"./package.json":"./package.json"},"main":"./lib/index.cjs","module":"./es/index.js","types":"./es/index.d.ts","unpkg":"./dist/index.min.js","jsdelivr":"./dist/index.min.js","dependencies":{"@composy/i18n-core":"^0.0.1","tslib":"^2.8.1"},"devDependencies":{"@antfu/eslint-config":"9.1.0","@composy/builder":"^0.0.1","@composy/testing":"^0.0.1","@types/node":"26.1.1","eslint":"10.7.0","jsdom":"29.1.1","rimraf":"^6.1.3","typescript":"5.9.3"},"publishConfig":{"access":"public"},"typings":"./es/index.d.ts","browser":"./dist/index.js","scripts":{"build":"ldesign-builder build","build:watch":"ldesign-builder build --watch","clean":"rimraf es esm lib dist coverage .tsbuildinfo tsconfig.tsbuildinfo","dev":"ldesign-builder build --watch","lint":"eslint \"src/**/*.ts\" --fix","lint:check":"eslint \"src/**/*.ts\"","lint:fix":"eslint \"src/**/*.ts\" --fix","test":"ltesting run:unit","test:coverage":"ltesting run:unit --coverage","test:run":"ltesting run:unit","test:watch":"ltesting run:unit --watch","test:changed":"ltesting run:unit --changed","test:failed":"ltesting run:unit --failed","test:ui":"ltesting dashboard","type-check":"tsc --noEmit","type-check:watch":"tsc --noEmit --watch","postbuild":"node --experimental-strip-types ../../../../scripts/index.ts workspace:ensure-package-outputs --cwd .. --target vanilla && node --experimental-strip-types ../../../../scripts/index.ts clean:packages-source-declarations --cwd .. --target packages/vanilla","release":"pnpm publish --no-git-checks"},"_id":"@composy/i18n-vanilla@0.0.1","_integrity":"sha512-5IXay1Iu3gr9SikB2cuzIPUiGo9jxDY9x3qbaTX3Jp+8OZ352a9cfOtfb4N4jr0wjcvXKAZTCS0YyCE6MRRMdQ==","_resolved":"D:\\migrated\\Temp\\ffc623e1268e15f53b495de3dea48427\\composy-i18n-vanilla-0.0.1.tgz","_from":"file:composy-i18n-vanilla-0.0.1.tgz","_nodeVersion":"22.23.1","_npmVersion":"10.9.8","dist":{"integrity":"sha512-5IXay1Iu3gr9SikB2cuzIPUiGo9jxDY9x3qbaTX3Jp+8OZ352a9cfOtfb4N4jr0wjcvXKAZTCS0YyCE6MRRMdQ==","shasum":"54b60d1f0dc3ce3baa1fc1aa829dad596aca1053","tarball":"https://registry.npmjs.org/@composy/i18n-vanilla/-/i18n-vanilla-0.0.1.tgz","fileCount":3,"unpackedSize":5348,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC5X3uvKO6SIO7dY9g24LYdLkSg3kYDVk0lbEftGFIRCgIhALRQ92lVx0R8koJVpTli5657B/LtS4NchXlOCoAU147b"}]},"_npmUser":{"name":"swimly","email":"979741120@qq.com"},"directories":{},"maintainers":[{"name":"swimly","email":"979741120@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/i18n-vanilla_0.0.1_1787105360196_0.34063518825592043"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-19T02:09:20.024Z","0.0.1":"2026-08-19T02:09:20.350Z","modified":"2026-08-19T02:09:20.550Z"},"maintainers":[{"name":"swimly","email":"979741120@qq.com"}],"description":"Vanilla JavaScript DOM adapter for @composy/i18n-core.","keywords":["i18n","internationalization","localization","vanilla","dom","typescript"],"author":{"name":"ldesign"},"license":"MIT","readme":"# @composy/i18n-vanilla\r\n\r\n`@composy/i18n-vanilla` 是 `@composy/i18n-core`\r\n的原生 JavaScript 适配层。它不重复实现翻译、缓存或语言包加载，只提供安全、可销毁的 DOM 绑定能力。\r\n\r\n## 安装\r\n\r\n```bash\r\npnpm add @composy/i18n-core @composy/i18n-vanilla\r\n```\r\n\r\n## 快速开始\r\n\r\n```ts\r\nimport { bindDocumentLocale, bindI18n, createI18n } from '@composy/i18n-vanilla'\r\n\r\nconst i18n = createI18n({\r\n  locale: 'en',\r\n  messages: {\r\n    en: { action: { save: 'Save' } },\r\n    zh: { action: { save: '保存' } },\r\n  },\r\n})\r\n\r\nconst contentBinding = bindI18n(i18n, document.querySelector('#app')!)\r\nconst documentBinding = bindDocumentLocale(i18n)\r\n\r\nawait i18n.setLocale('zh')\r\n\r\n// 卸载页面或替换根节点时释放订阅。\r\ncontentBinding.destroy()\r\ndocumentBinding.destroy()\r\n```\r\n\r\n```html\r\n<button data-i18n=\"action.save\" data-i18n-attr=\"title:action.save;aria-label:action.save\"></button>\r\n```\r\n\r\n## 边界\r\n\r\n- 翻译、回退、插值、缓存和语言包加载全部来自 `@composy/i18n-core`。\r\n- `bindI18n()` 默认只写入 `textContent`，不会注入 HTML。\r\n- 需要翻译属性时，使用明确的 `data-i18n-attr`\r\n  映射；事件、样式和 URL 类属性会被拒绝，避免将翻译文本变成可执行或可加载的内容。\r\n- 每个绑定都可通过 `destroy()` 释放。\r\n- Vue 的组件、指令和 Composition API 继续归属 `@composy/i18n-vue`。\r\n\r\n## 验证\r\n\r\n```bash\r\npnpm --dir packages/vanilla run type-check\r\npnpm --dir packages/vanilla run test:run\r\npnpm --dir packages/vanilla run build\r\n```\r\n","readmeFilename":"README.md","_rev":"1-031b8f067fbec6ddd67622986ed36a4f"}