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