@voyantjs/i18n 0.16.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 (85) hide show
  1. package/dist/admin/app-dmc.d.ts +22 -0
  2. package/dist/admin/app-dmc.d.ts.map +1 -0
  3. package/dist/admin/app-dmc.js +29 -0
  4. package/dist/admin/app-operator.d.ts +23 -0
  5. package/dist/admin/app-operator.d.ts.map +1 -0
  6. package/dist/admin/app-operator.js +17 -0
  7. package/dist/admin/auth.d.ts +247 -0
  8. package/dist/admin/auth.d.ts.map +1 -0
  9. package/dist/admin/auth.js +166 -0
  10. package/dist/admin/availability.d.ts +689 -0
  11. package/dist/admin/availability.d.ts.map +1 -0
  12. package/dist/admin/availability.js +686 -0
  13. package/dist/admin/bookings.d.ts +1067 -0
  14. package/dist/admin/bookings.d.ts.map +1 -0
  15. package/dist/admin/bookings.js +1064 -0
  16. package/dist/admin/chrome.d.ts +36 -0
  17. package/dist/admin/chrome.d.ts.map +1 -0
  18. package/dist/admin/chrome.js +24 -0
  19. package/dist/admin/contacts.d.ts +269 -0
  20. package/dist/admin/contacts.d.ts.map +1 -0
  21. package/dist/admin/contacts.js +266 -0
  22. package/dist/admin/core-dmc.d.ts +21 -0
  23. package/dist/admin/core-dmc.d.ts.map +1 -0
  24. package/dist/admin/core-dmc.js +14 -0
  25. package/dist/admin/core-operator.d.ts +117 -0
  26. package/dist/admin/core-operator.d.ts.map +1 -0
  27. package/dist/admin/core-operator.js +78 -0
  28. package/dist/admin/crm-operator.d.ts +579 -0
  29. package/dist/admin/crm-operator.d.ts.map +1 -0
  30. package/dist/admin/crm-operator.js +576 -0
  31. package/dist/admin/dashboard-operator.d.ts +83 -0
  32. package/dist/admin/dashboard-operator.d.ts.map +1 -0
  33. package/dist/admin/dashboard-operator.js +80 -0
  34. package/dist/admin/distribution-dmc.d.ts +1804 -0
  35. package/dist/admin/distribution-dmc.d.ts.map +1 -0
  36. package/dist/admin/distribution-dmc.js +1181 -0
  37. package/dist/admin/dmc-nav.d.ts +55 -0
  38. package/dist/admin/dmc-nav.d.ts.map +1 -0
  39. package/dist/admin/dmc-nav.js +38 -0
  40. package/dist/admin/finance.d.ts +377 -0
  41. package/dist/admin/finance.d.ts.map +1 -0
  42. package/dist/admin/finance.js +374 -0
  43. package/dist/admin/operator-nav.d.ts +76 -0
  44. package/dist/admin/operator-nav.d.ts.map +1 -0
  45. package/dist/admin/operator-nav.js +52 -0
  46. package/dist/admin/organizations.d.ts +87 -0
  47. package/dist/admin/organizations.d.ts.map +1 -0
  48. package/dist/admin/organizations.js +84 -0
  49. package/dist/admin/pricing-operator.d.ts +233 -0
  50. package/dist/admin/pricing-operator.d.ts.map +1 -0
  51. package/dist/admin/pricing-operator.js +230 -0
  52. package/dist/admin/products-dmc.d.ts +239 -0
  53. package/dist/admin/products-dmc.d.ts.map +1 -0
  54. package/dist/admin/products-dmc.js +236 -0
  55. package/dist/admin/products-operator.d.ts +999 -0
  56. package/dist/admin/products-operator.d.ts.map +1 -0
  57. package/dist/admin/products-operator.js +996 -0
  58. package/dist/admin/resources.d.ts +653 -0
  59. package/dist/admin/resources.d.ts.map +1 -0
  60. package/dist/admin/resources.js +650 -0
  61. package/dist/admin/settings-operator.d.ts +251 -0
  62. package/dist/admin/settings-operator.d.ts.map +1 -0
  63. package/dist/admin/settings-operator.js +248 -0
  64. package/dist/admin/suppliers-operator.d.ts +325 -0
  65. package/dist/admin/suppliers-operator.d.ts.map +1 -0
  66. package/dist/admin/suppliers-operator.js +322 -0
  67. package/dist/admin/suppliers.d.ts +259 -0
  68. package/dist/admin/suppliers.d.ts.map +1 -0
  69. package/dist/admin/suppliers.js +256 -0
  70. package/dist/admin/team.d.ts +102 -0
  71. package/dist/admin/team.d.ts.map +1 -0
  72. package/dist/admin/team.js +68 -0
  73. package/dist/index.d.ts +28 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +27 -0
  76. package/dist/package-formatters.d.ts +9 -0
  77. package/dist/package-formatters.d.ts.map +1 -0
  78. package/dist/package-formatters.js +56 -0
  79. package/dist/package-runtime.d.ts +39 -0
  80. package/dist/package-runtime.d.ts.map +1 -0
  81. package/dist/package-runtime.js +60 -0
  82. package/dist/runtime.d.ts +33 -0
  83. package/dist/runtime.d.ts.map +1 -0
  84. package/dist/runtime.js +120 -0
  85. package/package.json +48 -0
@@ -0,0 +1,68 @@
1
+ export const adminTeamMessages = {
2
+ en: {
3
+ team: {
4
+ title: "Team",
5
+ description: "Invite new staff members. Sign-up is disabled for the public - only invited people can join.",
6
+ pendingInvitations: "Pending invitations",
7
+ noOutstandingInvitations: "No outstanding invitations.",
8
+ invitationWaitingSingular: "{count} invitation waiting to be accepted.",
9
+ invitationWaitingPlural: "{count} invitations waiting to be accepted.",
10
+ nothingHereYet: "Nothing here yet.",
11
+ revoke: "Revoke",
12
+ revokeConfirm: "Revoke invitation for {email}?",
13
+ expires: "Expires {date}",
14
+ history: "History",
15
+ historyDescription: "Redeemed or expired invitations.",
16
+ redeemed: "Redeemed {date}",
17
+ expired: "Expired {date}",
18
+ inviteMember: "Invite member",
19
+ inviteDialogTitle: "Invite a team member",
20
+ inviteDialogDescription: "They'll receive an email with a link to set a password. The link expires in 72 hours.",
21
+ inviteCreated: "Invitation created for {email}.",
22
+ inviteEmailSentSuffix: "An email has been sent.",
23
+ inviteManualShareSuffix: "No email provider configured - share the link below manually.",
24
+ acceptLink: "Accept link",
25
+ copied: "Copied",
26
+ copy: "Copy",
27
+ done: "Done",
28
+ errorCouldNotSendInvitation: "Could not send invitation",
29
+ emailLabel: "Email",
30
+ emailPlaceholder: "teammate@example.com",
31
+ cancel: "Cancel",
32
+ sendInvitation: "Send invitation",
33
+ },
34
+ },
35
+ ro: {
36
+ team: {
37
+ title: "Echipa",
38
+ description: "Invita membri noi ai echipei. Inregistrarea publica este dezactivata - doar persoanele invitate se pot alatura.",
39
+ pendingInvitations: "Invitatii in asteptare",
40
+ noOutstandingInvitations: "Nu exista invitatii active.",
41
+ invitationWaitingSingular: "{count} invitatie asteapta sa fie acceptata.",
42
+ invitationWaitingPlural: "{count} invitatii asteapta sa fie acceptate.",
43
+ nothingHereYet: "Nu exista nimic aici momentan.",
44
+ revoke: "Revoca",
45
+ revokeConfirm: "Revoci invitatia pentru {email}?",
46
+ expires: "Expira la {date}",
47
+ history: "Istoric",
48
+ historyDescription: "Invitatii acceptate sau expirate.",
49
+ redeemed: "Acceptata la {date}",
50
+ expired: "Expirata la {date}",
51
+ inviteMember: "Invita membru",
52
+ inviteDialogTitle: "Invita un membru al echipei",
53
+ inviteDialogDescription: "Va primi un email cu un link pentru setarea parolei. Linkul expira in 72 de ore.",
54
+ inviteCreated: "Invitatia a fost creata pentru {email}.",
55
+ inviteEmailSentSuffix: "A fost trimis un email.",
56
+ inviteManualShareSuffix: "Nu exista un provider de email configurat - distribuie manual linkul de mai jos.",
57
+ acceptLink: "Link de acceptare",
58
+ copied: "Copiat",
59
+ copy: "Copiaza",
60
+ done: "Gata",
61
+ errorCouldNotSendInvitation: "Invitatia nu a putut fi trimisa",
62
+ emailLabel: "Email",
63
+ emailPlaceholder: "coleg@example.com",
64
+ cancel: "Anuleaza",
65
+ sendInvitation: "Trimite invitatia",
66
+ },
67
+ },
68
+ };
@@ -0,0 +1,28 @@
1
+ export { type DmcAdminMessages, dmcAdminMessageDefinitions, } from "./admin/app-dmc.js";
2
+ export { type OperatorAdminMessages, operatorAdminMessageDefinitions, } from "./admin/app-operator.js";
3
+ export { type AdminAuthMessages, adminAuthMessages, } from "./admin/auth.js";
4
+ export { type AdminAvailabilityMessages, adminAvailabilityMessages, } from "./admin/availability.js";
5
+ export { type AdminBookingsMessages, adminBookingsMessages, } from "./admin/bookings.js";
6
+ export { type AdminChromeMessages, adminChromeMessages, } from "./admin/chrome.js";
7
+ export { type AdminContactsMessages, adminContactsMessages, } from "./admin/contacts.js";
8
+ export { type DmcAdminCoreMessages, dmcAdminCoreMessages, } from "./admin/core-dmc.js";
9
+ export { type OperatorAdminCoreMessages, operatorAdminCoreMessages, } from "./admin/core-operator.js";
10
+ export { type OperatorAdminCrmMessages, operatorAdminCrmMessages, } from "./admin/crm-operator.js";
11
+ export { type OperatorAdminDashboardMessages, operatorAdminDashboardMessages, } from "./admin/dashboard-operator.js";
12
+ export { adminDmcDistributionMessages, type DmcAdminDistributionMessages, type DmcAdminDistributionModuleMessages, } from "./admin/distribution-dmc.js";
13
+ export { type DmcAdminNavMessages, dmcAdminNavMessages, } from "./admin/dmc-nav.js";
14
+ export { type AdminFinanceMessages, adminFinanceMessages, } from "./admin/finance.js";
15
+ export { type OperatorAdminNavMessages, operatorAdminNavMessages, } from "./admin/operator-nav.js";
16
+ export { type AdminOrganizationsModuleMessages, adminOrganizationsModuleMessages, } from "./admin/organizations.js";
17
+ export { type OperatorAdminPricingMessages, operatorAdminPricingMessages, } from "./admin/pricing-operator.js";
18
+ export { adminDmcProductsMessages, type DmcAdminProductsMessages, } from "./admin/products-dmc.js";
19
+ export { type OperatorAdminProductsMessages, operatorAdminProductsMessages, } from "./admin/products-operator.js";
20
+ export { type AdminResourcesMessages, adminResourcesMessages, } from "./admin/resources.js";
21
+ export { type OperatorAdminSettingsMessages, operatorAdminSettingsMessages, } from "./admin/settings-operator.js";
22
+ export { type AdminSuppliersModuleMessages, adminSuppliersModuleMessages, } from "./admin/suppliers.js";
23
+ export { type OperatorAdminSuppliersMessages, operatorAdminSuppliersMessages, } from "./admin/suppliers-operator.js";
24
+ export { type AdminTeamMessages, adminTeamMessages } from "./admin/team.js";
25
+ export { createLocaleFormatters, type LocaleFormatters, } from "./package-formatters.js";
26
+ export { createPackageMessagesContext, type PackageI18nValue, type PackageMessagesProviderProps, type ResolvedPackageMessagesProviderProps, resolvePackageMessages, } from "./package-runtime.js";
27
+ export { composeLocaleMessageDefinitions, type DeepPartial, formatMessage, getLocaleMessageOverridesFromUiPrefs, type LocaleMessageDefinitions, type LocaleMessageOverrides, type LocaleMessageSchema, MessagesProvider, resolveLocaleMessages, useMessages, useResolvedLocaleMessages, } from "./runtime.js";
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,gBAAgB,EACrB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,qBAAqB,EAC1B,+BAA+B,GAChC,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,iBAAiB,EACtB,iBAAiB,GAClB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,KAAK,yBAAyB,EAC9B,yBAAyB,GAC1B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,qBAAqB,EAC1B,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,KAAK,mBAAmB,EACxB,mBAAmB,GACpB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,KAAK,qBAAqB,EAC1B,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,GACrB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,KAAK,yBAAyB,EAC9B,yBAAyB,GAC1B,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,KAAK,wBAAwB,EAC7B,wBAAwB,GACzB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,8BAA8B,EACnC,8BAA8B,GAC/B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EACL,4BAA4B,EAC5B,KAAK,4BAA4B,EACjC,KAAK,kCAAkC,GACxC,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,KAAK,mBAAmB,EACxB,mBAAmB,GACpB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,oBAAoB,EACzB,oBAAoB,GACrB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,wBAAwB,EAC7B,wBAAwB,GACzB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,gCAAgC,EACrC,gCAAgC,GACjC,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,KAAK,4BAA4B,EACjC,4BAA4B,GAC7B,MAAM,6BAA6B,CAAA;AACpC,OAAO,EACL,wBAAwB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,KAAK,6BAA6B,EAClC,6BAA6B,GAC9B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,sBAAsB,EAC3B,sBAAsB,GACvB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,KAAK,6BAA6B,EAClC,6BAA6B,GAC9B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,KAAK,4BAA4B,EACjC,4BAA4B,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,KAAK,8BAA8B,EACnC,8BAA8B,GAC/B,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,KAAK,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,GACtB,MAAM,yBAAyB,CAAA;AAChC,OAAO,EACL,4BAA4B,EAC5B,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,oCAAoC,EACzC,sBAAsB,GACvB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,+BAA+B,EAC/B,KAAK,WAAW,EAChB,aAAa,EACb,oCAAoC,EACpC,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,qBAAqB,EACrB,WAAW,EACX,yBAAyB,GAC1B,MAAM,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ export { dmcAdminMessageDefinitions, } from "./admin/app-dmc.js";
2
+ export { operatorAdminMessageDefinitions, } from "./admin/app-operator.js";
3
+ export { adminAuthMessages, } from "./admin/auth.js";
4
+ export { adminAvailabilityMessages, } from "./admin/availability.js";
5
+ export { adminBookingsMessages, } from "./admin/bookings.js";
6
+ export { adminChromeMessages, } from "./admin/chrome.js";
7
+ export { adminContactsMessages, } from "./admin/contacts.js";
8
+ export { dmcAdminCoreMessages, } from "./admin/core-dmc.js";
9
+ export { operatorAdminCoreMessages, } from "./admin/core-operator.js";
10
+ export { operatorAdminCrmMessages, } from "./admin/crm-operator.js";
11
+ export { operatorAdminDashboardMessages, } from "./admin/dashboard-operator.js";
12
+ export { adminDmcDistributionMessages, } from "./admin/distribution-dmc.js";
13
+ export { dmcAdminNavMessages, } from "./admin/dmc-nav.js";
14
+ export { adminFinanceMessages, } from "./admin/finance.js";
15
+ export { operatorAdminNavMessages, } from "./admin/operator-nav.js";
16
+ export { adminOrganizationsModuleMessages, } from "./admin/organizations.js";
17
+ export { operatorAdminPricingMessages, } from "./admin/pricing-operator.js";
18
+ export { adminDmcProductsMessages, } from "./admin/products-dmc.js";
19
+ export { operatorAdminProductsMessages, } from "./admin/products-operator.js";
20
+ export { adminResourcesMessages, } from "./admin/resources.js";
21
+ export { operatorAdminSettingsMessages, } from "./admin/settings-operator.js";
22
+ export { adminSuppliersModuleMessages, } from "./admin/suppliers.js";
23
+ export { operatorAdminSuppliersMessages, } from "./admin/suppliers-operator.js";
24
+ export { adminTeamMessages } from "./admin/team.js";
25
+ export { createLocaleFormatters, } from "./package-formatters.js";
26
+ export { createPackageMessagesContext, resolvePackageMessages, } from "./package-runtime.js";
27
+ export { composeLocaleMessageDefinitions, formatMessage, getLocaleMessageOverridesFromUiPrefs, MessagesProvider, resolveLocaleMessages, useMessages, useResolvedLocaleMessages, } from "./runtime.js";
@@ -0,0 +1,9 @@
1
+ export interface LocaleFormatters {
2
+ locale: string;
3
+ formatCurrency: (value: number | string | bigint, currency: string, options?: Omit<Intl.NumberFormatOptions, "currency" | "style">) => string;
4
+ formatDate: (value: Date | string | number, options?: Intl.DateTimeFormatOptions) => string;
5
+ formatDateTime: (value: Date | string | number, options?: Intl.DateTimeFormatOptions) => string;
6
+ formatNumber: (value: number | string | bigint, options?: Intl.NumberFormatOptions) => string;
7
+ }
8
+ export declare function createLocaleFormatters(locale: string | null | undefined): LocaleFormatters;
9
+ //# sourceMappingURL=package-formatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-formatters.d.ts","sourceRoot":"","sources":["../src/package-formatters.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,CACd,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,UAAU,GAAG,OAAO,CAAC,KAC3D,MAAM,CAAA;IACX,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,KAAK,MAAM,CAAA;IAC3F,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,qBAAqB,KAAK,MAAM,CAAA;IAC/F,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,mBAAmB,KAAK,MAAM,CAAA;CAC9F;AAoBD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,gBAAgB,CA8C1F"}
@@ -0,0 +1,56 @@
1
+ function normalizeLocale(locale) {
2
+ return (locale ?? "").trim() || "en";
3
+ }
4
+ function coerceNumber(value) {
5
+ if (typeof value === "number" || typeof value === "bigint") {
6
+ return value;
7
+ }
8
+ const parsed = Number(value);
9
+ return Number.isFinite(parsed) ? parsed : null;
10
+ }
11
+ function coerceDate(value) {
12
+ const date = value instanceof Date ? value : new Date(value);
13
+ return Number.isNaN(date.getTime()) ? null : date;
14
+ }
15
+ export function createLocaleFormatters(locale) {
16
+ const resolvedLocale = normalizeLocale(locale);
17
+ return {
18
+ locale: resolvedLocale,
19
+ formatCurrency(value, currency, options) {
20
+ const normalizedValue = coerceNumber(value);
21
+ if (normalizedValue === null) {
22
+ return `${currency} ${value}`;
23
+ }
24
+ return new Intl.NumberFormat(resolvedLocale, {
25
+ currency,
26
+ style: "currency",
27
+ ...options,
28
+ }).format(normalizedValue);
29
+ },
30
+ formatDate(value, options) {
31
+ const normalizedValue = coerceDate(value);
32
+ if (!normalizedValue) {
33
+ return String(value);
34
+ }
35
+ return new Intl.DateTimeFormat(resolvedLocale, options).format(normalizedValue);
36
+ },
37
+ formatDateTime(value, options) {
38
+ const normalizedValue = coerceDate(value);
39
+ if (!normalizedValue) {
40
+ return String(value);
41
+ }
42
+ return new Intl.DateTimeFormat(resolvedLocale, {
43
+ dateStyle: "medium",
44
+ timeStyle: "short",
45
+ ...options,
46
+ }).format(normalizedValue);
47
+ },
48
+ formatNumber(value, options) {
49
+ const normalizedValue = coerceNumber(value);
50
+ if (normalizedValue === null) {
51
+ return String(value);
52
+ }
53
+ return new Intl.NumberFormat(resolvedLocale, options).format(normalizedValue);
54
+ },
55
+ };
56
+ }
@@ -0,0 +1,39 @@
1
+ import { type ReactNode } from "react";
2
+ import { type LocaleFormatters } from "./package-formatters.js";
3
+ import { type LocaleMessageDefinitions, type LocaleMessageOverrides } from "./runtime.js";
4
+ export interface PackageMessagesProviderProps<T extends Record<string, unknown>> {
5
+ children: ReactNode;
6
+ locale: string | null | undefined;
7
+ messages: T;
8
+ }
9
+ export type PackageI18nValue<T extends Record<string, unknown>> = LocaleFormatters & {
10
+ messages: T;
11
+ };
12
+ export interface ResolvedPackageMessagesProviderProps<T extends Record<string, unknown>> {
13
+ children: ReactNode;
14
+ definitions: LocaleMessageDefinitions<T>;
15
+ fallbackLocale: string;
16
+ locale: string | null | undefined;
17
+ overrides?: LocaleMessageOverrides<T> | null;
18
+ }
19
+ export declare function createPackageMessagesContext<T extends Record<string, unknown>>(displayName: string): {
20
+ MessagesProvider: {
21
+ ({ children, locale, messages }: PackageMessagesProviderProps<T>): import("react/jsx-runtime").JSX.Element;
22
+ displayName: string;
23
+ };
24
+ ResolvedMessagesProvider: {
25
+ ({ children, definitions, fallbackLocale, locale, overrides, }: ResolvedPackageMessagesProviderProps<T>): import("react/jsx-runtime").JSX.Element;
26
+ displayName: string;
27
+ };
28
+ useI18n: () => PackageI18nValue<T>;
29
+ useOptionalI18n: () => PackageI18nValue<T> | undefined;
30
+ useMessages: () => T;
31
+ useOptionalMessages: () => T | undefined;
32
+ };
33
+ export declare function resolvePackageMessages<T extends Record<string, unknown>>({ definitions, fallbackLocale, locale, overrides, }: {
34
+ definitions: LocaleMessageDefinitions<T>;
35
+ fallbackLocale: string;
36
+ locale: string | null | undefined;
37
+ overrides?: LocaleMessageOverrides<T> | null;
38
+ }): T;
39
+ //# sourceMappingURL=package-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-runtime.d.ts","sourceRoot":"","sources":["../src/package-runtime.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,SAAS,EAAuB,MAAM,OAAO,CAAA;AAE1E,OAAO,EAA0B,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACvF,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAG5B,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,4BAA4B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7E,QAAQ,EAAE,SAAS,CAAA;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,QAAQ,EAAE,CAAC,CAAA;CACZ;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,gBAAgB,GAAG;IACnF,QAAQ,EAAE,CAAC,CAAA;CACZ,CAAA;AAED,MAAM,WAAW,oCAAoC,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACrF,QAAQ,EAAE,SAAS,CAAA;IACnB,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAA;IACxC,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAC7C;AAED,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5E,WAAW,EAAE,MAAM;;yCAKuC,4BAA4B,CAAC,CAAC,CAAC;;;;wEAqBtF,oCAAoC,CAAC,CAAC,CAAC;;;mBAiBf,gBAAgB,CAAC,CAAC,CAAC;2BAWX,gBAAgB,CAAC,CAAC,CAAC,GAAG,SAAS;uBAInC,CAAC;+BAIO,CAAC,GAAG,SAAS;EAYrD;AAED,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACxE,WAAW,EACX,cAAc,EACd,MAAM,EACN,SAAS,GACV,EAAE;IACD,WAAW,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAA;IACxC,cAAc,EAAE,MAAM,CAAA;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IACjC,SAAS,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;CAC7C,GAAG,CAAC,CAOJ"}
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useMemo } from "react";
4
+ import { createLocaleFormatters } from "./package-formatters.js";
5
+ import { resolveLocaleMessages, useResolvedLocaleMessages, } from "./runtime.js";
6
+ export function createPackageMessagesContext(displayName) {
7
+ const Context = createContext(undefined);
8
+ Context.displayName = `${displayName}Context`;
9
+ function MessagesProvider({ children, locale, messages }) {
10
+ const formatters = useMemo(() => createLocaleFormatters(locale), [locale]);
11
+ const value = useMemo(() => ({
12
+ ...formatters,
13
+ messages,
14
+ }), [formatters, messages]);
15
+ return _jsx(Context.Provider, { value: value, children: children });
16
+ }
17
+ MessagesProvider.displayName = `${displayName}Provider`;
18
+ function ResolvedMessagesProvider({ children, definitions, fallbackLocale, locale, overrides, }) {
19
+ const messages = useResolvedLocaleMessages({
20
+ locale,
21
+ fallbackLocale,
22
+ definitions,
23
+ overrides,
24
+ });
25
+ return (_jsx(MessagesProvider, { locale: locale ?? fallbackLocale, messages: messages, children: children }));
26
+ }
27
+ ResolvedMessagesProvider.displayName = `${displayName}ResolvedProvider`;
28
+ function usePackageI18n() {
29
+ const context = useContext(Context);
30
+ if (!context) {
31
+ throw new Error(`${displayName} context is missing. Wrap the tree in <${MessagesProvider.displayName}>.`);
32
+ }
33
+ return context;
34
+ }
35
+ function useOptionalPackageI18n() {
36
+ return useContext(Context);
37
+ }
38
+ function usePackageMessages() {
39
+ return usePackageI18n().messages;
40
+ }
41
+ function useOptionalPackageMessages() {
42
+ return useOptionalPackageI18n()?.messages;
43
+ }
44
+ return {
45
+ MessagesProvider,
46
+ ResolvedMessagesProvider,
47
+ useI18n: usePackageI18n,
48
+ useOptionalI18n: useOptionalPackageI18n,
49
+ useMessages: usePackageMessages,
50
+ useOptionalMessages: useOptionalPackageMessages,
51
+ };
52
+ }
53
+ export function resolvePackageMessages({ definitions, fallbackLocale, locale, overrides, }) {
54
+ return resolveLocaleMessages({
55
+ locale,
56
+ fallbackLocale,
57
+ definitions,
58
+ overrides,
59
+ });
60
+ }
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from "react";
2
+ export type DeepPartial<T> = T extends readonly unknown[] ? T : T extends object ? {
3
+ [K in keyof T]?: DeepPartial<T[K]>;
4
+ } : T;
5
+ export type LocaleMessageDefinitions<T extends Record<string, unknown>> = Record<string, T>;
6
+ export interface LocaleMessageOverrides<T extends Record<string, unknown>> {
7
+ shared?: DeepPartial<T> | null;
8
+ locales?: Partial<Record<string, DeepPartial<T>>> | null;
9
+ }
10
+ export type LocaleMessageSchema<T> = T extends string ? string : T extends readonly (infer U)[] ? readonly LocaleMessageSchema<U>[] : T extends Array<infer U> ? Array<LocaleMessageSchema<U>> : T extends object ? {
11
+ [K in keyof T]: LocaleMessageSchema<T[K]>;
12
+ } : T;
13
+ export declare function getLocaleMessageOverridesFromUiPrefs<T extends Record<string, unknown>>(uiPrefs: unknown): LocaleMessageOverrides<T> | undefined;
14
+ export declare function resolveLocaleMessages<T extends Record<string, unknown>>({ locale, fallbackLocale, definitions, overrides, }: {
15
+ locale: string | null | undefined;
16
+ fallbackLocale: string;
17
+ definitions: LocaleMessageDefinitions<T>;
18
+ overrides?: LocaleMessageOverrides<T> | null;
19
+ }): T;
20
+ export declare function useResolvedLocaleMessages<T extends Record<string, unknown>>({ locale, fallbackLocale, definitions, overrides, }: {
21
+ locale: string | null | undefined;
22
+ fallbackLocale: string;
23
+ definitions: LocaleMessageDefinitions<T>;
24
+ overrides?: LocaleMessageOverrides<T> | null;
25
+ }): T;
26
+ export declare function composeLocaleMessageDefinitions<T extends Record<string, unknown>>(...definitions: Array<Partial<Record<string, DeepPartial<T>>>>): LocaleMessageDefinitions<T>;
27
+ export declare function formatMessage(template: string, values: Record<string, string | number | null | undefined>): string;
28
+ export declare function MessagesProvider<T extends Record<string, unknown>>({ children, messages, }: {
29
+ children: ReactNode;
30
+ messages: T;
31
+ }): import("react/jsx-runtime").JSX.Element;
32
+ export declare function useMessages<T extends Record<string, unknown>>(): T;
33
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { createContext, useContext, useMemo } from "react";
4
+ function normalizeLocaleTag(value) {
5
+ return (value ?? "").trim().toLowerCase();
6
+ }
7
+ function localeCandidates(locale) {
8
+ const normalized = normalizeLocaleTag(locale);
9
+ if (!normalized) {
10
+ return [];
11
+ }
12
+ const language = normalized.split("-")[0];
13
+ return language && language !== normalized ? [normalized, language] : [normalized];
14
+ }
15
+ function isPlainObject(value) {
16
+ return typeof value === "object" && value !== null && !Array.isArray(value);
17
+ }
18
+ export function getLocaleMessageOverridesFromUiPrefs(uiPrefs) {
19
+ if (!isPlainObject(uiPrefs)) {
20
+ return undefined;
21
+ }
22
+ const i18n = uiPrefs.i18n;
23
+ if (!isPlainObject(i18n)) {
24
+ return undefined;
25
+ }
26
+ return isPlainObject(i18n.admin) ? i18n.admin : undefined;
27
+ }
28
+ function mergeDeep(base, override) {
29
+ if (override === undefined || override === null) {
30
+ return base;
31
+ }
32
+ if (!isPlainObject(base) || !isPlainObject(override)) {
33
+ return override;
34
+ }
35
+ const result = { ...base };
36
+ for (const [key, value] of Object.entries(override)) {
37
+ if (value === undefined) {
38
+ continue;
39
+ }
40
+ const existing = result[key];
41
+ result[key] =
42
+ isPlainObject(existing) && isPlainObject(value)
43
+ ? mergeDeep(existing, value)
44
+ : value;
45
+ }
46
+ return result;
47
+ }
48
+ function resolveRecordByLocale(locale, record) {
49
+ if (!record) {
50
+ return undefined;
51
+ }
52
+ const entries = Object.entries(record);
53
+ for (const candidate of localeCandidates(locale)) {
54
+ const match = entries.find(([key]) => normalizeLocaleTag(key) === candidate);
55
+ if (match) {
56
+ return match[1];
57
+ }
58
+ }
59
+ return undefined;
60
+ }
61
+ function resolveDefinitionLocale(locale, definitions, fallbackLocale) {
62
+ const keys = Object.keys(definitions);
63
+ for (const candidate of localeCandidates(locale)) {
64
+ const match = keys.find((key) => normalizeLocaleTag(key) === candidate);
65
+ if (match) {
66
+ return match;
67
+ }
68
+ }
69
+ const fallbackMatch = keys.find((key) => normalizeLocaleTag(key) === normalizeLocaleTag(fallbackLocale));
70
+ return fallbackMatch ?? keys[0] ?? fallbackLocale;
71
+ }
72
+ export function resolveLocaleMessages({ locale, fallbackLocale, definitions, overrides, }) {
73
+ const fallbackKey = resolveDefinitionLocale(fallbackLocale, definitions, fallbackLocale);
74
+ const localeKey = resolveDefinitionLocale(locale, definitions, fallbackKey);
75
+ const fallbackMessages = definitions[fallbackKey];
76
+ const localeMessages = definitions[localeKey];
77
+ const localeOverride = localeKey === fallbackKey ? undefined : localeMessages;
78
+ let resolved = mergeDeep(fallbackMessages, localeOverride);
79
+ resolved = mergeDeep(resolved, overrides?.shared);
80
+ resolved = mergeDeep(resolved, resolveRecordByLocale(localeKey, overrides?.locales));
81
+ return resolved;
82
+ }
83
+ export function useResolvedLocaleMessages({ locale, fallbackLocale, definitions, overrides, }) {
84
+ return useMemo(() => resolveLocaleMessages({
85
+ locale,
86
+ fallbackLocale,
87
+ definitions,
88
+ overrides,
89
+ }), [definitions, fallbackLocale, locale, overrides]);
90
+ }
91
+ export function composeLocaleMessageDefinitions(...definitions) {
92
+ const result = {};
93
+ for (const definition of definitions) {
94
+ for (const [locale, messages] of Object.entries(definition)) {
95
+ const existing = result[locale];
96
+ result[locale] =
97
+ isPlainObject(existing) && isPlainObject(messages)
98
+ ? mergeDeep(existing, messages)
99
+ : messages;
100
+ }
101
+ }
102
+ return result;
103
+ }
104
+ export function formatMessage(template, values) {
105
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
106
+ const value = values[key];
107
+ return value === null || value === undefined ? "" : String(value);
108
+ });
109
+ }
110
+ const MessagesContext = createContext(undefined);
111
+ export function MessagesProvider({ children, messages, }) {
112
+ return _jsx(MessagesContext.Provider, { value: messages, children: children });
113
+ }
114
+ export function useMessages() {
115
+ const context = useContext(MessagesContext);
116
+ if (!context) {
117
+ throw new Error("useMessages must be used within <MessagesProvider>");
118
+ }
119
+ return context;
120
+ }
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@voyantjs/i18n",
3
+ "version": "0.16.0",
4
+ "license": "FSL-1.1-Apache-2.0",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/index.ts"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc -p tsconfig.build.json",
11
+ "clean": "rm -rf dist",
12
+ "check:parity": "node --import tsx ../../scripts/check-i18n-parity.ts",
13
+ "prepack": "pnpm run build",
14
+ "typecheck": "tsc --noEmit",
15
+ "lint": "biome check src/"
16
+ },
17
+ "peerDependencies": {
18
+ "react": "^19.0.0",
19
+ "react-dom": "^19.0.0"
20
+ },
21
+ "devDependencies": {
22
+ "@voyantjs/voyant-typescript-config": "workspace:*",
23
+ "@types/react": "^19.2.14",
24
+ "@types/react-dom": "^19.2.3",
25
+ "react": "^19.2.4",
26
+ "react-dom": "^19.2.4",
27
+ "typescript": "^6.0.2"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/voyantjs/voyant.git",
32
+ "directory": "packages/i18n"
33
+ },
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "publishConfig": {
38
+ "access": "public",
39
+ "exports": {
40
+ ".": {
41
+ "types": "./dist/index.d.ts",
42
+ "import": "./dist/index.js"
43
+ }
44
+ },
45
+ "main": "./dist/index.js",
46
+ "types": "./dist/index.d.ts"
47
+ }
48
+ }