@intlayer/docs 7.1.9 → 7.2.2

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 (45) hide show
  1. package/README.md +1 -0
  2. package/dist/cjs/generated/docs.entry.cjs +19 -0
  3. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  4. package/dist/esm/generated/docs.entry.mjs +19 -0
  5. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  6. package/dist/types/generated/docs.entry.d.ts +1 -0
  7. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  8. package/docs/ar/intlayer_with_svelte_kit.md +738 -0
  9. package/docs/ar/intlayer_with_vite+svelte.md +288 -104
  10. package/docs/de/intlayer_with_svelte_kit.md +738 -0
  11. package/docs/de/intlayer_with_vite+svelte.md +302 -101
  12. package/docs/en/intlayer_with_nextjs_16.md +10 -2
  13. package/docs/en/intlayer_with_svelte_kit.md +570 -0
  14. package/docs/en/intlayer_with_vite+svelte.md +22 -6
  15. package/docs/en/introduction.md +2 -0
  16. package/docs/en-GB/intlayer_with_svelte_kit.md +738 -0
  17. package/docs/en-GB/intlayer_with_vite+svelte.md +262 -84
  18. package/docs/es/intlayer_with_svelte_kit.md +738 -0
  19. package/docs/es/intlayer_with_vite+svelte.md +300 -107
  20. package/docs/fr/intlayer_with_svelte_kit.md +770 -0
  21. package/docs/fr/intlayer_with_vite+svelte.md +297 -101
  22. package/docs/hi/intlayer_with_svelte_kit.md +738 -0
  23. package/docs/hi/intlayer_with_vite+svelte.md +298 -108
  24. package/docs/id/intlayer_with_svelte_kit.md +738 -0
  25. package/docs/id/intlayer_with_vite+svelte.md +277 -99
  26. package/docs/it/intlayer_with_svelte_kit.md +770 -0
  27. package/docs/it/intlayer_with_vite+svelte.md +275 -99
  28. package/docs/ja/intlayer_with_svelte_kit.md +738 -0
  29. package/docs/ja/intlayer_with_vite+svelte.md +295 -110
  30. package/docs/ko/intlayer_with_svelte_kit.md +738 -0
  31. package/docs/ko/intlayer_with_vite+svelte.md +286 -199
  32. package/docs/pl/intlayer_with_svelte_kit.md +740 -0
  33. package/docs/pl/intlayer_with_vite+svelte.md +273 -101
  34. package/docs/pt/intlayer_with_svelte_kit.md +772 -0
  35. package/docs/pt/intlayer_with_vite+svelte.md +290 -96
  36. package/docs/ru/intlayer_with_svelte_kit.md +738 -0
  37. package/docs/ru/intlayer_with_vite+svelte.md +275 -99
  38. package/docs/tr/intlayer_with_svelte_kit.md +738 -0
  39. package/docs/tr/intlayer_with_vite+svelte.md +297 -119
  40. package/docs/vi/intlayer_with_svelte_kit.md +738 -0
  41. package/docs/vi/intlayer_with_vite+svelte.md +275 -102
  42. package/docs/zh/intlayer_with_svelte_kit.md +738 -0
  43. package/docs/zh/intlayer_with_vite+svelte.md +309 -107
  44. package/package.json +9 -9
  45. package/src/generated/docs.entry.ts +19 -0
@@ -0,0 +1,738 @@
1
+ ---
2
+ createdAt: 2025-11-20
3
+ updatedAt: 2025-11-20
4
+ title: SvelteKitアプリを翻訳する方法 – i18nガイド 2025
5
+ description: SvelteKitのウェブサイトを多言語対応にする方法を紹介します。Server-Side Rendering(SSR)を使って国際化(i18n)および翻訳を行うためのドキュメントに従ってください。
6
+ keywords:
7
+ - 国際化
8
+ - ドキュメント
9
+ - Intlayer
10
+ - SvelteKit
11
+ - JavaScript
12
+ - SSR
13
+ slugs:
14
+ - doc
15
+ - environment
16
+ - sveltekit
17
+ applicationTemplate: https://github.com/aymericzip/intlayer-sveltekit-template
18
+ history:
19
+ - version: 7.1.10
20
+ date: 2025-11-20
21
+ changes: 初期履歴
22
+ ---
23
+
24
+ # Intlayerを使ってSvelteKitのウェブサイトを翻訳する | 国際化(i18n)
25
+
26
+ ## 目次
27
+
28
+ <TOC/>
29
+
30
+ ## Intlayerとは何ですか?
31
+
32
+ **Intlayer**は、モダンなウェブアプリケーションにおける多言語対応を簡素化するために設計された革新的なオープンソースの国際化(i18n)ライブラリです。**SvelteKit**のサーバーサイドレンダリング(SSR)機能とシームレスに連携します。
33
+
34
+ Intlayerを使うことで、以下が可能になります:
35
+
36
+ - **コンポーネントレベルで宣言的な辞書を使い、翻訳を簡単に管理**できます。
37
+ - **メタデータ、ルート、コンテンツを動的にローカライズ**できます。
38
+ - **自動生成される型情報でTypeScriptのサポートを保証**します。
39
+ - **SvelteKitのSSRを活用してSEOに優しい国際化を実現**します。
40
+
41
+ ---
42
+
43
+ ## SvelteKitアプリケーションでIntlayerをセットアップするステップバイステップガイド
44
+
45
+ まずは新しいSvelteKitプロジェクトを作成しましょう。以下は最終的に作成する構成です:
46
+
47
+ <iframe
48
+ src="https://stackblitz.com/github/aymericzip/intlayer-sveltekit-template?embed=1&ctl=1&file=intlayer.config.ts"
49
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
50
+ title="Demo CodeSandbox - Cách quốc tế hóa ứng dụng của bạn bằng Intlayer"
51
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
52
+ loading="lazy"
53
+ />
54
+
55
+ ```bash
56
+ .
57
+ ├── intlayer.config.ts
58
+ ├── package.json
59
+ ├── src
60
+ │ ├── app.d.ts
61
+ │   ├── app.html
62
+ │   ├── hooks.server.ts
63
+ │   ├── lib
64
+ │   │   ├── getLocale.ts
65
+ │   │   ├── LocaleSwitcher.svelte
66
+ │   │   └── LocalizedLink.svelte
67
+ │   ├── params
68
+ │   │   └── locale.ts
69
+ │   └── routes
70
+ │   ├── [[locale=locale]]
71
+ │   │   ├── +layout.svelte
72
+ │   │   ├── +layout.ts
73
+ │   │   ├── +page.svelte
74
+ │   │   ├── +page.ts
75
+ │   │   ├── about
76
+ │   │   │   ├── +page.svelte
77
+ │   │   │   ├── +page.ts
78
+ │   │   │   └── page.content.ts
79
+ │   │   ├── Counter.content.ts
80
+ │   │   ├── Counter.svelte
81
+ │   │   ├── Header.content.ts
82
+ │   │   ├── Header.svelte
83
+ │   │   ├── home.content.ts
84
+ │   │   └── layout.content.ts
85
+ │   ├── +layout.svelte
86
+ │   └── layout.css
87
+ ├── static
88
+ │   ├── favicon.svg
89
+ │   └── robots.txt
90
+ ├── svelte.config.js
91
+ ├── tsconfig.json
92
+ └── vite.config.ts
93
+ ```
94
+
95
+ ### ステップ 1: 依存関係のインストール
96
+
97
+ npm を使用して必要なパッケージをインストールします:
98
+
99
+ ```bash packageManager="npm"
100
+ npm install intlayer svelte-intlayer
101
+ npm install vite-intlayer --save-dev
102
+ ```
103
+
104
+ ```bash packageManager="pnpm"
105
+ pnpm add intlayer svelte-intlayer
106
+ pnpm add vite-intlayer --save-dev
107
+ ```
108
+
109
+ ```bash packageManager="yarn"
110
+ yarn add intlayer svelte-intlayer
111
+ yarn add vite-intlayer --save-dev
112
+ ```
113
+
114
+ ```bash packageManager="bun"
115
+ bun add intlayer svelte-intlayer
116
+ bun add vite-intlayer --save-dev
117
+ ```
118
+
119
+ - **intlayer**: コアのi18nパッケージです。
120
+ - **svelte-intlayer**: Svelte/SvelteKit用のコンテキストプロバイダーとストアを提供します。
121
+ - **vite-intlayer**: コンテンツ宣言をビルドプロセスに統合するためのViteプラグインです。
122
+
123
+ ### ステップ 2: プロジェクトの設定
124
+
125
+ プロジェクトのルートに設定ファイルを作成します:
126
+
127
+ ```typescript fileName="intlayer.config.ts"
128
+ import { Locales, type IntlayerConfig } from "intlayer";
129
+
130
+ const config: IntlayerConfig = {
131
+ internationalization: {
132
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
133
+ defaultLocale: Locales.ENGLISH,
134
+ },
135
+ };
136
+
137
+ export default config;
138
+ ```
139
+
140
+ ### ステップ 3: Vite設定にIntlayerを統合する
141
+
142
+ `vite.config.ts`を更新してIntlayerプラグインを含めます。このプラグインはコンテンツファイルのトランスパイルを処理します。
143
+
144
+ ```typescript fileName="vite.config.ts"
145
+ import { sveltekit } from "@sveltejs/kit/vite";
146
+ import { defineConfig } from "vite";
147
+ import { intlayer } from "vite-intlayer";
148
+
149
+ export default defineConfig({
150
+ plugins: [intlayer(), sveltekit()], // 順序が重要です。IntlayerはSvelteKitの前に配置してください
151
+ });
152
+ ```
153
+
154
+ ### ステップ4: コンテンツの宣言
155
+
156
+ `src`フォルダ内の任意の場所(例: `src/lib/content` やコンポーネントと同じ場所)にコンテンツ宣言ファイルを作成します。これらのファイルは、各ロケールごとに `t()` 関数を使用してアプリケーションの翻訳可能なコンテンツを定義します。
157
+
158
+ ```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat="typescript"
159
+ import { t, type Dictionary } from "intlayer";
160
+
161
+ const heroContent = {
162
+ key: "hero-section",
163
+ content: {
164
+ title: t({
165
+ en: "Welcome to SvelteKit",
166
+ fr: "Bienvenue sur SvelteKit",
167
+ es: "Bienvenido a SvelteKit",
168
+ }),
169
+ },
170
+ } satisfies Dictionary;
171
+
172
+ export default heroContent;
173
+ ```
174
+
175
+ ### ステップ5: コンポーネントでIntlayerを利用する
176
+
177
+ 今や、任意のSvelteコンポーネント内で`useIntlayer`関数を使用できます。この関数はリアクティブなストアを返し、ロケールが変更されると自動的に更新されます。関数は現在のロケールを自動的に尊重します(SSRおよびクライアントサイドのナビゲーションの両方で)。
178
+
179
+ > **注意:** `useIntlayer`はSvelteのストアを返すため、そのリアクティブな値にアクセスするには`---
180
+ > createdAt: 2025-11-20
181
+ > updatedAt: 2025-11-20
182
+ > title: SvelteKitアプリを翻訳する方法 – i18nガイド 2025
183
+ > description: SvelteKitのウェブサイトを多言語対応にする方法を紹介します。Server-Side Rendering(SSR)を使って国際化(i18n)および翻訳を行うためのドキュメントに従ってください。
184
+ > keywords:
185
+
186
+ - 国際化
187
+ - ドキュメント
188
+ - Intlayer
189
+ - SvelteKit
190
+ - JavaScript
191
+ - SSR
192
+ slugs:
193
+ - doc
194
+ - environment
195
+ - sveltekit
196
+ applicationTemplate: https://github.com/aymericzip/intlayer-sveltekit-template
197
+ history:
198
+ - version: 7.1.10
199
+ date: 2025-11-20
200
+ changes: 初期履歴
201
+
202
+ ---
203
+
204
+ # Intlayerを使ってSvelteKitのウェブサイトを翻訳する | 国際化(i18n)
205
+
206
+ ## 目次
207
+
208
+ <TOC/>
209
+
210
+ ## Intlayerとは何ですか?
211
+
212
+ **Intlayer**は、モダンなウェブアプリケーションにおける多言語対応を簡素化するために設計された革新的なオープンソースの国際化(i18n)ライブラリです。**SvelteKit**のサーバーサイドレンダリング(SSR)機能とシームレスに連携します。
213
+
214
+ Intlayerを使うことで、以下が可能になります:
215
+
216
+ - **コンポーネントレベルで宣言的な辞書を使い、翻訳を簡単に管理**できます。
217
+ - **メタデータ、ルート、コンテンツを動的にローカライズ**できます。
218
+ - **自動生成される型情報でTypeScriptのサポートを保証**します。
219
+ - **SvelteKitのSSRを活用してSEOに優しい国際化を実現**します。
220
+
221
+ ---
222
+
223
+ ## SvelteKitアプリケーションでIntlayerをセットアップするステップバイステップガイド
224
+
225
+ まずは新しいSvelteKitプロジェクトを作成しましょう。以下は最終的に作成する構成です:
226
+
227
+ ```bash
228
+ .
229
+ ├── intlayer.config.ts
230
+ ├── package.json
231
+ ├── src
232
+ │ ├── app.d.ts
233
+ │   ├── app.html
234
+ │   ├── hooks.server.ts
235
+ │   ├── lib
236
+ │   │   ├── getLocale.ts
237
+ │   │   ├── LocaleSwitcher.svelte
238
+ │   │   └── LocalizedLink.svelte
239
+ │   ├── params
240
+ │   │   └── locale.ts
241
+ │   └── routes
242
+ │   ├── [[locale=locale]]
243
+ │   │   ├── +layout.svelte
244
+ │   │   ├── +layout.ts
245
+ │   │   ├── +page.svelte
246
+ │   │   ├── +page.ts
247
+ │   │   ├── about
248
+ │   │   │   ├── +page.svelte
249
+ │   │   │   ├── +page.ts
250
+ │   │   │   └── page.content.ts
251
+ │   │   ├── Counter.content.ts
252
+ │   │   ├── Counter.svelte
253
+ │   │   ├── Header.content.ts
254
+ │   │   ├── Header.svelte
255
+ │   │   ├── home.content.ts
256
+ │   │   └── layout.content.ts
257
+ │   ├── +layout.svelte
258
+ │   └── layout.css
259
+ ├── static
260
+ │   ├── favicon.svg
261
+ │   └── robots.txt
262
+ ├── svelte.config.js
263
+ ├── tsconfig.json
264
+ └── vite.config.ts
265
+ ```
266
+
267
+ ### ステップ 1: 依存関係のインストール
268
+
269
+ npm を使用して必要なパッケージをインストールします:
270
+
271
+ ```bash packageManager="npm"
272
+ npm install intlayer svelte-intlayer
273
+ npm install vite-intlayer --save-dev
274
+ ```
275
+
276
+ ```bash packageManager="pnpm"
277
+ pnpm add intlayer svelte-intlayer
278
+ pnpm add vite-intlayer --save-dev
279
+ ```
280
+
281
+ ```bash packageManager="yarn"
282
+ yarn add intlayer svelte-intlayer
283
+ yarn add vite-intlayer --save-dev
284
+ ```
285
+
286
+ ```bash packageManager="bun"
287
+ bun add intlayer svelte-intlayer
288
+ bun add vite-intlayer --save-dev
289
+ ```
290
+
291
+ - **intlayer**: コアのi18nパッケージです。
292
+ - **svelte-intlayer**: Svelte/SvelteKit用のコンテキストプロバイダーとストアを提供します。
293
+ - **vite-intlayer**: コンテンツ宣言をビルドプロセスに統合するためのViteプラグインです。
294
+
295
+ ### ステップ 2: プロジェクトの設定
296
+
297
+ プロジェクトのルートに設定ファイルを作成します:
298
+
299
+ ```typescript fileName="intlayer.config.ts"
300
+ import { Locales, type IntlayerConfig } from "intlayer";
301
+
302
+ const config: IntlayerConfig = {
303
+ internationalization: {
304
+ locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
305
+ defaultLocale: Locales.ENGLISH,
306
+ },
307
+ };
308
+
309
+ export default config;
310
+ ```
311
+
312
+ ### ステップ 3: Vite設定にIntlayerを統合する
313
+
314
+ `vite.config.ts`を更新してIntlayerプラグインを含めます。このプラグインはコンテンツファイルのトランスパイルを処理します。
315
+
316
+ ```typescript fileName="vite.config.ts"
317
+ import { sveltekit } from "@sveltejs/kit/vite";
318
+ import { defineConfig } from "vite";
319
+ import { intlayer } from "vite-intlayer";
320
+
321
+ export default defineConfig({
322
+ plugins: [intlayer(), sveltekit()], // 順序が重要です。IntlayerはSvelteKitの前に配置してください
323
+ });
324
+ ```
325
+
326
+ ### ステップ4: コンテンツの宣言
327
+
328
+ `src`フォルダ内の任意の場所(例: `src/lib/content` やコンポーネントと同じ場所)にコンテンツ宣言ファイルを作成します。これらのファイルは、各ロケールごとに `t()` 関数を使用してアプリケーションの翻訳可能なコンテンツを定義します。
329
+
330
+ ```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat="typescript"
331
+ import { t, type Dictionary } from "intlayer";
332
+
333
+ const heroContent = {
334
+ key: "hero-section",
335
+ content: {
336
+ title: t({
337
+ en: "Welcome to SvelteKit",
338
+ fr: "Bienvenue sur SvelteKit",
339
+ es: "Bienvenido a SvelteKit",
340
+ }),
341
+ },
342
+ } satisfies Dictionary;
343
+
344
+ export default heroContent;
345
+ ```
346
+
347
+ ### ステップ5: コンポーネントでIntlayerを利用する
348
+
349
+ プレフィックスを使用する必要があります(例:`$content.title`)。
350
+
351
+ ```svelte fileName="src/lib/components/Component.svelte"
352
+ <script lang="ts">
353
+ import { useIntlayer } from "svelte-intlayer";
354
+
355
+ // "hero-section"はステップ4で定義したキーに対応します
356
+ const content = useIntlayer("hero-section");
357
+ </script>
358
+
359
+ <!-- コンテンツを単純にレンダリング -->
360
+ <h1>{$content.title}</h1>
361
+ <!-- エディターを使って編集可能なコンテンツとしてレンダリング -->
362
+ <h1><svelte:component this={$content.title} /></h1>
363
+ <!-- コンテンツを文字列としてレンダリングする場合 -->
364
+ <div aria-label={$content.title.value}></div>
365
+ ```
366
+
367
+ ### (オプション)ステップ6: ルーティングの設定
368
+
369
+ 以下の手順では、SvelteKitでロケールベースのルーティングを設定する方法を示します。これにより、URLにロケールのプレフィックス(例:`/en/about`、`/fr/about`)を含めることができ、SEOやユーザー体験が向上します。
370
+
371
+ ```bash
372
+ .
373
+ └─── src
374
+ ├── app.d.ts # ロケールタイプを定義
375
+ ├── hooks.server.ts # ロケールルーティングを管理
376
+ ├── lib
377
+ │   └── getLocale.ts # ヘッダーやクッキーからロケールをチェック
378
+ ├── params
379
+ │   └── locale.ts # ロケールパラメータを定義
380
+ └── routes
381
+ ├── [[locale=locale]] # ルートグループでロケールを設定するためにラップ
382
+ │   ├── +layout.svelte # ルートのローカルレイアウト
383
+ │   ├── +layout.ts
384
+ │   ├── +page.svelte
385
+ │   ├── +page.ts
386
+ │   └── about
387
+ │      ├── +page.svelte
388
+ │      └── +page.ts
389
+ └── +layout.svelte # フォントとグローバルスタイルのためのルートレイアウト
390
+ ```
391
+
392
+ ### ステップ7: サーバーサイドのロケール検出を処理する(Hooks)
393
+
394
+ SvelteKitでは、SSR中に正しいコンテンツをレンダリングするためにサーバーがユーザーのロケールを知る必要があります。`hooks.server.ts`を使ってURLやクッキーからロケールを検出します。
395
+
396
+ `src/hooks.server.ts`を作成または修正してください:
397
+
398
+ ```typescript fileName="src/hooks.server.ts"
399
+ import type { Handle } from "@sveltejs/kit";
400
+ import { getLocalizedUrl } from "intlayer";
401
+ import { getLocale } from "$lib/getLocale";
402
+
403
+ export const handle: Handle = async ({ event, resolve }) => {
404
+ const detectedLocale = getLocale(event);
405
+
406
+ // 現在のパスがすでにロケールで始まっているかを確認(例: /fr, /en)
407
+ const pathname = event.url.pathname;
408
+ const targetPathname = getLocalizedUrl(pathname, detectedLocale);
409
+
410
+ // URLにロケールが含まれていない場合(例: ユーザーが "/" にアクセスした場合)、リダイレクトする
411
+ if (targetPathname !== pathname) {
412
+ return new Response(undefined, {
413
+ headers: { Location: targetPathname },
414
+ status: 307, // 一時的なリダイレクト
415
+ });
416
+ }
417
+
418
+ return resolve(event, {
419
+ transformPageChunk: ({ html }) => html.replace("%lang%", detectedLocale),
420
+ });
421
+ };
422
+ ```
423
+
424
+ 次に、リクエストイベントからユーザーのロケールを取得するヘルパーを作成します:
425
+
426
+ ```typescript fileName="src/lib/getLocale.ts"
427
+ import {
428
+ configuration,
429
+ getLocaleFromStorage,
430
+ localeDetector,
431
+ type Locale,
432
+ } from "intlayer";
433
+ import type { RequestEvent } from "@sveltejs/kit";
434
+
435
+ /**
436
+ * リクエストイベントからユーザーのロケールを取得します。
437
+ * この関数は `src/hooks.server.ts` の `handle` フックで使用されます。
438
+ *
439
+ * まず、Intlayerのストレージ(クッキーまたはカスタムヘッダー)からロケールを取得しようとします。
440
+ * ロケールが見つからない場合は、ブラウザの "Accept-Language" ネゴシエーションにフォールバックします。
441
+ *
442
+ * @param event - SvelteKitからのリクエストイベント
443
+ * @returns ユーザーのロケール
444
+ */
445
+ export const getLocale = (event: RequestEvent): Locale => {
446
+ const defaultLocale = configuration?.internationalization?.defaultLocale;
447
+
448
+ // Intlayerのストレージ(クッキーまたはヘッダー)からロケールを取得しようとする
449
+ const storedLocale = getLocaleFromStorage({
450
+ // SvelteKitのクッキーアクセス
451
+ getCookie: (name: string) => event.cookies.get(name) ?? null,
452
+ // SvelteKitのヘッダーアクセス
453
+ getHeader: (name: string) => event.request.headers.get(name) ?? null,
454
+ });
455
+
456
+ if (storedLocale) {
457
+ return storedLocale;
458
+ }
459
+
460
+ // ブラウザの "Accept-Language" ネゴシエーションにフォールバック
461
+ const negotiatorHeaders: Record<string, string> = {};
462
+
463
+ // SvelteKitのHeadersオブジェクトをプレーンなRecord<string, string>に変換
464
+ event.request.headers.forEach((value, key) => {
465
+ negotiatorHeaders[key] = value;
466
+ });
467
+
468
+ // `Accept-Language` ヘッダーからロケールをチェック
469
+ const userFallbackLocale = localeDetector(negotiatorHeaders);
470
+
471
+ if (userFallbackLocale) {
472
+ return userFallbackLocale;
473
+ }
474
+
475
+ // 一致するものがなければデフォルトのロケールを返す
476
+ return defaultLocale;
477
+ };
478
+ ```
479
+
480
+ > `getLocaleFromStorage` は、設定に応じてヘッダーまたはクッキーからロケールをチェックします。詳細は [Configuration](https://intlayer.org/doc/configuration) を参照してください。
481
+
482
+ > `localeDetector` 関数は `Accept-Language` ヘッダーを処理し、最適なマッチを返します。
483
+
484
+ ロケールが設定されていない場合は、404エラーを返したいです。これを簡単にするために、ロケールが有効かどうかをチェックする `match` 関数を作成できます。
485
+
486
+ ```ts fileName="/src/params/locale.ts"
487
+ import { configuration, type Locale } from "intlayer";
488
+
489
+ export const match = (
490
+ param: Locale = configuration.internationalization.defaultLocale
491
+ ): boolean => {
492
+ return configuration.internationalization.locales.includes(param);
493
+ };
494
+ ```
495
+
496
+ > **注意:** `src/app.d.ts` にロケール定義が含まれていることを確認してください:
497
+ >
498
+ > ```typescript
499
+ > declare global {
500
+ > namespace App {
501
+ > interface Locals {
502
+ > locale: import("intlayer").Locale;
503
+ > }
504
+ > }
505
+ > }
506
+ > ```
507
+
508
+ `+layout.svelte` ファイルでは、i18n に関連しない静的コンテンツのみを保持するために、すべての内容を削除できます。
509
+
510
+ ```svelte fileName="src/+layout.svelte"
511
+ <script lang="ts">
512
+ import './layout.css';
513
+
514
+ let { children } = $props();
515
+ </script>
516
+
517
+ <div class="app">
518
+ {@render children()}
519
+ </div>
520
+
521
+ <style>
522
+ .app {
523
+ /* */
524
+ }
525
+ </style>
526
+ ```
527
+
528
+ 次に、`[[locale=locale]]` グループの下に新しいページとレイアウトを作成します。
529
+
530
+ ```ts fileName="src/routes/[[locale=locale]]/+layout.ts"
531
+ import type { Load } from "@sveltejs/kit";
532
+ import { configuration, type Locale } from "intlayer";
533
+
534
+ export const prerender = true;
535
+
536
+ // ジェネリックな Load タイプを使用
537
+ export const load: Load = ({ params }) => {
538
+ const locale: Locale =
539
+ (params.locale as Locale) ??
540
+ configuration.internationalization.defaultLocale;
541
+
542
+ return {
543
+ locale,
544
+ };
545
+ };
546
+ ```
547
+
548
+ ```svelte fileName="src/routes/[[locale=locale]]/+layout.svelte"
549
+ <script lang="ts">
550
+ import type { Snippet } from 'svelte';
551
+ import { useIntlayer, setupIntlayer } from 'svelte-intlayer';
552
+ import Header from './Header.svelte';
553
+ import type { LayoutData } from './$types';
554
+
555
+ let { children, data }: { children: Snippet, data: LayoutData } = $props();
556
+
557
+ // ルートからのロケールでIntlayerを初期化
558
+ setupIntlayer(data.locale);
559
+
560
+ // レイアウトのコンテンツ辞書を使用
561
+ const layoutContent = useIntlayer('layout');
562
+ </script>
563
+
564
+ <Header />
565
+
566
+ <main>
567
+ {@render children()}
568
+ </main>
569
+
570
+ <footer>
571
+ <p>
572
+ {$layoutContent.footer.prefix.value}{' '}
573
+ <a href="https://svelte.dev/docs/kit">{$layoutContent.footer.linkLabel.value}</a>{' '}
574
+ {$layoutContent.footer.suffix.value}
575
+ </p>
576
+ </footer>
577
+
578
+ <style>
579
+ /* */
580
+ </style>
581
+ ```
582
+
583
+ ```ts fileName="src/routes/[[locale=locale]]/+page.ts"
584
+ export const prerender = true;
585
+ ```
586
+
587
+ ```svelte fileName="src/routes/[[locale=locale]]/+page.svelte"
588
+ <script lang="ts">
589
+ import { useIntlayer } from 'svelte-intlayer';
590
+
591
+ // ホームコンテンツ辞書を使用
592
+ const homeContent = useIntlayer('home');
593
+ </script>
594
+
595
+ <svelte:head>
596
+ <title>{$homeContent.title.value}</title>
597
+ </svelte:head>
598
+
599
+ <section>
600
+ <h1>
601
+ {$homeContent.title}
602
+ </h1>
603
+ </section>
604
+
605
+ <style>
606
+ /* */
607
+ </style>
608
+ ```
609
+
610
+ ### (オプション)ステップ8:国際化されたリンク
611
+
612
+ SEOのために、ルートにロケールをプレフィックスとして付けることを推奨します(例:`/en/about`、`/fr/about`)。このコンポーネントは、現在のロケールを自動的にリンクにプレフィックスします。
613
+
614
+ ```svelte fileName="src/lib/components/LocalizedLink.svelte"
615
+ <script lang="ts">
616
+ import { getLocalizedUrl } from "intlayer";
617
+ import { useLocale } from 'svelte-intlayer';
618
+
619
+ let { href = "" } = $props();
620
+ const { locale } = useLocale();
621
+
622
+ // 現在のロケールでURLにプレフィックスを付けるヘルパー
623
+ $: localizedHref = getLocalizedUrl(href, $locale);
624
+ </script>
625
+
626
+ <a href={localizedHref}>
627
+ <slot />
628
+ </a>
629
+ ```
630
+
631
+ SvelteKitの`goto`を使用する場合も、同じロジックを`getLocalizedUrl`で使ってローカライズされたURLにナビゲートできます:
632
+
633
+ ```typescript
634
+ import { goto } from "$app/navigation";
635
+ import { getLocalizedUrl } from "intlayer";
636
+ import { useLocale } from "svelte-intlayer";
637
+
638
+ const { locale } = useLocale();
639
+ const localizedPath = getLocalizedUrl("/about", $locale);
640
+ goto(localizedPath); // ロケールに応じて /en/about または /fr/about に遷移します
641
+ ```
642
+
643
+ ### (オプション)ステップ9: 言語切り替えコンポーネント
644
+
645
+ ユーザーが言語を切り替えられるように、URLを更新します。
646
+
647
+ ```svelte fileName="src/lib/components/LanguageSwitcher.svelte"
648
+ <script lang="ts">
649
+ import { getLocalizedUrl, getLocaleName } from 'intlayer';
650
+ import { useLocale } from 'svelte-intlayer';
651
+ import { page } from '$app/stores';
652
+ import { goto } from '$app/navigation';
653
+
654
+ const { locale, setLocale, availableLocales } = useLocale({
655
+ onLocaleChange: (newLocale) => {
656
+ const localizedPath = getLocalizedUrl($page.url.pathname, newLocale);
657
+ goto(localizedPath);
658
+ },
659
+ });
660
+ </script>
661
+
662
+ <ul class="locale-list">
663
+ {#each availableLocales as localeEl}
664
+ <li>
665
+ <a
666
+ href={getLocalizedUrl($page.url.pathname, localeEl)}
667
+ onclick={(e) => {
668
+ e.preventDefault();
669
+ setLocale(localeEl); // ストア内のロケールを設定し、onLocaleChangeをトリガーします
670
+ }}
671
+ class:active={$locale === localeEl}
672
+ >
673
+ {getLocaleName(localeEl)}
674
+ </a>
675
+ </li>
676
+ {/each}
677
+ </ul>
678
+
679
+ <style>
680
+ /* */
681
+ </style>
682
+ ```
683
+
684
+ ### (オプション)ステップ10:バックエンドプロキシの追加
685
+
686
+ SvelteKitアプリケーションにバックエンドプロキシを追加するには、`vite-intlayer`プラグインが提供する`intlayerProxy`関数を使用できます。このプラグインは、URL、クッキー、およびブラウザの言語設定に基づいてユーザーに最適なロケールを自動的に検出します。
687
+
688
+ ```ts fileName="vite.config.ts"
689
+ import { defineConfig } from "vite";
690
+ import { intlayer, intlayerProxy } from "vite-intlayer";
691
+ import { sveltekit } from "@sveltejs/kit/vite";
692
+
693
+ // https://vitejs.dev/config/
694
+ export default defineConfig({
695
+ plugins: [intlayer(), intlayerProxy(), sveltekit()],
696
+ });
697
+ ```
698
+
699
+ ### (オプション)ステップ11:intlayerエディター / CMSのセットアップ
700
+
701
+ intlayerエディターをセットアップするには、[intlayerエディターのドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_visual_editor.md)に従う必要があります。
702
+
703
+ intlayer CMSをセットアップするには、[intlayer CMSのドキュメント](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md)に従う必要があります。
704
+
705
+ intlayerエディターのセレクターを可視化するためには、intlayerコンテンツ内でコンポーネント構文を使用する必要があります。
706
+
707
+ ```svelte fileName="Component.svelte"
708
+ <script lang="ts">
709
+ import { useIntlayer } from "svelte-intlayer";
710
+
711
+ const content = useIntlayer("component");
712
+ </script>
713
+
714
+ <div>
715
+
716
+ <!-- コンテンツをシンプルな内容としてレンダリング -->
717
+ <h1>{$content.title}</h1>
718
+
719
+ <!-- コンポーネントとしてコンテンツをレンダリング(エディターに必要) -->
720
+ <svelte:component this={$content.component} />
721
+ </div>
722
+ ```
723
+
724
+ ### Git設定
725
+
726
+ Intlayerによって生成されるファイルは無視することを推奨します。
727
+
728
+ ```plaintext fileName=".gitignore"
729
+ # Intlayerによって生成されたファイルを無視
730
+ .intlayer
731
+ ```
732
+
733
+ ---
734
+
735
+ ### さらに進む
736
+
737
+ - **ビジュアルエディター**: UIから直接翻訳を編集するために、[Intlayer Visual Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_visual_editor.md)を統合します。
738
+ - **CMS**: コンテンツ管理を外部化するために、[Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ja/intlayer_CMS.md)を使用します。