const en: Record<string, string | { name: string; category: string }[]> = {
  // Common
  'common.save': 'Save',
  'common.showMore': 'Show more',
  'common.showLess': 'Show less',
  'common.cancel': 'Cancel',
  'common.clear': 'Clear',
  'common.delete': 'Delete',
  'common.edit': 'Edit',
  'common.add': 'Add',
  'common.loading': 'Loading...',
  'common.import': 'Import',
  'common.select': 'Select',
  'common.selectAll': 'Select all',
  'common.deselectAll': 'Deselect all',
  'common.error': 'Error',
  'common.unknownError': 'Unknown error',
  'common.tooManyAttempts': 'Too many attempts. Please try again later.',
  'common.back': 'Back',
  'common.all': 'All',
  'common.close': 'Close',
  'common.open': 'Open',
  'common.upload': 'Upload',
  'common.search': 'Search',
  'common.confirm': 'Confirm',
  'common.ok': 'OK',
  'common.yes': 'Yes',
  'common.no': 'No',
  'common.or': 'or',
  'common.none': 'None',
  'common.date': 'Date',
  'common.rename': 'Rename',
  'common.discardChanges': 'Discard Changes',
  'common.discard': 'Discard',
  'common.name': 'Name',
  'common.email': 'Email',
  'common.password': 'Password',
  'common.saving': 'Saving...',
  'common.justNow': 'just now',
  'common.hoursAgo': '{count}h ago',
  'common.daysAgo': '{count}d ago',
  'common.saved': 'Saved',
  'trips.memberRemoved': '{username} removed',
  'trips.memberRemoveError': 'Failed to remove',
  'trips.memberAdded': '{username} added',
  'trips.memberAddError': 'Failed to add',
  'trips.reminder': 'Reminder',
  'trips.reminderNone': 'None',
  'trips.reminderDay': 'day',
  'trips.reminderDays': 'days',
  'trips.reminderCustom': 'Custom',
  'trips.reminderDaysBefore': 'days before departure',
  'trips.reminderDisabledHint': 'Trip reminders are disabled. Enable them in Admin > Settings > Notifications.',
  'common.update': 'Update',
  'common.change': 'Change',
  'common.uploading': 'Uploading…',
  'common.backToPlanning': 'Back to Planning',
  'common.reset': 'Reset',
  'common.expand': 'Expand',
  'common.collapse': 'Collapse',

  // Navbar
  'nav.trip': 'Trip',
  'nav.share': 'Share',
  'nav.settings': 'Settings',
  'nav.admin': 'Admin',
  'nav.logout': 'Log out',
  'nav.lightMode': 'Light Mode',
  'nav.darkMode': 'Dark Mode',
  'nav.autoMode': 'Auto Mode',
  'nav.administrator': 'Administrator',

  // Dashboard
  'dashboard.title': 'My Trips',
  'dashboard.subtitle.loading': 'Loading trips...',
  'dashboard.subtitle.trips': '{count} trips ({archived} archived)',
  'dashboard.subtitle.empty': 'Start your first trip',
  'dashboard.subtitle.activeOne': '{count} active trip',
  'dashboard.subtitle.activeMany': '{count} active trips',
  'dashboard.subtitle.archivedSuffix': ' · {count} archived',
  'dashboard.newTrip': 'New Trip',
  'dashboard.gridView': 'Grid view',
  'dashboard.listView': 'List view',
  'dashboard.currency': 'Currency',
  'dashboard.timezone': 'Timezones',
  'dashboard.localTime': 'Local',
  'dashboard.timezoneCustomTitle': 'Custom Timezone',
  'dashboard.timezoneCustomLabelPlaceholder': 'Label (optional)',
  'dashboard.timezoneCustomTzPlaceholder': 'e.g. America/New_York',
  'dashboard.timezoneCustomAdd': 'Add',
  'dashboard.timezoneCustomErrorEmpty': 'Enter a timezone identifier',
  'dashboard.timezoneCustomErrorInvalid': 'Invalid timezone. Use format like Europe/Berlin',
  'dashboard.timezoneCustomErrorDuplicate': 'Already added',
  'dashboard.emptyTitle': 'No trips yet',
  'dashboard.emptyText': 'Create your first trip and start planning!',
  'dashboard.emptyButton': 'Create First Trip',
  'dashboard.nextTrip': 'Next Trip',
  'dashboard.shared': 'Shared',
  'dashboard.sharedBy': 'Shared by {name}',
  'dashboard.days': 'Days',
  'dashboard.places': 'Places',
  'dashboard.members': 'Buddies',
  'dashboard.archive': 'Archive',
  'dashboard.copyTrip': 'Copy',
  'dashboard.copySuffix': 'copy',
  'dashboard.restore': 'Restore',
  'dashboard.archived': 'Archived',
  'dashboard.status.ongoing': 'Ongoing',
  'dashboard.status.today': 'Today',
  'dashboard.status.tomorrow': 'Tomorrow',
  'dashboard.status.past': 'Past',
  'dashboard.status.daysLeft': '{count} days left',
  'dashboard.toast.loadError': 'Failed to load trips',
  'dashboard.toast.created': 'Trip created successfully!',
  'dashboard.toast.createError': 'Failed to create trip',
  'dashboard.toast.updated': 'Trip updated!',
  'dashboard.toast.updateError': 'Failed to update trip',
  'dashboard.toast.deleted': 'Trip deleted',
  'dashboard.toast.deleteError': 'Failed to delete trip',
  'dashboard.toast.archived': 'Trip archived',
  'dashboard.toast.archiveError': 'Failed to archive trip',
  'dashboard.toast.restored': 'Trip restored',
  'dashboard.toast.restoreError': 'Failed to restore trip',
  'dashboard.toast.copied': 'Trip copied!',
  'dashboard.toast.copyError': 'Failed to copy trip',
  'dashboard.confirm.delete': 'Delete trip "{title}"? All places and plans will be permanently deleted.',
  'dashboard.confirm.copy.title': 'Copy this trip?',
  'dashboard.confirm.copy.willCopy': 'Will be copied',
  'dashboard.confirm.copy.will1': 'Days, places & day assignments',
  'dashboard.confirm.copy.will2': 'Accommodations & reservations',
  'dashboard.confirm.copy.will3': 'Budget items & category order',
  'dashboard.confirm.copy.will4': 'Packing lists (unchecked)',
  'dashboard.confirm.copy.will5': 'TODOs (unassigned & unchecked)',
  'dashboard.confirm.copy.will6': 'Day notes',
  'dashboard.confirm.copy.wontCopy': "Won't be copied",
  'dashboard.confirm.copy.wont1': 'Collaborators & member assignments',
  'dashboard.confirm.copy.wont2': 'Collab notes, polls & messages',
  'dashboard.confirm.copy.wont3': 'Files & photos',
  'dashboard.confirm.copy.wont4': 'Share tokens',
  'dashboard.confirm.copy.confirm': 'Copy trip',
  'dashboard.editTrip': 'Edit Trip',
  'dashboard.createTrip': 'Create New Trip',
  'dashboard.tripTitle': 'Title',
  'dashboard.tripTitlePlaceholder': 'e.g. Summer in Japan',
  'dashboard.tripDescription': 'Description',
  'dashboard.tripDescriptionPlaceholder': 'What is this trip about?',
  'dashboard.startDate': 'Start Date',
  'dashboard.endDate': 'End Date',
  'dashboard.dayCount': 'Number of Days',
  'dashboard.dayCountHint': 'How many days to plan for when no travel dates are set.',
  'dashboard.noDateHint': 'No date set — 7 default days will be created. You can change this anytime.',
  'dashboard.coverImage': 'Cover Image',
  'dashboard.addCoverImage': 'Add cover image (or drag & drop)',
  'dashboard.addMembers': 'Travel buddies',
  'dashboard.addMember': 'Add member',
  'dashboard.coverSaved': 'Cover image saved',
  'dashboard.coverUploadError': 'Failed to upload',
  'dashboard.coverRemoveError': 'Failed to remove',
  'dashboard.titleRequired': 'Title is required',
  'dashboard.endDateError': 'End date must be after start date',

  // Settings
  'settings.title': 'Settings',
  'settings.subtitle': 'Configure your personal settings',
  'settings.tabs.display': 'Display',
  'settings.tabs.map': 'Map',
  'settings.tabs.notifications': 'Notifications',
  'settings.tabs.integrations': 'Integrations',
  'settings.tabs.account': 'Account',
  'settings.tabs.offline': 'Offline',
  'settings.tabs.about': 'About',
  'settings.map': 'Map',
  'settings.mapTemplate': 'Map Template',
  'settings.mapTemplatePlaceholder.select': 'Select template...',
  'settings.mapDefaultHint': 'Leave empty for OpenStreetMap (default)',
  'settings.mapTemplatePlaceholder': 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
  'settings.mapHint': 'URL template for map tiles',
  'settings.mapProvider': 'Map Provider',
  'settings.mapProviderHint': 'Affects Trip Planner and Journey maps. Atlas always uses Leaflet.',
  'settings.mapLeafletSubtitle': 'Classic 2D, any raster tiles',
  'settings.mapMapboxSubtitle': 'Vector tiles, 3D buildings & terrain',
  'settings.mapExperimental': 'Experimental',
  'settings.mapMapboxToken': 'Mapbox Access Token',
  'settings.mapMapboxTokenHint': 'Public token (pk.*) from',
  'settings.mapMapboxTokenLink': 'mapbox.com → Access tokens',
  'settings.mapStyle': 'Map Style',
  'settings.mapStylePlaceholder': 'Select a Mapbox style',
  'settings.mapStyleHint': 'Preset or your own mapbox://styles/USER/ID URL',
  'settings.map3dBuildings': '3D Buildings & Terrain',
  'settings.map3dHint': 'Pitch + real 3D building extrusions — works on every style, including satellite.',
  'settings.mapHighQuality': 'High Quality Mode',
  'settings.mapHighQualityHint': 'Antialiasing + globe projection for sharper edges and a realistic world view.',
  'settings.mapHighQualityWarning': 'May impact performance on lower-end devices.',
  'settings.mapTipLabel': 'Tip:',
  'settings.mapTip': 'right-click and drag to rotate/pitch the map. Middle-click to add a place (right-click is reserved for rotation).',
  'settings.latitude': 'Latitude',
  'settings.longitude': 'Longitude',
  'settings.saveMap': 'Save Map',
  'settings.apiKeys': 'API Keys',
  'settings.mapsKey': 'Google Maps API Key',
  'settings.mapsKeyHint': 'For place search. Requires Places API (New). Get at console.cloud.google.com',
  'settings.weatherKey': 'OpenWeatherMap API Key',
  'settings.weatherKeyHint': 'For weather data. Free at openweathermap.org/api',
  'settings.keyPlaceholder': 'Enter key...',
  'settings.configured': 'Configured',
  'settings.saveKeys': 'Save Keys',
  'settings.display': 'Display',
  'settings.colorMode': 'Color Mode',
  'settings.light': 'Light',
  'settings.dark': 'Dark',
  'settings.auto': 'Auto',
  'settings.language': 'Language',
  'settings.temperature': 'Temperature Unit',
  'settings.timeFormat': 'Time Format',
  'settings.routeCalculation': 'Route Calculation',
  'settings.bookingLabels': 'Booking route labels',
  'settings.bookingLabelsHint': 'Show station / airport names on the map. When off, only the icon is shown.',
  'settings.blurBookingCodes': 'Blur Booking Codes',
  'settings.notifications': 'Notifications',
  'settings.notifyTripInvite': 'Trip invitations',
  'settings.notifyBookingChange': 'Booking changes',
  'settings.notifyTripReminder': 'Trip reminders',
  'settings.notifyTodoDue': 'Todo due soon',
  'settings.notifyVacayInvite': 'Vacay fusion invitations',
  'settings.notifyPhotosShared': 'Shared photos (Immich)',
  'settings.notifyCollabMessage': 'Chat messages (Collab)',
  'settings.notifyPackingTagged': 'Packing list: assignments',
  'settings.notifyWebhook': 'Webhook notifications',
  'settings.notifyVersionAvailable': 'New version available',
  'settings.notificationPreferences.email': 'Email',
  'settings.notificationPreferences.webhook': 'Webhook',
  'settings.notificationPreferences.inapp': 'In-App',
  'settings.notificationPreferences.ntfy': 'Ntfy',
  'settings.notificationPreferences.noChannels': 'No notification channels are configured. Ask an admin to set up email or webhook notifications.',
  'settings.webhookUrl.label': 'Webhook URL',
  'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
  'settings.webhookUrl.hint': 'Enter your Discord, Slack, or custom webhook URL to receive notifications.',
  'settings.webhookUrl.saved': 'Webhook URL saved',
  'settings.webhookUrl.test': 'Test',
  'settings.webhookUrl.testSuccess': 'Test webhook sent successfully',
  'settings.webhookUrl.testFailed': 'Test webhook failed',
  'settings.ntfyUrl.topicLabel': 'Ntfy Topic',
  'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
  'settings.ntfyUrl.serverLabel': 'Ntfy Server URL (optional)',
  'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
  'settings.ntfyUrl.hint': 'Enter your ntfy topic to receive push notifications. Leave server blank to use the default configured by your admin.',
  'settings.ntfyUrl.tokenLabel': 'Access Token (optional)',
  'settings.ntfyUrl.tokenHint': 'Required for password-protected topics.',
  'settings.ntfyUrl.saved': 'Ntfy settings saved',
  'settings.ntfyUrl.test': 'Test',
  'settings.ntfyUrl.testSuccess': 'Test ntfy notification sent successfully',
  'settings.ntfyUrl.testFailed': 'Test ntfy notification failed',
  'settings.ntfyUrl.tokenCleared': 'Access token cleared',
  'admin.notifications.title': 'Notifications',
  'admin.notifications.hint': 'Choose one notification channel. Only one can be active at a time.',
  'admin.notifications.none': 'Disabled',
  'admin.notifications.email': 'Email (SMTP)',
  'admin.notifications.webhook': 'Webhook',
  'admin.notifications.ntfy': 'Ntfy',
  'admin.ntfy.hint': 'Allow users to configure their own ntfy topics for push notifications. Set the default server below to pre-fill user settings.',
  'admin.notifications.save': 'Save notification settings',
  'admin.notifications.saved': 'Notification settings saved',
  'admin.notifications.testWebhook': 'Send test webhook',
  'admin.notifications.testWebhookSuccess': 'Test webhook sent successfully',
  'admin.notifications.testWebhookFailed': 'Test webhook failed',
  'admin.notifications.testNtfy': 'Send test ntfy',
  'admin.notifications.testNtfySuccess': 'Test ntfy sent successfully',
  'admin.notifications.testNtfyFailed': 'Test ntfy failed',
  'admin.notifications.emailPanel.title': 'Email (SMTP)',
  'admin.notifications.webhookPanel.title': 'Webhook',
  'admin.notifications.inappPanel.title': 'In-App',
  'admin.notifications.inappPanel.hint': 'In-app notifications are always active and cannot be disabled globally.',
  'admin.notifications.adminWebhookPanel.title': 'Admin Webhook',
  'admin.notifications.adminWebhookPanel.hint': 'This webhook is used exclusively for admin notifications (e.g. version alerts). It is separate from per-user webhooks and always fires when set.',
  'admin.notifications.adminWebhookPanel.saved': 'Admin webhook URL saved',
  'admin.notifications.adminWebhookPanel.testSuccess': 'Test webhook sent successfully',
  'admin.notifications.adminWebhookPanel.testFailed': 'Test webhook failed',
  'admin.notifications.adminWebhookPanel.alwaysOnHint': 'Admin webhook always fires when a URL is configured',
  'admin.notifications.adminNtfyPanel.title': 'Admin Ntfy',
  'admin.notifications.adminNtfyPanel.hint': 'This ntfy topic is used exclusively for admin notifications (e.g. version alerts). It is separate from per-user topics and always fires when configured.',
  'admin.notifications.adminNtfyPanel.serverLabel': 'Ntfy Server URL',
  'admin.notifications.adminNtfyPanel.serverHint': 'Also used as the default server for user ntfy notifications. Leave blank to default to ntfy.sh. Users can override this in their own settings.',
  'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh',
  'admin.notifications.adminNtfyPanel.topicLabel': 'Admin Topic',
  'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts',
  'admin.notifications.adminNtfyPanel.tokenLabel': 'Access Token (optional)',
  'admin.notifications.adminNtfyPanel.tokenCleared': 'Admin access token cleared',
  'admin.notifications.adminNtfyPanel.saved': 'Admin ntfy settings saved',
  'admin.notifications.adminNtfyPanel.test': 'Send test ntfy',
  'admin.notifications.adminNtfyPanel.testSuccess': 'Test ntfy sent successfully',
  'admin.notifications.adminNtfyPanel.testFailed': 'Test ntfy failed',
  'admin.notifications.adminNtfyPanel.alwaysOnHint': 'Admin ntfy always fires when a topic is configured',
  'admin.notifications.adminNotificationsHint': 'Configure which channels deliver admin-only notifications (e.g. version alerts).',
  'admin.notifications.tripReminders.title': 'Trip Reminders',
  'admin.notifications.tripReminders.hint': 'Send a reminder notification before a trip starts (requires reminder days to be set on the trip).',
  'admin.notifications.tripReminders.enabled': 'Trip reminders enabled',
  'admin.notifications.tripReminders.disabled': 'Trip reminders disabled',
  'admin.smtp.title': 'Email & Notifications',
  'admin.smtp.hint': 'SMTP configuration for sending email notifications.',
  'admin.smtp.testButton': 'Send test email',
  'admin.webhook.hint': 'Allow users to configure their own webhook URLs for notifications (Discord, Slack, etc.).',
  'admin.smtp.testSuccess': 'Test email sent successfully',
  'admin.smtp.testFailed': 'Test email failed',
  'settings.notificationsDisabled': 'Notifications are not configured. Ask an admin to enable email or webhook notifications.',
  'settings.notificationsActive': 'Active channel',
  'settings.notificationsManagedByAdmin': 'Notification events are configured by your administrator.',
  'dayplan.icsTooltip': 'Export calendar (ICS)',
  'share.linkTitle': 'Public Link',
  'share.linkHint': 'Create a link anyone can use to view this trip without logging in. Read-only — no editing possible.',
  'share.createLink': 'Create link',
  'share.deleteLink': 'Delete link',
  'share.createError': 'Could not create link',
  'common.copy': 'Copy',
  'common.copied': 'Copied',
  'share.permMap': 'Map & Plan',
  'share.permBookings': 'Bookings',
  'share.permPacking': 'Packing',
  'shared.expired': 'Link expired or invalid',
  'shared.expiredHint': 'This shared trip link is no longer active.',
  'shared.readOnly': 'Read-only shared view',
  'shared.tabPlan': 'Plan',
  'shared.tabBookings': 'Bookings',
  'shared.tabPacking': 'Packing',
  'shared.tabBudget': 'Budget',
  'shared.tabChat': 'Chat',
  'shared.days': 'days',
  'shared.places': 'places',
  'shared.other': 'Other',
  'shared.totalBudget': 'Total Budget',
  'shared.messages': 'messages',
  'shared.sharedVia': 'Shared via',
  'shared.confirmed': 'Confirmed',
  'shared.pending': 'Pending',
  'share.permBudget': 'Budget',
  'share.permCollab': 'Chat',
  'settings.on': 'On',
  'settings.off': 'Off',
  'settings.mcp.title': 'MCP Configuration',
  'settings.mcp.endpoint': 'MCP Endpoint',
  'settings.mcp.clientConfig': 'Client Configuration',
  'settings.mcp.clientConfigHint': 'Replace <your_token> with an API token from the list below. The path to npx may need to be adjusted for your system (e.g. C:\\PROGRA~1\\nodejs\\npx.cmd on Windows).',
  'settings.mcp.clientConfigHintOAuth': 'Replace <your_client_id> and <your_client_secret> with the credentials shown in the OAuth 2.1 client you created above. mcp-remote will open your browser to complete the authorization the first time you connect. The path to npx may need to be adjusted for your system (e.g. C:\PROGRA~1\nodejs\npx.cmd on Windows).',
  'settings.mcp.copy': 'Copy',
  'settings.mcp.copied': 'Copied!',
  'settings.mcp.apiTokens': 'API Tokens',
  'settings.mcp.createToken': 'Create New Token',
  'settings.mcp.noTokens': 'No tokens yet. Create one to connect MCP clients.',
  'settings.mcp.tokenCreatedAt': 'Created',
  'settings.mcp.tokenUsedAt': 'Used',
  'settings.mcp.deleteTokenTitle': 'Delete Token',
  'settings.mcp.deleteTokenMessage': 'This token will stop working immediately. Any MCP client using it will lose access.',
  'settings.mcp.modal.createTitle': 'Create API Token',
  'settings.mcp.modal.tokenName': 'Token Name',
  'settings.mcp.modal.tokenNamePlaceholder': 'e.g. Claude Desktop, Work laptop',
  'settings.mcp.modal.creating': 'Creating…',
  'settings.mcp.modal.create': 'Create Token',
  'settings.mcp.modal.createdTitle': 'Token Created',
  'settings.mcp.modal.createdWarning': 'This token will only be shown once. Copy and store it now — it cannot be recovered.',
  'settings.mcp.modal.done': 'Done',
  'settings.mcp.toast.created': 'Token created',
  'settings.mcp.toast.createError': 'Failed to create token',
  'settings.mcp.toast.deleted': 'Token deleted',
  'settings.mcp.toast.deleteError': 'Failed to delete token',
  'settings.mcp.apiTokensDeprecated': 'API Tokens are deprecated and will be removed in a future release. Please use OAuth 2.1 Clients instead.',
  'settings.oauth.clients': 'OAuth 2.1 Clients',
  'settings.oauth.clientsHint': 'Register OAuth 2.1 clients to let third-party MCP applications (Claude Web, Cursor, etc.) connect without static tokens.',
  'settings.oauth.createClient': 'New Client',
  'settings.oauth.noClients': 'No OAuth clients registered.',
  'settings.oauth.clientId': 'Client ID',
  'settings.oauth.clientSecret': 'Client Secret',
  'settings.oauth.deleteClient': 'Delete Client',
  'settings.oauth.deleteClientMessage': 'This client and all active sessions will be permanently removed. Any application using it will lose access immediately.',
  'settings.oauth.rotateSecret': 'Rotate Secret',
  'settings.oauth.rotateSecretMessage': 'A new client secret will be generated and all existing sessions will be invalidated immediately. Update your application before closing this dialog.',
  'settings.oauth.rotateSecretConfirm': 'Rotate',
  'settings.oauth.rotateSecretConfirming': 'Rotating…',
  'settings.oauth.rotateSecretDoneTitle': 'New Secret Generated',
  'settings.oauth.rotateSecretDoneWarning': 'This secret is shown only once. Copy it now and update your application — all previous sessions have been invalidated.',
  'settings.oauth.activeSessions': 'Active OAuth Sessions',
  'settings.oauth.sessionScopes': 'Scopes',
  'settings.oauth.sessionExpires': 'Expires',
  'settings.oauth.revoke': 'Revoke',
  'settings.oauth.revokeSession': 'Revoke Session',
  'settings.oauth.revokeSessionMessage': 'This will immediately revoke access for this OAuth session.',
  'settings.oauth.modal.createTitle': 'Register OAuth Client',
  'settings.oauth.modal.presets': 'Quick presets',
  'settings.oauth.modal.clientName': 'Application Name',
  'settings.oauth.modal.clientNamePlaceholder': 'e.g. Claude Web, My MCP App',
  'settings.oauth.modal.redirectUris': 'Redirect URIs',
  'settings.oauth.modal.redirectUrisPlaceholder': 'https://your-app.com/callback\nhttps://your-app.com/auth',
  'settings.oauth.modal.redirectUrisHint': 'One URI per line. HTTPS required (localhost exempt). Exact match enforced.',
  'settings.oauth.modal.scopes': 'Allowed Scopes',
  'settings.oauth.modal.scopesHint': 'list_trips and get_trip_summary are always available — no scope required. They let the AI discover trip IDs needed to use any other tool.',
  'settings.oauth.modal.selectAll': 'Select all',
  'settings.oauth.modal.deselectAll': 'Deselect all',
  'settings.oauth.modal.creating': 'Registering…',
  'settings.oauth.modal.create': 'Register Client',
  'settings.oauth.modal.createdTitle': 'Client Registered',
  'settings.oauth.modal.createdWarning': 'The client secret is shown only once. Copy it now — it cannot be recovered.',
  'settings.oauth.toast.createError': 'Failed to register OAuth client',
  'settings.oauth.toast.deleted': 'OAuth client deleted',
  'settings.oauth.toast.deleteError': 'Failed to delete OAuth client',
  'settings.oauth.toast.revoked': 'Session revoked',
  'settings.oauth.toast.revokeError': 'Failed to revoke session',
  'settings.oauth.toast.rotateError': 'Failed to rotate client secret',
  'settings.account': 'Account',
  'settings.about': 'About',
  'settings.about.reportBug': 'Report a Bug',
  'settings.about.reportBugHint': 'Found an issue? Let us know',
  'settings.about.featureRequest': 'Feature Request',
  'settings.about.featureRequestHint': 'Suggest a new feature',
  'settings.about.wikiHint': 'Documentation & guides',
  'settings.about.supporters.badge': 'Monthly Supporters',
  'settings.about.supporters.title': 'Travel companions for TREK',
  'settings.about.supporters.subtitle': "While you're planning your next route, these folks are helping plan TREK's future. Their monthly contribution goes straight into development and real hours spent — so TREK stays Open Source.",
  'settings.about.supporters.since': 'supporter since {date}',
  'settings.about.supporters.tierEmpty': 'Be the first',
  'settings.about.supporter.tier.noReturnTicket': 'No Return Ticket',
  'settings.about.supporter.tier.lostLuggageVip': 'Lost Luggage VIP',
  'settings.about.supporter.tier.businessClassDreamer': 'Business Class Dreamer',
  'settings.about.supporter.tier.budgetTraveller': 'Budget Traveller',
  'settings.about.supporter.tier.hostelBunkmate': 'Hostel Bunkmate',
  'settings.about.description': 'TREK is a self-hosted travel planner that helps you organize your trips from the first idea to the last memory. Day planning, budget, packing lists, photos and much more — all in one place, on your own server.',
  'settings.about.madeWith': 'Made with',
  'settings.about.madeBy': 'by Maurice and a growing open-source community.',
  'settings.username': 'Username',
  'settings.email': 'Email',
  'settings.role': 'Role',
  'settings.roleAdmin': 'Administrator',
  'settings.oidcLinked': 'Linked with',
  'settings.changePassword': 'Change Password',
  'settings.currentPassword': 'Current password',
  'settings.currentPasswordRequired': 'Current password is required',
  'settings.newPassword': 'New password',
  'settings.confirmPassword': 'Confirm new password',
  'settings.updatePassword': 'Update password',
  'settings.passwordRequired': 'Please enter current and new password',
  'settings.passwordTooShort': 'Password must be at least 8 characters',
  'settings.passwordMismatch': 'Passwords do not match',
  'settings.passwordWeak': 'Password must contain uppercase, lowercase, a number, and a special character',
  'settings.passwordChanged': 'Password changed successfully',
  'settings.mustChangePassword': 'You must change your password before you can continue. Please set a new password below.',
  'settings.deleteAccount': 'Delete account',
  'settings.deleteAccountTitle': 'Delete your account?',
  'settings.deleteAccountWarning': 'Your account and all your trips, places, and files will be permanently deleted. This action cannot be undone.',
  'settings.deleteAccountConfirm': 'Delete permanently',
  'settings.deleteBlockedTitle': 'Deletion not possible',
  'settings.deleteBlockedMessage': 'You are the only administrator. Promote another user to admin before deleting your account.',
  'settings.roleUser': 'User',
  'settings.saveProfile': 'Save Profile',
  'settings.toast.mapSaved': 'Map settings saved',
  'settings.toast.keysSaved': 'API keys saved',
  'settings.toast.displaySaved': 'Display settings saved',
  'settings.toast.profileSaved': 'Profile saved',
  'settings.uploadAvatar': 'Upload Profile Picture',
  'settings.removeAvatar': 'Remove Profile Picture',
  'settings.avatarUploaded': 'Profile picture updated',
  'settings.avatarRemoved': 'Profile picture removed',
  'settings.avatarError': 'Upload failed',
  'settings.mfa.title': 'Two-factor authentication (2FA)',
  'settings.mfa.description': 'Adds a second step when you sign in with email and password. Use an authenticator app (Google Authenticator, Authy, etc.).',
  'settings.mfa.requiredByPolicy': 'Your administrator requires two-factor authentication. Set up an authenticator app below before continuing.',
  'settings.mfa.backupTitle': 'Backup codes',
  'settings.mfa.backupDescription': 'Use these one-time backup codes if you lose access to your authenticator app.',
  'settings.mfa.backupWarning': 'Save these codes now. Each code can only be used once.',
  'settings.mfa.backupCopy': 'Copy codes',
  'settings.mfa.backupDownload': 'Download TXT',
  'settings.mfa.backupPrint': 'Print / PDF',
  'settings.mfa.backupCopied': 'Backup codes copied',
  'settings.mfa.enabled': '2FA is enabled on your account.',
  'settings.mfa.disabled': '2FA is not enabled.',
  'settings.mfa.setup': 'Set up authenticator',
  'settings.mfa.scanQr': 'Scan this QR code with your app, or enter the secret manually.',
  'settings.mfa.secretLabel': 'Secret key (manual entry)',
  'settings.mfa.codePlaceholder': '6-digit code',
  'settings.mfa.enable': 'Enable 2FA',
  'settings.mfa.cancelSetup': 'Cancel',
  'settings.mfa.disableTitle': 'Disable 2FA',
  'settings.mfa.disableHint': 'Enter your account password and a current code from your authenticator.',
  'settings.mfa.disable': 'Disable 2FA',
  'settings.mfa.toastEnabled': 'Two-factor authentication enabled',
  'settings.mfa.toastDisabled': 'Two-factor authentication disabled',
  'settings.mfa.demoBlocked': 'Not available in demo mode',

  // Login
  'login.error': 'Login failed. Please check your credentials.',
  'login.tagline': 'Your Trips.\nYour Plan.',
  'login.description': 'Plan trips collaboratively with interactive maps, budgets, and real-time sync.',
  'login.features.maps': 'Interactive Maps',
  'login.features.mapsDesc': 'Google Places, routes & clustering',
  'login.features.realtime': 'Real-Time Sync',
  'login.features.realtimeDesc': 'Plan together via WebSocket',
  'login.features.budget': 'Budget Tracking',
  'login.features.budgetDesc': 'Categories, charts & per-person costs',
  'login.features.collab': 'Collaboration',
  'login.features.collabDesc': 'Multi-user with shared trips',
  'login.features.packing': 'Packing Lists',
  'login.features.packingDesc': 'Categories, progress & suggestions',
  'login.features.bookings': 'Reservations',
  'login.features.bookingsDesc': 'Flights, hotels, restaurants & more',
  'login.features.files': 'Documents',
  'login.features.filesDesc': 'Upload & manage documents',
  'login.features.routes': 'Smart Routes',
  'login.features.routesDesc': 'Auto-optimize & Google Maps export',
  'login.selfHosted': 'Self-hosted \u00B7 Open Source \u00B7 Your data stays yours',
  'login.title': 'Sign In',
  'login.subtitle': 'Welcome back',
  'login.signingIn': 'Signing in…',
  'login.signIn': 'Sign In',
  'login.createAdmin': 'Create Admin Account',
  'login.createAdminHint': 'Set up the first admin account for TREK.',
  'login.setNewPassword': 'Set New Password',
  'login.setNewPasswordHint': 'You must change your password before continuing.',
  'login.createAccount': 'Create Account',
  'login.createAccountHint': 'Register a new account.',
  'login.creating': 'Creating…',
  'login.noAccount': "Don't have an account?",
  'login.hasAccount': 'Already have an account?',
  'login.register': 'Register',
  'login.emailPlaceholder': 'your@email.com',
  'login.username': 'Username',
  'login.oidc.registrationDisabled': 'Registration is disabled. Contact your administrator.',
  'login.oidc.noEmail': 'No email received from provider.',
  'login.oidc.tokenFailed': 'Authentication failed.',
  'login.oidc.invalidState': 'Invalid session. Please try again.',
  'login.demoFailed': 'Demo login failed',
  'login.oidcSignIn': 'Sign in with {name}',
  'login.oidcOnly': 'Password authentication is disabled. Please sign in using your SSO provider.',
  'login.oidcLoggedOut': 'You have been logged out. Sign in again using your SSO provider.',
  'login.demoHint': 'Try the demo — no registration needed',
  'login.mfaTitle': 'Two-factor authentication',
  'login.mfaSubtitle': 'Enter the 6-digit code from your authenticator app.',
  'login.mfaCodeLabel': 'Verification code',
  'login.mfaCodeRequired': 'Enter the code from your authenticator app.',
  'login.mfaHint': 'Open Google Authenticator, Authy, or another TOTP app.',
  'login.mfaBack': '← Back to sign in',
  'login.mfaVerify': 'Verify',
  'login.invalidInviteLink': 'Invalid or expired invite link',
  'login.oidcFailed': 'OIDC login failed',
  'login.usernameRequired': 'Username is required',
  'login.passwordMinLength': 'Password must be at least 8 characters',
  'login.forgotPassword': 'Forgot password?',
  'login.forgotPasswordTitle': 'Reset your password',
  'login.forgotPasswordBody': 'Enter the email address you signed up with. If an account exists, we\'ll send a reset link.',
  'login.forgotPasswordSubmit': 'Send reset link',
  'login.forgotPasswordSentTitle': 'Check your email',
  'login.forgotPasswordSentBody': 'If an account exists for that email, a reset link is on its way. It expires in 60 minutes.',
  'login.forgotPasswordSmtpHintOff': 'Heads up: your administrator hasn\'t configured SMTP, so the reset link will be written to the server console instead of being emailed.',
  'login.backToLogin': 'Back to sign in',
  'login.newPassword': 'New password',
  'login.confirmPassword': 'Confirm new password',
  'login.passwordsDontMatch': 'Passwords don\'t match',
  'login.mfaCode': '2FA code',
  'login.resetPasswordTitle': 'Set a new password',
  'login.resetPasswordBody': 'Pick a strong password you haven’t used here before. Minimum 8 characters.',
  'login.resetPasswordMfaBody': 'Enter your 2FA code or a backup code to complete the reset.',
  'login.resetPasswordSubmit': 'Reset password',
  'login.resetPasswordVerify': 'Verify & reset',
  'login.resetPasswordSuccessTitle': 'Password updated',
  'login.resetPasswordSuccessBody': 'You can now sign in with your new password.',
  'login.resetPasswordInvalidLink': 'Invalid reset link',
  'login.resetPasswordInvalidLinkBody': 'This link is missing or broken. Request a new one to continue.',
  'login.resetPasswordFailed': 'Reset failed. The link may have expired.',

  // Register
  'register.passwordMismatch': 'Passwords do not match',
  'register.passwordTooShort': 'Password must be at least 8 characters',
  'register.failed': 'Registration failed',
  'register.getStarted': 'Get Started',
  'register.subtitle': 'Create an account and start planning your dream trips.',
  'register.feature1': 'Unlimited trip plans',
  'register.feature2': 'Interactive map view',
  'register.feature3': 'Manage places and categories',
  'register.feature4': 'Track reservations',
  'register.feature5': 'Create packing lists',
  'register.feature6': 'Store photos and files',
  'register.createAccount': 'Create Account',
  'register.startPlanning': 'Start your trip planning',
  'register.minChars': 'Min. 6 characters',
  'register.confirmPassword': 'Confirm Password',
  'register.repeatPassword': 'Repeat password',
  'register.registering': 'Registering...',
  'register.register': 'Register',
  'register.hasAccount': 'Already have an account?',
  'register.signIn': 'Sign In',

  // Admin
  'admin.title': 'Administration',
  'admin.subtitle': 'User management and system settings',
  'admin.tabs.users': 'Users',
  'admin.tabs.categories': 'Categories',
  'admin.tabs.backup': 'Backup',
  'admin.tabs.notifications': 'Notifications',
  'admin.tabs.audit': 'Audit',
  'admin.stats.users': 'Users',
  'admin.stats.trips': 'Trips',
  'admin.stats.places': 'Places',
  'admin.stats.photos': 'Photos',
  'admin.stats.files': 'Files',
  'admin.table.user': 'User',
  'admin.table.email': 'Email',
  'admin.table.role': 'Role',
  'admin.table.created': 'Created',
  'admin.table.lastLogin': 'Last Login',
  'admin.table.actions': 'Actions',
  'admin.you': '(You)',
  'admin.editUser': 'Edit User',
  'admin.newPassword': 'New Password',
  'admin.newPasswordHint': 'Leave empty to keep current password',
  'admin.deleteUser': 'Delete user "{name}"? All trips will be permanently deleted.',
  'admin.deleteUserTitle': 'Delete user',
  'admin.newPasswordPlaceholder': 'Enter new password…',
  'admin.toast.loadError': 'Failed to load admin data',
  'admin.toast.userUpdated': 'User updated',
  'admin.toast.updateError': 'Failed to update',
  'admin.toast.userDeleted': 'User deleted',
  'admin.toast.deleteError': 'Failed to delete',
  'admin.toast.cannotDeleteSelf': 'Cannot delete your own account',
  'admin.toast.userCreated': 'User created',
  'admin.toast.createError': 'Failed to create user',
  'admin.toast.fieldsRequired': 'Username, email and password are required',
  'admin.createUser': 'Create User',
  'admin.invite.title': 'Invite Links',
  'admin.invite.subtitle': 'Create one-time registration links',
  'admin.invite.create': 'Create Link',
  'admin.invite.createAndCopy': 'Create & Copy',
  'admin.invite.empty': 'No invite links created yet',
  'admin.invite.maxUses': 'Max. Uses',
  'admin.invite.expiry': 'Expires after',
  'admin.invite.uses': 'used',
  'admin.invite.expiresAt': 'expires',
  'admin.invite.createdBy': 'by',
  'admin.invite.active': 'Active',
  'admin.invite.expired': 'Expired',
  'admin.invite.usedUp': 'Used up',
  'admin.invite.copied': 'Invite link copied to clipboard',
  'admin.invite.copyLink': 'Copy link',
  'admin.invite.deleted': 'Invite link deleted',
  'admin.invite.createError': 'Failed to create invite link',
  'admin.invite.deleteError': 'Failed to delete invite link',
  'admin.tabs.settings': 'Settings',
  'admin.allowRegistration': 'Allow Registration',
  'admin.allowRegistrationHint': 'New users can register themselves',
  'admin.authMethods': 'Authentication Methods',
  'admin.passwordLogin': 'Password Login',
  'admin.passwordLoginHint': 'Allow users to sign in with email and password',
  'admin.passwordRegistration': 'Password Registration',
  'admin.passwordRegistrationHint': 'Allow new users to register with email and password',
  'admin.oidcLogin': 'SSO Login',
  'admin.oidcLoginHint': 'Allow users to sign in with SSO',
  'admin.oidcRegistration': 'SSO Auto-Provisioning',
  'admin.oidcRegistrationHint': 'Automatically create accounts for new SSO users',
  'admin.envOverrideHint': 'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.',
  'admin.lockoutWarning': 'At least one login method must remain enabled',
  'admin.requireMfa': 'Require two-factor authentication (2FA)',
  'admin.requireMfaHint': 'Users without 2FA must complete setup in Settings before using the app.',
  'admin.apiKeys': 'API Keys',
  'admin.apiKeysHint': 'Optional. Enables extended place data like photos and weather.',
  'admin.mapsKey': 'Google Maps API Key',
  'admin.mapsKeyHint': 'Required for place search. Get at console.cloud.google.com',
  'admin.mapsKeyHintLong': 'Without an API key, OpenStreetMap is used for place search. With a Google API key, photos, ratings, and opening hours can be loaded as well. Get one at console.cloud.google.com.',
  'admin.recommended': 'Recommended',
  'admin.weatherKey': 'OpenWeatherMap API Key',
  'admin.weatherKeyHint': 'For weather data. Free at openweathermap.org',
  'admin.validateKey': 'Test',
  'admin.keyValid': 'Connected',
  'admin.keyInvalid': 'Invalid',
  'admin.keySaved': 'API keys saved',
  'admin.oidcTitle': 'Single Sign-On (OIDC)',
  'admin.oidcSubtitle': 'Allow login via external providers like Google, Apple, Authentik or Keycloak.',
  'admin.oidcDisplayName': 'Display Name',
  'admin.oidcIssuer': 'Issuer URL',
  'admin.oidcIssuerHint': 'The OpenID Connect Issuer URL of the provider. e.g. https://accounts.google.com',
  'admin.oidcSaved': 'OIDC configuration saved',
  'admin.oidcOnlyMode': 'Disable password authentication',
  'admin.oidcOnlyModeHint': 'When enabled, only SSO login is permitted. Password-based login and registration are blocked.',

  // File Types
  'admin.fileTypes': 'Allowed File Types',
  'admin.fileTypesHint': 'Configure which file types users can upload.',
  'admin.fileTypesFormat': 'Comma-separated extensions (e.g. jpg,png,pdf,doc). Use * to allow all types.',
  'admin.fileTypesSaved': 'File type settings saved',

  'admin.placesPhotos.title': 'Place Photos',
  'admin.placesPhotos.subtitle': 'Fetch photos from the Google Places API. Disable to save API quota. Wikimedia photos are unaffected.',
  'admin.placesAutocomplete.title': 'Place Autocomplete',
  'admin.placesAutocomplete.subtitle': 'Use the Google Places API for search suggestions. Disable to save API quota.',
  'admin.placesDetails.title': 'Place Details',
  'admin.placesDetails.subtitle': 'Fetch detailed place information (hours, rating, website) from the Google Places API. Disable to save API quota.',
  // Packing Templates & Bag Tracking
  'admin.bagTracking.title': 'Bag Tracking',
  'admin.bagTracking.subtitle': 'Enable weight and bag assignment for packing items',
  'admin.collab.chat.title': 'Chat',
  'admin.collab.chat.subtitle': 'Real-time messaging for trip collaboration',
  'admin.collab.notes.title': 'Notes',
  'admin.collab.notes.subtitle': 'Shared notes and documents',
  'admin.collab.polls.title': 'Polls',
  'admin.collab.polls.subtitle': 'Group polls and voting',
  'admin.collab.whatsnext.title': "What's Next",
  'admin.collab.whatsnext.subtitle': 'Activity suggestions and next steps',
  'admin.tabs.config': 'Personalization',
  'admin.tabs.defaults': 'User Defaults',
  'admin.defaultSettings.title': 'Default User Settings',
  'admin.defaultSettings.description': 'Set instance-wide defaults. Users who have not changed a setting will see these values. Their own changes always take priority.',
  'admin.defaultSettings.saved': 'Default saved',
  'admin.defaultSettings.reset': 'Reset to built-in default',
  'admin.defaultSettings.resetToBuiltIn': 'reset',
  'admin.tabs.templates': 'Packing Templates',
  'admin.packingTemplates.title': 'Packing Templates',
  'admin.packingTemplates.subtitle': 'Create reusable packing lists for your trips',
  'admin.packingTemplates.create': 'New Template',
  'admin.packingTemplates.namePlaceholder': 'Template name (e.g. Beach Holiday)',
  'admin.packingTemplates.empty': 'No templates created yet',
  'admin.packingTemplates.items': 'items',
  'admin.packingTemplates.categories': 'categories',
  'admin.packingTemplates.itemName': 'Item name',
  'admin.packingTemplates.itemCategory': 'Category',
  'admin.packingTemplates.categoryName': 'Category name (e.g. Clothing)',
  'admin.packingTemplates.addCategory': 'Add category',
  'admin.packingTemplates.created': 'Template created',
  'admin.packingTemplates.deleted': 'Template deleted',
  'admin.packingTemplates.loadError': 'Failed to load templates',
  'admin.packingTemplates.createError': 'Failed to create template',
  'admin.packingTemplates.deleteError': 'Failed to delete template',
  'admin.packingTemplates.saveError': 'Failed to save',

  // Addons
  'admin.tabs.addons': 'Addons',
  'admin.addons.title': 'Addons',
  'admin.addons.subtitle': 'Enable or disable features to customize your TREK experience.',
  'admin.addons.catalog.packing.name': 'Lists',
  'admin.addons.catalog.packing.description': 'Packing lists and to-do tasks for your trips',
  'admin.addons.catalog.budget.name': 'Budget',
  'admin.addons.catalog.budget.description': 'Track expenses and plan your trip budget',
  'admin.addons.catalog.documents.name': 'Documents',
  'admin.addons.catalog.documents.description': 'Store and manage travel documents',
  'admin.addons.catalog.vacay.name': 'Vacay',
  'admin.addons.catalog.vacay.description': 'Personal vacation planner with calendar view',
  'admin.addons.catalog.atlas.name': 'Atlas',
  'admin.addons.catalog.atlas.description': 'World map with visited countries and travel stats',
  'admin.addons.catalog.collab.name': 'Collab',
  'admin.addons.catalog.collab.description': 'Real-time notes, polls, and chat for trip planning',
  'admin.addons.catalog.memories.name': 'Photos (Immich)',
  'admin.addons.catalog.memories.description': 'Share trip photos via your Immich instance',
  'admin.addons.catalog.mcp.name': 'MCP',
  'admin.addons.catalog.mcp.description': 'Model Context Protocol for AI assistant integration',
  'admin.addons.subtitleBefore': 'Enable or disable features to customize your ',
  'admin.addons.subtitleAfter': ' experience.',
  'admin.addons.enabled': 'Enabled',
  'admin.addons.disabled': 'Disabled',
  'admin.addons.type.trip': 'Trip',
  'admin.addons.type.global': 'Global',
  'admin.addons.type.integration': 'Integration',
  'admin.addons.tripHint': 'Available as a tab within each trip',
  'admin.addons.globalHint': 'Available as a standalone section in the main navigation',
  'admin.addons.integrationHint': 'Backend services and API integrations with no dedicated page',
  'admin.addons.toast.updated': 'Addon updated',
  'admin.addons.toast.error': 'Failed to update addon',
  'admin.addons.noAddons': 'No addons available',
  // Weather info
  'admin.weather.title': 'Weather Data',
  'admin.weather.badge': 'Since March 24, 2026',
  'admin.weather.description': 'TREK uses Open-Meteo as its weather data source. Open-Meteo is a free, open-source weather service — no API key required.',
  'admin.weather.forecast': '16-day forecast',
  'admin.weather.forecastDesc': 'Previously 5 days (OpenWeatherMap)',
  'admin.weather.climate': 'Historical climate data',
  'admin.weather.climateDesc': 'Averages from the last 85 years for days beyond the 16-day forecast',
  'admin.weather.requests': '10,000 requests / day',
  'admin.weather.requestsDesc': 'Free, no API key required',
  'admin.weather.locationHint': 'Weather is based on the first place with coordinates in each day. If no place is assigned to a day, any place from the place list is used as a reference.',

  // GitHub
  'admin.tabs.mcpTokens': 'MCP Access',
  'admin.mcpTokens.title': 'MCP Access',
  'admin.mcpTokens.subtitle': 'Manage OAuth sessions and API tokens across all users',
  'admin.mcpTokens.sectionTitle': 'API Tokens',
  'admin.mcpTokens.owner': 'Owner',
  'admin.mcpTokens.tokenName': 'Token Name',
  'admin.mcpTokens.created': 'Created',
  'admin.mcpTokens.lastUsed': 'Last Used',
  'admin.mcpTokens.never': 'Never',
  'admin.mcpTokens.empty': 'No MCP tokens have been created yet',
  'admin.mcpTokens.deleteTitle': 'Delete Token',
  'admin.mcpTokens.deleteMessage': 'This will revoke the token immediately. The user will lose MCP access through this token.',
  'admin.mcpTokens.deleteSuccess': 'Token deleted',
  'admin.mcpTokens.deleteError': 'Failed to delete token',
  'admin.mcpTokens.loadError': 'Failed to load tokens',
  'admin.oauthSessions.sectionTitle': 'OAuth Sessions',
  'admin.oauthSessions.clientName': 'Client',
  'admin.oauthSessions.owner': 'Owner',
  'admin.oauthSessions.scopes': 'Scopes',
  'admin.oauthSessions.created': 'Created',
  'admin.oauthSessions.empty': 'No active OAuth sessions',
  'admin.oauthSessions.revokeTitle': 'Revoke Session',
  'admin.oauthSessions.revokeMessage': 'This will revoke the OAuth session immediately. The client will lose MCP access.',
  'admin.oauthSessions.revokeSuccess': 'Session revoked',
  'admin.oauthSessions.revokeError': 'Failed to revoke session',
  'admin.oauthSessions.loadError': 'Failed to load OAuth sessions',
  'admin.tabs.github': 'GitHub',

  'admin.audit.subtitle': 'Security-sensitive and administration events (backups, users, MFA, settings).',
  'admin.audit.empty': 'No audit entries yet.',
  'admin.audit.refresh': 'Refresh',
  'admin.audit.loadMore': 'Load more',
  'admin.audit.showing': '{count} loaded · {total} total',
  'admin.audit.col.time': 'Time',
  'admin.audit.col.user': 'User',
  'admin.audit.col.action': 'Action',
  'admin.audit.col.resource': 'Resource',
  'admin.audit.col.ip': 'IP',
  'admin.audit.col.details': 'Details',
  'admin.github.title': 'Release History',
  'admin.github.subtitle': 'Latest updates from {repo}',
  'admin.github.latest': 'Latest',
  'admin.github.prerelease': 'Pre-release',
  'admin.github.showDetails': 'Show details',
  'admin.github.hideDetails': 'Hide details',
  'admin.github.loadMore': 'Load more',
  'admin.github.loading': 'Loading...',
  'admin.github.error': 'Failed to load releases',
  'admin.github.by': 'by',
  'admin.github.support': 'Helps me keep building TREK',

  'admin.update.available': 'Update available',
  'admin.update.text': 'TREK {version} is available. You are running {current}.',
  'admin.update.button': 'View on GitHub',
  'admin.update.install': 'Install Update',
  'admin.update.confirmTitle': 'Install Update?',
  'admin.update.confirmText': 'TREK will be updated from {current} to {version}. The server will restart automatically afterwards.',
  'admin.update.dataInfo': 'All your data (trips, users, API keys, uploads, Vacay, Atlas, budgets) will be preserved.',
  'admin.update.warning': 'The app will be briefly unavailable during the restart.',
  'admin.update.confirm': 'Update Now',
  'admin.update.installing': 'Updating…',
  'admin.update.success': 'Update installed! Server is restarting…',
  'admin.update.failed': 'Update failed',
  'admin.update.backupHint': 'We recommend creating a backup before updating.',
  'admin.update.backupLink': 'Go to Backup',
  'admin.update.howTo': 'How to Update',
  'admin.update.dockerText': 'Your TREK instance runs in Docker. To update to {version}, run the following commands on your server:',
  'admin.update.reloadHint': 'Please reload the page in a few seconds.',

  // Vacay addon
  'vacay.subtitle': 'Plan and manage vacation days',
  'vacay.settings': 'Settings',
  'vacay.year': 'Year',
  'vacay.addYear': 'Add next year',
  'vacay.addPrevYear': 'Add previous year',
  'vacay.removeYear': 'Remove year',
  'vacay.removeYearConfirm': 'Remove {year}?',
  'vacay.removeYearHint': 'All vacation entries and company holidays for this year will be permanently deleted.',
  'vacay.remove': 'Remove',
  'vacay.persons': 'Persons',
  'vacay.noPersons': 'No persons added',
  'vacay.addPerson': 'Add Person',
  'vacay.editPerson': 'Edit Person',
  'vacay.removePerson': 'Remove Person',
  'vacay.removePersonConfirm': 'Remove {name}?',
  'vacay.removePersonHint': 'All vacation entries for this person will be permanently deleted.',
  'vacay.personName': 'Name',
  'vacay.personNamePlaceholder': 'Enter name',
  'vacay.color': 'Color',
  'vacay.add': 'Add',
  'vacay.legend': 'Legend',
  'vacay.publicHoliday': 'Public Holiday',
  'vacay.companyHoliday': 'Company Holiday',
  'vacay.weekend': 'Weekend',
  'vacay.modeVacation': 'Vacation',
  'vacay.modeCompany': 'Company Holiday',
  'vacay.entitlement': 'Entitlement',
  'vacay.entitlementDays': 'Days',
  'vacay.used': 'Used',
  'vacay.remaining': 'Left',
  'vacay.carriedOver': 'from {year}',
  'vacay.blockWeekends': 'Block Weekends',
  'vacay.blockWeekendsHint': 'Prevent vacation entries on weekend days',
  'vacay.weekendDays': 'Weekend days',
  'vacay.mon': 'Mon',
  'vacay.tue': 'Tue',
  'vacay.wed': 'Wed',
  'vacay.thu': 'Thu',
  'vacay.fri': 'Fri',
  'vacay.sat': 'Sat',
  'vacay.sun': 'Sun',
  'vacay.publicHolidays': 'Public Holidays',
  'vacay.publicHolidaysHint': 'Mark public holidays in the calendar',
  'vacay.selectCountry': 'Select country',
  'vacay.selectRegion': 'Select region (optional)',
  'vacay.addCalendar': 'Add calendar',
  'vacay.calendarLabel': 'Label (optional)',
  'vacay.calendarColor': 'Color',
  'vacay.noCalendars': 'No holiday calendars added yet',
  'vacay.companyHolidays': 'Company Holidays',
  'vacay.companyHolidaysHint': 'Allow marking company-wide holiday days',
  'vacay.companyHolidaysNoDeduct': 'Company holidays do not count towards vacation days.',
  'vacay.weekStart': 'Week starts on',
  'vacay.weekStartHint': 'Choose whether the calendar week starts on Monday or Sunday',
  'vacay.carryOver': 'Carry Over',
  'vacay.carryOverHint': 'Automatically carry remaining vacation days into the next year',
  'vacay.sharing': 'Sharing',
  'vacay.sharingHint': 'Share your vacation plan with other TREK users',
  'vacay.owner': 'Owner',
  'vacay.shareEmailPlaceholder': 'Email of TREK user',
  'vacay.shareSuccess': 'Plan shared successfully',
  'vacay.shareError': 'Could not share plan',
  'vacay.dissolve': 'Dissolve Fusion',
  'vacay.dissolveHint': 'Separate calendars again. Your entries will be kept.',
  'vacay.dissolveAction': 'Dissolve',
  'vacay.dissolved': 'Calendar separated',
  'vacay.fusedWith': 'Fused with',
  'vacay.you': 'you',
  'vacay.noData': 'No data',
  'vacay.changeColor': 'Change color',
  'vacay.inviteUser': 'Invite User',
  'vacay.inviteHint': 'Invite another TREK user to share a combined vacation calendar.',
  'vacay.selectUser': 'Select user',
  'vacay.sendInvite': 'Send Invite',
  'vacay.inviteSent': 'Invite sent',
  'vacay.inviteError': 'Could not send invite',
  'vacay.pending': 'pending',
  'vacay.noUsersAvailable': 'No users available',
  'vacay.accept': 'Accept',
  'vacay.decline': 'Decline',
  'vacay.acceptFusion': 'Accept & Fuse',
  'vacay.inviteTitle': 'Fusion Request',
  'vacay.inviteWantsToFuse': 'wants to share a vacation calendar with you.',
  'vacay.fuseInfo1': 'Both of you will see all vacation entries in one shared calendar.',
  'vacay.fuseInfo2': 'Both parties can create and edit entries for each other.',
  'vacay.fuseInfo3': 'Both parties can delete entries and change vacation entitlements.',
  'vacay.fuseInfo4': 'Settings like public holidays and company holidays are shared.',
  'vacay.fuseInfo5': 'The fusion can be dissolved at any time by either party. Your entries will be preserved.',
  'nav.myTrips': 'My Trips',

  // Atlas addon
  'atlas.subtitle': 'Your travel footprint around the world',
  'atlas.countries': 'Countries',
  'atlas.trips': 'Trips',
  'atlas.places': 'Places',
  'atlas.unmark': 'Remove',
  'atlas.confirmMark': 'Mark this country as visited?',
  'atlas.confirmUnmark': 'Remove this country from your visited list?',
  'atlas.confirmUnmarkRegion': 'Remove this region from your visited list?',
  'atlas.markVisited': 'Mark as visited',
  'atlas.markVisitedHint': 'Add this country to your visited list',
  'atlas.markRegionVisitedHint': 'Add this region to your visited list',
  'atlas.addToBucket': 'Add to bucket list',
  'atlas.addPoi': 'Add place',
  'atlas.searchCountry': 'Search a country...',
  'atlas.bucketNamePlaceholder': 'Name (country, city, place...)',
  'atlas.month': 'Month',
  'atlas.year': 'Year',
  'atlas.addToBucketHint': 'Save as a place you want to visit',
  'atlas.bucketWhen': 'When do you plan to visit?',
  'atlas.statsTab': 'Stats',
  'atlas.bucketTab': 'Bucket List',
  'atlas.addBucket': 'Add to bucket list',
  'atlas.bucketNotesPlaceholder': 'Notes (optional)',
  'atlas.bucketEmpty': 'Your bucket list is empty',
  'atlas.bucketEmptyHint': 'Add places you dream of visiting',
  'atlas.days': 'Days',
  'atlas.visitedCountries': 'Visited Countries',
  'atlas.cities': 'Cities',
  'atlas.noData': 'No travel data yet',
  'atlas.noDataHint': 'Create a trip and add places to see your world map',
  'atlas.lastTrip': 'Last trip',
  'atlas.nextTrip': 'Next trip',
  'atlas.daysLeft': 'days left',
  'atlas.streak': 'Streak',
  'atlas.years': 'years',
  'atlas.yearInRow': 'year in a row',
  'atlas.yearsInRow': 'years in a row',
  'atlas.tripIn': 'trip in',
  'atlas.tripsIn': 'trips in',
  'atlas.since': 'since',
  'atlas.europe': 'Europe',
  'atlas.asia': 'Asia',
  'atlas.northAmerica': 'N. America',
  'atlas.southAmerica': 'S. America',
  'atlas.africa': 'Africa',
  'atlas.oceania': 'Oceania',
  'atlas.other': 'Other',
  'atlas.firstVisit': 'First trip',
  'atlas.lastVisitLabel': 'Last trip',
  'atlas.tripSingular': 'Trip',
  'atlas.tripPlural': 'Trips',
  'atlas.placeVisited': 'Place visited',
  'atlas.placesVisited': 'Places visited',

  // Trip Planner
  'trip.tabs.plan': 'Plan',
  'trip.tabs.transports': 'Transports',
  'trip.tabs.reservations': 'Bookings',
  'trip.tabs.reservationsShort': 'Book',
  'trip.tabs.packing': 'Packing List',
  'trip.tabs.packingShort': 'Packing',
  'trip.tabs.lists': 'Lists',
  'trip.tabs.listsShort': 'Lists',
  'trip.tabs.budget': 'Budget',
  'trip.tabs.files': 'Files',
  'trip.loading': 'Loading trip...',
  'trip.loadingPhotos': 'Loading place photos...',
  'trip.mobilePlan': 'Plan',
  'trip.mobilePlaces': 'Places',
  'trip.toast.placeUpdated': 'Place updated',
  'trip.toast.placeAdded': 'Place added',
  'trip.toast.placeDeleted': 'Place deleted',
  'trip.toast.selectDay': 'Please select a day first',
  'trip.toast.assignedToDay': 'Place assigned to day',
  'trip.toast.reorderError': 'Failed to reorder',
  'trip.toast.reservationUpdated': 'Reservation updated',
  'trip.toast.reservationAdded': 'Reservation added',
  'trip.toast.deleted': 'Deleted',
  'trip.confirm.deletePlace': 'Are you sure you want to delete this place?',
  'trip.confirm.deletePlaces': 'Delete {count} places?',
  'trip.toast.placesDeleted': '{count} places deleted',

  // Day Plan Sidebar
  'dayplan.emptyDay': 'No places planned for this day',
  'dayplan.cannotReorderTransport': 'Bookings with a fixed time cannot be reordered',
  'dayplan.confirmRemoveTimeTitle': 'Remove time?',
  'dayplan.confirmRemoveTimeBody': 'This place has a fixed time ({time}). Moving it will remove the time and allow free sorting.',
  'dayplan.confirmRemoveTimeAction': 'Remove time & move',
  'dayplan.cannotDropOnTimed': 'Items cannot be placed between time-bound entries',
  'dayplan.cannotBreakChronology': 'This would break the chronological order of timed items and bookings',
  'dayplan.addNote': 'Add Note',
  'dayplan.expandAll': 'Expand all days',
  'dayplan.collapseAll': 'Collapse all days',
  'dayplan.editNote': 'Edit Note',
  'dayplan.noteAdd': 'Add Note',
  'dayplan.noteEdit': 'Edit Note',
  'dayplan.noteTitle': 'Note',
  'dayplan.noteSubtitle': 'Daily Note',
  'dayplan.totalCost': 'Total Cost',
  'dayplan.days': 'Days',
  'dayplan.dayN': 'Day {n}',
  'dayplan.calculating': 'Calculating...',
  'dayplan.route': 'Route',
  'dayplan.optimize': 'Optimize',
  'dayplan.optimized': 'Route optimized',
  'dayplan.routeError': 'Failed to calculate route',
  'dayplan.toast.needTwoPlaces': 'At least two places needed for route optimization',
  'dayplan.toast.routeOptimized': 'Route optimized',
  'dayplan.toast.noGeoPlaces': 'No places with coordinates found for route calculation',
  'dayplan.confirmed': 'Confirmed',
  'dayplan.pendingRes': 'Pending',
  'dayplan.pdf': 'PDF',
  'dayplan.pdfTooltip': 'Export day plan as PDF',
  'dayplan.pdfError': 'Failed to export PDF',

  // Places Sidebar
  'places.addPlace': 'Add Place/Activity',
  'places.importFile': 'Import file',
  'places.sidebarDrop': 'Drop to import',
  'places.importFileHint': 'Import .gpx, .kml or .kmz files from tools like Google My Maps, Google Earth, or a GPS tracker.',
  'places.importFileDropHere': 'Click to select a file or drag and drop here',
  'places.importFileDropActive': 'Drop file to select',
  'places.importFileUnsupported': 'Unsupported file type. Use .gpx, .kml or .kmz.',
  'places.importFileTooLarge': 'File is too large. Maximum upload size is {maxMb} MB.',
  'places.importFileError': 'Import failed',
  'places.importAllSkipped': 'All places were already in the trip.',
  'places.gpxImported': '{count} places imported from GPX',
  'places.gpxImportTypes': 'What do you want to import?',
  'places.gpxImportWaypoints': 'Waypoints',
  'places.gpxImportRoutes': 'Routes',
  'places.gpxImportTracks': 'Tracks (with path geometry)',
  'places.gpxImportNoneSelected': 'Select at least one type to import.',
  'places.kmlImportTypes': 'What do you want to import?',
  'places.kmlImportPoints': 'Points (Placemarks)',
  'places.kmlImportPaths': 'Paths (LineStrings)',
  'places.kmlImportNoneSelected': 'Select at least one type to import.',
  'places.selectionCount': '{count} selected',
  'places.deleteSelected': 'Delete selected',
  'places.kmlKmzImported': '{count} places imported from KMZ/KML',
  'places.urlResolved': 'Place imported from URL',
  'places.importList': 'List Import',
  'places.kmlKmzSummaryValues': 'Placemarks: {total} • Imported: {created} • Skipped: {skipped}',
  'places.importGoogleList': 'Google List',
  'places.importNaverList': 'Naver List',
  'places.googleListHint': 'Paste a shared Google Maps list link to import all places.',
  'places.googleListImported': '{count} places imported from "{list}"',
  'places.googleListError': 'Failed to import Google Maps list',
  'places.naverListHint': 'Paste a shared Naver Maps list link to import all places.',
  'places.naverListImported': '{count} places imported from "{list}"',
  'places.naverListError': 'Failed to import Naver Maps list',
  'places.viewDetails': 'View Details',
  'places.assignToDay': 'Add to which day?',
  'places.all': 'All',
  'places.unplanned': 'Unplanned',
  'places.filterTracks': 'Tracks',
  'places.search': 'Search places...',
  'places.allCategories': 'All Categories',
  'places.categoriesSelected': 'categories',
  'places.clearFilter': 'Clear filter',
  'places.count': '{count} places',
  'places.countSingular': '1 place',
  'places.allPlanned': 'All places are planned',
  'places.noneFound': 'No places found',
  'places.editPlace': 'Edit Place',
  'places.formName': 'Name',
  'places.formNamePlaceholder': 'e.g. Eiffel Tower',
  'places.formDescription': 'Description',
  'places.formDescriptionPlaceholder': 'Short description...',
  'places.formAddress': 'Address',
  'places.formAddressPlaceholder': 'Street, City, Country',
  'places.formLat': 'Latitude (e.g. 48.8566)',
  'places.formLng': 'Longitude (e.g. 2.3522)',
  'places.formCategory': 'Category',
  'places.noCategory': 'No Category',
  'places.categoryNamePlaceholder': 'Category name',
  'places.formTime': 'Time',
  'places.startTime': 'Start',
  'places.endTime': 'End',
  'places.endTimeBeforeStart': 'End time is before start time',
  'places.timeCollision': 'Time overlap with:',
  'places.formWebsite': 'Website',
  'places.formNotes': 'Notes',
  'places.formNotesPlaceholder': 'Personal notes...',
  'places.formReservation': 'Reservation',
  'places.reservationNotesPlaceholder': 'Reservation notes, confirmation number...',
  'places.mapsSearchPlaceholder': 'Search places...',
  'places.mapsSearchError': 'Place search failed.',
  'places.loadingDetails': 'Loading place details…',
  'places.osmHint': 'Using OpenStreetMap search (no photos, opening hours, or ratings). Add a Google API key in settings for full details.',
  'places.osmActive': 'Search via OpenStreetMap (no photos, ratings or opening hours). Add a Google API key in Settings for enhanced data.',
  'places.categoryCreateError': 'Failed to create category',
  'places.nameRequired': 'Please enter a name',
  'places.saveError': 'Failed to save',
  // Place Inspector
  'inspector.opened': 'Open',
  'inspector.closed': 'Closed',
  'inspector.openingHours': 'Opening Hours',
  'inspector.showHours': 'Show opening hours',
  'inspector.files': 'Files',
  'inspector.filesCount': '{count} files',
  'inspector.remove': 'Remove',
  'inspector.removeFromDay': 'Remove from Day',
  'inspector.addToDay': 'Add to Day',
  'inspector.confirmedRes': 'Confirmed Reservation',
  'inspector.pendingRes': 'Pending Reservation',
  'inspector.google': 'Open in Google Maps',
  'inspector.website': 'Open Website',
  'inspector.addRes': 'Reservation',
  'inspector.editRes': 'Edit Reservation',
  'inspector.participants': 'Participants',
  'inspector.trackStats': 'Track Stats',

  // Reservations
  'reservations.title': 'Bookings',
  'reservations.empty': 'No reservations yet',
  'reservations.emptyHint': 'Add reservations for flights, hotels and more',
  'reservations.add': 'Add Reservation',
  'reservations.addManual': 'Manual Booking',
  'reservations.placeHint': 'Tip: Reservations are best created directly from a place to link them with your day plan.',
  'reservations.confirmed': 'Confirmed',
  'reservations.pending': 'Pending',
  'reservations.summary': '{confirmed} confirmed, {pending} pending',
  'reservations.fromPlan': 'From Plan',
  'reservations.showFiles': 'Show Files',
  'reservations.editTitle': 'Edit Reservation',
  'reservations.status': 'Status',
  'reservations.datetime': 'Date & Time',
  'reservations.startTime': 'Start time',
  'reservations.endTime': 'End time',
  'reservations.date': 'Date',
  'reservations.time': 'Time',
  'reservations.timeAlt': 'Time (alternative, e.g. 19:30)',
  'reservations.notes': 'Notes',
  'reservations.notesPlaceholder': 'Additional notes...',
  'reservations.meta.airline': 'Airline',
  'reservations.meta.flightNumber': 'Flight No.',
  'reservations.meta.from': 'From',
  'reservations.meta.to': 'To',
  'reservations.needsReview': 'Review',
  'reservations.needsReviewHint': 'Airport could not be matched automatically — please confirm the location.',
  'reservations.searchLocation': 'Search station, port, address…',
  'airport.searchPlaceholder': 'Airport code or city (e.g. FRA)',
  'map.connections': 'Connections',
  'map.showConnections': 'Show booking routes',
  'map.hideConnections': 'Hide booking routes',
  'reservations.meta.trainNumber': 'Train No.',
  'reservations.meta.platform': 'Platform',
  'reservations.meta.seat': 'Seat',
  'reservations.meta.checkIn': 'Check-in',
  'reservations.meta.checkInUntil': 'Check-in until',
  'reservations.meta.checkOut': 'Check-out',
  'reservations.meta.linkAccommodation': 'Accommodation',
  'reservations.meta.pickAccommodation': 'Link to accommodation',
  'reservations.meta.noAccommodation': 'None',
  'reservations.meta.hotelPlace': 'Accommodation',
  'reservations.meta.pickHotel': 'Select accommodation',
  'reservations.meta.fromDay': 'From',
  'reservations.meta.toDay': 'To',
  'reservations.meta.selectDay': 'Select day',
  'reservations.type.flight': 'Flight',
  'reservations.type.hotel': 'Accommodation',
  'reservations.type.restaurant': 'Restaurant',
  'reservations.type.train': 'Train',
  'reservations.type.car': 'Car',
  'reservations.type.cruise': 'Cruise',
  'reservations.type.event': 'Event',
  'reservations.type.tour': 'Tour',
  'reservations.type.other': 'Other',
  'reservations.confirm.delete': 'Are you sure you want to delete the reservation "{name}"?',
  'reservations.confirm.deleteTitle': 'Delete booking?',
  'reservations.confirm.deleteBody': '"{name}" will be permanently deleted.',
  'reservations.toast.updated': 'Reservation updated',
  'reservations.toast.removed': 'Reservation deleted',
  'reservations.toast.fileUploaded': 'File uploaded',
  'reservations.toast.uploadError': 'Failed to upload',
  'reservations.newTitle': 'New Reservation',
  'reservations.bookingType': 'Booking Type',
  'reservations.titleLabel': 'Title',
  'reservations.titlePlaceholder': 'e.g. Lufthansa LH123, Hotel Adlon, ...',
  'reservations.locationAddress': 'Location / Address',
  'reservations.locationPlaceholder': 'Address, Airport, Hotel...',
  'reservations.confirmationCode': 'Booking Code',
  'reservations.confirmationPlaceholder': 'e.g. ABC12345',
  'reservations.day': 'Day',
  'reservations.noDay': 'No Day',
  'reservations.place': 'Place',
  'reservations.noPlace': 'No Place',
  'reservations.pendingSave': 'will be saved…',
  'reservations.uploading': 'Uploading...',
  'reservations.attachFile': 'Attach file',
  'reservations.linkExisting': 'Link existing file',
  'reservations.toast.saveError': 'Failed to save',
  'reservations.toast.updateError': 'Failed to update',
  'reservations.toast.deleteError': 'Failed to delete',
  'reservations.confirm.remove': 'Remove reservation for "{name}"?',
  'reservations.linkAssignment': 'Link to day assignment',
  'reservations.pickAssignment': 'Select an assignment from your plan...',
  'reservations.noAssignment': 'No link (standalone)',
  'reservations.price': 'Price',
  'reservations.budgetCategory': 'Budget category',
  'reservations.budgetCategoryPlaceholder': 'e.g. Transport, Accommodation',
  'reservations.budgetCategoryAuto': 'Auto (from booking type)',
  'reservations.budgetHint': 'A budget entry will be created automatically when saving.',
  'reservations.departureDate': 'Departure',
  'reservations.arrivalDate': 'Arrival',
  'reservations.departureTime': 'Dep. time',
  'reservations.arrivalTime': 'Arr. time',
  'reservations.pickupDate': 'Pickup',
  'reservations.returnDate': 'Return',
  'reservations.pickupTime': 'Pickup time',
  'reservations.returnTime': 'Return time',
  'reservations.endDate': 'End date',
  'reservations.meta.departureTimezone': 'Dep. TZ',
  'reservations.meta.arrivalTimezone': 'Arr. TZ',
  'reservations.span.departure': 'Departure',
  'reservations.span.arrival': 'Arrival',
  'reservations.span.inTransit': 'In transit',
  'reservations.span.pickup': 'Pickup',
  'reservations.span.return': 'Return',
  'reservations.span.active': 'Active',
  'reservations.span.start': 'Start',
  'reservations.span.end': 'End',
  'reservations.span.ongoing': 'Ongoing',
  'reservations.validation.endBeforeStart': 'End date/time must be after start date/time',
  'reservations.addBooking': 'Add booking',

  // Budget
  'budget.title': 'Budget',
  'budget.exportCsv': 'Export CSV',
  'budget.emptyTitle': 'No budget created yet',
  'budget.emptyText': 'Create categories and entries to plan your travel budget',
  'budget.emptyPlaceholder': 'Enter category name...',
  'budget.createCategory': 'Create Category',
  'budget.category': 'Category',
  'budget.categoryName': 'Category Name',
  'budget.table.name': 'Name',
  'budget.table.total': 'Total',
  'budget.table.persons': 'Persons',
  'budget.table.days': 'Days',
  'budget.table.perPerson': 'Per Person',
  'budget.table.perDay': 'Per Day',
  'budget.table.perPersonDay': 'P. p / Day',
  'budget.table.note': 'Note',
  'budget.table.date': 'Date',
  'budget.newEntry': 'New Entry',
  'budget.defaultEntry': 'New Entry',
  'budget.defaultCategory': 'New Category',
  'budget.total': 'Total',
  'budget.totalBudget': 'Total Budget',
  'budget.byCategory': 'By Category',
  'budget.editTooltip': 'Click to edit',
  'budget.linkedToReservation': 'Linked to a reservation — edit the name there',
  'budget.confirm.deleteCategory': 'Are you sure you want to delete the category "{name}" with {count} entries?',
  'budget.deleteCategory': 'Delete Category',
  'budget.perPerson': 'Per Person',
  'budget.paid': 'Paid',
  'budget.open': 'Open',
  'budget.noMembers': 'No members assigned',
  'budget.settlement': 'Settlement',
  'budget.settlementInfo': 'Click a member avatar on a budget item to mark them green — this means they paid. The settlement then shows who owes whom and how much.',
  'budget.netBalances': 'Net Balances',

  // Files
  'files.title': 'Files',
  'files.pageTitle': 'Files & Documents',
  'files.subtitle': '{count} files for {trip}',
  'files.download': 'Download',
  'files.openError': 'Could not open file',
  'files.downloadPdf': 'Download PDF',
  'files.count': '{count} files',
  'files.countSingular': '1 file',
  'files.uploaded': '{count} uploaded',
  'files.uploadError': 'Upload failed',
  'files.dropzone': 'Drop files here',
  'files.dropzoneHint': 'or click to browse',
  'files.allowedTypes': 'Images, PDF, DOC, DOCX, XLS, XLSX, TXT, CSV · Max 50 MB',
  'files.uploading': 'Uploading...',
  'files.filterAll': 'All',
  'files.filterPdf': 'PDFs',
  'files.filterImages': 'Images',
  'files.filterDocs': 'Documents',
  'files.filterCollab': 'Collab Notes',
  'files.sourceCollab': 'From Collab Notes',
  'files.empty': 'No files yet',
  'files.emptyHint': 'Upload files to attach them to your trip',
  'files.openTab': 'Open in new tab',
  'files.confirm.delete': 'Are you sure you want to delete this file?',
  'files.toast.deleted': 'File deleted',
  'files.toast.deleteError': 'Failed to delete file',
  'files.sourcePlan': 'Day Plan',
  'files.sourceBooking': 'Booking',
  'files.sourceTransport': 'Transport',
  'files.attach': 'Attach',
  'files.pasteHint': 'You can also paste images from clipboard (Ctrl+V)',
  'files.trash': 'Trash',
  'files.trashEmpty': 'Trash is empty',
  'files.emptyTrash': 'Empty Trash',
  'files.restore': 'Restore',
  'files.star': 'Star',
  'files.unstar': 'Unstar',
  'files.assign': 'Assign',
  'files.assignTitle': 'Assign File',
  'files.assignPlace': 'Place',
  'files.assignBooking': 'Booking',
  'files.assignTransport': 'Transport',
  'files.unassigned': 'Unassigned',
  'files.unlink': 'Remove link',
  'files.toast.trashed': 'Moved to trash',
  'files.toast.restored': 'File restored',
  'files.toast.trashEmptied': 'Trash emptied',
  'files.toast.assigned': 'File assigned',
  'files.toast.assignError': 'Assignment failed',
  'files.toast.restoreError': 'Restore failed',
  'files.confirm.permanentDelete': 'Permanently delete this file? This cannot be undone.',
  'files.confirm.emptyTrash': 'Permanently delete all trashed files? This cannot be undone.',
  'files.noteLabel': 'Note',
  'files.notePlaceholder': 'Add a note...',

  // Packing
  'packing.title': 'Packing List',
  'packing.empty': 'Packing list is empty',
  'packing.import': 'Import',
  'packing.importTitle': 'Import Packing List',
  'packing.importHint': 'One item per line. Format: Category, Name, Weight in g (optional), Bag (optional), checked/unchecked (optional)',
  'packing.importPlaceholder': 'Hygiene, Toothbrush\nClothing, T-Shirts, 200\nDocuments, Passport, , Carry-on\nElectronics, Charger, 50, Suitcase, checked',
  'packing.importCsv': 'Load CSV/TXT',
  'packing.importAction': 'Import {count}',
  'packing.importSuccess': '{count} items imported',
  'packing.importError': 'Import failed',
  'packing.importEmpty': 'No items to import',
  'packing.progress': '{packed} of {total} packed ({percent}%)',
  'packing.clearChecked': 'Remove {count} checked',
  'packing.clearCheckedShort': 'Remove {count}',
  'packing.suggestions': 'Suggestions',
  'packing.suggestionsTitle': 'Add Suggestions',
  'packing.allSuggested': 'All suggestions added',
  'packing.allPacked': 'All packed!',
  'packing.addPlaceholder': 'Add new item...',
  'packing.categoryPlaceholder': 'Category...',
  'packing.filterAll': 'All',
  'packing.filterOpen': 'Open',
  'packing.filterDone': 'Done',
  'packing.emptyTitle': 'Packing list is empty',
  'packing.emptyHint': 'Add items or use the suggestions',
  'packing.emptyFiltered': 'No items match this filter',
  'packing.menuRename': 'Rename',
  'packing.menuCheckAll': 'Check All',
  'packing.menuUncheckAll': 'Uncheck All',
  'packing.menuDeleteCat': 'Delete Category',
  'packing.noMembers': 'No trip members',
  'packing.addItem': 'Add item',
  'packing.addItemPlaceholder': 'Item name...',
  'packing.addCategory': 'Add category',
  'packing.newCategoryPlaceholder': 'Category name (e.g. Clothing)',
  'packing.applyTemplate': 'Apply template',
  'packing.template': 'Template',
  'packing.templateApplied': '{count} items added from template',
  'packing.templateError': 'Failed to apply template',
  'packing.saveAsTemplate': 'Save as template',
  'packing.templateName': 'Template name',
  'packing.templateSaved': 'Packing list saved as template',
  'packing.bags': 'Bags',
  'packing.noBag': 'Unassigned',
  'packing.totalWeight': 'Total weight',
  'packing.bagName': 'Bag name...',
  'packing.addBag': 'Add bag',
  'packing.changeCategory': 'Change Category',
  'packing.confirm.clearChecked': 'Are you sure you want to remove {count} checked items?',
  'packing.confirm.deleteCat': 'Are you sure you want to delete the category "{name}" with {count} items?',
  'packing.defaultCategory': 'Other',
  'packing.toast.saveError': 'Failed to save',
  'packing.toast.deleteError': 'Failed to delete',
  'packing.toast.renameError': 'Failed to rename',
  'packing.toast.addError': 'Failed to add',

  // Packing suggestions
  'packing.suggestions.items': [
    { name: 'Passport', category: 'Documents' },
    { name: 'ID Card', category: 'Documents' },
    { name: 'Travel Insurance', category: 'Documents' },
    { name: 'Flight Tickets', category: 'Documents' },
    { name: 'Credit Card', category: 'Finances' },
    { name: 'Cash', category: 'Finances' },
    { name: 'Visa', category: 'Documents' },
    { name: 'T-Shirts', category: 'Clothing' },
    { name: 'Pants', category: 'Clothing' },
    { name: 'Underwear', category: 'Clothing' },
    { name: 'Socks', category: 'Clothing' },
    { name: 'Jacket', category: 'Clothing' },
    { name: 'Sleepwear', category: 'Clothing' },
    { name: 'Swimwear', category: 'Clothing' },
    { name: 'Rain Jacket', category: 'Clothing' },
    { name: 'Comfortable Shoes', category: 'Clothing' },
    { name: 'Toothbrush', category: 'Toiletries' },
    { name: 'Toothpaste', category: 'Toiletries' },
    { name: 'Shampoo', category: 'Toiletries' },
    { name: 'Deodorant', category: 'Toiletries' },
    { name: 'Sunscreen', category: 'Toiletries' },
    { name: 'Razor', category: 'Toiletries' },
    { name: 'Charger', category: 'Electronics' },
    { name: 'Power Bank', category: 'Electronics' },
    { name: 'Headphones', category: 'Electronics' },
    { name: 'Travel Adapter', category: 'Electronics' },
    { name: 'Camera', category: 'Electronics' },
    { name: 'Pain Medication', category: 'Health' },
    { name: 'Band-Aids', category: 'Health' },
    { name: 'Disinfectant', category: 'Health' },
  ],

  // Members / Sharing
  'members.shareTrip': 'Share Trip',
  'members.inviteUser': 'Invite User',
  'members.selectUser': 'Select user…',
  'members.invite': 'Invite',
  'members.allHaveAccess': 'All users already have access.',
  'members.access': 'Access',
  'members.person': 'person',
  'members.persons': 'persons',
  'members.you': 'you',
  'members.owner': 'Owner',
  'members.leaveTrip': 'Leave trip',
  'members.removeAccess': 'Remove access',
  'members.confirmLeave': 'Leave trip? You will lose access.',
  'members.confirmRemove': 'Remove access for this user?',
  'members.loadError': 'Failed to load members',
  'members.added': 'added',
  'members.addError': 'Failed to add',
  'members.removed': 'Member removed',
  'members.removeError': 'Failed to remove',

  // Categories (Admin)
  'categories.title': 'Categories',
  'categories.subtitle': 'Manage categories for places',
  'categories.new': 'New Category',
  'categories.empty': 'No categories yet',
  'categories.namePlaceholder': 'Category name',
  'categories.icon': 'Icon',
  'categories.color': 'Color',
  'categories.customColor': 'Choose custom color',
  'categories.preview': 'Preview',
  'categories.defaultName': 'Category',
  'categories.update': 'Update',
  'categories.create': 'Create',
  'categories.confirm.delete': 'Delete category? Places in this category will not be deleted.',
  'categories.toast.loadError': 'Failed to load categories',
  'categories.toast.nameRequired': 'Please enter a name',
  'categories.toast.updated': 'Category updated',
  'categories.toast.created': 'Category created',
  'categories.toast.saveError': 'Failed to save',
  'categories.toast.deleted': 'Category deleted',
  'categories.toast.deleteError': 'Failed to delete',

  // Backup (Admin)
  'backup.title': 'Data Backup',
  'backup.subtitle': 'Database and all uploaded files',
  'backup.refresh': 'Refresh',
  'backup.upload': 'Upload Backup',
  'backup.uploading': 'Uploading…',
  'backup.create': 'Create Backup',
  'backup.creating': 'Creating…',
  'backup.empty': 'No backups yet',
  'backup.createFirst': 'Create first backup',
  'backup.download': 'Download',
  'backup.restore': 'Restore',
  'backup.confirm.restore': 'Restore backup "{name}"?\n\nAll current data will be replaced with the backup.',
  'backup.confirm.uploadRestore': 'Upload and restore backup file "{name}"?\n\nAll current data will be overwritten.',
  'backup.confirm.delete': 'Delete backup "{name}"?',
  'backup.toast.loadError': 'Failed to load backups',
  'backup.toast.created': 'Backup created successfully',
  'backup.toast.createError': 'Failed to create backup',
  'backup.toast.restored': 'Backup restored. Page will reload…',
  'backup.toast.restoreError': 'Failed to restore',
  'backup.toast.uploadError': 'Failed to upload',
  'backup.toast.deleted': 'Backup deleted',
  'backup.toast.deleteError': 'Failed to delete',
  'backup.toast.downloadError': 'Download failed',
  'backup.toast.settingsSaved': 'Auto-backup settings saved',
  'backup.toast.settingsError': 'Failed to save settings',
  'backup.auto.title': 'Auto-Backup',
  'backup.auto.subtitle': 'Automatic backup on a schedule',
  'backup.auto.enable': 'Enable auto-backup',
  'backup.auto.enableHint': 'Backups will be created automatically on the chosen schedule',
  'backup.auto.interval': 'Interval',
  'backup.auto.hour': 'Run at hour',
  'backup.auto.hourHint': 'Server local time ({format} format)',
  'backup.auto.dayOfWeek': 'Day of week',
  'backup.auto.dayOfMonth': 'Day of month',
  'backup.auto.dayOfMonthHint': 'Limited to 1–28 for compatibility with all months',
  'backup.auto.scheduleSummary': 'Schedule',
  'backup.auto.summaryDaily': 'Every day at {hour}:00',
  'backup.auto.summaryWeekly': 'Every {day} at {hour}:00',
  'backup.auto.summaryMonthly': 'Day {day} of every month at {hour}:00',
  'backup.auto.envLocked': 'Docker',
  'backup.auto.envLockedHint': 'Auto-backup is configured via Docker environment variables. To change these settings, update your docker-compose.yml and restart the container.',
  'backup.auto.copyEnv': 'Copy Docker env vars',
  'backup.auto.envCopied': 'Docker env vars copied to clipboard',
  'backup.auto.keepLabel': 'Delete old backups after',
  'backup.dow.sunday': 'Sun',
  'backup.dow.monday': 'Mon',
  'backup.dow.tuesday': 'Tue',
  'backup.dow.wednesday': 'Wed',
  'backup.dow.thursday': 'Thu',
  'backup.dow.friday': 'Fri',
  'backup.dow.saturday': 'Sat',
  'backup.interval.hourly': 'Hourly',
  'backup.interval.daily': 'Daily',
  'backup.interval.weekly': 'Weekly',
  'backup.interval.monthly': 'Monthly',
  'backup.keep.1day': '1 day',
  'backup.keep.3days': '3 days',
  'backup.keep.7days': '7 days',
  'backup.keep.14days': '14 days',
  'backup.keep.30days': '30 days',
  'backup.keep.forever': 'Keep forever',

  // Photos
  'photos.title': 'Photos',
  'photos.subtitle': '{count} photos for {trip}',
  'photos.dropHere': 'Drop photos here...',
  'photos.dropHereActive': 'Drop photos here',
  'photos.captionForAll': 'Caption (for all)',
  'photos.captionPlaceholder': 'Optional caption...',
  'photos.addCaption': 'Add caption...',
  'photos.allDays': 'All Days',
  'photos.noPhotos': 'No photos yet',
  'photos.uploadHint': 'Upload your travel photos',
  'photos.clickToSelect': 'or click to select',
  'photos.linkPlace': 'Link Place',
  'photos.noPlace': 'No Place',
  'photos.uploadN': '{n} photo(s) upload',
  'photos.linkDay': 'Link Day',
  'photos.noDay': 'No Day',
  'photos.dayLabel': 'Day {number}',
  'photos.photoSelected': 'Photo selected',
  'photos.photosSelected': 'Photos selected',
  'photos.fileTypeHint': 'JPG, PNG, WebP · max. 10 MB · up to 30 photos',

  // Backup restore modal
  'backup.restoreConfirmTitle': 'Restore Backup?',
  'backup.restoreWarning': 'All current data (trips, places, users, uploads) will be permanently replaced by the backup. This action cannot be undone.',
  'backup.restoreTip': 'Tip: Create a backup of the current state before restoring.',
  'backup.restoreConfirm': 'Yes, restore',

  // PDF
  'pdf.travelPlan': 'Travel Plan',
  'pdf.planned': 'Planned',
  'pdf.costLabel': 'Cost EUR',
  'pdf.preview': 'PDF Preview',
  'pdf.saveAsPdf': 'Save as PDF',

  // Planner
  'planner.places': 'Places',
  'planner.bookings': 'Bookings',
  'planner.packingList': 'Packing List',
  'planner.documents': 'Documents',
  'planner.dayPlan': 'Day Plan',
  'planner.reservations': 'Reservations',
  'planner.minTwoPlaces': 'At least 2 places with coordinates needed',
  'planner.noGeoPlaces': 'No places with coordinates available',
  'planner.routeCalculated': 'Route calculated',
  'planner.routeCalcFailed': 'Route could not be calculated',
  'planner.routeError': 'Error calculating route',
  'planner.icsExportFailed': 'ICS export failed',
  'planner.routeOptimized': 'Route optimized',
  'planner.reservationUpdated': 'Reservation updated',
  'planner.reservationAdded': 'Reservation added',
  'planner.confirmDeleteReservation': 'Delete reservation?',
  'planner.reservationDeleted': 'Reservation deleted',
  'planner.days': 'Days',
  'planner.allPlaces': 'All Places',
  'planner.totalPlaces': '{n} places total',
  'planner.noDaysPlanned': 'No days planned yet',
  'planner.editTrip': 'Edit trip \u2192',
  'planner.placeOne': '1 place',
  'planner.placeN': '{n} places',
  'planner.addNote': 'Add note',
  'planner.noEntries': 'No entries for this day',
  'planner.addPlace': 'Add place/activity',
  'planner.addPlaceShort': '+ Add place/activity',
  'planner.resPending': 'Reservation pending · ',
  'planner.resConfirmed': 'Reservation confirmed · ',
  'planner.notePlaceholder': 'Note\u2026',
  'planner.noteTimePlaceholder': 'Time (optional)',
  'planner.noteExamplePlaceholder': 'e.g. S3 at 14:30 from central station, ferry from pier 7, lunch break\u2026',
  'planner.totalCost': 'Total cost',
  'planner.searchPlaces': 'Search places\u2026',
  'planner.allCategories': 'All Categories',
  'planner.noPlacesFound': 'No places found',
  'planner.addFirstPlace': 'Add first place',
  'planner.noReservations': 'No reservations',
  'planner.addFirstReservation': 'Add first reservation',
  'planner.new': 'New',
  'planner.addToDay': '+ Day',
  'planner.calculating': 'Calculating\u2026',
  'planner.route': 'Route',
  'planner.optimize': 'Optimize',
  'planner.openGoogleMaps': 'Open in Google Maps',
  'planner.selectDayHint': 'Select a day from the left list to see the day plan',
  'planner.noPlacesForDay': 'No places for this day yet',
  'planner.addPlacesLink': 'Add places \u2192',
  'planner.minTotal': 'min. total',
  'planner.noReservation': 'No reservation',
  'planner.removeFromDay': 'Remove from day',
  'planner.addToThisDay': 'Add to day',
  'planner.overview': 'Overview',
  'planner.noDays': 'No days yet',
  'planner.editTripToAddDays': 'Edit trip to add days',
  'planner.dayCount': '{n} Days',
  'planner.clickToUnlock': 'Click to unlock',
  'planner.keepPosition': 'Keep position during route optimization',
  'planner.dayDetails': 'Day details',
  'planner.dayN': 'Day {n}',

  // Dashboard Stats
  'stats.countries': 'Countries',
  'stats.cities': 'Cities',
  'stats.trips': 'Trips',
  'stats.places': 'Places',
  'stats.worldProgress': 'World Progress',
  'stats.visited': 'visited',
  'stats.remaining': 'remaining',
  'stats.visitedCountries': 'Visited Countries',

  // Day Detail Panel
  'day.precipProb': 'Rain probability',
  'day.precipitation': 'Precipitation',
  'day.wind': 'Wind',
  'day.sunrise': 'Sunrise',
  'day.sunset': 'Sunset',
  'day.hourlyForecast': 'Hourly Forecast',
  'day.climateHint': 'Historical averages — real forecast available within 16 days of this date.',
  'day.noWeather': 'No weather data available. Add a place with coordinates.',
  'day.overview': 'Daily Overview',
  'day.accommodation': 'Accommodation',
  'day.addAccommodation': 'Add accommodation',
  'day.hotelDayRange': 'Apply to days',
  'day.noPlacesForHotel': 'Add places to your trip first',
  'day.allDays': 'All',
  'day.checkIn': 'Check-in',
  'day.checkInUntil': 'Until',
  'day.checkOut': 'Check-out',
  'day.confirmation': 'Confirmation',
  'day.editAccommodation': 'Edit accommodation',
  'day.reservations': 'Reservations',

  // Photos / Immich
  'memories.title': 'Photos',
  'memories.notConnected': '{provider_name} not connected',
  'memories.notConnectedHint': 'Connect your {provider_name} instance in Settings to be able add photos to this trip.',
  'memories.notConnectedMultipleHint': 'Connect any of these photo providers: {provider_names} in Settings to be able add photos to this trip.',
  'memories.noDates': 'Add dates to your trip to load photos.',
  'memories.noPhotos': 'No photos found',
  'memories.noPhotosHint': 'No photos found in {provider_name} for this trip\'s date range.',
  'memories.photosFound': 'photos',
  'memories.fromOthers': 'from others',
  'memories.sharePhotos': 'Share photos',
  'memories.sharing': 'Sharing',
  'memories.reviewTitle': 'Review your photos',
  'memories.reviewHint': 'Click photos to exclude them from sharing.',
  'memories.shareCount': 'Share {count} photos',
  //-------------------------
  //todo section
  'memories.providerUrl': 'Server URL',
  'memories.providerApiKey': 'API Key',
  'memories.providerUsername': 'Username',
  'memories.providerPassword': 'Password',
  'memories.providerOTP': 'MFA code (if enabled)',
  'memories.skipSSLVerification': 'Skip SSL certificate verification',
  'memories.immichAutoUpload': 'Mirror journey photos to Immich on upload',
  'memories.providerUrlHintSynology': 'Include the Photos app path in the URL, e.g. https://nas:5001/photo',
  'memories.testConnection': 'Test connection',
  'memories.testShort': 'Test',
  'memories.testFirst': 'Test connection first',
  'memories.connected': 'Connected',
  'memories.disconnected': 'Not connected',
  'memories.connectionSuccess': 'Connected to {provider_name}',
  'memories.connectionError': 'Could not connect to {provider_name}',
  'memories.saved': '{provider_name} settings saved',
  'memories.providerDisconnectedBanner': 'Your {provider_name} connection is lost. Reconnect in Settings to view photos.',
  'memories.saveError': 'Could not save {provider_name} settings',
  //------------------------  
  'memories.addPhotos': 'Add photos',
  'memories.linkAlbum': 'Link Album',
  'memories.selectAlbum': 'Select {provider_name} Album',
  'memories.selectAlbumMultiple': 'Select Album',
  'memories.noAlbums': 'No albums found',
  'memories.syncAlbum': 'Sync album',
  'memories.unlinkAlbum': 'Unlink album',
  'memories.photos': 'photos',
  'memories.selectPhotos': 'Select photos from {provider_name}',
  'memories.selectPhotosMultiple': 'Select Photos',
  'memories.selectHint': 'Tap photos to select them.',
  'memories.selected': 'selected',
  'memories.addSelected': 'Add {count} photos',
  'memories.alreadyAdded': 'Added',
  'memories.private': 'Private',
  'memories.stopSharing': 'Stop sharing',
  'memories.oldest': 'Oldest first',
  'memories.newest': 'Newest first',
  'memories.allLocations': 'All locations',
  'memories.tripDates': 'Trip dates',
  'memories.allPhotos': 'All photos',
  'memories.confirmShareTitle': 'Share with trip members?',
  'memories.confirmShareHint': '{count} photos will be visible to all members of this trip. You can make individual photos private later.',
  'memories.confirmShareButton': 'Share photos',
  'memories.error.loadAlbums': 'Failed to load albums',
  'memories.error.linkAlbum': 'Failed to link album',
  'memories.error.unlinkAlbum': 'Failed to unlink album',
  'memories.error.syncAlbum': 'Failed to sync album',
  'memories.error.loadPhotos': 'Failed to load photos',
  'memories.error.addPhotos': 'Failed to add photos',
  'memories.error.removePhoto': 'Failed to remove photo',
  'memories.error.toggleSharing': 'Failed to update sharing',
  'memories.saveRouteNotConfigured': 'Save route is not configured for this provider',
  'memories.testRouteNotConfigured': 'Test route is not configured for this provider',
  'memories.fillRequiredFields': 'Please fill all required fields',

  // Collab Addon
  'collab.tabs.chat': 'Chat',
  'collab.tabs.notes': 'Notes',
  'collab.tabs.polls': 'Polls',
  'collab.whatsNext.title': "What's Next",
  'collab.whatsNext.today': 'Today',
  'collab.whatsNext.tomorrow': 'Tomorrow',
  'collab.whatsNext.empty': 'No upcoming activities',
  'collab.whatsNext.until': 'to',
  'collab.whatsNext.emptyHint': 'Activities with times will appear here',
  'collab.chat.send': 'Send',
  'collab.chat.placeholder': 'Type a message...',
  'collab.chat.empty': 'Start the conversation',
  'collab.chat.emptyHint': 'Messages are shared with all trip members',
  'collab.chat.emptyDesc': 'Share ideas, plans, and updates with your travel group',
  'collab.chat.today': 'Today',
  'collab.chat.yesterday': 'Yesterday',
  'collab.chat.deletedMessage': 'deleted a message',
  'collab.chat.reply': 'Reply',
  'collab.chat.loadMore': 'Load older messages',
  'collab.chat.justNow': 'just now',
  'collab.chat.minutesAgo': '{n}m ago',
  'collab.chat.hoursAgo': '{n}h ago',
  'collab.notes.title': 'Notes',
  'collab.notes.new': 'New Note',
  'collab.notes.empty': 'No notes yet',
  'collab.notes.emptyHint': 'Start capturing ideas and plans',
  'collab.notes.all': 'All',
  'collab.notes.titlePlaceholder': 'Note title',
  'collab.notes.contentPlaceholder': 'Write something...',
  'collab.notes.categoryPlaceholder': 'Category',
  'collab.notes.newCategory': 'New category...',
  'collab.notes.category': 'Category',
  'collab.notes.noCategory': 'No category',
  'collab.notes.color': 'Color',
  'collab.notes.save': 'Save',
  'collab.notes.cancel': 'Cancel',
  'collab.notes.edit': 'Edit',
  'collab.notes.delete': 'Delete',
  'collab.notes.pin': 'Pin',
  'collab.notes.unpin': 'Unpin',
  'collab.notes.daysAgo': '{n}d ago',
  'collab.notes.categorySettings': 'Manage Categories',
  'collab.notes.create': 'Create',
  'collab.notes.website': 'Website',
  'collab.notes.websitePlaceholder': 'https://...',
  'collab.notes.attachFiles': 'Attach files',
  'collab.notes.noCategoriesYet': 'No categories yet',
  'collab.notes.emptyDesc': 'Create a note to get started',
  'collab.polls.title': 'Polls',
  'collab.polls.new': 'New Poll',
  'collab.polls.empty': 'No polls yet',
  'collab.polls.emptyHint': 'Ask the group and vote together',
  'collab.polls.question': 'Question',
  'collab.polls.questionPlaceholder': 'What should we do?',
  'collab.polls.addOption': '+ Add option',
  'collab.polls.optionPlaceholder': 'Option {n}',
  'collab.polls.create': 'Create Poll',
  'collab.polls.close': 'Close',
  'collab.polls.closed': 'Closed',
  'collab.polls.votes': '{n} votes',
  'collab.polls.vote': '{n} vote',
  'collab.polls.multipleChoice': 'Multiple choice',
  'collab.polls.multiChoice': 'Multiple choice',
  'collab.polls.deadline': 'Deadline',
  'collab.polls.option': 'Option',
  'collab.polls.options': 'Options',
  'collab.polls.delete': 'Delete',
  'collab.polls.closedSection': 'Closed',

  // Permissions
  'admin.tabs.permissions': 'Permissions',
  'perm.title': 'Permission Settings',
  'perm.subtitle': 'Control who can perform actions across the application',
  'perm.saved': 'Permission settings saved',
  'perm.resetDefaults': 'Reset to defaults',
  'perm.customized': 'customized',
  'perm.level.admin': 'Admin only',
  'perm.level.tripOwner': 'Trip owner',
  'perm.level.tripMember': 'Trip members',
  'perm.level.everybody': 'Everyone',
  'perm.cat.trip': 'Trip Management',
  'perm.cat.members': 'Member Management',
  'perm.cat.files': 'Files',
  'perm.cat.content': 'Content & Schedule',
  'perm.cat.extras': 'Budget, Packing & Collaboration',
  'perm.action.trip_create': 'Create trips',
  'perm.action.trip_edit': 'Edit trip details',
  'perm.action.trip_delete': 'Delete trips',
  'perm.action.trip_archive': 'Archive / unarchive trips',
  'perm.action.trip_cover_upload': 'Upload cover image',
  'perm.action.member_manage': 'Add / remove members',
  'perm.action.file_upload': 'Upload files',
  'perm.action.file_edit': 'Edit file metadata',
  'perm.action.file_delete': 'Delete files',
  'perm.action.place_edit': 'Add / edit / delete places',
  'perm.action.day_edit': 'Edit days, notes & assignments',
  'perm.action.reservation_edit': 'Manage reservations',
  'perm.action.budget_edit': 'Manage budget',
  'perm.action.packing_edit': 'Manage packing lists',
  'perm.action.collab_edit': 'Collaboration (notes, polls, chat)',
  'perm.action.share_manage': 'Manage share links',
  'perm.actionHint.trip_create': 'Who can create new trips',
  'perm.actionHint.trip_edit': 'Who can change trip name, dates, description and currency',
  'perm.actionHint.trip_delete': 'Who can permanently delete a trip',
  'perm.actionHint.trip_archive': 'Who can archive or unarchive a trip',
  'perm.actionHint.trip_cover_upload': 'Who can upload or change the cover image',
  'perm.actionHint.member_manage': 'Who can invite or remove trip members',
  'perm.actionHint.file_upload': 'Who can upload files to a trip',
  'perm.actionHint.file_edit': 'Who can edit file descriptions and links',
  'perm.actionHint.file_delete': 'Who can move files to trash or permanently delete them',
  'perm.actionHint.place_edit': 'Who can add, edit or delete places',
  'perm.actionHint.day_edit': 'Who can edit days, day notes and place assignments',
  'perm.actionHint.reservation_edit': 'Who can create, edit or delete reservations',
  'perm.actionHint.budget_edit': 'Who can create, edit or delete budget items',
  'perm.actionHint.packing_edit': 'Who can manage packing items and bags',
  'perm.actionHint.collab_edit': 'Who can create notes, polls and send messages',
  'perm.actionHint.share_manage': 'Who can create or delete public share links',

  // Undo
  'undo.button': 'Undo',
  'undo.tooltip': 'Undo: {action}',
  'undo.assignPlace': 'Place assigned to day',
  'undo.removeAssignment': 'Place removed from day',
  'undo.reorder': 'Places reordered',
  'undo.optimize': 'Route optimized',
  'undo.deletePlace': 'Place deleted',
  'undo.deletePlaces': 'Places deleted',
  'undo.moveDay': 'Place moved to another day',
  'undo.lock': 'Place lock toggled',
  'undo.importGpx': 'GPX import',
  'undo.importKeyholeMarkup': 'KMZ/KML import',
  'undo.importGoogleList': 'Google Maps import',
  'undo.importNaverList': 'Naver Maps import',
  'undo.addPlace': 'Place added',
  'undo.done': 'Undone: {action}',

  // Notifications
  'notifications.title': 'Notifications',
  'notifications.markAllRead': 'Mark all read',
  'notifications.deleteAll': 'Delete all',
  'notifications.showAll': 'Show all notifications',
  'notifications.empty': 'No notifications',
  'notifications.emptyDescription': "You're all caught up!",
  'notifications.all': 'All',
  'notifications.unreadOnly': 'Unread',
  'notifications.markRead': 'Mark as read',
  'notifications.markUnread': 'Mark as unread',
  'notifications.delete': 'Delete',
  'notifications.system': 'System',
  'notifications.synologySessionCleared.title': 'Synology Photos disconnected',
  'notifications.synologySessionCleared.text': 'Your server or account changed — go to Settings to test your connection again.',

  // Notification test keys (dev only)
  'notifications.versionAvailable.title': 'Update Available',
  'notifications.versionAvailable.text': 'TREK {version} is now available.',
  'notifications.versionAvailable.button': 'View Details',
  'notifications.test.title': 'Test notification from {actor}',
  'notifications.test.text': 'This is a simple test notification.',
  'notifications.test.booleanTitle': '{actor} asks for your approval',
  'notifications.test.booleanText': 'This is a test boolean notification. Choose an action below.',
  'notifications.test.accept': 'Approve',
  'notifications.test.decline': 'Decline',
  'notifications.test.navigateTitle': 'Check something out',
  'notifications.test.navigateText': 'This is a test navigate notification.',
  'notifications.test.goThere': 'Go there',
  'notifications.test.adminTitle': 'Admin broadcast',
  'notifications.test.adminText': '{actor} sent a test notification to all admins.',
  'notifications.test.tripTitle': '{actor} posted in your trip',
  'notifications.test.tripText': 'Test notification for trip "{trip}".',

  // Todo
  'todo.subtab.packing': 'Packing List',
  'todo.subtab.todo': 'To-Do',
  'todo.completed': 'completed',
  'todo.filter.all': 'All',
  'todo.filter.open': 'Open',
  'todo.filter.done': 'Done',
  'todo.uncategorized': 'Uncategorized',
  'todo.namePlaceholder': 'Task name',
  'todo.descriptionPlaceholder': 'Description (optional)',
  'todo.unassigned': 'Unassigned',
  'todo.noCategory': 'No category',
  'todo.hasDescription': 'Has description',
  'todo.addItem': 'Add new task',
  'todo.sidebar.sortBy': 'Sort by',
  'todo.priority': 'Priority',
  'todo.newCategoryLabel': 'new',
  'budget.categoriesLabel': 'categories',
  'todo.newCategory': 'Category name',
  'todo.addCategory': 'Add category',
  'todo.newItem': 'New task',
  'todo.empty': 'No tasks yet. Add a task to get started!',
  'todo.filter.my': 'My Tasks',
  'todo.filter.overdue': 'Overdue',
  'todo.sidebar.tasks': 'Tasks',
  'todo.sidebar.categories': 'Categories',
  'todo.detail.title': 'Task',
  'todo.detail.description': 'Description',
  'todo.detail.category': 'Category',
  'todo.detail.dueDate': 'Due date',
  'todo.detail.assignedTo': 'Assigned to',
  'todo.detail.delete': 'Delete',
  'todo.detail.save': 'Save changes',
  'todo.sortByPrio': 'Priority',
  'todo.detail.priority': 'Priority',
  'todo.detail.noPriority': 'None',
  'todo.detail.create': 'Create task',

  // Notifications — dev test events
  'notif.test.title': '[Test] Notification',
  'notif.test.simple.text': 'This is a simple test notification.',
  'notif.test.boolean.text': 'Do you accept this test notification?',
  'notif.test.navigate.text': 'Click below to navigate to the dashboard.',

  // Notifications
  'notif.trip_invite.title': 'Trip Invitation',
  'notif.trip_invite.text': '{actor} invited you to {trip}',
  'notif.booking_change.title': 'Booking Updated',
  'notif.booking_change.text': '{actor} updated a booking in {trip}',
  'notif.trip_reminder.title': 'Trip Reminder',
  'notif.trip_reminder.text': 'Your trip {trip} is coming up soon!',
  'notif.todo_due.title': 'To-do due',
  'notif.todo_due.text': '{todo} in {trip} is due on {due}',
  'notif.vacay_invite.title': 'Vacay Fusion Invite',
  'notif.vacay_invite.text': '{actor} invited you to fuse vacation plans',
  'notif.photos_shared.title': 'Photos Shared',
  'notif.photos_shared.text': '{actor} shared {count} photo(s) in {trip}',
  'notif.collab_message.title': 'New Message',
  'notif.collab_message.text': '{actor} sent a message in {trip}',
  'notif.packing_tagged.title': 'Packing Assignment',
  'notif.packing_tagged.text': '{actor} assigned you to {category} in {trip}',
  'notif.version_available.title': 'New Version Available',
  'notif.version_available.text': 'TREK {version} is now available',
  'notif.action.view_trip': 'View Trip',
  'notif.action.view_collab': 'View Messages',
  'notif.action.view_packing': 'View Packing',
  'notif.action.view_photos': 'View Photos',
  'notif.action.view_vacay': 'View Vacay',
  'notif.action.view_admin': 'Go to Admin',
  'notif.action.view': 'View',
  'notif.action.accept': 'Accept',
  'notif.action.decline': 'Decline',
  'notif.generic.title': 'Notification',
  'notif.generic.text': 'You have a new notification',
  'notif.dev.unknown_event.title': '[DEV] Unknown Event',
  'notif.dev.unknown_event.text': 'Event type "{event}" is not registered in EVENT_NOTIFICATION_CONFIG',

  // Journey addon
  'journey.search.placeholder': 'Search journeys…',
  'journey.search.noResults': 'No journeys match "{query}"',
  'journey.title': 'Journey',
  'journey.subtitle': 'Track your travels as they happen',
  'journey.new': 'New Journey',
  'journey.create': 'Create',
  'journey.titlePlaceholder': 'Where are you going?',
  'journey.empty': 'No journeys yet',
  'journey.emptyHint': 'Start documenting your next trip',
  'journey.deleted': 'Journey deleted',
  'journey.createError': 'Could not create journey',
  'journey.deleteError': 'Could not delete journey',
  'journey.deleteConfirmTitle': 'Delete',
  'journey.deleteConfirmMessage': 'Delete "{title}"? This cannot be undone.',
  'journey.deleteConfirmGeneric': 'Are you sure you want to delete this?',
  'journey.notFound': 'Journey not found',
  'journey.photos': 'Photos',
  'journey.timelineEmpty': 'No stops yet',
  'journey.timelineEmptyHint': 'Add a check-in or write a journal entry to get started',
  'journey.status.draft': 'Draft',
  'journey.status.active': 'Active',
  'journey.status.completed': 'Completed',
  'journey.status.upcoming': 'Upcoming',
  'journey.status.archived': 'Archived',
  'journey.checkin.add': 'Check in',
  'journey.checkin.namePlaceholder': 'Location name',
  'journey.checkin.notesPlaceholder': 'Notes (optional)',
  'journey.checkin.save': 'Save',
  'journey.checkin.error': 'Could not save check-in',
  'journey.entry.add': 'Journal',
  'journey.entry.edit': 'Edit entry',
  'journey.entry.titlePlaceholder': 'Title (optional)',
  'journey.entry.bodyPlaceholder': 'What happened today?',
  'journey.entry.save': 'Save',
  'journey.entry.error': 'Could not save entry',
  'journey.photo.add': 'Photo',
  'journey.photo.uploadError': 'Upload failed',
  'journey.share.share': 'Share',
  'journey.share.public': 'Public',
  'journey.share.linkCopied': 'Public link copied',
  'journey.share.disabled': 'Public sharing disabled',
  'journey.editor.titlePlaceholder': 'Give this moment a name...',
  'journey.editor.bodyPlaceholder': 'Tell the story of this day...',
  'journey.editor.placePlaceholder': 'Location (optional)',
  'journey.editor.tagsPlaceholder': 'Tags: hidden gem, best meal, must revisit...',
  'journey.visibility.private': 'Private',
  'journey.visibility.shared': 'Shared',
  'journey.visibility.public': 'Public',
  'journey.emptyState.title': 'Your story starts here',
  'journey.emptyState.subtitle': 'Check in at a place or write your first journal entry',

  // Journey Frontpage
  'journey.frontpage.subtitle': 'Turn your trips into stories you\'ll never forget',
  'journey.frontpage.createJourney': 'Create Journey',
  'journey.frontpage.activeJourney': 'Active Journey',
  'journey.frontpage.allJourneys': 'All Journeys',
  'journey.frontpage.journeys': 'journeys',
  'journey.frontpage.createNew': 'Create a new Journey',
  'journey.frontpage.createNewSub': 'Pick trips, write stories, share your adventures',
  'journey.frontpage.live': 'Live',
  'journey.frontpage.synced': 'Synced',
  'journey.frontpage.continueWriting': 'Continue writing',
  'journey.frontpage.updated': 'Updated {time}',
  'journey.frontpage.suggestionLabel': 'Trip just ended',
  'journey.frontpage.suggestionText': 'Turn <strong>{title}</strong> into a Journey',
  'journey.frontpage.dismiss': 'Dismiss',
  'journey.frontpage.journeyName': 'Journey Name',
  'journey.frontpage.namePlaceholder': 'e.g. Southeast Asia 2026',
  'journey.frontpage.selectTrips': 'Select Trips',
  'journey.frontpage.tripsSelected': 'trips selected',
  'journey.frontpage.trips': 'trips',
  'journey.frontpage.placesImported': 'places will be imported',
  'journey.frontpage.places': 'places',

  // Journey Detail
  'journey.detail.backToJourney': 'Back to Journey',
  'journey.detail.syncedWithTrips': 'Synced with Trips',
  'journey.detail.addEntry': 'Add Entry',
  'journey.detail.newEntry': 'New Entry',
  'journey.detail.editEntry': 'Edit Entry',
  'journey.detail.noEntries': 'No entries yet',
  'journey.detail.noEntriesHint': 'Add a trip to get started with skeleton entries',
  'journey.detail.noPhotos': 'No photos yet',
  'journey.detail.noPhotosHint': 'Upload photos to entries or browse your Immich/Synology library',
  'journey.detail.journeyTab': 'Journey',
  'journey.detail.journeyStats': 'Journey Stats',
  'journey.detail.syncedTrips': 'Synced Trips',
  'journey.detail.noTripsLinked': 'No trips linked yet',
  'journey.detail.contributors': 'Contributors',
  'journey.detail.readMore': 'Read more',
  'journey.detail.prosCons': 'Pros & Cons',
  'journey.detail.photos': 'photos',
  'journey.detail.day': 'Day {number}',
  'journey.detail.places': 'places',

  // Journey Detail — Stats
  'journey.stats.days': 'Days',
  'journey.stats.cities': 'Cities',
  'journey.stats.entries': 'Entries',
  'journey.stats.photos': 'Photos',
  'journey.stats.places': 'Places',
  'journey.skeletons.show': 'Show suggestions',
  'journey.skeletons.hide': 'Hide suggestions',

  // Journey Detail — Verdict
  'journey.verdict.lovedIt': 'Loved it',
  'journey.verdict.couldBeBetter': 'Could be better',

  // Journey Detail — Synced badge
  'journey.synced.places': 'places',
  'journey.synced.synced': 'synced',

  // Journey Entry Editor
  'journey.editor.discardChangesConfirm': 'You have unsaved changes. Discard them?',
  'journey.editor.uploadPhotos': 'Upload photos',
  'journey.editor.uploading': 'Uploading...',
  'journey.editor.fromGallery': 'From Gallery',
  'journey.editor.allPhotosAdded': 'All photos already added',
  'journey.editor.writeStory': 'Write your story...',
  'journey.editor.prosCons': 'Pros & Cons',
  'journey.editor.pros': 'Pros',
  'journey.editor.cons': 'Cons',
  'journey.editor.proPlaceholder': 'Something great...',
  'journey.editor.conPlaceholder': 'Not so great...',
  'journey.editor.addAnother': 'Add another',
  'journey.editor.date': 'Date',
  'journey.editor.location': 'Location',
  'journey.editor.searchLocation': 'Search location...',
  'journey.editor.mood': 'Mood',
  'journey.editor.weather': 'Weather',
  'journey.editor.photoFirst': '1st',
  'journey.editor.makeFirst': 'Make 1st',
  'journey.editor.searching': 'Searching...',

  // Journey Entry — Moods
  'journey.mood.amazing': 'Amazing',
  'journey.mood.good': 'Good',
  'journey.mood.neutral': 'Neutral',
  'journey.mood.rough': 'Rough',

  // Journey Entry — Weather
  'journey.weather.sunny': 'Sunny',
  'journey.weather.partly': 'Partly cloudy',
  'journey.weather.cloudy': 'Cloudy',
  'journey.weather.rainy': 'Rainy',
  'journey.weather.stormy': 'Stormy',
  'journey.weather.cold': 'Snowy',

  // Journey — Trip Linking
  'journey.trips.linkTrip': 'Link Trip',
  'journey.trips.searchTrip': 'Search Trip',
  'journey.trips.searchPlaceholder': 'Trip name or destination...',
  'journey.trips.noTripsAvailable': 'No trips available',
  'journey.trips.link': 'Link',
  'journey.trips.tripLinked': 'Trip linked',
  'journey.trips.linkFailed': 'Failed to link trip',
  'journey.trips.addTrip': 'Add Trip',
  'journey.trips.unlinkTrip': 'Unlink Trip',
  'journey.trips.unlinkMessage': 'Unlink "{title}"? All synced entries and photos from this trip will be permanently deleted. This cannot be undone.',
  'journey.trips.unlink': 'Unlink',
  'journey.trips.tripUnlinked': 'Trip unlinked',
  'journey.trips.unlinkFailed': 'Failed to unlink trip',
  'journey.trips.noTripsLinkedSettings': 'No trips linked',

  // Journey — Contributors
  'journey.contributors.invite': 'Invite Contributor',
  'journey.contributors.searchUser': 'Search User',
  'journey.contributors.searchPlaceholder': 'Username or email...',
  'journey.contributors.noUsers': 'No users found',
  'journey.contributors.role': 'Role',
  'journey.contributors.added': 'Contributor added',
  'journey.contributors.addFailed': 'Failed to add contributor',
  'journey.contributors.remove': 'Remove contributor',
  'journey.contributors.removeConfirm': 'Remove {username} from this journey?',
  'journey.contributors.removed': 'Contributor removed',
  'journey.contributors.removeFailed': 'Failed to remove contributor',

  // Journey — Share
  'journey.share.publicShare': 'Public Share',
  'journey.share.createLink': 'Create share link',
  'journey.share.linkCreated': 'Share link created',
  'journey.share.createFailed': 'Failed to create link',
  'journey.share.copy': 'Copy',
  'journey.share.copied': 'Copied!',
  'journey.share.timeline': 'Timeline',
  'journey.share.gallery': 'Gallery',
  'journey.share.map': 'Map',
  'journey.share.removeLink': 'Remove share link',
  'journey.share.linkDeleted': 'Share link deleted',
  'journey.share.deleteFailed': 'Failed to delete',
  'journey.share.updateFailed': 'Failed to update',

  // Journey — Invite
  'journey.invite.role': 'Role',
  'journey.invite.viewer': 'Viewer',
  'journey.invite.editor': 'Editor',
  'journey.invite.invite': 'Invite',
  'journey.invite.inviting': 'Inviting...',

  // Journey — Settings Dialog
  'journey.settings.title': 'Journey Settings',
  'journey.settings.coverImage': 'Cover Image',
  'journey.settings.changeCover': 'Change cover',
  'journey.settings.addCover': 'Add cover image',
  'journey.settings.name': 'Name',
  'journey.settings.subtitle': 'Subtitle',
  'journey.settings.subtitlePlaceholder': 'e.g. Thailand, Vietnam & Cambodia',
  'journey.settings.endJourney': 'Archive Journey',
  'journey.settings.reopenJourney': 'Restore Journey',
  'journey.settings.archived': 'Journey archived',
  'journey.settings.reopened': 'Journey reopened',
  'journey.settings.endDescription': 'Hides the Live badge. You can reopen anytime.',
  'journey.settings.delete': 'Delete',
  'journey.settings.deleteJourney': 'Delete Journey',
  'journey.settings.deleteMessage': 'Delete "{title}"? All entries and photos will be lost.',
  'journey.settings.saved': 'Settings saved',
  'journey.settings.saveFailed': 'Failed to save',
  'journey.settings.coverUpdated': 'Cover updated',
  'journey.settings.coverFailed': 'Upload failed',
  'journey.settings.failedToDelete': 'Failed to delete',
  'journey.entries.deleteTitle': 'Delete Entry',
  'journey.photosUploaded': '{count} photos uploaded',
  'journey.photosAdded': '{count} photos added',

  // Journey — Public Page
  'journey.public.notFound': 'Not Found',
  'journey.public.notFoundMessage': 'This journey doesn\'t exist or the link has expired.',
  'journey.public.readOnly': 'Read-only · Public Journey',
  'journey.public.tagline': 'Travel Resource & Exploration Kit',
  'journey.public.sharedVia': 'Shared via',
  'journey.public.madeWith': 'Made with',

  // Journey — PDF Export
  'journey.pdf.journeyBook': 'Journey Book',
  'journey.pdf.madeWith': 'Made with TREK',
  'journey.pdf.day': 'Day',
  'journey.pdf.theEnd': 'The End',
  'journey.pdf.saveAsPdf': 'Save as PDF',
  'journey.pdf.pages': 'pages',
  'journey.picker.tripPeriod': 'Trip Period',
  'journey.picker.dateRange': 'Date Range',
  'journey.picker.allPhotos': 'All Photos',
  'journey.picker.albums': 'Albums',
  'journey.picker.selected': 'selected',
  'journey.picker.addTo': 'Add to',
  'journey.picker.newGallery': 'New Gallery',
  'journey.picker.selectAll': 'Select all',
  'journey.picker.deselectAll': 'Deselect all',
  'journey.picker.noAlbums': 'No albums found',
  'journey.picker.selectDate': 'Select date',
  'journey.picker.search': 'Search',

  // Dashboard Mobile
  'dashboard.greeting.morning': 'Good morning,',
  'dashboard.greeting.afternoon': 'Good afternoon,',
  'dashboard.greeting.evening': 'Good evening,',
  'dashboard.mobile.liveNow': 'Live Now',
  'dashboard.mobile.tripProgress': 'Trip progress',
  'dashboard.mobile.daysLeft': '{count} days left',
  'dashboard.mobile.places': 'Places',
  'dashboard.mobile.buddies': 'Buddies',
  'dashboard.mobile.newTrip': 'New Trip',
  'dashboard.mobile.currency': 'Currency',
  'dashboard.mobile.timezone': 'Timezone',
  'dashboard.mobile.upcomingTrips': 'Upcoming Trips',
  'dashboard.mobile.yourTrips': 'Your Trips',
  'dashboard.mobile.trips': 'trips',
  'dashboard.mobile.starts': 'Starts',
  'dashboard.mobile.duration': 'Duration',
  'dashboard.mobile.day': 'day',
  'dashboard.mobile.days': 'days',
  'dashboard.mobile.ongoing': 'Ongoing',
  'dashboard.mobile.startsToday': 'Starts today',
  'dashboard.mobile.tomorrow': 'Tomorrow',
  'dashboard.mobile.inDays': 'In {count} days',
  'dashboard.mobile.inMonths': 'In {count} months',
  'dashboard.mobile.completed': 'Completed',
  'dashboard.mobile.currencyConverter': 'Currency Converter',

  // BottomNav & Profile
  'nav.profile': 'Profile',
  'nav.bottomSettings': 'Settings',
  'nav.bottomAdmin': 'Admin Settings',
  'nav.bottomLogout': 'Logout',
  'nav.bottomAdminBadge': 'Admin',

  // DayPlan Mobile
  'dayplan.mobile.addPlace': 'Add Place',
  'dayplan.mobile.searchPlaces': 'Search places...',
  'dayplan.mobile.allAssigned': 'All places assigned',
  'dayplan.mobile.noMatch': 'No match',
  'dayplan.mobile.createNew': 'Create new place',

  'admin.addons.catalog.journey.name': 'Journey',
  'admin.addons.catalog.journey.description': 'Trip tracking & travel journal with check-ins, photos, and daily stories',

  // OAuth scope groups
  'oauth.scope.group.trips': 'Trips',
  'oauth.scope.group.places': 'Places',
  'oauth.scope.group.atlas': 'Atlas',
  'oauth.scope.group.packing': 'Packing',
  'oauth.scope.group.todos': 'To-dos',
  'oauth.scope.group.budget': 'Budget',
  'oauth.scope.group.reservations': 'Reservations',
  'oauth.scope.group.collab': 'Collaboration',
  'oauth.scope.group.notifications': 'Notifications',
  'oauth.scope.group.vacay': 'Vacation',
  'oauth.scope.group.geo': 'Geo',
  'oauth.scope.group.weather': 'Weather',
  'oauth.scope.group.journey': 'Journey',

  // OAuth scope labels & descriptions
  'oauth.scope.trips:read.label': 'View trips & itineraries',
  'oauth.scope.trips:read.description': 'Read trips, days, day notes, and members',
  'oauth.scope.trips:write.label': 'Edit trips & itineraries',
  'oauth.scope.trips:write.description': 'Create and update trips, days, notes, and manage members',
  'oauth.scope.trips:delete.label': 'Delete trips',
  'oauth.scope.trips:delete.description': 'Permanently delete entire trips — this action is irreversible',
  'oauth.scope.trips:share.label': 'Manage share links',
  'oauth.scope.trips:share.description': 'Create, update, and revoke public share links for trips',
  'oauth.scope.places:read.label': 'View places & map data',
  'oauth.scope.places:read.description': 'Read places, day assignments, tags, and categories',
  'oauth.scope.places:write.label': 'Manage places',
  'oauth.scope.places:write.description': 'Create, update, and delete places, assignments, and tags',
  'oauth.scope.atlas:read.label': 'View Atlas',
  'oauth.scope.atlas:read.description': 'Read visited countries, regions, and bucket list',
  'oauth.scope.atlas:write.label': 'Manage Atlas',
  'oauth.scope.atlas:write.description': 'Mark countries and regions visited, manage bucket list',
  'oauth.scope.packing:read.label': 'View packing lists',
  'oauth.scope.packing:read.description': 'Read packing items, bags, and category assignees',
  'oauth.scope.packing:write.label': 'Manage packing lists',
  'oauth.scope.packing:write.description': 'Add, update, delete, toggle, and reorder packing items and bags',
  'oauth.scope.todos:read.label': 'View to-do lists',
  'oauth.scope.todos:read.description': 'Read trip to-do items and category assignees',
  'oauth.scope.todos:write.label': 'Manage to-do lists',
  'oauth.scope.todos:write.description': 'Create, update, toggle, delete, and reorder to-do items',
  'oauth.scope.budget:read.label': 'View budget',
  'oauth.scope.budget:read.description': 'Read budget items and expense breakdown',
  'oauth.scope.budget:write.label': 'Manage budget',
  'oauth.scope.budget:write.description': 'Create, update, and delete budget items',
  'oauth.scope.reservations:read.label': 'View reservations',
  'oauth.scope.reservations:read.description': 'Read reservations and accommodation details',
  'oauth.scope.reservations:write.label': 'Manage reservations',
  'oauth.scope.reservations:write.description': 'Create, update, delete, and reorder reservations',
  'oauth.scope.collab:read.label': 'View collaboration',
  'oauth.scope.collab:read.description': 'Read collab notes, polls, and messages',
  'oauth.scope.collab:write.label': 'Manage collaboration',
  'oauth.scope.collab:write.description': 'Create, update, and delete collab notes, polls, and messages',
  'oauth.scope.notifications:read.label': 'View notifications',
  'oauth.scope.notifications:read.description': 'Read in-app notifications and unread counts',
  'oauth.scope.notifications:write.label': 'Manage notifications',
  'oauth.scope.notifications:write.description': 'Mark notifications as read and respond to them',
  'oauth.scope.vacay:read.label': 'View vacation plans',
  'oauth.scope.vacay:read.description': 'Read vacation planning data, entries, and stats',
  'oauth.scope.vacay:write.label': 'Manage vacation plans',
  'oauth.scope.vacay:write.description': 'Create and manage vacation entries, holidays, and team plans',
  'oauth.scope.geo:read.label': 'Maps & geocoding',
  'oauth.scope.geo:read.description': 'Search locations, resolve map URLs, and reverse geocode coordinates',
  'oauth.scope.weather:read.label': 'Weather forecasts',
  'oauth.scope.weather:read.description': 'Fetch weather forecasts for trip locations and dates',
  'oauth.scope.journey:read.label': 'View journeys',
  'oauth.scope.journey:read.description': 'Read journeys, entries, and contributor list',
  'oauth.scope.journey:write.label': 'Manage journeys',
  'oauth.scope.journey:write.description': 'Create, update, and delete journeys and their entries',
  'oauth.scope.journey:share.label': 'Manage journey links',
  'oauth.scope.journey:share.description': 'Create, update, and revoke public share links for journeys',

  // System notices — 3.0.0 upgrade
  'system_notice.v3_photos.title': 'Photos have moved in 3.0',
  'system_notice.v3_photos.body': '**Photos** in the Trip Planner have been removed. Your photos are safe — TREK never modified your Immich or Synology library.\n\nPhotos now live in the **Journey** addon. Journey is optional — if it is not yet available, ask your admin to enable it under Admin → Addons.',
  'system_notice.v3_journey.title': 'Meet Journey — travel journal',
  'system_notice.v3_journey.body': 'Document your trips as rich travel stories with timelines, photo galleries, and interactive maps.',
  'system_notice.v3_journey.cta_label': 'Open Journey',
  'system_notice.v3_journey.highlight_timeline': 'Day-by-day timeline & gallery',
  'system_notice.v3_journey.highlight_photos': 'Import from Immich or Synology',
  'system_notice.v3_journey.highlight_share': 'Share publicly — no login needed',
  'system_notice.v3_journey.highlight_export': 'Export as a PDF photo book',
  'system_notice.v3_features.title': 'More highlights in 3.0',
  'system_notice.v3_features.body': 'A few more things worth knowing about this release.',
  'system_notice.v3_features.highlight_dashboard': 'Mobile-first dashboard redesign',
  'system_notice.v3_features.highlight_offline': 'Full offline mode as a PWA',
  'system_notice.v3_features.highlight_search': 'Real-time place search autocomplete',
  'system_notice.v3_features.highlight_import': 'Import places from KMZ/KML files',

  // System notices — MCP OAuth 2.1 upgrade
  'system_notice.v3_mcp.title': 'MCP: OAuth 2.1 upgrade',
  'system_notice.v3_mcp.body': 'The MCP integration has been fully overhauled. OAuth 2.1 is now the recommended auth method. Legacy static tokens (trek_\u2026) are deprecated and will be removed in a future release.',
  'system_notice.v3_mcp.highlight_oauth':      'OAuth 2.1 recommended (mcp-remote)',
  'system_notice.v3_mcp.highlight_scopes':     '24 fine-grained permission scopes',
  'system_notice.v3_mcp.highlight_deprecated': 'Static trek_ tokens deprecated',
  'system_notice.v3_mcp.highlight_tools':      'Expanded toolset & prompts',

  // System notices — personal thank you
  'system_notice.v3_thankyou.title': 'A personal note from me',
  'system_notice.v3_thankyou.body': 'Before you go — I want to take a moment.\n\nTREK started as a side project I built for my own trips. I never imagined it would grow into something that 4,000 of you now trust to plan your adventures. Every star, every issue, every feature request — I read them all, and they keep me going through late nights between a full-time job and university.\n\nI want you to know: TREK will always be open source, always self-hosted, always yours. No tracking, no subscriptions, no strings attached. Just a tool built by someone who loves traveling as much as you do.\n\nSpecial thanks to [jubnl](https://github.com/jubnl) — you have become an incredible collaborator. So much of what makes 3.0 great carries your fingerprints. Thank you for believing in this project when it was still rough around the edges.\n\nAnd to every single one of you who filed a bug, translated a string, shared TREK with a friend, or simply used it to plan a trip — **thank you**. You are the reason this exists.\n\nHere\'s to many more adventures together.\n\n— Maurice\n\n---\n\n[Join the community on Discord](https://discord.gg/7Q6M6jDwzf)\n\nIf TREK makes your travels better, a [small coffee](https://ko-fi.com/mauriceboe) always keeps the lights on.',

  // System notices — 3.0.14
  'system_notice.v3014_whitespace_collision.title': 'Action required: user account conflict',
  'system_notice.v3014_whitespace_collision.body': 'The 3.0.14 upgrade detected one or more username or email collisions caused by leading/trailing whitespace in stored accounts. Affected accounts were renamed automatically. Check the server logs for lines starting with **[migration] WHITESPACE COLLISION** to identify which accounts need review.',

  // System notices — onboarding
  'system_notice.welcome_v1.title': 'Welcome to TREK',
  'system_notice.welcome_v1.body': 'Your all-in-one travel planner. Build itineraries, share trips with friends, and stay organized — online or offline.',
  'system_notice.welcome_v1.cta_label': 'Plan a trip',
  'system_notice.welcome_v1.hero_alt': 'A scenic travel destination with TREK planning UI overlay',
  'system_notice.welcome_v1.highlight_plan': 'Day-by-day itineraries for any trip',
  'system_notice.welcome_v1.highlight_share': 'Collaborate with travel partners',
  'system_notice.welcome_v1.highlight_offline': 'Works offline on mobile',
  'system_notice.dev_test_modal.title': '[Dev] Test notice',
  'system_notice.dev_test_modal.body': 'This is a dev-only test notice.',
  'system_notice.pager.prev': 'Previous notice',
  'system_notice.pager.next': 'Next notice',
  'system_notice.pager.counter': '{current} / {total}',
  'system_notice.pager.goto': 'Go to notice {n}',
  'system_notice.pager.position': 'Notice {current} of {total}',
  'transport.addTransport': 'Add transport',
  'transport.modalTitle.create': 'Add transport',
  'transport.modalTitle.edit': 'Edit transport',
  'transport.title': 'Transports',
  'transport.addManual': 'Manual Transport',
}

export default en
