56c8bcfb85
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.
1675 lines
63 KiB
JSON
1675 lines
63 KiB
JSON
{
|
||
"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 can’t 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": "Can’t 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."
|
||
}
|
||
}
|
||
}
|