@intlayer/react-intl 8.12.5-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +330 -0
  2. package/dist/cjs/FormattedComponents.cjs +131 -0
  3. package/dist/cjs/FormattedComponents.cjs.map +1 -0
  4. package/dist/cjs/FormattedMessage.cjs +45 -0
  5. package/dist/cjs/FormattedMessage.cjs.map +1 -0
  6. package/dist/cjs/IntlProvider.cjs +38 -0
  7. package/dist/cjs/IntlProvider.cjs.map +1 -0
  8. package/dist/cjs/_virtual/_rolldown/runtime.cjs +29 -0
  9. package/dist/cjs/context.cjs +16 -0
  10. package/dist/cjs/context.cjs.map +1 -0
  11. package/dist/cjs/createIntl.cjs +46 -0
  12. package/dist/cjs/createIntl.cjs.map +1 -0
  13. package/dist/cjs/createIntlObject.cjs +132 -0
  14. package/dist/cjs/createIntlObject.cjs.map +1 -0
  15. package/dist/cjs/defineMessages.cjs +20 -0
  16. package/dist/cjs/defineMessages.cjs.map +1 -0
  17. package/dist/cjs/errors.cjs +85 -0
  18. package/dist/cjs/errors.cjs.map +1 -0
  19. package/dist/cjs/index.cjs +40 -0
  20. package/dist/cjs/plugin/index.cjs +57 -0
  21. package/dist/cjs/plugin/index.cjs.map +1 -0
  22. package/dist/cjs/useIntl.cjs +33 -0
  23. package/dist/cjs/useIntl.cjs.map +1 -0
  24. package/dist/esm/FormattedComponents.mjs +119 -0
  25. package/dist/esm/FormattedComponents.mjs.map +1 -0
  26. package/dist/esm/FormattedMessage.mjs +44 -0
  27. package/dist/esm/FormattedMessage.mjs.map +1 -0
  28. package/dist/esm/IntlProvider.mjs +37 -0
  29. package/dist/esm/IntlProvider.mjs.map +1 -0
  30. package/dist/esm/context.mjs +14 -0
  31. package/dist/esm/context.mjs.map +1 -0
  32. package/dist/esm/createIntl.mjs +44 -0
  33. package/dist/esm/createIntl.mjs.map +1 -0
  34. package/dist/esm/createIntlObject.mjs +131 -0
  35. package/dist/esm/createIntlObject.mjs.map +1 -0
  36. package/dist/esm/defineMessages.mjs +17 -0
  37. package/dist/esm/defineMessages.mjs.map +1 -0
  38. package/dist/esm/errors.mjs +77 -0
  39. package/dist/esm/errors.mjs.map +1 -0
  40. package/dist/esm/index.mjs +12 -0
  41. package/dist/esm/plugin/index.mjs +53 -0
  42. package/dist/esm/plugin/index.mjs.map +1 -0
  43. package/dist/esm/useIntl.mjs +32 -0
  44. package/dist/esm/useIntl.mjs.map +1 -0
  45. package/dist/types/FormattedComponents.d.ts +67 -0
  46. package/dist/types/FormattedComponents.d.ts.map +1 -0
  47. package/dist/types/FormattedMessage.d.ts +28 -0
  48. package/dist/types/FormattedMessage.d.ts.map +1 -0
  49. package/dist/types/IntlProvider.d.ts +16 -0
  50. package/dist/types/IntlProvider.d.ts.map +1 -0
  51. package/dist/types/context.d.ts +13 -0
  52. package/dist/types/context.d.ts.map +1 -0
  53. package/dist/types/createIntl.d.ts +35 -0
  54. package/dist/types/createIntl.d.ts.map +1 -0
  55. package/dist/types/createIntlObject.d.ts +15 -0
  56. package/dist/types/createIntlObject.d.ts.map +1 -0
  57. package/dist/types/defineMessages.d.ts +18 -0
  58. package/dist/types/defineMessages.d.ts.map +1 -0
  59. package/dist/types/errors.d.ts +56 -0
  60. package/dist/types/errors.d.ts.map +1 -0
  61. package/dist/types/index.d.ts +10 -0
  62. package/dist/types/plugin/index.d.ts +23 -0
  63. package/dist/types/plugin/index.d.ts.map +1 -0
  64. package/dist/types/useIntl.d.ts +21 -0
  65. package/dist/types/useIntl.d.ts.map +1 -0
  66. package/package.json +117 -0
package/README.md ADDED
@@ -0,0 +1,330 @@
1
+ <p align="center">
2
+ <a href="https://intlayer.org" rel="">
3
+ <img src="https://raw.githubusercontent.com/aymericzip/intlayer/main/docs/assets/cover.png" width="60%" alt="Intlayer Logo" />
4
+ </a>
5
+ </p>
6
+
7
+ <h1 align="center">
8
+ <strong>Per-component i18n</strong>
9
+ </h1>
10
+
11
+ <h2 align="center">
12
+ <strong>AI-powered translation. Visual Editor. Multilingual CMS.</strong>
13
+ </h2>
14
+
15
+ <br />
16
+
17
+ <p align="center">
18
+ <a href="https://intlayer.org/doc/concept/content" rel="">Docs</a> •
19
+ <a href="https://intlayer.org/doc/environment/nextjs" rel="">Next.js</a> •
20
+ <a href="https://intlayer.org/doc/environment/vite-and-react" rel="">React + Vite</a> •
21
+ <a href="https://intlayer.org/doc/concept/cms" rel="">CMS</a> •
22
+ <a href="https://discord.gg/7uxamYVeCk" rel="noopener noreferrer nofollow">Discord</a>
23
+ </p>
24
+ <p align="center" style="margin-top:15px;">
25
+ <a href="https://www.npmjs.com/package/intlayer" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/npm/v/intlayer?style=for-the-badge&labelColor=FFFFFF&color=000000&logoColor=FFFFFF" alt="npm version" height="24"/></a>
26
+ <a href="https://github.com/aymericzip/intlayer/stargazers" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/stars/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logo=github&logoColor=FFD700" alt="GitHub Stars" height="24"/></a>
27
+ <a href="https://www.npmjs.org/package/intlayer" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/npm/dm/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="monthly downloads" height="24"/></a>
28
+ <a href="https://github.com/aymericzip/intlayer/blob/main/LICENSE" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/license/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="license"/></a>
29
+ <a href="https://github.com/aymericzip/intlayer/commits/main" target="_blank" rel="noopener noreferrer nofollow"><img src="https://img.shields.io/github/last-commit/aymericzip/intlayer?style=for-the-badge&labelColor=000000&color=FFFFFF&logoColor=000000&cacheSeconds=86400" alt="last commit"/>
30
+ </a>
31
+ </p>
32
+
33
+ ![Watch the video](https://github.com/aymericzip/intlayer/blob/main/docs/assets/demo_video.gif)
34
+
35
+ <a href="https://intlayer.org/doc/concept/content" rel="">
36
+ <img src="https://img.shields.io/badge/Get_Started-FFFFFF?style=for-the-badge&logo=rocket&logoColor=black" />
37
+ </a>
38
+
39
+ ## What is Intlayer?
40
+
41
+ Most i18n libraries are either too complex, too rigid, or not built for modern frameworks.
42
+
43
+ Intlayer is a **modern i18n solution** for web and mobile apps.
44
+ It’s framework-agnostic, **AI-powered**, and includes a free **CMS & visual editor**.
45
+
46
+ With **per-locale content files**, **TypeScript autocompletion**, **tree-shakable dictionaries**, and **CI/CD integration**, Intlayer makes internationalization **faster, cleaner, and smarter**.
47
+
48
+ ## Keys benefits of Intlayer:
49
+
50
+ | Feature | Description |
51
+ | --------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
52
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/frameworks.png?raw=true" alt="Feature" width="700"> | **Cross-Frameworks Support**<br><br>Intlayer is compatible with all major frameworks and libraries, including Next.js, React, Vite, Vue.js, Nuxt, Preact, Express, and more. |
53
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/javascript_content_management.jpg?raw=true" alt="Feature" width="700"> | **JavaScript-Powered Content Management**<br><br>Harness the flexibility of JavaScript to define and manage your content efficiently. <br><br> - [Content declaration](https://intlayer.org/doc/concept/content) |
54
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/per_locale_content_declaration_file.png?raw=true" alt="Feature" width="700"> | **Per-Locale Content Declaration File**<br><br>Speed up your development by declaring your content once, before auto generation.<br><br> - [Per-Locale Content Declaration File](https://intlayer.org/doc/concept/per-locale-file) |
55
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/compiler.jpg?raw=true" alt="Feature" width="700"> | **Compiler**<br><br>The Intlayer Compiler extract automatically the content from the components and generate the dictionary files.<br><br> - [Compiler](https://intlayer.org/doc/compiler) |
56
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true" alt="Feature" width="700"> | **Type-Safe Environment**<br><br>Leverage TypeScript to ensure your content definitions and code are error-free, while also benefiting from IDE autocompletion.<br><br> - [TypeScript configuration](https://intlayer.org/doc/environment/vite-and-react#configure-typescript) |
57
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/config_file.png?raw=true" alt="Feature" width="700"> | **Simplified Setup**<br><br>Get up and running quickly with minimal configuration. Adjust settings for internationalization, routing, AI, build, and content handling with ease. <br><br> - [Explore Next.js integration](https://intlayer.org/doc/environment/nextjs) |
58
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/content_retrieval.png?raw=true" alt="Feature" width="700"> | **Simplified Content Retrieval**<br><br>No need to call your `t` function for each piece of content. Retrieve all your content directly using a single hook.<br><br> - [React integration](https://intlayer.org/doc/environment/create-react-app) |
59
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/server_component.png?raw=true" alt="Feature" width="700"> | **Consistent Server Component Implementation**<br><br>Perfectly suited for Next.js server components, use the same implementation for both client and server components, no need to pass your `t` function across each server component. <br><br> - [Server Components](https://intlayer.org/doc/environment/nextjs#step-7-utilize-content-in-your-code) |
60
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/file_tree.png?raw=true" alt="Feature" width="700"> | **Organized Codebase**<br><br>Keep your codebase more organized: 1 component = 1 dictionary in the same folder. Translations close to their respective components, enhance maintainability and clarity. <br><br> - [How Intlayer works](https://intlayer.org/doc/concept/how-works-intlayer) |
61
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/url_routing.png?raw=true" alt="Feature" width="700"> | **Enhanced Routing**<br><br>Full support of app routing, adapting seamlessly to complex application structures, for Next.js, React, Vite, Vue.js, etc.<br><br> - [Explore Next.js integration](https://intlayer.org/doc/environment/nextjs) |
62
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/markdown.png?raw=true" alt="Feature" width="700"> | **Markdown Support**<br><br>Import and interpret, locale files and remote Markdown for multilingual content like privacy policies, documentation, etc. Interpret and make Markdown metadata accessible in your code.<br><br> - [Content files](https://intlayer.org/doc/concept/content/file) |
63
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/visual_editor.png?raw=true" alt="Feature" width="700"> | **Free Visual Editor & CMS**<br><br>A free visual editor and CMS are available for content writers, removing the need for a localization platform. Keep your content synchronized using Git, or externalize it totally or partially with the CMS.<br><br> - [Intlayer Editor](https://intlayer.org/doc/concept/editor) <br> - [Intlayer CMS](https://intlayer.org/doc/concept/cms) |
64
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/bundle.png?raw=true" alt="Feature" width="700"> | **Tree-shakable Content**<br><br>Tree-shakable content, reducing the size of the final bundle. Loads content per component, excluding any unused content from your bundle. Supports lazy loading to enhance app loading efficiency. <br><br> - [App build optimization](https://intlayer.org/doc/concept/how-works-intlayer#app-build-optimization) |
65
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/static_rendering.png?raw=true" alt="Feature" width="700"> | **Static Rendering**<br><br>Doesn't block Static Rendering. <br><br> - [Next.js integration](https://intlayer.org/doc/environment/nextjs) |
66
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/AI_translation.png?raw=true" alt="Feature" width="700"> | **AI-Powered Translation**<br><br>Transform your website into 231 languages with just one click using Intlayer's advanced AI-powered translation tools using your own AI provider / API key. <br><br> - [CI/CD integration](https://intlayer.org/doc/concept/ci-cd) <br> - [Intlayer CLI](https://intlayer.org/doc/concept/cli) <br> - [Auto fill](https://intlayer.org/doc/concept/auto-fill) |
67
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/mcp.png?raw=true" alt="Feature" width="700"> | **MCP Server Integration**<br><br>Provides an MCP (Model Context Protocol) server for IDE automation, enabling seamless content management and i18n workflows directly within your development environment. <br><br> - [MCP Server](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/mcp_server.md) |
68
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/vscode_extension.png?raw=true" alt="Feature" width="700"> | **VSCode Extension**<br><br>Intlayer provides a VSCode extension to help you manage your content and translations, building your dictionaries, translating your content, and more. <br><br> - [VSCode Extension](https://intlayer.org/doc/vs-code-extension) |
69
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/interoperability.png?raw=true" alt="Feature" width="700"> | **Interoperability**<br><br>Allow interoperability with react-i18next, next-i18next, next-intl, react-intl, vue-i18n. <br><br> - [Intlayer and react-intl](https://intlayer.org/blog/intlayer-with-react-intl) <br> - [Intlayer and next-intl](https://intlayer.org/blog/intlayer-with-next-intl) <br> - [Intlayer and next-i18next](https://intlayer.org/blog/intlayer-with-next-i18next) <br> - [Intlayer and vue-i18n](https://intlayer.org/blog/intlayer-with-vue-i18n) |
70
+ | <img src="https://github.com/aymericzip/intlayer/blob/main/docs/assets/benchmark.png?raw=true" alt="Feature" width="700"> | **Performances & Benchmark**<br><br>Uses advanced tree-shaking and dynamic loading to boost performances and keep the solution as light as possible. <br><br> - [Performances & Benchmark](https://intlayer.org/doc/benchmark) |
71
+
72
+ ---
73
+
74
+ ## 📦 Installation
75
+
76
+ Start your journey with Intlayer today and experience a smoother, more powerful approach to internationalization.
77
+
78
+ <a href="https://intlayer.org/doc/concept/content" rel="">
79
+ <img src="https://img.shields.io/badge/Get_Started-FFFFFF?style=for-the-badge&logo=rocket&logoColor=black" />
80
+ </a>
81
+
82
+ ```bash
83
+ npm install intlayer react-intlayer
84
+ ```
85
+
86
+ ⚡ Quick Start (Next.js)
87
+
88
+ ```ts
89
+ // intlayer.config.ts
90
+ import { Locales, type IntlayerConfig } from "intlayer";
91
+
92
+ const config: IntlayerConfig = {
93
+ internationalization: {
94
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
95
+ defaultLocale: Locales.ENGLISH,
96
+ },
97
+ };
98
+
99
+ export default config;
100
+ ```
101
+
102
+ ```ts
103
+ // app/home.content.ts
104
+ import { t, type Dictionary } from "intlayer";
105
+
106
+ const content = {
107
+ key: "home",
108
+ content: {
109
+ title: t({
110
+ en: "Home",
111
+ fr: "Accueil",
112
+ es: "Inicio",
113
+ }),
114
+ },
115
+ } satisfies Dictionary;
116
+
117
+ export default content;
118
+ ```
119
+
120
+ ```tsx
121
+ // app/page.tsx
122
+ import { useIntlayer } from "react-intlayer";
123
+
124
+ const HomePage = () => {
125
+ const { title } = useIntlayer("home");
126
+
127
+ return <h1>{title}</h1>;
128
+ };
129
+ ```
130
+
131
+ <a href="https://intlayer.org/doc/environment/nextjs"> Get the full guide → </a>
132
+
133
+ ## 🎥 Live tutorial on YouTube
134
+
135
+ [![How to Internationalize your application using Intlayer](https://i.ytimg.com/vi/e_PPG7PTqGU/hqdefault.jpg?sqp=-oaymwEcCNACELwBSFXyq4qpAw4IARUAAIhCGAFwAcABBg==&rs=AOn4CLDtyJ4uYotEjl12nZ_gZKZ_kjEgOQ)](https://youtu.be/e_PPG7PTqGU?si=GyU_KpVhr61razRw)
136
+
137
+ <a href="https://intlayer.org/doc/concept/content" rel="">
138
+ <img src="https://img.shields.io/badge/Get_Started-FFFFFF?style=for-the-badge&logo=rocket&logoColor=black" />
139
+ </a>
140
+
141
+ ## Table of Contents
142
+
143
+ Explore our comprehensive documentation to get started with Intlayer and learn how to integrate it into your projects.
144
+
145
+ <details open>
146
+ <summary style="font-size:16px; font-weight:bold;">📘 Get Started</summary>
147
+ <ul>
148
+ <li><a href="https://intlayer.org/doc/why" rel=''>Why Intlayer?</a></li>
149
+ <li><a href="https://intlayer.org/doc" rel=''>Introduction</a></li>
150
+ </ul>
151
+ </details>
152
+
153
+ <details>
154
+ <summary style="font-size:16px; font-weight:bold;">⚙️ Concept</summary>
155
+ <ul>
156
+ <li><a href="https://intlayer.org/doc/concept/how-works-intlayer" rel=''>How Intlayer Works</a></li>
157
+ <li><a href="https://intlayer.org/doc/concept/configuration" rel=''>Configuration</a></li>
158
+ <li><a href="https://intlayer.org/doc/concept/cli" rel=''>Intlayer CLI</a></li>
159
+ <li><a href="https://intlayer.org/doc/compiler" rel=''>Compiler</a></li>
160
+
161
+ <li><a href="https://intlayer.org/doc/concept/editor" rel=''>Intlayer Editor</a></li>
162
+ <li><a href="https://intlayer.org/doc/concept/cms" rel=''>Intlayer CMS</a></li>
163
+ <li><a href="https://intlayer.org/doc/concept/content" rel=''>Dictionary</a>
164
+ <ul>
165
+ <li><a href="https://intlayer.org/doc/concept/content/per-locale-file" rel=''>Per-Locale Content Declaration File</a></li>
166
+ <li><a href="https://intlayer.org/doc/concept/content/translation" rel=''>Translation</a></li>
167
+ <li><a href="https://intlayer.org/doc/concept/content/enumeration" rel=''>Enumeration</a></li>
168
+ <li><a href="https://intlayer.org/doc/concept/content/condition" rel=''>Condition</a></li>
169
+ <li><a href="https://intlayer.org/doc/concept/content/nesting" rel=''>Nesting</a></li>
170
+ <li><a href="https://intlayer.org/doc/concept/content/markdown" rel=''>Markdown</a></li>
171
+ <li><a href="https://intlayer.org/doc/concept/content/function-fetching" rel=''>Function Fetching</a></li>
172
+ <li><a href="https://intlayer.org/doc/concept/content/insertion" rel=''>Insertion</a></li>
173
+ <li><a href="https://intlayer.org/doc/concept/content/file" rel=''>File</a></li>
174
+ </ul>
175
+ </li>
176
+ </ul>
177
+ </details>
178
+
179
+ <details open>
180
+ <summary style="font-size:16px; font-weight:bold;">🌐 Environment</summary>
181
+ <ul>
182
+ <li><a href="https://intlayer.org/doc/environment/nextjs" rel=''>Intlayer with Next.js 16</a>
183
+ <ul>
184
+ <li><a href="https://intlayer.org/doc/environment/nextjs/15" rel=''>Next.js 15</a></li>
185
+ <li><a href="https://intlayer.org/doc/environment/nextjs/14" rel=''>Next.js 14 (App Router)</a></li>
186
+ <li><a href="https://intlayer.org/doc/environment/nextjs/next-with-Page-Router" rel=''>Next.js Page Router</a></li>
187
+ <li><a href="https://intlayer.org/doc/environment/nextjs/compiler" rel=''>Next.js using Compiler</a></li>
188
+ </ul>
189
+ </li>
190
+ <li><a href="https://intlayer.org/doc/environment/create-react-app" rel=''>React CRA</a></li>
191
+ <li><a href="https://intlayer.org/doc/environment/vite-and-react" rel=''>Vite + React</a></li>
192
+ <li><a href="https://intlayer.org/doc/environment/vite-and-react" rel=''>Vite + React using Compiler</a></li>
193
+ <li><a href="https://intlayer.org/doc/environment/vite-and-react/compiler" rel=''>React-router-v7</a></li>
194
+ <li><a href="https://intlayer.org/doc/environment/tanstack-start" rel=''>Tanstack start</a>
195
+ <ul>
196
+ <li><a href="https://intlayer.org/doc/environment/tanstack-start/solid" rel=''>Solid</a></li>
197
+ </ul>
198
+ </li>
199
+ <li><a href="https://intlayer.org/doc/environment/astro" rel=''>Astro</a>
200
+ <ul>
201
+ <li><a href="https://intlayer.org/doc/environment/astro/react" rel=''>React</a></li>
202
+ <li><a href="https://intlayer.org/doc/environment/astro/vue" rel=''>Vue</a></li>
203
+ <li><a href="https://intlayer.org/doc/environment/astro/svelte" rel=''>Svelte</a></li>
204
+ <li><a href="https://intlayer.org/doc/environment/astro/solid" rel=''>Solid</a></li>
205
+ <li><a href="https://intlayer.org/doc/environment/astro/vanilla" rel=''>Vanilla JS</a></li>
206
+ <li><a href="https://intlayer.org/doc/environment/astro/lit" rel=''>Lit</a></li>
207
+ </ul>
208
+ </li>
209
+
210
+ <li><a href="https://intlayer.org/doc/environment/react-native-and-expo" rel=''>React Native</a></li>
211
+ <li><a href="https://intlayer.org/doc/environment/vite-and-svelte" rel=''>Vite + Svelte</a></li>
212
+ <li><a href="https://intlayer.org/doc/environment/sveltekit" rel=''>SvelteKit</a></li>
213
+ <li><a href="https://intlayer.org/doc/environment/vite-and-preact" rel=''>Vite + Preact</a></li>
214
+ <li><a href="https://intlayer.org/doc/environment/vite-and-vue" rel=''>Vite + Vue</a></li>
215
+ <li><a href="https://intlayer.org/doc/environment/vite-and-nuxt" rel=''>Vite + Nuxt</a></li>
216
+ <li><a href="https://intlayer.org/doc/environment/vite-and-solid" rel=''>Vite + Solid</a></li>
217
+ <li><a href="https://intlayer.org/doc/environment/angular" rel=''>Angular</a></li>
218
+ <li>
219
+ <a href="https://intlayer.org/doc/environment/express" rel=''>Backend</a>
220
+ <ul>
221
+ <li><a href="https://intlayer.org/doc/environment/express" rel=''>Express</a></li>
222
+ <li><a href="https://intlayer.org/doc/environment/nest" rel=''>NestJS</a></li>
223
+ <li><a href="https://intlayer.org/doc/environment/fastify" rel=''>Fastify</a></li>
224
+ <li><a href="https://intlayer.org/doc/environment/adonisjs" rel=''>AdonisJS</a></li>
225
+ <li><a href="https://intlayer.org/doc/environment/hono" rel=''>Hono</a></li>
226
+ </ul>
227
+ </li>
228
+ </ul>
229
+ </details>
230
+
231
+ <details>
232
+ <summary style="font-size:16px; font-weight:bold;">📊 Benchmark</summary>
233
+ <ul>
234
+ <li><a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/nextjs.md" rel=''>Next.js</a></li>
235
+ <li><a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/tanstack.md" rel=''>TanStack Start</a></li>
236
+ <li><a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/vue.md" rel=''>Vue</a></li>
237
+ <li><a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/solid.md" rel=''>Solid</a></li>
238
+ <li><a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/benchmark/svelte.md" rel=''>Svelte</a></li>
239
+ </ul>
240
+ </details>
241
+
242
+ <details>
243
+ <summary style="font-size:16px; font-weight:bold;">📰 Blog</summary>
244
+ <ul>
245
+ <li><a href="https://github.com/aymericzip/intlayer/blob/main/docs/blog/en/what_is_internationalization.md" rel=''>What is i18n</a></li>
246
+ <li><a href="https://intlayer.org/blog/SEO-and-i18n" rel=''>i18n and SEO</a></li>
247
+ <li><a href="https://intlayer.org/blog/intlayer-with-next-i18next" rel=''>Intlayer and i18next</a></li>
248
+ <li><a href="https://intlayer.org/blog/intlayer-with-react-i18next" rel=''>Intlayer and react-intl</a></li>
249
+ <li><a href="https://intlayer.org/blog/intlayer-with-next-intl" rel=''>Intlayer and next-intl</a></li>
250
+ </ul>
251
+ </details>
252
+
253
+ ## Multilingual content management system
254
+
255
+ More than an i18n library, Intlayer is a complete **multilingual content management system**. A full CMS is available for free at [app.intlayer.org](https://app.intlayer.org).
256
+
257
+ Intlayer connects **developers**, **copywriters**, and **AI agents** in one workflow for creating and maintaining multilingual websites effortlessly.Intlayer replaces the following stack in a single solution:
258
+
259
+ - i18n solutions (e.g. `i18next`, `next-intl`, `vue-i18n`)
260
+ - TMSs (Translation Management Systems) (e.g. Crowdin, Phrase, Lokalise)
261
+ - Feature flags
262
+ - Headless CMSs (e.g. Contentful, Strapi, Sanity)
263
+
264
+ ![CMS Preview](https://github.com/aymericzip/intlayer/blob/main/docs/assets/CMS.png?raw=true)
265
+
266
+ ## 🌐 Readme in other languages
267
+
268
+ <p align="center">
269
+ <a href="https://github.com/aymericzip/intlayer/blob/main/readme.md">English</a> •
270
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/zh/readme.md">简体中文</a> •
271
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/ru/readme.md">Русский</a> •
272
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/readme.md">日本語</a> •
273
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/fr/readme.md">Français</a> •
274
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/ko/readme.md">한국어</a> •
275
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/es/readme.md">Español</a> •
276
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/readme.md">Deutsch</a> •
277
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/readme.md">العربية</a> •
278
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/it/readme.md">Italiano</a> •
279
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/en-GB/readme.md">English (UK)</a> •
280
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/pt/readme.md">Português</a> •
281
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/hi/readme.md">हिन्दी</a> •
282
+ <a href="https://github.com/aymericzip/intlayer/blob/main/docs/docs/tr/readme.md">Türkçe</a>
283
+ </p>
284
+
285
+ ## 🤝 Community
286
+
287
+ Intlayer is built with and for the community and we’d love your input!
288
+
289
+ - Have a suggestion? [Open an issue](https://github.com/aymericzip/intlayer/issues)
290
+ - Found a bug or improvement? [Submit a PR](https://github.com/aymericzip/intlayer/pulls)
291
+ - Need help or want to connect? [Join our Discord](https://discord.gg/7uxamYVeCk)
292
+
293
+ You can also follow us on :
294
+
295
+ <div>
296
+ <br/>
297
+ <p align="center">
298
+ <a href="https://discord.gg/528mBV4N" target="blank" rel='noopener noreferrer nofollow'><img align="center"
299
+ src="https://img.shields.io/badge/discord-5865F2.svg?style=for-the-badge&logo=discord&logoColor=white"
300
+ alt="Intlayer Discord" height="30"/></a>
301
+ <a href="https://www.linkedin.com/company/intlayerorg" target="blank" rel='noopener noreferrer nofollow'><img align="center"
302
+ src="https://img.shields.io/badge/linkedin-%231DA1F2.svg?style=for-the-badge&logo=linkedin&logoColor=white"
303
+ alt="Intlayer LinkedIn" height="30"/></a>
304
+ <a href="https://www.instagram.com/intlayer/" target="blank" rel='noopener noreferrer nofollow'><img align="center"
305
+ src="https://img.shields.io/badge/instagram-%23E4405F.svg?style=for-the-badge&logo=Instagram&logoColor=white"
306
+ alt="Intlayer Instagram" height="30"/></a>
307
+ <a href="https://x.com/Intlayer183096" target="blank" rel='noopener noreferrer nofollow'><img align="center"
308
+ src="https://img.shields.io/badge/x-1DA1F2.svg?style=for-the-badge&logo=x&logoColor=white"
309
+ alt="Intlayer X" height="30"/></a>
310
+ <a href="https://www.youtube.com/@intlayer" target="blank" rel='noopener noreferrer nofollow'><img align="center"
311
+ src="https://img.shields.io/badge/youtube-FF0000.svg?style=for-the-badge&logo=youtube&logoColor=white"
312
+ alt="Intlayer YouTube" height="30"/></a>
313
+ <a href="https://www.tiktok.com/@intlayer" target="blank" rel='noopener noreferrer nofollow'><img align="center"
314
+ src="https://img.shields.io/badge/tiktok-000000.svg?style=for-the-badge&logo=tiktok&logoColor=white"
315
+ alt="Intlayer TikTok" height="30"/></a>
316
+ <br>
317
+ </p>
318
+ </div>
319
+
320
+ ### Contribution
321
+
322
+ For more detailed guidelines on contributing to this project, please refer to the [`CONTRIBUTING.md`](https://github.com/aymericzip/intlayer/blob/main/CONTRIBUTING.md) file. It contains essential information on our development process, commit message conventions, and release procedures. Your contributions are valuable to us, and we appreciate your efforts in making this project better!
323
+
324
+ Contribute on [GitHub](https://github.com/aymericzip/intlayer), [GitLab](https://gitlab.com/ay.pineau/intlayer), or [Bitbucket](https://bitbucket.org/intlayer/intlayer/).
325
+
326
+ ### Thank You for the Support
327
+
328
+ If you like Intlayer, give us a ⭐ on GitHub. It helps others discover the project! [See why GitHub Stars matter](https://github.com/aymericzip/intlayer/blob/main/CONTRIBUTING.md#why-github-stars-matter-).
329
+
330
+ [![Star History Chart](https://api.star-history.com/svg?repos=aymericzip/intlayer&type=Date)](https://star-history.com/#aymericzip/intlayer&Date)
@@ -0,0 +1,131 @@
1
+ 'use client';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_useIntl = require('./useIntl.cjs');
5
+ let react_jsx_runtime = require("react/jsx-runtime");
6
+
7
+ //#region src/FormattedComponents.tsx
8
+ /**
9
+ * Drop-in for react-intl's `<FormattedDate>`.
10
+ * Renders a locale-aware date string using `Intl.DateTimeFormat`.
11
+ */
12
+ const FormattedDate = ({ value, children, format: _format, ...options }) => {
13
+ const formatted = require_useIntl.useIntl().formatDate(value, options);
14
+ if (typeof children === "function") return children(formatted) ?? null;
15
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: formatted });
16
+ };
17
+ /**
18
+ * Drop-in for react-intl's `<FormattedTime>`.
19
+ * Renders a locale-aware time string using `Intl.DateTimeFormat`.
20
+ */
21
+ const FormattedTime = ({ value, children, format: _format, ...options }) => {
22
+ const formatted = require_useIntl.useIntl().formatTime(value, options);
23
+ if (typeof children === "function") return children(formatted) ?? null;
24
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: formatted });
25
+ };
26
+ /**
27
+ * Drop-in for react-intl's `<FormattedNumber>`.
28
+ * Renders a locale-aware number string using `Intl.NumberFormat`.
29
+ */
30
+ const FormattedNumber = ({ value, children, format: _format, ...options }) => {
31
+ const formatted = require_useIntl.useIntl().formatNumber(value, options);
32
+ if (typeof children === "function") return children(formatted) ?? null;
33
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: formatted });
34
+ };
35
+ /**
36
+ * Drop-in for react-intl's `<FormattedList>`.
37
+ * Renders a locale-aware list string using `Intl.ListFormat`.
38
+ */
39
+ const FormattedList = ({ value, ...options }) => {
40
+ const intl = require_useIntl.useIntl();
41
+ const strings = value.filter((item) => typeof item === "string");
42
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: intl.formatList(strings, options) });
43
+ };
44
+ /**
45
+ * Drop-in for react-intl's `<FormattedDisplayName>`.
46
+ * Renders a locale-aware display name using `Intl.DisplayNames`.
47
+ */
48
+ const FormattedDisplayName = ({ value, ...options }) => {
49
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: require_useIntl.useIntl().formatDisplayName(value, options) ?? value });
50
+ };
51
+ /**
52
+ * Drop-in for react-intl's `<FormattedRelativeTime>`.
53
+ * Renders a locale-aware relative time string using `Intl.RelativeTimeFormat`.
54
+ * Auto-update (`updateIntervalInSeconds`) is not implemented.
55
+ */
56
+ const FormattedRelativeTime = ({ value = 0, unit = "second", children, updateIntervalInSeconds: _updateIntervalInSeconds, ...options }) => {
57
+ const formatted = require_useIntl.useIntl().formatRelativeTime(value, unit, options);
58
+ if (typeof children === "function") return children(formatted) ?? null;
59
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: formatted });
60
+ };
61
+ /**
62
+ * Drop-in for react-intl's `<FormattedPlural>`.
63
+ * Selects the matching plural slot using `Intl.PluralRules`.
64
+ */
65
+ const FormattedPlural = ({ value, other, zero, one, two, few, many, children, ...options }) => {
66
+ const rule = require_useIntl.useIntl().formatPlural(value, options);
67
+ const selected = {
68
+ zero,
69
+ one,
70
+ two,
71
+ few,
72
+ many,
73
+ other
74
+ }[rule] ?? other;
75
+ if (typeof children === "function") return children(selected) ?? null;
76
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: selected });
77
+ };
78
+ /**
79
+ * Drop-in for react-intl's `<FormattedDateTimeRange>`.
80
+ * Renders a locale-aware date range string using `Intl.DateTimeFormat#formatRange`.
81
+ */
82
+ const FormattedDateTimeRange = ({ from, to, children, ...options }) => {
83
+ const formatted = require_useIntl.useIntl().formatDateTimeRange(from, to, options);
84
+ if (typeof children === "function") return children(formatted) ?? null;
85
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: formatted });
86
+ };
87
+ /**
88
+ * Drop-in for react-intl's `<FormattedDateParts>`.
89
+ * Renders format parts via a `children` render-prop.
90
+ */
91
+ const FormattedDateParts = ({ value, children, format: _format, ...options }) => {
92
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: children(require_useIntl.useIntl().formatDateToParts(value, options)) });
93
+ };
94
+ /**
95
+ * Drop-in for react-intl's `<FormattedTimeParts>`.
96
+ * Renders format parts via a `children` render-prop.
97
+ */
98
+ const FormattedTimeParts = ({ value, children, format: _format, ...options }) => {
99
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: children(require_useIntl.useIntl().formatTimeToParts(value, options)) });
100
+ };
101
+ /**
102
+ * Drop-in for react-intl's `<FormattedNumberParts>`.
103
+ * Renders format parts via a `children` render-prop.
104
+ */
105
+ const FormattedNumberParts = ({ value, children, format: _format, ...options }) => {
106
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: children(require_useIntl.useIntl().formatNumberToParts(value, options)) });
107
+ };
108
+ /**
109
+ * Drop-in for react-intl's `<FormattedListParts>`.
110
+ * Renders list format parts via a `children` render-prop.
111
+ */
112
+ const FormattedListParts = ({ value, children, ...options }) => {
113
+ const intl = require_useIntl.useIntl();
114
+ const strings = Array.from(value).filter((item) => typeof item === "string");
115
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: children(intl.formatListToParts(strings, options)) });
116
+ };
117
+
118
+ //#endregion
119
+ exports.FormattedDate = FormattedDate;
120
+ exports.FormattedDateParts = FormattedDateParts;
121
+ exports.FormattedDateTimeRange = FormattedDateTimeRange;
122
+ exports.FormattedDisplayName = FormattedDisplayName;
123
+ exports.FormattedList = FormattedList;
124
+ exports.FormattedListParts = FormattedListParts;
125
+ exports.FormattedNumber = FormattedNumber;
126
+ exports.FormattedNumberParts = FormattedNumberParts;
127
+ exports.FormattedPlural = FormattedPlural;
128
+ exports.FormattedRelativeTime = FormattedRelativeTime;
129
+ exports.FormattedTime = FormattedTime;
130
+ exports.FormattedTimeParts = FormattedTimeParts;
131
+ //# sourceMappingURL=FormattedComponents.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormattedComponents.cjs","names":["useIntl"],"sources":["../../src/FormattedComponents.tsx"],"sourcesContent":["'use client';\n\nimport type { ReactElement } from 'react';\nimport type {\n FormattedDate as _FormattedDate,\n FormattedDateParts as _FormattedDateParts,\n FormattedDateTimeRange as _FormattedDateTimeRange,\n FormattedDisplayName as _FormattedDisplayName,\n FormattedList as _FormattedList,\n FormattedListParts as _FormattedListParts,\n FormattedNumber as _FormattedNumber,\n FormattedNumberParts as _FormattedNumberParts,\n FormattedPlural as _FormattedPlural,\n FormattedRelativeTime as _FormattedRelativeTime,\n FormattedTime as _FormattedTime,\n FormattedTimeParts as _FormattedTimeParts,\n} from 'react-intl';\nimport { useIntl } from './useIntl';\n\nconst toDate = (value: Date | number | string | undefined): Date =>\n value instanceof Date\n ? value\n : typeof value === 'undefined'\n ? new Date()\n : new Date(value);\n\n/**\n * Drop-in for react-intl's `<FormattedDate>`.\n * Renders a locale-aware date string using `Intl.DateTimeFormat`.\n */\nexport const FormattedDate: typeof _FormattedDate = ({\n value,\n children,\n format: _format,\n ...options\n}) => {\n const intl = useIntl();\n const formatted = intl.formatDate(value, options);\n if (typeof children === 'function') {\n return (children(formatted) ?? null) as ReactElement | null;\n }\n return <>{formatted}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedTime>`.\n * Renders a locale-aware time string using `Intl.DateTimeFormat`.\n */\nexport const FormattedTime: typeof _FormattedTime = ({\n value,\n children,\n format: _format,\n ...options\n}) => {\n const intl = useIntl();\n const formatted = intl.formatTime(value, options);\n if (typeof children === 'function') {\n return (children(formatted) ?? null) as ReactElement | null;\n }\n return <>{formatted}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedNumber>`.\n * Renders a locale-aware number string using `Intl.NumberFormat`.\n */\nexport const FormattedNumber: typeof _FormattedNumber = ({\n value,\n children,\n format: _format,\n ...options\n}) => {\n const intl = useIntl();\n const formatted = intl.formatNumber(value, options);\n if (typeof children === 'function') {\n return (children(formatted) ?? null) as ReactElement | null;\n }\n return <>{formatted}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedList>`.\n * Renders a locale-aware list string using `Intl.ListFormat`.\n */\nexport const FormattedList: typeof _FormattedList = ({ value, ...options }) => {\n const intl = useIntl();\n const strings = (value as unknown[]).filter(\n (item): item is string => typeof item === 'string'\n );\n const formatted = intl.formatList(strings, options);\n return <>{formatted}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedDisplayName>`.\n * Renders a locale-aware display name using `Intl.DisplayNames`.\n */\nexport const FormattedDisplayName: typeof _FormattedDisplayName = ({\n value,\n ...options\n}) => {\n const intl = useIntl();\n const formatted = intl.formatDisplayName(\n value,\n options as Intl.DisplayNamesOptions\n );\n return <>{formatted ?? value}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedRelativeTime>`.\n * Renders a locale-aware relative time string using `Intl.RelativeTimeFormat`.\n * Auto-update (`updateIntervalInSeconds`) is not implemented.\n */\nexport const FormattedRelativeTime: typeof _FormattedRelativeTime = ({\n value = 0,\n unit = 'second',\n children,\n updateIntervalInSeconds: _updateIntervalInSeconds,\n ...options\n}) => {\n const intl = useIntl();\n const formatted = intl.formatRelativeTime(value, unit, options);\n if (typeof children === 'function') {\n return (children(formatted) ?? null) as ReactElement | null;\n }\n return <>{formatted}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedPlural>`.\n * Selects the matching plural slot using `Intl.PluralRules`.\n */\nexport const FormattedPlural: typeof _FormattedPlural = ({\n value,\n other,\n zero,\n one,\n two,\n few,\n many,\n children,\n ...options\n}) => {\n const intl = useIntl();\n const rule = intl.formatPlural(value, options);\n const slots: Record<Intl.LDMLPluralRule, unknown> = {\n zero,\n one,\n two,\n few,\n many,\n other,\n };\n const selected = slots[rule] ?? other;\n\n if (typeof children === 'function') {\n return (children(selected as import('react').ReactNode) ??\n null) as ReactElement | null;\n }\n\n return <>{selected}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedDateTimeRange>`.\n * Renders a locale-aware date range string using `Intl.DateTimeFormat#formatRange`.\n */\nexport const FormattedDateTimeRange: typeof _FormattedDateTimeRange = ({\n from,\n to,\n children,\n ...options\n}) => {\n const intl = useIntl();\n const formatted = intl.formatDateTimeRange(from, to, options);\n if (typeof children === 'function') {\n return (children(formatted) ?? null) as ReactElement | null;\n }\n return <>{formatted}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedDateParts>`.\n * Renders format parts via a `children` render-prop.\n */\nexport const FormattedDateParts: typeof _FormattedDateParts = ({\n value,\n children,\n format: _format,\n ...options\n}) => {\n const intl = useIntl();\n const parts = intl.formatDateToParts(\n value as Parameters<Intl.DateTimeFormat['format']>[0],\n options\n );\n return <>{children(parts)}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedTimeParts>`.\n * Renders format parts via a `children` render-prop.\n */\nexport const FormattedTimeParts: typeof _FormattedTimeParts = ({\n value,\n children,\n format: _format,\n ...options\n}) => {\n const intl = useIntl();\n const parts = intl.formatTimeToParts(\n value as Parameters<Intl.DateTimeFormat['format']>[0],\n options\n );\n return <>{children(parts)}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedNumberParts>`.\n * Renders format parts via a `children` render-prop.\n */\nexport const FormattedNumberParts: typeof _FormattedNumberParts = ({\n value,\n children,\n format: _format,\n ...options\n}) => {\n const intl = useIntl();\n const parts = intl.formatNumberToParts(value, options);\n return <>{children(parts)}</>;\n};\n\n/**\n * Drop-in for react-intl's `<FormattedListParts>`.\n * Renders list format parts via a `children` render-prop.\n */\nexport const FormattedListParts: typeof _FormattedListParts = ({\n value,\n children,\n ...options\n}) => {\n const intl = useIntl();\n const strings = Array.from(value).filter(\n (item): item is string => typeof item === 'string'\n );\n const parts = intl.formatListToParts(strings, options);\n return <>{children(parts)}</>;\n};\n"],"mappings":";;;;;;;;;;;AA8BA,MAAa,iBAAwC,EACnD,OACA,UACA,QAAQ,SACR,GAAG,cACC;CAEJ,MAAM,YADOA,wBACQ,CAAC,CAAC,WAAW,OAAO,OAAO;CAChD,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,SAAS,KAAK;CAEjC,OAAO,mFAAG,UAAY;AACxB;;;;;AAMA,MAAa,iBAAwC,EACnD,OACA,UACA,QAAQ,SACR,GAAG,cACC;CAEJ,MAAM,YADOA,wBACQ,CAAC,CAAC,WAAW,OAAO,OAAO;CAChD,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,SAAS,KAAK;CAEjC,OAAO,mFAAG,UAAY;AACxB;;;;;AAMA,MAAa,mBAA4C,EACvD,OACA,UACA,QAAQ,SACR,GAAG,cACC;CAEJ,MAAM,YADOA,wBACQ,CAAC,CAAC,aAAa,OAAO,OAAO;CAClD,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,SAAS,KAAK;CAEjC,OAAO,mFAAG,UAAY;AACxB;;;;;AAMA,MAAa,iBAAwC,EAAE,OAAO,GAAG,cAAc;CAC7E,MAAM,OAAOA,wBAAQ;CACrB,MAAM,UAAW,MAAoB,QAClC,SAAyB,OAAO,SAAS,QAC5C;CAEA,OAAO,mFADW,KAAK,WAAW,SAAS,OACzB,EAAI;AACxB;;;;;AAMA,MAAa,wBAAsD,EACjE,OACA,GAAG,cACC;CAMJ,OAAO,mFALMA,wBACQ,CAAC,CAAC,kBACrB,OACA,OAEgB,KAAK,MAAQ;AACjC;;;;;;AAOA,MAAa,yBAAwD,EACnE,QAAQ,GACR,OAAO,UACP,UACA,yBAAyB,0BACzB,GAAG,cACC;CAEJ,MAAM,YADOA,wBACQ,CAAC,CAAC,mBAAmB,OAAO,MAAM,OAAO;CAC9D,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,SAAS,KAAK;CAEjC,OAAO,mFAAG,UAAY;AACxB;;;;;AAMA,MAAa,mBAA4C,EACvD,OACA,OACA,MACA,KACA,KACA,KACA,MACA,UACA,GAAG,cACC;CAEJ,MAAM,OADOA,wBACG,CAAC,CAAC,aAAa,OAAO,OAAO;CAS7C,MAAM,WAAW;EAPf;EACA;EACA;EACA;EACA;EACA;CAEmB,EAAE,SAAS;CAEhC,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,QAAqC,KACpD;CAGJ,OAAO,mFAAG,SAAW;AACvB;;;;;AAMA,MAAa,0BAA0D,EACrE,MACA,IACA,UACA,GAAG,cACC;CAEJ,MAAM,YADOA,wBACQ,CAAC,CAAC,oBAAoB,MAAM,IAAI,OAAO;CAC5D,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,SAAS,KAAK;CAEjC,OAAO,mFAAG,UAAY;AACxB;;;;;AAMA,MAAa,sBAAkD,EAC7D,OACA,UACA,QAAQ,SACR,GAAG,cACC;CAMJ,OAAO,mFAAG,SALGA,wBACI,CAAC,CAAC,kBACjB,OACA,OAEqB,CAAC,EAAI;AAC9B;;;;;AAMA,MAAa,sBAAkD,EAC7D,OACA,UACA,QAAQ,SACR,GAAG,cACC;CAMJ,OAAO,mFAAG,SALGA,wBACI,CAAC,CAAC,kBACjB,OACA,OAEqB,CAAC,EAAI;AAC9B;;;;;AAMA,MAAa,wBAAsD,EACjE,OACA,UACA,QAAQ,SACR,GAAG,cACC;CAGJ,OAAO,mFAAG,SAFGA,wBACI,CAAC,CAAC,oBAAoB,OAAO,OACvB,CAAC,EAAI;AAC9B;;;;;AAMA,MAAa,sBAAkD,EAC7D,OACA,UACA,GAAG,cACC;CACJ,MAAM,OAAOA,wBAAQ;CACrB,MAAM,UAAU,MAAM,KAAK,KAAK,CAAC,CAAC,QAC/B,SAAyB,OAAO,SAAS,QAC5C;CAEA,OAAO,mFAAG,SADI,KAAK,kBAAkB,SAAS,OACvB,CAAC,EAAI;AAC9B"}
@@ -0,0 +1,45 @@
1
+ 'use client';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_useIntl = require('./useIntl.cjs');
5
+ let react = require("react");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+
8
+ //#region src/FormattedMessage.tsx
9
+ /**
10
+ * Drop-in for react-intl's `<FormattedMessage>`.
11
+ *
12
+ * Translates the message identified by `id` using the active intl context.
13
+ * Full ICU MessageFormat syntax is supported.
14
+ *
15
+ * When `values` contains render functions, rich text tags
16
+ * (`<b>chunks</b>`) are mapped through them. When a `tagName` is provided,
17
+ * the output is wrapped in that element; otherwise a fragment is used.
18
+ * A `children` render-prop receives the resolved nodes.
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <FormattedMessage id="home.title" />
23
+ * <FormattedMessage id="home.greeting" values={{ name: 'Alice' }} />
24
+ * <FormattedMessage
25
+ * id="terms.agreement"
26
+ * values={{ b: (chunks) => <strong>{chunks}</strong> }}
27
+ * />
28
+ * ```
29
+ */
30
+ const FormattedMessage = ({ id = "", description: _description, defaultMessage, values, tagName: TagName, children, ignoreTag: _ignoreTag }) => {
31
+ const intl = require_useIntl.useIntl();
32
+ const stringDefaultMessage = typeof defaultMessage === "string" ? defaultMessage : void 0;
33
+ const result = intl.formatMessage({
34
+ id,
35
+ defaultMessage: stringDefaultMessage
36
+ }, values);
37
+ const nodes = Array.isArray(result) ? result : [result];
38
+ if (typeof children === "function") return children(nodes) ?? null;
39
+ if (TagName && TagName !== react.Fragment) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(TagName, { children: nodes });
40
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: nodes });
41
+ };
42
+
43
+ //#endregion
44
+ exports.FormattedMessage = FormattedMessage;
45
+ //# sourceMappingURL=FormattedMessage.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormattedMessage.cjs","names":["useIntl","Fragment"],"sources":["../../src/FormattedMessage.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment, type ReactElement, type ReactNode } from 'react';\nimport type { FormattedMessage as _FormattedMessage } from 'react-intl';\nimport { useIntl } from './useIntl';\n\n/**\n * Drop-in for react-intl's `<FormattedMessage>`.\n *\n * Translates the message identified by `id` using the active intl context.\n * Full ICU MessageFormat syntax is supported.\n *\n * When `values` contains render functions, rich text tags\n * (`<b>chunks</b>`) are mapped through them. When a `tagName` is provided,\n * the output is wrapped in that element; otherwise a fragment is used.\n * A `children` render-prop receives the resolved nodes.\n *\n * @example\n * ```tsx\n * <FormattedMessage id=\"home.title\" />\n * <FormattedMessage id=\"home.greeting\" values={{ name: 'Alice' }} />\n * <FormattedMessage\n * id=\"terms.agreement\"\n * values={{ b: (chunks) => <strong>{chunks}</strong> }}\n * />\n * ```\n */\nexport const FormattedMessage: typeof _FormattedMessage = ({\n id = '',\n description: _description,\n defaultMessage,\n values,\n tagName: TagName,\n children,\n ignoreTag: _ignoreTag,\n}) => {\n const intl = useIntl();\n const stringDefaultMessage =\n typeof defaultMessage === 'string' ? defaultMessage : undefined;\n const result = (\n intl.formatMessage as (\n descriptor: { id: string; defaultMessage?: string },\n values?: Record<string, unknown>\n ) => string | ReactNode[]\n )(\n { id, defaultMessage: stringDefaultMessage },\n values as Record<string, unknown>\n );\n const nodes: ReactNode[] = Array.isArray(result) ? result : [result];\n\n if (typeof children === 'function') {\n return (children(nodes) ?? null) as ReactElement | null;\n }\n\n if (TagName && TagName !== Fragment) {\n return <TagName>{nodes}</TagName>;\n }\n\n return <>{nodes}</>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,oBAA8C,EACzD,KAAK,IACL,aAAa,cACb,gBACA,QACA,SAAS,SACT,UACA,WAAW,iBACP;CACJ,MAAM,OAAOA,wBAAQ;CACrB,MAAM,uBACJ,OAAO,mBAAmB,WAAW,iBAAiB;CACxD,MAAM,SACJ,KAAK,cAKL;EAAE;EAAI,gBAAgB;CAAqB,GAC3C,MACF;CACA,MAAM,QAAqB,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;CAEnE,IAAI,OAAO,aAAa,YACtB,OAAQ,SAAS,KAAK,KAAK;CAG7B,IAAI,WAAW,YAAYC,gBACzB,OAAO,2CAAC,SAAD,YAAU,MAAe;CAGlC,OAAO,mFAAG,MAAQ;AACpB"}
@@ -0,0 +1,38 @@
1
+ 'use client';
2
+
3
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
+ const require_context = require('./context.cjs');
5
+ const require_createIntlObject = require('./createIntlObject.cjs');
6
+ let _intlayer_config_built = require("@intlayer/config/built");
7
+ let _intlayer_config_colors = require("@intlayer/config/colors");
8
+ let _intlayer_config_logger = require("@intlayer/config/logger");
9
+ let react = require("react");
10
+ let react_intlayer = require("react-intlayer");
11
+ let react_jsx_runtime = require("react/jsx-runtime");
12
+
13
+ //#region src/IntlProvider.tsx
14
+ /**
15
+ * Drop-in for react-intl's `IntlProvider`.
16
+ *
17
+ * `messages`, `formats`, `timeZone`, `now`, `defaultRichTextElements`,
18
+ * and `onError`/`onWarn` are accepted for API compatibility but have no
19
+ * effect — Intlayer uses its own compiled dictionaries.
20
+ *
21
+ * The `locale` prop is forwarded to `IntlayerClientProvider`.
22
+ */
23
+ const IntlProvider = ({ locale, children, messages: _messages, formats: _formats, timeZone: _timeZone, defaultRichTextElements: _defaultRichTextElements, onError: _onError, ...rest }) => {
24
+ const intlObject = (0, react.useMemo)(() => require_createIntlObject.createIntlObject(locale), [locale]);
25
+ if (process.env.NODE_ENV === "development" && typeof _messages !== "undefined") (0, _intlayer_config_logger.getAppLogger)({ log: _intlayer_config_built.log })(`${(0, _intlayer_config_logger.colorize)("IntlProvider", _intlayer_config_colors.CYAN)} do not pass the messages prop with intlayer. Messages are loaded automatically under the hood for bundle optimization reasons.`);
26
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_context.IntlContext.Provider, {
27
+ value: intlObject,
28
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_intlayer.IntlayerProvider, {
29
+ locale,
30
+ ...rest,
31
+ children
32
+ })
33
+ });
34
+ };
35
+
36
+ //#endregion
37
+ exports.IntlProvider = IntlProvider;
38
+ //# sourceMappingURL=IntlProvider.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IntlProvider.cjs","names":["createIntlObject","CYAN","IntlContext","IntlayerProvider"],"sources":["../../src/IntlProvider.tsx"],"sourcesContent":["'use client';\n\nimport { log } from '@intlayer/config/built';\nimport { CYAN } from '@intlayer/config/colors';\nimport { colorize, getAppLogger } from '@intlayer/config/logger';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport { useMemo } from 'react';\nimport type { IntlProvider as _IntlProvider } from 'react-intl';\nimport { IntlayerProvider } from 'react-intlayer';\nimport { IntlContext } from './context';\nimport { createIntlObject } from './createIntlObject';\n\n/**\n * Drop-in for react-intl's `IntlProvider`.\n *\n * `messages`, `formats`, `timeZone`, `now`, `defaultRichTextElements`,\n * and `onError`/`onWarn` are accepted for API compatibility but have no\n * effect — Intlayer uses its own compiled dictionaries.\n *\n * The `locale` prop is forwarded to `IntlayerClientProvider`.\n */\nexport const IntlProvider: typeof _IntlProvider = ({\n locale,\n children,\n messages: _messages,\n formats: _formats,\n timeZone: _timeZone,\n defaultRichTextElements: _defaultRichTextElements,\n onError: _onError,\n ...rest\n}) => {\n const intlObject = useMemo(\n () => createIntlObject(locale as LocalesValues),\n [locale]\n );\n\n if (\n process.env.NODE_ENV === 'development' &&\n typeof _messages !== 'undefined'\n ) {\n const appLogger = getAppLogger({ log });\n appLogger(\n `${colorize('IntlProvider', CYAN)} do not pass the messages prop with intlayer. Messages are loaded automatically under the hood for bundle optimization reasons.`\n );\n }\n\n return (\n <IntlContext.Provider value={intlObject}>\n <IntlayerProvider locale={locale as LocalesValues} {...(rest as object)}>\n {children}\n </IntlayerProvider>\n </IntlContext.Provider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,MAAa,gBAAsC,EACjD,QACA,UACA,UAAU,WACV,SAAS,UACT,UAAU,WACV,yBAAyB,0BACzB,SAAS,UACT,GAAG,WACC;CACJ,MAAM,sCACEA,0CAAiB,MAAuB,GAC9C,CAAC,MAAM,CACT;CAEA,IACE,QAAQ,IAAI,aAAa,iBACzB,OAAO,cAAc,aAGrB,0CAD+B,EAAE,gCAAI,CAC7B,CAAC,CACP,yCAAY,gBAAgBC,4BAAI,EAAE,gIACpC;CAGF,OACE,2CAACC,4BAAY,UAAb;EAAsB,OAAO;YAC3B,2CAACC,iCAAD;GAA0B;GAAyB,GAAK;GACrD;EACe;CACE;AAE1B"}