2026-06-20 12:37:38 +03:30
{
"common" : {
"appName" : "DyoLink" ,
"loading" : "Loading..." ,
"loadingApp" : "Loading app..." ,
"loadingWorkspace" : "Loading workspace..." ,
"continue" : "Continue" ,
"back" : "Back" ,
"save" : "Save" ,
2026-06-20 14:51:43 +03:30
"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"
2026-06-20 12:37:38 +03:30
} ,
"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" ,
2026-06-28 14:59:06 +03:30
"cases" : "Cases" ,
2026-06-28 22:56:56 +03:30
"tasks" : "Tasks" ,
2026-06-20 12:37:38 +03:30
"billing" : "Billing" ,
"reports" : "Reports" ,
"clinics" : "Clinics" ,
"labs" : "Labs"
} ,
"auth" : {
"login" : "Login" ,
"signIn" : "Sign in" ,
"signOut" : "Log out" ,
"register" : "Register" ,
"startTrial" : "Start Trial" ,
"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" ,
2026-07-10 19:04:10 +03:30
"showPassword" : "Show password" ,
"hidePassword" : "Hide password" ,
2026-06-20 12:37:38 +03:30
"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" ,
2026-06-20 14:51:43 +03:30
"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" ,
2026-07-04 00:01:58 +03:30
"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."
2026-06-20 12:37:38 +03:30
} ,
"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" ,
2026-07-04 00:01:58 +03:30
"passwordsDoNotMatch" : "Passwords don't match" ,
"mobileRequired" : "Mobile number is required" ,
"mobileInvalid" : "Please enter a valid Iranian mobile number" ,
"codeRequired" : "Verification code is required"
2026-06-20 14:51:43 +03:30
} ,
"today" : {
"welcomeBack" : "Welcome back!!" ,
"noSubscriptionNotice" : "This organization does not have an active subscription yet." ,
"choosePlanLink" : "Choose a plan" ,
"noSubscriptionCta" : "to start the purchase process." ,
2026-07-11 00:07:48 +03:30
"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" ,
"widgetTasksInProgress" : "Tasks In Progress" ,
"widgetImportantTasks" : "Important Tasks" ,
"widgetPendingConnections" : "Pending Connections" ,
"widgetSeats" : "Seat Usage" ,
2026-07-11 00:34:38 +03:30
"widgetPendingStaffInvites" : "Pending Staff Invites" ,
"chartTreatmentMixTitle" : "Treatment Mix" ,
"chartTreatmentMixSubtitle" : "Last 7 days" ,
"chartTasksByStepTitle" : "Tasks by Workflow Step" ,
"chartTasksByStepSubtitle" : "In progress now" ,
2026-07-11 00:48:35 +03:30
"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."
2026-06-20 14:51:43 +03:30
} ,
"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" ,
2026-06-28 14:59:06 +03:30
"featureCases" : "Cases" ,
2026-06-28 22:56:56 +03:30
"featureTasks" : "Tasks" ,
2026-06-20 14:51:43 +03:30
"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" ,
2026-06-28 14:49:37 +03:30
"mobile" : "Mobile" ,
"mobilePlaceholder" : "09121234567" ,
"mobileLabel" : "Mobile:" ,
"patientAlreadyExists" : "A patient with this mobile already exists: {firstName} {lastName}. They were selected for you." ,
2026-06-20 14:51:43 +03:30
"savePatient" : "Save Patient" ,
"dialogTitle" : "New patient" ,
2026-06-28 14:49:37 +03:30
"searchPlaceholder" : "Search patients by name, mobile, email" ,
2026-06-20 14:51:43 +03:30
"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" : "-"
} ,
2026-06-28 14:59:06 +03:30
"cases" : {
"title" : "Cases" ,
2026-07-07 15:31:09 +03:30
"subtitle" : "Lab cases sent from linked clinics. Track progress and flag important tasks." ,
2026-06-28 16:46:42 +03:30
"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}" ,
"taskProgressLabel" : "Tasks: {completed} of {total} completed" ,
"taskProgressShort" : "{progress} tasks" ,
"treatmentDetails" : "Treatment details" ,
"teethLabel" : "Teeth" ,
2026-07-07 15:31:09 +03:30
"tasksByTooth" : "Tasks" ,
"toothGroupTitle" : "Teeth {teeth} · {prosthesis}" ,
2026-06-28 16:46:42 +03:30
"noTasks" : "No tasks were generated for this case." ,
"statusInProgress" : "In progress" ,
"statusCompleted" : "Completed" ,
2026-07-07 15:31:09 +03:30
"importantLabel" : "Important" ,
2026-07-08 02:53:47 +03:30
"markCaseImportant" : "Mark case as important" ,
2026-07-07 15:31:09 +03:30
"markImportant" : "Mark as important" ,
"lastUpdatedBy" : "Updated by {name}" ,
"lastUpdatedUnknown" : "Not started yet" ,
"timelineTitle" : "History" ,
"timelineEntry" : "{status} · {name} · {date}" ,
2026-06-28 16:46:42 +03:30
"errorLoadList" : "Failed to load cases." ,
"errorLoadDetail" : "Failed to load case details." ,
2026-06-28 17:49:40 +03:30
"errorUpdateTask" : "Failed to update task." ,
"filterClinic" : "Clinic" ,
"filterClinicAll" : "All clinics" ,
"filterTreatmentType" : "Treatment type" ,
"filterTreatmentTypeAll" : "All types" ,
"filterSentFrom" : "Sent from" ,
"filterSentTo" : "Sent to" ,
"clearFilters" : "Clear filters" ,
"patientMobile" : "Mobile" ,
2026-07-07 17:14:31 +03:30
"showComments" : "Comments" ,
"commentsCount" : "Comments ({count})" ,
2026-07-08 02:53:47 +03:30
"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" ,
2026-06-28 17:49:40 +03:30
"prevPage" : "Previous" ,
"nextPage" : "Next" ,
2026-06-28 22:56:56 +03:30
"pageSummary" : "Page {page} of {totalPages} ({total} cases)" ,
"statusLabel" : "Status"
} ,
"tasks" : {
"title" : "Tasks" ,
2026-07-07 15:31:09 +03:30
"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." ,
2026-06-28 22:56:56 +03:30
"loading" : "Loading tasks…" ,
2026-07-07 15:31:09 +03:30
"emptyList" : "No tasks match the current filters." ,
"emptyListOwner" : "No tasks match the current filters." ,
2026-06-28 22:56:56 +03:30
"noPermissionTitle" : "Tasks" ,
"noPermissionBody" : "You do not have permission to view tasks for this organization." ,
"fromClinic" : "From {name}" ,
"patientLabel" : "Patient" ,
"taskDate" : "{date}" ,
2026-07-07 15:31:09 +03:30
"teethLabel" : "Teeth {teeth}" ,
"importantBadge" : "Important" ,
"lastUpdatedBy" : "Updated by {name}" ,
2026-06-28 22:56:56 +03:30
"statusInProgress" : "In progress" ,
"statusCompleted" : "Completed" ,
2026-07-07 15:31:09 +03:30
"searchPlaceholder" : "Search patient or clinic…" ,
"filterClinic" : "Clinic" ,
"filterClinicAll" : "All clinics" ,
"filterStatus" : "Status" ,
"filterStatusAll" : "All statuses" ,
"showCompleted" : "Show completed" ,
"importantOnly" : "Important only" ,
"filterSentFrom" : "From" ,
"filterSentTo" : "To" ,
"sortBy" : "Sort by" ,
"sortDate" : "Date" ,
"sortStatus" : "Status" ,
"sortClinic" : "Clinic" ,
"sortPatient" : "Patient" ,
"sortImportant" : "Important" ,
2026-07-08 02:53:47 +03:30
"sortProsthesis" : "Prosthesis type" ,
"sortTaskType" : "Task type" ,
2026-07-07 17:14:31 +03:30
"sortDirection" : "Sort direction" ,
2026-07-07 15:31:09 +03:30
"clearFilters" : "Clear filters" ,
"commentsButton" : "Comments" ,
2026-06-28 22:56:56 +03:30
"errorLoadList" : "Failed to load tasks." ,
"errorUpdateTask" : "Failed to update task." ,
"pageSummary" : "Page {page} of {totalPages} ({total} tasks)"
2026-06-28 14:59:06 +03:30
} ,
2026-07-07 15:31:09 +03:30
"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." ,
2026-07-08 02:53:47 +03:30
"errorToggle" : "Failed to update comment visibility." ,
"send" : "Send comment" ,
"composerVisible" : "Visible to clinic" ,
"composerHidden" : "Hidden from clinic"
2026-07-07 15:31:09 +03:30
} ,
2026-06-20 14:51:43 +03:30
"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." ,
"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." ,
"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." ,
2026-06-28 17:14:02 +03:30
"subtitleEditPhase4" : "Plan treatment details first, then group lab-dependent work into shipments in the lab dispatch panel." ,
2026-06-20 14:51:43 +03:30
"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." ,
2026-06-28 21:45:33 +03:30
"treatmentPlanTitle" : "Treatment · {patientName}" ,
2026-06-20 14:51:43 +03:30
"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." ,
2026-06-28 17:14:02 +03:30
"detailsTitle" : "Treatment details" ,
"detailsSubtitle" : "Plan teeth, type, notes, and attachments for each detail line." ,
"addDetail" : "Add detail" ,
"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." ,
2026-06-20 14:51:43 +03:30
"addCase" : "Add case" ,
"caseLabel" : "Case {n}" ,
"comments" : "Comments" ,
"commentsPlaceholder" : "Write clinical notes for this case…" ,
"treatmentType" : "Treatment type" ,
"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." ,
"sendThisCase" : "Send this case" ,
2026-06-28 17:14:02 +03:30
"labDispatchTitle" : "Lab dispatch" ,
"labDispatchSubtitle" : "Group lab-dependent details into shipments and send them to linked labs." ,
2026-06-28 18:08:29 +03:30
"labDispatchSendHint" : "Shipment grouping is saved when you send to the lab." ,
2026-06-28 17:14:02 +03:30
"addLabShipment" : "Add lab shipment" ,
"labShipmentLabel" : "Shipment {n}" ,
"includeDetails" : "Include treatment details" ,
2026-06-28 18:48:06 +03:30
"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." ,
2026-06-28 17:14:02 +03:30
"labDetailLine" : "Detail {n} · {type} · {teeth}" ,
2026-07-06 20:40:19 +03:30
"noLabDetails" : "No prosthesis treatment details yet. Add prosthesis in treatment details above." ,
2026-06-28 17:14:02 +03:30
"labDispatchEmpty" : "Add a lab shipment to group details and send them to a lab." ,
2026-07-06 20:40:19 +03:30
"prosthesisTypesTitle" : "Prosthesis types" ,
"prosthesisApplyAll" : "Apply to all teeth" ,
"prosthesisSelectPlaceholder" : "Select prosthesis type…" ,
"prosthesisColTooth" : "Tooth" ,
"prosthesisColDetail" : "Detail" ,
"prosthesisColType" : "Prosthesis type" ,
2026-06-28 17:14:02 +03:30
"selectLab" : "Destination lab" ,
"selectLabPlaceholder" : "Choose a linked lab…" ,
"sendToLab" : "Send to lab" ,
"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." ,
2026-06-20 14:51:43 +03:30
"unsavedChanges" : "Unsaved changes" ,
2026-06-28 18:08:29 +03:30
"saveStatusSaving" : "Saving…" ,
"saveStatusSaved" : "All changes saved" ,
"saveStatusError" : "Could not save — check your connection" ,
2026-06-20 14:51:43 +03:30
"sendSavesFirst" : "Sending is per case and saves first automatically." ,
"historyTitle" : "Previous treatments" ,
2026-06-28 21:45:33 +03:30
"historySubtitle" : "Click a treatment to preview it. Use Open in the preview card to load it in the workspace." ,
2026-06-20 14:51:43 +03:30
"loadingHistory" : "Loading history…" ,
2026-06-28 21:45:33 +03:30
"historyEmpty" : "No other treatments recorded for this patient yet." ,
"historyDetailLabel" : "Detail {n} · {type}" ,
"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." ,
2026-06-20 14:51:43 +03:30
"teethLabel" : "Teeth:" ,
"teethNone" : "None selected" ,
2026-06-28 21:45:33 +03:30
"historicalReadonlyNotice" : "You are viewing a past treatment (read-only)." ,
"errorNoAppointmentForTreatment" : "This treatment has no linked appointment and cannot be opened." ,
2026-06-20 14:51:43 +03:30
"noCases" : "No cases in this treatment." ,
2026-06-28 21:45:33 +03:30
"noDetails" : "No treatment details yet." ,
2026-06-20 14:51:43 +03:30
"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" ,
2026-07-07 18:43:10 +03:30
"toothChartTitleCompact" : "Tooth chart" ,
2026-06-28 17:14:02 +03:30
"toothChartHint" : "Tap teeth to multi-select. Applies to the active detail." ,
2026-07-07 18:43:10 +03:30
"toothChartWholePlan" : "Show whole treatment plan" ,
"labShipmentAttachments" : "Files for the lab" ,
"labShipmentAttachmentsHint" : "Select which attachments from this detail are included in this shipment. None are sent by default." ,
2026-06-20 14:51:43 +03:30
"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" ,
2026-06-28 23:19:33 +03:30
"counterpartLab" : "Lab" ,
"viewCaseHistory" : "View case history" ,
"caseHistoryBackToConnections" : "← Back to connections" ,
"caseHistoryTitle" : "Case history with {name}" ,
"caseHistorySubtitleClinic" : "Cases you sent to this lab, including lab workflow status for each step." ,
"caseHistorySubtitleLab" : "Cases received from this clinic, including task status for each step." ,
"caseHistoryEmpty" : "No cases exchanged with this organization yet." ,
"caseHistorySentToLab" : "Sent to {name}" ,
"caseHistoryErrorLoadList" : "Failed to load case history." ,
"caseHistoryErrorLoadDetail" : "Failed to load case details."
2026-06-20 14:51:43 +03:30
} ,
"settings" : {
"accountTitle" : "Account" ,
"accountSubtitle" : "Profile and security settings for your login." ,
"accountPlaceholder" : "Password change and profile editing will be wired here next (e.g. invite flow, reset password)." ,
2026-07-04 00:01:58 +03:30
"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." ,
2026-06-20 14:51:43 +03:30
"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" ,
"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"
2026-06-20 12:37:38 +03:30
}
}