@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.
Files changed (172) hide show
  1. package/dist/cjs/generated/docs.entry.cjs +160 -0
  2. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  3. package/dist/esm/generated/docs.entry.mjs +160 -0
  4. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  5. package/dist/types/generated/docs.entry.d.ts +8 -0
  6. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  7. package/docs/ar/intlayer_with_adonisjs.md +394 -0
  8. package/docs/ar/intlayer_with_hono.md +223 -0
  9. package/docs/ar/intlayer_with_vite+preact.md +317 -675
  10. package/docs/ar/packages/adonis-intlayer/exports.md +50 -0
  11. package/docs/ar/packages/adonis-intlayer/intlayer.md +54 -0
  12. package/docs/ar/packages/adonis-intlayer/t.md +149 -0
  13. package/docs/ar/packages/hono-intlayer/exports.md +59 -0
  14. package/docs/ar/packages/hono-intlayer/intlayer.md +60 -0
  15. package/docs/ar/packages/hono-intlayer/t.md +268 -0
  16. package/docs/de/intlayer_with_adonisjs.md +392 -0
  17. package/docs/de/intlayer_with_hono.md +418 -0
  18. package/docs/de/intlayer_with_vite+preact.md +272 -632
  19. package/docs/de/packages/adonis-intlayer/exports.md +50 -0
  20. package/docs/de/packages/adonis-intlayer/intlayer.md +54 -0
  21. package/docs/de/packages/adonis-intlayer/t.md +149 -0
  22. package/docs/de/packages/hono-intlayer/exports.md +59 -0
  23. package/docs/de/packages/hono-intlayer/intlayer.md +59 -0
  24. package/docs/de/packages/hono-intlayer/t.md +316 -0
  25. package/docs/en/index.md +8 -0
  26. package/docs/en/intlayer_with_adonisjs.md +388 -0
  27. package/docs/en/intlayer_with_hono.md +418 -0
  28. package/docs/en/intlayer_with_vite+preact.md +171 -556
  29. package/docs/en/introduction.md +1 -0
  30. package/docs/en/packages/adonis-intlayer/exports.md +50 -0
  31. package/docs/en/packages/adonis-intlayer/intlayer.md +54 -0
  32. package/docs/en/packages/adonis-intlayer/t.md +149 -0
  33. package/docs/en/packages/hono-intlayer/exports.md +59 -0
  34. package/docs/en/packages/hono-intlayer/intlayer.md +59 -0
  35. package/docs/en/packages/hono-intlayer/t.md +316 -0
  36. package/docs/en-GB/intlayer_with_adonisjs.md +394 -0
  37. package/docs/en-GB/intlayer_with_hono.md +418 -0
  38. package/docs/en-GB/intlayer_with_vite+preact.md +236 -583
  39. package/docs/en-GB/packages/adonis-intlayer/exports.md +50 -0
  40. package/docs/en-GB/packages/adonis-intlayer/intlayer.md +54 -0
  41. package/docs/en-GB/packages/adonis-intlayer/t.md +149 -0
  42. package/docs/en-GB/packages/hono-intlayer/exports.md +59 -0
  43. package/docs/en-GB/packages/hono-intlayer/intlayer.md +59 -0
  44. package/docs/en-GB/packages/hono-intlayer/t.md +316 -0
  45. package/docs/es/intlayer_with_adonisjs.md +388 -0
  46. package/docs/es/intlayer_with_hono.md +418 -0
  47. package/docs/es/intlayer_with_vite+preact.md +286 -650
  48. package/docs/es/packages/adonis-intlayer/exports.md +50 -0
  49. package/docs/es/packages/adonis-intlayer/intlayer.md +54 -0
  50. package/docs/es/packages/adonis-intlayer/t.md +149 -0
  51. package/docs/es/packages/hono-intlayer/exports.md +59 -0
  52. package/docs/es/packages/hono-intlayer/intlayer.md +59 -0
  53. package/docs/es/packages/hono-intlayer/t.md +316 -0
  54. package/docs/fr/intlayer_with_adonisjs.md +388 -0
  55. package/docs/fr/intlayer_with_hono.md +418 -0
  56. package/docs/fr/intlayer_with_vite+preact.md +274 -614
  57. package/docs/fr/packages/adonis-intlayer/exports.md +50 -0
  58. package/docs/fr/packages/adonis-intlayer/intlayer.md +54 -0
  59. package/docs/fr/packages/adonis-intlayer/t.md +149 -0
  60. package/docs/fr/packages/hono-intlayer/exports.md +59 -0
  61. package/docs/fr/packages/hono-intlayer/intlayer.md +59 -0
  62. package/docs/fr/packages/hono-intlayer/t.md +316 -0
  63. package/docs/hi/intlayer_with_adonisjs.md +394 -0
  64. package/docs/hi/intlayer_with_hono.md +227 -0
  65. package/docs/hi/intlayer_with_vite+preact.md +304 -680
  66. package/docs/hi/packages/adonis-intlayer/exports.md +50 -0
  67. package/docs/hi/packages/adonis-intlayer/intlayer.md +54 -0
  68. package/docs/hi/packages/adonis-intlayer/t.md +149 -0
  69. package/docs/hi/packages/hono-intlayer/exports.md +59 -0
  70. package/docs/hi/packages/hono-intlayer/intlayer.md +60 -0
  71. package/docs/hi/packages/hono-intlayer/t.md +268 -0
  72. package/docs/id/intlayer_with_adonisjs.md +394 -0
  73. package/docs/id/intlayer_with_hono.md +227 -0
  74. package/docs/id/intlayer_with_vite+preact.md +297 -697
  75. package/docs/id/packages/adonis-intlayer/exports.md +50 -0
  76. package/docs/id/packages/adonis-intlayer/intlayer.md +54 -0
  77. package/docs/id/packages/adonis-intlayer/t.md +149 -0
  78. package/docs/id/packages/hono-intlayer/exports.md +59 -0
  79. package/docs/id/packages/hono-intlayer/intlayer.md +60 -0
  80. package/docs/id/packages/hono-intlayer/t.md +268 -0
  81. package/docs/it/intlayer_with_adonisjs.md +394 -0
  82. package/docs/it/intlayer_with_hono.md +227 -0
  83. package/docs/it/intlayer_with_vite+preact.md +290 -659
  84. package/docs/it/packages/adonis-intlayer/exports.md +50 -0
  85. package/docs/it/packages/adonis-intlayer/intlayer.md +54 -0
  86. package/docs/it/packages/adonis-intlayer/t.md +149 -0
  87. package/docs/it/packages/hono-intlayer/exports.md +59 -0
  88. package/docs/it/packages/hono-intlayer/intlayer.md +60 -0
  89. package/docs/it/packages/hono-intlayer/t.md +268 -0
  90. package/docs/ja/intlayer_with_adonisjs.md +394 -0
  91. package/docs/ja/intlayer_with_hono.md +227 -0
  92. package/docs/ja/intlayer_with_vite+preact.md +307 -662
  93. package/docs/ja/packages/adonis-intlayer/exports.md +50 -0
  94. package/docs/ja/packages/adonis-intlayer/intlayer.md +54 -0
  95. package/docs/ja/packages/adonis-intlayer/t.md +149 -0
  96. package/docs/ja/packages/hono-intlayer/exports.md +59 -0
  97. package/docs/ja/packages/hono-intlayer/intlayer.md +60 -0
  98. package/docs/ja/packages/hono-intlayer/t.md +268 -0
  99. package/docs/ko/intlayer_with_adonisjs.md +394 -0
  100. package/docs/ko/intlayer_with_hono.md +227 -0
  101. package/docs/ko/intlayer_with_vite+preact.md +303 -703
  102. package/docs/ko/packages/adonis-intlayer/exports.md +50 -0
  103. package/docs/ko/packages/adonis-intlayer/intlayer.md +54 -0
  104. package/docs/ko/packages/adonis-intlayer/t.md +149 -0
  105. package/docs/ko/packages/hono-intlayer/exports.md +59 -0
  106. package/docs/ko/packages/hono-intlayer/intlayer.md +60 -0
  107. package/docs/ko/packages/hono-intlayer/t.md +268 -0
  108. package/docs/pl/intlayer_with_adonisjs.md +394 -0
  109. package/docs/pl/intlayer_with_hono.md +227 -0
  110. package/docs/pl/intlayer_with_vite+preact.md +289 -690
  111. package/docs/pl/packages/adonis-intlayer/exports.md +50 -0
  112. package/docs/pl/packages/adonis-intlayer/intlayer.md +54 -0
  113. package/docs/pl/packages/adonis-intlayer/t.md +149 -0
  114. package/docs/pl/packages/hono-intlayer/exports.md +59 -0
  115. package/docs/pl/packages/hono-intlayer/intlayer.md +60 -0
  116. package/docs/pl/packages/hono-intlayer/t.md +268 -0
  117. package/docs/pt/intlayer_with_adonisjs.md +394 -0
  118. package/docs/pt/intlayer_with_hono.md +227 -0
  119. package/docs/pt/intlayer_with_vite+preact.md +275 -637
  120. package/docs/pt/packages/adonis-intlayer/exports.md +50 -0
  121. package/docs/pt/packages/adonis-intlayer/intlayer.md +54 -0
  122. package/docs/pt/packages/adonis-intlayer/t.md +149 -0
  123. package/docs/pt/packages/hono-intlayer/exports.md +59 -0
  124. package/docs/pt/packages/hono-intlayer/intlayer.md +60 -0
  125. package/docs/pt/packages/hono-intlayer/t.md +268 -0
  126. package/docs/ru/intlayer_with_adonisjs.md +393 -0
  127. package/docs/ru/intlayer_with_hono.md +223 -0
  128. package/docs/ru/intlayer_with_vite+preact.md +319 -683
  129. package/docs/ru/packages/adonis-intlayer/exports.md +50 -0
  130. package/docs/ru/packages/adonis-intlayer/intlayer.md +54 -0
  131. package/docs/ru/packages/adonis-intlayer/t.md +149 -0
  132. package/docs/ru/packages/hono-intlayer/exports.md +59 -0
  133. package/docs/ru/packages/hono-intlayer/intlayer.md +60 -0
  134. package/docs/ru/packages/hono-intlayer/t.md +268 -0
  135. package/docs/tr/intlayer_with_adonisjs.md +394 -0
  136. package/docs/tr/intlayer_with_hono.md +227 -0
  137. package/docs/tr/intlayer_with_vite+preact.md +332 -665
  138. package/docs/tr/packages/adonis-intlayer/exports.md +50 -0
  139. package/docs/tr/packages/adonis-intlayer/intlayer.md +54 -0
  140. package/docs/tr/packages/adonis-intlayer/t.md +149 -0
  141. package/docs/tr/packages/hono-intlayer/exports.md +59 -0
  142. package/docs/tr/packages/hono-intlayer/intlayer.md +60 -0
  143. package/docs/tr/packages/hono-intlayer/t.md +268 -0
  144. package/docs/uk/intlayer_with_adonisjs.md +394 -0
  145. package/docs/uk/intlayer_with_hono.md +227 -0
  146. package/docs/uk/intlayer_with_vite+preact.md +228 -626
  147. package/docs/uk/packages/adonis-intlayer/exports.md +50 -0
  148. package/docs/uk/packages/adonis-intlayer/intlayer.md +54 -0
  149. package/docs/uk/packages/adonis-intlayer/t.md +149 -0
  150. package/docs/uk/packages/hono-intlayer/exports.md +59 -0
  151. package/docs/uk/packages/hono-intlayer/intlayer.md +60 -0
  152. package/docs/uk/packages/hono-intlayer/t.md +268 -0
  153. package/docs/vi/intlayer_with_adonisjs.md +394 -0
  154. package/docs/vi/intlayer_with_hono.md +227 -0
  155. package/docs/vi/intlayer_with_vite+preact.md +294 -679
  156. package/docs/vi/packages/adonis-intlayer/exports.md +50 -0
  157. package/docs/vi/packages/adonis-intlayer/intlayer.md +54 -0
  158. package/docs/vi/packages/adonis-intlayer/t.md +149 -0
  159. package/docs/vi/packages/hono-intlayer/exports.md +59 -0
  160. package/docs/vi/packages/hono-intlayer/intlayer.md +60 -0
  161. package/docs/vi/packages/hono-intlayer/t.md +268 -0
  162. package/docs/zh/intlayer_with_adonisjs.md +393 -0
  163. package/docs/zh/intlayer_with_hono.md +418 -0
  164. package/docs/zh/intlayer_with_vite+preact.md +338 -743
  165. package/docs/zh/packages/adonis-intlayer/exports.md +50 -0
  166. package/docs/zh/packages/adonis-intlayer/intlayer.md +54 -0
  167. package/docs/zh/packages/adonis-intlayer/t.md +149 -0
  168. package/docs/zh/packages/hono-intlayer/exports.md +59 -0
  169. package/docs/zh/packages/hono-intlayer/intlayer.md +60 -0
  170. package/docs/zh/packages/hono-intlayer/t.md +294 -0
  171. package/package.json +6 -6
  172. 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, Middleware-Weiterleitungen, 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).
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
- Bearbeiten Sie <code>src/app.tsx</code> und speichern Sie, um HMR zu
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: "Bearbeiten Sie src/app.jsx und speichern Sie, um HMR zu testen",
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: "Bearbeite src/app.jsx und speichere, um HMR zu testen",
307
+ es: "Edita src/app.jsx y guarda para probar HMR",
299
308
  }),
300
309
 
301
310
  readTheDocs: t({
302
- en: "Klicke auf die Vite- und Preact-Logos, um mehr zu erfahren",
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-Logo",
330
+ en: "Vite logo",
322
331
  fr: "Logo Vite",
323
332
  es: "Logo Vite",
324
333
  }),
325
334
  preactLogo: t({
326
- en: "Preact-Logo",
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 y Preact para obtener más información",
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 in Ihrer Konfiguration die Option `middleware.prefixDefault` auf `true` setzen. Weitere Informationen finden Sie in der [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
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
- ```bash packageManager="yarn"
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 { type Locales, configuration, getPathWithoutLocale } from "intlayer";
675
- import { ComponentChildren, FunctionalComponent } from "preact";
664
+ import { localeMap } from "intlayer";
676
665
  import { IntlayerProvider } from "preact-intlayer";
677
- import { LocationProvider, useLocation } from "preact-iso";
678
- import { useEffect } from "preact/hooks";
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
- <RouterContent>{children}</RouterContent>
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
- // Importieren der notwendigen Abhängigkeiten und Funktionen
805
- import { configuration, getPathWithoutLocale } from "intlayer";
695
+ import { localeMap } from "intlayer";
806
696
  import { IntlayerProvider } from "preact-intlayer";
807
- import { LocationProvider, useLocation } from "preact-iso";
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
- <RouterContent>{children}</RouterContent>
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
- // Importieren der notwendigen Abhängigkeiten und Funktionen
926
- const { configuration, getPathWithoutLocale } = require("intlayer");
723
+ const { localeMap } = require("intlayer");
927
724
  const { IntlayerProvider } = require("preact-intlayer");
928
- const { LocationProvider, useLocation } = require("preact-iso");
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
- <LocationProvider>
1040
- <RouterContent>{children}</RouterContent>
1041
- </LocationProvider>
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
- tsx fileName="src/app.tsx" codeFormat="typescript"
1053
- // ... Ihre AppContent-Komponente (definiert in Schritt 5)
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
- // ... Ihre AppContent-Komponente (definiert in Schritt 5)
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
- // ... Ihre AppContent-Komponente (definiert in Schritt 5)
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 `useLocation` und `route` von `preact-iso` verwenden, um den URL-Pfad zu aktualisieren.
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, route } from "preact-iso";
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 location = useLocation();
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(currentFullPath, newLocale);
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(location.url, localeItem)}
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
- {/* Gebietsschema - z.B. FR */}
843
+ {/* Locale - z.B. FR */}
1172
844
  {localeItem}
1173
845
  </span>
1174
846
  <span>
1175
- {/* Sprache in ihrem eigenen Gebietsschema - z.B. Français */}
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 Gebietsschema - z.B. Francés, wenn das aktuelle Gebietsschema auf Locales.SPANISH gesetzt ist */}
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, route } from "preact-iso";
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 location = useLocation();
879
+ const { url, route } = useLocation();
1209
880
  const { locale, availableLocales, setLocale } = useLocale({
1210
881
  onLocaleChange: (newLocale) => {
1211
- const currentFullPath = location.url;
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(location.url, localeItem)}
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, route } = require("preact-iso");
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 location = useLocation();
931
+ const { url, route } = useLocation();
1263
932
  const { locale, availableLocales, setLocale } = useLocale({
1264
933
  onLocaleChange: (newLocale) => {
1265
- const currentFullPath = location.url;
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
- <div>
1273
- <button popovertarget="localePopover">{getLocaleName(locale)}</button>
1274
- <div id="localePopover" popover="auto">
1275
- {availableLocales.map((localeItem) => (
1276
- <a
1277
- href={getLocalizedUrl(location.url, localeItem)}
1278
- hreflang={localeItem}
1279
- aria-current={locale === localeItem ? "page" : undefined}
1280
- onClick={(e) => {
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={localeItem}
1285
- >
1286
- <span>{localeItem}</span>
1287
- <span>{getLocaleName(localeItem, localeItem)}</span>
1288
- <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1289
- {getLocaleName(localeItem, locale)}
1290
- </span>
1291
- <span dir="ltr" lang={Locales.ENGLISH}>
1292
- {getLocaleName(localeItem, Locales.ENGLISH)}
1293
- </span>
1294
- </a>
1295
- ))}
1296
- </div>
1297
- </div>
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 Locale anzupassen. Dies stellt sicher:
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 Locale ändert, gewährleisten Sie eine konsistente und barrierefreie Benutzererfahrung für alle unterstützten Sprachen.
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 Locale-Änderungen und aktualisiert die Attribute entsprechend:
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 Locale.
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 Locale.
1014
+ // Aktualisiert das Sprachattribut auf die aktuelle Sprache.
1352
1015
  document.documentElement.lang = locale;
1353
1016
 
1354
- // Setzt die Textrichtung basierend auf der aktuellen Locale.
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 Locale.
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 Locale.
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 Locale ändert:
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 Locale zu aktualisieren.
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 von AppContent aus Schritt 5
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
- Für Preact mit `preact-iso` werden typischerweise Standard-`<a>`-Tags für die Navigation verwendet, und `preact-iso` übernimmt das Routing. Wenn Sie eine programmatische Navigation bei einem Klick benötigen (z. B. um Aktionen vor der Navigation auszuführen), können Sie die `route`-Funktion aus `useLocation` verwenden. So können Sie eine benutzerdefinierte Anker-Komponente erstellen, die URLs lokalisiert:
1139
+ Hier ist die Implementierung einer lokalisierten `Link`-Komponente in Preact:
1483
1140
 
1484
- ```tsx fileName="src/components/LocalizedLink.tsx" codeFormat="typescript"
1141
+ ```tsx fileName="src/components/Link.tsx" codeFormat="typescript"
1485
1142
  import { getLocalizedUrl } from "intlayer";
1486
- import { useLocale, useLocation, route } from "preact-intlayer"; // Angenommen, useLocation und route können von preact-iso über preact-intlayer bereitgestellt werden, falls re-exportiert, oder direkt importiert werden
1487
- // Wenn nicht erneut exportiert, direkt importieren: import { useLocation, route } von "preact-iso";
1488
- import type { JSX } from "preact"; // Für HTMLAttributes
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 LocalizedLinkProps extends JSX.HTMLAttributes<HTMLAnchorElement> {
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 Locale anpasst.
1505
- * Für interne Links wird `getLocalizedUrl` verwendet, um die URL mit dem Locale-Präfix zu versehen (z. B. /fr/about).
1506
- * Dies stellt sicher, dass die Navigation im gleichen Locale-Kontext bleibt.
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 LocalizedLink = forwardRef<HTMLAnchorElement, LocalizedLinkProps>(
1510
- ({ href, children, onClick, replace = false, ...props }, ref) => {
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} onClick={handleClick} {...props}>
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/LocalizedLink.jsx" codeFormat="esm"
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
- export const LocalizedLink = forwardRef(
1559
- ({ href, children, onClick, replace = false, ...props }, ref) => {
1560
- const { locale } = useLocale();
1561
- const location = useLocation();
1562
- const isExternalLink = checkIsExternalLink(href);
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
- const hrefI18n =
1565
- href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
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
- const handleClick = (event) => {
1568
- if (onClick) {
1569
- onClick(event);
1570
- }
1571
- if (
1572
- !isExternalLink &&
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
- return (
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/LocalizedLink.cjsx" codeFormat="commonjs"
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
- // Überprüft, ob ein Link extern ist
1607
- const LocalizedLink = forwardRef(
1608
- ({ href, children, onClick, replace = false, ...props }, ref) => {
1609
- const { locale } = useLocale(); // Aktuelle Sprache abrufen
1610
- const location = useLocation(); // Aktuellen Standort abrufen
1611
- const isExternalLink = checkIsExternalLink(href); // Prüfen, ob Link extern ist
1612
-
1613
- // Lokalisierte URL generieren, wenn Link intern ist
1614
- const hrefI18n =
1615
- href && !isExternalLink ? getLocalizedUrl(href, locale) : href;
1616
-
1617
- const handleClick = (event) => {
1618
- if (onClick) {
1619
- onClick(event);
1620
- }
1621
- if (
1622
- !isExternalLink &&
1623
- href &&
1624
- event.button === 0 &&
1625
- !event.metaKey &&
1626
- !event.ctrlKey &&
1627
- !event.shiftKey &&
1628
- !event.altKey &&
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
- return (
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 = { LocalizedLink, checkIsExternalLink };
1254
+ module.exports = { Link, checkIsExternalLink };
1647
1255
  ```
1648
1256
 
1649
- #### Funktionsweise
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 Locale**:
1654
- Der Hook `useLocale` liefert die aktuelle Locale.
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 fügt `getLocalizedUrl` der URL das aktuelle Locale-Präfix hinzu.
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 dem benutzerdefinierten Klick-Handler zurück.
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 Ihren Code robuster zu machen.
1304
+ Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und Ihre Codebasis robuster zu machen.
1665
1305
 
1666
- ![Autocompletion](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
1306
+ ![Autovervollständigung](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
1667
1307
 
1668
- ![Translation error](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
1308
+ ![Übersetzungsfehler](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
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", // Einschluss der automatisch generierten Typen
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. So vermeiden Sie, diese versehentlich in Ihr Git-Repository zu committen.
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
- Um dies zu tun, können Sie die folgenden Anweisungen zu Ihrer `.gitignore`-Datei hinzufügen:
1334
+ Dazu können Sie die folgenden Anweisungen in Ihre `.gitignore`-Datei einfügen:
1695
1335
 
1696
1336
  ```plaintext
1697
- # Ignoriere die von Intlayer generierten Dateien
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
- [Im VS Code Marketplace installieren](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
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** des übersetzten Inhalts.
1351
+ - **Inline-Vorschauen** von übersetzten Inhalten.
1712
1352
  - **Schnellaktionen**, um Übersetzungen einfach zu erstellen und zu aktualisieren.
1713
1353
 
1714
- Für weitere Details zur Nutzung der Erweiterung lesen Sie bitte die [Intlayer VS Code Erweiterungsdokumentation](https://intlayer.org/doc/vs-code-extension).
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
- ### Weiterführende Schritte
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 mit dem [CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_CMS.md) auslagern.
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
  ---