Files
dyolink/frontend/messages/en.json

1037 lines
52 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.
{
"common": {
"appName": "DyoLink",
"loading": "Loading...",
"loadingApp": "Loading app...",
"loadingWorkspace": "Loading workspace...",
"continue": "Continue",
"back": "Back",
"save": "Save",
"cancel": "Cancel",
"delete": "Delete",
"edit": "Edit",
"next": "Next",
"dismiss": "Dismiss",
"or": "Or",
"and": "and",
"close": "Close",
"redirecting": "Redirecting…",
"readOnlyAccess": "Read-only access for this organization.",
"errorGeneric": "Something went wrong",
"loadingEllipsis": "Loading...",
"search": "Search",
"action": "Action",
"status": "Status",
"name": "Name",
"email": "Email",
"date": "Date",
"organization": "Organization",
"backToApp": "← Back to app",
"copied": "Copied",
"copyLink": "Copy link",
"none": "None",
"preview": "Preview",
"openMenu": "Open menu",
"closeMenu": "Close menu"
},
"language": {
"label": "Language",
"selectLanguage": "Select language",
"en": "English",
"fa": "Persian",
"nl": "Dutch"
},
"theme": {
"switchToLight": "Switch to light mode",
"switchToDark": "Switch to dark mode",
"lightMode": "Light mode",
"darkMode": "Dark mode"
},
"nav": {
"dashboard": "Dashboard",
"staff": "Staff",
"patients": "Patients",
"appointment": "Appointment",
"treatment": "Treatment",
"cases": "Cases",
"tasks": "Tasks",
"billing": "Billing",
"reports": "Reports",
"clinics": "Clinics",
"labs": "Labs"
},
"auth": {
"login": "Login",
"signIn": "Sign in",
"signOut": "Log out",
"register": "Register",
"startTrial": "Start Trial",
"startTrialShort": "Try free",
"startFreeTrial": "Start Free Trial",
"dashboard": "Dashboard",
"signInTitle": "Sign in to your account",
"signInPrompt": "Or {link}",
"startTrialLink": "start your free trial",
"registerTitle": "Start your 30-day free trial",
"registerPrompt": "Already have an account?",
"signInLink": "Sign in",
"email": "Email address",
"password": "Password",
"confirmPassword": "Confirm password",
"fullName": "Full name",
"rememberMe": "Remember me",
"showPassword": "Show password",
"hidePassword": "Hide password",
"forgotPassword": "Forgot your password?",
"invalidCredentials": "Invalid email or password",
"loginFailed": "Login failed",
"registrationFailed": "Registration failed. Please try again.",
"startMyFreeTrial": "Start my free trial",
"trialIncludes": "Your trial includes:",
"trialTeamMembers": "Up to 5 team members",
"trialFullAccess": "Full access to all features",
"trialNoCard": "30 days free, no credit card required",
"termsAgreement": "By signing up, you agree to our {terms} and {privacy}",
"termsOfService": "Terms of Service",
"privacyPolicy": "Privacy Policy",
"signedIn": "Signed in",
"switchOrganization": "Switch organization",
"subscriptions": "Subscriptions",
"account": "Account",
"emailPlaceholder": "you@example.com",
"passwordPlaceholder": "••••••••",
"namePlaceholder": "John Doe",
"termsIntro": "By signing up, you agree to our",
"errorRegistrationFailed": "Registration failed",
"errorLoginFailed": "Login failed",
"errorCreateOrganization": "Failed to create organization",
"acceptInviteTitle": "Accept invitation",
"loadingInvitation": "Loading invitation...",
"invalidInvitationLink": "Invalid invitation link",
"invitationAlreadyAccepted": "This invitation is already accepted. You can log in now.",
"errorLoadInvitation": "Could not load invitation",
"organizationLabel": "Organization:",
"emailLabel": "Email:",
"nameRequired": "Name is required",
"passwordMinLength8": "Password must be at least 8 characters",
"passwordsDoNotMatch": "Passwords do not match",
"labelName": "Name",
"labelCreatePassword": "Create password",
"labelConfirmPassword": "Confirm password",
"activateAccount": "Activate account",
"invitationAcceptedRedirect": "Invitation Accepted. Redirecting to login...",
"errorAcceptInvitation": "Could not accept invitation",
"alreadyHaveAccess": "Already have access?",
"goToLogin": "Go to login",
"acceptOrganizationTitle": "Accept organization invitation",
"alreadyHaveAccount": "Already have an account?",
"invitedBy": "Invited by:",
"ownerEmail": "Owner email",
"activateOrganization": "Activate organization",
"organizationAcceptedRedirect": "Invitation accepted. Redirecting to login...",
"stepAccount": "Account",
"stepOrganization": "Organization",
"organizationName": "Organization name",
"organizationNamePlaceholder": "Sunshine Dental Clinic",
"organizationEmail": "Organization email",
"organizationEmailPlaceholder": "contact@sunshineclinic.com",
"organizationType": "Organization type",
"dentalClinic": "Dental Clinic",
"dentalLab": "Dental Lab",
"mobile": "Mobile number",
"mobilePlaceholder": "0912 345 6789",
"forgotPasswordTitle": "Reset your password",
"forgotPasswordSubtitle": "Enter the mobile number on your account. We will send a verification code.",
"codeSentHint": "Enter the verification code we sent to your mobile.",
"sendCode": "Send verification code",
"verificationCode": "Verification code",
"verificationCodePlaceholder": "12345",
"verifyAndContinue": "Verify and continue",
"backToSignIn": "Back to sign in",
"codeSendFailed": "Could not send verification code. Please try again.",
"verifyFailed": "Invalid or expired verification code."
},
"landing": {
"heroTitle": "Connect Dental Clinics & Labs",
"heroHighlight": "Seamlessly",
"heroSubtitle": "Streamline communication between dental professionals. Start with a 30-day free trial, no credit card required.",
"featureClinicsTitle": "For Clinics",
"featureClinicsDescription": "Manage patients, appointments, and send cases to labs instantly.",
"featureLabsTitle": "For Labs",
"featureLabsDescription": "Receive cases, track progress, and communicate with clinics.",
"featureTeamTitle": "Team Management",
"featureTeamDescription": "Add up to 5 team members during trial. Scale as you grow.",
"featureTrialTitle": "30-Day Trial",
"featureTrialDescription": "Full access to all features. No credit card required.",
"featureRealtimeTitle": "Real-time Updates",
"featureRealtimeDescription": "Get instant notifications on case status changes.",
"featureSecurityTitle": "Secure & Compliant",
"featureSecurityDescription": "HIPAA-compliant with enterprise-grade security.",
"footerCopyright": "© 2026 DyoLink. All rights reserved.",
"termsAndConditions": "Terms & Conditions"
},
"accountMenu": {
"noActiveSubscription": "No active subscription — review Subscriptions",
"trialEnded": "Trial ended — review Subscriptions",
"trialEndingSoon": "Trial ending soon — review Subscriptions",
"seatsLow": "Seats running low — review Subscriptions",
"reviewSubscriptions": "Review Subscriptions"
},
"validation": {
"emailInvalid": "Please enter a valid email address",
"passwordRequired": "Password is required",
"nameMinLength": "Name must be at least 2 characters",
"passwordMinLength": "Password must be at least 8 characters",
"passwordUppercase": "Password must contain at least one uppercase letter",
"passwordNumber": "Password must contain at least one number",
"organizationNameMinLength": "Organization name must be at least 2 characters",
"organizationEmailInvalid": "Please enter a valid organization email",
"organizationTypeRequired": "Please select organization type",
"passwordsDoNotMatch": "Passwords don't match",
"mobileRequired": "Mobile number is required",
"mobileInvalid": "Please enter a valid Iranian mobile number",
"codeRequired": "Verification code is required"
},
"today": {
"welcomeBack": "Welcome back!!",
"noSubscriptionNotice": "This organization does not have an active subscription yet.",
"choosePlanLink": "Choose a plan",
"noSubscriptionCta": "to start the purchase process.",
"noWidgets": "No dashboard metrics are available for your current permissions.",
"loadError": "Could not load dashboard metrics.",
"seatsUnlimited": "Unlimited plan",
"widgetAppointmentsToday": "Today's Appointments",
"widgetPatientsToday": "Patients Today",
"widgetTreatmentsToday": "Treatments Today",
"widgetDraftTreatments": "Draft Treatments",
"widgetLabCasesPendingSend": "Lab Cases Pending Send",
"widgetCasesReceivedToday": "Cases Received Today",
"widgetCasesInProgress": "Cases In Progress",
"widgetTasksInProgress": "Tasks In Progress",
"widgetImportantTasks": "Important Tasks",
"widgetOverdueCases": "Overdue Cases",
"widgetUnassignedTasks": "Unassigned Tasks",
"widgetPendingConnections": "Pending Connections",
"widgetProvidersWithoutWorkingHours": "Providers Without Working Hours",
"widgetPendingStaffInvites": "Pending Staff Invites",
"widgetSubscription": "Subscription",
"subscriptionSeatsLabel": "Seats used",
"subscriptionSeatsRemainingLabel": "Seats left",
"subscriptionSeatsPercent": "{percent}%",
"subscriptionSeatsUnlimitedShort": "Unlimited",
"subscriptionPeriodLabel": "Plan period",
"subscriptionPeriodRemainingLabel": "Days left",
"subscriptionPeriodPercent": "{percent}%",
"subscriptionPeriodDays": "{elapsed}/{total} days",
"subscriptionNoPlan": "No active plan",
"chartAppointmentsWeekAllTitle": "Appointments This Week",
"chartAppointmentsWeekAllSubtitle": "All providers — last 7 days",
"chartAppointmentsWeekMineTitle": "My Appointments This Week",
"chartAppointmentsWeekMineSubtitle": "Your schedule — last 7 days",
"chartLabTaskActivityTitle": "Lab Task Activity",
"chartLabTaskActivitySubtitle": "Last 7 days",
"chartLabTaskCompletedLegend": "Completed",
"chartLabTaskReceivedLegend": "Received",
"chartAppointmentsByProviderTitle": "Appointments by Provider",
"chartAppointmentsByProviderSubtitle": "Today",
"chartTreatmentMixTitle": "Treatment Mix",
"chartTreatmentMixSubtitle": "Last 7 days",
"chartCaseCompletionTitle": "Case Completion",
"chartCaseCompletionSubtitle": "All active cases",
"chartCaseCompletionPercent": "{percent}%",
"chartCaseCompletionTasks": "Tasks completed",
"chartTreatmentPlanCompletionTitle": "Treatment Plan Completion",
"chartTreatmentPlanCompletionSubtitle": "All appointments",
"chartTreatmentPlanCompletionRatio": "With treatment plan",
"chartTasksByProsthesisTitle": "In-Progress Tasks by Prosthesis",
"chartTasksByProsthesisSubtitle": "Current workload mix",
"chartCasesDueWeekTitle": "Cases Due This Week",
"chartCasesDueWeekSubtitle": "Active cases with a due date in the next 7 days",
"chartCasePartnersClinicTitle": "Cases by Lab",
"chartCasePartnersLabTitle": "Cases by Clinic",
"chartCasePartnersSubtitle": "Last 30 days",
"chartCasePartnersSentLegend": "Sent",
"chartCasePartnersOpenLegend": "In progress",
"chartEfficiencyReportTitle": "Efficiency Report",
"chartEfficiencyReportSubtitleClinic": "Treatments created by staff — last 30 days",
"chartEfficiencyReportSubtitleLab": "Tasks completed by staff — last 30 days",
"chartEmpty": "No data for this period yet.",
"upcomingAppointmentsTitle": "Upcoming Today",
"upcomingAppointmentsSubtitle": "Appointments not yet finished",
"viewAllAppointments": "View schedule",
"noUpcomingAppointments": "No upcoming appointments for the rest of today.",
"retryLoad": "Try again",
"sectionLoadError": "This section could not be displayed.",
"lastUpdated": "Updated at {time}"
},
"staff": {
"redirecting": "Redirecting…",
"title": "Staff Management",
"subtitle": "Invite teammates, set tab access, and stay within your plan seat limit.",
"inviteMember": "Invite member",
"seatsLabel": "Seats:",
"unlimitedPlan": "(unlimited plan)",
"seatLimitReached": "Plan seat limit reached for this organization.",
"noActivePlan": "No active plan selected for this organization. Choose a subscription plan to invite members.",
"invitedPending": "Invitation is pending until they open the link, set a password, and log in.",
"invitedAccepted": "Invitation was accepted immediately.",
"inviteLinkHeading": "Invite link",
"shareLinkHint": "Share this link manually via SMS or email. A new link is generated if the previous one expired or was lost.",
"loadingTeam": "Loading team…",
"tableName": "Name",
"tableEmail": "Email",
"tableRole": "Role",
"tableStatus": "Status",
"tableAccess": "Access",
"tableAction": "Action",
"roleOwner": "Owner",
"roleStaff": "Staff",
"statusActive": "Active",
"statusPending": "Pending",
"statusDisabled": "Disabled",
"statusExpired": "Expired",
"allFeatures": "All features",
"inviteModalTitle": "Invite team member",
"stepOf": "Step {step} of 2",
"permissionView": "View",
"permissionEdit": "Edit",
"labelEmail": "Email",
"labelDisplayName": "Display name",
"tabAccess": "Tab access",
"sendInvite": "Send invite",
"skipForNow": "Skip for now",
"enableModalTitle": "Enable team member",
"enableConfirm": "Enable {name} ({email})?",
"enableBullet1": "They can sign in to this organization again with their existing account.",
"enableBullet2": "No new invitation is sent and no data was removed while they were disabled.",
"enableBullet3": "Enabling uses one seat on your plan.",
"noSeatsAvailable": "No seats are available. Disable another member or upgrade your plan before enabling this person.",
"enableMemberButton": "Enable member",
"disableModalTitle": "Disable team member",
"disableConfirm": "Disable {name} ({email})?",
"disableBullet1": "They will not be able to sign in to this organization.",
"disableBullet2": "No data will be removed.",
"disableBullet3": "Disabling frees one seat on your plan so you can invite someone else.",
"disableMemberButton": "Disable member",
"editModalTitle": "Edit member",
"loadingWorkingHours": "Loading working hours…",
"errorLoadStaff": "Failed to load staff.",
"errorCopyInvite": "Could not copy invitation link.",
"errorSendInvite": "Failed to send invitation.",
"errorLoadWorkingHours": "Failed to load working hours.",
"successMemberUpdated": "Member updated.",
"errorUpdateMember": "Failed to update member.",
"errorDeleteNotImplemented": "Delete is not implemented yet.",
"successMemberDisabled": "{name} was disabled. A seat is now available.",
"errorDisableMember": "Failed to disable member.",
"successMemberEnabled": "{name} was enabled and can sign in again.",
"errorEnableMember": "Failed to enable member.",
"successInvited": "{name} ({email}) was invited.",
"copyInviteLink": "Copy invitation link",
"copyInviteLinkTitle": "Copy invitation link (generates a new link if needed)",
"enableMemberAria": "Enable member",
"enableMemberTitle": "Enable member (uses a seat)",
"disableMemberAria": "Disable member",
"disableMemberTitle": "Disable member (frees a seat)",
"editMemberAria": "Edit member",
"deleteMemberAria": "Delete member",
"deleteMemberTitle": "Delete member (not implemented)",
"features": {
"featureToday": "Today",
"featureStaff": "Staff",
"featureOrganizations": "Organizations",
"featureClinics": "Clinics",
"featureLabs": "Labs",
"featurePatients": "Patients",
"featureAppointment": "Appointment",
"featureTreatment": "Treatment",
"featureCases": "Cases",
"featureTasks": "Tasks",
"featureBilling": "Billing",
"featureReports": "Reports",
"noTabAccess": "No tab access",
"readOnlySuffix": "(Read only)"
},
"workingHours": {
"recommendedTitle": "Working hours recommended",
"recommendedBody": "Staff with treatment edit access appear as provider columns in Appointments. Set their weekly hours so the schedule grid shows the right bookable times.",
"intro": "Set weekly working hours for this provider. The appointments grid uses these hours to show bookable time slots.",
"workingDay": "Working day",
"start": "Start",
"end": "End",
"removeShift": "Remove shift",
"addShift": "Add shift",
"autoRepeatWeekly": "Repeat these hours at the start of each week (copy forward on Monday)",
"weekdayMon": "Mon",
"weekdayTue": "Tue",
"weekdayWed": "Wed",
"weekdayThu": "Thu",
"weekdayFri": "Fri",
"weekdaySat": "Sat",
"weekdaySun": "Sun",
"validationNeedsShift": "{day} needs at least one shift or should be marked off.",
"validationEndAfterStart": "{day} shift end time must be after start time.",
"validationOverlap": "{day} shifts cannot overlap."
}
},
"patients": {
"title": "Patients",
"newPatient": "New Patient",
"errorLoadPatients": "Failed to load patients.",
"successPatientSaved": "Patient {firstName} {lastName} was saved successfully.",
"errorSavePatient": "Failed to save patient.",
"firstName": "First name",
"lastName": "Last name",
"mobile": "Mobile",
"mobilePlaceholder": "09121234567",
"mobileLabel": "Mobile:",
"patientAlreadyExists": "A patient with this mobile already exists: {firstName} {lastName}. They were selected for you.",
"savePatient": "Save Patient",
"dialogTitle": "New patient",
"searchPlaceholder": "Search patients by name, mobile, email",
"loadingPatients": "Loading patients...",
"noResults": "No patients found for this search.",
"noContact": "No contact",
"selectPatient": "Select a patient to view details.",
"emailLabel": "Email:",
"statusLabel": "Status:",
"statusActive": "Active",
"statusInactive": "Inactive",
"emptyValue": "-",
"requiredMark": "*",
"requiredFieldsHint": "Fields marked with * are required. Email is optional.",
"firstNameRequired": "First name is required.",
"lastNameRequired": "Last name is required.",
"emailOptional": "Email (optional)",
"emailOptionalSummary": "Email (optional):",
"appointmentHistoryTitle": "Appointment history",
"appointmentHistorySubtitle": "Past and upcoming appointments for this patient at your clinic.",
"appointmentHistoryLoading": "Loading appointment history…",
"appointmentHistoryEmpty": "No appointments recorded for this patient yet.",
"appointmentHistoryError": "Could not load appointment history.",
"appointmentHistoryProvider": "Provider: {name}",
"appointmentHistoryUnknownProvider": "Unknown provider"
},
"cases": {
"title": "Cases",
"subtitle": "Lab cases sent from linked clinics. Track progress and flag important tasks.",
"searchPlaceholder": "Search by patient name or mobile…",
"emptyList": "No cases received yet.",
"selectCaseHint": "Select a case from the list to view tasks.",
"fromClinic": "From {name}",
"sentAt": "Sent {date}",
"dueDateLabel": "Due {date}",
"overdueBadge": "Overdue",
"taskProgressLabel": "Tasks: {completed} of {total} completed",
"taskProgressShort": "{progress} tasks",
"treatmentDetails": "Treatment details",
"teethLabel": "Teeth",
"tasksByTooth": "Tasks",
"toothGroupTitle": "Teeth {teeth} · {prosthesis}",
"noTasks": "No tasks were generated for this case.",
"statusInProgress": "In progress",
"statusCompleted": "Completed",
"importantLabel": "Important",
"unreadCase": "Unread updates",
"markCaseImportant": "Mark case as important",
"markImportant": "Mark as important",
"lastUpdatedBy": "Updated by {name}",
"lastUpdatedUnknown": "Not started yet",
"timelineTitle": "History",
"timelineEntry": "{status} · {name} · {date}",
"errorLoadList": "Failed to load cases.",
"errorLoadDetail": "Failed to load case details.",
"errorUpdateTask": "Failed to update task.",
"errorAssignTask": "Failed to assign task.",
"assigneeLabel": "Assigned to",
"assigneeUnassigned": "Unassigned",
"assignedTo": "Assigned to {name}",
"filterClinic": "Clinic",
"filterClinicAll": "All clinics",
"filterProsthesisType": "Prosthesis type",
"filterProsthesisTypeAll": "All types",
"filterSentFrom": "Sent from",
"filterSentTo": "Sent to",
"clearFilters": "Clear filters",
"patientMobile": "Mobile",
"showComments": "Comments",
"commentsCount": "Comments ({count})",
"viewAttachments": "View all attachments",
"attachmentsDialogTitle": "Case attachments",
"attachmentsDialogSubtitle": "Preview and download files shared with this case.",
"noAttachments": "No attachments were shared with this case.",
"downloadAttachment": "Download",
"downloadAllAttachments": "Download all",
"attachmentPreviewUnavailable": "Preview unavailable",
"prevPage": "Previous",
"nextPage": "Next",
"pageSummary": "Page {page} of {totalPages} ({total} cases)",
"statusLabel": "Status",
"viewShareQr": "View case QR code and share link",
"shareQrDialogTitle": "Case share link",
"shareQrDialogSubtitle": "Scan the QR code or copy the link to open this cases tasks.",
"copyShareLink": "Copy link",
"shareLinkCopied": "Link copied to clipboard",
"shareQrUnavailable": "QR preview unavailable"
},
"labCaseAccess": {
"pageTitle": "Case tasks",
"loading": "Loading case…",
"accessDeniedTitle": "Access denied",
"accessDenied": "You do not have permission to view this case. Sign in with a lab or clinic account that has access, and make sure you are the treatment provider for clinic access.",
"emptyTasks": "No tasks found for this case.",
"caseSummary": "{clinic} · {patient}",
"labName": "Lab: {name}"
},
"tasks": {
"title": "Tasks",
"subtitle": "All lab tasks from connected clinics. Filter, sort, and update the status of each step.",
"subtitleOwner": "All lab tasks from connected clinics. Filter, sort, and update the status of each step.",
"loading": "Loading tasks…",
"emptyList": "No tasks match the current filters.",
"emptyListOwner": "No tasks match the current filters.",
"noPermissionTitle": "Tasks",
"noPermissionBody": "You do not have permission to view tasks for this organization.",
"fromClinic": "From {name}",
"patientLabel": "Patient",
"taskDate": "{date}",
"teethLabel": "Teeth {teeth}",
"importantBadge": "Important",
"lastUpdatedBy": "Updated by {name}",
"statusInProgress": "In progress",
"statusCompleted": "Completed",
"searchPlaceholder": "Search patient or clinic…",
"filterClinic": "Clinic",
"filterClinicAll": "All clinics",
"filterStatus": "Status",
"filterStatusAll": "All statuses",
"filterStepCompleted": "Step completed",
"filterStepCompletedAll": "Any step",
"showCompleted": "Show completed",
"importantOnly": "Important first",
"assignedToMe": "Assigned to me",
"overdueOnly": "Overdue cases only",
"unassignedOnly": "Unassigned only",
"assignedToStaff": "Assigned to {name}",
"resetView": "Reset filters & sort",
"showInCase": "Show in case",
"showInCaseNotFound": "This task is not in the default in-progress list.",
"showInCaseError": "Could not locate this task in the list.",
"locatingCase": "Finding case in list…",
"taskCompletedToast": "Step completed — nice work!",
"taskCompletedFlash": "Done",
"filterSentFrom": "From",
"filterSentTo": "To",
"sortBy": "Sort by",
"sortDate": "Date",
"sortDueDate": "Case due date",
"sortStatus": "Status",
"sortClinic": "Clinic",
"sortPatient": "Patient",
"sortImportant": "Important",
"sortProsthesis": "Prosthesis type",
"sortTaskType": "Task type",
"sortDirection": "Sort direction",
"groupingOffClinic": "Sorted by clinic — case grouping is off.",
"groupingOffPatient": "Sorted by patient — case grouping is off.",
"groupingOffProsthesis": "Sorted by prosthesis type — case grouping is off.",
"groupingOffTaskType": "Sorted by task type — case grouping is off.",
"groupingOffStatus": "Sorted by status — case grouping is off.",
"groupingOffDueDate": "Sorted by due date — case grouping is off.",
"caseReceivedAt": "Received {date}",
"caseDueDate": "Due {date}",
"overdueBadge": "Overdue",
"caseTaskProgress": "{completed}/{total} tasks on this page",
"clearFilters": "Clear filters",
"commentsButton": "Comments",
"errorLoadList": "Failed to load tasks.",
"errorUpdateTask": "Failed to update task.",
"pageSummary": "Page {page} of {totalPages} ({total} tasks)"
},
"caseComments": {
"title": "Comments",
"placeholder": "Write a comment…",
"reply": "Reply…",
"post": "Post",
"empty": "No comments yet.",
"visibleToClinicToggle": "Visible to clinic",
"clinicCanSee": "Clinic can see this",
"hiddenFromClinic": "Hidden from clinic",
"makeVisible": "Make visible to clinic",
"makeHidden": "Hide from clinic",
"labAuthor": "Lab",
"clinicAuthor": "Clinic",
"errorLoad": "Failed to load comments.",
"errorPost": "Failed to post comment.",
"errorToggle": "Failed to update comment visibility.",
"send": "Send comment",
"composerVisible": "Visible to clinic",
"composerHidden": "Hidden from clinic"
},
"appointments": {
"title": "Appointments",
"subtitle": "Search a patient, pick a date, then click a time slot under a provider to book.",
"loadingSchedule": "Loading schedule…",
"infoPastViewOnly": "Past appointments are view-only.",
"infoEditBlockedHasTreatment": "This appointment cannot be edited because a treatment is linked to it.",
"infoSelectPatient": "Select a patient before booking.",
"errorOutsideHours": "This appointment falls outside the provider's current working hours and cannot be edited.",
"successUpdated": "Appointment updated.",
"successSaved": "Appointment saved.",
"errorUpdate": "Could not update appointment.",
"errorSave": "Could not save appointment.",
"confirmRemove": "Remove this appointment?",
"successRemoved": "Appointment removed.",
"errorDelete": "Could not delete appointment.",
"deleteBlockedHint": "This appointment cannot be deleted because a treatment is linked to it.",
"errorLoadSchedule": "Failed to load schedule.",
"successPatientSaved": "Patient {firstName} {lastName} was saved.",
"searchPlaceholder": "Search existing patients",
"searching": "Searching…",
"searchHint": "Type to search patients by name, phone, or email.",
"noPermissionAdd": "You do not have permission to add patients.",
"editTitle": "Edit appointment",
"newTitle": "New appointment",
"providerLabel": "Provider:",
"patientLabel": "Patient",
"startLabel": "Start",
"endLabel": "End",
"purposeLabel": "Purpose",
"errorSelectPatient": "Select a patient first.",
"patientSearchPlaceholder": "Search patients by name, phone, or email",
"patientSearchEmpty": "No patients match this search.",
"patientLockedHint": "Patient cannot be changed because a treatment is linked to this appointment.",
"errorEndAfterStart": "End time must be after start time.",
"errorPastSchedule": "Cannot schedule in the past.",
"errorPastViewOnly": "Past appointments are view-only.",
"errorMissingDetails": "Missing appointment details.",
"noProviders": "No providers available. Add staff with treatment edit access to see columns here.",
"noWorkingHours": "No working hours are configured for this day. Set provider working hours in Staff management.",
"noHoursSet": "No hours set",
"offToday": "Off today",
"slotOffToday": "Provider is off today",
"slotHoursNotConfigured": "Working hours not configured",
"slotOutsideHours": "Outside working hours",
"slotCannotCreate": "You cannot create appointments",
"slotBookAt": "Book {time}",
"outsideHoursBlocked": "Outside working hours — editing blocked",
"overlappingChoose": "{count} overlapping — click to choose",
"overlapping": "{count} overlapping",
"legend": "Legend",
"overlappingTitle": "Overlapping appointments ({count})",
"purposeConsultation": "Consultation",
"purposeFilling": "Filling",
"purposeEndo": "Endo",
"purposeVisit": "Visit",
"purposeHygiene": "Hygiene"
},
"treatment": {
"loading": "Loading…",
"noPermissionTitle": "Treatment workspace",
"noPermissionBody": "You do not have permission to view the Treatment tab for this organization.",
"title": "Treatment",
"subtitleEdit": "Document cases for your appointments, save drafts, and send work to linked organizations.",
"subtitleEditPhase4": "Plan treatment details first, then group lab-dependent work into shipments in the lab dispatch panel.",
"subtitleReadOnly": "View-only access — you can review appointments and treatment history but cannot edit.",
"pastDayNotice": "Past days are view-only. You can review appointments and history, but treatment cases cannot be added or changed.",
"selectedPatient": "Selected patient",
"purposeLabel": "Purpose:",
"loadingAppointments": "Loading appointments…",
"selectDayWithAppointment": "Select a day with at least one appointment.",
"confirmDiscard": "You have unsaved changes. Discard them and continue?",
"errorChooseOrg": "Choose at least one active organization to send this case.",
"successCaseSent": "Case sent to selected organizations.",
"successFilesUploaded": "{count} file(s) uploaded successfully.",
"errorLoadAppointments": "Failed to load appointments.",
"errorLoadOrgs": "Failed to load linked organizations.",
"errorLoadHistory": "Failed to load treatment history.",
"errorLoadDraft": "Failed to load treatment draft.",
"errorUpload": "Failed to upload attachments.",
"errorSaveDraft": "Failed to save treatment draft.",
"errorSendCase": "Failed to send case.",
"errorCaseMustSave": "Case must be saved before sending.",
"treatmentPlanTitle": "Treatment · {patientName}",
"hiddenMessage": "Appointments are hidden.",
"showAppointments": "Show appointments",
"appointmentsTitle": "My appointments",
"hideAppointments": "Hide appointments",
"emptyDay": "No appointments assigned to you on this day.",
"casesTitle": "Treatment cases",
"casesSubtitle": "Each case has its own teeth, notes, attachments, and destinations for send.",
"detailsTitle": "Treatment details",
"detailsSubtitle": "Plan teeth, type, notes, and attachments for each detail line.",
"addDetail": "Add detail",
"confirmRemoveDetail": "Remove this treatment detail?",
"removeDetailAria": "Remove detail {n}",
"detailLabel": "Detail {n}",
"detailSentBadge": "sent",
"detailLockedInShipment": "This detail was sent to a lab and can no longer be edited.",
"detailsSaveHint": "Lab dispatch is configured separately below.",
"addCase": "Add case",
"caseLabel": "Case {n}",
"comments": "Notes",
"commentsPlaceholder": "Write clinical notes for this detail…",
"treatmentType": "Treatment type",
"treatmentTypePlaceholder": "Select treatment type…",
"treatmentTypeNotSelected": "Type not selected",
"typeConsultation": "consultation",
"typeFilling": "filling",
"typeEndo": "endo",
"typeVisit": "visit",
"typeHygiene": "hygiene",
"attachments": "Attachments",
"attachFiles": "Attach files for this treatment case",
"chooseFiles": "Choose files",
"sendToOrgs": "Send this case to linked organizations",
"searchOrgsPlaceholder": "Search active organizations...",
"recent": "Recent:",
"noOrgMatch": "No active organization matches your search.",
"inviteLab": "Invite a lab",
"noOrgInvitePermission": "You do not have permission to invite labs. Contact your organization owner.",
"sendThisCase": "Send this case",
"labDispatchTitle": "Lab dispatch",
"labDispatchSubtitle": "Group lab-dependent details into shipments and send them to linked labs.",
"labDispatchSendHint": "Shipment grouping is saved when you send to the lab.",
"addLabShipment": "Add lab shipment",
"labShipmentLabel": "Shipment {n}",
"includeDetails": "Include treatment details",
"labShipmentIncludedDetails": "Included in this shipment",
"labShipmentNoIncludedDetails": "No details were included in this shipment.",
"labShipmentNoDetailsAvailable": "All lab details are already in other shipments or have been sent.",
"labDetailLine": "Detail {n} · {type} · {teeth}",
"noLabDetails": "No prosthesis treatment details yet. Add prosthesis in treatment details above.",
"labDispatchEmpty": "Add a lab shipment to group details and send them to a lab.",
"prosthesisTypesTitle": "Prosthesis types",
"prosthesisApplyAll": "Apply to all teeth",
"prosthesisSelectPlaceholder": "Select prosthesis type…",
"prosthesisColTooth": "Tooth",
"prosthesisColDetail": "Detail",
"prosthesisColType": "Prosthesis type",
"prosthesisUnassigned": "Unassigned",
"selectLab": "Destination lab",
"selectLabPlaceholder": "Choose a linked lab…",
"sendToLab": "Send to lab",
"dueDateLabel": "Due date",
"dueDateOptional": "optional",
"dueDateLockedCompleted": "Due date cannot be changed after all tasks are completed.",
"dueDateUpdateError": "Failed to update due date.",
"saveLabShipments": "Save lab shipments",
"labDispatchSaveHint": "Saves shipment grouping without sending.",
"successLabShipmentsSaved": "Lab shipments saved.",
"errorSaveLabShipments": "Failed to save lab shipments.",
"errorLabCaseNeedsDetails": "Select at least one treatment detail for this shipment.",
"unsavedChanges": "Unsaved changes",
"saveStatusSaving": "Saving…",
"saveStatusSaved": "All changes saved",
"saveStatusError": "Could not save — check your connection",
"sendSavesFirst": "Sending is per case and saves first automatically.",
"historyTitle": "Previous treatments",
"historyPatientScope": "Previous treatments for {patientName}",
"historyCurrentAppointment": "This appointment",
"historySubtitle": "Click a past plan to preview it, then load it into the workspace if needed.",
"historyFilterNotShipped": "Not shipped to lab",
"historyFilterDate": "Date",
"historyClearFilters": "Remove filters",
"historyFilterEmpty": "No treatments match these filters.",
"labShipmentBlockedTitle": "Lab shipment not available yet",
"labShipmentBlockedBody": "Select at least one tooth on this prosthesis detail before you can create a lab shipment.",
"labCaseCommentsTitle": "Lab case comments",
"labCaseCommentsHint": "Message the lab while this case is still in progress. Comments close when all lab tasks are completed.",
"labShipmentsTitle": "Lab shipments",
"labShipmentsSubtitle": "Sent cases for this patient — open one to follow progress and messages.",
"labShipmentsPatientScope": "Sent cases for {patientName} — open one to follow progress and messages.",
"labShipmentsUpdatesScope": "Cases with new lab activity — open one to review and clear the update.",
"labShipmentsScopePatient": "This patient",
"labShipmentsScopeUpdates": "All updates ({count})",
"labShipmentsOtherPatientsUnread": "{count, plural, one {# update on another patient} other {# updates on other patients}}",
"labShipmentsUpdatesEmpty": "No cases with new lab activity.",
"labShipmentsEmpty": "No lab shipments for this patient yet.",
"labShipmentTeethCount": "{count, plural, one {# tooth} other {# teeth}}",
"historyShowFilters": "Show filters",
"historyHideFilters": "Hide filters",
"labTrackerExpand": "View activity",
"labTrackerCollapse": "Hide activity",
"activityFeedTitle": "Activity",
"activityFeedEmpty": "No activity recorded yet.",
"unreadLabCase": "Unread lab updates",
"overdueBadge": "Overdue",
"activityUnknownActor": "Someone",
"activityUnknownStep": "Task",
"activityCaseSent": "Case sent to lab · {date}",
"activityClinicComment": "{actor}: “{preview}” · {date}",
"activityLabComment": "{actor}: “{preview}” · {date}",
"activityTaskCompleted": "{step} completed by {actor} · {date}",
"activityCaseImportant": "Marked important by {actor} · {date}",
"activityCaseAmended": "Case updated by {actor} · {date}",
"activityGeneric": "Update · {date}",
"loadingHistory": "Loading history…",
"historyEmpty": "No other treatments recorded for this patient yet.",
"historyDetailLabel": "Detail {n} · {type}",
"previewCurrentDraft": "Current draft",
"previewBrowsingTitle": "Previewing saved plan",
"browseBanner": "Viewing {date} — this plan is not loaded in the editor yet.",
"loadIntoWorkspace": "Load into workspace",
"backToCurrentDraft": "Back to current draft",
"labAttentionTitle": "Lab dispatch needed",
"labAttentionSubtitle": "These lab-dependent details have not been sent to a lab yet.",
"labAttentionCurrentDraft": "Current appointment",
"labAttentionGoDispatch": "Go to dispatch",
"labAttentionLoadDispatch": "Load & dispatch",
"previewTitle": "Treatment preview",
"openTreatment": "Open",
"selectAppointment": "Select an appointment to preview its treatment.",
"detailCount": "{n} detail(s)",
"detailSummary": "Detail {n}: {type}",
"detailAttachmentCount": "{n, plural, one {# file} other {# files}}",
"detailNotSentToLab": "Not sent to lab",
"detailPendingLabSend": "This lab detail has not been sent yet.",
"teethLabel": "Teeth:",
"teethNone": "None selected",
"historicalReadonlyNotice": "You are viewing a past treatment (read-only).",
"errorNoAppointmentForTreatment": "This treatment has no linked appointment and cannot be opened.",
"errorNoTreatmentForPatient": "This patient has no treatment records yet.",
"noCases": "No cases in this treatment.",
"noDetails": "No treatment details yet.",
"typeLabel": "Type:",
"commentsLabel": "Comments:",
"commentsEmpty": "Comments: —",
"attachFilesShort": "Attach files",
"sendCase": "Send this case",
"sendToLinkedOrgs": "Send to linked organizations",
"noActiveOrgs": "No active linked organizations.",
"confirmSend": "Confirm send",
"toothChartTitle": "FDI tooth chart",
"entryWizardLabel": "Treatment entry steps",
"entryStepTeeth": "Teeth",
"entryStepContent": "Content",
"entryStepLab": "Lab",
"entryStepBack": "Back",
"entryStepNext": "Next",
"entryStepLabUnavailable": "Lab dispatch is available after you save a lab-dependent detail with teeth selected.",
"toothChartTitleCompact": "Tooth chart",
"toothChartHint": "Tap teeth to select or deselect. Shift-click another tooth in the same arch for a connected bridge. Click a bridge tooth to cut it out (still selected as a single); ends keep one bridge, middle splits into two.",
"toothConnectedHint": "Connected selection",
"toothConnectedSuffix": " (connected)",
"connectedBadge": "Connected",
"prosthesisConnectedLabel": "Connected teeth prosthesis type",
"toothChartWholePlan": "Full View",
"labShipmentAttachments": "Files for the lab",
"labShipmentAttachmentsHint": "Select which attachments from this detail are included in this shipment. None are sent by default.",
"selectedLabel": "Selected:",
"selectedEmpty": "—",
"upperArch": "Upper arch",
"lowerArch": "Lower arch",
"toothAria": "FDI tooth {fdi}",
"toothSelectedSuffix": ", selected",
"sentToAt": "Sent to {orgName} at {datetime}",
"fallbackOrgName": "organization"
},
"organizations": {
"loadingOrganization": "Loading organization...",
"subtitle": "Search organizations, send connection requests to existing accounts, or invitation links when they are not on DyoLink yet.",
"invitationHistory": "Invitation History",
"searchPlaceholder": "Search {counterpart} by name, email, or phone...",
"backToList": "Back to list",
"tableOrganization": "Organization",
"tableOwnerEmail": "Owner email",
"tableDate": "Date",
"tableStatus": "Status",
"tableAction": "Action",
"emptyConnections": "No connections yet. Search to send a connection request or an invitation link.",
"statusInvitationPending": "Invitation pending",
"statusConnectionPending": "Connection request pending",
"statusConnected": "Connected",
"statusDeclined": "Connection request declined",
"statusFound": "Found",
"statusToday": "Today",
"acceptRequest": "Accept connection request",
"declineRequest": "Decline connection request",
"removeConnection": "Remove connection",
"sendRequest": "Send connection request",
"noDirectoryResults": "No organization found in directory search.",
"hideInvitationFields": "Hide invitation fields",
"sendInvitationLink": "Send invitation link",
"counterpartNameLabel": "{counterpart} name",
"ownerEmailLabel": "Owner email",
"sendInvitation": "Send invitation",
"successConnectionSent": "{counterpart} connection request sent.",
"successInviteCreated": "Invitation link created for {email}",
"successLinkCopied": "Invitation link copied to clipboard.",
"successAccepted": "Connection request accepted.",
"successDeclined": "Connection request declined.",
"successRemoved": "Connection removed.",
"historyTitle": "Invitation History",
"loadingHistory": "Loading invitation history...",
"historyEmpty": "No invitations yet.",
"tableInvitationLink": "Invitation link",
"statusPending": "Invitation pending",
"statusAccepted": "Invitation accepted",
"statusRejected": "Invitation rejected",
"statusExpired": "Invitation expired",
"copyInvitationLink": "Copy invitation link",
"copyInvitationLinkTitle": "Copy invitation link (generates a new link if needed)",
"selectorTitle": "Organizations",
"selectorSubtitleWithCreate": "Select an organization to continue, or create a new one.",
"selectorSubtitleSelectOnly": "Select an organization to continue.",
"createOrganization": "Create Organization",
"createAndContinue": "Create and Continue",
"emptyCanCreate": "No organizations found. Create your first one to continue.",
"emptyAskOwner": "No organizations found. Ask an organization owner to invite you.",
"continueArrow": "Continue →",
"planLabel": "Plan: {name} • {maxUsers} users",
"counterpartClinic": "Clinic",
"counterpartLab": "Lab",
"viewCaseHistory": "View case history",
"caseHistoryBackToConnections": "← Back to connections",
"caseHistoryTitle": "Case history with {name}",
"caseHistorySlimClinicBody": "Follow lab cases in Treatment for each patient.",
"caseHistorySlimClinicHint": "Open Treatment, select the patient, and use Lab shipments in the left panel to track cases sent to {name}.",
"caseHistorySlimClinicCta": "Open Treatment",
"caseHistorySlimLabBody": "Production cases for this clinic live on the Cases tab.",
"caseHistorySlimLabHint": "Use Cases to work cases received from {name}. Filter by this clinic if needed.",
"caseHistorySlimLabCta": "Open Cases"
},
"settings": {
"accountTitle": "Account",
"accountSubtitle": "Profile and security settings for your login.",
"participationSectionTitle": "Clinical participation",
"participationSectionSubtitle": "Choose whether you personally take part in clinical or lab work for this organization.",
"participateInTreatments": "I want to participate in treatments",
"participateInTasks": "I want to participate in tasks",
"participateWorkingHoursTitle": "Working hours",
"participateWorkingHoursSubtitle": "Set your schedule so appointments can be booked for you.",
"participateSaveHours": "Save and participate",
"participateEnabledTreatments": "You are now participating in treatments.",
"participateEnabledTasks": "You are now participating in tasks.",
"participateDisabledTreatments": "You are no longer participating in treatments.",
"participateDisabledTasks": "You are no longer participating in tasks.",
"participateUpdateFailed": "Could not update participation settings. Please try again.",
"participateConfirmRevokeTitle": "Stop participating?",
"participateConfirmRevokeBodyTreatments": "You will lose treatment access and be removed from the appointments schedule. Your saved working hours will be kept.",
"participateConfirmRevokeBodyTasks": "You will lose task edit access and be removed from the efficiency report.",
"participateConfirmRevokeConfirm": "Stop participating",
"changePasswordOption": "Change password",
"changePasswordTitle": "Change password",
"resetPasswordTitle": "Set a new password",
"resetPasswordSubtitle": "Your mobile was verified. Choose a new password for your account.",
"currentPassword": "Current password",
"newPassword": "New password",
"confirmNewPassword": "Confirm new password",
"updatePassword": "Update password",
"setNewPassword": "Save new password",
"passwordChanged": "Password updated. Please sign in again.",
"passwordChangeFailed": "Could not update password. Please try again.",
"subscriptionsTitle": "Subscriptions",
"subscriptionsSubtitle": "Your DyoLink workspace plan and seats for {orgName}. Clinic and lab income tracking stays under the sidebar Billing tab.",
"noSubscriptionNotice": "This organization has no active subscription. Select a plan below to start the purchase process.",
"currentPlan": "Current plan",
"planPrice": "Plan price",
"seatsUsed": "Seats used",
"seatsRemaining": "Seats remaining",
"daysRemaining": "Days remaining",
"unlimited": "Unlimited",
"unlimitedSeats": "Unlimited seats",
"seatsCount": "{n} seats",
"pricePerMonth": "${price} / month",
"noActiveSubscription": "No active subscription for this organization.",
"trialEnded": "Trial period has ended. Choose a plan when checkout is available.",
"trialEndsIn": "Trial ends in {days} day(s).",
"seatsLow": "Seat usage is high for this organization.",
"choosePlanIntro": "Choose a plan to continue. Purchase integration is not active yet, so this currently prepares the selection step only.",
"planSolo": "Solo",
"planSmall": "Small",
"planMedium": "Medium",
"planLarge": "Large",
"planEnterprise": "Enterprise",
"startPurchase": "Start purchase process",
"purchaseNotice": "Purchase flow will be enabled soon. {plan} is selected and ready for checkout setup."
},
"schedule": {
"defaultLabel": "Schedule date",
"previousDay": "Previous day",
"nextDay": "Next day",
"chooseDate": "Choose schedule date",
"today": "Today",
"year": "Year",
"month": "Month",
"day": "Day",
"monthJanuary": "January",
"monthFebruary": "February",
"monthMarch": "March",
"monthApril": "April",
"monthMay": "May",
"monthJune": "June",
"monthJuly": "July",
"monthAugust": "August",
"monthSeptember": "September",
"monthOctober": "October",
"monthNovember": "November",
"monthDecember": "December"
},
"errors": {
"GENERIC": "Something went wrong. Please try again.",
"NETWORK_ERROR": "Could not reach the server. Check your connection and try again.",
"TIMEOUT": "The request took too long. Please try again.",
"AUTH_INVALID_CREDENTIALS": "Incorrect email or password.",
"AUTH_UNAUTHORIZED": "Your session has expired. Please sign in again.",
"AUTH_REFRESH_TOKEN_NOT_FOUND": "Your session has expired. Please sign in again.",
"AUTH_REFRESH_TOKEN_INVALID": "Your session has expired. Please sign in again.",
"AUTH_SESSION_EXPIRED": "Your session has expired. Please sign in again.",
"AUTH_USER_NOT_FOUND": "We could not find your account.",
"AUTH_ORG_NOT_SELECTED": "Please select an organization to continue.",
"AUTH_ORG_ACCESS_DENIED": "You do not have access to this organization.",
"AUTH_INVITATION_PENDING": "Your invitation is still pending. Ask an administrator to activate your account.",
"AUTH_REGISTRATION_EMAIL_EXISTS": "An account with this email already exists. Sign in to add a new organization from your account.",
"AUTH_REGISTRATION_MOBILE_EXISTS": "This mobile number is already registered.",
"AUTH_REGISTRATION_MOBILE_INVALID": "Please enter a valid mobile number.",
"AUTH_REGISTRATION_FAILED": "Registration could not be completed. Please try again.",
"AUTH_PASSWORD_INCORRECT": "Current password is incorrect.",
"AUTH_PASSWORD_RESET_EXPIRED": "Password reset verification expired. Please verify your mobile number again.",
"AUTH_VERIFICATION_CODE_INVALID": "Invalid or expired verification code.",
"AUTH_VERIFICATION_RATE_LIMIT": "Please wait a moment before requesting another code.",
"AUTH_SELECT_ORG_FIRST": "Select an organization before creating a new one.",
"AUTH_CREATE_ORG_OWNER_ONLY": "Only owners of the current organization can create new organizations.",
"AUTH_PASSWORD_CURRENT_REQUIRED": "Current password is required.",
"PERMISSION_DENIED": "You do not have permission to perform this action.",
"PERMISSION_ORG_MANAGE": "You do not have permission to manage organizations.",
"PERMISSION_CLINIC_ONLY": "This action is only available for clinic organizations.",
"PERMISSION_LAB_ONLY": "This action is only available for lab organizations.",
"PERMISSION_NOT_MEMBER": "You are not a member of this organization.",
"PERMISSION_OWNER_ONLY": "Only organization owners can perform this action.",
"PERMISSION_PARTICIPATION_SUBSCRIPTION": "An active subscription is required to participate in treatments or tasks.",
"PERMISSION_ENABLE_PARTICIPATION_FIRST": "Enable treatment participation before setting working hours.",
"PERMISSION_CLINIC_WORKING_HOURS": "Working hours are only available for clinic organizations.",
"PERMISSION_ACCESS_APPOINTMENTS": "You do not have access to appointments.",
"PERMISSION_EDIT_APPOINTMENTS": "You cannot create or modify appointments.",
"PERMISSION_ACCESS_TREATMENTS": "You do not have access to treatments.",
"PERMISSION_EDIT_TREATMENTS": "You cannot edit treatments.",
"PERMISSION_ACCESS_TASKS": "You do not have access to tasks.",
"PERMISSION_EDIT_TASKS": "You cannot edit tasks.",
"PERMISSION_ACCESS_CASES": "You do not have access to cases.",
"LAB_CASE_ACCESS_DENIED": "You do not have permission to view this shared case.",
"PERMISSION_ACCESS_STAFF": "You do not have access to staff management.",
"PERMISSION_EDIT_STAFF": "You cannot manage staff working hours.",
"PERMISSION_ORG_NOT_FOUND": "Organization not found.",
"VALIDATION_FAILED": "Please check the form and try again.",
"VALIDATION_EMAIL_INVALID": "Please enter a valid email address.",
"VALIDATION_PASSWORD_TOO_SHORT": "Password is too short.",
"VALIDATION_PASSWORD_REQUIRED": "Password is required.",
"VALIDATION_MOBILE_INVALID": "Please enter a valid mobile number.",
"VALIDATION_NAME_TOO_SHORT": "Name is too short.",
"VALIDATION_ORGANIZATION_NAME_REQUIRED": "Organization name is required.",
"VALIDATION_ORGANIZATION_TYPE_INVALID": "Please select a valid organization type.",
"VALIDATION_TOKEN_REQUIRED": "This link is invalid or incomplete.",
"VALIDATION_FIELD_REQUIRED": "Please fill in all required fields.",
"VALIDATION_LANGUAGE_INVALID": "Please select a supported language.",
"VALIDATION_INVALID_REQUEST": "The request contains invalid data.",
"NOT_FOUND": "The requested item was not found.",
"CONFLICT": "This action conflicts with existing data.",
"CONFLICT_FUTURE_APPOINTMENTS": "You cannot stop participating in treatments while you have future appointments. Reassign or cancel them first.",
"APPOINTMENT_PATIENT_LOCKED": "Cannot change the patient while a treatment is linked to this appointment.",
"APPOINTMENT_HAS_TREATMENT": "This appointment cannot be deleted because a treatment is linked to it.",
"TREATMENT_DETAIL_SENT": "This detail was sent to a lab and can no longer be changed.",
"BAD_REQUEST": "The request could not be processed.",
"INTERNAL_ERROR": "Something went wrong on our end. Please try again later."
}
}