Files
dyolink/frontend/messages/en.json

1246 lines
64 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": "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 cases 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"
},
"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 providers 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 owners 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."
}
}