mirror of
https://github.com/temetro/temetro.git
synced 2026-07-26 11:58:14 +00:00
36461a5498
Patient record: - Add `bloodType` and `phone` to the patient model (schema, canonical types on both backend + frontend, zod validation). `phone` is a demographic field (reception can read/write); `bloodType` is clinical PHI, redacted for the reception role. Surface both in the record sheet, chat summary card, and the add/edit patient form. Migration 0033. Clinic location: - New org-scoped `clinic_settings` table (address/city/country + optional lat/long), service, and routes: GET /api/clinic/settings (any clinician) and PUT /api/clinic/location (owner/admin). Edited in Settings → Signing → Clinic location. Consumed later by the wallet app. Migration 0034. i18n: - Translate all new keys into every shipped locale (en/de/fr/ar/so) and document the "translate into every locale" rule in frontend/CLAUDE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2183 lines
83 KiB
JSON
2183 lines
83 KiB
JSON
{
|
||
"scribe": {
|
||
"recordVisit": "Record visit",
|
||
"title": "Visit scribe",
|
||
"subtitle": "Record or paste a visit for {{name}}, then review the drafted note before saving.",
|
||
"tabs": {
|
||
"record": "Record",
|
||
"paste": "Paste transcript"
|
||
},
|
||
"record": {
|
||
"start": "Start recording",
|
||
"stop": "Stop",
|
||
"ready": "Recording ready ({{duration}})",
|
||
"discard": "Discard"
|
||
},
|
||
"paste": {
|
||
"placeholder": "Paste the visit transcript here…"
|
||
},
|
||
"visitType": {
|
||
"label": "Visit type (optional)",
|
||
"placeholder": "e.g. Follow-up"
|
||
},
|
||
"consent": "The audio is stored on the patient's chart. When you use an external AI provider, the recording leaves the clinic to be transcribed — Veil cannot redact speech, so only the drafted note is de-identified.",
|
||
"generate": "Draft note",
|
||
"processing": "Working…",
|
||
"cancel": "Cancel",
|
||
"review": {
|
||
"type": "Visit type",
|
||
"date": "Date",
|
||
"summary": "Note",
|
||
"provider": "Provider: {{provider}}",
|
||
"veil": "De-identified through Veil before {{provider}}.",
|
||
"back": "Back",
|
||
"save": "Save to record"
|
||
},
|
||
"saved": {
|
||
"title": "Visit note saved"
|
||
},
|
||
"errors": {
|
||
"mic": "Couldn't access the microphone. Check browser permissions or paste a transcript instead.",
|
||
"noRecording": "Record the visit first, or switch to the paste tab.",
|
||
"empty": "The transcript is empty.",
|
||
"generic": "Something went wrong. Please try again."
|
||
}
|
||
},
|
||
"walletUpdatesList": {
|
||
"title": "Updates sent to wallets",
|
||
"description": "Record updates you've pushed to patient wallets, and whether the patient has approved them.",
|
||
"none": "You haven't pushed any wallet updates yet."
|
||
},
|
||
"walletPush": {
|
||
"action": "Push to wallet",
|
||
"title": "Push update to wallet",
|
||
"subtitle": "Send {{name}}'s updated record to their wallet app. They must approve it on their phone before it replaces the copy on their device.",
|
||
"sectionsLabel": "What changed",
|
||
"sections": {
|
||
"demographics": "Demographics",
|
||
"problems": "Problems",
|
||
"medications": "Medications",
|
||
"allergies": "Allergies",
|
||
"labs": "Labs",
|
||
"vitals": "Vitals",
|
||
"visits": "Visits"
|
||
},
|
||
"noteLabel": "Note (optional)",
|
||
"notePlaceholder": "A short note about this update…",
|
||
"notice": "This sends the full current record, signed with your clinic key. It replaces the patient's on-device copy only after they approve it.",
|
||
"cancel": "Cancel",
|
||
"send": "Send update",
|
||
"done": "Done",
|
||
"errors": {
|
||
"generic": "Couldn't send the update. Please try again."
|
||
},
|
||
"status": {
|
||
"pending": {
|
||
"title": "Waiting for the patient",
|
||
"body": "The update was sent. It will arrive on the patient's phone now, or the next time they open the app."
|
||
},
|
||
"delivered": {
|
||
"title": "Delivered to the phone",
|
||
"body": "The patient has received the update and needs to approve it on their device."
|
||
},
|
||
"approved": {
|
||
"title": "Approved by the patient",
|
||
"body": "The patient approved the update and their on-device record is now up to date."
|
||
},
|
||
"denied": {
|
||
"title": "Declined by the patient",
|
||
"body": "The patient declined this update, so their on-device record is unchanged."
|
||
}
|
||
}
|
||
},
|
||
"common": {
|
||
"appName": "temetro",
|
||
"email": "Email",
|
||
"password": "Password",
|
||
"signIn": "Sign in",
|
||
"signUp": "Sign up",
|
||
"backToSignIn": "Back to sign in",
|
||
"addedByAi": "Added by AI",
|
||
"pagination": {
|
||
"label": "Pages",
|
||
"previous": "Previous",
|
||
"next": "Next",
|
||
"page": "Page {{page}}",
|
||
"summary": "Showing {{from}}–{{to}} of {{total}}"
|
||
}
|
||
},
|
||
"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 send a link to reset your password",
|
||
"modeEmail": "Email",
|
||
"modeUsername": "Username",
|
||
"emailLabel": "Email",
|
||
"emailPlaceholder": "you@clinic.org",
|
||
"usernameLabel": "Username",
|
||
"usernamePlaceholder": "your username",
|
||
"submit": "Send reset link",
|
||
"submitting": "Sending…",
|
||
"sent": "If an account exists for {{email}}, a reset link is on its way. Check your inbox.",
|
||
"sentUsername": "If that username exists, a reset link is on its way. If you don't have an inbox, your clinic admin has been notified to set a new password for you.",
|
||
"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": "Ask temetro",
|
||
"patients": "Patients",
|
||
"appointments": "Appointments",
|
||
"invoices": "Invoices",
|
||
"prescriptions": "Prescriptions",
|
||
"analysis": "Analysis",
|
||
"pharmacy": "Pharmacy",
|
||
"inventory": "Inventory",
|
||
"lab": "Lab",
|
||
"notes": "Notes",
|
||
"messages": "Messages",
|
||
"inbox": "Inbox",
|
||
"meetings": "Meetings",
|
||
"tasks": "Tasks",
|
||
"activity": "Activity",
|
||
"settings": "Settings",
|
||
"openSidebar": "Open menu",
|
||
"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",
|
||
"newPatient": "New patient",
|
||
"importFromApp": "Import from a patient app",
|
||
"tempBadge": "Temporary",
|
||
"importApp": {
|
||
"title": "Import from a patient app",
|
||
"description": "Enter the patient's wallet number. They'll get a request on their phone to approve sharing their record with this clinic.",
|
||
"tabNumber": "By number",
|
||
"tabQr": "Show QR",
|
||
"qrHint": "Generate a QR code, then have the patient scan it in their wallet app to share their record.",
|
||
"qrCaption": "Scan this in the patient app",
|
||
"generateQr": "Show QR code",
|
||
"walletLabel": "Patient wallet number",
|
||
"walletPlaceholder": "tmw_…",
|
||
"tempLabel": "Share temporarily",
|
||
"tempHint": "The record is automatically deleted from this clinic when the share window ends.",
|
||
"durationLabel": "Share for",
|
||
"hours": "{{count}} hour",
|
||
"hours_other": "{{count}} hours",
|
||
"days": "{{count}} day",
|
||
"days_other": "{{count}} days",
|
||
"request": "Send request",
|
||
"requesting": "Sending…",
|
||
"waitingTitle": "Waiting for the patient",
|
||
"waitingBody": "We've sent a request to the wallet. Approve it on the patient's device to continue.",
|
||
"approvedTitle": "Patient approved",
|
||
"approvedBody": "Review the shared record, then save it to this clinic.",
|
||
"review": "Review record",
|
||
"deniedTitle": "Request declined",
|
||
"deniedBody": "The patient declined to share their record.",
|
||
"expiredTitle": "Request expired",
|
||
"expiredBody": "The request timed out before the patient responded.",
|
||
"invalidWallet": "That doesn't look like a valid wallet number.",
|
||
"networkOff": "Join the Temetro Network first (Settings → Signing) to share with patient apps.",
|
||
"errorTitle": "Couldn't reach the wallet",
|
||
"error": "Please check the wallet number and try again.",
|
||
"savedTitle": "Patient imported",
|
||
"savedBody": "{{name}} was added to this clinic.",
|
||
"cancel": "Cancel",
|
||
"close": "Close"
|
||
},
|
||
"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.0–17.0 g/dL",
|
||
"files": "Analysis files",
|
||
"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",
|
||
"assigneeDepartment": "Department",
|
||
"assigneePerson": "Person",
|
||
"person": "Team member",
|
||
"personEmpty": "No clinicians available to assign."
|
||
},
|
||
"list": {
|
||
"forDept": "For {{dept}}",
|
||
"personal": "Personal",
|
||
"byCreator": "by {{name}}",
|
||
"forPerson": "For {{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.",
|
||
"needPersonTitle": "Pick a team member",
|
||
"needPersonBody": "Choose who this task is for."
|
||
}
|
||
},
|
||
"meetings": {
|
||
"rooms": "Rooms",
|
||
"newRoom": "New room",
|
||
"newRoomDescription": "Create a voice/video room your team can join.",
|
||
"roomNameLabel": "Room name",
|
||
"roomNamePlaceholder": "e.g. Morning huddle",
|
||
"noRooms": "No rooms yet. Create one to start a call.",
|
||
"create": "Create",
|
||
"creating": "Creating…",
|
||
"cancel": "Cancel",
|
||
"createFailedTitle": "Couldn't create room",
|
||
"createFailedBody": "Please try again.",
|
||
"deleteRoom": "Delete room",
|
||
"deleting": "Deleting…",
|
||
"deleteRoomConfirmTitle": "Delete this room?",
|
||
"deleteRoomConfirmBody": "“{{name}}” will be removed for everyone. Anyone currently in the call will be disconnected.",
|
||
"deleteFailedTitle": "Couldn't delete room",
|
||
"deleteFailedBody": "Please try again.",
|
||
"emptyTitle": "No room selected",
|
||
"emptyDescription": "Pick a room to join the call, or create a new one.",
|
||
"you": "You",
|
||
"guest": "Guest",
|
||
"inCall": "{{count}} in call",
|
||
"connecting": "Connecting…",
|
||
"roomFull": "Room is full (max {{max}}).",
|
||
"callError": "Couldn't start the call. Check camera/mic permissions.",
|
||
"muteMic": "Mute microphone",
|
||
"unmuteMic": "Unmute microphone",
|
||
"startVideo": "Start video",
|
||
"stopVideo": "Stop video",
|
||
"shareScreen": "Share screen",
|
||
"leave": "Leave call",
|
||
"calendar": "Calendar",
|
||
"calendarEmpty": "No meetings on this day.",
|
||
"invite": {
|
||
"add": "Add people",
|
||
"title": "Invite to call",
|
||
"description": "Ring a team member into {{room}}.",
|
||
"search": "Search team…",
|
||
"noMembers": "No other members.",
|
||
"ring": "Ring",
|
||
"invited": "Invited",
|
||
"join": "Join",
|
||
"toastTitle": "{{name}} invited you to a call",
|
||
"accept": "Accept",
|
||
"decline": "Decline"
|
||
},
|
||
"schedule": {
|
||
"cta": "Schedule meeting",
|
||
"title": "Schedule a meeting",
|
||
"description": "Plan a meeting and invite your team.",
|
||
"titleLabel": "Title",
|
||
"titlePlaceholder": "e.g. Weekly sync",
|
||
"date": "Date",
|
||
"time": "Time",
|
||
"participants": "Participants",
|
||
"save": "Schedule",
|
||
"saving": "Scheduling…",
|
||
"failedTitle": "Couldn't schedule meeting",
|
||
"failedBody": "Please try again."
|
||
},
|
||
"calendarEmptyHint": "Schedule a meeting to see it on this day.",
|
||
"upcoming": {
|
||
"title": "Upcoming",
|
||
"empty": "No upcoming meetings."
|
||
}
|
||
},
|
||
"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"
|
||
},
|
||
"startCall": "Start a call with {{name}}",
|
||
"system": {
|
||
"label": "System message",
|
||
"tag": "System",
|
||
"readOnly": "This is an automated system notice — you can't reply here.",
|
||
"passwordResetTitle": "Password reset requested",
|
||
"passwordResetBody": "{{name}} forgot their password. Tap to open their settings and set a new one."
|
||
}
|
||
},
|
||
"analysis": {
|
||
"title": "Overview",
|
||
"subtitle": "Clinic performance at a glance, computed from your clinic's data.",
|
||
"customize": "Customize",
|
||
"customizeTitle": "Show sections",
|
||
"range": {
|
||
"all": "All Time",
|
||
"12m": "12m",
|
||
"3m": "3m",
|
||
"30d": "30d",
|
||
"today": "Today"
|
||
},
|
||
"section": {
|
||
"visits": "Patient visits",
|
||
"patients": "Patient volume",
|
||
"trends": "Trends",
|
||
"earnings": "Earnings",
|
||
"appointments": "Appointments",
|
||
"prescriptions": "Prescriptions"
|
||
},
|
||
"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?",
|
||
"setupNotice": {
|
||
"title": "Connect an AI model to get started",
|
||
"body": "No AI provider is set up yet. Add an API key or point temetro at a local Ollama model so the assistant can answer.",
|
||
"action": "Open AI settings",
|
||
"dismiss": "Dismiss"
|
||
},
|
||
"input": {
|
||
"placeholder": "Ask anything, or type /patient 10293",
|
||
"message": "Message",
|
||
"addPatient": "Add patient",
|
||
"attachFile": "Attach file",
|
||
"attachFiles": "Attach files",
|
||
"removeFile": "Remove {{name}}",
|
||
"dictate": "Dictate",
|
||
"dictateStop": "Stop dictation",
|
||
"dictateUnsupported": "Voice dictation isn't supported in this browser",
|
||
"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": "Google’s 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",
|
||
"sources": {
|
||
"title": "Sources",
|
||
"kind": {
|
||
"patient": "Patient record",
|
||
"lab": "Lab results",
|
||
"appointments": "Schedule",
|
||
"tasks": "Tasks",
|
||
"prescriptions": "Prescriptions",
|
||
"clinic": "Clinic",
|
||
"analytics": "Analytics",
|
||
"inventory": "Inventory"
|
||
}
|
||
},
|
||
"graphCard": {
|
||
"label": "Record graph"
|
||
},
|
||
"history": {
|
||
"title": "Chats",
|
||
"untitled": "New chat",
|
||
"empty": "No saved chats yet.",
|
||
"delete": "Delete chat",
|
||
"open": "Chat history",
|
||
"search": "Search chats",
|
||
"startNew": "Start new 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)",
|
||
"itemCount": "{{count}} item(s)",
|
||
"total": "Total",
|
||
"editButton": "Edit",
|
||
"edit": {
|
||
"title": "Edit proposed record",
|
||
"save": "Save changes",
|
||
"cancel": "Cancel",
|
||
"addRow": "Add",
|
||
"removeRow": "Remove row"
|
||
},
|
||
"fields": {
|
||
"name": "Patient name",
|
||
"date": "Date",
|
||
"time": "Time",
|
||
"type": "Type",
|
||
"provider": "Provider",
|
||
"title": "Title",
|
||
"assignee": "Assignee",
|
||
"due": "Due",
|
||
"priority": "Priority",
|
||
"patient": "Patient",
|
||
"medication": "Medication",
|
||
"dose": "Dose",
|
||
"frequency": "Frequency",
|
||
"duration": "Duration",
|
||
"lineItems": "Line items",
|
||
"description": "Description",
|
||
"quantity": "Qty",
|
||
"unitPrice": "Unit price",
|
||
"items": "Items",
|
||
"itemName": "Name",
|
||
"strength": "Strength",
|
||
"stockQuantity": "Quantity"
|
||
},
|
||
"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",
|
||
"edited": "Edited",
|
||
"remove": "Remove",
|
||
"done": "Added {{added}} of {{total}}.",
|
||
"alreadyAdded": "Added.",
|
||
"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",
|
||
"reviewEdit": "Review & edit",
|
||
"reviewTitle": "Review records",
|
||
"reviewDescription": "Open any record to edit it before importing. Fix the skipped ones to include them.",
|
||
"reviewClose": "Close",
|
||
"fixHint": "Open Review & edit to fix the skipped rows, or import the ready ones.",
|
||
"rowReady": "Ready to import",
|
||
"needsFix": "Needs fixing",
|
||
"unnamed": "Unnamed record",
|
||
"importing": "Importing…",
|
||
"rejectedNote": "Import discarded. Nothing was written.",
|
||
"importedTitle": "Records imported",
|
||
"importedBody": "Imported {{count}} patient record(s).",
|
||
"alreadyImported": "Imported.",
|
||
"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"
|
||
}
|
||
},
|
||
"patientFiles": {
|
||
"title": "Files",
|
||
"add": "Add files",
|
||
"empty": "No files uploaded.",
|
||
"remove": "Remove",
|
||
"open": "Open",
|
||
"close": "Close",
|
||
"noPreview": "No preview available for this file type.",
|
||
"deletedTitle": "File removed",
|
||
"deleteFailedTitle": "Couldn't remove file",
|
||
"deleteFailedBody": "Something went wrong, or you don't have permission. Please try again.",
|
||
"uploadFailedTitle": "Some files didn't upload",
|
||
"uploadFailedBody": "The record was saved, but one or more files failed to upload. Try adding them again from the record."
|
||
},
|
||
"integrations": {
|
||
"fhir": {
|
||
"cardTitle": "Lab system (HL7/FHIR)",
|
||
"disabledHint": "Not enabled. An owner or admin can connect a lab system in Settings → Integrations.",
|
||
"searchPlaceholder": "Search a patient to pull results…",
|
||
"change": "Change",
|
||
"sync": "Sync results",
|
||
"syncing": "Syncing…",
|
||
"syncedTitle": "Results synced",
|
||
"syncedBody": "Imported {{count}} result(s) for {{name}}.",
|
||
"failedTitle": "Sync failed",
|
||
"failedBody": "Couldn't reach the lab system. Please try again."
|
||
},
|
||
"eRx": {
|
||
"send": "Send to pharmacy",
|
||
"sending": "Sending…",
|
||
"sentTitle": "Prescription sent",
|
||
"sentBody": "Transmitted to the pharmacy as an NCPDP SCRIPT NewRx.",
|
||
"failedTitle": "Couldn't send",
|
||
"failedBody": "The pharmacy gateway rejected the message or is unreachable."
|
||
},
|
||
"claims": {
|
||
"submit": "Submit claim",
|
||
"submitting": "Submitting…",
|
||
"submittedTitle": "Claim submitted",
|
||
"submittedBody": "Clearinghouse status: {{status}}.",
|
||
"failedTitle": "Couldn't submit claim",
|
||
"failedBody": "The clearinghouse rejected the claim or is unreachable."
|
||
}
|
||
},
|
||
"patientCard": {
|
||
"notFound": "No patient found for file #{{number}}.",
|
||
"overview": "Overview",
|
||
"edit": "Edit",
|
||
"exportPdf": "Download summary",
|
||
"clickForMore": "Click for more",
|
||
"pdf": {
|
||
"title": "Clinical summary",
|
||
"mrn": "MRN",
|
||
"generated": "Generated {{date}}"
|
||
},
|
||
"history": {
|
||
"title": "Record history",
|
||
"empty": "No recorded changes yet.",
|
||
"loadError": "Couldn't load the record history."
|
||
},
|
||
"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",
|
||
"bloodType": "Blood type",
|
||
"phone": "Phone",
|
||
"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.",
|
||
"count": "{{count}} recorded"
|
||
},
|
||
"visits": {
|
||
"title": "Recent visits",
|
||
"recent": "{{count}} recent",
|
||
"empty": "No visits yet."
|
||
},
|
||
"graph": {
|
||
"title": "Record graph",
|
||
"hint": "Hover a node to focus its connections. Scroll to pan, pinch to zoom.",
|
||
"empty": "Not enough record data to graph yet.",
|
||
"open": "Open graph",
|
||
"close": "Close",
|
||
"kind": {
|
||
"problem": "Problem",
|
||
"visit": "Visit"
|
||
},
|
||
"fields": {
|
||
"since": "Since",
|
||
"date": "Date",
|
||
"provider": "Provider",
|
||
"summary": "Summary"
|
||
}
|
||
},
|
||
"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",
|
||
"phone": "Phone",
|
||
"phonePlaceholder": "e.g. +1 555 010 2938",
|
||
"bloodType": "Blood type",
|
||
"bloodTypeUnknown": "Unknown",
|
||
"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",
|
||
"saveDraft": "Save changes",
|
||
"reviewTitle": "Review record before import",
|
||
"reviewDescription": "Edit any field, then save to update this record in the import. Nothing is written until you import.",
|
||
"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",
|
||
"integrations": "Integrations",
|
||
"developers": "Developers",
|
||
"version": "About & updates"
|
||
},
|
||
"version": {
|
||
"title": "Version",
|
||
"description": "The temetro version running on this server, and whether a newer release is available.",
|
||
"current": "Current version",
|
||
"latest": "Latest release",
|
||
"checking": "Checking for updates…",
|
||
"checkNow": "Check for updates",
|
||
"upToDate": "Up to date",
|
||
"updateAvailable": "Update available",
|
||
"offline": "Couldn't reach the update server",
|
||
"updateTitle": "How to update",
|
||
"updateDescription": "temetro is self-hosted with Docker. To update, pull the new images and restart on the server machine.",
|
||
"updateCommandLabel": "Update command",
|
||
"viewRelease": "View release notes",
|
||
"networkTitle": "Network access",
|
||
"networkDescription": "Let other departments open temetro from their own computers on the hospital network using this address.",
|
||
"networkUrlLabel": "Network address",
|
||
"networkLocalHint": "You're viewing temetro locally. To share it, open the app on the server machine using its network IP address (e.g. from ipconfig / ifconfig), then share that URL.",
|
||
"networkFirewallHint": "The server's firewall must allow the port for other devices to connect.",
|
||
"banner": "A new version of temetro ({{version}}) is available.",
|
||
"bannerUpdate": "See how to update",
|
||
"bannerDismiss": "Later"
|
||
},
|
||
"integrations": {
|
||
"loading": "Loading integrations…",
|
||
"intro": "Connect temetro to external healthcare systems. Point each integration at your vendor's sandbox or production endpoint and supply its credentials.",
|
||
"endpoint": "Endpoint URL",
|
||
"credentials": "Credentials",
|
||
"credentialsSet": "•••••••• (stored — type to replace)",
|
||
"enable": "Enable integration",
|
||
"enableHint": "When on, its actions appear on the relevant pages.",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"test": "Test connection",
|
||
"testing": "Testing…",
|
||
"savedTitle": "Integration saved",
|
||
"saveFailedTitle": "Couldn't save",
|
||
"saveFailedBody": "Something went wrong, or you don't have permission. Please try again.",
|
||
"testOk": "Connection succeeded",
|
||
"testFailed": "Connection failed",
|
||
"testError": "Couldn't reach the endpoint.",
|
||
"lastSync": "Last activity {{when}}",
|
||
"status": {
|
||
"connected": "Connected",
|
||
"error": "Error",
|
||
"unconfigured": "Not configured"
|
||
},
|
||
"fhir": {
|
||
"title": "Lab system (HL7/FHIR)",
|
||
"description": "Read lab results from a FHIR R4 server or HL7 v2 feed (e.g. a HAPI FHIR / SMART Health IT sandbox, or your lab's gateway).",
|
||
"endpointPlaceholder": "https://hapi.fhir.org/baseR4",
|
||
"credentialsPlaceholder": "Bearer token (optional for open sandboxes)",
|
||
"credentialsHint": "Sent as a Bearer token, or JSON {\"token\":\"…\"}. Leave blank for public sandboxes."
|
||
},
|
||
"eprescribe": {
|
||
"title": "e-Prescribing (NCPDP SCRIPT)",
|
||
"description": "Transmit prescriptions to pharmacies as NCPDP SCRIPT NewRx messages. Production routing requires your Surescripts (or sandbox) account.",
|
||
"endpointPlaceholder": "https://your-pharmacy-gateway.example/script",
|
||
"credentialsPlaceholder": "JSON: {\"token\":\"…\",\"senderId\":\"…\"}",
|
||
"credentialsHint": "JSON with your gateway token and sender id."
|
||
},
|
||
"claims": {
|
||
"title": "Insurance claims (X12 837/835)",
|
||
"description": "Submit professional claims (837P) to a clearinghouse and read remittances (835). Production requires your clearinghouse account.",
|
||
"endpointPlaceholder": "https://your-clearinghouse.example/claims",
|
||
"credentialsPlaceholder": "JSON: {\"token\":\"…\",\"submitterId\":\"…\",\"receiverId\":\"…\"}",
|
||
"credentialsHint": "JSON with your clearinghouse token and submitter/receiver ids."
|
||
},
|
||
"fhirServer": {
|
||
"title": "FHIR server (share your records)",
|
||
"description": "Expose this clinic's records to external systems as a read-only FHIR R4 server, authenticated with per-clinic API keys.",
|
||
"baseUrl": "Base URL",
|
||
"baseUrlHint": "Point a FHIR client at this URL. It serves Patient, Observation, Condition, AllergyIntolerance, MedicationRequest, Encounter and Appointment.",
|
||
"copiedUrl": "Base URL copied",
|
||
"newKey": "Create an API key",
|
||
"newKeyPlaceholder": "Key name (e.g. Research warehouse)",
|
||
"create": "Create",
|
||
"creating": "Creating…",
|
||
"createFailed": "Couldn't create the key",
|
||
"createFailedBody": "Please try again.",
|
||
"secretTitle": "Copy your API key now",
|
||
"secretHint": "This is the only time the secret is shown. Store it somewhere safe — it can't be retrieved later.",
|
||
"copiedSecret": "API key copied",
|
||
"dismissSecret": "Done",
|
||
"noKeys": "No API keys yet. Create one to let a FHIR client connect.",
|
||
"lastUsed": "Last used {{when}}",
|
||
"neverUsed": "Never used",
|
||
"revoke": "Revoke",
|
||
"confirmRevoke": "Revoke key",
|
||
"revoked": "Revoked",
|
||
"revokeFailed": "Couldn't revoke the key",
|
||
"revokeFailedBody": "Please try again.",
|
||
"cancel": "Cancel"
|
||
}
|
||
},
|
||
"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.",
|
||
"exporting": "Exporting…",
|
||
"exportDoneTitle": "Records exported",
|
||
"exportDoneBody": "Downloaded {{count}} patient record(s).",
|
||
"exportFailedTitle": "Export failed",
|
||
"exportFailedBody": "Couldn't export records. Please try again.",
|
||
"importTemetro": "Import a temetro archive",
|
||
"importTemetroDesc": "Load patients from a temetro export file. Existing file numbers are skipped.",
|
||
"importChoose": "Choose file",
|
||
"importPreview": "{{count}} patient record(s) ready to import.",
|
||
"importCancel": "Cancel",
|
||
"importApply": "Import",
|
||
"importing": "Importing…",
|
||
"importInvalidTitle": "Invalid file",
|
||
"importInvalidBody": "That doesn't look like a temetro export.",
|
||
"importDoneTitle": "Import complete",
|
||
"importDoneBody": "Created {{created}}, skipped {{skipped}}.",
|
||
"importFailedTitle": "Import failed",
|
||
"importFailedBody": "Couldn't import records. Please try again."
|
||
},
|
||
"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.",
|
||
"email": {
|
||
"title": "Email provider",
|
||
"description": "How temetro sends verification, password-reset and invitation emails. This is a deployment-wide setting.",
|
||
"provider": "Provider",
|
||
"providers": {
|
||
"none": "Not configured",
|
||
"smtp": "SMTP",
|
||
"resend": "Resend",
|
||
"postmark": "Postmark",
|
||
"sendgrid": "SendGrid"
|
||
},
|
||
"from": "From address",
|
||
"apiKey": "API key",
|
||
"apiKeySet": "•••••••• (saved — leave blank to keep)",
|
||
"apiKeyPlaceholder": "Paste your provider API key",
|
||
"smtpHint": "SMTP uses the SMTP_HOST/PORT/USER/PASS environment variables on the server.",
|
||
"save": "Save",
|
||
"saving": "Saving…",
|
||
"savedTitle": "Email settings saved",
|
||
"savedFailed": "Couldn't save email settings.",
|
||
"test": "Send test",
|
||
"testing": "Sending…",
|
||
"testSentTitle": "Test email sent",
|
||
"testSentBody": "Sent a test email to {{to}}.",
|
||
"testFailed": "Couldn't send the test email."
|
||
}
|
||
},
|
||
"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",
|
||
"language": {
|
||
"title": "Language",
|
||
"description": "The language temetro's interface is shown in on this device.",
|
||
"label": "Display language",
|
||
"en": "English",
|
||
"fr": "Français",
|
||
"so": "Soomaali",
|
||
"ar": "العربية",
|
||
"de": "Deutsch",
|
||
"confirmTitle": "Change display language?",
|
||
"confirmBody": "Switch the interface to {{language}}? The app will reload its text in the new language.",
|
||
"confirmCta": "Change language",
|
||
"cancel": "Cancel"
|
||
},
|
||
"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",
|
||
"specialties": {
|
||
"general": "General practitioner",
|
||
"orthopedics": "Orthopedist",
|
||
"dentistry": "Dentist",
|
||
"cardiology": "Cardiologist",
|
||
"pediatrics": "Pediatrician",
|
||
"dermatology": "Dermatologist",
|
||
"neurology": "Neurologist",
|
||
"obgyn": "OB-GYN",
|
||
"ophthalmology": "Ophthalmologist",
|
||
"ent": "ENT specialist",
|
||
"psychiatry": "Psychiatrist",
|
||
"radiology": "Radiologist",
|
||
"anesthesiology": "Anesthesiologist",
|
||
"surgery": "Surgeon"
|
||
},
|
||
"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.",
|
||
"specialty": "Specialty",
|
||
"noSpecialty": "No specialty",
|
||
"specialtyUpdatedTitle": "Specialty updated",
|
||
"specialtyUpdatedBody": "Updated {{name}}'s specialty.",
|
||
"specialtyFailedTitle": "Couldn't update specialty",
|
||
"specialtyFailedBody": "Please try again.",
|
||
"resources": {
|
||
"patient": "Patients",
|
||
"appointment": "Appointments",
|
||
"prescription": "Prescriptions",
|
||
"task": "Tasks",
|
||
"lab": "Lab results"
|
||
},
|
||
"actions": {
|
||
"read": "View",
|
||
"write": "Edit",
|
||
"delete": "Delete"
|
||
},
|
||
"resetPassword": "Reset password",
|
||
"resetPasswordHint": "Set a new password for this employee (e.g. they forgot theirs and no email provider is configured).",
|
||
"newPassword": "New password (min 12 chars)",
|
||
"confirmPassword": "Confirm password",
|
||
"setPassword": "Set password",
|
||
"pwTooShortTitle": "Password too short",
|
||
"pwTooShortBody": "Use at least 12 characters.",
|
||
"pwMismatchTitle": "Passwords don't match",
|
||
"pwMismatchBody": "Re-enter the same password in both fields.",
|
||
"pwUpdatedTitle": "Password updated",
|
||
"pwUpdatedBody": "{{name}} can now sign in with the new password.",
|
||
"pwFailedTitle": "Couldn't set password",
|
||
"pwFailedBody": "Please try again."
|
||
},
|
||
"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"
|
||
}
|
||
},
|
||
"network": {
|
||
"title": "Temetro Network",
|
||
"description": "The Temetro Network relay lets patients' wallet apps connect to your clinic to share and approve records — end-to-end encrypted, with your clinic identified by its signing key.",
|
||
"toggleLabel": "Join Temetro Network",
|
||
"toggleDesc": "When on, this clinic connects to the relay so you can import records from patient apps and push updates to their wallets.",
|
||
"statusConnected": "Connected",
|
||
"statusOff": "Off",
|
||
"joinedTitle": "Joined the Temetro Network",
|
||
"joinedBody": "Patient wallet apps can now connect to this clinic.",
|
||
"leftTitle": "Left the Temetro Network",
|
||
"leftBody": "This clinic is no longer connected to the relay.",
|
||
"errorTitle": "Couldn't update network access",
|
||
"error": "Please try again."
|
||
},
|
||
"location": {
|
||
"title": "Clinic location",
|
||
"description": "Your clinic's address and map coordinates. Shown to patients in the wallet app.",
|
||
"address": "Address",
|
||
"addressPlaceholder": "Street address",
|
||
"city": "City",
|
||
"country": "Country",
|
||
"latitude": "Latitude",
|
||
"longitude": "Longitude",
|
||
"coordinatesHint": "Coordinates are optional — used to show your clinic on a map.",
|
||
"save": "Save location",
|
||
"saving": "Saving…",
|
||
"savedTitle": "Location saved",
|
||
"savedBody": "Your clinic location has been updated.",
|
||
"invalidCoords": "Latitude and longitude must be numbers.",
|
||
"errorTitle": "Couldn't save location",
|
||
"error": "Please try again."
|
||
},
|
||
"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",
|
||
"rotating": "Rotating…",
|
||
"rotateSuccessTitle": "Signing key rotated",
|
||
"rotateSuccessBody": "A new Ed25519 key is now active for this clinic.",
|
||
"rotateErrorTitle": "Couldn't rotate the key",
|
||
"rotateError": "Please try again.",
|
||
"loadError": "Couldn't load the signing key.",
|
||
"loading": "Loading signing key…",
|
||
"createdAt": "Created May 28, 2026",
|
||
"createdAtLabel": "Created {{date}}",
|
||
"rotatedAtLabel": "Rotated {{date}}",
|
||
"records": {
|
||
"permanent": "Permanent",
|
||
"temporary": "Temporary",
|
||
"expires": "Expires {{date}}",
|
||
"statusPending": "Awaiting approval",
|
||
"statusApproved": "Shared",
|
||
"statusDenied": "Declined",
|
||
"statusExpired": "Expired"
|
||
},
|
||
"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, every AI surface — New chat, Analysis, and the chat history — is hidden and cannot be reached.",
|
||
"enabled": "Enable AI assistant",
|
||
"enabledHint": "Master switch. Turning this off disables and hides the AI for everyone in the clinic — including owners and admins.",
|
||
"employeesOnly": "Disable for employees only",
|
||
"employeesOnlyHint": "Keep the AI for owners and admins, but hide it from all other staff.",
|
||
"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."
|
||
}
|
||
},
|
||
"portal": {
|
||
"kicker": "Patient Portal",
|
||
"back": "Back",
|
||
"done": "Done",
|
||
"notFoundTitle": "Clinic not found",
|
||
"notFoundBody": "This portal link isn't valid. Please ask the front desk for help.",
|
||
"choose": {
|
||
"bookTitle": "Book an appointment",
|
||
"bookDesc": "Schedule a visit with your care team.",
|
||
"resultsTitle": "View my results",
|
||
"resultsDesc": "Check upcoming visits and whether results are ready."
|
||
},
|
||
"field": {
|
||
"name": "Full name",
|
||
"fileNumber": "File number",
|
||
"date": "Date",
|
||
"time": "Time",
|
||
"reason": "Reason for visit (optional)",
|
||
"reasonPlaceholder": "e.g. Follow-up, check-up",
|
||
"sex": "Sex",
|
||
"sexMale": "Male",
|
||
"sexFemale": "Female",
|
||
"age": "Age"
|
||
},
|
||
"book": {
|
||
"title": "Book an appointment",
|
||
"submit": "Request appointment",
|
||
"successTitle": "You're booked",
|
||
"successBody": "Your appointment is set for {{date}} at {{time}}. Please check in at the front desk.",
|
||
"errorGeneric": "Couldn't book the appointment. Please try again or ask the front desk.",
|
||
"mode": {
|
||
"returning": "Returning patient",
|
||
"new": "New patient"
|
||
},
|
||
"newFileNote": "Your new file number is {{file}} — keep it for next time.",
|
||
"slotTaken": "That time is already taken. Please choose another."
|
||
},
|
||
"results": {
|
||
"title": "View my results",
|
||
"subtitle": "Enter your name and file number to continue.",
|
||
"submit": "Look up",
|
||
"greeting": "Hi {{name}}",
|
||
"upcoming": "Upcoming appointments",
|
||
"noUpcoming": "No upcoming appointments.",
|
||
"resultsLabel": "Results",
|
||
"ready": "{{count}} result(s) are on file.",
|
||
"none": "No results are on file yet.",
|
||
"askStaff": "Please ask a staff member to review your results with you.",
|
||
"lookupAnother": "Look up another",
|
||
"errorGeneric": "Couldn't find your record. Please check your details or ask the front desk."
|
||
}
|
||
}
|
||
}
|