@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: StorybookでIntlayerをセットアップする方法
5
+ description: IntlayerとStorybookを使用して、デザインシステムを多言語化する方法を学びます — コンテンツ宣言のコンパイル、ロケールスイッチャーの追加、および任意の言語でのコンポーネントのプレビュー。
6
+ keywords:
7
+ - 国際化
8
+ - ドキュメント
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
+ # StorybookでIntlayerを使用する
26
+
27
+ ## 目次
28
+
29
+ <TOC/>
30
+
31
+ ## Intlayerとは?
32
+
33
+ **Intlayer**は、現代的なウェブアプリケーションでの多言語サポートを簡素化するために設計された、革新的でオープンソースな国際化(i18n)ライブラリです。**コンポーネントレベル**で動作し、各コンポーネントが自らのコンテンツ宣言を所有するため、翻訳を使用するコードと同じ場所に配置できます。
34
+
35
+ Intlayerを使用すると、以下のことが可能になります:
36
+
37
+ - **宣言的な翻訳管理**: コンポーネントごとのコンテンツファイルを使用します。
38
+ - **完全なTypeScriptサポート**: 自動生成された型とIDEのオートコンプリート。
39
+ - **ランタイムでのロケール切り替え**: ページのリロードなし。
40
+ - **自動翻訳**: 組み込みのAIプロバイダー統合。
41
+
42
+ ---
43
+
44
+ ## なぜStorybookでIntlayerを使用するのか?
45
+
46
+ Storybookは、UIコンポーネントを分離して開発およびドキュメント化するための業界標準ツールです。これをIntlayerと組み合わせることで、以下のメリットが得られます:
47
+
48
+ - **すべてのロケールをプレビュー**: Storybookのツールバースイッチャーを使用して、キャンバス内で直接確認できます。
49
+ - **翻訳の欠落を防止**: 本番環境に到達する前にエラーを発見できます。
50
+ - **多言語コンポーネントのドキュメント化**: ハードコードされた文字列ではなく、実際のタイプセーフなコンテンツでドキュメント化できます。
51
+
52
+ ---
53
+
54
+ ## ステップバイステップのセットアップ
55
+
56
+ <Tabs>
57
+ <Tab value="Vite Setup">
58
+
59
+ ### ステップ 1: 依存関係のインストール
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
+ | パッケージ | 役割 |
82
+ | ---------------- | -------------------------------------------------------------- |
83
+ | `intlayer` | コア — 設定、コンテンツのコンパイル、CLI |
84
+ | `react-intlayer` | Reactバインディング — `IntlayerProvider`, `useIntlayer` フック |
85
+ | `vite-intlayer` | Viteプラグイン — コンテンツ宣言ファイルの監視とコンパイル |
86
+
87
+ ---
88
+
89
+ ### ステップ 2: Intlayer設定の作成
90
+
91
+ プロジェクトのルート(またはデザインシステムパッケージ内)に `intlayer.config.ts` を作成します:
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
+ // 必要に応じてロケールを追加
103
+ ],
104
+ defaultLocale: Locales.ENGLISH,
105
+ },
106
+ content: {
107
+ contentDir: ["./src"], // *.content.ts ファイルが配置されている場所
108
+ },
109
+ };
110
+
111
+ export default config;
112
+ ```
113
+
114
+ > オプションの全リストについては、[設定リファレンス](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)を参照してください。
115
+
116
+ ---
117
+
118
+ ### ステップ 3: StorybookにViteプラグインを追加する
119
+
120
+ Storybookの `viteFinal` フックを使用して、内部のVite設定を拡張できます。そこで `intlayer()` プラグインをインポートして追加します:
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
+ // …その他のアドオン
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
+ `intlayer()` プラグインは `*.content.ts` ファイルを監視し、Storybookの開発中に変更があれば自動的に辞書を再構築します。
156
+
157
+ ---
158
+
159
+ ### ステップ 4: `IntlayerProvider` デコレーターとロケールツールバーの追加
160
+
161
+ Storybookの `preview` ファイルは、すべてのストーリーを `IntlayerProvider` でラップし、ツールバーにロケールスイッチャーを表示するのに最適な場所です:
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
+ // すべてのストーリーを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
+ // Storybookツールバーにロケールスイッチャーを表示
181
+ globalTypes: {
182
+ locale: {
183
+ description: "アクティブなロケール",
184
+ defaultValue: "en",
185
+ toolbar: {
186
+ title: "ロケール",
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
+ > `locale` の値は `intlayer.config.ts` で宣言されたロケールと一致する必要があります。
212
+
213
+ </Tab>
214
+ <Tab value="Webpack Setup">
215
+
216
+ ### ステップ 1: 依存関係のインストール
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
+ ### ステップ 2: Intlayer設定の作成
241
+
242
+ プロジェクトのルートに `intlayer.config.ts` を作成します:
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
+ ### ステップ 3: StorybookのWebpackを設定する
263
+
264
+ WebpackベースのStorybookセットアップ(例: `@storybook/react-webpack5`)の場合、`webpackFinal` を介してwebpack設定を拡張し、Intlayerエイリアスとローダーを追加します:
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
+ ### ステップ 4: `IntlayerProvider` デコレーターとロケールツールバーの追加
293
+
294
+ Viteセットアップと同様に、デコレーターとグローバルロケール型を `.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: "アクティブなロケール",
315
+ defaultValue: "en",
316
+ toolbar: {
317
+ title: "ロケール",
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
+ ## コンテンツの宣言
339
+
340
+ 各コンポーネントの隣に `*.content.ts` ファイルを作成します。Intlayerはコンパイル中に自動的にこれを検出します。
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
+ > その他のコンテンツ宣言形式や機能については、[コンテンツ宣言のドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/content_file.md)を参照してください。
396
+
397
+ ---
398
+
399
+ ## コンポーネントでの `useIntlayer` の使用
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
+ コピー
421
+ </button>
422
+ );
423
+ };
424
+ ```
425
+
426
+ `useIntlayer` は、最も近い `IntlayerProvider` から提供される現在のロケールのコンパイル済み辞書を返します。Storybookのツールバーでロケールを切り替えると、更新された翻訳でストーリーが自動的に再レンダリングされます。
427
+
428
+ ---
429
+
430
+ ## 国際化されたコンポーネントのストーリー作成
431
+
432
+ `IntlayerProvider` デコレーターを配置すると、ストーリーは以前とまったく同じように動作します。ロケールツールバーはキャンバス全体の有効なロケールを制御します:
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
+ /** デフォルトのストーリー — ツールバーでロケールを切り替えて翻訳をプレビューします。 */
451
+ export const Default: Story = {
452
+ args: {
453
+ content: "npm install intlayer react-intlayer",
454
+ },
455
+ };
456
+
457
+ /** コードブロック内にボタンを表示する一般的なユースケース。 */
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
+ > 各ストーリーはツールバーから `locale` グローバルを継承するため、ストーリーコードを変更することなく、すべてのロケールを確認できます。
477
+
478
+ ---
479
+
480
+ ## ストーリー内での翻訳のテスト
481
+
482
+ Storybookの `play` 関数を使用して、特定のロケールに対して正しい翻訳テキストがレンダリングされていることを確認します:
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
+ // ボタンに空でないアクセシブルな名前があることを確認
505
+ await expect(button).toHaveAccessibleName();
506
+ // ボタンが無効になっていないことを確認
507
+ await expect(button).not.toBeDisabled();
508
+ // キーボードのアクセシビリティを確認
509
+ await expect(button).toHaveAttribute("tabindex", "0");
510
+ },
511
+ };
512
+ ```
513
+
514
+ ---
515
+
516
+ ## その他のリソース
517
+
518
+ - [Intlayer 設定リファレンス](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/configuration.md)
519
+ - [コンテンツ宣言ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/dictionary/content_file.md)
520
+ - [Intlayer CLI ドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/cli/index.md)
521
+ - [Storybook ドキュメント](https://storybook.js.org/docs)