Files
temetro/frontend/lib/i18n/locales/en/translation.json
T
Khalid Abdi 36461a5498 feat: patient blood type & phone + clinic location setting (v0.9.0)
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>
2026-07-06 22:07:27 +03:00

2183 lines
83 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.
{
"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.017.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": "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",
"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."
}
}
}