{ "common": { "appName": "Nudentic", "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. Opening your workspace...", "invitationAcceptedSignInFailed": "Account activated, but sign-in failed. Please log in with your password.", "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. Opening your workspace...", "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 Nudentic. 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", "chartAppointmentsWeekAllSubtitle": "All providers — last 7 days", "chartAppointmentsWeekMineTitle": "My Appointments", "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", "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.", "periodWeek": "Week", "periodMonth": "Month", "periodYear": "Year", "periodSelectAria": "Chart time period", "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": "Important Case", "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 case’s tasks.", "copyShareLink": "Copy link", "shareLinkCopied": "Link copied to clipboard", "shareQrUnavailable": "QR preview unavailable", "downloadCaseSheet": "Download PDF", "caseSheetTitle": "Case Sheet", "caseSheetOrderNumber": "Order number", "caseSheetOrderDate": "Order date", "caseSheetDateDue": "Date due", "caseSheetSender": "Sender", "caseSheetRecipient": "Recipient", "caseSheetPatient": "Patient", "caseSheetPatientId": "Mobile", "caseSheetProsthesis": "Prosthesis", "caseSheetToothChart": "Tooth Chart", "caseSheetComments": "Comments", "caseSheetNoComments": "No comments.", "errorDownloadCaseSheet": "Could not download the case sheet PDF.", "externalCodePlaceholder": "external code e.g. exocad code", "errorUpdateExternalCode": "Could not save the external code.", "addCase": "Add case", "addCaseTitle": "New case", "addCaseSubtitle": "Enter the referring clinic or patient, then add prosthesis lines. Start when the case is ready.", "startCase": "Start", "draftBadge": "Draft", "receivedBadge": "Received", "generatedBadge": "Generated", "referringClinic": "Referring clinic", "referringDentist": "Dentist", "patientName": "Patient name", "partnerClinic": "Linked clinic", "partnerClinicNone": "None", "dueDateField": "Due date", "caseLinesTitle": "Work lines", "addLine": "Add line", "lineChip": "Line {n}", "removeLineAria": "Remove line {n}", "errorCreateCase": "Could not create the case.", "errorSaveCase": "Could not save the case.", "errorStartCase": "Could not start the case.", "confirmDeleteDraftCase": "Delete this draft case? This cannot be undone.", "errorDeleteCase": "Could not delete the case." }, "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", "filterOrigin": "Case source", "filterOriginAll": "All sources", "filterOriginReceived": "Received", "filterOriginGenerated": "Generated", "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.", "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": "Search for a patient or select a visit from the day strip.", "noTreatmentFoundTitle": "No treatment found", "noTreatmentFoundBody": "There is no treatment or visit for {name} yet. You can add one with the {action} button in the rail.", "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 or unscheduled treatments assigned to you on this day.", "unscheduledHeading": "Without appointment", "noAppointment": "No appointment", "walkIn": "Walk-in", "newTreatment": "New treatment", "newTreatmentPatientPrompt": "Who is this visit for?", "newTreatmentUseCurrent": "Use {name}", "newTreatmentUseCurrentHint": "Start a new visit for the patient already open on this page.", "walkInPickerHint": "No named patient — always available, no search needed.", "errorCreateTreatment": "Could not create treatment.", "deleteEmptyTreatment": "Delete empty treatment", "confirmDeleteEmptyTreatment": "Delete this treatment? It has no details yet.", "errorDeleteTreatment": "Could not delete treatment.", "casesTitle": "Treatment cases", "casesSubtitle": "Each case has its own teeth, notes, attachments, and destinations for send.", "detailsTitle": "Treatment details", "addDetail": "Add detail", "confirmRemoveDetail": "Remove this treatment detail?", "confirmRemoveLastDetail": "This is the last detail. Removing it leaves the plan empty until you add another. Continue?", "removeDetailAria": "Remove detail {n}", "detailLabel": "Detail {n}", "detailSentBadge": "sent", "detailUnsentBadge": "unsent", "attachmentPreviewUnavailable": "Preview unavailable", "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": "Choose a lab, set prosthesis types, and send.", "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}", "activityTaskAssigned": "{step} assigned 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", "entryStepTreatment": "Treatment", "entryStepBack": "Back", "entryStepNext": "Next", "continueToLab": "Continue to lab", "backToTreatment": "Back to treatment", "selectTypeBeforeTeeth": "Choose a treatment type before selecting teeth.", "labDispatchNotSent": "Not sent", "labDispatchLastLab": "Last lab: {name}", "labCommentsMovedHint": "Progress and comments are in Lab shipments.", "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. When two neighbors are selected, an empty circle appears between them — tap it to connect (or tap a filled circle to disconnect). Shift-click a range to select all in between (not connected until you fill the circles).", "toothChartHelpAria": "How to select teeth", "toothConnectedHint": "Connected selection", "toothLinkHint": "Connect these teeth", "toothUnlinkHint": "Disconnect these teeth", "toothLinkAria": "Connect teeth {a} and {b}", "toothUnlinkAria": "Disconnect teeth {a} and {b}", "toothConnectedSuffix": " (connected)", "connectedBadge": "Connected", "prosthesisConnectedLabel": "Connected teeth prosthesis type", "toothChartWholePlan": "Full View", "labShipmentAttachments": "Files for the lab", "labShipmentAttachmentsHint": "All files are included. Uncheck any you do not want to send.", "selectedLabel": "Selected:", "selectedEmpty": "—", "upperArch": "Upper arch", "lowerArch": "Lower arch", "toothAria": "FDI tooth {fdi}", "toothSelectedSuffix": ", selected", "sentToAt": "Sent to {orgName} at {datetime}", "fallbackOrgName": "organization", "voiceStart": "Record treatment", "voiceStop": "Stop recording", "voiceCancel": "Cancel", "voiceProcessing": "Reading the recording…", "voiceReviewTitle": "Check what was understood", "voiceNothingExtracted": "Nothing usable was picked up from that recording.", "voiceProsthesisIncomplete": "No prosthesis type for {teeth} — the case cannot be sent until every tooth has one.", "voiceLabInexact": "The spoken name only partly matched this lab. Confirm before sending.", "voiceNotUnderstood": "Not understood", "voiceDiscard": "Discard", "voiceApply": "{count, plural, one {Apply # field} other {Apply # fields}}", "voiceUnresolved": { "not_permanent_tooth": "not a permanent tooth", "position_out_of_range": "not a valid tooth position", "malformed": "could not be read", "span_not_same_arch": "a bridge cannot span both jaws", "unknown_catalog_code": "not in this clinic’s list", "tooth_not_selected": "that tooth is not part of this detail", "invalid_date": "not a usable date" }, "voiceFailed": "Voice entry failed. Please try again." }, "organizations": { "loadingOrganization": "Loading organization...", "subtitle": "Search organizations, send connection requests to existing accounts, or invitation links when they are not on Nudentic 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 Nudentic 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" }, "notifications": { "bellAria": "Notifications", "unreadCount": "{count} unread notifications", "dropdownTitle": "Notifications", "viewAll": "View all", "pageTitle": "Notifications", "pageSubtitle": "Updates from cases, tasks, organizations, and staff.", "loading": "Loading notifications…", "empty": "No notifications yet.", "loadMore": "Load more", "markAllRead": "Mark all as read", "errorLoad": "Could not load notifications.", "errorMarkRead": "Could not update notification.", "typeCaseSent": "New lab case received", "typeClinicComment": "New clinic comment on a case", "typeLabComment": "New lab comment on a case", "typeLabCommentClinic": "New lab comment on your case", "typeCaseImportant": "Case marked as important", "typeTaskCompleted": "Lab task completed", "typeTaskAssigned": "A task was assigned to you", "typeConnectionRequest": "New organization connection request", "typeStaffInvite": "Staff invitation created", "typeUnknown": "Notification", "destCases": "Open Cases", "destTasks": "Open Tasks", "destTreatment": "Open Treatment", "destOrganizations": "Open Organizations", "destStaff": "Open Staff", "destOpen": "Open" }, "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.", "VALIDATION_TIMEZONE_INVALID": "Your timezone could not be determined. Refresh the page and try again.", "APPOINTMENT_INVALID_TIME": "The appointment start or end time is invalid.", "APPOINTMENT_END_BEFORE_START": "End time must be after start time.", "APPOINTMENT_TOO_LONG": "An appointment cannot last more than 24 hours.", "APPOINTMENT_IN_PAST": "You cannot book an appointment in the past.", "APPOINTMENT_INVALID_RANGE": "The date range is invalid.", "APPOINTMENT_INVALID_RANGE_ORDER": "The end of the range must be after the start.", "APPOINTMENT_INVALID_DATE": "The selected date is invalid.", "APPOINTMENT_PROVIDER_NOT_MEMBER": "This provider is not a member of the organization.", "APPOINTMENT_PROVIDER_INACTIVE": "This provider is not an active staff member.", "APPOINTMENT_PROVIDER_NO_TREATMENT_EDIT": "This provider cannot take treatment appointments.", "APPOINTMENT_PROVIDER_NO_WORKING_HOURS": "This provider has no working hours set.", "APPOINTMENT_PROVIDER_NOT_WORKING_DAY": "This provider does not work on the selected day.", "APPOINTMENT_OUTSIDE_WORKING_HOURS": "This time is outside the provider’s working hours.", "APPOINTMENT_NOT_FOUND": "Appointment not found.", "APPOINTMENT_NOT_PROVIDER": "You are not the provider for this appointment.", "PATIENT_NOT_FOUND": "Patient not found.", "WORKING_HOURS_INVALID": "Working hours are invalid. Check that shifts do not overlap.", "WORKING_HOURS_OWNER_NOT_ALLOWED": "Set owner working hours from account settings.", "WORKING_HOURS_CONFLICTS_WITH_APPOINTMENTS": "These hours conflict with upcoming appointments. Reschedule or remove those appointments first.", "STAFF_UNKNOWN_PERMISSIONS": "One or more selected permissions are not valid.", "STAFF_NO_SUBSCRIPTION": "Choose a plan before adding staff.", "STAFF_SEAT_LIMIT": "Your plan has no free seats. Disable a member or upgrade to add more.", "STAFF_INVITE_OWNER_EMAIL": "The organization owner is already a member.", "STAFF_ALREADY_MEMBER": "This person is already a member.", "STAFF_OWNER_NO_INVITE_LINK": "The owner does not use an invitation link.", "STAFF_ALREADY_ACCEPTED": "This member has already accepted their invitation.", "STAFF_INVITE_MISSING": "No invitation was found for this member.", "STAFF_INVITE_ALREADY_ACCEPTED": "This invitation has already been accepted.", "STAFF_INVITE_INVALID": "This invitation is no longer valid.", "STAFF_INVITE_REVOKED": "This invitation has been revoked.", "STAFF_INVITE_EXPIRED": "This invitation has expired.", "STAFF_ALREADY_ACTIVE": "This member is already active.", "STAFF_ALREADY_DISABLED": "This member is already disabled or pending.", "STAFF_CANNOT_DISABLE_SELF": "You cannot disable your own access.", "STAFF_MEMBER_NOT_FOUND": "Staff member not found.", "STAFF_CANNOT_EDIT_OWNER": "The owner’s membership cannot be edited here.", "STAFF_CANNOT_ENABLE_OWNER": "The organization owner cannot be enabled this way.", "STAFF_CANNOT_DISABLE_OWNER": "The organization owner cannot be disabled.", "STAFF_CANNOT_REMOVE_OWNER": "The organization owner cannot be removed.", "ORG_CANNOT_LINK_SELF": "You cannot link an organization to itself.", "ORG_LINK_WRONG_TYPE": "You can only link to the matching organization type (clinic or lab).", "ORG_TARGET_NO_SUBSCRIPTION": "The other organization does not have an active subscription.", "ORG_LINK_EXISTS": "These organizations are already linked.", "ORG_REQUEST_NOT_PENDING": "Only pending connection requests can be answered.", "ORG_CANNOT_RESPOND_OWN": "You cannot respond to your own connection request.", "ORG_INVITE_ALREADY_ACCEPTED": "This invitation has already been accepted.", "ORG_INVITE_INVALID": "This invitation is no longer valid.", "ORG_INVITE_REVOKED": "This invitation has been revoked.", "ORG_INVITE_EXPIRED": "This invitation has expired.", "ORG_INVITE_TYPE_MISMATCH": "Organization type does not match this invitation.", "ORG_INVITE_OWNER_HAS_ORG": "This owner already has an organization. Find it in search instead of sending an invitation.", "ORG_UNKNOWN_TYPE": "Unknown organization type.", "ORG_COUNTERPART_NOT_LAB": "The connected organization is not a lab.", "ORG_COUNTERPART_NOT_CLINIC": "The connected organization is not a clinic.", "ORG_CONNECTION_NOT_FOUND": "Connected organization not found.", "ORG_INVITE_NOT_FOUND": "Invitation not found.", "ORG_ONLY_CLINIC_COMMENT": "Only the clinic can comment on this case.", "CATALOG_UNKNOWN_TREATMENT_TYPE": "Unknown treatment type.", "CATALOG_UNKNOWN_PROSTHESIS_TYPE": "Unknown prosthesis type.", "CATALOG_TREATMENT_NOT_LAB_DEPENDENT": "This treatment type is completed in the clinic and cannot be sent to a lab.", "TREATMENT_SAVE_DETAILS_BEFORE_LAB": "Save treatment details before creating lab cases.", "TREATMENT_DETAIL_ONE_CASE": "Each treatment detail can belong to only one lab case.", "TREATMENT_DETAILS_NOT_FOUND": "One or more treatment details were not found.", "TREATMENT_DEST_NOT_LINKED": "That organization is not an active linked lab.", "TREATMENT_TEETH_REQUIRED_TO_SHIP": "Select teeth before sending this work to a lab.", "TREATMENT_TOOTH_UNKNOWN_DETAIL": "A tooth is linked to an unknown treatment detail.", "TREATMENT_TOOTH_NOT_ON_DETAIL": "A selected tooth is not on this treatment detail.", "TREATMENT_CASE_NO_DEST": "This lab case has no destination organization.", "TREATMENT_CASE_NEEDS_DETAIL": "A lab case must include a treatment detail.", "TREATMENT_CASE_ONE_DETAIL": "A lab case can include only one treatment detail.", "TREATMENT_ONLY_PROVIDER_SEND": "Only the treatment provider can send this lab case.", "TREATMENT_CASE_ALREADY_SENT": "This case was already sent to that lab.", "TREATMENT_DUE_DATE_LOCKED": "The due date cannot be changed after all tasks are completed.", "TREATMENT_INVALID_DUE_DATE": "The due date is invalid.", "TREATMENT_DETAIL_KEY_REQUIRED": "A treatment detail is required for this upload.", "TREATMENT_FILE_REQUIRED": "At least one file is required.", "TREATMENT_ATTACHMENT_NOT_FOUND": "Attachment not found.", "TREATMENT_FILE_UNAVAILABLE": "This file is no longer available.", "TREATMENT_CASE_INVALID_ATTACHMENTS": "One or more attachments are not valid for this lab case.", "TREATMENT_TOOTH_PROSTHESIS_INCOMPLETE": "Each tooth needs a prosthesis type before sending.", "LAB_CASE_NOT_FOUND": "Lab case not found.", "TASK_ASSIGNEE_INVALID": "The selected person cannot be assigned this task.", "TASK_ASSIGNED_TO_OTHER": "This task is assigned to another staff member.", "TASK_PAGE_DATE_SORT_ONLY": "Jumping to a task in the list is only available when sorted by date.", "INVALID_SENT_FROM": "The start date of the range is invalid.", "INVALID_SENT_TO": "The end date of the range is invalid.", "CASE_NOT_FOUND": "Case not found.", "CASE_ATTACHMENT_NOT_FOUND": "Attachment not found.", "CASE_ATTACHMENT_MISSING_FILE": "The attachment file is missing.", "CASE_TASK_NOT_FOUND": "Task not found.", "COMMENT_NOT_FOUND": "Comment not found.", "COMMENT_VISIBILITY_LAB_ONLY": "Only lab comments can change visibility.", "TODAY_INVALID_RANGE": "The date range is invalid.", "TODAY_INVALID_RANGE_ORDER": "The end of the range must be after the start.", "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.", "TREATMENT_NOT_FOUND": "Treatment not found.", "TREATMENT_PATIENT_OR_WALK_IN": "Choose a patient or create a walk-in treatment.", "TREATMENT_NOT_STANDALONE": "Only treatments without an appointment can be deleted this way.", "TREATMENT_HAS_DETAILS": "This treatment has details and cannot be deleted.", "LAB_CASE_NOT_EDITABLE": "This case can no longer be edited.", "LAB_CASE_ALREADY_STARTED": "This case has already been started.", "LAB_CASE_LINES_REQUIRED": "Add at least one work line with teeth and a prosthesis type.", "LAB_CASE_START_INCOMPLETE": "Complete teeth and prosthesis types before starting this case.", "LAB_CASE_CLIENT_REQUIRED": "Enter a clinic name or a patient name for this case.", "BAD_REQUEST": "The request could not be processed.", "INTERNAL_ERROR": "Something went wrong on our end. Please try again later.", "VOICE_MIC_DENIED": "Microphone access was blocked. Allow it in your browser settings and try again.", "VOICE_NOT_AVAILABLE": "Voice entry is not available for this language yet.", "VOICE_CLIP_TOO_LONG": "That recording is too long. Please keep it under two minutes.", "VOICE_ASR_FAILED": "Could not turn the recording into text. Please try again.", "VOICE_EXTRACT_FAILED": "Could not read the treatment details from the recording.", "VOICE_NOTHING_RECOGNIZED": "No speech was recognised. Check the microphone and try again.", "VOICE_RATE_LIMITED": "Too many recordings in a short time. Please wait a moment." } }