intor 2.2.13 → 2.2.15

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 (246) hide show
  1. package/dist/exports/config/index.d.ts +2 -0
  2. package/dist/exports/config/index.js +4 -0
  3. package/dist/exports/index.d.ts +5 -0
  4. package/dist/exports/index.js +11 -0
  5. package/dist/exports/next/index.d.ts +3 -0
  6. package/dist/exports/next/index.js +9 -0
  7. package/dist/exports/next/middleware/index.d.ts +2 -0
  8. package/dist/exports/next/middleware/index.js +2 -0
  9. package/dist/exports/next/server/index.d.ts +2 -0
  10. package/dist/exports/next/server/index.js +2 -0
  11. package/dist/exports/react/index.d.ts +2 -0
  12. package/dist/exports/react/index.js +6 -0
  13. package/dist/exports/server/index.d.ts +2 -0
  14. package/dist/exports/server/index.js +7 -0
  15. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-all.d.ts +12 -0
  16. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-all.js +60 -0
  17. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-except-default.d.ts +16 -0
  18. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-except-default.js +81 -0
  19. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-none.d.ts +10 -0
  20. package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-none.js +22 -0
  21. package/dist/src/adapters/next/middleware/index.d.ts +2 -0
  22. package/dist/src/adapters/next/middleware/intor-middleware.d.ts +6 -0
  23. package/dist/src/adapters/next/middleware/intor-middleware.js +22 -0
  24. package/dist/src/adapters/next/middleware/utils/create-response.d.ts +17 -0
  25. package/dist/src/adapters/next/middleware/utils/create-response.js +42 -0
  26. package/dist/src/adapters/next/middleware/utils/determine-initial-locale.d.ts +8 -0
  27. package/dist/src/adapters/next/middleware/utils/determine-initial-locale.js +28 -0
  28. package/dist/src/adapters/next/middleware/utils/set-locale-cookie-edge.d.ts +15 -0
  29. package/dist/src/adapters/next/middleware/utils/set-locale-cookie-edge.js +24 -0
  30. package/dist/src/adapters/next/middleware/utils/set-pathname-header.d.ts +12 -0
  31. package/dist/src/adapters/next/middleware/utils/set-pathname-header.js +13 -0
  32. package/dist/src/adapters/next/navigation/index.d.ts +4 -0
  33. package/dist/src/adapters/next/navigation/link.d.ts +16 -0
  34. package/dist/src/adapters/next/navigation/link.js +25 -0
  35. package/dist/src/adapters/next/navigation/redirect.d.ts +16 -0
  36. package/dist/src/adapters/next/navigation/redirect.js +36 -0
  37. package/dist/src/adapters/next/navigation/use-pathname.d.ts +17 -0
  38. package/dist/src/adapters/next/navigation/use-pathname.js +49 -0
  39. package/dist/src/adapters/next/navigation/use-router.d.ts +20 -0
  40. package/dist/src/adapters/next/navigation/use-router.js +31 -0
  41. package/dist/src/adapters/next/navigation/utils/should-full-reload.d.ts +7 -0
  42. package/dist/src/adapters/next/navigation/utils/should-full-reload.js +19 -0
  43. package/dist/src/adapters/next/navigation/utils/use-locale-switch.d.ts +16 -0
  44. package/dist/src/adapters/next/navigation/utils/use-locale-switch.js +58 -0
  45. package/dist/src/adapters/next/server/get-i18n-context.d.ts +9 -0
  46. package/dist/src/adapters/next/server/get-i18n-context.js +47 -0
  47. package/dist/src/adapters/next/server/get-translator.d.ts +30 -0
  48. package/dist/src/adapters/next/server/get-translator.js +19 -0
  49. package/dist/src/adapters/next/server/index.d.ts +2 -0
  50. package/dist/src/adapters/next/shared/constants/pathname-header-name.d.ts +1 -0
  51. package/dist/src/adapters/next/shared/constants/pathname-header-name.js +4 -0
  52. package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.d.ts +16 -0
  53. package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.js +33 -0
  54. package/dist/src/adapters/next/shared/utils/localize-pathname.d.ts +18 -0
  55. package/dist/src/adapters/next/shared/utils/localize-pathname.js +36 -0
  56. package/dist/src/client/react/contexts/config/context.d.ts +3 -0
  57. package/dist/src/client/react/contexts/config/context.js +6 -0
  58. package/dist/src/client/react/contexts/config/hook.d.ts +2 -0
  59. package/dist/src/client/react/contexts/config/hook.js +12 -0
  60. package/dist/src/client/react/contexts/config/index.d.ts +2 -0
  61. package/dist/src/client/react/contexts/config/provider.d.ts +2 -0
  62. package/dist/src/client/react/contexts/config/provider.js +11 -0
  63. package/dist/src/client/react/contexts/config/types.d.ts +10 -0
  64. package/dist/src/client/react/contexts/intor-provider/index.d.ts +2 -0
  65. package/dist/src/client/react/contexts/intor-provider/intor-provider.d.ts +2 -0
  66. package/dist/src/client/react/contexts/intor-provider/intor-provider.js +17 -0
  67. package/dist/src/client/react/contexts/intor-provider/types.d.ts +14 -0
  68. package/dist/src/client/react/contexts/locale/context.d.ts +3 -0
  69. package/dist/src/client/react/contexts/locale/context.js +6 -0
  70. package/dist/src/client/react/contexts/locale/hook.d.ts +1 -0
  71. package/dist/src/client/react/contexts/locale/hook.js +12 -0
  72. package/dist/src/client/react/contexts/locale/index.d.ts +2 -0
  73. package/dist/src/client/react/contexts/locale/provider.d.ts +3 -0
  74. package/dist/src/client/react/contexts/locale/provider.js +48 -0
  75. package/dist/src/client/react/contexts/locale/types.d.ts +13 -0
  76. package/dist/src/client/react/contexts/locale/utils/change-locale.d.ts +22 -0
  77. package/dist/src/client/react/contexts/locale/utils/change-locale.js +35 -0
  78. package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.d.ts +8 -0
  79. package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.js +28 -0
  80. package/dist/src/client/react/contexts/messages/context.d.ts +3 -0
  81. package/dist/src/client/react/contexts/messages/context.js +6 -0
  82. package/dist/src/client/react/contexts/messages/hook.d.ts +2 -0
  83. package/dist/src/client/react/contexts/messages/hook.js +12 -0
  84. package/dist/src/client/react/contexts/messages/index.d.ts +2 -0
  85. package/dist/src/client/react/contexts/messages/provider.d.ts +3 -0
  86. package/dist/src/client/react/contexts/messages/provider.js +32 -0
  87. package/dist/src/client/react/contexts/messages/types.d.ts +15 -0
  88. package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +16 -0
  89. package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.js +57 -0
  90. package/dist/src/client/react/contexts/translate-handlers/context.d.ts +2 -0
  91. package/dist/src/client/react/contexts/translate-handlers/context.js +6 -0
  92. package/dist/src/client/react/contexts/translate-handlers/hook.d.ts +2 -0
  93. package/dist/src/client/react/contexts/translate-handlers/hook.js +10 -0
  94. package/dist/src/client/react/contexts/translate-handlers/index.d.ts +3 -0
  95. package/dist/src/client/react/contexts/translate-handlers/provider.d.ts +2 -0
  96. package/dist/src/client/react/contexts/translate-handlers/provider.js +11 -0
  97. package/dist/src/client/react/contexts/translate-handlers/types.d.ts +7 -0
  98. package/dist/src/client/react/contexts/translator/context.d.ts +3 -0
  99. package/dist/src/client/react/contexts/translator/context.js +6 -0
  100. package/dist/src/client/react/contexts/translator/hook.d.ts +2 -0
  101. package/dist/src/client/react/contexts/translator/hook.js +12 -0
  102. package/dist/src/client/react/contexts/translator/index.d.ts +2 -0
  103. package/dist/src/client/react/contexts/translator/provider.d.ts +2 -0
  104. package/dist/src/client/react/contexts/translator/provider.js +53 -0
  105. package/dist/src/client/react/contexts/translator/types.d.ts +11 -0
  106. package/dist/src/client/react/hooks/use-translator.d.ts +12 -0
  107. package/dist/src/client/react/hooks/use-translator.js +38 -0
  108. package/dist/src/client/react/index.d.ts +4 -0
  109. package/dist/src/client/shared/utils/get-initial-locale.d.ts +11 -0
  110. package/dist/src/client/shared/utils/get-initial-locale.js +21 -0
  111. package/dist/src/config/constants/cache.constants.d.ts +2 -0
  112. package/dist/src/config/constants/cache.constants.js +7 -0
  113. package/dist/src/config/constants/cookie.constants.d.ts +2 -0
  114. package/dist/src/config/constants/cookie.constants.js +14 -0
  115. package/dist/src/config/constants/routing.constants.d.ts +2 -0
  116. package/dist/src/config/constants/routing.constants.js +11 -0
  117. package/dist/src/config/define-intor-config.d.ts +2 -0
  118. package/dist/src/config/define-intor-config.js +34 -0
  119. package/dist/src/config/index.d.ts +5 -0
  120. package/dist/src/config/resolvers/resolve-cache-options.d.ts +2 -0
  121. package/dist/src/config/resolvers/resolve-cache-options.js +10 -0
  122. package/dist/src/config/resolvers/resolve-cookie-options.d.ts +11 -0
  123. package/dist/src/config/resolvers/resolve-cookie-options.js +19 -0
  124. package/dist/src/config/resolvers/resolve-fallback-locales.d.ts +3 -0
  125. package/dist/src/config/resolvers/resolve-fallback-locales.js +33 -0
  126. package/dist/src/config/resolvers/resolve-routing-options.d.ts +13 -0
  127. package/dist/src/config/resolvers/resolve-routing-options.js +28 -0
  128. package/dist/src/config/types/cache.types.d.ts +7 -0
  129. package/dist/src/config/types/cookie.types.d.ts +23 -0
  130. package/dist/src/config/types/intor-config.types.d.ts +41 -0
  131. package/dist/src/config/types/loader.types.d.ts +38 -0
  132. package/dist/src/config/types/logger.types.d.ts +7 -0
  133. package/dist/src/config/types/routing.types.d.ts +15 -0
  134. package/dist/src/config/types/translator.types.d.ts +4 -0
  135. package/dist/src/config/validators/validate-default-locale.d.ts +3 -0
  136. package/dist/src/config/validators/validate-default-locale.js +24 -0
  137. package/dist/src/config/validators/validate-supported-locales.d.ts +7 -0
  138. package/dist/src/config/validators/validate-supported-locales.js +22 -0
  139. package/dist/src/server/index.d.ts +4 -0
  140. package/dist/src/server/intor/index.d.ts +2 -0
  141. package/dist/src/server/intor/intor.d.ts +14 -0
  142. package/dist/src/server/intor/intor.js +67 -0
  143. package/dist/src/server/intor/types.d.ts +14 -0
  144. package/dist/src/server/messages/index.d.ts +7 -0
  145. package/dist/src/server/messages/load-local-messages/index.d.ts +2 -0
  146. package/dist/src/server/messages/load-local-messages/load-local-messages.d.ts +11 -0
  147. package/dist/src/server/messages/load-local-messages/load-local-messages.js +85 -0
  148. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +29 -0
  149. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +95 -0
  150. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/index.d.ts +1 -0
  151. package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +15 -0
  152. package/dist/src/server/messages/load-local-messages/read-locale-messages/index.d.ts +2 -0
  153. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/index.d.ts +1 -0
  154. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +34 -0
  155. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +85 -0
  156. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +18 -0
  157. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +6 -0
  158. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +12 -0
  159. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +14 -0
  160. package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +21 -0
  161. package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +10 -0
  162. package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +31 -0
  163. package/dist/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +23 -0
  164. package/dist/src/server/messages/load-local-messages/types.d.ts +21 -0
  165. package/dist/src/server/messages/load-messages.d.ts +11 -0
  166. package/dist/src/server/messages/load-messages.js +77 -0
  167. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +9 -0
  168. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +50 -0
  169. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/index.d.ts +1 -0
  170. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +13 -0
  171. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +5 -0
  172. package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
  173. package/dist/src/server/messages/load-remote-messages/index.d.ts +2 -0
  174. package/dist/src/server/messages/load-remote-messages/load-remote-messages.d.ts +9 -0
  175. package/dist/src/server/messages/load-remote-messages/load-remote-messages.js +79 -0
  176. package/dist/src/server/messages/load-remote-messages/types.d.ts +20 -0
  177. package/dist/src/server/messages/shared/global-messages-pool.d.ts +15 -0
  178. package/dist/src/server/messages/shared/global-messages-pool.js +10 -0
  179. package/dist/src/server/messages/shared/types.d.ts +39 -0
  180. package/dist/src/server/messages/shared/utils/is-valid-messages.d.ts +15 -0
  181. package/dist/src/server/messages/shared/utils/is-valid-messages.js +36 -0
  182. package/dist/src/server/messages/types.d.ts +15 -0
  183. package/dist/src/server/shared/logger/get-logger.d.ts +11 -0
  184. package/dist/src/server/shared/logger/get-logger.js +34 -0
  185. package/dist/src/server/shared/logger/global-logger-pool.d.ts +15 -0
  186. package/dist/src/server/shared/logger/global-logger-pool.js +8 -0
  187. package/dist/src/server/translator/get-translator.d.ts +33 -0
  188. package/dist/src/server/translator/get-translator.js +39 -0
  189. package/dist/src/server/translator/index.d.ts +1 -0
  190. package/dist/src/shared/constants/prefix-placeholder.d.ts +1 -0
  191. package/dist/src/shared/constants/prefix-placeholder.js +4 -0
  192. package/dist/src/shared/error/index.d.ts +1 -0
  193. package/dist/src/shared/error/intor-error.d.ts +16 -0
  194. package/dist/src/shared/error/intor-error.js +21 -0
  195. package/dist/src/shared/types/generated.types.d.ts +30 -0
  196. package/dist/src/shared/types/translator-instance.types.d.ts +33 -0
  197. package/dist/src/shared/utils/client/build-cookie-string.d.ts +9 -0
  198. package/dist/src/shared/utils/client/build-cookie-string.js +33 -0
  199. package/dist/src/shared/utils/client/set-locale-cookie-browser.d.ts +13 -0
  200. package/dist/src/shared/utils/client/set-locale-cookie-browser.js +21 -0
  201. package/dist/src/shared/utils/index.d.ts +8 -0
  202. package/dist/src/shared/utils/locale/normalize-locale.d.ts +4 -0
  203. package/dist/src/shared/utils/locale/normalize-locale.js +42 -0
  204. package/dist/src/shared/utils/locale/resolve-preferred-locale.d.ts +5 -0
  205. package/dist/src/shared/utils/locale/resolve-preferred-locale.js +26 -0
  206. package/dist/src/shared/utils/merge-messages.d.ts +6 -0
  207. package/dist/src/shared/utils/merge-messages.js +13 -0
  208. package/dist/src/shared/utils/normalize-cache-key.d.ts +3 -0
  209. package/dist/src/shared/utils/normalize-cache-key.js +29 -0
  210. package/dist/src/shared/utils/pathname/extract-pathname.d.ts +28 -0
  211. package/dist/src/shared/utils/pathname/extract-pathname.js +58 -0
  212. package/dist/src/shared/utils/pathname/normalize-pathname.d.ts +12 -0
  213. package/dist/src/shared/utils/pathname/normalize-pathname.js +43 -0
  214. package/dist/src/shared/utils/pathname/standardize-pathname.d.ts +18 -0
  215. package/dist/src/shared/utils/pathname/standardize-pathname.js +30 -0
  216. package/dist/src/shared/utils/resolve-namespaces.d.ts +10 -0
  217. package/dist/src/shared/utils/resolve-namespaces.js +33 -0
  218. package/package.json +28 -30
  219. package/dist/config/index.cjs +0 -198
  220. package/dist/config/index.d.cts +0 -145
  221. package/dist/config/index.d.ts +0 -145
  222. package/dist/config/index.js +0 -193
  223. package/dist/index.cjs +0 -234
  224. package/dist/index.d.cts +0 -224
  225. package/dist/index.d.ts +0 -224
  226. package/dist/index.js +0 -214
  227. package/dist/next/index.cjs +0 -940
  228. package/dist/next/index.d.cts +0 -282
  229. package/dist/next/index.d.ts +0 -282
  230. package/dist/next/index.js +0 -907
  231. package/dist/next/middleware/index.cjs +0 -387
  232. package/dist/next/middleware/index.d.cts +0 -128
  233. package/dist/next/middleware/index.d.ts +0 -128
  234. package/dist/next/middleware/index.js +0 -384
  235. package/dist/next/server/index.cjs +0 -734
  236. package/dist/next/server/index.d.cts +0 -277
  237. package/dist/next/server/index.d.ts +0 -277
  238. package/dist/next/server/index.js +0 -723
  239. package/dist/react/index.cjs +0 -649
  240. package/dist/react/index.d.cts +0 -224
  241. package/dist/react/index.d.ts +0 -224
  242. package/dist/react/index.js +0 -620
  243. package/dist/server/index.cjs +0 -696
  244. package/dist/server/index.d.cts +0 -377
  245. package/dist/server/index.d.ts +0 -377
  246. package/dist/server/index.js +0 -680
@@ -1,907 +0,0 @@
1
- import { formatUrl } from 'next/dist/shared/lib/router/utils/format-url';
2
- import NextLink from 'next/link';
3
- import * as React7 from 'react';
4
- import { usePathname as usePathname$1, useRouter as useRouter$1, redirect as redirect$1 } from 'next/navigation';
5
- import merge from 'lodash.merge';
6
- import { jsx } from 'react/jsx-runtime';
7
- import { logry } from 'logry';
8
- import Keyv from 'keyv';
9
- import { cookies, headers } from 'next/headers';
10
- import { Translator } from 'intor-translator';
11
-
12
- // src/adapters/next/navigation/link.tsx
13
-
14
- // src/shared/constants/prefix-placeholder.ts
15
- var PREFIX_PLACEHOLDER = "{locale}";
16
- var mergeMessages = (staticMessages = {}, loadedMessages = {}) => {
17
- if (!loadedMessages) return { ...staticMessages };
18
- return merge({}, staticMessages, loadedMessages);
19
- };
20
-
21
- // src/shared/utils/normalize-cache-key.ts
22
- var CACHE_KEY_DELIMITER = "|";
23
- var sanitize = (k) => k.replaceAll(/[\u200B-\u200D\uFEFF]/g, "").replaceAll(/[\r\n]/g, "").trim();
24
- var normalizeCacheKey = (key, delimiter = CACHE_KEY_DELIMITER) => {
25
- if (key === null || key === void 0) return null;
26
- if (Array.isArray(key)) {
27
- if (key.length === 0) return null;
28
- const normalized = key.map((k) => {
29
- if (k === null) return "__null";
30
- if (k === void 0) return "__undefined";
31
- if (typeof k === "boolean") return k ? "__true" : "__false";
32
- return sanitize(String(k));
33
- });
34
- return normalized.join(delimiter);
35
- }
36
- if (typeof key === "boolean") return key ? "__true" : "__false";
37
- return String(key);
38
- };
39
-
40
- // src/shared/utils/resolve-namespaces.ts
41
- var resolveNamespaces = ({
42
- config,
43
- pathname
44
- }) => {
45
- const { loader } = config;
46
- const { routeNamespaces = {}, namespaces } = loader || {};
47
- if (Object.keys(routeNamespaces).length === 0 && !namespaces)
48
- return void 0;
49
- const standardizedPathname = standardizePathname({ config, pathname });
50
- const placeholderRemovedPathname = standardizedPathname.replace(
51
- `/${PREFIX_PLACEHOLDER}`,
52
- ""
53
- );
54
- const collected = [
55
- ...routeNamespaces.default || [],
56
- // default
57
- ...namespaces || [],
58
- // default
59
- ...routeNamespaces[standardizedPathname] || [],
60
- // exact match
61
- ...routeNamespaces[placeholderRemovedPathname] || []
62
- // exact match
63
- ];
64
- const prefixPatterns = Object.keys(routeNamespaces).filter(
65
- (pattern) => pattern.endsWith("/*")
66
- );
67
- for (const pattern of prefixPatterns) {
68
- const basePath = pattern.replace(/\/\*$/, "");
69
- if (standardizedPathname.startsWith(basePath) || placeholderRemovedPathname.startsWith(basePath)) {
70
- collected.push(...routeNamespaces[pattern] || []);
71
- }
72
- }
73
- return [...new Set(collected)];
74
- };
75
-
76
- // src/shared/utils/locale/normalize-locale.ts
77
- var toCanonical = (input) => {
78
- try {
79
- return Intl.getCanonicalLocales(input)[0]?.toLowerCase();
80
- } catch {
81
- return;
82
- }
83
- };
84
- var normalizeLocale = (locale = "", supportedLocales = []) => {
85
- if (!locale || supportedLocales.length === 0) return;
86
- const canonicalLocale = toCanonical(locale);
87
- if (!canonicalLocale) return;
88
- const supportedCanonicalMap = /* @__PURE__ */ new Map();
89
- for (const l of supportedLocales) {
90
- const normalized = toCanonical(l);
91
- if (normalized) {
92
- supportedCanonicalMap.set(normalized, l);
93
- }
94
- }
95
- if (supportedCanonicalMap.has(canonicalLocale)) {
96
- return supportedCanonicalMap.get(canonicalLocale);
97
- }
98
- const baseLang = canonicalLocale.split("-")[0];
99
- for (const [key, original] of supportedCanonicalMap) {
100
- const supportedBase = key.split("-")[0];
101
- if (supportedBase === baseLang) {
102
- return original;
103
- }
104
- }
105
- return;
106
- };
107
-
108
- // src/shared/utils/locale/resolve-preferred-locale.ts
109
- var resolvePreferredLocale = (acceptLanguageHeader, supportedLocales) => {
110
- if (!acceptLanguageHeader || !supportedLocales || supportedLocales.length === 0) {
111
- return;
112
- }
113
- const supportedLocalesSet = new Set(supportedLocales);
114
- const preferred = acceptLanguageHeader.split(",").map((part) => {
115
- const [lang, qValue] = part.split(";");
116
- const q = qValue ? Number.parseFloat(qValue.split("=")[1]) : 1;
117
- if (Number.isNaN(q)) {
118
- return { lang: lang.trim(), q: 0 };
119
- }
120
- return { lang: lang.trim(), q };
121
- }).toSorted((a, b) => b.q - a.q).find(({ lang }) => supportedLocalesSet.has(lang))?.lang;
122
- return preferred;
123
- };
124
-
125
- // src/shared/utils/pathname/normalize-pathname.ts
126
- var normalizePathname = (rawPathname, options = {}) => {
127
- const length = rawPathname.length;
128
- let start = 0;
129
- let end = length - 1;
130
- while (start <= end && (rawPathname.codePointAt(start) ?? 0) <= 32) start++;
131
- while (end >= start && (rawPathname.codePointAt(end) ?? 0) <= 32) end--;
132
- if (start > end) return "/";
133
- let result = "";
134
- let hasSlash = false;
135
- for (let i = start; i <= end; i++) {
136
- const char = rawPathname[i];
137
- if (char === "/") {
138
- if (!hasSlash) {
139
- hasSlash = true;
140
- }
141
- } else {
142
- result += hasSlash || result === "" ? "/" + char : char;
143
- hasSlash = false;
144
- }
145
- }
146
- if (options.removeLeadingSlash && result.startsWith("/")) {
147
- result = result.slice(1);
148
- }
149
- return result || "/";
150
- };
151
-
152
- // src/shared/utils/pathname/extract-pathname.ts
153
- var extractPathname = ({
154
- config,
155
- pathname: rawPathname
156
- }) => {
157
- const { routing, defaultLocale } = config;
158
- const { basePath, prefix } = routing;
159
- const normalizedPathname = normalizePathname(rawPathname);
160
- let prefixedPathname = normalizedPathname;
161
- if (basePath && normalizedPathname.startsWith(basePath + "/")) {
162
- prefixedPathname = normalizedPathname.slice(basePath.length) || "/";
163
- } else if (basePath && normalizedPathname === basePath) {
164
- prefixedPathname = "/";
165
- }
166
- const pathPart = prefixedPathname.split("/").find(Boolean);
167
- const maybeLocale = pathPart || "";
168
- const isLocalePrefixed = config.supportedLocales?.includes(maybeLocale);
169
- let unprefixedPathname = prefixedPathname;
170
- if (prefix === "all") {
171
- if (isLocalePrefixed) {
172
- unprefixedPathname = prefixedPathname.slice(maybeLocale.length + 1) || "/";
173
- }
174
- } else if (prefix === "except-default") {
175
- if (maybeLocale && maybeLocale !== defaultLocale && isLocalePrefixed) {
176
- unprefixedPathname = prefixedPathname.slice(maybeLocale.length + 1) || "/";
177
- }
178
- }
179
- return {
180
- basePath,
181
- prefixedPathname,
182
- unprefixedPathname,
183
- maybeLocale,
184
- isLocalePrefixed: Boolean(isLocalePrefixed)
185
- };
186
- };
187
-
188
- // src/shared/utils/pathname/standardize-pathname.ts
189
- var standardizePathname = ({
190
- config,
191
- pathname
192
- }) => {
193
- const { routing } = config;
194
- const { basePath } = routing;
195
- const parts = [
196
- normalizePathname(basePath),
197
- PREFIX_PLACEHOLDER,
198
- normalizePathname(pathname)
199
- ];
200
- const standardizedPathname = parts.join("/").replaceAll(/\/{2,}/g, "/");
201
- return normalizePathname(standardizedPathname);
202
- };
203
-
204
- // src/adapters/next/shared/utils/locale-prefix-pathname.ts
205
- var localePrefixPathname = ({
206
- config,
207
- pathname: standardizedPathname,
208
- locale
209
- }) => {
210
- const { routing } = config;
211
- const { prefix } = routing;
212
- if (prefix !== "none" && !locale) {
213
- throw new Error('No locale when using prefix "all", "except-default"');
214
- }
215
- if (prefix === "all") {
216
- return normalizePathname(
217
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
218
- );
219
- }
220
- if (prefix === "except-default") {
221
- return locale === config.defaultLocale ? normalizePathname(
222
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
223
- ) : normalizePathname(
224
- standardizedPathname.replaceAll(PREFIX_PLACEHOLDER, locale)
225
- );
226
- }
227
- return normalizePathname(
228
- standardizedPathname.replaceAll(`/${PREFIX_PLACEHOLDER}`, "")
229
- );
230
- };
231
-
232
- // src/adapters/next/shared/utils/localize-pathname.ts
233
- var localizePathname = ({
234
- config,
235
- pathname: rawPathname,
236
- locale
237
- }) => {
238
- const { unprefixedPathname } = extractPathname({
239
- config,
240
- pathname: rawPathname
241
- });
242
- const standardizedPathname = standardizePathname({
243
- config,
244
- pathname: unprefixedPathname
245
- });
246
- const localePrefixedPathname = localePrefixPathname({
247
- config,
248
- pathname: standardizedPathname,
249
- locale
250
- });
251
- return {
252
- unprefixedPathname,
253
- standardizedPathname,
254
- localePrefixedPathname
255
- };
256
- };
257
- var ConfigContext = React7.createContext(void 0);
258
- function ConfigProvider({
259
- value: { config, pathname },
260
- children
261
- }) {
262
- const value = React7.useMemo(() => ({ config, pathname }), [config, pathname]);
263
- return /* @__PURE__ */ jsx(ConfigContext.Provider, { value, children });
264
- }
265
- function useConfig() {
266
- const context = React7.useContext(ConfigContext);
267
- if (!context) throw new Error("useConfig must be used within ConfigProvider");
268
- return context;
269
- }
270
-
271
- // src/shared/utils/client/build-cookie-string.ts
272
- var buildCookieString = (cookie, locale) => {
273
- const parts = [`${cookie.name}=${encodeURIComponent(locale)}`];
274
- if (cookie.maxAge) {
275
- const expires = new Date(Date.now() + cookie.maxAge * 1e3).toUTCString();
276
- parts.push(`expires=${expires}`, `max-age=${cookie.maxAge}`);
277
- }
278
- parts.push(`path=${cookie.path ?? "/"}`);
279
- if (cookie.domain) {
280
- parts.push(`domain=${cookie.domain}`);
281
- }
282
- if (cookie.sameSite) {
283
- parts.push(
284
- `SameSite=${cookie.sameSite[0].toUpperCase()}${cookie.sameSite.slice(1).toLowerCase()}`
285
- );
286
- }
287
- if (cookie.secure !== false) {
288
- parts.push(`Secure`);
289
- }
290
- return parts.join("; ");
291
- };
292
-
293
- // src/shared/utils/client/set-locale-cookie-browser.ts
294
- var setLocaleCookieBrowser = ({
295
- cookie,
296
- locale
297
- }) => {
298
- if (typeof document === "undefined") return;
299
- if (!cookie.enabled || !cookie.autoSetCookie) return;
300
- const cookieString = buildCookieString(cookie, locale);
301
- document.cookie = cookieString;
302
- };
303
-
304
- // src/client/react/contexts/locale/utils/use-init-locale-cookie.ts
305
- var useInitLocaleCookie = ({
306
- config,
307
- locale
308
- }) => {
309
- React7.useEffect(() => {
310
- if (typeof document === "undefined") return;
311
- const { cookie, routing } = config;
312
- const { firstVisit } = routing;
313
- const cookies2 = document.cookie.split(";").map((c) => c.trim());
314
- const isCookieExists = cookies2.some((c) => c.startsWith(`${cookie.name}=`));
315
- if (isCookieExists) return;
316
- if (!firstVisit.redirect) return;
317
- if (!cookie.enabled || !cookie.autoSetCookie) return;
318
- setLocaleCookieBrowser({ cookie, locale });
319
- }, []);
320
- };
321
-
322
- // src/config/constants/cache.constants.ts
323
- var DEFAULT_CACHE_OPTIONS = {
324
- enabled: process.env.NODE_ENV === "production",
325
- ttl: 60 * 60 * 1e3
326
- // 1 hour
327
- };
328
-
329
- // src/server/shared/logger/global-logger-pool.ts
330
- function getGlobalLoggerPool() {
331
- if (!globalThis.__INTOR_LOGGER_POOL__) {
332
- globalThis.__INTOR_LOGGER_POOL__ = /* @__PURE__ */ new Map();
333
- }
334
- return globalThis.__INTOR_LOGGER_POOL__;
335
- }
336
-
337
- // src/server/shared/logger/get-logger.ts
338
- var DEFAULT_FORMATTER_CONFIG = {
339
- node: { meta: { compact: true }, lineBreaksAfter: 1 }
340
- };
341
- function getLogger({
342
- id = "default",
343
- formatterConfig,
344
- preset,
345
- ...options
346
- }) {
347
- const pool = getGlobalLoggerPool();
348
- let logger = pool.get(id);
349
- const useDefault = !formatterConfig && !preset;
350
- if (!logger) {
351
- logger = logry({
352
- id,
353
- formatterConfig: useDefault ? DEFAULT_FORMATTER_CONFIG : formatterConfig,
354
- preset,
355
- ...options
356
- });
357
- pool.set(id, logger);
358
- if (pool.size > 1e3) {
359
- const keys = [...pool.keys()];
360
- for (const key of keys.slice(0, 200)) pool.delete(key);
361
- }
362
- }
363
- return logger;
364
- }
365
-
366
- // src/server/messages/shared/utils/is-valid-messages.ts
367
- function isPlainObject(value) {
368
- return typeof value === "object" && value !== null && !Array.isArray(value);
369
- }
370
- function isValidMessages(value) {
371
- if (!isPlainObject(value)) return false;
372
- const stack = [value];
373
- while (stack.length > 0) {
374
- const current = stack.pop();
375
- for (const v of Object.values(current)) {
376
- if (typeof v === "string") continue;
377
- if (isPlainObject(v)) {
378
- stack.push(v);
379
- } else {
380
- return false;
381
- }
382
- }
383
- }
384
- return true;
385
- }
386
- function getGlobalMessagesPool() {
387
- if (!globalThis.__INTOR_MESSAGES_POOL__) {
388
- globalThis.__INTOR_MESSAGES_POOL__ = new Keyv();
389
- }
390
- return globalThis.__INTOR_MESSAGES_POOL__;
391
- }
392
-
393
- // src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.ts
394
- var fetchLocaleMessages = async ({
395
- remoteUrl,
396
- remoteHeaders,
397
- searchParams,
398
- locale,
399
- extraOptions: { loggerOptions } = {}
400
- }) => {
401
- const baseLogger = getLogger({ ...loggerOptions });
402
- const logger = baseLogger.child({ scope: "fetch-locale-messages" });
403
- try {
404
- const params = new URLSearchParams(searchParams);
405
- params.append("locale", locale);
406
- const url = `${remoteUrl}?${params.toString()}`;
407
- const headers2 = {
408
- "Content-Type": "application/json",
409
- ...remoteHeaders
410
- };
411
- const response = await fetch(url, {
412
- method: "GET",
413
- headers: headers2,
414
- cache: "no-store"
415
- });
416
- if (!response.ok) {
417
- throw new Error(`HTTP error ${response.status} ${response.statusText}`);
418
- }
419
- const data = await response.json();
420
- if (!isValidMessages(data[locale])) {
421
- throw new Error("JSON file does not match NamespaceMessages structure");
422
- }
423
- return data;
424
- } catch (error) {
425
- logger.warn("Fetching locale messages failed.", {
426
- locale,
427
- remoteUrl,
428
- searchParams: decodeURIComponent(searchParams.toString()),
429
- error
430
- });
431
- return;
432
- }
433
- };
434
-
435
- // src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.ts
436
- var buildSearchParams = (params) => {
437
- const searchParams = new URLSearchParams();
438
- const appendParam = (key, value) => {
439
- if (value === void 0 || value === null) return;
440
- if (Array.isArray(value) && value.length === 0) return;
441
- if (Array.isArray(value)) {
442
- value.forEach((v) => v && searchParams.append(key, v));
443
- } else {
444
- searchParams.append(key, value);
445
- }
446
- };
447
- Object.entries(params).forEach(([key, value]) => {
448
- appendParam(key, value);
449
- });
450
- return searchParams;
451
- };
452
-
453
- // src/server/messages/load-remote-messages/load-remote-messages.ts
454
- var loadRemoteMessages = async ({
455
- pool = getGlobalMessagesPool(),
456
- rootDir,
457
- remoteUrl,
458
- remoteHeaders,
459
- locale,
460
- fallbackLocales = [],
461
- namespaces = [],
462
- extraOptions: {
463
- cacheOptions = DEFAULT_CACHE_OPTIONS,
464
- loggerOptions = { id: "default" }
465
- } = {},
466
- allowCacheWrite
467
- }) => {
468
- const baseLogger = getLogger({ ...loggerOptions });
469
- const logger = baseLogger.child({ scope: "load-remote-messages" });
470
- const start = performance.now();
471
- logger.debug("Loading remote messages from api.", { remoteUrl });
472
- const key = normalizeCacheKey([
473
- loggerOptions.id,
474
- "loaderType:remote",
475
- rootDir,
476
- locale,
477
- (fallbackLocales ?? []).toSorted().join(","),
478
- (namespaces ?? []).toSorted().join(",")
479
- ]);
480
- if (cacheOptions.enabled && key) {
481
- const cached = await pool?.get(key);
482
- if (cached) {
483
- logger.debug("Messages cache hit.", { key });
484
- return cached;
485
- }
486
- }
487
- const searchParams = buildSearchParams({ rootDir, namespaces });
488
- const candidateLocales = [locale, ...fallbackLocales || []];
489
- let messages;
490
- for (const candidateLocale of candidateLocales) {
491
- try {
492
- const result = await fetchLocaleMessages({
493
- remoteUrl,
494
- remoteHeaders,
495
- searchParams,
496
- locale: candidateLocale,
497
- extraOptions: { loggerOptions }
498
- });
499
- if (result && Object.values(result[candidateLocale] || {}).length > 0) {
500
- messages = result;
501
- break;
502
- }
503
- } catch (error) {
504
- logger.error("Failed to fetch locale messages.", {
505
- locale: candidateLocale,
506
- error
507
- });
508
- }
509
- }
510
- if (allowCacheWrite && cacheOptions.enabled && key && messages) {
511
- await pool?.set(key, messages, cacheOptions.ttl);
512
- }
513
- const end = performance.now();
514
- const duration = Math.round(end - start);
515
- logger.trace("Finished loading remote messages.", {
516
- loadedLocale: messages ? Object.keys(messages)[0] : void 0,
517
- duration: `${duration} ms`
518
- });
519
- return messages;
520
- };
521
-
522
- // src/client/react/contexts/messages/utils/use-refetch-messages.ts
523
- var useRefetchMessages = ({
524
- config,
525
- pathname,
526
- setLoadedMessages,
527
- setIsLoadingMessages
528
- }) => {
529
- const { messages: staticMessages, loader } = config;
530
- const namespaces = React7.useMemo(() => {
531
- if (!loader) return [];
532
- return resolveNamespaces({ config, pathname });
533
- }, [config, pathname]);
534
- const refetchMessages = React7.useCallback(
535
- async (newLocale) => {
536
- if (loader?.type === "remote") {
537
- setIsLoadingMessages(true);
538
- const loadedMessages = await loadRemoteMessages({
539
- rootDir: loader.rootDir,
540
- remoteUrl: loader.remoteUrl,
541
- remoteHeaders: loader.remoteHeaders,
542
- locale: newLocale,
543
- fallbackLocales: config.fallbackLocales[newLocale] || [],
544
- namespaces,
545
- extraOptions: {
546
- cacheOptions: config.cache,
547
- loggerOptions: { id: config.id }
548
- }
549
- });
550
- const messages = mergeMessages(staticMessages, loadedMessages);
551
- setLoadedMessages(messages);
552
- setIsLoadingMessages(false);
553
- }
554
- },
555
- [
556
- loader,
557
- config.fallbackLocales,
558
- config.cache,
559
- config.id,
560
- setIsLoadingMessages,
561
- namespaces,
562
- staticMessages,
563
- setLoadedMessages
564
- ]
565
- );
566
- return { refetchMessages };
567
- };
568
- var MessagesContext = React7.createContext(void 0);
569
- function MessagesProvider({
570
- value: { messages = {} },
571
- children
572
- }) {
573
- const { config, pathname } = useConfig();
574
- const [loadedMessages, setLoadedMessages] = React7.useState(null);
575
- const [isLoadingMessages, setIsLoadingMessages] = React7.useState(false);
576
- const { refetchMessages } = useRefetchMessages({
577
- config,
578
- pathname,
579
- setLoadedMessages,
580
- setIsLoadingMessages
581
- });
582
- const value = React7.useMemo(
583
- () => ({
584
- messages: loadedMessages || messages,
585
- isLoading: isLoadingMessages,
586
- setLoadedMessages,
587
- setIsLoadingMessages,
588
- refetchMessages
589
- }),
590
- [loadedMessages, messages, isLoadingMessages, refetchMessages]
591
- );
592
- return /* @__PURE__ */ jsx(MessagesContext.Provider, { value, children });
593
- }
594
- function useMessages() {
595
- const context = React7.useContext(MessagesContext);
596
- if (!context)
597
- throw new Error("useMessages must be used within a MessagesProvider");
598
- return context;
599
- }
600
- var LocaleContext = React7.createContext(void 0);
601
-
602
- // src/client/react/contexts/locale/utils/change-locale.ts
603
- var changeLocale = ({
604
- currentLocale,
605
- newLocale,
606
- loader,
607
- cookie,
608
- setLocale,
609
- refetchMessages
610
- }) => {
611
- if (typeof document === "undefined") return;
612
- const { type } = loader || {};
613
- if (newLocale === currentLocale) return;
614
- if (type === "local") {
615
- console.warn(
616
- `[Intor] You are using "loader type: local" to switch languages. Please make sure to use the wrapped <Link> component to trigger a page reload, ensuring that the translation data is dynamically updated.`
617
- );
618
- }
619
- setLocale(newLocale);
620
- setLocaleCookieBrowser({ cookie, locale: newLocale });
621
- document.documentElement.lang = newLocale;
622
- if (type === "remote" && refetchMessages) {
623
- void refetchMessages(newLocale);
624
- }
625
- };
626
- function LocaleProvider({
627
- value: { initialLocale, onLocaleChange },
628
- children
629
- }) {
630
- const { config } = useConfig();
631
- const { refetchMessages } = useMessages();
632
- const { loader, cookie } = config;
633
- const [currentLocale, setCurrentLocale] = React7.useState(initialLocale);
634
- useInitLocaleCookie({ config, locale: initialLocale });
635
- const setLocale = React7.useCallback(
636
- async (newLocale) => {
637
- changeLocale({
638
- currentLocale,
639
- newLocale,
640
- loader,
641
- cookie,
642
- setLocale: setCurrentLocale,
643
- refetchMessages
644
- });
645
- onLocaleChange?.(newLocale);
646
- },
647
- [currentLocale, loader, cookie, refetchMessages, onLocaleChange]
648
- );
649
- const value = React7.useMemo(
650
- () => ({
651
- locale: currentLocale,
652
- setLocale
653
- }),
654
- [currentLocale, setLocale]
655
- );
656
- return /* @__PURE__ */ jsx(LocaleContext.Provider, { value, children });
657
- }
658
- function useLocale() {
659
- const context = React7.useContext(LocaleContext);
660
- if (!context)
661
- throw new Error("useLocale must be used within a LocaleProvider");
662
- return context;
663
- }
664
-
665
- // src/adapters/next/navigation/use-pathname.ts
666
- var usePathname = () => {
667
- const { config } = useConfig();
668
- const { locale } = useLocale();
669
- const rawPathname = usePathname$1();
670
- const { localePrefixedPathname, standardizedPathname, unprefixedPathname } = localizePathname({
671
- config,
672
- pathname: rawPathname,
673
- locale
674
- });
675
- return {
676
- localizedPathname: localePrefixedPathname,
677
- standardizedPathname,
678
- unprefixedPathname
679
- };
680
- };
681
-
682
- // src/adapters/next/navigation/utils/should-full-reload.ts
683
- var shouldFullReload = ({
684
- config,
685
- targetPathname,
686
- locale,
687
- currentLocale
688
- }) => {
689
- const loader = config.loader;
690
- if (!loader || !loader.type) return false;
691
- if (loader.type === "remote" && !loader.fullReload) return false;
692
- const { maybeLocale, isLocalePrefixed } = extractPathname({
693
- config,
694
- pathname: targetPathname
695
- });
696
- const isDifferentLocale = locale && locale !== currentLocale || isLocalePrefixed && maybeLocale !== currentLocale;
697
- return isDifferentLocale ? true : false;
698
- };
699
-
700
- // src/adapters/next/navigation/utils/use-locale-switch.ts
701
- var useLocaleSwitch = () => {
702
- const { config } = useConfig();
703
- const { locale: currentLocale, setLocale } = useLocale();
704
- const { localizedPathname } = usePathname();
705
- const resolveHref = ({
706
- href,
707
- locale
708
- }) => {
709
- const isLocaleValid = locale && config.supportedLocales?.includes(locale);
710
- const targetLocale = isLocaleValid ? locale : currentLocale;
711
- const targetPathname = href ?? localizedPathname;
712
- const isExternal = targetPathname.startsWith("http");
713
- const resolvedHref = !isExternal ? localizePathname({
714
- config,
715
- pathname: targetPathname,
716
- locale: targetLocale
717
- }).localePrefixedPathname : targetPathname;
718
- return { resolvedHref, isExternal, targetLocale, targetPathname };
719
- };
720
- const switchLocale = ({
721
- href,
722
- locale
723
- }) => {
724
- const { resolvedHref, isExternal, targetLocale, targetPathname } = resolveHref({ href, locale });
725
- if (isExternal) return;
726
- if (shouldFullReload({ config, targetPathname, locale, currentLocale })) {
727
- setLocaleCookieBrowser({ cookie: config.cookie, locale: targetLocale });
728
- globalThis.location.href = resolvedHref;
729
- return;
730
- } else {
731
- setLocale(targetLocale);
732
- }
733
- return resolvedHref;
734
- };
735
- return { resolveHref, switchLocale };
736
- };
737
- var Link = ({
738
- href,
739
- locale,
740
- children,
741
- onClick,
742
- ...props
743
- }) => {
744
- const formatted = typeof href === "string" ? href : href ? formatUrl(href) : void 0;
745
- const { resolveHref, switchLocale } = useLocaleSwitch();
746
- const { resolvedHref } = resolveHref({ href: formatted, locale });
747
- const handleClick = (e) => {
748
- onClick?.(e);
749
- switchLocale({ href: formatted, locale });
750
- };
751
- return /* @__PURE__ */ jsx(NextLink, { href: resolvedHref, onClick: handleClick, ...props, children });
752
- };
753
- var useRouter = () => {
754
- const { push, replace, ...rest } = useRouter$1();
755
- const { switchLocale } = useLocaleSwitch();
756
- const pushWithLocale = (href, options) => {
757
- const resolvedHref = switchLocale({ href, locale: options?.locale });
758
- if (resolvedHref) push(resolvedHref, options);
759
- };
760
- const replaceWithLocale = (href, options) => {
761
- const resolvedHref = switchLocale({ href, locale: options?.locale });
762
- if (resolvedHref) replace(resolvedHref, options);
763
- };
764
- return {
765
- push: pushWithLocale,
766
- replace: replaceWithLocale,
767
- ...rest
768
- };
769
- };
770
-
771
- // src/adapters/next/shared/constants/pathname-header-name.ts
772
- var PATHNAME_HEADER_NAME = "x-intor-pathname";
773
-
774
- // src/adapters/next/server/get-i18n-context.ts
775
- var getI18nContext = async (config) => {
776
- const baseLogger = getLogger({ id: config.id, ...config.logger });
777
- const logger = baseLogger.child({ scope: "next-adapter" });
778
- const cookiesStore = await cookies();
779
- const headersStore = await headers();
780
- const { defaultLocale, supportedLocales = [], cookie, routing } = config;
781
- let locale;
782
- if (cookie.enabled) {
783
- const localeFromCookie = cookiesStore.get(cookie.name)?.value;
784
- locale = normalizeLocale(localeFromCookie, supportedLocales);
785
- if (locale) {
786
- logger.trace("Locale retrieved from cookie.", { locale });
787
- }
788
- }
789
- if (!locale && routing.firstVisit.localeSource === "browser") {
790
- const aLHeader = headersStore.get("accept-language") || void 0;
791
- const preferredLocale = resolvePreferredLocale(aLHeader, supportedLocales);
792
- locale = normalizeLocale(preferredLocale, supportedLocales);
793
- logger.trace("Locale retrieved from header.", { locale });
794
- }
795
- const pathname = headersStore.get(PATHNAME_HEADER_NAME);
796
- if (pathname) {
797
- logger.trace("Pathname retrieved from header.", { pathname });
798
- }
799
- return {
800
- locale: locale || defaultLocale,
801
- pathname: pathname || ""
802
- };
803
- };
804
-
805
- // src/adapters/next/navigation/redirect.ts
806
- var redirect = async ({
807
- config,
808
- locale,
809
- url,
810
- type
811
- }) => {
812
- if (url.startsWith("http")) {
813
- redirect$1(url);
814
- }
815
- const isLocaleValid = locale && config.supportedLocales?.includes(locale);
816
- const { locale: detectedLocale } = await getI18nContext(config);
817
- const { localePrefixedPathname } = localizePathname({
818
- config,
819
- pathname: url,
820
- locale: isLocaleValid ? locale : detectedLocale
821
- });
822
- redirect$1(localePrefixedPathname, type);
823
- };
824
- var TranslateHandlersContext = React7.createContext(void 0);
825
- var TranslateHandlersProvider = ({
826
- handlers,
827
- children
828
- }) => {
829
- return /* @__PURE__ */ jsx(TranslateHandlersContext.Provider, { value: { handlers }, children });
830
- };
831
- function useTranslateHandlers() {
832
- const context = React7.useContext(TranslateHandlersContext);
833
- return context;
834
- }
835
- var TranslatorContext = React7.createContext(void 0);
836
- function TranslatorProvider({
837
- value: { isLoading: externalIsLoading },
838
- children
839
- }) {
840
- const { config } = useConfig();
841
- const { messages, isLoading: internalIsLoading } = useMessages();
842
- const { locale } = useLocale();
843
- const { handlers } = useTranslateHandlers();
844
- const { fallbackLocales, translator: translatorOptions } = config;
845
- const isLoading = Boolean(externalIsLoading ?? internalIsLoading);
846
- const translator = React7.useMemo(() => {
847
- return new Translator({
848
- messages,
849
- locale,
850
- isLoading,
851
- fallbackLocales,
852
- loadingMessage: translatorOptions?.loadingMessage,
853
- placeholder: translatorOptions?.placeholder,
854
- handlers
855
- });
856
- }, [
857
- messages,
858
- locale,
859
- isLoading,
860
- fallbackLocales,
861
- handlers,
862
- translatorOptions?.loadingMessage,
863
- translatorOptions?.placeholder
864
- ]);
865
- return /* @__PURE__ */ jsx(TranslatorContext.Provider, { value: { translator }, children });
866
- }
867
- function useTranslator() {
868
- const context = React7.useContext(TranslatorContext);
869
- if (!context)
870
- throw new Error(
871
- "useTranslator must be used within IntorTranslatorProvider"
872
- );
873
- return context;
874
- }
875
- var IntorProvider = ({
876
- value: {
877
- config,
878
- pathname = "",
879
- initialLocale,
880
- messages = config.messages,
881
- onLocaleChange,
882
- isLoading
883
- },
884
- children
885
- }) => {
886
- return /* @__PURE__ */ jsx(ConfigProvider, { value: { config, pathname }, children: /* @__PURE__ */ jsx(MessagesProvider, { value: { messages }, children: /* @__PURE__ */ jsx(LocaleProvider, { value: { initialLocale, onLocaleChange }, children: /* @__PURE__ */ jsx(TranslatorProvider, { value: { isLoading }, children }) }) }) });
887
- };
888
-
889
- // src/client/react/hooks/use-translator.ts
890
- function useTranslator2(preKey) {
891
- const { translator } = useTranslator();
892
- const { setLocale } = useLocale();
893
- const props = {
894
- messages: translator.messages,
895
- locale: translator.locale,
896
- isLoading: translator.isLoading,
897
- setLocale
898
- };
899
- const scoped = translator.scoped(preKey);
900
- return {
901
- ...props,
902
- hasKey: preKey ? scoped.hasKey : translator.hasKey,
903
- t: preKey ? scoped.t : translator.t
904
- };
905
- }
906
-
907
- export { IntorProvider, Link, TranslateHandlersProvider, redirect, usePathname, useRouter, useTranslator2 as useTranslator };