Files
TX/artifacts/tx-os/src/locales/en.json
T
Replit Agent 56c8bcfb85 Add download for protocol visit photos (Task #660)
Users could upload photos into Protocol "تصوير" albums but had no way to
download them — clicking a photo only opened it inline. This adds per-photo
downloads and a whole-album ZIP download.

Backend:
- objectStorage.ts: new exported extensionForContentType() mapping content
  types to file extensions (stored paths are extension-less UUIDs).
- storage.ts: opt-in ?download=1 mode on GET /storage/objects/*path sets
  Content-Disposition: attachment (with optional ?name base + derived ext);
  default inline behavior and per-entity authz unchanged.
- protocol.ts: new GET /protocol/photo-albums/:id/download streams all album
  photos as a ZIP (guarded by requireProtocolAccess), named from the album;
  unreadable objects are skipped rather than failing the archive. Empty album
  returns 404.
- Added archiver@8 dependency (+@types/archiver dev).

Frontend (protocol.tsx):
- Per-photo download button (attachment, name = album-index) in album detail.
- "تحميل الكل" / "Download all" ZIP button in album header (hidden when empty).
- Added photoDownloadSrc/albumDownloadSrc helpers, Download icon.
- AR/EN locale strings protocol.photos.download / downloadAll.

Notes / deviations:
- archiver v8 is ESM-only with no callable default export; used
  `new ZipArchive(...)` instead of `archiver("zip")`. Recorded in memory.
- Could not run authenticated e2e (seed admin password is a secret). Verified:
  api-server typecheck + build pass, tx-os typecheck passes, server healthy,
  new routes wired (401 auth-required not 404). Pre-existing typecheck errors
  in executive-meetings.ts / push.ts are unrelated and untouched.
2026-07-07 09:34:06 +00:00

1675 lines
63 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"nav": {
"home": "Home",
"services": "Services",
"notifications": "Notifications",
"admin": "Admin Dashboard",
"logout": "Logout"
},
"auth": {
"login": "Login",
"register": "Register",
"username": "Username",
"email": "Email",
"password": "Password",
"loginButton": "Login",
"registerButton": "Register",
"welcomeBack": "Welcome Back",
"createAccount": "Create Account",
"registrationClosed": "Public registration is currently closed. Please contact the administrator.",
"displayNameAr": "Name (Arabic)",
"displayNameEn": "Name (English)",
"subtitle": "Sign in to your account to continue",
"signingIn": "Signing in...",
"noAccount": "Don't have an account?",
"showPassword": "Show password",
"hidePassword": "Hide password",
"errRequired": "Please enter your username and password.",
"errInvalid": "Invalid username or password.",
"forgotPassword": "Forgot password?",
"forgot": {
"title": "Reset your password",
"subtitle": "Enter your username or email and we'll send you a link to reset your password.",
"identifier": "Username or email",
"identifierPlaceholder": "you@example.com",
"submit": "Send reset link",
"sending": "Sending...",
"errRequired": "Please enter your username or email.",
"errGeneric": "Something went wrong. Please try again.",
"successMessage": "Your request has been received. An administrator will share a reset link with you shortly.",
"adminNotice": "Email delivery is not configured for this workspace yet, so an administrator will issue a one-time reset link manually.",
"backToLogin": "Back to sign in"
},
"reset": {
"title": "Set a new password",
"subtitle": "Choose a new password for your account.",
"newPassword": "New password",
"confirmPassword": "Confirm password",
"submit": "Update password",
"saving": "Saving...",
"errMinLength": "Password must be at least 6 characters.",
"errMismatch": "Passwords do not match.",
"errGeneric": "Could not reset password. The link may have expired.",
"invalidToken": "This reset link is invalid or has expired.",
"requestNew": "Request a new link",
"successMessage": "Your password has been updated. You can now sign in with your new password.",
"goToLogin": "Go to sign in"
},
"heroTitle": "Welcome to your unified workspace.",
"heroSubtitle": "Sign in to manage everything from one place.",
"feat1": "All your tools in one dashboard",
"feat2": "Real-time updates",
"feat3": "Secure session-based access",
"rights": "All rights reserved."
},
"home": {
"myApps": "My Apps",
"noApps": "No apps yet",
"noAppsHint": "Apps you have access to will appear here.",
"greeting": {
"morning": "Good morning, {{name}}",
"afternoon": "Good afternoon, {{name}}",
"evening": "Good evening, {{name}}"
},
"stats": {
"apps": "Apps",
"services": "Services",
"alerts": "Alerts"
},
"clockStyle": {
"label": "Clock style",
"showWidget": "Show wall clock on home screen",
"showTopbar": "Show clock in top bar",
"hideWidget": "Hide clock",
"hourFormat": {
"label": "Hour format",
"h12": "12-hour (AM/PM)",
"h24": "24-hour"
},
"options": {
"full": "Full (time, weekday, Hijri & Gregorian)",
"digital": "Digital with seconds",
"digital-no-seconds": "Digital without seconds",
"analog": "Analog clock",
"minimal": "Minimal (time only)"
}
}
},
"services": {
"title": "Services",
"available": "Available",
"unavailable": "Unavailable",
"price": "Price",
"noServices": "No services available",
"category": "Category",
"free": "Free",
"order": "Order",
"orderModalTitle": "Confirm order",
"orderNotes": "Notes (optional)",
"orderNotesPlaceholder": "Any extra notes?",
"orderNotesCounter": "{{count}}/500",
"addNotes": "Add notes",
"hideNotes": "Hide",
"placeOrder": "Send",
"placing": "Sending...",
"orderPlaced": "Order placed",
"orderFailed": "Could not place the order",
"myOrdersLink": "My Orders",
"editMode": {
"hint": "Drag to rearrange",
"done": "Done",
"saveFailed": "Could not save the new order"
}
},
"myOrders": {
"title": "My Orders",
"loadError": "Could not load your orders. Please try again.",
"retry": "Retry",
"back": "Back",
"empty": "No orders yet",
"emptyHint": "Start from the services catalog.",
"browseServices": "Browse services",
"notesLabel": "Notes:",
"cancel": "Cancel order",
"cancelConfirmTitle": "Cancel this order?",
"cancelConfirm": "Yes, cancel",
"keep": "Keep it",
"cancelled": "Order cancelled",
"cancelFailed": "Could not cancel the order",
"restoreFailed": "Could not restore the order",
"delete": "Delete",
"reorder": "Reorder",
"deleteFailed": "Could not delete the order",
"undo": "Undo",
"undone": "Restored"
},
"orderStatus": {
"pending": "Awaiting receiver",
"received": "Received",
"preparing": "Preparing",
"completed": "Completed",
"cancelled": "Cancelled"
},
"incomingOrders": {
"title": "Incoming Orders",
"linkLabel": "Incoming",
"subtitleUnclaimed": "Awaiting receiver",
"subtitleMine": "My active orders",
"empty": "No incoming orders right now",
"emptyHint": "New orders will show up here as they arrive.",
"loadError": "Could not load incoming orders.",
"retry": "Retry",
"noAccess": "You don't have permission to receive orders.",
"back": "Back",
"ageJustNow": "just now",
"ageMinutes": "{{count}}m ago",
"ageHours": "{{count}}h ago",
"ageDays": "{{count}}d ago",
"from": "From",
"confirmReceipt": "Confirm Receipt",
"confirming": "Confirming...",
"markPreparing": "Mark Preparing",
"markCompleted": "Mark Completed",
"cancel": "Cancel",
"alreadyClaimed": "Already claimed by someone else",
"orderUnavailable": "This order is no longer available",
"actionFailed": "Could not complete the action",
"claimed": "Order received",
"marked": "Status updated",
"cancelled": "Order cancelled",
"undo": "Undo",
"undone": "Restored",
"restoreFailed": "Could not restore the order",
"select": "Select",
"selectAll": "Select all",
"clearSelection": "Clear selection",
"selectedCount_one": "1 order selected",
"selectedCount_other": "{{count}} orders selected",
"delete": "Delete",
"deleteConfirmTitle_one": "Delete 1 order?",
"deleteConfirmTitle_other": "Delete {{count}} orders?",
"deleteConfirmBody_one": "1 order will be permanently deleted. This can't be undone.",
"deleteConfirmBody_other": "{{count}} orders will be permanently deleted. This can't be undone.",
"deleted_one": "1 order deleted",
"deleted_other": "{{count}} orders deleted",
"deleteFailed": "Could not delete the orders",
"deletePartial": "Deleted {{deleted}} of {{total}}; the rest could not be deleted"
},
"notifications": {
"title": "Notifications",
"markAllRead": "Mark All Read",
"noNotifications": "No new notifications",
"unread": "Unread"
},
"settingsPanel": {
"title": "Settings",
"section": {
"dock": "App dock",
"language": "Language",
"notifications": "Notifications",
"sound": "Sound",
"clock": "Clock"
},
"lang": {
"ar": "العربية",
"en": "English"
},
"sound": {
"master": "Play notification sounds"
},
"dock": {
"show": "Show bottom app dock"
}
},
"notifSettings": {
"title": "Notification sounds",
"mute": "Mute notifications",
"unmute": "Unmute notifications",
"globalSound": "Play sound on alerts",
"volume": "Volume",
"ordersEnabled": "Sound for new orders",
"meetingsEnabled": "Sound for meeting reminders",
"notesEnabled": "Sound for incoming notes",
"vibrationOrder": "Vibrate on new orders",
"vibrationMeeting": "Vibrate on meeting reminders",
"vibrationNote": "Vibrate on incoming notes",
"preview": "Preview",
"quickMute": "Mute notifications",
"quickUnmute": "Unmute notifications",
"mutedToast": "Notifications muted",
"unmutedToast": "Notifications unmuted",
"autoplayHintTitle": "Sounds need a click",
"autoplayHint": "Click anywhere on the page to enable notification sounds.",
"autoplayHintIos": "Tap anywhere to enable sounds. If you still don't hear them, raise the *media* volume (the same one that controls YouTube).",
"push": {
"title": "Lock-screen notifications",
"desc": "Get alerts on the home/lock screen when Tx OS is closed.",
"enable": "Enable",
"disable": "Disable",
"enabled": "Enabled",
"denied": "Blocked — enable from device settings",
"unsupported": "Not supported on this device. On iPad, add Tx OS to the Home Screen first.",
"enableFailed": "Could not enable notifications. Try again.",
"enableSuccess": "Notifications enabled",
"iosInstall": {
"title": "Install Tx OS to get lock-screen alerts",
"desc": "iPhone & iPad only deliver notifications when Tx OS is opened from a Home Screen icon, not from a Safari tab.",
"step1": "Tap the Share button at the bottom of Safari.",
"step2": "Scroll and tap \"Add to Home Screen\".",
"step3": "Open Tx OS from its new icon, then enable notifications here."
},
"errors": {
"unsupported": "This browser does not support lock-screen notifications.",
"unsupported_ios_safari": "On iPhone/iPad, open Tx OS from its Home Screen icon first (Share → Add to Home Screen), then enable notifications from inside the app.",
"permission_denied": "Notification permission is blocked. Open Settings → Tx OS on your device and enable notifications manually.",
"permission_dismissed": "Permission wasn't granted yet. Tap \"Enable\" again and choose \"Allow\" in the browser prompt.",
"vapid_unavailable": "Could not reach the notifications server. Check your connection and try again.",
"subscribe_failed": "Could not register this device for notifications. Try again.",
"server_rejected": "The server refused to register this device. Try again or sign in again."
}
},
"slot": {
"order": "Orders",
"meeting": "Meetings",
"note": "Notes"
},
"sounds": {
"ding": "Ding",
"chime": "Chime",
"bell": "Bell",
"knock": "Knock",
"pop": "Pop",
"alert": "Alert",
"beep": "Beep",
"soft": "Soft"
}
},
"admin": {
"title": "Admin Dashboard",
"manageApps": "Manage Apps",
"manageServices": "Manage Services",
"manageUsers": "Manage Users",
"appDisabled": "Disabled",
"addApp": "Add App",
"addService": "Add Service",
"addUser": "Add User",
"editApp": "Edit App",
"editService": "Edit Service",
"editUser": "Edit User",
"deleteConfirm": "Are you sure you want to delete?",
"deleteApp": {
"title": "Delete app \"{{name}}\"?",
"warning": "This app is still in use. Deleting it will affect the following:",
"forceHint": "This will revoke access for everyone using it and remove its history. This cannot be undone.",
"emptyBody": "Are you sure you want to delete this app?",
"groupCount": "{{count}} group(s) currently grant this app",
"restrictionCount": "{{count}} permission rule(s) restricting it",
"openCount": "{{count}} open event(s) in history",
"confirm": "Delete",
"anyway": "Delete anyway"
},
"deleteService": {
"title": "Delete service \"{{name}}\"?",
"warning": "This service still has orders. Deleting it will affect the following:",
"forceHint": "This will permanently remove every related order. This cannot be undone.",
"emptyBody": "Are you sure you want to delete this service?",
"orderCount": "{{count}} order(s)",
"confirm": "Delete",
"anyway": "Delete anyway"
},
"deleteUser": {
"title": "Delete user \"{{name}}\"?",
"warning": "This user owns data. Deleting them will affect the following:",
"forceHint": "This will permanently remove their notes and orders. This cannot be undone.",
"emptyBody": "Are you sure you want to delete this user?",
"noteCount": "{{count}} note(s)",
"orderCount": "{{count}} order(s)",
"confirm": "Delete",
"anyway": "Delete anyway"
},
"activate": "Activate",
"deactivate": "Deactivate",
"appName": "App Name",
"appNameAr": "App Name (Arabic)",
"appNameEn": "App Name (English)",
"appSlug": "Slug",
"appRoute": "Route",
"appIcon": "Icon",
"appColor": "Color",
"appImage": "Image",
"appExternalUrl": "External URL",
"appOpenMode": {
"label": "How to open",
"internal": "Built-in page (default)",
"external_tab": "Open external link in a new tab",
"external_iframe": "Open external link inside the app"
},
"builtinPathLocked": "The path of a built-in app cannot be changed.",
"appSortOrder": "Sort Order",
"appPermissions": {
"title": "Required permissions",
"help": "Users need at least one of these to see the app. Leave empty for no restriction.",
"none": "No permissions required — visible to everyone.",
"selectPlaceholder": "Select a permission…",
"add": "Add",
"removeAria": "Remove permission {{name}}",
"impactTitle": "Impact preview",
"impactLoading": "Calculating impact…",
"impactError": "Couldn't load impact preview. Try again.",
"impactNone": "No users would lose access. {{visible}} currently see this app.",
"impactSummary": "{{affected}} of {{visible}} users currently seeing this app would lose access.",
"impactViaGroups": "Members of these groups keep access regardless: {{groups}}.",
"confirmTitle": "Confirm permission change",
"confirmBody": "Adding this requirement will hide the app from {{affected}} of {{visible}} users who currently see it. This change is reversible.",
"confirmAction": "Add anyway"
},
"serviceName": "Service Name",
"serviceNameAr": "Service Name (Arabic)",
"serviceNameEn": "Service Name (English)",
"serviceDescriptionAr": "Description (Arabic)",
"serviceDescriptionEn": "Description (English)",
"serviceAvailable": "Available?",
"serviceImageUrl": "Image URL",
"serviceImage": "Service Image",
"uploadImage": "Upload Image",
"replaceImage": "Replace Image",
"uploading": "Uploading...",
"uploadFailed": "Image upload failed",
"users": {
"searchPlaceholder": "Search by username or email...",
"allGroups": "All groups",
"allStatuses": "All statuses",
"statusActive": "Active",
"statusInactive": "Inactive",
"showing": "Showing {{count}} of {{total}}",
"empty": "No users match your filters.",
"editGroups": "Edit groups",
"editUserGroups": "Edit groups for {{username}}",
"col": {
"username": "Username",
"email": "Email",
"displayNameAr": "Name (Arabic)",
"displayNameEn": "Name (English)",
"language": "Language",
"createdAt": "Created",
"groups": "Groups",
"actions": "Actions"
},
"review": {
"title": "Review changes",
"subtitle": "Confirm what will be saved for {{username}}.",
"noChanges": "No changes to save",
"groupsAdded": "Groups added",
"groupsRemoved": "Groups removed",
"back": "Back to edit",
"confirm": "Confirm & save"
},
"counts": {
"notes": "{{count}} notes",
"orders": "{{count}} orders"
},
"historyTitle": "Permission history",
"historyHint": "Roles and groups assigned to this user. Filter by who changed it or when.",
"historyEmpty": "No permission changes have been recorded for this user yet.",
"historyEmptyFiltered": "No permission changes match the current filters.",
"historyAdded_one": "Added ({{count}}):",
"historyAdded_other": "Added ({{count}}):",
"historyRemoved_one": "Removed ({{count}}):",
"historyRemoved_other": "Removed ({{count}}):",
"historyTotal_one": "{{count}} entry after change",
"historyTotal_other": "{{count}} entries after change",
"history": {
"kind": {
"roles": "Roles",
"groups": "Groups"
}
}
},
"username": "Username",
"email": "Email",
"password": "Password",
"roles": {
"searchPlaceholder": "Search roles...",
"addRole": "Add Role",
"editRole": "Edit Role",
"name": "Name",
"namePlaceholder": "e.g. content_editor",
"nameHint": "Letters, numbers and underscores only.",
"descriptionAr": "Description (Arabic)",
"descriptionEn": "Description (English)",
"system": "System",
"empty": "No roles yet.",
"edit": "Edit role",
"delete": "Delete role",
"editSystemNameHint": "System role names cannot be changed.",
"deleteTitle": "Delete role \"{{name}}\"?",
"deleteEmptyBody": "This role isn't assigned to anyone. Continue?",
"deleteConflict": "This role is still in use and cannot be deleted.",
"deleteConflictHint": "Remove this role from the affected users and groups before deleting it.",
"deleteConfirm": "Delete",
"usersCount": "{{count}} users",
"groupsCount": "{{count}} groups",
"errorNameTaken": "A role with that name already exists.",
"errorInvalidName": "Role name must start with a letter and contain only letters, numbers, or underscores.",
"errorSystemRename": "System role names cannot be changed.",
"renameWarningTitle": "Renaming \"{{from}}\" to \"{{to}}\"",
"renameWarningBody": "This role's name may be referenced by code, integrations, or audit log queries. Renaming can quietly break those flows. Update any callers before saving.",
"renameUsage": "Currently used by {{users}} users and {{groups}} groups.",
"permissions": "Permissions",
"permissionsHint": "Select which permissions this role grants.",
"permissionsSystemHint": "System role permissions are read-only.",
"permissionsEmpty": "No permissions are defined.",
"errorSystemPermissions": "System role permissions cannot be changed.",
"errorPermissionsSave": "Could not save the role's permissions.",
"impactTitle_one": "Removing {{count}} permission",
"impactTitle_other": "Removing {{count}} permissions",
"impactLoading": "Calculating impact...",
"impactNoUsers": "No users currently get any of these permissions through this role.",
"impactError": "Could not check who would be affected. Please adjust your selection or try again.",
"impactPerPermission": "{{users}} users would lose this ({{groups}} groups grant the role)",
"impactViaGroups": "via groups: {{groups}}",
"impactTotal_one": "{{count}} user in total would lose at least one permission.",
"impactTotal_other": "{{count}} users in total would lose at least one permission.",
"confirmRemovalTitle": "Confirm permission removal",
"confirmRemovalBody_one": "Saving will remove permissions from {{count}} user. This may revoke their access immediately. Continue?",
"confirmRemovalBody_other": "Saving will remove permissions from {{count}} users. This may revoke their access immediately. Continue?",
"confirmRemovalAction": "Remove permissions",
"historyTitle": "History",
"historyHint": "Permission changes for this role. Use the filters to narrow by who changed it or when.",
"historyEmpty": "No permission changes have been recorded for this role yet.",
"historyEmptyFiltered": "No permission changes match the current filters.",
"historyActorUnknown": "Unknown actor",
"historyAdded_one": "Added ({{count}}):",
"historyAdded_other": "Added ({{count}}):",
"historyRemoved_one": "Removed ({{count}}):",
"historyRemoved_other": "Removed ({{count}}):",
"historyTotal_one": "{{count}} permission after change",
"historyTotal_other": "{{count}} permissions after change",
"historyShowing": "Showing {{shown}} of {{total}}",
"historyLoadMore": "Load more",
"historyDownloadCsv": "Download CSV",
"historyDownloadCsvError": "Could not download CSV. Please try again.",
"historyFilters": {
"actor": "Changed by",
"allActors": "Anyone",
"from": "From",
"to": "To",
"apply": "Apply",
"reset": "Reset"
},
"historyErrors": {
"invalidDate": "Dates must be in YYYY-MM-DD format.",
"invertedDates": "\"From\" must be on or before \"To\".",
"fixFiltersFirst": "Fix the filters above to load history."
}
},
"active": "Active",
"issueResetLink": "Issue password reset link",
"orderReceiverRole": "Order Receiver",
"roleInheritedFromGroup": "Inherited from group",
"resetLinkModal": {
"title": "Password reset link for {{username}}",
"description": "Share this one-time link with the user. It can only be used once.",
"expires": "Expires: {{time}}",
"copy": "Copy link",
"copied": "Link copied to clipboard"
},
"siteSettings": "Site Settings",
"siteNameAr": "Site Name (Arabic)",
"siteNameEn": "Site Name (English)",
"registrationOpen": "Allow public registration",
"registrationOpenHint": "When off, only admins can create new users.",
"footerTextAr": "Footer Text (Arabic)",
"footerTextEn": "Footer Text (English)",
"nav": {
"dashboard": "Dashboard",
"apps": "Apps",
"services": "Services",
"users": "Users",
"groups": "Groups",
"roles": "Roles",
"auditLog": "Audit log",
"userManagement": "User Management",
"settings": "Settings",
"systemUpdates": "System Updates",
"menu": "Menu"
},
"systemUpdates": {
"title": "System Updates",
"subtitle": "Check whether a newer version is available — this page never installs an update.",
"currentVersion": "Current Version",
"buildNumber": "Build Number",
"latestVersion": "Latest Version",
"updateStatus": "Update Status",
"statusUpToDate": "System is up to date",
"statusUpdateAvailable": "New update available",
"statusNotConfigured": "Update source not configured",
"statusError": "Unable to check for updates",
"notConfiguredHint": "Ask the administrator to set the LATEST_VERSION_URL environment variable to the external latest.json URL to enable checking.",
"checkNow": "Check Now",
"loading": "Checking version…",
"lastChecked": "Last checked",
"serverStartedAt": "Server started",
"toastErrorTitle": "Check failed",
"toastErrorDesc": "Could not reach the update source. Please try again later."
},
"apps": {
"counts": {
"groups": "{{count}} groups",
"restrictions": "{{count}} restrictions",
"opens": "{{count}} opens"
},
"historyTitle": "Permission history",
"historyHint": "Permissions required to use this app. Filter by who changed it or when.",
"historyEmpty": "No permission changes have been recorded for this app yet.",
"historyEmptyFiltered": "No permission changes match the current filters.",
"historyAdded_one": "Added ({{count}}):",
"historyAdded_other": "Added ({{count}}):",
"historyRemoved_one": "Removed ({{count}}):",
"historyRemoved_other": "Removed ({{count}}):",
"historyTotal_one": "{{count}} permission after change",
"historyTotal_other": "{{count}} permissions after change"
},
"services": {
"counts": {
"orders": "{{count}} orders"
}
},
"groups": {
"searchPlaceholder": "Search groups...",
"addGroup": "Add Group",
"editGroup": "Edit Group",
"name": "Name",
"descriptionAr": "Description (Arabic)",
"descriptionEn": "Description (English)",
"system": "System",
"empty": "No groups yet.",
"members": "{{count}} members",
"appsCount": "{{count}} apps",
"rolesCount": "{{count}} roles",
"appsHint": "Members of this group will see these apps.",
"usersHint": "Members of this group.",
"rolesHint": "Members of this group are automatically granted these roles.",
"rolesEmpty": "No roles available.",
"deleteTitle": "Delete group \"{{name}}\"?",
"deleteWarning": "This group is still in use. Deleting it will revoke access for the following:",
"deleteForceHint": "Deleting will detach these members and revoke their group-granted apps and roles. This cannot be undone.",
"deleteEmptyBody": "This group has no members, apps, or roles. Continue?",
"deleteConfirm": "Delete",
"deleteAnyway": "Delete anyway",
"tab": {
"info": "Info",
"apps": "Apps",
"users": "Users",
"roles": "Roles",
"history": "History"
},
"historyTitle": "Permission history",
"historyHint": "Members, roles and apps attached to this group. Filter by who changed it or when.",
"historyEmpty": "No permission changes have been recorded for this group yet.",
"historyEmptyFiltered": "No permission changes match the current filters.",
"historyAdded_one": "Added ({{count}}):",
"historyAdded_other": "Added ({{count}}):",
"historyRemoved_one": "Removed ({{count}}):",
"historyRemoved_other": "Removed ({{count}}):",
"historyTotal_one": "{{count}} entry after change",
"historyTotal_other": "{{count}} entries after change",
"history": {
"kind": {
"users": "Users",
"roles": "Roles",
"apps": "Apps"
}
}
},
"audit": {
"filters": {
"action": "Action",
"allActions": "All actions",
"actor": "Actor",
"allActors": "All actors",
"actorSearch": "Search by name or @username",
"actorEmpty": "No matching users.",
"actorWithName": "Actor: {{name}}",
"actorWithId": "Actor: #{{id}}",
"clearActorFilter": "Clear actor filter",
"from": "From",
"to": "To",
"apply": "Apply",
"reset": "Reset",
"forcedOnly": "Forced deletions only",
"forcedOnlyHint": "Show only force-delete entries for groups, users, apps, and services.",
"targetType": "Target type: {{type}}",
"targetWithId": "Target: {{type}} #{{id}}",
"clearTargetFilter": "Clear target filter"
},
"actorPivotAria": "Filter audit log to actions by {{name}}",
"target": "Target: {{type}} #{{id}}",
"targetWithName": "Target: {{type}} #{{id}} · {{name}}",
"showing": "Showing {{shown}} of {{total}}",
"empty": "No audit log entries match these filters.",
"loadMore": "Load more",
"export": {
"button": "Export CSV",
"failed": "Could not export the audit log. Please try again."
},
"errors": {
"invalidDate": "Dates must be in YYYY-MM-DD format.",
"invertedDates": "\"From\" date must be on or before \"To\" date.",
"fixFiltersFirst": "Adjust the filters to load entries."
},
"unit": {
"member_one": "{{count}} member",
"member_other": "{{count}} members",
"app_one": "{{count}} app",
"app_other": "{{count}} apps",
"role_one": "{{count}} role",
"role_other": "{{count}} roles",
"group_one": "{{count}} group",
"group_other": "{{count}} groups",
"order_one": "{{count}} order",
"order_other": "{{count}} orders",
"change_one": "{{count}} change",
"change_other": "{{count}} changes",
"permission_one": "{{count}} permission",
"permission_other": "{{count}} permissions",
"restriction_one": "{{count}} restriction",
"restriction_other": "{{count}} restrictions",
"note_one": "{{count}} note",
"note_other": "{{count}} notes",
"open_one": "{{count}} open",
"open_other": "{{count}} opens"
},
"dependencies": {
"label": "Cleared dependencies",
"chipAriaTargetType": "{{label}} — open audit log filtered by target type \"{{type}}\"",
"chipAriaParent": "{{label}} — open audit log for {{type}} #{{id}}"
},
"recent": {
"title": "Recent activity",
"loading": "Loading recent activity…",
"empty": "No recent activity for this record yet.",
"viewAll": "View full history",
"viewAllAria": "Open the audit log filtered to this {{type}}"
},
"summary": {
"app": {
"create": "Created app '{{name}}'",
"update": "Updated app '{{name}}' ({{changes}})",
"rename": "Renamed app '{{previousName}}' to '{{name}}'",
"delete": "Deleted app '{{name}}'",
"forceDelete": "Force-deleted app '{{name}}' (affected {{groups}})",
"permissionAdd": "Added permission '{{permission}}' to app '{{name}}'",
"permissionRemove": "Removed permission '{{permission}}' from app '{{name}}'"
},
"auth": {
"issueResetLink": "Issued password reset link for @{{username}}"
},
"group": {
"create": "Created group '{{name}}' ({{members}}, {{apps}})",
"update": "Updated group '{{name}}' ({{changes}})",
"rename": "Renamed group '{{previousName}}' to '{{name}}'",
"delete": "Deleted group '{{name}}'",
"forceDelete": "Force-deleted group '{{name}}' ({{members}})",
"userAdd": "Added @{{username}} to group '{{name}}'",
"userAddById": "Added user #{{userId}} to group '{{name}}'",
"userRemove": "Removed @{{username}} from group '{{name}}'",
"userRemoveById": "Removed user #{{userId}} from group '{{name}}'",
"appAdd": "Added app '{{appName}}' to group '{{name}}'",
"appAddById": "Added app #{{appId}} to group '{{name}}'",
"appRemove": "Removed app '{{appName}}' from group '{{name}}'",
"appRemoveById": "Removed app #{{appId}} from group '{{name}}'",
"roleAdd": "Added role '{{roleName}}' to group '{{name}}'",
"roleAddById": "Added role #{{roleId}} to group '{{name}}'",
"roleRemove": "Removed role '{{roleName}}' from group '{{name}}'",
"roleRemoveById": "Removed role #{{roleId}} from group '{{name}}'"
},
"role": {
"create": "Created role '{{name}}'",
"update": "Updated role '{{name}}' ({{changes}})",
"rename": "Renamed role '{{previousName}}' to '{{name}}'",
"delete": "Deleted role '{{name}}'",
"permissionsReplace": "Updated permissions for role '{{name}}' (added {{added}}, removed {{removed}})",
"permissionAdd": "Added permission '{{permission}}' to role '{{name}}'",
"permissionRemove": "Removed permission '{{permission}}' from role '{{name}}'"
},
"service": {
"delete": "Deleted service '{{name}}'",
"deleteId": "Deleted service #{{id}}",
"forceDelete": "Force-deleted service '{{name}}' (affected {{orders}})"
},
"settings": {
"update": "Updated system settings ({{changes}})",
"registrationOpened": "Opened public registration",
"registrationClosed": "Closed public registration",
"registrationOpenedWith": "Opened public registration and {{others}}",
"registrationClosedWith": "Closed public registration and {{others}}"
},
"user": {
"delete": "Deleted user @{{username}}",
"deleteWithName": "Deleted user @{{username}} ({{displayName}})",
"forceDelete": "Force-deleted user @{{username}}",
"forceDeleteWithName": "Force-deleted user @{{username}} ({{displayName}})"
}
}
},
"dashboardSoon": "Dashboard widgets coming soon.",
"dashboard": {
"totalApps": "Total Apps",
"totalServices": "Total Services",
"totalUsers": "Total Users",
"registration": "Registration",
"open": "Open",
"closed": "Closed",
"recentActivity": "Recent Activity",
"latestUser": "Latest User",
"latestApp": "Latest App",
"none": "—",
"newUsers7d": "New users (7d)",
"vsPrev7d": "Previous 7d: {{count}}",
"newUsersInRange": "New users · {{range}}",
"vsPrevRange": "{{range}}: {{count}}",
"activeServices": "Active services",
"inactiveServices": "Inactive: {{count}}",
"signupsTrend": "Sign-ups",
"last7Days": "Last 7 days",
"appOpensTrend": "App opens",
"appOpensSummary": "{{count}} total · {{delta}}",
"appOpensSummaryRanged": "{{count}} in {{range}} · {{delta}}",
"servicesCreatedTrend": "Services added",
"servicesCreatedSummary": "{{count}} added",
"servicesCreatedSummaryRanged": "{{count}} in {{range}}",
"trends": "Trends",
"rangeSelector": "Time range",
"range": {
"7d": "Last 7 days",
"30d": "Last 30 days",
"90d": "Last 90 days",
"custom": "Custom range",
"customLabel": "{{from}} {{to}}"
},
"prevRange": {
"7d": "Previous 7 days",
"30d": "Previous 30 days",
"90d": "Previous 90 days",
"custom": "Previous {{count}} days"
},
"customRange": {
"from": "From",
"to": "To",
"apply": "Apply",
"invalid": "Pick a valid date range",
"loadError": "Couldn't load stats for the selected dates. Please check the range and try again."
},
"topApps": "Top apps",
"topAppsSubtitle": "By opens in {{range}}",
"mostActiveUsers": "Most active users",
"mostActiveUsersSubtitle": "By app opens in {{range}}",
"leaderboardEmpty": "No activity yet",
"openCount": "{{count}} opens",
"viewAppDetails": "View details for {{name}}",
"viewUserDetails": "View details for {{name}}",
"drillIn": {
"loading": "Loading…",
"appTitle": "Recent opens · {{name}}",
"userTitle": "Recent opens · {{name}}",
"subtitle": "{{count}} opens in {{range}}",
"empty": "No opens in this range",
"loadError": "Couldn't load recent opens.",
"editApp": "Edit app",
"viewUser": "View user",
"loadMore": "Load more",
"loadMoreError": "Couldn't load more opens.",
"shownOf": "Showing {{shown}} of {{total}}"
}
},
"dependents": {
"openLabel": "View {{count}}",
"loadError": "Couldn't load items.",
"empty": "Nothing to show.",
"appGroups": {
"title": "Groups · {{name}}",
"subtitle": "{{count}} groups grant access"
},
"appRestrictions": {
"title": "Restrictions · {{name}}",
"subtitle": "{{count}} required permissions",
"noRoles": "No roles include this permission"
},
"appOpens": {
"title": "Opens · {{name}}",
"subtitle": "{{count}} total opens"
},
"serviceOrders": {
"title": "Orders · {{name}}",
"subtitle": "{{count}} orders"
},
"userNotes": {
"title": "Notes · {{name}}",
"subtitle": "{{count}} notes",
"untitled": "(untitled)",
"pinned": "Pinned",
"archived": "Archived"
},
"userOrders": {
"title": "Orders · {{name}}",
"subtitle": "{{count}} orders"
},
"orderStatus": {
"pending": "Pending",
"received": "Received",
"preparing": "Preparing",
"completed": "Completed",
"cancelled": "Cancelled"
}
}
},
"notFound": {
"title": "404 — Page Not Found",
"description": "The page you are looking for does not exist."
},
"common": {
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"add": "Add",
"close": "Close",
"later": "Later",
"loading": "Loading...",
"error": "An error occurred",
"success": "Success",
"language": "العربية",
"appName": "Tx OS",
"previous": "Previous",
"next": "Next",
"empty": "(empty)",
"back": "Back",
"confirmDelete": "Confirm delete"
},
"embeddedFrame": {
"title": "Embedded app",
"back": "Back to home",
"openInNewTab": "Open in a new tab",
"loadError": "Could not load the app.",
"notFound": "App not found.",
"notEmbeddable": "This app is not configured to be embedded."
},
"notes": {
"title": "Notes",
"searchPlaceholder": "Search notes",
"labels": "Labels",
"manageLabels": "Manage labels",
"newLabel": "New label",
"noLabelsYet": "No labels yet",
"allLabels": "All",
"folders": {
"title": "Folders",
"myFolders": "My folders",
"new": "New folder",
"namePlaceholder": "Folder name",
"all": "All notes",
"unfiled": "Unfiled",
"rename": "Rename folder",
"delete": "Delete folder",
"deleteTitle": "Delete this folder?",
"deleteAction": "Delete",
"deleteConfirm": "Delete this folder? Notes inside will move to Unfiled.",
"deleteFailed": "Could not delete folder",
"dragHint": "Drag a note here",
"moved": "Note moved",
"actions": "Folder actions",
"renameFailed": "Could not rename folder",
"itemCountOne": "1 folder",
"itemCount": "{{count}} folders",
"select": "Select folder",
"bulkSelected": "{{count}} selected",
"bulkDeleteTitle": "Delete selected folders?",
"bulkDeleteConfirm": "Notes inside these folders will move to Unfiled.",
"bulkDeleteFailed": "Some folders could not be deleted",
"backToFolders": "Back to folders",
"share": "Share folder",
"shareTitle": "Share folder",
"shareDescription": "Recipients can view but not edit notes in this folder.",
"shareDescriptionPerm": "Pick view or edit for each recipient.",
"permissionView": "View",
"permissionEdit": "Edit",
"canEdit": "You can edit",
"shareSaved": "Sharing updated",
"shareFailed": "Could not update sharing",
"shareRevoked": "This folder is no longer shared with you",
"sharedEmpty": "This folder has no notes yet",
"sharedWithMe": "Shared with me",
"sharedBy": "Shared by",
"sharedByName": "by {{name}}",
"sharedWithCount_one": "Shared with {{count}} person",
"sharedWithCount_other": "Shared with {{count}} people",
"sharedWithCount": "Shared with {{count}} people",
"readOnly": "Read-only"
},
"tabs": {
"active": "My Notes",
"archived": "Archived",
"received": "Inbox",
"sent": "Sent"
},
"pinned": "Pinned",
"others": "Others",
"viewGrid": "Grid view",
"viewList": "List view",
"select": "Select",
"untitled": "Untitled",
"untitledChecklist": "Checklist",
"itemCountOne": "1 item",
"itemCount": "{{count}} items",
"selectedCount": "{{count}} selected",
"deleteSelectedConfirm": "Delete the selected notes?",
"bulkSelect": "Select",
"bulkCancel": "Cancel",
"bulkSelectAll": "Select all",
"bulkClear": "Clear selection",
"bulkCount": "{{n}} selected",
"bulkDelete": "Delete",
"bulkConfirmTitle": "Delete {{n}} sent notes?",
"bulkConfirmTitle_one": "Delete 1 sent note?",
"bulkConfirmBody": "The notes and all their replies will be permanently deleted. This cannot be undone.",
"bulkDeleting": "Deleting...",
"bulkResultAll": "Deleted {{n}} notes",
"bulkResultAll_one": "Deleted 1 note",
"bulkResultPartial": "Deleted {{ok}} of {{total}}; {{failed}} failed",
"bulkResultNone": "Could not delete the selected notes",
"bulkArchive": "Archive",
"bulkArchiving": "Archiving...",
"bulkArchiveConfirmTitle": "Archive {{n}} inbox notes?",
"bulkArchiveConfirmTitle_one": "Archive 1 inbox note?",
"bulkArchiveConfirmBody": "These notes will be moved to your archive. You can find them later in the Archived tab.",
"bulkArchivedAll": "Archived {{n}} notes",
"bulkArchivedAll_one": "Archived 1 note",
"bulkArchivePartial": "Archived {{ok}} of {{total}}; {{failed}} failed",
"bulkArchiveNone": "Could not archive the selected notes",
"bulkDeleteInboxConfirmTitle": "Delete {{n}} inbox notes?",
"bulkDeleteInboxConfirmTitle_one": "Delete 1 inbox note?",
"bulkDeleteInboxConfirmBody": "This removes the notes from your inbox and archive. The sender keeps their copy.",
"bulkDeletedInboxAll": "Deleted {{n}} notes from your inbox",
"bulkDeletedInboxAll_one": "Deleted 1 note from your inbox",
"bulkDeleteInboxPartial": "Deleted {{ok}} of {{total}}; {{failed}} were already gone",
"bulkDeleteInboxNone": "Could not delete the selected notes",
"deleteInboxConfirmTitle": "Delete this note from your inbox?",
"deletedInboxOne": "Note removed from your inbox",
"moreActions": "More actions",
"empty": "Your notes will appear here",
"emptyArchived": "No archived notes",
"emptyReceived": "No notes have been sent to you yet",
"emptySent": "You haven't sent any notes yet",
"takeNote": "Take a note...",
"titlePlaceholder": "Title",
"contentPlaceholder": "Take a note...",
"save": "Save",
"pin": "Pin",
"archive": "Archive",
"unarchive": "Unarchive",
"delete": "Delete",
"deleteConfirm": "Delete this note?",
"deleteLabelConfirm": "Delete this label?",
"editTitle": "Edit note",
"send": "Send",
"sendNote": "Send note",
"sendNoteTo": "Send to…",
"recipientsPlaceholder": "Search people…",
"selectAtLeastOne": "Select at least one recipient",
"sendSuccess": "Note sent",
"sendFailed": "Could not send note",
"from": "From:",
"to": "To:",
"reply": "Reply",
"replyPlaceholder": "Write a reply…",
"sendReply": "Send reply",
"replies": "Replies",
"noRepliesYet": "No replies yet",
"status": {
"unread": "Unread",
"read": "Read",
"replied": "Replied",
"archived": "Archived"
},
"recipientsCount_one": "{{count}} recipient",
"recipientsCount_other": "{{count}} recipients",
"repliesCount_one": "{{count}} reply",
"repliesCount_other": "{{count}} replies",
"openThread": "Open",
"toast": {
"received": {
"title": "New note received",
"desc": "Check your Notes inbox to read it."
},
"replied": {
"title": "New reply on a note",
"desc": "Open the note to continue the conversation."
}
},
"popup": {
"heading": "New note from {{name}}",
"headingNoSender": "You received a new note",
"replyHeading": "{{name}} replied to your note",
"replyHeadingNoSender": "New reply to your note",
"untitled": "(no title)",
"queueMore_one": "{{count}} more note waiting",
"queueMore_other": "{{count}} more notes waiting",
"reply": "Reply",
"replyBack": "Reply",
"markRead": "Done",
"openInNotes": "Open note",
"openThread": "Open note",
"openNote": "Open note",
"done": "Done",
"dismiss": "Dismiss",
"dragHint": "Drag to move",
"inlineReplyPlaceholder": "Write a reply…",
"sendReply": "Send",
"cancelReply": "Cancel",
"replySending": "Sending…",
"replySent": "Reply sent",
"replyFailed": "Could not send reply"
},
"confirmSendTitle": "Send this note?",
"confirmSendBody_one": "This note will be sent to {{count}} person.",
"confirmSendBody_other": "This note will be sent to {{count}} people.",
"confirmSendCta": "Send",
"archivedSection": {
"myNotes": "My archived notes",
"inbox": "Archived inbox"
},
"conversationWith": "Conversation with {{name}}",
"ownerReplies": "Your replies",
"noConversationsYet": "No conversations yet",
"checklist": {
"toggle": "To-do list",
"addItem": "Add item",
"itemPlaceholder": "List item",
"emptyHint": "No items yet — add one below.",
"removeItem": "Remove item",
"progress": "{{done}} / {{total}}"
}
},
"executiveMeetings": {
"title": "Meetings list",
"scheduleHeading": "Meeting Attendance List",
"date": "Date:",
"exportPdf": "Export PDF",
"fullscreen": {
"enter": "Enter fullscreen",
"exit": "Exit fullscreen"
},
"quickNote": {
"label": "Note",
"placeholder": "Write a quick note…",
"send": "Send"
},
"noMeetings": "No meetings scheduled for this day",
"virtual": "Virtual",
"virtualAttendance": "Virtual Attendance",
"internalAttendance": "Internal Attendance",
"externalAttendance": "External Attendance",
"placeholderBody": "This section is under development and will be available in upcoming phases.",
"col": {
"number": "#",
"meeting": "Meeting",
"attendees": "Attendees",
"time": "Time"
},
"customize": {
"title": "Customize table",
"hint": "Show or hide columns. Drag column headers to reorder.",
"reset": "Reset",
"dragHint": "Drag a column edge to resize it"
},
"highlight": {
"title": "Highlight current meeting",
"hint": "",
"reset": "Reset to default"
},
"dragRow": "Drag to reorder",
"editMeetingTitle": "Edit meeting title",
"rowColor": {
"label": "Row color"
},
"rowActions": {
"label": "Row actions",
"back": "Back"
},
"quickActions": {
"label": "Quick actions",
"moveUp": "Move up",
"moveDown": "Move down",
"postpone": "Postpone",
"edit": "Edit"
},
"merge": {
"label": "Merge cells",
"editLabel": "Edit merged cell",
"placeholder": "Click to add text",
"meetingAttendees": "Merge meeting + attendees",
"meetingTime": "Merge meeting + attendees + time",
"all": "Merge entire row",
"unmerge": "Unmerge",
"activeBadge": "Merged: {{cols}}"
},
"alertPrefs": {
"title": "Upcoming meeting alert",
"hint": "",
"enabledLabel": "Show upcoming meeting alert",
"colorTitle": "Color theme",
"reset": "Reset to default",
"preset": {
"amber": "Amber (default)",
"blue": "Blue",
"green": "Green",
"slate": "Slate",
"rose": "Rose"
}
},
"alert": {
"title": "Meeting starting soon",
"minutesAway_one": "Starts in {{count}} min",
"minutesAway_other": "Starts in {{count}} min",
"startsNow": "Starting now",
"atTime": "at {{time}}",
"done": "Done",
"postpone": "Postpone",
"externalCannotPostpone": "External meetings can't be auto-postponed.",
"dismiss": "Dismiss alert",
"dragHandle": "Drag to move",
"dismissToast": "Alert dismissed",
"openMeetings": "Open meetings",
"details": "Details",
"detailsClose": "Hide details",
"detailsUrl": "Meeting link",
"detailsTime": "Time",
"detailsLocation": "Location",
"detailsAttendees": "Attendees ({{n}})",
"detailsNoAttendees": "No attendees yet.",
"detailsGroup": {
"internal": "Internal",
"external": "External",
"virtual": "Virtual"
},
"postponeTitle": "Postpone meeting",
"postponeIntro": "“{{title}}”",
"tabPostpone": "Postpone",
"tabReschedule": "Reschedule",
"tabCancel": "Cancel",
"postponeMinutesPlaceholder": "min",
"postponeMinutesApply": "Postpone {{count}} min",
"postponeConfirmPrompt": "Postpone meeting by {{count}} min?",
"postponeConfirmYes": "Yes, postpone {{count}} min",
"rescheduleHint": "Move the meeting to a new date or time window.",
"rescheduleDate": "Date",
"rescheduleStart": "Start",
"rescheduleEnd": "End",
"rescheduleNote": "Note (optional)",
"rescheduleApply": "Reschedule",
"cancelApply": "Cancel meeting",
"cancelConfirmPrompt": "Are you sure? The meeting will be marked as cancelled.",
"cancelConfirmYes": "Yes, cancel",
"back": "Back",
"saved": "Saved",
"saveFailed": "Could not save changes",
"conflictWarning": "Heads up: the new time overlaps another meeting on the same day.",
"noTimeWindow": "This meeting has no scheduled time, so it cant be postponed by minutes.",
"staleMeetingTitle": "This meeting was just changed by another user.",
"staleMeetingByUser": "{{name}} just changed this meeting.",
"staleMeetingCurrentTime": "Current time: {{start}} {{end}}.",
"staleMeetingApplyAnyway_one": "Add {{count}} more minute anyway",
"staleMeetingApplyAnyway_other": "Add {{count}} more minutes anyway",
"cascadeLoading": "Checking later meetings…",
"cascadeMinutesUnit_one": "{{count}} minute",
"cascadeMinutesUnit_other": "{{count}} minutes",
"cascadePromptHeader_one": "{{count}} later meeting on this day would be affected. Also shift it by {{minutesText}}?",
"cascadePromptHeader_other": "{{count}} later meetings on this day would be affected. Also shift them by {{minutesText}}?",
"cascadeListTitle": "Affected meetings:",
"cascadeColMeetingNumber": "Meeting #",
"cascadeColTitle": "Title",
"cascadeColTimes": "From → To",
"_cascadeListItemNote": "#480: cascadeListItem is no longer rendered (the affected-meetings list is now a table); kept to avoid churn for downstream tooling that may reference the key.",
"cascadeListItem": "{{title}} — {{oldStart}} → {{newStart}}",
"cascadeShift_one": "Shift {{count}} following meeting",
"cascadeShift_other": "Shift {{count}} following meetings",
"cascadeKeep": "Keep their times",
"cascadeMidnightError": "Cant shift the day: \"{{title}}\" would land at {{projectedStart}}, past midnight.",
"cascadeAuditDescription": "Auto-shifted by {{minutes}} minutes after meeting #{{triggerMeetingId}} was postponed."
},
"timeEditor": {
"am": "AM",
"pm": "PM",
"periodGroupStart": "AM or PM for the start time",
"periodGroupEnd": "AM or PM for the end time"
},
"schedule": {
"addRow": "Add meeting",
"newMeetingDefaultAr": "اجتماع جديد",
"newMeetingDefaultEn": "New meeting",
"timeStart": "Start time",
"timeEnd": "End time",
"timeStartShort": "Start",
"timeEndShort": "End",
"timeOrderError": "End time is before start time",
"timeParseError": "Time format isn't valid. Try 09:30 or 9:30 PM",
"timeAmbiguousError": "Pick AM or PM for the time",
"addAttendee": "Add attendee",
"addSubheading": "+ subheading",
"addVirtualAttendee": "+ Virtual",
"addInternalAttendee": "+ Internal",
"addExternalAttendee": "+ External",
"newAttendeeAria": "New attendee name",
"editAttendeeAria": "Edit attendee name",
"newSubheadingAria": "New subheading label",
"editSubheadingAria": "Edit subheading label",
"deleteRow": "Delete meeting",
"deleteRowConfirm": "Delete this meeting?\n\n\"{{title}}\"\n\nThis cannot be undone.",
"deleted": "Meeting deleted",
"editToggle": "Edit",
"editToggleAria": "Toggle edit mode",
"editToggleOn": "Edit mode on",
"editToggleOff": "Edit mode off",
"saveToggle": "Save",
"saveToggleAria": "Finish editing and save changes",
"saveToggleOn": "Edit mode on — click to save and exit",
"saveToggleOff": "Edit mode off — click to start editing",
"bulkSelectRow": "Select meeting",
"bulkSelectAll": "Select all",
"bulkSelectionCount": "Selected: {{n}} of {{total}}",
"bulkClearSelection": "Clear selection",
"bulkDeleteSelected": "Delete selected",
"bulkDeleteConfirm": "Delete {{n}} meetings?",
"bulkDeleteResultAll": "Deleted {{n}} meetings",
"bulkDeletePartial": "Deleted {{ok}} of {{total}} meetings; {{failed}} failed",
"bulkDeleteResultNone": "Failed to delete the selected meetings",
"bulkDeleteUndo": "Undo",
"bulkDeleteUndone": "Restored {{n}} meetings",
"bulkDeleteUndoPartial": "Restored {{ok}} of {{total}} meetings",
"bulkDeleteUndoFailed": "Could not restore meetings",
"bulkDeleteProgress": "Deleting... {{current}} of {{total}} ({{percent}}%)",
"searchPlaceholder": "Search a meeting…",
"searchAria": "Search today's meetings",
"searchClear": "Clear search",
"searchNoMatches": "No meetings match your search.",
"bulkDuplicateSelected": "Duplicate to date…",
"bulkDuplicateTitle": "Duplicate {{n}} meetings to date",
"bulkDuplicateConfirm": "Duplicate",
"bulkDuplicating": "Duplicating…",
"bulkDuplicateProgress": "Duplicating... {{current}} of {{total}} ({{percent}}%)",
"bulkDuplicateResultAll": "Duplicated {{n}} meetings",
"bulkDuplicatePartial": "Duplicated {{ok}} of {{total}}, {{failed}} failed",
"bulkDuplicateNone": "Could not duplicate the selected meetings"
},
"nav": {
"schedule": "Daily Schedule",
"manage": "Manage Meetings",
"notifications": "Notifications",
"audit": "Audit Log",
"pdf": "PDF Export",
"settings": "Settings"
},
"common": {
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"add": "Add",
"submit": "Submit",
"close": "Close",
"loading": "Loading...",
"saved": "Saved",
"saveFailed": "Save failed",
"actions": "Actions",
"noPermission": "You do not have permission for this action",
"yes": "Yes",
"no": "No",
"all": "All",
"filter": "Filter",
"confirm": "Confirm",
"confirmTitle": "Confirm"
},
"manage": {
"heading": "Manage Meetings",
"addMeeting": "Add meeting",
"editMeeting": "Edit meeting",
"deleteMeeting": "Delete meeting",
"deleteConfirm": "Permanently delete this meeting?",
"noMeetings": "No meetings on this day. Click \"Add meeting\" to create one.",
"field": {
"titleAr": "Title",
"titleEn": "Title (English)",
"meetingDate": "Date",
"dailyNumber": "Daily number",
"dailyNumberHint": "Leave blank for auto-numbering",
"startTime": "Start time",
"endTime": "End time",
"location": "Location",
"meetingUrl": "Meeting URL",
"platform": "Platform",
"status": "Status",
"isHighlighted": "Highlight (red)",
"notes": "Notes",
"isExternal": "External meeting",
"isExternalHint": "Row turns red automatically and is excluded from auto-postpone.",
"isExternalOn": "Yes",
"isExternalOff": "No"
},
"attendees": {
"label": "Attendees",
"name": "Name",
"title": "Title",
"id": "Attendee ID",
"type": "Attendance type",
"add": "Add member",
"addSubheading": "Add subheading",
"subheadingName": "Subheading label",
"subheadingBadge": "Subheading",
"remove": "Remove",
"moveUp": "Move up",
"moveDown": "Move down",
"dragHandle": "Drag to reorder",
"removeAll": "Remove all attendees",
"removeAllConfirm": "Remove all {{count}} attendees?\n\nThe change applies when you save the meeting."
},
"duplicate": "Duplicate",
"duplicateToDate": "Duplicate to date",
"duplicated": "Meeting duplicated",
"duplicateFailed": "Could not duplicate the meeting",
"platform": {
"none": "None",
"webex": "Webex",
"teams": "Teams",
"zoom": "Zoom",
"other": "Other"
},
"attendanceType": {
"internal": "Internal",
"virtual": "Virtual",
"external": "External"
},
"status": {
"scheduled": "Scheduled",
"cancelled": "Cancelled",
"completed": "Completed",
"postponed": "Postponed"
},
"errors": {
"titleRequired": "Arabic title is required",
"dateRequired": "Date is required",
"duplicateNumber": "That daily number already exists for this date",
"saveFailed": "Could not save the meeting",
"endTimeBeforeStart": "End time must be after start time"
}
},
"audit": {
"heading": "Audit Log",
"empty": "No audit entries.",
"filterDate": "Filter by date",
"filterEntity": "Entity",
"filter": {
"from": "From",
"to": "To",
"actorId": "Actor ID",
"actorPlaceholder": "All users",
"actorSearch": "Search by name...",
"actorEmpty": "No matches"
},
"pageInfo": "Showing",
"all": "All",
"col": {
"when": "When",
"actor": "User",
"action": "Action",
"entity": "Entity",
"entityId": "ID",
"diff": "Details",
"changes": "Changes"
},
"created": "Created",
"removed": "Removed",
"moreChanges": "more changes",
"field": {
"titleAr": "Title (Arabic)",
"titleEn": "Title (English)",
"meetingDate": "Date",
"dailyNumber": "Daily number",
"startTime": "Start time",
"endTime": "End time",
"location": "Location",
"meetingUrl": "Meeting URL",
"platform": "Platform",
"status": "Status",
"isHighlighted": "Highlighted",
"notes": "Notes",
"assignedTo": "Assigned to",
"taskType": "Task type",
"dueAt": "Due at",
"reviewDecision": "Review decision",
"reviewNotes": "Review notes"
},
"entity": {
"meeting": "Meeting",
"attendee": "Attendee",
"request": "Request",
"task": "Task",
"font_settings": "Font settings",
"pdf_archive": "PDF archive"
},
"action": {
"create": "Create",
"update": "Update",
"delete": "Delete",
"approve": "Approve",
"approved": "Approved",
"reject": "Reject",
"rejected": "Rejected",
"needs_edit": "Needs edit",
"withdraw": "Withdrawn",
"submit": "Submit",
"apply": "Apply",
"duplicate": "Duplicate",
"replace_attendees": "Update attendees",
"done": "Done",
"meeting_cascade_shift": "Auto-shifted by cascade"
}
},
"pdf": {
"heading": "PDF Export",
"intro": "",
"downloadPdf": "Download PDF",
"downloadHint": "",
"downloaded": "PDF download started",
"selectDate": "Schedule date",
"archivesHeading": "Archived PDFs",
"noArchives": "No PDFs archived for this date yet.",
"downloadArchive": "Download",
"legacyArchive": "Legacy snapshot",
"title": "Meeting Attendance List",
"no": "#",
"meeting": "Meeting",
"attendees": "Attendees",
"time": "Time",
"none": "No meetings on this day.",
"recordedBy": "Recorded by"
},
"fontSettingsPage": {
"heading": "Font Settings",
"intro": "",
"scope": "Scope",
"scopeUser": "My preference",
"scopeGlobal": "Global (everyone)",
"fontFamily": "Font family",
"fontSize": "Font size",
"fontWeight": "Weight",
"alignment": "Alignment",
"fontColor": "Font color",
"logo": {
"label": "Organization logo (appears at the top of the PDF)",
"upload": "Upload logo",
"replace": "Replace logo",
"remove": "Remove logo",
"uploading": "Uploading...",
"uploadFailed": "Logo upload failed",
"globalOnly": "The logo is saved for the whole organization."
},
"weight": {
"regular": "Regular",
"medium": "Medium",
"semibold": "Semibold",
"bold": "Bold"
},
"align": {
"start": "Start",
"center": "Center",
"end": "End"
},
"preview": "Preview",
"previewText": "Sample text 123 نص تجريبي ١٢٣",
"save": "Save settings",
"saved": "Saved",
"reset": "Reset to default"
}
},
"protocol": {
"title": "Public Relations & Protocol",
"notes": "Notes",
"statusLabel": "Status",
"confirmReject": "Are you sure you want to reject this request?",
"confirmDelete": "This action cannot be undone.",
"tabs": {
"dashboard": "Dashboard",
"bookings": "Room Bookings",
"external": "External Meetings",
"gifts": "Dedications",
"issues": "Issuance Requests",
"photos": "Photos",
"reports": "Reports",
"audit": "Activity Log",
"rooms": "Rooms"
},
"status": {
"pending": "Pending",
"approved": "Approved",
"rejected": "Rejected",
"cancelled": "Cancelled",
"issued": "Issued",
"scheduled": "Scheduled",
"completed": "Completed"
},
"giftKind": {
"gift": "Gift",
"shield": "Shield"
},
"actions": {
"approve": "Approve",
"reject": "Reject",
"cancel": "Cancel",
"approveIssue": "Approve & issue"
},
"errors": {
"generic": "The operation could not be completed."
},
"dashboard": {
"activeRooms": "Active rooms",
"todayBookings": "Today's bookings",
"pendingBookings": "Bookings awaiting approval",
"upcomingExternal": "Upcoming external meetings",
"giftStock": "Total gift stock",
"pendingIssues": "Pending issuance requests",
"roomsAvailableNow": "Rooms available now",
"giftsIssuedThisMonth": "Gifts issued this month"
},
"bookings": {
"new": "New booking",
"edit": "Edit booking",
"empty": "No bookings yet.",
"requester": "Requester",
"org": "Organization",
"phone": "Phone",
"attendeeCount": "Attendees",
"publicRequest": "Public request",
"roomLabel": "Room",
"titleLabel": "Booking title",
"startsAt": "From",
"endsAt": "To",
"viewList": "List",
"viewCalendar": "Calendar",
"shareLinkTitle": "Public booking link (share with guests)",
"copyLink": "Copy link",
"linkCopied": "Link copied",
"linkCopyFailed": "Could not copy the link"
},
"external": {
"new": "New meeting",
"edit": "Edit meeting",
"empty": "No external meetings yet.",
"titleLabel": "Meeting title",
"party": "Party",
"location": "Location",
"startsAt": "Date & time"
},
"gifts": {
"new": "New item",
"edit": "Edit item",
"empty": "No items yet.",
"stock": "Stock",
"nameAr": "Name (Arabic)",
"nameEn": "Name (English)",
"kind": "Kind"
},
"rooms": {
"new": "New room",
"edit": "Edit room",
"title": "Rooms",
"inactive": "inactive",
"nameAr": "Name (Arabic)",
"nameEn": "Name (English)",
"capacity": "Capacity",
"location": "Location",
"active": "Active",
"isActive": "Active",
"empty": "No rooms."
},
"issues": {
"new": "Issuance request",
"empty": "No issuance requests yet.",
"recipient": "Recipient",
"gift": "Item",
"occasion": "Occasion",
"quantity": "Quantity"
},
"photos": {
"newAlbum": "New album",
"editAlbum": "Edit album",
"albumName": "Album name",
"linkMeeting": "Link to external meeting",
"noMeeting": "No link",
"addPhotos": "Add photos",
"download": "Download",
"downloadAll": "Download all",
"uploading": "Uploading",
"emptyAlbums": "No albums yet.",
"emptyPhotos": "No photos in this album.",
"confirmDeleteAlbum": "This deletes the album and all its photos. This cannot be undone.",
"confirmDeletePhoto": "This photo will be deleted. This cannot be undone."
},
"reports": {
"byRoom": "Bookings by room",
"byGift": "Issuance by item",
"room": "Room",
"gift": "Item",
"total": "Total",
"requests": "Requests",
"issued": "Issued",
"issuedQty": "Issued qty",
"empty": "No data.",
"byExternal": "External meetings by status"
},
"audit": {
"empty": "No activity yet."
}
}
}