@intlayer/docs 7.5.11 → 7.5.12

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 (227) hide show
  1. package/blog/ar/intlayer_with_i18next.md +0 -2
  2. package/blog/ar/intlayer_with_next-i18next.md +0 -2
  3. package/blog/ar/intlayer_with_react-i18next.md +0 -2
  4. package/blog/de/intlayer_with_i18next.md +0 -45
  5. package/blog/de/intlayer_with_next-i18next.md +0 -46
  6. package/blog/de/intlayer_with_react-i18next.md +0 -2
  7. package/blog/en/intlayer_with_i18next.md +0 -46
  8. package/blog/en/intlayer_with_next-i18next.md +0 -48
  9. package/blog/en/intlayer_with_next-intl.md +0 -44
  10. package/blog/en/intlayer_with_react-i18next.md +0 -44
  11. package/blog/en/intlayer_with_react-intl.md +0 -42
  12. package/blog/en/intlayer_with_vue-i18n.md +0 -44
  13. package/blog/en-GB/intlayer_with_i18next.md +0 -45
  14. package/blog/en-GB/intlayer_with_next-i18next.md +0 -47
  15. package/blog/en-GB/intlayer_with_next-intl.md +0 -42
  16. package/blog/en-GB/intlayer_with_react-i18next.md +0 -43
  17. package/blog/en-GB/intlayer_with_react-intl.md +0 -42
  18. package/blog/en-GB/intlayer_with_vue-i18n.md +0 -46
  19. package/blog/es/intlayer_with_i18next.md +0 -45
  20. package/blog/es/intlayer_with_next-i18next.md +0 -47
  21. package/blog/es/intlayer_with_next-intl.md +0 -42
  22. package/blog/es/intlayer_with_react-i18next.md +0 -43
  23. package/blog/es/intlayer_with_react-intl.md +0 -42
  24. package/blog/es/intlayer_with_vue-i18n.md +0 -46
  25. package/blog/fr/intlayer_with_i18next.md +0 -45
  26. package/blog/fr/intlayer_with_next-i18next.md +0 -47
  27. package/blog/fr/intlayer_with_next-intl.md +0 -42
  28. package/blog/fr/intlayer_with_react-i18next.md +0 -43
  29. package/blog/fr/intlayer_with_react-intl.md +0 -42
  30. package/blog/fr/intlayer_with_vue-i18n.md +0 -46
  31. package/blog/hi/intlayer_with_i18next.md +0 -2
  32. package/blog/hi/intlayer_with_next-i18next.md +0 -2
  33. package/blog/hi/intlayer_with_react-i18next.md +0 -2
  34. package/blog/id/intlayer_with_i18next.md +0 -2
  35. package/blog/id/intlayer_with_next-i18next.md +0 -2
  36. package/blog/id/intlayer_with_react-i18next.md +0 -2
  37. package/blog/it/intlayer_with_i18next.md +0 -2
  38. package/blog/it/intlayer_with_next-i18next.md +0 -2
  39. package/blog/it/intlayer_with_react-i18next.md +0 -2
  40. package/blog/ja/intlayer_with_i18next.md +0 -45
  41. package/blog/ja/intlayer_with_next-i18next.md +0 -46
  42. package/blog/ja/intlayer_with_next-intl.md +0 -42
  43. package/blog/ja/intlayer_with_react-i18next.md +0 -42
  44. package/blog/ja/intlayer_with_react-intl.md +0 -42
  45. package/blog/ja/intlayer_with_vue-i18n.md +0 -46
  46. package/blog/ko/intlayer_with_i18next.md +0 -2
  47. package/blog/ko/intlayer_with_next-i18next.md +0 -2
  48. package/blog/ko/intlayer_with_react-i18next.md +0 -1
  49. package/blog/pl/intlayer_with_i18next.md +0 -45
  50. package/blog/pl/intlayer_with_next-i18next.md +0 -46
  51. package/blog/pl/intlayer_with_next-intl.md +0 -42
  52. package/blog/pl/intlayer_with_react-i18next.md +0 -43
  53. package/blog/pl/intlayer_with_react-intl.md +0 -42
  54. package/blog/pl/intlayer_with_vue-i18n.md +0 -46
  55. package/blog/pt/intlayer_with_i18next.md +0 -2
  56. package/blog/pt/intlayer_with_next-i18next.md +0 -2
  57. package/blog/pt/intlayer_with_react-i18next.md +0 -2
  58. package/blog/ru/intlayer_with_i18next.md +0 -45
  59. package/blog/ru/intlayer_with_next-i18next.md +0 -47
  60. package/blog/ru/intlayer_with_next-intl.md +0 -42
  61. package/blog/ru/intlayer_with_react-i18next.md +0 -43
  62. package/blog/ru/intlayer_with_react-intl.md +0 -42
  63. package/blog/ru/intlayer_with_vue-i18n.md +0 -46
  64. package/blog/tr/intlayer_with_i18next.md +0 -2
  65. package/blog/tr/intlayer_with_next-i18next.md +0 -1
  66. package/blog/tr/intlayer_with_react-i18next.md +0 -2
  67. package/blog/vi/intlayer_with_i18next.md +0 -2
  68. package/blog/vi/intlayer_with_next-i18next.md +0 -2
  69. package/blog/vi/intlayer_with_react-i18next.md +0 -2
  70. package/blog/zh/intlayer_with_i18next.md +0 -2
  71. package/blog/zh/intlayer_with_next-i18next.md +0 -2
  72. package/blog/zh/intlayer_with_react-i18next.md +0 -2
  73. package/blog/zh/intlayer_with_vue-i18n.md +0 -46
  74. package/dist/cjs/generated/blog.entry.cjs +58 -29
  75. package/dist/cjs/generated/blog.entry.cjs.map +1 -1
  76. package/dist/cjs/generated/docs.entry.cjs +218 -99
  77. package/dist/cjs/generated/docs.entry.cjs.map +1 -1
  78. package/dist/cjs/generated/frequentQuestions.entry.cjs +30 -15
  79. package/dist/cjs/generated/frequentQuestions.entry.cjs.map +1 -1
  80. package/dist/cjs/generated/legal.entry.cjs +4 -2
  81. package/dist/cjs/generated/legal.entry.cjs.map +1 -1
  82. package/dist/esm/generated/blog.entry.mjs +58 -29
  83. package/dist/esm/generated/blog.entry.mjs.map +1 -1
  84. package/dist/esm/generated/docs.entry.mjs +218 -99
  85. package/dist/esm/generated/docs.entry.mjs.map +1 -1
  86. package/dist/esm/generated/frequentQuestions.entry.mjs +30 -15
  87. package/dist/esm/generated/frequentQuestions.entry.mjs.map +1 -1
  88. package/dist/esm/generated/legal.entry.mjs +4 -2
  89. package/dist/esm/generated/legal.entry.mjs.map +1 -1
  90. package/dist/types/generated/blog.entry.d.ts.map +1 -1
  91. package/dist/types/generated/docs.entry.d.ts +1 -0
  92. package/dist/types/generated/docs.entry.d.ts.map +1 -1
  93. package/dist/types/generated/frequentQuestions.entry.d.ts.map +1 -1
  94. package/dist/types/generated/legal.entry.d.ts.map +1 -1
  95. package/docs/ar/intlayer_with_next-i18next.md +0 -1
  96. package/docs/ar/intlayer_with_nextjs_14.md +28 -0
  97. package/docs/ar/intlayer_with_nextjs_15.md +28 -0
  98. package/docs/ar/intlayer_with_nextjs_16.md +28 -0
  99. package/docs/ar/intlayer_with_nextjs_no_locale_path.md +1159 -0
  100. package/docs/ar/plugins/sync-json.md +6 -2
  101. package/docs/de/intlayer_with_next-i18next.md +0 -1
  102. package/docs/de/intlayer_with_nextjs_14.md +28 -0
  103. package/docs/de/intlayer_with_nextjs_15.md +28 -0
  104. package/docs/de/intlayer_with_nextjs_16.md +28 -0
  105. package/docs/de/intlayer_with_nextjs_no_locale_path.md +1152 -0
  106. package/docs/de/plugins/sync-json.md +6 -2
  107. package/docs/en/intlayer_with_next-i18next.md +0 -1
  108. package/docs/en/intlayer_with_nextjs_14.md +28 -0
  109. package/docs/en/intlayer_with_nextjs_15.md +28 -0
  110. package/docs/en/intlayer_with_nextjs_16.md +31 -1
  111. package/docs/en/intlayer_with_nextjs_no_locale_path.md +1132 -0
  112. package/docs/en/plugins/sync-json.md +6 -2
  113. package/docs/en-GB/intlayer_with_next-i18next.md +0 -1
  114. package/docs/en-GB/intlayer_with_nextjs_14.md +28 -0
  115. package/docs/en-GB/intlayer_with_nextjs_15.md +28 -0
  116. package/docs/en-GB/intlayer_with_nextjs_16.md +28 -0
  117. package/docs/en-GB/intlayer_with_nextjs_no_locale_path.md +1154 -0
  118. package/docs/en-GB/plugins/sync-json.md +6 -2
  119. package/docs/es/intlayer_with_next-i18next.md +0 -1
  120. package/docs/es/intlayer_with_nextjs_14.md +28 -0
  121. package/docs/es/intlayer_with_nextjs_15.md +28 -0
  122. package/docs/es/intlayer_with_nextjs_16.md +28 -0
  123. package/docs/es/intlayer_with_nextjs_no_locale_path.md +1143 -0
  124. package/docs/es/plugins/sync-json.md +6 -2
  125. package/docs/fr/intlayer_with_next-i18next.md +0 -1
  126. package/docs/fr/intlayer_with_nextjs_14.md +28 -0
  127. package/docs/fr/intlayer_with_nextjs_15.md +28 -0
  128. package/docs/fr/intlayer_with_nextjs_16.md +28 -0
  129. package/docs/fr/intlayer_with_nextjs_no_locale_path.md +1174 -0
  130. package/docs/fr/plugins/sync-json.md +9 -5
  131. package/docs/hi/intlayer_with_next-i18next.md +0 -1
  132. package/docs/hi/intlayer_with_nextjs_14.md +28 -0
  133. package/docs/hi/intlayer_with_nextjs_15.md +28 -0
  134. package/docs/hi/intlayer_with_nextjs_16.md +28 -0
  135. package/docs/hi/intlayer_with_nextjs_no_locale_path.md +1151 -0
  136. package/docs/hi/plugins/sync-json.md +6 -2
  137. package/docs/id/intlayer_with_next-i18next.md +0 -1
  138. package/docs/id/intlayer_with_nextjs_14.md +28 -0
  139. package/docs/id/intlayer_with_nextjs_15.md +28 -0
  140. package/docs/id/intlayer_with_nextjs_16.md +28 -0
  141. package/docs/id/intlayer_with_nextjs_no_locale_path.md +1154 -0
  142. package/docs/id/plugins/sync-json.md +6 -2
  143. package/docs/it/intlayer_with_next-i18next.md +0 -1
  144. package/docs/it/intlayer_with_nextjs_14.md +28 -0
  145. package/docs/it/intlayer_with_nextjs_15.md +28 -0
  146. package/docs/it/intlayer_with_nextjs_16.md +28 -0
  147. package/docs/it/intlayer_with_nextjs_no_locale_path.md +1148 -0
  148. package/docs/it/plugins/sync-json.md +6 -2
  149. package/docs/ja/intlayer_with_next-i18next.md +0 -1
  150. package/docs/ja/intlayer_with_nextjs_14.md +28 -0
  151. package/docs/ja/intlayer_with_nextjs_15.md +28 -0
  152. package/docs/ja/intlayer_with_nextjs_16.md +28 -0
  153. package/docs/ja/intlayer_with_nextjs_no_locale_path.md +1222 -0
  154. package/docs/ja/plugins/sync-json.md +6 -2
  155. package/docs/ko/intlayer_with_next-i18next.md +0 -1
  156. package/docs/ko/intlayer_with_nextjs_14.md +28 -0
  157. package/docs/ko/intlayer_with_nextjs_15.md +28 -0
  158. package/docs/ko/intlayer_with_nextjs_16.md +28 -0
  159. package/docs/ko/intlayer_with_nextjs_no_locale_path.md +1205 -0
  160. package/docs/ko/plugins/sync-json.md +6 -2
  161. package/docs/pl/intlayer_with_next-i18next.md +0 -1
  162. package/docs/pl/intlayer_with_nextjs_14.md +28 -0
  163. package/docs/pl/intlayer_with_nextjs_15.md +28 -0
  164. package/docs/pl/intlayer_with_nextjs_16.md +28 -0
  165. package/docs/pl/intlayer_with_nextjs_no_locale_path.md +1149 -0
  166. package/docs/pl/plugins/sync-json.md +6 -2
  167. package/docs/pt/intlayer_with_next-i18next.md +0 -1
  168. package/docs/pt/intlayer_with_nextjs_14.md +28 -0
  169. package/docs/pt/intlayer_with_nextjs_15.md +28 -0
  170. package/docs/pt/intlayer_with_nextjs_16.md +28 -0
  171. package/docs/pt/intlayer_with_nextjs_no_locale_path.md +1152 -0
  172. package/docs/pt/plugins/sync-json.md +6 -2
  173. package/docs/ru/intlayer_with_next-i18next.md +0 -1
  174. package/docs/ru/intlayer_with_nextjs_14.md +28 -0
  175. package/docs/ru/intlayer_with_nextjs_15.md +28 -0
  176. package/docs/ru/intlayer_with_nextjs_16.md +28 -0
  177. package/docs/ru/intlayer_with_nextjs_no_locale_path.md +1204 -0
  178. package/docs/ru/plugins/sync-json.md +6 -2
  179. package/docs/tr/intlayer_with_next-i18next.md +0 -1
  180. package/docs/tr/intlayer_with_nextjs_14.md +28 -0
  181. package/docs/tr/intlayer_with_nextjs_15.md +28 -0
  182. package/docs/tr/intlayer_with_nextjs_16.md +28 -0
  183. package/docs/tr/intlayer_with_nextjs_no_locale_path.md +1159 -0
  184. package/docs/tr/plugins/sync-json.md +6 -2
  185. package/docs/uk/compiler.md +133 -0
  186. package/docs/uk/component_i18n.md +194 -0
  187. package/docs/uk/intlayer_with_nextjs_14.md +1646 -0
  188. package/docs/uk/intlayer_with_nextjs_15.md +1910 -0
  189. package/docs/uk/intlayer_with_nextjs_16.md +1763 -0
  190. package/docs/uk/intlayer_with_nextjs_no_locale_path.md +1159 -0
  191. package/docs/uk/intlayer_with_react_native+expo.md +715 -0
  192. package/docs/uk/packages/intlayer/getConfiguration.md +145 -0
  193. package/docs/uk/vs_code_extension.md +133 -0
  194. package/docs/vi/intlayer_with_next-i18next.md +0 -1
  195. package/docs/vi/intlayer_with_nextjs_14.md +28 -0
  196. package/docs/vi/intlayer_with_nextjs_15.md +28 -0
  197. package/docs/vi/intlayer_with_nextjs_16.md +28 -0
  198. package/docs/vi/intlayer_with_nextjs_no_locale_path.md +1151 -0
  199. package/docs/vi/plugins/sync-json.md +6 -2
  200. package/docs/zh/intlayer_with_next-i18next.md +0 -1
  201. package/docs/zh/intlayer_with_nextjs_14.md +28 -0
  202. package/docs/zh/intlayer_with_nextjs_15.md +28 -0
  203. package/docs/zh/intlayer_with_nextjs_16.md +28 -0
  204. package/docs/zh/intlayer_with_nextjs_no_locale_path.md +1206 -0
  205. package/docs/zh/plugins/sync-json.md +9 -5
  206. package/frequent_questions/ar/SSR_Next_no_[locale].md +1 -1
  207. package/frequent_questions/de/SSR_Next_no_[locale].md +1 -1
  208. package/frequent_questions/en/SSR_Next_no_[locale].md +1 -1
  209. package/frequent_questions/en-GB/SSR_Next_no_[locale].md +1 -1
  210. package/frequent_questions/es/SSR_Next_no_[locale].md +1 -1
  211. package/frequent_questions/fr/SSR_Next_no_[locale].md +1 -1
  212. package/frequent_questions/hi/SSR_Next_no_[locale].md +1 -1
  213. package/frequent_questions/id/SSR_Next_no_[locale].md +1 -1
  214. package/frequent_questions/it/SSR_Next_no_[locale].md +1 -1
  215. package/frequent_questions/ja/SSR_Next_no_[locale].md +1 -1
  216. package/frequent_questions/ko/SSR_Next_no_[locale].md +1 -1
  217. package/frequent_questions/pl/SSR_Next_no_[locale].md +1 -1
  218. package/frequent_questions/pt/SSR_Next_no_[locale].md +1 -1
  219. package/frequent_questions/ru/SSR_Next_no_[locale].md +1 -1
  220. package/frequent_questions/tr/SSR_Next_no_[locale].md +1 -1
  221. package/frequent_questions/vi/SSR_Next_no_[locale].md +1 -1
  222. package/frequent_questions/zh/SSR_Next_no_[locale].md +1 -1
  223. package/package.json +6 -6
  224. package/src/generated/blog.entry.ts +29 -0
  225. package/src/generated/docs.entry.ts +119 -0
  226. package/src/generated/frequentQuestions.entry.ts +15 -0
  227. package/src/generated/legal.entry.ts +2 -0
@@ -0,0 +1,1152 @@
1
+ ---
2
+ createdAt: 2026-01-10
3
+ updatedAt: 2026-01-10
4
+ title: Wie Sie Ihre Next.js 16-App übersetzen (ohne [locale] im Seitenpfad) – i18n-Anleitung 2026
5
+ description: Erfahren Sie, wie Sie Ihre Next.js 16-Website mehrsprachig machen, ohne [locale] im Seitenpfad. Folgen Sie der Dokumentation, um sie zu internationalisieren (i18n) und zu übersetzen.
6
+ keywords:
7
+ - Internationalisierung
8
+ - Dokumentation
9
+ - Intlayer
10
+ - Next.js 16
11
+ - JavaScript
12
+ - React
13
+ slugs:
14
+ - doc
15
+ - environment
16
+ - nextjs
17
+ - no-locale-path
18
+ applicationTemplate: https://github.com/aymericzip/intlayer-next-no-lolale-path-template
19
+ youtubeVideo: https://www.youtube.com/watch?v=e_PPG7PTqGU
20
+ history:
21
+ - version: 1.0.0
22
+ date: 2026-01-10
23
+ changes: Erstveröffentlichung
24
+ ---
25
+
26
+ # Übersetzen Sie Ihre Next.js 16-Website (ohne [locale] im Seitenpfad) mit Intlayer | Internationalisierung (i18n)
27
+
28
+ <Tab defaultTab="video">
29
+ <TabItem label="Video" value="video">
30
+
31
+ <iframe title="Die beste i18n-Lösung für Next.js? Entdecken Sie Intlayer" class="m-auto aspect-16/9 w-full overflow-hidden rounded-lg border-0" allow="autoplay; gyroscope;" loading="lazy" width="1080" height="auto" src="https://www.youtube.com/embed/e_PPG7PTqGU?autoplay=0&amp;origin=http://intlayer.org&amp;controls=0&amp;rel=1"/>
32
+
33
+ </TabItem>
34
+ <TabItem label="Code" value="code">
35
+
36
+ <iframe
37
+ src="https://stackblitz.com/github/aymericzip/intlayer-next-16-no-locale-path-template?embed=1&ctl=1&file=intlayer.config.ts"
38
+ className="m-auto overflow-hidden rounded-lg border-0 max-md:size-full max-md:h-[700px] md:aspect-16/9 md:w-full"
39
+ title="Demo CodeSandbox – So internationalisierst du deine Anwendung mit Intlayer"
40
+ sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"
41
+ loading="lazy"
42
+ />
43
+
44
+ </TabItem>
45
+ </Tab>
46
+
47
+ Siehe [Application Template](https://github.com/aymericzip/intlayer-next-no-lolale-path-template) auf GitHub.
48
+
49
+ ## Inhaltsverzeichnis
50
+
51
+ <TOC/>
52
+
53
+ ## Was ist Intlayer?
54
+
55
+ **Intlayer** ist eine innovative, Open-Source-Internationalisierungsbibliothek (i18n), die entwickelt wurde, um die Unterstützung mehrerer Sprachen in modernen Webanwendungen zu vereinfachen. Intlayer lässt sich nahtlos in das aktuelle **Next.js 16**-Framework integrieren, einschließlich dessen leistungsstarkem **App Router**. Sie ist darauf optimiert, mit **Server Components** für effizientes Rendering zusammenzuarbeiten und ist vollständig kompatibel mit [**Turbopack**](https://nextjs.org/docs/architecture/turbopack).
56
+
57
+ Mit Intlayer können Sie:
58
+
59
+ - **Übersetzungen einfach verwalten** mithilfe deklarativer Dictionaries auf Komponentenebene.
60
+ - **Metadaten, Routen und Inhalte dynamisch lokalisieren**.
61
+ - **Auf Übersetzungen sowohl in Client- als auch in Server-Komponenten zugreifen**.
62
+ - **TypeScript-Unterstützung sicherstellen** mit automatisch generierten Typen, die Autocompletion und Fehlererkennung verbessern.
63
+ - **Profitieren Sie von erweiterten Funktionen**, wie dynamische Locale-Erkennung und -Wechsel.
64
+
65
+ > Intlayer ist mit Next.js 12, 13, 14 und 16 kompatibel. Wenn Sie den Next.js Page Router verwenden, können Sie diesen [Leitfaden](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_with_nextjs_page_router.md) zu Rate ziehen. Für Next.js 12, 13 und 14 mit App Router lesen Sie diesen [Leitfaden](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/intlayer_with_nextjs_14.md).
66
+
67
+ ---
68
+
69
+ ## Schritt-für-Schritt-Anleitung zur Einrichtung von Intlayer in einer Next.js-Anwendung
70
+
71
+ ### Schritt 1: Abhängigkeiten installieren
72
+
73
+ Installieren Sie die erforderlichen Pakete mit npm:
74
+
75
+ ```bash packageManager="npm"
76
+ npm install intlayer next-intlayer
77
+ npx intlayer init
78
+ ```
79
+
80
+ ```bash packageManager="pnpm"
81
+ pnpm add intlayer next-intlayer
82
+ pnpm intlayer init
83
+ ```
84
+
85
+ ```bash packageManager="yarn"
86
+ yarn add intlayer next-intlayer
87
+ yarn intlayer init
88
+ ```
89
+
90
+ ```bash packageManager="bun"
91
+ bun add intlayer next-intlayer
92
+ bunx intlayer init
93
+ ```
94
+
95
+ - **intlayer**
96
+
97
+ Das Kernpaket, das Internationalisierungswerkzeuge für Konfigurationsmanagement, Übersetzung, [Inhaltsdeklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/content_file.md), Transpilation und [CLI-Befehle](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/cli/index.md) bereitstellt.
98
+
99
+ - **next-intlayer**
100
+
101
+ Das Paket, das Intlayer mit Next.js integriert. Es stellt Context-Provider und Hooks für die Internationalisierung mit Next.js bereit. Zusätzlich enthält es das Next.js-Plugin zur Integration von Intlayer mit [Webpack](https://webpack.js.org/) oder [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack) sowie einen Proxy zur Erkennung der bevorzugten Locale des Benutzers, zur Verwaltung von Cookies und zur Behandlung von URL-Weiterleitungen.
102
+
103
+ ### Schritt 2: Konfigurieren Sie Ihr Projekt
104
+
105
+ Hier ist die endgültige Struktur, die wir erstellen werden:
106
+
107
+ ```bash
108
+ .
109
+ ├── src
110
+ │ ├── app
111
+ │ │ ├── layout.tsx
112
+ │ │ ├── page.content.ts
113
+ │ │ └── page.tsx
114
+ │ ├── components
115
+ │ │ ├── clientComponentExample
116
+ │ │ │ ├── client-component-example.content.ts
117
+ │ │ │ └── ClientComponentExample.tsx
118
+ │ │ ├── localeSwitcher
119
+ │ │ │ ├── localeSwitcher.content.ts
120
+ │ │ │ └── LocaleSwitcher.tsx
121
+ │ │ └── serverComponentExample
122
+ │ │ ├── server-component-example.content.ts
123
+ │ │ └── ServerComponentExample.tsx
124
+ │ └── proxy.ts
125
+ ├── intlayer.config.ts
126
+ ├── next.config.ts
127
+ ├── package.json
128
+ └── tsconfig.json
129
+ ```
130
+
131
+ > Wenn du kein locale routing möchtest, kann Intlayer als einfacher Provider / Hook verwendet werden. Siehe [diese Anleitung](https://github.com/aymericzip/intlayer/blob/main/docs/docs/{{locale}}/intlayer_with_nextjs_no_locale_path.md) für weitere Details.
132
+
133
+ Erstelle eine Konfigurationsdatei, um die Sprachen deiner Anwendung zu konfigurieren:
134
+
135
+ ```typescript fileName="intlayer.config.ts" codeFormat="typescript"
136
+ import { Locales, type IntlayerConfig } from "intlayer";
137
+
138
+ const config: IntlayerConfig = {
139
+ internationalization: {
140
+ locales: [
141
+ Locales.ENGLISH,
142
+ Locales.FRENCH,
143
+ Locales.SPANISH,
144
+ // Weitere Locales
145
+ ],
146
+ defaultLocale: Locales.ENGLISH,
147
+ },
148
+ routing: {
149
+ mode: "search-params", // oder `no-prefix` - Nützlich für die Erkennung durch Middleware
150
+ },
151
+ };
152
+
153
+ export default config;
154
+ ```
155
+
156
+ ```javascript fileName="intlayer.config.mjs" codeFormat="esm"
157
+ import { Locales } from "intlayer";
158
+
159
+ /** @type {import('intlayer').IntlayerConfig} */
160
+ const config = {
161
+ internationalization: {
162
+ locales: [
163
+ Locales.ENGLISH,
164
+ Locales.FRENCH,
165
+ Locales.SPANISH,
166
+ // Weitere Locales
167
+ ],
168
+ defaultLocale: Locales.ENGLISH,
169
+ },
170
+ routing: {
171
+ mode: "search-params", // oder `no-prefix` - Nützlich für die Erkennung durch Middleware
172
+ },
173
+ };
174
+
175
+ export default config;
176
+ ```
177
+
178
+ ```javascript fileName="intlayer.config.cjs" codeFormat="commonjs"
179
+ const { Locales } = require("intlayer");
180
+
181
+ /** @type {import('intlayer').IntlayerConfig} */
182
+ const config = {
183
+ internationalization: {
184
+ locales: [
185
+ Locales.ENGLISH,
186
+ Locales.FRENCH,
187
+ Locales.SPANISH,
188
+ // Deine weiteren Locales
189
+ ],
190
+ defaultLocale: Locales.ENGLISH,
191
+ },
192
+ routing: {
193
+ mode: "search-params", // oder `no-prefix` - Nützlich für die Middleware-Erkennung
194
+ },
195
+ };
196
+
197
+ module.exports = config;
198
+ ```
199
+
200
+ Über diese Konfigurationsdatei können Sie lokalisierte URLs, Proxy-Weiterleitungen, Cookie-Namen, den Speicherort und die Erweiterung Ihrer Inhaltsdeklarationen, das Deaktivieren der Intlayer-Logs in der Konsole und mehr festlegen. Für eine vollständige Liste der verfügbaren Parameter siehe die [Konfigurationsdokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/configuration.md).
201
+
202
+ ### Schritt 3: Intlayer in Ihre Next.js-Konfiguration integrieren
203
+
204
+ Konfigurieren Sie Ihr Next.js-Setup so, dass Intlayer verwendet wird:
205
+
206
+ ```typescript fileName="next.config.ts" codeFormat="typescript"
207
+ import type { NextConfig } from "next";
208
+ import { withIntlayer } from "next-intlayer/server";
209
+
210
+ const nextConfig: NextConfig = {
211
+ /* Konfigurationsoptionen hier */
212
+ };
213
+
214
+ export default withIntlayer(nextConfig);
215
+ ```
216
+
217
+ ```typescript fileName="next.config.mjs" codeFormat="esm"
218
+ import { withIntlayer } from "next-intlayer/server";
219
+
220
+ /** @type {import('next').NextConfig} */
221
+ const nextConfig = {
222
+ /* Konfigurationsoptionen hier */
223
+ };
224
+
225
+ export default withIntlayer(nextConfig);
226
+ ```
227
+
228
+ ```typescript fileName="next.config.cjs" codeFormat="commonjs"
229
+ const { withIntlayer } = require("next-intlayer/server");
230
+
231
+ /** @type {import('next').NextConfig} */
232
+ const nextConfig = {
233
+ /* Konfigurationsoptionen hier */
234
+ };
235
+
236
+ module.exports = withIntlayer(nextConfig);
237
+ ```
238
+
239
+ > Das `withIntlayer()` Next.js-Plugin dient zur Integration von Intlayer in Next.js. Es stellt den Aufbau der Content-Deklarationsdateien sicher und überwacht diese im Entwicklungsmodus. Es legt Intlayer-Umgebungsvariablen innerhalb der [Webpack](https://webpack.js.org/) oder [Turbopack](https://nextjs.org/docs/app/api-reference/turbopack)-Umgebungen fest. Zusätzlich stellt es Aliase zur Optimierung der Performance bereit und gewährleistet die Kompatibilität mit Server-Komponenten.
240
+ >
241
+ > Die Funktion `withIntlayer()` ist eine Promise-Funktion. Sie ermöglicht die Vorbereitung der Intlayer-Dictionaries, bevor der Build startet. Wenn Sie sie mit anderen Plugins verwenden möchten, können Sie sie awaiten. Beispiel:
242
+ >
243
+ > ```ts
244
+ > const nextConfig = await withIntlayer(nextConfig);
245
+ > const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
246
+ >
247
+ > export default nextConfigWithOtherPlugins;
248
+ > ```
249
+ >
250
+ > Wenn Sie es synchron verwenden möchten, können Sie die Funktion `withIntlayerSync()` verwenden. Beispiel:
251
+ >
252
+ > ```ts
253
+ > const nextConfig = withIntlayerSync(nextConfig);
254
+ > const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
255
+ >
256
+ > export default nextConfigWithOtherPlugins;
257
+ > ```
258
+
259
+ > Intlayer erkennt automatisch, ob Ihr Projekt **webpack** oder **Turbopack** verwendet, basierend auf den Kommandozeilen-Flags `--webpack`, `--turbo` oder `--turbopack` sowie Ihrer aktuellen **Next.js-Version**.
260
+ >
261
+ > Ab `next>=16`, wenn Sie **Rspack** verwenden, müssen Sie Intlayer explizit zwingen, die webpack-Konfiguration zu verwenden, indem Sie Turbopack deaktivieren:
262
+ >
263
+ > ```ts
264
+ > withRspack(withIntlayer(nextConfig, { enableTurbopack: false }));
265
+ > ```
266
+
267
+ ### Schritt 4: Dynamische Locale-Routen definieren
268
+
269
+ Entfernen Sie alles aus `RootLayout` und ersetzen Sie es durch den folgenden Code:
270
+
271
+ ```tsx {3} fileName="src/app/layout.tsx" codeFormat="typescript"
272
+ import type { Metadata } from "next";
273
+ import type { ReactNode } from "react";
274
+ import "./globals.css";
275
+ import { IntlayerClientProvider, LocalPromiseParams } from "next-intlayer";
276
+ import { getHTMLTextDir, getIntlayer } from "intlayer";
277
+ import { getLocale } from "next-intlayer/server";
278
+ export { generateStaticParams } from "next-intlayer";
279
+
280
+ export const generateMetadata = async ({
281
+ params,
282
+ }: LocalPromiseParams): Promise<Metadata> => {
283
+ const { locale } = await params;
284
+ const { title, description, keywords } = getIntlayer("metadata", locale);
285
+
286
+ return {
287
+ title,
288
+ description,
289
+ keywords,
290
+ };
291
+ };
292
+
293
+ const RootLayout = async ({
294
+ children,
295
+ }: Readonly<{
296
+ children: ReactNode;
297
+ }>) => {
298
+ const locale = await getLocale();
299
+
300
+ return (
301
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
302
+ <IntlayerClientProvider defaultLocale={locale}>
303
+ <body>{children}</body>
304
+ </IntlayerClientProvider>
305
+ </html>
306
+ );
307
+ };
308
+
309
+ export default RootLayout;
310
+ ```
311
+
312
+ ```jsx {3} fileName="src/app/layout.mjx" codeFormat="esm"
313
+ import "./globals.css";
314
+ import { IntlayerClientProvider } from "next-intlayer";
315
+ import { getHTMLTextDir, getIntlayer } from "intlayer";
316
+ import { getLocale } from "next-intlayer/server";
317
+ export { generateStaticParams } from "next-intlayer";
318
+
319
+ export const generateMetadata = async ({ params }) => {
320
+ const { locale } = await params;
321
+ const { title, description, keywords } = getIntlayer("metadata", locale);
322
+
323
+ return {
324
+ title,
325
+ description,
326
+ keywords,
327
+ };
328
+ };
329
+
330
+ const RootLayout = async ({ children }) => {
331
+ const locale = await getLocale();
332
+
333
+ return (
334
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
335
+ <IntlayerClientProvider defaultLocale={locale}>
336
+ <body>{children}</body>
337
+ </IntlayerClientProvider>
338
+ </html>
339
+ );
340
+ };
341
+
342
+ export default RootLayout;
343
+ ```
344
+
345
+ ```jsx {1,8} fileName="src/app/layout.csx" codeFormat="commonjs"
346
+ require("./globals.css");
347
+ const { IntlayerClientProvider } = require("next-intlayer");
348
+ const { getHTMLTextDir, getIntlayer } = require("intlayer");
349
+ const { getLocale } = require("next-intlayer/server");
350
+ const { generateStaticParams } = require("next-intlayer");
351
+
352
+ const generateMetadata = async ({ params }) => {
353
+ const { locale } = await params;
354
+ const { title, description, keywords } = getIntlayer("metadata", locale);
355
+
356
+ return {
357
+ title,
358
+ description,
359
+ keywords,
360
+ };
361
+ };
362
+
363
+ const RootLayout = async ({ children }) => {
364
+ const locale = await getLocale();
365
+
366
+ return (
367
+ <html lang={locale} dir={getHTMLTextDir(locale)}>
368
+ <IntlayerClientProvider defaultLocale={locale}>
369
+ <body>{children}</body>
370
+ </IntlayerClientProvider>
371
+ </html>
372
+ );
373
+ };
374
+
375
+ module.exports = {
376
+ default: RootLayout,
377
+ generateStaticParams,
378
+ generateMetadata,
379
+ };
380
+ ```
381
+
382
+ ### Schritt 5: Deklarieren Sie Ihre Inhalte
383
+
384
+ Erstellen und verwalten Sie Ihre Inhaltsdeklarationen, um Übersetzungen zu speichern:
385
+
386
+ ```tsx fileName="src/app/metadata.content.ts" contentDeclarationFormat="typescript"
387
+ import { t, type Dictionary } from "intlayer";
388
+ import { Metadata } from "next";
389
+
390
+ const metadataContent = {
391
+ key: "metadata",
392
+ content: {
393
+ title: t({
394
+ de: "Titel meines Projekts",
395
+ en: "My Project Title",
396
+ fr: "Le Titre de mon Projet",
397
+ es: "El Título de mi Proyecto",
398
+ }),
399
+
400
+ description: t({
401
+ de: "Entdecken Sie unsere innovative Plattform, die darauf ausgelegt ist, Ihren Workflow zu optimieren und die Produktivität zu steigern.",
402
+ en: "Discover our innovative platform designed to streamline your workflow and boost productivity.",
403
+ fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
404
+ es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.",
405
+ }),
406
+
407
+ keywords: t({
408
+ de: ["Innovation", "Produktivität", "Workflow", "SaaS"],
409
+ en: ["innovation", "productivity", "workflow", "SaaS"],
410
+ de: ["Innovation", "Produktivität", "Workflow", "SaaS"],
411
+ fr: ["innovation", "productivité", "flux de travail", "SaaS"],
412
+ es: ["innovación", "productividad", "flujo de trabajo", "SaaS"],
413
+ }),
414
+ },
415
+ } as Dictionary<Metadata>;
416
+
417
+ export default metadataContent;
418
+ ```
419
+
420
+ ```tsx fileName="src/app/metadata.content.mjs" contentDeclarationFormat="typescript"
421
+ import { t, type Dictionary } from "intlayer";
422
+
423
+ /** @type {import('intlayer').Dictionary<import('next').Metadata>} */
424
+ const metadataContent = {
425
+ key: "metadata",
426
+ content: {
427
+ title: t({
428
+ de: "Titel meines Projekts",
429
+ en: "My Project Title",
430
+ fr: "Le Titre de mon Projet",
431
+ es: "El Título de mi Proyecto",
432
+ }),
433
+
434
+ description: t({
435
+ de: "Entdecken Sie unsere innovative Plattform, die darauf ausgelegt ist, Ihren Workflow zu vereinfachen und Ihre Produktivität zu steigern.",
436
+ en: "Discover our innovative platform designed to streamline your workflow and boost productivity.",
437
+ de: "Entdecken Sie unsere innovative Plattform, die entwickelt wurde, um Ihren Workflow zu vereinfachen und Ihre Produktivität zu steigern.",
438
+ fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
439
+ es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.",
440
+ }),
441
+
442
+ keywords: t({
443
+ de: ["innovation", "produktivität", "workflow", "SaaS"],
444
+ en: ["innovation", "productivity", "workflow", "SaaS"],
445
+ fr: ["innovation", "productivité", "flux de travail", "SaaS"],
446
+ es: ["innovación", "productividad", "flujo de trabajo", "SaaS"],
447
+ }),
448
+ },
449
+ };
450
+
451
+ export default metadataContent;
452
+ ```
453
+
454
+ ```javascript fileName="src/app/metadata.content.cjs" contentDeclarationFormat="commonjs"
455
+ const { t } = require("intlayer");
456
+
457
+ /** @type {import('intlayer').Dictionary<import('next').Metadata>} */
458
+ const metadataContent = {
459
+ key: "metadata",
460
+ content: {
461
+ title: t({
462
+ de: "Titel meines Projekts",
463
+ en: "My Project Title",
464
+ fr: "Le Titre de mon Projet",
465
+ es: "El Título de mi Proyecto",
466
+ }),
467
+
468
+ description: t({
469
+ de: "Entdecken Sie unsere innovative Plattform, die entwickelt wurde, um Ihren Arbeitsablauf zu optimieren und die Produktivität zu steigern.",
470
+ en: "Discover our innovative platform designed to streamline your workflow and boost productivity.",
471
+ fr: "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
472
+ es: "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad.",
473
+ }),
474
+
475
+ keywords: t({
476
+ de: ["Innovation", "Produktivität", "Workflow", "SaaS"],
477
+ en: ["innovation", "productivity", "workflow", "SaaS"],
478
+ fr: ["innovation", "productivité", "flux de travail", "SaaS"],
479
+ es: ["innovación", "productividad", "flujo de trabajo", "SaaS"],
480
+ }),
481
+ },
482
+ };
483
+
484
+ module.exports = metadataContent;
485
+ ```
486
+
487
+ ```json fileName="src/app/metadata.content.json" contentDeclarationFormat="json"
488
+ {
489
+ "key": "metadata",
490
+ "content": {
491
+ "title": {
492
+ "nodeType": "translation",
493
+ "translation": {
494
+ "de": "Mein Projekttitel",
495
+ "en": "My Project Title",
496
+ "fr": "Le Titre de mon Projet",
497
+ "es": "El Título de mi Proyecto"
498
+ }
499
+ },
500
+ "description": {
501
+ "nodeType": "translation",
502
+ "translation": {
503
+ "de": "Entdecken Sie unsere innovative Plattform, die darauf ausgelegt ist, Ihren Workflow zu optimieren und die Produktivität zu steigern.",
504
+ "en": "Discover our innovative platform designed to streamline your workflow and boost productivity.",
505
+ "fr": "Découvrez notre plateforme innovante conçue pour simplifier votre flux de travail et booster votre productivité.",
506
+ "es": "Descubra nuestra plataforma innovadora diseñada para simplificar su flujo de trabajo y aumentar su productividad."
507
+ }
508
+ },
509
+ "keywords": {
510
+ "nodeType": "translation",
511
+ "translation": {
512
+ "de": ["Innovation", "Produktivität", "Workflow", "SaaS"],
513
+ "en": ["innovation", "productivity", "workflow", "SaaS"],
514
+ "fr": ["innovation", "productivité", "flux de travail", "SaaS"],
515
+ "es": ["innovación", "productividad", "flujo de trabajo", "SaaS"]
516
+ }
517
+ }
518
+ }
519
+ }
520
+ ```
521
+
522
+ ```tsx fileName="src/app/page.content.ts" contentDeclarationFormat="typescript"
523
+ import { t, type Dictionary } from "intlayer";
524
+
525
+ const pageContent = {
526
+ key: "page",
527
+ content: {
528
+ getStarted: {
529
+ main: t({
530
+ de: "Beginnen Sie mit der Bearbeitung",
531
+ en: "Get started by editing",
532
+ fr: "Commencez par éditer",
533
+ es: "Comience por editar",
534
+ }),
535
+ pageLink: "src/app/page.tsx",
536
+ },
537
+ },
538
+ } satisfies Dictionary;
539
+
540
+ export default pageContent;
541
+ ```
542
+
543
+ ```javascript fileName="src/app/page.content.mjs" contentDeclarationFormat="esm"
544
+ import { t } from "intlayer";
545
+
546
+ // Typdeklaration für Dictionary von intlayer
547
+ /** @type {import('intlayer').Dictionary} */
548
+ const pageContent = {
549
+ key: "page",
550
+ content: {
551
+ getStarted: {
552
+ main: t({
553
+ de: "Beginnen Sie mit dem Bearbeiten",
554
+ en: "Get started by editing",
555
+ fr: "Commencez par éditer",
556
+ es: "Comience por editar",
557
+ }),
558
+ pageLink: "src/app/page.tsx",
559
+ },
560
+ },
561
+ };
562
+
563
+ export default pageContent;
564
+ ```
565
+
566
+ ```javascript fileName="src/app/page.content.cjs" contentDeclarationFormat="commonjs"
567
+ const { t } = require("intlayer");
568
+
569
+ // Typdeklaration für Dictionary von intlayer
570
+ /** @type {import('intlayer').Dictionary} */
571
+ const pageContent = {
572
+ key: "page",
573
+ content: {
574
+ getStarted: {
575
+ main: t({
576
+ de: "Beginnen Sie mit dem Bearbeiten",
577
+ en: "Get started by editing",
578
+ fr: "Commencez par éditer",
579
+ es: "Comience por editar",
580
+ }),
581
+ pageLink: "src/app/page.tsx",
582
+ },
583
+ },
584
+ };
585
+
586
+ module.exports = pageContent;
587
+ ```
588
+
589
+ ```json fileName="src/app/page.content.json" contentDeclarationFormat="json"
590
+ {
591
+ "$schema": "https://intlayer.org/schema.json",
592
+ "key": "page",
593
+ "content": {
594
+ "getStarted": {
595
+ "nodeType": "translation",
596
+ "translation": {
597
+ "de": "Beginnen Sie, indem Sie die Datei bearbeiten",
598
+ "en": "Get started by editing",
599
+ "fr": "Commencez par éditer",
600
+ "es": "Comience por editar"
601
+ }
602
+ },
603
+ "pageLink": "src/app/page.tsx"
604
+ }
605
+ }
606
+ ```
607
+
608
+ > Ihre Content-Deklarationen können überall in Ihrer Anwendung definiert werden, sobald sie in das Verzeichnis `contentDir` (standardmäßig `./src`) aufgenommen sind. Sie müssen zudem der Dateiendung für Content-Deklarationsdateien entsprechen (standardmäßig `.content.{json,ts,tsx,js,jsx,mjs,mjx,cjs,cjx}`).
609
+
610
+ > Weitere Informationen finden Sie in der [Dokumentation zur Content-Deklaration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/dictionary/content_file.md).
611
+
612
+ ### Schritt 6: Inhalte in Ihrem Code nutzen
613
+
614
+ Greifen Sie in Ihrer gesamten Anwendung auf Ihre Content-Dictionaries zu:
615
+
616
+ ```tsx fileName="src/app/page.tsx" codeFormat="typescript"
617
+ import type { FC } from "react";
618
+ import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample";
619
+ import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample";
620
+ import {
621
+ IntlayerServerProvider,
622
+ useIntlayer,
623
+ getLocale,
624
+ } from "next-intlayer/server";
625
+ import { NextPage } from "next";
626
+ import { headers, cookies } from "next/headers";
627
+
628
+ const PageContent: FC = () => {
629
+ const content = useIntlayer("page");
630
+
631
+ return (
632
+ <>
633
+ <p>{content.getStarted.main}</p>
634
+ <code>{content.getStarted.pageLink}</code>
635
+ </>
636
+ );
637
+ };
638
+
639
+ const Page: NextPage = async () => {
640
+ const locale = await getLocale();
641
+
642
+ return (
643
+ <IntlayerServerProvider locale={locale}>
644
+ <PageContent />
645
+ <ServerComponentExample />
646
+ <ClientComponentExample />
647
+ </IntlayerServerProvider>
648
+ );
649
+ };
650
+
651
+ export default Page;
652
+ ```
653
+
654
+ ```jsx fileName="src/app/page.mjx" codeFormat="esm"
655
+ import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample";
656
+ import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample";
657
+ import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
658
+ import { getLocale } from "intlayer";
659
+ import { headers, cookies } from "next/headers";
660
+ import { NextPage } from "next";
661
+
662
+ const Page: NextPage = async () => {
663
+ const content = useIntlayer("page");
664
+
665
+ return (
666
+ <>
667
+ <p>{content.getStarted.main}</p>
668
+ <code>{content.getStarted.pageLink}</code>
669
+ </>
670
+ );
671
+ };
672
+
673
+ const Page = async () => {
674
+
675
+ const locale = await getLocale();
676
+
677
+ return (
678
+ <IntlayerServerProvider locale={locale}>
679
+ <PageContent />
680
+ <ServerComponentExample />
681
+ <ClientComponentExample />
682
+ </IntlayerServerProvider>
683
+ );
684
+ };
685
+
686
+ export default Page;
687
+ ```
688
+
689
+ ```jsx fileName="src/app/page.csx" codeFormat="commonjs"
690
+ import { ClientComponentExample } from "@components/clientComponentExample/ClientComponentExample";
691
+ import { ServerComponentExample } from "@components/serverComponentExample/ServerComponentExample";
692
+ import { IntlayerServerProvider, useIntlayer, getLocale } from "next-intlayer/server";
693
+ import { NextPage } from "next";
694
+ import { headers, cookies } from "next/headers";
695
+
696
+ const Page: NextPage = async () => {
697
+ const content = useIntlayer("page");
698
+
699
+ return (
700
+ <>
701
+ <p>{content.getStarted.main}</p>
702
+ <code>{content.getStarted.pageLink}</code>
703
+ </>
704
+ );
705
+ };
706
+
707
+ const Page: NextPage = async () => {
708
+ const locale = await getLocale();
709
+
710
+ return (
711
+ <IntlayerServerProvider locale={locale}>
712
+ <PageContent />
713
+ <ServerComponentExample />
714
+ <ClientComponentExample />
715
+ </IntlayerServerProvider>
716
+ );
717
+ };
718
+ ```
719
+
720
+ - **`IntlayerClientProvider`** wird verwendet, um die Locale für clientseitige Komponenten bereitzustellen. Es kann in jeder übergeordneten Komponente platziert werden, einschließlich des Layouts. Es wird jedoch empfohlen, es im Layout zu platzieren, da Next.js Layout-Code über Seiten hinweg teilt, was effizienter ist. Durch die Verwendung von `IntlayerClientProvider` im Layout vermeiden Sie, dass es für jede Seite neu initialisiert wird, verbessern die Leistung und behalten einen konsistenten Lokalisierungskontext in Ihrer Anwendung bei.
721
+ - **`IntlayerServerProvider`** wird verwendet, um die locale an die serverseitigen Kinder bereitzustellen. Es kann nicht im Layout gesetzt werden.
722
+
723
+ > Layout und Seite können keinen gemeinsamen Serverkontext teilen, da das Serverkontext-System auf einem pro-Anfrage-Datenspeicher basiert (über [React's cache](https://react.dev/reference/react/cache) Mechanismus), wodurch jeder "Kontext" für verschiedene Segmente der Anwendung neu erstellt wird. Das Platzieren des Providers in einem gemeinsamen Layout würde diese Isolation aufheben und verhindern, dass die Serverkontextwerte korrekt an Ihre Serverkomponenten weitergegeben werden.
724
+
725
+ ```tsx {4,7} fileName="src/components/clientComponentExample/ClientComponentExample.tsx" codeFormat="typescript"
726
+ "use client";
727
+
728
+ import type { FC } from "react";
729
+ import { useIntlayer } from "next-intlayer";
730
+
731
+ export const ClientComponentExample: FC = () => {
732
+ const content = useIntlayer("client-component-example"); // Erstelle die zugehörige Content-Deklaration
733
+
734
+ return (
735
+ <div>
736
+ <h2>{content.title}</h2>
737
+ <p>{content.content}</p>
738
+ </div>
739
+ );
740
+ };
741
+ ```
742
+
743
+ ```jsx {3,6} fileName="src/components/clientComponentExample/ClientComponentExample.mjx" codeFormat="esm"
744
+ "use client";
745
+
746
+ import { useIntlayer } from "next-intlayer";
747
+
748
+ const ClientComponentExample = () => {
749
+ const content = useIntlayer("client-component-example"); // Erstelle die zugehörige Content-Deklaration
750
+
751
+ return (
752
+ <div>
753
+ <h2>{content.title}</h2>
754
+ <p>{content.content}</p>
755
+ </div>
756
+ );
757
+ };
758
+ ```
759
+
760
+ ```jsx {3,6} fileName="src/components/clientComponentExample/ClientComponentExample.csx" codeFormat="commonjs"
761
+ "use client";
762
+
763
+ const { useIntlayer } = require("next-intlayer");
764
+
765
+ const ClientComponentExample = () => {
766
+ const content = useIntlayer("client-component-example"); // Erstelle die zugehörige Inhaltsdeklaration
767
+
768
+ return (
769
+ <div>
770
+ <h2>{content.title}</h2>
771
+ <p>{content.content}</p>
772
+ </div>
773
+ );
774
+ };
775
+ ```
776
+
777
+ ```tsx {2} fileName="src/components/serverComponentExample/ServerComponentExample.tsx" codeFormat="typescript"
778
+ import type { FC } from "react";
779
+ import { useIntlayer } from "next-intlayer/server";
780
+
781
+ export const ServerComponentExample: FC = () => {
782
+ const content = useIntlayer("server-component-example"); // Erstelle die zugehörige Inhaltsdeklaration
783
+
784
+ return (
785
+ <div>
786
+ <h2>{content.title}</h2>
787
+ <p>{content.content}</p>
788
+ </div>
789
+ );
790
+ };
791
+ ```
792
+
793
+ ```jsx {1} fileName="src/components/serverComponentExample/ServerComponentExample.mjx" codeFormat="esm"
794
+ import { useIntlayer } from "next-intlayer/server";
795
+
796
+ const ServerComponentExample = () => {
797
+ const content = useIntlayer("server-component-example"); // Erstelle zugehörige Content-Deklaration
798
+
799
+ return (
800
+ <div>
801
+ <h2>{content.title}</h2>
802
+ <p>{content.content}</p>
803
+ </div>
804
+ );
805
+ };
806
+ ```
807
+
808
+ ```jsx {1} fileName="src/components/serverComponentExample/ServerComponentExample.csx" codeFormat="commonjs"
809
+ const { useIntlayer } = require("next-intlayer/server");
810
+
811
+ const ServerComponentExample = () => {
812
+ const content = useIntlayer("server-component-example"); // Erstelle zugehörige Content-Deklaration
813
+
814
+ return (
815
+ <div>
816
+ <h2>{content.title}</h2>
817
+ <p>{content.content}</p>
818
+ </div>
819
+ );
820
+ };
821
+ ```
822
+
823
+ > Wenn Sie Ihren Inhalt in einem `string`-Attribut verwenden möchten, wie z. B. `alt`, `title`, `href`, `aria-label` usw., müssen Sie den Wert der Funktion aufrufen, z. B.:
824
+
825
+ > ```jsx
826
+ > <img src={content.image.src.value} alt={content.image.value} />
827
+ > ```
828
+
829
+ > Weitere Informationen zum `useIntlayer`-Hook finden Sie in der [Dokumentation](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/next-intlayer/useIntlayer.md).
830
+
831
+ ### (Optional) Schritt 7: Proxy zur Erkennung der bevorzugten Locale konfigurieren
832
+
833
+ Richten Sie den Proxy ein, um die bevorzugte Locale des Benutzers zu erkennen:
834
+
835
+ ```typescript fileName="src/proxy.ts" codeFormat="typescript"
836
+ export { intlayerProxy as proxy } from "next-intlayer/proxy";
837
+
838
+ export const config = {
839
+ matcher:
840
+ "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
841
+ };
842
+ ```
843
+
844
+ ```javascript fileName="src/proxy.mjs" codeFormat="esm"
845
+ export { intlayerProxy as proxy } from "next-intlayer/proxy";
846
+
847
+ export const config = {
848
+ matcher:
849
+ "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
850
+ };
851
+ ```
852
+
853
+ ```javascript fileName="src/proxy.cjs" codeFormat="commonjs"
854
+ const { intlayerProxy } = require("next-intlayer/proxy");
855
+
856
+ const config = {
857
+ matcher:
858
+ "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
859
+ };
860
+
861
+ module.exports = { proxy: intlayerProxy, config };
862
+ ```
863
+
864
+ > Der `intlayerProxy` wird verwendet, um die bevorzugte Locale des Nutzers zu erkennen und ihn auf die entsprechende URL weiterzuleiten, wie in der [Konfiguration](https://github.com/aymericzip/intlayer/blob/main/docs/docs/{{locale}}/configuration.md) angegeben. Außerdem ermöglicht er, die bevorzugte Locale des Nutzers in einem Cookie zu speichern.
865
+
866
+ > Wenn Sie mehrere Proxies hintereinander schalten müssen (zum Beispiel `intlayerProxy` zusammen mit Authentifizierung oder benutzerdefinierten Proxies), stellt Intlayer jetzt einen Helfer namens `multipleProxies` zur Verfügung.
867
+
868
+ ```ts
869
+ import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";
870
+ import { customProxy } from "@utils/customProxy";
871
+
872
+ export const proxy = multipleProxies([intlayerProxy, customProxy]);
873
+ ```
874
+
875
+ ### (Optional) Schritt 8: Ändern Sie die Sprache Ihrer Inhalte
876
+
877
+ Um die Sprache Ihrer Inhalte in Next.js zu ändern, empfiehlt es sich, die `Link`-Komponente zu verwenden, um Benutzer auf die entsprechende lokalisierte Seite weiterzuleiten. Die `Link`-Komponente ermöglicht das Prefetching der Seite, wodurch ein vollständiger Seitenreload vermieden werden kann.
878
+
879
+ ```tsx fileName="src/components/localeSwitcher/LocaleSwitcher.tsx" codeFormat="typescript"
880
+ "use client";
881
+
882
+ import type { FC } from "react";
883
+ import { Locales, getHTMLTextDir, getLocaleName } from "intlayer";
884
+ import { useLocale } from "next-intlayer";
885
+
886
+ export const LocaleSwitcher: FC = () => {
887
+ const { locale, availableLocales, setLocale } = useLocale({
888
+ onChange: () => window.location.reload(),
889
+ });
890
+
891
+ return (
892
+ <div>
893
+ <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
894
+ <div id="localePopover" popover="auto">
895
+ {availableLocales.map((localeItem) => (
896
+ <button
897
+ key={localeItem}
898
+ aria-current={locale === localeItem ? "page" : undefined}
899
+ onClick={() => setLocale(localeItem)}
900
+ >
901
+ <span>
902
+ {/* Locale - z. B. FR */}
903
+ {localeItem}
904
+ </span>
905
+ <span>
906
+ {/* Sprache in ihrer eigenen Locale - z. B. Français */}
907
+ {getLocaleName(localeItem, locale)}
908
+ </span>
909
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
910
+ {/* Sprache in der aktuellen Locale - z. B. Francés, wenn die aktuelle Locale auf Locales.SPANISH gesetzt ist */}
911
+ {getLocaleName(localeItem)}
912
+ </span>
913
+ <span dir="ltr" lang={Locales.ENGLISH}>
914
+ {/* Sprache auf Englisch - z. B. Französisch */}
915
+ {getLocaleName(localeItem, Locales.ENGLISH)}
916
+ </span>
917
+ </button>
918
+ ))}
919
+ </div>
920
+ </div>
921
+ );
922
+ };
923
+ ```
924
+
925
+ ```jsx fileName="src/components/localeSwitcher/LocaleSwitcher.msx" codeFormat="esm"
926
+ "use client";
927
+
928
+ import { Locales, getHTMLTextDir, getLocaleName } from "intlayer";
929
+ import { useLocale } from "next-intlayer";
930
+
931
+ export const LocaleSwitcher = () => {
932
+ const { locale, availableLocales, setLocale } = useLocale({
933
+ onChange: () => window.location.reload(),
934
+ });
935
+
936
+ return (
937
+ <div>
938
+ <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
939
+ <div id="localePopover" popover="auto">
940
+ {availableLocales.map((localeItem) => (
941
+ <button
942
+ key={localeItem}
943
+ aria-current={locale === localeItem ? "page" : undefined}
944
+ onClick={() => setLocale(localeItem)}
945
+ >
946
+ <span>
947
+ {/* Locale - z. B. FR */}
948
+ {localeItem}
949
+ </span>
950
+ <span>
951
+ {/* Sprache in ihrer eigenen Locale - z. B. Français */}
952
+ {getLocaleName(localeItem, locale)}
953
+ </span>
954
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
955
+ {/* Sprache in der aktuellen Locale - z. B. Francés, wenn die aktuelle Locale auf Locales.SPANISH gesetzt ist */}
956
+ {getLocaleName(localeItem)}
957
+ </span>
958
+ <span dir="ltr" lang={Locales.ENGLISH}>
959
+ {/* Sprache auf Englisch - z. B. French */}
960
+ {getLocaleName(localeItem, Locales.ENGLISH)}
961
+ </span>
962
+ </button>
963
+ ))}
964
+ </div>
965
+ </div>
966
+ );
967
+ };
968
+ ```
969
+
970
+ ```jsx fileName="src/components/localeSwitcher/LocaleSwitcher.csx" codeFormat="commonjs"
971
+ "use client";
972
+
973
+ const { Locales, getHTMLTextDir, getLocaleName } = require("intlayer");
974
+ const { useLocale } = require("next-intlayer");
975
+
976
+ export const LocaleSwitcher = () => {
977
+ const path
978
+ const { locale availableLocales, setLocale } = useLocale({
979
+ onChange: ()=> window.location.reload(),
980
+ });
981
+
982
+ return (
983
+ <div>
984
+ <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
985
+ <div id="localePopover" popover="auto">
986
+ {availableLocales.map((localeItem) => (
987
+ <button
988
+ key={localeItem}
989
+ aria-current={locale === localeItem ? "page" : undefined}
990
+ onClick={() => setLocale(localeItem)}
991
+ >
992
+ <span>
993
+ {/* Locale - z. B. FR */}
994
+ {localeItem}
995
+ </span>
996
+ <span>
997
+ {/* Sprache in ihrem eigenen Locale - z. B. Français */}
998
+ {getLocaleName(localeItem, locale)}
999
+ </span>
1000
+ <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
1001
+ {/* Sprache in der aktuellen Locale - z. B. Francés, wenn die aktuelle Locale auf Locales.SPANISH gesetzt ist */}
1002
+ {getLocaleName(localeItem)}
1003
+ </span>
1004
+ <span dir="ltr" lang={Locales.ENGLISH}>
1005
+ {/* Sprache auf Englisch - z. B. French */}
1006
+ {getLocaleName(localeItem, Locales.ENGLISH)}
1007
+ </span>
1008
+ </button>
1009
+ ))}
1010
+ </div>
1011
+ </div>
1012
+ );
1013
+ };
1014
+ ```
1015
+
1016
+ > Eine alternative Möglichkeit ist, die vom `useLocale` Hook bereitgestellte Funktion `setLocale` zu verwenden. Diese Funktion ermöglicht kein Prefetching der Seite. Weitere Details findest du in der [Dokumentation des `useLocale`-Hooks](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/next-intlayer/useLocale.md).
1017
+
1018
+ > Dokumentationsreferenzen:
1019
+ >
1020
+ > - [`useLocale` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/next-intlayer/useLocale.md)
1021
+ > - [`getLocaleName` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/getLocaleName.md)
1022
+ > - [`getLocalizedUrl` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/getLocalizedUrl.md)
1023
+ > - [`getHTMLTextDir` Hook](https://github.com/aymericzip/intlayer/blob/main/docs/docs/de/packages/intlayer/getHTMLTextDir.md)
1024
+ > - [`hrefLang` Attribut](https://developers.google.com/search/docs/specialty/international/localized-versions?hl=fr)
1025
+ > - [`lang` Attribut](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/lang)
1026
+ > - [`dir` Attribut](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/dir)
1027
+ > - [`aria-current` Attribut](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current)
1028
+
1029
+ ### (Optional) Schritt 9: Aktuelle Locale in Server Actions abrufen
1030
+
1031
+ Wenn Sie die aktive Locale innerhalb einer Server Action benötigen (z. B. um E-Mails zu lokalisieren oder lokalisierungsabhängige Logik auszuführen), rufen Sie `getLocale` aus `next-intlayer/server` auf:
1032
+
1033
+ ```tsx fileName="src/app/actions/getLocale.ts" codeFormat="typescript"
1034
+ "use server";
1035
+
1036
+ import { getLocale } from "next-intlayer/server";
1037
+
1038
+ export const myServerAction = async () => {
1039
+ const locale = await getLocale();
1040
+
1041
+ // Mit der Locale etwas tun
1042
+ };
1043
+ ```
1044
+
1045
+ > Die Funktion `getLocale` folgt einer kaskadierenden Strategie, um die Locale des Benutzers zu bestimmen:
1046
+ >
1047
+ > 1. Zuerst prüft sie die Request-Header auf einen Locale-Wert, der möglicherweise vom Proxy gesetzt wurde
1048
+ > 2. Wenn in den Headern keine Locale gefunden wird, sucht sie nach einer in Cookies gespeicherten Locale
1049
+ > 3. Findet sich kein Cookie, versucht sie, die bevorzugte Sprache des Benutzers aus den Browsereinstellungen zu ermitteln
1050
+ > 4. Als letzter Ausweg fällt sie auf die in der Anwendung konfigurierte Standard-Locale zurück
1051
+ >
1052
+ > Dies stellt sicher, dass die am besten geeignete Locale basierend auf dem verfügbaren Kontext ausgewählt wird.
1053
+
1054
+ ### (Optional) Schritt 10: Bundle-Größe optimieren
1055
+
1056
+ Bei Verwendung von `next-intlayer` werden Wörterbücher standardmäßig in das Bundle jeder Seite aufgenommen. Um die Bundle-Größe zu optimieren, stellt Intlayer ein optionales SWC-Plugin bereit, das `useIntlayer`-Aufrufe mithilfe von Makros intelligent ersetzt. Dadurch werden Wörterbücher nur in die Bundles von Seiten aufgenommen, die sie tatsächlich verwenden.
1057
+
1058
+ Um diese Optimierung zu aktivieren, installieren Sie das Paket `@intlayer/swc`. Nach der Installation erkennt `next-intlayer` das Plugin automatisch und verwendet es:
1059
+
1060
+ ```bash packageManager="npm"
1061
+ npm install @intlayer/swc --save-dev
1062
+ npx intlayer init
1063
+ ```
1064
+
1065
+ ```bash packageManager="pnpm"
1066
+ pnpm add @intlayer/swc --save-dev
1067
+ pnpm intlayer init
1068
+ ```
1069
+
1070
+ ```bash packageManager="yarn"
1071
+ yarn add @intlayer/swc --save-dev
1072
+ yarn intlayer init
1073
+ ```
1074
+
1075
+ ```bash packageManager="bun"
1076
+ bun add @intlayer/swc --dev
1077
+ bunx intlayer init
1078
+ ```
1079
+
1080
+ > Hinweis: Diese Optimierung ist nur für Next.js 13 und höher verfügbar.
1081
+
1082
+ > Hinweis: Dieses Paket wird nicht standardmäßig installiert, da SWC-Plugins in Next.js noch experimentell sind. Das kann sich in Zukunft ändern.
1083
+
1084
+ > Hinweis: Wenn Sie die Option als `importMode: 'dynamic'` oder `importMode: 'live'` setzen, basiert dies auf Suspense, daher müssen Sie Ihre `useIntlayer`-Aufrufe in eine `Suspense`-Grenze einhüllen. Das bedeutet, dass Sie `useIntlayer` nicht direkt auf der obersten Ebene Ihrer Page-/Layout-Komponente verwenden können.
1085
+
1086
+ ### Wörterbuchänderungen mit Turbopack überwachen
1087
+
1088
+ Wenn Sie Turbopack als Entwicklungsserver mit dem Befehl `next dev` verwenden, werden Wörterbuchänderungen standardmäßig nicht automatisch erkannt.
1089
+
1090
+ Diese Einschränkung entsteht, weil Turbopack nicht in der Lage ist, webpack-Plugins parallel auszuführen, um Änderungen an Ihren Inhaltsdateien zu überwachen. Um dies zu umgehen, müssen Sie den Befehl `intlayer watch` verwenden, um gleichzeitig sowohl den Entwicklungsserver als auch den Intlayer-Build-Watcher auszuführen.
1091
+
1092
+ ```json5 fileName="package.json"
1093
+ {
1094
+ // ... Ihre vorhandenen package.json-Konfigurationen
1095
+ "scripts": {
1096
+ // ... Ihre vorhandenen Skript-Konfigurationen
1097
+ "dev": "intlayer watch --with 'next dev'",
1098
+ },
1099
+ }
1100
+ ```
1101
+
1102
+ > Wenn Sie next-intlayer@<=6.x.x verwenden, müssen Sie das Flag `--turbopack` beibehalten, damit die Next.js 16-Anwendung korrekt mit Turbopack funktioniert. Wir empfehlen die Verwendung von next-intlayer@>=7.x.x, um diese Einschränkung zu vermeiden.
1103
+
1104
+ ### TypeScript konfigurieren
1105
+
1106
+ Intlayer verwendet Module Augmentation, um die Vorteile von TypeScript zu nutzen und Ihre Codebase robuster zu machen.
1107
+
1108
+ ![Autovervollständigung](https://github.com/aymericzip/intlayer/blob/main/docs/assets/autocompletion.png?raw=true)
1109
+
1110
+ ![Übersetzungsfehler](https://github.com/aymericzip/intlayer/blob/main/docs/assets/translation_error.png?raw=true)
1111
+
1112
+ Stellen Sie sicher, dass Ihre TypeScript-Konfiguration die automatisch generierten Typen enthält.
1113
+
1114
+ ```json5 fileName="tsconfig.json"
1115
+ {
1116
+ // ... Ihre vorhandenen TypeScript-Konfigurationen
1117
+ "include": [
1118
+ // ... Ihre vorhandenen TypeScript-Konfigurationen
1119
+ ".intlayer/**/*.ts", // Include the auto-generated types
1120
+ ],
1121
+ }
1122
+ ```
1123
+
1124
+ ### Git-Konfiguration
1125
+
1126
+ Es wird empfohlen, die von Intlayer generierten Dateien zu ignorieren. So vermeiden Sie, sie in Ihr Git-Repository zu committen.
1127
+
1128
+ Dazu können Sie die folgenden Anweisungen in Ihre `.gitignore`-Datei hinzufügen:
1129
+
1130
+ ```plaintext fileName=".gitignore"
1131
+ # Ignoriere die von Intlayer generierten Dateien
1132
+ .intlayer
1133
+ ```
1134
+
1135
+ ### VS Code-Erweiterung
1136
+
1137
+ Um Ihre Entwicklererfahrung mit Intlayer zu verbessern, können Sie die offizielle **Intlayer VS Code Extension** installieren.
1138
+
1139
+ [Aus dem VS Code Marketplace installieren](https://marketplace.visualstudio.com/items?itemName=intlayer.intlayer-vs-code-extension)
1140
+
1141
+ Diese Erweiterung bietet:
1142
+
1143
+ - **Autovervollständigung** für Übersetzungsschlüssel.
1144
+ - **Echtzeit-Fehlererkennung** für fehlende Übersetzungen.
1145
+ - **Inline-Vorschauen** des übersetzten Inhalts.
1146
+ - **Schnellaktionen** zum einfachen Erstellen und Aktualisieren von Übersetzungen.
1147
+
1148
+ Für weitere Details zur Verwendung der Extension siehe die [Intlayer VS Code Extension Dokumentation](https://intlayer.org/doc/vs-code-extension).
1149
+
1150
+ ### Weiterführende Informationen
1151
+
1152
+ Um weiterzugehen, können Sie den [visual 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) externalisieren.