@intlayer/docs 8.4.5 → 8.4.6

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 (48) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +20 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +20 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +1 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/configuration.md +520 -722
  8. package/docs/ar/intlayer_with_storybook.md +521 -0
  9. package/docs/bn/configuration.md +922 -0
  10. package/docs/bn/intlayer_with_hono.md +428 -0
  11. package/docs/de/configuration.md +369 -743
  12. package/docs/de/intlayer_with_storybook.md +521 -0
  13. package/docs/en/configuration.md +181 -507
  14. package/docs/en/intlayer_with_storybook.md +521 -0
  15. package/docs/en-GB/configuration.md +456 -657
  16. package/docs/en-GB/intlayer_with_storybook.md +521 -0
  17. package/docs/es/configuration.md +379 -754
  18. package/docs/es/intlayer_with_storybook.md +521 -0
  19. package/docs/fr/configuration.md +376 -757
  20. package/docs/fr/intlayer_with_storybook.md +521 -0
  21. package/docs/hi/configuration.md +532 -728
  22. package/docs/hi/intlayer_with_storybook.md +521 -0
  23. package/docs/id/configuration.md +371 -684
  24. package/docs/id/intlayer_with_storybook.md +521 -0
  25. package/docs/it/configuration.md +397 -775
  26. package/docs/it/intlayer_with_storybook.md +521 -0
  27. package/docs/ja/configuration.md +525 -724
  28. package/docs/ja/intlayer_with_storybook.md +521 -0
  29. package/docs/ko/configuration.md +525 -724
  30. package/docs/ko/intlayer_with_storybook.md +521 -0
  31. package/docs/pl/configuration.md +430 -734
  32. package/docs/pl/intlayer_with_storybook.md +521 -0
  33. package/docs/pt/configuration.md +375 -746
  34. package/docs/pt/intlayer_with_storybook.md +521 -0
  35. package/docs/ru/configuration.md +532 -701
  36. package/docs/ru/intlayer_with_storybook.md +521 -0
  37. package/docs/tr/configuration.md +527 -719
  38. package/docs/tr/intlayer_with_storybook.md +521 -0
  39. package/docs/uk/configuration.md +425 -744
  40. package/docs/uk/intlayer_with_storybook.md +521 -0
  41. package/docs/ur/configuration.md +922 -0
  42. package/docs/ur/intlayer_with_hono.md +428 -0
  43. package/docs/vi/configuration.md +412 -753
  44. package/docs/vi/intlayer_with_storybook.md +521 -0
  45. package/docs/zh/configuration.md +521 -714
  46. package/docs/zh/intlayer_with_storybook.md +521 -0
  47. package/package.json +6 -6
  48. package/src/generated/docs.entry.ts +20 -0
@@ -0,0 +1,521 @@
1
+ ---
2
+ createdAt: 2026-03-20
3
+ updatedAt: 2026-03-20
4
+ title: How to set up Intlayer with Storybook
5
+ description: Learn how to make your design system multilingual using Intlayer with Storybook — compile content declarations, add a locale switcher, and preview your components in any language.
6
+ keywords:
7
+ - Internationalization
8
+ - Documentation
9
+ - Intlayer
10
+ - Storybook
11
+ - React
12
+ - i18n
13
+ - TypeScript
14
+ - Vite
15
+ - Webpack
16
+ slugs:
17
+ - doc
18
+ - storybook
19
+ history:
20
+ - version: 8.4.5
21
+ date: 2026-03-20
22
+ changes: Init doc
23
+ ---
24
+
25
+ # Intlayer with Storybook
26
+
27
+ ## Table of Contents
28
+
29
+ <TOC/>
30
+
31
+ ## What is Intlayer?
32
+
33
+ **Intlayer** is an innovative, open-source internationalization (i18n) library designed to simplify multilingual support in modern web applications. It works at the **component level** — each component owns its content declarations — keeping translations co-located with the code that uses them.
34
+
35
+ With Intlayer you can:
36
+
37
+ - **Manage translations declaratively** with per-component content files.
38
+ - **Get full TypeScript support** through auto-generated types and IDE autocompletion.
39
+ - **Switch locales at runtime** without a page reload.
40
+ - **Translate automatically** with built-in AI provider integrations.
41
+
42
+ ---
43
+
44
+ ## Why use Intlayer with Storybook?
45
+
46
+ Storybook is the industry-standard tool for developing and documenting UI components in isolation. Combining it with Intlayer lets you:
47
+
48
+ - **Preview every locale** directly inside the Storybook canvas using a toolbar switcher.
49
+ - **Catch missing translations** before they reach production.
50
+ - **Document multilingual components** with real, type-safe content rather than hard-coded strings.
51
+
52
+ ---
53
+
54
+ ## Step-by-Step Setup
55
+
56
+ <Tabs>
57
+ <Tab value="Vite Setup">
58
+
59
+ ### Step 1: Install Dependencies
60
+
61
+ ```bash packageManager="npm"
62
+ npm install intlayer react-intlayer
63
+ npm install vite-intlayer --save-dev
64
+ ```
65
+
66
+ ```bash packageManager="pnpm"
67
+ pnpm add intlayer react-intlayer
68
+ pnpm add vite-intlayer --save-dev
69
+ ```
70
+
71
+ ```bash packageManager="yarn"
72
+ yarn add intlayer react-intlayer
73
+ yarn add vite-intlayer --save-dev
74
+ ```
75
+
76
+ ```bash packageManager="bun"
77
+ bun add intlayer react-intlayer
78
+ bun add vite-intlayer --dev
79
+ ```
80
+
81
+ | Package | Role |
82
+ | ---------------- | ------------------------------------------------------------ |
83
+ | `intlayer` | Core — config, content compilation, CLI |
84
+ | `react-intlayer` | React bindings — `IntlayerProvider`, `useIntlayer` hook |
85
+ | `vite-intlayer` | Vite plugin — watches and compiles content declaration files |
86
+
87
+ ---
88
+
89
+ ### Step 2: Create an Intlayer Configuration
90
+
91
+ Create `intlayer.config.ts` at the root of your project (or inside your design-system package):
92
+
93
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
94
+ import { Locales, type IntlayerConfig } from "intlayer";
95
+
96
+ const config: IntlayerConfig = {
97
+ internationalization: {
98
+ locales: [
99
+ Locales.ENGLISH,
100
+ Locales.FRENCH,
101
+ Locales.SPANISH,
102
+ // add more locales as needed
103
+ ],
104
+ defaultLocale: Locales.ENGLISH,
105
+ },
106
+ content: {
107
+ contentDir: ["./src"], // where your *.content.ts files live
108
+ },
109
+ };
110
+
111
+ export default config;
112
+ ```
113
+
114
+ > For the full list of options see the [configuration reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md).
115
+
116
+ ---
117
+
118
+ ### Step 3: Add the Vite Plugin to Storybook
119
+
120
+ Storybook's `viteFinal` hook lets you extend the internal Vite config. Import and add the `intlayer()` plugin there:
121
+
122
+ ```typescript fileName=".storybook/main.ts" codeFormat="typescript"
123
+ import type { StorybookConfig } from "@storybook/react-vite";
124
+ import { defineConfig, mergeConfig } from "vite";
125
+ import { intlayer } from "vite-intlayer";
126
+
127
+ const config: StorybookConfig = {
128
+ stories: ["../src/**/*.stories.@(js|jsx|ts|tsx)"],
129
+ addons: [
130
+ "@storybook/addon-essentials",
131
+ // …other addons
132
+ ],
133
+ framework: {
134
+ name: "@storybook/react-vite",
135
+ options: {},
136
+ },
137
+
138
+ async viteFinal(baseConfig, { configType }) {
139
+ const env = {
140
+ command: configType === "DEVELOPMENT" ? "serve" : "build",
141
+ mode: configType === "DEVELOPMENT" ? "development" : "production",
142
+ } as const;
143
+
144
+ const viteConfig = defineConfig(() => ({
145
+ plugins: [intlayer()],
146
+ }));
147
+
148
+ return mergeConfig(baseConfig, viteConfig(env));
149
+ },
150
+ };
151
+
152
+ export default config;
153
+ ```
154
+
155
+ The `intlayer()` plugin watches your `*.content.ts` files and rebuilds dictionaries automatically whenever they change during Storybook development.
156
+
157
+ ---
158
+
159
+ ### Step 4: Add the `IntlayerProvider` Decorator and a Locale Toolbar
160
+
161
+ Storybook's `preview` file is the right place to wrap every story with the `IntlayerProvider` and expose a locale switcher in the toolbar:
162
+
163
+ ```tsx fileName=".storybook/preview.tsx" codeFormat="typescript"
164
+ import type { Preview, StoryContext } from "@storybook/react";
165
+ import { IntlayerProvider } from "react-intlayer";
166
+
167
+ const preview: Preview = {
168
+ // Wrap every story inside the IntlayerProvider
169
+ decorators: [
170
+ (Story, context: StoryContext) => {
171
+ const locale = context.globals.locale ?? "en";
172
+ return (
173
+ <IntlayerProvider locale={locale}>
174
+ <Story />
175
+ </IntlayerProvider>
176
+ );
177
+ },
178
+ ],
179
+
180
+ // Expose a locale switcher in the Storybook toolbar
181
+ globalTypes: {
182
+ locale: {
183
+ description: "Active locale",
184
+ defaultValue: "en",
185
+ toolbar: {
186
+ title: "Locale",
187
+ icon: "globe",
188
+ items: [
189
+ { value: "en", title: "English" },
190
+ { value: "fr", title: "Français" },
191
+ { value: "es", title: "Español" },
192
+ ],
193
+ dynamicTitle: true,
194
+ },
195
+ },
196
+ },
197
+
198
+ parameters: {
199
+ controls: {
200
+ matchers: {
201
+ color: /(background|color)$/i,
202
+ date: /Date$/i,
203
+ },
204
+ },
205
+ },
206
+ };
207
+
208
+ export default preview;
209
+ ```
210
+
211
+ > The `locale` values must match the locales declared in your `intlayer.config.ts`.
212
+
213
+ </Tab>
214
+ <Tab value="Webpack Setup">
215
+
216
+ ### Step 1: Install Dependencies
217
+
218
+ ```bash packageManager="npm"
219
+ npm install intlayer react-intlayer
220
+ npm install @intlayer/webpack --save-dev
221
+ ```
222
+
223
+ ```bash packageManager="pnpm"
224
+ pnpm add intlayer react-intlayer
225
+ pnpm add @intlayer/webpack --save-dev
226
+ ```
227
+
228
+ ```bash packageManager="yarn"
229
+ yarn add intlayer react-intlayer
230
+ yarn add @intlayer/webpack --save-dev
231
+ ```
232
+
233
+ ```bash packageManager="bun"
234
+ bun add intlayer react-intlayer
235
+ bun add @intlayer/webpack --dev
236
+ ```
237
+
238
+ ---
239
+
240
+ ### Step 2: Create an Intlayer Configuration
241
+
242
+ Create `intlayer.config.ts` at the root of your project:
243
+
244
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
245
+ import { Locales, type IntlayerConfig } from "intlayer";
246
+
247
+ const config: IntlayerConfig = {
248
+ internationalization: {
249
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
250
+ defaultLocale: Locales.ENGLISH,
251
+ },
252
+ content: {
253
+ contentDir: ["./src"],
254
+ },
255
+ };
256
+
257
+ export default config;
258
+ ```
259
+
260
+ ---
261
+
262
+ ### Step 3: Configure Storybook's Webpack
263
+
264
+ For Webpack-based Storybook setups (e.g. `@storybook/react-webpack5`), extend the webpack config via `webpackFinal` to add the Intlayer aliases and loader:
265
+
266
+ ```typescript fileName=".storybook/main.ts" codeFormat="typescript"
267
+ import type { StorybookConfig } from "@storybook/react-webpack5";
268
+ import { IntlayerWebpackPlugin } from "@intlayer/webpack";
269
+
270
+ const config: StorybookConfig = {
271
+ stories: ["../src/**/*.stories.@(js|jsx|ts|tsx)"],
272
+ addons: ["@storybook/addon-essentials"],
273
+ framework: {
274
+ name: "@storybook/react-webpack5",
275
+ options: {},
276
+ },
277
+
278
+ webpackFinal: async (baseConfig) => {
279
+ baseConfig.plugins = [
280
+ ...(baseConfig.plugins ?? []),
281
+ new IntlayerWebpackPlugin(),
282
+ ];
283
+ return baseConfig;
284
+ },
285
+ };
286
+
287
+ export default config;
288
+ ```
289
+
290
+ ---
291
+
292
+ ### Step 4: Add the `IntlayerProvider` Decorator and a Locale Toolbar
293
+
294
+ Same as the Vite setup — add the decorator and global locale type in `.storybook/preview.tsx`:
295
+
296
+ ```tsx fileName=".storybook/preview.tsx" codeFormat="typescript"
297
+ import type { Preview, StoryContext } from "@storybook/react";
298
+ import { IntlayerProvider } from "react-intlayer";
299
+
300
+ const preview: Preview = {
301
+ decorators: [
302
+ (Story, context: StoryContext) => {
303
+ const locale = context.globals.locale ?? "en";
304
+ return (
305
+ <IntlayerProvider locale={locale}>
306
+ <Story />
307
+ </IntlayerProvider>
308
+ );
309
+ },
310
+ ],
311
+
312
+ globalTypes: {
313
+ locale: {
314
+ description: "Active locale",
315
+ defaultValue: "en",
316
+ toolbar: {
317
+ title: "Locale",
318
+ icon: "globe",
319
+ items: [
320
+ { value: "en", title: "English" },
321
+ { value: "fr", title: "Français" },
322
+ { value: "es", title: "Español" },
323
+ ],
324
+ dynamicTitle: true,
325
+ },
326
+ },
327
+ },
328
+ };
329
+
330
+ export default preview;
331
+ ```
332
+
333
+ </Tab>
334
+ </Tabs>
335
+
336
+ ---
337
+
338
+ ## Declaring Content
339
+
340
+ Create a `*.content.ts` file next to each component. Intlayer picks it up automatically during compilation.
341
+
342
+ ```typescript fileName="src/components/CopyButton/CopyButton.content.ts" codeFormat="typescript"
343
+ import { type Dictionary, t } from "intlayer";
344
+
345
+ const copyButtonContent = {
346
+ key: "copy-button",
347
+ content: {
348
+ label: t({
349
+ en: "Copy content",
350
+ fr: "Copier le contenu",
351
+ es: "Copiar contenido",
352
+ }),
353
+ },
354
+ } satisfies Dictionary;
355
+
356
+ export default copyButtonContent;
357
+ ```
358
+
359
+ ```javascript fileName="src/components/CopyButton/CopyButton.content.mjs" codeFormat="esm"
360
+ import { t } from "intlayer";
361
+
362
+ /** @type {import('intlayer').Dictionary} */
363
+ const copyButtonContent = {
364
+ key: "copy-button",
365
+ content: {
366
+ label: t({
367
+ en: "Copy content",
368
+ fr: "Copier le contenu",
369
+ es: "Copiar contenido",
370
+ }),
371
+ },
372
+ };
373
+
374
+ export default copyButtonContent;
375
+ ```
376
+
377
+ ```javascript fileName="src/components/CopyButton/CopyButton.content.cjs" codeFormat="commonjs"
378
+ const { t } = require("intlayer");
379
+
380
+ /** @type {import('intlayer').Dictionary} */
381
+ const copyButtonContent = {
382
+ key: "copy-button",
383
+ content: {
384
+ label: t({
385
+ en: "Copy content",
386
+ fr: "Copier le contenu",
387
+ es: "Copiar contenido",
388
+ }),
389
+ },
390
+ };
391
+
392
+ module.exports = copyButtonContent;
393
+ ```
394
+
395
+ > For more content declaration formats and features see the [content declaration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md).
396
+
397
+ ---
398
+
399
+ ## Using `useIntlayer` in a Component
400
+
401
+ ```tsx fileName="src/components/CopyButton/index.tsx" codeFormat="typescript"
402
+ "use client";
403
+
404
+ import { type FC } from "react";
405
+ import { useIntlayer } from "react-intlayer";
406
+
407
+ type CopyButtonProps = {
408
+ content: string;
409
+ };
410
+
411
+ export const CopyButton: FC<CopyButtonProps> = ({ content }) => {
412
+ const { label } = useIntlayer("copy-button");
413
+
414
+ return (
415
+ <button
416
+ onClick={() => navigator.clipboard.writeText(content)}
417
+ aria-label={label.value}
418
+ title={label.value}
419
+ >
420
+ Copy
421
+ </button>
422
+ );
423
+ };
424
+ ```
425
+
426
+ `useIntlayer` returns the compiled dictionary for the current locale provided by the nearest `IntlayerProvider`. Switching the locale in the Storybook toolbar automatically re-renders the story with updated translations.
427
+
428
+ ---
429
+
430
+ ## Writing Stories for Internationalized Components
431
+
432
+ With the `IntlayerProvider` decorator in place, your stories work exactly as before. The locale toolbar controls the active locale for the entire canvas:
433
+
434
+ ```tsx fileName="src/components/CopyButton/CopyButton.stories.tsx" codeFormat="typescript"
435
+ import type { Meta, StoryObj } from "@storybook/react";
436
+ import { CopyButton } from ".";
437
+
438
+ const meta: Meta<typeof CopyButton> = {
439
+ title: "Components/CopyButton",
440
+ component: CopyButton,
441
+ tags: ["autodocs"],
442
+ argTypes: {
443
+ content: { control: "text" },
444
+ },
445
+ };
446
+
447
+ export default meta;
448
+ type Story = StoryObj<typeof CopyButton>;
449
+
450
+ /** Default story — switch the locale in the toolbar to preview translations. */
451
+ export const Default: Story = {
452
+ args: {
453
+ content: "npm install intlayer react-intlayer",
454
+ },
455
+ };
456
+
457
+ /** Renders the button inside a code block, a common real-world use case. */
458
+ export const InsideCodeBlock: Story = {
459
+ render: (args) => (
460
+ <div style={{ position: "relative", display: "inline-block" }}>
461
+ <pre style={{ background: "#1e1e1e", color: "#fff", padding: "1rem" }}>
462
+ <code>{args.content}</code>
463
+ </pre>
464
+ <CopyButton
465
+ content={args.content}
466
+ style={{ position: "absolute", top: 8, right: 8 }}
467
+ />
468
+ </div>
469
+ ),
470
+ args: {
471
+ content: "npx intlayer init",
472
+ },
473
+ };
474
+ ```
475
+
476
+ > Each story inherits the `locale` global from the toolbar, so you can verify every locale without changing any story code.
477
+
478
+ ---
479
+
480
+ ## Testing Translations in Stories
481
+
482
+ Use Storybook's `play` functions to assert that the correct translated text is rendered for a given locale:
483
+
484
+ ```tsx fileName="src/components/CopyButton/CopyButton.stories.tsx" codeFormat="typescript"
485
+ import type { Meta, StoryObj } from "@storybook/react";
486
+ import { expect, within } from "@storybook/test";
487
+ import { CopyButton } from ".";
488
+
489
+ const meta: Meta<typeof CopyButton> = {
490
+ title: "Components/CopyButton",
491
+ component: CopyButton,
492
+ tags: ["autodocs"],
493
+ };
494
+
495
+ export default meta;
496
+ type Story = StoryObj<typeof CopyButton>;
497
+
498
+ export const AccessibleLabel: Story = {
499
+ args: { content: "Hello World" },
500
+ play: async ({ canvasElement }) => {
501
+ const canvas = within(canvasElement);
502
+ const button = canvas.getByRole("button");
503
+
504
+ // Verify the button has a non-empty accessible name
505
+ await expect(button).toHaveAccessibleName();
506
+ // Verify the button is not disabled
507
+ await expect(button).not.toBeDisabled();
508
+ // Verify keyboard accessibility
509
+ await expect(button).toHaveAttribute("tabindex", "0");
510
+ },
511
+ };
512
+ ```
513
+
514
+ ---
515
+
516
+ ## Additional Resources
517
+
518
+ - [Intlayer configuration reference](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/configuration.md)
519
+ - [Content declaration documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/dictionary/content_file.md)
520
+ - [Intlayer CLI documentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/cli/index.md)
521
+ - [Storybook documentation](https://storybook.js.org/docs)