@fonderie/client 1.7.0 → 1.9.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.
package/dist/index.js CHANGED
@@ -143,9 +143,9 @@ var HttpClient = class {
143
143
 
144
144
  // src/modules/audit.ts
145
145
  var AuditClient = class {
146
- constructor(http, tokens) {
146
+ constructor(http, tokens4) {
147
147
  this.http = http;
148
- this.tokens = tokens;
148
+ this.tokens = tokens4;
149
149
  }
150
150
  http;
151
151
  tokens;
@@ -230,9 +230,9 @@ var MfaClient = class {
230
230
  }
231
231
  };
232
232
  var AuthClient = class {
233
- constructor(http, tokens) {
233
+ constructor(http, tokens4) {
234
234
  this.http = http;
235
- this.tokens = tokens;
235
+ this.tokens = tokens4;
236
236
  this.mfa = new MfaClient(http, () => this.tokens.get());
237
237
  }
238
238
  http;
@@ -455,9 +455,9 @@ var AuthClient = class {
455
455
 
456
456
  // src/modules/billing.ts
457
457
  var BillingClient = class {
458
- constructor(http, tokens) {
458
+ constructor(http, tokens4) {
459
459
  this.http = http;
460
- this.tokens = tokens;
460
+ this.tokens = tokens4;
461
461
  }
462
462
  http;
463
463
  tokens;
@@ -703,9 +703,9 @@ var BillingClient = class {
703
703
 
704
704
  // src/modules/customers.ts
705
705
  var CustomersClient = class {
706
- constructor(http, tokens) {
706
+ constructor(http, tokens4) {
707
707
  this.http = http;
708
- this.tokens = tokens;
708
+ this.tokens = tokens4;
709
709
  }
710
710
  http;
711
711
  tokens;
@@ -1049,9 +1049,9 @@ var CustomersClient = class {
1049
1049
 
1050
1050
  // src/modules/media.ts
1051
1051
  var MediaClient = class {
1052
- constructor(http, tokens) {
1052
+ constructor(http, tokens4) {
1053
1053
  this.http = http;
1054
- this.tokens = tokens;
1054
+ this.tokens = tokens4;
1055
1055
  }
1056
1056
  http;
1057
1057
  tokens;
@@ -1098,9 +1098,9 @@ var MediaClient = class {
1098
1098
 
1099
1099
  // src/modules/config.ts
1100
1100
  var ConfigClient = class {
1101
- constructor(http, tokens) {
1101
+ constructor(http, tokens4) {
1102
1102
  this.http = http;
1103
- this.tokens = tokens;
1103
+ this.tokens = tokens4;
1104
1104
  }
1105
1105
  http;
1106
1106
  tokens;
@@ -1154,9 +1154,9 @@ var ConfigClient = class {
1154
1154
 
1155
1155
  // src/modules/webhooks.ts
1156
1156
  var WebhooksClient = class {
1157
- constructor(http, tokens) {
1157
+ constructor(http, tokens4) {
1158
1158
  this.http = http;
1159
- this.tokens = tokens;
1159
+ this.tokens = tokens4;
1160
1160
  }
1161
1161
  http;
1162
1162
  tokens;
@@ -1236,9 +1236,9 @@ var WebhooksClient = class {
1236
1236
 
1237
1237
  // src/modules/workspaces.ts
1238
1238
  var WorkspacesClient = class {
1239
- constructor(http, tokens) {
1239
+ constructor(http, tokens4) {
1240
1240
  this.http = http;
1241
- this.tokens = tokens;
1241
+ this.tokens = tokens4;
1242
1242
  }
1243
1243
  http;
1244
1244
  tokens;
@@ -1528,10 +1528,10 @@ var FonderieClient = class {
1528
1528
  }
1529
1529
  try {
1530
1530
  const { result } = await this.auth.refreshTokens(refreshToken);
1531
- const tokens = result.tokens;
1532
- this.tokens.set(tokens.access);
1533
- this.authConfig?.onTokensChanged?.(tokens);
1534
- return tokens.access;
1531
+ const tokens4 = result.tokens;
1532
+ this.tokens.set(tokens4.access);
1533
+ this.authConfig?.onTokensChanged?.(tokens4);
1534
+ return tokens4.access;
1535
1535
  } catch {
1536
1536
  this.tokens.set(void 0);
1537
1537
  this.authConfig?.onAuthError?.();
@@ -1580,53 +1580,53 @@ var FonderieClient = class {
1580
1580
  invalidate: opts.invalidate
1581
1581
  });
1582
1582
  }
1583
- get(path, config) {
1583
+ get(path, config4) {
1584
1584
  return this.request({
1585
1585
  method: "GET",
1586
1586
  path,
1587
- token: config?.token,
1588
- workspaceId: config?.workspaceId,
1589
- cache: config?.cache,
1590
- bust: config?.bust
1587
+ token: config4?.token,
1588
+ workspaceId: config4?.workspaceId,
1589
+ cache: config4?.cache,
1590
+ bust: config4?.bust
1591
1591
  });
1592
1592
  }
1593
- post(path, body, config) {
1593
+ post(path, body, config4) {
1594
1594
  return this.request({
1595
1595
  method: "POST",
1596
1596
  path,
1597
1597
  body,
1598
- token: config?.token,
1599
- workspaceId: config?.workspaceId,
1600
- invalidate: config?.invalidate
1598
+ token: config4?.token,
1599
+ workspaceId: config4?.workspaceId,
1600
+ invalidate: config4?.invalidate
1601
1601
  });
1602
1602
  }
1603
- put(path, body, config) {
1603
+ put(path, body, config4) {
1604
1604
  return this.request({
1605
1605
  method: "PUT",
1606
1606
  path,
1607
1607
  body,
1608
- token: config?.token,
1609
- workspaceId: config?.workspaceId,
1610
- invalidate: config?.invalidate
1608
+ token: config4?.token,
1609
+ workspaceId: config4?.workspaceId,
1610
+ invalidate: config4?.invalidate
1611
1611
  });
1612
1612
  }
1613
- patch(path, body, config) {
1613
+ patch(path, body, config4) {
1614
1614
  return this.request({
1615
1615
  method: "PATCH",
1616
1616
  path,
1617
1617
  body,
1618
- token: config?.token,
1619
- workspaceId: config?.workspaceId,
1620
- invalidate: config?.invalidate
1618
+ token: config4?.token,
1619
+ workspaceId: config4?.workspaceId,
1620
+ invalidate: config4?.invalidate
1621
1621
  });
1622
1622
  }
1623
- delete(path, config) {
1623
+ delete(path, config4) {
1624
1624
  return this.request({
1625
1625
  method: "DELETE",
1626
1626
  path,
1627
- token: config?.token,
1628
- workspaceId: config?.workspaceId,
1629
- invalidate: config?.invalidate
1627
+ token: config4?.token,
1628
+ workspaceId: config4?.workspaceId,
1629
+ invalidate: config4?.invalidate
1630
1630
  });
1631
1631
  }
1632
1632
  };
@@ -1635,8 +1635,8 @@ var FonderieClient = class {
1635
1635
  var normalizeMountPath = (path) => path.replace(/\/+$/, "");
1636
1636
 
1637
1637
  // src/modules/config-admin.ts
1638
- function envQuery(environment) {
1639
- return environment ? `?environment=${encodeURIComponent(environment)}` : "";
1638
+ function envQuery(environment4) {
1639
+ return environment4 ? `?environment=${encodeURIComponent(environment4)}` : "";
1640
1640
  }
1641
1641
  var ConfigAdminClient = class {
1642
1642
  http;
@@ -1656,59 +1656,59 @@ var ConfigAdminClient = class {
1656
1656
  return { ...opts, path: opts.path.replace(/^\/admin(?=\/|\?|$)/, this.prefix) };
1657
1657
  }
1658
1658
  // ── Config ───────────────────────────────────────────────────────────────
1659
- listConfig(environment) {
1659
+ listConfig(environment4) {
1660
1660
  return this.http.request(
1661
1661
  this.rebase({
1662
1662
  method: "GET",
1663
- path: `/admin/config${envQuery(environment)}`,
1663
+ path: `/admin/config${envQuery(environment4)}`,
1664
1664
  token: this.adminToken
1665
1665
  })
1666
1666
  );
1667
1667
  }
1668
- getConfig(key, environment) {
1668
+ getConfig(key, environment4) {
1669
1669
  return this.http.request(
1670
1670
  this.rebase({
1671
1671
  method: "GET",
1672
- path: `/admin/config/${encodeURIComponent(key)}${envQuery(environment)}`,
1672
+ path: `/admin/config/${encodeURIComponent(key)}${envQuery(environment4)}`,
1673
1673
  token: this.adminToken
1674
1674
  })
1675
1675
  );
1676
1676
  }
1677
- setConfig(key, input, environment) {
1677
+ setConfig(key, input, environment4) {
1678
1678
  return this.http.request(
1679
1679
  this.rebase({
1680
1680
  method: "PUT",
1681
- path: `/admin/config/${encodeURIComponent(key)}${envQuery(environment)}`,
1681
+ path: `/admin/config/${encodeURIComponent(key)}${envQuery(environment4)}`,
1682
1682
  body: input,
1683
1683
  token: this.adminToken,
1684
1684
  headers: this.actorHeaders
1685
1685
  })
1686
1686
  );
1687
1687
  }
1688
- deleteConfig(key, environment) {
1688
+ deleteConfig(key, environment4) {
1689
1689
  return this.http.request(
1690
1690
  this.rebase({
1691
1691
  method: "DELETE",
1692
- path: `/admin/config/${encodeURIComponent(key)}${envQuery(environment)}`,
1692
+ path: `/admin/config/${encodeURIComponent(key)}${envQuery(environment4)}`,
1693
1693
  token: this.adminToken,
1694
1694
  headers: this.actorHeaders
1695
1695
  })
1696
1696
  );
1697
1697
  }
1698
- listConfigRevisions(key, environment) {
1698
+ listConfigRevisions(key, environment4) {
1699
1699
  return this.http.request(
1700
1700
  this.rebase({
1701
1701
  method: "GET",
1702
- path: `/admin/config/${encodeURIComponent(key)}/revisions${envQuery(environment)}`,
1702
+ path: `/admin/config/${encodeURIComponent(key)}/revisions${envQuery(environment4)}`,
1703
1703
  token: this.adminToken
1704
1704
  })
1705
1705
  );
1706
1706
  }
1707
- rollbackConfig(key, input, environment) {
1707
+ rollbackConfig(key, input, environment4) {
1708
1708
  return this.http.request(
1709
1709
  this.rebase({
1710
1710
  method: "POST",
1711
- path: `/admin/config/${encodeURIComponent(key)}/rollback${envQuery(environment)}`,
1711
+ path: `/admin/config/${encodeURIComponent(key)}/rollback${envQuery(environment4)}`,
1712
1712
  body: input,
1713
1713
  token: this.adminToken,
1714
1714
  headers: this.actorHeaders
@@ -1716,59 +1716,59 @@ var ConfigAdminClient = class {
1716
1716
  );
1717
1717
  }
1718
1718
  // ── Secrets (masked) ─────────────────────────────────────────────────────
1719
- listSecrets(environment) {
1719
+ listSecrets(environment4) {
1720
1720
  return this.http.request(
1721
1721
  this.rebase({
1722
1722
  method: "GET",
1723
- path: `/admin/secrets${envQuery(environment)}`,
1723
+ path: `/admin/secrets${envQuery(environment4)}`,
1724
1724
  token: this.adminToken
1725
1725
  })
1726
1726
  );
1727
1727
  }
1728
- getSecret(key, environment) {
1728
+ getSecret(key, environment4) {
1729
1729
  return this.http.request(
1730
1730
  this.rebase({
1731
1731
  method: "GET",
1732
- path: `/admin/secrets/${encodeURIComponent(key)}${envQuery(environment)}`,
1732
+ path: `/admin/secrets/${encodeURIComponent(key)}${envQuery(environment4)}`,
1733
1733
  token: this.adminToken
1734
1734
  })
1735
1735
  );
1736
1736
  }
1737
- setSecret(key, input, environment) {
1737
+ setSecret(key, input, environment4) {
1738
1738
  return this.http.request(
1739
1739
  this.rebase({
1740
1740
  method: "PUT",
1741
- path: `/admin/secrets/${encodeURIComponent(key)}${envQuery(environment)}`,
1741
+ path: `/admin/secrets/${encodeURIComponent(key)}${envQuery(environment4)}`,
1742
1742
  body: input,
1743
1743
  token: this.adminToken,
1744
1744
  headers: this.actorHeaders
1745
1745
  })
1746
1746
  );
1747
1747
  }
1748
- deleteSecret(key, environment) {
1748
+ deleteSecret(key, environment4) {
1749
1749
  return this.http.request(
1750
1750
  this.rebase({
1751
1751
  method: "DELETE",
1752
- path: `/admin/secrets/${encodeURIComponent(key)}${envQuery(environment)}`,
1752
+ path: `/admin/secrets/${encodeURIComponent(key)}${envQuery(environment4)}`,
1753
1753
  token: this.adminToken,
1754
1754
  headers: this.actorHeaders
1755
1755
  })
1756
1756
  );
1757
1757
  }
1758
- listSecretRevisions(key, environment) {
1758
+ listSecretRevisions(key, environment4) {
1759
1759
  return this.http.request(
1760
1760
  this.rebase({
1761
1761
  method: "GET",
1762
- path: `/admin/secrets/${encodeURIComponent(key)}/revisions${envQuery(environment)}`,
1762
+ path: `/admin/secrets/${encodeURIComponent(key)}/revisions${envQuery(environment4)}`,
1763
1763
  token: this.adminToken
1764
1764
  })
1765
1765
  );
1766
1766
  }
1767
- rollbackSecret(key, input, environment) {
1767
+ rollbackSecret(key, input, environment4) {
1768
1768
  return this.http.request(
1769
1769
  this.rebase({
1770
1770
  method: "POST",
1771
- path: `/admin/secrets/${encodeURIComponent(key)}/rollback${envQuery(environment)}`,
1771
+ path: `/admin/secrets/${encodeURIComponent(key)}/rollback${envQuery(environment4)}`,
1772
1772
  body: input,
1773
1773
  token: this.adminToken,
1774
1774
  headers: this.actorHeaders
@@ -1776,11 +1776,11 @@ var ConfigAdminClient = class {
1776
1776
  );
1777
1777
  }
1778
1778
  // POST (not GET) so the decrypted value never lands in a URL or access log.
1779
- revealSecret(key, environment) {
1779
+ revealSecret(key, environment4) {
1780
1780
  return this.http.request(
1781
1781
  this.rebase({
1782
1782
  method: "POST",
1783
- path: `/admin/secrets/${encodeURIComponent(key)}/reveal${envQuery(environment)}`,
1783
+ path: `/admin/secrets/${encodeURIComponent(key)}/reveal${envQuery(environment4)}`,
1784
1784
  token: this.adminToken,
1785
1785
  headers: this.actorHeaders
1786
1786
  })
@@ -2279,7 +2279,2124 @@ function inferConfigValue(raw) {
2279
2279
  }
2280
2280
  return { type: "string", value: raw, label: "Text", ambiguous: false };
2281
2281
  }
2282
+
2283
+ // src/admin-i18n/en/common.ts
2284
+ var common = {
2285
+ refresh: "Refresh",
2286
+ working: "Working\u2026",
2287
+ loading: "Loading\u2026",
2288
+ loadMore: "Load more",
2289
+ save: "Save",
2290
+ saving: "Saving\u2026",
2291
+ cancel: "Cancel",
2292
+ delete: "Delete",
2293
+ deleting: "Deleting\u2026",
2294
+ back: "Back",
2295
+ open: "Open",
2296
+ copy: "Copy",
2297
+ copied: "Copied",
2298
+ dismiss: "Dismiss",
2299
+ confirm: "Confirm",
2300
+ continue: "Continue",
2301
+ reload: "Reload",
2302
+ search: "Search",
2303
+ lookUp: "Look up",
2304
+ filter: "Filter",
2305
+ yes: "yes",
2306
+ no: "no",
2307
+ none: "None.",
2308
+ never: "never",
2309
+ you: "you",
2310
+ all: "All",
2311
+ allEnvironments: "All environments",
2312
+ language: "Language",
2313
+ theme: "Theme",
2314
+ themeSystem: "System",
2315
+ themeLight: "Light",
2316
+ themeDark: "Dark",
2317
+ status: {
2318
+ active: "active",
2319
+ inactive: "inactive",
2320
+ ready: "ready",
2321
+ error: "error",
2322
+ advice: "advice",
2323
+ ok: "ok",
2324
+ failed: "failed",
2325
+ skipped: "skipped",
2326
+ suspended: "suspended",
2327
+ deleted: "deleted",
2328
+ disabled: "disabled",
2329
+ locked: "locked",
2330
+ pending: "pending",
2331
+ set: "set",
2332
+ missing: "missing",
2333
+ free: "free"
2334
+ }
2335
+ };
2336
+ var common_default = common;
2337
+
2338
+ // src/admin-i18n/en/nav.ts
2339
+ var nav = {
2340
+ groups: {
2341
+ today: "Today",
2342
+ system: "System",
2343
+ people: "People",
2344
+ money: "Money",
2345
+ settings: "Settings",
2346
+ messaging: "Messaging",
2347
+ activity: "Activity"
2348
+ },
2349
+ items: {
2350
+ attention: "Attention",
2351
+ modules: "Modules",
2352
+ environment: "Environment",
2353
+ doctor: "Doctor",
2354
+ routes: "Routes",
2355
+ users: "Users",
2356
+ catalog: "Catalog",
2357
+ subscriptions: "Subscriptions",
2358
+ settings: "Config & secrets",
2359
+ templates: "Templates",
2360
+ audit: "Audit",
2361
+ log: "Admin log",
2362
+ operators: "Operators",
2363
+ tokens: "Tokens",
2364
+ migrations: "Migrations"
2365
+ }
2366
+ };
2367
+ var nav_default = nav;
2368
+
2369
+ // src/admin-i18n/en/shell.ts
2370
+ var shell = {
2371
+ openMenu: "Open menu",
2372
+ closeMenu: "Close menu",
2373
+ navLabel: "Admin",
2374
+ missingClient: "Pass a {client} to use this page."
2375
+ };
2376
+ var shell_default = shell;
2377
+
2378
+ // src/admin-i18n/en/session.ts
2379
+ var session = {
2380
+ signInTitle: "Sign in to Admin",
2381
+ adminToken: "Admin token",
2382
+ pasteToken: "Paste your token",
2383
+ tokenFoot: "Kept for this tab only and sent as a Bearer header \u2014 never stored on the server. A read-scoped token is enough to look around and cannot reveal secrets.",
2384
+ tokenRefused: "That token was refused.",
2385
+ unreachable: "Could not reach the admin surface: {error}",
2386
+ forgetToken: "Forget token",
2387
+ signOut: "Sign out",
2388
+ genericError: "Something went wrong. Try again.",
2389
+ stepOf: "Step {n} of {total}",
2390
+ steps: {
2391
+ adminToken: "Admin token",
2392
+ account: "Your account",
2393
+ authenticator: "Authenticator",
2394
+ backupCodes: "Backup codes",
2395
+ newPassword: "New password"
2396
+ },
2397
+ checking: "Checking\u2026",
2398
+ welcomeTitle: "Welcome \u2014 let's set up your console",
2399
+ welcomeSubtitle: "This is the first sign-in on {host}. Paste the admin token from your deployment's configuration to begin. It is needed only this once.",
2400
+ createAccountTitle: "Create your account",
2401
+ createAccountSubtitle: "From now on you sign in with this email and password, plus an authenticator app. The admin token stays for scripts and emergencies.",
2402
+ email: "Email",
2403
+ nameOptional: "Name (optional)",
2404
+ yourNameOptional: "Your name (optional)",
2405
+ password: "Password",
2406
+ newPassword: "New password",
2407
+ confirmPassword: "Confirm password",
2408
+ passwordHint: "At least 12 characters.",
2409
+ passwordHintNext: "At least 12 characters. You will set up an authenticator app next.",
2410
+ passwordsMismatch: "The two passwords do not match.",
2411
+ creating: "Creating\u2026",
2412
+ createAccount: "Create account",
2413
+ loginFoot: "There is no sign-up. Operators are invited by another operator. Locked out? Ask another operator for a recovery link.",
2414
+ backupCode: "Backup code",
2415
+ authenticatorCode: "Authenticator code",
2416
+ useApp: "Use the authenticator app instead",
2417
+ useBackup: "Use a backup code instead",
2418
+ enrollTitle: "Set up your authenticator",
2419
+ enrollSubtitle: "Every sign-in to this console needs a code from an authenticator app \u2014 1Password, Google Authenticator, Authy, or any TOTP app.",
2420
+ enrollScan: "Open your authenticator app and scan this code.",
2421
+ enrollEnter: "Enter the six digits it shows.",
2422
+ qrAlt: "QR code for your authenticator app",
2423
+ cantScan: "Can't scan? Enter a setup key instead",
2424
+ preparing: "Preparing\u2026",
2425
+ cancelSignOut: "Cancel and sign out",
2426
+ codeFromApp: "Code from the app",
2427
+ verifyContinue: "Verify and continue",
2428
+ backupTitle: "Save your backup codes",
2429
+ backupSubtitle: "If you lose your phone, each of these signs you in once. They are shown only now.",
2430
+ backupFileHeader: "Backup codes for {host} admin",
2431
+ download: "Download",
2432
+ savedCheckbox: "I have saved these codes somewhere safe",
2433
+ openConsole: "Open the console",
2434
+ linkInvalidTitle: "This link cannot be used",
2435
+ checkingLink: "Checking your link\u2026",
2436
+ joinTitle: "Join the admin console",
2437
+ recoverTitle: "Recover your account",
2438
+ joinSubtitle: "You were invited as {email}. Choose a password, then set up an authenticator app.",
2439
+ recoverSubtitle: "Set a new password for {email}. You will set up your authenticator again.",
2440
+ stepUpTitle: "Confirm it's you",
2441
+ stepUpSubtitle: "This action needs a fresh code. It covers the next five minutes.",
2442
+ twoStepTitle: "Two-step verification",
2443
+ twoStepSubtitle: "Enter the code from your authenticator app.",
2444
+ verify: "Verify",
2445
+ changeLanguage: "Change language (current: {name})",
2446
+ themeChoice: "Theme: {name}",
2447
+ errors: {
2448
+ INVALID_CREDENTIALS: "That email and password do not match an operator.",
2449
+ INVALID_CODE: "That code did not work. Codes change every 30 seconds.",
2450
+ LOCKED: "Too many attempts. Try again in {minutes} minute(s).",
2451
+ LOCKED_GENERIC: "Too many attempts. Try again in a few minutes.",
2452
+ RATE_LIMITED: "Too many attempts from this address. Wait a few minutes.",
2453
+ WEAK_PASSWORD: "Choose a stronger password \u2014 at least 12 characters, not easy to guess.",
2454
+ INVALID_LINK: "This link has expired or was already used. Ask for a new one.",
2455
+ ALREADY_OPERATOR: "That email is already an operator. Sign in instead.",
2456
+ ALREADY_CLAIMED: "This console already has operators. Ask one for an invite.",
2457
+ CROSS_ORIGIN: "This request did not come from the admin page."
2458
+ }
2459
+ };
2460
+ var session_default = session;
2461
+
2462
+ // src/admin-i18n/en/attention.ts
2463
+ var attention = {
2464
+ title: "Attention",
2465
+ lead: "What needs you on this deployment",
2466
+ leadChecked: "What needs you on this deployment \xB7 checked {time}",
2467
+ needsAction: "Needs action",
2468
+ needsActionHint: "errors to fix",
2469
+ advice: "Advice",
2470
+ adviceHint: "worth a look",
2471
+ modulesReady: "Modules ready",
2472
+ modulesReadyHint: "admin {version}",
2473
+ routes: "Routes",
2474
+ running: "Running the checks\u2026",
2475
+ emptyTitle: "Nothing needs you",
2476
+ emptyBody: "Every check passes. Checked {time}."
2477
+ };
2478
+ var attention_default = attention;
2479
+
2480
+ // src/admin-i18n/en/modules.ts
2481
+ var modules = {
2482
+ title: "Modules",
2483
+ lead: "Every installed module, its version and whether it is ready.",
2484
+ leadSummary: "{env} \xB7 admin {version} \xB7 admin log {log} \xB7 {routes} routes",
2485
+ logOn: "on",
2486
+ logOff: "off",
2487
+ colModule: "Module",
2488
+ colVersion: "Version",
2489
+ colReadiness: "Readiness",
2490
+ colAdmin: "Admin",
2491
+ notReported: "not reported",
2492
+ describesAdmin: "describes admin"
2493
+ };
2494
+ var modules_default = modules;
2495
+
2496
+ // src/admin-i18n/en/environment.ts
2497
+ var environment = {
2498
+ title: "Environment",
2499
+ lead: "Whether each module is configured and each variable the app reads is set. Values are never shown.",
2500
+ missingCount: "{n} missing",
2501
+ allSet: "all set",
2502
+ variables: "Variables",
2503
+ noVariables: "No variables declared \u2014 pass `env` to AdminModule.",
2504
+ moduleReadiness: "Module readiness",
2505
+ problemOne: "1 problem",
2506
+ problemMany: "{n} problems"
2507
+ };
2508
+ var environment_default = environment;
2509
+
2510
+ // src/admin-i18n/en/doctor.ts
2511
+ var doctor = {
2512
+ title: "Doctor",
2513
+ lead: "Every reconciliation check across the installed modules, run on demand.",
2514
+ allPass: "all checks pass",
2515
+ oneFailed: "a check failed",
2516
+ runAgain: "Run again",
2517
+ running: "Running the checks\u2026",
2518
+ colResult: "Result",
2519
+ colCheck: "Check",
2520
+ colTime: "Time"
2521
+ };
2522
+ var doctor_default = doctor;
2523
+
2524
+ // src/admin-i18n/en/routes.ts
2525
+ var routes = {
2526
+ title: "Routes",
2527
+ lead: "Every exposed route, with its guard.",
2528
+ leadCount: "{n} routes exposed by this deployment, with the guard in front of each.",
2529
+ filterPlaceholder: "Filter by path, method, module\u2026",
2530
+ filterLabel: "Filter routes",
2531
+ colMethod: "Method",
2532
+ colPath: "Path",
2533
+ colGuard: "Guard",
2534
+ colModule: "Module",
2535
+ application: "application",
2536
+ noMatch: "No route matches \u201C{q}\u201D."
2537
+ };
2538
+ var routes_default = routes;
2539
+
2540
+ // src/admin-i18n/en/log.ts
2541
+ var log = {
2542
+ title: "Admin log",
2543
+ lead: "Every request made through this surface, newest first \u2014 refused ones included.",
2544
+ off: "The admin log is off \u2014 give AdminModule a store.",
2545
+ empty: "No requests yet",
2546
+ colWhen: "When",
2547
+ colActor: "Actor",
2548
+ colRequest: "Request",
2549
+ colStatus: "Status",
2550
+ colModule: "Module"
2551
+ };
2552
+ var log_default = log;
2553
+
2554
+ // src/admin-i18n/en/migrations.ts
2555
+ var migrations = {
2556
+ title: "Migrations",
2557
+ lead: "Schema changes each module ships, and whether this database has them.",
2558
+ needsWrite: "Applying migrations needs a token with the write scope.",
2559
+ firstInstall: "This database has never been migrated \u2014 treating it as a first install, so nothing is held back.",
2560
+ upToDate: "Every module is up to date",
2561
+ noPending: "No pending migrations.",
2562
+ pendingCount: "{n} pending",
2563
+ destructive: "destructive",
2564
+ additive: "additive",
2565
+ blockedBy: 'Apply "{module}" first \u2014 it runs before this one and is behind.',
2566
+ destructiveBlocked: "Contains a migration that deletes data. No down-migration brings it back \u2014 apply this one through CI or `npm run migrate`.",
2567
+ confirmApply: 'Apply {n} migration(s) to "{module}"? This changes the database schema.',
2568
+ applyOne: "Apply 1 migration",
2569
+ applyMany: "Apply {n} migrations"
2570
+ };
2571
+ var migrations_default = migrations;
2572
+
2573
+ // src/admin-i18n/en/tokens.ts
2574
+ var tokens = {
2575
+ title: "Tokens",
2576
+ lead: "Credentials for machines: the root token's strength, scoped tokens for the CLI and CI, and any legacy per-module tokens. People sign in as operators.",
2577
+ needsRoot: "Issuing and revoking need the root token (the one in your deployment config).",
2578
+ rootToken: "Root token",
2579
+ strong: "strong",
2580
+ weak: "weak",
2581
+ issuedTokens: "Issued tokens",
2582
+ issuingOff: "Issuing is off \u2014 give AdminModule a store and run its migrations.",
2583
+ copyNow: "Copy this now \u2014 it is never shown again.",
2584
+ namePlaceholder: "name",
2585
+ nameLabel: "Name",
2586
+ scope: {
2587
+ read: "read",
2588
+ write: "write",
2589
+ secrets: "secrets"
2590
+ },
2591
+ daysPlaceholder: "days (optional)",
2592
+ daysLabel: "Days",
2593
+ issue: "Issue token",
2594
+ col: {
2595
+ name: "Name",
2596
+ scopes: "Scopes",
2597
+ created: "Created",
2598
+ expires: "Expires",
2599
+ lastUsed: "Last used"
2600
+ },
2601
+ revoked: "revoked",
2602
+ revoke: "Revoke",
2603
+ revokeConfirm: 'Revoke "{name}"? Anything using it stops working immediately.',
2604
+ emptyTitle: "No scoped tokens yet",
2605
+ emptyBody: "Issue a read-only token for a dashboard or a teammate instead of sharing the root.",
2606
+ legacyTitle: "Legacy per-brick tokens",
2607
+ legacyNone: "None \u2014 every brick's admin surface goes through this token.",
2608
+ legacyRow: "still registers its standalone routes with its own token (deprecated)"
2609
+ };
2610
+ var tokens_default = tokens;
2611
+
2612
+ // src/admin-i18n/en/operators.ts
2613
+ var operators = {
2614
+ title: "Operators",
2615
+ lead: "The people who can sign in to this console. Each one uses a password and an authenticator app; there is no sign-up.",
2616
+ level: {
2617
+ read: "Read only",
2618
+ editor: "Editor",
2619
+ owner: "Owner"
2620
+ },
2621
+ levelHint: {
2622
+ read: "look around, change nothing",
2623
+ editor: "change config, templates, users",
2624
+ owner: "secrets, tokens and operators too"
2625
+ },
2626
+ needsOwner: "Managing operators needs the Owner level.",
2627
+ mintedTitle: "Send this link to {email}. It is shown once.",
2628
+ mintedBody: "It works once and expires {date}.",
2629
+ invite: "Invite",
2630
+ invitePlaceholder: "teammate@company.com",
2631
+ inviteLabel: "Email to invite",
2632
+ accessLevelLabel: "Access level",
2633
+ accessLevelFor: "Access level for {email}",
2634
+ createInvite: "Create invite link",
2635
+ emptyTitle: "No operators yet",
2636
+ col: {
2637
+ operator: "Operator",
2638
+ access: "Access",
2639
+ status: "Status",
2640
+ lastSignIn: "Last sign-in"
2641
+ },
2642
+ settingUp: "setting up",
2643
+ backupCodesLeftOne: "{n} backup code left",
2644
+ backupCodesLeftMany: "{n} backup codes left",
2645
+ recoveryLink: "Recovery link",
2646
+ recoveryConfirm: "Create a recovery link for {email}? It signs them out everywhere; the link sets a new password and a new authenticator.",
2647
+ disable: "Disable",
2648
+ enable: "Enable",
2649
+ disableConfirm: "Disable {email}? They are signed out immediately.",
2650
+ pendingLinks: "Pending links",
2651
+ linkKind: {
2652
+ invite: "invite",
2653
+ recovery: "recovery"
2654
+ },
2655
+ expiresOn: "expires {date}",
2656
+ revoke: "Revoke"
2657
+ };
2658
+ var operators_default = operators;
2659
+
2660
+ // src/admin-i18n/en/users.ts
2661
+ var users = {
2662
+ title: "Users",
2663
+ lead: "Everyone signed up. Open an account for its sessions, sign-ins and the suspend and sign-out controls.",
2664
+ emailPlaceholder: "email address",
2665
+ emailLabel: "Email",
2666
+ allUsers: "All users",
2667
+ whichAccounts: "Which accounts",
2668
+ activeAccounts: "Active",
2669
+ deletedAccounts: "Deleted",
2670
+ noUserWithEmail: "No user with that email.",
2671
+ missingIdPrefix: "No account with id",
2672
+ missingIdBody: "It was deleted, or never existed here. Its billing records remain.",
2673
+ planCredits: "Plan & credits",
2674
+ emptyTitle: "No users yet",
2675
+ emptyBody: "Sign-ups appear here as they happen.",
2676
+ col: {
2677
+ email: "Email",
2678
+ name: "Name",
2679
+ plan: "Plan",
2680
+ created: "Created",
2681
+ status: "Status"
2682
+ },
2683
+ field: {
2684
+ id: "id",
2685
+ email: "email",
2686
+ verified: "verified",
2687
+ mfa: "MFA",
2688
+ provider: "provider",
2689
+ lastLogin: "last login",
2690
+ created: "created"
2691
+ },
2692
+ passwordProvider: "password",
2693
+ noPasswordSet: "no password set",
2694
+ deletedOn: "Deleted on {date}.",
2695
+ deletedBody: "The account cannot sign in, and it is erased when the retention purge runs. Its billing records stay.",
2696
+ suspend: "Suspend",
2697
+ unsuspend: "Unsuspend",
2698
+ signOutEverywhere: "Sign out everywhere",
2699
+ liveSessions: "Live sessions",
2700
+ since: "since {date}",
2701
+ recentSignIns: "Recent sign-ins",
2702
+ noneRecorded: "None recorded.",
2703
+ outcome: {
2704
+ success: "success",
2705
+ failure: "failure"
2706
+ },
2707
+ proxyVpn: "proxy/VPN",
2708
+ hosting: "hosting"
2709
+ };
2710
+ var users_default = users;
2711
+
2712
+ // src/admin-i18n/en/billing.ts
2713
+ var billing = {
2714
+ statusLabel: {
2715
+ active: "active",
2716
+ trialing: "trialing",
2717
+ past_due: "past due",
2718
+ unpaid: "unpaid",
2719
+ canceled: "canceled",
2720
+ incomplete: "incomplete",
2721
+ incomplete_expired: "incomplete (expired)",
2722
+ paused: "paused"
2723
+ },
2724
+ intervalLabel: {
2725
+ month: "month",
2726
+ year: "year"
2727
+ },
2728
+ renews: "Renews",
2729
+ ends: "Ends",
2730
+ ended: "Ended",
2731
+ loading: "Loading billing\u2026",
2732
+ plan: "Plan",
2733
+ free: "Free",
2734
+ noSubscription: "no subscription",
2735
+ credits: "Credits",
2736
+ currencyPlaceholder: "currency",
2737
+ currencyLabel: "Wallet currency",
2738
+ currencyTitle: "Show the wallet in another currency",
2739
+ breakdown: "{permanent} permanent \xB7 {allowance} plan allowance",
2740
+ expires: " (expires {date})",
2741
+ noWallet: "No wallet \u2014 billing has no wallet configuration.",
2742
+ grantCredits: "Grant credits",
2743
+ amountPlaceholder: "amount ({currency})",
2744
+ amountLabel: "Amount",
2745
+ reasonPlaceholder: "reason (optional)",
2746
+ reasonLabel: "Reason",
2747
+ grant: "Grant",
2748
+ granted: "Granted {amount} {currency}.",
2749
+ noMovements: "No credit movements yet",
2750
+ col: {
2751
+ when: "When",
2752
+ kind: "Kind",
2753
+ amount: "Amount",
2754
+ note: "Note"
2755
+ },
2756
+ ledgerKind: {
2757
+ purchase: "purchase",
2758
+ grant: "grant",
2759
+ usage: "usage",
2760
+ refund: "refund",
2761
+ adjustment: "adjustment",
2762
+ expiry: "expiry"
2763
+ },
2764
+ subscriptions: {
2765
+ title: "Subscriptions",
2766
+ lead: "Who pays, and who is behind. A user's plan and credits are also on their page under Users \u2014 free users appear only there.",
2767
+ detailLead: "Plan, credits and what moved.",
2768
+ back: "All subscriptions",
2769
+ filterLabel: "Filter by status",
2770
+ filter: {
2771
+ all: "All",
2772
+ active: "Active",
2773
+ trialing: "Trialing",
2774
+ pastDue: "Past due",
2775
+ canceled: "Canceled"
2776
+ },
2777
+ empty: {
2778
+ all: "No subscriptions yet",
2779
+ active: "No active subscriptions",
2780
+ trialing: "No trialing subscriptions",
2781
+ pastDue: "No past-due subscriptions",
2782
+ canceled: "No canceled subscriptions"
2783
+ },
2784
+ emptyHint: "Subscriptions appear here once someone checks out.",
2785
+ typeLabel: "Type",
2786
+ typeWorkspace: "workspace",
2787
+ typeUser: "user",
2788
+ idPlaceholder: "subscriber id",
2789
+ idLabel: "Subscriber id",
2790
+ col: {
2791
+ subscriber: "Subscriber",
2792
+ plan: "Plan",
2793
+ status: "Status",
2794
+ renewsEnds: "Renews / ends"
2795
+ },
2796
+ cancels: "cancels"
2797
+ }
2798
+ };
2799
+ var billing_default = billing;
2800
+
2801
+ // src/admin-i18n/en/catalog.ts
2802
+ var catalog = {
2803
+ title: "Catalog",
2804
+ lead: "What you sell: plans as configured in code, and as stored in the database, side by side.",
2805
+ configured: "Configured (code)",
2806
+ stored: "Stored (database)",
2807
+ emptyTitle: "No stored plans",
2808
+ emptyBody: "Plans are configured in code; nothing has been written to the database.",
2809
+ col: {
2810
+ plan: "Plan",
2811
+ tier: "Tier",
2812
+ seats: "Seats",
2813
+ monthly: "Monthly",
2814
+ yearly: "Yearly",
2815
+ trial: "Trial"
2816
+ },
2817
+ trialDays: "{n} d",
2818
+ deleteConfirm: 'Delete stored plan "{name}"?'
2819
+ };
2820
+ var catalog_default = catalog;
2821
+
2822
+ // src/admin-i18n/en/audit.ts
2823
+ var audit = {
2824
+ title: "Audit",
2825
+ lead: "What happened, across every workspace unless you name one. The chain's integrity verdict is on the Doctor page.",
2826
+ workspacePlaceholder: "workspace id (all if empty)",
2827
+ typePlaceholder: "event type",
2828
+ actorPlaceholder: "actor id",
2829
+ fromLabel: "From date",
2830
+ fromTitle: "From (inclusive)",
2831
+ toLabel: "To date",
2832
+ toTitle: "To (inclusive)",
2833
+ empty: "Nothing recorded for this filter",
2834
+ col: {
2835
+ when: "When",
2836
+ type: "Type",
2837
+ workspace: "Workspace",
2838
+ actor: "Actor",
2839
+ request: "Request"
2840
+ }
2841
+ };
2842
+ var audit_default = audit;
2843
+
2844
+ // src/admin-i18n/en/config.ts
2845
+ var config = {
2846
+ environment: "Environment",
2847
+ reveal: "Reveal",
2848
+ type: {
2849
+ text: "text",
2850
+ number: "number",
2851
+ onOff: "on/off",
2852
+ json: "json"
2853
+ },
2854
+ shape: {
2855
+ text: "Text",
2856
+ number: "Number",
2857
+ onOff: "On/off",
2858
+ list: "List",
2859
+ object: "Object",
2860
+ empty: "Empty"
2861
+ },
2862
+ list: {
2863
+ title: "Config",
2864
+ newEntry: "New entry",
2865
+ hint: "Feature flags and runtime settings \u2014 text, numbers, on/off or JSON. Read by the app without a deploy.",
2866
+ empty: "No config entries yet.",
2867
+ emptyCta: "Create one to toggle a feature or tune a setting without redeploying.",
2868
+ emptyInEnv: 'No config in {env}. Entries in "all" still apply there.',
2869
+ publicBadge: "public",
2870
+ publicTitle: "Served to frontends by GET /config/public",
2871
+ publicSummary: "What frontends receive ({n} public keys)",
2872
+ publicSummaryOne: "What frontends receive (1 public key)",
2873
+ publicHint: "Exactly the body of {route} \u2014 unauthenticated, so anyone can read it. Only keys the app lists as public appear.",
2874
+ secretsTitle: "Secrets",
2875
+ newSecret: "New secret",
2876
+ secretsHint: "Encrypted at rest; values are hidden until revealed.",
2877
+ secretsEmpty: "No secrets yet.",
2878
+ secretsEmptyInEnv: "No secrets in {env}."
2879
+ },
2880
+ editor: {
2881
+ newEntry: "New config entry",
2882
+ newSecret: "New secret",
2883
+ environmentLabel: "Environment:",
2884
+ key: "Key",
2885
+ environmentHint: '"all" is shared by every environment; a named one (production, staging\u2026) overrides it there.',
2886
+ value: "Value",
2887
+ newValue: "New value",
2888
+ valuePlaceholder: 'true \xB7 42 \xB7 Scheduled maintenance tonight \xB7 {"ids": ["m1", "m2"]}',
2889
+ detected: "Detected:",
2890
+ saveAsText: "Save as text instead",
2891
+ on: "On (true)",
2892
+ off: "Off (false)",
2893
+ type: "Type:",
2894
+ changeType: "Change type\u2026",
2895
+ changeTypeWarning: "Changing the type changes what every screen reading this key receives. Check the code that reads it first.",
2896
+ description: "Description",
2897
+ conflict: "Someone changed this entry since you opened it. Reload to see their change, then edit again.",
2898
+ confirmDelete: 'Delete "{key}"? Anything that reads it falls back to its default.',
2899
+ confirmDeleteIn: 'Delete "{key}" from {env}? Anything that reads it falls back to its default.',
2900
+ history: "History",
2901
+ unknownActor: "unknown",
2902
+ rollBack: "Roll back"
2903
+ },
2904
+ errors: {
2905
+ keyRequired: "Enter a key.",
2906
+ keyPattern: 'Start with a letter; use letters, digits, ".", "_" or "-" (max 128).',
2907
+ exists: '"{key}" already exists in {env} \u2014 open it from the list to edit.',
2908
+ number: "Enter a number.",
2909
+ boolean: "Use true or false.",
2910
+ json: "Not valid JSON: {detail}"
2911
+ }
2912
+ };
2913
+ var config_default = config;
2914
+
2915
+ // src/admin-i18n/en/templates.ts
2916
+ var templates = {
2917
+ defaultLocale: "default locale",
2918
+ builtInBadge: "built-in",
2919
+ subject: "Subject",
2920
+ htmlBody: "HTML body",
2921
+ textBody: "Plain-text body",
2922
+ list: {
2923
+ title: "Templates",
2924
+ newTemplate: "New template",
2925
+ hint: "Every email the app sends. Open one to edit its copy and preview it live.",
2926
+ loading: "Loading templates\u2026"
2927
+ },
2928
+ editor: {
2929
+ loading: "Loading template\u2026",
2930
+ addLocale: "+ Add locale",
2931
+ builtInNote: "built-in email: edit or roll back, it cannot be deleted",
2932
+ active: "Active",
2933
+ conflict: "Someone changed this template since you opened it. Reload to see their change, then edit again.",
2934
+ noChanges: "No changes to save",
2935
+ sampleData: "Sample data",
2936
+ sampleNotObject: "Sample data must be a JSON object.",
2937
+ sampleInvalid: "Sample data is not valid JSON.",
2938
+ preview: "Preview",
2939
+ previewTitle: "Template preview",
2940
+ rendering: "Rendering\u2026",
2941
+ live: "Live",
2942
+ nothingRendered: "Nothing rendered yet.",
2943
+ history: "History",
2944
+ unknownActor: "unknown",
2945
+ rollBack: "Roll back",
2946
+ confirmDelete: 'Delete "{type}"?',
2947
+ confirmDeleteLocale: 'Delete the {locale} version of "{type}"? People in that locale will receive the default version.'
2948
+ },
2949
+ create: {
2950
+ titleNew: "New template",
2951
+ titleLocale: "Add a locale to {type}",
2952
+ hintNew: "For an email your app sends that has no stored copy yet. The type must match what the app sends.",
2953
+ hintLocale: "Starts from the default copy. People whose locale matches receive this version; everyone else keeps the default.",
2954
+ type: "Type",
2955
+ locale: "Locale",
2956
+ localeOptional: "Locale (optional \u2014 empty is the default)",
2957
+ creating: "Creating\u2026",
2958
+ submitNew: "Create template",
2959
+ submitLocale: "Add locale",
2960
+ errorType: "Type: lowercase letters, digits, - and _ (e.g. weekly-digest).",
2961
+ errorLocaleRequired: "Choose the locale to add, e.g. fr or fr-CA.",
2962
+ errorLocale: "Locale: a language tag such as fr, es or fr-CA.",
2963
+ errorText: "The plain-text body is required \u2014 it is what every email client can show.",
2964
+ exists: '"{type}" already exists \u2014 open it from the list to edit.',
2965
+ existsLocale: '"{type}" ({locale}) already exists \u2014 open it from the list to edit.'
2966
+ }
2967
+ };
2968
+ var templates_default = templates;
2969
+
2970
+ // src/admin-i18n/en/index.ts
2971
+ var en = { common: common_default, nav: nav_default, shell: shell_default, session: session_default, attention: attention_default, modules: modules_default, environment: environment_default, doctor: doctor_default, routes: routes_default, log: log_default, migrations: migrations_default, tokens: tokens_default, operators: operators_default, users: users_default, billing: billing_default, catalog: catalog_default, audit: audit_default, config: config_default, templates: templates_default };
2972
+ var en_default = en;
2973
+
2974
+ // src/admin-i18n/es/common.ts
2975
+ var common2 = {
2976
+ refresh: "Actualizar",
2977
+ working: "Procesando\u2026",
2978
+ loading: "Cargando\u2026",
2979
+ loadMore: "Cargar m\xE1s",
2980
+ save: "Guardar",
2981
+ saving: "Guardando\u2026",
2982
+ cancel: "Cancelar",
2983
+ delete: "Eliminar",
2984
+ deleting: "Eliminando\u2026",
2985
+ back: "Volver",
2986
+ open: "Abrir",
2987
+ copy: "Copiar",
2988
+ copied: "Copiado",
2989
+ dismiss: "Cerrar",
2990
+ confirm: "Confirmar",
2991
+ continue: "Continuar",
2992
+ reload: "Recargar",
2993
+ search: "Buscar",
2994
+ lookUp: "Buscar",
2995
+ filter: "Filtrar",
2996
+ yes: "s\xED",
2997
+ no: "no",
2998
+ none: "Ninguno.",
2999
+ never: "nunca",
3000
+ you: "t\xFA",
3001
+ all: "Todos",
3002
+ allEnvironments: "Todos los entornos",
3003
+ language: "Idioma",
3004
+ theme: "Tema",
3005
+ themeSystem: "Sistema",
3006
+ themeLight: "Claro",
3007
+ themeDark: "Oscuro",
3008
+ status: {
3009
+ active: "activo",
3010
+ inactive: "inactivo",
3011
+ ready: "listo",
3012
+ error: "error",
3013
+ advice: "consejo",
3014
+ ok: "ok",
3015
+ failed: "fallido",
3016
+ skipped: "omitido",
3017
+ suspended: "suspendido",
3018
+ deleted: "eliminado",
3019
+ disabled: "desactivado",
3020
+ locked: "bloqueado",
3021
+ pending: "pendiente",
3022
+ set: "definida",
3023
+ missing: "falta",
3024
+ free: "gratis"
3025
+ }
3026
+ };
3027
+ var common_default2 = common2;
3028
+
3029
+ // src/admin-i18n/es/nav.ts
3030
+ var nav2 = {
3031
+ groups: {
3032
+ today: "Hoy",
3033
+ system: "Sistema",
3034
+ people: "Personas",
3035
+ money: "Finanzas",
3036
+ settings: "Ajustes",
3037
+ messaging: "Mensajer\xEDa",
3038
+ activity: "Actividad"
3039
+ },
3040
+ items: {
3041
+ attention: "Atenci\xF3n",
3042
+ modules: "M\xF3dulos",
3043
+ environment: "Entorno",
3044
+ doctor: "Diagn\xF3stico",
3045
+ routes: "Rutas",
3046
+ users: "Usuarios",
3047
+ catalog: "Cat\xE1logo",
3048
+ subscriptions: "Suscripciones",
3049
+ settings: "Configuraci\xF3n y secretos",
3050
+ templates: "Plantillas",
3051
+ audit: "Auditor\xEDa",
3052
+ log: "Registro de administraci\xF3n",
3053
+ operators: "Operadores",
3054
+ tokens: "Tokens",
3055
+ migrations: "Migraciones"
3056
+ }
3057
+ };
3058
+ var nav_default2 = nav2;
3059
+
3060
+ // src/admin-i18n/es/shell.ts
3061
+ var shell2 = {
3062
+ openMenu: "Abrir el men\xFA",
3063
+ closeMenu: "Cerrar el men\xFA",
3064
+ navLabel: "Administraci\xF3n",
3065
+ missingClient: "Proporciona un {client} para usar esta p\xE1gina."
3066
+ };
3067
+ var shell_default2 = shell2;
3068
+
3069
+ // src/admin-i18n/es/session.ts
3070
+ var session2 = {
3071
+ signInTitle: "Iniciar sesi\xF3n en la administraci\xF3n",
3072
+ adminToken: "Token de administraci\xF3n",
3073
+ pasteToken: "Pega tu token",
3074
+ tokenFoot: "Se guarda solo para esta pesta\xF1a y se env\xEDa en un encabezado Bearer \u2014 nunca se almacena en el servidor. Un token de solo lectura basta para consultar y no puede revelar secretos.",
3075
+ tokenRefused: "Ese token fue rechazado.",
3076
+ unreachable: "No se pudo acceder a la interfaz de administraci\xF3n: {error}",
3077
+ forgetToken: "Olvidar el token",
3078
+ signOut: "Cerrar sesi\xF3n",
3079
+ genericError: "Algo sali\xF3 mal. Int\xE9ntalo de nuevo.",
3080
+ stepOf: "Paso {n} de {total}",
3081
+ steps: {
3082
+ adminToken: "Token de administraci\xF3n",
3083
+ account: "Tu cuenta",
3084
+ authenticator: "Autenticador",
3085
+ backupCodes: "C\xF3digos de respaldo",
3086
+ newPassword: "Nueva contrase\xF1a"
3087
+ },
3088
+ checking: "Comprobando\u2026",
3089
+ welcomeTitle: "Bienvenido \u2014 configuremos tu consola",
3090
+ welcomeSubtitle: "Este es el primer inicio de sesi\xF3n en {host}. Pega el token de administraci\xF3n de la configuraci\xF3n de tu despliegue para empezar. Solo se necesita esta vez.",
3091
+ createAccountTitle: "Crea tu cuenta",
3092
+ createAccountSubtitle: "A partir de ahora inicias sesi\xF3n con este correo y esta contrase\xF1a, adem\xE1s de una aplicaci\xF3n de autenticaci\xF3n. El token de administraci\xF3n queda para scripts y emergencias.",
3093
+ email: "Correo electr\xF3nico",
3094
+ nameOptional: "Nombre (opcional)",
3095
+ yourNameOptional: "Tu nombre (opcional)",
3096
+ password: "Contrase\xF1a",
3097
+ newPassword: "Nueva contrase\xF1a",
3098
+ confirmPassword: "Confirma la contrase\xF1a",
3099
+ passwordHint: "Al menos 12 caracteres.",
3100
+ passwordHintNext: "Al menos 12 caracteres. A continuaci\xF3n configurar\xE1s una aplicaci\xF3n de autenticaci\xF3n.",
3101
+ passwordsMismatch: "Las dos contrase\xF1as no coinciden.",
3102
+ creating: "Creando\u2026",
3103
+ createAccount: "Crear cuenta",
3104
+ loginFoot: "No hay registro: los operadores son invitados por otro operador. \xBFSin acceso? Pide a otro operador un enlace de recuperaci\xF3n.",
3105
+ backupCode: "C\xF3digo de respaldo",
3106
+ authenticatorCode: "C\xF3digo de autenticaci\xF3n",
3107
+ useApp: "Usar la aplicaci\xF3n de autenticaci\xF3n",
3108
+ useBackup: "Usar un c\xF3digo de respaldo",
3109
+ enrollTitle: "Configura tu autenticador",
3110
+ enrollSubtitle: "Cada inicio de sesi\xF3n en esta consola requiere un c\xF3digo de una aplicaci\xF3n de autenticaci\xF3n \u2014 1Password, Google Authenticator, Authy o cualquier aplicaci\xF3n TOTP.",
3111
+ enrollScan: "Abre tu aplicaci\xF3n de autenticaci\xF3n y escanea este c\xF3digo.",
3112
+ enrollEnter: "Introduce los seis d\xEDgitos que muestra.",
3113
+ qrAlt: "C\xF3digo QR para tu aplicaci\xF3n de autenticaci\xF3n",
3114
+ cantScan: "\xBFNo puedes escanear? Introduce una clave de configuraci\xF3n",
3115
+ preparing: "Preparando\u2026",
3116
+ cancelSignOut: "Cancelar y cerrar sesi\xF3n",
3117
+ codeFromApp: "C\xF3digo de la aplicaci\xF3n",
3118
+ verifyContinue: "Verificar y continuar",
3119
+ backupTitle: "Guarda tus c\xF3digos de respaldo",
3120
+ backupSubtitle: "Si pierdes tu tel\xE9fono, cada uno de estos c\xF3digos te permite iniciar sesi\xF3n una vez. Solo se muestran ahora.",
3121
+ backupFileHeader: "C\xF3digos de respaldo para la administraci\xF3n de {host}",
3122
+ download: "Descargar",
3123
+ savedCheckbox: "He guardado estos c\xF3digos en un lugar seguro",
3124
+ openConsole: "Abrir la consola",
3125
+ linkInvalidTitle: "Este enlace no se puede usar",
3126
+ checkingLink: "Comprobando tu enlace\u2026",
3127
+ joinTitle: "\xDAnete a la consola de administraci\xF3n",
3128
+ recoverTitle: "Recupera tu cuenta",
3129
+ joinSubtitle: "Te invitaron como {email}. Elige una contrase\xF1a y luego configura una aplicaci\xF3n de autenticaci\xF3n.",
3130
+ recoverSubtitle: "Define una nueva contrase\xF1a para {email}. Volver\xE1s a configurar tu autenticador.",
3131
+ stepUpTitle: "Confirma que eres t\xFA",
3132
+ stepUpSubtitle: "Esta acci\xF3n requiere un c\xF3digo nuevo. Es v\xE1lido durante los pr\xF3ximos cinco minutos.",
3133
+ twoStepTitle: "Verificaci\xF3n en dos pasos",
3134
+ twoStepSubtitle: "Introduce el c\xF3digo de tu aplicaci\xF3n de autenticaci\xF3n.",
3135
+ verify: "Verificar",
3136
+ changeLanguage: "Cambiar idioma (actual: {name})",
3137
+ themeChoice: "Tema: {name}",
3138
+ errors: {
3139
+ INVALID_CREDENTIALS: "Ese correo y esa contrase\xF1a no corresponden a ning\xFAn operador.",
3140
+ INVALID_CODE: "Ese c\xF3digo no funcion\xF3. Los c\xF3digos cambian cada 30 segundos.",
3141
+ LOCKED: "Demasiados intentos. Int\xE9ntalo de nuevo en {minutes} minuto(s).",
3142
+ LOCKED_GENERIC: "Demasiados intentos. Int\xE9ntalo de nuevo en unos minutos.",
3143
+ RATE_LIMITED: "Demasiados intentos desde esta direcci\xF3n. Espera unos minutos.",
3144
+ WEAK_PASSWORD: "Elige una contrase\xF1a m\xE1s segura \u2014 al menos 12 caracteres y dif\xEDcil de adivinar.",
3145
+ INVALID_LINK: "Este enlace caduc\xF3 o ya se us\xF3. Pide uno nuevo.",
3146
+ ALREADY_OPERATOR: "Ese correo ya pertenece a un operador. Inicia sesi\xF3n.",
3147
+ ALREADY_CLAIMED: "Esta consola ya tiene operadores. Pide una invitaci\xF3n a uno de ellos.",
3148
+ CROSS_ORIGIN: "Esta solicitud no proviene de la p\xE1gina de administraci\xF3n."
3149
+ }
3150
+ };
3151
+ var session_default2 = session2;
3152
+
3153
+ // src/admin-i18n/es/attention.ts
3154
+ var attention2 = {
3155
+ title: "Atenci\xF3n",
3156
+ lead: "Lo que necesita tu atenci\xF3n en este despliegue",
3157
+ leadChecked: "Lo que necesita tu atenci\xF3n en este despliegue \xB7 comprobado a las {time}",
3158
+ needsAction: "Requiere acci\xF3n",
3159
+ needsActionHint: "errores por corregir",
3160
+ advice: "Consejos",
3161
+ adviceHint: "vale la pena revisarlos",
3162
+ modulesReady: "M\xF3dulos listos",
3163
+ modulesReadyHint: "admin {version}",
3164
+ routes: "Rutas",
3165
+ running: "Ejecutando las comprobaciones\u2026",
3166
+ emptyTitle: "Nada requiere tu atenci\xF3n",
3167
+ emptyBody: "Todas las comprobaciones pasan. Comprobado el {time}."
3168
+ };
3169
+ var attention_default2 = attention2;
3170
+
3171
+ // src/admin-i18n/es/modules.ts
3172
+ var modules2 = {
3173
+ title: "M\xF3dulos",
3174
+ lead: "Cada m\xF3dulo instalado, su versi\xF3n y si est\xE1 listo.",
3175
+ leadSummary: "{env} \xB7 admin {version} \xB7 registro de administraci\xF3n {log} \xB7 {routes} rutas",
3176
+ logOn: "activado",
3177
+ logOff: "desactivado",
3178
+ colModule: "M\xF3dulo",
3179
+ colVersion: "Versi\xF3n",
3180
+ colReadiness: "Estado",
3181
+ colAdmin: "Admin",
3182
+ notReported: "no informada",
3183
+ describesAdmin: "describe la administraci\xF3n"
3184
+ };
3185
+ var modules_default2 = modules2;
3186
+
3187
+ // src/admin-i18n/es/environment.ts
3188
+ var environment2 = {
3189
+ title: "Entorno",
3190
+ lead: "Si cada m\xF3dulo est\xE1 configurado y si cada variable que lee la aplicaci\xF3n est\xE1 definida. Los valores nunca se muestran.",
3191
+ missingCount: "faltan {n}",
3192
+ allSet: "todas definidas",
3193
+ variables: "Variables",
3194
+ noVariables: "No hay variables declaradas: pasa `env` a AdminModule.",
3195
+ moduleReadiness: "Estado de los m\xF3dulos",
3196
+ problemOne: "1 problema",
3197
+ problemMany: "{n} problemas"
3198
+ };
3199
+ var environment_default2 = environment2;
3200
+
3201
+ // src/admin-i18n/es/doctor.ts
3202
+ var doctor2 = {
3203
+ title: "Diagn\xF3stico",
3204
+ lead: "Todas las comprobaciones de coherencia de los m\xF3dulos instalados, ejecutadas a demanda.",
3205
+ allPass: "todas las comprobaciones pasan",
3206
+ oneFailed: "una comprobaci\xF3n fall\xF3",
3207
+ runAgain: "Volver a ejecutar",
3208
+ running: "Ejecutando las comprobaciones\u2026",
3209
+ colResult: "Resultado",
3210
+ colCheck: "Comprobaci\xF3n",
3211
+ colTime: "Duraci\xF3n"
3212
+ };
3213
+ var doctor_default2 = doctor2;
3214
+
3215
+ // src/admin-i18n/es/routes.ts
3216
+ var routes2 = {
3217
+ title: "Rutas",
3218
+ lead: "Cada ruta expuesta, con su protecci\xF3n.",
3219
+ leadCount: "{n} rutas expuestas por este despliegue, con la protecci\xF3n que tiene cada una.",
3220
+ filterPlaceholder: "Filtrar por ruta, m\xE9todo, m\xF3dulo\u2026",
3221
+ filterLabel: "Filtrar rutas",
3222
+ colMethod: "M\xE9todo",
3223
+ colPath: "Ruta",
3224
+ colGuard: "Protecci\xF3n",
3225
+ colModule: "M\xF3dulo",
3226
+ application: "aplicaci\xF3n",
3227
+ noMatch: "Ninguna ruta coincide con \xAB{q}\xBB."
3228
+ };
3229
+ var routes_default2 = routes2;
3230
+
3231
+ // src/admin-i18n/es/log.ts
3232
+ var log2 = {
3233
+ title: "Registro de administraci\xF3n",
3234
+ lead: "Cada solicitud realizada a trav\xE9s de esta consola, de la m\xE1s reciente a la m\xE1s antigua, incluidas las rechazadas.",
3235
+ off: "El registro de administraci\xF3n est\xE1 desactivado: proporciona un store a AdminModule.",
3236
+ empty: "Todav\xEDa no hay solicitudes",
3237
+ colWhen: "Fecha",
3238
+ colActor: "Autor",
3239
+ colRequest: "Solicitud",
3240
+ colStatus: "Estado",
3241
+ colModule: "M\xF3dulo"
3242
+ };
3243
+ var log_default2 = log2;
3244
+
3245
+ // src/admin-i18n/es/migrations.ts
3246
+ var migrations2 = {
3247
+ title: "Migraciones",
3248
+ lead: "Los cambios de esquema que incluye cada m\xF3dulo, y si esta base de datos ya los tiene.",
3249
+ needsWrite: "Aplicar migraciones requiere un token con permiso de escritura.",
3250
+ firstInstall: "Esta base de datos nunca se ha migrado: se trata como una primera instalaci\xF3n, as\xED que no se retiene nada.",
3251
+ upToDate: "Todos los m\xF3dulos est\xE1n al d\xEDa",
3252
+ noPending: "No hay migraciones pendientes.",
3253
+ pendingCount: "{n} pendientes",
3254
+ destructive: "destructiva",
3255
+ additive: "aditiva",
3256
+ blockedBy: "Aplica primero \xAB{module}\xBB: se ejecuta antes que este y est\xE1 atrasado.",
3257
+ destructiveBlocked: "Contiene una migraci\xF3n que elimina datos. Ninguna migraci\xF3n inversa los recupera: apl\xEDcala mediante la CI o `npm run migrate`.",
3258
+ confirmApply: "\xBFAplicar {n} migraci\xF3n(es) a \xAB{module}\xBB? Esto modifica el esquema de la base de datos.",
3259
+ applyOne: "Aplicar 1 migraci\xF3n",
3260
+ applyMany: "Aplicar {n} migraciones"
3261
+ };
3262
+ var migrations_default2 = migrations2;
3263
+
3264
+ // src/admin-i18n/es/tokens.ts
3265
+ var tokens2 = {
3266
+ title: "Tokens",
3267
+ lead: "Credenciales para m\xE1quinas: la solidez del token ra\xEDz, tokens con alcance limitado para la CLI y la CI, y cualquier token heredado por m\xF3dulo. Las personas inician sesi\xF3n como operadores.",
3268
+ needsRoot: "Emitir y revocar requieren el token ra\xEDz (el de la configuraci\xF3n de tu despliegue).",
3269
+ rootToken: "Token ra\xEDz",
3270
+ strong: "s\xF3lido",
3271
+ weak: "d\xE9bil",
3272
+ issuedTokens: "Tokens emitidos",
3273
+ issuingOff: "La emisi\xF3n est\xE1 desactivada \u2014 proporciona un store a AdminModule y ejecuta sus migraciones.",
3274
+ copyNow: "C\xF3pialo ahora \u2014 no se volver\xE1 a mostrar.",
3275
+ namePlaceholder: "nombre",
3276
+ nameLabel: "Nombre",
3277
+ scope: {
3278
+ read: "lectura",
3279
+ write: "escritura",
3280
+ secrets: "secretos"
3281
+ },
3282
+ daysPlaceholder: "d\xEDas (opcional)",
3283
+ daysLabel: "D\xEDas",
3284
+ issue: "Emitir token",
3285
+ col: {
3286
+ name: "Nombre",
3287
+ scopes: "Alcances",
3288
+ created: "Creado",
3289
+ expires: "Vence",
3290
+ lastUsed: "\xDAltimo uso"
3291
+ },
3292
+ revoked: "revocado",
3293
+ revoke: "Revocar",
3294
+ revokeConfirm: "\xBFRevocar \xAB{name}\xBB? Todo lo que lo use dejar\xE1 de funcionar de inmediato.",
3295
+ emptyTitle: "A\xFAn no hay tokens con alcance limitado",
3296
+ emptyBody: "Emite un token de solo lectura para un panel o un compa\xF1ero en lugar de compartir el token ra\xEDz.",
3297
+ legacyTitle: "Tokens heredados por m\xF3dulo",
3298
+ legacyNone: "Ninguno \u2014 la superficie de administraci\xF3n de cada m\xF3dulo pasa por este token.",
3299
+ legacyRow: "todav\xEDa registra sus rutas independientes con su propio token (obsoleto)"
3300
+ };
3301
+ var tokens_default2 = tokens2;
3302
+
3303
+ // src/admin-i18n/es/operators.ts
3304
+ var operators2 = {
3305
+ title: "Operadores",
3306
+ lead: "Las personas que pueden iniciar sesi\xF3n en esta consola. Cada una usa una contrase\xF1a y una aplicaci\xF3n de autenticaci\xF3n; no hay registro.",
3307
+ level: {
3308
+ read: "Solo lectura",
3309
+ editor: "Editor",
3310
+ owner: "Propietario"
3311
+ },
3312
+ levelHint: {
3313
+ read: "consultar, sin cambiar nada",
3314
+ editor: "cambiar configuraci\xF3n, plantillas y usuarios",
3315
+ owner: "tambi\xE9n secretos, tokens y operadores"
3316
+ },
3317
+ needsOwner: "Gestionar operadores requiere el nivel Propietario.",
3318
+ mintedTitle: "Env\xEDa este enlace a {email}. Solo se muestra una vez.",
3319
+ mintedBody: "Funciona una sola vez y vence el {date}.",
3320
+ invite: "Invitar",
3321
+ invitePlaceholder: "companero@empresa.com",
3322
+ inviteLabel: "Correo electr\xF3nico a invitar",
3323
+ accessLevelLabel: "Nivel de acceso",
3324
+ accessLevelFor: "Nivel de acceso de {email}",
3325
+ createInvite: "Crear enlace de invitaci\xF3n",
3326
+ emptyTitle: "A\xFAn no hay operadores",
3327
+ col: {
3328
+ operator: "Operador",
3329
+ access: "Acceso",
3330
+ status: "Estado",
3331
+ lastSignIn: "\xDAltimo inicio de sesi\xF3n"
3332
+ },
3333
+ settingUp: "en configuraci\xF3n",
3334
+ backupCodesLeftOne: "queda {n} c\xF3digo de respaldo",
3335
+ backupCodesLeftMany: "quedan {n} c\xF3digos de respaldo",
3336
+ recoveryLink: "Enlace de recuperaci\xF3n",
3337
+ recoveryConfirm: "\xBFCrear un enlace de recuperaci\xF3n para {email}? Cierra su sesi\xF3n en todas partes; el enlace permite definir una nueva contrase\xF1a y una nueva aplicaci\xF3n de autenticaci\xF3n.",
3338
+ disable: "Desactivar",
3339
+ enable: "Activar",
3340
+ disableConfirm: "\xBFDesactivar a {email}? Su sesi\xF3n se cierra de inmediato.",
3341
+ pendingLinks: "Enlaces pendientes",
3342
+ linkKind: {
3343
+ invite: "invitaci\xF3n",
3344
+ recovery: "recuperaci\xF3n"
3345
+ },
3346
+ expiresOn: "vence el {date}",
3347
+ revoke: "Revocar"
3348
+ };
3349
+ var operators_default2 = operators2;
3350
+
3351
+ // src/admin-i18n/es/users.ts
3352
+ var users2 = {
3353
+ title: "Usuarios",
3354
+ lead: "Todos los registrados. Abre una cuenta para ver sus sesiones, sus inicios de sesi\xF3n y los controles para suspender y cerrar sesi\xF3n.",
3355
+ emailPlaceholder: "correo electr\xF3nico",
3356
+ emailLabel: "Correo electr\xF3nico",
3357
+ allUsers: "Todos los usuarios",
3358
+ whichAccounts: "Qu\xE9 cuentas",
3359
+ activeAccounts: "Activas",
3360
+ deletedAccounts: "Eliminadas",
3361
+ noUserWithEmail: "No hay ning\xFAn usuario con ese correo electr\xF3nico.",
3362
+ missingIdPrefix: "No hay ninguna cuenta con el id",
3363
+ missingIdBody: "Se elimin\xF3 o nunca existi\xF3 aqu\xED. Sus registros de facturaci\xF3n se conservan.",
3364
+ planCredits: "Plan y cr\xE9ditos",
3365
+ emptyTitle: "A\xFAn no hay usuarios",
3366
+ emptyBody: "Los registros aparecen aqu\xED a medida que ocurren.",
3367
+ col: {
3368
+ email: "Correo electr\xF3nico",
3369
+ name: "Nombre",
3370
+ plan: "Plan",
3371
+ created: "Creado",
3372
+ status: "Estado"
3373
+ },
3374
+ field: {
3375
+ id: "id",
3376
+ email: "correo electr\xF3nico",
3377
+ verified: "verificado",
3378
+ mfa: "MFA",
3379
+ provider: "proveedor",
3380
+ lastLogin: "\xFAltimo inicio de sesi\xF3n",
3381
+ created: "creado"
3382
+ },
3383
+ passwordProvider: "contrase\xF1a",
3384
+ noPasswordSet: "sin contrase\xF1a",
3385
+ deletedOn: "Eliminada el {date}.",
3386
+ deletedBody: "La cuenta no puede iniciar sesi\xF3n y se borrar\xE1 cuando se ejecute la purga de retenci\xF3n. Sus registros de facturaci\xF3n se conservan.",
3387
+ suspend: "Suspender",
3388
+ unsuspend: "Reactivar",
3389
+ signOutEverywhere: "Cerrar sesi\xF3n en todas partes",
3390
+ liveSessions: "Sesiones activas",
3391
+ since: "desde el {date}",
3392
+ recentSignIns: "Inicios de sesi\xF3n recientes",
3393
+ noneRecorded: "Ninguno registrado.",
3394
+ outcome: {
3395
+ success: "correcto",
3396
+ failure: "fallido"
3397
+ },
3398
+ proxyVpn: "proxy/VPN",
3399
+ hosting: "hosting"
3400
+ };
3401
+ var users_default2 = users2;
3402
+
3403
+ // src/admin-i18n/es/billing.ts
3404
+ var billing2 = {
3405
+ statusLabel: {
3406
+ active: "activa",
3407
+ trialing: "en prueba",
3408
+ past_due: "pago atrasado",
3409
+ unpaid: "impagada",
3410
+ canceled: "cancelada",
3411
+ incomplete: "incompleta",
3412
+ incomplete_expired: "incompleta (vencida)",
3413
+ paused: "en pausa"
3414
+ },
3415
+ intervalLabel: {
3416
+ month: "mes",
3417
+ year: "a\xF1o"
3418
+ },
3419
+ renews: "Se renueva el",
3420
+ ends: "Termina el",
3421
+ ended: "Termin\xF3 el",
3422
+ loading: "Cargando facturaci\xF3n\u2026",
3423
+ plan: "Plan",
3424
+ free: "Gratis",
3425
+ noSubscription: "sin suscripci\xF3n",
3426
+ credits: "Cr\xE9ditos",
3427
+ currencyPlaceholder: "moneda",
3428
+ currencyLabel: "Moneda del monedero",
3429
+ currencyTitle: "Mostrar el monedero en otra moneda",
3430
+ breakdown: "{permanent} permanentes \xB7 {allowance} de asignaci\xF3n del plan",
3431
+ expires: " (vence el {date})",
3432
+ noWallet: "Sin monedero \u2014 la facturaci\xF3n no tiene configuraci\xF3n de monedero.",
3433
+ grantCredits: "Otorgar cr\xE9ditos",
3434
+ amountPlaceholder: "cantidad ({currency})",
3435
+ amountLabel: "Cantidad",
3436
+ reasonPlaceholder: "motivo (opcional)",
3437
+ reasonLabel: "Motivo",
3438
+ grant: "Otorgar",
3439
+ granted: "Se otorgaron {amount} {currency}.",
3440
+ noMovements: "A\xFAn no hay movimientos de cr\xE9ditos",
3441
+ col: {
3442
+ when: "Fecha",
3443
+ kind: "Tipo",
3444
+ amount: "Cantidad",
3445
+ note: "Nota"
3446
+ },
3447
+ ledgerKind: {
3448
+ purchase: "compra",
3449
+ grant: "otorgamiento",
3450
+ usage: "uso",
3451
+ refund: "reembolso",
3452
+ adjustment: "ajuste",
3453
+ expiry: "vencimiento"
3454
+ },
3455
+ subscriptions: {
3456
+ title: "Suscripciones",
3457
+ lead: "Qui\xE9n paga y qui\xE9n est\xE1 atrasado. El plan y los cr\xE9ditos de un usuario tambi\xE9n est\xE1n en su p\xE1gina en Usuarios \u2014 los usuarios gratuitos solo aparecen all\xED.",
3458
+ detailLead: "Plan, cr\xE9ditos y movimientos.",
3459
+ back: "Todas las suscripciones",
3460
+ filterLabel: "Filtrar por estado",
3461
+ filter: {
3462
+ all: "Todas",
3463
+ active: "Activas",
3464
+ trialing: "En prueba",
3465
+ pastDue: "Atrasadas",
3466
+ canceled: "Canceladas"
3467
+ },
3468
+ empty: {
3469
+ all: "A\xFAn no hay suscripciones",
3470
+ active: "No hay suscripciones activas",
3471
+ trialing: "No hay suscripciones en prueba",
3472
+ pastDue: "No hay suscripciones con pago atrasado",
3473
+ canceled: "No hay suscripciones canceladas"
3474
+ },
3475
+ emptyHint: "Las suscripciones aparecen aqu\xED cuando alguien completa una compra.",
3476
+ typeLabel: "Tipo",
3477
+ typeWorkspace: "espacio de trabajo",
3478
+ typeUser: "usuario",
3479
+ idPlaceholder: "id del suscriptor",
3480
+ idLabel: "Id del suscriptor",
3481
+ col: {
3482
+ subscriber: "Suscriptor",
3483
+ plan: "Plan",
3484
+ status: "Estado",
3485
+ renewsEnds: "Renovaci\xF3n / fin"
3486
+ },
3487
+ cancels: "se cancelar\xE1"
3488
+ }
3489
+ };
3490
+ var billing_default2 = billing2;
3491
+
3492
+ // src/admin-i18n/es/catalog.ts
3493
+ var catalog2 = {
3494
+ title: "Cat\xE1logo",
3495
+ lead: "Lo que vendes: los planes tal como est\xE1n configurados en el c\xF3digo y tal como est\xE1n guardados en la base de datos, lado a lado.",
3496
+ configured: "Configurados (c\xF3digo)",
3497
+ stored: "Guardados (base de datos)",
3498
+ emptyTitle: "No hay planes guardados",
3499
+ emptyBody: "Los planes est\xE1n configurados en el c\xF3digo; no se ha escrito nada en la base de datos.",
3500
+ col: {
3501
+ plan: "Plan",
3502
+ tier: "Nivel",
3503
+ seats: "Plazas",
3504
+ monthly: "Mensual",
3505
+ yearly: "Anual",
3506
+ trial: "Prueba"
3507
+ },
3508
+ trialDays: "{n} d",
3509
+ deleteConfirm: "\xBFEliminar el plan guardado \xAB{name}\xBB?"
3510
+ };
3511
+ var catalog_default2 = catalog2;
3512
+
3513
+ // src/admin-i18n/es/audit.ts
3514
+ var audit2 = {
3515
+ title: "Auditor\xEDa",
3516
+ lead: "Lo que ha pasado, en todos los espacios de trabajo salvo que indiques uno. El veredicto de integridad de la cadena est\xE1 en la p\xE1gina Diagn\xF3stico.",
3517
+ workspacePlaceholder: "id del espacio de trabajo (todos si est\xE1 vac\xEDo)",
3518
+ typePlaceholder: "tipo de evento",
3519
+ actorPlaceholder: "id del actor",
3520
+ fromLabel: "Fecha de inicio",
3521
+ fromTitle: "Desde (incluido)",
3522
+ toLabel: "Fecha de fin",
3523
+ toTitle: "Hasta (incluido)",
3524
+ empty: "Nada registrado para este filtro",
3525
+ col: {
3526
+ when: "Fecha",
3527
+ type: "Tipo",
3528
+ workspace: "Espacio de trabajo",
3529
+ actor: "Actor",
3530
+ request: "Solicitud"
3531
+ }
3532
+ };
3533
+ var audit_default2 = audit2;
3534
+
3535
+ // src/admin-i18n/es/config.ts
3536
+ var config2 = {
3537
+ environment: "Entorno",
3538
+ reveal: "Mostrar",
3539
+ type: {
3540
+ text: "texto",
3541
+ number: "n\xFAmero",
3542
+ onOff: "s\xED/no",
3543
+ json: "json"
3544
+ },
3545
+ shape: {
3546
+ text: "Texto",
3547
+ number: "N\xFAmero",
3548
+ onOff: "S\xED/no",
3549
+ list: "Lista",
3550
+ object: "Objeto",
3551
+ empty: "Vac\xEDo"
3552
+ },
3553
+ list: {
3554
+ title: "Configuraci\xF3n",
3555
+ newEntry: "Nueva entrada",
3556
+ hint: "Indicadores de funciones y ajustes de ejecuci\xF3n \u2014 texto, n\xFAmeros, s\xED/no o JSON. La aplicaci\xF3n los lee sin desplegar.",
3557
+ empty: "Todav\xEDa no hay entradas de configuraci\xF3n.",
3558
+ emptyCta: "Crea una para activar una funci\xF3n o ajustar un par\xE1metro sin volver a desplegar.",
3559
+ emptyInEnv: 'No hay configuraci\xF3n en {env}. Las entradas de "all" siguen aplic\xE1ndose all\xED.',
3560
+ publicBadge: "p\xFAblico",
3561
+ publicTitle: "Servido a los frontends por GET /config/public",
3562
+ publicSummary: "Lo que reciben los frontends ({n} claves p\xFAblicas)",
3563
+ publicSummaryOne: "Lo que reciben los frontends (1 clave p\xFAblica)",
3564
+ publicHint: "Exactamente el cuerpo de {route} \u2014 sin autenticaci\xF3n, as\xED que cualquiera puede leerlo. Solo aparecen las claves que la aplicaci\xF3n declara p\xFAblicas.",
3565
+ secretsTitle: "Secretos",
3566
+ newSecret: "Nuevo secreto",
3567
+ secretsHint: "Cifrados en reposo; los valores permanecen ocultos hasta que se muestran.",
3568
+ secretsEmpty: "Todav\xEDa no hay secretos.",
3569
+ secretsEmptyInEnv: "No hay secretos en {env}."
3570
+ },
3571
+ editor: {
3572
+ newEntry: "Nueva entrada de configuraci\xF3n",
3573
+ newSecret: "Nuevo secreto",
3574
+ environmentLabel: "Entorno:",
3575
+ key: "Clave",
3576
+ environmentHint: '"all" lo comparten todos los entornos; uno con nombre (production, staging\u2026) lo reemplaza all\xED.',
3577
+ value: "Valor",
3578
+ newValue: "Nuevo valor",
3579
+ valuePlaceholder: 'true \xB7 42 \xB7 Mantenimiento programado esta noche \xB7 {"ids": ["m1", "m2"]}',
3580
+ detected: "Detectado:",
3581
+ saveAsText: "Guardar como texto",
3582
+ on: "S\xED (true)",
3583
+ off: "No (false)",
3584
+ type: "Tipo:",
3585
+ changeType: "Cambiar tipo\u2026",
3586
+ changeTypeWarning: "Cambiar el tipo cambia lo que recibe cada pantalla que lee esta clave. Revisa primero el c\xF3digo que la lee.",
3587
+ description: "Descripci\xF3n",
3588
+ conflict: "Alguien cambi\xF3 esta entrada desde que la abriste. Recarga para ver su cambio y vuelve a editarla.",
3589
+ confirmDelete: '\xBFEliminar "{key}"? Todo lo que la lee vuelve a su valor predeterminado.',
3590
+ confirmDeleteIn: '\xBFEliminar "{key}" de {env}? Todo lo que la lee vuelve a su valor predeterminado.',
3591
+ history: "Historial",
3592
+ unknownActor: "desconocido",
3593
+ rollBack: "Restaurar"
3594
+ },
3595
+ errors: {
3596
+ keyRequired: "Introduce una clave.",
3597
+ keyPattern: 'Empieza por una letra; usa letras, d\xEDgitos, ".", "_" o "-" (m\xE1x. 128).',
3598
+ exists: '"{key}" ya existe en {env} \u2014 \xE1brela desde la lista para editarla.',
3599
+ number: "Introduce un n\xFAmero.",
3600
+ boolean: "Usa true o false.",
3601
+ json: "JSON no v\xE1lido: {detail}"
3602
+ }
3603
+ };
3604
+ var config_default2 = config2;
3605
+
3606
+ // src/admin-i18n/es/templates.ts
3607
+ var templates2 = {
3608
+ defaultLocale: "idioma predeterminado",
3609
+ builtInBadge: "integrado",
3610
+ subject: "Asunto",
3611
+ htmlBody: "Cuerpo HTML",
3612
+ textBody: "Cuerpo en texto plano",
3613
+ list: {
3614
+ title: "Plantillas",
3615
+ newTemplate: "Nueva plantilla",
3616
+ hint: "Cada correo que env\xEDa la aplicaci\xF3n. Abre uno para editar su contenido y ver la vista previa en directo.",
3617
+ loading: "Cargando plantillas\u2026"
3618
+ },
3619
+ editor: {
3620
+ loading: "Cargando plantilla\u2026",
3621
+ addLocale: "+ A\xF1adir idioma",
3622
+ builtInNote: "correo integrado: se puede editar o restaurar, no eliminar",
3623
+ active: "Activa",
3624
+ conflict: "Alguien cambi\xF3 esta plantilla desde que la abriste. Recarga para ver su cambio y vuelve a editarla.",
3625
+ noChanges: "No hay cambios que guardar",
3626
+ sampleData: "Datos de ejemplo",
3627
+ sampleNotObject: "Los datos de ejemplo deben ser un objeto JSON.",
3628
+ sampleInvalid: "Los datos de ejemplo no son un JSON v\xE1lido.",
3629
+ preview: "Vista previa",
3630
+ previewTitle: "Vista previa de la plantilla",
3631
+ rendering: "Generando\u2026",
3632
+ live: "En directo",
3633
+ nothingRendered: "Todav\xEDa no se ha generado nada.",
3634
+ history: "Historial",
3635
+ unknownActor: "desconocido",
3636
+ rollBack: "Restaurar",
3637
+ confirmDelete: '\xBFEliminar "{type}"?',
3638
+ confirmDeleteLocale: '\xBFEliminar la versi\xF3n {locale} de "{type}"? Las personas de ese idioma recibir\xE1n la versi\xF3n predeterminada.'
3639
+ },
3640
+ create: {
3641
+ titleNew: "Nueva plantilla",
3642
+ titleLocale: "A\xF1adir un idioma a {type}",
3643
+ hintNew: "Para un correo que env\xEDa tu aplicaci\xF3n y que a\xFAn no tiene contenido guardado. El tipo debe coincidir con lo que env\xEDa la aplicaci\xF3n.",
3644
+ hintLocale: "Parte del contenido predeterminado. Las personas cuyo idioma coincide reciben esta versi\xF3n; los dem\xE1s conservan la predeterminada.",
3645
+ type: "Tipo",
3646
+ locale: "Idioma",
3647
+ localeOptional: "Idioma (opcional \u2014 vac\xEDo es el predeterminado)",
3648
+ creating: "Creando\u2026",
3649
+ submitNew: "Crear plantilla",
3650
+ submitLocale: "A\xF1adir idioma",
3651
+ errorType: "Tipo: letras min\xFAsculas, d\xEDgitos, - y _ (p. ej. weekly-digest).",
3652
+ errorLocaleRequired: "Elige el idioma que quieres a\xF1adir, p. ej. fr o fr-CA.",
3653
+ errorLocale: "Idioma: una etiqueta de idioma como fr, es o fr-CA.",
3654
+ errorText: "El cuerpo en texto plano es obligatorio \u2014 es lo que puede mostrar cualquier cliente de correo.",
3655
+ exists: '"{type}" ya existe \u2014 \xE1brela desde la lista para editarla.',
3656
+ existsLocale: '"{type}" ({locale}) ya existe \u2014 \xE1brela desde la lista para editarla.'
3657
+ }
3658
+ };
3659
+ var templates_default2 = templates2;
3660
+
3661
+ // src/admin-i18n/es/index.ts
3662
+ var es = { common: common_default2, nav: nav_default2, shell: shell_default2, session: session_default2, attention: attention_default2, modules: modules_default2, environment: environment_default2, doctor: doctor_default2, routes: routes_default2, log: log_default2, migrations: migrations_default2, tokens: tokens_default2, operators: operators_default2, users: users_default2, billing: billing_default2, catalog: catalog_default2, audit: audit_default2, config: config_default2, templates: templates_default2 };
3663
+ var es_default = es;
3664
+
3665
+ // src/admin-i18n/fr/common.ts
3666
+ var common3 = {
3667
+ refresh: "Actualiser",
3668
+ working: "En cours\u2026",
3669
+ loading: "Chargement\u2026",
3670
+ loadMore: "Charger plus",
3671
+ save: "Enregistrer",
3672
+ saving: "Enregistrement\u2026",
3673
+ cancel: "Annuler",
3674
+ delete: "Supprimer",
3675
+ deleting: "Suppression\u2026",
3676
+ back: "Retour",
3677
+ open: "Ouvrir",
3678
+ copy: "Copier",
3679
+ copied: "Copi\xE9",
3680
+ dismiss: "Fermer",
3681
+ confirm: "Confirmer",
3682
+ continue: "Continuer",
3683
+ reload: "Recharger",
3684
+ search: "Rechercher",
3685
+ lookUp: "Rechercher",
3686
+ filter: "Filtrer",
3687
+ yes: "oui",
3688
+ no: "non",
3689
+ none: "Aucun.",
3690
+ never: "jamais",
3691
+ you: "vous",
3692
+ all: "Tous",
3693
+ allEnvironments: "Tous les environnements",
3694
+ language: "Langue",
3695
+ theme: "Th\xE8me",
3696
+ themeSystem: "Syst\xE8me",
3697
+ themeLight: "Clair",
3698
+ themeDark: "Sombre",
3699
+ status: {
3700
+ active: "actif",
3701
+ inactive: "inactif",
3702
+ ready: "pr\xEAt",
3703
+ error: "erreur",
3704
+ advice: "conseil",
3705
+ ok: "ok",
3706
+ failed: "\xE9chec",
3707
+ skipped: "ignor\xE9",
3708
+ suspended: "suspendu",
3709
+ deleted: "supprim\xE9",
3710
+ disabled: "d\xE9sactiv\xE9",
3711
+ locked: "verrouill\xE9",
3712
+ pending: "en attente",
3713
+ set: "d\xE9fini",
3714
+ missing: "manquant",
3715
+ free: "gratuit"
3716
+ }
3717
+ };
3718
+ var common_default3 = common3;
3719
+
3720
+ // src/admin-i18n/fr/nav.ts
3721
+ var nav3 = {
3722
+ groups: {
3723
+ today: "Aujourd'hui",
3724
+ system: "Syst\xE8me",
3725
+ people: "Personnes",
3726
+ money: "Finances",
3727
+ settings: "R\xE9glages",
3728
+ messaging: "Messagerie",
3729
+ activity: "Activit\xE9"
3730
+ },
3731
+ items: {
3732
+ attention: "\xC0 traiter",
3733
+ modules: "Modules",
3734
+ environment: "Environnement",
3735
+ doctor: "Diagnostic",
3736
+ routes: "Routes",
3737
+ users: "Utilisateurs",
3738
+ catalog: "Catalogue",
3739
+ subscriptions: "Abonnements",
3740
+ settings: "Configuration et secrets",
3741
+ templates: "Mod\xE8les",
3742
+ audit: "Audit",
3743
+ log: "Journal d'administration",
3744
+ operators: "Op\xE9rateurs",
3745
+ tokens: "Jetons",
3746
+ migrations: "Migrations"
3747
+ }
3748
+ };
3749
+ var nav_default3 = nav3;
3750
+
3751
+ // src/admin-i18n/fr/shell.ts
3752
+ var shell3 = {
3753
+ openMenu: "Ouvrir le menu",
3754
+ closeMenu: "Fermer le menu",
3755
+ navLabel: "Administration",
3756
+ missingClient: "Fournissez un {client} pour utiliser cette page."
3757
+ };
3758
+ var shell_default3 = shell3;
3759
+
3760
+ // src/admin-i18n/fr/session.ts
3761
+ var session3 = {
3762
+ signInTitle: "Se connecter \xE0 l'administration",
3763
+ adminToken: "Jeton d'administration",
3764
+ pasteToken: "Collez votre jeton",
3765
+ tokenFoot: "Conserv\xE9 pour cet onglet uniquement et envoy\xE9 dans un en-t\xEAte Bearer \u2014 jamais stock\xE9 sur le serveur. Un jeton limit\xE9 \xE0 la lecture suffit pour consulter et ne peut pas r\xE9v\xE9ler les secrets.",
3766
+ tokenRefused: "Ce jeton a \xE9t\xE9 refus\xE9.",
3767
+ unreachable: "Impossible de joindre l'interface d'administration : {error}",
3768
+ forgetToken: "Oublier le jeton",
3769
+ signOut: "Se d\xE9connecter",
3770
+ genericError: "Une erreur s'est produite. R\xE9essayez.",
3771
+ stepOf: "\xC9tape {n} sur {total}",
3772
+ steps: {
3773
+ adminToken: "Jeton d'administration",
3774
+ account: "Votre compte",
3775
+ authenticator: "Authentification",
3776
+ backupCodes: "Codes de secours",
3777
+ newPassword: "Nouveau mot de passe"
3778
+ },
3779
+ checking: "V\xE9rification\u2026",
3780
+ welcomeTitle: "Bienvenue \u2014 configurons votre console",
3781
+ welcomeSubtitle: "C'est la premi\xE8re connexion sur {host}. Collez le jeton d'administration de la configuration de votre d\xE9ploiement pour commencer. Il ne sera demand\xE9 qu'une seule fois.",
3782
+ createAccountTitle: "Cr\xE9ez votre compte",
3783
+ createAccountSubtitle: "D\xE9sormais, vous vous connectez avec cet e-mail et ce mot de passe, ainsi qu'une application d'authentification. Le jeton d'administration reste r\xE9serv\xE9 aux scripts et aux urgences.",
3784
+ email: "E-mail",
3785
+ nameOptional: "Nom (facultatif)",
3786
+ yourNameOptional: "Votre nom (facultatif)",
3787
+ password: "Mot de passe",
3788
+ newPassword: "Nouveau mot de passe",
3789
+ confirmPassword: "Confirmez le mot de passe",
3790
+ passwordHint: "Au moins 12 caract\xE8res.",
3791
+ passwordHintNext: "Au moins 12 caract\xE8res. Vous configurerez ensuite une application d'authentification.",
3792
+ passwordsMismatch: "Les deux mots de passe ne correspondent pas.",
3793
+ creating: "Cr\xE9ation\u2026",
3794
+ createAccount: "Cr\xE9er le compte",
3795
+ loginFoot: "Il n'y a pas d'inscription : les op\xE9rateurs sont invit\xE9s par un autre op\xE9rateur. Acc\xE8s bloqu\xE9 ? Demandez un lien de r\xE9cup\xE9ration \xE0 un autre op\xE9rateur.",
3796
+ backupCode: "Code de secours",
3797
+ authenticatorCode: "Code d'authentification",
3798
+ useApp: "Utiliser plut\xF4t l'application d'authentification",
3799
+ useBackup: "Utiliser plut\xF4t un code de secours",
3800
+ enrollTitle: "Configurez votre application d'authentification",
3801
+ enrollSubtitle: "Chaque connexion \xE0 cette console demande un code d'une application d'authentification \u2014 1Password, Google Authenticator, Authy ou toute application TOTP.",
3802
+ enrollScan: "Ouvrez votre application d'authentification et scannez ce code.",
3803
+ enrollEnter: "Saisissez les six chiffres affich\xE9s.",
3804
+ qrAlt: "Code QR pour votre application d'authentification",
3805
+ cantScan: "Impossible de scanner ? Saisissez plut\xF4t une cl\xE9 de configuration",
3806
+ preparing: "Pr\xE9paration\u2026",
3807
+ cancelSignOut: "Annuler et se d\xE9connecter",
3808
+ codeFromApp: "Code de l'application",
3809
+ verifyContinue: "V\xE9rifier et continuer",
3810
+ backupTitle: "Enregistrez vos codes de secours",
3811
+ backupSubtitle: "Si vous perdez votre t\xE9l\xE9phone, chacun de ces codes vous connecte une seule fois. Ils ne sont affich\xE9s que maintenant.",
3812
+ backupFileHeader: "Codes de secours pour l'administration de {host}",
3813
+ download: "T\xE9l\xE9charger",
3814
+ savedCheckbox: "J'ai enregistr\xE9 ces codes en lieu s\xFBr",
3815
+ openConsole: "Ouvrir la console",
3816
+ linkInvalidTitle: "Ce lien ne peut pas \xEAtre utilis\xE9",
3817
+ checkingLink: "V\xE9rification de votre lien\u2026",
3818
+ joinTitle: "Rejoindre la console d'administration",
3819
+ recoverTitle: "R\xE9cup\xE9rer votre compte",
3820
+ joinSubtitle: "Vous avez \xE9t\xE9 invit\xE9 en tant que {email}. Choisissez un mot de passe, puis configurez une application d'authentification.",
3821
+ recoverSubtitle: "D\xE9finissez un nouveau mot de passe pour {email}. Vous configurerez \xE0 nouveau votre application d'authentification.",
3822
+ stepUpTitle: "Confirmez qu'il s'agit bien de vous",
3823
+ stepUpSubtitle: "Cette action demande un nouveau code. Il reste valable cinq minutes.",
3824
+ twoStepTitle: "V\xE9rification en deux \xE9tapes",
3825
+ twoStepSubtitle: "Saisissez le code de votre application d'authentification.",
3826
+ verify: "V\xE9rifier",
3827
+ changeLanguage: "Changer de langue (actuelle : {name})",
3828
+ themeChoice: "Th\xE8me : {name}",
3829
+ errors: {
3830
+ INVALID_CREDENTIALS: "Cet e-mail et ce mot de passe ne correspondent \xE0 aucun op\xE9rateur.",
3831
+ INVALID_CODE: "Ce code n'a pas fonctionn\xE9. Les codes changent toutes les 30 secondes.",
3832
+ LOCKED: "Trop de tentatives. R\xE9essayez dans {minutes} minute(s).",
3833
+ LOCKED_GENERIC: "Trop de tentatives. R\xE9essayez dans quelques minutes.",
3834
+ RATE_LIMITED: "Trop de tentatives depuis cette adresse. Patientez quelques minutes.",
3835
+ WEAK_PASSWORD: "Choisissez un mot de passe plus robuste \u2014 au moins 12 caract\xE8res, difficile \xE0 deviner.",
3836
+ INVALID_LINK: "Ce lien a expir\xE9 ou a d\xE9j\xE0 \xE9t\xE9 utilis\xE9. Demandez-en un nouveau.",
3837
+ ALREADY_OPERATOR: "Cet e-mail est d\xE9j\xE0 celui d\u2019un op\xE9rateur. Connectez-vous plut\xF4t.",
3838
+ ALREADY_CLAIMED: "Cette console a d\xE9j\xE0 des op\xE9rateurs. Demandez une invitation \xE0 l\u2019un d\u2019eux.",
3839
+ CROSS_ORIGIN: "Cette requ\xEAte ne provient pas de la page d'administration."
3840
+ }
3841
+ };
3842
+ var session_default3 = session3;
3843
+
3844
+ // src/admin-i18n/fr/attention.ts
3845
+ var attention3 = {
3846
+ title: "\xC0 traiter",
3847
+ lead: "Ce qui demande votre attention sur ce d\xE9ploiement",
3848
+ leadChecked: "Ce qui demande votre attention sur ce d\xE9ploiement \xB7 v\xE9rifi\xE9 \xE0 {time}",
3849
+ needsAction: "Action requise",
3850
+ needsActionHint: "erreurs \xE0 corriger",
3851
+ advice: "Conseils",
3852
+ adviceHint: "\xE0 examiner",
3853
+ modulesReady: "Modules pr\xEAts",
3854
+ modulesReadyHint: "admin {version}",
3855
+ routes: "Routes",
3856
+ running: "V\xE9rifications en cours\u2026",
3857
+ emptyTitle: "Rien \xE0 traiter",
3858
+ emptyBody: "Toutes les v\xE9rifications r\xE9ussissent. V\xE9rifi\xE9 le {time}."
3859
+ };
3860
+ var attention_default3 = attention3;
3861
+
3862
+ // src/admin-i18n/fr/modules.ts
3863
+ var modules3 = {
3864
+ title: "Modules",
3865
+ lead: "Chaque module install\xE9, sa version et son \xE9tat de pr\xE9paration.",
3866
+ leadSummary: "{env} \xB7 admin {version} \xB7 journal d'administration {log} \xB7 {routes} routes",
3867
+ logOn: "activ\xE9",
3868
+ logOff: "d\xE9sactiv\xE9",
3869
+ colModule: "Module",
3870
+ colVersion: "Version",
3871
+ colReadiness: "\xC9tat",
3872
+ colAdmin: "Admin",
3873
+ notReported: "non communiqu\xE9e",
3874
+ describesAdmin: "d\xE9crit l'admin"
3875
+ };
3876
+ var modules_default3 = modules3;
3877
+
3878
+ // src/admin-i18n/fr/environment.ts
3879
+ var environment3 = {
3880
+ title: "Environnement",
3881
+ lead: "Si chaque module est configur\xE9 et si chaque variable lue par l'application est d\xE9finie. Les valeurs ne sont jamais affich\xE9es.",
3882
+ missingCount: "{n} manquantes",
3883
+ allSet: "toutes d\xE9finies",
3884
+ variables: "Variables",
3885
+ noVariables: "Aucune variable d\xE9clar\xE9e \u2014 passez `env` \xE0 AdminModule.",
3886
+ moduleReadiness: "\xC9tat des modules",
3887
+ problemOne: "1 probl\xE8me",
3888
+ problemMany: "{n} probl\xE8mes"
3889
+ };
3890
+ var environment_default3 = environment3;
3891
+
3892
+ // src/admin-i18n/fr/doctor.ts
3893
+ var doctor3 = {
3894
+ title: "Diagnostic",
3895
+ lead: "Toutes les v\xE9rifications de coh\xE9rence des modules install\xE9s, lanc\xE9es \xE0 la demande.",
3896
+ allPass: "toutes les v\xE9rifications r\xE9ussissent",
3897
+ oneFailed: "une v\xE9rification a \xE9chou\xE9",
3898
+ runAgain: "Relancer",
3899
+ running: "V\xE9rifications en cours\u2026",
3900
+ colResult: "R\xE9sultat",
3901
+ colCheck: "V\xE9rification",
3902
+ colTime: "Dur\xE9e"
3903
+ };
3904
+ var doctor_default3 = doctor3;
3905
+
3906
+ // src/admin-i18n/fr/routes.ts
3907
+ var routes3 = {
3908
+ title: "Routes",
3909
+ lead: "Chaque route expos\xE9e, avec sa protection.",
3910
+ leadCount: "{n} routes expos\xE9es par ce d\xE9ploiement, avec la protection plac\xE9e devant chacune.",
3911
+ filterPlaceholder: "Filtrer par chemin, m\xE9thode, module\u2026",
3912
+ filterLabel: "Filtrer les routes",
3913
+ colMethod: "M\xE9thode",
3914
+ colPath: "Chemin",
3915
+ colGuard: "Protection",
3916
+ colModule: "Module",
3917
+ application: "application",
3918
+ noMatch: "Aucune route ne correspond \xE0 \xAB {q} \xBB."
3919
+ };
3920
+ var routes_default3 = routes3;
3921
+
3922
+ // src/admin-i18n/fr/log.ts
3923
+ var log3 = {
3924
+ title: "Journal d'administration",
3925
+ lead: "Chaque requ\xEAte pass\xE9e par cette console, de la plus r\xE9cente \xE0 la plus ancienne \u2014 y compris les requ\xEAtes refus\xE9es.",
3926
+ off: "Le journal d'administration est d\xE9sactiv\xE9 \u2014 fournissez un store \xE0 AdminModule.",
3927
+ empty: "Aucune requ\xEAte pour le moment",
3928
+ colWhen: "Date",
3929
+ colActor: "Auteur",
3930
+ colRequest: "Requ\xEAte",
3931
+ colStatus: "Statut",
3932
+ colModule: "Module"
3933
+ };
3934
+ var log_default3 = log3;
3935
+
3936
+ // src/admin-i18n/fr/migrations.ts
3937
+ var migrations3 = {
3938
+ title: "Migrations",
3939
+ lead: "Les changements de sch\xE9ma livr\xE9s par chaque module, et si cette base de donn\xE9es les contient.",
3940
+ needsWrite: "L'application des migrations n\xE9cessite un jeton avec le droit d'\xE9criture.",
3941
+ firstInstall: "Cette base de donn\xE9es n'a jamais \xE9t\xE9 migr\xE9e \u2014 elle est trait\xE9e comme une premi\xE8re installation, rien n'est donc retenu.",
3942
+ upToDate: "Tous les modules sont \xE0 jour",
3943
+ noPending: "Aucune migration en attente.",
3944
+ pendingCount: "{n} en attente",
3945
+ destructive: "destructive",
3946
+ additive: "additive",
3947
+ blockedBy: "Appliquez d'abord \xAB {module} \xBB \u2014 il s'ex\xE9cute avant celui-ci et est en retard.",
3948
+ destructiveBlocked: "Contient une migration qui supprime des donn\xE9es. Aucune migration inverse ne les restaure \u2014 appliquez-la via la CI ou `npm run migrate`.",
3949
+ confirmApply: "Appliquer {n} migration(s) \xE0 \xAB {module} \xBB ? Cela modifie le sch\xE9ma de la base de donn\xE9es.",
3950
+ applyOne: "Appliquer 1 migration",
3951
+ applyMany: "Appliquer {n} migrations"
3952
+ };
3953
+ var migrations_default3 = migrations3;
3954
+
3955
+ // src/admin-i18n/fr/tokens.ts
3956
+ var tokens3 = {
3957
+ title: "Jetons",
3958
+ lead: "Les identifiants des machines : la robustesse du jeton racine, les jetons \xE0 port\xE9e limit\xE9e pour la CLI et la CI, et les \xE9ventuels jetons h\xE9rit\xE9s par module. Les personnes se connectent en tant qu\u2019op\xE9rateurs.",
3959
+ needsRoot: "\xC9mettre et r\xE9voquer n\xE9cessitent le jeton racine (celui de la configuration de votre d\xE9ploiement).",
3960
+ rootToken: "Jeton racine",
3961
+ strong: "robuste",
3962
+ weak: "faible",
3963
+ issuedTokens: "Jetons \xE9mis",
3964
+ issuingOff: "L'\xE9mission est d\xE9sactiv\xE9e \u2014 fournissez un store \xE0 AdminModule et ex\xE9cutez ses migrations.",
3965
+ copyNow: "Copiez-le maintenant \u2014 il ne sera plus jamais affich\xE9.",
3966
+ namePlaceholder: "nom",
3967
+ nameLabel: "Nom",
3968
+ scope: {
3969
+ read: "lecture",
3970
+ write: "\xE9criture",
3971
+ secrets: "secrets"
3972
+ },
3973
+ daysPlaceholder: "jours (facultatif)",
3974
+ daysLabel: "Jours",
3975
+ issue: "\xC9mettre un jeton",
3976
+ col: {
3977
+ name: "Nom",
3978
+ scopes: "Port\xE9es",
3979
+ created: "Cr\xE9\xE9 le",
3980
+ expires: "Expire le",
3981
+ lastUsed: "Derni\xE8re utilisation"
3982
+ },
3983
+ revoked: "r\xE9voqu\xE9",
3984
+ revoke: "R\xE9voquer",
3985
+ revokeConfirm: "R\xE9voquer \xAB {name} \xBB ? Tout ce qui l\u2019utilise cesse de fonctionner imm\xE9diatement.",
3986
+ emptyTitle: "Aucun jeton \xE0 port\xE9e limit\xE9e pour le moment",
3987
+ emptyBody: "\xC9mettez un jeton en lecture seule pour un tableau de bord ou un coll\xE8gue au lieu de partager le jeton racine.",
3988
+ legacyTitle: "Jetons h\xE9rit\xE9s par brique",
3989
+ legacyNone: "Aucun \u2014 la surface d'administration de chaque brique passe par ce jeton.",
3990
+ legacyRow: "enregistre encore ses routes autonomes avec son propre jeton (obsol\xE8te)"
3991
+ };
3992
+ var tokens_default3 = tokens3;
3993
+
3994
+ // src/admin-i18n/fr/operators.ts
3995
+ var operators3 = {
3996
+ title: "Op\xE9rateurs",
3997
+ lead: "Les personnes qui peuvent se connecter \xE0 cette console. Chacune utilise un mot de passe et une application d'authentification ; il n'y a pas d'inscription.",
3998
+ level: {
3999
+ read: "Lecture seule",
4000
+ editor: "\xC9diteur",
4001
+ owner: "Propri\xE9taire"
4002
+ },
4003
+ levelHint: {
4004
+ read: "consulter, sans rien modifier",
4005
+ editor: "modifier la configuration, les mod\xE8les et les utilisateurs",
4006
+ owner: "aussi les secrets, les jetons et les op\xE9rateurs"
4007
+ },
4008
+ needsOwner: "La gestion des op\xE9rateurs n\xE9cessite le niveau Propri\xE9taire.",
4009
+ mintedTitle: "Envoyez ce lien \xE0 {email}. Il n'est affich\xE9 qu'une fois.",
4010
+ mintedBody: "Il ne fonctionne qu'une fois et expire le {date}.",
4011
+ invite: "Inviter",
4012
+ invitePlaceholder: "collegue@entreprise.com",
4013
+ inviteLabel: "E-mail \xE0 inviter",
4014
+ accessLevelLabel: "Niveau d'acc\xE8s",
4015
+ accessLevelFor: "Niveau d'acc\xE8s de {email}",
4016
+ createInvite: "Cr\xE9er un lien d'invitation",
4017
+ emptyTitle: "Aucun op\xE9rateur pour le moment",
4018
+ col: {
4019
+ operator: "Op\xE9rateur",
4020
+ access: "Acc\xE8s",
4021
+ status: "Statut",
4022
+ lastSignIn: "Derni\xE8re connexion"
4023
+ },
4024
+ settingUp: "configuration en cours",
4025
+ backupCodesLeftOne: "{n} code de secours restant",
4026
+ backupCodesLeftMany: "{n} codes de secours restants",
4027
+ recoveryLink: "Lien de r\xE9cup\xE9ration",
4028
+ recoveryConfirm: "Cr\xE9er un lien de r\xE9cup\xE9ration pour {email} ? Cela le d\xE9connecte partout ; le lien permet de d\xE9finir un nouveau mot de passe et une nouvelle application d'authentification.",
4029
+ disable: "D\xE9sactiver",
4030
+ enable: "Activer",
4031
+ disableConfirm: "D\xE9sactiver {email} ? Il est d\xE9connect\xE9 imm\xE9diatement.",
4032
+ pendingLinks: "Liens en attente",
4033
+ linkKind: {
4034
+ invite: "invitation",
4035
+ recovery: "r\xE9cup\xE9ration"
4036
+ },
4037
+ expiresOn: "expire le {date}",
4038
+ revoke: "R\xE9voquer"
4039
+ };
4040
+ var operators_default3 = operators3;
4041
+
4042
+ // src/admin-i18n/fr/users.ts
4043
+ var users3 = {
4044
+ title: "Utilisateurs",
4045
+ lead: "Tous les inscrits. Ouvrez un compte pour voir ses sessions, ses connexions et les commandes de suspension et de d\xE9connexion.",
4046
+ emailPlaceholder: "adresse e-mail",
4047
+ emailLabel: "E-mail",
4048
+ allUsers: "Tous les utilisateurs",
4049
+ whichAccounts: "Quels comptes",
4050
+ activeAccounts: "Actifs",
4051
+ deletedAccounts: "Supprim\xE9s",
4052
+ noUserWithEmail: "Aucun utilisateur avec cette adresse e-mail.",
4053
+ missingIdPrefix: "Aucun compte avec l'id",
4054
+ missingIdBody: "Il a \xE9t\xE9 supprim\xE9, ou n'a jamais exist\xE9 ici. Ses donn\xE9es de facturation sont conserv\xE9es.",
4055
+ planCredits: "Forfait et cr\xE9dits",
4056
+ emptyTitle: "Aucun utilisateur pour le moment",
4057
+ emptyBody: "Les inscriptions apparaissent ici au fil de l\u2019eau.",
4058
+ col: {
4059
+ email: "E-mail",
4060
+ name: "Nom",
4061
+ plan: "Forfait",
4062
+ created: "Cr\xE9\xE9 le",
4063
+ status: "Statut"
4064
+ },
4065
+ field: {
4066
+ id: "id",
4067
+ email: "e-mail",
4068
+ verified: "v\xE9rifi\xE9",
4069
+ mfa: "MFA",
4070
+ provider: "fournisseur",
4071
+ lastLogin: "derni\xE8re connexion",
4072
+ created: "cr\xE9\xE9 le"
4073
+ },
4074
+ passwordProvider: "mot de passe",
4075
+ noPasswordSet: "aucun mot de passe d\xE9fini",
4076
+ deletedOn: "Supprim\xE9 le {date}.",
4077
+ deletedBody: "Le compte ne peut plus se connecter et sera effac\xE9 lors de la purge de conservation. Ses donn\xE9es de facturation sont conserv\xE9es.",
4078
+ suspend: "Suspendre",
4079
+ unsuspend: "R\xE9activer",
4080
+ signOutEverywhere: "D\xE9connecter partout",
4081
+ liveSessions: "Sessions actives",
4082
+ since: "depuis le {date}",
4083
+ recentSignIns: "Connexions r\xE9centes",
4084
+ noneRecorded: "Aucune enregistr\xE9e.",
4085
+ outcome: {
4086
+ success: "r\xE9ussie",
4087
+ failure: "\xE9chec"
4088
+ },
4089
+ proxyVpn: "proxy/VPN",
4090
+ hosting: "h\xE9bergeur"
4091
+ };
4092
+ var users_default3 = users3;
4093
+
4094
+ // src/admin-i18n/fr/billing.ts
4095
+ var billing3 = {
4096
+ statusLabel: {
4097
+ active: "actif",
4098
+ trialing: "en p\xE9riode d'essai",
4099
+ past_due: "en retard de paiement",
4100
+ unpaid: "impay\xE9",
4101
+ canceled: "r\xE9sili\xE9",
4102
+ incomplete: "incomplet",
4103
+ incomplete_expired: "incomplet (expir\xE9)",
4104
+ paused: "en pause"
4105
+ },
4106
+ intervalLabel: {
4107
+ month: "mois",
4108
+ year: "an"
4109
+ },
4110
+ renews: "Renouvel\xE9 le",
4111
+ ends: "Se termine le",
4112
+ ended: "Termin\xE9 le",
4113
+ loading: "Chargement de la facturation\u2026",
4114
+ plan: "Forfait",
4115
+ free: "Gratuit",
4116
+ noSubscription: "aucun abonnement",
4117
+ credits: "Cr\xE9dits",
4118
+ currencyPlaceholder: "devise",
4119
+ currencyLabel: "Devise du portefeuille",
4120
+ currencyTitle: "Afficher le portefeuille dans une autre devise",
4121
+ breakdown: "{permanent} permanents \xB7 {allowance} d\u2019allocation du forfait",
4122
+ expires: " (expire le {date})",
4123
+ noWallet: "Aucun portefeuille \u2014 la facturation n'a pas de configuration de portefeuille.",
4124
+ grantCredits: "Octroyer des cr\xE9dits",
4125
+ amountPlaceholder: "montant ({currency})",
4126
+ amountLabel: "Montant",
4127
+ reasonPlaceholder: "motif (facultatif)",
4128
+ reasonLabel: "Motif",
4129
+ grant: "Octroyer",
4130
+ granted: "{amount} {currency} octroy\xE9s.",
4131
+ noMovements: "Aucun mouvement de cr\xE9dits pour le moment",
4132
+ col: {
4133
+ when: "Date",
4134
+ kind: "Type",
4135
+ amount: "Montant",
4136
+ note: "Note"
4137
+ },
4138
+ ledgerKind: {
4139
+ purchase: "achat",
4140
+ grant: "octroi",
4141
+ usage: "utilisation",
4142
+ refund: "remboursement",
4143
+ adjustment: "ajustement",
4144
+ expiry: "expiration"
4145
+ },
4146
+ subscriptions: {
4147
+ title: "Abonnements",
4148
+ lead: "Qui paie, et qui est en retard. Le forfait et les cr\xE9dits d'un utilisateur figurent aussi sur sa page dans Utilisateurs \u2014 les utilisateurs gratuits n'apparaissent que l\xE0.",
4149
+ detailLead: "Forfait, cr\xE9dits et mouvements.",
4150
+ back: "Tous les abonnements",
4151
+ filterLabel: "Filtrer par statut",
4152
+ filter: {
4153
+ all: "Tous",
4154
+ active: "Actifs",
4155
+ trialing: "En p\xE9riode d'essai",
4156
+ pastDue: "En retard",
4157
+ canceled: "R\xE9sili\xE9s"
4158
+ },
4159
+ empty: {
4160
+ all: "Aucun abonnement pour le moment",
4161
+ active: "Aucun abonnement actif",
4162
+ trialing: "Aucun abonnement en p\xE9riode d'essai",
4163
+ pastDue: "Aucun abonnement en retard de paiement",
4164
+ canceled: "Aucun abonnement r\xE9sili\xE9"
4165
+ },
4166
+ emptyHint: "Les abonnements apparaissent ici d\xE8s qu'un client passe commande.",
4167
+ typeLabel: "Type",
4168
+ typeWorkspace: "espace de travail",
4169
+ typeUser: "utilisateur",
4170
+ idPlaceholder: "id de l'abonn\xE9",
4171
+ idLabel: "Id de l'abonn\xE9",
4172
+ col: {
4173
+ subscriber: "Abonn\xE9",
4174
+ plan: "Forfait",
4175
+ status: "Statut",
4176
+ renewsEnds: "Renouvellement / fin"
4177
+ },
4178
+ cancels: "r\xE9siliation pr\xE9vue"
4179
+ }
4180
+ };
4181
+ var billing_default3 = billing3;
4182
+
4183
+ // src/admin-i18n/fr/catalog.ts
4184
+ var catalog3 = {
4185
+ title: "Catalogue",
4186
+ lead: "Ce que vous vendez : les forfaits tels que configur\xE9s dans le code, et tels qu\u2019enregistr\xE9s dans la base de donn\xE9es, c\xF4te \xE0 c\xF4te.",
4187
+ configured: "Configur\xE9s (code)",
4188
+ stored: "Enregistr\xE9s (base de donn\xE9es)",
4189
+ emptyTitle: "Aucun forfait enregistr\xE9",
4190
+ emptyBody: "Les forfaits sont configur\xE9s dans le code ; rien n'a \xE9t\xE9 \xE9crit dans la base de donn\xE9es.",
4191
+ col: {
4192
+ plan: "Forfait",
4193
+ tier: "Niveau",
4194
+ seats: "Places",
4195
+ monthly: "Mensuel",
4196
+ yearly: "Annuel",
4197
+ trial: "Essai"
4198
+ },
4199
+ trialDays: "{n} j",
4200
+ deleteConfirm: "Supprimer le forfait enregistr\xE9 \xAB {name} \xBB ?"
4201
+ };
4202
+ var catalog_default3 = catalog3;
4203
+
4204
+ // src/admin-i18n/fr/audit.ts
4205
+ var audit3 = {
4206
+ title: "Audit",
4207
+ lead: "Ce qui s'est pass\xE9, dans tous les espaces de travail sauf si vous en nommez un. Le verdict d'int\xE9grit\xE9 de la cha\xEEne se trouve sur la page Diagnostic.",
4208
+ workspacePlaceholder: "id d'espace de travail (tous si vide)",
4209
+ typePlaceholder: "type d'\xE9v\xE9nement",
4210
+ actorPlaceholder: "id de l'acteur",
4211
+ fromLabel: "Date de d\xE9but",
4212
+ fromTitle: "Du (inclus)",
4213
+ toLabel: "Date de fin",
4214
+ toTitle: "Au (inclus)",
4215
+ empty: "Rien d\u2019enregistr\xE9 pour ce filtre",
4216
+ col: {
4217
+ when: "Date",
4218
+ type: "Type",
4219
+ workspace: "Espace de travail",
4220
+ actor: "Acteur",
4221
+ request: "Requ\xEAte"
4222
+ }
4223
+ };
4224
+ var audit_default3 = audit3;
4225
+
4226
+ // src/admin-i18n/fr/config.ts
4227
+ var config3 = {
4228
+ environment: "Environnement",
4229
+ reveal: "Afficher",
4230
+ type: {
4231
+ text: "texte",
4232
+ number: "nombre",
4233
+ onOff: "oui/non",
4234
+ json: "json"
4235
+ },
4236
+ shape: {
4237
+ text: "Texte",
4238
+ number: "Nombre",
4239
+ onOff: "Oui/non",
4240
+ list: "Liste",
4241
+ object: "Objet",
4242
+ empty: "Vide"
4243
+ },
4244
+ list: {
4245
+ title: "Configuration",
4246
+ newEntry: "Nouvelle entr\xE9e",
4247
+ hint: "Drapeaux de fonctionnalit\xE9 et r\xE9glages d'ex\xE9cution \u2014 texte, nombres, oui/non ou JSON. Lus par l'application sans red\xE9ploiement.",
4248
+ empty: "Aucune entr\xE9e de configuration pour le moment.",
4249
+ emptyCta: "Cr\xE9ez-en une pour activer une fonctionnalit\xE9 ou ajuster un r\xE9glage sans red\xE9ployer.",
4250
+ emptyInEnv: "Aucune configuration dans {env}. Les entr\xE9es de \xAB all \xBB s\u2019y appliquent toujours.",
4251
+ publicBadge: "public",
4252
+ publicTitle: "Servi aux frontends par GET /config/public",
4253
+ publicSummary: "Ce que re\xE7oivent les frontends ({n} cl\xE9s publiques)",
4254
+ publicSummaryOne: "Ce que re\xE7oivent les frontends (1 cl\xE9 publique)",
4255
+ publicHint: "Exactement le corps de {route} \u2014 sans authentification, donc lisible par tous. Seules les cl\xE9s que l'application d\xE9clare publiques y figurent.",
4256
+ secretsTitle: "Secrets",
4257
+ newSecret: "Nouveau secret",
4258
+ secretsHint: "Chiffr\xE9s au repos ; les valeurs restent masqu\xE9es jusqu\u2019\xE0 leur affichage.",
4259
+ secretsEmpty: "Aucun secret pour le moment.",
4260
+ secretsEmptyInEnv: "Aucun secret dans {env}."
4261
+ },
4262
+ editor: {
4263
+ newEntry: "Nouvelle entr\xE9e de configuration",
4264
+ newSecret: "Nouveau secret",
4265
+ environmentLabel: "Environnement :",
4266
+ key: "Cl\xE9",
4267
+ environmentHint: "\xAB all \xBB est partag\xE9 par tous les environnements ; un environnement nomm\xE9 (production, staging\u2026) le remplace.",
4268
+ value: "Valeur",
4269
+ newValue: "Nouvelle valeur",
4270
+ valuePlaceholder: 'true \xB7 42 \xB7 Maintenance pr\xE9vue ce soir \xB7 {"ids": ["m1", "m2"]}',
4271
+ detected: "D\xE9tect\xE9 :",
4272
+ saveAsText: "Enregistrer plut\xF4t comme texte",
4273
+ on: "Oui (true)",
4274
+ off: "Non (false)",
4275
+ type: "Type :",
4276
+ changeType: "Changer de type\u2026",
4277
+ changeTypeWarning: "Changer le type modifie ce que re\xE7oit chaque \xE9cran qui lit cette cl\xE9. V\xE9rifiez d\u2019abord le code qui la lit.",
4278
+ description: "Description",
4279
+ conflict: "Quelqu\u2019un a modifi\xE9 cette entr\xE9e depuis son ouverture. Rechargez pour voir sa modification, puis modifiez \xE0 nouveau.",
4280
+ confirmDelete: "Supprimer \xAB {key} \xBB ? Tout ce qui la lit revient \xE0 sa valeur par d\xE9faut.",
4281
+ confirmDeleteIn: "Supprimer \xAB {key} \xBB de {env} ? Tout ce qui la lit revient \xE0 sa valeur par d\xE9faut.",
4282
+ history: "Historique",
4283
+ unknownActor: "inconnu",
4284
+ rollBack: "Restaurer"
4285
+ },
4286
+ errors: {
4287
+ keyRequired: "Saisissez une cl\xE9.",
4288
+ keyPattern: "Commencez par une lettre ; utilisez des lettres, des chiffres, \xAB . \xBB, \xAB _ \xBB ou \xAB - \xBB (128 max).",
4289
+ exists: "\xAB {key} \xBB existe d\xE9j\xE0 dans {env} \u2014 ouvrez-la depuis la liste pour la modifier.",
4290
+ number: "Saisissez un nombre.",
4291
+ boolean: "Utilisez true ou false.",
4292
+ json: "JSON non valide : {detail}"
4293
+ }
4294
+ };
4295
+ var config_default3 = config3;
4296
+
4297
+ // src/admin-i18n/fr/templates.ts
4298
+ var templates3 = {
4299
+ defaultLocale: "langue par d\xE9faut",
4300
+ builtInBadge: "int\xE9gr\xE9",
4301
+ subject: "Objet",
4302
+ htmlBody: "Corps HTML",
4303
+ textBody: "Corps en texte brut",
4304
+ list: {
4305
+ title: "Mod\xE8les",
4306
+ newTemplate: "Nouveau mod\xE8le",
4307
+ hint: "Chaque e-mail envoy\xE9 par l'application. Ouvrez-en un pour modifier son contenu et le pr\xE9visualiser en direct.",
4308
+ loading: "Chargement des mod\xE8les\u2026"
4309
+ },
4310
+ editor: {
4311
+ loading: "Chargement du mod\xE8le\u2026",
4312
+ addLocale: "+ Ajouter une langue",
4313
+ builtInNote: "e-mail int\xE9gr\xE9 : modifiable ou restaurable, mais pas supprimable",
4314
+ active: "Actif",
4315
+ conflict: "Quelqu\u2019un a modifi\xE9 ce mod\xE8le depuis son ouverture. Rechargez pour voir sa modification, puis modifiez \xE0 nouveau.",
4316
+ noChanges: "Aucune modification \xE0 enregistrer",
4317
+ sampleData: "Donn\xE9es d'exemple",
4318
+ sampleNotObject: "Les donn\xE9es d'exemple doivent \xEAtre un objet JSON.",
4319
+ sampleInvalid: "Les donn\xE9es d'exemple ne sont pas un JSON valide.",
4320
+ preview: "Aper\xE7u",
4321
+ previewTitle: "Aper\xE7u du mod\xE8le",
4322
+ rendering: "Rendu en cours\u2026",
4323
+ live: "En direct",
4324
+ nothingRendered: "Rien n\u2019a encore \xE9t\xE9 rendu.",
4325
+ history: "Historique",
4326
+ unknownActor: "inconnu",
4327
+ rollBack: "Restaurer",
4328
+ confirmDelete: "Supprimer \xAB {type} \xBB ?",
4329
+ confirmDeleteLocale: "Supprimer la version {locale} de \xAB {type} \xBB ? Les personnes de cette langue recevront la version par d\xE9faut."
4330
+ },
4331
+ create: {
4332
+ titleNew: "Nouveau mod\xE8le",
4333
+ titleLocale: "Ajouter une langue \xE0 {type}",
4334
+ hintNew: "Pour un e-mail envoy\xE9 par votre application qui n'a pas encore de contenu enregistr\xE9. Le type doit correspondre \xE0 ce que l'application envoie.",
4335
+ hintLocale: "Part du contenu par d\xE9faut. Les personnes dont la langue correspond re\xE7oivent cette version ; les autres gardent la version par d\xE9faut.",
4336
+ type: "Type",
4337
+ locale: "Langue",
4338
+ localeOptional: "Langue (facultative \u2014 vide correspond \xE0 la langue par d\xE9faut)",
4339
+ creating: "Cr\xE9ation\u2026",
4340
+ submitNew: "Cr\xE9er le mod\xE8le",
4341
+ submitLocale: "Ajouter la langue",
4342
+ errorType: "Type : lettres minuscules, chiffres, - et _ (ex. weekly-digest).",
4343
+ errorLocaleRequired: "Choisissez la langue \xE0 ajouter, par ex. fr ou fr-CA.",
4344
+ errorLocale: "Langue : une \xE9tiquette de langue comme fr, es ou fr-CA.",
4345
+ errorText: "Le corps en texte brut est obligatoire \u2014 c\u2019est ce que tout client e-mail peut afficher.",
4346
+ exists: "\xAB {type} \xBB existe d\xE9j\xE0 \u2014 ouvrez-le depuis la liste pour le modifier.",
4347
+ existsLocale: "\xAB {type} \xBB ({locale}) existe d\xE9j\xE0 \u2014 ouvrez-le depuis la liste pour le modifier."
4348
+ }
4349
+ };
4350
+ var templates_default3 = templates3;
4351
+
4352
+ // src/admin-i18n/fr/index.ts
4353
+ var fr = { common: common_default3, nav: nav_default3, shell: shell_default3, session: session_default3, attention: attention_default3, modules: modules_default3, environment: environment_default3, doctor: doctor_default3, routes: routes_default3, log: log_default3, migrations: migrations_default3, tokens: tokens_default3, operators: operators_default3, users: users_default3, billing: billing_default3, catalog: catalog_default3, audit: audit_default3, config: config_default3, templates: templates_default3 };
4354
+ var fr_default = fr;
4355
+
4356
+ // src/admin-i18n/index.ts
4357
+ var ADMIN_LOCALES = ["en", "fr", "es"];
4358
+ var DEFAULT_ADMIN_LOCALE = "en";
4359
+ var adminLocaleNames = {
4360
+ en: "English",
4361
+ fr: "Fran\xE7ais",
4362
+ es: "Espa\xF1ol"
4363
+ };
4364
+ var adminLocaleTags = {
4365
+ en: "en-US",
4366
+ fr: "fr-FR",
4367
+ es: "es-ES"
4368
+ };
4369
+ var isAdminLocale = (value) => ADMIN_LOCALES.includes(value);
4370
+ function detectAdminLocale(languages = []) {
4371
+ for (const tag of languages) {
4372
+ const base = tag.toLowerCase().split("-")[0];
4373
+ if (isAdminLocale(base)) return base;
4374
+ }
4375
+ return DEFAULT_ADMIN_LOCALE;
4376
+ }
4377
+ var dictionaries = { en: en_default, fr: fr_default, es: es_default };
4378
+ function createAdminT(locale = DEFAULT_ADMIN_LOCALE) {
4379
+ const dict = dictionaries[locale] ?? dictionaries[DEFAULT_ADMIN_LOCALE];
4380
+ const t = (key, params) => {
4381
+ let node = dict;
4382
+ for (const part of key.split(".")) {
4383
+ if (node == null || typeof node !== "object") break;
4384
+ node = node[part];
4385
+ }
4386
+ const text = typeof node === "string" ? node : key;
4387
+ return params ? text.replace(/\{(\w+)\}/g, (m, n) => n in params ? String(params[n]) : m) : text;
4388
+ };
4389
+ return t;
4390
+ }
4391
+ function formatAdminDate(value, locale = DEFAULT_ADMIN_LOCALE, style = "datetime") {
4392
+ const d = value instanceof Date ? value : new Date(value);
4393
+ const tag = adminLocaleTags[locale] ?? adminLocaleTags.en;
4394
+ if (style === "date") return d.toLocaleDateString(tag);
4395
+ if (style === "time") return d.toLocaleTimeString(tag);
4396
+ return d.toLocaleString(tag);
4397
+ }
2282
4398
  export {
4399
+ ADMIN_LOCALES,
2283
4400
  AdminClient,
2284
4401
  AuditAdminClient,
2285
4402
  AuditClient,
@@ -2293,19 +4410,26 @@ export {
2293
4410
  ConfigClient,
2294
4411
  CourierAdminClient,
2295
4412
  CustomersClient,
4413
+ DEFAULT_ADMIN_LOCALE,
2296
4414
  FonderieApiError,
2297
4415
  FonderieClient,
2298
4416
  MediaClient,
2299
4417
  WebhooksClient,
2300
4418
  WorkspacesClient,
4419
+ adminLocaleNames,
4420
+ adminLocaleTags,
2301
4421
  castConfigValue,
2302
4422
  configKeyProblem,
2303
4423
  configValueLabel,
2304
4424
  configValueType,
4425
+ createAdminT,
2305
4426
  createMemoryCache,
2306
4427
  describeLocation,
4428
+ detectAdminLocale,
4429
+ formatAdminDate,
2307
4430
  formatConfigValue,
2308
4431
  inferConfigValue,
4432
+ isAdminLocale,
2309
4433
  isMfaRequired
2310
4434
  };
2311
4435
  //# sourceMappingURL=index.js.map