@intlayer/docs 8.0.0 → 8.0.1-canary.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/dist/cjs/generated/docs.entry.cjs +160 -0
- package/dist/cjs/generated/docs.entry.cjs.map +1 -1
- package/dist/esm/generated/docs.entry.mjs +160 -0
- package/dist/esm/generated/docs.entry.mjs.map +1 -1
- package/dist/types/generated/docs.entry.d.ts +8 -0
- package/dist/types/generated/docs.entry.d.ts.map +1 -1
- package/docs/ar/intlayer_with_adonisjs.md +394 -0
- package/docs/ar/intlayer_with_hono.md +223 -0
- package/docs/ar/intlayer_with_vite+preact.md +317 -675
- package/docs/ar/packages/adonis-intlayer/exports.md +50 -0
- package/docs/ar/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/ar/packages/adonis-intlayer/t.md +149 -0
- package/docs/ar/packages/hono-intlayer/exports.md +59 -0
- package/docs/ar/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/ar/packages/hono-intlayer/t.md +268 -0
- package/docs/de/intlayer_with_adonisjs.md +392 -0
- package/docs/de/intlayer_with_hono.md +418 -0
- package/docs/de/intlayer_with_vite+preact.md +272 -632
- package/docs/de/packages/adonis-intlayer/exports.md +50 -0
- package/docs/de/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/de/packages/adonis-intlayer/t.md +149 -0
- package/docs/de/packages/hono-intlayer/exports.md +59 -0
- package/docs/de/packages/hono-intlayer/intlayer.md +59 -0
- package/docs/de/packages/hono-intlayer/t.md +316 -0
- package/docs/en/index.md +8 -0
- package/docs/en/intlayer_with_adonisjs.md +388 -0
- package/docs/en/intlayer_with_hono.md +418 -0
- package/docs/en/intlayer_with_vite+preact.md +171 -556
- package/docs/en/introduction.md +1 -0
- package/docs/en/packages/adonis-intlayer/exports.md +50 -0
- package/docs/en/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/en/packages/adonis-intlayer/t.md +149 -0
- package/docs/en/packages/hono-intlayer/exports.md +59 -0
- package/docs/en/packages/hono-intlayer/intlayer.md +59 -0
- package/docs/en/packages/hono-intlayer/t.md +316 -0
- package/docs/en-GB/intlayer_with_adonisjs.md +394 -0
- package/docs/en-GB/intlayer_with_hono.md +418 -0
- package/docs/en-GB/intlayer_with_vite+preact.md +236 -583
- package/docs/en-GB/packages/adonis-intlayer/exports.md +50 -0
- package/docs/en-GB/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/en-GB/packages/adonis-intlayer/t.md +149 -0
- package/docs/en-GB/packages/hono-intlayer/exports.md +59 -0
- package/docs/en-GB/packages/hono-intlayer/intlayer.md +59 -0
- package/docs/en-GB/packages/hono-intlayer/t.md +316 -0
- package/docs/es/intlayer_with_adonisjs.md +388 -0
- package/docs/es/intlayer_with_hono.md +418 -0
- package/docs/es/intlayer_with_vite+preact.md +286 -650
- package/docs/es/packages/adonis-intlayer/exports.md +50 -0
- package/docs/es/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/es/packages/adonis-intlayer/t.md +149 -0
- package/docs/es/packages/hono-intlayer/exports.md +59 -0
- package/docs/es/packages/hono-intlayer/intlayer.md +59 -0
- package/docs/es/packages/hono-intlayer/t.md +316 -0
- package/docs/fr/intlayer_with_adonisjs.md +388 -0
- package/docs/fr/intlayer_with_hono.md +418 -0
- package/docs/fr/intlayer_with_vite+preact.md +274 -614
- package/docs/fr/packages/adonis-intlayer/exports.md +50 -0
- package/docs/fr/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/fr/packages/adonis-intlayer/t.md +149 -0
- package/docs/fr/packages/hono-intlayer/exports.md +59 -0
- package/docs/fr/packages/hono-intlayer/intlayer.md +59 -0
- package/docs/fr/packages/hono-intlayer/t.md +316 -0
- package/docs/hi/intlayer_with_adonisjs.md +394 -0
- package/docs/hi/intlayer_with_hono.md +227 -0
- package/docs/hi/intlayer_with_vite+preact.md +304 -680
- package/docs/hi/packages/adonis-intlayer/exports.md +50 -0
- package/docs/hi/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/hi/packages/adonis-intlayer/t.md +149 -0
- package/docs/hi/packages/hono-intlayer/exports.md +59 -0
- package/docs/hi/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/hi/packages/hono-intlayer/t.md +268 -0
- package/docs/id/intlayer_with_adonisjs.md +394 -0
- package/docs/id/intlayer_with_hono.md +227 -0
- package/docs/id/intlayer_with_vite+preact.md +297 -697
- package/docs/id/packages/adonis-intlayer/exports.md +50 -0
- package/docs/id/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/id/packages/adonis-intlayer/t.md +149 -0
- package/docs/id/packages/hono-intlayer/exports.md +59 -0
- package/docs/id/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/id/packages/hono-intlayer/t.md +268 -0
- package/docs/it/intlayer_with_adonisjs.md +394 -0
- package/docs/it/intlayer_with_hono.md +227 -0
- package/docs/it/intlayer_with_vite+preact.md +290 -659
- package/docs/it/packages/adonis-intlayer/exports.md +50 -0
- package/docs/it/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/it/packages/adonis-intlayer/t.md +149 -0
- package/docs/it/packages/hono-intlayer/exports.md +59 -0
- package/docs/it/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/it/packages/hono-intlayer/t.md +268 -0
- package/docs/ja/intlayer_with_adonisjs.md +394 -0
- package/docs/ja/intlayer_with_hono.md +227 -0
- package/docs/ja/intlayer_with_vite+preact.md +307 -662
- package/docs/ja/packages/adonis-intlayer/exports.md +50 -0
- package/docs/ja/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/ja/packages/adonis-intlayer/t.md +149 -0
- package/docs/ja/packages/hono-intlayer/exports.md +59 -0
- package/docs/ja/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/ja/packages/hono-intlayer/t.md +268 -0
- package/docs/ko/intlayer_with_adonisjs.md +394 -0
- package/docs/ko/intlayer_with_hono.md +227 -0
- package/docs/ko/intlayer_with_vite+preact.md +303 -703
- package/docs/ko/packages/adonis-intlayer/exports.md +50 -0
- package/docs/ko/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/ko/packages/adonis-intlayer/t.md +149 -0
- package/docs/ko/packages/hono-intlayer/exports.md +59 -0
- package/docs/ko/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/ko/packages/hono-intlayer/t.md +268 -0
- package/docs/pl/intlayer_with_adonisjs.md +394 -0
- package/docs/pl/intlayer_with_hono.md +227 -0
- package/docs/pl/intlayer_with_vite+preact.md +289 -690
- package/docs/pl/packages/adonis-intlayer/exports.md +50 -0
- package/docs/pl/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/pl/packages/adonis-intlayer/t.md +149 -0
- package/docs/pl/packages/hono-intlayer/exports.md +59 -0
- package/docs/pl/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/pl/packages/hono-intlayer/t.md +268 -0
- package/docs/pt/intlayer_with_adonisjs.md +394 -0
- package/docs/pt/intlayer_with_hono.md +227 -0
- package/docs/pt/intlayer_with_vite+preact.md +275 -637
- package/docs/pt/packages/adonis-intlayer/exports.md +50 -0
- package/docs/pt/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/pt/packages/adonis-intlayer/t.md +149 -0
- package/docs/pt/packages/hono-intlayer/exports.md +59 -0
- package/docs/pt/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/pt/packages/hono-intlayer/t.md +268 -0
- package/docs/ru/intlayer_with_adonisjs.md +393 -0
- package/docs/ru/intlayer_with_hono.md +223 -0
- package/docs/ru/intlayer_with_vite+preact.md +319 -683
- package/docs/ru/packages/adonis-intlayer/exports.md +50 -0
- package/docs/ru/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/ru/packages/adonis-intlayer/t.md +149 -0
- package/docs/ru/packages/hono-intlayer/exports.md +59 -0
- package/docs/ru/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/ru/packages/hono-intlayer/t.md +268 -0
- package/docs/tr/intlayer_with_adonisjs.md +394 -0
- package/docs/tr/intlayer_with_hono.md +227 -0
- package/docs/tr/intlayer_with_vite+preact.md +332 -665
- package/docs/tr/packages/adonis-intlayer/exports.md +50 -0
- package/docs/tr/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/tr/packages/adonis-intlayer/t.md +149 -0
- package/docs/tr/packages/hono-intlayer/exports.md +59 -0
- package/docs/tr/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/tr/packages/hono-intlayer/t.md +268 -0
- package/docs/uk/intlayer_with_adonisjs.md +394 -0
- package/docs/uk/intlayer_with_hono.md +227 -0
- package/docs/uk/intlayer_with_vite+preact.md +228 -626
- package/docs/uk/packages/adonis-intlayer/exports.md +50 -0
- package/docs/uk/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/uk/packages/adonis-intlayer/t.md +149 -0
- package/docs/uk/packages/hono-intlayer/exports.md +59 -0
- package/docs/uk/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/uk/packages/hono-intlayer/t.md +268 -0
- package/docs/vi/intlayer_with_adonisjs.md +394 -0
- package/docs/vi/intlayer_with_hono.md +227 -0
- package/docs/vi/intlayer_with_vite+preact.md +294 -679
- package/docs/vi/packages/adonis-intlayer/exports.md +50 -0
- package/docs/vi/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/vi/packages/adonis-intlayer/t.md +149 -0
- package/docs/vi/packages/hono-intlayer/exports.md +59 -0
- package/docs/vi/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/vi/packages/hono-intlayer/t.md +268 -0
- package/docs/zh/intlayer_with_adonisjs.md +393 -0
- package/docs/zh/intlayer_with_hono.md +418 -0
- package/docs/zh/intlayer_with_vite+preact.md +338 -743
- package/docs/zh/packages/adonis-intlayer/exports.md +50 -0
- package/docs/zh/packages/adonis-intlayer/intlayer.md +54 -0
- package/docs/zh/packages/adonis-intlayer/t.md +149 -0
- package/docs/zh/packages/hono-intlayer/exports.md +59 -0
- package/docs/zh/packages/hono-intlayer/intlayer.md +60 -0
- package/docs/zh/packages/hono-intlayer/t.md +294 -0
- package/package.json +6 -6
- package/src/generated/docs.entry.ts +160 -0
|
@@ -92,8 +92,6 @@ bun add vite-intlayer --dev
|
|
|
92
92
|
bunx intlayer init
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
- **intlayer**
|
|
96
|
-
|
|
97
95
|
- **intlayer**
|
|
98
96
|
|
|
99
97
|
Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, [Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/get_started.md), Transpilierung und [CLI-Befehle](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_cli.md) bereitstellt.
|
|
@@ -102,7 +100,7 @@ bunx intlayer init
|
|
|
102
100
|
Das Paket, das Intlayer in Preact-Anwendungen integriert. Es stellt Kontextanbieter und Hooks für die Internationalisierung in Preact bereit.
|
|
103
101
|
|
|
104
102
|
- **vite-intlayer**
|
|
105
|
-
Enthält das Vite-Plugin zur Integration von Intlayer mit dem [Vite-Bundler](https://vite.dev/guide/why.html#why-bundle-for-production) sowie Middleware zur Erkennung der bevorzugten Sprache des Benutzers, Verwaltung von Cookies und Handhabung von URL-Weiterleitungen.
|
|
103
|
+
Enthält das Vite-Plugin zur Integration von Intlayer mit dem [Vite-Bundler](https://vite.dev/guide/why.html#why-bundle-for-production), sowie Middleware zur Erkennung der bevorzugten Sprache des Benutzers, Verwaltung von Cookies und Handhabung von URL-Weiterleitungen.
|
|
106
104
|
|
|
107
105
|
### Schritt 2: Konfiguration Ihres Projekts
|
|
108
106
|
|
|
@@ -121,6 +119,10 @@ const config: IntlayerConfig = {
|
|
|
121
119
|
],
|
|
122
120
|
defaultLocale: Locales.ENGLISH,
|
|
123
121
|
},
|
|
122
|
+
routing: {
|
|
123
|
+
mode: "prefix-no-default", // Standard: Präfix für alle Locales außer der Standard-Locale
|
|
124
|
+
storage: ["cookie", "header"], // Standard: Locale in Cookie speichern und aus Header erkennen
|
|
125
|
+
},
|
|
124
126
|
};
|
|
125
127
|
|
|
126
128
|
export default config;
|
|
@@ -140,6 +142,10 @@ const config = {
|
|
|
140
142
|
],
|
|
141
143
|
defaultLocale: Locales.ENGLISH,
|
|
142
144
|
},
|
|
145
|
+
routing: {
|
|
146
|
+
mode: "prefix-no-default", // Standard: Präfix für alle Locales außer der Standard-Locale
|
|
147
|
+
storage: ["cookie", "header"], // Standard: Locale in Cookie speichern und aus Header erkennen
|
|
148
|
+
},
|
|
143
149
|
};
|
|
144
150
|
|
|
145
151
|
export default config;
|
|
@@ -159,12 +165,16 @@ const config = {
|
|
|
159
165
|
],
|
|
160
166
|
defaultLocale: Locales.ENGLISH,
|
|
161
167
|
},
|
|
168
|
+
routing: {
|
|
169
|
+
mode: "prefix-no-default", // Standard: Präfix für alle Locales außer der Standard-Locale
|
|
170
|
+
storage: ["cookie", "header"], // Standard: Locale in Cookie speichern und aus Header erkennen
|
|
171
|
+
},
|
|
162
172
|
};
|
|
163
173
|
|
|
164
174
|
module.exports = config;
|
|
165
175
|
```
|
|
166
176
|
|
|
167
|
-
> Durch diese Konfigurationsdatei können Sie lokalisierte URLs,
|
|
177
|
+
> Durch diese Konfigurationsdatei können Sie lokalisierte URLs, Routing-Modi, Speicheroptionen, Cookie-Namen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen einrichten, Intlayer-Logs in der Konsole deaktivieren und vieles mehr. Für eine vollständige Liste der verfügbaren Parameter verweisen wir auf die [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
|
|
168
178
|
|
|
169
179
|
### Schritt 3: Integrieren Sie Intlayer in Ihre Vite-Konfiguration
|
|
170
180
|
|
|
@@ -238,8 +248,7 @@ const appContent = {
|
|
|
238
248
|
edit: t<ComponentChildren>({
|
|
239
249
|
en: (
|
|
240
250
|
<>
|
|
241
|
-
|
|
242
|
-
testen
|
|
251
|
+
Edit <code>src/app.tsx</code> and save to test HMR
|
|
243
252
|
</>
|
|
244
253
|
),
|
|
245
254
|
fr: (
|
|
@@ -293,13 +302,13 @@ const appContent = {
|
|
|
293
302
|
}),
|
|
294
303
|
|
|
295
304
|
edit: t({
|
|
296
|
-
en: "
|
|
305
|
+
en: "Edit src/app.jsx and save to test HMR",
|
|
297
306
|
fr: "Éditez src/app.jsx et enregistrez pour tester HMR",
|
|
298
|
-
es: "
|
|
307
|
+
es: "Edita src/app.jsx y guarda para probar HMR",
|
|
299
308
|
}),
|
|
300
309
|
|
|
301
310
|
readTheDocs: t({
|
|
302
|
-
en: "
|
|
311
|
+
en: "Click on the Vite and Preact logos to learn more",
|
|
303
312
|
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
304
313
|
es: "Haga clic en los logotipos de Vite y Preact para obtener más información",
|
|
305
314
|
}),
|
|
@@ -318,12 +327,12 @@ const appContent = {
|
|
|
318
327
|
key: "app",
|
|
319
328
|
content: {
|
|
320
329
|
viteLogo: t({
|
|
321
|
-
en: "Vite
|
|
330
|
+
en: "Vite logo",
|
|
322
331
|
fr: "Logo Vite",
|
|
323
332
|
es: "Logo Vite",
|
|
324
333
|
}),
|
|
325
334
|
preactLogo: t({
|
|
326
|
-
en: "Preact
|
|
335
|
+
en: "Preact logo",
|
|
327
336
|
fr: "Logo Preact",
|
|
328
337
|
es: "Logo Preact",
|
|
329
338
|
}),
|
|
@@ -334,21 +343,18 @@ const appContent = {
|
|
|
334
343
|
en: "count is ",
|
|
335
344
|
fr: "le compte est ",
|
|
336
345
|
es: "el recuento es ",
|
|
337
|
-
de: "Zähler ist ",
|
|
338
346
|
}),
|
|
339
347
|
|
|
340
348
|
edit: t({
|
|
341
349
|
en: "Edit src/app.tsx and save to test HMR",
|
|
342
350
|
fr: "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
343
351
|
es: "Edita src/app.tsx y guarda para probar HMR",
|
|
344
|
-
de: "Bearbeiten Sie src/app.tsx und speichern Sie, um HMR zu testen",
|
|
345
352
|
}),
|
|
346
353
|
|
|
347
354
|
readTheDocs: t({
|
|
348
355
|
en: "Click on the Vite and Preact logos to learn more",
|
|
349
356
|
fr: "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
350
|
-
es: "Haga clic en los logotipos de Vite
|
|
351
|
-
de: "Klicken Sie auf die Vite- und Preact-Logos, um mehr zu erfahren",
|
|
357
|
+
es: "Haga clic en los logotipos de Vite et Preact pour en savoir plus",
|
|
352
358
|
}),
|
|
353
359
|
},
|
|
354
360
|
};
|
|
@@ -366,8 +372,7 @@ module.exports = appContent;
|
|
|
366
372
|
"translation": {
|
|
367
373
|
"en": "Vite logo",
|
|
368
374
|
"fr": "Logo Vite",
|
|
369
|
-
"es": "Logo Vite"
|
|
370
|
-
"de": "Vite-Logo"
|
|
375
|
+
"es": "Logo Vite"
|
|
371
376
|
}
|
|
372
377
|
},
|
|
373
378
|
"preactLogo": {
|
|
@@ -375,8 +380,7 @@ module.exports = appContent;
|
|
|
375
380
|
"translation": {
|
|
376
381
|
"en": "Preact logo",
|
|
377
382
|
"fr": "Logo Preact",
|
|
378
|
-
"es": "Logo Preact"
|
|
379
|
-
"de": "Preact-Logo"
|
|
383
|
+
"es": "Logo Preact"
|
|
380
384
|
}
|
|
381
385
|
},
|
|
382
386
|
"title": {
|
|
@@ -384,8 +388,7 @@ module.exports = appContent;
|
|
|
384
388
|
"translation": {
|
|
385
389
|
"en": "Vite + Preact",
|
|
386
390
|
"fr": "Vite + Preact",
|
|
387
|
-
"es": "Vite + Preact"
|
|
388
|
-
"de": "Vite + Preact"
|
|
391
|
+
"es": "Vite + Preact"
|
|
389
392
|
}
|
|
390
393
|
},
|
|
391
394
|
"count": {
|
|
@@ -393,8 +396,7 @@ module.exports = appContent;
|
|
|
393
396
|
"translation": {
|
|
394
397
|
"en": "count is ",
|
|
395
398
|
"fr": "le compte est ",
|
|
396
|
-
"es": "el recuento es "
|
|
397
|
-
"de": "Zähler ist "
|
|
399
|
+
"es": "el recuento es "
|
|
398
400
|
}
|
|
399
401
|
},
|
|
400
402
|
"edit": {
|
|
@@ -402,8 +404,7 @@ module.exports = appContent;
|
|
|
402
404
|
"translation": {
|
|
403
405
|
"en": "Edit src/app.tsx and save to test HMR",
|
|
404
406
|
"fr": "Éditez src/app.tsx et enregistrez pour tester HMR",
|
|
405
|
-
"es": "Edita src/app.tsx y guarda para probar HMR"
|
|
406
|
-
"de": "Bearbeiten Sie src/app.tsx und speichern Sie, um HMR zu testen"
|
|
407
|
+
"es": "Edita src/app.tsx y guarda para probar HMR"
|
|
407
408
|
}
|
|
408
409
|
},
|
|
409
410
|
"readTheDocs": {
|
|
@@ -411,8 +412,7 @@ module.exports = appContent;
|
|
|
411
412
|
"translation": {
|
|
412
413
|
"en": "Click on the Vite and Preact logos to learn more",
|
|
413
414
|
"fr": "Cliquez sur les logos Vite et Preact pour en savoir plus",
|
|
414
|
-
"es": "Haga clic en los logotipos de Vite y Preact para obtener más información"
|
|
415
|
-
"de": "Klicken Sie auf die Vite- und Preact-Logos, um mehr zu erfahren"
|
|
415
|
+
"es": "Haga clic en los logotipos de Vite y Preact para obtener más información"
|
|
416
416
|
}
|
|
417
417
|
}
|
|
418
418
|
}
|
|
@@ -463,6 +463,12 @@ const AppContent: FunctionalComponent = () => {
|
|
|
463
463
|
</button>
|
|
464
464
|
<p>{content.edit}</p>
|
|
465
465
|
</div>
|
|
466
|
+
{/* Markdown-Inhalt */}
|
|
467
|
+
<div>{content.myMarkdownContent}</div>
|
|
468
|
+
|
|
469
|
+
{/* HTML-Inhalt */}
|
|
470
|
+
<div>{content.myHtmlContent}</div>
|
|
471
|
+
|
|
466
472
|
<p class="read-the-docs">{content.readTheDocs}</p>
|
|
467
473
|
</>
|
|
468
474
|
);
|
|
@@ -650,142 +656,15 @@ Beispiel:
|
|
|
650
656
|
- https://example.com/fr/about
|
|
651
657
|
```
|
|
652
658
|
|
|
653
|
-
> Standardmäßig sind die Routen für die Standardsprache nicht mit einem Präfix versehen. Wenn Sie die Standardsprache mit einem Präfix versehen möchten, können Sie
|
|
654
|
-
|
|
655
|
-
Um lokalisierte Routen in Ihre Anwendung hinzuzufügen, können Sie eine `LocaleRouter`-Komponente erstellen, die die Routen Ihrer Anwendung umschließt und die sprachabhängige Navigation verwaltet. Hier ist ein Beispiel unter Verwendung von [preact-iso](https://github.com/preactjs/preact-iso):
|
|
656
|
-
|
|
657
|
-
Zuerst installieren Sie `preact-iso`:
|
|
658
|
-
|
|
659
|
-
```bash packageManager="npm"
|
|
660
|
-
npm install preact-iso
|
|
661
|
-
npx intlayer init
|
|
662
|
-
```
|
|
663
|
-
|
|
664
|
-
```bash packageManager="pnpm"
|
|
665
|
-
pnpm add preact-iso
|
|
666
|
-
pnpm intlayer init
|
|
667
|
-
```
|
|
659
|
+
> Standardmäßig sind die Routen für die Standardsprache nicht mit einem Präfix versehen. Wenn Sie die Standardsprache mit einem Präfix versehen möchten, können Sie die Option `routing.mode` in Ihrer Konfiguration auf `"prefix-all"` setzen. Weitere Informationen finden Sie in der [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
|
|
668
660
|
|
|
669
|
-
|
|
670
|
-
yarn add preact-iso
|
|
671
|
-
```
|
|
661
|
+
Um lokalisierte Routen zu Ihrer Anwendung hinzuzufügen, können Sie eine `LocaleRouter`-Komponente erstellen, die die Routen Ihrer Anwendung umschließt und das sprachbasierte Routing verwaltet. Hier ist ein Beispiel unter Verwendung von [preact-iso](https://github.com/preactjs/preact-iso):
|
|
672
662
|
|
|
673
663
|
```tsx fileName="src/components/LocaleRouter.tsx" codeFormat="typescript"
|
|
674
|
-
import {
|
|
675
|
-
import { ComponentChildren, FunctionalComponent } from "preact";
|
|
664
|
+
import { localeMap } from "intlayer";
|
|
676
665
|
import { IntlayerProvider } from "preact-intlayer";
|
|
677
|
-
import { LocationProvider,
|
|
678
|
-
import {
|
|
679
|
-
|
|
680
|
-
const { internationalization, middleware } = configuration;
|
|
681
|
-
const { locales, defaultLocale } = internationalization;
|
|
682
|
-
|
|
683
|
-
const Navigate: FunctionalComponent<{ to: string; replace?: boolean }> = ({
|
|
684
|
-
to,
|
|
685
|
-
replace,
|
|
686
|
-
}) => {
|
|
687
|
-
const { route } = useLocation();
|
|
688
|
-
useEffect(() => {
|
|
689
|
-
route(to, replace);
|
|
690
|
-
}, [to, replace, route]);
|
|
691
|
-
return null;
|
|
692
|
-
};
|
|
693
|
-
|
|
694
|
-
/**
|
|
695
|
-
/**
|
|
696
|
-
* Eine Komponente, die die Lokalisierung verwaltet und die Kinder mit dem entsprechenden Locale-Kontext umschließt.
|
|
697
|
-
* Sie verwaltet die auf der URL basierende Lokalerkennung und -validierung.
|
|
698
|
-
*/
|
|
699
|
-
const AppLocalized: FunctionalComponent<{
|
|
700
|
-
children: ComponentChildren;
|
|
701
|
-
locale?: Locales;
|
|
702
|
-
}> = ({ children, locale }) => {
|
|
703
|
-
const { path: pathname, url } = useLocation();
|
|
704
|
-
|
|
705
|
-
if (!url) {
|
|
706
|
-
return null;
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
const search = url.substring(pathname.length);
|
|
710
|
-
|
|
711
|
-
// Bestimmt das aktuelle Locale, standardmäßig wird das Standard-Locale verwendet, wenn keines angegeben ist
|
|
712
|
-
const currentLocale = locale ?? defaultLocale;
|
|
713
|
-
|
|
714
|
-
// Entfernt das Locale-Präfix aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
715
|
-
const pathWithoutLocale = getPathWithoutLocale(
|
|
716
|
-
pathname // Aktueller URL-Pfad
|
|
717
|
-
);
|
|
718
|
-
|
|
719
|
-
/**
|
|
720
|
-
* Wenn middleware.prefixDefault wahr ist, sollte die Standardsprache immer vorangestellt werden.
|
|
721
|
-
*/
|
|
722
|
-
if (middleware.prefixDefault) {
|
|
723
|
-
// Überprüfe die Sprache
|
|
724
|
-
if (!locale || !locales.includes(locale)) {
|
|
725
|
-
// Weiterleitung zur Standardsprache mit dem aktualisierten Pfad
|
|
726
|
-
return (
|
|
727
|
-
<Navigate
|
|
728
|
-
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
729
|
-
replace // Ersetzt den aktuellen Eintrag im Verlauf durch den neuen
|
|
730
|
-
/>
|
|
731
|
-
);
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
// Umschließe die Kinder mit dem IntlayerProvider und setze die aktuelle Sprache
|
|
735
|
-
return (
|
|
736
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
737
|
-
);
|
|
738
|
-
} else {
|
|
739
|
-
/**
|
|
740
|
-
* Wenn middleware.prefixDefault falsch ist, wird die Standardsprache nicht vorangestellt.
|
|
741
|
-
* Stellen Sie sicher, dass die aktuelle Locale gültig ist und nicht die Standard-Locale.
|
|
742
|
-
*/
|
|
743
|
-
if (
|
|
744
|
-
currentLocale.toString() !== defaultLocale.toString() &&
|
|
745
|
-
!locales
|
|
746
|
-
.filter(
|
|
747
|
-
(loc) => loc.toString() !== defaultLocale.toString() // Standard-Locale ausschließen
|
|
748
|
-
)
|
|
749
|
-
.includes(currentLocale) // Prüfen, ob die aktuelle Locale in der Liste der gültigen Locales ist
|
|
750
|
-
) {
|
|
751
|
-
// Weiterleitung zum Pfad ohne Locale-Präfix
|
|
752
|
-
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
753
|
-
}
|
|
754
|
-
|
|
755
|
-
// Kinder mit dem IntlayerProvider umschließen und die aktuelle Locale setzen
|
|
756
|
-
return (
|
|
757
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
758
|
-
);
|
|
759
|
-
}
|
|
760
|
-
};
|
|
761
|
-
|
|
762
|
-
const RouterContent: FunctionalComponent<{
|
|
763
|
-
children: ComponentChildren;
|
|
764
|
-
}> = ({ children }) => {
|
|
765
|
-
const { path } = useLocation();
|
|
766
|
-
|
|
767
|
-
if (!path) {
|
|
768
|
-
return null;
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
const pathLocale = path.split("/")[1] as Locales;
|
|
772
|
-
|
|
773
|
-
const isLocaleRoute = locales
|
|
774
|
-
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
775
|
-
.some((locale) => locale.toString() === pathLocale);
|
|
776
|
-
|
|
777
|
-
if (isLocaleRoute) {
|
|
778
|
-
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
779
|
-
}
|
|
780
|
-
|
|
781
|
-
return (
|
|
782
|
-
<AppLocalized
|
|
783
|
-
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
784
|
-
>
|
|
785
|
-
{children}
|
|
786
|
-
</AppLocalized>
|
|
787
|
-
);
|
|
788
|
-
};
|
|
666
|
+
import { LocationProvider, Router, Route } from "preact-iso";
|
|
667
|
+
import type { ComponentChildren, FunctionalComponent } from "preact";
|
|
789
668
|
|
|
790
669
|
/**
|
|
791
670
|
* Eine Router-Komponente, die lokalisierungsspezifische Routen einrichtet.
|
|
@@ -795,120 +674,27 @@ export const LocaleRouter: FunctionalComponent<{
|
|
|
795
674
|
children: ComponentChildren;
|
|
796
675
|
}> = ({ children }) => (
|
|
797
676
|
<LocationProvider>
|
|
798
|
-
<
|
|
677
|
+
<Router>
|
|
678
|
+
{localeMap(({ locale, urlPrefix }) => ({ locale, urlPrefix }))
|
|
679
|
+
.sort((a, b) => b.urlPrefix.length - a.urlPrefix.length)
|
|
680
|
+
.map(({ locale, urlPrefix }) => (
|
|
681
|
+
<Route
|
|
682
|
+
key={locale}
|
|
683
|
+
path={`${urlPrefix}/:rest*`}
|
|
684
|
+
component={() => (
|
|
685
|
+
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
686
|
+
)}
|
|
687
|
+
/>
|
|
688
|
+
))}
|
|
689
|
+
</Router>
|
|
799
690
|
</LocationProvider>
|
|
800
691
|
);
|
|
801
692
|
```
|
|
802
693
|
|
|
803
694
|
```jsx fileName="src/components/LocaleRouter.jsx" codeFormat="esm"
|
|
804
|
-
|
|
805
|
-
import { configuration, getPathWithoutLocale } from "intlayer";
|
|
695
|
+
import { localeMap } from "intlayer";
|
|
806
696
|
import { IntlayerProvider } from "preact-intlayer";
|
|
807
|
-
import { LocationProvider,
|
|
808
|
-
import { useEffect } from "preact/hooks";
|
|
809
|
-
import { h } from "preact"; // Erforderlich für JSX
|
|
810
|
-
|
|
811
|
-
// Destrukturierung der Konfiguration von Intlayer
|
|
812
|
-
const { internationalization, middleware } = configuration;
|
|
813
|
-
const { locales, defaultLocale } = internationalization;
|
|
814
|
-
|
|
815
|
-
const Navigate = ({ to, replace }) => {
|
|
816
|
-
const { route } = useLocation();
|
|
817
|
-
useEffect(() => {
|
|
818
|
-
route(to, replace);
|
|
819
|
-
}, [to, replace, route]);
|
|
820
|
-
return null;
|
|
821
|
-
};
|
|
822
|
-
|
|
823
|
-
/**
|
|
824
|
-
* Eine Komponente, die die Lokalisierung verwaltet und die Kinder mit dem entsprechenden Sprachkontext umschließt.
|
|
825
|
-
* Sie verwaltet die sprachbasierte Erkennung und Validierung der URL.
|
|
826
|
-
*/
|
|
827
|
-
const AppLocalized = ({ children, locale }) => {
|
|
828
|
-
const { path: pathname, url } = useLocation();
|
|
829
|
-
|
|
830
|
-
if (!url) {
|
|
831
|
-
return null;
|
|
832
|
-
}
|
|
833
|
-
|
|
834
|
-
const search = url.substring(pathname.length);
|
|
835
|
-
|
|
836
|
-
// Bestimmt die aktuelle Sprache, standardmäßig wird die Standardsprache verwendet, falls keine angegeben ist
|
|
837
|
-
const currentLocale = locale ?? defaultLocale;
|
|
838
|
-
|
|
839
|
-
// Entfernt das Sprachpräfix aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
840
|
-
const pathWithoutLocale = getPathWithoutLocale(
|
|
841
|
-
pathname // Aktueller URL-Pfad
|
|
842
|
-
);
|
|
843
|
-
|
|
844
|
-
/**
|
|
845
|
-
* Wenn middleware.prefixDefault true ist, sollte die Standardsprache immer als Präfix verwendet werden.
|
|
846
|
-
*/
|
|
847
|
-
if (middleware.prefixDefault) {
|
|
848
|
-
// Überprüfen der Locale
|
|
849
|
-
if (!locale || !locales.includes(locale)) {
|
|
850
|
-
// Weiterleitung zur Standard-Locale mit dem aktualisierten Pfad
|
|
851
|
-
return (
|
|
852
|
-
<Navigate
|
|
853
|
-
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
854
|
-
replace // Ersetzt den aktuellen Eintrag im Verlauf durch den neuen
|
|
855
|
-
/>
|
|
856
|
-
);
|
|
857
|
-
}
|
|
858
|
-
|
|
859
|
-
// Umschließen der Kinder mit dem IntlayerProvider und Setzen der aktuellen Locale
|
|
860
|
-
return (
|
|
861
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
862
|
-
);
|
|
863
|
-
} else {
|
|
864
|
-
/**
|
|
865
|
-
* Wenn middleware.prefixDefault false ist, wird die Standard-Locale nicht vorangestellt.
|
|
866
|
-
* Sicherstellen, dass die aktuelle Locale gültig ist und nicht die Standard-Locale ist.
|
|
867
|
-
*/
|
|
868
|
-
if (
|
|
869
|
-
currentLocale.toString() !== defaultLocale.toString() &&
|
|
870
|
-
!locales
|
|
871
|
-
.filter(
|
|
872
|
-
(loc) => loc.toString() !== defaultLocale.toString() // Schließe die Standardsprache aus
|
|
873
|
-
)
|
|
874
|
-
.includes(currentLocale) // Prüfe, ob die aktuelle Sprache in der Liste der gültigen Sprachen enthalten ist
|
|
875
|
-
) {
|
|
876
|
-
// Weiterleitung zum Pfad ohne Sprachpräfix
|
|
877
|
-
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
878
|
-
}
|
|
879
|
-
|
|
880
|
-
// Umschließe die Kinder mit dem IntlayerProvider und setze die aktuelle Sprache
|
|
881
|
-
return (
|
|
882
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
883
|
-
);
|
|
884
|
-
}
|
|
885
|
-
};
|
|
886
|
-
|
|
887
|
-
const RouterContent = ({ children }) => {
|
|
888
|
-
const { path } = useLocation();
|
|
889
|
-
|
|
890
|
-
if (!path) {
|
|
891
|
-
return null;
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
const pathLocale = path.split("/")[1];
|
|
895
|
-
|
|
896
|
-
const isLocaleRoute = locales
|
|
897
|
-
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
898
|
-
.some((locale) => locale.toString() === pathLocale);
|
|
899
|
-
|
|
900
|
-
if (isLocaleRoute) {
|
|
901
|
-
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
return (
|
|
905
|
-
<AppLocalized
|
|
906
|
-
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
907
|
-
>
|
|
908
|
-
{children}
|
|
909
|
-
</AppLocalized>
|
|
910
|
-
);
|
|
911
|
-
};
|
|
697
|
+
import { LocationProvider, Router, Route } from "preact-iso";
|
|
912
698
|
|
|
913
699
|
/**
|
|
914
700
|
* Eine Router-Komponente, die lokalisierungsspezifische Routen einrichtet.
|
|
@@ -916,130 +702,50 @@ const RouterContent = ({ children }) => {
|
|
|
916
702
|
*/
|
|
917
703
|
export const LocaleRouter = ({ children }) => (
|
|
918
704
|
<LocationProvider>
|
|
919
|
-
<
|
|
705
|
+
<Router>
|
|
706
|
+
{localeMap(({ locale, urlPrefix }) => ({ locale, urlPrefix }))
|
|
707
|
+
.sort((a, b) => b.urlPrefix.length - a.urlPrefix.length)
|
|
708
|
+
.map(({ locale, urlPrefix }) => (
|
|
709
|
+
<Route
|
|
710
|
+
key={locale}
|
|
711
|
+
path={`${urlPrefix}/:rest*`}
|
|
712
|
+
component={() => (
|
|
713
|
+
<IntlayerProvider locale={locale}>{children}</IntlayerProvider>
|
|
714
|
+
)}
|
|
715
|
+
/>
|
|
716
|
+
))}
|
|
717
|
+
</Router>
|
|
920
718
|
</LocationProvider>
|
|
921
719
|
);
|
|
922
720
|
```
|
|
923
721
|
|
|
924
722
|
```jsx fileName="src/components/LocaleRouter.cjsx" codeFormat="commonjs"
|
|
925
|
-
|
|
926
|
-
const { configuration, getPathWithoutLocale } = require("intlayer");
|
|
723
|
+
const { localeMap } = require("intlayer");
|
|
927
724
|
const { IntlayerProvider } = require("preact-intlayer");
|
|
928
|
-
const { LocationProvider,
|
|
929
|
-
const { useEffect } = require("preact/hooks");
|
|
930
|
-
const { h } = require("preact"); // Erforderlich für JSX
|
|
931
|
-
|
|
932
|
-
// Destrukturierung der Konfiguration von Intlayer
|
|
933
|
-
const { internationalization, middleware } = configuration;
|
|
934
|
-
const { locales, defaultLocale } = internationalization;
|
|
935
|
-
|
|
936
|
-
const Navigate = ({ to, replace }) => {
|
|
937
|
-
const { route } = useLocation();
|
|
938
|
-
useEffect(() => {
|
|
939
|
-
route(to, replace);
|
|
940
|
-
}, [to, replace, route]);
|
|
941
|
-
return null;
|
|
942
|
-
};
|
|
943
|
-
|
|
944
|
-
/**
|
|
945
|
-
* Eine Komponente, die die Lokalisierung verwaltet und Kinder mit dem entsprechenden Locale-Kontext umschließt.
|
|
946
|
-
* Sie verwaltet die URL-basierte Lokalerkennung und -validierung.
|
|
947
|
-
*/
|
|
948
|
-
const AppLocalized = ({ children, locale }) => {
|
|
949
|
-
const { path: pathname, url } = useLocation();
|
|
950
|
-
|
|
951
|
-
if (!url) {
|
|
952
|
-
return null;
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
const search = url.substring(pathname.length);
|
|
956
|
-
|
|
957
|
-
// Bestimmen der aktuellen Sprache, Standardwert verwenden, falls nicht angegeben
|
|
958
|
-
const currentLocale = locale ?? defaultLocale;
|
|
959
|
-
|
|
960
|
-
// Entfernen des Sprachpräfixes aus dem Pfad, um einen Basis-Pfad zu erstellen
|
|
961
|
-
const pathWithoutLocale = getPathWithoutLocale(
|
|
962
|
-
pathname // Aktueller URL-Pfad
|
|
963
|
-
);
|
|
964
|
-
|
|
965
|
-
/**
|
|
966
|
-
* Wenn middleware.prefixDefault true ist, sollte die Standardsprache immer als Präfix verwendet werden.
|
|
967
|
-
*/
|
|
968
|
-
if (middleware.prefixDefault) {
|
|
969
|
-
// Validierung der Sprache
|
|
970
|
-
if (!locale || !locales.includes(locale)) {
|
|
971
|
-
// Weiterleitung zur Standardsprache mit aktualisiertem Pfad
|
|
972
|
-
return (
|
|
973
|
-
<Navigate
|
|
974
|
-
to={`/${defaultLocale}/${pathWithoutLocale}${search}`}
|
|
975
|
-
replace // Ersetzt den aktuellen Eintrag im Verlauf durch den neuen
|
|
976
|
-
/>
|
|
977
|
-
);
|
|
978
|
-
}
|
|
979
|
-
|
|
980
|
-
// Umschließt die Kinder mit dem IntlayerProvider und setzt die aktuelle Locale
|
|
981
|
-
return (
|
|
982
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
983
|
-
);
|
|
984
|
-
} else {
|
|
985
|
-
/**
|
|
986
|
-
* Wenn middleware.prefixDefault false ist, wird die Standard-Locale nicht vorangestellt.
|
|
987
|
-
* Stelle sicher, dass die aktuelle Locale gültig ist und nicht die Standard-Locale.
|
|
988
|
-
*/
|
|
989
|
-
if (
|
|
990
|
-
currentLocale.toString() !== defaultLocale.toString() &&
|
|
991
|
-
!locales
|
|
992
|
-
.filter(
|
|
993
|
-
(loc) => loc.toString() !== defaultLocale.toString() // Schließt die Standard-Locale aus
|
|
994
|
-
)
|
|
995
|
-
.includes(currentLocale) // Überprüfen, ob die aktuelle Locale in der Liste der gültigen Locales enthalten ist
|
|
996
|
-
) {
|
|
997
|
-
// Weiterleitung zum Pfad ohne Locale-Präfix
|
|
998
|
-
return <Navigate to={`${pathWithoutLocale}${search}`} replace />;
|
|
999
|
-
}
|
|
1000
|
-
|
|
1001
|
-
// Kinder mit dem IntlayerProvider umschließen und die aktuelle Locale setzen
|
|
1002
|
-
return (
|
|
1003
|
-
<IntlayerProvider locale={currentLocale}>{children}</IntlayerProvider>
|
|
1004
|
-
);
|
|
1005
|
-
}
|
|
1006
|
-
};
|
|
1007
|
-
|
|
1008
|
-
const RouterContent = ({ children }) => {
|
|
1009
|
-
const { path } = useLocation();
|
|
1010
|
-
|
|
1011
|
-
if (!path) {
|
|
1012
|
-
return null;
|
|
1013
|
-
}
|
|
1014
|
-
|
|
1015
|
-
const pathLocale = path.split("/")[1];
|
|
1016
|
-
|
|
1017
|
-
const isLocaleRoute = locales
|
|
1018
|
-
.filter((locale) => middleware.prefixDefault || locale !== defaultLocale)
|
|
1019
|
-
.some((locale) => locale.toString() === pathLocale);
|
|
1020
|
-
|
|
1021
|
-
if (isLocaleRoute) {
|
|
1022
|
-
return <AppLocalized locale={pathLocale}>{children}</AppLocalized>;
|
|
1023
|
-
}
|
|
1024
|
-
|
|
1025
|
-
return (
|
|
1026
|
-
<AppLocalized
|
|
1027
|
-
locale={!middleware.prefixDefault ? defaultLocale : undefined}
|
|
1028
|
-
>
|
|
1029
|
-
{children}
|
|
1030
|
-
</AppLocalized>
|
|
1031
|
-
);
|
|
1032
|
-
};
|
|
725
|
+
const { LocationProvider, Router, Route } = require("preact-iso");
|
|
1033
726
|
|
|
1034
727
|
/**
|
|
1035
728
|
* Eine Router-Komponente, die lokalisierungsspezifische Routen einrichtet.
|
|
1036
729
|
* Sie verwendet preact-iso, um die Navigation zu verwalten und lokalisierte Komponenten zu rendern.
|
|
1037
730
|
*/
|
|
1038
|
-
const LocaleRouter = ({ children }) =>
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
731
|
+
const LocaleRouter = ({ children }) =>
|
|
732
|
+
h(
|
|
733
|
+
LocationProvider,
|
|
734
|
+
{},
|
|
735
|
+
h(
|
|
736
|
+
Router,
|
|
737
|
+
{},
|
|
738
|
+
localeMap(({ locale, urlPrefix }) => ({ locale, urlPrefix }))
|
|
739
|
+
.sort((a, b) => b.urlPrefix.length - a.urlPrefix.length)
|
|
740
|
+
.map(({ locale, urlPrefix }) =>
|
|
741
|
+
h(Route, {
|
|
742
|
+
key: locale,
|
|
743
|
+
path: `${urlPrefix}/:rest*`,
|
|
744
|
+
component: () => h(IntlayerProvider, { locale }, children),
|
|
745
|
+
})
|
|
746
|
+
)
|
|
747
|
+
)
|
|
748
|
+
);
|
|
1043
749
|
|
|
1044
750
|
module.exports = { LocaleRouter };
|
|
1045
751
|
```
|
|
@@ -1049,8 +755,8 @@ Dann können Sie die `LocaleRouter`-Komponente in Ihrer Anwendung verwenden:
|
|
|
1049
755
|
```tsx fileName="src/app.tsx" codeFormat="typescript"
|
|
1050
756
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
1051
757
|
import type { FunctionalComponent } from "preact";
|
|
1052
|
-
|
|
1053
|
-
// ... Ihre AppContent-Komponente
|
|
758
|
+
|
|
759
|
+
// ... Ihre AppContent-Komponente
|
|
1054
760
|
|
|
1055
761
|
const App: FunctionalComponent = () => (
|
|
1056
762
|
<LocaleRouter>
|
|
@@ -1063,7 +769,8 @@ export default App;
|
|
|
1063
769
|
|
|
1064
770
|
```jsx fileName="src/app.jsx" codeFormat="esm"
|
|
1065
771
|
import { LocaleRouter } from "./components/LocaleRouter";
|
|
1066
|
-
|
|
772
|
+
|
|
773
|
+
// ... Ihre AppContent-Komponente
|
|
1067
774
|
|
|
1068
775
|
const App = () => (
|
|
1069
776
|
<LocaleRouter>
|
|
@@ -1076,7 +783,8 @@ export default App;
|
|
|
1076
783
|
|
|
1077
784
|
```jsx fileName="src/app.cjsx" codeFormat="commonjs"
|
|
1078
785
|
const { LocaleRouter } = require("./components/LocaleRouter");
|
|
1079
|
-
|
|
786
|
+
|
|
787
|
+
// ... Ihre AppContent-Komponente
|
|
1080
788
|
|
|
1081
789
|
const App = () => (
|
|
1082
790
|
<LocaleRouter>
|
|
@@ -1087,47 +795,12 @@ const App = () => (
|
|
|
1087
795
|
module.exports = App;
|
|
1088
796
|
```
|
|
1089
797
|
|
|
1090
|
-
Parallel dazu können Sie auch das `intlayerProxy` verwenden, um serverseitiges Routing zu Ihrer Anwendung hinzuzufügen. Dieses Plugin erkennt automatisch die aktuelle Locale basierend auf der URL und setzt das entsprechende Locale-Cookie. Wenn keine Locale angegeben ist, bestimmt das Plugin die am besten geeignete Locale basierend auf den Spracheinstellungen des Browsers des Benutzers. Wenn keine Locale erkannt wird, erfolgt eine Weiterleitung zur Standard-Locale.
|
|
1091
|
-
|
|
1092
|
-
```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
|
|
1093
|
-
import { defineConfig } from "vite";
|
|
1094
|
-
import preact from "@preact/preset-vite";
|
|
1095
|
-
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
1096
|
-
|
|
1097
|
-
// https://vitejs.dev/config/
|
|
1098
|
-
export default defineConfig({
|
|
1099
|
-
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1100
|
-
});
|
|
1101
|
-
```
|
|
1102
|
-
|
|
1103
|
-
```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
|
|
1104
|
-
import { defineConfig } from "vite";
|
|
1105
|
-
import preact from "@preact/preset-vite";
|
|
1106
|
-
import { intlayer, intlayerProxy } from "vite-intlayer";
|
|
1107
|
-
|
|
1108
|
-
// https://vitejs.dev/config/
|
|
1109
|
-
export default defineConfig({
|
|
1110
|
-
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1111
|
-
});
|
|
1112
|
-
```
|
|
1113
|
-
|
|
1114
|
-
```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
|
|
1115
|
-
const { defineConfig } = require("vite");
|
|
1116
|
-
const preact = require("@preact/preset-vite");
|
|
1117
|
-
const { intlayer, intlayerProxy } = require("vite-intlayer");
|
|
1118
|
-
|
|
1119
|
-
// https://vitejs.dev/config/
|
|
1120
|
-
module.exports = defineConfig({
|
|
1121
|
-
plugins: [preact(), intlayer(), intlayerProxy()],
|
|
1122
|
-
});
|
|
1123
|
-
```
|
|
1124
|
-
|
|
1125
798
|
### (Optional) Schritt 8: Ändern der URL, wenn sich die Sprache ändert
|
|
1126
799
|
|
|
1127
|
-
Um die URL zu ändern, wenn sich die Sprache ändert, können Sie die `onLocaleChange`-Eigenschaft verwenden, die vom `useLocale`-Hook bereitgestellt wird. Parallel dazu können Sie `
|
|
800
|
+
Um die URL zu ändern, wenn sich die Sprache ändert, können Sie die `onLocaleChange`-Eigenschaft verwenden, die vom `useLocale`-Hook bereitgestellt wird. Parallel dazu können Sie die `route`-Methode von `useLocation` von `preact-iso` verwenden, um den URL-Pfad zu aktualisieren.
|
|
1128
801
|
|
|
1129
802
|
```tsx fileName="src/components/LocaleSwitcher.tsx" codeFormat="typescript"
|
|
1130
|
-
import { useLocation
|
|
803
|
+
import { useLocation } from "preact-iso";
|
|
1131
804
|
import {
|
|
1132
805
|
Locales,
|
|
1133
806
|
getHTMLTextDir,
|
|
@@ -1138,13 +811,12 @@ import { useLocale } from "preact-intlayer";
|
|
|
1138
811
|
import type { FunctionalComponent } from "preact";
|
|
1139
812
|
|
|
1140
813
|
const LocaleSwitcher: FunctionalComponent = () => {
|
|
1141
|
-
const
|
|
814
|
+
const { url, route } = useLocation();
|
|
1142
815
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1143
816
|
onLocaleChange: (newLocale) => {
|
|
1144
|
-
const currentFullPath = location.url; // preact-iso liefert die vollständige URL
|
|
1145
817
|
// Erstellen Sie die URL mit der aktualisierten Locale
|
|
1146
818
|
// Beispiel: /es/about?foo=bar
|
|
1147
|
-
const pathWithLocale = getLocalizedUrl(
|
|
819
|
+
const pathWithLocale = getLocalizedUrl(url, newLocale);
|
|
1148
820
|
|
|
1149
821
|
// Aktualisieren Sie den URL-Pfad
|
|
1150
822
|
route(pathWithLocale, true); // true für Ersetzen
|
|
@@ -1157,7 +829,7 @@ const LocaleSwitcher: FunctionalComponent = () => {
|
|
|
1157
829
|
<div id="localePopover" popover="auto">
|
|
1158
830
|
{availableLocales.map((localeItem) => (
|
|
1159
831
|
<a
|
|
1160
|
-
href={getLocalizedUrl(
|
|
832
|
+
href={getLocalizedUrl(url, localeItem)}
|
|
1161
833
|
hreflang={localeItem}
|
|
1162
834
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1163
835
|
onClick={(e) => {
|
|
@@ -1168,15 +840,15 @@ const LocaleSwitcher: FunctionalComponent = () => {
|
|
|
1168
840
|
key={localeItem}
|
|
1169
841
|
>
|
|
1170
842
|
<span>
|
|
1171
|
-
{/*
|
|
843
|
+
{/* Locale - z.B. FR */}
|
|
1172
844
|
{localeItem}
|
|
1173
845
|
</span>
|
|
1174
846
|
<span>
|
|
1175
|
-
{/* Sprache in ihrem eigenen
|
|
847
|
+
{/* Sprache in ihrem eigenen Locale - z.B. Français */}
|
|
1176
848
|
{getLocaleName(localeItem, localeItem)}
|
|
1177
849
|
</span>
|
|
1178
850
|
<span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
|
|
1179
|
-
{/* Sprache im aktuellen
|
|
851
|
+
{/* Sprache im aktuellen Locale - z.B. Francés, wenn das aktuelle Locale auf Locales.SPANISH gesetzt ist */}
|
|
1180
852
|
{getLocaleName(localeItem, locale)}
|
|
1181
853
|
</span>
|
|
1182
854
|
<span dir="ltr" lang={Locales.ENGLISH}>
|
|
@@ -1194,7 +866,7 @@ export default LocaleSwitcher;
|
|
|
1194
866
|
```
|
|
1195
867
|
|
|
1196
868
|
```jsx fileName="src/components/LocaleSwitcher.jsx" codeFormat="esm"
|
|
1197
|
-
import { useLocation
|
|
869
|
+
import { useLocation } from "preact-iso";
|
|
1198
870
|
import {
|
|
1199
871
|
Locales,
|
|
1200
872
|
getHTMLTextDir,
|
|
@@ -1202,14 +874,12 @@ import {
|
|
|
1202
874
|
getLocalizedUrl,
|
|
1203
875
|
} from "intlayer";
|
|
1204
876
|
import { useLocale } from "preact-intlayer";
|
|
1205
|
-
import { h } from "preact"; // Für JSX
|
|
1206
877
|
|
|
1207
878
|
const LocaleSwitcher = () => {
|
|
1208
|
-
const
|
|
879
|
+
const { url, route } = useLocation();
|
|
1209
880
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1210
881
|
onLocaleChange: (newLocale) => {
|
|
1211
|
-
const
|
|
1212
|
-
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
882
|
+
const pathWithLocale = getLocalizedUrl(url, newLocale);
|
|
1213
883
|
route(pathWithLocale, true);
|
|
1214
884
|
},
|
|
1215
885
|
});
|
|
@@ -1220,7 +890,7 @@ const LocaleSwitcher = () => {
|
|
|
1220
890
|
<div id="localePopover" popover="auto">
|
|
1221
891
|
{availableLocales.map((localeItem) => (
|
|
1222
892
|
<a
|
|
1223
|
-
href={getLocalizedUrl(
|
|
893
|
+
href={getLocalizedUrl(url, localeItem)}
|
|
1224
894
|
hreflang={localeItem}
|
|
1225
895
|
aria-current={locale === localeItem ? "page" : undefined}
|
|
1226
896
|
onClick={(e) => {
|
|
@@ -1248,7 +918,7 @@ export default LocaleSwitcher;
|
|
|
1248
918
|
```
|
|
1249
919
|
|
|
1250
920
|
```jsx fileName="src/components/LocaleSwitcher.cjsx" codeFormat="commonjs"
|
|
1251
|
-
const { useLocation
|
|
921
|
+
const { useLocation } = require("preact-iso");
|
|
1252
922
|
const {
|
|
1253
923
|
Locales,
|
|
1254
924
|
getHTMLTextDir,
|
|
@@ -1256,45 +926,51 @@ const {
|
|
|
1256
926
|
getLocalizedUrl,
|
|
1257
927
|
} = require("intlayer");
|
|
1258
928
|
const { useLocale } = require("preact-intlayer");
|
|
1259
|
-
const { h } = require("preact"); // Für JSX
|
|
1260
929
|
|
|
1261
930
|
const LocaleSwitcher = () => {
|
|
1262
|
-
const
|
|
931
|
+
const { url, route } = useLocation();
|
|
1263
932
|
const { locale, availableLocales, setLocale } = useLocale({
|
|
1264
933
|
onLocaleChange: (newLocale) => {
|
|
1265
|
-
const
|
|
1266
|
-
const pathWithLocale = getLocalizedUrl(currentFullPath, newLocale);
|
|
934
|
+
const pathWithLocale = getLocalizedUrl(url, newLocale);
|
|
1267
935
|
route(pathWithLocale, true);
|
|
1268
936
|
},
|
|
1269
937
|
});
|
|
1270
938
|
|
|
1271
|
-
return (
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
939
|
+
return h(
|
|
940
|
+
"div",
|
|
941
|
+
{},
|
|
942
|
+
h("button", { popovertarget: "localePopover" }, getLocaleName(locale)),
|
|
943
|
+
h(
|
|
944
|
+
"div",
|
|
945
|
+
{ id: "localePopover", popover: "auto" },
|
|
946
|
+
availableLocales.map((localeItem) =>
|
|
947
|
+
h(
|
|
948
|
+
"a",
|
|
949
|
+
{
|
|
950
|
+
href: getLocalizedUrl(url, localeItem),
|
|
951
|
+
hreflang: localeItem,
|
|
952
|
+
"aria-current": locale === localeItem ? "page" : undefined,
|
|
953
|
+
onClick: (e) => {
|
|
1281
954
|
e.preventDefault();
|
|
1282
955
|
setLocale(localeItem);
|
|
1283
|
-
}
|
|
1284
|
-
key
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
956
|
+
},
|
|
957
|
+
key: localeItem,
|
|
958
|
+
},
|
|
959
|
+
h("span", {}, localeItem),
|
|
960
|
+
h("span", {}, getLocaleName(localeItem, localeItem)),
|
|
961
|
+
h(
|
|
962
|
+
"span",
|
|
963
|
+
{ dir: getHTMLTextDir(localeItem), lang: localeItem },
|
|
964
|
+
getLocaleName(localeItem, locale)
|
|
965
|
+
),
|
|
966
|
+
h(
|
|
967
|
+
"span",
|
|
968
|
+
{ dir: "ltr", lang: Locales.ENGLISH },
|
|
969
|
+
getLocaleName(localeItem, Locales.ENGLISH)
|
|
970
|
+
)
|
|
971
|
+
)
|
|
972
|
+
)
|
|
973
|
+
)
|
|
1298
974
|
);
|
|
1299
975
|
};
|
|
1300
976
|
|
|
@@ -1303,34 +979,21 @@ module.exports = LocaleSwitcher;
|
|
|
1303
979
|
|
|
1304
980
|
> Dokumentationsverweise:
|
|
1305
981
|
>
|
|
1306
|
-
> > - [`useLocale` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useLocale.md) (API ist ähnlich für `preact-intlayer`)
|
|
1307
|
-
>
|
|
1308
|
-
> - [`getLocaleName` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getLocaleName.md)
|
|
1309
|
-
> - [`getLocalizedUrl` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getLocalizedUrl.md)
|
|
1310
|
-
> - [`getHTMLTextDir` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getHTMLTextDir.md)
|
|
1311
|
-
> - [`hreflang` Attribut](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=de)
|
|
1312
|
-
> - [`lang` Attribut](https://developer.mozilla.org/de/docs/Web/HTML/Global_attributes/lang)
|
|
1313
|
-
> - [`dir` Attribut](https://developer.mozilla.org/de/docs/Web/HTML/Global_attributes/dir)
|
|
1314
|
-
> - [`aria-current` Attribut](https://developer.mozilla.org/de/docs/Web/Accessibility/ARIA/Attributes/aria-current)
|
|
1315
|
-
> - [Popover API](https://developer.mozilla.org/de/docs/Web/API/Popover_API) la.org/en-US/docs/Web/HTML/Global_attributes/dir)> - [`aria-current` Attribut](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)> - [Popover API](https://developer.mozilla.org/en-US/docs/Web/API/Popover_API)
|
|
1316
|
-
|
|
1317
|
-
Unten finden Sie den aktualisierten **Schritt 9** mit zusätzlichen Erklärungen und verfeinerten Codebeispielen:
|
|
1318
|
-
|
|
1319
|
-
---
|
|
982
|
+
> > - [`useLocale` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/react-intlayer/useLocale.md) (API ist ähnlich für `preact-intlayer`)> - [`getLocaleName` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getLocaleName.md)> - [`getLocalizedUrl` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getLocalizedUrl.md)> - [`getHTMLTextDir` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getHTMLTextDir.md)> - [`hreflang` Attribut](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=de)> - [`lang` Attribut](https://developer.mozilla.org/de/docs/Web/HTML/Global_attributes/lang)> - [`dir` Attribut](https://developer.mozilla.org/de/docs/Web/HTML/Global_attributes/dir)> - [`aria-current` Attribut](https://developer.mozilla.org/de/docs/Web/Accessibility/ARIA/Attributes/aria-current)> - [Popover API](https://developer.mozilla.org/de/docs/Web/API/Popover_API)
|
|
1320
983
|
|
|
1321
984
|
### (Optional) Schritt 9: Wechseln der HTML-Sprach- und Richtungsattribute
|
|
1322
985
|
|
|
1323
|
-
Wenn Ihre Anwendung mehrere Sprachen unterstützt, ist es entscheidend, die `lang`- und `dir`-Attribute des `<html>`-Tags an die aktuelle
|
|
986
|
+
Wenn Ihre Anwendung mehrere Sprachen unterstützt, ist es entscheidend, die `lang`- und `dir`-Attribute des `<html>`-Tags an die aktuelle Sprache anzupassen. Dies stellt sicher:
|
|
1324
987
|
|
|
1325
988
|
- **Barrierefreiheit**: Screenreader und unterstützende Technologien verlassen sich auf das korrekte `lang`-Attribut, um Inhalte richtig auszusprechen und zu interpretieren.
|
|
1326
989
|
- **Textdarstellung**: Das `dir`-Attribut (Richtung) sorgt dafür, dass der Text in der richtigen Reihenfolge dargestellt wird (z. B. von links nach rechts für Englisch, von rechts nach links für Arabisch oder Hebräisch), was für die Lesbarkeit unerlässlich ist.
|
|
1327
990
|
- **SEO**: Suchmaschinen verwenden das `lang`-Attribut, um die Sprache Ihrer Seite zu bestimmen und so die richtige lokalisierte Version in den Suchergebnissen anzuzeigen.
|
|
1328
991
|
|
|
1329
|
-
Indem Sie diese Attribute dynamisch aktualisieren, wenn sich die
|
|
992
|
+
Indem Sie diese Attribute dynamisch aktualisieren, wenn sich die Sprache ändert, gewährleisten Sie eine konsistente und barrierefreie Benutzererfahrung für alle unterstützten Sprachen.
|
|
1330
993
|
|
|
1331
994
|
#### Implementierung des Hooks
|
|
1332
995
|
|
|
1333
|
-
Erstellen Sie einen benutzerdefinierten Hook, um die HTML-Attribute zu verwalten. Der Hook hört auf
|
|
996
|
+
Erstellen Sie einen benutzerdefinierten Hook, um die HTML-Attribute zu verwalten. Der Hook hört auf Sprachänderungen und aktualisiert die Attribute entsprechend:
|
|
1334
997
|
|
|
1335
998
|
```tsx fileName="src/hooks/useI18nHTMLAttributes.tsx" codeFormat="typescript"
|
|
1336
999
|
import { useEffect } from "preact/hooks";
|
|
@@ -1338,7 +1001,7 @@ import { useLocale } from "preact-intlayer";
|
|
|
1338
1001
|
import { getHTMLTextDir } from "intlayer";
|
|
1339
1002
|
|
|
1340
1003
|
/**
|
|
1341
|
-
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements `<html>` basierend auf der aktuellen
|
|
1004
|
+
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements `<html>` basierend auf der aktuellen Sprache.
|
|
1342
1005
|
* - `lang`: Informiert Browser und Suchmaschinen über die Sprache der Seite.
|
|
1343
1006
|
* - `dir`: Stellt die korrekte Leserichtung sicher (z.B. 'ltr' für Englisch, 'rtl' für Arabisch).
|
|
1344
1007
|
*
|
|
@@ -1348,10 +1011,10 @@ export const useI18nHTMLAttributes = () => {
|
|
|
1348
1011
|
const { locale } = useLocale();
|
|
1349
1012
|
|
|
1350
1013
|
useEffect(() => {
|
|
1351
|
-
// Aktualisiert das Sprachattribut auf die aktuelle
|
|
1014
|
+
// Aktualisiert das Sprachattribut auf die aktuelle Sprache.
|
|
1352
1015
|
document.documentElement.lang = locale;
|
|
1353
1016
|
|
|
1354
|
-
// Setzt die Textrichtung basierend auf der aktuellen
|
|
1017
|
+
// Setzt die Textrichtung basierend auf der aktuellen Sprache.
|
|
1355
1018
|
document.documentElement.dir = getHTMLTextDir(locale);
|
|
1356
1019
|
}, [locale]);
|
|
1357
1020
|
};
|
|
@@ -1363,7 +1026,7 @@ import { useLocale } from "preact-intlayer";
|
|
|
1363
1026
|
import { getHTMLTextDir } from "intlayer";
|
|
1364
1027
|
|
|
1365
1028
|
/**
|
|
1366
|
-
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements <html> basierend auf der aktuellen
|
|
1029
|
+
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements <html> basierend auf der aktuellen Sprache.
|
|
1367
1030
|
*/
|
|
1368
1031
|
export const useI18nHTMLAttributes = () => {
|
|
1369
1032
|
const { locale } = useLocale();
|
|
@@ -1381,7 +1044,7 @@ const { useLocale } = require("preact-intlayer");
|
|
|
1381
1044
|
const { getHTMLTextDir } = require("intlayer");
|
|
1382
1045
|
|
|
1383
1046
|
/**
|
|
1384
|
-
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements <html> basierend auf der aktuellen
|
|
1047
|
+
* Aktualisiert die `lang`- und `dir`-Attribute des HTML-Elements <html> basierend auf der aktuellen Sprache.
|
|
1385
1048
|
*/
|
|
1386
1049
|
const useI18nHTMLAttributes = () => {
|
|
1387
1050
|
const { locale } = useLocale();
|
|
@@ -1397,7 +1060,7 @@ module.exports = { useI18nHTMLAttributes };
|
|
|
1397
1060
|
|
|
1398
1061
|
#### Verwendung des Hooks in Ihrer Anwendung
|
|
1399
1062
|
|
|
1400
|
-
Integrieren Sie den Hook in Ihre Hauptkomponente, damit die HTML-Attribute aktualisiert werden, sobald sich die
|
|
1063
|
+
Integrieren Sie den Hook in Ihre Hauptkomponente, damit die HTML-Attribute aktualisiert werden, sobald sich die Sprache ändert:
|
|
1401
1064
|
|
|
1402
1065
|
```tsx fileName="src/app.tsx" codeFormat="typescript"
|
|
1403
1066
|
import type { FunctionalComponent } from "preact";
|
|
@@ -1407,7 +1070,7 @@ import "./app.css";
|
|
|
1407
1070
|
// AppContent-Definition aus Schritt 5
|
|
1408
1071
|
|
|
1409
1072
|
const AppWithHooks: FunctionalComponent = () => {
|
|
1410
|
-
// Wenden Sie den Hook an, um die Attribute lang und dir des <html>-Tags basierend auf der
|
|
1073
|
+
// Wenden Sie den Hook an, um die Attribute lang und dir des <html>-Tags basierend auf der Sprache zu aktualisieren.
|
|
1411
1074
|
useI18nHTMLAttributes();
|
|
1412
1075
|
|
|
1413
1076
|
// Angenommen, AppContent ist Ihre Hauptkomponentenanzeige aus Schritt 5
|
|
@@ -1427,7 +1090,7 @@ export default App;
|
|
|
1427
1090
|
import { IntlayerProvider } from "preact-intlayer";
|
|
1428
1091
|
import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes";
|
|
1429
1092
|
import "./app.css";
|
|
1430
|
-
// Definition
|
|
1093
|
+
// AppContent-Definition aus Schritt 5
|
|
1431
1094
|
|
|
1432
1095
|
const AppWithHooks = () => {
|
|
1433
1096
|
useI18nHTMLAttributes();
|
|
@@ -1463,12 +1126,6 @@ const App = () => (
|
|
|
1463
1126
|
module.exports = App;
|
|
1464
1127
|
```
|
|
1465
1128
|
|
|
1466
|
-
Durch die Anwendung dieser Änderungen wird Ihre Anwendung:
|
|
1467
|
-
|
|
1468
|
-
- Sicherstellen, dass das **Sprach-** (`lang`) Attribut die aktuelle Locale korrekt widerspiegelt, was wichtig für SEO und das Verhalten des Browsers ist.
|
|
1469
|
-
- Die **Schreibrichtung** (`dir`) entsprechend der Locale anpassen, um die Lesbarkeit und Benutzerfreundlichkeit für Sprachen mit unterschiedlichen Leserichtungen zu verbessern.
|
|
1470
|
-
- Bieten Sie eine zugänglichere Erfahrung, da unterstützende Technologien auf diese Attribute angewiesen sind, um optimal zu funktionieren.
|
|
1471
|
-
|
|
1472
1129
|
### (Optional) Schritt 10: Erstellen einer lokalisierten Link-Komponente
|
|
1473
1130
|
|
|
1474
1131
|
Um sicherzustellen, dass die Navigation Ihrer Anwendung die aktuelle Sprache berücksichtigt, können Sie eine benutzerdefinierte `Link`-Komponente erstellen. Diese Komponente fügt automatisch das aktuelle Sprachpräfix zu internen URLs hinzu.
|
|
@@ -1479,18 +1136,16 @@ Dieses Verhalten ist aus mehreren Gründen nützlich:
|
|
|
1479
1136
|
- **Konsistenz**: Durch die Verwendung eines lokalisierten Links in der gesamten Anwendung stellen Sie sicher, dass die Navigation innerhalb der aktuellen Sprache bleibt und unerwartete Sprachwechsel vermieden werden.
|
|
1480
1137
|
- **Wartbarkeit**: Die Zentralisierung der Lokalisierungslogik in einer einzigen Komponente vereinfacht die Verwaltung der URLs.
|
|
1481
1138
|
|
|
1482
|
-
|
|
1139
|
+
Hier ist die Implementierung einer lokalisierten `Link`-Komponente in Preact:
|
|
1483
1140
|
|
|
1484
|
-
```tsx fileName="src/components/
|
|
1141
|
+
```tsx fileName="src/components/Link.tsx" codeFormat="typescript"
|
|
1485
1142
|
import { getLocalizedUrl } from "intlayer";
|
|
1486
|
-
import { useLocale
|
|
1487
|
-
|
|
1488
|
-
import type { JSX } from "preact";
|
|
1489
|
-
import { forwardRef } from "preact/compat"; // Für das Weiterreichen von Refs
|
|
1143
|
+
import { useLocale } from "preact-intlayer";
|
|
1144
|
+
import { forwardRef } from "preact/compat";
|
|
1145
|
+
import type { JSX } from "preact";
|
|
1490
1146
|
|
|
1491
|
-
export interface
|
|
1147
|
+
export interface LinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> {
|
|
1492
1148
|
href: string;
|
|
1493
|
-
replace?: boolean; // Optional: um den Verlauf zu ersetzen
|
|
1494
1149
|
}
|
|
1495
1150
|
|
|
1496
1151
|
/**
|
|
@@ -1501,171 +1156,156 @@ export const checkIsExternalLink = (href?: string): boolean =>
|
|
|
1501
1156
|
/^https?:\/\//.test(href ?? "");
|
|
1502
1157
|
|
|
1503
1158
|
/**
|
|
1504
|
-
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen
|
|
1505
|
-
* Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit dem
|
|
1506
|
-
* Dies stellt sicher, dass die Navigation im gleichen
|
|
1507
|
-
* Es wird ein standardmäßiges <a>-Tag verwendet, das jedoch eine clientseitige Navigation über `route` von preact-iso auslösen kann.
|
|
1159
|
+
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Sprache anpasst.
|
|
1160
|
+
* Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit dem Sprachpräfix zu versehen (z. B. /fr/about).
|
|
1161
|
+
* Dies stellt sicher, dass die Navigation im gleichen Sprachkontext bleibt.
|
|
1508
1162
|
*/
|
|
1509
|
-
export const
|
|
1510
|
-
({ href, children,
|
|
1163
|
+
export const Link = forwardRef<HTMLAnchorElement, LinkProps>(
|
|
1164
|
+
({ href, children, ...props }, ref) => {
|
|
1511
1165
|
const { locale } = useLocale();
|
|
1512
|
-
const location = useLocation(); // von preact-iso
|
|
1513
1166
|
const isExternalLink = checkIsExternalLink(href);
|
|
1514
1167
|
|
|
1168
|
+
// Wenn der Link intern ist und ein gültiges href angegeben wurde, rufen Sie die lokalisierte URL ab.
|
|
1515
1169
|
const hrefI18n =
|
|
1516
1170
|
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1517
1171
|
|
|
1518
|
-
const handleClick = (event: JSX.TargetedMouseEvent<HTMLAnchorElement>) => {
|
|
1519
|
-
if (onClick) {
|
|
1520
|
-
onClick(event);
|
|
1521
|
-
}
|
|
1522
|
-
if (
|
|
1523
|
-
!isExternalLink &&
|
|
1524
|
-
href && // Sicherstellen, dass href definiert ist
|
|
1525
|
-
event.button === 0 && // Linksklick
|
|
1526
|
-
!event.metaKey &&
|
|
1527
|
-
!event.ctrlKey &&
|
|
1528
|
-
!event.shiftKey &&
|
|
1529
|
-
!event.altKey && // Standard-Modifier-Überprüfung
|
|
1530
|
-
!props.target // Kein Ziel in einem neuen Tab/Fenster
|
|
1531
|
-
) {
|
|
1532
|
-
event.preventDefault();
|
|
1533
|
-
if (location.url !== hrefI18n) {
|
|
1534
|
-
// Nur navigieren, wenn die URL unterschiedlich ist
|
|
1535
|
-
route(hrefI18n, replace); // Verwende preact-iso's route
|
|
1536
|
-
}
|
|
1537
|
-
}
|
|
1538
|
-
};
|
|
1539
|
-
|
|
1540
1172
|
return (
|
|
1541
|
-
<a href={hrefI18n} ref={ref}
|
|
1173
|
+
<a href={hrefI18n} ref={ref} {...props}>
|
|
1542
1174
|
{children}
|
|
1543
1175
|
</a>
|
|
1544
1176
|
);
|
|
1545
1177
|
}
|
|
1546
1178
|
);
|
|
1179
|
+
|
|
1180
|
+
Link.displayName = "Link";
|
|
1547
1181
|
```
|
|
1548
1182
|
|
|
1549
|
-
```jsx fileName="src/components/
|
|
1183
|
+
```jsx fileName="src/components/Link.jsx" codeFormat="esm"
|
|
1550
1184
|
import { getLocalizedUrl } from "intlayer";
|
|
1551
1185
|
import { useLocale } from "preact-intlayer";
|
|
1552
|
-
import { useLocation, route } from "preact-iso"; // Importiert von preact-iso
|
|
1553
1186
|
import { forwardRef } from "preact/compat";
|
|
1554
|
-
import { h } from "preact"; // Für JSX
|
|
1555
1187
|
|
|
1188
|
+
/**
|
|
1189
|
+
* Hilfsfunktion, um zu prüfen, ob eine gegebene URL extern ist.
|
|
1190
|
+
* Wenn die URL mit http:// oder https:// beginnt, wird sie als extern betrachtet.
|
|
1191
|
+
*/
|
|
1556
1192
|
export const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1557
1193
|
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1194
|
+
/**
|
|
1195
|
+
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Sprache anpasst.
|
|
1196
|
+
* Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit dem Sprachpräfix zu versehen (z. B. /fr/about).
|
|
1197
|
+
* Dies stellt sicher, dass die Navigation im gleichen Sprachkontext bleibt.
|
|
1198
|
+
*/
|
|
1199
|
+
export const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1200
|
+
const { locale } = useLocale();
|
|
1201
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1563
1202
|
|
|
1564
|
-
|
|
1565
|
-
|
|
1203
|
+
// Wenn der Link intern ist und ein gültiges href angegeben wurde, rufen Sie die lokalisierte URL ab.
|
|
1204
|
+
const hrefI18n =
|
|
1205
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1566
1206
|
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
href &&
|
|
1574
|
-
event.button === 0 &&
|
|
1575
|
-
!event.metaKey &&
|
|
1576
|
-
!event.ctrlKey &&
|
|
1577
|
-
!event.shiftKey &&
|
|
1578
|
-
!event.altKey &&
|
|
1579
|
-
!props.target
|
|
1580
|
-
) {
|
|
1581
|
-
event.preventDefault();
|
|
1582
|
-
if (location.url !== hrefI18n) {
|
|
1583
|
-
route(hrefI18n, replace);
|
|
1584
|
-
}
|
|
1585
|
-
}
|
|
1586
|
-
};
|
|
1207
|
+
return (
|
|
1208
|
+
<a href={hrefI18n} ref={ref} {...props}>
|
|
1209
|
+
{children}
|
|
1210
|
+
</a>
|
|
1211
|
+
);
|
|
1212
|
+
});
|
|
1587
1213
|
|
|
1588
|
-
|
|
1589
|
-
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1590
|
-
{children}
|
|
1591
|
-
</a>
|
|
1592
|
-
);
|
|
1593
|
-
}
|
|
1594
|
-
);
|
|
1214
|
+
Link.displayName = "Link";
|
|
1595
1215
|
```
|
|
1596
1216
|
|
|
1597
|
-
```jsx fileName="src/components/
|
|
1217
|
+
```jsx fileName="src/components/Link.cjsx" codeFormat="commonjs"
|
|
1598
1218
|
const { getLocalizedUrl } = require("intlayer");
|
|
1599
1219
|
const { useLocale } = require("preact-intlayer");
|
|
1600
|
-
const { useLocation, route } = require("preact-iso"); // Importiert von preact-iso
|
|
1601
1220
|
const { forwardRef } = require("preact/compat");
|
|
1602
|
-
const { h } = require("preact"); // Für JSX
|
|
1603
1221
|
|
|
1222
|
+
/**
|
|
1223
|
+
* Hilfsfunktion, um zu prüfen, ob eine gegebene URL extern ist.
|
|
1224
|
+
* Wenn die URL mit http:// oder https:// beginnt, wird sie als extern betrachtet.
|
|
1225
|
+
*/
|
|
1604
1226
|
const checkIsExternalLink = (href) => /^https?:\/\//.test(href ?? "");
|
|
1605
1227
|
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
!props.target
|
|
1630
|
-
) {
|
|
1631
|
-
event.preventDefault();
|
|
1632
|
-
if (location.url !== hrefI18n) {
|
|
1633
|
-
route(hrefI18n, replace);
|
|
1634
|
-
}
|
|
1635
|
-
}
|
|
1636
|
-
};
|
|
1228
|
+
/**
|
|
1229
|
+
* Eine benutzerdefinierte Link-Komponente, die das href-Attribut basierend auf der aktuellen Sprache anpasst.
|
|
1230
|
+
* Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit dem Sprachpräfix zu versehen (z. B. /fr/about).
|
|
1231
|
+
* Dies stellt sicher, dass die Navigation im gleichen Sprachkontext bleibt.
|
|
1232
|
+
*/
|
|
1233
|
+
const Link = forwardRef(({ href, children, ...props }, ref) => {
|
|
1234
|
+
const { locale } = useLocale();
|
|
1235
|
+
const isExternalLink = checkIsExternalLink(href);
|
|
1236
|
+
|
|
1237
|
+
// Wenn der Link intern ist und ein gültiges href angegeben wurde, rufen Sie die lokalisierte URL ab.
|
|
1238
|
+
const hrefI18n =
|
|
1239
|
+
href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
|
|
1240
|
+
|
|
1241
|
+
return h(
|
|
1242
|
+
"a",
|
|
1243
|
+
{
|
|
1244
|
+
href: hrefI18n,
|
|
1245
|
+
ref: ref,
|
|
1246
|
+
...props,
|
|
1247
|
+
},
|
|
1248
|
+
children
|
|
1249
|
+
);
|
|
1250
|
+
});
|
|
1637
1251
|
|
|
1638
|
-
|
|
1639
|
-
<a href={hrefI18n} ref={ref} onClick={handleClick} {...props}>
|
|
1640
|
-
{children}
|
|
1641
|
-
</a>
|
|
1642
|
-
);
|
|
1643
|
-
}
|
|
1644
|
-
);
|
|
1252
|
+
Link.displayName = "Link";
|
|
1645
1253
|
|
|
1646
|
-
module.exports = {
|
|
1254
|
+
module.exports = { Link, checkIsExternalLink };
|
|
1647
1255
|
```
|
|
1648
1256
|
|
|
1649
|
-
####
|
|
1257
|
+
#### Wie es funktioniert
|
|
1650
1258
|
|
|
1651
1259
|
- **Erkennung externer Links**:
|
|
1652
|
-
Die Hilfsfunktion `checkIsExternalLink` bestimmt, ob eine URL extern ist. Externe Links bleiben unverändert.
|
|
1653
|
-
- **Abrufen der aktuellen
|
|
1654
|
-
Der
|
|
1260
|
+
Die Hilfsfunktion `checkIsExternalLink` bestimmt, ob eine URL extern ist. Externe Links bleiben unverändert, da sie keine Lokalisierung benötigen.
|
|
1261
|
+
- **Abrufen der aktuellen Sprache**:
|
|
1262
|
+
Der `useLocale`-Hook liefert die aktuelle Sprache (z. B. `fr` für Französisch).
|
|
1655
1263
|
- **Lokalisierung der URL**:
|
|
1656
|
-
Für interne Links
|
|
1657
|
-
- **Client-seitige Navigation**:
|
|
1658
|
-
Die Funktion `handleClick` prüft, ob es sich um einen internen Link handelt und ob die Standardnavigation verhindert werden soll. Falls ja, verwendet sie die `route`-Funktion von `preact-iso` (erhalten über `useLocation` oder direkt importiert), um eine clientseitige Navigation durchzuführen. Dies ermöglicht ein SPA-ähnliches Verhalten ohne vollständiges Neuladen der Seite.
|
|
1264
|
+
Für interne Links (d. h. nicht externe) wird `getLocalizedUrl` verwendet, um der URL automatisch das aktuelle Sprachpräfix voranzustellen. Das bedeutet, wenn Ihr Benutzer auf Französisch ist, wird `/about` als `href` in `/fr/about` umgewandelt.
|
|
1659
1265
|
- **Rückgabe des Links**:
|
|
1660
|
-
Die Komponente gibt ein `<a>`-Element mit der lokalisierten URL und
|
|
1266
|
+
Die Komponente gibt ein `<a>`-Element mit der lokalisierten URL zurück und stellt so sicher, dass die Navigation konsistent mit der Sprache ist.
|
|
1267
|
+
|
|
1268
|
+
### (Optional) Schritt 11: Markdown und HTML rendern
|
|
1269
|
+
|
|
1270
|
+
Intlayer unterstützt das Rendern von Markdown- und HTML-Inhalten in Preact.
|
|
1271
|
+
|
|
1272
|
+
Sie können das Rendern von Markdown- und HTML-Inhalten mit der Methode `.use()` anpassen. Diese Methode ermöglicht es Ihnen, das Standard-Rendering bestimmter Tags zu überschreiben.
|
|
1273
|
+
|
|
1274
|
+
```tsx
|
|
1275
|
+
import { useIntlayer } from "preact-intlayer";
|
|
1276
|
+
|
|
1277
|
+
const { myMarkdownContent, myHtmlContent } = useIntlayer("my-component");
|
|
1278
|
+
|
|
1279
|
+
// ...
|
|
1280
|
+
|
|
1281
|
+
return (
|
|
1282
|
+
<div>
|
|
1283
|
+
{/* Grundlegendes Rendering */}
|
|
1284
|
+
{myMarkdownContent}
|
|
1285
|
+
|
|
1286
|
+
{/* Benutzerdefiniertes Rendering für Markdown */}
|
|
1287
|
+
{myMarkdownContent.use({
|
|
1288
|
+
h1: (props) => <h1 style={{ color: "red" }} {...props} />,
|
|
1289
|
+
})}
|
|
1290
|
+
|
|
1291
|
+
{/* Grundlegendes Rendering für HTML */}
|
|
1292
|
+
{myHtmlContent}
|
|
1293
|
+
|
|
1294
|
+
{/* Benutzerdefiniertes Rendering für HTML */}
|
|
1295
|
+
{myHtmlContent.use({
|
|
1296
|
+
b: (props) => <strong style={{ color: "blue" }} {...props} />,
|
|
1297
|
+
})}
|
|
1298
|
+
</div>
|
|
1299
|
+
);
|
|
1300
|
+
```
|
|
1661
1301
|
|
|
1662
1302
|
### TypeScript konfigurieren
|
|
1663
1303
|
|
|
1664
|
-
Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und
|
|
1304
|
+
Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und Ihre Codebasis robuster zu machen.
|
|
1665
1305
|
|
|
1666
|
-

|
|
1667
1307
|
|
|
1668
|
-

|
|
1669
1309
|
|
|
1670
1310
|
Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generierten Typen enthält.
|
|
1671
1311
|
|
|
@@ -1680,7 +1320,7 @@ Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generiert
|
|
|
1680
1320
|
},
|
|
1681
1321
|
"include": [
|
|
1682
1322
|
// ... Ihre bestehenden TypeScript-Konfigurationen
|
|
1683
|
-
".intlayer/**/*.ts", //
|
|
1323
|
+
".intlayer/**/*.ts", // Einbeziehung der automatisch generierten Typen
|
|
1684
1324
|
],
|
|
1685
1325
|
}
|
|
1686
1326
|
```
|
|
@@ -1689,12 +1329,12 @@ Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generiert
|
|
|
1689
1329
|
|
|
1690
1330
|
### Git-Konfiguration
|
|
1691
1331
|
|
|
1692
|
-
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren.
|
|
1332
|
+
Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren. Dies ermöglicht es Ihnen, zu vermeiden, dass sie in Ihr Git-Repository eingecheckt werden.
|
|
1693
1333
|
|
|
1694
|
-
|
|
1334
|
+
Dazu können Sie die folgenden Anweisungen in Ihre `.gitignore`-Datei einfügen:
|
|
1695
1335
|
|
|
1696
1336
|
```plaintext
|
|
1697
|
-
#
|
|
1337
|
+
# Ignorieren Sie die von Intlayer generierten Dateien
|
|
1698
1338
|
.intlayer
|
|
1699
1339
|
```
|
|
1700
1340
|
|
|
@@ -1702,21 +1342,21 @@ Um dies zu tun, können Sie die folgenden Anweisungen zu Ihrer `.gitignore`-Date
|
|
|
1702
1342
|
|
|
1703
1343
|
Um Ihre Entwicklungserfahrung mit Intlayer zu verbessern, können Sie die offizielle **Intlayer VS Code Erweiterung** installieren.
|
|
1704
1344
|
|
|
1705
|
-
[
|
|
1345
|
+
[Vom VS Code Marketplace installieren](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
|
|
1706
1346
|
|
|
1707
1347
|
Diese Erweiterung bietet:
|
|
1708
1348
|
|
|
1709
1349
|
- **Autovervollständigung** für Übersetzungsschlüssel.
|
|
1710
1350
|
- **Echtzeit-Fehlererkennung** für fehlende Übersetzungen.
|
|
1711
|
-
- **Inline-Vorschauen**
|
|
1351
|
+
- **Inline-Vorschauen** von übersetzten Inhalten.
|
|
1712
1352
|
- **Schnellaktionen**, um Übersetzungen einfach zu erstellen und zu aktualisieren.
|
|
1713
1353
|
|
|
1714
|
-
|
|
1354
|
+
Weitere Details zur Verwendung der Erweiterung finden Sie in der [Dokumentation zur Intlayer VS Code Erweiterung](https://intlayer.org/doc/vs-code-extension).
|
|
1715
1355
|
|
|
1716
1356
|
---
|
|
1717
1357
|
|
|
1718
|
-
###
|
|
1358
|
+
### Weiter gehen
|
|
1719
1359
|
|
|
1720
|
-
Um weiterzugehen, können Sie den [visuellen Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_visual_editor.md) implementieren oder Ihre Inhalte
|
|
1360
|
+
Um weiterzugehen, können Sie den [visuellen Editor](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_visual_editor.md) implementieren oder Ihre Inhalte mithilfe des [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md) auslagern.
|
|
1721
1361
|
|
|
1722
1362
|
---
|