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