@intlayer/docs 7.1.8 → 7.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/cjs/generated/docs.entry.cjs +19 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +19 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +1 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_with_svelte_kit.md +730 -0
- package/docs/ar/intlayer_with_vite+svelte.md +288 -104
- package/docs/de/intlayer_with_svelte_kit.md +730 -0
- package/docs/de/intlayer_with_vite+svelte.md +302 -101
- package/docs/en/intlayer_with_svelte_kit.md +560 -0
- package/docs/en/intlayer_with_vite+svelte.md +153 -15
- package/docs/en/introduction.md +2 -0
- package/docs/en-GB/intlayer_with_svelte_kit.md +730 -0
- package/docs/en-GB/intlayer_with_vite+svelte.md +262 -84
- package/docs/es/intlayer_with_svelte_kit.md +730 -0
- package/docs/es/intlayer_with_vite+svelte.md +300 -107
- package/docs/fr/intlayer_with_svelte_kit.md +762 -0
- package/docs/fr/intlayer_with_vite+svelte.md +297 -101
- package/docs/hi/intlayer_with_svelte_kit.md +730 -0
- package/docs/hi/intlayer_with_vite+svelte.md +298 -108
- package/docs/id/intlayer_with_svelte_kit.md +730 -0
- package/docs/id/intlayer_with_vite+svelte.md +277 -99
- package/docs/it/intlayer_with_svelte_kit.md +762 -0
- package/docs/it/intlayer_with_vite+svelte.md +275 -99
- package/docs/ja/intlayer_with_svelte_kit.md +730 -0
- package/docs/ja/intlayer_with_vite+svelte.md +295 -110
- package/docs/ko/intlayer_with_svelte_kit.md +730 -0
- package/docs/ko/intlayer_with_vite+svelte.md +286 -199
- package/docs/pl/intlayer_with_svelte_kit.md +732 -0
- package/docs/pl/intlayer_with_vite+svelte.md +273 -101
- package/docs/pt/intlayer_with_svelte_kit.md +764 -0
- package/docs/pt/intlayer_with_vite+svelte.md +290 -96
- package/docs/ru/intlayer_with_svelte_kit.md +730 -0
- package/docs/ru/intlayer_with_vite+svelte.md +275 -99
- package/docs/tr/intlayer_with_svelte_kit.md +730 -0
- package/docs/tr/intlayer_with_vite+svelte.md +297 -119
- package/docs/vi/intlayer_with_svelte_kit.md +730 -0
- package/docs/vi/intlayer_with_vite+svelte.md +275 -102
- package/docs/zh/intlayer_with_svelte_kit.md +730 -0
- package/docs/zh/intlayer_with_vite+svelte.md +309 -107
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +19 -0
|
@@ -0,0 +1,732 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2025-11-20
|
|
3
|
+
updatedAt: 2025-11-20
|
|
4
|
+
title: Jak przetłumaczyć swoją aplikację SvelteKit – przewodnik i18n 2025
|
|
5
|
+
description: Dowiedz się, jak uczynić swoją stronę SvelteKit wielojęzyczną. Postępuj zgodnie z dokumentacją, aby zinternacjonalizować (i18n) i przetłumaczyć ją za pomocą Server-Side Rendering (SSR).
|
|
6
|
+
keywords:
|
|
7
|
+
- Internacjonalizacja
|
|
8
|
+
- Dokumentacja
|
|
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: Inicjalizacja historii
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
# Przetłumacz swoją stronę SvelteKit za pomocą Intlayer | Internacjonalizacja (i18n)
|
|
25
|
+
|
|
26
|
+
## Spis treści
|
|
27
|
+
|
|
28
|
+
<TOC/>
|
|
29
|
+
|
|
30
|
+
## Czym jest Intlayer?
|
|
31
|
+
|
|
32
|
+
**Intlayer** to innowacyjna, open-source'owa biblioteka do internacjonalizacji (i18n), zaprojektowana, aby uprościć wsparcie wielojęzyczne w nowoczesnych aplikacjach webowych. Działa bezproblemowo z możliwościami Server-Side Rendering (SSR) w **SvelteKit**.
|
|
33
|
+
|
|
34
|
+
Dzięki Intlayer możesz:
|
|
35
|
+
|
|
36
|
+
- **Łatwo zarządzać tłumaczeniami** za pomocą deklaratywnych słowników na poziomie komponentów.
|
|
37
|
+
- **Dynamicznie lokalizować metadane**, ścieżki i zawartość.
|
|
38
|
+
- **Zapewnić wsparcie TypeScript** dzięki automatycznie generowanym typom.
|
|
39
|
+
- **Wykorzystać SSR SvelteKit** dla SEO-przyjaznej internacjonalizacji.
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Przewodnik krok po kroku: konfiguracja Intlayer w aplikacji SvelteKit
|
|
44
|
+
|
|
45
|
+
Aby rozpocząć, utwórz nowy projekt SvelteKit. Oto końcowa struktura, którą stworzymy:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
.
|
|
49
|
+
├── intlayer.config.ts
|
|
50
|
+
├── package.json
|
|
51
|
+
├── src
|
|
52
|
+
│ ├── app.d.ts
|
|
53
|
+
│ ├── app.html
|
|
54
|
+
│ ├── hooks.server.ts
|
|
55
|
+
│ ├── lib
|
|
56
|
+
│ │ ├── getLocale.ts
|
|
57
|
+
│ │ ├── LocaleSwitcher.svelte
|
|
58
|
+
│ │ └── LocalizedLink.svelte
|
|
59
|
+
│ ├── params
|
|
60
|
+
│ │ └── locale.ts
|
|
61
|
+
│ └── routes
|
|
62
|
+
│ ├── [[locale=locale]]
|
|
63
|
+
│ │ ├── +layout.svelte
|
|
64
|
+
│ │ ├── +layout.ts
|
|
65
|
+
│ │ ├── +page.svelte
|
|
66
|
+
│ │ ├── +page.ts
|
|
67
|
+
│ │ ├── about
|
|
68
|
+
│ │ │ ├── +page.svelte
|
|
69
|
+
│ │ │ ├── +page.ts
|
|
70
|
+
│ │ │ └── page.content.ts
|
|
71
|
+
│ │ ├── Counter.content.ts
|
|
72
|
+
│ │ ├── Counter.svelte
|
|
73
|
+
│ │ ├── Header.content.ts
|
|
74
|
+
│ │ ├── Header.svelte
|
|
75
|
+
│ │ ├── home.content.ts
|
|
76
|
+
│ │ └── layout.content.ts
|
|
77
|
+
│ ├── +layout.svelte
|
|
78
|
+
│ └── layout.css
|
|
79
|
+
├── static
|
|
80
|
+
│ ├── favicon.svg
|
|
81
|
+
│ └── robots.txt
|
|
82
|
+
├── svelte.config.js
|
|
83
|
+
├── tsconfig.json
|
|
84
|
+
└── vite.config.ts
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Krok 1: Instalacja zależności
|
|
88
|
+
|
|
89
|
+
Zainstaluj niezbędne pakiety za pomocą npm:
|
|
90
|
+
|
|
91
|
+
```bash packageManager="npm"
|
|
92
|
+
npm install intlayer svelte-intlayer
|
|
93
|
+
npm install vite-intlayer --save-dev
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
```bash packageManager="pnpm"
|
|
97
|
+
pnpm add intlayer svelte-intlayer
|
|
98
|
+
pnpm add vite-intlayer --save-dev
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```bash packageManager="yarn"
|
|
102
|
+
yarn add intlayer svelte-intlayer
|
|
103
|
+
yarn add vite-intlayer --save-dev
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```bash packageManager="bun"
|
|
107
|
+
bun add intlayer svelte-intlayer
|
|
108
|
+
bun add vite-intlayer --save-dev
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
- **intlayer**: Podstawowy pakiet i18n.
|
|
112
|
+
- **svelte-intlayer**: Zapewnia dostawców kontekstu i sklepy dla Svelte/SvelteKit.
|
|
113
|
+
- **vite-intlayer**: Wtyczka Vite do integracji deklaracji treści z procesem budowania.
|
|
114
|
+
|
|
115
|
+
### Krok 2: Konfiguracja projektu
|
|
116
|
+
|
|
117
|
+
Utwórz plik konfiguracyjny w katalogu głównym projektu:
|
|
118
|
+
|
|
119
|
+
```typescript fileName="intlayer.config.ts"
|
|
120
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
121
|
+
|
|
122
|
+
const config: IntlayerConfig = {
|
|
123
|
+
internationalization: {
|
|
124
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
125
|
+
defaultLocale: Locales.ENGLISH,
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export default config;
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Krok 3: Integracja Intlayer w konfiguracji Vite
|
|
133
|
+
|
|
134
|
+
Zaktualizuj swój plik `vite.config.ts`, aby uwzględnić wtyczkę Intlayer. Ta wtyczka obsługuje transpileację Twoich plików z treścią.
|
|
135
|
+
|
|
136
|
+
```typescript fileName="vite.config.ts"
|
|
137
|
+
import { sveltekit } from "@sveltejs/kit/vite";
|
|
138
|
+
import { defineConfig } from "vite";
|
|
139
|
+
import { intlayer } from "vite-intlayer";
|
|
140
|
+
|
|
141
|
+
export default defineConfig({
|
|
142
|
+
plugins: [intlayer(), sveltekit()], // kolejność ma znaczenie, Intlayer powinien być umieszczony przed SvelteKit
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Krok 4: Zadeklaruj swoją treść
|
|
147
|
+
|
|
148
|
+
Utwórz pliki deklaracji treści w dowolnym miejscu w folderze `src` (np. `src/lib/content` lub obok swoich komponentów). Pliki te definiują tłumaczoną treść dla Twojej aplikacji, używając funkcji `t()` dla każdego języka.
|
|
149
|
+
|
|
150
|
+
```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat="typescript"
|
|
151
|
+
import { t, type Dictionary } from "intlayer";
|
|
152
|
+
|
|
153
|
+
const heroContent = {
|
|
154
|
+
key: "hero-section",
|
|
155
|
+
content: {
|
|
156
|
+
title: t({
|
|
157
|
+
en: "Welcome to SvelteKit",
|
|
158
|
+
fr: "Bienvenue sur SvelteKit",
|
|
159
|
+
es: "Bienvenido a SvelteKit",
|
|
160
|
+
}),
|
|
161
|
+
},
|
|
162
|
+
} satisfies Dictionary;
|
|
163
|
+
|
|
164
|
+
export default heroContent;
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Krok 5: Wykorzystaj Intlayer w swoich komponentach
|
|
168
|
+
|
|
169
|
+
### Krok 5: Wykorzystaj Intlayer w swoich komponentach
|
|
170
|
+
|
|
171
|
+
Teraz możesz użyć funkcji `useIntlayer` w dowolnym komponencie Svelte. Zwraca ona reaktywny store, który automatycznie aktualizuje się, gdy zmienia się lokalizacja. Funkcja automatycznie uwzględnia aktualną lokalizację (zarówno podczas SSR, jak i nawigacji po stronie klienta).
|
|
172
|
+
|
|
173
|
+
> **Uwaga:** `useIntlayer` zwraca store Svelte, więc musisz użyć prefiksu `---
|
|
174
|
+
> createdAt: 2025-11-20
|
|
175
|
+
> updatedAt: 2025-11-20
|
|
176
|
+
> title: Jak przetłumaczyć swoją aplikację SvelteKit – przewodnik i18n 2025
|
|
177
|
+
> description: Dowiedz się, jak uczynić swoją stronę SvelteKit wielojęzyczną. Postępuj zgodnie z dokumentacją, aby zinternacjonalizować (i18n) i przetłumaczyć ją za pomocą Server-Side Rendering (SSR).
|
|
178
|
+
> keywords:
|
|
179
|
+
|
|
180
|
+
- Internacjonalizacja
|
|
181
|
+
- Dokumentacja
|
|
182
|
+
- Intlayer
|
|
183
|
+
- SvelteKit
|
|
184
|
+
- JavaScript
|
|
185
|
+
- SSR
|
|
186
|
+
slugs:
|
|
187
|
+
- doc
|
|
188
|
+
- environment
|
|
189
|
+
- sveltekit
|
|
190
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-sveltekit-template
|
|
191
|
+
history:
|
|
192
|
+
- version: 7.1.10
|
|
193
|
+
date: 2025-11-20
|
|
194
|
+
changes: Inicjalizacja historii
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
# Przetłumacz swoją stronę SvelteKit za pomocą Intlayer | Internacjonalizacja (i18n)
|
|
199
|
+
|
|
200
|
+
## Spis treści
|
|
201
|
+
|
|
202
|
+
<TOC/>
|
|
203
|
+
|
|
204
|
+
## Czym jest Intlayer?
|
|
205
|
+
|
|
206
|
+
**Intlayer** to innowacyjna, open-source'owa biblioteka do internacjonalizacji (i18n), zaprojektowana, aby uprościć wsparcie wielojęzyczne w nowoczesnych aplikacjach webowych. Działa bezproblemowo z możliwościami Server-Side Rendering (SSR) w **SvelteKit**.
|
|
207
|
+
|
|
208
|
+
Dzięki Intlayer możesz:
|
|
209
|
+
|
|
210
|
+
- **Łatwo zarządzać tłumaczeniami** za pomocą deklaratywnych słowników na poziomie komponentów.
|
|
211
|
+
- **Dynamicznie lokalizować metadane**, ścieżki i zawartość.
|
|
212
|
+
- **Zapewnić wsparcie TypeScript** dzięki automatycznie generowanym typom.
|
|
213
|
+
- **Wykorzystać SSR SvelteKit** dla SEO-przyjaznej internacjonalizacji.
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Przewodnik krok po kroku: konfiguracja Intlayer w aplikacji SvelteKit
|
|
218
|
+
|
|
219
|
+
Aby rozpocząć, utwórz nowy projekt SvelteKit. Oto końcowa struktura, którą stworzymy:
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
.
|
|
223
|
+
├── intlayer.config.ts
|
|
224
|
+
├── package.json
|
|
225
|
+
├── src
|
|
226
|
+
│ ├── app.d.ts
|
|
227
|
+
│ ├── app.html
|
|
228
|
+
│ ├── hooks.server.ts
|
|
229
|
+
│ ├── lib
|
|
230
|
+
│ │ ├── getLocale.ts
|
|
231
|
+
│ │ ├── LocaleSwitcher.svelte
|
|
232
|
+
│ │ └── LocalizedLink.svelte
|
|
233
|
+
│ ├── params
|
|
234
|
+
│ │ └── locale.ts
|
|
235
|
+
│ └── routes
|
|
236
|
+
│ ├── [[locale=locale]]
|
|
237
|
+
│ │ ├── +layout.svelte
|
|
238
|
+
│ │ ├── +layout.ts
|
|
239
|
+
│ │ ├── +page.svelte
|
|
240
|
+
│ │ ├── +page.ts
|
|
241
|
+
│ │ ├── about
|
|
242
|
+
│ │ │ ├── +page.svelte
|
|
243
|
+
│ │ │ ├── +page.ts
|
|
244
|
+
│ │ │ └── page.content.ts
|
|
245
|
+
│ │ ├── Counter.content.ts
|
|
246
|
+
│ │ ├── Counter.svelte
|
|
247
|
+
│ │ ├── Header.content.ts
|
|
248
|
+
│ │ ├── Header.svelte
|
|
249
|
+
│ │ ├── home.content.ts
|
|
250
|
+
│ │ └── layout.content.ts
|
|
251
|
+
│ ├── +layout.svelte
|
|
252
|
+
│ └── layout.css
|
|
253
|
+
├── static
|
|
254
|
+
│ ├── favicon.svg
|
|
255
|
+
│ └── robots.txt
|
|
256
|
+
├── svelte.config.js
|
|
257
|
+
├── tsconfig.json
|
|
258
|
+
└── vite.config.ts
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Krok 1: Instalacja zależności
|
|
262
|
+
|
|
263
|
+
Zainstaluj niezbędne pakiety za pomocą npm:
|
|
264
|
+
|
|
265
|
+
```bash packageManager="npm"
|
|
266
|
+
npm install intlayer svelte-intlayer
|
|
267
|
+
npm install vite-intlayer --save-dev
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
```bash packageManager="pnpm"
|
|
271
|
+
pnpm add intlayer svelte-intlayer
|
|
272
|
+
pnpm add vite-intlayer --save-dev
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
```bash packageManager="yarn"
|
|
276
|
+
yarn add intlayer svelte-intlayer
|
|
277
|
+
yarn add vite-intlayer --save-dev
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
```bash packageManager="bun"
|
|
281
|
+
bun add intlayer svelte-intlayer
|
|
282
|
+
bun add vite-intlayer --save-dev
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
- **intlayer**: Podstawowy pakiet i18n.
|
|
286
|
+
- **svelte-intlayer**: Zapewnia dostawców kontekstu i sklepy dla Svelte/SvelteKit.
|
|
287
|
+
- **vite-intlayer**: Wtyczka Vite do integracji deklaracji treści z procesem budowania.
|
|
288
|
+
|
|
289
|
+
### Krok 2: Konfiguracja projektu
|
|
290
|
+
|
|
291
|
+
Utwórz plik konfiguracyjny w katalogu głównym projektu:
|
|
292
|
+
|
|
293
|
+
```typescript fileName="intlayer.config.ts"
|
|
294
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
295
|
+
|
|
296
|
+
const config: IntlayerConfig = {
|
|
297
|
+
internationalization: {
|
|
298
|
+
locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
|
|
299
|
+
defaultLocale: Locales.ENGLISH,
|
|
300
|
+
},
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
export default config;
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Krok 3: Integracja Intlayer w konfiguracji Vite
|
|
307
|
+
|
|
308
|
+
Zaktualizuj swój plik `vite.config.ts`, aby uwzględnić wtyczkę Intlayer. Ta wtyczka obsługuje transpileację Twoich plików z treścią.
|
|
309
|
+
|
|
310
|
+
```typescript fileName="vite.config.ts"
|
|
311
|
+
import { sveltekit } from "@sveltejs/kit/vite";
|
|
312
|
+
import { defineConfig } from "vite";
|
|
313
|
+
import { intlayer } from "vite-intlayer";
|
|
314
|
+
|
|
315
|
+
export default defineConfig({
|
|
316
|
+
plugins: [intlayer(), sveltekit()], // kolejność ma znaczenie, Intlayer powinien być umieszczony przed SvelteKit
|
|
317
|
+
});
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Krok 4: Zadeklaruj swoją treść
|
|
321
|
+
|
|
322
|
+
Utwórz pliki deklaracji treści w dowolnym miejscu w folderze `src` (np. `src/lib/content` lub obok swoich komponentów). Pliki te definiują tłumaczoną treść dla Twojej aplikacji, używając funkcji `t()` dla każdego języka.
|
|
323
|
+
|
|
324
|
+
```ts fileName="src/features/hero/hero.content.ts" contentDeclarationFormat="typescript"
|
|
325
|
+
import { t, type Dictionary } from "intlayer";
|
|
326
|
+
|
|
327
|
+
const heroContent = {
|
|
328
|
+
key: "hero-section",
|
|
329
|
+
content: {
|
|
330
|
+
title: t({
|
|
331
|
+
en: "Welcome to SvelteKit",
|
|
332
|
+
fr: "Bienvenue sur SvelteKit",
|
|
333
|
+
es: "Bienvenido a SvelteKit",
|
|
334
|
+
}),
|
|
335
|
+
},
|
|
336
|
+
} satisfies Dictionary;
|
|
337
|
+
|
|
338
|
+
export default heroContent;
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### Krok 5: Wykorzystaj Intlayer w swoich komponentach
|
|
342
|
+
|
|
343
|
+
, aby uzyskać dostęp do jego reaktywnej wartości (np. `$content.title`).
|
|
344
|
+
|
|
345
|
+
```svelte fileName="src/lib/components/Component.svelte"
|
|
346
|
+
<script lang="ts">
|
|
347
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
348
|
+
|
|
349
|
+
// "hero-section" odpowiada kluczowi zdefiniowanemu w Kroku 4
|
|
350
|
+
const content = useIntlayer("hero-section");
|
|
351
|
+
</script>
|
|
352
|
+
|
|
353
|
+
<!-- Renderuj treść jako prostą zawartość -->
|
|
354
|
+
<h1>{$content.title}</h1>
|
|
355
|
+
<!-- Aby renderować treść edytowalną za pomocą edytora -->
|
|
356
|
+
<h1><svelte:component this={$content.title} /></h1>
|
|
357
|
+
<!-- Aby wyrenderować zawartość jako ciąg znaków -->
|
|
358
|
+
<div aria-label={$content.title.value}></div>
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
### (Opcjonalny) Krok 6: Skonfiguruj routing
|
|
362
|
+
|
|
363
|
+
Poniższe kroki pokazują, jak skonfigurować routing oparty na lokalizacji w SvelteKit. Pozwala to na dodanie prefiksu lokalizacji do adresów URL (np. `/en/about`, `/fr/about`) dla lepszego SEO i doświadczenia użytkownika.
|
|
364
|
+
|
|
365
|
+
```bash
|
|
366
|
+
.
|
|
367
|
+
└─── src
|
|
368
|
+
├── app.d.ts # Definiuje typ lokalizacji
|
|
369
|
+
├── hooks.server.ts # Zarządza routingiem lokalizacji
|
|
370
|
+
├── lib
|
|
371
|
+
│ └── getLocale.ts # Sprawdza lokalizację z nagłówka, ciasteczek
|
|
372
|
+
├── params
|
|
373
|
+
│ └── locale.ts # Definiuje parametr lokalizacji
|
|
374
|
+
└── routes
|
|
375
|
+
├── [[locale=locale]] # Opakowuje w grupę tras, aby ustawić lokalizację
|
|
376
|
+
│ ├── +layout.svelte # Lokalny layout dla trasy
|
|
377
|
+
│ ├── +layout.ts
|
|
378
|
+
│ ├── +page.svelte
|
|
379
|
+
│ ├── +page.ts
|
|
380
|
+
│ └── about
|
|
381
|
+
│ ├── +page.svelte
|
|
382
|
+
│ └── +page.ts
|
|
383
|
+
└── +layout.svelte # Główny layout dla fontów i stylów globalnych
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Krok 7: Obsługa wykrywania lokalizacji po stronie serwera (Hooks)
|
|
387
|
+
|
|
388
|
+
W SvelteKit serwer musi znać lokalizację użytkownika, aby wyrenderować odpowiednią zawartość podczas SSR. Używamy `hooks.server.ts` do wykrywania lokalizacji z URL lub ciasteczek.
|
|
389
|
+
|
|
390
|
+
Utwórz lub zmodyfikuj plik `src/hooks.server.ts`:
|
|
391
|
+
|
|
392
|
+
```typescript fileName="src/hooks.server.ts"
|
|
393
|
+
import type { Handle } from "@sveltejs/kit";
|
|
394
|
+
import { getLocalizedUrl } from "intlayer";
|
|
395
|
+
import { getLocale } from "$lib/getLocale";
|
|
396
|
+
|
|
397
|
+
export const handle: Handle = async ({ event, resolve }) => {
|
|
398
|
+
const detectedLocale = getLocale(event);
|
|
399
|
+
|
|
400
|
+
// Sprawdź, czy bieżąca ścieżka już zaczyna się od lokalizacji (np. /fr, /en)
|
|
401
|
+
const pathname = event.url.pathname;
|
|
402
|
+
const targetPathname = getLocalizedUrl(pathname, detectedLocale);
|
|
403
|
+
|
|
404
|
+
// Jeśli w URL nie ma lokalizacji (np. użytkownik odwiedza "/"), przekieruj go
|
|
405
|
+
if (targetPathname !== pathname) {
|
|
406
|
+
return new Response(undefined, {
|
|
407
|
+
headers: { Location: targetPathname },
|
|
408
|
+
status: 307, // Tymczasowe przekierowanie
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
return resolve(event, {
|
|
413
|
+
transformPageChunk: ({ html }) => html.replace("%lang%", detectedLocale),
|
|
414
|
+
});
|
|
415
|
+
};
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
Następnie utwórz pomocnika do pobierania lokalizacji użytkownika z eventu żądania:
|
|
419
|
+
|
|
420
|
+
```typescript fileName="src/lib/getLocale.ts"
|
|
421
|
+
import {
|
|
422
|
+
configuration,
|
|
423
|
+
getLocaleFromStorage,
|
|
424
|
+
localeDetector,
|
|
425
|
+
type Locale,
|
|
426
|
+
} from "intlayer";
|
|
427
|
+
import type { RequestEvent } from "@sveltejs/kit";
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Pobierz lokalizację użytkownika z eventu żądania.
|
|
431
|
+
* Ta funkcja jest używana w hooku `handle` w `src/hooks.server.ts`.
|
|
432
|
+
*
|
|
433
|
+
* Najpierw próbuje pobrać lokalizację z magazynu Intlayer (ciasteczka lub niestandardowe nagłówki).
|
|
434
|
+
* Jeśli lokalizacja nie zostanie znaleziona, następuje odwołanie do negocjacji "Accept-Language" przeglądarki.
|
|
435
|
+
*
|
|
436
|
+
* @param event - Event żądania z SvelteKit
|
|
437
|
+
* @returns Lokalizacja użytkownika
|
|
438
|
+
*/
|
|
439
|
+
export const getLocale = (event: RequestEvent): Locale => {
|
|
440
|
+
const defaultLocale = configuration?.internationalization?.defaultLocale;
|
|
441
|
+
|
|
442
|
+
// Próba pobrania lokalizacji z magazynu Intlayer (ciasteczka lub nagłówki)
|
|
443
|
+
const storedLocale = getLocaleFromStorage({
|
|
444
|
+
// Dostęp do ciasteczek SvelteKit
|
|
445
|
+
getCookie: (name: string) => event.cookies.get(name) ?? null,
|
|
446
|
+
// Dostęp do nagłówków SvelteKit
|
|
447
|
+
getHeader: (name: string) => event.request.headers.get(name) ?? null,
|
|
448
|
+
});
|
|
449
|
+
|
|
450
|
+
if (storedLocale) {
|
|
451
|
+
return storedLocale;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Powrót do negocjacji "Accept-Language" przeglądarki
|
|
455
|
+
const negotiatorHeaders: Record<string, string> = {};
|
|
456
|
+
|
|
457
|
+
// Konwersja obiektu Headers SvelteKit na zwykły Record<string, string>
|
|
458
|
+
event.request.headers.forEach((value, key) => {
|
|
459
|
+
negotiatorHeaders[key] = value;
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
// Sprawdzenie lokalizacji z nagłówka `Accept-Language`
|
|
463
|
+
const userFallbackLocale = localeDetector(negotiatorHeaders);
|
|
464
|
+
|
|
465
|
+
if (userFallbackLocale) {
|
|
466
|
+
return userFallbackLocale;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// Zwróć domyślną lokalizację, jeśli nie znaleziono dopasowania
|
|
470
|
+
return defaultLocale;
|
|
471
|
+
};
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
> `getLocaleFromStorage` sprawdzi lokalizację na podstawie nagłówka lub ciasteczka w zależności od Twojej konfiguracji. Zobacz [Konfiguracja](https://intlayer.org/doc/configuration) po więcej szczegółów.
|
|
475
|
+
|
|
476
|
+
> Funkcja `localeDetector` przetworzy nagłówek `Accept-Language` i zwróci najlepsze dopasowanie.
|
|
477
|
+
|
|
478
|
+
Jeśli lokalizacja nie jest skonfigurowana, chcemy zwrócić błąd 404. Aby to ułatwić, możemy stworzyć funkcję `match`, która sprawdzi, czy lokalizacja jest poprawna:
|
|
479
|
+
|
|
480
|
+
```ts fileName="/src/params/locale.ts"
|
|
481
|
+
import { configuration, type Locale } from "intlayer";
|
|
482
|
+
|
|
483
|
+
export const match = (
|
|
484
|
+
param: Locale = configuration.internationalization.defaultLocale
|
|
485
|
+
): boolean => {
|
|
486
|
+
return configuration.internationalization.locales.includes(param);
|
|
487
|
+
};
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
> **Uwaga:** Upewnij się, że Twój plik `src/app.d.ts` zawiera definicję lokalizacji:
|
|
491
|
+
>
|
|
492
|
+
> ```typescript
|
|
493
|
+
> declare global {
|
|
494
|
+
> namespace App {
|
|
495
|
+
> interface Locals {
|
|
496
|
+
> locale: import("intlayer").Locale;
|
|
497
|
+
> }
|
|
498
|
+
> }
|
|
499
|
+
> }
|
|
500
|
+
> ```
|
|
501
|
+
|
|
502
|
+
Dla pliku `+layout.svelte` możemy usunąć wszystko, aby zachować tylko statyczną zawartość, niezwiązaną z i18n:
|
|
503
|
+
|
|
504
|
+
```svelte fileName="src/+layout.svelte"
|
|
505
|
+
<script lang="ts">
|
|
506
|
+
import './layout.css';
|
|
507
|
+
|
|
508
|
+
let { children } = $props();
|
|
509
|
+
</script>
|
|
510
|
+
|
|
511
|
+
<div class="app">
|
|
512
|
+
{@render children()}
|
|
513
|
+
</div>
|
|
514
|
+
|
|
515
|
+
<style>
|
|
516
|
+
.app {
|
|
517
|
+
/* */
|
|
518
|
+
}
|
|
519
|
+
</style>
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
Następnie utwórz nową stronę i layout w grupie `[[locale=locale]]`:
|
|
523
|
+
|
|
524
|
+
```ts fileName="src/routes/[[locale=locale]]/+layout.ts"
|
|
525
|
+
import type { Load } from "@sveltejs/kit";
|
|
526
|
+
import { configuration, type Locale } from "intlayer";
|
|
527
|
+
|
|
528
|
+
export const prerender = true;
|
|
529
|
+
|
|
530
|
+
// Użyj generycznego typu Load
|
|
531
|
+
export const load: Load = ({ params }) => {
|
|
532
|
+
const locale: Locale =
|
|
533
|
+
(params.locale as Locale) ??
|
|
534
|
+
configuration.internationalization.defaultLocale;
|
|
535
|
+
|
|
536
|
+
return {
|
|
537
|
+
locale,
|
|
538
|
+
};
|
|
539
|
+
};
|
|
540
|
+
```
|
|
541
|
+
|
|
542
|
+
```svelte fileName="src/routes/[[locale=locale]]/+layout.svelte"
|
|
543
|
+
<script lang="ts">
|
|
544
|
+
import type { Snippet } from 'svelte';
|
|
545
|
+
import { useIntlayer, setupIntlayer } from 'svelte-intlayer';
|
|
546
|
+
import Header from './Header.svelte';
|
|
547
|
+
import type { LayoutData } from './$types';
|
|
548
|
+
|
|
549
|
+
let { children, data }: { children: Snippet, data: LayoutData } = $props();
|
|
550
|
+
|
|
551
|
+
// Inicjalizuj Intlayer z lokalizacją z trasy
|
|
552
|
+
setupIntlayer(data.locale);
|
|
553
|
+
|
|
554
|
+
// Użyj słownika zawartości layoutu
|
|
555
|
+
const layoutContent = useIntlayer('layout');
|
|
556
|
+
</script>
|
|
557
|
+
|
|
558
|
+
<Header />
|
|
559
|
+
|
|
560
|
+
<main>
|
|
561
|
+
{@render children()}
|
|
562
|
+
</main>
|
|
563
|
+
|
|
564
|
+
<footer>
|
|
565
|
+
<p>
|
|
566
|
+
{$layoutContent.footer.prefix.value}{' '}
|
|
567
|
+
<a href="https://svelte.dev/docs/kit">{$layoutContent.footer.linkLabel.value}</a>{' '}
|
|
568
|
+
{$layoutContent.footer.suffix.value}
|
|
569
|
+
</p>
|
|
570
|
+
</footer>
|
|
571
|
+
|
|
572
|
+
<style>
|
|
573
|
+
/* */
|
|
574
|
+
</style>
|
|
575
|
+
```
|
|
576
|
+
|
|
577
|
+
```ts fileName="src/routes/[[locale=locale]]/+page.ts"
|
|
578
|
+
export const prerender = true;
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
```svelte fileName="src/routes/[[locale=locale]]/+page.svelte"
|
|
582
|
+
<script lang="ts">
|
|
583
|
+
import { useIntlayer } from 'svelte-intlayer';
|
|
584
|
+
|
|
585
|
+
// Użyj słownika treści strony głównej
|
|
586
|
+
const homeContent = useIntlayer('home');
|
|
587
|
+
</script>
|
|
588
|
+
|
|
589
|
+
<svelte:head>
|
|
590
|
+
<title>{$homeContent.title.value}</title>
|
|
591
|
+
</svelte:head>
|
|
592
|
+
|
|
593
|
+
<section>
|
|
594
|
+
<h1>
|
|
595
|
+
{$homeContent.title}
|
|
596
|
+
</h1>
|
|
597
|
+
</section>
|
|
598
|
+
|
|
599
|
+
<style>
|
|
600
|
+
/* */
|
|
601
|
+
</style>
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
### (Opcjonalny) Krok 8: Linki z internacjonalizacją
|
|
605
|
+
|
|
606
|
+
Dla SEO zaleca się poprzedzanie swoich ścieżek lokalizacją (np. `/en/about`, `/fr/about`). Ten komponent automatycznie dodaje prefiks lokalizacji do każdego linku.
|
|
607
|
+
|
|
608
|
+
```svelte fileName="src/lib/components/LocalizedLink.svelte"
|
|
609
|
+
<script lang="ts">
|
|
610
|
+
import { getLocalizedUrl } from "intlayer";
|
|
611
|
+
import { useLocale } from 'svelte-intlayer';
|
|
612
|
+
|
|
613
|
+
let { href = "" } = $props();
|
|
614
|
+
const { locale } = useLocale();
|
|
615
|
+
|
|
616
|
+
// Pomocnik do dodawania prefiksu lokalizacji do URL
|
|
617
|
+
$: localizedHref = getLocalizedUrl(href, $locale);
|
|
618
|
+
</script>
|
|
619
|
+
|
|
620
|
+
<a href={localizedHref}>
|
|
621
|
+
<slot />
|
|
622
|
+
</a>
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
Jeśli używasz `goto` z SvelteKit, możesz zastosować tę samą logikę z `getLocalizedUrl`, aby nawigować do zlokalizowanego URL:
|
|
626
|
+
|
|
627
|
+
```typescript
|
|
628
|
+
import { goto } from "$app/navigation";
|
|
629
|
+
import { getLocalizedUrl } from "intlayer";
|
|
630
|
+
import { useLocale } from "svelte-intlayer";
|
|
631
|
+
|
|
632
|
+
const { locale } = useLocale();
|
|
633
|
+
const localizedPath = getLocalizedUrl("/about", $locale);
|
|
634
|
+
goto(localizedPath); // Nawiguje do /en/about lub /fr/about w zależności od lokalizacji
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
### (Opcjonalny) Krok 9: Przełącznik języka
|
|
638
|
+
|
|
639
|
+
Aby umożliwić użytkownikom zmianę języka, zaktualizuj URL.
|
|
640
|
+
|
|
641
|
+
```svelte fileName="src/lib/components/LanguageSwitcher.svelte"
|
|
642
|
+
<script lang="ts">
|
|
643
|
+
import { getLocalizedUrl, getLocaleName } from 'intlayer';
|
|
644
|
+
import { useLocale } from 'svelte-intlayer';
|
|
645
|
+
import { page } from '$app/stores';
|
|
646
|
+
import { goto } from '$app/navigation';
|
|
647
|
+
|
|
648
|
+
const { locale, setLocale, availableLocales } = useLocale({
|
|
649
|
+
onLocaleChange: (newLocale) => {
|
|
650
|
+
const localizedPath = getLocalizedUrl($page.url.pathname, newLocale);
|
|
651
|
+
goto(localizedPath);
|
|
652
|
+
},
|
|
653
|
+
});
|
|
654
|
+
</script>
|
|
655
|
+
|
|
656
|
+
<ul class="locale-list">
|
|
657
|
+
{#each availableLocales as localeEl}
|
|
658
|
+
<li>
|
|
659
|
+
<a
|
|
660
|
+
href={getLocalizedUrl($page.url.pathname, localeEl)}
|
|
661
|
+
onclick={(e) => {
|
|
662
|
+
e.preventDefault();
|
|
663
|
+
setLocale(localeEl); // Ustawi locale w store i wywoła onLocaleChange
|
|
664
|
+
}}
|
|
665
|
+
class:active={$locale === localeEl}
|
|
666
|
+
>
|
|
667
|
+
{getLocaleName(localeEl)}
|
|
668
|
+
</a>
|
|
669
|
+
</li>
|
|
670
|
+
{/each}
|
|
671
|
+
</ul>
|
|
672
|
+
|
|
673
|
+
<style>
|
|
674
|
+
/* */
|
|
675
|
+
</style>
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
### (Opcjonalny) Krok 10: Dodaj backend proxy
|
|
679
|
+
|
|
680
|
+
Aby dodać backend proxy do swojej aplikacji SvelteKit, możesz użyć funkcji `intlayerProxy` dostarczonej przez wtyczkę `vite-intlayer`. Ta wtyczka automatycznie wykryje najlepszy locale dla użytkownika na podstawie URL, ciasteczek i preferencji językowych przeglądarki.
|
|
681
|
+
|
|
682
|
+
```ts fileName="vite.config.ts"
|
|
683
|
+
import { defineConfig } from "vite";
|
|
684
|
+
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
685
|
+
import { sveltekit } from "@sveltejs/kit/vite";
|
|
686
|
+
|
|
687
|
+
// https://vitejs.dev/config/
|
|
688
|
+
export default defineConfig({
|
|
689
|
+
plugins: [intlayer(), intlayerProxy(), sveltekit()],
|
|
690
|
+
});
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
### (Opcjonalny) Krok 11: Konfiguracja edytora intlayer / CMS
|
|
694
|
+
|
|
695
|
+
Aby skonfigurować edytor intlayer, należy postępować zgodnie z [dokumentacją edytora intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_visual_editor.md).
|
|
696
|
+
|
|
697
|
+
Aby skonfigurować CMS intlayer, należy postępować zgodnie z [dokumentacją CMS intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_CMS.md).
|
|
698
|
+
|
|
699
|
+
Aby móc wizualizować selektor edytora intlayer, musisz użyć składni komponentu w swojej zawartości intlayer.
|
|
700
|
+
|
|
701
|
+
```svelte fileName="Component.svelte"
|
|
702
|
+
<script lang="ts">
|
|
703
|
+
import { useIntlayer } from "svelte-intlayer";
|
|
704
|
+
|
|
705
|
+
const content = useIntlayer("component");
|
|
706
|
+
</script>
|
|
707
|
+
|
|
708
|
+
<div>
|
|
709
|
+
|
|
710
|
+
<!-- Renderuj zawartość jako prostą zawartość -->
|
|
711
|
+
<h1>{$content.title}</h1>
|
|
712
|
+
|
|
713
|
+
<!-- Renderuj zawartość jako komponent (wymagane przez edytor) -->
|
|
714
|
+
<svelte:component this={$content.component} />
|
|
715
|
+
</div>
|
|
716
|
+
```
|
|
717
|
+
|
|
718
|
+
### Konfiguracja Git
|
|
719
|
+
|
|
720
|
+
Zaleca się ignorowanie plików generowanych przez Intlayer.
|
|
721
|
+
|
|
722
|
+
```plaintext fileName=".gitignore"
|
|
723
|
+
# Ignoruj pliki generowane przez Intlayer
|
|
724
|
+
.intlayer
|
|
725
|
+
```
|
|
726
|
+
|
|
727
|
+
---
|
|
728
|
+
|
|
729
|
+
### Idź dalej
|
|
730
|
+
|
|
731
|
+
- **Edytor wizualny**: Zintegruj [Intlayer Visual Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_visual_editor.md), aby edytować tłumaczenia bezpośrednio z interfejsu użytkownika.
|
|
732
|
+
- **CMS**: Zewnętrz zarządzanie treścią, korzystając z [Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_CMS.md).
|