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.
- package/dist/exports/config/index.d.ts +2 -0
- package/dist/exports/config/index.js +4 -0
- package/dist/exports/index.d.ts +5 -0
- package/dist/exports/index.js +11 -0
- package/dist/exports/next/index.d.ts +3 -0
- package/dist/exports/next/index.js +9 -0
- package/dist/exports/next/middleware/index.d.ts +2 -0
- package/dist/exports/next/middleware/index.js +2 -0
- package/dist/exports/next/server/index.d.ts +2 -0
- package/dist/exports/next/server/index.js +2 -0
- package/dist/exports/react/index.d.ts +2 -0
- package/dist/exports/react/index.js +6 -0
- package/dist/exports/server/index.d.ts +2 -0
- package/dist/exports/server/index.js +7 -0
- package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-all.d.ts +12 -0
- package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-all.js +60 -0
- package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-except-default.d.ts +16 -0
- package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-except-default.js +81 -0
- package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-none.d.ts +10 -0
- package/dist/src/adapters/next/middleware/handle-prefix/handle-prefix-none.js +22 -0
- package/dist/src/adapters/next/middleware/index.d.ts +2 -0
- package/dist/src/adapters/next/middleware/intor-middleware.d.ts +6 -0
- package/dist/src/adapters/next/middleware/intor-middleware.js +22 -0
- package/dist/src/adapters/next/middleware/utils/create-response.d.ts +17 -0
- package/dist/src/adapters/next/middleware/utils/create-response.js +42 -0
- package/dist/src/adapters/next/middleware/utils/determine-initial-locale.d.ts +8 -0
- package/dist/src/adapters/next/middleware/utils/determine-initial-locale.js +28 -0
- package/dist/src/adapters/next/middleware/utils/set-locale-cookie-edge.d.ts +15 -0
- package/dist/src/adapters/next/middleware/utils/set-locale-cookie-edge.js +24 -0
- package/dist/src/adapters/next/middleware/utils/set-pathname-header.d.ts +12 -0
- package/dist/src/adapters/next/middleware/utils/set-pathname-header.js +13 -0
- package/dist/src/adapters/next/navigation/index.d.ts +4 -0
- package/dist/src/adapters/next/navigation/link.d.ts +16 -0
- package/dist/src/adapters/next/navigation/link.js +25 -0
- package/dist/src/adapters/next/navigation/redirect.d.ts +16 -0
- package/dist/src/adapters/next/navigation/redirect.js +36 -0
- package/dist/src/adapters/next/navigation/use-pathname.d.ts +17 -0
- package/dist/src/adapters/next/navigation/use-pathname.js +49 -0
- package/dist/src/adapters/next/navigation/use-router.d.ts +20 -0
- package/dist/src/adapters/next/navigation/use-router.js +31 -0
- package/dist/src/adapters/next/navigation/utils/should-full-reload.d.ts +7 -0
- package/dist/src/adapters/next/navigation/utils/should-full-reload.js +19 -0
- package/dist/src/adapters/next/navigation/utils/use-locale-switch.d.ts +16 -0
- package/dist/src/adapters/next/navigation/utils/use-locale-switch.js +58 -0
- package/dist/src/adapters/next/server/get-i18n-context.d.ts +9 -0
- package/dist/src/adapters/next/server/get-i18n-context.js +47 -0
- package/dist/src/adapters/next/server/get-translator.d.ts +30 -0
- package/dist/src/adapters/next/server/get-translator.js +19 -0
- package/dist/src/adapters/next/server/index.d.ts +2 -0
- package/dist/src/adapters/next/shared/constants/pathname-header-name.d.ts +1 -0
- package/dist/src/adapters/next/shared/constants/pathname-header-name.js +4 -0
- package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.d.ts +16 -0
- package/dist/src/adapters/next/shared/utils/locale-prefix-pathname.js +33 -0
- package/dist/src/adapters/next/shared/utils/localize-pathname.d.ts +18 -0
- package/dist/src/adapters/next/shared/utils/localize-pathname.js +36 -0
- package/dist/src/client/react/contexts/config/context.d.ts +3 -0
- package/dist/src/client/react/contexts/config/context.js +6 -0
- package/dist/src/client/react/contexts/config/hook.d.ts +2 -0
- package/dist/src/client/react/contexts/config/hook.js +12 -0
- package/dist/src/client/react/contexts/config/index.d.ts +2 -0
- package/dist/src/client/react/contexts/config/provider.d.ts +2 -0
- package/dist/src/client/react/contexts/config/provider.js +11 -0
- package/dist/src/client/react/contexts/config/types.d.ts +10 -0
- package/dist/src/client/react/contexts/intor-provider/index.d.ts +2 -0
- package/dist/src/client/react/contexts/intor-provider/intor-provider.d.ts +2 -0
- package/dist/src/client/react/contexts/intor-provider/intor-provider.js +17 -0
- package/dist/src/client/react/contexts/intor-provider/types.d.ts +14 -0
- package/dist/src/client/react/contexts/locale/context.d.ts +3 -0
- package/dist/src/client/react/contexts/locale/context.js +6 -0
- package/dist/src/client/react/contexts/locale/hook.d.ts +1 -0
- package/dist/src/client/react/contexts/locale/hook.js +12 -0
- package/dist/src/client/react/contexts/locale/index.d.ts +2 -0
- package/dist/src/client/react/contexts/locale/provider.d.ts +3 -0
- package/dist/src/client/react/contexts/locale/provider.js +48 -0
- package/dist/src/client/react/contexts/locale/types.d.ts +13 -0
- package/dist/src/client/react/contexts/locale/utils/change-locale.d.ts +22 -0
- package/dist/src/client/react/contexts/locale/utils/change-locale.js +35 -0
- package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.d.ts +8 -0
- package/dist/src/client/react/contexts/locale/utils/use-init-locale-cookie.js +28 -0
- package/dist/src/client/react/contexts/messages/context.d.ts +3 -0
- package/dist/src/client/react/contexts/messages/context.js +6 -0
- package/dist/src/client/react/contexts/messages/hook.d.ts +2 -0
- package/dist/src/client/react/contexts/messages/hook.js +12 -0
- package/dist/src/client/react/contexts/messages/index.d.ts +2 -0
- package/dist/src/client/react/contexts/messages/provider.d.ts +3 -0
- package/dist/src/client/react/contexts/messages/provider.js +32 -0
- package/dist/src/client/react/contexts/messages/types.d.ts +15 -0
- package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.d.ts +16 -0
- package/dist/src/client/react/contexts/messages/utils/use-refetch-messages.js +57 -0
- package/dist/src/client/react/contexts/translate-handlers/context.d.ts +2 -0
- package/dist/src/client/react/contexts/translate-handlers/context.js +6 -0
- package/dist/src/client/react/contexts/translate-handlers/hook.d.ts +2 -0
- package/dist/src/client/react/contexts/translate-handlers/hook.js +10 -0
- package/dist/src/client/react/contexts/translate-handlers/index.d.ts +3 -0
- package/dist/src/client/react/contexts/translate-handlers/provider.d.ts +2 -0
- package/dist/src/client/react/contexts/translate-handlers/provider.js +11 -0
- package/dist/src/client/react/contexts/translate-handlers/types.d.ts +7 -0
- package/dist/src/client/react/contexts/translator/context.d.ts +3 -0
- package/dist/src/client/react/contexts/translator/context.js +6 -0
- package/dist/src/client/react/contexts/translator/hook.d.ts +2 -0
- package/dist/src/client/react/contexts/translator/hook.js +12 -0
- package/dist/src/client/react/contexts/translator/index.d.ts +2 -0
- package/dist/src/client/react/contexts/translator/provider.d.ts +2 -0
- package/dist/src/client/react/contexts/translator/provider.js +53 -0
- package/dist/src/client/react/contexts/translator/types.d.ts +11 -0
- package/dist/src/client/react/hooks/use-translator.d.ts +12 -0
- package/dist/src/client/react/hooks/use-translator.js +38 -0
- package/dist/src/client/react/index.d.ts +4 -0
- package/dist/src/client/shared/utils/get-initial-locale.d.ts +11 -0
- package/dist/src/client/shared/utils/get-initial-locale.js +21 -0
- package/dist/src/config/constants/cache.constants.d.ts +2 -0
- package/dist/src/config/constants/cache.constants.js +7 -0
- package/dist/src/config/constants/cookie.constants.d.ts +2 -0
- package/dist/src/config/constants/cookie.constants.js +14 -0
- package/dist/src/config/constants/routing.constants.d.ts +2 -0
- package/dist/src/config/constants/routing.constants.js +11 -0
- package/dist/src/config/define-intor-config.d.ts +2 -0
- package/dist/src/config/define-intor-config.js +34 -0
- package/dist/src/config/index.d.ts +5 -0
- package/dist/src/config/resolvers/resolve-cache-options.d.ts +2 -0
- package/dist/src/config/resolvers/resolve-cache-options.js +10 -0
- package/dist/src/config/resolvers/resolve-cookie-options.d.ts +11 -0
- package/dist/src/config/resolvers/resolve-cookie-options.js +19 -0
- package/dist/src/config/resolvers/resolve-fallback-locales.d.ts +3 -0
- package/dist/src/config/resolvers/resolve-fallback-locales.js +33 -0
- package/dist/src/config/resolvers/resolve-routing-options.d.ts +13 -0
- package/dist/src/config/resolvers/resolve-routing-options.js +28 -0
- package/dist/src/config/types/cache.types.d.ts +7 -0
- package/dist/src/config/types/cookie.types.d.ts +23 -0
- package/dist/src/config/types/intor-config.types.d.ts +41 -0
- package/dist/src/config/types/loader.types.d.ts +38 -0
- package/dist/src/config/types/logger.types.d.ts +7 -0
- package/dist/src/config/types/routing.types.d.ts +15 -0
- package/dist/src/config/types/translator.types.d.ts +4 -0
- package/dist/src/config/validators/validate-default-locale.d.ts +3 -0
- package/dist/src/config/validators/validate-default-locale.js +24 -0
- package/dist/src/config/validators/validate-supported-locales.d.ts +7 -0
- package/dist/src/config/validators/validate-supported-locales.js +22 -0
- package/dist/src/server/index.d.ts +4 -0
- package/dist/src/server/intor/index.d.ts +2 -0
- package/dist/src/server/intor/intor.d.ts +14 -0
- package/dist/src/server/intor/intor.js +67 -0
- package/dist/src/server/intor/types.d.ts +14 -0
- package/dist/src/server/messages/index.d.ts +7 -0
- package/dist/src/server/messages/load-local-messages/index.d.ts +2 -0
- package/dist/src/server/messages/load-local-messages/load-local-messages.d.ts +11 -0
- package/dist/src/server/messages/load-local-messages/load-local-messages.js +85 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.d.ts +29 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/collect-file-entries.js +95 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/index.d.ts +1 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/collect-file-entries/types.d.ts +15 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/index.d.ts +2 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/index.d.ts +1 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.d.ts +34 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/parse-file-entries.js +85 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/types.d.ts +18 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.d.ts +6 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/json-reader.js +12 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.d.ts +14 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/parse-file-entries/utils/nest-object-from-path.js +21 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.d.ts +10 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/read-locale-messages.js +31 -0
- package/dist/src/server/messages/load-local-messages/read-locale-messages/types.d.ts +23 -0
- package/dist/src/server/messages/load-local-messages/types.d.ts +21 -0
- package/dist/src/server/messages/load-messages.d.ts +11 -0
- package/dist/src/server/messages/load-messages.js +77 -0
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.d.ts +9 -0
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/fetch-locale-messages.js +50 -0
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/index.d.ts +1 -0
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/types.d.ts +13 -0
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.d.ts +5 -0
- package/dist/src/server/messages/load-remote-messages/fetch-locale-messages/utils/build-search-params.js +25 -0
- package/dist/src/server/messages/load-remote-messages/index.d.ts +2 -0
- package/dist/src/server/messages/load-remote-messages/load-remote-messages.d.ts +9 -0
- package/dist/src/server/messages/load-remote-messages/load-remote-messages.js +79 -0
- package/dist/src/server/messages/load-remote-messages/types.d.ts +20 -0
- package/dist/src/server/messages/shared/global-messages-pool.d.ts +15 -0
- package/dist/src/server/messages/shared/global-messages-pool.js +10 -0
- package/dist/src/server/messages/shared/types.d.ts +39 -0
- package/dist/src/server/messages/shared/utils/is-valid-messages.d.ts +15 -0
- package/dist/src/server/messages/shared/utils/is-valid-messages.js +36 -0
- package/dist/src/server/messages/types.d.ts +15 -0
- package/dist/src/server/shared/logger/get-logger.d.ts +11 -0
- package/dist/src/server/shared/logger/get-logger.js +34 -0
- package/dist/src/server/shared/logger/global-logger-pool.d.ts +15 -0
- package/dist/src/server/shared/logger/global-logger-pool.js +8 -0
- package/dist/src/server/translator/get-translator.d.ts +33 -0
- package/dist/src/server/translator/get-translator.js +39 -0
- package/dist/src/server/translator/index.d.ts +1 -0
- package/dist/src/shared/constants/prefix-placeholder.d.ts +1 -0
- package/dist/src/shared/constants/prefix-placeholder.js +4 -0
- package/dist/src/shared/error/index.d.ts +1 -0
- package/dist/src/shared/error/intor-error.d.ts +16 -0
- package/dist/src/shared/error/intor-error.js +21 -0
- package/dist/src/shared/types/generated.types.d.ts +30 -0
- package/dist/src/shared/types/translator-instance.types.d.ts +33 -0
- package/dist/src/shared/utils/client/build-cookie-string.d.ts +9 -0
- package/dist/src/shared/utils/client/build-cookie-string.js +33 -0
- package/dist/src/shared/utils/client/set-locale-cookie-browser.d.ts +13 -0
- package/dist/src/shared/utils/client/set-locale-cookie-browser.js +21 -0
- package/dist/src/shared/utils/index.d.ts +8 -0
- package/dist/src/shared/utils/locale/normalize-locale.d.ts +4 -0
- package/dist/src/shared/utils/locale/normalize-locale.js +42 -0
- package/dist/src/shared/utils/locale/resolve-preferred-locale.d.ts +5 -0
- package/dist/src/shared/utils/locale/resolve-preferred-locale.js +26 -0
- package/dist/src/shared/utils/merge-messages.d.ts +6 -0
- package/dist/src/shared/utils/merge-messages.js +13 -0
- package/dist/src/shared/utils/normalize-cache-key.d.ts +3 -0
- package/dist/src/shared/utils/normalize-cache-key.js +29 -0
- package/dist/src/shared/utils/pathname/extract-pathname.d.ts +28 -0
- package/dist/src/shared/utils/pathname/extract-pathname.js +58 -0
- package/dist/src/shared/utils/pathname/normalize-pathname.d.ts +12 -0
- package/dist/src/shared/utils/pathname/normalize-pathname.js +43 -0
- package/dist/src/shared/utils/pathname/standardize-pathname.d.ts +18 -0
- package/dist/src/shared/utils/pathname/standardize-pathname.js +30 -0
- package/dist/src/shared/utils/resolve-namespaces.d.ts +10 -0
- package/dist/src/shared/utils/resolve-namespaces.js +33 -0
- package/package.json +28 -30
- package/dist/config/index.cjs +0 -198
- package/dist/config/index.d.cts +0 -145
- package/dist/config/index.d.ts +0 -145
- package/dist/config/index.js +0 -193
- package/dist/index.cjs +0 -234
- package/dist/index.d.cts +0 -224
- package/dist/index.d.ts +0 -224
- package/dist/index.js +0 -214
- package/dist/next/index.cjs +0 -940
- package/dist/next/index.d.cts +0 -282
- package/dist/next/index.d.ts +0 -282
- package/dist/next/index.js +0 -907
- package/dist/next/middleware/index.cjs +0 -387
- package/dist/next/middleware/index.d.cts +0 -128
- package/dist/next/middleware/index.d.ts +0 -128
- package/dist/next/middleware/index.js +0 -384
- package/dist/next/server/index.cjs +0 -734
- package/dist/next/server/index.d.cts +0 -277
- package/dist/next/server/index.d.ts +0 -277
- package/dist/next/server/index.js +0 -723
- package/dist/react/index.cjs +0 -649
- package/dist/react/index.d.cts +0 -224
- package/dist/react/index.d.ts +0 -224
- package/dist/react/index.js +0 -620
- package/dist/server/index.cjs +0 -696
- package/dist/server/index.d.cts +0 -377
- package/dist/server/index.d.ts +0 -377
- 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,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,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,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,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,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,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,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,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";
|