{ "nav": { "dashboard": "Dashboard", "medications": "Medications", "planner": "Planner", "settings": "Settings", "schedule": "Schedule" }, "header": { "eyebrow": { "overview": "MedAssist-ng · Overview", "inventory": "MedAssist-ng · Inventory", "planner": "MedAssist-ng · Planner", "settings": "MedAssist-ng · Configuration", "schedule": "MedAssist-ng · Schedule" } }, "dashboard": { "reorder": { "title": "Refill Reminder", "badge": "Stock watch", "noMeds": "No medications configured yet.", "allGood": "All good, enough stock.", "lowWarning": "Enough stock for now, but {{meds}} is running critically low.", "lowWarning_other": "Enough stock for now, but {{meds}} are running critically low.", "lowWarningPrefix": "Enough stock for now, but", "lowWarningSuffix": "is running critically low.", "lowWarningSuffix_other": "are running critically low.", "sendReminder": "🔔 Send Reminder Now" }, "overview": { "title": "Medication Overview", "badge": "Stock" }, "schedules": { "title": "Upcoming Schedules", "1month": "1 month", "3months": "3 months", "6months": "6 months", "allTaken": "All taken", "showPastDays": "Show past days", "hidePastDays": "Hide past days", "pastDaysCount": "{{count}} day", "pastDaysCount_other": "{{count}} days", "showFutureDays": "Show future days", "hideFutureDays": "Hide future days", "futureDaysCount": "{{count}} day", "futureDaysCount_other": "{{count}} days", "missedDoses": "{{count}} missed dose", "missedDoses_other": "{{count}} missed doses", "clearMissed": "Clear missed", "clearMissedConfirmTitle": "Clear Missed Doses?", "clearMissedConfirmMessage": "This will mark {{count}} missed dose as acknowledged without deducting from your stock.", "clearMissedConfirmMessage_other": "This will mark {{count}} missed doses as acknowledged without deducting from your stock.", "clearMissedConfirm": "Yes, Clear", "clearMissedCancel": "Cancel", "clearMissedSuccess": "Cleared {{count}} missed doses" }, "reminders": { "active": "Automatic reminders active", "status": "Status", "allStockOk": "All stock good", "allOk": "All good", "lastReminder": "Last intake reminder", "lastSent": "Last intake reminder", "lastStockSent": "Last stock reminder", "next": "Refill reminder", "nextIn": "Refill reminder", "inDays": "in {{days}} days", "inDays_one": "in {{days}} day", "inDays_other": "in {{days}} days", "noRemindersNeeded": "No reminders needed", "needRefill": "{{count}} med needs refill", "needRefill_other": "{{count}} meds need refill", "emptyStock": "{{count}} med is empty", "emptyStock_other": "{{count}} meds are empty", "lowWarning": "{{count}} medication running critically low", "lowWarning_other": "{{count}} medications running critically low", "waitingFirstCheck": "Waiting for first check", "type": "Type", "typeStock": "Stock", "typeIntake": "Intake", "via": "via", "channelEmail": "Email", "channelPush": "Push", "channelBoth": "Email + Push", "criticalMeds": "{{count}} medication critical", "criticalMeds_other": "{{count}} medications critical", "lowMeds": "{{count}} medication low", "lowMeds_other": "{{count}} medications low", "daysLeft": "{{days}} day left", "daysLeft_other": "{{days}} days left", "needsRefill": "Needs refill" } }, "table": { "name": "Name", "pills": "Pills", "days": "Days", "currentPills": "Current pills", "fullBlisters": "Full blisters", "openBlister": "Open blister", "stock": "Stock", "stockDetails": "Details", "daysLeft": "Days left", "status": "Status", "runsOut": "Runs out", "autoRemind": "Auto-remind", "expiry": "Expiry", "pillsCount": "{{count}} pills", "pillsCount_one": "{{count}} pill", "pillsCount_other": "{{count}} pills" }, "medications": { "list": { "title": "Medication list", "entries": "{{count}} entries", "entries_one": "{{count}} entry", "entries_other": "{{count}} entries" }, "details": { "packs": "Packs", "blisters": "Blisters per pack", "pillsPerBlister": "Pills per blister", "loose": "Loose", "total": "Total", "stock": "Stock", "totalCapacity": "Capacity", "type": "Type" } }, "form": { "editEntry": "Edit medication", "newEntry": "New medication", "badge": "Packs + loose pills", "commercialName": "Commercial Name", "genericName": "Generic Name", "takenBy": "Taken by", "packageType": "Package Type", "packageTypeBlister": "Blister Pack", "packageTypeBottle": "Pill Bottle", "packs": "Packs", "blistersPerPack": "Blisters per pack", "pillsPerBlister": "Pills per blister", "totalCapacity": "Total Capacity", "currentPills": "Current Pills", "loosePills": "Loose pills", "pillWeight": "Dose per pill", "total": "Total (pills)", "expiryDate": "Expiry Date", "notes": "Notes", "medicationImage": "Medication Image", "removeImage": "Remove Image", "placeholders": { "commercial": "e.g. Ozempic", "generic": "e.g. Semaglutide (optional)", "takenBy": "Type name and press Enter", "addPerson": "Add another person...", "weight": "e.g. 240", "notes": "e.g. Take with food, avoid alcohol... (optional)" }, "blisters": { "title": "Intake schedule", "remind": "Remind", "remindTooltip": "Receive a notification 15 minutes before each scheduled intake", "addIntake": "Intake", "usage": "Usage (pills)", "everyDays": "Every (days)", "every": "every", "from": "from", "startDate": "Date", "startTime": "Time", "takenByIntake": "Taken by", "takenByEveryone": "Everyone" } }, "planner": { "title": "Demand Calculator", "badge": "Plan your supply", "from": "From", "until": "Until", "includeUntilStart": "Include current consumption", "includeUntilStartTooltip": "When enabled, pills consumed between today and the selected start date are subtracted from your current stock. This gives a more accurate picture of how much you'll actually have left when the planning period begins.", "calculate": "Calculate", "calculating": "Calculating...", "sendEmail": "📧 Send via Email", "sendNotification": "🔔 Send Demand", "table": { "medication": "Medication", "usage": "Usage", "blistersNeeded": "Blisters needed", "blisters": "Blisters", "available": "Available" } }, "settings": { "loading": "Loading settings...", "language": { "title": "Language", "select": "Select language" }, "notifications": { "title": "Notifications", "channels": "Channels", "email": "Email", "push": "Push", "stockReminders": "Stock Reminders", "intakeReminders": "Intake Reminders", "enableHint": "Enable at least one channel below to receive notifications.", "skipTakenDoses": "Skip reminders for taken doses", "skipTakenDosesTooltip": "Don't send intake reminders for doses that have already been marked as taken today", "repeatReminders": "Repeat reminders for missed doses", "repeatRemindersTooltip": "Automatically send repeated reminders for doses that haven't been marked as taken", "reminderInterval": "Reminder interval (minutes)", "reminderIntervalTooltip": "How often to send repeated reminders for missed doses", "maxNaggingReminders": "Max reminders per dose", "maxNaggingRemindersTooltip": "Stop sending repeat reminders after this many attempts (1-20)" }, "email": { "recipient": "Recipient", "notConfigured": "Not configured" }, "push": { "url": "URL", "urlPlaceholder": "ntfy://topic or pushover://:token@userkey/", "supports": "Supports ntfy, Pushover, Gotify, Discord, Telegram, Slack & more", "docsLink": "See shoutrrr.dev for all services" }, "schedule": { "title": "Reminder Schedule", "stockCheck": "Stock check", "dailyAt6": "Daily at 6:00 AM", "intakeCheck": "Intake check", "15minBefore": "15 min before scheduled time", "nextCheck": "Next stock check", "lastSent": "Last notification sent", "lastStockSent": "Last stock reminder", "lastIntakeSent": "Last intake reminder", "envHint": "These values can be configured via REMINDER_HOUR and REMINDER_MINUTES_BEFORE in .env" }, "stock": { "title": "Stock", "calculationMode": "Stock Calculation", "automatic": "Automatic", "automaticDesc": "Stock automatically decreases based on schedule", "manual": "Manual", "manualDesc": "Stock only decreases when doses are marked as taken", "thresholds": "Thresholds", "criticalStockDays": "Critical (days)", "criticalStockTooltip": "Stock below this value is critical and needs immediate attention", "lowStockDays": "Low (days)", "lowStockTooltip": "Stock below this value means you should reorder soon", "highStockDays": "High (days)", "highStockTooltip": "Stock above this value means you are well supplied", "thresholdValidation": "Values must be: Critical < Low < High", "shareStockStatus": "Show Stock on Shared Links", "shareStockStatusDesc": "Show stock status (Normal/Low/Critical) and colored borders on shared schedule links for intake users" }, "stockReminder": { "title": "Stock Reminder", "description": "Sends notification when medication stock reaches", "repeatDaily": "Repeat daily", "repeatTooltip": "When enabled, sends reminders every day while stock is critical. Otherwise, only notifies once per medication until restocked." }, "saveSettings": "Save Settings" }, "modal": { "for": "for", "at": "at", "stockInfo": "Current Stock", "packageDetails": "Package Details", "currentStock": "Pills", "packs": "Packs", "blistersPerPack": "Blisters/Pack", "pillsPerBlister": "Pills/Blister", "loosePills": "Loose Pills", "pillWeight": "Pill Weight", "expiryDate": "Expiry Date", "intakeSchedule": "Intake Schedule", "coverageStatus": "Coverage Status", "daysLeft": "Days Left", "runsOut": "Runs Out", "notes": "Notes", "exportCalendar": "Export to Calendar", "exportTooltip": "Export schedule to calendar", "editMedication": "Edit Medication", "userMedications": "{{name}}'s Medications", "noMedsForUser": "No medications found for {{name}}" }, "status": { "outOfStock": "Empty", "criticalStock": "Critical", "lowStock": "Low", "normal": "Normal", "highStock": "High", "noSchedule": "No Schedule", "enough": "Enough", "noPillsLeft": "No pills left", "stockOk": "Stock OK" }, "tooltips": { "intakeReminders": "Intake reminders enabled", "hasNotes": "Has notes", "stockExceedsCapacity": "Stock exceeds package capacity — consider updating pack count", "lightMode": "Switch to light mode", "darkMode": "Switch to dark mode" }, "theme": { "title": "Theme", "light": "Light", "dark": "Dark", "system": "System" }, "dose": { "takenBy": "taken by", "markAsTaken": "Mark as taken" }, "auth": { "login": "Login", "logout": "Logout", "register": "Create Account", "createAdmin": "Create Admin Account", "profile": "Profile", "username": "Username", "password": "Password", "email": "Email", "confirmPassword": "Confirm Password", "currentPassword": "Current Password", "newPassword": "New Password", "changePassword": "Change Password", "forgotPassword": "Forgot password?", "sendResetLink": "Send Reset Link", "resetPassword": "Reset Password", "backToLogin": "Back to Login", "createAccount": "Create account", "alreadyHaveAccount": "Already have an account? Login", "firstUserInfo": "This will be the administrator account.", "usernameHint": "Letters, numbers, underscores, and hyphens only", "emailHint": "For password recovery", "passwordMismatch": "Passwords do not match", "checkEmail": "Check your email", "resetEmailSent": "If an account with this email exists, we've sent a password reset link.", "passwordReset": "Password Reset", "passwordResetSuccess": "Your password has been reset. Redirecting to login...", "profileUpdated": "Profile updated successfully", "rememberMe": "Remember me", "localAccount": "Local Account", "updatePassword": "Update Password", "fillAllFields": "Please fill in all password fields", "signOut": "Sign Out", "uploadAvatar": "Upload avatar", "removeAvatar": "Remove avatar", "avatarUpdated": "Avatar updated", "avatarRemoved": "Avatar removed", "loginWithSSO": "Login with {{provider}}", "or": "or", "deleteAccount": "Delete Account", "deleteAccountConfirmTitle": "Delete Account?", "deleteAccountConfirmText": "This will permanently delete your account and all your data (medications, settings, history). This action cannot be undone.", "deleteAccountButton": "Yes, delete my account" }, "common": { "loading": "Loading...", "sending": "Sending...", "sent": "Sent!", "sendFailed": "Failed to send", "networkError": "Network error", "saving": "Saving...", "unsavedChanges": { "title": "Unsaved Changes", "message": "You have unsaved changes. Are you sure you want to leave?", "leave": "Leave", "stay": "Stay" }, "validation": { "required": "This field is required", "maxLength": "Maximum {{max}} characters ({{current}}/{{max}})", "tooLong": "{{current}}/{{max}} characters" }, "saved": "Saved ✓", "save": "Save", "cancel": "Cancel", "close": "Close", "edit": "Edit", "delete": "Delete", "remove": "Remove", "reset": "Reset", "test": "Test", "undo": "Undo", "expand": "Click to expand", "collapse": "Click to collapse", "optional": "optional", "pill": "pill", "pills": "pills", "of": "of", "loose": "loose", "none": "None", "day": "day", "days": "days", "blister": "blister", "blisters": "blisters", "fullBlister": "full blister", "fullBlisters": "full blisters", "inBlister": "in 1 blister", "total": "total", "pillsTotal": "{{count}} pills total", "pillsTotal_one": "{{count}} pill total", "pillsTotal_other": "{{count}} pills total", "max": "max" }, "share": { "button": "Share", "title": "Share Schedule", "description": "Generate a secret link to share the medication schedule for a specific person. Anyone with this link can view the schedule. When the person marks a dose as taken, it will also be marked as taken in your app.", "selectPerson": "Select person", "selectPeriod": "Select time period", "generateLink": "Generate Link", "generating": "Generating...", "generateAnother": "Generate another link", "linkGenerated": "Share link generated!", "copyLink": "Copy Link", "copied": "Copied to clipboard!", "noPeople": "No medications with 'Taken by' assigned. Add a person to a medication first.", "scheduleFor": "Schedule for", "period": "Period", "noSchedule": "No scheduled doses found.", "generatedBy": "Generated by", "notFound": "Share link not found", "error": "Failed to load schedule", "expired": { "title": "Link Expired", "message": "This share link for {{takenBy}}'s medication schedule has expired.", "contact": "Please contact {{username}} to request a new link.", "expiredOn": "Expired on: {{date}}" } }, "exportImport": { "title": "Data Export / Import", "description": "Backup your data or transfer it to another device.", "exportTitle": "Export", "exportDesc": "Download all your data as a JSON file.", "importTitle": "Import", "importDesc": "Restore data from a backup file. This will replace all existing data.", "export": "Export Data", "exporting": "Exporting...", "import": "Select File", "importing": "Importing...", "selectFile": "Select File", "includeSensitive": "Include sensitive data (notification URLs)", "sensitiveWarning": "Notification URLs may contain passwords and will be stored in plain text.", "includeImages": "Include medication images", "includeImagesHint": "Images significantly increase file size. Uncheck for smaller exports (~50 KB instead of several MB).", "exportOptions": "Export Options", "exportWithImages": "With Images", "exportWithImagesDesc": "Full backup including all medication images. Larger file size.", "exportDataOnly": "Data Only", "exportDataOnlyDesc": "Compact backup without images. Much smaller file size (~50 KB).", "confirmImport": "Replace All Data?", "confirmImportMessage": "This will permanently delete all your current medications, dose history, settings, and share links, then replace them with the imported data.", "confirmImportWarning": "This action cannot be undone!", "confirmButton": "Yes, Replace All", "cancelButton": "Cancel", "exportSuccess": "Data exported successfully", "importSuccess": "Data imported successfully", "importSuccessDetails": "Imported: {{medications}} medications, {{doses}} doses, {{shares}} share links", "importError": "Failed to import data", "invalidFile": "Invalid file format. Please select a valid MedAssist-ng export file.", "downloadFilename": "medassist-export" }, "refill": { "title": "Refill", "packs": "Packs to add", "pillsToAdd": "Pills to add", "loosePills": "Loose pills to add", "pillsPerPack": "1 pack = {{count}} pills", "addToStock": "Add to Stock", "adding": "Adding...", "success": "Added {{pills}} pills to stock", "history": "Refill History", "noHistory": "No refills recorded yet", "packsAdded": "{{count}} pack", "packsAdded_other": "{{count}} packs", "pillsAdded": "{{count}} pill", "pillsAdded_other": "{{count}} pills", "button": "Refill" }, "editStock": { "title": "Correct Stock", "hint": "This is for correcting stock discrepancies. For regular stock changes, use 'Refill'.", "totalPills": "Total pills", "fullBlisters": "Full blisters", "partialBlisterPills": "Partial blister", "pillsPerBlister": "({{count}} pills each)", "currentTotal": "Current total", "newTotal": "New total", "difference": "Difference", "save": "Save Correction", "saving": "Saving...", "success": "Stock corrected successfully" }, "about": { "title": "About", "appName": "MedAssist-ng", "description": "Open-source medication tracking and planning application for self-hosted environments.", "version": "Version", "checkForUpdates": "Check for Updates", "checking": "Checking...", "upToDate": "You're up to date!", "updateAvailable": "Update available", "downloadUpdate": "Download Update", "checkFailed": "Could not check for updates", "viewOnGitHub": "View on GitHub", "github": "GitHub", "license": "MIT License", "copyright": "© {{year}} Daniel Volz", "madeWith": "Made with ❤️ for better health management", "techStack": "Built with React, Fastify & SQLite" } }