Files
dyolink/frontend/messages/en.json
Admin 22466490bf Add Today dashboard foundation with permission-aware KPI summary API.
Replace hardcoded Today cards with a backend summary endpoint and composable frontend widgets filtered by org type and tab permissions.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-11 00:07:48 +03:30

766 lines
35 KiB
JSON

{
"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"
},
"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",
"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",
"widgetTasksInProgress": "Tasks In Progress",
"widgetImportantTasks": "Important Tasks",
"widgetPendingConnections": "Pending Connections",
"widgetSeats": "Seat Usage",
"widgetPendingStaffInvites": "Pending Staff Invites"
},
"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": "-"
},
"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}",
"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",
"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.",
"filterClinic": "Clinic",
"filterClinicAll": "All clinics",
"filterTreatmentType": "Treatment type",
"filterTreatmentTypeAll": "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"
},
"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",
"showCompleted": "Show completed",
"importantOnly": "Important only",
"filterSentFrom": "From",
"filterSentTo": "To",
"sortBy": "Sort by",
"sortDate": "Date",
"sortStatus": "Status",
"sortClinic": "Clinic",
"sortPatient": "Patient",
"sortImportant": "Important",
"sortProsthesis": "Prosthesis type",
"sortTaskType": "Task type",
"sortDirection": "Sort direction",
"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.",
"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.",
"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",
"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",
"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",
"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",
"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.",
"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",
"historySubtitle": "Click a treatment to preview it. Use Open in the preview card to load it in the workspace.",
"loadingHistory": "Loading history…",
"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.",
"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.",
"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",
"toothChartTitleCompact": "Tooth chart",
"toothChartHint": "Tap teeth to multi-select. Applies to the active detail.",
"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.",
"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}",
"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."
},
"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).",
"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",
"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"
}
}