Files
TREK/shared/src/i18n/en/admin.ts
T

791 lines
52 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { TranslationStrings } from '../types';
const admin: TranslationStrings = {
'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',
'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': 'Where place data comes from. The TREK index needs no key; the two providers below are optional.',
'admin.trekApi.badgeDefault': 'Recommended default',
'admin.googleCaveat.badge': 'Not recommended',
'admin.googleCaveat.body':
'TREK is open source and we are not neutral here. Ratings and photos of ordinary businesses exist at this scale only at Google, and that is what a monopoly is. The field is here because there is no alternative, not because we recommend it. Every lookup then goes to Google.',
'admin.trekApi.tagline':
'TREK\'s own place index. Search without a Google key, without a quota and without anyone counting your lookups.',
'admin.trekApi.factPlaces':
'73.6 million places worldwide',
'admin.trekApi.factNoKey':
'No key, no quota',
'admin.trekApi.factOffline':
'Country packages work offline',
'admin.trekApi.factPrivacy':
'Searches are never logged',
'admin.trekApi.more':
'What is in it',
'admin.trekApi.fieldPhone':
'Phone',
'admin.trekApi.fieldStableId':
'Stable id',
'admin.trekApi.includedNote':
'Descriptions come from the place\'s own website; opening hours from OpenStreetMap where they are tagged.',
'admin.trekApi.notRatings':
'Ratings',
'admin.trekApi.notPhotos':
'Photos of ordinary businesses',
'admin.trekApi.notIncludedNote':
'No open dataset has either, at any price. A Google key stays the only way to those two.',
'admin.trekApi.sourcesLabel':
'Sources',
'admin.trekApi.sourcesNote':
'Every field in a response says which of these it came from.',
'admin.trekApi.included':
'Included',
'admin.trekApi.notIncluded':
'Not included',
'admin.mapsKey': 'Google Maps API Key',
'admin.mapsKeyHint': 'Required for place search. Get at console.cloud.google.com',
'admin.mapsKeyHintLong':
'Without a Google API key the recommended TREK API is used. With one, photos, ratings and opening hours can be loaded on top. Create a key at console.cloud.google.com.',
'admin.recommended': 'Recommended',
'admin.weatherKey': 'OpenWeatherMap API Key',
'admin.weatherKeyHint': 'For weather data. Free at openweathermap.org',
'admin.unsplashKey': 'Unsplash API Key',
'admin.unsplashKeyHint': 'For image search. Free at unsplash.com/developers',
'admin.amapKey': 'Amap (高德地图) API Key',
'admin.amapKeyHint':
'For place search inside mainland China, where Google is unreachable and OpenStreetMap coverage is thin. Needs a "Web 服务" (web service) key, not a JS API key. Get one at console.amap.com.',
'admin.placesProvider.title': 'Place search provider',
'admin.placesProvider.subtitle': "TREK's own index and OpenStreetMap answer every search. This picks who else is asked when they find nothing: Automatic prefers Google where a key exists, then Amap.",
'admin.placesProvider.auto': 'Automatic',
'admin.placesProvider.google': 'Google Places',
'admin.placesProvider.amap': 'Amap (高德地图)',
'admin.placesProvider.openstreetmap': 'OpenStreetMap',
'admin.placesProvider.missingKey': 'The selected provider has no API key configured, so place search is answered by the TREK index and OpenStreetMap alone.',
'admin.placesProvider.saved': 'Place search provider saved',
'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.',
'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.googleOptions': 'What the key may be used for',
'admin.googleOptionsSummary': '{on} of {total} on',
'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.',
'admin.placesEnrich.title': 'Place Enrichment',
'admin.placesEnrich.subtitle':
'Show pictures and a description while adding a place. Wikipedia and OpenStreetMap are always used; Google is added on top when Place Photos or Place Details are on.',
'admin.placesGoogleOnly.title': 'Search with Google only',
'admin.placesGoogleOnly.subtitle': 'Every search and every suggestion goes to Google Places. Off, TREK\'s own index and OpenStreetMap answer first and Google is only asked when they find nothing.',
'admin.placesGoogleOnly.missingKey': 'Needs a Google Maps API key. Without one, search runs on TREK\'s own index and OpenStreetMap whatever this switch says.',
'admin.transitProvider.title': 'Transit Provider',
'admin.transitProvider.subtitle': 'Which service answers public transit search.',
'admin.transitProvider.transitous': 'Transitous (free)',
'admin.transitProvider.google': 'Google',
'admin.transitProvider.transitousHint': 'Community GTFS feeds. Free and keyless, with the best coverage in Europe.',
'admin.transitProvider.googleHint': 'Uses the Google API key above, for regions Transitous has no data for. Billed per search — Transitous is used while no key is set.',
'admin.transitProvider.noKeyWarning': 'Google is selected, but no Google API key is configured — transit search is still using Transitous. Add a key under API Keys above.',
'admin.transitProvider.personalKeyWarning': 'Only your own Google key is set, so other members\' transit searches still fall back to Transitous. Save the key above as an admin to apply it instance-wide.',
'admin.placeShadow.title': 'Place Search Log',
'admin.placeShadow.subtitle':
'Record which search result was picked, so a different place index can be measured against real searches later. Nothing leaves this instance, and an admin can export or delete the log at any time.',
'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.defaultSettings.mapProvider': 'Map engine',
'admin.defaultSettings.mapProviderHint':
'The default map for everyone on this instance. Each user can still override it in their own settings.',
'admin.defaultSettings.providerLeaflet': 'Standard (free)',
'admin.defaultSettings.providerMapbox': 'Mapbox (3D)',
'admin.defaultSettings.providerMapLibre': 'MapLibre (OpenFreeMap)',
'admin.defaultSettings.mapboxToken': 'Shared Mapbox token',
'admin.defaultSettings.mapboxTokenHint':
'Used for every user who has not entered their own token — so the whole instance gets Mapbox without sharing the key individually. Stored encrypted.',
'admin.defaultSettings.mapboxStyle': 'Map style',
'admin.defaultSettings.mapboxStylePlaceholder': 'Choose a style…',
'admin.defaultSettings.mapbox3d': '3D buildings & terrain',
'admin.defaultSettings.mapboxQuality': 'High-quality mode',
'admin.defaultSettings.cartoKey': 'Shared CARTO key',
'admin.defaultSettings.cartoKeyHint':
'Used for every user who has not entered their own key, so the whole instance gets CARTO tiles without a watermark. Stored encrypted.',
'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.deleteCategoryError': 'Failed to delete category',
'admin.packingTemplates.deleteItemError': 'Failed to delete item',
'admin.packingTemplates.saveError': 'Failed to save',
'admin.tabs.addons': 'Addons',
'admin.tabs.plugins': 'Plugins',
'admin.tabs.storage': 'Storage',
'admin.plugins.rescan': 'Rescan',
'admin.plugins.rescanned': 'Rescanned the plugins folder',
'admin.plugins.upload': 'Upload plugin',
'admin.plugins.dropToUpload': 'Drop a plugin .zip to install',
'admin.plugins.uploaded': 'Plugin “{name}” uploaded — activate it to run',
'admin.plugins.sideloaded': 'Sideloaded',
'admin.plugins.devLinkBadge': 'Dev-Link',
'admin.plugins.devLinkHint': 'Loaded from a local build directory and hot-reloaded against real data — dev only',
'admin.plugins.devLinkTitle': 'Link a local plugin',
'admin.plugins.devLinkPathPlaceholder': '/absolute/path/to/your/plugin',
'admin.plugins.devLinkButton': 'Link',
'admin.plugins.devLinkLinked': 'Linked {id} — activate it to run',
'admin.plugins.sideloadedHint': 'Uploaded manually — not from the registry, unsigned and unreviewed',
'admin.plugins.browse': 'Browse plugins',
'admin.plugins.installed': 'Installed',
'admin.plugins.install': 'Install',
'admin.plugins.registryEmpty': 'No plugins available in the registry yet.',
'admin.plugins.actionError': 'Action failed',
'admin.plugins.activate': 'Activate',
'admin.plugins.activated': 'Plugin activated',
'admin.plugins.deactivate': 'Deactivate',
'admin.plugins.deactivated': 'Plugin deactivated',
'admin.plugins.viewErrors': 'View error log',
'admin.plugins.errorLog': 'Error log',
'admin.plugins.allowedHosts': 'Allowed hosts',
'admin.plugins.allowedHosts.hint':
'This plugin talks to a service only you can name. Add the hosts it may reach — it can reach no others.',
'admin.plugins.allowedHosts.none': 'No hosts added yet.',
'admin.plugins.allowedHosts.unsupported':
'This plugin does not use operator-supplied hosts. Its allowed hosts are fixed in its manifest.',
'admin.plugins.allowedHosts.restartNote': 'Saving restarts the plugin so it picks up the new list.',
'admin.plugins.allowedHosts.add': 'Add allowed host',
'admin.plugins.allowedHosts.count': '{n} allowed host(s)',
'admin.plugins.operatorEgressPill': '+ hosts you add',
'admin.plugins.operatorEgressHint':
'This plugin talks to a service only you can name. After installing, add the hosts it may reach under ⋯ → Allowed hosts. It can reach no others.',
'admin.plugins.noErrors': 'No errors logged.',
'admin.plugins.uninstalled': 'Plugin uninstalled',
'admin.plugins.uninstallTitle': 'Uninstall plugin?',
'admin.plugins.uninstallBody':
'This stops the plugin, removes its code, and deletes all of its data. This cannot be undone.',
'admin.plugins.status.starting': 'Starting…',
'admin.plugins.type.widget': 'Widget',
'admin.plugins.type.page': 'Page',
'admin.plugins.type.integration': 'Integration',
'admin.plugins.type.trip-page': 'Trip page',
'admin.plugins.reviewed': 'Reviewed',
'admin.plugins.unreviewed': 'Not reviewed',
'admin.plugins.updated': 'Plugin updated',
'admin.plugins.updateTo': 'Update → v{version}',
'admin.plugins.enabledToggle': 'Enable plugin',
'plugins.notFound': 'Plugin not found',
'plugins.frameLoadFailed': 'This plugin could not be loaded.',
'admin.plugins.title': 'Plugins',
'admin.plugins.subtitle': 'Install and manage third-party plugins on your instance.',
'admin.plugins.disabledTitle': 'Plugins are disabled',
'admin.plugins.disabledBody':
'The plugin runtime is turned off (TREK_PLUGINS_ENABLED). No plugin can run until an admin enables it in the server configuration.',
'admin.plugins.empty': 'No plugins installed yet.',
'admin.plugins.loadError': 'Could not load plugins.',
'admin.plugins.scaffoldNote':
'Plugin installation and activation are coming in a later update. This panel currently lists installed plugins only.',
'admin.plugins.status.active': 'Active',
'admin.plugins.status.inactive': 'Inactive',
'admin.plugins.status.disabled': 'Disabled',
'admin.plugins.status.error': 'Error',
'admin.plugins.status.incompatible': 'Incompatible',
'admin.plugins.details': 'Details',
'admin.plugins.detailError': 'Could not load plugin details.',
'admin.plugins.permissionsTitle': 'Permissions',
'admin.plugins.noPermissions': 'This plugin requests no special permissions.',
'admin.plugins.egressNote': 'May connect to: {hosts}',
'admin.plugins.setupTitle': 'Setup',
'admin.plugins.noSetup': 'Works out of the box — nothing to configure.',
'admin.plugins.scope.instance': 'Instance-wide',
'admin.plugins.scope.user': 'Per user',
'admin.plugins.fieldRequired': 'Required',
'admin.plugins.sourceRepo': 'Source repository',
'admin.plugins.reportIssue': 'Report an issue',
'admin.plugins.homepage': 'Homepage',
'admin.plugins.requiresTrek': 'Requires TREK {version}+',
'admin.plugins.reviewedOn': 'Reviewed {date}',
'admin.plugins.perm.db:own': 'Store its own data in an isolated database',
'admin.plugins.perm.db:read:trips': 'Read trips the acting user can access',
'admin.plugins.perm.db:read:users': 'Read basic profile info (name, avatar — never credentials)',
'admin.plugins.perm.db:read:costs': 'Read costs (budget items) the acting user can access',
'admin.plugins.perm.db:read:packing': 'Read packing lists of trips the acting user can access',
'admin.plugins.perm.db:write:packing': 'Create, edit and delete packing items on trips the acting user can edit',
'admin.plugins.perm.weather:read': "Read the host's cached weather forecast (by coordinates)",
'admin.plugins.perm.db:read:categories': 'Read the global place-category list',
'admin.plugins.perm.db:read:tags': "Read the acting user's own tags",
'admin.plugins.perm.db:write:tags': "Create, edit and delete the acting user's own tags",
'admin.plugins.perm.db:read:todos': 'Read the to-dos of trips the acting user can access',
'admin.plugins.perm.db:write:todos': 'Create, edit and delete to-dos on trips the acting user can edit',
'admin.plugins.perm.db:write:atlas':
'Mark countries and regions visited and manage the bucket list of the acting user (needs the Atlas addon)',
'admin.plugins.perm.db:write:vacay':
"Toggle vacation days and company holidays on the acting user's active plan (needs the Vacay addon)",
'admin.plugins.perm.db:write:journal':
'Create, edit and delete journal entries, and attach photos to them, on journeys the acting user can edit (needs the Journey addon)',
'admin.plugins.perm.db:write:collections':
"Create and edit collections and save places to them, with the acting user's collection role (needs the Collections addon)",
'admin.plugins.perm.db:write:files':
'Attach files to trips the acting user can edit (10MB cap, blocked extensions refused) and manage their links',
'admin.plugins.perm.db:write:collab':
'Post notes, polls and chat messages on trips the acting user can edit (needs the Collab addon)',
'admin.plugins.perm.db:write:members':
"Add users to trips — grants trip access; gated by the acting user's member-manage right",
'admin.plugins.perm.notify:send':
'Send a notification (bell inbox + email/ntfy) to the acting user or a trip they belong to — never an arbitrary recipient',
'admin.plugins.perm.ai:invoke':
"Run the admin-configured AI provider (text completion + document extraction) on the acting user's behalf — the plugin never holds a key",
'admin.plugins.perm.oauth:client':
'Connect to a third-party service on your behalf via host-brokered OAuth (the host holds the tokens, the plugin never sees them)',
'admin.plugins.perm.db:read:files': 'Read files of trips the acting user can access',
'admin.plugins.perm.db:read:journal': 'Read the travel journals of the acting user (needs the Journey addon)',
'admin.plugins.perm.db:read:atlas':
'Read the visited countries and regions of the acting user (needs the Atlas addon)',
'admin.plugins.perm.db:read:vacay': 'Read the vacation plan of the acting user (needs the Vacay addon)',
'admin.plugins.perm.db:read:daynotes': 'Read the day notes of trips the acting user can access',
'admin.plugins.perm.db:read:collections':
'Read the saved-place collections of the acting user (needs the Collections addon)',
'admin.plugins.perm.db:write:costs': 'Create costs (budget items) on trips the acting user can edit',
'admin.plugins.perm.db:write:places': 'Add, edit and remove places on trips the acting user can edit',
'admin.plugins.perm.db:write:days': 'Add, edit and remove days on trips the acting user can edit',
'admin.plugins.perm.db:write:itinerary': 'Assign and remove places on days of trips the acting user can edit',
'admin.plugins.perm.db:write:trips': 'Edit trip details (title, dates, currency…) on trips the acting user can edit',
'admin.plugins.perm.db:write:reservations':
'Create, edit and delete bookings (reservations) on trips the acting user can edit',
'admin.plugins.perm.db:write:accommodations':
'Create, edit and delete accommodations (lodging blocks) on trips the acting user can edit',
'admin.plugins.perm.db:write:daynotes': 'Create, edit and delete day notes on trips the acting user can edit',
'admin.plugins.perm.db:meta': 'Attach its own private data to trips, places and days the acting user can access',
'admin.plugins.perm.ws:broadcast:trip': 'Send real-time updates to trip members',
'admin.plugins.perm.ws:broadcast:user': 'Send real-time updates to individual users',
'admin.plugins.perm.hook:photo-provider': 'Provide photos to Memories',
'admin.plugins.perm.hook:calendar-source': 'Provide events to the calendar',
'admin.plugins.perm.hook:place-detail-provider': 'Contribute extra details (reviews, ratings, links) to a place',
'admin.plugins.perm.hook:search-provider': "Answer place searches from its own index, beside TREK's own results",
'admin.plugins.perm.hook:trip-warning-provider': 'Raise validation warnings on a trip (shown in the planner)',
'admin.plugins.perm.hook:table-contributor': 'Add columns and actions to trip views (reservations, places, days)',
'admin.plugins.perm.hook:map-marker-provider': 'Add markers to the trip map (e.g. show bookings or POIs)',
'admin.plugins.perm.hook:map-layer-provider': 'Draw routes, corridors and zones on the trip map',
'admin.plugins.perm.hook:route-provider':
'Offer routing profiles the planner can route days with (e.g. EV routing with charging stops)',
'admin.plugins.perm.hook:day-schedule-provider':
'Attach time entries to the day plan (charging stops, security buffers)',
'admin.plugins.perm.hook:day-tint-provider':
'Colour-code days in the day plan (e.g. which leg of the trip a day belongs to)',
'admin.plugins.cap.mcpTools': 'Publishes AI tools',
'admin.plugins.mcpToolsTitle': 'AI tools it publishes',
'admin.plugins.mcpToolsHint': 'An assistant can run these on a user’s behalf. Each one acts with the access granted above.',
'admin.plugins.perm.mcp:tools':
'Publish tools that an AI assistant can run on your behalf (it acts with the access you grant the plugin here, not with the assistant’s own)',
'admin.plugins.perm.geolocation:read':
"Ask for your live position while one of its views is open (TREK reads it under this site's location permission, not the plugin's own)",
'admin.plugins.perm.hook:pdf-section-provider': 'Append text sections to the trip PDF export',
'admin.plugins.perm.hook:atlas-layer-provider':
'Highlight countries on the Atlas world map (e.g. wishlists or travel advisories)',
'admin.plugins.perm.hook:journal-entry-provider': 'Contribute extra rows (links, stats) to journal entries',
'admin.plugins.perm.hook:trip-card-provider': 'Add small badges (status, counts) to your dashboard trip cards',
'admin.plugins.perm.hook:notification-channel': 'Deliver your notifications over an additional channel',
'admin.plugins.perm.hook:user-data':
'Erase or export the data it stores about a user (GDPR account deletion & data requests)',
'admin.plugins.perm.events:subscribe': 'React to core activity events (event name + trip only, never the content)',
'admin.plugins.perm.jobs:run':
'Run its declared background jobs on a schedule (no user context — cannot read user data)',
'admin.plugins.perm.http:outbound': 'Make outbound requests to its declared hosts',
'admin.plugins.perm.db:read:collab':
'Read notes, polls and chat messages of trips the acting user can access (needs the Collab addon)',
'admin.plugins.perm.db:read:files:content': 'Read the byte content of files on trips the acting user can access',
'admin.plugins.perm.db:create:trips': 'Create new trips owned by the acting user',
'admin.plugins.perm.rates:read': "Read the host's cached currency exchange rates",
'admin.plugins.updateConsentTitle': 'This update needs new permissions',
'admin.plugins.updateConsentBody':
"{name} v{version} is asking for rights you haven't granted yet. The new version is installed but stays off until you approve it.",
'admin.plugins.updateNewPermissions': 'Newly requested permissions',
'admin.plugins.updateNewEgress': 'New outbound connections',
'admin.plugins.updateApprove': 'Approve & turn on',
'admin.plugins.updateLater': 'Keep off for now',
'admin.plugins.updateKeptOff': 'Update installed — left off until you approve the new permissions',
'admin.plugins.reviewedMeaning':
'"Reviewed" means a TREK maintainer scanned this plugin for malware on each version — not for quality or whether it works. It is not a guarantee that a plugin is harmless.',
'admin.plugins.security.title': 'How plugins are contained — and the limits',
'admin.plugins.security.isolationTitle': 'Every plugin runs boxed in',
'admin.plugins.security.isolationBody':
"A plugin runs as its own locked-down process that can only read its own files. It cannot read your database, your login secret or your encryption key, cannot start other programs, and cannot write files anywhere. Its interface runs in a sealed browser frame that can't read your session cookie or touch the TREK page around it.",
'admin.plugins.security.permsTitle': 'What the permissions mean',
'admin.plugins.security.permsBody':
"The permissions shown before you install are a hard limit that TREK enforces while the plugin runs — it literally cannot do anything that isn't on the list. But they tell you what a plugin can do, not what it actually does. A plugin allowed to read your trips and reach a server can send your trips to that server, so read the permissions and the outbound hosts, not just the description.",
'admin.plugins.security.limitsTitle': "What we can't promise",
'admin.plugins.security.limitsBody':
"The isolation is a strong software boundary, not an absolute one. A plugin acts with exactly the rights you approve, so within those rights it can behave differently than its description suggests, and it can send data it legitimately holds to the hosts it declared. TREK does not read or judge what a plugin's code actually does.",
'admin.plugins.security.worstTitle': 'The worst case',
'admin.plugins.security.worstBody':
"A hostile plugin you turn on can misuse the data and connections you granted it — for example, leak the trips it is allowed to read. It cannot steal passwords, forge an admin login, run commands on your server, or reach data you didn't grant. The damage stays inside what you approved, and turning the plugin off stops it.",
'admin.plugins.security.reviewedTitle': 'What "Reviewed" means',
'admin.plugins.security.reviewedBody':
'A reviewed plugin was manually scanned for malware by a TREK maintainer on each version — checked for hostile code, not for whether it works well. It is not a promise that the plugin is harmless.',
'admin.plugins.security.signedTitle': 'What "Signed" means',
'admin.plugins.security.signedBody':
'The checksum TREK verifies on every install proves the files are exactly what the registry vouches for. A signature proves something different: that they came from the author, signed with a key only they hold. A signed plugin has both. An unsigned one is not unsafe — it simply carries one guarantee fewer, and most plugins in the registry are unsigned today.',
'admin.plugins.signed': 'Signed',
'admin.plugins.signedHint': "Verified against the author's signing key when it was installed",
'admin.plugins.unsigned': 'Unsigned',
'admin.plugins.unsignedHint':
'The files match what the registry vouches for, but nothing ties them to the author. One guarantee fewer — not unsafe.',
'admin.plugins.updateBlocked': 'Update blocked — {reason}',
'admin.plugins.reviewBlock': 'Review',
'admin.plugins.retrusted': 'New signing key trusted — the plugin is updated',
'admin.plugins.sig.title': "{name}'s signature could not be verified",
'admin.plugins.sig.keyChangedBody':
"The author's signing key is not the one this plugin was installed with. Authors do rotate keys — but an attacker who took over the plugin would look exactly like this.",
'admin.plugins.sig.invalidBody':
"The files do not match the author's signature. They are not what the author signed — either they were corrupted, or they were tampered with. This cannot be overridden.",
'admin.plugins.sig.missingBody':
'This plugin was signed when you installed it, but the new version ships no signature. TREK will not quietly accept the downgrade. This cannot be overridden.',
'admin.plugins.sig.incompleteBody':
'The registry entry is half-signed: it declares an author key but the version carries no signature (or the reverse). That is a mistake on the plugin side. This cannot be overridden.',
'admin.plugins.sig.pinnedKey': 'Key it was installed with',
'admin.plugins.sig.newKey': 'Key it is offering now',
'admin.plugins.sig.confirmOutOfBand':
'TREK cannot tell a legitimate key rotation apart from a takeover — both look identical from here. Confirm the new key with the author through a channel you already trust before you accept it. Once you do, the plugin is updated and the new key is remembered.',
'admin.plugins.sig.retrustConfirm': 'Trust the new key & update',
'admin.plugins.sig.cancel': 'Do not trust it',
'admin.plugins.sig.consentUnsigned':
'Nothing ties this version to its author — the files match the registry, but they carry no author signature.',
'admin.plugins.security.trustTitle': 'The bottom line',
'admin.plugins.security.trustBody':
'Installing a plugin is like installing any third-party app: only add code from authors you trust, and when in doubt, inspect it yourself first. TREK takes no responsibility for third-party plugins.',
'admin.plugins.runtimeOn': 'Runtime on',
'admin.plugins.tabDiscover': 'Discover',
'admin.plugins.searchPlaceholder': 'Search plugins…',
'admin.plugins.filterType': 'Type',
'admin.plugins.filterStatus': 'Status',
'admin.plugins.sortBy': 'Sort',
'admin.plugins.allTypes': 'All types',
'admin.plugins.allStatuses': 'All',
'admin.plugins.stateOff': 'Off',
'admin.plugins.filterUpdate': 'Update available',
'admin.plugins.sortName': 'Name',
'admin.plugins.sortRecent': 'Recently updated',
'admin.plugins.sortUpdates': 'Updates first',
'admin.plugins.sortDownloads': 'Most downloads',
'admin.plugins.updatesAvailable': '{count} updates available for your plugins.',
'admin.plugins.newerNeedsTrek': 'v{version} available — needs TREK {range}',
'admin.plugins.updateAll': 'Update all',
'admin.plugins.versionsTitle': 'Versions',
'admin.plugins.versionPickerTitle': 'Change version — {name}',
'admin.plugins.versionSwitch': 'Switch to {version}',
'admin.plugins.versionNeedsTrek': 'needs TREK {range}',
'admin.plugins.changeVersion': 'Change version…',
'admin.plugins.noVersions': 'No published versions found in the registry.',
'admin.plugins.downgradeTitle': 'Roll back this plugin?',
'admin.plugins.downgradeBody': 'Switching from v{from} to v{to}: data written by the newer version stays in place, and the older version may not understand it.',
'admin.plugins.downgradeConfirm': 'Roll back',
'admin.plugins.updatesHeld': 'Updates paused at v{version}',
'admin.plugins.resumeUpdates': 'Resume updates',
'admin.plugins.updatesResumed': 'Updates resumed',
'admin.plugins.noMatchInstalled': 'No installed plugins match your search.',
'admin.plugins.noMatchRegistry': 'No plugins in the registry match your search.',
'admin.plugins.restart': 'Restart',
'admin.plugins.restarted': 'Plugin restarted',
'admin.plugins.instanceSettings': 'Instance settings',
'admin.plugins.settingsSaved': 'Settings saved',
'admin.plugins.settingsSavedRestarted': 'Settings saved — plugin restarted',
'admin.plugins.actions': 'Actions',
'admin.plugins.actions.confirm': 'Run this action?',
'admin.plugins.actions.inactive': 'Activate the plugin to run its actions',
'admin.plugins.requiredMissing': '"{field}" is required',
'admin.plugins.cap.readsTrips': 'Reads your trips',
'admin.plugins.cap.readsUsers': 'Reads basic profiles',
'admin.plugins.cap.readsCosts': 'Reads your costs',
'admin.plugins.cap.readsPacking': 'Reads packing lists',
'admin.plugins.cap.readsFiles': 'Reads trip files',
'admin.plugins.cap.writesCosts': 'Adds costs',
'admin.plugins.cap.writesPlaces': 'Edits places',
'admin.plugins.cap.writesDays': 'Edits days',
'admin.plugins.cap.writesItinerary': 'Edits itinerary',
'admin.plugins.cap.writesTrips': 'Edits trips',
'admin.plugins.cap.metadata': 'Adds metadata',
'admin.plugins.cap.widget': 'Dashboard widget',
'admin.plugins.cap.heroWidget': 'Boarding-pass widget',
'admin.plugins.cap.placeSlot': 'Place detail',
'admin.plugins.cap.daySlot': 'Day detail',
'admin.plugins.cap.reservationSlot': 'Reservation detail',
'admin.plugins.cap.replacesTabs': 'Replaces planner tabs',
'admin.plugins.cap.realtime': 'Real-time updates',
'admin.plugins.cap.notificationChannel': 'Notification channel',
'admin.plugins.cap.photos': 'Provides photos',
'admin.plugins.cap.calendar': 'Provides calendar events',
'admin.plugins.cap.placeDetails': 'Enriches places',
'admin.plugins.cap.search': 'Answers searches',
'admin.plugins.cap.warnings': 'Flags issues',
'admin.plugins.cap.mapLayers': 'Draws on the map',
'admin.plugins.cap.routing': 'Offers routing',
'admin.plugins.cap.daySchedule': 'Adds plan times',
'admin.plugins.cap.dayTint': 'Tints days',
'admin.plugins.cap.geolocation': 'Reads your position',
'admin.plugins.cap.events': 'Reacts to activity',
'admin.plugins.cap.requiresAddon': 'Requires {addon}',
'admin.plugins.cap.dependsOn': 'Needs {id} {version}',
'admin.plugins.dep.addonDisabledToast': 'Enable the required addon(s) first: {addons}',
'admin.plugins.dep.autoEnabled': 'Enabled required plugin(s) first: {plugins}',
'admin.plugins.dep.downloaded': 'Downloaded {id}',
'admin.plugins.dep.resolveTitle': 'Missing dependencies',
'admin.plugins.dep.resolveBody': '“{name}” needs these plugins installed before it can be enabled.',
'admin.plugins.dep.requires': 'Requires {version}',
'admin.plugins.dep.mismatch': 'Needs {wanted} — {installed} is installed',
'admin.plugins.dep.download': 'Download',
'admin.plugins.dep.update': 'Update',
'admin.plugins.dep.resolveHint': 'Downloads the latest compatible version, including its own dependencies.',
'admin.plugins.dep.trekIncompatible': 'Needs TREK {range} — this server runs {host}',
'admin.plugins.dep.trekUnknown': 'Does not say which TREK versions it supports',
'admin.plugins.installCompatible': 'Install {version}',
'admin.plugins.installAnyway': 'Install anyway',
'admin.plugins.rangeBypass.pill': 'Version checks off',
'admin.plugins.rangeBypass.pillHint':
'TREK_PLUGINS_IGNORE_TREK_RANGE is set — plugins may install and run outside the TREK versions their authors declared',
'admin.plugins.rangeBypass.title': 'Outside its supported TREK versions',
'admin.plugins.rangeBypass.noticeTitle': 'Installed outside its supported TREK versions',
'admin.plugins.rangeBypass.body':
'“{name}” declares support for TREK {range}, and this server runs {host}. TREK lets it through only because TREK_PLUGINS_IGNORE_TREK_RANGE is set. Its author has not updated the plugin’s version range for this TREK, so there is no guarantee it works — and in rare cases a mismatched plugin can corrupt TREK data. Continue only if you accept that risk.',
'admin.plugins.rangeBypass.bodyUnknown':
'“{name}” does not declare which TREK versions it supports; this server runs {host}. TREK lets it through only because TREK_PLUGINS_IGNORE_TREK_RANGE is set. Nothing says its author tested it on this TREK, so there is no guarantee it works — and in rare cases a mismatched plugin can corrupt TREK data. Continue only if you accept that risk.',
'admin.plugins.dep.trekBypassed': 'Outside its TREK range ({range}) — version checks off',
'admin.plugins.dep.trekBypassedUnknown': 'Declares no TREK range — version checks off',
'admin.plugins.incompatible': 'Incompatible',
'admin.plugins.accessTitle': 'What it can access',
'admin.plugins.connectsTitle': 'Connects to',
'admin.plugins.detailsTitle': 'Details',
'admin.plugins.noAccess': 'Needs no special access.',
'admin.plugins.metaVersion': 'Version',
'admin.plugins.metaSize': 'Size',
'admin.plugins.metaRequires': 'Requires',
'admin.plugins.metaReviewed': 'Reviewed on',
'admin.plugins.downloads': 'Downloads',
'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': 'Costs',
'admin.addons.catalog.budget.description': 'Track trip expenses and split them between travellers',
'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': 'Notes, polls, chat and suggestions for planning together',
'admin.addons.catalog.roadtrip.name': 'Road trip',
'admin.addons.catalog.roadtrip.description': 'Plan drives with stops along the route, driving times, and arrival times that update themselves',
'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.catalog.naver_list_import.name': 'Naver List Import',
'admin.addons.catalog.naver_list_import.description': 'Import places from a shared Naver Maps list',
'admin.addons.catalog.airtrail.name': 'AirTrail',
'admin.addons.catalog.airtrail.description': 'Sync flights from your AirTrail instance',
'admin.addons.catalog.dawarich.name': 'Dawarich',
'admin.addons.catalog.dawarich.description':
'Read visits and recorded routes from a Dawarich instance each reader connects themselves',
'admin.addons.catalog.llm_parsing.name': 'AI Parsing',
'admin.addons.catalog.llm_parsing.description': 'Reads bookings the built-in parser cannot, using an AI model you choose',
'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.group.count': '{enabled} of {total} enabled',
'admin.addons.noAddons': 'No addons available',
'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.',
'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.nonDockerText':
'This TREK instance is not running in Docker. To update to {version}, re-run the install or update method you used — for example, on Proxmox Community Scripts run the update from the LXC console:',
'admin.update.wikiLink': 'Open the update guide',
'admin.update.reloadHint': 'Please reload the page in a few seconds.',
'admin.tabs.permissions': 'Permissions',
'admin.addons.catalog.journey.name': 'Journey',
'admin.addons.catalog.journey.description':
'Trip tracking & travel journal with check-ins, photos, and daily stories',
'admin.addons.catalog.collections.name': 'Collections',
'admin.addons.catalog.collections.description': 'Collect places from any trip into named lists and reuse them',
'admin.passkey.title': 'Passkey login',
'admin.passkey.cardHint': 'Let users sign in with passkeys (WebAuthn). Off by default.',
'admin.passkey.login': 'Enable passkey login',
'admin.passkey.loginHint': 'Show a "Sign in with a passkey" option and let users enrol passkeys in their settings.',
'admin.passkey.notConfigured':
'No WebAuthn domain resolves for this deployment yet. Set APP_URL or the Relying Party ID below — passkeys stay hidden until then.',
'admin.passkey.rpId': 'Relying Party ID (domain)',
'admin.passkey.rpIdHint':
'The bare domain passkeys are bound to, e.g. trek.example.org. Leave empty to derive it from APP_URL. Changing it later invalidates existing passkeys.',
'admin.passkey.origins': 'Allowed origins',
'admin.passkey.originsHint':
'Comma-separated full origins, e.g. https://trek.example.org. Leave empty to use APP_URL.',
'admin.passkey.reset': 'Reset passkeys',
'admin.passkey.resetHint':
"Remove all of this user's passkeys (e.g. on a lost device). They can still sign in with their password.",
'admin.passkey.resetConfirm': 'Remove all passkeys for {name}?',
'admin.passkey.resetDone': 'Removed {count} passkey(s)',
'admin.group.users': 'Users',
'admin.group.config': 'Configuration',
'admin.group.integration': 'Integrations',
'admin.group.maintenance': 'Maintenance',
'admin.invite.tripLabel': 'Add to trip (optional)',
'admin.invite.tripNone': 'No trip',
'admin.invite.tripHint': 'The new user is automatically added to this trip when they register via the link.',
'admin.invite.boundTo': 'adds to {trip}',
'admin.placesUsageTitle': 'What the key is used for',
'admin.mapsKeyHintShort': 'Adds photos, ratings and opening hours. Every lookup then goes to Google.',
'admin.amapKeyHintShort': 'For place search inside mainland China. Needs a web service key, not a JS API key.',
'admin.collab.links.subtitle': 'Shared links and bookmarks',
};
export default admin;