@firecms/core 3.4.0-canary.cb27f16 → 3.4.0-canary.ce97da7

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 (88) hide show
  1. package/README.md +4 -0
  2. package/dist/components/ErrorBoundary.d.ts +1 -3
  3. package/dist/components/LicenseBanner.d.ts +23 -0
  4. package/dist/components/index.d.ts +1 -0
  5. package/dist/contexts/LicenseStatusContext.d.ts +16 -0
  6. package/dist/core/index.d.ts +1 -0
  7. package/dist/core/plugin_translations.d.ts +38 -0
  8. package/dist/core/pro_plugins.d.ts +40 -0
  9. package/dist/de-DMp6cIY1.js +702 -0
  10. package/dist/de-DMp6cIY1.js.map +1 -0
  11. package/dist/editor/extensions/Image.d.ts +11 -0
  12. package/dist/editor/index.d.ts +2 -1
  13. package/dist/editor/lazy_editor.d.ts +6 -0
  14. package/dist/editor-BSo_aS1I.js +4563 -0
  15. package/dist/editor-BSo_aS1I.js.map +1 -0
  16. package/dist/fr-Cckz4IkR.js +702 -0
  17. package/dist/fr-Cckz4IkR.js.map +1 -0
  18. package/dist/hi-CDCoIqbu.js +702 -0
  19. package/dist/hi-CDCoIqbu.js.map +1 -0
  20. package/dist/hooks/index.d.ts +2 -0
  21. package/dist/hooks/useLicenseStatus.d.ts +16 -0
  22. package/dist/hooks/useProjectLog.d.ts +11 -6
  23. package/dist/hooks/useTranslation.d.ts +1 -1
  24. package/dist/index.es.js +7938 -15928
  25. package/dist/index.es.js.map +1 -1
  26. package/dist/index.umd.js +7710 -6925
  27. package/dist/index.umd.js.map +1 -1
  28. package/dist/it-BJCUqixj.js +702 -0
  29. package/dist/it-BJCUqixj.js.map +1 -0
  30. package/dist/pl-DgT_joFf.js +704 -0
  31. package/dist/pl-DgT_joFf.js.map +1 -0
  32. package/dist/pt-B3dN3x0X.js +704 -0
  33. package/dist/pt-B3dN3x0X.js.map +1 -0
  34. package/dist/types/analytics.d.ts +1 -1
  35. package/dist/types/firecms.d.ts +18 -1
  36. package/dist/types/firecms_context.d.ts +8 -0
  37. package/dist/types/index.d.ts +1 -0
  38. package/dist/types/license.d.ts +54 -0
  39. package/dist/types/plugins.d.ts +9 -1
  40. package/dist/types/translations.d.ts +35 -2
  41. package/dist/util/date_fns_locales.d.ts +18 -0
  42. package/dist/util/index.d.ts +1 -0
  43. package/dist/util/lazy_eager.d.ts +3 -3
  44. package/package.json +4 -4
  45. package/src/app/Scaffold.tsx +7 -0
  46. package/src/components/ErrorBoundary.tsx +12 -18
  47. package/src/components/LicenseBanner.tsx +209 -0
  48. package/src/components/index.tsx +1 -0
  49. package/src/contexts/LicenseStatusContext.tsx +50 -0
  50. package/src/core/DefaultAppBar.tsx +28 -16
  51. package/src/core/FireCMS.tsx +73 -47
  52. package/src/core/SideDialogs.tsx +44 -1
  53. package/src/core/index.tsx +1 -0
  54. package/src/core/plugin_translations.ts +87 -0
  55. package/src/core/pro_plugins.ts +79 -0
  56. package/src/editor/components/SlashCommandMenu.tsx +4 -1
  57. package/src/editor/extensions/Image.ts +17 -1
  58. package/src/editor/hooks/useProseMirror.ts +5 -0
  59. package/src/editor/index.ts +11 -1
  60. package/src/editor/lazy_editor.tsx +33 -0
  61. package/src/hooks/index.tsx +2 -0
  62. package/src/hooks/useBuildNavigationController.tsx +47 -7
  63. package/src/hooks/useFireCMSContext.tsx +7 -3
  64. package/src/hooks/useLicenseStatus.tsx +32 -0
  65. package/src/hooks/useProjectLog.tsx +27 -9
  66. package/src/hooks/useTranslation.ts +3 -1
  67. package/src/i18n/FireCMSi18nProvider.tsx +164 -34
  68. package/src/locales/de.ts +18 -2
  69. package/src/locales/en.ts +21 -3
  70. package/src/locales/es.ts +18 -2
  71. package/src/locales/fr.ts +18 -2
  72. package/src/locales/hi.ts +18 -2
  73. package/src/locales/it.ts +18 -2
  74. package/src/locales/pl.ts +18 -2
  75. package/src/locales/pt.ts +18 -2
  76. package/src/preview/components/DatePreview.tsx +2 -4
  77. package/src/types/analytics.ts +3 -0
  78. package/src/types/firecms.tsx +19 -1
  79. package/src/types/firecms_context.tsx +9 -0
  80. package/src/types/index.ts +1 -0
  81. package/src/types/license.ts +62 -0
  82. package/src/types/plugins.tsx +10 -1
  83. package/src/types/translations.ts +35 -2
  84. package/src/util/date_fns_locales.ts +168 -0
  85. package/src/util/index.ts +1 -0
  86. package/src/util/lazy_eager.tsx +30 -8
  87. package/src/util/navigation_utils.ts +6 -1
  88. package/src/util/useStorageUploadController.tsx +6 -1
@@ -3,16 +3,74 @@ import i18next, { i18n } from "i18next";
3
3
  import { I18nContext, I18nextProvider, initReactI18next } from "react-i18next";
4
4
  import { en } from "../locales/en";
5
5
  import { es } from "../locales/es";
6
- import { de } from "../locales/de";
7
- import { fr } from "../locales/fr";
8
- import { it } from "../locales/it";
9
- import { hi } from "../locales/hi";
10
- import { pt } from "../locales/pt";
11
- import { pl } from "../locales/pl";
12
6
  import { FireCMSTranslations } from "../types/translations";
13
7
 
14
8
  const FIRECMS_NS = "firecms_core";
15
9
 
10
+ /**
11
+ * Translations that are not part of the bundle every app downloads.
12
+ *
13
+ * All eight locales used to be imported statically, which put ~305KB of strings
14
+ * — every language, for every user — into `@firecms/core` and therefore onto the
15
+ * startup path of every FireCMS app. Only the active language is ever read.
16
+ *
17
+ * `en` and `es` stay static: `en` is the fallback language and the base every
18
+ * unknown locale is seeded from, and both are re-exported from the package root,
19
+ * so a consumer may be importing them by name.
20
+ *
21
+ * The specifiers are written out rather than built from a template so bundlers
22
+ * can see them and emit one chunk per locale.
23
+ */
24
+ const localeLoaders: Record<string, () => Promise<FireCMSTranslations>> = {
25
+ de: () => import("../locales/de").then((m) => m.de),
26
+ fr: () => import("../locales/fr").then((m) => m.fr),
27
+ it: () => import("../locales/it").then((m) => m.it),
28
+ hi: () => import("../locales/hi").then((m) => m.hi),
29
+ pt: () => import("../locales/pt").then((m) => m.pt),
30
+ pl: () => import("../locales/pl").then((m) => m.pl)
31
+ };
32
+
33
+ /**
34
+ * Locale bundles available synchronously: the two static ones plus anything a
35
+ * previous provider already fetched. `buildResources` reads this, so a rebuild
36
+ * triggered by a changing `translations` prop cannot overwrite a lazily loaded
37
+ * language with the English base it would otherwise fall back to.
38
+ */
39
+ const loadedLocales: Record<string, FireCMSTranslations> = {
40
+ en,
41
+ es
42
+ };
43
+
44
+ const inFlightLocales: Record<string, Promise<void>> = {};
45
+
46
+ /**
47
+ * Fetch a locale bundle into `loadedLocales`.
48
+ *
49
+ * Returns undefined when the bundle is already in memory or there is nothing to
50
+ * fetch, so callers can stay synchronous in the common case.
51
+ */
52
+ function loadLocale(locale?: string): Promise<void> | undefined {
53
+ if (!locale) return undefined;
54
+ const language = locale.split("-")[0];
55
+ if (loadedLocales[language]) return undefined;
56
+ const loader = localeLoaders[language];
57
+ if (!loader) return undefined;
58
+ if (!inFlightLocales[language]) {
59
+ inFlightLocales[language] = loader()
60
+ .then((bundle) => {
61
+ loadedLocales[language] = bundle;
62
+ })
63
+ .catch(() => {
64
+ // A locale that fails to load falls back to English, which is
65
+ // what an unknown locale has always done.
66
+ })
67
+ .finally(() => {
68
+ delete inFlightLocales[language];
69
+ });
70
+ }
71
+ return inFlightLocales[language];
72
+ }
73
+
16
74
  export const FIRECMS_LOCALE_STORAGE_KEY = "firecms_locale";
17
75
 
18
76
  /** DeepPartial helper — allows partial overrides at any nesting level */
@@ -76,20 +134,7 @@ export function FireCMSi18nProvider({
76
134
 
77
135
  // English baseline + this provider's overrides, with anything the parent
78
136
  // already resolved layered in underneath the overrides.
79
- const resources = buildResources(translations);
80
- if (parentInstance) {
81
- const inherited: Record<string, any> = parentInstance.services?.resourceStore?.data ?? {};
82
- for (const [lang, namespaces] of Object.entries(inherited)) {
83
- const bundle = (namespaces as any)?.[FIRECMS_NS];
84
- if (!bundle) continue;
85
- resources[lang] = {
86
- [FIRECMS_NS]: {
87
- ...bundle,
88
- ...(translations?.[lang] ?? {})
89
- }
90
- };
91
- }
92
- }
137
+ const resources = buildResourcesWithParent(translations, parentInstance);
93
138
 
94
139
  let initialLocale = parentInstance?.language ?? locale;
95
140
  if (typeof window !== "undefined") {
@@ -97,6 +142,10 @@ export function FireCMSi18nProvider({
97
142
  if (stored) initialLocale = stored;
98
143
  }
99
144
 
145
+ // Kicked off before init so the request is in flight while i18next sets
146
+ // itself up, rather than after it.
147
+ const pendingInitialLocale = loadLocale(initialLocale);
148
+
100
149
  instance
101
150
  .use(initReactI18next)
102
151
  .init({
@@ -109,14 +158,37 @@ export function FireCMSi18nProvider({
109
158
  // React already escapes — don't double-escape
110
159
  escapeValue: false,
111
160
  },
161
+ react: {
162
+ // Locale bundles now arrive after init, and a bundle landing
163
+ // in the store raises an `added` event rather than
164
+ // `languageChanged`. react-i18next binds only the latter by
165
+ // default, so without this a language switched from the
166
+ // toggle would fetch its strings, put them in the store, and
167
+ // leave the UI sitting on the English fallback.
168
+ bindI18nStore: "added"
169
+ },
112
170
  }, () => {
113
- setReady(true);
171
+ if (!pendingInitialLocale) {
172
+ setReady(true);
173
+ return;
174
+ }
175
+ // Holding the first render until the active language has arrived
176
+ // keeps a non-English user from seeing English strings repaint.
177
+ // Only locales outside the static pair wait, and only on the
178
+ // first mount.
179
+ pendingInitialLocale.then(() => {
180
+ applyLoadedLocale(instance, initialLocale, translations, parentInstance);
181
+ setReady(true);
182
+ });
114
183
  });
115
184
 
116
185
  instance.on("languageChanged", (lng) => {
117
186
  if (typeof window !== "undefined") {
118
187
  localStorage.setItem(FIRECMS_LOCALE_STORAGE_KEY, lng);
119
188
  }
189
+ // Switching to a language whose bundle has not been fetched yet
190
+ // renders the English fallback until it lands.
191
+ loadLocale(lng)?.then(() => applyLoadedLocale(instance, lng, translations, parentInstance));
120
192
  });
121
193
 
122
194
  i18nRef.current = instance;
@@ -145,10 +217,16 @@ export function FireCMSi18nProvider({
145
217
  }
146
218
  }, [locale]);
147
219
 
148
- // When consumer translations prop changes, update the resource bundles
220
+ // When consumer translations prop changes, update the resource bundles.
221
+ //
222
+ // Built through the same layering as the initial instance, parent included.
223
+ // Rebuilding from the bare English baseline here would overwrite whatever the
224
+ // host registered — a nested provider without translations of its own would
225
+ // reset the host's overrides to the built-in strings. That was already true;
226
+ // it was simply invisible until `bindI18nStore` made a store write repaint.
149
227
  useEffect(() => {
150
228
  if (!i18nRef.current) return;
151
- const resources = buildResources(translations);
229
+ const resources = buildResourcesWithParent(translations, parentInstance);
152
230
  for (const [lang, bundle] of Object.entries(resources)) {
153
231
  i18nRef.current.addResourceBundle(
154
232
  lang,
@@ -158,7 +236,7 @@ export function FireCMSi18nProvider({
158
236
  true // overwrite existing keys
159
237
  );
160
238
  }
161
- }, [translations]);
239
+ }, [translations, parentInstance]);
162
240
 
163
241
  if (!ready || !i18nRef.current) return null;
164
242
 
@@ -169,6 +247,64 @@ export function FireCMSi18nProvider({
169
247
  );
170
248
  }
171
249
 
250
+ /**
251
+ * Push a lazily loaded locale bundle into a live i18next instance.
252
+ *
253
+ * Consumer overrides are re-applied on top, because the instance may already be
254
+ * holding a bundle that `buildResources` seeded from English for this language,
255
+ * and the real translations have to win over that seed while the overrides win
256
+ * over both.
257
+ */
258
+ function applyLoadedLocale(
259
+ instance: i18n,
260
+ locale: string,
261
+ translations?: { [locale: string]: DeepPartial<FireCMSTranslations> },
262
+ parentInstance?: i18n
263
+ ) {
264
+ const language = locale.split("-")[0];
265
+ if (!loadedLocales[language]) return;
266
+ const bundle = buildResourcesWithParent(translations, parentInstance)[language]?.[FIRECMS_NS];
267
+ if (!bundle) return;
268
+ instance.addResourceBundle(
269
+ language,
270
+ FIRECMS_NS,
271
+ bundle,
272
+ true, // deep merge
273
+ true // overwrite the English seed
274
+ );
275
+ }
276
+
277
+ /**
278
+ * The full resource map for this provider: the locale bundles currently in
279
+ * memory, then anything the parent provider already resolved, then this
280
+ * provider's own overrides on top.
281
+ *
282
+ * Shared by every path that writes into the instance — initial construction, a
283
+ * changed `translations` prop, and a locale arriving late — so all three layer
284
+ * in the same order and none of them can undo another.
285
+ */
286
+ function buildResourcesWithParent(
287
+ translations?: { [locale: string]: DeepPartial<FireCMSTranslations> },
288
+ parentInstance?: i18n
289
+ ): Record<string, Record<string, object>> {
290
+ const resources = buildResources(translations);
291
+ if (!parentInstance) return resources;
292
+
293
+ const inherited: Record<string, any> = parentInstance.services?.resourceStore?.data ?? {};
294
+ for (const [lang, namespaces] of Object.entries(inherited)) {
295
+ const bundle = (namespaces as any)?.[FIRECMS_NS];
296
+ if (!bundle) continue;
297
+ resources[lang] = {
298
+ [FIRECMS_NS]: {
299
+ ...(resources[lang]?.[FIRECMS_NS] ?? {}),
300
+ ...bundle,
301
+ ...(translations?.[lang] ?? {})
302
+ }
303
+ };
304
+ }
305
+ return resources;
306
+ }
307
+
172
308
  /**
173
309
  * Build an i18next resources object from the English baseline plus any
174
310
  * consumer-provided overrides.
@@ -176,16 +312,10 @@ export function FireCMSi18nProvider({
176
312
  function buildResources(
177
313
  translations?: { [locale: string]: DeepPartial<FireCMSTranslations> }
178
314
  ): Record<string, Record<string, object>> {
179
- const resources: Record<string, Record<string, object>> = {
180
- en: { [FIRECMS_NS]: { ...en } },
181
- es: { [FIRECMS_NS]: { ...es } },
182
- de: { [FIRECMS_NS]: { ...de } },
183
- fr: { [FIRECMS_NS]: { ...fr } },
184
- it: { [FIRECMS_NS]: { ...it } },
185
- hi: { [FIRECMS_NS]: { ...hi } },
186
- pt: { [FIRECMS_NS]: { ...pt } },
187
- pl: { [FIRECMS_NS]: { ...pl } },
188
- };
315
+ const resources: Record<string, Record<string, object>> = {};
316
+ for (const [lang, bundle] of Object.entries(loadedLocales)) {
317
+ resources[lang] = { [FIRECMS_NS]: { ...bundle } };
318
+ }
189
319
 
190
320
  if (!translations) return resources;
191
321
 
package/src/locales/de.ts CHANGED
@@ -65,8 +65,19 @@ export const de: FireCMSTranslations = {
65
65
  select_from: "Aus {{name}} auswählen",
66
66
  done: "Fertig",
67
67
  log_out: "Abmelden",
68
- license_needed: "Lizenz erforderlich",
69
- license_description: "Sie benötigen eine gültige Lizenz, um FireCMS PRO zu verwenden. Bitte wenden Sie sich an {{email}} für weitere Informationen.",
68
+ license_trial_banner: "FireCMS PRO-Testphase: noch {{days}} Tage in Produktion.",
69
+ license_trial_banner_one: "FireCMS PRO-Testphase: noch {{days}} Tag in Produktion.",
70
+ license_expired_banner: "Ihre PRO-Testphase ist am {{date}} abgelaufen. PRO-Funktionen wie Schema-Editor, Import/Export und Verlauf sind pausiert; Ihre Daten und Sammlungen funktionieren weiterhin.",
71
+ license_expired_banner_undated: "Ihre PRO-Testphase ist abgelaufen. PRO-Funktionen wie Schema-Editor, Import/Export und Verlauf sind pausiert; Ihre Daten und Sammlungen funktionieren weiterhin.",
72
+ license_invalid_project_banner: "Dieser Lizenzschlüssel ist nicht mit dem Projekt {{projectId}} verknüpft. Bis dahin sind die PRO-Funktionen pausiert.",
73
+ license_invalid_project_banner_unnamed: "Dieser Lizenzschlüssel ist nicht mit diesem Projekt verknüpft. Bis dahin sind die PRO-Funktionen pausiert.",
74
+ license_over_quota_banner: "Diese Lizenz deckt {{licensed}} Projekte ab, verknüpft sind aber {{actual}}.",
75
+ license_over_quota_banner_one: "Diese Lizenz deckt {{licensed}} Projekt ab, verknüpft sind aber {{actual}}.",
76
+ license_get_license: "Lizenz erwerben",
77
+ license_update_license: "Lizenz aktualisieren",
78
+ license_add_project_to_license: "Zu Ihrer Lizenz hinzufügen",
79
+ pro_features_paused: "PRO-Funktionen pausiert",
80
+ user_management_paused_description: "Die Verwaltung von Benutzern und Rollen ist Teil von FireCMS PRO. Ihre bestehenden Benutzer und Rollen legen weiterhin fest, wer sich anmelden darf und was er tun kann. Bearbeiten können Sie sie wieder, sobald dieses Projekt eine Lizenz hat.",
70
81
  column_cannot_be_edited: "Diese Spalte kann nicht direkt bearbeitet werden",
71
82
  close: "Schließen",
72
83
  unsaved_local_changes: "Ungespeicherte lokale Änderungen",
@@ -390,6 +401,8 @@ export const de: FireCMSTranslations = {
390
401
  large_number_of_documents: "Diese Sammlung hat eine große Anzahl von Dokumenten ({{count}}).",
391
402
  include_undefined_values: "Undefinierte Werte einschließen",
392
403
  export_apply_filter_sort: "Nur Ergebnisse exportieren, die dem aktuellen Filter/der aktuellen Sortierung entsprechen",
404
+ export_all_entities: "Alle Entitäten",
405
+ export_selected_entities: "Ausgewählte Entitäten ({{count}})",
393
406
  submit: "Einreichen",
394
407
 
395
408
  no_filterable_properties: "Keine filterbaren Eigenschaften verfügbar",
@@ -439,6 +452,7 @@ export const de: FireCMSTranslations = {
439
452
  roles_menu: "Rollen",
440
453
  project_settings: "Projekteinstellungen",
441
454
  firestore_manager: "Firestore-Manager",
455
+ datatalk: "DataTalk",
442
456
  manage_your_firestore_data: "Deine Firestore-Daten verwalten",
443
457
 
444
458
  // ─── FireCMS Cloud Login ──────────────────────────────────────
@@ -455,6 +469,7 @@ export const de: FireCMSTranslations = {
455
469
  not_the_admin_panel: "nicht auf das Admin-Panel.",
456
470
  join_our_newsletter: "Melden Sie sich für unseren Newsletter an. Kein Spam, nur wichtige Updates!",
457
471
  by_signing_in_you_agree_to_our: "Mit der Anmeldung stimmen Sie unseren",
472
+ please_accept_the_terms_to_continue: "Bitte akzeptieren Sie die Nutzungsbedingungen, um fortzufahren",
458
473
  terms_and_conditions: "Allgemeinen Geschäftsbedingungen",
459
474
  and_our: "und unserer",
460
475
  privacy_policy: "Datenschutzerklärung",
@@ -497,6 +512,7 @@ export const de: FireCMSTranslations = {
497
512
  licensed_projects_lowercase: "lizenzierte projekte",
498
513
  manage: "Verwalten",
499
514
  update_payment_method: "Zahlungsmethode aktualisieren",
515
+ stripe_portal_error: "Stripe konnte nicht geöffnet werden: {{message}}",
500
516
  your_firecms_cloud_projects: "Ihre FireCMS Cloud Projekte",
501
517
  status_active: "Aktiv",
502
518
  status_trialing: "Testphase",
package/src/locales/en.ts CHANGED
@@ -73,8 +73,19 @@ export const en: FireCMSTranslations = {
73
73
  select_from: "Select from {{name}}",
74
74
  done: "Done",
75
75
  log_out: "Log out",
76
- license_needed: "License needed",
77
- license_description: "You need a valid license to use FireCMS PRO. Please reach out at {{email}} for more information.",
76
+ license_trial_banner: "FireCMS PRO trial: {{days}} days left in production.",
77
+ license_trial_banner_one: "FireCMS PRO trial: {{days}} day left in production.",
78
+ license_expired_banner: "Your PRO trial ended on {{date}}. PRO features such as the schema editor, import/export and history are paused; your data and collections still work.",
79
+ license_expired_banner_undated: "Your PRO trial has ended. PRO features such as the schema editor, import/export and history are paused; your data and collections still work.",
80
+ license_invalid_project_banner: "This license key is not linked to project {{projectId}}. PRO features are paused until it is.",
81
+ license_invalid_project_banner_unnamed: "This license key is not linked to this project. PRO features are paused until it is.",
82
+ license_over_quota_banner: "This license covers {{licensed}} projects and {{actual}} are linked to it.",
83
+ license_over_quota_banner_one: "This license covers {{licensed}} project and {{actual}} are linked to it.",
84
+ license_get_license: "Get a license",
85
+ license_update_license: "Update your license",
86
+ license_add_project_to_license: "Add it to your license",
87
+ pro_features_paused: "PRO features paused",
88
+ user_management_paused_description: "Managing users and roles is part of FireCMS PRO. Your existing users and roles still decide who can sign in and what they can do, and you can edit them again once this project has a license.",
78
89
  column_cannot_be_edited: "This column can't be edited directly",
79
90
  close: "Close",
80
91
  unsaved_local_changes: "Unsaved Local changes",
@@ -388,7 +399,7 @@ export const en: FireCMSTranslations = {
388
399
  data_imported_successfully: "Data imported successfully",
389
400
  export: "Export",
390
401
  export_data: "Export data",
391
- download_table_csv: "Download the the content of this table as a CSV",
402
+ download_table_csv: "Download the content of this table as a CSV",
392
403
  csv: "CSV",
393
404
  json: "JSON",
394
405
  dates_as_timestamps: "Dates as timestamps",
@@ -398,6 +409,8 @@ export const en: FireCMSTranslations = {
398
409
  large_number_of_documents: "This collections has a large number of documents ({{count}}).",
399
410
  include_undefined_values: "Include undefined values",
400
411
  export_apply_filter_sort: "Only export results matching the current filter/sort",
412
+ export_all_entities: "All entities",
413
+ export_selected_entities: "Selected entities ({{count}})",
401
414
  submit: "Submit",
402
415
 
403
416
  no_filterable_properties: "No filterable properties available",
@@ -448,6 +461,9 @@ export const en: FireCMSTranslations = {
448
461
  project_settings: "Project settings",
449
462
  firestore_manager: "Firestore Manager",
450
463
  manage_your_firestore_data: "Manage your Firestore data",
464
+ // A product name. It is a key rather than a literal so a locale that uses a
465
+ // different script can transliterate it; most will inherit this value.
466
+ datatalk: "DataTalk",
451
467
 
452
468
  // ─── FireCMS Cloud Login ──────────────────────────────────────
453
469
  build_admin_panel_in_minutes: "Build Your Firebase Admin Panel in Minutes",
@@ -463,6 +479,7 @@ export const en: FireCMSTranslations = {
463
479
  not_the_admin_panel: "not the admin panel.",
464
480
  join_our_newsletter: "Join our newsletter. No spam, only important updates!",
465
481
  by_signing_in_you_agree_to_our: "By signing in you agree to our",
482
+ please_accept_the_terms_to_continue: "Please accept the terms and conditions to continue",
466
483
  terms_and_conditions: "Terms and Conditions",
467
484
  and_our: "and our",
468
485
  privacy_policy: "Privacy policy",
@@ -505,6 +522,7 @@ export const en: FireCMSTranslations = {
505
522
  licensed_projects_lowercase: "licensed projects",
506
523
  manage: "Manage",
507
524
  update_payment_method: "Update payment method",
525
+ stripe_portal_error: "Could not open Stripe: {{message}}",
508
526
  your_firecms_cloud_projects: "Your FireCMS Cloud projects",
509
527
  status_active: "Active",
510
528
  status_trialing: "Trialing",
package/src/locales/es.ts CHANGED
@@ -73,8 +73,19 @@ export const es: FireCMSTranslations = {
73
73
  select_from: "Seleccionar de {{name}}",
74
74
  done: "Hecho",
75
75
  log_out: "Cerrar sesión",
76
- license_needed: "Licencia necesaria",
77
- license_description: "Necesitas una licencia válida para usar FireCMS PRO. Por favor, contáctanos en {{email}} para obtener más información.",
76
+ license_trial_banner: "Prueba de FireCMS PRO: quedan {{days}} días en producción.",
77
+ license_trial_banner_one: "Prueba de FireCMS PRO: queda {{days}} día en producción.",
78
+ license_expired_banner: "Tu prueba de PRO terminó el {{date}}. Las funciones PRO, como el editor de esquemas, la importación/exportación y el historial, están en pausa; tus datos y colecciones siguen funcionando.",
79
+ license_expired_banner_undated: "Tu prueba de PRO ha terminado. Las funciones PRO, como el editor de esquemas, la importación/exportación y el historial, están en pausa; tus datos y colecciones siguen funcionando.",
80
+ license_invalid_project_banner: "Esta clave de licencia no está vinculada al proyecto {{projectId}}. Las funciones PRO están en pausa hasta que lo esté.",
81
+ license_invalid_project_banner_unnamed: "Esta clave de licencia no está vinculada a este proyecto. Las funciones PRO están en pausa hasta que lo esté.",
82
+ license_over_quota_banner: "Esta licencia cubre {{licensed}} proyectos y tiene {{actual}} vinculados.",
83
+ license_over_quota_banner_one: "Esta licencia cubre {{licensed}} proyecto y tiene {{actual}} vinculados.",
84
+ license_get_license: "Obtener una licencia",
85
+ license_update_license: "Actualizar tu licencia",
86
+ license_add_project_to_license: "Añadirlo a tu licencia",
87
+ pro_features_paused: "Funciones PRO en pausa",
88
+ user_management_paused_description: "La gestión de usuarios y roles forma parte de FireCMS PRO. Tus usuarios y roles actuales siguen decidiendo quién puede iniciar sesión y qué puede hacer, y podrás editarlos de nuevo cuando este proyecto tenga una licencia.",
78
89
  column_cannot_be_edited: "Esta columna no se puede editar directamente",
79
90
  close: "Cerrar",
80
91
  unsaved_local_changes: "Cambios locales sin guardar",
@@ -398,6 +409,8 @@ export const es: FireCMSTranslations = {
398
409
  large_number_of_documents: "Esta colección posee un gran número de documentos ({{count}}).",
399
410
  include_undefined_values: "Incluir valores omitidos (undefined)",
400
411
  export_apply_filter_sort: "Exportar solo los resultados que coinciden con el filtro/orden actual",
412
+ export_all_entities: "Todas las entidades",
413
+ export_selected_entities: "Entidades seleccionadas ({{count}})",
401
414
  submit: "Enviar",
402
415
 
403
416
  no_filterable_properties: "No hay propiedades filtrables disponibles",
@@ -447,6 +460,7 @@ export const es: FireCMSTranslations = {
447
460
  roles_menu: "Roles",
448
461
  project_settings: "Ajustes del proyecto",
449
462
  firestore_manager: "Gestor de Firestore",
463
+ datatalk: "DataTalk",
450
464
  manage_your_firestore_data: "Gestiona tus datos de Firestore",
451
465
 
452
466
  // ─── FireCMS Cloud Login ──────────────────────────────────────
@@ -463,6 +477,7 @@ export const es: FireCMSTranslations = {
463
477
  not_the_admin_panel: "no en el panel de administración.",
464
478
  join_our_newsletter: "Únete a nuestro newsletter. ¡Sin spam, solo actualizaciones importantes!",
465
479
  by_signing_in_you_agree_to_our: "Al iniciar sesión aceptas nuestros",
480
+ please_accept_the_terms_to_continue: "Acepta los términos y condiciones para continuar",
466
481
  terms_and_conditions: "Términos y Condiciones",
467
482
  and_our: "y nuestra",
468
483
  privacy_policy: "Política de Privacidad",
@@ -505,6 +520,7 @@ export const es: FireCMSTranslations = {
505
520
  licensed_projects_lowercase: "proyectos licenciados",
506
521
  manage: "Administrar",
507
522
  update_payment_method: "Actualizar método de pago",
523
+ stripe_portal_error: "No se pudo abrir Stripe: {{message}}",
508
524
  your_firecms_cloud_projects: "Tus proyectos de FireCMS Cloud",
509
525
  status_active: "Activo",
510
526
  status_trialing: "En prueba",
package/src/locales/fr.ts CHANGED
@@ -65,8 +65,19 @@ export const fr: FireCMSTranslations = {
65
65
  select_from: "Sélectionner depuis {{name}}",
66
66
  done: "Terminé",
67
67
  log_out: "Se déconnecter",
68
- license_needed: "Licence requise",
69
- license_description: "Vous avez besoin d'une licence valide pour utiliser FireCMS PRO. Veuillez nous contacter à {{email}} pour plus d'informations.",
68
+ license_trial_banner: "Essai de FireCMS PRO : {{days}} jours restants en production.",
69
+ license_trial_banner_one: "Essai de FireCMS PRO : {{days}} jour restant en production.",
70
+ license_expired_banner: "Votre essai PRO a pris fin le {{date}}. Les fonctions PRO, comme l'éditeur de schémas, l'import/export et l'historique, sont en pause ; vos données et vos collections fonctionnent toujours.",
71
+ license_expired_banner_undated: "Votre essai PRO a pris fin. Les fonctions PRO, comme l'éditeur de schémas, l'import/export et l'historique, sont en pause ; vos données et vos collections fonctionnent toujours.",
72
+ license_invalid_project_banner: "Cette clé de licence n'est pas associée au projet {{projectId}}. Les fonctionnalités PRO sont en pause d'ici là.",
73
+ license_invalid_project_banner_unnamed: "Cette clé de licence n'est pas associée à ce projet. Les fonctionnalités PRO sont en pause d'ici là.",
74
+ license_over_quota_banner: "Cette licence couvre {{licensed}} projets et {{actual}} y sont associés.",
75
+ license_over_quota_banner_one: "Cette licence couvre {{licensed}} projet et {{actual}} y sont associés.",
76
+ license_get_license: "Obtenir une licence",
77
+ license_update_license: "Mettre à jour votre licence",
78
+ license_add_project_to_license: "L'ajouter à votre licence",
79
+ pro_features_paused: "Fonctionnalités PRO en pause",
80
+ user_management_paused_description: "La gestion des utilisateurs et des rôles fait partie de FireCMS PRO. Vos utilisateurs et rôles existants déterminent toujours qui peut se connecter et ce qu'il peut faire, et vous pourrez à nouveau les modifier dès que ce projet aura une licence.",
70
81
  column_cannot_be_edited: "Cette colonne ne peut pas être modifiée directement",
71
82
  close: "Fermer",
72
83
  unsaved_local_changes: "Modifications locales non enregistrées",
@@ -390,6 +401,8 @@ export const fr: FireCMSTranslations = {
390
401
  large_number_of_documents: "Cette collection contient un grand nombre de documents ({{count}}).",
391
402
  include_undefined_values: "Inclure les valeurs non définies",
392
403
  export_apply_filter_sort: "N'exporter que les résultats correspondant au filtre/tri actuel",
404
+ export_all_entities: "Toutes les entités",
405
+ export_selected_entities: "Entités sélectionnées ({{count}})",
393
406
  submit: "Soumettre",
394
407
 
395
408
  no_filterable_properties: "Aucune propriété filtrable disponible",
@@ -439,6 +452,7 @@ export const fr: FireCMSTranslations = {
439
452
  roles_menu: "Rôles",
440
453
  project_settings: "Paramètres du projet",
441
454
  firestore_manager: "Gestionnaire Firestore",
455
+ datatalk: "DataTalk",
442
456
  manage_your_firestore_data: "Gérez vos données Firestore",
443
457
 
444
458
  // ─── FireCMS Cloud Login ──────────────────────────────────────
@@ -455,6 +469,7 @@ export const fr: FireCMSTranslations = {
455
469
  not_the_admin_panel: "pas sur le panneau d'administration.",
456
470
  join_our_newsletter: "Inscrivez-vous à notre newsletter. Pas de spam, uniquement des mises à jour importantes !",
457
471
  by_signing_in_you_agree_to_our: "En vous connectant, vous acceptez nos",
472
+ please_accept_the_terms_to_continue: "Veuillez accepter les conditions générales pour continuer",
458
473
  terms_and_conditions: "Conditions générales",
459
474
  and_our: "et notre",
460
475
  privacy_policy: "Politique de confidentialité",
@@ -497,6 +512,7 @@ export const fr: FireCMSTranslations = {
497
512
  licensed_projects_lowercase: "projets sous licence",
498
513
  manage: "Gérer",
499
514
  update_payment_method: "Mettre à jour le mode de paiement",
515
+ stripe_portal_error: "Impossible d'ouvrir Stripe : {{message}}",
500
516
  your_firecms_cloud_projects: "Vos projets FireCMS Cloud",
501
517
  status_active: "Actif",
502
518
  status_trialing: "En période d'essai",
package/src/locales/hi.ts CHANGED
@@ -65,8 +65,19 @@ export const hi: FireCMSTranslations = {
65
65
  select_from: "{{name}} से चुनें",
66
66
  done: "हो गया",
67
67
  log_out: "लॉग आउट",
68
- license_needed: "लाइसेंस आवश्यक है",
69
- license_description: "FireCMS PRO का उपयोग करने के लिए आपको एक वैध लाइसेंस की आवश्यकता है। कृपया अधिक जानकारी के लिए {{email}} पर संपर्क करें।",
68
+ license_trial_banner: "FireCMS PRO ट्रायल: प्रोडक्शन में {{days}} दिन बाकी हैं।",
69
+ license_trial_banner_one: "FireCMS PRO ट्रायल: प्रोडक्शन में {{days}} दिन बाकी है।",
70
+ license_expired_banner: "आपका PRO ट्रायल {{date}} को समाप्त हो गया। स्कीमा एडिटर, इम्पोर्ट/एक्सपोर्ट और हिस्ट्री जैसी PRO सुविधाएँ रोक दी गई हैं; आपका डेटा और कलेक्शन्स काम करते रहेंगे।",
71
+ license_expired_banner_undated: "आपका PRO ट्रायल समाप्त हो गया है। स्कीमा एडिटर, इम्पोर्ट/एक्सपोर्ट और हिस्ट्री जैसी PRO सुविधाएँ रोक दी गई हैं; आपका डेटा और कलेक्शन्स काम करते रहेंगे।",
72
+ license_invalid_project_banner: "यह लाइसेंस कुंजी प्रोजेक्ट {{projectId}} से जुड़ी नहीं है। जब तक यह जुड़ नहीं जाती, PRO सुविधाएँ रुकी रहेंगी।",
73
+ license_invalid_project_banner_unnamed: "यह लाइसेंस कुंजी इस प्रोजेक्ट से जुड़ी नहीं है। जब तक यह जुड़ नहीं जाती, PRO सुविधाएँ रुकी रहेंगी।",
74
+ license_over_quota_banner: "यह लाइसेंस {{licensed}} प्रोजेक्ट कवर करता है, लेकिन इससे {{actual}} प्रोजेक्ट जुड़े हैं।",
75
+ license_over_quota_banner_one: "यह लाइसेंस {{licensed}} प्रोजेक्ट कवर करता है, लेकिन इससे {{actual}} प्रोजेक्ट जुड़े हैं।",
76
+ license_get_license: "लाइसेंस लें",
77
+ license_update_license: "अपना लाइसेंस अपडेट करें",
78
+ license_add_project_to_license: "इसे अपने लाइसेंस में जोड़ें",
79
+ pro_features_paused: "PRO सुविधाएँ रुकी हुई हैं",
80
+ user_management_paused_description: "यूज़र्स और रोल्स का प्रबंधन FireCMS PRO का हिस्सा है। आपके मौजूदा यूज़र्स और रोल्स अब भी तय करते हैं कि कौन साइन इन कर सकता है और क्या कर सकता है। इस प्रोजेक्ट को लाइसेंस मिलते ही आप उन्हें फिर से संपादित कर सकेंगे।",
70
81
  column_cannot_be_edited: "इस कॉलम को सीधे संपादित नहीं किया जा सकता",
71
82
  close: "बंद करें",
72
83
  unsaved_local_changes: "सहेजे नहीं गए स्थानीय परिवर्तन",
@@ -390,6 +401,8 @@ export const hi: FireCMSTranslations = {
390
401
  large_number_of_documents: "इस संग्रह में बड़ी संख्या में दस्तावेज़ हैं ({{count}})।",
391
402
  include_undefined_values: "अपरिभाषित (undefined) मान शामिल करें",
392
403
  export_apply_filter_sort: "केवल वर्तमान फ़िल्टर/सॉर्ट से मेल खाने वाले परिणाम निर्यात करें",
404
+ export_all_entities: "सभी इकाइयाँ",
405
+ export_selected_entities: "चयनित इकाइयाँ ({{count}})",
393
406
  submit: "सबमिट करें",
394
407
 
395
408
  no_filterable_properties: "कोई फ़िल्टर करने योग्य गुण उपलब्ध नहीं हैं",
@@ -439,6 +452,7 @@ export const hi: FireCMSTranslations = {
439
452
  roles_menu: "भूमिकाएँ",
440
453
  project_settings: "परियोजना सेटिंग",
441
454
  firestore_manager: "Firestore मैनेजर",
455
+ datatalk: "DataTalk",
442
456
  manage_your_firestore_data: "अपने Firestore डेटा का प्रबंधन करें",
443
457
 
444
458
  // ─── FireCMS Cloud Login ──────────────────────────────────────
@@ -455,6 +469,7 @@ export const hi: FireCMSTranslations = {
455
469
  not_the_admin_panel: "व्यवस्थापक पैनल पर नहीं।",
456
470
  join_our_newsletter: "हमारे न्यूज़लेटर से जुड़ें। बिना किसी स्पैम के, केवल महत्वपूर्ण अपडेट!",
457
471
  by_signing_in_you_agree_to_our: "साइन इन करके आप हमारे नियमों और शर्तों से सहमत होते हैं",
472
+ please_accept_the_terms_to_continue: "जारी रखने के लिए कृपया नियम और शर्तें स्वीकार करें",
458
473
  terms_and_conditions: "नियम और शर्तें",
459
474
  and_our: "और हमारी गोपनीयता नीति",
460
475
  privacy_policy: "गोपनीयता नीति",
@@ -497,6 +512,7 @@ export const hi: FireCMSTranslations = {
497
512
  licensed_projects_lowercase: "लाइसेंस प्राप्त प्रोजेक्ट्स",
498
513
  manage: "प्रबंधित करें",
499
514
  update_payment_method: "भुगतान विधि अपडेट करें",
515
+ stripe_portal_error: "Stripe नहीं खुल सका: {{message}}",
500
516
  your_firecms_cloud_projects: "आपके FireCMS Cloud प्रोजेक्ट्स",
501
517
  status_active: "सक्रिय",
502
518
  status_trialing: "परीक्षण (ट्रायल)",
package/src/locales/it.ts CHANGED
@@ -65,8 +65,19 @@ export const it: FireCMSTranslations = {
65
65
  select_from: "Seleziona da {{name}}",
66
66
  done: "Fatto",
67
67
  log_out: "Esci",
68
- license_needed: "Licenza necessaria",
69
- license_description: "Hai bisogno di una licenza valida per utilizzare FireCMS PRO. Contattaci a {{email}} per maggiori informazioni.",
68
+ license_trial_banner: "Prova di FireCMS PRO: restano {{days}} giorni in produzione.",
69
+ license_trial_banner_one: "Prova di FireCMS PRO: resta {{days}} giorno in produzione.",
70
+ license_expired_banner: "La tua prova PRO è terminata il {{date}}. Le funzioni PRO, come l'editor degli schemi, l'importazione/esportazione e la cronologia, sono in pausa; i tuoi dati e le tue collezioni continuano a funzionare.",
71
+ license_expired_banner_undated: "La tua prova PRO è terminata. Le funzioni PRO, come l'editor degli schemi, l'importazione/esportazione e la cronologia, sono in pausa; i tuoi dati e le tue collezioni continuano a funzionare.",
72
+ license_invalid_project_banner: "Questa chiave di licenza non è collegata al progetto {{projectId}}. Le funzionalità PRO restano in pausa finché non lo sarà.",
73
+ license_invalid_project_banner_unnamed: "Questa chiave di licenza non è collegata a questo progetto. Le funzionalità PRO restano in pausa finché non lo sarà.",
74
+ license_over_quota_banner: "Questa licenza copre {{licensed}} progetti e ne ha {{actual}} collegati.",
75
+ license_over_quota_banner_one: "Questa licenza copre {{licensed}} progetto e ne ha {{actual}} collegati.",
76
+ license_get_license: "Ottieni una licenza",
77
+ license_update_license: "Aggiorna la tua licenza",
78
+ license_add_project_to_license: "Aggiungilo alla tua licenza",
79
+ pro_features_paused: "Funzionalità PRO in pausa",
80
+ user_management_paused_description: "La gestione di utenti e ruoli fa parte di FireCMS PRO. I tuoi utenti e ruoli attuali continuano a decidere chi può accedere e cosa può fare, e potrai modificarli di nuovo quando questo progetto avrà una licenza.",
70
81
  column_cannot_be_edited: "Questa colonna non può essere modificata direttamente",
71
82
  close: "Chiudi",
72
83
  unsaved_local_changes: "Modifiche locali non salvate",
@@ -390,6 +401,8 @@ export const it: FireCMSTranslations = {
390
401
  large_number_of_documents: "Questa collezione contiene un numero elevato di documenti ({{count}})",
391
402
  include_undefined_values: "Includi valori non definiti",
392
403
  export_apply_filter_sort: "Esporta solo i risultati che corrispondono al filtro/ordinamento attuale",
404
+ export_all_entities: "Tutte le entità",
405
+ export_selected_entities: "Entità selezionate ({{count}})",
393
406
  submit: "Invia",
394
407
 
395
408
  no_filterable_properties: "Nessuna proprietà filtrabile disponibile",
@@ -439,6 +452,7 @@ export const it: FireCMSTranslations = {
439
452
  roles_menu: "Ruoli",
440
453
  project_settings: "Impostazioni del progetto",
441
454
  firestore_manager: "Gestore Firestore",
455
+ datatalk: "DataTalk",
442
456
  manage_your_firestore_data: "Gestisci i tuoi dati Firestore",
443
457
 
444
458
  // ─── FireCMS Cloud Login ──────────────────────────────────────
@@ -455,6 +469,7 @@ export const it: FireCMSTranslations = {
455
469
  not_the_admin_panel: "non sul pannello di amministrazione.",
456
470
  join_our_newsletter: "Iscriviti alla nostra newsletter. Niente spam, solo aggiornamenti importanti!",
457
471
  by_signing_in_you_agree_to_our: "Accedendo accetti i nostri",
472
+ please_accept_the_terms_to_continue: "Accetta i termini e le condizioni per continuare",
458
473
  terms_and_conditions: "Termini e Condizioni",
459
474
  and_our: "e la nostra",
460
475
  privacy_policy: "Informativa sulla privacy",
@@ -497,6 +512,7 @@ export const it: FireCMSTranslations = {
497
512
  licensed_projects_lowercase: "progetti con licenza",
498
513
  manage: "Gestisci",
499
514
  update_payment_method: "Aggiorna metodo di pagamento",
515
+ stripe_portal_error: "Impossibile aprire Stripe: {{message}}",
500
516
  your_firecms_cloud_projects: "I tuoi progetti FireCMS Cloud",
501
517
  status_active: "Attivo",
502
518
  status_trialing: "In prova",