@intlayer/docs 7.1.0-canary.2 → 7.1.1-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/blog/ar/internationalization_and_SEO.md +0 -4
  2. package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
  3. package/blog/de/internationalization_and_SEO.md +0 -2
  4. package/blog/en/internationalization_and_SEO.md +0 -2
  5. package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
  6. package/blog/en-GB/internationalization_and_SEO.md +0 -2
  7. package/blog/es/internationalization_and_SEO.md +0 -4
  8. package/blog/fr/internationalization_and_SEO.md +0 -2
  9. package/blog/hi/internationalization_and_SEO.md +0 -2
  10. package/blog/id/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
  11. package/blog/it/internationalization_and_SEO.md +0 -2
  12. package/blog/ja/internationalization_and_SEO.md +0 -2
  13. package/blog/ko/internationalization_and_SEO.md +0 -2
  14. package/blog/pl/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
  15. package/blog/pt/internationalization_and_SEO.md +0 -4
  16. package/blog/ru/internationalization_and_SEO.md +0 -4
  17. package/blog/vi/next-i18next_vs_next-intl_vs_intlayer.md +2 -2
  18. package/blog/zh/internationalization_and_SEO.md +0 -4
  19. package/docs/ar/intlayer_with_nextjs_14.md +9 -9
  20. package/docs/ar/intlayer_with_nextjs_15.md +9 -8
  21. package/docs/ar/intlayer_with_nextjs_16.md +2 -56
  22. package/docs/ar/intlayer_with_nextjs_page_router.md +7 -10
  23. package/docs/ar/intlayer_with_react_router_v7.md +6 -6
  24. package/docs/ar/intlayer_with_tanstack.md +46 -31
  25. package/docs/ar/intlayer_with_vite+preact.md +7 -7
  26. package/docs/ar/intlayer_with_vite+react.md +7 -7
  27. package/docs/ar/intlayer_with_vite+vue.md +9 -9
  28. package/docs/de/intlayer_with_nextjs_14.md +9 -9
  29. package/docs/de/intlayer_with_nextjs_15.md +9 -8
  30. package/docs/de/intlayer_with_nextjs_page_router.md +7 -10
  31. package/docs/de/intlayer_with_react_router_v7.md +6 -6
  32. package/docs/de/intlayer_with_tanstack.md +46 -31
  33. package/docs/de/intlayer_with_vite+preact.md +7 -7
  34. package/docs/de/intlayer_with_vite+react.md +7 -7
  35. package/docs/de/intlayer_with_vite+vue.md +9 -9
  36. package/docs/en/interest_of_intlayer.md +1 -1
  37. package/docs/en/intlayer_with_nextjs_page_router.md +7 -10
  38. package/docs/en/intlayer_with_react_router_v7.md +6 -6
  39. package/docs/en/intlayer_with_tanstack.md +57 -33
  40. package/docs/en/intlayer_with_vite+preact.md +8 -8
  41. package/docs/en/intlayer_with_vite+react.md +8 -8
  42. package/docs/en/intlayer_with_vite+vue.md +8 -8
  43. package/docs/en/releases/v6.md +1 -1
  44. package/docs/en-GB/intlayer_with_nextjs_14.md +9 -9
  45. package/docs/en-GB/intlayer_with_nextjs_15.md +9 -8
  46. package/docs/en-GB/intlayer_with_nextjs_page_router.md +7 -10
  47. package/docs/en-GB/intlayer_with_react_router_v7.md +6 -6
  48. package/docs/en-GB/intlayer_with_tanstack.md +46 -31
  49. package/docs/en-GB/intlayer_with_vite+preact.md +7 -7
  50. package/docs/en-GB/intlayer_with_vite+react.md +7 -7
  51. package/docs/en-GB/intlayer_with_vite+vue.md +9 -9
  52. package/docs/es/intlayer_with_nextjs_14.md +9 -9
  53. package/docs/es/intlayer_with_nextjs_15.md +9 -8
  54. package/docs/es/intlayer_with_nextjs_page_router.md +7 -10
  55. package/docs/es/intlayer_with_react_router_v7.md +6 -6
  56. package/docs/es/intlayer_with_tanstack.md +15 -10
  57. package/docs/es/intlayer_with_vite+preact.md +7 -7
  58. package/docs/es/intlayer_with_vite+react.md +7 -7
  59. package/docs/es/intlayer_with_vite+vue.md +9 -9
  60. package/docs/fr/intlayer_with_nextjs_14.md +9 -9
  61. package/docs/fr/intlayer_with_nextjs_15.md +9 -8
  62. package/docs/fr/intlayer_with_nextjs_page_router.md +7 -10
  63. package/docs/fr/intlayer_with_react_router_v7.md +6 -6
  64. package/docs/fr/intlayer_with_tanstack.md +46 -31
  65. package/docs/fr/intlayer_with_vite+preact.md +7 -7
  66. package/docs/fr/intlayer_with_vite+react.md +7 -7
  67. package/docs/fr/intlayer_with_vite+vue.md +9 -9
  68. package/docs/hi/intlayer_with_nextjs_14.md +9 -9
  69. package/docs/hi/intlayer_with_nextjs_15.md +9 -8
  70. package/docs/hi/intlayer_with_nextjs_page_router.md +7 -10
  71. package/docs/hi/intlayer_with_react_router_v7.md +6 -6
  72. package/docs/hi/intlayer_with_tanstack.md +15 -10
  73. package/docs/hi/intlayer_with_vite+preact.md +7 -7
  74. package/docs/hi/intlayer_with_vite+react.md +7 -7
  75. package/docs/hi/intlayer_with_vite+vue.md +9 -9
  76. package/docs/id/interest_of_intlayer.md +1 -1
  77. package/docs/id/intlayer_with_nextjs_page_router.md +7 -10
  78. package/docs/id/intlayer_with_react_router_v7.md +6 -6
  79. package/docs/id/intlayer_with_tanstack.md +15 -10
  80. package/docs/id/intlayer_with_vite+preact.md +9 -9
  81. package/docs/id/intlayer_with_vite+react.md +8 -8
  82. package/docs/id/intlayer_with_vite+vue.md +8 -8
  83. package/docs/id/releases/v6.md +1 -1
  84. package/docs/it/intlayer_with_nextjs_14.md +9 -9
  85. package/docs/it/intlayer_with_nextjs_15.md +9 -8
  86. package/docs/it/intlayer_with_nextjs_page_router.md +7 -10
  87. package/docs/it/intlayer_with_react_router_v7.md +6 -6
  88. package/docs/it/intlayer_with_tanstack.md +46 -31
  89. package/docs/it/intlayer_with_vite+preact.md +7 -7
  90. package/docs/it/intlayer_with_vite+react.md +7 -7
  91. package/docs/it/intlayer_with_vite+vue.md +9 -9
  92. package/docs/ja/intlayer_with_nextjs_14.md +9 -9
  93. package/docs/ja/intlayer_with_nextjs_15.md +9 -8
  94. package/docs/ja/intlayer_with_nextjs_page_router.md +7 -10
  95. package/docs/ja/intlayer_with_react_router_v7.md +6 -6
  96. package/docs/ja/intlayer_with_tanstack.md +16 -10
  97. package/docs/ja/intlayer_with_vite+preact.md +7 -7
  98. package/docs/ja/intlayer_with_vite+react.md +7 -7
  99. package/docs/ja/intlayer_with_vite+vue.md +9 -9
  100. package/docs/ko/intlayer_with_nextjs_14.md +9 -9
  101. package/docs/ko/intlayer_with_nextjs_15.md +9 -8
  102. package/docs/ko/intlayer_with_nextjs_page_router.md +7 -10
  103. package/docs/ko/intlayer_with_react_router_v7.md +6 -6
  104. package/docs/ko/intlayer_with_tanstack.md +46 -31
  105. package/docs/ko/intlayer_with_vite+preact.md +7 -7
  106. package/docs/ko/intlayer_with_vite+react.md +7 -7
  107. package/docs/ko/intlayer_with_vite+vue.md +9 -9
  108. package/docs/pl/interest_of_intlayer.md +1 -1
  109. package/docs/pl/intlayer_with_nextjs_page_router.md +7 -10
  110. package/docs/pl/intlayer_with_react_router_v7.md +6 -6
  111. package/docs/pl/intlayer_with_tanstack.md +15 -10
  112. package/docs/pl/intlayer_with_vite+preact.md +10 -10
  113. package/docs/pl/intlayer_with_vite+react.md +8 -8
  114. package/docs/pl/intlayer_with_vite+vue.md +8 -8
  115. package/docs/pl/releases/v6.md +1 -1
  116. package/docs/pt/intlayer_with_nextjs_14.md +9 -9
  117. package/docs/pt/intlayer_with_nextjs_15.md +9 -8
  118. package/docs/pt/intlayer_with_nextjs_page_router.md +7 -10
  119. package/docs/pt/intlayer_with_react_router_v7.md +2 -2
  120. package/docs/pt/intlayer_with_tanstack.md +46 -31
  121. package/docs/pt/intlayer_with_vite+preact.md +7 -7
  122. package/docs/pt/intlayer_with_vite+react.md +7 -7
  123. package/docs/pt/intlayer_with_vite+vue.md +9 -9
  124. package/docs/ru/intlayer_with_nextjs_14.md +9 -9
  125. package/docs/ru/intlayer_with_nextjs_15.md +9 -8
  126. package/docs/ru/intlayer_with_nextjs_page_router.md +7 -10
  127. package/docs/ru/intlayer_with_react_router_v7.md +6 -6
  128. package/docs/ru/intlayer_with_tanstack.md +15 -10
  129. package/docs/ru/intlayer_with_vite+preact.md +7 -7
  130. package/docs/ru/intlayer_with_vite+react.md +7 -7
  131. package/docs/ru/intlayer_with_vite+vue.md +9 -9
  132. package/docs/tr/interest_of_intlayer.md +1 -1
  133. package/docs/tr/intlayer_with_nextjs_15.md +9 -8
  134. package/docs/tr/intlayer_with_nextjs_page_router.md +7 -10
  135. package/docs/tr/intlayer_with_react_router_v7.md +6 -6
  136. package/docs/tr/intlayer_with_tanstack.md +46 -31
  137. package/docs/tr/intlayer_with_vite+preact.md +8 -8
  138. package/docs/tr/intlayer_with_vite+react.md +8 -8
  139. package/docs/tr/intlayer_with_vite+vue.md +8 -8
  140. package/docs/vi/interest_of_intlayer.md +1 -1
  141. package/docs/vi/intlayer_with_nextjs_15.md +1 -0
  142. package/docs/vi/intlayer_with_nextjs_page_router.md +7 -10
  143. package/docs/vi/intlayer_with_react_router_v7.md +6 -6
  144. package/docs/vi/intlayer_with_tanstack.md +46 -31
  145. package/docs/vi/intlayer_with_vite+preact.md +9 -9
  146. package/docs/vi/intlayer_with_vite+react.md +8 -8
  147. package/docs/vi/intlayer_with_vite+vue.md +8 -8
  148. package/docs/vi/releases/v6.md +1 -1
  149. package/docs/zh/intlayer_with_nextjs_14.md +9 -9
  150. package/docs/zh/intlayer_with_nextjs_15.md +9 -8
  151. package/docs/zh/intlayer_with_nextjs_page_router.md +7 -10
  152. package/docs/zh/intlayer_with_react_router_v7.md +6 -6
  153. package/docs/zh/intlayer_with_tanstack.md +14 -8
  154. package/docs/zh/intlayer_with_vite+preact.md +7 -7
  155. package/docs/zh/intlayer_with_vite+react.md +7 -7
  156. package/docs/zh/intlayer_with_vite+vue.md +7 -7
  157. package/frequent_questions/ar/domain_routing.md +1 -1
  158. package/frequent_questions/de/domain_routing.md +1 -1
  159. package/frequent_questions/en/domain_routing.md +1 -1
  160. package/frequent_questions/en/package_version_error.md +29 -1
  161. package/frequent_questions/en-GB/domain_routing.md +1 -1
  162. package/frequent_questions/es/domain_routing.md +1 -1
  163. package/frequent_questions/fr/domain_routing.md +1 -1
  164. package/frequent_questions/hi/domain_routing.md +1 -1
  165. package/frequent_questions/id/domain_routing.md +1 -1
  166. package/frequent_questions/it/domain_routing.md +1 -1
  167. package/frequent_questions/it/package_version_error.md +4 -4
  168. package/frequent_questions/ja/domain_routing.md +1 -1
  169. package/frequent_questions/ko/domain_routing.md +1 -1
  170. package/frequent_questions/pl/domain_routing.md +1 -1
  171. package/frequent_questions/pt/domain_routing.md +1 -1
  172. package/frequent_questions/ru/domain_routing.md +1 -1
  173. package/frequent_questions/tr/domain_routing.md +1 -1
  174. package/frequent_questions/vi/domain_routing.md +1 -1
  175. package/frequent_questions/zh/domain_routing.md +1 -1
  176. package/package.json +7 -14
@@ -204,6 +204,7 @@ import type { FC } from "react";
204
204
 
205
205
  import { Link, type LinkComponentProps } from "@tanstack/react-router";
206
206
  import { useLocale } from "react-intlayer";
207
+ import { getPrefix } from "intlayer";
207
208
 
208
209
  export const LOCALE_ROUTE = "{-$locale}" as const;
209
210
 
@@ -233,12 +234,13 @@ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
233
234
 
234
235
  export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
235
236
  const { locale } = useLocale();
237
+ const { localePrefix } = getPrefix(locale);
236
238
 
237
239
  return (
238
240
  <Link
239
241
  {...props}
240
242
  params={{
241
- locale,
243
+ locale: localePrefix,
242
244
  ...(typeof props?.params === "object" ? props?.params : {}),
243
245
  }}
244
246
  to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
@@ -255,43 +257,52 @@ Diese Komponente verfolgt zwei Ziele:
255
257
  Anschließend können wir einen `useLocalizedNavigate`-Hook für die programmatische Navigation erstellen:
256
258
 
257
259
  ```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
258
- import { useLocale } from "react-intlayer";
259
260
  import { useNavigate } from "@tanstack/react-router";
261
+ import { getPrefix } from "intlayer";
262
+ import { useLocale } from "react-intlayer";
260
263
  import { LOCALE_ROUTE } from "@/components/localized-link";
261
264
  import type { FileRouteTypes } from "@/routeTree.gen";
262
265
 
266
+ type StripLocalePrefix<T extends string> = T extends
267
+ | `/${typeof LOCALE_ROUTE}`
268
+ | `/${typeof LOCALE_ROUTE}/`
269
+ ? "/"
270
+ : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
271
+ ? `/${Rest}`
272
+ : never;
273
+
274
+ type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
275
+
276
+ type LocalizedNavigate = {
277
+ (to: LocalizedTo): ReturnType<ReturnType<typeof useNavigate>>;
278
+ (
279
+ opts: { to: LocalizedTo } & Record<string, unknown>
280
+ ): ReturnType<ReturnType<typeof useNavigate>>;
281
+ };
282
+
263
283
  export const useLocalizedNavigate = () => {
264
284
  const navigate = useNavigate();
265
285
 
266
286
  const { locale } = useLocale();
267
287
 
268
- type StripLocalePrefix<T extends string> = T extends
269
- | `/${typeof LOCALE_ROUTE}`
270
- | `/${typeof LOCALE_ROUTE}/`
271
- ? "/"
272
- : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
273
- ? `/${Rest}`
274
- : never;
275
-
276
- type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
277
-
278
- interface LocalizedNavigate {
279
- (to: LocalizedTo): ReturnType<typeof navigate>;
280
- (
281
- opts: { to: LocalizedTo } & Record<string, unknown>
282
- ): ReturnType<typeof navigate>;
283
- }
284
-
285
288
  const localizedNavigate: LocalizedNavigate = (args: any) => {
289
+ const { localePrefix } = getPrefix(locale);
290
+
286
291
  if (typeof args === "string") {
287
- return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
292
+ return navigate({
293
+ to: `/${LOCALE_ROUTE}${args}`,
294
+ params: { locale: localePrefix },
295
+ });
288
296
  }
289
297
 
290
298
  const { to, ...rest } = args;
291
299
 
292
- const localedTo = `/${LOCALE_ROUTE}${to}` as any;
300
+ const localizedTo = `/${LOCALE_ROUTE}${to}` as any;
293
301
 
294
- return navigate({ to: localedTo, params: { locale, ...rest } as any });
302
+ return navigate({
303
+ to: localizedTo,
304
+ params: { locale: localePrefix, ...rest } as any,
305
+ });
295
306
  };
296
307
 
297
308
  return localizedNavigate;
@@ -365,8 +376,13 @@ Erstellen Sie eine Komponente, die es Benutzern ermöglicht, die Sprache zu wech
365
376
  import type { FC } from "react";
366
377
 
367
378
  import { useLocation } from "@tanstack/react-router";
368
- import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
369
- import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
379
+ import {
380
+ getHTMLTextDir,
381
+ getLocaleName,
382
+ getPathWithoutLocale,
383
+ getPrefix,
384
+ } from "intlayer";
385
+ import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
370
386
 
371
387
  import { LocalizedLink, To } from "./localized-link";
372
388
 
@@ -385,9 +401,8 @@ export const LocaleSwitcher: FC = () => {
385
401
  <LocalizedLink
386
402
  aria-current={localeEl === locale ? "page" : undefined}
387
403
  aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
388
- onClick={() => setLocaleCookie(localeEl)}
389
- params={{ locale: localeEl }}
390
- to={pathWithoutLocale as To}
404
+ onClick={() => setLocaleInStorage(localeEl)}
405
+ params={{ locale: getPrefix(localeEl).localePrefix }}
391
406
  >
392
407
  <span>
393
408
  {/* Gebietsschema - z.B. FR */}
@@ -465,15 +480,15 @@ function LayoutComponent() {
465
480
 
466
481
  ### Schritt 11: Middleware hinzufügen (Optional)
467
482
 
468
- Sie können auch das `intlayerMiddleware` 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.
483
+ Sie können 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.
469
484
 
470
- > Beachten Sie, dass Sie, um das `intlayerMiddleware` in der Produktion zu verwenden, das `vite-intlayer`-Paket von `devDependencies` zu `dependencies` wechseln müssen.
485
+ > Beachten Sie, dass Sie, um das `intlayerProxy` in der Produktion zu verwenden, das `vite-intlayer`-Paket von `devDependencies` zu `dependencies` wechseln müssen.
471
486
 
472
487
  ```typescript {3,7} fileName="vite.config.ts"
473
488
  import { reactRouter } from "@react-router/dev/vite";
474
489
  import tailwindcss from "@tailwindcss/vite";
475
490
  import { defineConfig } from "vite";
476
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
491
+ import { intlayer, intlayerProxy } from "vite-intlayer";
477
492
  import tsconfigPaths from "vite-tsconfig-paths";
478
493
 
479
494
  export default defineConfig({
@@ -482,7 +497,7 @@ export default defineConfig({
482
497
  reactRouter(),
483
498
  tsconfigPaths(),
484
499
  intlayer(),
485
- intlayerMiddleware(),
500
+ intlayerProxy(),
486
501
  ],
487
502
  });
488
503
  ```
@@ -1054,38 +1054,38 @@ const App = () => (
1054
1054
  module.exports = App;
1055
1055
  ```
1056
1056
 
1057
- Parallel dazu können Sie auch das `intlayerMiddleware` 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.
1057
+ 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.
1058
1058
 
1059
1059
  ```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
1060
1060
  import { defineConfig } from "vite";
1061
1061
  import preact from "@preact/preset-vite";
1062
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
1062
+ import { intlayer, intlayerProxy } from "vite-intlayer";
1063
1063
 
1064
1064
  // https://vitejs.dev/config/
1065
1065
  export default defineConfig({
1066
- plugins: [preact(), intlayer(), intlayerMiddleware()],
1066
+ plugins: [preact(), intlayer(), intlayerProxy()],
1067
1067
  });
1068
1068
  ```
1069
1069
 
1070
1070
  ```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
1071
1071
  import { defineConfig } from "vite";
1072
1072
  import preact from "@preact/preset-vite";
1073
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
1073
+ import { intlayer, intlayerProxy } from "vite-intlayer";
1074
1074
 
1075
1075
  // https://vitejs.dev/config/
1076
1076
  export default defineConfig({
1077
- plugins: [preact(), intlayer(), intlayerMiddleware()],
1077
+ plugins: [preact(), intlayer(), intlayerProxy()],
1078
1078
  });
1079
1079
  ```
1080
1080
 
1081
1081
  ```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
1082
1082
  const { defineConfig } = require("vite");
1083
1083
  const preact = require("@preact/preset-vite");
1084
- const { intlayer, intlayerMiddleware } = require("vite-intlayer");
1084
+ const { intlayer, intlayerProxy } = require("vite-intlayer");
1085
1085
 
1086
1086
  // https://vitejs.dev/config/
1087
1087
  module.exports = defineConfig({
1088
- plugins: [preact(), intlayer(), intlayerMiddleware()],
1088
+ plugins: [preact(), intlayer(), intlayerProxy()],
1089
1089
  });
1090
1090
  ```
1091
1091
 
@@ -1025,38 +1025,38 @@ const App = () => (
1025
1025
  );
1026
1026
  ```
1027
1027
 
1028
- Parallel dazu können Sie auch das `intlayerMiddleware` verwenden, um serverseitiges Routing in Ihre Anwendung zu integrieren. 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 passendste Locale basierend auf den Spracheinstellungen des Browsers des Benutzers. Wird keine Locale erkannt, erfolgt eine Weiterleitung zur Standard-Locale.
1028
+ Parallel dazu können Sie auch das `intlayerProxy` verwenden, um serverseitiges Routing in Ihre Anwendung zu integrieren. 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 passendste Locale basierend auf den Spracheinstellungen des Browsers des Benutzers. Wird keine Locale erkannt, erfolgt eine Weiterleitung zur Standard-Locale.
1029
1029
 
1030
1030
  ```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
1031
1031
  import { defineConfig } from "vite";
1032
1032
  import react from "@vitejs/plugin-react-swc";
1033
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
1033
+ import { intlayer, intlayerProxy } from "vite-intlayer";
1034
1034
 
1035
1035
  // https://vitejs.dev/config/
1036
1036
  export default defineConfig({
1037
- plugins: [react(), intlayer(), intlayerMiddleware()],
1037
+ plugins: [react(), intlayer(), intlayerProxy()],
1038
1038
  });
1039
1039
  ```
1040
1040
 
1041
1041
  ```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
1042
1042
  import { defineConfig } from "vite";
1043
1043
  import react from "@vitejs/plugin-react-swc";
1044
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
1044
+ import { intlayer, intlayerProxy } from "vite-intlayer";
1045
1045
 
1046
1046
  // https://vitejs.dev/config/
1047
1047
  export default defineConfig({
1048
- plugins: [react(), intlayer(), intlayerMiddleware()],
1048
+ plugins: [react(), intlayer(), intlayerProxy()],
1049
1049
  });
1050
1050
  ```
1051
1051
 
1052
1052
  ```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
1053
1053
  const { defineConfig } = require("vite");
1054
1054
  const react = require("@vitejs/plugin-react-swc");
1055
- const { intlayer, intlayerMiddleware } = require("vite-intlayer");
1055
+ const { intlayer, intlayerProxy } = require("vite-intlayer");
1056
1056
 
1057
1057
  // https://vitejs.dev/config/
1058
1058
  module.exports = defineConfig({
1059
- plugins: [react(), intlayer(), intlayerMiddleware()],
1059
+ plugins: [react(), intlayer(), intlayerProxy()],
1060
1060
  });
1061
1061
  ```
1062
1062
 
@@ -702,46 +702,46 @@ import LocaleSwitcher from "@components/LocaleSwitcher.vue";
702
702
  </template>
703
703
  ```
704
704
 
705
- Parallel dazu können Sie auch das `intlayerMiddleware` 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.
705
+ 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.
706
706
 
707
707
  ```typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
708
708
  import { defineConfig } from "vite";
709
709
  import vue from "@vitejs/plugin-vue";
710
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
710
+ import { intlayer, intlayerProxy } from "vite-intlayer";
711
711
 
712
712
  // https://vitejs.dev/config/
713
713
  export default defineConfig({
714
- plugins: [vue(), intlayer(), intlayerMiddleware()],
714
+ plugins: [vue(), intlayer(), intlayerProxy()],
715
715
  });
716
716
  ```
717
717
 
718
718
  ```javascript {3,7} fileName="vite.config.mjs" codeFormat="esm"
719
719
  import { defineConfig } from "vite";
720
720
  import vue from "@vitejs/plugin-vue";
721
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
721
+ import { intlayer, intlayerProxy } from "vite-intlayer";
722
722
 
723
723
  // https://vitejs.dev/config/
724
724
  export default defineConfig({
725
- plugins: [vue(), intlayer(), intlayerMiddleware()],
725
+ plugins: [vue(), intlayer(), intlayerProxy()],
726
726
  });
727
727
  ```
728
728
 
729
729
  ```javascript {3,7} fileName="vite.config.cjs" codeFormat="commonjs"
730
730
  const { defineConfig } = require("vite");
731
731
  const vue = require("@vitejs/plugin-vue");
732
- const { intlayer, intlayerMiddleware } = require("vite-intlayer");
732
+ const { intlayer, intlayerProxy } = require("vite-intlayer");
733
733
 
734
734
  // https://vitejs.dev/config/
735
735
  module.exports = defineConfig({
736
- plugins: [vue(), intlayer(), intlayerMiddleware()],
736
+ plugins: [vue(), intlayer(), intlayerProxy()],
737
737
  });
738
738
  const { defineConfig } = require("vite");
739
739
  const vue = require("@vitejs/plugin-vue");
740
- const { intlayer, intlayerMiddleware } = require("vite-intlayer");
740
+ const { intlayer, intlayerProxy } = require("vite-intlayer");
741
741
 
742
742
  // https://vitejs.dev/config/
743
743
  module.exports = defineConfig({
744
- plugins: [vue(), intlayer(), intlayerMiddleware()],
744
+ plugins: [vue(), intlayer(), intlayerProxy()],
745
745
  });
746
746
  ```
747
747
 
@@ -276,7 +276,7 @@ This approach allows you to:
276
276
 
277
277
  GitHub stars are a strong indicator of a project's popularity, community trust, and long-term relevance. While not a direct measure of technical quality, they reflect how many developers find the project useful, follow its progress, and are likely to adopt it. For estimating the value of a project, stars help compare traction across alternatives and provide insights into ecosystem growth.
278
278
 
279
- [![Star History Chart](https://api.star-history.com/svg?repos=formatjs/formatjs&repos=i18next/react-i18next&repos=i18next/i18next&repos=i18next/next-i18next&repos=lingui/js-lingui&repos=amannn/next-intl&repos=intlify/vue-i18n&repos=aymericzip/intlayer&type=Date)](https://www.star-history.com/#formatjs/formatjs&i18next/react-i18next&i18next/i18next&i18next/next-i18next&lingui/js-lingui&amannn/next-intl&intlify/vue-i18n&aymericzip/intlayer)
279
+ [![Star History Chart](https://api.star-history.com/svg?repos=formatjs/formatjs&repos=i18next/react-i18next&repos=i18next/i18next&repos=i18next/next-i18next&repos=lingui/js-lingui&repos=amannn/next-intl&repos=intlify/vue-i18n&repo=opral/monorepo&repos=aymericzip/intlayer&type=Date)](https://www.star-history.com/#formatjs/formatjs&i18next/react-i18next&i18next/i18next&i18next/next-i18next&lingui/js-lingui&amannn/next-intl&intlify/vue-i18n&opral/monorepo&aymericzip/intlayer)
280
280
 
281
281
  ---
282
282
 
@@ -165,7 +165,7 @@ export default withIntlayer(nextConfig);
165
165
  Set up middleware to automatically detect and handle the user's preferred locale:
166
166
 
167
167
  ```typescript fileName="src/middleware.ts" codeFormat="typescript"
168
- export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
168
+ export { intlayerProxy as middleware } from "next-intlayer/middleware";
169
169
 
170
170
  export const config = {
171
171
  matcher:
@@ -174,7 +174,7 @@ export const config = {
174
174
  ```
175
175
 
176
176
  ```javascript fileName="src/middleware.mjs" codeFormat="esm"
177
- export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
177
+ export { intlayerProxy as middleware } from "next-intlayer/middleware";
178
178
 
179
179
  export const config = {
180
180
  matcher:
@@ -183,14 +183,14 @@ export const config = {
183
183
  ```
184
184
 
185
185
  ```javascript fileName="src/middleware.cjs" codeFormat="commonjs"
186
- const { intlayerMiddleware } = require("next-intlayer/middleware");
186
+ const { intlayerProxy } = require("next-intlayer/middleware");
187
187
 
188
188
  const config = {
189
189
  matcher:
190
190
  "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
191
191
  };
192
192
 
193
- module.exports = { middleware: intlayerMiddleware, config };
193
+ module.exports = { middleware: intlayerProxy, config };
194
194
  ```
195
195
 
196
196
  > Adapt the `matcher` parameter to match the routes of your application. For more details, refer to the [Next.js documentation on configuring the matcher](https://nextjs.org/docs/app/building-your-application/routing/middleware).
@@ -1106,7 +1106,6 @@ import Link from "next/link";
1106
1106
 
1107
1107
  const LocaleSwitcher: FC = () => {
1108
1108
  const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
1109
- const { setLocaleCookie } = useLocaleCookie();
1110
1109
 
1111
1110
  return (
1112
1111
  <div>
@@ -1118,7 +1117,7 @@ const LocaleSwitcher: FC = () => {
1118
1117
  hrefLang={localeItem}
1119
1118
  key={localeItem}
1120
1119
  aria-current={locale === localeItem ? "page" : undefined}
1121
- onClick={() => setLocaleCookie(localeItem)}
1120
+ onClick={() => setLocale(localeItem)}
1122
1121
  >
1123
1122
  <span>
1124
1123
  {/* Locale - e.g. FR */}
@@ -1156,7 +1155,6 @@ import Link from "next/link";
1156
1155
 
1157
1156
  const LocaleSwitcher = () => {
1158
1157
  const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
1159
- const { setLocaleCookie } = useLocaleCookie();
1160
1158
 
1161
1159
  return (
1162
1160
  <div>
@@ -1168,7 +1166,7 @@ const LocaleSwitcher = () => {
1168
1166
  hrefLang={localeItem}
1169
1167
  key={localeItem}
1170
1168
  aria-current={locale === localeItem ? "page" : undefined}
1171
- onClick={() => setLocaleCookie(localeItem)}
1169
+ onClick={() => setLocale(localeItem)}
1172
1170
  >
1173
1171
  <span>
1174
1172
  {/* Locale - e.g. FR */}
@@ -1206,7 +1204,6 @@ const Link = require("next/link");
1206
1204
 
1207
1205
  const LocaleSwitcher = () => {
1208
1206
  const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter();
1209
- const { setLocaleCookie } = useLocaleCookie();
1210
1207
 
1211
1208
  return (
1212
1209
  <select>
@@ -1216,7 +1213,7 @@ const LocaleSwitcher = () => {
1216
1213
  href={getLocalizedUrl(pathWithoutLocale, localeItem)}
1217
1214
  hrefLang={localeItem}
1218
1215
  aria-current={locale === localeItem ? "page" : undefined}
1219
- onClick={() => setLocaleCookie(localeItem)}
1216
+ onClick={() => setLocale(localeItem)}
1220
1217
  >
1221
1218
  <span>
1222
1219
  {/* Locale - e.g. FR */}
@@ -326,7 +326,7 @@ import {
326
326
  getLocalizedUrl,
327
327
  getPathWithoutLocale,
328
328
  } from "intlayer";
329
- import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
329
+ import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
330
330
  import { Link, useLocation } from "react-router";
331
331
 
332
332
  export const LocaleSwitcher: FC = () => {
@@ -344,7 +344,7 @@ export const LocaleSwitcher: FC = () => {
344
344
  <Link
345
345
  aria-current={localeItem === locale ? "page" : undefined}
346
346
  aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeItem)}`}
347
- onClick={() => setLocaleCookie(localeItem)}
347
+ onClick={() => setLocale(localeItem)}
348
348
  to={getLocalizedUrl(pathWithoutLocale, localeItem)}
349
349
  >
350
350
  <span>
@@ -413,18 +413,18 @@ export default function RootLayout() {
413
413
 
414
414
  ### Step 11: Add middleware (Optional)
415
415
 
416
- You can also use the `intlayerMiddleware` to add server-side routing to your application. This plugin will automatically detect the current locale based on the URL and set the appropriate locale cookie. If no locale is specified, the plugin will determine the most appropriate locale based on the user's browser language preferences. If no locale is detected, it will redirect to the default locale.
416
+ You can also use the `intlayerProxy` to add server-side routing to your application. This plugin will automatically detect the current locale based on the URL and set the appropriate locale cookie. If no locale is specified, the plugin will determine the most appropriate locale based on the user's browser language preferences. If no locale is detected, it will redirect to the default locale.
417
417
 
418
- > Note that to use the `intlayerMiddleware` in production, you need to switch the `vite-intlayer` package from `devDependencies` to `dependencies`.
418
+ > Note that to use the `intlayerProxy` in production, you need to switch the `vite-intlayer` package from `devDependencies` to `dependencies`.
419
419
 
420
420
  ```typescript {3,7} fileName="vite.config.ts"
421
421
  import { defineConfig } from "vite";
422
422
  import react from "@vitejs/plugin-react-swc";
423
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
423
+ import { intlayer, intlayerProxy } from "vite-intlayer";
424
424
 
425
425
  // https://vitejs.dev/config/
426
426
  export default defineConfig({
427
- plugins: [react(), intlayer(), intlayerMiddleware()],
427
+ plugins: [react(), intlayer(), intlayerProxy()],
428
428
  });
429
429
  ```
430
430
 
@@ -18,6 +18,9 @@ slugs:
18
18
  - tanstack-start
19
19
  applicationTemplate: https://github.com/aymericzip/intlayer-tanstack-start-template
20
20
  history:
21
+ - version: 7.1.0
22
+ date: 2025-11-17
23
+ changes: Fix prefix default by adding getPrefix function useLocalizedNavigate, LocaleSwitcher and LocalizedLink.
21
24
  - version: 6.5.2
22
25
  date: 2025-10-03
23
26
  changes: Update doc
@@ -154,6 +157,12 @@ function LayoutComponent() {
154
157
  }
155
158
  ```
156
159
 
160
+ > Here, `{-$locale}` is a dynamic route parameter that gets replaced with the current locale. This notation makes the slot optional, allowing it to work with routing modes such as `'prefix-no-default'` etc.
161
+
162
+ > Be aware that this slot may cause issues if you use multiple dynamic segments in the same route (e.g., `/{-$locale}/other-path/$anotherDynamicPath/...`).
163
+ > For the `'prefix-all'` mode, you may prefer switching the slot to `$locale` instead.
164
+ > For the `'no-prefix'` or `'search-params'` mode, you can remove the slot entirely.
165
+
157
166
  ### Step 6: Declare Your Content
158
167
 
159
168
  Create and manage your content declarations to store translations:
@@ -209,6 +218,7 @@ import type { FC } from "react";
209
218
 
210
219
  import { Link, type LinkComponentProps } from "@tanstack/react-router";
211
220
  import { useLocale } from "react-intlayer";
221
+ import { getPrefix } from "intlayer";
212
222
 
213
223
  export const LOCALE_ROUTE = "{-$locale}" as const;
214
224
 
@@ -238,12 +248,13 @@ type RemoveLocaleFromString<S extends string> = CollapseDoubleSlashes<
238
248
 
239
249
  export const LocalizedLink: FC<LocalizedLinkProps> = (props) => {
240
250
  const { locale } = useLocale();
251
+ const { localePrefix } = getPrefix(locale);
241
252
 
242
253
  return (
243
254
  <Link
244
255
  {...props}
245
256
  params={{
246
- locale,
257
+ locale: localePrefix,
247
258
  ...(typeof props?.params === "object" ? props?.params : {}),
248
259
  }}
249
260
  to={`/${LOCALE_ROUTE}${props.to}` as LinkComponentProps["to"]}
@@ -260,43 +271,52 @@ This component has two objectives:
260
271
  Then we can create a `useLocalizedNavigate` hook for programmatic navigation:
261
272
 
262
273
  ```tsx fileName="src/hooks/useLocalizedNavigate.tsx"
263
- import { useLocale } from "react-intlayer";
264
274
  import { useNavigate } from "@tanstack/react-router";
275
+ import { getPrefix } from "intlayer";
276
+ import { useLocale } from "react-intlayer";
265
277
  import { LOCALE_ROUTE } from "@/components/localized-link";
266
278
  import type { FileRouteTypes } from "@/routeTree.gen";
267
279
 
280
+ type StripLocalePrefix<T extends string> = T extends
281
+ | `/${typeof LOCALE_ROUTE}`
282
+ | `/${typeof LOCALE_ROUTE}/`
283
+ ? "/"
284
+ : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
285
+ ? `/${Rest}`
286
+ : never;
287
+
288
+ type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
289
+
290
+ type LocalizedNavigate = {
291
+ (to: LocalizedTo): ReturnType<ReturnType<typeof useNavigate>>;
292
+ (
293
+ opts: { to: LocalizedTo } & Record<string, unknown>
294
+ ): ReturnType<ReturnType<typeof useNavigate>>;
295
+ };
296
+
268
297
  export const useLocalizedNavigate = () => {
269
298
  const navigate = useNavigate();
270
299
 
271
300
  const { locale } = useLocale();
272
301
 
273
- type StripLocalePrefix<T extends string> = T extends
274
- | `/${typeof LOCALE_ROUTE}`
275
- | `/${typeof LOCALE_ROUTE}/`
276
- ? "/"
277
- : T extends `/${typeof LOCALE_ROUTE}/${infer Rest}`
278
- ? `/${Rest}`
279
- : never;
280
-
281
- type LocalizedTo = StripLocalePrefix<FileRouteTypes["to"]>;
282
-
283
- interface LocalizedNavigate {
284
- (to: LocalizedTo): ReturnType<typeof navigate>;
285
- (
286
- opts: { to: LocalizedTo } & Record<string, unknown>
287
- ): ReturnType<typeof navigate>;
288
- }
289
-
290
302
  const localizedNavigate: LocalizedNavigate = (args: any) => {
303
+ const { localePrefix } = getPrefix(locale);
304
+
291
305
  if (typeof args === "string") {
292
- return navigate({ to: `/${LOCALE_ROUTE}${args}`, params: { locale } });
306
+ return navigate({
307
+ to: `/${LOCALE_ROUTE}${args}`,
308
+ params: { locale: localePrefix },
309
+ });
293
310
  }
294
311
 
295
312
  const { to, ...rest } = args;
296
313
 
297
- const localedTo = `/${LOCALE_ROUTE}${to}` as any;
314
+ const localizedTo = `/${LOCALE_ROUTE}${to}` as any;
298
315
 
299
- return navigate({ to: localedTo, params: { locale, ...rest } as any });
316
+ return navigate({
317
+ to: localizedTo,
318
+ params: { locale: localePrefix, ...rest } as any,
319
+ });
300
320
  };
301
321
 
302
322
  return localizedNavigate;
@@ -367,13 +387,17 @@ function RouteComponent() {
367
387
  Create a component to allow users to change languages:
368
388
 
369
389
  ```tsx fileName="src/components/locale-switcher.tsx"
370
- import type { FC } from "react";
371
-
372
390
  import { useLocation } from "@tanstack/react-router";
373
- import { getHTMLTextDir, getLocaleName, getPathWithoutLocale } from "intlayer";
374
- import { setLocaleCookie, useIntlayer, useLocale } from "react-intlayer";
391
+ import {
392
+ getHTMLTextDir,
393
+ getLocaleName,
394
+ getPathWithoutLocale,
395
+ getPrefix,
396
+ } from "intlayer";
397
+ import type { FC } from "react";
398
+ import { setLocaleInStorage, useIntlayer, useLocale } from "react-intlayer";
375
399
 
376
- import { LocalizedLink, To } from "./localized-link";
400
+ import { LocalizedLink, type To } from "./localized-link";
377
401
 
378
402
  export const LocaleSwitcher: FC = () => {
379
403
  const { localeSwitcherLabel } = useIntlayer("locale-switcher");
@@ -390,8 +414,8 @@ export const LocaleSwitcher: FC = () => {
390
414
  <LocalizedLink
391
415
  aria-current={localeEl === locale ? "page" : undefined}
392
416
  aria-label={`${localeSwitcherLabel.value} ${getLocaleName(localeEl)}`}
393
- onClick={() => setLocaleCookie(localeEl)}
394
- params={{ locale: localeEl }}
417
+ onClick={() => setLocaleInStorage(localeEl)}
418
+ params={{ locale: getPrefix(localeEl).localePrefix }}
395
419
  to={pathWithoutLocale as To}
396
420
  >
397
421
  <span>
@@ -470,15 +494,15 @@ function LayoutComponent() {
470
494
 
471
495
  ### Step 11: Add middleware (Optional)
472
496
 
473
- You can also use the `intlayerMiddleware` to add server-side routing to your application. This plugin will automatically detect the current locale based on the URL and set the appropriate locale cookie. If no locale is specified, the plugin will determine the most appropriate locale based on the user's browser language preferences. If no locale is detected, it will redirect to the default locale.
497
+ You can also use the `intlayerProxy` to add server-side routing to your application. This plugin will automatically detect the current locale based on the URL and set the appropriate locale cookie. If no locale is specified, the plugin will determine the most appropriate locale based on the user's browser language preferences. If no locale is detected, it will redirect to the default locale.
474
498
 
475
- > Note that to use the `intlayerMiddleware` in production, you need to switch the `vite-intlayer` package from `devDependencies` to `dependencies`.
499
+ > Note that to use the `intlayerProxy` in production, you need to switch the `vite-intlayer` package from `devDependencies` to `dependencies`.
476
500
 
477
501
  ```typescript {3,7} fileName="vite.config.ts"
478
502
  import { reactRouter } from "@react-router/dev/vite";
479
503
  import tailwindcss from "@tailwindcss/vite";
480
504
  import { defineConfig } from "vite";
481
- import { intlayer, intlayerMiddleware } from "vite-intlayer";
505
+ import { intlayer, intlayerProxy } from "vite-intlayer";
482
506
  import tsconfigPaths from "vite-tsconfig-paths";
483
507
 
484
508
  export default defineConfig({
@@ -487,7 +511,7 @@ export default defineConfig({
487
511
  reactRouter(),
488
512
  tsconfigPaths(),
489
513
  intlayer(),
490
- intlayerMiddleware(),
514
+ intlayerProxy(),
491
515
  ],
492
516
  });
493
517
  ```