{"_id":"@cookbook/solid-intl","_rev":"4-4ba591dcb6ca446d9030a8089e479d3a","name":"@cookbook/solid-intl","dist-tags":{"latest":"0.1.3"},"versions":{"0.1.0":{"name":"@cookbook/solid-intl","version":"0.1.0","keywords":["solid","i18n","internation","ssr"],"author":{"name":"Marcos Gonçalves","email":"contact@themgoncalves.com"},"license":"MIT","_id":"@cookbook/solid-intl@0.1.0","maintainers":[{"name":"themgoncalves","email":"contact@themgoncalves.com"}],"contributors":[],"homepage":"https://github.com/the-cookbook/solid-intl#readme","bugs":{"url":"https://github.com/the-cookbook/solid-intl/issues"},"dist":{"shasum":"2492ec52cf999e0536958a3920d005f3d3c2e204","tarball":"https://registry.npmjs.org/@cookbook/solid-intl/-/solid-intl-0.1.0.tgz","fileCount":23,"integrity":"sha512-GsLN0uMI2lGIpdCmAnGpuMGmfD1K/Cv6vekCL6jlETA+LoTXXD3hjNI7le85W/O4PAqwAzORP/F1v5r+To9HlQ==","signatures":[{"sig":"MEQCIGkPFst7ZP8ObB/kimzy85xqP9j8/kbz5d3KrvxGGvoVAiAb+j++QJlNPL9MsL2lBeEEvhWIS96PZqDw+UPmtDza5g==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":59964,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtYbwACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq3yw//dLcVDw7bEptYZfZ4mGaSoJgZPFA6zsP4CcB7MGJbXnhjLRoe\r\nGcylQWaFEdO1ljt/+fC6uNMG1udZx9vNaadxasuaAJOK9MfWeTB4J+/1SJad\r\nj2/O15/Pfns+liB8jvFEdq+f43josLjbFAqCcg+MxYDPQxU3QAp55s0Jb4+q\r\noWonGaVVE+0G8jIR1zcc9zaN11c4DSHQfU8J5tm9x6DGmFOlQTuTo3XKe9IO\r\nbKHX8myJcLMiYxzRDFuCnvuF7OZ0Sjnz30P+M+0hXJTxwzBT1RNYoYWPi0Om\r\nyU3F5GmCG5lr2yf8GQOdeCt69T7QiV0lJ6S6CL65Q62Ddf7a7ENfbfrZ+jvy\r\ncSr+27x3gupj3Hl6FwqxNZXgXEdD3cNcsYsUG/W8mFitOGAPJrwZez9UWzEb\r\njNN51Ci3uocyNP7kspHJs1UFA17B3QGd2NvQq9tCrftI8EfKj6xhuXX9bP/c\r\nviXJGmvAo1vyHiB+fS8urZ7/NM7ZihIYfVqECGtVp+oJO7DUsXpmKNIaxxWn\r\neZinl1Is/XS8Hv56e5sIZp3nLSHmNW/2N/lFbZ3N3jXQecIO9mxIiw0Pdy8c\r\nFPLUKnxDN0gN0xLJfqMFxy9/r3uC69bUVgEGDM8twmTFWtu1iGu5/zDU/MlD\r\ncrLqOpmcUlpe2Jyr06G/ErRblL+ofsMqUNk=\r\n=VrDr\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/cjs/index.js","type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"node":"./dist/cjs/index.js","solid":"./dist/source/index.js","import":"./dist/esm/index.js","browser":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"require":"./dist/cjs/index.js"}},"gitHead":"28d48d57f831e8be88f50865b08d8a3c1e387bf6","private":false,"scripts":{"dev":"vite serve dev","test":"vitest && npm run test:types","build":"rollup -c","format":"prettier -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"","typecheck":"tsc --noEmit","test:types":"tsc --project tsconfig.test.json","test:watch":"vitest --watch","update-deps":"taze -w && npm i","test:coverage":"vitest --coverage && npm run test:types","prepublishOnly":"npm run build"},"_npmUser":{"name":"themgoncalves","email":"contact@themgoncalves.com"},"repository":{"url":"git+https://github.com/the-cookbook/solid-intl.git","type":"git"},"_npmVersion":"8.5.5","description":"A universal internationalization (i18n) for Solid inspired by React Intl & FormatJS","directories":{},"sideEffects":false,"_nodeVersion":"16.15.0","dependencies":{"@formatjs/intl":"^2.6.3"},"_hasShrinkwrap":false,"packageManager":"pnpm@7.5.0","devDependencies":{"jest":"^29.3.1","taze":"^0.7.6","vite":"^3.0.4","jsdom":"^20.0.3","rollup":"^2.77.2","vitest":"^0.26.3","prettier":"^2.7.1","solid-js":"^1.4.8","babel-jest":"^29.3.1","solid-jest":"^0.2.0","typescript":"^4.7.4","@types/jest":"^29.2.5","vite-plugin-solid":"^2.5.0","regenerator-runtime":"^0.13.11","rollup-preset-solid":"^1.4.0","solid-testing-library":"^0.5.0","jest-environment-jsdom":"^29.3.1","@testing-library/jest-dom":"^5.16.5","@types/testing-library__jest-dom":"^5.14.5"},"peerDependencies":{"solid-js":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-intl_0.1.0_1672840944363_0.4458405995670507","host":"s3://npm-registry-packages"}},"0.1.1":{"name":"@cookbook/solid-intl","version":"0.1.1","keywords":["solid","i18n","internation","ssr"],"author":{"name":"Marcos Gonçalves","email":"contact@themgoncalves.com"},"license":"MIT","_id":"@cookbook/solid-intl@0.1.1","maintainers":[{"name":"themgoncalves","email":"contact@themgoncalves.com"}],"contributors":[],"homepage":"https://github.com/the-cookbook/solid-intl#readme","bugs":{"url":"https://github.com/the-cookbook/solid-intl/issues"},"dist":{"shasum":"fac028cd35e8d11457d15c462f58f9c4835520ea","tarball":"https://registry.npmjs.org/@cookbook/solid-intl/-/solid-intl-0.1.1.tgz","fileCount":21,"integrity":"sha512-dcaUWIJLzw9gWvq9Ye0BP/xfNj6JFRhYuwGEBjIr52IvDheou5sbsOR9wLVzcumNB+sLC9VAfYaK0v9JWBH1Jg==","signatures":[{"sig":"MEUCIQDrhUZMnsVZWToB5O8csaZDFBhyWN4WKOrUS6ilUH26dQIgGZaCwA3+KgkejMTa8H+Q4fgEdOxl9SjOHx6i375+WTY=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":46047,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjtZWiACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrA5g//Tkj7bLCc+zFjMXfPhwGuO4OenNyZh8VV3rmoFnEBbRR4T2mB\r\nvuev/vS39gqzJKuuOOdctwUFdvN33E3aIoPlCSMpKMiXTTccAWFkif9wXyBy\r\ncUdUm4CjaJMSB/MfEWHV3r8jfMpfQTNJU2MnOC7aLMfR2MYxqBuCOItosRZx\r\nV07tsnx224lqWAS4GTg1CQGNQWhdbh54v6Ukr3WyTw5YpQ2BkZIROYMXx/yY\r\n5ubNLPO1pmkNY/8LALUXwEzytznIFOe8Onz1r/bBYKWBSyc7FJJUKtwZuj6F\r\nQkpuYeL5ML7KFyeacttJvQD9fJE1s/9sqx24I5gsZ5XdlPLOato9Hyfbdzrg\r\nHUHrJz2tBYOZmdZIFzXqnEVDJRCASBFvh1rseOYYJ9oCehBAXowUAqoEtFbA\r\nI0hsJv3TyYuuVz8SLzOK2FB9M6qSIsy5nQEa0FtdsRCnFSBexTac4F43ILYS\r\nozdSjgu7E3iotucmN8kB/VI5ws0WLsSRn4Zg7V7PxGJv/2boKkSYUFwDaCIQ\r\nCNxKkl4KbiVt1b90L31Q68BhPSTmxwpzKbsOoEkXZpot4Icl4zd/lc7tQDn1\r\nNHxgziiq7x9u0NRFninwlSADizOK2g78nD5/9nZaD7zxN3lwizcGIVILooUT\r\nJzD9KdIWVMuFvlvcFMTT+vasEUdaNLnVKek=\r\n=GhBF\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/cjs/index.cjs","type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"node":"./dist/cjs/index.cjs","solid":"./dist/source/index.js","import":"./dist/esm/index.js","browser":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.cjs"},"require":"./dist/cjs/index.cjs"}},"gitHead":"bc430d43c4089f1adffc7e9957d062def21e76bb","private":false,"scripts":{"dev":"vite serve dev","test":"vitest && npm run test:types","build":"rollup -c","format":"prettier -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"","typecheck":"tsc --noEmit","test:types":"tsc --project tsconfig.test.json","test:watch":"vitest --watch","update-deps":"taze -w && npm i","test:coverage":"vitest --coverage && npm run test:types","prepublishOnly":"npm run build"},"_npmUser":{"name":"themgoncalves","email":"contact@themgoncalves.com"},"repository":{"url":"git+https://github.com/the-cookbook/solid-intl.git","type":"git"},"_npmVersion":"8.5.5","description":"A universal internationalization (i18n) for Solid inspired by React Intl & FormatJS","directories":{},"sideEffects":false,"_nodeVersion":"16.15.0","dependencies":{"@formatjs/intl":"^2.6.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@7.5.0","devDependencies":{"jest":"^29.3.1","taze":"^0.7.6","vite":"^3.0.4","jsdom":"^20.0.3","rollup":"^2.77.2","vitest":"^0.26.3","prettier":"^2.7.1","solid-js":"^1.4.8","babel-jest":"^29.3.1","solid-jest":"^0.2.0","typescript":"^4.7.4","@types/jest":"^29.2.5","vite-plugin-solid":"^2.5.0","regenerator-runtime":"^0.13.11","rollup-preset-solid":"^1.4.0","solid-testing-library":"^0.5.0","jest-environment-jsdom":"^29.3.1","@testing-library/jest-dom":"^5.16.5","@types/testing-library__jest-dom":"^5.14.5"},"peerDependencies":{"solid-js":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-intl_0.1.1_1672844706195_0.7132599281770369","host":"s3://npm-registry-packages"}},"0.1.2":{"name":"@cookbook/solid-intl","version":"0.1.2","keywords":["solid","i18n","internation","ssr"],"author":{"name":"Marcos Gonçalves","email":"contact@themgoncalves.com"},"license":"MIT","_id":"@cookbook/solid-intl@0.1.2","maintainers":[{"name":"themgoncalves","email":"contact@themgoncalves.com"}],"contributors":[{"url":"https://github.com/lvl-mattwells","name":"Matt Wells"}],"homepage":"https://github.com/the-cookbook/solid-intl#readme","bugs":{"url":"https://github.com/the-cookbook/solid-intl/issues"},"dist":{"shasum":"14a8f6af630f31127d83b89f194e3e68a4ccba0a","tarball":"https://registry.npmjs.org/@cookbook/solid-intl/-/solid-intl-0.1.2.tgz","fileCount":21,"integrity":"sha512-mrnm8MJ+rskAF0txqs0mxBU4tra3HAnoxjqlcGMH3Bnfkgj90HycpNND7bLYeCMsTQm93Kz5C1AidbHwoSYppA==","signatures":[{"sig":"MEYCIQCzSQ6VT3KwsCmmx8+jvPbcIE2f02v8bq5SXxinWfNa8wIhALXsXwlmJ/ZWQ9da/4DclssRlCXUioHc2zWRbDsUwawb","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":45284,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjwv4bACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrcuA/+K4XfmcLv1Y9efSQsiPVLg6kMNpHI8SNQ/3PhFznxcCiTz0z1\r\nylXtUy9iRV4FrM0gmLzlEwX/T6G5wiYjFDah6jmoOK5mNqx8OfB2oCvfQ9K2\r\nI2USpHue030H9xwCqW77l4G7snDt13MgY0pSkY+ejeYSN4Iiakax2LKRn0vo\r\nVimBkSgZYhlxQE3OySO0u2D08xUXncuDIkqk5dfTFdm0IWZHlL3+N+y+I3/D\r\n7p3gZ9zVfvbDl7D+vmO7cJYCxtta1jF3Bpu0niWwBgcRBVnLLh/SC+s2CtT6\r\n+fz18oakgsz5n9eImz7DQMlkGeTK+SoX8Dxv7WbNu4bm34g4UmmP4lbs3GVt\r\ncpL+h4kGcbwScrZFOFWzY+FoYPBhedfzTJFXeGsbdrk+mjMmVIPowKyl2zHF\r\nAkyXeaBZ4mXjwJZApqMYU+e2thdWTcHgaj6wEWMf9hM1ufAFNIgnoASXOkoy\r\nA2N9yYWm3Y+WeRrRjrIeoUQDPw5S/y3nOCoiCovFGS8KwleZsT9iCRK8jQ0W\r\n2oMXiusKdVbaUZK0YWfXJC6SLhde50T7sGBZX6aji+kg2FJVjcbjJ6H/gZh2\r\nmQuzHUYC8dzaVx4G+75A7oaIJZllU4iNL1AxogYbIL5mU3reea4XYVLov93y\r\nK7S87DvmdvHwr48y3O3QtU0YJXZELv4NdDQ=\r\n=C7vS\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/cjs/index.cjs","type":"module","types":"dist/types/index.d.ts","module":"dist/esm/index.js","exports":{".":{"node":"./dist/cjs/index.cjs","solid":"./dist/source/index.js","import":"./dist/esm/index.js","browser":{"import":"./dist/esm/index.js","require":"./dist/cjs/index.cjs"},"require":"./dist/cjs/index.cjs"}},"gitHead":"dcd2fb67511a334c57e6803e7565fdcc9597cefd","private":false,"scripts":{"dev":"vite serve dev","test":"vitest && npm run test:types","build":"rollup -c","format":"prettier -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"","typecheck":"tsc --noEmit","test:types":"tsc --project tsconfig.test.json","test:watch":"vitest --watch","update-deps":"taze -w && npm i","test:coverage":"vitest --coverage && npm run test:types","prepublishOnly":"npm run build"},"_npmUser":{"name":"themgoncalves","email":"contact@themgoncalves.com"},"repository":{"url":"git+https://github.com/the-cookbook/solid-intl.git","type":"git"},"_npmVersion":"8.5.5","description":"A universal internationalization (i18n) for Solid inspired by React Intl & FormatJS","directories":{},"sideEffects":false,"_nodeVersion":"16.15.0","dependencies":{"@formatjs/intl":"^2.6.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@7.5.0","devDependencies":{"jest":"^29.3.1","taze":"^0.7.6","vite":"^3.0.4","jsdom":"^20.0.3","rollup":"^2.77.2","vitest":"^0.26.3","prettier":"^2.7.1","solid-js":"^1.4.8","babel-jest":"^29.3.1","solid-jest":"^0.2.0","typescript":"^4.7.4","@types/jest":"^29.2.5","vite-plugin-solid":"^2.5.0","regenerator-runtime":"^0.13.11","rollup-preset-solid":"^1.4.0","solid-testing-library":"^0.5.0","jest-environment-jsdom":"^29.3.1","@testing-library/jest-dom":"^5.16.5","@types/testing-library__jest-dom":"^5.14.5"},"peerDependencies":{"solid-js":">=1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/solid-intl_0.1.2_1673723419249_0.6669746048019245","host":"s3://npm-registry-packages"}},"0.1.3":{"version":"0.1.3","name":"@cookbook/solid-intl","description":"A universal internationalization (i18n) for Solid inspired by React Intl & FormatJS","license":"MIT","author":{"name":"Marcos Gonçalves","email":"contact@themgoncalves.com"},"contributors":[{"name":"Matt Wells","url":"https://github.com/lvl-mattwells"},{"name":"Simon Shiki","url":"https://github.com/SimonShiki"}],"repository":{"type":"git","url":"git+https://github.com/the-cookbook/solid-intl.git"},"homepage":"https://github.com/the-cookbook/solid-intl#readme","bugs":{"url":"https://github.com/the-cookbook/solid-intl/issues"},"publishConfig":{"access":"public"},"private":false,"sideEffects":false,"type":"module","main":"dist/cjs/index.cjs","module":"dist/esm/index.js","types":"dist/types/index.d.ts","exports":{".":{"solid":"./dist/source/index.js","import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"browser":{"import":{"types":"./dist/types/index.d.ts","default":"./dist/esm/index.js"},"require":{"types":"./dist/types/index.d.ts","default":"./dist/cjs/index.cjs"}},"require":{"default":"./dist/cjs/index.cjs","types":"./dist/types/index.d.ts"},"node":{"default":"./dist/cjs/index.cjs","types":"./dist/types/index.d.ts"}}},"scripts":{"dev":"vite serve dev","test":"vitest && npm run test:types","test:watch":"vitest --watch","test:coverage":"vitest --coverage && npm run test:types","test:types":"tsc --project tsconfig.test.json","build":"rollup -c","prepublishOnly":"npm run build","format":"prettier -w \"src/**/*.{js,ts,json,css,tsx,jsx}\" \"dev/**/*.{js,ts,json,css,tsx,jsx}\"","update-deps":"taze -w && npm i","typecheck":"tsc --noEmit"},"peerDependencies":{"solid-js":">=1.0.0"},"devDependencies":{"@testing-library/jest-dom":"^5.16.5","@types/jest":"^29.2.5","@types/testing-library__jest-dom":"^5.14.5","babel-jest":"^29.3.1","jest":"^29.3.1","jest-environment-jsdom":"^29.3.1","jsdom":"^20.0.3","prettier":"^2.7.1","regenerator-runtime":"^0.13.11","rollup":"^2.77.2","rollup-preset-solid":"^1.4.0","solid-jest":"^0.2.0","solid-js":"^1.4.8","solid-testing-library":"^0.5.0","taze":"^0.7.6","typescript":"^4.7.4","vite":"^3.0.4","vite-plugin-solid":"^2.5.0","vitest":"^0.26.3"},"keywords":["solid","i18n","internation","ssr"],"dependencies":{"@formatjs/intl":"^2.6.3"},"packageManager":"pnpm@7.5.0","gitHead":"e457be0e4d762058e9fe544c3aafcd2464fc29e3","_id":"@cookbook/solid-intl@0.1.3","_nodeVersion":"16.20.1","_npmVersion":"8.19.4","dist":{"integrity":"sha512-K3oUbt/Aznt1hVN5abRe4Xh7OiK3sUCuK3ndg4a+lRrg5MfN6QlrtDpHRHTXCzksV3VuyqPR2tpVz+jBBEAeRQ==","shasum":"749782f1f5f065c598612bdc6c306fcef2083d4f","tarball":"https://registry.npmjs.org/@cookbook/solid-intl/-/solid-intl-0.1.3.tgz","fileCount":21,"unpackedSize":50326,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC3nW2Y7ch/9/urCDsYT/Fvo7SMwktSyl3//hYuwKriqQIhAM35yYynVZ12UE32fM29hkmkW+r1dt0Cj9xSi3aDRb/j"}]},"_npmUser":{"name":"themgoncalves","email":"contact@themgoncalves.com","actor":{"name":"themgoncalves","email":"contact@themgoncalves.com","type":"user"}},"directories":{},"maintainers":[{"name":"themgoncalves","email":"contact@themgoncalves.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/solid-intl_0.1.3_1751905463171_0.21759355648501155"},"_hasShrinkwrap":false}},"time":{"created":"2023-01-04T14:02:24.303Z","modified":"2025-07-07T16:24:23.563Z","0.1.0":"2023-01-04T14:02:24.569Z","0.1.1":"2023-01-04T15:05:06.370Z","0.1.2":"2023-01-14T19:10:19.457Z","0.1.3":"2025-07-07T16:24:23.370Z"},"bugs":{"url":"https://github.com/the-cookbook/solid-intl/issues"},"author":{"name":"Marcos Gonçalves","email":"contact@themgoncalves.com"},"license":"MIT","homepage":"https://github.com/the-cookbook/solid-intl#readme","keywords":["solid","i18n","internation","ssr"],"repository":{"type":"git","url":"git+https://github.com/the-cookbook/solid-intl.git"},"description":"A universal internationalization (i18n) for Solid inspired by React Intl & FormatJS","contributors":[{"name":"Matt Wells","url":"https://github.com/lvl-mattwells"},{"name":"Simon Shiki","url":"https://github.com/SimonShiki"}],"maintainers":[{"name":"themgoncalves","email":"contact@themgoncalves.com"}],"readme":"<p>\n  <img width=\"100%\" src=\"https://assets.solidjs.com/banner?type=solid-intl&background=tiles&project=%20\" alt=\"solid-intl\">\n</p>\n\n# Solid Intl\n\n[![pnpm][pnpm-image]][pnpm-url]\n[![NPM Version][npm-image]][npm-url]\n[![Downloads Stats][npm-downloads]][npm-url]\n[![GitHub stars][stars-image]][stars-url]\n[![Known Vulnerabilities][vulnerabilities-image]][vulnerabilities-url]\n[![GitHub issues][issues-image]][issues-url]\n[![Awesome][awesome-image]][awesome-url]\n\nA universal internationalization (i18n) for Solid inspired by React Intl & FormatJS.\n\n## Quick start\n\n### Install it:\n\n```bash\nnpm i @cookbook/solid-intl\n# or\nyarn add @cookbook/solid-intl\n# or\npnpm add @cookbook/solid-intl\n```\n\n### Wrap your application with `<IntlProvider />`\n\n```tsx\nimport { IntlProvider } from '@cookbook/solid-intl'\n\n// usersLocale = 'en', 'en-US', 'pt-BR', so on...\n// translationsForUsersLocale = translations for selected locale\nrender(() =>\n  <IntlProvider locale={usersLocale} messages={translationsForUsersLocale}>\n    <App />\n  </IntlProvider>,\n  document.getElementById(\"root\")!);\n```\n\n###  Create your message and use it with `intl.formatMessage`\n\n```tsx\nimport { defineMessages, useIntl } from '@cookbook/solid-intl';\n\nconst messages = defineMessages({\n  greeting: {\n    id: \"app.greeting\",\n    defaultMessage: \"Hello world!\",\n  },\n});\n\nfunction Component(props) {\n  const { intl } = useIntl();\n\n  return intl.formatMessage(messages.greeting) // outputs: Hello world!\n}\n````\n\n______\n# Table of contents\n\n- [API](#api)\n  - [`<IntlProvider />`](#intlprovider-)\n    - [locale, formats, and messages](#locale-formats-and-messages)\n    - [defaultLocale and defaultFormats](#defaultlocale-and-defaultformats)\n    - [defaultRichTextElements](#defaultrichtextelements)\n    - [onError](#onerror)\n    - [onWarn](#onwarn)\n  - [`useIntl()` hook](#useintl-hook)\n    - [formatDate](#formatdate)\n    - [formatTime](#formattime)\n    - [formatRelativeTime](#formatrelativetime)\n    - [formatNumber](#formatnumber)\n    - [formatPlural](#formatplural)\n    - [formatList](#formatlist)\n    - [formatDisplayName](#formatdisplayname)\n    - [formatMessage](#formatmessage)\n    - [defineMessages/defineMessage](#definemessagesdefinemessage)\n- [Message Extraction](#message-extraction)\n  - [Extraction](#extraction)\n- [Basic Internationalization Principles](#basic-internationalization-principles)\n  - [What Is Internationalization and Why Does It Matter?](#what-is-internationalization-and-why-does-it-matter)\n  - [Locales: Language and Region](#locales-language-and-region)\n  - [Translating Strings](#translating-strings)\n- [Message Syntax](#message-syntax)\n  - [Message Descriptor](#message-descriptor)\n  - [Message Formatting Fallbacks](#message-formatting-fallbacks)\n  - [Formatting Message Argument](#formatting-message-argument)\n    - [`number` formatting](#number-formatting)\n    - [`date` formatting](#date-formatting)\n    - [`time` formatting](#time-formatting)\n    - [Supported DateTime Skeleton](#supported-datetime-skeleton)\n    - [`{select}` Format](#select-format)\n    - [`{plural}` Format](#plural-format)\n    - [`{selectordinal}` Format](#selectordinal-format)\n    - [Rich Text Formatting](#rich-text-formatting)\n    - [Quoting / Escaping](#quoting--escaping)\n\n______\n\n# API\n\n## `<IntlProvider />`\n\nSolid Intl uses the provider pattern to scope an i18n context to a tree of components.\nThis allows configuration like the current locale and set of translated strings/messages to be provided at the root of a component tree and made available to the 'useIntl()' hook methods.\nThis component is used to setup the i18n context for a tree.\nUsually, this component will wrap an app's root component so that the entire app will be within the configured i18n context.\nThe following are the i18n configuration props that can be set:\n\n```tsx\ninterface IntlConfig {\n  locale: Locale;\n  timeZone?: string;\n  fallbackOnEmptyString?: boolean;\n  formats?: CustomFormats;\n  messages: Record<MessageIds, string> | Record<MessageIds, MessageFormatElement[]>;\n  defaultLocale?: string;\n  defaultFormats?: CustomFormats;\n  defaultRichTextElements?: Record<string, FormatXMLElementFn<JSXElement>>;\n  onError(err: MissingTranslationError | MessageFormatError | MissingDataError | InvalidConfigError | UnsupportedFormatterError | FormatError)?: void;\n  onWarn(warning: string)?: void;\n}\n```\n\n### locale, formats, and messages\n\nThe user's current locale and what the app should be rendered in.\nWhile `defaultLocale` and `defaultFormats` are for fallbacks or during development and represent the app's default.\nNotice how there is no `defaultMessages`, that's because each Message Descriptor provides a defaultMessage.\n\n### defaultLocale and defaultFormats\n\nDefault locale & formats for when a message is not translated (missing from `messages`).\n`defaultLocale` should be the locale that `defaultMessages` are declared in so that a sentence is coherent in a single locale. Without `defaultLocale` and/or if it's set incorrectly, you might run into scenario where a sentence is in English but embedded date/time is in Spanish.\n\n### defaultRichTextElements\nA map of tag to rich text formatting function. This is meant to provide a centralized way to format common tags such as `<b>`, `<p>`... or enforcing certain Design System in the codebase (e.g standardized `<a>` or `<button>`...).\n\nSee [https://github.com/formatjs/formatjs/issues/1752](https://github.com/formatjs/formatjs/issues/1752) for more context.\n\n### onError\nAllows the user to provide a custom error handler.\nBy default, error messages are logged using `console.error` if `NODE_ENV` is not set to `production`.\n\n### onWarn\nAllows the user to provide a custom warning handler.\nBy default, warning messages are logged using `console.warning` if `NODE_ENV` is not set to `production`.\n\n\n## `useIntl()` hook\n\n### formatDate\n```ts\nfunction formatDate(\n  value: number | Date,\n  options?: Intl.DateTimeFormatOptions & {format?: string}\n): string\n```\n\nThis function will return a formatted date string.\nIt expects a `value` which can be parsed as a date (i.e., `isFinite(new Date(value))`), and accepts `options` that conform to `DateTimeFormatOptions`.\n\n```ts\nintl.formatDate(Date.now(), {\n  year: 'numeric',\n  month: 'numeric',\n  day: 'numeric',\n})\n\n// outputs: 04/01/2023\n```\n\n\n### formatTime\n\n```ts\nfunction formatTime(\n  value: number | Date,\n  options?: Intl.DateTimeFormatOptions & {format?: string}\n): string\n```\n\nThis function will return a formatted date string, but it differs from [`formatDate`](#formatDate) by having the following default options:\n\n```ts\n{\n    hour: 'numeric',\n    minute: 'numeric',\n}\n```\n\nIt expects a `value` which can be parsed as a date (i.e., `isFinite(new Date(value))`), and accepts options that conform to `DateTimeFormatOptions`.\n\n\n```ts\nintl.formatTime(Date.now())\n// outputs: \"4:03 PM\"\n```\n\n### formatRelativeTime\n\n> **BROWSER SUPPORT**:\n>\n> This requires [Intl.RelativeTimeFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat) which has limited browser support.\n> Please use our [polyfill](https://formatjs.io/docs/polyfills/intl-relativetimeformat) if you plan to support them.\n\n\n```ts\ntype Unit =\n  | 'second'\n  | 'minute'\n  | 'hour'\n  | 'day'\n  | 'week'\n  | 'month'\n  | 'quarter'\n  | 'year'\n\ntype RelativeTimeFormatOptions = {\n  numeric?: 'always' | 'auto'\n  style?: 'long' | 'short' | 'narrow'\n}\n\nfunction formatRelativeTime(\n  value: number,\n  unit: Unit,\n  options?: Intl.RelativeTimeFormatOptions & {\n    format?: string\n  }\n): string\n```\n\nThis function will return a formatted relative time string (e.g., \"1 hour ago\"). It expects a `value` which is a number, a `unit` and `options` that conform to `Intl.RelativeTimeFormatOptions`.\n\n```ts\nintl.formatRelativeTime(0)\n// outputs: in 0 seconds\n```\n\n```ts\nintl.formatRelativeTime(-24, 'hour', {style: 'narrow'})\n// outputs: 24 hr ago\n```\n\n\n### formatNumber\n\nThis function uses [Intl.NumberFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat) options.\n\n```ts\nfunction formatNumber(\n  value: number,\n  options?: Intl.NumberFormatOptions & {format?: string}\n): string\n```\n\nThis function will return a formatted number string.\nIt expects a `value` which can be parsed as a number, and accepts `options` that conform to `NumberFormatOptions`.\n\n```ts\nintl.formatNumber(1000, {style: 'currency', currency: 'USD'})\n// outputs: US$1,000.00\n```\n\n**Formatting Number using unit**\n\nCurrently this is part of ES2020 [NumberFormat](https://tc39.es/ecma402/#numberformat-objects).\nWe've provided a [polyfill](https://formatjs.io/docs/polyfills/intl-numberformat) here and `@formatjs/intl` types allow users to pass in a [sanctioned unit](https://formatjs.io/docs/polyfills/intl-numberformat#SupportedUnits):\n\n```ts\nintl.formatNumber(1000, {\n  style: 'unit',\n  unit: 'kilobyte',\n  unitDisplay: 'narrow',\n})\n// outputs: 1,000kB\n```\n\n\n```ts\nintl.formatNumber(1000, {\n  unit: 'fahrenheit',\n  unitDisplay: 'long',\n  style: 'unit',\n})\n// outputs: 1,000 degrees Fahrenheit\n```\n\n### formatPlural\n\n```ts\ntype PluralFormatOptions = {\n  type?: 'cardinal' | 'ordinal' = 'cardinal'\n}\n\nfunction formatPlural(\n  value: number,\n  options?: Intl.PluralFormatOptions\n): 'zero' | 'one' | 'two' | 'few' | 'many' | 'other'\n```\n\nThis function will return a plural category string: `\"zero\"`, `\"one\"`, `\"two\"`, `\"few\"`, `\"many\"`, or `\"other\"`.\nIt expects a `value` which can be parsed as a number, and accepts `options` that conform to `PluralFormatOptions`.\n\nThis is a low-level utility whose output could be provided to a `switch` statement to select a particular string to display.\n\n```ts\nintl.formatPlural(1)\n// outputs: one\n```\n\n```ts\nintl.formatPlural(3, {style: 'ordinal'})\n// outputs: one\n```\n\n> **MULTIPLE LANGUAGE SUPPORT**\n>\n> This function should only be used in apps that only need to support one language. If your app supports multiple languages use formatMessage instead.\n\n### formatList\n\n> **BROWSER SUPPORT**\n>\n> This requires [Intl.ListFormat](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/ListFormat) which has limited browser support. Please use our [polyfill](https://formatjs.io/docs/polyfills/intl-listformat) if you plan to support them.\n\n\nThis function allows you to join list of things together in an i18n-safe way. For example, when the locale is `en`:\n\n```ts\nintl.formatList(['Me', 'myself', 'I'], {type: 'conjunction'})\n// outputs: Me, myself and I\n```\n\n```ts\nintl.formatList(['5 hours', '3 minutes'], {type: 'unit'})\n// outputs: 5 hours, 3 minutes\n```\n\n\n### formatDisplayName\n\n> **BROWSER SUPPORT**\n>\n> This requires [Intl.DisplayNames](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DisplayNames) which has limited browser support. Please use our [polyfill](https://formatjs.io/docs/polyfills/intl-displaynames) if you plan to support them.\n\n```ts\ntype FormatDisplayNameOptions = {\n  style?: 'narrow' | 'short' | 'long'\n  type?: 'language' | 'region' | 'script' | 'currency'\n  fallback?: 'code' | 'none'\n}\n\nfunction formatDisplayName(\n  value: string | number | Record<string, unknown>,\n  options: FormatDisplayNameOptions\n): string | undefined\n```\n\nUsage examples:\n\n```ts\nintl.formatDisplayName('zh-Hans-SG', {type: 'language'})\n// outputs: Simplified Chinese (Singapore)\n```\n\n```ts\n// ISO-15924 four letters script code to localized display name\nintl.formatDisplayName('Deva', {type: 'script'})\n// outputs: Devanagari\n```\n\n```ts\n// ISO-4217 currency code to localized display name\nintl.formatDisplayName('CNY', {type: 'currency'})\n// outputs: Chinese Yuan\n```\n\n```ts\n// ISO-3166 two letters region code to localized display name\nintl.formatDisplayName('UN', {type: 'region'})\n// outputs: United Nations\n```\n\n### formatMessage\n\n```ts\ntype MessageFormatPrimitiveValue = string | number | boolean | null | undefined\n\nfunction formatMessage(\n  descriptor: MessageDescriptor,\n  values?: Record<string, MessageFormatPrimitiveValue>\n): string\n\nfunction formatMessage(\n  descriptor: MessageDescriptor,\n  values?: Record<\n    string,\n    MessageFormatPrimitiveValue | JSX.Element | FormatXMLElementFn\n  >\n): string | JSX.Element[]\n```\n\nThis function will return a formatted message string.\nIt expects a `MessageDescriptor` with at least an id property, and accepts a shallow `values` object which are used to fill placeholders in the message.\n\nIf a translated message with the `id` has been passed to the `<IntlProvider>` via its `messages` prop it will be formatted, otherwise it will fallback to formatting `defaultMessage`.\n\n> **See**: [Message Formatting Fallbacks](#message-formatting-fallbacks) for more details.\n\n```tsx\nfunction () {\n  const messages = defineMessages({\n    greeting: {\n      id: 'app.greeting',\n      defaultMessage: 'Hello, {name}!',\n    },\n  })\n\n  return intl.formatMessage(messages.greeting, {name: 'Eric'})\n  // outputs: Hello, Eric!\n}\n```\n\nWith `JSX.Element`\n\n\n```tsx\nfunction () {\n  const messages = defineMessages({\n    greeting: {\n      id: 'app.greeting',\n      defaultMessage: 'Hello, {name}!',\n    },\n  })\n\n  return intl.formatMessage(messages.greeting, {name: <b>Eric</b>})\n  // outputs: Hello, <b>Eric</b>!\n}\n```\n\nWith rich text formatting\n\n\n```tsx\nfunction () {\n  const messages = defineMessages({\n    greeting: {\n      id: 'app.greeting',\n      defaultMessage: 'Hello, {name}!',\n    },\n  })\n\n  return intl.formatMessage(messages.greeting, {\n    name: 'Eric',\n    bold: str => <b>{str}</b>,\n  })\n  // outputs: Hello, <b>Eric</b>!\n}\n```\n\n### defineMessages/defineMessage\n\n```ts\ninterface MessageDescriptor {\n  id?: string\n  description?: string | object\n  defaultMessage?: string\n}\n\nfunction defineMessages(\n  messageDescriptors: Record<string, MessageDescriptor>\n): Record<string, MessageDescriptor>\n\nfunction defineMessage(messageDescriptor: MessageDescriptor): MessageDescriptor\n```\n\nThese functions are re-exported from the `@formatjs/intl` package and are simply a hook for our CLI & babel/TS plugin to use when compiling default messages defined in JavaScript source files.\nThis function simply returns the Message Descriptor map object that's passed-in.\n\n```ts\nimport {defineMessages, defineMessage} from '@cookbook/solid-intl'\n\nconst messages = defineMessages({\n  greeting: {\n    id: 'app.home.greeting',\n    defaultMessage: 'Hello, {name}!',\n  },\n})\n\nconst msg = defineMessage({\n  id: 'single',\n  description: 'header',\n})\n```\n\n______\n\n\n# Message Extraction\n\nNow that you've declared some messages, it's time to extract them.\n\n```bash\nnpm i @formatjs/cli\n# or\nyarn add @formatjs/cli\n# or\npnpm add @formatjs/cli\n```\n\n### Extraction\n\nAdd the following command to your `package.json` `scripts`:\n\n```bash\n{\n  \"scripts\": {\n    \"extract\": \"formatjs extract\"\n  }\n}\n```\n\nAnd execute it:\n\n```\nnpm run extract -- 'src/**/*.ts*' --ignore='**/*.d.ts' --out-file lang/en.json'\n```\n\nGiven a file that has the following messages:\n\n\n```tsx\nimport { useIntl } from '@cookbook/solid-intl'\n\nexport function List(props) {\n  const intl = useIntl();\n\n  return (\n    <section>\n      <header>\n        {intl.formatMessage({\n          id: 'settings.list.header',\n          defaultMessage: 'Control Panel',\n        })}\n      </header>\n      <ul>\n        <li>\n          <button>\n            {intl.formatMessage({\n              id: 'settings.list.button.delete',\n              defaultMessage: 'Delete user {name}',\n            }, {\n              name: props.name,\n            })}\n          </button>\n        </li>\n        <PasswordChange />\n      </ul>\n    </section>\n  )\n}\n```\n\nrunning the above command will create a file called `lang/en.json:\n\n```json\n{\n  \"settings.list.header\": \"Control Panel\",\n  \"settings.list.button.delete\": \"Delete user {name}\"\n}\n```\n\n______\n\n\n# Basic Internationalization Principles\n\n## What Is Internationalization and Why Does It Matter?\n\nInternationalized software supports the languages and cultural customs of people throughout the world. The Web reaches all parts of the world. Internationalized web apps provide a great user experience for people everywhere.\n\nLocalized software adapts to a specific language and culture by translating text into the user's language and formatting data in accordance with the user's expectations. An app is typically localized for a small set of locales.\n\nThe [ECMA-402 JavaScript internationalization specification](https://github.com/tc39/ecma402) has an excellent overview.\n\n## Locales: Language and Region\n\nA \"locale\" refers to the lingual and cultural expectations for a region. It is represented using a \"locale code\" defined in [UTS LDML](https://www.unicode.org/reports/tr35/tr35.html#Identifiers).\n\nThis code is comprised of several parts separated by hyphens (-). The first part is a short string representing the language. The second, optional, part is a short string representing the region. Additionally, various extensions and variants can be specified.\n\nTypically, web apps are localized to just the language or language-region combination. Examples of such locale codes are:\n\n1. `en` for English\n2. `en-US` for English as spoken in the United States\n3. `en-GB` for English as spoken in the United Kingdom\n4. `es-AR` for Spanish as spoken in Argentina\n5. `ar-001` for Arabic as spoken throughout the world\n6. `ar-AE` for Arabic as spoken in United Arab Emirates\n\n7. Most internationalized apps only support a small list of locales.\n\n\n## Translating Strings\n\nYou likely have some text in your application that is in a natural language such as English or Japanese. In order to support other locales, you will need to translate these strings.\n\nFormatJS provides a mechanism to let you write the core \"software\" of your application without special code for different translations. The considerations for each locale are encapsulated in your translated strings and our libraries.\n\n```ts\nconst messages = {\n  en: {\n    GREETING: 'Hello {name}',\n  },\n  fr: {\n    GREETING: 'Bonjour {name}',\n  },\n}\n```\n\nWe use the [ICU Message syntax](https://unicode-org.github.io/icu/userguide/format_parse/messages) which is also used in Java, C, PHP and various other platforms.\n\n______\n\n\n# Message Syntax\n\nString/Message formatting is a paramount feature of Solid Intl and it builds on [ICU Message Formatting](https://unicode-org.github.io/icu/userguide/format_parse/messages) by using the [ICU Message Syntax](https://formatjs.io/docs/core-concepts/icu-syntax).\nThis message syntax allows for simple to complex messages to be defined, translated, and then formatted at runtime.\n\n**Simple Message:**\n\n```ts\nHello everyone\n```\n\n**Simple Argument**\n\nYou can use a `{key}` argument for placing a value into the message.\nThe key is looked up in the input data, and the string is interpolated with its value.\n\n```ts\nHello, {name}\n```\n\n**Complex Message:**\n\n```ts\nHello, {name}, you have {itemCount, plural,\n  =0 {no items}\n  one {# item}\n  other {# items}\n}.\n```\n\n## Message Descriptor\n\nSolid Intl has a Message Descriptor concept which is used to define your app's default messages/strings.\nThe Message Descriptors work very well for providing the data necessary for having the strings/messages translated, and they contain the following properties:\n\n\n- `id`: A unique, stable identifier for the message\n- `description`: Context for the translator about how it's used in the UI\n- `defaultMessage`: The default message (probably in English)\n\n```ts\ninterface MessageDescriptor {\n  id?: MessageIds;\n  description?: string | object;\n  defaultMessage?: string | MessageFormatElement[];\n}\n```\n\n## Message Formatting Fallbacks\nThe message formatting APIs go the extra mile to provide fallbacks for the common situations where formatting fails;\nat the very least a non-empty string should always be returned.\n\nHere's the message formatting fallback algorithm:\n\n1. Lookup and format the translated message at id, passed to <IntlProvider>.\n2. Fallback to formatting the defaultMessage.\n3. Fallback to translated message at id's source.\n4. Fallback to defaultMessage source.\n5. Fallback to the literal message id.\n\n\n## Formatting Message Argument\n\nValues can also be formatted based on their type. You use a `{key, type, format}` argument to do that.\n\nThe elements of the argument are:\n\n- `key` is where in the input data to find the data\n- `type` is how to interpret the value (see below)\n- `format` is optional, and is a further refinement on how to display that type of data\n\n```bash\nI have {numCats, number} cats.\n```\n\n### `number` formatting\n\nThis type is used to format numbers in a way that is sensitive to the locale.\nIt understands the following values for the optional `format` element of the argument:\n\n```bash\nI have {numCats, number} cats.\nAlmost {pctBlack, number, ::percent} of them are black.\n```\n\nInternally it uses the Intl.NumberFormat API. You can define custom values for the format element, which are passed to the Intl.NumberFormat constructor.\n\nSometimes embedding how the number will be formatted provides great context to translators. We also support ICU Number Skeletons using the same syntax:\n\n```bash\nThe price of this bagel is {num, number, ::sign-always compact-short currency/GBP}\n```\n\nYou can read more about this [here](https://unicode-org.github.io/icu/userguide/format_parse/numbers/skeletons.html).\n\n\n### `date` formatting\n\nThis type is used to format dates in a way that is sensitive to the locale.\nIt understands the following values for the optional format element of the argument:\n\n- `short` is used to format dates in the shortest possible way\n- `medium` is used to format dates with short textual representation of the month\n- `long` is used to format dates with long textual representation of the month\n- `full` is used to format dates with the most detail\n\n```bash\nSale begins {start, date, medium}\n```\n\nInternally it uses the `Intl.DateTimeFormat` API. You can define custom values for the format element, which are passed to the `Intl.DateTimeFormat` constructor.\n\n### `time` formatting\n\nThis type is used to format times in a way that is sensitive to the locale.\nIt understands the following values for the optional format element of the argument:\n\n- `short` is used to format times with hours and minutes\n- `medium` is used to format times with hours, minutes, and seconds\n- `long` is used to format times with hours, minutes, seconds, and timezone\n- `full` is the same as long\n\n```bash\nCoupon expires at {expires, time, short}\n```\nInternally it uses the `Intl.DateTimeFormat` API. You can define custom values for the format element, which are passed to the `Intl.DateTimeFormat` constructor.\n\n### Supported DateTime Skeleton\n\nSimilar to `number` type, we also support ICU DateTime skeleton.\nICU provides a [wide array of pattern](https://unicode-org.github.io/icu/userguide/format_parse/datetime/#date-field-symbol-table) to customize date time format.\nHowever, not all of them are available via ECMA402's Intl API.\nTherefore, we only support the following patterns\n\n|  Symbol |  Meaning |  Notes |\n|---|---|---|\n| G |\tEra designator | |\n| y |\tyear | |\n| M |\tmonth in year | |\n| L |\tstand-alone month in year | |\n| d |\tday in month | |\n| E |\tday of week | |\n| e |\tlocal day of week |\te..eee is not supported |\n| c |\tstand-alone local day of week\t |c..ccc is not supported |\n| a |\tAM/PM marker | |\n| h |\tHour [1-12] | |\n| H |\tHour [0-23] | |\n| K |\tHour [0-11] | |\n| k |\tHour [1-24] | |\n| m |\tMinute | |\n| s |\tSecond | |\n| z |\tTime Zone | |\n\n\n### `{select}` Format\n\nThe `{key, select, matches}` is used to choose output by matching a value to one of many choices.\n(It is similar to the `switch` statement available in some programming languages.)\nThe key is looked up in the input data.\nThe corresponding value is matched to one of matches and the corresponding output is returned.\nThe key argument must follow [Unicode Pattern_Syntax](https://www.unicode.org/reports/tr31/tr31-9.html#Pattern_Syntax).\nThe `matches` is a space-separated list of `matches`.\n\nThe format of a match is match `{output}`.\n(A match is similar to the case statement of the switch found in some programming languages.)\nThe `match` is a literal value.\nIf it is the same as the value for `key` then the corresponding `output` will be used.\n\noutput is itself a message, so it can be a literal string or also have more arguments nested inside of it.\n\nThe `other` match is special and is used if nothing else matches. (This is similar to the default case of the switch found in some programming languages.)\n\n> **DANGER**\n>\n> `other` is required as per `icu4j` implementation. We will throw an error if `select` is used without `other`.\n\n```bash\n{gender, select,\n    male {He}\n    female {She}\n    other {They}\n} will respond shortly.\n```\n\nHere's an example of nested arguments.\n\n```bash\n{taxableArea, select,\n    yes {An additional {taxRate, number, percent} tax will be collected.}\n    other {No taxes apply.}\n}\n```\n\n### `{plural}` Format\n\nThe `{key, plural, matches}` is used to choose output based on the pluralization rules of the current locale. It is very similar to the `{select}` format above except that the value is expected to be a number and is mapped to a plural category.\n\nThe match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories.\n\n- `zero`: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)\n- `one`: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)\n- `two`: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)\n- `few`: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.\n- `many`: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)\n- `other`: This category is used if the value doesn't match one of the other plural categories. Note that this is used for \"plural\" for languages (such as English) that have a simple \"singular\" versus \"plural\" dichotomy.\n- `=value`: This is used to match a specific value regardless of the plural categories of the current locale.\n\n> **DANGER**\n>\n> `other` is required as per `icu4j` implementation. We will throw an error if `select` is used without `other`.\n\n```bash\nCart: {itemCount} {itemCount, plural,\n    one {item}\n    other {items}\n}\n```\n\n```bash\nYou have {itemCount, plural,\n    =0 {no items}\n    one {1 item}\n    other {{itemCount} items}\n}.\n```\nIn the `output` of the match, the `#` special token can be used as a placeholder for the numeric value and will be formatted as if it were `{key, number}`.\n\n\n### `{selectordinal}` Format\n\nThe `{key, selectordinal, matches}` is used to choose output based on the ordinal pluralization rules (1st, 2nd, 3rd, etc.) of the current locale. It is very similar to the {plural} format above except that the value is mapped to an ordinal plural category.\n\nThe match is a literal value and is matched to one of these plural categories. Not all languages use all plural categories.\n\n- `zero`: This category is used for languages that have grammar specialized specifically for zero number of items. (Examples are Arabic and Latvian.)\n- `one`: This category is used for languages that have grammar specialized specifically for one item. Many languages, but not all, use this plural category. (Many popular Asian languages, such as Chinese and Japanese, do not use this category.)\n- `two`: This category is used for languages that have grammar specialized specifically for two items. (Examples are Arabic and Welsh.)\n- `few`: This category is used for languages that have grammar specialized specifically for a small number of items. For some languages this is used for 2-4 items, for some 3-10 items, and other languages have even more complex rules.\n- `many`: This category is used for languages that have grammar specialized specifically for a larger number of items. (Examples are Arabic, Polish, and Russian.)\n- `other`: This category is used if the value doesn't match one of the other plural categories. Note that this is used for \"plural\" for languages (such as English) that have a simple \"singular\" versus \"plural\" dichotomy.\n- `=value`: This is used to match a specific value regardless of the plural categories of the current locale.\n\n> **DANGER**\n>\n> `other` is required as per `icu4j` implementation. We will throw an error if `select` is used without `other`.\n\nIn the output of the `match`, the `#` special token can be used as a placeholder for the numeric value and will be formatted as if it were `{key, number}`.\n\n```bash\nIt's my cat's {year, selectordinal,\n    one {#st}\n    two {#nd}\n    few {#rd}\n    other {#th}\n} birthday!\n```\n\n### Rich Text Formatting\n\nWe also support embedded rich text formatting in our message using tags.\nThis allows developers to embed as much text as possible so sentences don't have to be broken up into chunks\n\n**NOTE: This is not XML/HTML tag**\n\n\n```bash\nOur price is <boldThis>{price, number, ::currency/USD precision-integer}</boldThis>\nwith <link>{pct, number, ::percent} discount</link>\n```\n\n### Quoting / Escaping\n\nThe ASCII apostrophe `'` (U+0027) can be used to escape syntax characters in the text portion of the message. A single apostrophe escapes one syntax character immediately following it; a pair of apostrophes escape every syntax characters wrapped between them:\n\n```ts\n\"This is not an interpolation: '{word}\"\n//→ \"This is not an interpolation: {word}\"\n\"These are not interpolations: '{word1} {word2}'\"\n//→ \"These are not interpolations: {word1} {word2}\"\n\"'<notATag>\"\n//→ \"<notATag>\"\n\"'<notATag>hello</notATag>'\"\n//→ \"<notATag>hello</notATag>\"\n```\n\nTwo consecutive ASCII apostrophes represents one ASCII apostrophe, similar to `%%` in `printf` represents one `%`. However, we recommend using curly apostrophe `’` (U+2019) for human-readable strings and only use ASCII apostrophe `'` (U+0027) in ICU message syntax.\n\n```ts\n\"This '{isn''t}' obvious.\"\n//→ \"This {isn't} obvious.\"\n```\n\n[pnpm-image]: https://img.shields.io/badge/maintained%20with-pnpm-cc00ff.svg?style=for-the-badge&logo=pnpm\n[pnpm-url]: https://pnpm.io/\n[npm-image]: https://img.shields.io/npm/v/@cookbook/solid-intl.svg?style=flat-square\n[npm-url]: https://npmjs.org/package/@cookbook/solid-intl\n[npm-downloads]: https://img.shields.io/npm/dm/@cookbook/solid-intl.svg?style=flat-square\n[stars-image]: https://img.shields.io/github/stars/the-cookbook/solid-intl.svg\n[stars-url]: https://github.com/the-cookbook/solid-intl/stargazers\n[vulnerabilities-image]: https://snyk.io/test/github/the-cookbook/solid-intl/badge.svg\n[vulnerabilities-url]: https://snyk.io/test/github/the-cookbook/solid-intl\n[issues-image]: https://img.shields.io/github/issues/the-cookbook/solid-intl.svg\n[issues-url]: https://github.com/the-cookbook/solid-intl/issues\n[awesome-image]: https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg\n[awesome-url]: https://github.com/the-cookbook/solid-intl\n","readmeFilename":"README.md"}