@courthive/i18n 0.1.1 → 0.3.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.
@@ -132,6 +132,7 @@
132
132
  "to": "To",
133
133
  "h2h": "Head-to-Head",
134
134
  "reg": "Registered",
135
+ "regs": "Registrations",
135
136
  "gdr": "Gender",
136
137
  "dtp": "Draw Type",
137
138
  "drp": "Draw Position",
@@ -298,7 +299,134 @@
298
299
  "confirmRemoveUser": "Remove User",
299
300
  "removeUserConfirm": "Are you sure you want to remove",
300
301
  "searchProviders": "Search providers...",
301
- "lastAccess": "Last Access"
302
+ "lastAccess": "Last Access",
303
+ "activeRooms": "Active Rooms",
304
+ "activeRoomsTitle": "Live tournament sessions",
305
+ "noActiveRooms": "No active tournament sessions",
306
+ "tournamentColumn": "Tournament",
307
+ "userCountColumn": "Active Users",
308
+ "presenceLoadError": "Failed to load active rooms",
309
+ "joinedAt": "Joined",
310
+ "anonymous": "Anonymous",
311
+ "refreshNow": "Refresh now",
312
+ "lastRefreshed": "Refreshed {{ago}}s ago",
313
+ "tmxUrlMissing": "Cannot open TMX — server did not provide a TMX URL. Check TMX_URL in the server .env.",
314
+ "createUser": "Create User",
315
+ "archiveProvider": "Archive",
316
+ "deleteProvider": "Delete",
317
+ "resetPassword": "Reset Password",
318
+ "resetPasswordTitle": "Reset Password",
319
+ "newPassword": "New Password",
320
+ "generatePassword": "Generate",
321
+ "passwordCopied": "Password copied to clipboard",
322
+ "passwordReset": "Password reset successfully",
323
+ "passwordResetError": "Failed to reset password",
324
+ "provisioners": "Provisioners",
325
+ "provisionerName": "Provisioner Name",
326
+ "provisionerNamePlaceholder": "e.g. TMX Sandbox",
327
+ "noProvisioners": "No provisioners found",
328
+ "selectProvisioner": "Select a provisioner to view details",
329
+ "searchProvisioners": "Search provisioners...",
330
+ "createProvisioner": "Create Provisioner",
331
+ "editProvisioner": "Edit Provisioner",
332
+ "provisionerCreated": "Provisioner created",
333
+ "createFailed": "Create failed",
334
+ "updateFailed": "Update failed",
335
+ "updated": "Updated",
336
+ "create": "Create",
337
+ "active": "Active",
338
+ "inactive": "Inactive",
339
+ "activate": "Activate",
340
+ "deactivate": "Deactivate",
341
+ "activateProvisioner": "Activate Provisioner",
342
+ "deactivateProvisioner": "Deactivate Provisioner",
343
+ "activateConfirm": "Activate provisioner \"{{name}}\"?",
344
+ "deactivateConfirm": "Deactivate provisioner \"{{name}}\"? Their API keys will stop working.",
345
+ "status": "Status",
346
+ "createdAt": "Created",
347
+ "created": "Created",
348
+ "lastUsed": "Last Used",
349
+ "apiKeys": "API Keys",
350
+ "label": "Label",
351
+ "noKeys": "No API keys",
352
+ "generateKey": "Generate Key",
353
+ "generate": "Generate",
354
+ "generateFailed": "Failed to generate API key",
355
+ "keyLabel": "Key Label",
356
+ "keyLabelPlaceholder": "e.g. Production, Staging",
357
+ "keyGenerated": "API Key Generated",
358
+ "keyRevealWarning": "This is the only time the full key will be shown. Save it somewhere safe before closing this dialog.",
359
+ "copy": "Copy",
360
+ "copiedToClipboard": "Copied to clipboard",
361
+ "revoke": "Revoke",
362
+ "revoked": "Revoked",
363
+ "revokeKey": "Revoke API Key",
364
+ "revokeKeyConfirm": "Revoke key \"{{label}}\"? This cannot be undone.",
365
+ "keyRevoked": "API key revoked",
366
+ "associatedProviders": "Associated Providers",
367
+ "noAssociatedProviders": "No providers associated",
368
+ "associateProvider": "Associate Provider",
369
+ "associate": "Associate",
370
+ "associated": "Provider associated",
371
+ "disassociate": "Remove",
372
+ "disassociateProvider": "Remove Provider Association",
373
+ "disassociateConfirm": "Remove association with \"{{name}}\"?",
374
+ "disassociated": "Provider association removed",
375
+ "selectProviderFirst": "Select a provider first",
376
+ "relationship": "Relationship",
377
+ "owner": "Owner",
378
+ "subsidiary": "Subsidiary",
379
+ "nameRequired": "Name is required",
380
+ "deleteProvisioner": "Delete Permanently",
381
+ "deletePermanently": "Delete permanently",
382
+ "deleteProvisionerWarning": "<strong>This cannot be undone.</strong> All API keys, provider associations, and tournament ownership stamps for \"{{name}}\" will be removed. The providers and their tournaments will <em>not</em> be deleted.",
383
+ "typeNameToConfirm": "Type {{name}} to confirm:",
384
+ "provisionerDeleted": "Provisioner deleted ({{apiKeys}} keys, {{providerAssociations}} associations, {{tournamentStamps}} stamps cleaned up)",
385
+ "deleteFailed": "Delete failed",
386
+ "representatives": "Representatives",
387
+ "noRepresentatives": "No representatives assigned",
388
+ "user": "User",
389
+ "displayName": "Name",
390
+ "granted": "Granted",
391
+ "assignUser": "Assign User",
392
+ "assign": "Assign",
393
+ "remove": "Remove",
394
+ "representativeAssigned": "User assigned as representative",
395
+ "representativeRemoved": "Representative removed",
396
+ "removeRepresentative": "Remove Representative",
397
+ "removeRepresentativeConfirm": "Remove {{email}} as a representative? They will no longer be able to act as this provisioner.",
398
+ "contactEmailCoverage": {
399
+ "label": "Recovery email coverage",
400
+ "loading": "Loading…",
401
+ "verified": "verified",
402
+ "unverified": "pending",
403
+ "missing": "missing",
404
+ "equalsLogin": "= login id",
405
+ "total": "of {{count}} users"
406
+ },
407
+ "audit": {
408
+ "tabLabel": "Audit",
409
+ "title": "Deleted-draw audit trail",
410
+ "tournamentsLabel": "Tournaments",
411
+ "tournamentFilterPlaceholder": "Filter by tournament name or id",
412
+ "deletedDrawsLabel": "Deleted draws",
413
+ "selectTournament": "Select a tournament to view its deleted draws",
414
+ "noTournaments": "No tournaments for this provider",
415
+ "tournamentName": "Tournament",
416
+ "tournamentId": "Tournament ID",
417
+ "startDate": "Start date",
418
+ "drawName": "Draw",
419
+ "eventId": "Event",
420
+ "deletedAt": "Deleted at",
421
+ "deletedBy": "Deleted by",
422
+ "restore": "Restore",
423
+ "restoreTitle": "Restore deleted draw",
424
+ "restorePrompt": "Restoring will re-insert the draw with all of its matchUps, scores, and assignments.",
425
+ "restoreSuccess": "Draw restored",
426
+ "restoreFailure": "Restore failed",
427
+ "calendarLoadError": "Failed to load calendar",
428
+ "deletedDrawsLoadError": "Failed to load deleted draws"
429
+ }
302
430
  },
303
431
  "round_names": {
304
432
  "F": "Final",
@@ -798,7 +926,25 @@
798
926
  "court": "Court",
799
927
  "event": "Event",
800
928
  "round": "Round",
801
- "matchUp": "Match"
929
+ "matchUp": "Match",
930
+ "noScheduledMatchUpsMatch": "No scheduled matchUps match the search",
931
+ "searchScheduledMatchUps": "Search scheduled matchUps...",
932
+ "scheduledTitle": "Scheduled MatchUps",
933
+ "scheduledCount_one": "{{count}} scheduled",
934
+ "scheduledCount_other": "{{count}} scheduled",
935
+ "filterMatchUps": "Filter matchUps",
936
+ "filterClearAll": "Clear All",
937
+ "filterAllEventTypes": "All Event Types",
938
+ "filterAllEvents": "All Events",
939
+ "filterAllFlights": "All Flights",
940
+ "filterAllGenders": "All Genders",
941
+ "filterAllRounds": "All Rounds",
942
+ "groupBy": {
943
+ "event": "By Event",
944
+ "draw": "By Draw",
945
+ "round": "By Round",
946
+ "structure": "By Structure"
947
+ }
802
948
  },
803
949
  "penalties": {
804
950
  "fail2signout": "Failed to Sign Out",
@@ -831,7 +977,12 @@
831
977
  "error": "Error",
832
978
  "success": "Success",
833
979
  "required": "Required",
834
- "send": "Send"
980
+ "send": "Send",
981
+ "details": "Details",
982
+ "validationDetails": "Validation details",
983
+ "dismiss": "Dismiss",
984
+ "iSavedIt": "I saved it",
985
+ "remove": "Remove"
835
986
  },
836
987
  "modals": {
837
988
  "deleteEvents": {
@@ -861,7 +1012,9 @@
861
1012
  "emailPlaceholder": "valid@email.com",
862
1013
  "passwordLabel": "Password",
863
1014
  "passwordPlaceholder": "minimum 8 characters",
864
- "loginButton": "Login"
1015
+ "loginButton": "Login",
1016
+ "magicLinkButton": "Email me a login link",
1017
+ "forgotPassword": "Forgot your password?"
865
1018
  },
866
1019
  "settings": {
867
1020
  "title": "Settings",
@@ -887,7 +1040,8 @@
887
1040
  "themeDark": "Dark",
888
1041
  "themeSystem": "System",
889
1042
  "font": "Font",
890
- "dangerZone": "Danger Zone"
1043
+ "dangerZone": "Danger Zone",
1044
+ "schedule2": "Schedule Page 2"
891
1045
  },
892
1046
  "editTournamentName": {
893
1047
  "title": "Edit Tournament Name",
@@ -956,7 +1110,10 @@
956
1110
  "representing": "Representing",
957
1111
  "notes": "Notes",
958
1112
  "split": "Split…",
959
- "ignore": "Ignore"
1113
+ "ignore": "Ignore",
1114
+ "participantRole": "Role (player, coach, physio, …)",
1115
+ "teamKey": "Team (group into team participants)",
1116
+ "jerseyNumber": "Jersey number"
960
1117
  },
961
1118
  "ratingAuto": "Auto-detect",
962
1119
  "eventPickerPlaceholder": "(select event…)",
@@ -1134,7 +1291,9 @@
1134
1291
  "devMode": "Dev mode",
1135
1292
  "services": "Services",
1136
1293
  "tournamentProfiles": "Tournament Profiles (fetch)",
1137
- "invite": "Invite"
1294
+ "invite": "Invite",
1295
+ "providerRole": "Provider Role",
1296
+ "existingUserAdded": "{{email}} already had an account — added to {{provider}} as {{role}}."
1138
1297
  },
1139
1298
  "fetchTournament": {
1140
1299
  "title": "Fetch tournament details",
@@ -1200,7 +1359,8 @@
1200
1359
  "createTeam": {
1201
1360
  "title": "Create Team",
1202
1361
  "selectAttribute": "Select attribute",
1203
- "create": "Create"
1362
+ "create": "Create",
1363
+ "teamAffiliation": "Team affiliation"
1204
1364
  },
1205
1365
  "getLatLong": {
1206
1366
  "title": "Location",
@@ -1304,6 +1464,158 @@
1304
1464
  "cancel": "Cancel",
1305
1465
  "apply": "Apply",
1306
1466
  "venueWarning": "Venue hours are ${startTime}–${endTime}. The venue will be widened to accommodate this change."
1467
+ },
1468
+ "editCategories": {
1469
+ "title": "Tournament Categories",
1470
+ "intro": "Add or remove categories defined for this tournament. Categories in use cannot be edited or removed — change them by replacing the events that reference them.",
1471
+ "add": "+ Add category",
1472
+ "empty": "No categories defined yet.",
1473
+ "duplicate": "A category with that name or code already exists.",
1474
+ "confirmDelete": "Delete \"{{name}}\"? This cannot be undone.",
1475
+ "deleteBlocked": "Cannot delete \"{{name}}\" — used by {{count}} event(s): {{events}}. Remove or reassign those events first.",
1476
+ "deleteDisabledHint": "This category is used by one or more events. Remove or reassign those events first.",
1477
+ "unused": "Unused",
1478
+ "usageCount": "{{count}} event(s)",
1479
+ "usageList": "{{name}} is used by: {{events}}"
1480
+ },
1481
+ "firstLogin": {
1482
+ "title": "Set your password",
1483
+ "intro": "Your account was created with a temporary password. Choose a new password to finish signing in.",
1484
+ "newPasswordLabel": "New password",
1485
+ "newPasswordPlaceholder": "minimum 8 characters",
1486
+ "confirmPasswordLabel": "Confirm password",
1487
+ "confirmPasswordPlaceholder": "re-enter new password",
1488
+ "setPassword": "Set password",
1489
+ "failed": "Could not set your password. Please try again.",
1490
+ "tokenExpired": "This sign-in session expired. Please log in again."
1491
+ },
1492
+ "forgotPassword": {
1493
+ "title": "Reset your password",
1494
+ "intro": "Enter the email address associated with your account. If we know you, a password-reset link is on the way — check your inbox.",
1495
+ "label": "Contact email",
1496
+ "submit": "Send reset link",
1497
+ "sent": "If we know you, a password-reset link is on the way. Check your inbox (and your spam folder).",
1498
+ "networkError": "Couldn't reach the server — please try again."
1499
+ },
1500
+ "createUser": {
1501
+ "title": "Create User",
1502
+ "create": "Create",
1503
+ "loginEmail": "Login id",
1504
+ "contactEmail": "Contact email (optional)",
1505
+ "password": "Password",
1506
+ "successCopied": "Created {{email}}. Temporary password copied to clipboard.",
1507
+ "successEmailed": "Created. A \"set your password\" link was sent to {{email}}.",
1508
+ "successPlain": "Created {{email}}.",
1509
+ "failed": "Failed to create user.",
1510
+ "emailExists": "A user with email {{email}} already exists."
1511
+ },
1512
+ "archiveProvider": {
1513
+ "title": "Archive provider — {{provider}}",
1514
+ "intro": "Archiving exports everything associated with {{provider}} ({{abbr}}) to disk, then removes it from the live database. The archive is recoverable via the backend revive-provider.mjs script.",
1515
+ "loading": "Loading blast-radius preview…",
1516
+ "previewFailed": "Couldn't load preview. Try again, or refresh the page.",
1517
+ "confirmLabel": "Type the provider abbreviation ({{abbr}}) to confirm:",
1518
+ "submit": "Archive provider",
1519
+ "success": "Archived {{abbr}} — {{tournaments}} tournaments. Archive id: {{archiveId}}.",
1520
+ "failed": "Archive failed.",
1521
+ "counts": {
1522
+ "tournaments": "Tournaments",
1523
+ "userAssociations": "User associations",
1524
+ "provisionerAssociations": "Provisioner associations",
1525
+ "tournamentAssignments": "Tournament assignments",
1526
+ "officialRecords": "Official records",
1527
+ "sanctioningRecords": "Sanctioning records",
1528
+ "tournamentProvisioner": "Tournament-provisioner links",
1529
+ "pendingSaves": "Pending saves",
1530
+ "calendars": "Calendars",
1531
+ "topologies": "Topology templates",
1532
+ "catalogItems": "Catalog items",
1533
+ "policies": "Policies",
1534
+ "auditLogRows": "Audit log rows (preserved, not deleted)"
1535
+ }
1536
+ },
1537
+ "deleteProvider": {
1538
+ "title": "Delete provider — {{provider}}",
1539
+ "warning": "Irreversible — no archive, no recovery.",
1540
+ "warningDetail": "Use Archive instead if there's any chance this data will be needed later. Delete is for providers with no real data (demo/test accounts).",
1541
+ "intro": "Permanently delete {{provider}} ({{abbr}}) and all its associated data. Audit log rows are preserved, but every other table will be wiped.",
1542
+ "acknowledge": "I understand this cannot be undone.",
1543
+ "submit": "Delete permanently",
1544
+ "success": "Deleted {{abbr}} — {{tournaments}} tournaments destroyed.",
1545
+ "failed": "Delete failed."
1546
+ },
1547
+ "contactEmail": {
1548
+ "title": "Recovery email",
1549
+ "label": "Recovery email",
1550
+ "save": "Save",
1551
+ "resend": "Resend verification",
1552
+ "savedPending": "Verification email sent to {{email}}.",
1553
+ "resent": "Verification email sent.",
1554
+ "alreadyVerified": "Recovery email is already verified.",
1555
+ "failed": "Could not update recovery email. Please try again.",
1556
+ "statusNotSet": "No recovery email set. Add one so you can recover access if you lose your password.",
1557
+ "statusPending": "Pending verification — check {{email}} and click the link.",
1558
+ "statusVerified": "Verified: {{email}}"
1559
+ },
1560
+ "editUser": {
1561
+ "providers": "Providers",
1562
+ "noProviders": "This user has no provider associations.",
1563
+ "noProvidersAtYourScope": "This user has no associations at your provider.",
1564
+ "addProvider": "Add",
1565
+ "addProviderPlaceholder": "Select a provider...",
1566
+ "providerAdded": "Provider added",
1567
+ "providerRemoved": "Provider association removed",
1568
+ "providerRoleUpdated": "Role updated to {{role}}",
1569
+ "removeProviderTitle": "Remove provider association",
1570
+ "removeProviderConfirm": "Remove this user's association with {{provider}}? This action cannot be undone."
1571
+ },
1572
+ "teamProfile": {
1573
+ "title": "Team profile",
1574
+ "roster": "Roster",
1575
+ "coaches": "Coaches",
1576
+ "staff": "Staff",
1577
+ "empty": "No members on this team yet.",
1578
+ "columns": {
1579
+ "name": "Name",
1580
+ "sex": "Sex",
1581
+ "role": "Role",
1582
+ "contact": "Contact"
1583
+ },
1584
+ "counts": {
1585
+ "players_one": "{{count}} player",
1586
+ "players_other": "{{count}} players",
1587
+ "coaches_one": "{{count}} coach",
1588
+ "coaches_other": "{{count}} coaches",
1589
+ "staff_one": "{{count}} staff",
1590
+ "staff_other": "{{count}} staff"
1591
+ }
1592
+ },
1593
+ "practiceCapacity": {
1594
+ "title": "Practice court capacity",
1595
+ "help": "Default capacity for PRACTICE bookings that don't set their own. Individual bookings can override this.",
1596
+ "unlimited": "Unlimited",
1597
+ "capped": "Cap simultaneous registrations:",
1598
+ "saved": "Practice capacity updated.",
1599
+ "invalidNumber": "Enter a whole number.",
1600
+ "mustBeNonNegative": "Capacity cannot be negative."
1601
+ },
1602
+ "practiceRegistrations": {
1603
+ "title": "Manage practice registrations",
1604
+ "bookingNotFound": "This practice booking is no longer available.",
1605
+ "currentRegistrations": "Current registrations",
1606
+ "noneYet": "No registrations yet.",
1607
+ "addRegistrant": "Add registrant",
1608
+ "participantLabel": "Participant",
1609
+ "participantPlaceholder": "Type participant name",
1610
+ "startTime": "Start",
1611
+ "endTime": "End",
1612
+ "add": "Add",
1613
+ "added": "Registration added.",
1614
+ "removed": "Registration removed.",
1615
+ "pickParticipant": "Pick a participant from the list.",
1616
+ "pickTimes": "Set both start and end times.",
1617
+ "invalidWindow": "Start time must be before end time.",
1618
+ "conflictWarning": "Registration added — participant has another commitment during this window."
1307
1619
  }
1308
1620
  },
1309
1621
  "dashboard": {
@@ -1323,7 +1635,12 @@
1323
1635
  "noEliminationStructures": "No elimination structures",
1324
1636
  "viewCompetitiveness": "View competitiveness",
1325
1637
  "viewBracket": "View bracket",
1326
- "allStructures": "All structures"
1638
+ "allStructures": "All structures",
1639
+ "categories": "Categories ({{count}})",
1640
+ "noneSet": "None",
1641
+ "practiceCapacity": "Practice capacity",
1642
+ "practiceUnlimited": "Unlimited",
1643
+ "practiceClosed": "Closed"
1327
1644
  },
1328
1645
  "drawers": {
1329
1646
  "editTournament": {
@@ -1453,7 +1770,10 @@
1453
1770
  "missingMethodsArray": "Missing methods array",
1454
1771
  "missingTournament": "Missing tournament",
1455
1772
  "devVariableError": "An error occurred while adding dev variables",
1456
- "cannotDeleteParticipant": "Participant is assigned to a draw and cannot be deleted"
1773
+ "cannotDeleteParticipant": "Participant is assigned to a draw and cannot be deleted",
1774
+ "magicLinkSent": "If an account exists for that email, a login link is on its way.",
1775
+ "magicLinkInvalid": "That login link is invalid or has expired. Please request a new one.",
1776
+ "addedTeamParticipants": "Generated {{count}} team participant(s) from the team column"
1457
1777
  },
1458
1778
  "loginMenu": {
1459
1779
  "authorization": "Authorization",
@@ -1553,7 +1873,9 @@
1553
1873
  "events": "Events",
1554
1874
  "teams": "Teams",
1555
1875
  "cityState": "City/State",
1556
- "nickname": "Nickname"
1876
+ "nickname": "Nickname",
1877
+ "role": "Role",
1878
+ "teamAffiliation": "Team affiliation"
1557
1879
  },
1558
1880
  "bracket": {
1559
1881
  "participant": "Participant",
@@ -1673,7 +1995,7 @@
1673
1995
  "viewAvailability": "View Availability",
1674
1996
  "viewTable": "View Table",
1675
1997
  "setDefaultAvailability": "Set Default Availability",
1676
- "saveToTournament": "Save to Tournament",
1998
+ "saveToTournament": "Save",
1677
1999
  "grid": {
1678
2000
  "view": "View",
1679
2001
  "day1": "1 Day",
@@ -1724,7 +2046,15 @@
1724
2046
  "updateCourtNames": "Update court names",
1725
2047
  "openingTime": "Opening Time",
1726
2048
  "closingTime": "Closing Time",
1727
- "timeOrderError": "Opening time must be before closing time"
2049
+ "timeOrderError": "Opening time must be before closing time",
2050
+ "websiteLabel": "Website URL",
2051
+ "imageLabel": "Image URL",
2052
+ "addressLine1Label": "Street address",
2053
+ "cityLabel": "City",
2054
+ "stateLabel": "State / region",
2055
+ "postalCodeLabel": "Postal code",
2056
+ "countryCodeLabel": "Country",
2057
+ "countryCodePlaceholder": "Start typing a country name"
1728
2058
  }
1729
2059
  },
1730
2060
  "events": {
@@ -1841,7 +2171,8 @@
1841
2171
  "male": "Male",
1842
2172
  "female": "Female",
1843
2173
  "unknown": "Unknown"
1844
- }
2174
+ },
2175
+ "staff": "Staff"
1845
2176
  }
1846
2177
  },
1847
2178
  "overlays": {
@@ -1989,7 +2320,16 @@
1989
2320
  "cityState": "City / State",
1990
2321
  "events": "Events",
1991
2322
  "rank": "Rank",
1992
- "noParticipants": "No participants"
2323
+ "noParticipants": "No participants",
2324
+ "teamsHeading": "Teams",
2325
+ "teamCounts": {
2326
+ "players_one": "{{count}} player",
2327
+ "players_other": "{{count}} players",
2328
+ "coaches_one": "{{count}} coach",
2329
+ "coaches_other": "{{count}} coaches",
2330
+ "staff_one": "{{count}} staff",
2331
+ "staff_other": "{{count}} staff"
2332
+ }
1993
2333
  },
1994
2334
  "display": {
1995
2335
  "label": "Display",
@@ -2024,5 +2364,205 @@
2024
2364
  "additional": "Additional Information",
2025
2365
  "dressCode": "Dress code",
2026
2366
  "contingencyPlan": "Weather contingency"
2027
- }
2367
+ },
2368
+ "provisioner": {
2369
+ "myProviders": "My Providers",
2370
+ "users": "Users",
2371
+ "noProviders": "No providers yet — create one to get started",
2372
+ "noUsers": "No users for this provider",
2373
+ "createProvider": "Create Provider",
2374
+ "createUser": "Create User",
2375
+ "openInTmx": "Open in TMX",
2376
+ "providerNamePlaceholder": "e.g. IONSport Demos",
2377
+ "providerAbbrPlaceholder": "e.g. IONDEMO",
2378
+ "providerCreated": "Provider created",
2379
+ "providerFieldsRequired": "Name and abbreviation are required",
2380
+ "userCreated": "User created",
2381
+ "userFieldsRequired": "Email and external ID are required",
2382
+ "selectProvider": "Select a provider…",
2383
+ "selectProviderFirst": "Select a provider first"
2384
+ },
2385
+ "manageAccess": {
2386
+ "title": "Manage Tournament Access",
2387
+ "tournament": "Tournament",
2388
+ "grantedAccess": "Granted Access",
2389
+ "addUser": "Add User",
2390
+ "emailPlaceholder": "user@example.com",
2391
+ "grant": "Grant",
2392
+ "revoke": "Revoke",
2393
+ "noAssignments": "No users have been granted access yet.",
2394
+ "loadError": "Failed to load assignments.",
2395
+ "grantError": "Failed to grant access.",
2396
+ "revokeError": "Failed to revoke access.",
2397
+ "granted": "{{email}} granted access",
2398
+ "revoked": "{{email}} access revoked"
2399
+ },
2400
+ "providerConfig": {
2401
+ "editCapsButton": "Edit Caps",
2402
+ "editCapsTitle": "Edit Caps — {{name}}",
2403
+ "editCapsTitleGeneric": "Edit Provider Caps",
2404
+ "editSettingsButton": "Edit Settings",
2405
+ "editSettingsTitle": "Edit Settings — {{name}}",
2406
+ "editSettingsTitleGeneric": "Edit Provider Settings",
2407
+ "section": {
2408
+ "branding": "Branding (white labeling)",
2409
+ "permissionCeilings": "Permission Ceilings",
2410
+ "permissionChoices": "Permissions",
2411
+ "allowedUniverses": "Allowed Universes",
2412
+ "allowedSelections": "Allowed Selections",
2413
+ "policies": "Policies",
2414
+ "defaults": "Defaults",
2415
+ "integrations": "Integrations",
2416
+ "privacy": "Participant Privacy",
2417
+ "themeTokens": "Theme tokens (CSS variables)"
2418
+ },
2419
+ "privacy": {
2420
+ "settingsHint": "Each toggle below relaxes the default privacy policy for one participant attribute. Leave off (the default) to keep that attribute private.",
2421
+ "cityState": "Publish City / State on participants"
2422
+ },
2423
+ "permissions": {
2424
+ "ceilingHint": "Each permission set to OFF here will be locked off for the provider — they cannot enable it.",
2425
+ "choiceHint": "Disable any permission your tournament directors should not perform. Permissions locked off by the provisioner are greyed out.",
2426
+ "lockedByProvisioner": "Locked by provisioner — cannot be enabled."
2427
+ },
2428
+ "allowed": {
2429
+ "universeHint": "Comma-separated list. Empty means unrestricted (everything allowed).",
2430
+ "selectionHint": "Comma-separated list. Empty means use the full provisioner-allowed universe."
2431
+ },
2432
+ "branding": {
2433
+ "appName": "App name",
2434
+ "navbarLogoUrl": "Navbar logo URL",
2435
+ "navbarLogoAlt": "Navbar logo alt text",
2436
+ "navbarLogoHeight": "Navbar logo height (px)",
2437
+ "splashLogoUrl": "Splash logo URL",
2438
+ "accentColor": "Accent color (CSS)",
2439
+ "stylesheetUrl": "Provider stylesheet URL (escape hatch)"
2440
+ },
2441
+ "defaults": {
2442
+ "defaultEventType": "Default event type",
2443
+ "defaultDrawType": "Default draw type",
2444
+ "defaultCreationMethod": "Default creation method",
2445
+ "defaultGender": "Default gender"
2446
+ },
2447
+ "policies": {
2448
+ "schedulingPolicy": "Scheduling policy (JSON)",
2449
+ "scoringPolicy": "Scoring policy (JSON)",
2450
+ "seedingPolicy": "Seeding policy (JSON)",
2451
+ "policyJsonPlaceholder": "{ ... }",
2452
+ "invalidJson": "Invalid JSON"
2453
+ },
2454
+ "capsSaved": "Caps saved",
2455
+ "settingsSaved": "Settings saved",
2456
+ "invalid": "Validation failed — see field errors below",
2457
+ "saveFailed": "Save failed",
2458
+ "loadCapsForGating": "Loading caps to determine which fields are locked...",
2459
+ "themeTokens": {
2460
+ "label": "Custom CSS variable overrides",
2461
+ "hint": "Token names must start with --tmx- or --chc-. Values are CSS color / length / font strings. Applied at boot and on provider switch.",
2462
+ "preset": "Preset",
2463
+ "chooseAPreset": "Choose a preset…",
2464
+ "add": "+ Add token",
2465
+ "remove": "Remove",
2466
+ "invalidPrefix": "Token name must start with --tmx- or --chc-"
2467
+ }
2468
+ },
2469
+ "banners": {
2470
+ "contactEmail": {
2471
+ "missing": "Set up a contact email so you can recover your password by email.",
2472
+ "pending": "Verify {{email}} so you can recover your password by email.",
2473
+ "setUp": "Set up email",
2474
+ "review": "Review"
2475
+ }
2476
+ },
2477
+ "verifyEmail": {
2478
+ "title": "Verify your email",
2479
+ "intro": "Click the button below to confirm that this email is yours.",
2480
+ "verifyButton": "Verify email",
2481
+ "verifying": "Verifying…",
2482
+ "success": "Verified ✓ — you can now receive password-recovery email at {{email}}. You may close this tab.",
2483
+ "successPlain": "Verified ✓. You may close this tab.",
2484
+ "missingToken": "This verification link is missing its token. Try clicking the link in your email again, or request a fresh one from the contact-email settings.",
2485
+ "tokenExpired": "This verification link has expired. Request a fresh one from your contact-email settings.",
2486
+ "tokenMismatch": "This link no longer matches your current contact email — it was probably superseded by a more recent change.",
2487
+ "tryAgain": "Try again",
2488
+ "failed": "Verification failed. Try requesting a fresh link."
2489
+ },
2490
+ "resetPassword": {
2491
+ "title": "Set a new password",
2492
+ "intro": "Choose a new password for your CourtHive account. The link in your email is single-use.",
2493
+ "newPasswordPlaceholder": "New password (at least 8 characters)",
2494
+ "confirmPlaceholder": "Confirm new password",
2495
+ "submit": "Set new password",
2496
+ "submitting": "Setting…",
2497
+ "success": "Your password was changed. Redirecting to login…",
2498
+ "missingToken": "This reset link is missing its token. Try clicking the link in your email again, or request a fresh one.",
2499
+ "tokenExpired": "This reset link has expired. Request a fresh one from the login screen's \"Forgot your password?\" link.",
2500
+ "tokenMismatch": "This link no longer matches your current contact email — request a fresh one.",
2501
+ "failed": "Couldn't reset your password. Try requesting a fresh link."
2502
+ },
2503
+ "noAccess": {
2504
+ "title": "No admin access",
2505
+ "message": "Your account doesn't have access to the admin console. If you manage a tournament, use the TMX app instead. Contact your provider administrator if you believe this is an error.",
2506
+ "logOut": "Log out"
2507
+ },
2508
+ "admin": {
2509
+ "abbreviation": "Abbreviation",
2510
+ "providerId": "Provider ID",
2511
+ "impersonating": "Impersonating this provider",
2512
+ "tournaments": "Tournaments",
2513
+ "noTournaments": "No tournaments found",
2514
+ "tournamentName": "Tournament",
2515
+ "startDate": "Start",
2516
+ "endDate": "End",
2517
+ "calendarLoadError": "Could not load calendar",
2518
+ "policyDefinitions": "Policy Definitions",
2519
+ "policyEditorComingSoon": "Policy editor coming soon.",
2520
+ "quickActions": "Quick Actions",
2521
+ "manageProviders": "Manage Providers",
2522
+ "manageUsers": "Manage Users",
2523
+ "backToSystem": "Back to System",
2524
+ "noProviderSelected": "No Provider Selected",
2525
+ "selectProviderHint": "Select a provider from the System page to view their admin dashboard.",
2526
+ "dashboard": "Dashboard",
2527
+ "providerDashboardComingSoon": "Provider dashboard coming soon.",
2528
+ "runAudit": "Run Audit",
2529
+ "auditClean": "All {{total}} calendar entries verified in storage",
2530
+ "auditWarning": "{{missing}} of {{total}} calendar entries missing from storage",
2531
+ "auditError": "Calendar audit failed",
2532
+ "tournamentDetail": "Tournament Detail",
2533
+ "selectTournament": "Select a tournament from the calendar to view details.",
2534
+ "loadingTournament": "Loading tournament info...",
2535
+ "tournamentNotFound": "Tournament info not available.",
2536
+ "tournamentLoadError": "Could not load tournament info.",
2537
+ "tournamentMissingFromStorage": "This tournament exists in the calendar but not in storage.",
2538
+ "participants": "Participants",
2539
+ "venues": "Venues",
2540
+ "event": "Event",
2541
+ "type": "Type",
2542
+ "entries": "Entries",
2543
+ "draws": "Draws",
2544
+ "noEvents": "No events"
2545
+ },
2546
+ "ams": {
2547
+ "officials": "Officials",
2548
+ "rosters": "Rosters",
2549
+ "membership": "Membership",
2550
+ "sanctioning": "Sanctioning",
2551
+ "conferences": "Conferences",
2552
+ "sids": "SID Tools",
2553
+ "seamPlaceholder": "Coming soon — built by WS-14–16."
2554
+ },
2555
+ "console": {
2556
+ "title": "CourtHive Console",
2557
+ "amsSection": "Associate Management",
2558
+ "platformSection": "Platform Admin"
2559
+ },
2560
+ "recoveryEmail": "Recovery email",
2561
+ "recoveryEmailHelp": "Real mailbox for password recovery. Separate from the login email above.",
2562
+ "verified": "Verified",
2563
+ "unverified": "Unverified",
2564
+ "sendVerification": "Send verification",
2565
+ "verificationSent": "Verification email sent",
2566
+ "alreadyVerified": "Recovery email already verified",
2567
+ "noRecoveryEmail": "No recovery email set"
2028
2568
  }