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
@@ -0,0 +1,13 @@
1
+ import type { Locale } from "intor-translator";
2
+ import type * as React from "react";
3
+ export type LocaleContextValue = {
4
+ locale: Locale;
5
+ setLocale: (locale: Locale) => void;
6
+ };
7
+ export type LocaleProviderProps = {
8
+ value: {
9
+ initialLocale: string;
10
+ onLocaleChange?: (newLocale: string) => Promise<void> | void;
11
+ };
12
+ children: React.ReactNode;
13
+ };
@@ -0,0 +1,22 @@
1
+ import type { CookieResolvedOptions } from "../../../../../config/types/cookie.types";
2
+ import type { LoaderOptions } from "../../../../../config/types/loader.types";
3
+ import type { Locale } from "intor-translator";
4
+ type Params = {
5
+ currentLocale: Locale;
6
+ newLocale: Locale;
7
+ loader?: LoaderOptions;
8
+ cookie: CookieResolvedOptions;
9
+ setLocale: (locale: Locale) => void;
10
+ refetchMessages?: (locale: Locale) => Promise<void>;
11
+ };
12
+ /**
13
+ * Change the locale on the client side.
14
+ *
15
+ * The following steps will be performed:
16
+ * 1. Update the locale state
17
+ * 2. Set the locale cookie (if not disabled and autoSetCookie is enabled)
18
+ * 3. Update the <html lang> attribute
19
+ * 4. Refetch messages if using a remote API loader
20
+ */
21
+ export declare const changeLocale: ({ currentLocale, newLocale, loader, cookie, setLocale, refetchMessages, }: Params) => void;
22
+ export {};
@@ -0,0 +1,35 @@
1
+ import { setLocaleCookieBrowser } from '../../../../../shared/utils/client/set-locale-cookie-browser.js';
2
+
3
+ /**
4
+ * Change the locale on the client side.
5
+ *
6
+ * The following steps will be performed:
7
+ * 1. Update the locale state
8
+ * 2. Set the locale cookie (if not disabled and autoSetCookie is enabled)
9
+ * 3. Update the <html lang> attribute
10
+ * 4. Refetch messages if using a remote API loader
11
+ */
12
+ const changeLocale = ({ currentLocale, newLocale, loader, cookie, setLocale, refetchMessages, }) => {
13
+ if (typeof document === "undefined")
14
+ return;
15
+ const { type } = loader || {};
16
+ // Exit early if the new locale is the same as the current one
17
+ if (newLocale === currentLocale)
18
+ return;
19
+ // Warn: Using dynamic local cannot switch locale with CSR only
20
+ if (type === "local") {
21
+ console.warn(`[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.`);
22
+ }
23
+ // Update the locale state
24
+ setLocale(newLocale);
25
+ // Set the locale cookie on client side
26
+ setLocaleCookieBrowser({ cookie, locale: newLocale });
27
+ // Update the <html lang> attribute
28
+ document.documentElement.lang = newLocale;
29
+ // Refetch messages via remote API, if applicable
30
+ if (type === "remote" && refetchMessages) {
31
+ void refetchMessages(newLocale);
32
+ }
33
+ };
34
+
35
+ export { changeLocale };
@@ -0,0 +1,8 @@
1
+ import type { IntorResolvedConfig } from "../../../../../config/types/intor-config.types";
2
+ /**
3
+ * Init locale cookie
4
+ */
5
+ export declare const useInitLocaleCookie: ({ config, locale, }: {
6
+ config: IntorResolvedConfig;
7
+ locale: string;
8
+ }) => void;
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ import { setLocaleCookieBrowser } from '../../../../../shared/utils/client/set-locale-cookie-browser.js';
3
+
4
+ /**
5
+ * Init locale cookie
6
+ */
7
+ const useInitLocaleCookie = ({ config, locale, }) => {
8
+ React.useEffect(() => {
9
+ if (typeof document === "undefined")
10
+ return;
11
+ const { cookie, routing } = config;
12
+ const { firstVisit } = routing;
13
+ const cookies = document.cookie.split(";").map((c) => c.trim());
14
+ const isCookieExists = cookies.some((c) => c.startsWith(`${cookie.name}=`));
15
+ // Cookie already exists
16
+ if (isCookieExists)
17
+ return;
18
+ // If first visit is not using redirect, do not set cookie
19
+ if (!firstVisit.redirect)
20
+ return;
21
+ // Cookie is disabled or autoSetCookie is disabled
22
+ if (!cookie.enabled || !cookie.autoSetCookie)
23
+ return;
24
+ setLocaleCookieBrowser({ cookie, locale });
25
+ }, []); // Mount only once
26
+ };
27
+
28
+ export { useInitLocaleCookie };
@@ -0,0 +1,3 @@
1
+ import type { MessagesContextValue } from "./types";
2
+ import * as React from "react";
3
+ export declare const MessagesContext: React.Context<MessagesContextValue | undefined>;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+
3
+ // context
4
+ const MessagesContext = React.createContext(undefined);
5
+
6
+ export { MessagesContext };
@@ -0,0 +1,2 @@
1
+ import type { MessagesContextValue } from "./types";
2
+ export declare function useMessages(): MessagesContextValue;
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { MessagesContext } from './context.js';
3
+
4
+ // hook
5
+ function useMessages() {
6
+ const context = React.useContext(MessagesContext);
7
+ if (!context)
8
+ throw new Error("useMessages must be used within a MessagesProvider");
9
+ return context;
10
+ }
11
+
12
+ export { useMessages };
@@ -0,0 +1,2 @@
1
+ export { MessagesProvider } from "./provider";
2
+ export { useMessages } from "./hook";
@@ -0,0 +1,3 @@
1
+ import type { MessagesProviderProps } from "./types";
2
+ import * as React from "react";
3
+ export declare function MessagesProvider({ value: { messages }, children, }: MessagesProviderProps): React.JSX.Element;
@@ -0,0 +1,32 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import * as React from 'react';
4
+ import '../config/context.js';
5
+ import { useConfig } from '../config/hook.js';
6
+ import { useRefetchMessages } from './utils/use-refetch-messages.js';
7
+ import { MessagesContext } from './context.js';
8
+
9
+ // provider
10
+ function MessagesProvider({ value: { messages = {} }, children, }) {
11
+ const { config, pathname } = useConfig();
12
+ const [loadedMessages, setLoadedMessages] = React.useState(null);
13
+ const [isLoadingMessages, setIsLoadingMessages] = React.useState(false);
14
+ // Setup refetch messages function
15
+ const { refetchMessages } = useRefetchMessages({
16
+ config,
17
+ pathname,
18
+ setLoadedMessages,
19
+ setIsLoadingMessages,
20
+ });
21
+ // context value
22
+ const value = React.useMemo(() => ({
23
+ messages: loadedMessages || messages,
24
+ isLoading: isLoadingMessages,
25
+ setLoadedMessages,
26
+ setIsLoadingMessages,
27
+ refetchMessages,
28
+ }), [loadedMessages, messages, isLoadingMessages, refetchMessages]);
29
+ return (jsx(MessagesContext.Provider, { value: value, children: children }));
30
+ }
31
+
32
+ export { MessagesProvider };
@@ -0,0 +1,15 @@
1
+ import type { LocaleMessages } from "intor-translator";
2
+ import type * as React from "react";
3
+ export type MessagesContextValue = {
4
+ messages: Readonly<LocaleMessages>;
5
+ isLoading: boolean;
6
+ setLoadedMessages: React.Dispatch<React.SetStateAction<LocaleMessages | null>>;
7
+ setIsLoadingMessages: React.Dispatch<React.SetStateAction<boolean>>;
8
+ refetchMessages: (newLocale: string) => Promise<void>;
9
+ };
10
+ export type MessagesProviderProps = {
11
+ value: {
12
+ messages?: Readonly<LocaleMessages>;
13
+ };
14
+ children: React.ReactNode;
15
+ };
@@ -0,0 +1,16 @@
1
+ import type { IntorResolvedConfig } from "../../../../../config/types/intor-config.types";
2
+ import type { LocaleMessages } from "intor-translator";
3
+ import * as React from "react";
4
+ type UseRefetchMessagesParams = {
5
+ config: IntorResolvedConfig;
6
+ pathname: string;
7
+ setLoadedMessages: React.Dispatch<React.SetStateAction<LocaleMessages | null>>;
8
+ setIsLoadingMessages: React.Dispatch<React.SetStateAction<boolean>>;
9
+ };
10
+ /**
11
+ * Refetch messages (Dynamic API)
12
+ */
13
+ export declare const useRefetchMessages: ({ config, pathname, setLoadedMessages, setIsLoadingMessages, }: UseRefetchMessagesParams) => {
14
+ refetchMessages: (newLocale: string) => Promise<void>;
15
+ };
16
+ export {};
@@ -0,0 +1,57 @@
1
+ import * as React from 'react';
2
+
3
+
4
+
5
+ import '../../../../../config/constants/cache.constants.js';
6
+
7
+
8
+
9
+
10
+ import { mergeMessages } from '../../../../../shared/utils/merge-messages.js';
11
+ import { resolveNamespaces } from '../../../../../shared/utils/resolve-namespaces.js';
12
+ import { loadRemoteMessages } from '../../../../../server/messages/load-remote-messages/load-remote-messages.js';
13
+
14
+ /**
15
+ * Refetch messages (Dynamic API)
16
+ */
17
+ const useRefetchMessages = ({ config, pathname, setLoadedMessages, setIsLoadingMessages, }) => {
18
+ const { messages: staticMessages, loader } = config;
19
+ const namespaces = React.useMemo(() => {
20
+ if (!loader)
21
+ return [];
22
+ return resolveNamespaces({ config, pathname });
23
+ }, [config, pathname]);
24
+ // Refetch messages
25
+ const refetchMessages = React.useCallback(async (newLocale) => {
26
+ if (loader?.type === "remote") {
27
+ setIsLoadingMessages(true);
28
+ const loadedMessages = await loadRemoteMessages({
29
+ rootDir: loader.rootDir,
30
+ remoteUrl: loader.remoteUrl,
31
+ remoteHeaders: loader.remoteHeaders,
32
+ locale: newLocale,
33
+ fallbackLocales: config.fallbackLocales[newLocale] || [],
34
+ namespaces,
35
+ extraOptions: {
36
+ cacheOptions: config.cache,
37
+ loggerOptions: { id: config.id },
38
+ },
39
+ });
40
+ const messages = mergeMessages(staticMessages, loadedMessages);
41
+ setLoadedMessages(messages);
42
+ setIsLoadingMessages(false);
43
+ }
44
+ }, [
45
+ loader,
46
+ config.fallbackLocales,
47
+ config.cache,
48
+ config.id,
49
+ setIsLoadingMessages,
50
+ namespaces,
51
+ staticMessages,
52
+ setLoadedMessages,
53
+ ]);
54
+ return { refetchMessages };
55
+ };
56
+
57
+ export { useRefetchMessages };
@@ -0,0 +1,2 @@
1
+ import * as React from "react";
2
+ export declare const TranslateHandlersContext: React.Context<import("intor-translator").TranslateHandlers | undefined>;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+
3
+ // context
4
+ const TranslateHandlersContext = React.createContext(undefined);
5
+
6
+ export { TranslateHandlersContext };
@@ -0,0 +1,2 @@
1
+ import type { TranslateHandlersContextValue } from "../../../../client/react/contexts/translate-handlers/types";
2
+ export declare function useTranslateHandlers(): TranslateHandlersContextValue;
@@ -0,0 +1,10 @@
1
+ import * as React from 'react';
2
+ import { TranslateHandlersContext } from './context.js';
3
+
4
+ // hook
5
+ function useTranslateHandlers() {
6
+ const context = React.useContext(TranslateHandlersContext);
7
+ return context;
8
+ }
9
+
10
+ export { useTranslateHandlers };
@@ -0,0 +1,3 @@
1
+ export { TranslateHandlersProvider } from "./provider";
2
+ export { useTranslateHandlers } from "./hook";
3
+ export type { TranslateHandlersProviderProps } from "./types";
@@ -0,0 +1,2 @@
1
+ import type { TranslateHandlersProviderProps } from "./types";
2
+ export declare const TranslateHandlersProvider: ({ handlers, children, }: TranslateHandlersProviderProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import 'react';
4
+ import { TranslateHandlersContext } from './context.js';
5
+
6
+ // provider
7
+ const TranslateHandlersProvider = ({ handlers, children, }) => {
8
+ return (jsx(TranslateHandlersContext.Provider, { value: handlers, children: children }));
9
+ };
10
+
11
+ export { TranslateHandlersProvider };
@@ -0,0 +1,7 @@
1
+ import type { TranslateHandlers } from "intor-translator";
2
+ import type * as React from "react";
3
+ export type TranslateHandlersContextValue = TranslateHandlers;
4
+ export type TranslateHandlersProviderProps = {
5
+ handlers: TranslateHandlers;
6
+ children: React.ReactNode;
7
+ };
@@ -0,0 +1,3 @@
1
+ import type { TranslatorContextValue } from "./types";
2
+ import * as React from "react";
3
+ export declare const TranslatorContext: React.Context<TranslatorContextValue | undefined>;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+
3
+ // context
4
+ const TranslatorContext = React.createContext(undefined);
5
+
6
+ export { TranslatorContext };
@@ -0,0 +1,2 @@
1
+ import type { TranslatorContextValue } from "./types";
2
+ export declare function useTranslator<M>(): TranslatorContextValue<M>;
@@ -0,0 +1,12 @@
1
+ import * as React from 'react';
2
+ import { TranslatorContext } from './context.js';
3
+
4
+ // hook
5
+ function useTranslator() {
6
+ const context = React.useContext(TranslatorContext);
7
+ if (!context)
8
+ throw new Error("useTranslator must be used within IntorTranslatorProvider");
9
+ return context;
10
+ }
11
+
12
+ export { useTranslator };
@@ -0,0 +1,2 @@
1
+ export { TranslatorProvider } from "./provider";
2
+ export { useTranslator } from "./hook";
@@ -0,0 +1,2 @@
1
+ import type { TranslatorProviderProps } from "./types";
2
+ export declare function TranslatorProvider({ value: { isLoading: externalIsLoading }, children, }: TranslatorProviderProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,53 @@
1
+ "use client";
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { Translator } from 'intor-translator';
4
+ import * as React from 'react';
5
+ import '../config/context.js';
6
+ import { useConfig } from '../config/hook.js';
7
+
8
+
9
+
10
+ import '../../../../config/constants/cache.constants.js';
11
+
12
+
13
+
14
+
15
+ import '../messages/context.js';
16
+ import { useMessages } from '../messages/hook.js';
17
+ import '../locale/context.js';
18
+ import { useLocale } from '../locale/hook.js';
19
+ import '../translate-handlers/context.js';
20
+ import { useTranslateHandlers } from '../translate-handlers/hook.js';
21
+ import { TranslatorContext } from './context.js';
22
+
23
+ // Translator Provider
24
+ function TranslatorProvider({ value: { isLoading: externalIsLoading }, children, }) {
25
+ const { config } = useConfig();
26
+ const { messages, isLoading: internalIsLoading } = useMessages();
27
+ const { locale } = useLocale();
28
+ const translateHandlers = useTranslateHandlers();
29
+ const { fallbackLocales, translator: translatorOptions } = config;
30
+ const isLoading = Boolean(externalIsLoading ?? internalIsLoading);
31
+ const translator = React.useMemo(() => {
32
+ return new Translator({
33
+ messages,
34
+ locale,
35
+ isLoading,
36
+ fallbackLocales,
37
+ loadingMessage: translatorOptions?.loadingMessage,
38
+ placeholder: translatorOptions?.placeholder,
39
+ handlers: translateHandlers,
40
+ });
41
+ }, [
42
+ messages,
43
+ locale,
44
+ isLoading,
45
+ fallbackLocales,
46
+ translateHandlers,
47
+ translatorOptions?.loadingMessage,
48
+ translatorOptions?.placeholder,
49
+ ]);
50
+ return (jsx(TranslatorContext.Provider, { value: { translator }, children: children }));
51
+ }
52
+
53
+ export { TranslatorProvider };
@@ -0,0 +1,11 @@
1
+ import type { Translator } from "intor-translator";
2
+ import type * as React from "react";
3
+ export type TranslatorContextValue<M = unknown> = {
4
+ translator: Translator<M>;
5
+ };
6
+ export type TranslatorProviderProps = {
7
+ value: {
8
+ isLoading?: boolean;
9
+ };
10
+ children: React.ReactNode;
11
+ };
@@ -0,0 +1,12 @@
1
+ import type { IfGen, GenConfigKeys, GenMessages } from "../../../shared/types/generated.types";
2
+ import type { TranslatorInstance } from "../../../shared/types/translator-instance.types";
3
+ import type { LocalizedNodeKeys } from "intor-translator";
4
+ /**
5
+ * React hook to access a ready-to-use translator instance in the client.
6
+ *
7
+ * - Provides `t`, `hasKey`, `messages`, `locale`, `isLoading` and `setLocale`.
8
+ * - Supports optional `preKey` to create a scoped translator for nested keys.
9
+ * - Can accept a generic type parameter `M` to strongly type your messages.
10
+ */
11
+ export declare function useTranslator<CK extends GenConfigKeys = "__default__">(): TranslatorInstance<GenMessages<CK>>;
12
+ export declare function useTranslator<CK extends GenConfigKeys = "__default__", PK extends string = LocalizedNodeKeys<GenMessages<CK>>>(preKey: IfGen<PK, string>): TranslatorInstance<GenMessages<CK>, PK>;
@@ -0,0 +1,38 @@
1
+ import 'react/jsx-runtime';
2
+ import 'react';
3
+ import '../contexts/config/context.js';
4
+
5
+
6
+
7
+ import '../../../config/constants/cache.constants.js';
8
+
9
+
10
+
11
+
12
+ import '../contexts/messages/context.js';
13
+ import '../contexts/locale/context.js';
14
+ import { useLocale } from '../contexts/locale/hook.js';
15
+ import 'intor-translator';
16
+ import '../contexts/translate-handlers/context.js';
17
+ import '../contexts/translator/context.js';
18
+ import { useTranslator as useTranslator$1 } from '../contexts/translator/hook.js';
19
+
20
+ // Implementation
21
+ function useTranslator(preKey) {
22
+ const { translator } = useTranslator$1();
23
+ const { setLocale } = useLocale();
24
+ const props = {
25
+ messages: translator.messages,
26
+ locale: translator.locale,
27
+ isLoading: translator.isLoading,
28
+ setLocale,
29
+ };
30
+ const scoped = translator.scoped(preKey);
31
+ return {
32
+ ...props,
33
+ hasKey: preKey ? scoped.hasKey : translator.hasKey,
34
+ t: preKey ? scoped.t : translator.t,
35
+ };
36
+ }
37
+
38
+ export { useTranslator };
@@ -0,0 +1,4 @@
1
+ export { IntorProvider, type IntorProviderProps, } from "./contexts/intor-provider";
2
+ export { TranslateHandlersProvider, type TranslateHandlersProviderProps, } from "./contexts/translate-handlers";
3
+ export { useTranslator } from "./hooks/use-translator";
4
+ export { getInitialLocale } from "../../client/shared/utils/get-initial-locale";
@@ -0,0 +1,11 @@
1
+ import type { IntorResolvedConfig } from "../../../config";
2
+ /**
3
+ * Get the initial locale from cookie, browser, or default.
4
+ *
5
+ * - This function is intended for client-side use only.
6
+ *
7
+ * @param {IntorResolvedConfig} config - The intor configuration.
8
+ * @param {string} [cookieName=config.cookie.name] - Optional cookie name to check.
9
+ * @returns {string} The matched locale or the default locale.
10
+ */
11
+ export declare function getInitialLocale(config: IntorResolvedConfig, cookieName?: string): string;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Get the initial locale from cookie, browser, or default.
3
+ *
4
+ * - This function is intended for client-side use only.
5
+ *
6
+ * @param {IntorResolvedConfig} config - The intor configuration.
7
+ * @param {string} [cookieName=config.cookie.name] - Optional cookie name to check.
8
+ * @returns {string} The matched locale or the default locale.
9
+ */
10
+ function getInitialLocale(config, cookieName = config.cookie.name) {
11
+ const { defaultLocale, supportedLocales } = config;
12
+ const match = document.cookie.match(new RegExp(`(?:^|; )${cookieName.replaceAll(/([.$?*|{}()[\]\\/+^])/g, String.raw `\$1`)}=([^;]*)`));
13
+ const cookieLocale = match ? decodeURIComponent(match[1]) : null;
14
+ const browserLocale = navigator.languages?.[0] || navigator.language;
15
+ const locale = cookieLocale || browserLocale || defaultLocale;
16
+ const normalized = locale.toLowerCase();
17
+ const matched = supportedLocales.find((l) => l.toLowerCase() === normalized);
18
+ return matched ?? defaultLocale;
19
+ }
20
+
21
+ export { getInitialLocale };
@@ -0,0 +1,2 @@
1
+ import type { CacheResolvedOptions } from "../../config/types/cache.types";
2
+ export declare const DEFAULT_CACHE_OPTIONS: CacheResolvedOptions;
@@ -0,0 +1,7 @@
1
+ // Default cache options
2
+ const DEFAULT_CACHE_OPTIONS = {
3
+ enabled: process.env.NODE_ENV === "production",
4
+ ttl: 60 * 60 * 1000, // 1 hour
5
+ };
6
+
7
+ export { DEFAULT_CACHE_OPTIONS };
@@ -0,0 +1,2 @@
1
+ import type { CookieResolvedOptions } from "../../config/types/cookie.types";
2
+ export declare const DEFAULT_COOKIE_OPTIONS: CookieResolvedOptions;
@@ -0,0 +1,14 @@
1
+ // Default cookie options
2
+ const DEFAULT_COOKIE_OPTIONS = {
3
+ enabled: true,
4
+ autoSetCookie: true,
5
+ name: "intor.i18n.locale",
6
+ domain: null,
7
+ path: "/",
8
+ maxAge: 60 * 60 * 24 * 365, // 365 days
9
+ httpOnly: false,
10
+ secure: process.env.NODE_ENV !== "development",
11
+ sameSite: "lax",
12
+ };
13
+
14
+ export { DEFAULT_COOKIE_OPTIONS };
@@ -0,0 +1,2 @@
1
+ import type { RoutingResolvedOptions } from "../../config/types/routing.types";
2
+ export declare const DEFAULT_ROUTING_OPTIONS: RoutingResolvedOptions;
@@ -0,0 +1,11 @@
1
+ // Default routing options
2
+ const DEFAULT_ROUTING_OPTIONS = {
3
+ prefix: "none",
4
+ firstVisit: {
5
+ localeSource: "browser",
6
+ redirect: true,
7
+ },
8
+ basePath: "/",
9
+ };
10
+
11
+ export { DEFAULT_ROUTING_OPTIONS };
@@ -0,0 +1,2 @@
1
+ import type { IntorRawConfig, IntorResolvedConfig } from "../config/types/intor-config.types";
2
+ export declare const defineIntorConfig: (config: IntorRawConfig) => IntorResolvedConfig;
@@ -0,0 +1,34 @@
1
+ import { resolveCacheOptions } from './resolvers/resolve-cache-options.js';
2
+ import { resolveCookieOptions } from './resolvers/resolve-cookie-options.js';
3
+ import { resolveFallbackLocales } from './resolvers/resolve-fallback-locales.js';
4
+ import { resolveRoutingOptions } from './resolvers/resolve-routing-options.js';
5
+ import { validateDefaultLocale } from './validators/validate-default-locale.js';
6
+ import { validateSupportedLocales } from './validators/validate-supported-locales.js';
7
+
8
+ const defineIntorConfig = (config) => {
9
+ // Generate a random id if config.id is not defined
10
+ const id = config.id || `ID${Math.random().toString(36).slice(2, 6)}`;
11
+ // Validaters
12
+ const supportedLocales = validateSupportedLocales(config);
13
+ const defaultLocale = validateDefaultLocale(config, supportedLocales);
14
+ // Resolvers
15
+ const fallbackLocales = resolveFallbackLocales(config, supportedLocales);
16
+ const cookie = resolveCookieOptions(config.cookie);
17
+ const routing = resolveRoutingOptions(config.routing);
18
+ const cache = resolveCacheOptions(config.cache);
19
+ return {
20
+ id,
21
+ messages: config.messages,
22
+ loader: config.loader,
23
+ defaultLocale,
24
+ supportedLocales,
25
+ fallbackLocales,
26
+ translator: config.translator,
27
+ cookie,
28
+ routing,
29
+ logger: config.logger,
30
+ cache,
31
+ };
32
+ };
33
+
34
+ export { defineIntorConfig };
@@ -0,0 +1,5 @@
1
+ export { defineIntorConfig } from "./define-intor-config";
2
+ export { DEFAULT_CACHE_OPTIONS } from "./constants/cache.constants";
3
+ export { DEFAULT_COOKIE_OPTIONS } from "./constants/cookie.constants";
4
+ export { DEFAULT_ROUTING_OPTIONS } from "./constants/routing.constants";
5
+ export type { IntorRawConfig, IntorResolvedConfig, } from "./types/intor-config.types";
@@ -0,0 +1,2 @@
1
+ import type { CacheRawOptions, CacheResolvedOptions } from "../../config/types/cache.types";
2
+ export declare const resolveCacheOptions: (cache?: CacheRawOptions) => CacheResolvedOptions;