@intlayer/docs 8.1.6 → 8.1.7
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 +18 -9
- package/dist/cjs/generated/docs.entry.cjs +1 -1
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +1 -1
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +2 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/compiler.md +26 -0
- package/docs/ar/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/ar/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/ar/readme.md +138 -110
- package/docs/de/compiler.md +26 -0
- package/docs/de/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/de/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/de/readme.md +152 -124
- package/docs/en/compiler.md +27 -0
- package/docs/en/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/en/intlayer_with_vite+react_compiler.md +368 -0
- package/docs/en/readme.md +129 -105
- package/docs/en-GB/compiler.md +26 -0
- package/docs/en-GB/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/en-GB/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/en-GB/readme.md +134 -108
- package/docs/es/compiler.md +26 -0
- package/docs/es/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/es/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/es/readme.md +149 -121
- package/docs/fr/compiler.md +26 -0
- package/docs/fr/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/fr/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/fr/readme.md +150 -122
- package/docs/hi/compiler.md +26 -0
- package/docs/hi/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/hi/intlayer_with_vite+react_compiler.md +370 -0
- package/docs/hi/readme.md +153 -125
- package/docs/id/compiler.md +26 -0
- package/docs/id/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/id/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/id/readme.md +133 -105
- package/docs/it/compiler.md +26 -0
- package/docs/it/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/it/intlayer_with_vite+react_compiler.md +374 -0
- package/docs/it/readme.md +155 -127
- package/docs/ja/compiler.md +26 -0
- package/docs/ja/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/ja/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/ja/readme.md +152 -126
- package/docs/ko/compiler.md +26 -0
- package/docs/ko/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/ko/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/ko/readme.md +154 -126
- package/docs/pl/compiler.md +26 -0
- package/docs/pl/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/pl/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/pl/readme.md +134 -106
- package/docs/pt/compiler.md +27 -1
- package/docs/pt/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/pt/intlayer_with_vite+react_compiler.md +374 -0
- package/docs/pt/readme.md +154 -126
- package/docs/ru/compiler.md +26 -0
- package/docs/ru/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/ru/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/ru/readme.md +137 -109
- package/docs/tr/compiler.md +26 -0
- package/docs/tr/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/tr/intlayer_with_vite+react_compiler.md +375 -0
- package/docs/tr/readme.md +139 -111
- package/docs/uk/compiler.md +26 -0
- package/docs/uk/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/uk/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/uk/readme.md +133 -109
- package/docs/vi/compiler.md +27 -1
- package/docs/vi/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/vi/intlayer_with_vite+react_compiler.md +369 -0
- package/docs/vi/readme.md +138 -110
- package/docs/zh/compiler.md +26 -0
- package/docs/zh/intlayer_with_nextjs_compiler.md +481 -0
- package/docs/zh/intlayer_with_vite+react_compiler.md +372 -0
- package/docs/zh/readme.md +148 -120
- package/package.json +7 -8
- package/src/generated/docs.entry.ts +40 -0
|
@@ -0,0 +1,481 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2026-01-10
|
|
3
|
+
updatedAt: 2026-01-10
|
|
4
|
+
title: Next.js i18n - Przekształć istniejącą aplikację Next.js w aplikację wielojęzyczną (przewodnik i18n 2026)
|
|
5
|
+
description: Dowiedz się, jak uczynić swoją istniejącą aplikację Next.js wielojęzyczną za pomocą Kompilatora Intlayer. Postępuj zgodnie z dokumentacją, aby umiędzynarodowić (i18n) i przetłumaczyć swoją aplikację przy użyciu AI.
|
|
6
|
+
keywords:
|
|
7
|
+
- Umiędzynarodowienie
|
|
8
|
+
- Dokumentacja
|
|
9
|
+
- Intlayer
|
|
10
|
+
- Next.js
|
|
11
|
+
- JavaScript
|
|
12
|
+
- React
|
|
13
|
+
- Kompilator
|
|
14
|
+
- AI
|
|
15
|
+
slugs:
|
|
16
|
+
- doc
|
|
17
|
+
- srodowisko
|
|
18
|
+
- nextjs
|
|
19
|
+
- kompilator
|
|
20
|
+
applicationTemplate: https://github.com/aymericzip/intlayer-next-no-lolale-path-template
|
|
21
|
+
youtubeVideo: https://www.youtube.com/watch?v=e_PPG7PTqGU
|
|
22
|
+
history:
|
|
23
|
+
- version: 8.1.6
|
|
24
|
+
date: 2026-02-23
|
|
25
|
+
changes: Pierwsze wydanie
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
# Jak sprawić, by istniejąca aplikacja Next.js stała się wielojęzyczna (i18n) (przewodnik i18n 2026)
|
|
29
|
+
|
|
30
|
+
<Tabs defaultTab="video">
|
|
31
|
+
<Tab label="Wideo" value="video">
|
|
32
|
+
|
|
33
|
+
<iframe title="Najlepsze rozwiązanie i18n dla Next.js? Odkryj Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/e_PPG7PTqGU?autoplay=0&origin=http://intlayer.org&controls=0&rel=1"/>
|
|
34
|
+
|
|
35
|
+
</Tab>
|
|
36
|
+
<Tab label="Kod" value="code">
|
|
37
|
+
|
|
38
|
+
<iframe
|
|
39
|
+
src="https://stackblitz.com/github/aymericzip/intlayer-next-16-no-locale-path-template?embed=1&ctl=1&file=intlayer.config.ts"
|
|
40
|
+
className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
|
|
41
|
+
title="Demo CodeSandbox - Jak umiędzynarodowić aplikację za pomocą Intlayer"
|
|
42
|
+
sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
|
|
43
|
+
loading="lazy"
|
|
44
|
+
/>
|
|
45
|
+
|
|
46
|
+
</Tab>
|
|
47
|
+
</Tabs>
|
|
48
|
+
|
|
49
|
+
Zobacz [Szablon Aplikacji](https://github.com/aymericzip/intlayer-next-no-lolale-path-template) na GitHubie.
|
|
50
|
+
|
|
51
|
+
## Spis treści
|
|
52
|
+
|
|
53
|
+
<TOC/>
|
|
54
|
+
|
|
55
|
+
## Dlaczego umiędzynarodowienie istniejącej aplikacji jest trudne?
|
|
56
|
+
|
|
57
|
+
Jeśli kiedykolwiek próbowałeś dodać wiele języków do aplikacji, która była budowana tylko dla jednego języka, to znasz ten ból. To nie jest tylko „trudne” — to żmudne. Musisz przejrzeć każdy plik, znaleźć każdy ciąg tekstowy i przenieść je do oddzielnych plików słownikowych.
|
|
58
|
+
|
|
59
|
+
Potem nadchodzi ryzykowna część: zastąpienie całego tego tekstu wywołaniami do kodu (hookami) bez psucia układu czy logiki. To ten rodzaj pracy, który wstrzymuje rozwój nowych funkcji na tygodnie i wydaje się być niekończącym się refaktoringiem.
|
|
60
|
+
|
|
61
|
+
## Czym jest Kompilator Intlayer?
|
|
62
|
+
|
|
63
|
+
**Kompilator Intlayer** został stworzony po to, by pominąć tę ręczną pracę. Zamiast zmuszać Cię do ręcznego wyciągania ciągów znaków, kompilator robi to za Ciebie. Skanuje Twój kod, znajduje tekst i wykorzystuje AI do generowania słowników w tle.
|
|
64
|
+
Następnie modyfikuje Twój kod podczas kompilacji (build), automatycznie wstrzykując potrzebne wywołania i18n. Zasadniczo nadal piszesz aplikację tak, jakby była w jednym języku, a kompilator zajmuje się wielojęzyczną transformacją natywnie.
|
|
65
|
+
|
|
66
|
+
> Dokumentacja kompilatora: [https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/compiler.md](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/compiler.md)
|
|
67
|
+
|
|
68
|
+
### Ograniczenia
|
|
69
|
+
|
|
70
|
+
Ponieważ kompilator wykonuje analizę i transformację kodu (wstawianie hooków i generowanie słowników) w **czasie kompilacji**, może on **spowolnić proces budowania** Twojej aplikacji.
|
|
71
|
+
|
|
72
|
+
Aby ograniczyć ten wpływ podczas programowania (development), możesz ustawić kompilator w trybie [`'build-only'`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/configuration.md) lub całkowicie go wyłączyć, gdy nie jest potrzebny.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Przewodnik krok po kroku, jak skonfigurować Intlayer w aplikacji Next.js
|
|
77
|
+
|
|
78
|
+
### Krok 1: Instalacja zależności
|
|
79
|
+
|
|
80
|
+
Zainstaluj potrzebne pakiety za pomocą npm:
|
|
81
|
+
|
|
82
|
+
```bash packageManager="npm"
|
|
83
|
+
npm install intlayer next-intlayer
|
|
84
|
+
npm install @intlayer/babel --save-dev
|
|
85
|
+
npx intlayer init
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```bash packageManager="pnpm"
|
|
89
|
+
pnpm add intlayer next-intlayer
|
|
90
|
+
pnpm add @intlayer/babel --save-dev
|
|
91
|
+
pnpm intlayer init
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```bash packageManager="yarn"
|
|
95
|
+
yarn add intlayer next-intlayer
|
|
96
|
+
yarn add @intlayer/babel --save-dev
|
|
97
|
+
yarn intlayer init
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```bash packageManager="bun"
|
|
101
|
+
bun add intlayer next-intlayer
|
|
102
|
+
bun add @intlayer/babel --dev
|
|
103
|
+
bunx intlayer init
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- **intlayer**
|
|
107
|
+
|
|
108
|
+
Główny pakiet dostarczający narzędzia do umiędzynarodowienia, takie jak zarządzanie konfiguracją, tłumaczenia, [deklaracja treści](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/dictionary/content_file.md), transpilacja oraz [komendy CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/cli/index.md).
|
|
109
|
+
|
|
110
|
+
- **next-intlayer**
|
|
111
|
+
|
|
112
|
+
Pakiet integrujący Intlayer z frameworkiem Next.js. Dostarcza context providery oraz hooki dla Next.js. Ponadto zawiera wtyczkę Next.js pozwalającą połączyć Intlayer z [Webpackiem](https://webpack.js.org/) lub [Turbopackiem](https://nextjs.org/docs/app/api-reference/turbopack), a także middleware do wykrywania języka, zarządzania cookies i obsługi przekierowań URL.
|
|
113
|
+
|
|
114
|
+
### Krok 2: Konfiguracja projektu
|
|
115
|
+
|
|
116
|
+
Utwórz plik konfiguracyjny, by zdefiniować dostępne języki aplikacji:
|
|
117
|
+
|
|
118
|
+
```typescript fileName="intlayer.config.ts"
|
|
119
|
+
import { Locales, type IntlayerConfig } from "intlayer";
|
|
120
|
+
|
|
121
|
+
const config: IntlayerConfig = {
|
|
122
|
+
internationalization: {
|
|
123
|
+
locales: [Locales.ENGLISH, Locales.POLISH],
|
|
124
|
+
defaultLocale: Locales.POLISH,
|
|
125
|
+
},
|
|
126
|
+
routing: {
|
|
127
|
+
mode: "search-params",
|
|
128
|
+
},
|
|
129
|
+
compiler: {
|
|
130
|
+
enabled: true, // Można ustawić na 'build-only', aby ograniczyć wpływ w trybie dev
|
|
131
|
+
outputDir: "i18n",
|
|
132
|
+
dictionaryKeyPrefix: "", // Brak prefiksu, domyślnie "comp-"
|
|
133
|
+
},
|
|
134
|
+
ai: {
|
|
135
|
+
provider: "openai",
|
|
136
|
+
model: "gpt-5-mini",
|
|
137
|
+
apiKey: process.env.OPEN_AI_API_KEY,
|
|
138
|
+
applicationContext: "Ta aplikacja to prosty przykład aplikacji mapowej",
|
|
139
|
+
},
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
export default config;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
> **Uwaga**: Upewnij się, że Twój `OPEN_AI_API_KEY` jest ustawiony w zmiennych środowiskowych.
|
|
146
|
+
|
|
147
|
+
> Za pomocą tego pliku konfiguracyjnego możesz ustawić zlokalizowane adresy URL, przekierowania proxy, nazwy ciasteczek, lokalizację i rozszerzenie deklaracji treści, wyłączyć logi konsoli Intlayer i wiele więcej. Pełną listę parametrów znajdziesz w [dokumentacji konfiguracji](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/configuration.md).
|
|
148
|
+
|
|
149
|
+
### Krok 3: Integracja Intlayer z konfiguracją Next.js
|
|
150
|
+
|
|
151
|
+
Skonfiguruj swoje ustawienia Next.js, aby używać Intlayer:
|
|
152
|
+
|
|
153
|
+
```typescript fileName="next.config.ts"
|
|
154
|
+
import type { NextConfig } from "next";
|
|
155
|
+
import { withIntlayer } from "next-intlayer/server";
|
|
156
|
+
|
|
157
|
+
const nextConfig: NextConfig = {
|
|
158
|
+
/* opcjonalna dodatkowa konfiguracja Next.js tutaj */
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
export default withIntlayer(nextConfig);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
> Plugin `withIntlayer()` służy do integracji Intlayer z Next.js. Zapewnia budowanie plików słowników i monitoruje je w trybie deweloperskim. Definiuje zmienne środowiskowe Intlayer w środowiskach [Webpack](https://webpack.js.org/) lub [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack). Ponadto dostarcza aliasy w celu optymalizacji wydajności i zapewnia pełną współpracę z Server Components.
|
|
165
|
+
|
|
166
|
+
### Krok 4: Konfiguracja Babel
|
|
167
|
+
|
|
168
|
+
Kompilator Intlayer wymaga Babel do wyodrębniania i optymalizacji treści. Zaktualizuj swój plik `babel.config.js` (lub `babel.config.json`), aby zawierał wtyczki Intlayer:
|
|
169
|
+
|
|
170
|
+
```typescript fileName="babel.config.js"
|
|
171
|
+
const {
|
|
172
|
+
intlayerExtractBabelPlugin,
|
|
173
|
+
intlayerOptimizeBabelPlugin,
|
|
174
|
+
getExtractPluginOptions,
|
|
175
|
+
getOptimizePluginOptions,
|
|
176
|
+
} = require("@intlayer/babel");
|
|
177
|
+
|
|
178
|
+
module.exports = {
|
|
179
|
+
presets: ["next/babel"],
|
|
180
|
+
plugins: [
|
|
181
|
+
[intlayerExtractBabelPlugin, getExtractPluginOptions()],
|
|
182
|
+
[intlayerOptimizeBabelPlugin, getOptimizePluginOptions()],
|
|
183
|
+
],
|
|
184
|
+
};
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Krok 5: Wykrywanie języka na stronach
|
|
188
|
+
|
|
189
|
+
Wyczyść zawartość swojego `RootLayout` i zastąp ją poniższym przykładem:
|
|
190
|
+
|
|
191
|
+
```tsx fileName="src/app/layout.tsx"
|
|
192
|
+
import type { Metadata } from "next";
|
|
193
|
+
import type { ReactNode } from "react";
|
|
194
|
+
import "./globals.css";
|
|
195
|
+
import { IntlayerClientProvider, LocalPromiseParams } from "next-intlayer";
|
|
196
|
+
import { getHTMLTextDir, getIntlayer } from "intlayer";
|
|
197
|
+
import { getLocale } from "next-intlayer/server";
|
|
198
|
+
export { generateStaticParams } from "next-intlayer";
|
|
199
|
+
|
|
200
|
+
export const generateMetadata = async (): Promise<Metadata> => {
|
|
201
|
+
const locale = await getLocale();
|
|
202
|
+
const { title, description, keywords } = getIntlayer("metadata", locale);
|
|
203
|
+
|
|
204
|
+
return {
|
|
205
|
+
title,
|
|
206
|
+
description,
|
|
207
|
+
keywords,
|
|
208
|
+
};
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const RootLayout = async ({
|
|
212
|
+
children,
|
|
213
|
+
}: Readonly<{
|
|
214
|
+
children: ReactNode;
|
|
215
|
+
}>) => {
|
|
216
|
+
const locale = await getLocale();
|
|
217
|
+
|
|
218
|
+
return (
|
|
219
|
+
<html lang={locale} dir={getHTMLTextDir(locale)}>
|
|
220
|
+
<IntlayerClientProvider defaultLocale={locale}>
|
|
221
|
+
<body>{children}</body>
|
|
222
|
+
</IntlayerClientProvider>
|
|
223
|
+
</html>
|
|
224
|
+
);
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
export default RootLayout;
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Krok 6: Kompilacja komponentów
|
|
231
|
+
|
|
232
|
+
Z włączonym kompilatorem absolutnie **nie masz wymogu** ręcznego deklarowania słowników treści (takich jak pliki `.content.ts`).
|
|
233
|
+
|
|
234
|
+
Zamiast tego po prostu wpisujesz treść jako standardowe ciągi znaków (hardcoded) bezpośrednio w kodzie. Intlayer przeskanuje kod źródłowy, wygeneruje tłumaczenia przy użyciu skonfigurowanego dostawcy AI i po cichu zastąpi te ciągi zlokalizowaną treścią podczas kroku kompilacji. Wszystko to jest w pełni zautomatyzowane.
|
|
235
|
+
|
|
236
|
+
Wystarczy pisać komponenty z zakodowanymi na sztywno ciągami znaków w domyślnym języku. Kompilator zajmie się resztą.
|
|
237
|
+
|
|
238
|
+
Przykład tego, jak może wyglądać Twoja strona:
|
|
239
|
+
|
|
240
|
+
<Tabs>
|
|
241
|
+
<Tab value="Code">
|
|
242
|
+
|
|
243
|
+
```tsx fileName="src/app/page.tsx"
|
|
244
|
+
import type { FC } from "react";
|
|
245
|
+
import { IntlayerServerProvider } from "next-intlayer/server";
|
|
246
|
+
import { getLocale } from "next-intlayer/server";
|
|
247
|
+
|
|
248
|
+
const PageContent: FC = () => {
|
|
249
|
+
return (
|
|
250
|
+
<>
|
|
251
|
+
<p>Zacznij od edytowania</p>
|
|
252
|
+
<code>src/app/page.tsx</code>
|
|
253
|
+
</>
|
|
254
|
+
);
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
export default async function Page() {
|
|
258
|
+
const locale = await getLocale();
|
|
259
|
+
|
|
260
|
+
return (
|
|
261
|
+
<IntlayerServerProvider locale={locale}>
|
|
262
|
+
<PageContent />
|
|
263
|
+
</IntlayerServerProvider>
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
</Tab>
|
|
269
|
+
<Tab value="Output">
|
|
270
|
+
|
|
271
|
+
```ts fileName="i18n/page-content.content.tsx"
|
|
272
|
+
{
|
|
273
|
+
key: "page-content",
|
|
274
|
+
content: {
|
|
275
|
+
nodeType: "translation",
|
|
276
|
+
translation: {
|
|
277
|
+
en: {
|
|
278
|
+
getStartedByEditing: "Get started by editing",
|
|
279
|
+
},
|
|
280
|
+
fr: {
|
|
281
|
+
getStartedByEditing: "Commencez par éditer",
|
|
282
|
+
},
|
|
283
|
+
pl: {
|
|
284
|
+
getStartedByEditing: "Zacznij od edytowania",
|
|
285
|
+
},
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
```tsx fileName="src/app/page.tsx"
|
|
292
|
+
import { type FC } from "react";
|
|
293
|
+
import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
|
|
294
|
+
import { getLocale } from "next-intlayer/server";
|
|
295
|
+
|
|
296
|
+
const PageContent: FC = () => {
|
|
297
|
+
const content = useIntlayer("page-content");
|
|
298
|
+
|
|
299
|
+
return (
|
|
300
|
+
<>
|
|
301
|
+
<p>{content.getStartedByEditing}</p>
|
|
302
|
+
<code>src/app/page.tsx</code>
|
|
303
|
+
</>
|
|
304
|
+
);
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
export default async function Page() {
|
|
308
|
+
const locale = await getLocale();
|
|
309
|
+
|
|
310
|
+
return (
|
|
311
|
+
<IntlayerServerProvider locale={locale}>
|
|
312
|
+
<PageContent />
|
|
313
|
+
</IntlayerServerProvider>
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
</Tab>
|
|
319
|
+
</Tabs>
|
|
320
|
+
|
|
321
|
+
- **`IntlayerClientProvider`** służy do dostarczania języka dzięcom po stronie klienta (Client Side).
|
|
322
|
+
- **`IntlayerServerProvider`** służy do dostarczania języka dzięcom po stronie serwera (Server Side).
|
|
323
|
+
|
|
324
|
+
### (Opcjonalnie) Krok 7: Uzupełnij brakujące tłumaczenia
|
|
325
|
+
|
|
326
|
+
Intlayer udostępnia narzędzie CLI, które pomaga uzupełnić brakujące tłumaczenia. Możesz użyć polecenia `intlayer`, aby przetestować i uzupełnić brakujące tłumaczenia ze swojego kodu.
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
npx intlayer test # Przetestuj, czy brakuje tłumaczeń
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
```bash
|
|
333
|
+
npx intlayer fill # Uzupełnij brakujące tłumaczenia
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
> Więcej szczegółów znajdziesz w [dokumentacji CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/cli/ci.md)
|
|
337
|
+
|
|
338
|
+
### (Opcjonalnie) Krok 8: Konfiguracja Proxy do wykrywania języka
|
|
339
|
+
|
|
340
|
+
Skonfiguruj proxy w celu automatycznego wykrywania preferowanego języka użytkownika:
|
|
341
|
+
|
|
342
|
+
```typescript fileName="src/proxy.ts"
|
|
343
|
+
export { intlayerProxy as proxy } from "next-intlayer/proxy";
|
|
344
|
+
|
|
345
|
+
export const config = {
|
|
346
|
+
matcher:
|
|
347
|
+
"/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
|
|
348
|
+
};
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
> `intlayerProxy` służy do wykrywania preferowanego języka użytkownika i przekierowywania go na odpowiedni adres URL, zgodnie z ustawieniami w [pliku konfiguracyjnym](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/configuration.md). Dodatkowo umożliwia zapisanie preferowanego języka w ciasteczku (cookie).
|
|
352
|
+
|
|
353
|
+
### (Opcjonalnie) Krok 8: Zmiana języka treści
|
|
354
|
+
|
|
355
|
+
Aby zmienić język treści w Next.js, zalecanym sposobem jest użycie komponentu `Link` w celu przekierowania użytkowników na odpowiednią zlokalizowaną stronę. Komponent `Link` umożliwia prefetching stron, co pomaga uniknąć pełnego odświeżenia witryny.
|
|
356
|
+
|
|
357
|
+
```tsx fileName="src/components/localeSwitcher/LocaleSwitcher.tsx"
|
|
358
|
+
"use client";
|
|
359
|
+
|
|
360
|
+
import type { FC } from "react";
|
|
361
|
+
import { Locales, getHTMLTextDir, getLocaleName } from "intlayer";
|
|
362
|
+
import { useLocale } from "next-intlayer";
|
|
363
|
+
|
|
364
|
+
export const LocaleSwitcher: FC = () => {
|
|
365
|
+
const { locale, availableLocales, setLocale } = useLocale({
|
|
366
|
+
onChange: () => window.location.reload(),
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
return (
|
|
370
|
+
<div>
|
|
371
|
+
<button popoverTarget="localePopover">{getLocaleName(locale)}</button>
|
|
372
|
+
<div id="localePopover" popover="auto">
|
|
373
|
+
{availableLocales.map((localeItem) => (
|
|
374
|
+
<button
|
|
375
|
+
key={localeItem}
|
|
376
|
+
aria-current={locale === localeItem ? "page" : undefined}
|
|
377
|
+
onClick={() => setLocale(localeItem)}
|
|
378
|
+
>
|
|
379
|
+
<span>
|
|
380
|
+
{/* Lokalizacja - np. PL */}
|
|
381
|
+
{localeItem}
|
|
382
|
+
</span>
|
|
383
|
+
<span>
|
|
384
|
+
{/* Język w swoim własnym Locale - np. Polski */}
|
|
385
|
+
{getLocaleName(localeItem, locale)}
|
|
386
|
+
</span>
|
|
387
|
+
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
388
|
+
{/* Język w bieżącym Locale - np. Francés, jeśli bieżące locale to Locales.SPANISH */}
|
|
389
|
+
{getLocaleName(localeItem)}
|
|
390
|
+
</span>
|
|
391
|
+
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
392
|
+
{/* Język po angielsku - np. French */}
|
|
393
|
+
{getLocaleName(localeItem, Locales.ENGLISH)}
|
|
394
|
+
</span>
|
|
395
|
+
</button>
|
|
396
|
+
))}
|
|
397
|
+
</div>
|
|
398
|
+
</div>
|
|
399
|
+
);
|
|
400
|
+
};
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
> Alternatywnym sposobem jest użycie funkcji `setLocale` dostarczanej przez hook `useLocale`. Ta funkcja nie pozwala na prefetching strony. Więcej szczegółów znajdziesz w [dokumentacji hooka `useLocale`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/packages/next-intlayer/useLocale.md).
|
|
404
|
+
|
|
405
|
+
### (Opcjonalnie) Krok 10: Optymalizacja rozmiaru bundle'a
|
|
406
|
+
|
|
407
|
+
Podczas korzystania z `next-intlayer` słowniki są domyślnie dołączane do bundle'a dla każdej strony. Aby zoptymalizować rozmiar bundle'a, Intlayer udostępnia opcjonalną wtyczkę SWC, która inteligentnie zastępuje wywołania `useIntlayer` za pomocą makr. Zapewnia to, że słowniki są dołączane tylko do bundle'i stron, które faktycznie z nich korzystają.
|
|
408
|
+
|
|
409
|
+
Aby włączyć tę optymalizację, zainstaluj pakiet `@intlayer/swc`. Po zainstalowaniu `next-intlayer` automatycznie wykryje i użyje wtyczki:
|
|
410
|
+
|
|
411
|
+
```bash packageManager="npm"
|
|
412
|
+
npm install @intlayer/swc --save-dev
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
```bash packageManager="pnpm"
|
|
416
|
+
pnpm add @intlayer/swc --save-dev
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
```bash packageManager="yarn"
|
|
420
|
+
yarn add @intlayer/swc --save-dev
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
```bash packageManager="bun"
|
|
424
|
+
bun add @intlayer/swc --dev
|
|
425
|
+
```
|
|
426
|
+
|
|
427
|
+
> Uwaga: Ta optymalizacja jest dostępna tylko dla Next.js 13 i nowszych.
|
|
428
|
+
|
|
429
|
+
> Uwaga: Ten pakiet nie jest instalowany domyślnie, ponieważ wtyczki SWC w Next.js są wciąż eksperymentalne. Może to ulec zmianie w przyszłości.
|
|
430
|
+
|
|
431
|
+
> Uwaga: Jeśli ustawisz opcję `importMode: 'dynamic'` lub `importMode: 'fetch'` (w konfiguracji słownika), będzie ona polegać na Suspense, więc będziesz musiał owinąć wywołania `useIntlayer` w granicę `Suspense`. Oznacza to, że nie będziesz mógł używać `useIntlayer` bezpośrednio na najwyższym poziomie komponentu Strony / Layoutu.
|
|
432
|
+
|
|
433
|
+
### Konfiguracja TypeScript
|
|
434
|
+
|
|
435
|
+
Intlayer używa rozszerzania modułów (module augmentation), aby czerpać korzyści z TypeScript i uczynić Twoją bazę kodu bardziej solidną.
|
|
436
|
+
|
|
437
|
+

|
|
438
|
+
|
|
439
|
+

|
|
440
|
+
|
|
441
|
+
Upewnij się, że Twoja konfiguracja TypeScript zawiera automatycznie generowane typy.
|
|
442
|
+
|
|
443
|
+
```json5 fileName="tsconfig.json"
|
|
444
|
+
{
|
|
445
|
+
// ... Twoje istniejące konfiguracje TypeScript
|
|
446
|
+
"include": [
|
|
447
|
+
// ... Twoje istniejące konfiguracje TypeScript
|
|
448
|
+
".intlayer/**/*.ts", // Uwzględnij autogenerowane typy
|
|
449
|
+
],
|
|
450
|
+
}
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
### Konfiguracja Git
|
|
454
|
+
|
|
455
|
+
Zaleca się ignorowanie plików generowanych przez Intlayer. Pozwala to uniknąć ich commitowania do repozytorium Git.
|
|
456
|
+
|
|
457
|
+
Aby to zrobić, dodaj poniższe instrukje do pliku `.gitignore`:
|
|
458
|
+
|
|
459
|
+
```plaintext fileName=".gitignore"
|
|
460
|
+
# Ignoruj pliki generowane przez Intlayer
|
|
461
|
+
.intlayer
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### Rozszerzenie VS Code
|
|
465
|
+
|
|
466
|
+
Aby usprawnić proces tworzenia aplikacji z Intlayer, możesz zainstalować **oficjalne rozszerzenie Intlayer dla VS Code**.
|
|
467
|
+
|
|
468
|
+
[Zainstaluj z VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
469
|
+
|
|
470
|
+
To rozszerzenie zapewnia:
|
|
471
|
+
|
|
472
|
+
- **Autouzupełnianie** kluczy tłumaczeń.
|
|
473
|
+
- **Wykrywanie błędów w czasie rzeczywistym** dla brakujących tłumaczeń.
|
|
474
|
+
- **Podgląd inline** przetłumaczonej treści.
|
|
475
|
+
- **Szybkie akcje** do łatwego tworzenia i aktualizowania tłumaczeń.
|
|
476
|
+
|
|
477
|
+
Więcej szczegółów na temat korzystania z rozszerzenia znajdziesz w [dokumentacji rozszerzenia Intlayer dla VS Code](https://intlayer.org/doc/vs-code-extension).
|
|
478
|
+
|
|
479
|
+
### Idź dalej
|
|
480
|
+
|
|
481
|
+
Aby pójść o krok dalej, możesz wdrożyć [edytor wizualny](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_visual_editor.md) lub wyeksportować swoją treść za pomocą [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/pl/intlayer_CMS.md).
|