Files
temetro/frontend/lib/i18n/locales/en/translation.json
T
Khalid Abdi d30c310336 feat(chat): replace model picker with situation modes (Chat/Analysis/Graph)
The composer's SELECT is now a clinician-facing mode picker instead of a list
of LLM vendors (the model still comes from Settings → AI and continues to drive
the Veil consent gate). The mode travels with each send:

- backend appends an Analysis/Graph directive to the agent's system prompt
- Graph mode renders an Obsidian-style RecordGraph for the /patient fast-path
  (new data-recordGraph message part reusing the shared graph component)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 19:30:12 +03:00

1497 lines
55 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"common": {
"appName": "temetro",
"email": "Email",
"password": "Password",
"signIn": "Sign in",
"signUp": "Sign up",
"backToSignIn": "Back to sign in",
"addedByAi": "Added by AI"
},
"auth": {
"login": {
"title": "Welcome back",
"subtitle": "Sign in to your clinician account",
"tabEmail": "Email",
"tabUsername": "Username",
"emailLabel": "Email",
"emailPlaceholder": "you@clinic.org",
"usernameLabel": "Username",
"usernamePlaceholder": "jdoe",
"passwordLabel": "Password",
"forgotPassword": "Forgot your password?",
"submit": "Sign in",
"submitting": "Signing in…",
"noAccount": "Don't have an account?",
"signUpLink": "Sign up",
"error": "Could not sign in. Check your email and password and try again.",
"errorTitle": "Sign in failed",
"welcomeBack": "Welcome back"
},
"signup": {
"title": "Create your account",
"subtitle": "Start using temetro in your clinic",
"nameLabel": "Full name",
"namePlaceholder": "Dr. Jane Okafor",
"emailLabel": "Email",
"emailPlaceholder": "you@clinic.org",
"passwordLabel": "Password",
"confirmPasswordLabel": "Confirm password",
"passwordHint": "Must be at least {{count}} characters long.",
"passwordTooShort": "Password must be at least {{count}} characters.",
"passwordMismatch": "Passwords do not match.",
"submit": "Create account",
"submitting": "Creating account…",
"haveAccount": "Already have an account?",
"signInLink": "Sign in",
"error": "Could not create your account.",
"errorTitle": "Sign up failed",
"created": "Account created",
"createdHint": "Set up your clinic to get started."
},
"verifyEmail": {
"title": "Check your inbox",
"subtitle": "We sent a verification link to {{email}}. Open it to activate your account.",
"subtitleNoEmail": "Open the verification link we emailed you to activate your account.",
"continue": "I've verified — continue",
"resend": "Resend email",
"resending": "Sending…",
"resent": "Verification email sent. Check your inbox.",
"resendError": "Could not resend the verification email."
},
"forgotPassword": {
"title": "Reset your password",
"subtitle": "We'll email you a link to reset your password",
"emailLabel": "Email",
"emailPlaceholder": "you@clinic.org",
"submit": "Send reset link",
"submitting": "Sending…",
"sent": "If an account exists for {{email}}, a reset link is on its way. Check your inbox.",
"error": "Could not send the reset email.",
"failedToastTitle": "Couldn't send reset link",
"sentToastTitle": "Reset link sent",
"sentToastBody": "Check your inbox for the link."
},
"resetPassword": {
"title": "Set a new password",
"subtitle": "Choose a new password for your account",
"passwordLabel": "New password",
"confirmLabel": "Confirm new password",
"passwordHint": "At least {{count}} characters.",
"submit": "Reset password",
"submitting": "Saving…",
"done": "Your password has been reset. Redirecting you to sign in…",
"invalidToken": "This reset link is invalid or has expired.",
"tooShort": "Password must be at least {{count}} characters.",
"mismatch": "Passwords do not match.",
"error": "Could not reset your password.",
"failedToastTitle": "Couldn't reset password",
"successToastTitle": "Password updated",
"successToastBody": "Redirecting you to sign in…"
},
"acceptInvite": {
"notFoundTitle": "Invitation not found",
"notFoundBody": "This invitation link is missing or invalid.",
"invitedTitle": "You've been invited",
"invitedSubtitle": "Sign in with the email this invitation was sent to, then return to this link to accept.",
"signIn": "Sign in",
"createAccount": "Create an account",
"reopenPrefix": "After signing in, reopen",
"reopenLink": "this invitation link",
"acceptTitle": "Accept your invitation",
"acceptSubtitle": "Join the clinic you were invited to on temetro.",
"accept": "Accept invitation",
"accepting": "Joining…",
"error": "This invitation is invalid or has expired."
},
"onboarding": {
"title": "Set up your clinic",
"subtitle": "Create your clinic to start organizing patient records"
}
},
"nav": {
"newChat": "New chat",
"patients": "Patients",
"appointments": "Appointments",
"invoices": "Invoices",
"prescriptions": "Prescriptions",
"analysis": "Analysis",
"pharmacy": "Pharmacy",
"inventory": "Inventory",
"lab": "Lab",
"notes": "Notes",
"messages": "Messages",
"tasks": "Tasks",
"activity": "Activity",
"settings": "Settings",
"notifications": "Notifications",
"notificationsEmpty": "You're all caught up.",
"quickNav": "Quick nav",
"commandGroup": "Go to",
"commandPlaceholder": "Search pages…",
"commandEmpty": "No results.",
"commandNavigate": "Navigate",
"commandOpen": "Open",
"commandClose": "Close"
},
"userMenu": {
"defaultName": "Clinician",
"selectClinic": "Select clinic",
"settings": "Settings",
"docs": "Docs & GitHub",
"theme": "Theme",
"dark": "Dark",
"light": "Light",
"search": "Search",
"noClinic": "No clinic selected",
"clinicCount_one": "{{count}} clinic",
"clinicCount_other": "{{count}} clinics",
"switchClinic": "Switch clinic",
"createClinic": "Create clinic",
"logout": "Log out",
"createDialogTitle": "Create clinic",
"createDialogDescription": "Add a new clinic and switch to it.",
"signOutFailed": "Sign out failed",
"tryAgain": "Please try again.",
"signedOut": "Signed out"
},
"clinic": {
"create": "Create clinic",
"creating": "Creating clinic…",
"nameLabel": "Clinic name",
"namePlaceholder": "North Side Family Practice",
"slugLabel": "Clinic URL slug",
"slugPlaceholder": "north-side-family-practice",
"slugHint": "Used in links and invitations. Lowercase letters, numbers and dashes.",
"createError": "Could not create the clinic.",
"createFailedTitle": "Couldn't create clinic",
"createdTitle": "Clinic created",
"createdBody": "{{name}} is ready."
},
"patients": {
"title": "Patients",
"searchPlaceholder": "Search name or MRN",
"add": "Add patient",
"loading": "Loading patients…",
"empty": "No patients found.",
"loadError": "Failed to load patients.",
"columns": {
"name": "Name",
"mrn": "MRN",
"ageSex": "Age · Sex",
"status": "Status",
"lastSeen": "Last seen",
"allergies": "Allergies"
},
"status": {
"active": "Active",
"inpatient": "Inpatient",
"discharged": "Discharged"
},
"detail": {
"notFound": "Patient not found",
"loading": "Loading patient…",
"noPatientForFile": "No patient found for file #{{number}}."
},
"transfer": {
"action": "Transfer",
"title": "Transfer patient",
"description": "Reassign {{name}} to another clinician. They become this patient's primary provider.",
"providerLabel": "New primary provider",
"choose": "Choose a provider…",
"cancel": "Cancel",
"confirm": "Transfer patient",
"transferring": "Transferring…",
"successTitle": "Patient transferred",
"successBody": "{{name}} is now with {{provider}}.",
"errorTitle": "Couldn't transfer patient",
"error": "Please try again."
},
"delete": {
"action": "Delete patient",
"title": "Delete patient?",
"body": "Permanently delete {{name}}'s chart and all of its records. This cannot be undone.",
"confirm": "Delete patient",
"cancel": "Cancel",
"doneTitle": "Patient deleted",
"failedTitle": "Couldn't delete patient",
"failedBody": "Please try again."
}
},
"appointments": {
"title": "Appointments & Schedule",
"subtitle": "Today's clinic schedule and what's coming up.",
"searchPlaceholder": "Search patient, type, provider",
"calendar": "Calendar",
"add": "Add",
"noMatches": "No matching appointments.",
"today": "Today",
"nothingToday": "Nothing scheduled today.",
"addFailedTitle": "Couldn't add appointment",
"addFailedBody": "Please try again.",
"kpi": {
"today": "Today",
"thisWeek": "This week",
"checkedIn": "Checked in",
"completed": "Completed"
},
"status": {
"confirmed": "Confirmed",
"checked-in": "Checked in",
"completed": "Completed",
"cancelled": "Cancelled"
},
"dialog": {
"title": "New appointment",
"description": "Search for a patient by name or file number, then set the slot.",
"patient": "Patient",
"fileNumber": "File #{{number}}",
"change": "Change",
"searchPlaceholder": "Search name or file number",
"noPatients": "No patients found.",
"noProviders": "No doctors found.",
"date": "Date",
"time": "Time",
"type": "Type",
"provider": "Provider",
"providerPlaceholder": "e.g. Dr. Okafor",
"cancel": "Cancel",
"submit": "Add appointment",
"pickPatientTitle": "Pick a patient",
"pickPatientBody": "Search and select a patient first.",
"addedTitle": "Appointment added"
},
"sheet": {
"title": "Appointment",
"editHint": "Click any appointment to edit — this is enabled.",
"date": "Date",
"time": "Time",
"type": "Type",
"provider": "Provider",
"status": "Status",
"save": "Save changes",
"saving": "Saving…",
"delete": "Delete",
"savedTitle": "Appointment updated",
"savedBody": "Your changes were saved.",
"saveFailedTitle": "Couldn't save",
"saveFailedBody": "Please try again.",
"deletedTitle": "Appointment deleted",
"deleteFailedTitle": "Couldn't delete",
"deleteFailedBody": "Please try again."
},
"calendarDialog": {
"today": "Today",
"appointmentCount_one": "{{count}} appointment",
"appointmentCount_other": "{{count}} appointments",
"none": "No appointments on this day."
}
},
"invoices": {
"title": "Invoices",
"subtitle": "Patient billing — create, split, and export invoices.",
"searchPlaceholder": "Search patient, number, status",
"new": "New invoice",
"empty": "No invoices yet.",
"noMatches": "No invoices match your search.",
"loadError": "Couldn't load invoices.",
"recent": "Invoices",
"recentDescription": "Most recent first",
"addFailedTitle": "Couldn't save invoice",
"addFailedBody": "Please try again.",
"kpi": {
"outstanding": "Outstanding",
"paid": "Paid",
"drafts": "Drafts"
},
"status": {
"draft": "Draft",
"sent": "Sent",
"paid": "Paid",
"void": "Void"
},
"dialog": {
"createTitle": "New invoice",
"editTitle": "Edit invoice",
"description": "Pick a patient and add line items.",
"patient": "Patient",
"searchPlaceholder": "Search name or file number",
"noPatients": "No patients found.",
"fileNumber": "File #{{number}}",
"change": "Change",
"issued": "Issued",
"due": "Due date",
"status": "Status",
"notes": "Notes",
"notesPlaceholder": "Optional notes…",
"lineItems": "Line items",
"lineDescription": "Description",
"lineDescriptionPlaceholder": "e.g. Consultation",
"qty": "Qty",
"unitPrice": "Unit price",
"addLine": "Add line",
"total": "Total",
"cancel": "Cancel",
"create": "Create invoice",
"save": "Save changes",
"saving": "Saving…",
"pickPatientTitle": "Pick a patient",
"pickPatientBody": "Search and select a patient first."
},
"sheet": {
"fallbackTitle": "Invoice",
"issued": "Issued",
"due": "Due",
"status": "Status",
"total": "Total",
"lineItems": "Line items",
"installments": "Installments",
"noInstallments": "Not split into installments.",
"split": "Split into installments",
"splitTitle": "Split invoice",
"splitBody": "Divide the total into equal monthly installments.",
"splitCount": "Installments",
"splitConfirm": "Split",
"download": "Download PDF",
"edit": "Edit",
"delete": "Delete",
"deletedTitle": "Invoice deleted",
"splitFailedTitle": "Couldn't split invoice",
"splitFailedBody": "Please try again.",
"deleteFailedTitle": "Couldn't delete invoice",
"deleteFailedBody": "Please try again.",
"paid": "Paid",
"unpaid": "Unpaid",
"markPaid": "Mark paid",
"paidTitle": "Invoice marked paid",
"payFailedTitle": "Couldn't record payment",
"payFailedBody": "Please try again.",
"payInstallment": "Pay",
"installmentPaid": "Paid",
"installmentPaidTitle": "Installment paid",
"overdue": "Overdue",
"timeframe": "{{count}} payments · due through {{date}}"
}
},
"prescriptions": {
"title": "Prescriptions",
"subtitle": "Medications prescribed across the clinic.",
"new": "New prescription",
"recent": "Recent prescriptions",
"recentDescription": "Most recent first",
"searchPlaceholder": "Search patient, medication, prescriber",
"noMatches": "No prescriptions match your search.",
"emptyList": "No prescriptions yet.",
"addFailedTitle": "Couldn't add prescription",
"addFailedBody": "Please try again.",
"kpi": {
"active": "Active",
"completed": "Completed",
"expired": "Expired"
},
"status": {
"active": "Active",
"completed": "Completed",
"expired": "Expired"
},
"detail": {
"fallbackTitle": "Prescription",
"fileNumber": "File #{{number}}",
"medication": "Medication",
"dose": "Dose",
"frequency": "Frequency",
"duration": "Duration",
"prescriber": "Prescriber",
"date": "Date",
"status": "Status",
"notes": "Notes",
"courseDates": "Course",
"delete": "Delete prescription"
},
"delete": {
"title": "Delete prescription?",
"body": "Permanently delete the {{medication}} prescription for {{name}}. This cannot be undone.",
"confirm": "Delete",
"cancel": "Cancel",
"doneTitle": "Prescription deleted",
"failedTitle": "Couldn't delete prescription",
"failedBody": "Please try again."
},
"dialog": {
"title": "New prescription",
"description": "Search for a patient by name or file number, then set the medication.",
"patient": "Patient",
"fileNumber": "File #{{number}}",
"change": "Change",
"searchPlaceholder": "Search name or file number",
"noPatients": "No patients found.",
"medication": "Medication",
"medicationPlaceholder": "e.g. Amoxicillin",
"dose": "Dose",
"dosePlaceholder": "e.g. 500 mg",
"frequency": "Frequency",
"duration": "Duration",
"durationOtherPlaceholder": "e.g. 21 days",
"notes": "Notes",
"notesPlaceholder": "Instructions, e.g. take with food in the morning",
"interactionTitle": "Possible interaction",
"cancel": "Cancel",
"submit": "Add prescription",
"pickPatientTitle": "Pick a patient",
"pickPatientBody": "Search and select a patient first.",
"needMedTitle": "Add a medication",
"needMedBody": "Enter the medication name.",
"needDurationTitle": "Add a duration",
"needDurationBody": "Enter the custom duration.",
"addedTitle": "Prescription added",
"badDatesTitle": "Check the dates",
"badDatesBody": "The end date can't be before the start date.",
"outOfStock": "Out of stock",
"inStock": "{{count}} in stock",
"courseDates": "Course dates",
"removeDates": "Remove",
"startDate": "Start date",
"endDate": "End date",
"addDates": "Add start/end dates"
}
},
"pharmacy": {
"title": "Pharmacy",
"subtitle": "Dispensing queue for the clinic's prescriptions.",
"searchPlaceholder": "Search prescriptions",
"kpi": {
"active": "Active prescriptions",
"expiring": "Expiring soon",
"patients": "Patients on medication"
},
"queue": {
"title": "Dispensing queue",
"description": "Active prescriptions, oldest first. Mark a course completed once dispensed.",
"empty": "No active prescriptions.",
"noMatches": "No prescriptions match your search."
},
"expiringBadge": "Expiring",
"markCompleted": "Mark completed",
"completedTitle": "Prescription completed",
"completedBody": "{{medication}} for {{name}} marked as completed.",
"completeFailedTitle": "Couldn't update prescription",
"completeFailedBody": "Please try again.",
"dispense": "Dispense",
"dispensedTitle": "Dispensed",
"dispensedBody": "{{medication}} dispensed to {{name}}.",
"dispensed": {
"title": "Recently dispensed",
"description": "Medications handed to patients at the pharmacy.",
"empty": "Nothing dispensed yet.",
"delete": "Delete record",
"deleteTitle": "Delete dispense record?",
"deleteBody": "Remove the {{medication}} dispense record for {{name}}. This only corrects the ledger.",
"deleteConfirm": "Delete",
"deleteCancel": "Cancel",
"deletedTitle": "Dispense record deleted",
"deleteFailedTitle": "Couldn't delete record",
"deleteFailedBody": "Please try again."
}
},
"inventory": {
"title": "Inventory",
"subtitle": "Search the pharmacy's medication stock and check availability.",
"searchPlaceholder": "Search medications",
"kpi": {
"total": "Medications in stock",
"low": "Low stock",
"out": "Out of stock"
},
"list": {
"title": "Medications",
"description": "Current stock levels across the pharmacy. Items at or below their reorder point are flagged.",
"empty": "No medications in inventory yet.",
"noMatches": "No medications match your search."
},
"stock": "{{count}} {{unit}}",
"reorderAt": "Reorder at {{count}}",
"location": "Shelf {{location}}",
"availability": {
"in-stock": "In stock",
"low": "Low stock",
"out": "Out of stock"
},
"addItem": "Add item",
"dialog": {
"title": "Add inventory item",
"description": "Add a medication to the pharmacy's stock. Only the name is required.",
"name": "Medication",
"namePlaceholder": "e.g. Amoxicillin",
"form": "Form",
"formPlaceholder": "e.g. Tablet",
"strength": "Strength",
"strengthPlaceholder": "e.g. 500mg",
"stock": "In stock",
"unit": "Unit",
"unitPlaceholder": "e.g. tablets",
"reorder": "Reorder at",
"location": "Location",
"locationPlaceholder": "e.g. A3",
"expires": "Expires",
"cancel": "Cancel",
"submit": "Add item",
"nameRequiredTitle": "Medication name required",
"nameRequiredBody": "Enter a medication name before adding the item.",
"addedTitle": "Item added",
"failedTitle": "Could not add item",
"failedBody": "Something went wrong. Please try again."
},
"detail": {
"description": "Stock item",
"notes": "Notes",
"close": "Close",
"delete": "Delete item"
},
"delete": {
"title": "Delete inventory item?",
"body": "Permanently delete {{name}} from inventory. This cannot be undone.",
"confirm": "Delete",
"cancel": "Cancel",
"doneTitle": "Item deleted",
"failedTitle": "Couldn't delete item",
"failedBody": "Please try again."
}
},
"lab": {
"title": "Lab",
"subtitle": "The lab's work queue and analysis results.",
"queue": {
"title": "Work queue",
"description": "Tasks assigned to the Lab department.",
"empty": "No lab tasks right now.",
"noNotes": "No details provided.",
"meta": {
"status": "Status",
"patient": "Patient",
"assignee": "Assignee",
"createdBy": "Created by"
}
},
"addResult": {
"button": "Add result",
"title": "Add analysis result",
"description": "Record an analysis performed in the lab on a patient's record.",
"patient": "Patient",
"patientPlaceholder": "Search by name or file number",
"noPatients": "No patients match your search.",
"changePatient": "Change",
"test": "Test",
"testPlaceholder": "e.g. Hemoglobin",
"value": "Value",
"valuePlaceholder": "e.g. 14.2 g/dL",
"valueUnitPlaceholder": "e.g. value in {{unit}}",
"flag": "Flag",
"takenAt": "Date",
"advanced": "Advanced",
"advancedHint": "Record a custom analysis with a reference range.",
"refRange": "Reference range",
"refRangePlaceholder": "e.g. 13.017.0 g/dL",
"cancel": "Cancel",
"submit": "Add result",
"needPatientTitle": "Pick a patient",
"needPatientBody": "Search and select a patient first.",
"needFieldsTitle": "Missing details",
"needFieldsBody": "Enter the test name and its value.",
"addedTitle": "Result added",
"addedBody": "{{test}} added to {{name}}'s record.",
"failedTitle": "Couldn't add the result",
"failedBody": "Please try again."
},
"recent": {
"title": "Recent results",
"description": "Analyses recorded on patient records, newest first.",
"empty": "No results recorded yet.",
"delete": "Delete result",
"deleteTitle": "Delete lab result?",
"deleteBody": "Remove the {{test}} result from {{name}}'s record. This cannot be undone.",
"deleteConfirm": "Delete",
"deleteCancel": "Cancel",
"deletedTitle": "Result deleted",
"deletedBody": "Removed {{test}} from {{name}}'s record.",
"deleteFailedTitle": "Couldn't delete result",
"deleteFailedBody": "Please try again."
},
"toast": {
"updateFailedTitle": "Couldn't update the task",
"updateFailedBody": "Please try again."
}
},
"tasks": {
"title": "Tasks",
"subtitle": "Care-team to-dos. Click a task to see its details.",
"new": "New task",
"empty": "No tasks here.",
"markDone": "Mark as done",
"markNotDone": "Mark as not done",
"status": {
"todo": "To Do",
"in_progress": "In Progress",
"done": "Done"
},
"board": {
"addTask": "Add task",
"moveTo": "Move to",
"emptyColumn": "No tasks.",
"newTask": "New task"
},
"filters": {
"all": "All",
"open": "Open",
"done": "Done"
},
"priority": {
"high": "High",
"medium": "Medium",
"low": "Low"
},
"dialog": {
"title": "New task",
"description": "Assign a follow-up to the care team.",
"subject": "Subject",
"subjectPlaceholder": "e.g. Review lab results",
"details": "Details — what needs to be done",
"detailsPlaceholder": "Describe what needs to happen, any context, links…",
"assignee": "Assignee",
"assigneeSelf": "Myself",
"assigneeOther": "Other",
"department": "Department",
"due": "Due",
"duePlaceholder": "e.g. Today",
"priorityLabel": "Priority",
"statusLabel": "Status",
"cancel": "Cancel",
"add": "Add task"
},
"list": {
"forDept": "For {{dept}}",
"personal": "Personal",
"byCreator": "by {{name}}"
},
"detail": {
"fallbackTitle": "Task",
"priorityBadge": "{{priority}} priority",
"status": "Status",
"completed": "Completed",
"open": "Open",
"assignedTo": "Assigned to",
"createdBy": "Created by",
"deptTeam": "{{dept}} team",
"personal": "Personal task",
"due": "Due",
"patient": "Patient",
"details": "Details",
"reopen": "Reopen task",
"complete": "Mark complete",
"moveTo": "Move to",
"delete": "Delete task"
},
"delete": {
"title": "Delete task?",
"body": "Permanently delete \"{{title}}\". This cannot be undone.",
"confirm": "Delete",
"cancel": "Cancel",
"doneTitle": "Task deleted",
"failedTitle": "Couldn't delete task",
"failedBody": "Please try again."
},
"toast": {
"needSubjectTitle": "Add a subject",
"needSubjectBody": "Describe the task first.",
"addedTitle": "Task added",
"addFailedTitle": "Couldn't add task",
"addFailedBody": "Please try again.",
"updateFailedTitle": "Couldn't update task",
"updateFailedBody": "Please try again."
}
},
"messages": {
"inbox": "Inbox",
"unread": "Unread · {{count}}",
"newMessage": "New message",
"searchPlaceholder": "Search conversations",
"noMatches": "No conversations match your search.",
"noUnread": "No unread messages.",
"noConversations": "No conversations yet.",
"you": "You: ",
"directMessage": "Direct message",
"peopleCount": "{{count}} people",
"messagePlaceholder": "Message {{name}}…",
"send": "Send",
"emptyTitle": "No conversation selected",
"emptyDescription": "Choose a conversation from the inbox, or start a new one.",
"startConversation": "Start a conversation",
"today": "Today",
"yesterday": "Yesterday",
"compose": {
"title": "New message",
"description": "Start a conversation with a member of your clinic.",
"searchPlaceholder": "Search people",
"noMatches": "No people match your search.",
"noMembers": "No other clinic members yet. Invite colleagues from Settings → Care team."
},
"startFailedTitle": "Couldn't start conversation",
"startFailedBody": "Please try again.",
"attach": {
"menu": "Attach",
"file": "Files",
"appointment": "Appointments",
"remove": "Remove",
"uploading": "Uploading…",
"uploadFailedTitle": "Couldn't attach file",
"uploadFailedBody": "The file may be too large (max 10MB). Please try again.",
"tooLargeTitle": "File too large",
"tooLargeBody": "Attachments are limited to 10MB.",
"download": "Download",
"apptDialogTitle": "Share an appointment",
"apptDialogDescription": "Search by patient name, then pick an appointment to attach.",
"apptSearchPlaceholder": "Patient name…",
"apptNoMatches": "No appointments match.",
"apptEmpty": "No appointments yet.",
"apptCardLabel": "Appointment",
"apptDetailTitle": "Appointment details",
"apptWhen": "When",
"apptType": "Type",
"apptProvider": "Provider",
"apptPatient": "Patient",
"apptStatus": "Status"
}
},
"analysis": {
"title": "Analysis",
"subtitle": "Clinic performance at a glance, computed from your clinic's data.",
"area": {
"title": "Patient visits",
"subtitle": "Visit volume over the last six months.",
"label": "Total visits"
},
"patientVolume": {
"title": "Patient volume",
"description": "New, active and total patients",
"total": "Total patients",
"newThisMonth": "New this month",
"active": "Active patients"
},
"earnings": {
"title": "Earnings",
"description": "Billed, paid and outstanding — from invoices",
"billed": "Total billed",
"paid": "Total paid",
"outstanding": "Outstanding",
"byMonth": "Billed vs paid, by month"
},
"appointments": {
"title": "Appointments & schedule",
"description": "Bookings, attendance and what's coming up",
"thisWeek": "This week",
"upcoming": "Upcoming",
"completed": "Completed",
"cancelled": "Cancelled"
},
"prescriptions": {
"title": "Prescriptions",
"description": "Medications prescribed",
"total": "Total issued",
"active": "Active"
},
"tasks": {
"title": "Tasks",
"description": "Care-team workload",
"open": "Open",
"completed": "Completed"
},
"charts": {
"title": "Trends",
"subtitle": "Patient growth and weekly appointment volume.",
"viewDetails": "Tap for details",
"patientGrowthTitle": "New patients",
"patientGrowthDescription": "New patients per month over the last 6 months",
"weeklyAppointmentsTitle": "Appointments this week",
"weeklyAppointmentsDescription": "Bookings per day for the current week",
"empty": "No data yet"
}
},
"activity": {
"title": "Activity",
"subtitle": "An audit log of record changes across the clinic.",
"changesToday": "Changes today",
"thisWeek": "This week",
"totalRecorded": "Total recorded",
"empty": "No activity yet. Changes to patients, notes, appointments, prescriptions and tasks will appear here.",
"detail": {
"title": "Activity detail",
"person": "Performed by",
"record": "Record type",
"patient": "Patient",
"reference": "Reference",
"time": "Time",
"close": "Close",
"entityTypes": {
"patient": "Patient",
"note": "Note",
"appointment": "Appointment",
"prescription": "Prescription",
"task": "Task"
}
}
},
"notes": {
"title": "Notes",
"subtitle": "Clinical notes. Click a note to open it.",
"new": "New note",
"editNote": "Edit note",
"loading": "Loading…",
"emptyTitle": "No notes yet",
"emptyDescription": "Create a note to start writing.",
"untitled": "Untitled note",
"updated": "Updated {{date}}",
"tryAgain": "Please try again.",
"loadFailed": "Couldn't load notes",
"saved": "Note saved",
"saveFailed": "Couldn't save note",
"deleted": "Note deleted",
"deleteFailed": "Couldn't delete note",
"editor": {
"placeholder": "Write your note…",
"titlePlaceholder": "Note title",
"delete": "Delete note",
"save": "Save",
"saving": "Saving…",
"bold": "Bold",
"italic": "Italic",
"underline": "Underline",
"heading1": "Heading 1",
"heading2": "Heading 2",
"bulletList": "Bullet list",
"numberedList": "Numbered list",
"undo": "Undo",
"redo": "Redo",
"confirmTitle": "Delete this note?",
"confirmDescription": "\"{{name}}\" will be permanently deleted. This can't be undone.",
"confirmLabel": "Delete note"
}
},
"chat": {
"heading": "Which patient would you like to look up?",
"input": {
"placeholder": "Ask anything, or type /patient 10293",
"message": "Message",
"addPatient": "Add patient",
"attachFile": "Attach file",
"attachFiles": "Attach files",
"removeFile": "Remove {{name}}",
"dictate": "Dictate",
"send": "Send",
"stop": "Stop",
"model": "Model",
"mode": "Mode",
"modes": {
"chat": {
"label": "Chat",
"description": "Ask and retrieve patient information."
},
"analysis": {
"label": "Analysis",
"description": "Interpret patterns across a patient's history."
},
"graph": {
"label": "Graph",
"description": "See how problems and visits connect."
}
},
"moreModels": "More models",
"effort": "Effort",
"effortOptions": {
"low": "Low",
"medium": "Medium",
"high": "High"
},
"models": {
"opus48": "For complex clinical reasoning",
"sonnet46": "Balanced for everyday tasks",
"haiku45": "Fastest for quick answers",
"gemini25Pro": "Googles most capable model",
"gemini25Flash": "Fast Google model",
"gemini20Flash": "Lightweight Google model",
"gpt4o": "OpenAI multimodal flagship",
"gpt4oMini": "Fast, low-cost OpenAI model",
"ollama": "Runs locally on your infrastructure"
}
},
"patientNotFound": "I couldn't find a patient with file number {{fileNumber}}.",
"thinking": "Thinking…",
"steps": "Steps",
"reasoning": "Reasoning",
"graphCard": {
"label": "Record graph"
},
"history": {
"title": "Chats",
"untitled": "New chat",
"empty": "No saved chats yet.",
"delete": "Delete chat"
},
"suggestions": {
"schedule": "Show today's schedule",
"tasks": "List open tasks",
"prescriptions": "Show recent prescriptions",
"import": "Import a patient database"
},
"queue": {
"label": "Queued · {{count}}",
"remove": "Remove from queue",
"attachmentsOnly": "{{count}} attachment(s)"
},
"veil": {
"title": "Veil",
"body": "This message will be processed by {{provider}}, an external provider. Veil de-identifies patient information (names, MRNs, providers) before it leaves your infrastructure, and restores it in the answer.",
"cancel": "Cancel",
"useLocal": "Use local model",
"confirm": "De-identify & send",
"activeChip": "Veil active · {{provider}}"
},
"actionCard": {
"title": {
"appointment": "Proposed appointment",
"task": "Proposed task",
"prescription": "Proposed prescription",
"invoice": "Proposed invoice",
"inventory": "Proposed inventory"
},
"kind": {
"appointment": "Appointment added.",
"task": "Task added.",
"prescription": "Prescription added.",
"invoice": "Invoice added.",
"inventory": "Inventory updated."
},
"inventoryItems": "{{count}} item(s)",
"approve": "Add",
"adding": "Adding…",
"discard": "Discard",
"added": "Added.",
"discarded": "Discarded — nothing was saved.",
"addedTitle": "Added",
"failedTitle": "Could not add",
"failedBody": "Something went wrong, or you don't have permission. Please try again.",
"batch": {
"title": "{{count}} records proposed",
"review": "Review & add",
"dialogTitle": "Review proposed records",
"dialogDescription": "Add them all at once, or remove any you don't want.",
"addAll": "Add all",
"adding": "Adding…",
"discardAll": "Discard all",
"newPatient": "New patient will be created",
"remove": "Remove",
"done": "Added {{added}} of {{total}}.",
"failedCount": "{{count}} failed",
"discarded": "Discarded — nothing was saved."
}
},
"lists": {
"appointments": "Appointments",
"tasks": "Tasks",
"prescriptions": "Prescriptions",
"done": "Done",
"noAppointments": "No appointments.",
"noTasks": "No tasks.",
"noPrescriptions": "No prescriptions.",
"inventory": "Inventory",
"noInventory": "No inventory items.",
"moreAppointments": "+{{count}} more",
"viewInCalendar": "View in calendar"
},
"clinicCard": {
"title": "Clinic",
"since": "Since {{date}}"
},
"analyticsCard": {
"title": "Clinic analytics",
"patients": "Patients",
"appointmentsThisWeek": "Appts this week",
"activePrescriptions": "Active Rx",
"openTasks": "Open tasks",
"billed": "Billed",
"paid": "Paid",
"outstanding": "Outstanding",
"byMonth": "Billed vs paid, by month"
},
"labCard": {
"flags": {
"low": "Low",
"high": "High",
"critical": "Critical",
"normal": "Normal"
}
},
"importCard": {
"title": "Import patient records",
"ready": "Ready to import",
"skipped": "Skipped",
"total": "Parsed",
"row": "Row {{index}}",
"more": "+{{count}} more",
"approve": "Import {{count}} record(s)",
"approve_one": "Import 1 record",
"reject": "Discard",
"importing": "Importing…",
"rejectedNote": "Import discarded. Nothing was written.",
"importedTitle": "Records imported",
"importedBody": "Imported {{count}} patient record(s).",
"failedCount": "{{count}} failed",
"failedTitle": "Import failed",
"failedBody": "The records could not be imported. Please try again."
},
"error": {
"title": "AI request failed",
"body": "Something went wrong reaching the AI. Check your provider and API key in Settings → AI.",
"dismiss": "Dismiss"
}
},
"patientCard": {
"notFound": "No patient found for file #{{number}}.",
"overview": "Overview",
"edit": "Edit",
"sex": {
"F": "Female",
"M": "Male"
},
"summary": {
"fullName": "Full name",
"mrn": "MRN",
"age": "Age",
"sex": "Sex",
"primaryCare": "Primary care",
"status": "Status",
"lastSeen": "Last seen",
"allergies": "Allergies",
"activeMeds": "Active meds",
"openProblems": "Open problems",
"none": "None",
"editRecord": "Edit record"
},
"vitals": {
"title": "Vitals",
"taken": "Taken {{at}}",
"bp": "BP",
"hr": "HR",
"temp": "Temp",
"spo2": "SpO₂"
},
"labs": {
"title": "Labs",
"asOf": "As of {{at}}",
"empty": "No labs on file."
},
"medications": {
"title": "Medications",
"active": "{{count}} active",
"empty": "No active medications."
},
"problems": {
"title": "Problems",
"active": "{{count}} active",
"empty": "No active problems.",
"since": "since {{date}}"
},
"allergies": {
"title": "Allergies & alerts",
"sectionLabel": "Allergies",
"none": "No known allergies."
},
"visits": {
"title": "Recent visits",
"recent": "{{count}} recent",
"empty": "No visits yet."
},
"graph": {
"title": "Record graph",
"hint": "How this patient's problems and visits connect. Drag nodes; scroll to pan.",
"empty": "Not enough record data to graph yet."
},
"appointments": {
"title": "Appointments",
"empty": "No appointments on file."
},
"prescriptions": {
"title": "Prescriptions",
"empty": "No prescriptions on file."
},
"invoices": {
"title": "Invoices",
"empty": "No invoices on file."
},
"trend": {
"empty": "No trend data yet.",
"last": "{{label}} · last {{count}}",
"lastReadings": "{{label}} · last {{count}} readings",
"latest": "Latest",
"min": "Min",
"max": "Max"
},
"labFlag": {
"normal": "Normal",
"low": "Low",
"high": "High",
"critical": "Critical"
},
"severity": {
"mild": "Mild",
"moderate": "Moderate",
"severe": "Severe"
}
},
"patientForm": {
"editTitle": "Edit record",
"createTitle": "Add patient",
"editDescription": "Update {{name}}'s chart and add new data.",
"createDescription": "Create a new chart. A file number has been generated for you.",
"fileNumber": "File number",
"regenerate": "Regenerate file number",
"fullName": "Full name",
"fullNamePlaceholder": "e.g. Jordan Pierce",
"age": "Age",
"sex": "Sex",
"status": "Status",
"primaryCare": "Primary care",
"primaryCarePlaceholder": "e.g. Dr. Lena Ortiz",
"primaryCareUnassigned": "Unassigned",
"currentVitals": "Current vitals",
"bp": "Blood pressure",
"hr": "Heart rate",
"temp": "Temperature",
"spo2": "Oxygen saturation",
"allergies": "Allergies",
"medications": "Medications",
"problems": "Problems",
"labs": "Labs",
"visits": "Visits",
"add": "Add",
"removeRow": "Remove {{label}} row",
"pickDate": "Pick a date",
"substance": "Substance",
"reaction": "Reaction",
"severityAria": "Severity",
"medNameAria": "Medication name",
"medName": "Name",
"dose": "Dose",
"frequency": "Frequency",
"problemAria": "Problem",
"diagnosis": "Diagnosis",
"sinceAria": "Since",
"labNameAria": "Lab name",
"test": "Test",
"valueAria": "Value",
"value": "Value",
"flagAria": "Flag",
"visitTypeAria": "Visit type",
"visitType": "Type",
"visitDateAria": "Visit date",
"visitDate": "Date",
"providerAria": "Provider",
"provider": "Provider",
"summaryAria": "Summary",
"summary": "Summary",
"cancel": "Cancel",
"saving": "Saving…",
"saveChanges": "Save changes",
"savePatient": "Save patient",
"saveError": "Could not save the patient.",
"updatedTitle": "Record updated",
"updatedBody": "{{name}}'s chart was saved.",
"addedTitle": "Patient added",
"addedBody": "{{name}} ({{fileNumber}}).",
"saveFailedTitle": "Couldn't save patient"
},
"settings": {
"tabs": {
"profile": "Profile",
"ai": "AI",
"records": "Records",
"signing": "Signing",
"careTeam": "Care team",
"developers": "Developers"
},
"empty": "Nothing here yet.",
"copy": "Copy",
"copied": "Copied",
"records": {
"description": "How patient records are sourced, stored, and displayed",
"comingSoon": "Coming soon",
"connected": "Connected",
"sourcesTitle": "Data sources",
"sourcesDescription": "Where the patient records shown in temetro come from",
"clinicDb": "Clinic database",
"clinicDbDesc": "Patient records are stored in your clinic's own database and scoped to this clinic.",
"patientStorage": "Patient-owned storage",
"patientStorageDesc": "Read and write records directly on the patient's device once the companion app ships.",
"importExportTitle": "Import & export",
"importExportDescription": "Move records in and out of temetro",
"export": "Export records",
"exportDesc": "Download every patient record in this clinic as a single archive.",
"import": "Import an existing database",
"importDesc": "Connect an existing patient database and browse it in the same card UI.",
"retentionTitle": "Retention",
"retentionDescription": "How long records are kept",
"retentionBody": "Records are kept for as long as your clinic exists. Deleting a patient permanently removes their chart from the clinic database, and the activity log keeps an audit trail of every change — who made it and when."
},
"developers": {
"description": "Access tokens for the temetro API",
"comingSoon": "Coming soon",
"apiTitle": "API access",
"apiDescription": "Build on the same REST API the temetro app uses",
"baseUrlLabel": "API base URL",
"baseUrlDescription": "All endpoints live under this origin (e.g. /api/patients)",
"authLabel": "Authentication",
"authDescription": "Requests authenticate with your temetro session cookie. Scoped personal access tokens for server-to-server use are planned.",
"tokensTitle": "Personal access tokens",
"tokensDescription": "Long-lived tokens for scripts and integrations",
"noTokens": "No tokens yet.",
"generateToken": "Generate token",
"resourcesTitle": "Resources",
"resourcesDescription": "Where to learn more",
"resourcesBody": "The API reference — covering patients, appointments, prescriptions, tasks, messaging, activity and analytics — lives in the project documentation under docs/api. temetro is open source, so the route handlers in backend/src/routes are the authoritative spec."
},
"profile": {
"sectionTitle": "Clinician profile",
"clinicianIdLabel": "Clinician ID",
"clinicianIdDescription": "Your unique clinician identifier, used when signing records",
"handleLabel": "Handle",
"handleDescription": "Used in your public profile and the patient portal",
"avatar": "Avatar",
"displayName": "Display name",
"specialty": "Specialty",
"selectSpecialty": "Select specialty",
"clinic": "Clinic / practice",
"clinicPlaceholder": "e.g. Main Hospital",
"contactEmail": "Contact email",
"contactEmailPlaceholder": "clinician@example.org",
"professionalLinks": "Professional links",
"professionalLinksHint": "Registry or institutional profiles used to verify your identity. They are never shown to patients.",
"addLink": "Add link",
"patientNotifications": "Patient notifications",
"patientNotificationsDescription": "Emails sent to patients about their records, results, and pending approvals",
"accountNotifications": "Account notifications",
"accountNotificationsDescription": "Notifications sent to you about your patients and the care team",
"features": "Features",
"featuresDescription": "Manage alpha & beta features for your account",
"dangerZone": "Danger Zone",
"dangerZoneDescription": "Irreversible actions for your account",
"deleteAccount": "Delete account",
"deleteAccountDescription": "Permanently delete your temetro account and any locally stored signing keys. This action cannot be undone.",
"delete": "Delete",
"unsavedChanges": "You have unsaved changes",
"saveChanges": "Save changes",
"saving": "Saving…",
"savedTitle": "Settings saved",
"savedBody": "Your preferences are up to date.",
"saveFailedTitle": "Couldn't save settings",
"saveFailedBody": "Please try again.",
"deleteDialog": {
"title": "Delete your account?",
"description": "This permanently deletes your account, removes you from your clinics, and cannot be undone.",
"passwordLabel": "Confirm your password",
"passwordPlaceholder": "Your password",
"cancel": "Cancel",
"confirm": "Delete account",
"deleting": "Deleting…",
"failed": "Couldn't delete the account. Check your password and try again."
},
"notif": {
"newLab": "New lab result",
"newLabDesc": "Sent when a new lab result is available on a patient's chart",
"recordUpdated": "Record updated",
"recordUpdatedDesc": "Sent when a patient's record is updated by a member of the care team",
"approvalRequested": "Approval requested",
"approvalRequestedDesc": "Sent when a signed change is awaiting the patient's approval",
"changeApproved": "Change approved",
"changeApprovedDesc": "Sent when a patient approves a pending change to their record",
"newMessage": "New message",
"newMessageDesc": "Sent when a patient or another clinician sends a message",
"visitScheduled": "Visit scheduled",
"visitScheduledDesc": "Sent when an upcoming visit is added to a patient's record",
"pendingApprovals": "Pending approvals",
"pendingApprovalsDesc": "Notify me when a patient approves or rejects a pending change",
"recordsShared": "Records shared with me",
"recordsSharedDesc": "Notify me when a patient shares a record with me",
"patientStorage": "Patient-owned storage (beta)",
"patientStorageDesc": "Write records to the patient's own device instead of your database",
"requireSigned": "Require signed records",
"requireSignedDesc": "Require a signature on every change you make to a patient record"
}
},
"careTeam": {
"title": "Care team",
"description": "Staff with access to this clinic",
"loadError": "Could not load the care team.",
"loading": "Loading care team…",
"you": "(you)",
"clickHint": "Tip: click a team member to see their permissions and manage their role.",
"addMember": "Add team member",
"removeMember": "Remove member",
"employee": {
"title": "Team member",
"description": "View this member's access, change their role, or remove them.",
"permissions": "Permissions",
"noAccess": "No access",
"changeRole": "Change role",
"save": "Save",
"saving": "Saving…",
"remove": "Remove employee",
"close": "Close",
"roleUpdatedTitle": "Role updated",
"roleUpdatedBody": "{{name}} is now {{role}}.",
"roleFailedTitle": "Couldn't update role",
"roleFailedBody": "Please try again.",
"resources": {
"patient": "Patients",
"appointment": "Appointments",
"prescription": "Prescriptions",
"task": "Tasks"
},
"actions": {
"read": "View",
"write": "Edit",
"delete": "Delete"
}
},
"remove": {
"title": "Remove team member?",
"description": "{{name}} will lose access to this clinic. This can't be undone.",
"thisMember": "This member",
"cancel": "Cancel",
"confirm": "Remove",
"removing": "Removing…",
"removedTitle": "Member removed",
"removedBody": "{{name}} no longer has access.",
"failedTitle": "Couldn't remove member",
"failedBody": "Please try again."
},
"add": {
"title": "Add team member",
"step1Description": "Who are you adding, and what can they do?",
"step2Description": "Set the username and password they'll sign in with.",
"nameLabel": "Full name",
"namePlaceholder": "Jane Okafor",
"nameRequired": "Enter the person's name.",
"roleLabel": "Role",
"usernameLabel": "Username",
"usernamePlaceholder": "jokafor",
"usernameHint": "Letters, numbers, dots and underscores — no spaces.",
"usernameTooShort": "Username must be at least {{count}} characters.",
"usernameInvalid": "Username can't contain spaces. Use letters, numbers, dots or underscores.",
"passwordLabel": "Password",
"passwordHint": "Must be at least {{count}} characters long.",
"passwordTooShort": "Password must be at least {{count}} characters.",
"back": "Back",
"cancel": "Cancel",
"next": "Next",
"create": "Create account",
"creating": "Creating…",
"createdTitle": "Account created",
"createdBody": "{{name}} can now sign in with the username {{username}}.",
"error": "Could not create the account.",
"errorTitle": "Could not add member"
}
},
"signing": {
"keyTitle": "Signing key",
"active": "Active",
"keyDescription": "Every change you make to a patient record is signed with this key, so patients can verify it came from you before approving it.",
"rotateKey": "Rotate key",
"createdAt": "Created May 28, 2026",
"identityTitle": "Signing identity",
"identityDescription": "The public key patients use to verify your signatures",
"fingerprintLabel": "Public key fingerprint",
"fingerprintDescription": "Share or publish this fingerprint so patients can trust your changes",
"signedRecordsTitle": "Signed records",
"signedRecordsDescription": "Changes you've signed that are waiting on the patient's approval",
"noPending": "No pending signatures",
"comingSoon": "Coming soon",
"howItWorksTitle": "How signing works",
"howItWorksDescription": "The flow behind patient-approved records",
"steps": {
"sign": "You sign every change",
"signDesc": "Each edit you make to a patient record is signed with your private key before it's written.",
"approve": "The patient approves it",
"approveDesc": "Signed changes stay pending until the patient accepts them in the companion app.",
"verify": "Anyone can verify",
"verifyDesc": "Your public key fingerprint lets patients and other clinics verify a change really came from you."
},
"backupTitle": "Backup key",
"backupDescription": "Recover your signing identity if you lose this device",
"backupLabel": "Recovery phrase",
"backupDesc": "Export an encrypted backup of your signing key to restore it on a new device."
},
"ai": {
"availability": {
"title": "Availability",
"description": "Control who in your clinic can use the AI assistant. When disabled, the AI page and sidebar entry are hidden and the assistant cannot be reached.",
"enabled": "Enable AI assistant",
"enabledHint": "Turn the AI assistant on for your clinic. Off hides it for everyone.",
"employeesOnly": "Disable for employees only",
"employeesOnlyHint": "Hide the AI from staff; owners and admins keep access.",
"savedTitle": "AI availability updated",
"savedBody": "The change applies across your clinic.",
"readonlyEnabled": "The AI assistant is enabled for your clinic.",
"readonlyEmployeesOnly": "The AI assistant is restricted to owners and admins.",
"readonlyDisabled": "The AI assistant is disabled for your clinic."
},
"modeTitle": "Inference mode",
"modeDescription": "Choose how temetro runs the AI. A cloud API key sends data off your infrastructure; a local model keeps everything on your machine.",
"mode": "Mode",
"modeApi": "Cloud API key",
"modeLocal": "Local model (Ollama)",
"modeApiHint": "Requests go to your chosen provider. Patient identifiers are de-identified by Veil before they leave.",
"modeLocalHint": "Requests run against a model on your own infrastructure. No patient data leaves the clinic.",
"providerTitle": "Provider & API key",
"providerDescription": "Your key is encrypted at rest and never shown again. You can store a key per provider and switch between them.",
"provider": "Provider",
"providers": {
"openai": "OpenAI",
"anthropic": "Anthropic",
"gemini": "Google Gemini"
},
"apiKey": "API key",
"apiKeyPlaceholder": "Paste your API key",
"apiKeySet": "•••••••••• (key set)",
"apiKeyHint": "The key is encrypted before storage and used only to call the provider.",
"apiKeyStored": "A key is stored for {{provider}}.",
"defaultModel": "Default model",
"selectModel": "Select a model",
"defaultEffort": "Default effort",
"localTitle": "Local model (Ollama)",
"localDescription": "Point temetro at your Ollama server. The model runs on your infrastructure, so patient data never leaves the clinic.",
"ollamaBaseUrl": "Ollama base URL",
"ollamaModel": "Model name",
"testConnection": "Test connection",
"testing": "Testing…",
"testOk": "Connection succeeded",
"testFailed": "Connection failed",
"testError": "Could not run the test.",
"veilTitle": "Veil — PHI safeguards",
"veilDescription": "Veil de-identifies patient information before it is sent to an external model, then restores it in the response.",
"veilLevel": "De-identification level",
"veilLevels": {
"full": "Full — names, MRNs, providers & free-text",
"names": "Names only — direct identifiers",
"off": "Off — send data as-is (not recommended)"
},
"veilApiNote": "Veil applies to every external request. Identifiers are replaced with tokens the model never sees, and re-inserted before you read the answer.",
"veilLocalNote": "You are in local mode, so patient data never leaves your infrastructure and Veil is not needed.",
"unsavedChanges": "You have unsaved AI settings.",
"saveChanges": "Save changes",
"saving": "Saving…",
"savedTitle": "AI settings saved",
"savedBody": "Your AI configuration has been updated.",
"saveFailedTitle": "Could not save",
"saveFailedBody": "Saving your AI settings failed. Please try again."
}
}
}