@adminiumjs/i18n 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/LICENSE +661 -0
  2. package/dist/create-i18n.d.ts +48 -0
  3. package/dist/create-i18n.d.ts.map +1 -0
  4. package/dist/create-i18n.js +98 -0
  5. package/dist/create-i18n.js.map +1 -0
  6. package/dist/format/index.d.ts +70 -0
  7. package/dist/format/index.d.ts.map +1 -0
  8. package/dist/format/index.js +217 -0
  9. package/dist/format/index.js.map +1 -0
  10. package/dist/icu-format.d.ts +17 -0
  11. package/dist/icu-format.d.ts.map +1 -0
  12. package/dist/icu-format.js +52 -0
  13. package/dist/icu-format.js.map +1 -0
  14. package/dist/index.d.ts +16 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +12 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/locales.d.ts +99 -0
  19. package/dist/locales.d.ts.map +1 -0
  20. package/dist/locales.js +55 -0
  21. package/dist/locales.js.map +1 -0
  22. package/dist/react.d.ts +26 -0
  23. package/dist/react.d.ts.map +1 -0
  24. package/dist/react.js +61 -0
  25. package/dist/react.js.map +1 -0
  26. package/dist/resources/ar-eg/common.d.ts +1964 -0
  27. package/dist/resources/ar-eg/common.d.ts.map +1 -0
  28. package/dist/resources/ar-eg/common.js +1963 -0
  29. package/dist/resources/ar-eg/common.js.map +1 -0
  30. package/dist/resources/ar-eg/errors.d.ts +45 -0
  31. package/dist/resources/ar-eg/errors.d.ts.map +1 -0
  32. package/dist/resources/ar-eg/errors.js +44 -0
  33. package/dist/resources/ar-eg/errors.js.map +1 -0
  34. package/dist/resources/ar-eg/generated.d.ts +20 -0
  35. package/dist/resources/ar-eg/generated.d.ts.map +1 -0
  36. package/dist/resources/ar-eg/generated.js +19 -0
  37. package/dist/resources/ar-eg/generated.js.map +1 -0
  38. package/dist/resources/ar-eg/studio.d.ts +18 -0
  39. package/dist/resources/ar-eg/studio.d.ts.map +1 -0
  40. package/dist/resources/ar-eg/studio.js +17 -0
  41. package/dist/resources/ar-eg/studio.js.map +1 -0
  42. package/dist/resources/ar-eg/ui.d.ts +996 -0
  43. package/dist/resources/ar-eg/ui.d.ts.map +1 -0
  44. package/dist/resources/ar-eg/ui.js +995 -0
  45. package/dist/resources/ar-eg/ui.js.map +1 -0
  46. package/dist/resources/cs-cz/common.d.ts +1964 -0
  47. package/dist/resources/cs-cz/common.d.ts.map +1 -0
  48. package/dist/resources/cs-cz/common.js +1963 -0
  49. package/dist/resources/cs-cz/common.js.map +1 -0
  50. package/dist/resources/cs-cz/errors.d.ts +45 -0
  51. package/dist/resources/cs-cz/errors.d.ts.map +1 -0
  52. package/dist/resources/cs-cz/errors.js +44 -0
  53. package/dist/resources/cs-cz/errors.js.map +1 -0
  54. package/dist/resources/cs-cz/generated.d.ts +20 -0
  55. package/dist/resources/cs-cz/generated.d.ts.map +1 -0
  56. package/dist/resources/cs-cz/generated.js +19 -0
  57. package/dist/resources/cs-cz/generated.js.map +1 -0
  58. package/dist/resources/cs-cz/studio.d.ts +18 -0
  59. package/dist/resources/cs-cz/studio.d.ts.map +1 -0
  60. package/dist/resources/cs-cz/studio.js +17 -0
  61. package/dist/resources/cs-cz/studio.js.map +1 -0
  62. package/dist/resources/cs-cz/ui.d.ts +996 -0
  63. package/dist/resources/cs-cz/ui.d.ts.map +1 -0
  64. package/dist/resources/cs-cz/ui.js +995 -0
  65. package/dist/resources/cs-cz/ui.js.map +1 -0
  66. package/dist/resources/da-dk/common.d.ts +1964 -0
  67. package/dist/resources/da-dk/common.d.ts.map +1 -0
  68. package/dist/resources/da-dk/common.js +1963 -0
  69. package/dist/resources/da-dk/common.js.map +1 -0
  70. package/dist/resources/da-dk/errors.d.ts +45 -0
  71. package/dist/resources/da-dk/errors.d.ts.map +1 -0
  72. package/dist/resources/da-dk/errors.js +44 -0
  73. package/dist/resources/da-dk/errors.js.map +1 -0
  74. package/dist/resources/da-dk/generated.d.ts +20 -0
  75. package/dist/resources/da-dk/generated.d.ts.map +1 -0
  76. package/dist/resources/da-dk/generated.js +19 -0
  77. package/dist/resources/da-dk/generated.js.map +1 -0
  78. package/dist/resources/da-dk/studio.d.ts +18 -0
  79. package/dist/resources/da-dk/studio.d.ts.map +1 -0
  80. package/dist/resources/da-dk/studio.js +17 -0
  81. package/dist/resources/da-dk/studio.js.map +1 -0
  82. package/dist/resources/da-dk/ui.d.ts +996 -0
  83. package/dist/resources/da-dk/ui.d.ts.map +1 -0
  84. package/dist/resources/da-dk/ui.js +995 -0
  85. package/dist/resources/da-dk/ui.js.map +1 -0
  86. package/dist/resources/de-de/common.d.ts +1964 -0
  87. package/dist/resources/de-de/common.d.ts.map +1 -0
  88. package/dist/resources/de-de/common.js +1963 -0
  89. package/dist/resources/de-de/common.js.map +1 -0
  90. package/dist/resources/de-de/errors.d.ts +45 -0
  91. package/dist/resources/de-de/errors.d.ts.map +1 -0
  92. package/dist/resources/de-de/errors.js +44 -0
  93. package/dist/resources/de-de/errors.js.map +1 -0
  94. package/dist/resources/de-de/generated.d.ts +20 -0
  95. package/dist/resources/de-de/generated.d.ts.map +1 -0
  96. package/dist/resources/de-de/generated.js +19 -0
  97. package/dist/resources/de-de/generated.js.map +1 -0
  98. package/dist/resources/de-de/studio.d.ts +18 -0
  99. package/dist/resources/de-de/studio.d.ts.map +1 -0
  100. package/dist/resources/de-de/studio.js +17 -0
  101. package/dist/resources/de-de/studio.js.map +1 -0
  102. package/dist/resources/de-de/ui.d.ts +996 -0
  103. package/dist/resources/de-de/ui.d.ts.map +1 -0
  104. package/dist/resources/de-de/ui.js +995 -0
  105. package/dist/resources/de-de/ui.js.map +1 -0
  106. package/dist/resources/en-us/common.d.ts +1964 -0
  107. package/dist/resources/en-us/common.d.ts.map +1 -0
  108. package/dist/resources/en-us/common.js +1963 -0
  109. package/dist/resources/en-us/common.js.map +1 -0
  110. package/dist/resources/en-us/errors.d.ts +45 -0
  111. package/dist/resources/en-us/errors.d.ts.map +1 -0
  112. package/dist/resources/en-us/errors.js +44 -0
  113. package/dist/resources/en-us/errors.js.map +1 -0
  114. package/dist/resources/en-us/generated.d.ts +20 -0
  115. package/dist/resources/en-us/generated.d.ts.map +1 -0
  116. package/dist/resources/en-us/generated.js +19 -0
  117. package/dist/resources/en-us/generated.js.map +1 -0
  118. package/dist/resources/en-us/studio.d.ts +18 -0
  119. package/dist/resources/en-us/studio.d.ts.map +1 -0
  120. package/dist/resources/en-us/studio.js +17 -0
  121. package/dist/resources/en-us/studio.js.map +1 -0
  122. package/dist/resources/en-us/ui.d.ts +996 -0
  123. package/dist/resources/en-us/ui.d.ts.map +1 -0
  124. package/dist/resources/en-us/ui.js +995 -0
  125. package/dist/resources/en-us/ui.js.map +1 -0
  126. package/dist/resources/fr-fr/common.d.ts +1964 -0
  127. package/dist/resources/fr-fr/common.d.ts.map +1 -0
  128. package/dist/resources/fr-fr/common.js +1963 -0
  129. package/dist/resources/fr-fr/common.js.map +1 -0
  130. package/dist/resources/fr-fr/errors.d.ts +45 -0
  131. package/dist/resources/fr-fr/errors.d.ts.map +1 -0
  132. package/dist/resources/fr-fr/errors.js +44 -0
  133. package/dist/resources/fr-fr/errors.js.map +1 -0
  134. package/dist/resources/fr-fr/generated.d.ts +20 -0
  135. package/dist/resources/fr-fr/generated.d.ts.map +1 -0
  136. package/dist/resources/fr-fr/generated.js +19 -0
  137. package/dist/resources/fr-fr/generated.js.map +1 -0
  138. package/dist/resources/fr-fr/studio.d.ts +18 -0
  139. package/dist/resources/fr-fr/studio.d.ts.map +1 -0
  140. package/dist/resources/fr-fr/studio.js +17 -0
  141. package/dist/resources/fr-fr/studio.js.map +1 -0
  142. package/dist/resources/fr-fr/ui.d.ts +996 -0
  143. package/dist/resources/fr-fr/ui.d.ts.map +1 -0
  144. package/dist/resources/fr-fr/ui.js +995 -0
  145. package/dist/resources/fr-fr/ui.js.map +1 -0
  146. package/dist/resources/index.d.ts +8 -0
  147. package/dist/resources/index.d.ts.map +1 -0
  148. package/dist/resources/index.js +21 -0
  149. package/dist/resources/index.js.map +1 -0
  150. package/dist/resources/lazy.d.ts +20 -0
  151. package/dist/resources/lazy.d.ts.map +1 -0
  152. package/dist/resources/lazy.js +49 -0
  153. package/dist/resources/lazy.js.map +1 -0
  154. package/dist/resources/zh-cn/common.d.ts +1964 -0
  155. package/dist/resources/zh-cn/common.d.ts.map +1 -0
  156. package/dist/resources/zh-cn/common.js +1963 -0
  157. package/dist/resources/zh-cn/common.js.map +1 -0
  158. package/dist/resources/zh-cn/errors.d.ts +45 -0
  159. package/dist/resources/zh-cn/errors.d.ts.map +1 -0
  160. package/dist/resources/zh-cn/errors.js +44 -0
  161. package/dist/resources/zh-cn/errors.js.map +1 -0
  162. package/dist/resources/zh-cn/generated.d.ts +20 -0
  163. package/dist/resources/zh-cn/generated.d.ts.map +1 -0
  164. package/dist/resources/zh-cn/generated.js +19 -0
  165. package/dist/resources/zh-cn/generated.js.map +1 -0
  166. package/dist/resources/zh-cn/studio.d.ts +18 -0
  167. package/dist/resources/zh-cn/studio.d.ts.map +1 -0
  168. package/dist/resources/zh-cn/studio.js +17 -0
  169. package/dist/resources/zh-cn/studio.js.map +1 -0
  170. package/dist/resources/zh-cn/ui.d.ts +996 -0
  171. package/dist/resources/zh-cn/ui.d.ts.map +1 -0
  172. package/dist/resources/zh-cn/ui.js +995 -0
  173. package/dist/resources/zh-cn/ui.js.map +1 -0
  174. package/dist/resources/zh-tw/common.d.ts +1964 -0
  175. package/dist/resources/zh-tw/common.d.ts.map +1 -0
  176. package/dist/resources/zh-tw/common.js +1963 -0
  177. package/dist/resources/zh-tw/common.js.map +1 -0
  178. package/dist/resources/zh-tw/errors.d.ts +45 -0
  179. package/dist/resources/zh-tw/errors.d.ts.map +1 -0
  180. package/dist/resources/zh-tw/errors.js +44 -0
  181. package/dist/resources/zh-tw/errors.js.map +1 -0
  182. package/dist/resources/zh-tw/generated.d.ts +20 -0
  183. package/dist/resources/zh-tw/generated.d.ts.map +1 -0
  184. package/dist/resources/zh-tw/generated.js +19 -0
  185. package/dist/resources/zh-tw/generated.js.map +1 -0
  186. package/dist/resources/zh-tw/studio.d.ts +18 -0
  187. package/dist/resources/zh-tw/studio.d.ts.map +1 -0
  188. package/dist/resources/zh-tw/studio.js +17 -0
  189. package/dist/resources/zh-tw/studio.js.map +1 -0
  190. package/dist/resources/zh-tw/ui.d.ts +996 -0
  191. package/dist/resources/zh-tw/ui.d.ts.map +1 -0
  192. package/dist/resources/zh-tw/ui.js +995 -0
  193. package/dist/resources/zh-tw/ui.js.map +1 -0
  194. package/locales/ar-EG/common.json +1954 -0
  195. package/locales/ar-EG/errors.json +35 -0
  196. package/locales/ar-EG/generated.json +10 -0
  197. package/locales/ar-EG/studio.json +8 -0
  198. package/locales/ar-EG/ui.json +986 -0
  199. package/locales/cs-CZ/common.json +1954 -0
  200. package/locales/cs-CZ/errors.json +35 -0
  201. package/locales/cs-CZ/generated.json +10 -0
  202. package/locales/cs-CZ/studio.json +8 -0
  203. package/locales/cs-CZ/ui.json +986 -0
  204. package/locales/da-DK/common.json +1954 -0
  205. package/locales/da-DK/errors.json +35 -0
  206. package/locales/da-DK/generated.json +10 -0
  207. package/locales/da-DK/studio.json +8 -0
  208. package/locales/da-DK/ui.json +986 -0
  209. package/locales/de-DE/common.json +1954 -0
  210. package/locales/de-DE/errors.json +35 -0
  211. package/locales/de-DE/generated.json +10 -0
  212. package/locales/de-DE/studio.json +8 -0
  213. package/locales/de-DE/ui.json +986 -0
  214. package/locales/en-US/common.json +1954 -0
  215. package/locales/en-US/errors.json +35 -0
  216. package/locales/en-US/generated.json +10 -0
  217. package/locales/en-US/studio.json +8 -0
  218. package/locales/en-US/ui.json +986 -0
  219. package/locales/fr-FR/common.json +1954 -0
  220. package/locales/fr-FR/errors.json +35 -0
  221. package/locales/fr-FR/generated.json +10 -0
  222. package/locales/fr-FR/studio.json +8 -0
  223. package/locales/fr-FR/ui.json +986 -0
  224. package/locales/zh-CN/common.json +1954 -0
  225. package/locales/zh-CN/errors.json +35 -0
  226. package/locales/zh-CN/generated.json +10 -0
  227. package/locales/zh-CN/studio.json +8 -0
  228. package/locales/zh-CN/ui.json +986 -0
  229. package/locales/zh-TW/common.json +1954 -0
  230. package/locales/zh-TW/errors.json +35 -0
  231. package/locales/zh-TW/generated.json +10 -0
  232. package/locales/zh-TW/studio.json +8 -0
  233. package/locales/zh-TW/ui.json +986 -0
  234. package/package.json +51 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Canonical locale registry (workplan/10-i18n-theming.md §2.1) — the single
3
+ * source of truth for the 8 BRIEF locales. Canonical ids use the underscore
4
+ * form (`en_US`); BCP-47 tags are derived for everything `Intl`- and
5
+ * i18next-facing. `dir` is derived from the locale, never independently
6
+ * settable (02-design-system.md §4.2) — adding a future RTL locale (he_IL,
7
+ * fa_IR) is a registry data change, not a code change.
8
+ */
9
+ export interface LocaleEntry {
10
+ /** Canonical underscore id stored in `adminium_settings`/`adminium_user_prefs`. */
11
+ id: string;
12
+ /** BCP-47 tag for `Intl.*`, i18next, and the `lang` attribute. */
13
+ tag: string;
14
+ /** English exonym for admin surfaces. */
15
+ english: string;
16
+ /** Native endonym — locale pickers always show this (§7.3). */
17
+ native: string;
18
+ dir: 'ltr' | 'rtl';
19
+ /**
20
+ * Body font-stack hint per `@adminium/tokens` fonts.css (02-design-system.md
21
+ * §2.4): `latin` → Manrope, `arabic` → IBM Plex Sans Arabic (Manrope
22
+ * fallback for Latin glyphs), `cjk` → Manrope + platform CJK fallbacks.
23
+ * JetBrains Mono stays the mono face everywhere (§5.1).
24
+ */
25
+ fontHint: 'latin' | 'arabic' | 'cjk';
26
+ }
27
+ export declare const LOCALES: readonly [{
28
+ readonly id: "en_US";
29
+ readonly tag: "en-US";
30
+ readonly english: "English (US)";
31
+ readonly native: "English (US)";
32
+ readonly dir: "ltr";
33
+ readonly fontHint: "latin";
34
+ }, {
35
+ readonly id: "de_DE";
36
+ readonly tag: "de-DE";
37
+ readonly english: "German";
38
+ readonly native: "Deutsch";
39
+ readonly dir: "ltr";
40
+ readonly fontHint: "latin";
41
+ }, {
42
+ readonly id: "fr_FR";
43
+ readonly tag: "fr-FR";
44
+ readonly english: "French";
45
+ readonly native: "Français";
46
+ readonly dir: "ltr";
47
+ readonly fontHint: "latin";
48
+ }, {
49
+ readonly id: "cs_CZ";
50
+ readonly tag: "cs-CZ";
51
+ readonly english: "Czech";
52
+ readonly native: "Čeština";
53
+ readonly dir: "ltr";
54
+ readonly fontHint: "latin";
55
+ }, {
56
+ readonly id: "da_DK";
57
+ readonly tag: "da-DK";
58
+ readonly english: "Danish";
59
+ readonly native: "Dansk";
60
+ readonly dir: "ltr";
61
+ readonly fontHint: "latin";
62
+ }, {
63
+ readonly id: "zh_CN";
64
+ readonly tag: "zh-CN";
65
+ readonly english: "Chinese (Simplified)";
66
+ readonly native: "简体中文";
67
+ readonly dir: "ltr";
68
+ readonly fontHint: "cjk";
69
+ }, {
70
+ readonly id: "zh_TW";
71
+ readonly tag: "zh-TW";
72
+ readonly english: "Chinese (Traditional)";
73
+ readonly native: "繁體中文";
74
+ readonly dir: "ltr";
75
+ readonly fontHint: "cjk";
76
+ }, {
77
+ readonly id: "ar_EG";
78
+ readonly tag: "ar-EG";
79
+ readonly english: "Arabic (Egypt)";
80
+ readonly native: "العربية (مصر)";
81
+ readonly dir: "rtl";
82
+ readonly fontHint: "arabic";
83
+ }];
84
+ export type LocaleId = (typeof LOCALES)[number]['id'];
85
+ export declare const LOCALE_IDS: readonly LocaleId[];
86
+ export declare function isLocaleId(value: unknown): value is LocaleId;
87
+ export declare function localeEntry(id: LocaleId): LocaleEntry;
88
+ /** `'rtl'` iff the registry says so (`ar_EG` today) — data-driven, not hardcoded. */
89
+ export declare function dirForLocale(id: LocaleId): 'ltr' | 'rtl';
90
+ export declare function isRtlLocale(id: LocaleId): boolean;
91
+ /** `ar_EG` → `ar-EG` for `Intl.*`, i18next, and the `lang` attribute. */
92
+ export declare function tagForLocale(id: LocaleId): string;
93
+ /**
94
+ * Best-effort inverse of {@link tagForLocale}: exact tag match, then a
95
+ * language-only match (`de` → `de_DE`), else `en_US`. Used to map
96
+ * `i18next.language` / `navigator.language` back to a canonical id.
97
+ */
98
+ export declare function localeFromTag(tag: string): LocaleId;
99
+ //# sourceMappingURL=locales.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,mFAAmF;IACnF,EAAE,EAAE,MAAM,CAAC;IACX,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACtC;AAED,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASuB,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAEtD,eAAO,MAAM,UAAU,EAA0C,SAAS,QAAQ,EAAE,CAAC;AAKrF,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,WAAW,CAIrD;AAED,qFAAqF;AACrF,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,CAExD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAEjD;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAMnD"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Canonical locale registry (workplan/10-i18n-theming.md §2.1) — the single
3
+ * source of truth for the 8 BRIEF locales. Canonical ids use the underscore
4
+ * form (`en_US`); BCP-47 tags are derived for everything `Intl`- and
5
+ * i18next-facing. `dir` is derived from the locale, never independently
6
+ * settable (02-design-system.md §4.2) — adding a future RTL locale (he_IL,
7
+ * fa_IR) is a registry data change, not a code change.
8
+ */
9
+ export const LOCALES = [
10
+ { id: 'en_US', tag: 'en-US', english: 'English (US)', native: 'English (US)', dir: 'ltr', fontHint: 'latin' },
11
+ { id: 'de_DE', tag: 'de-DE', english: 'German', native: 'Deutsch', dir: 'ltr', fontHint: 'latin' },
12
+ { id: 'fr_FR', tag: 'fr-FR', english: 'French', native: 'Français', dir: 'ltr', fontHint: 'latin' },
13
+ { id: 'cs_CZ', tag: 'cs-CZ', english: 'Czech', native: 'Čeština', dir: 'ltr', fontHint: 'latin' },
14
+ { id: 'da_DK', tag: 'da-DK', english: 'Danish', native: 'Dansk', dir: 'ltr', fontHint: 'latin' },
15
+ { id: 'zh_CN', tag: 'zh-CN', english: 'Chinese (Simplified)', native: '简体中文', dir: 'ltr', fontHint: 'cjk' },
16
+ { id: 'zh_TW', tag: 'zh-TW', english: 'Chinese (Traditional)', native: '繁體中文', dir: 'ltr', fontHint: 'cjk' },
17
+ { id: 'ar_EG', tag: 'ar-EG', english: 'Arabic (Egypt)', native: 'العربية (مصر)', dir: 'rtl', fontHint: 'arabic' },
18
+ ];
19
+ export const LOCALE_IDS = LOCALES.map((l) => l.id);
20
+ const BY_ID = new Map(LOCALES.map((l) => [l.id, l]));
21
+ const BY_TAG = new Map(LOCALES.map((l) => [l.tag, l]));
22
+ export function isLocaleId(value) {
23
+ return typeof value === 'string' && BY_ID.has(value);
24
+ }
25
+ export function localeEntry(id) {
26
+ const entry = BY_ID.get(id);
27
+ if (entry === undefined)
28
+ throw new Error(`unknown locale id: ${JSON.stringify(id)}`);
29
+ return entry;
30
+ }
31
+ /** `'rtl'` iff the registry says so (`ar_EG` today) — data-driven, not hardcoded. */
32
+ export function dirForLocale(id) {
33
+ return localeEntry(id).dir;
34
+ }
35
+ export function isRtlLocale(id) {
36
+ return dirForLocale(id) === 'rtl';
37
+ }
38
+ /** `ar_EG` → `ar-EG` for `Intl.*`, i18next, and the `lang` attribute. */
39
+ export function tagForLocale(id) {
40
+ return localeEntry(id).tag;
41
+ }
42
+ /**
43
+ * Best-effort inverse of {@link tagForLocale}: exact tag match, then a
44
+ * language-only match (`de` → `de_DE`), else `en_US`. Used to map
45
+ * `i18next.language` / `navigator.language` back to a canonical id.
46
+ */
47
+ export function localeFromTag(tag) {
48
+ const exact = BY_TAG.get(tag);
49
+ if (exact !== undefined)
50
+ return exact.id;
51
+ const lang = tag.toLowerCase().split('-')[0] ?? '';
52
+ const byLang = LOCALES.find((l) => l.tag.toLowerCase().startsWith(`${lang}-`) || l.tag.toLowerCase() === lang);
53
+ return byLang?.id ?? 'en_US';
54
+ }
55
+ //# sourceMappingURL=locales.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locales.js","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { I18nInstance } from './create-i18n.js';
3
+ import { type Formatters } from './format/index.js';
4
+ import { type LocaleId } from './locales.js';
5
+ export interface I18nContextValue {
6
+ i18n: I18nInstance;
7
+ locale: LocaleId;
8
+ }
9
+ export interface I18nProviderProps {
10
+ i18n: I18nInstance;
11
+ children: ReactNode;
12
+ }
13
+ export declare function I18nProvider({ i18n, children }: I18nProviderProps): ReactNode;
14
+ /** The shared i18next instance (advanced use — prefer `useT`). */
15
+ export declare function useI18n(): I18nInstance;
16
+ /** Active canonical locale id, live across `changeLanguage`. */
17
+ export declare function useLocale(): LocaleId;
18
+ /** `true` iff the active locale reads right-to-left (10 §5). */
19
+ export declare function useRtl(): boolean;
20
+ /** Translator bound to the provider instance: `t(key, fallback, args?)`. */
21
+ export declare function useT(): (key: string, fallback: string, args?: Record<string, unknown>) => string;
22
+ /** Locale-bound Intl formatters (10 §4.1) — `useFmt().number(…)` etc. */
23
+ export declare function useFmt(): Formatters;
24
+ /** Alias per the M8 assignment naming. */
25
+ export declare const useFormatters: typeof useFmt;
26
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAA4C,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEvF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAID,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB,GAAG,SAAS,CAgB7E;AAQD,kEAAkE;AAClE,wBAAgB,OAAO,IAAI,YAAY,CAEtC;AAED,gEAAgE;AAChE,wBAAgB,SAAS,IAAI,QAAQ,CAEpC;AAED,gEAAgE;AAChE,wBAAgB,MAAM,IAAI,OAAO,CAEhC;AAED,4EAA4E;AAC5E,wBAAgB,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAShG;AAED,yEAAyE;AACzE,wBAAgB,MAAM,IAAI,UAAU,CAGnC;AAED,0CAA0C;AAC1C,eAAO,MAAM,aAAa,eAAS,CAAC"}
package/dist/react.js ADDED
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * React bindings for `@adminium/i18n` (separate entry so the framework-free
4
+ * core — server emails, jobs, CLI — never pulls React in; §2.2). Deliberately
5
+ * thin: an `I18nProvider` that re-renders its subtree on `languageChanged`
6
+ * plus hooks bound to the active locale. The `t()` call signature matches the
7
+ * dashboard's key+fallback convention.
8
+ */
9
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';
10
+ import { getFormatters } from './format/index.js';
11
+ import { isRtlLocale, localeFromTag, tagForLocale } from './locales.js';
12
+ const I18nContext = createContext(null);
13
+ export function I18nProvider({ i18n, children }) {
14
+ const [locale, setLocale] = useState(() => localeFromTag(i18n.language ?? 'en-US'));
15
+ useEffect(() => {
16
+ setLocale(localeFromTag(i18n.language ?? 'en-US'));
17
+ const onChanged = (lng) => {
18
+ setLocale(localeFromTag(lng));
19
+ };
20
+ i18n.on('languageChanged', onChanged);
21
+ return () => {
22
+ i18n.off('languageChanged', onChanged);
23
+ };
24
+ }, [i18n]);
25
+ const value = useMemo(() => ({ i18n, locale }), [i18n, locale]);
26
+ return _jsx(I18nContext.Provider, { value: value, children: children });
27
+ }
28
+ function useI18nContext(hook) {
29
+ const context = useContext(I18nContext);
30
+ if (context === null)
31
+ throw new Error(`${hook} must be used inside <I18nProvider>`);
32
+ return context;
33
+ }
34
+ /** The shared i18next instance (advanced use — prefer `useT`). */
35
+ export function useI18n() {
36
+ return useI18nContext('useI18n()').i18n;
37
+ }
38
+ /** Active canonical locale id, live across `changeLanguage`. */
39
+ export function useLocale() {
40
+ return useI18nContext('useLocale()').locale;
41
+ }
42
+ /** `true` iff the active locale reads right-to-left (10 §5). */
43
+ export function useRtl() {
44
+ return isRtlLocale(useI18nContext('useRtl()').locale);
45
+ }
46
+ /** Translator bound to the provider instance: `t(key, fallback, args?)`. */
47
+ export function useT() {
48
+ const { i18n, locale } = useI18nContext('useT()');
49
+ return useCallback((key, fallback, args) => i18n.t(key, { defaultValue: fallback, ...args }),
50
+ // `locale` is a dependency on purpose: a language switch re-binds the
51
+ // callback so memoized consumers re-render with fresh strings.
52
+ [i18n, locale]);
53
+ }
54
+ /** Locale-bound Intl formatters (10 §4.1) — `useFmt().number(…)` etc. */
55
+ export function useFmt() {
56
+ const { locale } = useI18nContext('useFmt()');
57
+ return getFormatters(tagForLocale(locale));
58
+ }
59
+ /** Alias per the M8 assignment naming. */
60
+ export const useFormatters = useFmt;
61
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAI7F,OAAO,EAAE,aAAa,EAAmB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,cAAc,CAAC;AAOvF,MAAM,WAAW,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;AAOjE,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAqB;IAChE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAW,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;IAE9F,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAQ,EAAE;YACtC,SAAS,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,OAAO,CAAmB,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,OAAO,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAAG,QAAQ,GAAwB,CAAC;AAC/E,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,qCAAqC,CAAC,CAAC;IACpF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,SAAS;IACvB,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC;AAC9C,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,MAAM;IACpB,OAAO,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,IAAI;IAClB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,WAAW,CAChB,CAAC,GAAW,EAAE,QAAgB,EAAE,IAA8B,EAAE,EAAE,CAChE,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;IAClD,sEAAsE;IACtE,+DAA+D;IAC/D,CAAC,IAAI,EAAE,MAAM,CAAC,CACf,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,MAAM;IACpB,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC9C,OAAO,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC"}