@better-i18n/next 0.5.3 → 0.5.4
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/README.md +5 -0
- package/dist/__tests__/client-fallback.test.d.ts +2 -0
- package/dist/__tests__/client-fallback.test.d.ts.map +1 -0
- package/dist/__tests__/client-fallback.test.js +108 -0
- package/dist/__tests__/client-fallback.test.js.map +1 -0
- package/dist/client.d.ts +6 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +22 -19
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -15
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -8
- package/dist/server.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -139,8 +139,13 @@ const languages = await getManifestLanguages(config);
|
|
|
139
139
|
| `defaultLocale` | `string` | required | Default/fallback locale code |
|
|
140
140
|
| `cdnBaseUrl` | `string` | auto | CDN base URL (auto-detected) |
|
|
141
141
|
| `localePrefix` | `"as-needed"` \| `"always"` \| `"never"` | `"as-needed"` | URL locale prefix behavior |
|
|
142
|
+
| `cookieName` | `string` | `"locale"` | Cookie name for locale persistence |
|
|
142
143
|
| `manifestRevalidateSeconds` | `number` | `3600` | Next.js ISR revalidation for manifest |
|
|
143
144
|
| `messagesRevalidateSeconds` | `number` | `30` | Next.js ISR revalidation for messages |
|
|
145
|
+
| `storage` | `TranslationStorage` | `undefined` | Persistent cache for offline fallback (see `@better-i18n/core`) |
|
|
146
|
+
| `staticData` | `Record \| () => Promise` | `undefined` | Bundled translations as last-resort fallback |
|
|
147
|
+
| `fetchTimeout` | `number` | `10000` | CDN fetch timeout in ms |
|
|
148
|
+
| `retryCount` | `number` | `1` | Retry attempts on CDN failure |
|
|
144
149
|
| `debug` | `boolean` | `false` | Enable debug logging |
|
|
145
150
|
| `logLevel` | `LogLevel` | `"warn"` | Logging verbosity |
|
|
146
151
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-fallback.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/client-fallback.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { normalizeConfig } from "../config.js";
|
|
3
|
+
// ─── Test fixtures ──────────────────────────────────────────────────
|
|
4
|
+
const BASE_CONFIG = {
|
|
5
|
+
project: "acme/dashboard",
|
|
6
|
+
defaultLocale: "en",
|
|
7
|
+
};
|
|
8
|
+
const mockStorage = {
|
|
9
|
+
get: async () => null,
|
|
10
|
+
set: async () => { },
|
|
11
|
+
};
|
|
12
|
+
const mockStaticData = {
|
|
13
|
+
en: { common: { hello: "Hello" } },
|
|
14
|
+
tr: { common: { hello: "Merhaba" } },
|
|
15
|
+
};
|
|
16
|
+
// ─── Tests ──────────────────────────────────────────────────────────
|
|
17
|
+
describe("normalizeConfig — fallback fields passthrough", () => {
|
|
18
|
+
it("passes storage to core config", () => {
|
|
19
|
+
const config = normalizeConfig({
|
|
20
|
+
...BASE_CONFIG,
|
|
21
|
+
storage: mockStorage,
|
|
22
|
+
});
|
|
23
|
+
expect(config.storage).toBe(mockStorage);
|
|
24
|
+
});
|
|
25
|
+
it("passes staticData to core config", () => {
|
|
26
|
+
const config = normalizeConfig({
|
|
27
|
+
...BASE_CONFIG,
|
|
28
|
+
staticData: mockStaticData,
|
|
29
|
+
});
|
|
30
|
+
expect(config.staticData).toBe(mockStaticData);
|
|
31
|
+
});
|
|
32
|
+
it("passes fetchTimeout to core config", () => {
|
|
33
|
+
const config = normalizeConfig({
|
|
34
|
+
...BASE_CONFIG,
|
|
35
|
+
fetchTimeout: 5000,
|
|
36
|
+
});
|
|
37
|
+
expect(config.fetchTimeout).toBe(5000);
|
|
38
|
+
});
|
|
39
|
+
it("passes retryCount to core config", () => {
|
|
40
|
+
const config = normalizeConfig({
|
|
41
|
+
...BASE_CONFIG,
|
|
42
|
+
retryCount: 3,
|
|
43
|
+
});
|
|
44
|
+
expect(config.retryCount).toBe(3);
|
|
45
|
+
});
|
|
46
|
+
it("passes all fallback fields together", () => {
|
|
47
|
+
const config = normalizeConfig({
|
|
48
|
+
...BASE_CONFIG,
|
|
49
|
+
storage: mockStorage,
|
|
50
|
+
staticData: mockStaticData,
|
|
51
|
+
fetchTimeout: 7000,
|
|
52
|
+
retryCount: 2,
|
|
53
|
+
});
|
|
54
|
+
expect(config.storage).toBe(mockStorage);
|
|
55
|
+
expect(config.staticData).toBe(mockStaticData);
|
|
56
|
+
expect(config.fetchTimeout).toBe(7000);
|
|
57
|
+
expect(config.retryCount).toBe(2);
|
|
58
|
+
});
|
|
59
|
+
it("applies default fetchTimeout when not specified", () => {
|
|
60
|
+
const config = normalizeConfig(BASE_CONFIG);
|
|
61
|
+
expect(config.fetchTimeout).toBe(10000);
|
|
62
|
+
});
|
|
63
|
+
it("applies default retryCount when not specified", () => {
|
|
64
|
+
const config = normalizeConfig(BASE_CONFIG);
|
|
65
|
+
expect(config.retryCount).toBe(1);
|
|
66
|
+
});
|
|
67
|
+
it("leaves storage undefined when not specified", () => {
|
|
68
|
+
const config = normalizeConfig(BASE_CONFIG);
|
|
69
|
+
expect(config.storage).toBeUndefined();
|
|
70
|
+
});
|
|
71
|
+
it("leaves staticData undefined when not specified", () => {
|
|
72
|
+
const config = normalizeConfig(BASE_CONFIG);
|
|
73
|
+
expect(config.staticData).toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
it("preserves Next.js-specific defaults alongside fallback fields", () => {
|
|
76
|
+
const config = normalizeConfig({
|
|
77
|
+
...BASE_CONFIG,
|
|
78
|
+
storage: mockStorage,
|
|
79
|
+
});
|
|
80
|
+
// Next.js defaults should still be set
|
|
81
|
+
expect(config.localePrefix).toBe("as-needed");
|
|
82
|
+
expect(config.cookieName).toBe("locale");
|
|
83
|
+
expect(config.manifestRevalidateSeconds).toBe(3600);
|
|
84
|
+
expect(config.messagesRevalidateSeconds).toBe(30);
|
|
85
|
+
// Fallback field should be present
|
|
86
|
+
expect(config.storage).toBe(mockStorage);
|
|
87
|
+
});
|
|
88
|
+
it("supports lazy staticData function", () => {
|
|
89
|
+
const lazyStaticData = async () => mockStaticData;
|
|
90
|
+
const config = normalizeConfig({
|
|
91
|
+
...BASE_CONFIG,
|
|
92
|
+
staticData: lazyStaticData,
|
|
93
|
+
});
|
|
94
|
+
expect(config.staticData).toBe(lazyStaticData);
|
|
95
|
+
});
|
|
96
|
+
it("passes timeZone when provided", () => {
|
|
97
|
+
const config = normalizeConfig({
|
|
98
|
+
...BASE_CONFIG,
|
|
99
|
+
timeZone: "Europe/Istanbul",
|
|
100
|
+
});
|
|
101
|
+
expect(config.timeZone).toBe("Europe/Istanbul");
|
|
102
|
+
});
|
|
103
|
+
it("leaves timeZone undefined when not specified", () => {
|
|
104
|
+
const config = normalizeConfig(BASE_CONFIG);
|
|
105
|
+
expect(config.timeZone).toBeUndefined();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=client-fallback.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-fallback.test.js","sourceRoot":"","sources":["../../src/__tests__/client-fallback.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -8,6 +8,11 @@ export interface BetterI18nProviderProps {
|
|
|
8
8
|
messages: Messages;
|
|
9
9
|
/** i18n config — only project and defaultLocale are required */
|
|
10
10
|
config: I18nConfig;
|
|
11
|
+
/**
|
|
12
|
+
* IANA time zone for date/time formatting consistency.
|
|
13
|
+
* Falls back to `config.timeZone`, then auto-detects via `Intl.DateTimeFormat`.
|
|
14
|
+
*/
|
|
15
|
+
timeZone?: string;
|
|
11
16
|
children: ReactNode;
|
|
12
17
|
}
|
|
13
18
|
/**
|
|
@@ -40,7 +45,7 @@ export interface BetterI18nProviderProps {
|
|
|
40
45
|
* }
|
|
41
46
|
* ```
|
|
42
47
|
*/
|
|
43
|
-
export declare function BetterI18nProvider({ locale: initialLocale, messages: initialMessages, config, children, }: BetterI18nProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
48
|
+
export declare function BetterI18nProvider({ locale: initialLocale, messages: initialMessages, config, timeZone: timeZoneProp, children, }: BetterI18nProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
44
49
|
export type UseManifestLanguagesResult = {
|
|
45
50
|
languages: LanguageOption[];
|
|
46
51
|
isLoading: boolean;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,QAAQ,CAAC;IACnB,gEAAgE;IAChE,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,eAAe,EACzB,MAAM,EACN,QAAQ,GACT,EAAE,uBAAuB,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGlE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAU7C,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,QAAQ,EAAE,QAAQ,CAAC;IACnB,gEAAgE;IAChE,MAAM,EAAE,UAAU,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,eAAe,EACzB,MAAM,EACN,QAAQ,EAAE,YAAY,EACtB,QAAQ,GACT,EAAE,uBAAuB,2CAmEzB;AAID,MAAM,MAAM,0BAA0B,GAAG;IACvC,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;CACrB,CAAC;AAcF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,UAAU,KAAG,0BAoFzD,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAkB1E"}
|
package/dist/client.js
CHANGED
|
@@ -3,7 +3,7 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import { createContext, useCallback, useContext, useEffect, useMemo, useState, } from "react";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
5
|
import { NextIntlClientProvider } from "next-intl";
|
|
6
|
-
import { createI18nCore
|
|
6
|
+
import { createI18nCore } from "@better-i18n/core";
|
|
7
7
|
import { normalizeConfig } from "./config.js";
|
|
8
8
|
const BetterI18nContext = createContext(null);
|
|
9
9
|
/**
|
|
@@ -36,13 +36,24 @@ const BetterI18nContext = createContext(null);
|
|
|
36
36
|
* }
|
|
37
37
|
* ```
|
|
38
38
|
*/
|
|
39
|
-
export function BetterI18nProvider({ locale: initialLocale, messages: initialMessages, config, children, }) {
|
|
39
|
+
export function BetterI18nProvider({ locale: initialLocale, messages: initialMessages, config, timeZone: timeZoneProp, children, }) {
|
|
40
|
+
// Resolve timeZone: prop > config > runtime auto-detection.
|
|
41
|
+
// This avoids next-intl's ENVIRONMENT_FALLBACK warning.
|
|
42
|
+
const timeZone = useMemo(() => timeZoneProp ??
|
|
43
|
+
config.timeZone ??
|
|
44
|
+
Intl.DateTimeFormat().resolvedOptions().timeZone, [timeZoneProp, config.timeZone]);
|
|
40
45
|
const normalized = useMemo(() => normalizeConfig(config), [
|
|
41
46
|
config.project,
|
|
42
47
|
config.defaultLocale,
|
|
43
48
|
config.cookieName,
|
|
44
49
|
config.cdnBaseUrl,
|
|
50
|
+
config.storage,
|
|
51
|
+
config.staticData,
|
|
52
|
+
config.fetchTimeout,
|
|
53
|
+
config.retryCount,
|
|
45
54
|
]);
|
|
55
|
+
// Provider-level memoized core instance — reused by setLocale
|
|
56
|
+
const i18nCore = useMemo(() => createI18nCore(normalized), [normalized]);
|
|
46
57
|
const [locale, setLocaleState] = useState(initialLocale);
|
|
47
58
|
const [messages, setMessages] = useState(initialMessages);
|
|
48
59
|
// Sync with server-provided values when they change (e.g. navigation to a new page)
|
|
@@ -55,15 +66,9 @@ export function BetterI18nProvider({ locale: initialLocale, messages: initialMes
|
|
|
55
66
|
return;
|
|
56
67
|
// 1. Set cookie for server-side persistence
|
|
57
68
|
document.cookie = `${normalized.cookieName}=${newLocale}; path=/; max-age=31536000; samesite=lax`;
|
|
58
|
-
// 2. Fetch new messages
|
|
59
|
-
const { workspaceId, projectSlug } = parseProject(normalized.project);
|
|
60
|
-
const cdnBase = normalized.cdnBaseUrl || "https://cdn.better-i18n.com";
|
|
61
|
-
const url = `${cdnBase}/${workspaceId}/${projectSlug}/${newLocale}/translations.json`;
|
|
69
|
+
// 2. Fetch new messages with full fallback chain (CDN → Storage → StaticData)
|
|
62
70
|
try {
|
|
63
|
-
const
|
|
64
|
-
if (!res.ok)
|
|
65
|
-
throw new Error(`HTTP ${res.status}`);
|
|
66
|
-
const newMessages = await res.json();
|
|
71
|
+
const newMessages = await i18nCore.getMessages(newLocale);
|
|
67
72
|
// 3. Instant client-side update — no server round-trip
|
|
68
73
|
setLocaleState(newLocale);
|
|
69
74
|
setMessages(newMessages);
|
|
@@ -73,8 +78,8 @@ export function BetterI18nProvider({ locale: initialLocale, messages: initialMes
|
|
|
73
78
|
// Fallback: let the server handle it
|
|
74
79
|
window.location.reload();
|
|
75
80
|
}
|
|
76
|
-
}, [locale, normalized]);
|
|
77
|
-
return (_jsx(BetterI18nContext.Provider, { value: { setLocale }, children: _jsx(NextIntlClientProvider, { locale: locale, messages: messages, children: children }) }));
|
|
81
|
+
}, [locale, normalized.cookieName, i18nCore]);
|
|
82
|
+
return (_jsx(BetterI18nContext.Provider, { value: { setLocale }, children: _jsx(NextIntlClientProvider, { locale: locale, messages: messages, timeZone: timeZone, children: children }) }));
|
|
78
83
|
}
|
|
79
84
|
// Client-side request deduplication cache
|
|
80
85
|
const clientCache = new Map();
|
|
@@ -113,14 +118,12 @@ export const useManifestLanguages = (config) => {
|
|
|
113
118
|
config.cdnBaseUrl,
|
|
114
119
|
config.debug,
|
|
115
120
|
config.logLevel,
|
|
121
|
+
config.storage,
|
|
122
|
+
config.staticData,
|
|
123
|
+
config.fetchTimeout,
|
|
124
|
+
config.retryCount,
|
|
116
125
|
]);
|
|
117
|
-
const i18nCore = useMemo(() => createI18nCore(
|
|
118
|
-
project: normalized.project,
|
|
119
|
-
defaultLocale: normalized.defaultLocale,
|
|
120
|
-
cdnBaseUrl: normalized.cdnBaseUrl,
|
|
121
|
-
debug: normalized.debug,
|
|
122
|
-
logLevel: normalized.logLevel,
|
|
123
|
-
}), [normalized]);
|
|
126
|
+
const i18nCore = useMemo(() => createI18nCore(normalized), [normalized]);
|
|
124
127
|
const cacheKey = getCacheKey(normalized.project, normalized.cdnBaseUrl);
|
|
125
128
|
const cached = clientCache.get(cacheKey);
|
|
126
129
|
const [languages, setLanguages] = useState(cached?.data ?? []);
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,UAAU,KAAG,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGb,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,QAAQ,UAAU,KAAG,gBAsBpD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,QAAQ,gBAAgB,KAAG,MAC9B,CAAC"}
|
package/dist/config.js
CHANGED
|
@@ -5,23 +5,17 @@ export { parseProject };
|
|
|
5
5
|
* Normalize Next.js i18n config with defaults
|
|
6
6
|
*/
|
|
7
7
|
export const normalizeConfig = (config) => {
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
cdnBaseUrl: config.cdnBaseUrl,
|
|
13
|
-
manifestCacheTtlMs: config.manifestCacheTtlMs,
|
|
14
|
-
debug: config.debug,
|
|
15
|
-
logLevel: config.logLevel,
|
|
16
|
-
fetch: config.fetch,
|
|
17
|
-
});
|
|
18
|
-
// Add Next.js-specific defaults
|
|
8
|
+
// Destructure Next.js-specific fields, pass the rest to core as-is.
|
|
9
|
+
// This way, when core adds new fields, this file doesn't need updating.
|
|
10
|
+
const { localePrefix, cookieName, manifestRevalidateSeconds, messagesRevalidateSeconds, timeZone, ...coreFields } = config;
|
|
11
|
+
const coreConfig = coreNormalizeConfig(coreFields);
|
|
19
12
|
return {
|
|
20
13
|
...coreConfig,
|
|
21
|
-
localePrefix:
|
|
22
|
-
cookieName:
|
|
23
|
-
manifestRevalidateSeconds:
|
|
24
|
-
messagesRevalidateSeconds:
|
|
14
|
+
localePrefix: localePrefix ?? "as-needed",
|
|
15
|
+
cookieName: cookieName ?? "locale",
|
|
16
|
+
manifestRevalidateSeconds: manifestRevalidateSeconds ?? 3600,
|
|
17
|
+
messagesRevalidateSeconds: messagesRevalidateSeconds ?? 30,
|
|
18
|
+
timeZone,
|
|
25
19
|
};
|
|
26
20
|
};
|
|
27
21
|
/**
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,IAAI,qBAAqB,EAC1C,eAAe,IAAI,mBAAmB,GACvC,MAAM,mBAAmB,CAAC;AAG3B,mCAAmC;AACnC,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAoB,EAAE;IACtE,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,iBAAiB,IAAI,qBAAqB,EAC1C,eAAe,IAAI,mBAAmB,GACvC,MAAM,mBAAmB,CAAC;AAG3B,mCAAmC;AACnC,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAkB,EAAoB,EAAE;IACtE,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,EACJ,YAAY,EACZ,UAAU,EACV,yBAAyB,EACzB,yBAAyB,EACzB,QAAQ,EACR,GAAG,UAAU,EACd,GAAG,MAAM,CAAC;IAEX,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEnD,OAAO;QACL,GAAG,UAAU;QACb,YAAY,EAAE,YAAY,IAAI,WAAW;QACzC,UAAU,EAAE,UAAU,IAAI,QAAQ;QAClC,yBAAyB,EAAE,yBAAyB,IAAI,IAAI;QAC5D,yBAAyB,EAAE,yBAAyB,IAAI,EAAE;QAC1D,QAAQ;KACT,CAAC;AACJ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,MAAwB,EAAU,EAAE,CACpE,qBAAqB,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,OAAO,EAGL,0BAA0B,EAC1B,iBAAiB,EACjB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU;;;IAOzC,0EAA0E;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAM7C,OAAO,EAGL,0BAA0B,EAC1B,iBAAiB,EACjB,KAAK,kBAAkB,EACxB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU;;;IAOzC,0EAA0E;;;;oBAmE8nC,CAAC;;;;IA5DzsC;;;;;;;;;;;;;;;;;OAiBG;kCAC2B,kBAAkB;CAgBnD,CAAC;AAGF,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAG7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAG3D,YAAY,EACV,UAAU,EACV,cAAc,EACd,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,GACT,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C;;OAEG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACpD;AAeD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,UAAU,KAAG,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C;;OAEG;IACH,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACpD;AAeD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,kBAAkB,GAAI,QAAQ,UAAU,KAAG,YA0CvD,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,2BAA2B,GAAI,QAAQ,UAAU,gKAuC1D,CAAC;AAIL;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,QAAQ,UAAU,0DACN,CAAC;AAE3C;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,EAAE,UAAU;IAAE,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,0DACnC,CAAC;AAElD;;GAEG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,UAAU,sBACJ,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,QAAQ,UAAU,EAAE,QAAQ,MAAM,sBACd,CAAC;AAEjD;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,QAAQ,UAAU,0DACZ,CAAC;AAG5C,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/server.js
CHANGED
|
@@ -46,19 +46,30 @@ export const createNextI18nCore = (config) => {
|
|
|
46
46
|
debug: normalized.debug,
|
|
47
47
|
logLevel: normalized.logLevel,
|
|
48
48
|
fetch: manifestFetch,
|
|
49
|
+
storage: normalized.storage,
|
|
50
|
+
staticData: normalized.staticData,
|
|
51
|
+
fetchTimeout: normalized.fetchTimeout,
|
|
52
|
+
retryCount: normalized.retryCount,
|
|
49
53
|
});
|
|
50
54
|
// Messages use separate ISR fetch with shorter revalidation (default 30s)
|
|
51
55
|
const messagesFetch = createIsrFetch(normalized.messagesRevalidateSeconds);
|
|
56
|
+
// Build a core instance with ISR messages fetch for fallback support
|
|
57
|
+
const messagesCore = createI18nCore({
|
|
58
|
+
project: normalized.project,
|
|
59
|
+
defaultLocale: normalized.defaultLocale,
|
|
60
|
+
cdnBaseUrl: normalized.cdnBaseUrl,
|
|
61
|
+
manifestCacheTtlMs: normalized.manifestCacheTtlMs,
|
|
62
|
+
debug: normalized.debug,
|
|
63
|
+
logLevel: normalized.logLevel,
|
|
64
|
+
fetch: messagesFetch,
|
|
65
|
+
storage: normalized.storage,
|
|
66
|
+
staticData: normalized.staticData,
|
|
67
|
+
fetchTimeout: normalized.fetchTimeout,
|
|
68
|
+
retryCount: normalized.retryCount,
|
|
69
|
+
});
|
|
52
70
|
return {
|
|
53
71
|
...i18nCore,
|
|
54
|
-
getMessages:
|
|
55
|
-
const url = `${getProjectBaseUrl(normalized)}/${locale}/translations.json`;
|
|
56
|
-
const response = await messagesFetch(url);
|
|
57
|
-
if (!response.ok) {
|
|
58
|
-
throw new Error(`[better-i18n] Messages fetch failed for locale "${locale}" (${response.status})`);
|
|
59
|
-
}
|
|
60
|
-
return response.json();
|
|
61
|
-
},
|
|
72
|
+
getMessages: (locale) => messagesCore.getMessages(locale),
|
|
62
73
|
};
|
|
63
74
|
};
|
|
64
75
|
/**
|
|
@@ -99,9 +110,14 @@ export const createNextIntlRequestConfig = (config) => getRequestConfig(async ({
|
|
|
99
110
|
if (!locale || !locales.includes(locale)) {
|
|
100
111
|
locale = normalized.defaultLocale;
|
|
101
112
|
}
|
|
113
|
+
// Resolve timeZone: explicit config > runtime auto-detection.
|
|
114
|
+
// Setting this explicitly avoids next-intl's ENVIRONMENT_FALLBACK warning
|
|
115
|
+
// and prevents server/client hydration mismatches for date/time formatting.
|
|
116
|
+
const timeZone = normalized.timeZone ?? Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
102
117
|
return {
|
|
103
118
|
locale,
|
|
104
119
|
messages: await i18n.getMessages(locale),
|
|
120
|
+
timeZone,
|
|
105
121
|
};
|
|
106
122
|
});
|
|
107
123
|
// Convenience exports for backwards compatibility
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAajE;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,iBAAyB,EAAgB,EAAE;IACjE,OAAO,CAAC,KAAwB,EAAE,IAAkB,EAAE,EAAE;QACtD,MAAM,QAAQ,GAAyB;YACrC,GAAG,IAAI;YACP,IAAI,EAAE,EAAE,UAAU,EAAE,iBAAiB,EAAE;SACxC,CAAC;QACF,OAAO,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChC,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAgB,EAAE;IACrE,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE3C,4DAA4D;IAC5D,MAAM,aAAa,GAAG,cAAc,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,cAAc,CAAC;QAC9B,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,KAAK,EAAE,aAAa;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -25,6 +25,18 @@ export interface I18nConfig extends I18nCoreConfig {
|
|
|
25
25
|
* @default 30
|
|
26
26
|
*/
|
|
27
27
|
messagesRevalidateSeconds?: number;
|
|
28
|
+
/**
|
|
29
|
+
* IANA time zone identifier for consistent date/time formatting.
|
|
30
|
+
* When not provided, auto-detected via `Intl.DateTimeFormat().resolvedOptions().timeZone`.
|
|
31
|
+
*
|
|
32
|
+
* Setting this explicitly avoids next-intl's `ENVIRONMENT_FALLBACK` warning
|
|
33
|
+
* and ensures consistent server/client rendering.
|
|
34
|
+
*
|
|
35
|
+
* @example "Europe/Istanbul"
|
|
36
|
+
* @example "America/New_York"
|
|
37
|
+
* @example "UTC"
|
|
38
|
+
*/
|
|
39
|
+
timeZone?: string;
|
|
28
40
|
}
|
|
29
41
|
/**
|
|
30
42
|
* Normalized Next.js config with defaults
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,EACN,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAIlG,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,YAAY,EACV,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,QAAQ,EACR,MAAM,EACN,aAAa,GACd,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAIlG,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;OAGG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAEnC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,oBAAoB,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,cAAc,CAAC;IACpG,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB,EAAE,MAAM,CAAC;IAClC,yBAAyB,EAAE,MAAM,CAAC;CACnC;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,GAAG,WAAW,GAAG;IAC/C,IAAI,CAAC,EAAE;QACL,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@better-i18n/next",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.4",
|
|
4
4
|
"description": "Better-i18n Next.js integration",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"prepublishOnly": "bun run build"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@better-i18n/core": "0.1.
|
|
68
|
+
"@better-i18n/core": "0.1.9"
|
|
69
69
|
},
|
|
70
70
|
"peerDependencies": {
|
|
71
71
|
"next": ">=15.0.0",
|