@tribe-nest/forge 3.53.0 → 3.57.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 (74) hide show
  1. package/package.json +1 -1
  2. package/src/contexts/AppAuthContext.tsx +3 -2
  3. package/src/contexts/AudioPlayerContext.tsx +3 -2
  4. package/src/contexts/CartContext.tsx +3 -2
  5. package/src/contexts/PublicAuthContext.tsx +3 -2
  6. package/src/data/queries/useCoachingProducts.ts +15 -1
  7. package/src/data/queries/useCourses.ts +15 -1
  8. package/src/data/queries/useEvents.ts +26 -1
  9. package/src/data/queries/useMembership.ts +176 -4
  10. package/src/data/queries/useMyTickets.ts +49 -0
  11. package/src/data/queries/usePaymentFlow.ts +8 -0
  12. package/src/data/queries/useProducts.ts +15 -1
  13. package/src/data/queries/useSubscriptions.ts +21 -1
  14. package/src/i18n/de.json +116 -1
  15. package/src/i18n/en.json +116 -1
  16. package/src/i18n/index.ts +3 -2
  17. package/src/index.ts +22 -0
  18. package/src/provider/ForgeAppProvider.tsx +8 -1
  19. package/src/provider/ForgeProvider.tsx +3 -2
  20. package/src/provider/SiteConfigProvider.tsx +3 -2
  21. package/src/runtime/RemotePage.tsx +110 -0
  22. package/src/runtime/hostRuntime.ts +84 -0
  23. package/src/runtime/pages.spec.ts +41 -0
  24. package/src/runtime/pages.ts +183 -0
  25. package/src/runtime/pagesClient.ts +127 -0
  26. package/src/runtime/registry.spec.ts +45 -0
  27. package/src/runtime/registry.ts +102 -0
  28. package/src/server/index.ts +74 -0
  29. package/src/server/jobs.ts +4 -1
  30. package/src/server/platformEvents.generated.ts +152 -0
  31. package/src/types/models.ts +185 -0
  32. package/src/ui/headless/event/_tests/ticketApproval.spec.ts +137 -0
  33. package/src/ui/headless/event/_tests/useEventCheckoutApproval.spec.tsx +250 -0
  34. package/src/ui/headless/event/ticketApproval.ts +109 -0
  35. package/src/ui/headless/event/useEventCheckout.ts +74 -4
  36. package/src/ui/headless/index.ts +34 -0
  37. package/src/ui/headless/membership/_tests/membershipApplication.spec.ts +85 -0
  38. package/src/ui/headless/membership/_tests/membershipCheckoutRefetch.spec.tsx +2 -0
  39. package/src/ui/headless/membership/_tests/membershipTrial.spec.ts +61 -0
  40. package/src/ui/headless/membership/_tests/useMembershipCheckoutApplication.spec.tsx +253 -0
  41. package/src/ui/headless/membership/_tests/useMembershipCheckoutQuestionnaire.spec.tsx +241 -0
  42. package/src/ui/headless/membership/_tests/useMembershipCheckoutTrial.spec.tsx +165 -0
  43. package/src/ui/headless/membership/membershipApplication.ts +109 -0
  44. package/src/ui/headless/membership/membershipQuestionnaire.ts +44 -0
  45. package/src/ui/headless/membership/membershipTrial.ts +53 -0
  46. package/src/ui/headless/membership/useMembershipCheckout.ts +227 -8
  47. package/src/ui/index.ts +27 -0
  48. package/src/ui/payment/ForgePaymentProvider.tsx +29 -0
  49. package/src/ui/payment/ForgeStripePayment.tsx +110 -5
  50. package/src/ui/payment/_tests/ForgeStripePaymentTrial.spec.tsx +101 -0
  51. package/src/ui/payment/_tests/stripeConfirmOutcome.spec.ts +61 -0
  52. package/src/ui/payment/_tests/stripeIntentKind.spec.ts +43 -0
  53. package/src/ui/payment/stripeConfirmOutcome.ts +50 -0
  54. package/src/ui/payment/stripeIntentKind.ts +32 -0
  55. package/src/ui/shell/TribeNestApp.tsx +6 -0
  56. package/src/ui/styled/AccountDashboard.tsx +239 -15
  57. package/src/ui/styled/DocumentSigningPage.tsx +516 -0
  58. package/src/ui/styled/EventConfirmation.tsx +106 -9
  59. package/src/ui/styled/EventTickets.tsx +107 -13
  60. package/src/ui/styled/LoginForm.tsx +5 -3
  61. package/src/ui/styled/MembershipCheckout.tsx +596 -256
  62. package/src/ui/styled/MembershipTierCallout.tsx +17 -3
  63. package/src/ui/styled/MembershipTiers.tsx +148 -6
  64. package/src/ui/styled/ProductGrid.tsx +14 -2
  65. package/src/ui/styled/ReviewRequestPage.tsx +214 -0
  66. package/src/ui/styled/SignupForm.tsx +4 -2
  67. package/src/ui/styled/_tests/AccountDashboardTrial.spec.tsx +105 -0
  68. package/src/ui/styled/_tests/MembershipCheckout.spec.tsx +106 -0
  69. package/src/ui/styled/_tests/membershipTiersCuratedAccess.spec.tsx +139 -0
  70. package/src/ui/styled/_tests/membershipTiersTrial.spec.tsx +97 -0
  71. package/src/ui/styled/forge-utilities.css +310 -0
  72. package/src/ui/theme/ForgeThemeProvider.tsx +3 -2
  73. package/src/utils/_tests/ticketOrderOutcome.spec.ts +82 -0
  74. package/src/utils/ticketOrderOutcome.ts +57 -1
package/src/i18n/de.json CHANGED
@@ -1,4 +1,19 @@
1
1
  {
2
+ "forge.account_dashboard.application_complete": "Mitgliedschaft abschließen",
3
+ "forge.account_dashboard.application_complete_by": "Abschließen bis {date}",
4
+ "forge.account_dashboard.application_status_approved": "Angenommen, wird eingerichtet",
5
+ "forge.account_dashboard.application_status_card_pending": "Karte noch nicht bestätigt",
6
+ "forge.account_dashboard.application_status_declined": "Nicht angenommen",
7
+ "forge.account_dashboard.application_status_expired": "Abgelaufen",
8
+ "forge.account_dashboard.application_status_joined": "Beigetreten",
9
+ "forge.account_dashboard.application_status_payment_failed": "Angenommen: Mitgliedschaft abschließen",
10
+ "forge.account_dashboard.application_status_pending": "Bewerbung wird geprüft",
11
+ "forge.account_dashboard.application_status_withdrawn": "Zurückgezogen",
12
+ "forge.account_dashboard.application_submitted_on": "Beworben am {date}",
13
+ "forge.account_dashboard.application_withdraw": "Zurückziehen",
14
+ "forge.account_dashboard.application_withdraw_error": "Wir konnten deine Bewerbung nicht zurückziehen. Bitte versuche es erneut.",
15
+ "forge.account_dashboard.application_withdrawing": "Wird zurückgezogen…",
16
+ "forge.account_dashboard.applications_title": "Deine Bewerbungen",
2
17
  "forge.account_dashboard.billing_portal_error": "Wir konnten die Zahlungsseite nicht öffnen. Bitte kontaktiere uns.",
3
18
  "forge.account_dashboard.billing_portal_opening": "Wird geöffnet…",
4
19
  "forge.account_dashboard.booking_cancel_error": "Wir konnten diese Session nicht stornieren. Bitte versuche es erneut.",
@@ -16,6 +31,7 @@
16
31
  "forge.account_dashboard.cancel_confirm_paid": "Sie wird nicht verlängert, und Ihre Vorteile bleiben bis zum Ende des bezahlten Zeitraums bestehen.",
17
32
  "forge.account_dashboard.cancel_confirm_paid_until": "Sie wird nicht verlängert, und Ihre Vorteile bleiben bis zum {date} bestehen.",
18
33
  "forge.account_dashboard.cancel_confirm_title": "Mitgliedschaft kündigen?",
34
+ "forge.account_dashboard.cancel_confirm_trial": "Ihre kostenlose Testphase wird nicht zu einer bezahlten Mitgliedschaft. Ihre Vorteile bleiben bis zum {date} bestehen, und es wird nichts berechnet.",
19
35
  "forge.account_dashboard.cancel_deletion": "Löschung abbrechen",
20
36
  "forge.account_dashboard.cancel_session": "Session stornieren",
21
37
  "forge.account_dashboard.cancel_ticket": "Ticket stornieren",
@@ -29,6 +45,8 @@
29
45
  "forge.account_dashboard.courses_start": "Starten",
30
46
  "forge.account_dashboard.courses_title": "Deine Kurse",
31
47
  "forge.account_dashboard.current_password": "Aktuelles Passwort",
48
+ "forge.account_dashboard.cycle_month": "Monat",
49
+ "forge.account_dashboard.cycle_year": "Jahr",
32
50
  "forge.account_dashboard.data_export_description": "Exportiere eine Kopie deiner persönlichen Daten.",
33
51
  "forge.account_dashboard.data_section_title": "Deine Daten",
34
52
  "forge.account_dashboard.delete_section_title": "Konto löschen",
@@ -50,6 +68,9 @@
50
68
  "forge.account_dashboard.membership_price": "{amount} / {cycle}",
51
69
  "forge.account_dashboard.membership_renews_on": "Verlängert sich am {date}",
52
70
  "forge.account_dashboard.membership_title": "Aktuelle Mitgliedschaft",
71
+ "forge.account_dashboard.membership_trial_cancelled": "Gekündigt. Es wird nichts berechnet.",
72
+ "forge.account_dashboard.membership_trial_then": "Danach {amount} pro {cycle} ab dem {date}.",
73
+ "forge.account_dashboard.membership_trial_until": "Kostenlose Testphase bis zum {date}",
53
74
  "forge.account_dashboard.new_password": "Neues Passwort",
54
75
  "forge.account_dashboard.notifications_title": "Benachrichtigungsarten",
55
76
  "forge.account_dashboard.notify_chat_description": "Werde benachrichtigt, wenn neue Chatnachrichten ankommen",
@@ -68,7 +89,16 @@
68
89
  "forge.account_dashboard.profile_update_error": "Profil konnte nicht aktualisiert werden.",
69
90
  "forge.account_dashboard.profile_update_success": "Profil aktualisiert.",
70
91
  "forge.account_dashboard.rentals_title": "Meine Ausleihen",
92
+ "forge.account_dashboard.request_approved": "Anfrage freigegeben",
93
+ "forge.account_dashboard.request_decide_by": "Wir entscheiden bis {date}",
94
+ "forge.account_dashboard.request_declined": "Nicht freigegeben",
71
95
  "forge.account_dashboard.request_deletion": "Kontolöschung beantragen",
96
+ "forge.account_dashboard.request_expired": "Anfrage abgelaufen",
97
+ "forge.account_dashboard.request_note": "Unser Hinweis: {note}",
98
+ "forge.account_dashboard.request_nothing_charged": "Es wird nichts berechnet, bis wir deine Anfrage freigeben.",
99
+ "forge.account_dashboard.request_payment_failed": "Freigegeben, Zahlung fehlgeschlagen",
100
+ "forge.account_dashboard.request_pending": "Anfrage offen",
101
+ "forge.account_dashboard.request_seat_released": "Der Platz wurde freigegeben. Das Event hat möglicherweise noch Tickets.",
72
102
  "forge.account_dashboard.reschedule": "Verschieben",
73
103
  "forge.account_dashboard.reschedule_empty": "In den nächsten zwei Wochen sind keine anderen Zeiten frei.",
74
104
  "forge.account_dashboard.reschedule_error": "Wir konnten diese Session nicht verschieben. Bitte wähle eine andere Zeit.",
@@ -99,6 +129,7 @@
99
129
  "forge.account_dashboard.tickets_title": "Meine Tickets",
100
130
  "forge.account_dashboard.title": "Mein Konto",
101
131
  "forge.account_dashboard.total": "Gesamt",
132
+ "forge.account_dashboard.total_on_approval": "Gesamt bei Freigabe",
102
133
  "forge.account_dashboard.update_password": "Passwort ändern",
103
134
  "forge.account_dashboard.update_payment_method": "Zahlungsmethode ändern",
104
135
  "forge.account_dashboard.update_profile": "Profil aktualisieren",
@@ -733,10 +764,20 @@
733
764
  "forge.ended_broadcast.refresh_instruction": "Du kannst diese Seite immer wieder neu laden, bis die Übertragung wieder läuft. Tritt ihr dann bei und du kannst das Event weiter ansehen. Du bekommst außerdem eine E-Mail, sobald die Übertragung wieder läuft.",
734
765
  "forge.ended_broadcast.why_body": "Wenn das mitten im Event passiert ist, lag es sehr wahrscheinlich an einer instabilen Internetverbindung beim Host.",
735
766
  "forge.ended_broadcast.why_label": "Warum wurde die Übertragung beendet?",
767
+ "forge.event_confirmation.awaiting_nothing_charged": "Es wird nichts berechnet, bis wir deine Anfrage freigeben.",
768
+ "forge.event_confirmation.body_awaiting_no_date": "Wir prüfen deine Anfrage und schicken dir eine E-Mail, sobald wir entschieden haben.",
769
+ "forge.event_confirmation.body_declined": "Wir konnten diese Anfrage nicht freigeben. Es wurde nichts berechnet, und eine Vormerkung auf deiner Karte wurde aufgehoben.",
770
+ "forge.event_confirmation.body_expired": "Wir haben deine Anfrage nicht rechtzeitig bearbeitet, daher ist sie abgelaufen. Es wurde nichts berechnet, und eine Vormerkung auf deiner Karte wurde aufgehoben.",
736
771
  "forge.event_confirmation.body_incomplete": "Deine Bestellung ist {status}. Falls dir etwas berechnet wurde, melde dich beim Support.",
737
772
  "forge.event_confirmation.body_paid": "Wir haben deine Tickets an {email} geschickt.",
773
+ "forge.event_confirmation.body_request_payment_failed": "Wir haben deine Anfrage freigegeben, aber deine Karte konnte nicht belastet werden. Der Platz wurde freigegeben. Möglicherweise sind noch Plätze verfügbar.",
774
+ "forge.event_confirmation.buy_again": "Erneut kaufen",
738
775
  "forge.event_confirmation.explore": "Mehr Events ansehen",
776
+ "forge.event_confirmation.eyebrow_awaiting": "Anfrage eingegangen",
777
+ "forge.event_confirmation.eyebrow_declined": "Nicht freigegeben",
778
+ "forge.event_confirmation.eyebrow_expired": "Anfrage abgelaufen",
739
779
  "forge.event_confirmation.eyebrow_paid": "E-Ticket",
780
+ "forge.event_confirmation.eyebrow_request_payment_failed": "Zahlung fehlgeschlagen",
740
781
  "forge.event_confirmation.eyebrow_status": "Bestellung {status}",
741
782
  "forge.event_confirmation.loading": "Deine Bestellung wird abgeschlossen…",
742
783
  "forge.event_confirmation.not_found": "Wir konnten deine Bestellung nicht finden.",
@@ -746,10 +787,16 @@
746
787
  "forge.event_confirmation.tax": "MwSt.",
747
788
  "forge.event_confirmation.tax_included": "Enthält {amount} MwSt.",
748
789
  "forge.event_confirmation.tickets_heading": "Tickets",
790
+ "forge.event_confirmation.title_awaiting": "Deine Anfrage ist eingegangen",
791
+ "forge.event_confirmation.title_declined": "Deine Anfrage wurde nicht freigegeben",
792
+ "forge.event_confirmation.title_expired": "Deine Anfrage ist abgelaufen",
749
793
  "forge.event_confirmation.title_incomplete": "Bestellung nicht abgeschlossen",
750
794
  "forge.event_confirmation.title_paid": "Du bist dabei! 🎟",
795
+ "forge.event_confirmation.title_request_payment_failed": "Freigegeben, aber die Zahlung ist fehlgeschlagen",
751
796
  "forge.event_confirmation.total": "Gesamt",
797
+ "forge.event_confirmation.total_on_approval": "Gesamt bei Freigabe",
752
798
  "forge.event_confirmation.total_paid": "Bezahlt gesamt",
799
+ "forge.event_confirmation.view_event": "Event ansehen",
753
800
  "forge.event_confirmation.virtual_location": "Online-Event",
754
801
  "forge.event_countdown.past": "Dieses Event ist vorbei",
755
802
  "forge.event_countdown.unit_days": "Tage",
@@ -769,11 +816,20 @@
769
816
  "forge.event_series_detail.status_cancelled": "Abgesagt",
770
817
  "forge.event_series_detail.status_sold_out": "Ausverkauft",
771
818
  "forge.event_tickets.add_to_cart": "In den Warenkorb",
819
+ "forge.event_tickets.approval_badge": "Freigabe erforderlich",
820
+ "forge.event_tickets.approval_help_body": "Wir entscheiden, wer dieses Ticket bekommt. Deine Karte wird nur vorgemerkt, nicht belastet, und der Platz bleibt für dich reserviert, bis wir entschieden haben. Bei einer Freigabe wird die Karte belastet und deine Tickets werden verschickt. Bei einer Ablehnung oder nach Ablauf der Anfrage wird die Vormerkung aufgehoben und nichts berechnet.",
821
+ "forge.event_tickets.approval_help_label": "Was bedeutet Freigabe erforderlich?",
822
+ "forge.event_tickets.approval_mix_blocked": "Kann nicht zu deiner aktuellen Auswahl hinzugefügt werden",
823
+ "forge.event_tickets.approval_mix_help_body": "Tickets, die unsere Freigabe brauchen, werden separat angefragt. Eine Bestellung ist entweder eine Anfrage oder ein Kauf, nie beides. Entferne die ausgewählten Tickets, um dieses hinzuzufügen.",
824
+ "forge.event_tickets.approval_mix_help_label": "Warum können diese Tickets nicht kombiniert werden?",
772
825
  "forge.event_tickets.aria_close": "Schließen",
773
826
  "forge.event_tickets.attendee_is_you": "(das bist du)",
774
827
  "forge.event_tickets.attendee_name_placeholder": "Vollständiger Name",
775
828
  "forge.event_tickets.attendees_description": "Bei diesem Event steht auf jedem Ticket der Name des jeweiligen Gastes, damit die Einlassliste zu den Leuten passt, die wirklich kommen.",
776
829
  "forge.event_tickets.attendees_title": "Wer kommt mit?",
830
+ "forge.event_tickets.authorize": "{amount} vormerken",
831
+ "forge.event_tickets.authorize_subtitle": "Deine Anfrage erreicht uns, sobald deine Karte vorgemerkt ist.",
832
+ "forge.event_tickets.authorize_title": "Karte vormerken",
777
833
  "forge.event_tickets.back": "Zurück",
778
834
  "forge.event_tickets.booking_fee": "Buchungsgebühr",
779
835
  "forge.event_tickets.checkout_tickets_only": "Nur Tickets kaufen",
@@ -782,6 +838,8 @@
782
838
  "forge.event_tickets.continue": "Weiter",
783
839
  "forge.event_tickets.continue_addons": "Weiter zu den Extras",
784
840
  "forge.event_tickets.continue_payment": "Weiter zur Zahlung",
841
+ "forge.event_tickets.deferred_charged_on_approval": "Deine Karte wird nur belastet, wenn wir deine Anfrage freigeben.",
842
+ "forge.event_tickets.deferred_hold_on_statement": "Bis dahin erscheint eine vorübergehende Vormerkung auf deiner Abrechnung.",
785
843
  "forge.event_tickets.details_title": "Deine Daten",
786
844
  "forge.event_tickets.email_mismatch": "Die E-Mail-Adressen stimmen nicht überein",
787
845
  "forge.event_tickets.email_placeholder": "E-Mail",
@@ -824,6 +882,7 @@
824
882
  "forge.event_tickets.pwyw_range_min": "(mindestens {min})",
825
883
  "forge.event_tickets.pwyw_range_min_max": "(mindestens {min}, bis {max})",
826
884
  "forge.event_tickets.remove_discount": "Rabatt entfernen",
885
+ "forge.event_tickets.request_tickets": "Tickets anfragen",
827
886
  "forge.event_tickets.select_option": "Auswählen…",
828
887
  "forge.event_tickets.select_title": "Tickets wählen",
829
888
  "forge.event_tickets.subtotal": "Zwischensumme",
@@ -964,6 +1023,17 @@
964
1023
  "forge.film_watch.unavailable": "Diese Folge kann gerade nicht abgespielt werden.",
965
1024
  "forge.film_watch.up_next": "Als Nächstes: {title}",
966
1025
  "forge.film_watch.window_not_started": "Dein Zeitfenster startet jetzt.",
1026
+ "forge.forge_stripe_payment.authorize": "{amount} vormerken",
1027
+ "forge.forge_stripe_payment.cycle_month": "Monat",
1028
+ "forge.forge_stripe_payment.cycle_year": "Jahr",
1029
+ "forge.forge_stripe_payment.deferred_charged_on_approval": "Deine Karte wird nur belastet, wenn wir deine Anfrage freigeben.",
1030
+ "forge.forge_stripe_payment.deferred_hold_on_statement": "Bis dahin erscheint eine vorübergehende Vormerkung auf deiner Abrechnung.",
1031
+ "forge.forge_stripe_payment.setup_charged_on_approval": "Jetzt wird nichts abgebucht. Wir belasten diese Karte nur, wenn wir deine Bewerbung annehmen, und dann mit dem angezeigten Betrag ({amount}).",
1032
+ "forge.forge_stripe_payment.setup_failed": "Wir konnten deine Karte nicht speichern. Bitte versuche es erneut.",
1033
+ "forge.forge_stripe_payment.setup_incomplete": "Deine Karte wurde nicht gespeichert. Bitte versuche es erneut.",
1034
+ "forge.forge_stripe_payment.start_free_trial": "Kostenlos testen",
1035
+ "forge.forge_stripe_payment.submit_application": "Bewerbung absenden",
1036
+ "forge.forge_stripe_payment.trial_consent": "Heute wird nichts abgebucht. Ab dem {date} {amount} pro {cycle}. Wenn du vorher kündigst, wird dir nichts berechnet.",
967
1037
  "forge.forgot_password_form.back_to_login": "Zurück zur Anmeldung",
968
1038
  "forge.forgot_password_form.email_label": "E-Mail",
969
1039
  "forge.forgot_password_form.email_placeholder": "E-Mail",
@@ -1041,8 +1111,27 @@
1041
1111
  "forge.login_form.verify_submit": "Bestätigen & anmelden",
1042
1112
  "forge.login_form.verify_title": "Bestätige deine E-Mail",
1043
1113
  "forge.login_form.verifying": "Wird geprüft…",
1114
+ "forge.membership_checkout.accept_invite": "Einladung annehmen",
1044
1115
  "forge.membership_checkout.amount_below_minimum": "Bitte {minimum} oder mehr eingeben.",
1045
1116
  "forge.membership_checkout.amount_not_positive": "Bitte einen Betrag größer als null eingeben.",
1117
+ "forge.membership_checkout.answer_required": "Bitte beantworte: {question}",
1118
+ "forge.membership_checkout.application_approved_body": "Deine Bewerbung für {tier_name} wurde angenommen. Deine Mitgliedschaft wird eingerichtet.",
1119
+ "forge.membership_checkout.application_approved_title": "Du wurdest angenommen",
1120
+ "forge.membership_checkout.application_card_title": "Deine Karte",
1121
+ "forge.membership_checkout.application_closed_body": "Deine Bewerbung für {tier_name} ist geschlossen. Es wurde nichts abgebucht.",
1122
+ "forge.membership_checkout.application_closed_title": "Bewerbung geschlossen",
1123
+ "forge.membership_checkout.application_declined_body": "Deine Bewerbung für {tier_name} wurde nicht angenommen. Es wurde nichts abgebucht.",
1124
+ "forge.membership_checkout.application_declined_title": "Bewerbung nicht angenommen",
1125
+ "forge.membership_checkout.application_received_body": "Danke für deine Bewerbung für {tier_name}. Wir schreiben dir eine E-Mail, sobald wir sie geprüft haben.",
1126
+ "forge.membership_checkout.application_received_paid_body": "Danke für deine Bewerbung für {tier_name}. Es wurde nichts abgebucht. Wenn wir deine Bewerbung annehmen, werden {amount} {cycle} von deiner Karte abgebucht und deine Mitgliedschaft beginnt.",
1127
+ "forge.membership_checkout.application_received_title": "Bewerbung eingegangen",
1128
+ "forge.membership_checkout.application_state_approved": "Du wurdest angenommen. Wir richten deine Mitgliedschaft gerade ein.",
1129
+ "forge.membership_checkout.application_state_complete": "Du wurdest angenommen, aber wir konnten deine Karte nicht belasten. Schließe deine Mitgliedschaft unten ab.",
1130
+ "forge.membership_checkout.application_state_declined": "Deine Bewerbung wurde nicht angenommen.",
1131
+ "forge.membership_checkout.application_state_pending": "Deine Bewerbung wird geprüft.",
1132
+ "forge.membership_checkout.application_tier_full_body": "Der letzte Platz wurde vergeben, während deine Karte gespeichert wurde, daher wurde deine Bewerbung geschlossen. Es wurde nichts abgebucht.",
1133
+ "forge.membership_checkout.application_tier_full_title": "{tier_name} ist voll",
1134
+ "forge.membership_checkout.apply": "Bewerben",
1046
1135
  "forge.membership_checkout.back": "Zurück",
1047
1136
  "forge.membership_checkout.billing_cycle_label": "Abrechnung",
1048
1137
  "forge.membership_checkout.billing_monthly": "Monatlich",
@@ -1052,10 +1141,18 @@
1052
1141
  "forge.membership_checkout.billing_yearly_price": "Jährlich ({amount})",
1053
1142
  "forge.membership_checkout.billing_yearly_pwyw": "Zahle was du willst ab {amount}/Jahr",
1054
1143
  "forge.membership_checkout.choose_title": "Mitgliedschaft wählen",
1144
+ "forge.membership_checkout.complete_membership": "Mitgliedschaft abschließen",
1055
1145
  "forge.membership_checkout.confirm_change": "Wechsel bestätigen",
1056
1146
  "forge.membership_checkout.current_plan": "Aktueller Tarif",
1057
1147
  "forge.membership_checkout.empty_title": "Keine Mitgliedschaften verfügbar",
1148
+ "forge.membership_checkout.field_required": "Dieses Feld ist erforderlich",
1058
1149
  "forge.membership_checkout.free": "Kostenlos",
1150
+ "forge.membership_checkout.go_to_account": "Zu deinem Konto",
1151
+ "forge.membership_checkout.invite_dead_body": "Sie ist vielleicht abgelaufen, wurde schon verwendet oder durch eine neuere Einladung ersetzt. Frag uns nach einer neuen.",
1152
+ "forge.membership_checkout.invite_dead_title": "Diese Einladung ist nicht mehr gültig",
1153
+ "forge.membership_checkout.invite_email_mismatch": "Du bist als {signed_in_email} angemeldet. Melde dich mit {email} an, um diese Einladung anzunehmen.",
1154
+ "forge.membership_checkout.invite_for_email": "Diese Einladung gilt für {email}.",
1155
+ "forge.membership_checkout.invite_title": "Du bist eingeladen, {tier_name} beizutreten",
1059
1156
  "forge.membership_checkout.more_benefits": "+{count} weitere",
1060
1157
  "forge.membership_checkout.no_tier_body": "Wähle eine Mitgliedschaft, um fortzufahren.",
1061
1158
  "forge.membership_checkout.on_this_plan": "Du hast diesen Tarif",
@@ -1067,15 +1164,28 @@
1067
1164
  "forge.membership_checkout.pwyw_charged_as": "Ihnen werden {amount} berechnet.",
1068
1165
  "forge.membership_checkout.pwyw_label": "Wie viel möchtest du zahlen?",
1069
1166
  "forge.membership_checkout.pwyw_min": "(mindestens {amount})",
1167
+ "forge.membership_checkout.questions_title": "Ein paar Fragen",
1168
+ "forge.membership_checkout.select_placeholder": "Auswählen…",
1070
1169
  "forge.membership_checkout.select_tier": "Diesen Tarif wählen",
1170
+ "forge.membership_checkout.start_free_trial": "Kostenlos testen",
1071
1171
  "forge.membership_checkout.submit": "Abonnieren",
1072
1172
  "forge.membership_checkout.submitting": "Wird verarbeitet…",
1073
1173
  "forge.membership_checkout.title": "{tier_name} beitreten",
1074
1174
  "forge.membership_checkout.total": "Gesamt",
1175
+ "forge.membership_checkout.trial_card_title": "Starte deine kostenlose Testphase",
1176
+ "forge.membership_checkout.trial_line": "{days} Tage kostenlos testen. Die erste Abbuchung erfolgt am {date}.",
1075
1177
  "forge.membership_checkout.view_memberships": "Mitgliedschaften ansehen",
1076
1178
  "forge.membership_tier_callout.benefits_label": "Vorteile:",
1179
+ "forge.membership_tier_callout.invite_for_email": "Diese Einladung gilt für {email}. Melde dich mit dieser Adresse an oder erstelle damit ein Konto.",
1077
1180
  "forge.membership_tier_callout.join_title": "{tier_name} beitreten",
1078
1181
  "forge.membership_tier_callout.more_benefits": "+{count} weitere Vorteile",
1182
+ "forge.membership_tiers.accept_invite": "Einladung annehmen",
1183
+ "forge.membership_tiers.application_approved": "Angenommen, wird eingerichtet",
1184
+ "forge.membership_tiers.application_declined": "Nicht angenommen",
1185
+ "forge.membership_tiers.application_payment_failed": "Angenommen: Mitgliedschaft abschließen",
1186
+ "forge.membership_tiers.application_pending": "Bewerbung wird geprüft",
1187
+ "forge.membership_tiers.apply": "Bewerben",
1188
+ "forge.membership_tiers.complete_membership": "Mitgliedschaft abschließen",
1079
1189
  "forge.membership_tiers.empty_title": "Keine Mitgliedschaften verfügbar.",
1080
1190
  "forge.membership_tiers.heading": "Mitgliedschaft",
1081
1191
  "forge.membership_tiers.price_free": "Kostenlos",
@@ -1084,6 +1194,11 @@
1084
1194
  "forge.membership_tiers.price_pwyw_yearly": "Zahle was du willst ab {amount}/Jahr",
1085
1195
  "forge.membership_tiers.price_yearly": "{amount}/Jahr",
1086
1196
  "forge.membership_tiers.select": "Wählen",
1197
+ "forge.membership_tiers.start_free_trial": "Kostenlos testen",
1198
+ "forge.membership_tiers.trial_badge": "{days} Tage kostenlos testen",
1199
+ "forge.membership_tiers.withdraw": "Bewerbung zurückziehen",
1200
+ "forge.membership_tiers.withdraw_error": "Wir konnten deine Bewerbung nicht zurückziehen. Bitte versuche es erneut.",
1201
+ "forge.membership_tiers.withdrawing": "Wird zurückgezogen…",
1087
1202
  "forge.offer_button.buy_now": "Jetzt kaufen",
1088
1203
  "forge.offer_button.confirm_email": "E-Mail bestätigen",
1089
1204
  "forge.offer_button.continue_to_payment": "Weiter zur Zahlung",
@@ -1293,4 +1408,4 @@
1293
1408
  "forge.user_menu.create_account": "Konto erstellen",
1294
1409
  "forge.user_menu.log_in": "Anmelden",
1295
1410
  "forge.user_menu.log_out": "Abmelden"
1296
- }
1411
+ }
package/src/i18n/en.json CHANGED
@@ -1,4 +1,19 @@
1
1
  {
2
+ "forge.account_dashboard.application_complete": "Complete your membership",
3
+ "forge.account_dashboard.application_complete_by": "Complete by {date}",
4
+ "forge.account_dashboard.application_status_approved": "Approved, finishing up",
5
+ "forge.account_dashboard.application_status_card_pending": "Card not confirmed yet",
6
+ "forge.account_dashboard.application_status_declined": "Not approved",
7
+ "forge.account_dashboard.application_status_expired": "Expired",
8
+ "forge.account_dashboard.application_status_joined": "Joined",
9
+ "forge.account_dashboard.application_status_payment_failed": "Approved: complete your membership",
10
+ "forge.account_dashboard.application_status_pending": "Application pending",
11
+ "forge.account_dashboard.application_status_withdrawn": "Withdrawn",
12
+ "forge.account_dashboard.application_submitted_on": "Applied on {date}",
13
+ "forge.account_dashboard.application_withdraw": "Withdraw",
14
+ "forge.account_dashboard.application_withdraw_error": "We couldn't withdraw your application. Please try again.",
15
+ "forge.account_dashboard.application_withdrawing": "Withdrawing…",
16
+ "forge.account_dashboard.applications_title": "Your applications",
2
17
  "forge.account_dashboard.billing_portal_error": "We couldn't open the billing page. Please contact us.",
3
18
  "forge.account_dashboard.billing_portal_opening": "Opening…",
4
19
  "forge.account_dashboard.booking_cancel_error": "We could not cancel this session. Please try again.",
@@ -16,6 +31,7 @@
16
31
  "forge.account_dashboard.cancel_confirm_paid": "It will not renew, and you keep your benefits until the end of the period you have paid for.",
17
32
  "forge.account_dashboard.cancel_confirm_paid_until": "It will not renew, and you keep your benefits until {date}.",
18
33
  "forge.account_dashboard.cancel_confirm_title": "Cancel your membership?",
34
+ "forge.account_dashboard.cancel_confirm_trial": "Your free trial will not turn into a paid membership. You keep your benefits until {date}, and nothing is charged.",
19
35
  "forge.account_dashboard.cancel_deletion": "Cancel Deletion",
20
36
  "forge.account_dashboard.cancel_session": "Cancel session",
21
37
  "forge.account_dashboard.cancel_ticket": "Cancel ticket",
@@ -29,6 +45,8 @@
29
45
  "forge.account_dashboard.courses_start": "Start",
30
46
  "forge.account_dashboard.courses_title": "Your courses",
31
47
  "forge.account_dashboard.current_password": "Current password",
48
+ "forge.account_dashboard.cycle_month": "month",
49
+ "forge.account_dashboard.cycle_year": "year",
32
50
  "forge.account_dashboard.data_export_description": "Export a copy of your personal data.",
33
51
  "forge.account_dashboard.data_section_title": "Your Data",
34
52
  "forge.account_dashboard.delete_section_title": "Delete Account",
@@ -50,6 +68,9 @@
50
68
  "forge.account_dashboard.membership_price": "{amount} / {cycle}",
51
69
  "forge.account_dashboard.membership_renews_on": "Renews on {date}",
52
70
  "forge.account_dashboard.membership_title": "Current Membership",
71
+ "forge.account_dashboard.membership_trial_cancelled": "Cancelled. Nothing will be charged.",
72
+ "forge.account_dashboard.membership_trial_then": "Then {amount} per {cycle} from {date}.",
73
+ "forge.account_dashboard.membership_trial_until": "Free trial until {date}",
53
74
  "forge.account_dashboard.new_password": "New password",
54
75
  "forge.account_dashboard.notifications_title": "Notification Types",
55
76
  "forge.account_dashboard.notify_chat_description": "Get notified when new chat messages arrive",
@@ -68,7 +89,16 @@
68
89
  "forge.account_dashboard.profile_update_error": "Failed to update profile.",
69
90
  "forge.account_dashboard.profile_update_success": "Profile updated.",
70
91
  "forge.account_dashboard.rentals_title": "My Rentals",
92
+ "forge.account_dashboard.request_approved": "Request approved",
93
+ "forge.account_dashboard.request_decide_by": "We'll decide by {date}",
94
+ "forge.account_dashboard.request_declined": "Not approved",
71
95
  "forge.account_dashboard.request_deletion": "Request Account Deletion",
96
+ "forge.account_dashboard.request_expired": "Request expired",
97
+ "forge.account_dashboard.request_note": "Our note: {note}",
98
+ "forge.account_dashboard.request_nothing_charged": "Nothing is charged until we approve your request.",
99
+ "forge.account_dashboard.request_payment_failed": "Approved, payment failed",
100
+ "forge.account_dashboard.request_pending": "Request pending",
101
+ "forge.account_dashboard.request_seat_released": "The seat was released. The event may still have tickets available.",
72
102
  "forge.account_dashboard.reschedule": "Reschedule",
73
103
  "forge.account_dashboard.reschedule_empty": "No other times are open in the next two weeks.",
74
104
  "forge.account_dashboard.reschedule_error": "We could not move this session. Please try another time.",
@@ -99,6 +129,7 @@
99
129
  "forge.account_dashboard.tickets_title": "My Tickets",
100
130
  "forge.account_dashboard.title": "My Account",
101
131
  "forge.account_dashboard.total": "Total",
132
+ "forge.account_dashboard.total_on_approval": "Total if approved",
102
133
  "forge.account_dashboard.update_password": "Update Password",
103
134
  "forge.account_dashboard.update_payment_method": "Update payment method",
104
135
  "forge.account_dashboard.update_profile": "Update Profile",
@@ -733,10 +764,20 @@
733
764
  "forge.ended_broadcast.refresh_instruction": "You can keep refreshing this page until the broadcast is live again. Join it and you should be able to watch the event again. You will also get an email when the broadcast is live again.",
734
765
  "forge.ended_broadcast.why_body": "If this happened in the middle of the event, it was most likely caused by an unstable internet connection at the host's end.",
735
766
  "forge.ended_broadcast.why_label": "Why did the broadcast end?",
767
+ "forge.event_confirmation.awaiting_nothing_charged": "Nothing is charged until we approve your request.",
768
+ "forge.event_confirmation.body_awaiting_no_date": "We're reviewing your request and will email you as soon as we've decided.",
769
+ "forge.event_confirmation.body_declined": "We weren't able to approve this request. Nothing has been charged, and any hold on your card has been released.",
770
+ "forge.event_confirmation.body_expired": "We didn't get to your request in time, so it has expired. Nothing has been charged, and any hold on your card has been released.",
736
771
  "forge.event_confirmation.body_incomplete": "Your order is {status}. If you were charged, contact support.",
737
772
  "forge.event_confirmation.body_paid": "We’ve sent your tickets to {email}.",
773
+ "forge.event_confirmation.body_request_payment_failed": "We approved your request but your card could not be charged, so the seat was released. Seats may still be available.",
774
+ "forge.event_confirmation.buy_again": "Buy again",
738
775
  "forge.event_confirmation.explore": "Browse more events",
776
+ "forge.event_confirmation.eyebrow_awaiting": "Request received",
777
+ "forge.event_confirmation.eyebrow_declined": "Not approved",
778
+ "forge.event_confirmation.eyebrow_expired": "Request expired",
739
779
  "forge.event_confirmation.eyebrow_paid": "E-Ticket",
780
+ "forge.event_confirmation.eyebrow_request_payment_failed": "Payment failed",
740
781
  "forge.event_confirmation.eyebrow_status": "Order {status}",
741
782
  "forge.event_confirmation.loading": "Finalizing your order…",
742
783
  "forge.event_confirmation.not_found": "We couldn’t find your order.",
@@ -746,10 +787,16 @@
746
787
  "forge.event_confirmation.tax": "Tax",
747
788
  "forge.event_confirmation.tax_included": "Includes {amount} tax",
748
789
  "forge.event_confirmation.tickets_heading": "Tickets",
790
+ "forge.event_confirmation.title_awaiting": "Your request is in",
791
+ "forge.event_confirmation.title_declined": "Your request was not approved",
792
+ "forge.event_confirmation.title_expired": "Your request has expired",
749
793
  "forge.event_confirmation.title_incomplete": "Order not completed",
750
794
  "forge.event_confirmation.title_paid": "You’re going! 🎟",
795
+ "forge.event_confirmation.title_request_payment_failed": "Approved, but the payment did not go through",
751
796
  "forge.event_confirmation.total": "Total",
797
+ "forge.event_confirmation.total_on_approval": "Total if approved",
752
798
  "forge.event_confirmation.total_paid": "Total paid",
799
+ "forge.event_confirmation.view_event": "View event",
753
800
  "forge.event_confirmation.virtual_location": "Virtual event",
754
801
  "forge.event_countdown.past": "This event has passed",
755
802
  "forge.event_countdown.unit_days": "Days",
@@ -769,11 +816,20 @@
769
816
  "forge.event_series_detail.status_cancelled": "Cancelled",
770
817
  "forge.event_series_detail.status_sold_out": "Sold out",
771
818
  "forge.event_tickets.add_to_cart": "Add to cart",
819
+ "forge.event_tickets.approval_badge": "Approval required",
820
+ "forge.event_tickets.approval_help_body": "We review who gets this ticket. Your card is held, not charged, and the seat is yours while we decide. If we approve, the card is charged and your tickets are sent. If we decline, or the request expires, the hold is released and nothing is charged.",
821
+ "forge.event_tickets.approval_help_label": "What does approval required mean?",
822
+ "forge.event_tickets.approval_mix_blocked": "Can't be added to your current selection",
823
+ "forge.event_tickets.approval_mix_help_body": "Tickets that need our approval are requested on their own, so one order is either a request or a purchase, never both. Remove the tickets you have selected to add this one.",
824
+ "forge.event_tickets.approval_mix_help_label": "Why can't these tickets be combined?",
772
825
  "forge.event_tickets.aria_close": "Close",
773
826
  "forge.event_tickets.attendee_is_you": "(that’s you)",
774
827
  "forge.event_tickets.attendee_name_placeholder": "Full name",
775
828
  "forge.event_tickets.attendees_description": "This event prints each attendee’s name on their own pass, so the door list matches who actually turns up.",
776
829
  "forge.event_tickets.attendees_title": "Who is coming?",
830
+ "forge.event_tickets.authorize": "Authorize {amount}",
831
+ "forge.event_tickets.authorize_subtitle": "Your request reaches us once your card is authorized.",
832
+ "forge.event_tickets.authorize_title": "Authorize your card",
777
833
  "forge.event_tickets.back": "Back",
778
834
  "forge.event_tickets.booking_fee": "Booking fee",
779
835
  "forge.event_tickets.checkout_tickets_only": "Checkout tickets only",
@@ -782,6 +838,8 @@
782
838
  "forge.event_tickets.continue": "Continue",
783
839
  "forge.event_tickets.continue_addons": "Continue to add-ons",
784
840
  "forge.event_tickets.continue_payment": "Continue to payment",
841
+ "forge.event_tickets.deferred_charged_on_approval": "Your card is only charged if we approve your request.",
842
+ "forge.event_tickets.deferred_hold_on_statement": "Until then a temporary hold will show on your statement.",
785
843
  "forge.event_tickets.details_title": "Your details",
786
844
  "forge.event_tickets.email_mismatch": "Email addresses do not match",
787
845
  "forge.event_tickets.email_placeholder": "Email",
@@ -824,6 +882,7 @@
824
882
  "forge.event_tickets.pwyw_range_min": "(minimum {min})",
825
883
  "forge.event_tickets.pwyw_range_min_max": "(minimum {min}, up to {max})",
826
884
  "forge.event_tickets.remove_discount": "Remove discount",
885
+ "forge.event_tickets.request_tickets": "Request tickets",
827
886
  "forge.event_tickets.select_option": "Select…",
828
887
  "forge.event_tickets.select_title": "Select Tickets",
829
888
  "forge.event_tickets.subtotal": "Subtotal",
@@ -964,6 +1023,17 @@
964
1023
  "forge.film_watch.unavailable": "This episode cannot be played right now.",
965
1024
  "forge.film_watch.up_next": "Up next: {title}",
966
1025
  "forge.film_watch.window_not_started": "Your window starts now.",
1026
+ "forge.forge_stripe_payment.authorize": "Authorize {amount}",
1027
+ "forge.forge_stripe_payment.cycle_month": "month",
1028
+ "forge.forge_stripe_payment.cycle_year": "year",
1029
+ "forge.forge_stripe_payment.deferred_charged_on_approval": "Your card is only charged if we approve your request.",
1030
+ "forge.forge_stripe_payment.deferred_hold_on_statement": "Until then a temporary hold will show on your statement.",
1031
+ "forge.forge_stripe_payment.setup_charged_on_approval": "Nothing is charged now. We will only charge this card if we approve your application, and then at the amount shown ({amount}).",
1032
+ "forge.forge_stripe_payment.setup_failed": "We couldn't save your card. Please try again.",
1033
+ "forge.forge_stripe_payment.setup_incomplete": "Your card was not saved. Please try again.",
1034
+ "forge.forge_stripe_payment.start_free_trial": "Start free trial",
1035
+ "forge.forge_stripe_payment.submit_application": "Submit application",
1036
+ "forge.forge_stripe_payment.trial_consent": "Nothing is charged today. {amount} per {cycle} from {date}. Cancel before then and you will not be charged.",
967
1037
  "forge.forgot_password_form.back_to_login": "Back to login",
968
1038
  "forge.forgot_password_form.email_label": "Email",
969
1039
  "forge.forgot_password_form.email_placeholder": "Email",
@@ -1041,8 +1111,27 @@
1041
1111
  "forge.login_form.verify_submit": "Verify & Sign In",
1042
1112
  "forge.login_form.verify_title": "Verify your email",
1043
1113
  "forge.login_form.verifying": "Verifying…",
1114
+ "forge.membership_checkout.accept_invite": "Accept invite",
1044
1115
  "forge.membership_checkout.amount_below_minimum": "Enter {minimum} or more.",
1045
1116
  "forge.membership_checkout.amount_not_positive": "Enter an amount greater than zero.",
1117
+ "forge.membership_checkout.answer_required": "Please answer: {question}",
1118
+ "forge.membership_checkout.application_approved_body": "Your application to {tier_name} was approved. Your membership is being set up.",
1119
+ "forge.membership_checkout.application_approved_title": "You're approved",
1120
+ "forge.membership_checkout.application_card_title": "Your card",
1121
+ "forge.membership_checkout.application_closed_body": "Your application to {tier_name} is closed. Nothing was charged.",
1122
+ "forge.membership_checkout.application_closed_title": "Application closed",
1123
+ "forge.membership_checkout.application_declined_body": "Your application to {tier_name} was not approved. Nothing was charged.",
1124
+ "forge.membership_checkout.application_declined_title": "Application not approved",
1125
+ "forge.membership_checkout.application_received_body": "Thanks for applying to {tier_name}. We'll email you once we've reviewed your application.",
1126
+ "forge.membership_checkout.application_received_paid_body": "Thanks for applying to {tier_name}. Nothing has been charged. If we approve your application, {amount} {cycle} will be charged to your card and your membership starts then.",
1127
+ "forge.membership_checkout.application_received_title": "Application received",
1128
+ "forge.membership_checkout.application_state_approved": "You're approved. We're finishing setting up your membership.",
1129
+ "forge.membership_checkout.application_state_complete": "You're approved, but we couldn't charge your card. Complete your membership below.",
1130
+ "forge.membership_checkout.application_state_declined": "Your application was not approved.",
1131
+ "forge.membership_checkout.application_state_pending": "Your application is pending.",
1132
+ "forge.membership_checkout.application_tier_full_body": "The last place was taken while your card was being saved, so your application was closed. Nothing was charged.",
1133
+ "forge.membership_checkout.application_tier_full_title": "{tier_name} is full",
1134
+ "forge.membership_checkout.apply": "Apply to join",
1046
1135
  "forge.membership_checkout.back": "Back",
1047
1136
  "forge.membership_checkout.billing_cycle_label": "Billing cycle",
1048
1137
  "forge.membership_checkout.billing_monthly": "Monthly",
@@ -1052,10 +1141,18 @@
1052
1141
  "forge.membership_checkout.billing_yearly_price": "Yearly ({amount})",
1053
1142
  "forge.membership_checkout.billing_yearly_pwyw": "Pay what you want from {amount}/yr",
1054
1143
  "forge.membership_checkout.choose_title": "Choose your membership",
1144
+ "forge.membership_checkout.complete_membership": "Complete your membership",
1055
1145
  "forge.membership_checkout.confirm_change": "Confirm change",
1056
1146
  "forge.membership_checkout.current_plan": "Current plan",
1057
1147
  "forge.membership_checkout.empty_title": "No memberships available",
1148
+ "forge.membership_checkout.field_required": "This field is required",
1058
1149
  "forge.membership_checkout.free": "Free",
1150
+ "forge.membership_checkout.go_to_account": "Go to your account",
1151
+ "forge.membership_checkout.invite_dead_body": "It may have expired, been used already, or been replaced by a newer invite. Ask us for a new one.",
1152
+ "forge.membership_checkout.invite_dead_title": "This invite is no longer valid",
1153
+ "forge.membership_checkout.invite_email_mismatch": "You're signed in as {signed_in_email}. Sign in with {email} to accept this invite.",
1154
+ "forge.membership_checkout.invite_for_email": "This invite is for {email}.",
1155
+ "forge.membership_checkout.invite_title": "You're invited to join {tier_name}",
1059
1156
  "forge.membership_checkout.more_benefits": "+{count} more",
1060
1157
  "forge.membership_checkout.no_tier_body": "Select a membership tier to continue.",
1061
1158
  "forge.membership_checkout.on_this_plan": "You are on this plan",
@@ -1067,15 +1164,28 @@
1067
1164
  "forge.membership_checkout.pwyw_charged_as": "You will be charged {amount}.",
1068
1165
  "forge.membership_checkout.pwyw_label": "How much would you like to pay?",
1069
1166
  "forge.membership_checkout.pwyw_min": "(minimum {amount})",
1167
+ "forge.membership_checkout.questions_title": "A few questions",
1168
+ "forge.membership_checkout.select_placeholder": "Select…",
1070
1169
  "forge.membership_checkout.select_tier": "Select this tier",
1170
+ "forge.membership_checkout.start_free_trial": "Start free trial",
1071
1171
  "forge.membership_checkout.submit": "Subscribe",
1072
1172
  "forge.membership_checkout.submitting": "Processing…",
1073
1173
  "forge.membership_checkout.title": "Join {tier_name}",
1074
1174
  "forge.membership_checkout.total": "Total",
1175
+ "forge.membership_checkout.trial_card_title": "Start your free trial",
1176
+ "forge.membership_checkout.trial_line": "{days}-day free trial. Your first charge is on {date}.",
1075
1177
  "forge.membership_checkout.view_memberships": "View memberships",
1076
1178
  "forge.membership_tier_callout.benefits_label": "Benefits:",
1179
+ "forge.membership_tier_callout.invite_for_email": "This invite is for {email}. Sign in or create an account with that address.",
1077
1180
  "forge.membership_tier_callout.join_title": "Join {tier_name}",
1078
1181
  "forge.membership_tier_callout.more_benefits": "+{count} more benefits",
1182
+ "forge.membership_tiers.accept_invite": "Accept invite",
1183
+ "forge.membership_tiers.application_approved": "Approved, finishing up",
1184
+ "forge.membership_tiers.application_declined": "Not approved",
1185
+ "forge.membership_tiers.application_payment_failed": "Approved: complete your membership",
1186
+ "forge.membership_tiers.application_pending": "Application pending",
1187
+ "forge.membership_tiers.apply": "Apply to join",
1188
+ "forge.membership_tiers.complete_membership": "Complete your membership",
1079
1189
  "forge.membership_tiers.empty_title": "No membership tiers available.",
1080
1190
  "forge.membership_tiers.heading": "Membership",
1081
1191
  "forge.membership_tiers.price_free": "Free",
@@ -1084,6 +1194,11 @@
1084
1194
  "forge.membership_tiers.price_pwyw_yearly": "Pay what you want from {amount}/yr",
1085
1195
  "forge.membership_tiers.price_yearly": "{amount}/yr",
1086
1196
  "forge.membership_tiers.select": "Select",
1197
+ "forge.membership_tiers.start_free_trial": "Start free trial",
1198
+ "forge.membership_tiers.trial_badge": "{days}-day free trial",
1199
+ "forge.membership_tiers.withdraw": "Withdraw application",
1200
+ "forge.membership_tiers.withdraw_error": "We couldn't withdraw your application. Please try again.",
1201
+ "forge.membership_tiers.withdrawing": "Withdrawing…",
1087
1202
  "forge.offer_button.buy_now": "Buy now",
1088
1203
  "forge.offer_button.confirm_email": "Confirm email",
1089
1204
  "forge.offer_button.continue_to_payment": "Continue to payment",
@@ -1293,4 +1408,4 @@
1293
1408
  "forge.user_menu.create_account": "Create account",
1294
1409
  "forge.user_menu.log_in": "Log in",
1295
1410
  "forge.user_menu.log_out": "Log out"
1296
- }
1411
+ }
package/src/i18n/index.ts CHANGED
@@ -6,7 +6,8 @@
6
6
  // Key naming is fixed by ./CONVENTION.md. Every key starts with "forge." so a
7
7
  // tenant's own copy can never collide with the package's.
8
8
 
9
- import { createContext, createElement, useContext, useMemo, type ReactNode } from "react";
9
+ import { createElement, useContext, useMemo, type ReactNode } from "react";
10
+ import { createSharedContext } from "../runtime/registry";
10
11
  import enMessages from "./en.json";
11
12
  import deMessages from "./de.json";
12
13
 
@@ -73,7 +74,7 @@ export function getForgeMessages(locale: ForgeLocale): ForgeMessages {
73
74
  }
74
75
 
75
76
  // `null` means "no provider above me", which is a supported state, not a bug.
76
- const ForgeI18nContext = createContext<ForgeLocale | null>(null);
77
+ const ForgeI18nContext = createSharedContext<ForgeLocale | null>("i18n", null);
77
78
 
78
79
  export interface ForgeI18nProviderProps {
79
80
  /**
package/src/index.ts CHANGED
@@ -71,9 +71,11 @@ export { safeRedirectPath } from "./utils/safeRedirect";
71
71
  export {
72
72
  getTicketOrderOutcome,
73
73
  isTicketOrderRefunded,
74
+ ticketRequestFailureKind,
74
75
  TICKET_ORDER_REFUNDED_COPY,
75
76
  type TicketOrderOutcome,
76
77
  type TicketOrderOutcomeInput,
78
+ type TicketRequestFailureKind,
77
79
  } from "./utils/ticketOrderOutcome";
78
80
  // App-user auth (mini-apps) + the /admin guard.
79
81
  export {
@@ -180,3 +182,23 @@ export * from "./utils/formatDateTime";
180
182
  // The ONE membership access predicate + the messaging that is deliberately
181
183
  // separate from it. Every surface that gates on a membership imports from here.
182
184
  export * from "./utils/membershipAccess";
185
+
186
+ // Hosted internal pages. `/i/*` is published once and rendered through the
187
+ // catch-all route on every site, so a fix reaches every fan without a rebuild.
188
+ // `internalLink` / `internalPath` are how anything links into those pages now:
189
+ // a literal `/i/...` path no longer type-checks, because the per-page route
190
+ // files it referred to are gone. See docs/proposals/hosted-internal-pages-initiative.md.
191
+ export * from "./runtime/pages";
192
+ export * from "./runtime/pagesClient";
193
+ export * from "./runtime/RemotePage";
194
+ // The runtime a site shares with the hosted pages bundle. A site never calls
195
+ // these; the chassis catch-all registers the router and TribeNestApp does the
196
+ // rest. Exported because the bundle reads them from the published package.
197
+ export {
198
+ PAGES_RUNTIME_CONTRACT,
199
+ createSharedContext,
200
+ missingRuntimeKeys,
201
+ readRuntimeValue,
202
+ shareRuntimeValue,
203
+ } from "./runtime/registry";
204
+ export { RUNTIME_KEYS, REQUIRED_RUNTIME_KEYS, registerRouterRuntime, hostQueryClient } from "./runtime/hostRuntime";
@@ -1,5 +1,6 @@
1
1
  import { useState, type ReactNode } from "react";
2
2
  import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
3
+ import { registerQueryClient } from "../runtime/hostRuntime";
3
4
  import { ForgeClientProvider } from "./ForgeProvider";
4
5
  import { SiteConfigProvider } from "./SiteConfigProvider";
5
6
  import { ForgeContentProvider } from "../content/ForgeContentProvider";
@@ -127,7 +128,13 @@ export function ForgeProvider({
127
128
  children,
128
129
  }: ForgeProviderProps) {
129
130
  // One client per provider instance (per SSR request), unless the host supplies one.
130
- const [client] = useState(() => queryClient ?? new QueryClient());
131
+ const [client] = useState(() => {
132
+ const created = queryClient ?? new QueryClient();
133
+ // So a hosted `/i/*` page shares this cache rather than opening its own.
134
+ // No-ops on the server, where one global would span requests.
135
+ registerQueryClient(created);
136
+ return created;
137
+ });
131
138
 
132
139
  return (
133
140
  <ForgeClientProvider
@@ -1,4 +1,5 @@
1
- import { createContext, useCallback, useContext, useMemo, useRef, useState } from "react";
1
+ import { useCallback, useContext, useMemo, useRef, useState } from "react";
2
+ import { createSharedContext } from "../runtime/registry";
2
3
  import type { AxiosInstance } from "axios";
3
4
  import { createForgeClient } from "../client/createForgeClient";
4
5
  import {
@@ -38,7 +39,7 @@ export interface ForgeContextValue {
38
39
  setToken: (token: string | null) => void;
39
40
  }
40
41
 
41
- const ForgeContext = createContext<ForgeContextValue | null>(null);
42
+ const ForgeContext = createSharedContext<ForgeContextValue | null>("forgeClient", null);
42
43
 
43
44
  export interface ForgeClientProviderProps {
44
45
  apiUrl: string;