@better-i18n/use-intl 0.2.0 → 0.2.2

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.
@@ -22,6 +22,8 @@ export interface LocaleDropdownProps {
22
22
  showNativeName?: boolean;
23
23
  /** Show locale code (e.g., "EN"). @default true */
24
24
  showLocaleCode?: boolean;
25
+ /** Menu placement direction. "auto" detects available viewport space. @default "auto" */
26
+ placement?: "auto" | "top" | "bottom";
25
27
  /** Custom render for the trigger button. */
26
28
  renderTrigger?: (ctx: {
27
29
  language: LanguageOption | undefined;
@@ -48,6 +50,9 @@ export interface LocaleDropdownProps {
48
50
  * // Headless mode for full custom styling
49
51
  * <LocaleDropdown variant="unstyled" className="my-dropdown" />
50
52
  *
53
+ * // Force open upward (e.g., in a footer)
54
+ * <LocaleDropdown placement="top" />
55
+ *
51
56
  * // Custom render
52
57
  * <LocaleDropdown
53
58
  * renderItem={({ language, isActive, flag, label }) => (
@@ -58,5 +63,5 @@ export interface LocaleDropdownProps {
58
63
  * />
59
64
  * ```
60
65
  */
61
- export declare function LocaleDropdown({ variant, className, triggerClassName, menuClassName, showFlag, showNativeName, showLocaleCode, renderTrigger, renderItem, }: LocaleDropdownProps): import("react/jsx-runtime").JSX.Element;
66
+ export declare function LocaleDropdown({ variant, className, triggerClassName, menuClassName, showFlag, showNativeName, showLocaleCode, placement: placementProp, renderTrigger, renderItem, }: LocaleDropdownProps): import("react/jsx-runtime").JSX.Element;
62
67
  //# sourceMappingURL=locale-dropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locale-dropdown.d.ts","sourceRoot":"","sources":["../../src/components/locale-dropdown.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AA+N3B,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,0IAA0I;IAC1I,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE;QACpB,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;QACrC,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;KACf,KAAK,SAAS,CAAC;IAChB,wCAAwC;IACxC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,2BAA2B,KAAK,SAAS,CAAC;CAC9D;AAID;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,QAAe,EACf,cAAqB,EACrB,cAAqB,EACrB,aAAa,EACb,UAAU,GACX,EAAE,mBAAmB,2CAuRrB"}
1
+ {"version":3,"file":"locale-dropdown.d.ts","sourceRoot":"","sources":["../../src/components/locale-dropdown.tsx"],"names":[],"mappings":"AAEA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAQf,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAyO3B,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,0IAA0I;IAC1I,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yFAAyF;IACzF,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;IACtC,4CAA4C;IAC5C,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE;QACpB,QAAQ,EAAE,cAAc,GAAG,SAAS,CAAC;QACrC,MAAM,EAAE,OAAO,CAAC;QAChB,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC;KACf,KAAK,SAAS,CAAC;IAChB,wCAAwC;IACxC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,2BAA2B,KAAK,SAAS,CAAC;CAC9D;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,cAAc,CAAC,EAC7B,OAAkB,EAClB,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,QAAe,EACf,cAAqB,EACrB,cAAqB,EACrB,SAAS,EAAE,aAAsB,EACjC,aAAa,EACb,UAAU,GACX,EAAE,mBAAmB,2CA0SrB"}
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState, } from "react";
4
+ import { useFloating, offset, flip, shift, autoUpdate, } from "@floating-ui/react";
4
5
  import { getLanguageLabel, resolveFlag, } from "@better-i18n/core";
5
6
  import { useLocaleRouter } from "../hooks/useLocaleRouter.js";
6
7
  import { useLanguages } from "../hooks.js";
@@ -37,8 +38,19 @@ function FlagDisplay({ flag, label, }) {
37
38
  }, "aria-hidden": "true", children: emoji }));
38
39
  }
39
40
  }
40
- return (_jsx("span", { style: { color: "var(--better-locale-code-text, #9ca3af)" }, children: _jsx(GlobeIcon, {}) }));
41
+ return (_jsx("span", { style: { color: "var(--better-locale-code-text, var(--_bl-muted))" }, children: _jsx(GlobeIcon, {}) }));
41
42
  }
43
+ // ─── Theme CSS ──────────────────────────────────────────────────────
44
+ /**
45
+ * Internal CSS custom properties (`--_bl-*`) provide dark-mode-aware
46
+ * defaults. Consumer-set `--better-locale-*` properties always win
47
+ * because the inline styles use them as the primary `var()` value.
48
+ *
49
+ * Supports: `.dark` class (Tailwind), `[data-theme="dark"]` attribute.
50
+ * Does NOT use `prefers-color-scheme` — dark mode must be explicit via
51
+ * site markup, so light-only sites aren't affected by OS dark mode.
52
+ */
53
+ const LOCALE_DROPDOWN_CSS = `[data-better-locale-dropdown]{--_bl-text:#374151;--_bl-menu-bg:#fff;--_bl-border:#e5e7eb;--_bl-hover:#f3f4f6;--_bl-active:#f9fafb;--_bl-muted:#9ca3af;--_bl-shadow:0 4px 24px rgba(0,0,0,.12)}.dark [data-better-locale-dropdown],[data-theme=dark] [data-better-locale-dropdown]{--_bl-text:#d1d5db;--_bl-menu-bg:#1f2937;--_bl-border:#374151;--_bl-hover:#374151;--_bl-active:#374151;--_bl-muted:#6b7280;--_bl-shadow:0 4px 24px rgba(0,0,0,.4)}@keyframes better-locale-pulse{0%,100%{opacity:1}50%{opacity:.4}}`;
42
54
  // ─── Styles ──────────────────────────────────────────────────────────
43
55
  const styles = {
44
56
  trigger: {
@@ -49,7 +61,7 @@ const styles = {
49
61
  borderRadius: "var(--better-locale-trigger-radius, 8px)",
50
62
  border: "var(--better-locale-trigger-border, 1px solid transparent)",
51
63
  background: "var(--better-locale-trigger-bg, transparent)",
52
- color: "var(--better-locale-text, #374151)",
64
+ color: "var(--better-locale-text, var(--_bl-text))",
53
65
  fontSize: 14,
54
66
  fontWeight: 500,
55
67
  cursor: "pointer",
@@ -62,16 +74,13 @@ const styles = {
62
74
  cursor: "default",
63
75
  },
64
76
  menu: {
65
- position: "absolute",
66
- right: 0,
67
- top: "calc(100% + 4px)",
68
77
  minWidth: 200,
69
78
  maxHeight: "70vh",
70
79
  overflowY: "auto",
71
80
  borderRadius: 12,
72
- border: "1px solid var(--better-locale-border, #e5e7eb)",
73
- background: "var(--better-locale-menu-bg, #ffffff)",
74
- boxShadow: "0 4px 24px rgba(0, 0, 0, 0.12)",
81
+ border: "1px solid var(--better-locale-border, var(--_bl-border))",
82
+ background: "var(--better-locale-menu-bg, var(--_bl-menu-bg))",
83
+ boxShadow: "var(--_bl-shadow)",
75
84
  padding: 0,
76
85
  zIndex: 50,
77
86
  listStyle: "none",
@@ -85,7 +94,7 @@ const styles = {
85
94
  padding: "8px 14px",
86
95
  border: "none",
87
96
  background: "transparent",
88
- color: "var(--better-locale-text, #374151)",
97
+ color: "var(--better-locale-text, var(--_bl-text))",
89
98
  fontSize: 14,
90
99
  cursor: "pointer",
91
100
  transition: "background 0.1s",
@@ -94,10 +103,10 @@ const styles = {
94
103
  lineHeight: 1.2,
95
104
  },
96
105
  itemActive: {
97
- background: "var(--better-locale-active-bg, #f9fafb)",
106
+ background: "var(--better-locale-active-bg, var(--_bl-active))",
98
107
  },
99
108
  itemHovered: {
100
- background: "var(--better-locale-hover-bg, #f3f4f6)",
109
+ background: "var(--better-locale-hover-bg, var(--_bl-hover))",
101
110
  },
102
111
  label: {
103
112
  flex: 1,
@@ -107,7 +116,7 @@ const styles = {
107
116
  fontSize: 10,
108
117
  fontFamily: "monospace",
109
118
  textTransform: "uppercase",
110
- color: "var(--better-locale-code-text, #9ca3af)",
119
+ color: "var(--better-locale-code-text, var(--_bl-muted))",
111
120
  letterSpacing: "0.05em",
112
121
  },
113
122
  check: {
@@ -127,7 +136,7 @@ const styles = {
127
136
  width: 20,
128
137
  height: 18,
129
138
  borderRadius: 3,
130
- background: "var(--better-locale-border, #e5e7eb)",
139
+ background: "var(--better-locale-border, var(--_bl-border))",
131
140
  animation: "better-locale-pulse 1.5s ease-in-out infinite",
132
141
  flexShrink: 0,
133
142
  },
@@ -135,7 +144,7 @@ const styles = {
135
144
  width: 56,
136
145
  height: 18,
137
146
  borderRadius: 4,
138
- background: "var(--better-locale-border, #e5e7eb)",
147
+ background: "var(--better-locale-border, var(--_bl-border))",
139
148
  animation: "better-locale-pulse 1.5s ease-in-out infinite",
140
149
  },
141
150
  };
@@ -155,6 +164,9 @@ const styles = {
155
164
  * // Headless mode for full custom styling
156
165
  * <LocaleDropdown variant="unstyled" className="my-dropdown" />
157
166
  *
167
+ * // Force open upward (e.g., in a footer)
168
+ * <LocaleDropdown placement="top" />
169
+ *
158
170
  * // Custom render
159
171
  * <LocaleDropdown
160
172
  * renderItem={({ language, isActive, flag, label }) => (
@@ -165,13 +177,24 @@ const styles = {
165
177
  * />
166
178
  * ```
167
179
  */
168
- export function LocaleDropdown({ variant = "styled", className, triggerClassName, menuClassName, showFlag = true, showNativeName = true, showLocaleCode = true, renderTrigger, renderItem, }) {
180
+ export function LocaleDropdown({ variant = "styled", className, triggerClassName, menuClassName, showFlag = true, showNativeName = true, showLocaleCode = true, placement: placementProp = "auto", renderTrigger, renderItem, }) {
169
181
  const { locale, navigate, isReady } = useLocaleRouter();
170
182
  const { languages, isLoading } = useLanguages();
171
183
  const [isOpen, setIsOpen] = useState(false);
172
184
  const [focusIndex, setFocusIndex] = useState(-1);
173
185
  const containerRef = useRef(null);
174
186
  const menuRef = useRef(null);
187
+ const { refs, floatingStyles, placement: resolvedPlacement } = useFloating({
188
+ open: isOpen,
189
+ strategy: "fixed",
190
+ placement: placementProp === "top" ? "top-end" : "bottom-end",
191
+ middleware: [
192
+ offset(4),
193
+ flip({ padding: 16 }),
194
+ shift({ padding: 8 }),
195
+ ],
196
+ whileElementsMounted: autoUpdate,
197
+ });
175
198
  const isStyled = variant === "styled";
176
199
  const currentLanguage = useMemo(() => languages.find((l) => l.code === locale), [languages, locale]);
177
200
  const currentLabel = currentLanguage
@@ -255,15 +278,20 @@ export function LocaleDropdown({ variant = "styled", className, triggerClassName
255
278
  label: "",
256
279
  }) }));
257
280
  }
258
- return (_jsxs("div", { "data-better-locale-dropdown": true, className: className, children: [_jsxs("div", { "aria-busy": "true", "data-better-locale-trigger": true, className: triggerClassName, style: isStyled ? styles.skeleton : undefined, children: [_jsx("span", { style: isStyled ? styles.skeletonFlag : undefined }), _jsx("span", { style: isStyled ? styles.skeletonText : undefined })] }), isStyled && (_jsx("style", { children: `@keyframes better-locale-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } }` }))] }));
281
+ return (_jsxs("div", { "data-better-locale-dropdown": true, className: className, children: [_jsxs("div", { "aria-busy": "true", "data-better-locale-trigger": true, className: triggerClassName, style: isStyled ? styles.skeleton : undefined, children: [_jsx("span", { style: isStyled ? styles.skeletonFlag : undefined }), _jsx("span", { style: isStyled ? styles.skeletonText : undefined })] }), isStyled && _jsx("style", { children: LOCALE_DROPDOWN_CSS })] }));
259
282
  }
260
- return (_jsxs("div", { ref: containerRef, "data-better-locale-dropdown": true, className: className, style: { position: "relative", display: "inline-block" }, children: [renderTrigger ? (_jsx("div", { onClick: () => canToggle && setIsOpen(!isOpen), onKeyDown: handleKeyDown, role: "button", tabIndex: 0, "aria-haspopup": "listbox", "aria-expanded": isOpen, "data-better-locale-trigger": true, className: triggerClassName, children: renderTrigger({
283
+ const handleTriggerClick = () => {
284
+ if (!canToggle)
285
+ return;
286
+ setIsOpen((prev) => !prev);
287
+ };
288
+ return (_jsxs("div", { ref: containerRef, "data-better-locale-dropdown": true, className: className, style: { position: "relative", display: "inline-block" }, children: [renderTrigger ? (_jsx("div", { ref: refs.setReference, onClick: handleTriggerClick, onKeyDown: handleKeyDown, role: "button", tabIndex: 0, "aria-haspopup": "listbox", "aria-expanded": isOpen, "data-better-locale-trigger": true, className: triggerClassName, children: renderTrigger({
261
289
  language: currentLanguage,
262
290
  isOpen,
263
291
  isLoading: false,
264
292
  flag: currentFlag,
265
293
  label: currentLabel,
266
- }) })) : (_jsxs("button", { type: "button", onClick: () => canToggle && setIsOpen(!isOpen), onKeyDown: handleKeyDown, "aria-haspopup": "listbox", "aria-expanded": isOpen, "aria-label": "Select language", disabled: !canToggle, "data-better-locale-trigger": true, className: triggerClassName, style: isStyled
294
+ }) })) : (_jsxs("button", { ref: refs.setReference, type: "button", onClick: handleTriggerClick, onKeyDown: handleKeyDown, "aria-haspopup": "listbox", "aria-expanded": isOpen, "aria-label": "Select language", disabled: !canToggle, "data-better-locale-trigger": true, className: triggerClassName, style: isStyled
267
295
  ? {
268
296
  ...styles.trigger,
269
297
  ...(!canToggle ? styles.triggerDisabled : {}),
@@ -271,8 +299,11 @@ export function LocaleDropdown({ variant = "styled", className, triggerClassName
271
299
  : undefined, children: [showFlag && currentFlag && (_jsx(FlagDisplay, { flag: currentFlag, label: currentLabel })), showNativeName && _jsx("span", { children: currentLabel }), canToggle && (_jsx(ChevronDownIcon, { style: {
272
300
  transition: "transform 0.2s",
273
301
  transform: isOpen ? "rotate(180deg)" : "rotate(0deg)",
274
- color: "var(--better-locale-code-text, #9ca3af)",
275
- } }))] })), isOpen && canToggle && (_jsx("ul", { ref: menuRef, role: "listbox", "aria-label": "Available languages", "data-better-locale-menu": true, className: menuClassName, style: isStyled ? styles.menu : undefined, children: languages.map((language, index) => {
302
+ color: "var(--better-locale-code-text, var(--_bl-muted))",
303
+ } }))] })), isOpen && canToggle && (_jsx("ul", { ref: (node) => {
304
+ refs.setFloating(node);
305
+ menuRef.current = node;
306
+ }, role: "listbox", "aria-label": "Available languages", "data-better-locale-menu": true, "data-placement": resolvedPlacement.startsWith("top") ? "top" : "bottom", className: menuClassName, style: isStyled ? { ...styles.menu, ...floatingStyles } : floatingStyles, children: languages.map((language, index) => {
276
307
  const label = getLanguageLabel(language);
277
308
  const isActive = language.code === locale;
278
309
  const isFocused = index === focusIndex;
@@ -293,6 +324,6 @@ export function LocaleDropdown({ variant = "styled", className, triggerClassName
293
324
  ...(isFocused ? styles.itemHovered : {}),
294
325
  }
295
326
  : undefined, children: [showFlag && _jsx(FlagDisplay, { flag: flag, label: label }), _jsx("span", { style: isStyled ? styles.label : undefined, children: showNativeName ? label : language.code.toUpperCase() }), showLocaleCode && (_jsx("span", { style: isStyled ? styles.code : undefined, children: language.code })), isActive && (_jsx("span", { style: isStyled ? styles.check : undefined, children: _jsx(CheckIcon, {}) }))] }, language.code));
296
- }) })), isStyled && isOpen && (_jsx("style", { children: `@keyframes better-locale-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }` }))] }));
327
+ }) })), isStyled && _jsx("style", { children: LOCALE_DROPDOWN_CSS })] }));
297
328
  }
298
329
  //# sourceMappingURL=locale-dropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locale-dropdown.js","sourceRoot":"","sources":["../../src/components/locale-dropdown.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"locale-dropdown.js","sourceRoot":"","sources":["../../src/components/locale-dropdown.tsx"],"names":[],"mappings":"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"}
package/dist/context.d.ts CHANGED
@@ -6,38 +6,25 @@ export declare const BetterI18nContext: import("react").Context<BetterI18nContex
6
6
  /**
7
7
  * Hook to access Better i18n context
8
8
  *
9
- * Note: For locale switching, use useLocaleRouter() which integrates with TanStack Router.
9
+ * Provides locale state, language list, and `setLocale()` for switching.
10
+ * For higher-level APIs, use `useLocale()` or `useLocaleRouter()`.
10
11
  *
11
12
  * @example
12
13
  * ```tsx
13
14
  * function LanguageInfo() {
14
- * const { locale, languages, isLoadingLanguages } = useBetterI18n()
15
+ * const { locale, setLocale, languages, isLoadingLanguages } = useBetterI18n()
15
16
  *
16
17
  * if (isLoadingLanguages) return <div>Loading...</div>
17
18
  *
18
19
  * return (
19
20
  * <div>
20
- * Current: {locale}
21
- * Available: {languages.map(l => l.code).join(', ')}
21
+ * <p>Current: {locale}</p>
22
+ * <p>Available: {languages.map(l => l.code).join(', ')}</p>
23
+ * <button onClick={() => setLocale('tr')}>Switch to Turkish</button>
22
24
  * </div>
23
25
  * )
24
26
  * }
25
27
  * ```
26
- *
27
- * @example
28
- * ```tsx
29
- * // For language switching with proper router navigation:
30
- * import { useLocaleRouter } from '@better-i18n/use-intl'
31
- *
32
- * function LanguageSwitcher() {
33
- * const { locale, locales, navigate } = useLocaleRouter()
34
- * return (
35
- * <select value={locale} onChange={(e) => navigate(e.target.value)}>
36
- * {locales.map((loc) => <option key={loc} value={loc}>{loc}</option>)}
37
- * </select>
38
- * )
39
- * }
40
- * ```
41
28
  */
42
29
  export declare function useBetterI18n(): BetterI18nContextValue;
43
30
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,iBAAiB,wDAE7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAUtD"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,iBAAiB,wDAE7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAUtD"}
package/dist/context.js CHANGED
@@ -7,38 +7,25 @@ export const BetterI18nContext = createContext(null);
7
7
  /**
8
8
  * Hook to access Better i18n context
9
9
  *
10
- * Note: For locale switching, use useLocaleRouter() which integrates with TanStack Router.
10
+ * Provides locale state, language list, and `setLocale()` for switching.
11
+ * For higher-level APIs, use `useLocale()` or `useLocaleRouter()`.
11
12
  *
12
13
  * @example
13
14
  * ```tsx
14
15
  * function LanguageInfo() {
15
- * const { locale, languages, isLoadingLanguages } = useBetterI18n()
16
+ * const { locale, setLocale, languages, isLoadingLanguages } = useBetterI18n()
16
17
  *
17
18
  * if (isLoadingLanguages) return <div>Loading...</div>
18
19
  *
19
20
  * return (
20
21
  * <div>
21
- * Current: {locale}
22
- * Available: {languages.map(l => l.code).join(', ')}
22
+ * <p>Current: {locale}</p>
23
+ * <p>Available: {languages.map(l => l.code).join(', ')}</p>
24
+ * <button onClick={() => setLocale('tr')}>Switch to Turkish</button>
23
25
  * </div>
24
26
  * )
25
27
  * }
26
28
  * ```
27
- *
28
- * @example
29
- * ```tsx
30
- * // For language switching with proper router navigation:
31
- * import { useLocaleRouter } from '@better-i18n/use-intl'
32
- *
33
- * function LanguageSwitcher() {
34
- * const { locale, locales, navigate } = useLocaleRouter()
35
- * return (
36
- * <select value={locale} onChange={(e) => navigate(e.target.value)}>
37
- * {locales.map((loc) => <option key={loc} value={loc}>{loc}</option>)}
38
- * </select>
39
- * )
40
- * }
41
- * ```
42
29
  */
43
30
  export function useBetterI18n() {
44
31
  const context = useContext(BetterI18nContext);
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAC5C,IAAI,CACL,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAGlD;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAC5C,IAAI,CACL,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -15,8 +15,9 @@ export interface UseLocaleRouterReturn {
15
15
  */
16
16
  defaultLocale: string;
17
17
  /**
18
- * Navigate to the same page with a new locale
19
- * Uses TanStack Router's navigate() for proper SPA navigation
18
+ * Navigate to the same page with a new locale.
19
+ * Uses TanStack Router navigation when available,
20
+ * falls back to context-based `setLocale()` otherwise.
20
21
  */
21
22
  navigate: (locale: string) => void;
22
23
  /**
@@ -31,16 +32,16 @@ export interface UseLocaleRouterReturn {
31
32
  isReady: boolean;
32
33
  }
33
34
  /**
34
- * Hook for router-integrated locale navigation
35
+ * Hook for locale navigation with automatic router detection.
35
36
  *
36
- * This hook provides a navigation-first approach to locale switching:
37
- * - Locale changes trigger proper router navigation
38
- * - Loaders re-execute with the new locale
39
- * - No state synchronization issues
40
- * - Works with TanStack Router's file-based routing
37
+ * When TanStack Router context is available, locale changes trigger
38
+ * proper SPA navigation. When no router is present (e.g., plain Vite
39
+ * apps), falls back to the provider's `setLocale()` for state-based
40
+ * locale switching.
41
41
  *
42
42
  * @example
43
43
  * ```tsx
44
+ * // Works in both router and non-router environments
44
45
  * function LanguageSwitcher() {
45
46
  * const { locale, locales, navigate, isReady } = useLocaleRouter();
46
47
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useLocaleRouter.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocaleRouter.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC;;;;OAIG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAEtD;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CAuDvD"}
1
+ {"version":3,"file":"useLocaleRouter.d.ts","sourceRoot":"","sources":["../../src/hooks/useLocaleRouter.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEnC;;;;OAIG;IACH,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;IAEtD;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,eAAe,IAAI,qBAAqB,CA6FvD"}
@@ -4,16 +4,16 @@ import { useRouter, useLocation } from "@tanstack/react-router";
4
4
  import { getLocaleFromPath, replaceLocaleInPath, addLocalePrefix, } from "@better-i18n/core";
5
5
  import { useBetterI18n } from "../context.js";
6
6
  /**
7
- * Hook for router-integrated locale navigation
7
+ * Hook for locale navigation with automatic router detection.
8
8
  *
9
- * This hook provides a navigation-first approach to locale switching:
10
- * - Locale changes trigger proper router navigation
11
- * - Loaders re-execute with the new locale
12
- * - No state synchronization issues
13
- * - Works with TanStack Router's file-based routing
9
+ * When TanStack Router context is available, locale changes trigger
10
+ * proper SPA navigation. When no router is present (e.g., plain Vite
11
+ * apps), falls back to the provider's `setLocale()` for state-based
12
+ * locale switching.
14
13
  *
15
14
  * @example
16
15
  * ```tsx
16
+ * // Works in both router and non-router environments
17
17
  * function LanguageSwitcher() {
18
18
  * const { locale, locales, navigate, isReady } = useLocaleRouter();
19
19
  *
@@ -45,16 +45,41 @@ import { useBetterI18n } from "../context.js";
45
45
  * ```
46
46
  */
47
47
  export function useLocaleRouter() {
48
- const router = useRouter();
49
- const location = useLocation();
50
- const { languages, isLoadingLanguages } = useBetterI18n();
51
- // Build config from CDN manifest
48
+ const { languages, isLoadingLanguages, localePrefix, locale: contextLocale, setLocale, } = useBetterI18n();
49
+ // Safely detect TanStack Router context.
50
+ // When no <RouterProvider> is in the tree, these hooks throw
51
+ // we catch gracefully and fall back to context-based locale switching.
52
+ //
53
+ // This is safe because:
54
+ // - The router presence never changes during a component's lifecycle
55
+ // - React hook calls (useContext) inside useRouter/useLocation always execute
56
+ // before any throw, so the hook count is consistent between renders
57
+ let router = null;
58
+ let location = null;
59
+ try {
60
+ router = useRouter();
61
+ }
62
+ catch {
63
+ // No TanStack Router context — will use context-based navigation
64
+ }
65
+ try {
66
+ location = useLocation();
67
+ }
68
+ catch {
69
+ // No TanStack Router context — will use context-based navigation
70
+ }
71
+ const hasRouter = router != null && location != null;
72
+ // Build config from CDN manifest — includes localePrefix for URL strategy
52
73
  const config = useMemo(() => ({
53
74
  locales: languages.map((lang) => lang.code),
54
75
  defaultLocale: languages.find((l) => l.isDefault)?.code || "en",
55
- }), [languages]);
56
- // Get effective locale from URL (handles default without prefix)
76
+ localePrefix,
77
+ }), [languages, localePrefix]);
78
+ // Get effective locale: from URL when router is available, from context otherwise
57
79
  const locale = useMemo(() => {
80
+ if (!hasRouter || !location) {
81
+ return contextLocale;
82
+ }
58
83
  // If no languages loaded yet, extract from path manually
59
84
  if (languages.length === 0) {
60
85
  const segments = location.pathname.split("/").filter(Boolean);
@@ -66,12 +91,18 @@ export function useLocaleRouter() {
66
91
  return "en"; // fallback
67
92
  }
68
93
  return getLocaleFromPath(location.pathname, config);
69
- }, [location.pathname, config, languages]);
70
- // Navigate to same page with new locale (SPA navigation!)
94
+ }, [hasRouter, location, config, languages, contextLocale]);
95
+ // Navigate: router-based SPA navigation or context-based state update
71
96
  const navigate = useCallback((newLocale) => {
72
- const newPath = replaceLocaleInPath(location.pathname, newLocale, config);
73
- router.navigate({ to: newPath });
74
- }, [location.pathname, config, router]);
97
+ if (hasRouter && router && location) {
98
+ const newPath = replaceLocaleInPath(location.pathname, newLocale, config);
99
+ router.navigate({ to: newPath });
100
+ }
101
+ else {
102
+ // No router — update locale via provider state
103
+ setLocale(newLocale);
104
+ }
105
+ }, [hasRouter, location, config, router, setLocale]);
75
106
  // Get localized path for links
76
107
  const localePath = useCallback((path, targetLocale) => {
77
108
  const loc = targetLocale || locale;
@@ -1 +1 @@
1
- {"version":3,"file":"useLocaleRouter.js","sourceRoot":"","sources":["../../src/hooks/useLocaleRouter.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,GAEhB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAwC9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,aAAa,EAAE,CAAC;IAE1D,iCAAiC;IACjC,MAAM,MAAM,GAAiB,OAAO,CAClC,GAAG,EAAE,CAAC,CAAC;QACL,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,aAAa,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,IAAI,IAAI;KAChE,CAAC,EACF,CAAC,SAAS,CAAC,CACZ,CAAC;IAEF,iEAAiE;IACjE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE;QAC1B,yDAAyD;QACzD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YACjC,mDAAmD;YACnD,IAAI,YAAY,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,OAAO,YAAY,CAAC;YACtB,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,WAAW;QAC1B,CAAC;QACD,OAAO,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACtD,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAE3C,0DAA0D;IAC1D,MAAM,QAAQ,GAAG,WAAW,CAC1B,CAAC,SAAiB,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC,EACD,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CACpC,CAAC;IAEF,+BAA+B;IAC/B,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,IAAY,EAAE,YAAqB,EAAE,EAAE;QACtC,MAAM,GAAG,GAAG,YAAY,IAAI,MAAM,CAAC;QACnC,OAAO,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC,EACD,CAAC,MAAM,EAAE,MAAM,CAAC,CACjB,CAAC;IAEF,OAAO;QACL,MAAM;QACN,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,QAAQ;QACR,UAAU;QACV,OAAO,EAAE,CAAC,kBAAkB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;KAC1D,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"useLocaleRouter.js","sourceRoot":"","sources":["../../src/hooks/useLocaleRouter.ts"],"names":[],"mappings":"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"}
package/dist/hooks.d.ts CHANGED
@@ -25,38 +25,27 @@ export declare function useLanguages(): {
25
25
  isLoading: boolean;
26
26
  };
27
27
  /**
28
- * Hook to get current locale (read-only)
29
- *
30
- * For locale switching with proper router navigation, use useLocaleRouter() instead.
28
+ * Hook to get current locale and switch between locales
31
29
  *
32
30
  * @example
33
31
  * ```tsx
34
32
  * function LocaleDisplay() {
35
- * const { locale, isLoading } = useLocale()
33
+ * const { locale, setLocale, isLoading } = useLocale()
36
34
  *
37
35
  * if (isLoading) return <div>Loading...</div>
38
36
  *
39
- * return <span>Current locale: {locale}</span>
40
- * }
41
- * ```
42
- *
43
- * @example
44
- * ```tsx
45
- * // For locale switching, use useLocaleRouter:
46
- * import { useLocaleRouter } from '@better-i18n/use-intl'
47
- *
48
- * function LocaleSwitcher() {
49
- * const { locale, navigate } = useLocaleRouter()
50
37
  * return (
51
- * <button onClick={() => navigate(locale === 'en' ? 'tr' : 'en')}>
52
- * Toggle: {locale}
53
- * </button>
38
+ * <div>
39
+ * <span>Current: {locale}</span>
40
+ * <button onClick={() => setLocale('tr')}>Switch to Turkish</button>
41
+ * </div>
54
42
  * )
55
43
  * }
56
44
  * ```
57
45
  */
58
46
  export declare function useLocale(): {
59
47
  locale: string;
48
+ setLocale: (locale: string) => void;
60
49
  isLoading: boolean;
61
50
  };
62
51
  export { useTranslations, useFormatter, useMessages, useNow, useTimeZone, useLocale as useIntlLocale, } from "use-intl";
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY;;;EAO3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,SAAS;;;EAOxB;AAGD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,WAAW,EACX,MAAM,EACN,WAAW,EACX,SAAS,IAAI,aAAa,GAC3B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY;;;EAO3B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS;;;;EAQxB;AAGD,OAAO,EACL,eAAe,EACf,YAAY,EACZ,WAAW,EACX,MAAM,EACN,WAAW,EACX,SAAS,IAAI,aAAa,GAC3B,MAAM,UAAU,CAAC"}
package/dist/hooks.js CHANGED
@@ -30,40 +30,29 @@ export function useLanguages() {
30
30
  };
31
31
  }
32
32
  /**
33
- * Hook to get current locale (read-only)
34
- *
35
- * For locale switching with proper router navigation, use useLocaleRouter() instead.
33
+ * Hook to get current locale and switch between locales
36
34
  *
37
35
  * @example
38
36
  * ```tsx
39
37
  * function LocaleDisplay() {
40
- * const { locale, isLoading } = useLocale()
38
+ * const { locale, setLocale, isLoading } = useLocale()
41
39
  *
42
40
  * if (isLoading) return <div>Loading...</div>
43
41
  *
44
- * return <span>Current locale: {locale}</span>
45
- * }
46
- * ```
47
- *
48
- * @example
49
- * ```tsx
50
- * // For locale switching, use useLocaleRouter:
51
- * import { useLocaleRouter } from '@better-i18n/use-intl'
52
- *
53
- * function LocaleSwitcher() {
54
- * const { locale, navigate } = useLocaleRouter()
55
42
  * return (
56
- * <button onClick={() => navigate(locale === 'en' ? 'tr' : 'en')}>
57
- * Toggle: {locale}
58
- * </button>
43
+ * <div>
44
+ * <span>Current: {locale}</span>
45
+ * <button onClick={() => setLocale('tr')}>Switch to Turkish</button>
46
+ * </div>
59
47
  * )
60
48
  * }
61
49
  * ```
62
50
  */
63
51
  export function useLocale() {
64
- const { locale, isLoadingMessages } = useBetterI18n();
52
+ const { locale, setLocale, isLoadingMessages } = useBetterI18n();
65
53
  return {
66
54
  locale,
55
+ setLocale,
67
56
  isLoading: isLoadingMessages,
68
57
  };
69
58
  }
package/dist/hooks.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,aAAa,EAAE,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,aAAa,EAAE,CAAC;IAEtD,OAAO;QACL,MAAM;QACN,SAAS,EAAE,iBAAiB;KAC7B,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,OAAO,EACL,eAAe,EACf,YAAY,EACZ,WAAW,EACX,MAAM,EACN,WAAW,EACX,SAAS,IAAI,aAAa,GAC3B,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,GAAG,aAAa,EAAE,CAAC;IAE1D,OAAO;QACL,SAAS;QACT,SAAS,EAAE,kBAAkB;KAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,SAAS;IACvB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,aAAa,EAAE,CAAC;IAEjE,OAAO;QACL,MAAM;QACN,SAAS;QACT,SAAS,EAAE,iBAAiB;KAC7B,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,OAAO,EACL,eAAe,EACf,YAAY,EACZ,WAAW,EACX,MAAM,EACN,WAAW,EACX,SAAS,IAAI,aAAa,GAC3B,MAAM,UAAU,CAAC"}
@@ -5,28 +5,49 @@ export interface BetterI18nProviderProps extends BetterI18nProviderConfig {
5
5
  children: ReactNode;
6
6
  /** Pre-loaded languages from SSR loader — skips loading state on first render */
7
7
  initialLanguages?: LanguageOption[];
8
+ /**
9
+ * URL prefix strategy for locale codes.
10
+ * - `"as-needed"` (default): default locale has no URL prefix
11
+ * - `"always"`: all locales get a URL prefix (e.g., TanStack Router `$locale/` routes)
12
+ * @default "as-needed"
13
+ */
14
+ localePrefix?: "always" | "as-needed";
8
15
  /** Custom fallback when a message key is missing */
9
16
  getMessageFallback?: (info: {
10
17
  error: Error;
11
18
  key: string;
12
19
  namespace?: string;
13
20
  }) => string;
21
+ /**
22
+ * Called when locale changes via `setLocale()` (e.g., from `LocaleDropdown`).
23
+ * In router-based apps, use this to trigger URL navigation:
24
+ *
25
+ * @example
26
+ * ```tsx
27
+ * <BetterI18nProvider
28
+ * project="acme/web"
29
+ * locale={locale}
30
+ * onLocaleChange={(newLocale) => {
31
+ * navigate({ to: `/${newLocale}${pathname}` })
32
+ * }}
33
+ * >
34
+ * ```
35
+ */
36
+ onLocaleChange?: (locale: string) => void;
14
37
  }
15
38
  /**
16
39
  * Provider component that combines Better i18n CDN with use-intl
17
40
  *
18
- * The locale is controlled externally (from URL/router). Use useLocaleRouter()
19
- * for locale switching with proper router integration.
41
+ * Manages locale state internally, enabling locale switching via
42
+ * `setLocale()` from `useLocale()` or `useLocaleRouter()`.
20
43
  *
21
44
  * @example
22
45
  * ```tsx
23
- * // Basic usage (CSR - fetches messages on client)
46
+ * // Plain Vite / React app (no router)
24
47
  * function App() {
25
48
  * return (
26
- * <BetterI18nProvider
27
- * project="acme/dashboard"
28
- * locale="en"
29
- * >
49
+ * <BetterI18nProvider project="acme/dashboard" locale="en">
50
+ * <LocaleDropdown />
30
51
  * <MyComponent />
31
52
  * </BetterI18nProvider>
32
53
  * )
@@ -47,5 +68,5 @@ export interface BetterI18nProviderProps extends BetterI18nProviderConfig {
47
68
  * }
48
69
  * ```
49
70
  */
50
- export declare function BetterI18nProvider({ children, project, locale: propLocale, messages: propMessages, timeZone, now, onError, cdnBaseUrl, debug, logLevel, fetch: customFetch, storage, staticData, fetchTimeout, retryCount, initialLanguages, getMessageFallback: customGetMessageFallback, }: BetterI18nProviderProps): import("react/jsx-runtime").JSX.Element;
71
+ export declare function BetterI18nProvider({ children, project, locale: propLocale, messages: propMessages, timeZone, now, onError, cdnBaseUrl, debug, logLevel, fetch: customFetch, storage, staticData, fetchTimeout, retryCount, initialLanguages, localePrefix, getMessageFallback: customGetMessageFallback, onLocaleChange, }: BetterI18nProviderProps): import("react/jsx-runtime").JSX.Element;
51
72
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGrE,OAAO,KAAK,EAAE,wBAAwB,EAAY,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB;IACvE,QAAQ,EAAE,SAAS,CAAC;IACpB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAC;IACpC,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC1B,KAAK,EAAE,KAAK,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,OAAO,EACP,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EACR,GAAG,EACH,OAAO,EACP,UAAU,EACV,KAAK,EACL,QAAQ,EACR,KAAK,EAAE,WAAW,EAClB,OAAO,EACP,UAAU,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAAE,wBAAwB,GAC7C,EAAE,uBAAuB,2CA4IzB"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAqD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG1F,OAAO,KAAK,EAAE,wBAAwB,EAAY,MAAM,YAAY,CAAC;AAErE,MAAM,WAAW,uBAAwB,SAAQ,wBAAwB;IACvE,QAAQ,EAAE,SAAS,CAAC;IACpB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,cAAc,EAAE,CAAC;IACpC;;;;;OAKG;IACH,YAAY,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACtC,oDAAoD;IACpD,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE;QAC1B,KAAK,EAAE,KAAK,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,KAAK,MAAM,CAAC;IACb;;;;;;;;;;;;;;OAcG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,OAAO,EACP,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,YAAY,EACtB,QAAQ,EACR,GAAG,EACH,OAAO,EACP,UAAU,EACV,KAAK,EACL,QAAQ,EACR,KAAK,EAAE,WAAW,EAClB,OAAO,EACP,UAAU,EACV,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,YAA0B,EAC1B,kBAAkB,EAAE,wBAAwB,EAC5C,cAAc,GACf,EAAE,uBAAuB,2CAsKzB"}
package/dist/provider.js CHANGED
@@ -1,24 +1,22 @@
1
1
  "use client";
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { createI18nCore } from "@better-i18n/core";
4
- import { useEffect, useMemo, useState } from "react";
4
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
5
5
  import { IntlProvider } from "use-intl";
6
6
  import { BetterI18nContext } from "./context.js";
7
7
  /**
8
8
  * Provider component that combines Better i18n CDN with use-intl
9
9
  *
10
- * The locale is controlled externally (from URL/router). Use useLocaleRouter()
11
- * for locale switching with proper router integration.
10
+ * Manages locale state internally, enabling locale switching via
11
+ * `setLocale()` from `useLocale()` or `useLocaleRouter()`.
12
12
  *
13
13
  * @example
14
14
  * ```tsx
15
- * // Basic usage (CSR - fetches messages on client)
15
+ * // Plain Vite / React app (no router)
16
16
  * function App() {
17
17
  * return (
18
- * <BetterI18nProvider
19
- * project="acme/dashboard"
20
- * locale="en"
21
- * >
18
+ * <BetterI18nProvider project="acme/dashboard" locale="en">
19
+ * <LocaleDropdown />
22
20
  * <MyComponent />
23
21
  * </BetterI18nProvider>
24
22
  * )
@@ -39,14 +37,30 @@ import { BetterI18nContext } from "./context.js";
39
37
  * }
40
38
  * ```
41
39
  */
42
- export function BetterI18nProvider({ children, project, locale: propLocale, messages: propMessages, timeZone, now, onError, cdnBaseUrl, debug, logLevel, fetch: customFetch, storage, staticData, fetchTimeout, retryCount, initialLanguages, getMessageFallback: customGetMessageFallback, }) {
43
- // Locale is controlled by props (from URL/router)
44
- const locale = propLocale;
45
- // clientMessages is only used in CSR mode (when propMessages is not provided).
46
- // In SSG/SSR mode, propMessages comes from the loader and is used directly —
47
- // synchronous derivation avoids the useEffect delay that causes white flash on hydration.
40
+ export function BetterI18nProvider({ children, project, locale: propLocale, messages: propMessages, timeZone, now, onError, cdnBaseUrl, debug, logLevel, fetch: customFetch, storage, staticData, fetchTimeout, retryCount, initialLanguages, localePrefix = "as-needed", getMessageFallback: customGetMessageFallback, onLocaleChange, }) {
41
+ // Internal locale state enables non-router apps to switch locale
42
+ // via setLocale() without needing URL-based navigation.
43
+ const [managedLocale, setManagedLocale] = useState(propLocale);
44
+ // Sync when the external prop changes (e.g., router navigation updates propLocale)
45
+ useEffect(() => {
46
+ setManagedLocale(propLocale);
47
+ }, [propLocale]);
48
+ const locale = managedLocale;
49
+ // setLocale: updates internal state + notifies parent via callback
50
+ const setLocale = useCallback((newLocale) => {
51
+ setManagedLocale(newLocale);
52
+ onLocaleChange?.(newLocale);
53
+ }, [onLocaleChange]);
54
+ // Track the locale that propMessages was originally provided for.
55
+ // In SSR apps, propMessages comes from a one-time loader (script tag / SSR side-channel)
56
+ // and stays frozen at the initial locale. When the user SPA-navigates to a new locale,
57
+ // propMessages is stale — we must fetch from CDN instead of trusting it.
58
+ const propMessagesLocaleRef = useRef(propMessages ? locale : undefined);
48
59
  const [clientMessages, setClientMessages] = useState();
49
- const messages = propMessages ?? clientMessages;
60
+ // Use propMessages only when it matches the current locale (SSR hydration).
61
+ // After SPA navigation to a different locale, fall through to clientMessages (CDN-fetched).
62
+ const isPropMessagesFresh = propMessages && propMessagesLocaleRef.current === locale;
63
+ const messages = isPropMessagesFresh ? propMessages : (clientMessages ?? propMessages);
50
64
  const [languages, setLanguages] = useState(initialLanguages ?? []);
51
65
  const [isLoadingMessages, setIsLoadingMessages] = useState(propMessages === undefined);
52
66
  const [isLoadingLanguages, setIsLoadingLanguages] = useState(!initialLanguages);
@@ -89,10 +103,10 @@ export function BetterI18nProvider({ children, project, locale: propLocale, mess
89
103
  cancelled = true;
90
104
  };
91
105
  }, [i18nCore, initialLanguages]);
92
- // Load messages when locale changes and no pre-loaded messages available
106
+ // Load messages when locale changes.
107
+ // Skip only when propMessages is fresh (provided for the current locale — SSR hydration).
93
108
  useEffect(() => {
94
- // Skip if we already have messages for this render
95
- if (propMessages) {
109
+ if (propMessages && propMessagesLocaleRef.current === locale) {
96
110
  return;
97
111
  }
98
112
  let cancelled = false;
@@ -118,14 +132,15 @@ export function BetterI18nProvider({ children, project, locale: propLocale, mess
118
132
  cancelled = true;
119
133
  };
120
134
  }, [locale, i18nCore, propMessages]);
121
- // Context value (read-only locale - use useLocaleRouter for navigation)
122
135
  const contextValue = useMemo(() => ({
123
136
  locale,
137
+ setLocale,
124
138
  languages,
125
139
  isLoadingLanguages,
126
140
  isLoadingMessages,
127
141
  project,
128
- }), [locale, languages, isLoadingLanguages, isLoadingMessages, project]);
142
+ localePrefix,
143
+ }), [locale, setLocale, languages, isLoadingLanguages, isLoadingMessages, project, localePrefix]);
129
144
  if (!messages) {
130
145
  // Render children with empty messages instead of blanking the screen.
131
146
  // This converts a full DOM structural mismatch (null vs full tree)
@@ -1 +1 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -34,14 +34,21 @@ export interface BetterI18nProviderConfig extends Omit<I18nCoreConfig, "defaultL
34
34
  /**
35
35
  * Better i18n context value
36
36
  *
37
- * Note: Locale is read-only. Use useLocaleRouter().navigate() for locale changes
38
- * to ensure proper router integration.
37
+ * Use `setLocale()` for locale switching. In router-based apps,
38
+ * the provider's `onLocaleChange` callback handles navigation.
39
39
  */
40
40
  export interface BetterI18nContextValue {
41
41
  /**
42
- * Current locale (read-only - use useLocaleRouter().navigate() to change)
42
+ * Current locale
43
43
  */
44
44
  locale: string;
45
+ /**
46
+ * Change the active locale.
47
+ * Updates internal state and triggers message loading.
48
+ * In router-based apps, also fires the `onLocaleChange` callback
49
+ * so the parent can handle URL navigation.
50
+ */
51
+ setLocale: (locale: string) => void;
45
52
  /**
46
53
  * Available languages with metadata from CDN manifest
47
54
  */
@@ -58,6 +65,12 @@ export interface BetterI18nContextValue {
58
65
  * Project identifier
59
66
  */
60
67
  project: string;
68
+ /**
69
+ * URL prefix strategy for locale codes.
70
+ * - `"as-needed"`: default locale has no URL prefix
71
+ * - `"always"`: all locales get a URL prefix (e.g., TanStack Router `$locale/`)
72
+ */
73
+ localePrefix: "always" | "as-needed";
61
74
  }
62
75
  /**
63
76
  * Server-side configuration for getMessages
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,wBACf,SAAQ,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC;IAC7C;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,GAAG,CAAC,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;CAC1D;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,SAAS,EAAE,cAAc,EAAE,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC;AAEvE;;GAEG;AACH,MAAM,WAAW,wBACf,SAAQ,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC;IAC7C;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAEpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,GAAG,CAAC,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC,SAAS,CAAC,CAAC;CAC1D;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpC;;OAEG;IACH,SAAS,EAAE,cAAc,EAAE,CAAC;IAE5B;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,iBAAiB,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,YAAY,EAAE,QAAQ,GAAG,WAAW,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-i18n/use-intl",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Better i18n integration for use-intl (React, TanStack Start)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -57,7 +57,8 @@
57
57
  "prepublishOnly": "bun run build"
58
58
  },
59
59
  "dependencies": {
60
- "@better-i18n/core": "^0.3.0"
60
+ "@better-i18n/core": "^0.3.0",
61
+ "@floating-ui/react": "^0.27.19"
61
62
  },
62
63
  "peerDependencies": {
63
64
  "react": ">=18.0.0",