@voltro/i18n 0.69.1 → 0.71.0

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/server.d.ts CHANGED
@@ -22,14 +22,14 @@ export declare const isSupportedTimeZone: (name: string | null | undefined) => n
22
22
  export declare const LOCALE_COOKIE = "voltro:locale";
23
23
 
24
24
  /**
25
- * Build the per-request resolver: cookie > Accept-Language > default, then the
25
+ * Build the per-request resolver: route locale > cookie > Accept-Language > default, then the
26
26
  * matching wrapper.
27
27
  *
28
28
  * Returns `undefined` when the app ships no usable catalog, so a caller can
29
29
  * spread the result and omit `outerWrap` entirely rather than passing an
30
30
  * identity wrap — an app without locales must render exactly as before.
31
31
  */
32
- export declare const makeSsrI18nResolver: (args: SsrI18nResolverArgs) => ((cookieHeader?: string | null, acceptLanguageHeader?: string | null) => ResolvedSsrI18n | undefined);
32
+ export declare const makeSsrI18nResolver: (args: SsrI18nResolverArgs) => ((cookieHeader?: string | null, acceptLanguageHeader?: string | null, routeLocale?: string | null) => ResolvedSsrI18n | undefined);
33
33
 
34
34
  /** What a renderer needs to render one request in the right locale. */
35
35
  export declare interface ResolvedSsrI18n {
@@ -48,6 +48,10 @@ export declare interface ResolvedSsrI18n {
48
48
  export declare const resolveLocale: (args: ResolveLocaleArgs) => string;
49
49
 
50
50
  export declare interface ResolveLocaleArgs {
51
+ /** The matched `[locale]` route parameter, not a guessed pathname prefix.
52
+ * Wins only on an EXACT supported spelling; unknown route values fall
53
+ * through to request preferences. Does not validate or redirect a route. */
54
+ readonly routeLocale?: string | null | undefined;
51
55
  /** Raw `Cookie:` request header, or null/undefined when absent. */
52
56
  readonly cookieHeader?: string | null;
53
57
  /** Raw `Accept-Language:` request header, or null/undefined when
package/dist/server.js CHANGED
@@ -29,16 +29,18 @@ var o = a, s = (e) => RegExp(`(?:^|;\\s*)${e.replace(/[.*+?^${}()|[\]\\]/g, "\\$
29
29
  q: r
30
30
  };
31
31
  }).filter((e) => e !== null).sort((e, t) => t.q - e.q) : [], d = (e) => {
32
- let { cookieHeader: t, acceptLanguageHeader: n, supported: r, defaultLocale: i } = e, a = c(t, o);
33
- if (a) {
34
- let e = l(a, r);
32
+ let { routeLocale: t, cookieHeader: n, acceptLanguageHeader: r, supported: i, defaultLocale: a } = e;
33
+ if (t && i.includes(t)) return t;
34
+ let s = c(n, o);
35
+ if (s) {
36
+ let e = l(s, i);
35
37
  if (e) return e;
36
38
  }
37
- for (let e of u(n)) {
38
- let t = l(e.tag, r);
39
+ for (let e of u(r)) {
40
+ let t = l(e.tag, i);
39
41
  if (t) return t;
40
42
  }
41
- return i;
43
+ return a;
42
44
  }, f = (e) => {
43
45
  let { cookieHeader: t, configured: n, defaultTimeZone: a } = e;
44
46
  if (!n) return;
@@ -47,23 +49,24 @@ var o = a, s = (e) => RegExp(`(?:^|;\\s*)${e.replace(/[.*+?^${}()|[\]\\]/g, "\\$
47
49
  return r(o) ? o : r(a) ? a : "UTC";
48
50
  }, p = (e) => {
49
51
  let { wraps: t, supported: n, defaultLocale: r } = e;
50
- return Object.keys(t).length === 0 ? () => void 0 : (i, a) => {
51
- let o = d({
52
+ return Object.keys(t).length === 0 ? () => void 0 : (i, a, o) => {
53
+ let s = d({
54
+ routeLocale: o ?? null,
52
55
  cookieHeader: i ?? null,
53
56
  acceptLanguageHeader: a ?? null,
54
57
  supported: n,
55
58
  defaultLocale: r
56
- }), s = f({
59
+ }), c = f({
57
60
  cookieHeader: i ?? null,
58
61
  configured: e.timeZone ?? null,
59
62
  defaultTimeZone: e.defaultTimeZone ?? null
60
- }), c = (e.now ?? Date.now)(), l = t[o] ?? t[r];
61
- if (l !== void 0) return {
62
- locale: o,
63
- timeZone: s,
64
- outerWrap: (e) => l(e, {
65
- timeZone: s,
66
- renderedAt: c
63
+ }), l = (e.now ?? Date.now)(), u = t[s] ?? t[r];
64
+ if (u !== void 0) return {
65
+ locale: s,
66
+ timeZone: c,
67
+ outerWrap: (e) => u(e, {
68
+ timeZone: c,
69
+ renderedAt: l
67
70
  })
68
71
  };
69
72
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voltro/i18n",
3
- "version": "0.69.1",
3
+ "version": "0.71.0",
4
4
  "description": "Voltro's i18n layer — thin opinionated wrap over react-intl. Provides the framework's locale-resolution conventions (voltro:locale cookie + Accept-Language fallback), a typed message-catalog helper, and a slim provider component. Power users can import directly from react-intl for advanced APIs.",
5
5
  "keywords": [
6
6
  "voltro",