@workos-inc/widgets-i18n 0.1.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.
Files changed (110) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +219 -0
  4. package/dist/cjs/index.cjs +38 -0
  5. package/dist/cjs/index.cjs.map +1 -0
  6. package/dist/cjs/index.d.cts +4 -0
  7. package/dist/cjs/lib/dictionaries.cjs +178 -0
  8. package/dist/cjs/lib/dictionaries.cjs.map +1 -0
  9. package/dist/cjs/lib/dictionaries.d.cts +24924 -0
  10. package/dist/cjs/lib/locale-provider.cjs +92 -0
  11. package/dist/cjs/lib/locale-provider.cjs.map +1 -0
  12. package/dist/cjs/lib/locale-provider.d.cts +12 -0
  13. package/dist/cjs/lib/types/react.d.cjs +3 -0
  14. package/dist/cjs/lib/types/react.d.cjs.map +1 -0
  15. package/dist/cjs/lib/types/react.d.d.cts +5 -0
  16. package/dist/esm/index.d.ts +4 -0
  17. package/dist/esm/index.js +15 -0
  18. package/dist/esm/index.js.map +1 -0
  19. package/dist/esm/lib/dictionaries.d.ts +24924 -0
  20. package/dist/esm/lib/dictionaries.js +140 -0
  21. package/dist/esm/lib/dictionaries.js.map +1 -0
  22. package/dist/esm/lib/locale-provider.d.ts +12 -0
  23. package/dist/esm/lib/locale-provider.js +64 -0
  24. package/dist/esm/lib/locale-provider.js.map +1 -0
  25. package/dist/esm/lib/types/react.d.d.ts +5 -0
  26. package/dist/esm/lib/types/react.d.js +2 -0
  27. package/dist/esm/lib/types/react.d.js.map +1 -0
  28. package/dist/lang/translations/af.json +281 -0
  29. package/dist/lang/translations/am.json +281 -0
  30. package/dist/lang/translations/ar.json +281 -0
  31. package/dist/lang/translations/bg.json +281 -0
  32. package/dist/lang/translations/bn.json +281 -0
  33. package/dist/lang/translations/bs.json +281 -0
  34. package/dist/lang/translations/ca.json +281 -0
  35. package/dist/lang/translations/cs.json +281 -0
  36. package/dist/lang/translations/da.json +281 -0
  37. package/dist/lang/translations/de.json +284 -0
  38. package/dist/lang/translations/el.json +281 -0
  39. package/dist/lang/translations/en-AU.json +281 -0
  40. package/dist/lang/translations/en-CA.json +281 -0
  41. package/dist/lang/translations/en-GB.json +281 -0
  42. package/dist/lang/translations/en-US.json +280 -0
  43. package/dist/lang/translations/es-419.json +281 -0
  44. package/dist/lang/translations/es-US.json +281 -0
  45. package/dist/lang/translations/es.json +281 -0
  46. package/dist/lang/translations/et.json +281 -0
  47. package/dist/lang/translations/fa.json +281 -0
  48. package/dist/lang/translations/fi.json +281 -0
  49. package/dist/lang/translations/fil.json +281 -0
  50. package/dist/lang/translations/fr-BE.json +281 -0
  51. package/dist/lang/translations/fr-CA.json +281 -0
  52. package/dist/lang/translations/fr.json +281 -0
  53. package/dist/lang/translations/fy.json +281 -0
  54. package/dist/lang/translations/gl.json +281 -0
  55. package/dist/lang/translations/gu.json +281 -0
  56. package/dist/lang/translations/ha.json +281 -0
  57. package/dist/lang/translations/he.json +281 -0
  58. package/dist/lang/translations/hi.json +281 -0
  59. package/dist/lang/translations/hr.json +281 -0
  60. package/dist/lang/translations/hu.json +281 -0
  61. package/dist/lang/translations/hy.json +281 -0
  62. package/dist/lang/translations/id.json +281 -0
  63. package/dist/lang/translations/is.json +281 -0
  64. package/dist/lang/translations/it.json +281 -0
  65. package/dist/lang/translations/ja.json +281 -0
  66. package/dist/lang/translations/jv.json +281 -0
  67. package/dist/lang/translations/ka.json +281 -0
  68. package/dist/lang/translations/kk.json +281 -0
  69. package/dist/lang/translations/km.json +281 -0
  70. package/dist/lang/translations/kn.json +281 -0
  71. package/dist/lang/translations/ko.json +281 -0
  72. package/dist/lang/translations/lt.json +280 -0
  73. package/dist/lang/translations/lv.json +281 -0
  74. package/dist/lang/translations/mk.json +281 -0
  75. package/dist/lang/translations/ml.json +281 -0
  76. package/dist/lang/translations/mn.json +281 -0
  77. package/dist/lang/translations/mr.json +281 -0
  78. package/dist/lang/translations/ms.json +281 -0
  79. package/dist/lang/translations/my.json +281 -0
  80. package/dist/lang/translations/nb.json +281 -0
  81. package/dist/lang/translations/ne.json +281 -0
  82. package/dist/lang/translations/nl-BE.json +281 -0
  83. package/dist/lang/translations/nl.json +281 -0
  84. package/dist/lang/translations/nn.json +281 -0
  85. package/dist/lang/translations/no.json +281 -0
  86. package/dist/lang/translations/pa.json +281 -0
  87. package/dist/lang/translations/pl.json +281 -0
  88. package/dist/lang/translations/pt-BR.json +281 -0
  89. package/dist/lang/translations/pt.json +281 -0
  90. package/dist/lang/translations/ro.json +281 -0
  91. package/dist/lang/translations/ru.json +281 -0
  92. package/dist/lang/translations/sk.json +281 -0
  93. package/dist/lang/translations/sl.json +281 -0
  94. package/dist/lang/translations/sq.json +281 -0
  95. package/dist/lang/translations/sr.json +281 -0
  96. package/dist/lang/translations/sv.json +281 -0
  97. package/dist/lang/translations/sw.json +281 -0
  98. package/dist/lang/translations/ta.json +281 -0
  99. package/dist/lang/translations/te.json +281 -0
  100. package/dist/lang/translations/th.json +281 -0
  101. package/dist/lang/translations/tr.json +281 -0
  102. package/dist/lang/translations/uk.json +281 -0
  103. package/dist/lang/translations/ur.json +281 -0
  104. package/dist/lang/translations/uz.json +281 -0
  105. package/dist/lang/translations/vi.json +281 -0
  106. package/dist/lang/translations/zh-CN.json +280 -0
  107. package/dist/lang/translations/zh-HK.json +281 -0
  108. package/dist/lang/translations/zh-TW.json +281 -0
  109. package/dist/lang/translations/zu.json +281 -0
  110. package/package.json +63 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## [0.1.0] - Initial Release
4
+
5
+ > This is a pre-release. Breaking changes will be avoided if possible but may be introduced in 0.x releases.
6
+
7
+ See the [README](./README.md) for more information.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024 WorkOS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,219 @@
1
+ # WorkOS Widgets Internationalization
2
+
3
+ A package providing internationalization support for [WorkOS Widgets](https://workos.com/docs/widgets).
4
+
5
+ ## Features
6
+
7
+ - **90+ supported locales**: Comprehensive language support including regional variants (e.g., `en-US`, `en-GB`, `fr-CA`, `zh-CN`)
8
+ - **RTL support**: Automatic right-to-left text direction for Arabic (`ar`), Farsi (`fa`), Hebrew (`he`), and Urdu (`ur`)
9
+ - **Dynamic dictionary loading**: Locale dictionaries are lazily loaded to minimize initial bundle size
10
+
11
+ ## API
12
+
13
+ ### Components
14
+
15
+ - **`WorkOsLocaleProvider`**: React context provider that wraps your application to enable localization for WorkOS widgets
16
+
17
+ ### Functions
18
+
19
+ - **`getDictionary(locale)`**: Asynchronously loads the translation dictionary for a given locale
20
+ - **`isValidLocale(locale)`**: Type guard to check if a string is a valid locale code
21
+ - **`getDir(locale)`**: Returns `"ltr"` or `"rtl"` based on the locale's text direction
22
+ - **`getLocaleCodes()`**: Returns a `Set` of all supported locale codes
23
+
24
+ ### Constants & Types
25
+
26
+ - **`LocaleCode`**: TypeScript type representing supported locale codes
27
+ - **`WorkOsLocaleProviderProps`**: Props interface for the locale provider
28
+
29
+ ## Usage
30
+
31
+ Wrap your application with `WorkOsLocaleProvider` to enable localization:
32
+
33
+ ```tsx
34
+ import { WorkOsLocaleProvider } from "@workos-inc/widgets-i18n";
35
+
36
+ function App() {
37
+ return (
38
+ <WorkOsLocaleProvider locale="en-US">
39
+ {/* your app goes here */}
40
+ </WorkOsLocaleProvider>
41
+ );
42
+ }
43
+ ```
44
+
45
+ ### Server-Side Locale Detection
46
+
47
+ Detect the user's preferred locale from request headers:
48
+
49
+ ```tsx
50
+ // utils/locale.ts
51
+ import {
52
+ getDir,
53
+ getLocaleCodes,
54
+ isValidLocale,
55
+ type LocaleCode,
56
+ } from "@workos-inc/widgets-i18n";
57
+ import Negotiator from "negotiator";
58
+ import * as React from "react";
59
+
60
+ const DEFAULT_LOCALE = "en-US" satisfies LocaleCode;
61
+
62
+ /**
63
+ * For apps that support React Server Components, we recommend caching
64
+ * the results of this function using React.cache.
65
+ *
66
+ * @param acceptLanguage - The value of the accept language header from the request.
67
+ * Different frameworks will offer different ways to access this.
68
+ */
69
+ export const getLocale = React.cache(
70
+ async (acceptLanguage = DEFAULT_LOCALE): Promise<LocaleCode> => {
71
+ const negotiator = new Negotiator({
72
+ headers: { "accept-language": acceptLanguage },
73
+ });
74
+ const locale = negotiator.language(Array.from(getLocaleCodes()));
75
+ return isValidLocale(locale) ? locale : DEFAULT_LOCALE;
76
+ },
77
+ );
78
+
79
+ export function getLocaleDir(locale: LocaleCode) {
80
+ return getDir(locale);
81
+ }
82
+ ```
83
+
84
+ Apply localization at the root layout level:
85
+
86
+ ```tsx
87
+ import { WorkOsLocaleProvider } from "@workos-inc/widgets-i18n";
88
+ import { getLocale, getLocaleDir } from "~/utils/locale";
89
+ import { getRequest } from "your-favorite-framework";
90
+ import "@workos-inc/widgets/styles.css";
91
+
92
+ export default async function RootLayout({ children }) {
93
+ const request = getRequest();
94
+ const locale = await getLocale(request.headers.get("accept-language"));
95
+ const direction = getLocaleDir(locale);
96
+ return (
97
+ <WorkOsLocaleProvider locale={locale}>
98
+ <html dir={direction} lang={locale}>
99
+ <body>{children}</body>
100
+ </html>
101
+ </WorkOsLocaleProvider>
102
+ );
103
+ }
104
+ ```
105
+
106
+ ### Server-Side Dictionary Loading (React 19)
107
+
108
+ For React 19 applications, you can pre-load the dictionary on the server using `React.use()`:
109
+
110
+ ```tsx
111
+ import { getDictionary, WorkOsLocaleProvider } from "@workos-inc/widgets-i18n";
112
+ import * as React from "react";
113
+
114
+ function LocalizedApp({ locale, children }) {
115
+ const messages = React.use(getDictionary(locale));
116
+ return (
117
+ <React.Suspense fallback={<Loading />}>
118
+ <WorkOsLocaleProvider locale={locale} initialMessages={messages}>
119
+ {children}
120
+ </WorkOsLocaleProvider>
121
+ </React.Suspense>
122
+ );
123
+ }
124
+ ```
125
+
126
+ ## Supported locales
127
+
128
+ | Locale code | Language | Autonym |
129
+ | ----------- | ----------------------- | ----------------------- |
130
+ | `af` | Afrikaans | Afrikaans |
131
+ | `am` | Amharic | አማርኛ |
132
+ | `ar` | Arabic | العربية |
133
+ | `bg` | Bulgarian | Български |
134
+ | `bn` | Bengali (Bangla) | বাংলা |
135
+ | `bs` | Bosnian | Bosanski |
136
+ | `ca` | Catalan | Català |
137
+ | `cs` | Czech | Čeština |
138
+ | `da` | Danish | Dansk |
139
+ | `de` | German | Deutsch |
140
+ | `de-DE` | German (Germany) | Deutsch (Deutschland) |
141
+ | `el` | Greek | Ελληνικά |
142
+ | `en` | English | English |
143
+ | `en-AU` | English (Australia) | English (Australia) |
144
+ | `en-CA` | English (Canada) | English (Canada) |
145
+ | `en-GB` | English (UK) | English (UK) |
146
+ | `en-US` | English (US) | English (US) |
147
+ | `es` | Spanish | Español |
148
+ | `es-419` | Spanish (Latin America) | Español (Latinoamérica) |
149
+ | `es-ES` | Spanish (Spain) | Español (España) |
150
+ | `es-US` | Spanish (US) | Español (EE.UU.) |
151
+ | `et` | Estonian | Eesti |
152
+ | `fa` | Farsi (Persian) | فارسی |
153
+ | `fi` | Finnish | Suomi |
154
+ | `fil` | Filipino (Tagalog) | Filipino |
155
+ | `fr` | French | Français |
156
+ | `fr-BE` | French (Belgium) | Français (Belgique) |
157
+ | `fr-CA` | French (Canada) | Français (Canada) |
158
+ | `fr-FR` | French (France) | Français (France) |
159
+ | `fy` | Frisian | Frysk |
160
+ | `gl` | Galician | Galego |
161
+ | `gu` | Gujarati | ગુજરાતી |
162
+ | `ha` | Hausa | هَرْشٜن هَوْس |
163
+ | `he` | Hebrew | עברית |
164
+ | `hi` | Hindi | हिन्दी |
165
+ | `hr` | Croatian | Hrvatski |
166
+ | `hu` | Hungarian | Magyar |
167
+ | `hy` | Armenian | Հայերեն |
168
+ | `id` | Indonesian | Bahasa Indonesia |
169
+ | `is` | Icelandic | Íslenska |
170
+ | `it` | Italian | Italiano |
171
+ | `it-IT` | Italian (Italy) | Italiano (Italia) |
172
+ | `ja` | Japanese | 日本語 |
173
+ | `jv` | Javanese | ꦧꦱꦗꦮ |
174
+ | `ka` | Georgian | ქართული |
175
+ | `kk` | Kazakh | Қазақ тілі |
176
+ | `km` | Khmer | ខេមរភាសា |
177
+ | `kn` | Kannada | ಕನ್ನಡ |
178
+ | `ko` | Korean | 한국어 |
179
+ | `lt` | Lithuanian | Lietuvių |
180
+ | `lv` | Latvian | Latviešu |
181
+ | `mk` | Macedonian | Македонски |
182
+ | `ml` | Malayalam | മലയാളം |
183
+ | `mn` | Mongolian | Монгол |
184
+ | `mr` | Marathi | मराठी |
185
+ | `ms` | Malay | Bahasa Melayu |
186
+ | `my` | Burmese | မြန်မာ |
187
+ | `nb` | Norwegian Bokmål | Norsk Bokmål |
188
+ | `ne` | Nepali | नेपाली भाषा |
189
+ | `nl` | Dutch | Nederlands |
190
+ | `nl-BE` | Flemish | Vlaams |
191
+ | `nl-NL` | Dutch (Netherlands) | Nederlands (Nederland) |
192
+ | `nn` | Norwegian Nynorsk | Norsk Nynorsk |
193
+ | `no` | Norwegian | Norsk |
194
+ | `pa` | Punjabi | ਪੰਜਾਬੀ |
195
+ | `pl` | Polish | Polski |
196
+ | `pt` | Portuguese | Português |
197
+ | `pt-BR` | Portuguese (Brazil) | Português (Brasil) |
198
+ | `pt-PT` | Portuguese (Portugal) | Português (Portugal) |
199
+ | `ro` | Romanian | Română |
200
+ | `ru` | Russian | Русский |
201
+ | `sk` | Slovak | Slovenčina |
202
+ | `sl` | Slovenian | Slovenščina |
203
+ | `sq` | Albanian | Shqip |
204
+ | `sr` | Serbian | Српски |
205
+ | `sv` | Swedish | Svenska |
206
+ | `sw` | Swahili | Kiswahili |
207
+ | `ta` | Tamil | தமிழ் |
208
+ | `te` | Telugu | తెలుగు |
209
+ | `th` | Thai | ไทย |
210
+ | `tr` | Turkish | Türkçe |
211
+ | `uk` | Ukrainian | Українська |
212
+ | `ur` | Urdu | اُردُو |
213
+ | `uz` | Uzbek | Ózbekça |
214
+ | `vi` | Vietnamese | Tiếng Việt |
215
+ | `zh` | Chinese | 中文 |
216
+ | `zh-CN` | Chinese (Simplified) | 中文 (中国) |
217
+ | `zh-HK` | Chinese (Hong Kong) | 中文(香港) |
218
+ | `zh-TW` | Chinese (Taiwan) | 中文(台灣) |
219
+ | `zu` | Zulu | isiZulu |
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var index_exports = {};
20
+ __export(index_exports, {
21
+ WorkOsLocaleProvider: () => import_locale_provider.WorkOsLocaleProvider,
22
+ getDictionary: () => import_dictionaries.getDictionary,
23
+ getDir: () => import_dictionaries.getDir,
24
+ getLocaleCodes: () => import_dictionaries.getLocaleCodes,
25
+ isValidLocale: () => import_dictionaries.isValidLocale
26
+ });
27
+ module.exports = __toCommonJS(index_exports);
28
+ var import_dictionaries = require("./lib/dictionaries.js");
29
+ var import_locale_provider = require("./lib/locale-provider.js");
30
+ // Annotate the CommonJS export names for ESM import in node:
31
+ 0 && (module.exports = {
32
+ WorkOsLocaleProvider,
33
+ getDictionary,
34
+ getDir,
35
+ getLocaleCodes,
36
+ isValidLocale
37
+ });
38
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export {\n isValidLocale,\n getDictionary,\n getDir,\n getLocaleCodes,\n type LocaleCode,\n} from \"./lib/dictionaries.js\";\nexport { WorkOsLocaleProvider } from \"./lib/locale-provider.js\";\nexport type { WorkOsLocaleProviderProps } from \"./lib/locale-provider.js\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAMO;AACP,6BAAqC;","names":[]}
@@ -0,0 +1,4 @@
1
+ export { LocaleCode, getDictionary, getDir, getLocaleCodes, isValidLocale } from './lib/dictionaries.cjs';
2
+ export { WorkOsLocaleProvider, WorkOsLocaleProviderProps } from './lib/locale-provider.cjs';
3
+ import 'react/jsx-runtime';
4
+ import 'react';
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var dictionaries_exports = {};
30
+ __export(dictionaries_exports, {
31
+ DEFAULT_LOCALE: () => DEFAULT_LOCALE,
32
+ getDictionary: () => getDictionary,
33
+ getDir: () => getDir,
34
+ getLocaleCodes: () => getLocaleCodes,
35
+ isValidLocale: () => isValidLocale
36
+ });
37
+ module.exports = __toCommonJS(dictionaries_exports);
38
+ const DEFAULT_LOCALE = "en-US";
39
+ const enUS = Promise.resolve({});
40
+ const importMap = {
41
+ af: () => import("../../lang/translations/af.json"),
42
+ am: () => import("../../lang/translations/am.json"),
43
+ ar: () => import("../../lang/translations/ar.json"),
44
+ bg: () => import("../../lang/translations/bg.json"),
45
+ bn: () => import("../../lang/translations/bn.json"),
46
+ bs: () => import("../../lang/translations/bs.json"),
47
+ ca: () => import("../../lang/translations/ca.json"),
48
+ cs: () => import("../../lang/translations/cs.json"),
49
+ da: () => import("../../lang/translations/da.json"),
50
+ de: () => import("../../lang/translations/de.json"),
51
+ "de-DE": () => import("../../lang/translations/de.json"),
52
+ el: () => import("../../lang/translations/el.json"),
53
+ en: async () => ({ default: {} }),
54
+ "en-AU": () => import("../../lang/translations/en-AU.json"),
55
+ "en-CA": () => import("../../lang/translations/en-CA.json"),
56
+ "en-GB": () => import("../../lang/translations/en-GB.json"),
57
+ "en-US": async () => ({ default: {} }),
58
+ es: () => import("../../lang/translations/es.json"),
59
+ "es-419": () => import("../../lang/translations/es-419.json"),
60
+ "es-ES": () => import("../../lang/translations/es.json"),
61
+ "es-US": () => import("../../lang/translations/es-US.json"),
62
+ et: () => import("../../lang/translations/et.json"),
63
+ fa: () => import("../../lang/translations/fa.json"),
64
+ fi: () => import("../../lang/translations/fi.json"),
65
+ fil: () => import("../../lang/translations/fil.json"),
66
+ fr: () => import("../../lang/translations/fr.json"),
67
+ "fr-BE": () => import("../../lang/translations/fr-BE.json"),
68
+ "fr-CA": () => import("../../lang/translations/fr-CA.json"),
69
+ "fr-FR": () => import("../../lang/translations/fr.json"),
70
+ fy: () => import("../../lang/translations/fy.json"),
71
+ gl: () => import("../../lang/translations/gl.json"),
72
+ gu: () => import("../../lang/translations/gu.json"),
73
+ ha: () => import("../../lang/translations/ha.json"),
74
+ he: () => import("../../lang/translations/he.json"),
75
+ hi: () => import("../../lang/translations/hi.json"),
76
+ hr: () => import("../../lang/translations/hr.json"),
77
+ hu: () => import("../../lang/translations/hu.json"),
78
+ hy: () => import("../../lang/translations/hy.json"),
79
+ id: () => import("../../lang/translations/id.json"),
80
+ is: () => import("../../lang/translations/is.json"),
81
+ it: () => import("../../lang/translations/it.json"),
82
+ "it-IT": () => import("../../lang/translations/it.json"),
83
+ ja: () => import("../../lang/translations/ja.json"),
84
+ jv: () => import("../../lang/translations/jv.json"),
85
+ ka: () => import("../../lang/translations/ka.json"),
86
+ kk: () => import("../../lang/translations/kk.json"),
87
+ km: () => import("../../lang/translations/km.json"),
88
+ kn: () => import("../../lang/translations/kn.json"),
89
+ ko: () => import("../../lang/translations/ko.json"),
90
+ lt: () => import("../../lang/translations/lt.json"),
91
+ lv: () => import("../../lang/translations/lv.json"),
92
+ mk: () => import("../../lang/translations/mk.json"),
93
+ ml: () => import("../../lang/translations/ml.json"),
94
+ mn: () => import("../../lang/translations/mn.json"),
95
+ mr: () => import("../../lang/translations/mr.json"),
96
+ ms: () => import("../../lang/translations/ms.json"),
97
+ my: () => import("../../lang/translations/my.json"),
98
+ nb: () => import("../../lang/translations/nb.json"),
99
+ ne: () => import("../../lang/translations/ne.json"),
100
+ nl: () => import("../../lang/translations/nl.json"),
101
+ "nl-BE": () => import("../../lang/translations/nl-BE.json"),
102
+ "nl-NL": () => import("../../lang/translations/nl.json"),
103
+ nn: () => import("../../lang/translations/nn.json"),
104
+ no: () => import("../../lang/translations/no.json"),
105
+ pa: () => import("../../lang/translations/pa.json"),
106
+ pl: () => import("../../lang/translations/pl.json"),
107
+ pt: () => import("../../lang/translations/pt.json"),
108
+ "pt-BR": () => import("../../lang/translations/pt-BR.json"),
109
+ "pt-PT": () => import("../../lang/translations/pt.json"),
110
+ ro: () => import("../../lang/translations/ro.json"),
111
+ ru: () => import("../../lang/translations/ru.json"),
112
+ sk: () => import("../../lang/translations/sk.json"),
113
+ sl: () => import("../../lang/translations/sl.json"),
114
+ sq: () => import("../../lang/translations/sq.json"),
115
+ sr: () => import("../../lang/translations/sr.json"),
116
+ sv: () => import("../../lang/translations/sv.json"),
117
+ sw: () => import("../../lang/translations/sw.json"),
118
+ ta: () => import("../../lang/translations/ta.json"),
119
+ te: () => import("../../lang/translations/te.json"),
120
+ th: () => import("../../lang/translations/th.json"),
121
+ tr: () => import("../../lang/translations/tr.json"),
122
+ uk: () => import("../../lang/translations/uk.json"),
123
+ ur: () => import("../../lang/translations/ur.json"),
124
+ uz: () => import("../../lang/translations/uz.json"),
125
+ vi: () => import("../../lang/translations/vi.json"),
126
+ zh: () => import("../../lang/translations/zh-CN.json"),
127
+ "zh-CN": () => import("../../lang/translations/zh-CN.json"),
128
+ "zh-HK": () => import("../../lang/translations/zh-HK.json"),
129
+ "zh-TW": () => import("../../lang/translations/zh-TW.json"),
130
+ zu: () => import("../../lang/translations/zu.json")
131
+ };
132
+ let localeCodesCache;
133
+ function getLocaleCodes() {
134
+ if (localeCodesCache) {
135
+ return new Set(localeCodesCache);
136
+ }
137
+ localeCodesCache = new Set(Object.keys(importMap));
138
+ return localeCodesCache;
139
+ }
140
+ async function loadDictionary(localeCode) {
141
+ const asyncImport = importMap[localeCode];
142
+ if (!asyncImport) {
143
+ return enUS;
144
+ }
145
+ const dictionary = await asyncImport();
146
+ return dictionary.default || enUS;
147
+ }
148
+ const promiseCache = /* @__PURE__ */ new Map();
149
+ const isValidLocale = (locale) => typeof locale === "string" && (localeCodesCache || getLocaleCodes()).has(locale);
150
+ const RTL_LOCALES = /* @__PURE__ */ new Set(["ar", "fa", "he", "ur"]);
151
+ const getDir = (locale) => RTL_LOCALES.has(locale) ? "rtl" : "ltr";
152
+ function getDictionary(localeCode) {
153
+ if (!isValidLocale(localeCode)) {
154
+ console.warn(
155
+ `@workos-inc/widgets-i18n: locale ${localeCode} is invalid, falling back to ${DEFAULT_LOCALE}`
156
+ );
157
+ return enUS;
158
+ }
159
+ const cached = promiseCache.get(localeCode);
160
+ if (cached) {
161
+ return cached;
162
+ }
163
+ const promise = loadDictionary(localeCode);
164
+ promiseCache.set(localeCode, promise);
165
+ promise.catch(() => {
166
+ promiseCache.delete(localeCode);
167
+ });
168
+ return promise;
169
+ }
170
+ // Annotate the CommonJS export names for ESM import in node:
171
+ 0 && (module.exports = {
172
+ DEFAULT_LOCALE,
173
+ getDictionary,
174
+ getDir,
175
+ getLocaleCodes,
176
+ isValidLocale
177
+ });
178
+ //# sourceMappingURL=dictionaries.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/dictionaries.ts"],"sourcesContent":["export const DEFAULT_LOCALE = \"en-US\";\nconst enUS = Promise.resolve({});\n\nexport type Dictionary = Record<string, string>;\n\n// The import path must be a string literal (not a variable) so that webpack can\n// do static analysis and create individual bundles for each JSON file\nconst importMap = {\n af: () => import(\"../../lang/translations/af.json\"),\n am: () => import(\"../../lang/translations/am.json\"),\n ar: () => import(\"../../lang/translations/ar.json\"),\n bg: () => import(\"../../lang/translations/bg.json\"),\n bn: () => import(\"../../lang/translations/bn.json\"),\n bs: () => import(\"../../lang/translations/bs.json\"),\n ca: () => import(\"../../lang/translations/ca.json\"),\n cs: () => import(\"../../lang/translations/cs.json\"),\n da: () => import(\"../../lang/translations/da.json\"),\n de: () => import(\"../../lang/translations/de.json\"),\n \"de-DE\": () => import(\"../../lang/translations/de.json\"),\n el: () => import(\"../../lang/translations/el.json\"),\n en: async () => ({ default: {} }),\n \"en-AU\": () => import(\"../../lang/translations/en-AU.json\"),\n \"en-CA\": () => import(\"../../lang/translations/en-CA.json\"),\n \"en-GB\": () => import(\"../../lang/translations/en-GB.json\"),\n \"en-US\": async () => ({ default: {} }),\n es: () => import(\"../../lang/translations/es.json\"),\n \"es-419\": () => import(\"../../lang/translations/es-419.json\"),\n \"es-ES\": () => import(\"../../lang/translations/es.json\"),\n \"es-US\": () => import(\"../../lang/translations/es-US.json\"),\n et: () => import(\"../../lang/translations/et.json\"),\n fa: () => import(\"../../lang/translations/fa.json\"),\n fi: () => import(\"../../lang/translations/fi.json\"),\n fil: () => import(\"../../lang/translations/fil.json\"),\n fr: () => import(\"../../lang/translations/fr.json\"),\n \"fr-BE\": () => import(\"../../lang/translations/fr-BE.json\"),\n \"fr-CA\": () => import(\"../../lang/translations/fr-CA.json\"),\n \"fr-FR\": () => import(\"../../lang/translations/fr.json\"),\n fy: () => import(\"../../lang/translations/fy.json\"),\n gl: () => import(\"../../lang/translations/gl.json\"),\n gu: () => import(\"../../lang/translations/gu.json\"),\n ha: () => import(\"../../lang/translations/ha.json\"),\n he: () => import(\"../../lang/translations/he.json\"),\n hi: () => import(\"../../lang/translations/hi.json\"),\n hr: () => import(\"../../lang/translations/hr.json\"),\n hu: () => import(\"../../lang/translations/hu.json\"),\n hy: () => import(\"../../lang/translations/hy.json\"),\n id: () => import(\"../../lang/translations/id.json\"),\n is: () => import(\"../../lang/translations/is.json\"),\n it: () => import(\"../../lang/translations/it.json\"),\n \"it-IT\": () => import(\"../../lang/translations/it.json\"),\n ja: () => import(\"../../lang/translations/ja.json\"),\n jv: () => import(\"../../lang/translations/jv.json\"),\n ka: () => import(\"../../lang/translations/ka.json\"),\n kk: () => import(\"../../lang/translations/kk.json\"),\n km: () => import(\"../../lang/translations/km.json\"),\n kn: () => import(\"../../lang/translations/kn.json\"),\n ko: () => import(\"../../lang/translations/ko.json\"),\n lt: () => import(\"../../lang/translations/lt.json\"),\n lv: () => import(\"../../lang/translations/lv.json\"),\n mk: () => import(\"../../lang/translations/mk.json\"),\n ml: () => import(\"../../lang/translations/ml.json\"),\n mn: () => import(\"../../lang/translations/mn.json\"),\n mr: () => import(\"../../lang/translations/mr.json\"),\n ms: () => import(\"../../lang/translations/ms.json\"),\n my: () => import(\"../../lang/translations/my.json\"),\n nb: () => import(\"../../lang/translations/nb.json\"),\n ne: () => import(\"../../lang/translations/ne.json\"),\n nl: () => import(\"../../lang/translations/nl.json\"),\n \"nl-BE\": () => import(\"../../lang/translations/nl-BE.json\"),\n \"nl-NL\": () => import(\"../../lang/translations/nl.json\"),\n nn: () => import(\"../../lang/translations/nn.json\"),\n no: () => import(\"../../lang/translations/no.json\"),\n pa: () => import(\"../../lang/translations/pa.json\"),\n pl: () => import(\"../../lang/translations/pl.json\"),\n pt: () => import(\"../../lang/translations/pt.json\"),\n \"pt-BR\": () => import(\"../../lang/translations/pt-BR.json\"),\n \"pt-PT\": () => import(\"../../lang/translations/pt.json\"),\n ro: () => import(\"../../lang/translations/ro.json\"),\n ru: () => import(\"../../lang/translations/ru.json\"),\n sk: () => import(\"../../lang/translations/sk.json\"),\n sl: () => import(\"../../lang/translations/sl.json\"),\n sq: () => import(\"../../lang/translations/sq.json\"),\n sr: () => import(\"../../lang/translations/sr.json\"),\n sv: () => import(\"../../lang/translations/sv.json\"),\n sw: () => import(\"../../lang/translations/sw.json\"),\n ta: () => import(\"../../lang/translations/ta.json\"),\n te: () => import(\"../../lang/translations/te.json\"),\n th: () => import(\"../../lang/translations/th.json\"),\n tr: () => import(\"../../lang/translations/tr.json\"),\n uk: () => import(\"../../lang/translations/uk.json\"),\n ur: () => import(\"../../lang/translations/ur.json\"),\n uz: () => import(\"../../lang/translations/uz.json\"),\n vi: () => import(\"../../lang/translations/vi.json\"),\n zh: () => import(\"../../lang/translations/zh-CN.json\"),\n \"zh-CN\": () => import(\"../../lang/translations/zh-CN.json\"),\n \"zh-HK\": () => import(\"../../lang/translations/zh-HK.json\"),\n \"zh-TW\": () => import(\"../../lang/translations/zh-TW.json\"),\n zu: () => import(\"../../lang/translations/zu.json\"),\n} satisfies Record<string, () => Promise<{ default: Dictionary }>>;\n\nexport type LocaleCode = keyof typeof importMap;\n\nlet localeCodesCache: Set<LocaleCode> | undefined;\n\nexport function getLocaleCodes(): Set<LocaleCode> {\n if (localeCodesCache) {\n return new Set(localeCodesCache);\n }\n localeCodesCache = new Set(Object.keys(importMap) as LocaleCode[]);\n return localeCodesCache;\n}\n\nasync function loadDictionary(localeCode: LocaleCode): Promise<Dictionary> {\n const asyncImport = importMap[localeCode];\n if (!asyncImport) {\n return enUS;\n }\n\n const dictionary = await asyncImport();\n return dictionary.default || enUS;\n}\n\n// Cache for storing promises by locale code\n// This ensures React Suspense receives the same promise instance for the same locale\nconst promiseCache = new Map<LocaleCode, Promise<Dictionary>>();\n\nexport const isValidLocale = (locale: unknown): locale is LocaleCode =>\n typeof locale === \"string\" &&\n (localeCodesCache || getLocaleCodes()).has(locale as LocaleCode);\n\n// Arabic, Farsi (Persian), Hebrew, and Urdu are RTL\nconst RTL_LOCALES = new Set([\"ar\", \"fa\", \"he\", \"ur\"]);\nexport const getDir = (locale: LocaleCode): \"ltr\" | \"rtl\" =>\n RTL_LOCALES.has(locale) ? \"rtl\" : \"ltr\";\n\nexport function getDictionary(localeCode: string): Promise<Dictionary> {\n if (!isValidLocale(localeCode)) {\n // en-US is imported normally and used as a fallback\n console.warn(\n `@workos-inc/widgets-i18n: locale ${localeCode} is invalid, falling back to ${DEFAULT_LOCALE}`,\n );\n return enUS;\n }\n\n const cached = promiseCache.get(localeCode);\n if (cached) {\n return cached;\n }\n\n const promise = loadDictionary(localeCode);\n promiseCache.set(localeCode, promise);\n\n // If the promise fails, remove it from cache so it can be retried\n promise.catch(() => {\n promiseCache.delete(localeCode);\n });\n\n return promise;\n}\n"],"mappings":"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","names":[]}