mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
647 lines
40 KiB
TypeScript
647 lines
40 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const settings: TranslationStrings = {
|
||
'settings.title': 'Settings',
|
||
'settings.subtitle': 'Configure your personal settings',
|
||
'settings.tabs.display': 'General',
|
||
'settings.tabs.map': 'Map',
|
||
'settings.tabs.notifications': 'Notifications',
|
||
'settings.tabs.integrations': 'Integrations',
|
||
'settings.plugins.oauth.connected': 'Connected',
|
||
'settings.plugins.oauth.notConnected': 'Not connected',
|
||
'settings.plugins.oauth.connect': 'Connect',
|
||
'settings.plugins.oauth.disconnect': 'Disconnect',
|
||
'settings.tabs.plugins': 'Plugins',
|
||
'settings.plugins.title': 'Plugin settings',
|
||
'settings.plugins.subtitle': 'Your personal settings for the plugins you use (API keys, preferences).',
|
||
'settings.plugins.empty': 'No plugins are active.',
|
||
'settings.plugins.saved': 'Settings saved',
|
||
'settings.plugins.requiredMissing': '"{field}" is required',
|
||
'settings.pluginActivity.title': 'Plugin activity',
|
||
'settings.pluginActivity.description': 'Every action a plugin took on your behalf, newest first.',
|
||
'settings.pluginActivity.empty': 'No plugin activity yet.',
|
||
'settings.pluginActivity.refresh': 'Refresh',
|
||
'settings.pluginActivity.columns.plugin': 'Plugin',
|
||
'settings.pluginActivity.columns.action': 'Action',
|
||
'settings.pluginActivity.columns.resource': 'Resource',
|
||
'settings.pluginActivity.columns.when': 'When',
|
||
'settings.pluginActivity.columns.status': 'Result',
|
||
'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.routingBase': 'Own routing engine',
|
||
'settings.routingBaseHint':
|
||
'An OSRM instance of your own. Empty uses the public servers, which allow about one request a second — enough for a day, tight for a road trip. Takes effect after a server restart.',
|
||
'settings.valhallaBase': 'Own Valhalla instance',
|
||
'settings.valhallaBaseHint':
|
||
'TREK uses the public FOSSGIS Valhalla by default to avoid toll roads, motorways and ferries. Enter your own Valhalla URL here to use it instead. If only a custom routing instance is configured, the public Valhalla is not used. After entering a custom URL, restart the server and reload the page.',
|
||
'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.mapMapLibreSubtitle': 'OpenFreeMap vector tiles, no token',
|
||
'settings.mapExperimental': 'Experimental',
|
||
'settings.mapMapboxToken': 'Mapbox Access Token',
|
||
'settings.mapMapboxTokenHint': 'Public token (pk.*) from',
|
||
'settings.mapMapboxTokenLink': 'mapbox.com → Access tokens',
|
||
'settings.mapCartoKey': 'CARTO API key',
|
||
'settings.mapCartoKeyHint': 'CARTO basemaps show a watermark without a key. Free, no account needed, from',
|
||
'settings.mapCartoKeyLink': 'carto.com basemap API key',
|
||
'settings.mapCartoKeyMissing':
|
||
'This template is a CARTO basemap. Without a key CARTO stamps "API KEY REQUIRED" onto every tile. Until you enter one, TREK shows the default basemap instead.',
|
||
'settings.mapStyle': 'Map Style',
|
||
'settings.mapStylePlaceholder': 'Select a Mapbox style',
|
||
'settings.mapStyleHint': 'Preset or your own mapbox://styles/USER/ID URL',
|
||
'settings.mapOpenFreeMapStylePlaceholder': 'Select an OpenFreeMap style',
|
||
'settings.mapOpenFreeMapStyleHint': 'Preset or OpenFreeMap style URL. OpenFreeMap styles work without a token.',
|
||
'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.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.distance': 'Distance Unit',
|
||
'settings.timeFormat': 'Time Format',
|
||
'settings.weekStart': 'Week starts on',
|
||
'settings.weekStartHint': 'First day of the week in every date picker. Vacay has its own setting.',
|
||
'settings.preferredNavApp': 'Open places in',
|
||
'settings.preferredNavAppAsk': 'Ask every time',
|
||
'settings.preferredNavAppHint':
|
||
'With an app picked, the navigate button opens it straight away instead of offering every map app.',
|
||
'settings.bookingLabels': 'Booking route labels',
|
||
'settings.bookingLabelsHint': 'Show station / airport names on the map. When off, only the icon is shown.',
|
||
'settings.mapPoiPill': 'Explore places on the map',
|
||
'settings.mapPoiPillHint':
|
||
'Show a category pill on the trip map to find nearby restaurants, hotels and more from OpenStreetMap.',
|
||
'settings.blurBookingCodes': 'Blur Booking Codes',
|
||
'settings.aiAlwaysRetry': 'Always retry booking imports with AI',
|
||
'settings.aiAlwaysRetryHint': 'When a file cannot be read by the standard parser, automatically retry it with AI.',
|
||
'settings.optimizeFromAccommodation': 'Optimize route from accommodation',
|
||
'settings.optimizeFromAccommodationHint':
|
||
'When optimizing a day, start the route at the hotel you wake up in and end it at the one you check into that evening.',
|
||
'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.notifyVacayShare': 'Vacay calendar shares',
|
||
'settings.notifyCollectionInvite': 'Collection invitations',
|
||
'settings.notifySynologySessionCleared': 'Synology session cleared',
|
||
'settings.notifyPluginNotification': 'Plugin notifications',
|
||
'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.notifyReplicaFailure': 'Storage replica failure',
|
||
'settings.notificationPreferences.email': 'Email',
|
||
'settings.notificationPreferences.webhook': 'Webhook',
|
||
'settings.notificationPreferences.inapp': 'In-App',
|
||
'settings.notificationPreferences.notConfigured': 'Not configured yet — set it up in the plugin’s settings',
|
||
'settings.notificationPreferences.lockedByAdmin': 'Turned off for everyone by the admin',
|
||
'settings.plugins.actions': 'Actions',
|
||
'settings.plugins.actions.confirm': 'Run this action?',
|
||
'settings.notificationPreferences.sendTest': 'Send test',
|
||
'settings.notificationPreferences.configure': 'Configure',
|
||
'settings.notificationPreferences.testSuccess': 'Test notification sent.',
|
||
'settings.notificationPreferences.testFailed': 'Test failed.',
|
||
'settings.notificationPreferences.pluginConfigured': 'Configured. Manage credentials on the plugin’s settings page.',
|
||
'settings.notificationPreferences.ntfy': 'Ntfy',
|
||
'settings.notificationPreferences.push': 'Push',
|
||
'settings.webPush.title': 'Push notifications on this device',
|
||
'settings.webPush.hint':
|
||
'Shows TREK notifications on this device even while TREK is closed. Which events arrive follows the Push column.',
|
||
'settings.webPush.enable': 'Turn on for this device',
|
||
'settings.webPush.disable': 'Turn off for this device',
|
||
'settings.webPush.enabled': 'On for this device',
|
||
'settings.webPush.unsupported': 'This browser cannot receive push notifications.',
|
||
'settings.webPush.insecure': 'Push needs TREK to be opened over HTTPS.',
|
||
'settings.webPush.iosInstall': 'On iPhone and iPad, add TREK to the Home Screen first and open it from there.',
|
||
'settings.webPush.denied':
|
||
'Notifications are blocked for TREK in this browser. Allow them in the browser settings, then try again.',
|
||
'settings.webPush.failed': 'Push could not be turned on for this device.',
|
||
'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',
|
||
'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.',
|
||
'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, loopback HTTP, or a private app scheme (myapp://). Matched exactly, except for the port of a loopback URI.',
|
||
'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.oauth.modal.machineClient': 'Machine client (no browser login)',
|
||
'settings.oauth.modal.machineClientHint':
|
||
'Use client_credentials grant — no redirect URIs needed. The token is issued directly via client_id + client_secret and acts as you within the selected scopes.',
|
||
'settings.oauth.modal.machineClientUsage':
|
||
'Get a token: POST /oauth/token with grant_type=client_credentials, client_id, and client_secret. No browser, no refresh token.',
|
||
'settings.oauth.badge.machine': 'machine',
|
||
'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.descriptionManaged':
|
||
'TREK 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.',
|
||
'settings.about.sourceTitle': 'Source code',
|
||
'settings.about.sourceHint': 'TREK is open source, licensed AGPL-3.0',
|
||
'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.passwordCommon': 'This password is too common. Please choose a unique one.',
|
||
'settings.passwordRepetitive': 'Password is too repetitive',
|
||
'settings.passwordRules': 'Password requirements',
|
||
'settings.passwordRule.length': 'At least 8 characters',
|
||
'settings.passwordRule.upper': 'An uppercase letter',
|
||
'settings.passwordRule.lower': 'A lowercase letter',
|
||
'settings.passwordRule.digit': 'A number',
|
||
'settings.passwordRule.special': '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.avatarRemoveError': 'Removal 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 authenticator code or an unused backup code.',
|
||
'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',
|
||
'settings.currency': 'Display currency',
|
||
'settings.currencyHint':
|
||
'Amounts in Costs are shown converted to this currency for display only — the original amounts are unchanged.',
|
||
'settings.currencyTrip': 'Trip currency',
|
||
'settings.placeLanguage': 'Place names',
|
||
'settings.placeLanguageApp': 'Same as the app',
|
||
'settings.placeLanguageHint':
|
||
'The language place search, suggestions and addresses answer in. Where a place has no name in that language, its local name is shown.',
|
||
'settings.passkey.title': 'Passkeys',
|
||
'settings.passkey.description':
|
||
'Sign in faster and phishing-resistant with a passkey — your fingerprint, face, PIN, or a hardware key. Your password stays as a backup.',
|
||
'settings.passkey.notConfigured':
|
||
'Passkeys are enabled but not fully configured on this server yet. Ask your administrator to set the WebAuthn domain.',
|
||
'settings.passkey.add': 'Add a passkey',
|
||
'settings.passkey.addTitle': 'Add a passkey',
|
||
'settings.passkey.passwordPrompt': 'Confirm your current password, then follow your device prompt.',
|
||
'settings.passkey.passwordRequired': 'Your current password is required.',
|
||
'settings.passkey.namePlaceholder': 'Name (optional, e.g. "iPhone")',
|
||
'settings.passkey.addedToast': 'Passkey added',
|
||
'settings.passkey.added': 'Added',
|
||
'settings.passkey.addError': 'Could not add passkey',
|
||
'settings.passkey.cancelled': 'Passkey setup cancelled',
|
||
'settings.passkey.deleted': 'Passkey removed',
|
||
'settings.passkey.deleteConfirm': 'Remove this passkey? Confirm with your password.',
|
||
'settings.passkey.rename': 'Rename',
|
||
'settings.passkey.defaultName': 'Passkey',
|
||
'settings.passkey.synced': 'Synced',
|
||
'settings.passkey.deviceBound': 'This device',
|
||
'settings.passkey.lastUsed': 'Last used',
|
||
'settings.passkey.neverUsed': 'Never used',
|
||
'settings.airtrail.title': 'AirTrail',
|
||
'settings.airtrail.hint':
|
||
'Connect your AirTrail instance to import and sync flights. Create an API key in AirTrail under Settings → Security.',
|
||
'settings.airtrail.url': 'Instance URL',
|
||
'settings.airtrail.apiKey': 'API key',
|
||
'settings.airtrail.apiKeyPlaceholder': 'Bearer API key',
|
||
'settings.airtrail.apiKeyHint': 'Generated in AirTrail under Settings → Security. Stored encrypted.',
|
||
'settings.airtrail.allowInsecureTls': 'Allow self-signed certificates',
|
||
'settings.airtrail.allowInsecureTlsHint': 'Enable only for a trusted instance on your own network.',
|
||
'settings.airtrail.writeBack': 'Write changes back to AirTrail',
|
||
'settings.airtrail.writeBackHint':
|
||
'Off by default: AirTrail is the source of truth and TREK only reads from it. Turn on to push edits made in TREK back to AirTrail.',
|
||
'settings.airtrail.connected': 'Connected',
|
||
'settings.airtrail.notConnected': 'Not connected',
|
||
'settings.airtrail.toast.saved': 'AirTrail connection saved',
|
||
'settings.airtrail.toast.saveError': 'Could not save the connection',
|
||
'settings.airtrail.test.button': 'Test connection',
|
||
'settings.airtrail.test.success': 'Connected. {count} flights found',
|
||
'settings.airtrail.test.success.one': 'Connected. {count} flight found',
|
||
'settings.airtrail.test.failed': 'Connection failed',
|
||
'settings.aiParsing.title': 'AI parsing',
|
||
'settings.aiParsing.hint':
|
||
'Choose the AI model used to extract bookings from uploaded files. This applies only when your administrator has not configured a model for the whole instance.',
|
||
'settings.aiParsing.provider': 'Provider',
|
||
'settings.aiParsing.providerLocal': 'Local (Ollama)',
|
||
'settings.aiParsing.providerOpenai': 'OpenAI',
|
||
'settings.aiParsing.providerAnthropic': 'Anthropic',
|
||
'settings.aiParsing.localAdminOnly':
|
||
'A local (Ollama) endpoint is set up once for the whole instance in the admin settings. You can still use your own OpenAI or Anthropic key here.',
|
||
'settings.aiParsing.model': 'Model',
|
||
'settings.aiParsing.baseUrl': 'Base URL',
|
||
'settings.aiParsing.baseUrlHint': 'Where the model runs — a local Ollama server or an OpenAI-compatible endpoint.',
|
||
'settings.aiParsing.apiKey': 'API key',
|
||
'settings.aiParsing.apiKeyHint': 'Stored encrypted. Leave blank to keep the current key.',
|
||
'settings.aiParsing.multimodal': 'Model reads images',
|
||
'settings.aiParsing.multimodalHint': 'Turn on for a model that reads images, so a photo can be imported or scanned.',
|
||
'settings.aiParsing.toast.saved': 'AI settings saved',
|
||
'settings.aiParsing.toast.saveError': 'Could not save AI settings',
|
||
'settings.tabs.appearance': 'Appearance',
|
||
'settings.appearance.theme': 'Theme',
|
||
'settings.appearance.scheme': 'Color scheme',
|
||
'settings.appearance.scheme.default': 'Default',
|
||
'settings.appearance.scheme.highContrast': 'High contrast',
|
||
'settings.appearance.scheme.indigo': 'Indigo',
|
||
'settings.appearance.scheme.teal': 'Teal',
|
||
'settings.appearance.scheme.rose': 'Rose',
|
||
'settings.appearance.scheme.amber': 'Amber',
|
||
'settings.appearance.scheme.violet': 'Violet',
|
||
'settings.appearance.scheme.custom': 'Custom',
|
||
'settings.appearance.customAccent': 'Custom accent',
|
||
'settings.appearance.contrastOk': 'Good contrast',
|
||
'settings.appearance.contrastLow': 'Low contrast',
|
||
'settings.appearance.readability': 'Readability',
|
||
'settings.appearance.transparency': 'Transparency',
|
||
'settings.appearance.transparencyHint':
|
||
'Glassy translucent surfaces. Turn off for solid, higher-contrast backgrounds.',
|
||
'settings.appearance.reduceMotion': 'Reduce motion',
|
||
'settings.appearance.reduceMotionHint': 'Minimize animations and transitions.',
|
||
'settings.appearance.density': 'Density',
|
||
'settings.appearance.comfortable': 'Comfortable',
|
||
'settings.appearance.compact': 'Compact',
|
||
'settings.appearance.textSize': 'Text size',
|
||
'settings.appearance.advancedTextSizes': 'Advanced text sizes',
|
||
'settings.appearance.hideAdvanced': 'Hide advanced',
|
||
'settings.appearance.tier.title': 'Titles',
|
||
'settings.appearance.tier.subtitle': 'Subtitles',
|
||
'settings.appearance.tier.body': 'Body',
|
||
'settings.appearance.tier.caption': 'Captions',
|
||
'settings.appearance.dashboardWidgets': 'Dashboard widgets',
|
||
'settings.appearance.dashboardWidgetsHint': 'Show or hide dashboard widgets independently on desktop and mobile.',
|
||
'settings.appearance.desktop': 'Desktop',
|
||
'settings.appearance.mobile': 'Mobile',
|
||
'settings.appearance.widget.sidebar': 'Right sidebar',
|
||
'settings.appearance.widget.currency': 'Currency',
|
||
'settings.appearance.widget.collections': 'Collections',
|
||
'settings.appearance.widget.timezones': 'Timezones',
|
||
'settings.appearance.widget.upcomingReservations': 'Upcoming reservations',
|
||
'settings.appearance.widget.atlas': 'Atlas / countries',
|
||
'settings.appearance.widget.tripsTotal': 'Trips total',
|
||
'settings.appearance.widget.daysTraveled': 'Days traveled',
|
||
'settings.appearance.widget.distanceFlown': 'Distance flown',
|
||
'settings.appearance.reset': 'Reset to defaults',
|
||
'settings.appearance.group.belowHero': 'Below the hero',
|
||
'settings.appearance.group.bottomOfPage': 'Bottom of page',
|
||
'settings.appearance.sidebarHint': 'The whole right column. Turn off and the dashboard centers.',
|
||
'settings.appearance.densityHint':
|
||
'Compact tightens spacing and padding for a denser layout that fits more on screen.',
|
||
'settings.appearance.textSizeAll': 'Everything',
|
||
'settings.appearance.perSize': 'Adjust each size separately',
|
||
'settings.appearance.size.large': 'Large',
|
||
'settings.appearance.size.medium': 'Medium',
|
||
'settings.appearance.size.normal': 'Normal',
|
||
'settings.appearance.size.small': 'Small',
|
||
'settings.appearance.preview.large': 'Large heading',
|
||
'settings.appearance.preview.medium': 'Medium subtitle',
|
||
'settings.appearance.preview.normal': 'Normal body text',
|
||
'settings.appearance.preview.small': 'Small caption / address',
|
||
'settings.appearance.example.large': 'Headings, big numbers',
|
||
'settings.appearance.example.medium': 'Sub-headings',
|
||
'settings.appearance.example.normal': 'Place names, descriptions',
|
||
'settings.appearance.example.small': 'Addresses, labels',
|
||
'settings.appearance.experimental': 'Experimental',
|
||
'settings.appearance.mobileNav': 'Bottom navbar',
|
||
'settings.appearance.mobileNav.hint':
|
||
'Choose which items appear in the bar and which sit under “More”. Dashboard always stays first.',
|
||
'settings.appearance.mobileNav.inBar': 'In the bar',
|
||
'settings.appearance.mobileNav.underMore': 'Under “More”',
|
||
'settings.appearance.mobileNav.moreEmpty': 'Nothing here yet — everything fits in the bar.',
|
||
'settings.appearance.mobileNav.pinned': 'Pinned',
|
||
'settings.appearance.mobileNav.toMore': 'Move under “More”',
|
||
'settings.appearance.mobileNav.toBar': 'Move into the bar',
|
||
'settings.appearance.dashOrder': 'Dashboard order',
|
||
'settings.appearance.dashOrder.hint':
|
||
'Reorder how the trip list and widgets stack on your phone dashboard. The featured trip always stays on top.',
|
||
'settings.appearance.dashOrder.trips': 'Trips',
|
||
'settings.appearance.dashOrder.hidden': 'Hidden',
|
||
'settings.general.languageRegion': 'Language & region',
|
||
'settings.general.travelMap': 'Travel & map',
|
||
'settings.general.startup': 'Startup',
|
||
'settings.dayDateFirst': 'Date first in day headings',
|
||
'settings.compactUnplanned': 'Compact markers for unplanned places',
|
||
'settings.compactUnplannedHint':
|
||
'Places not planned into any day show as small markers without a photo, so the planned stops stand out.',
|
||
'settings.dayDateFirstHint':
|
||
'Lead each day with its calendar date and show "Day 1" or the day\'s own title next to it.',
|
||
'settings.startPage': 'Start page',
|
||
'settings.startPageDashboard': 'Dashboard',
|
||
'settings.startPageActiveTrip': 'Active trip',
|
||
'settings.startPageHint':
|
||
'TREK opens straight in the trip running today, or the next one coming up. That is the same trip the dashboard features.',
|
||
'settings.startTripTab': 'Start tab',
|
||
'settings.startTripTabHint':
|
||
'The tab the trip opens on. If it belongs to an addon you switched off, the plan view opens instead.',
|
||
|
||
// ── Offline (#1135) ────────────────────────────────────────────────────────
|
||
'settings.offline.cache.title': 'Offline cache',
|
||
'settings.offline.mode.title': 'Offline mode',
|
||
'settings.offline.mode.force': 'Force offline mode',
|
||
'settings.offline.mode.forceHint':
|
||
'Work from cached data only and queue your changes. Turn off to reconnect and sync.',
|
||
'settings.offline.mode.active': 'Offline mode is on — your changes are queued and will sync when you turn it off.',
|
||
'settings.offline.prepare.title': 'Prepare for offline',
|
||
'settings.offline.prepare.hint':
|
||
'Download everything you need — trip data, documents and map tiles — before you lose connection.',
|
||
'settings.offline.prepare.button': 'Download for offline use',
|
||
'settings.offline.prepare.running': 'Downloading…',
|
||
'settings.offline.prepare.done': 'Ready for offline use',
|
||
'settings.offline.prepare.phase.trips': 'Trip data',
|
||
'settings.offline.prepare.phase.files': 'Documents',
|
||
'settings.offline.prepare.phase.tiles': 'Map tiles',
|
||
'settings.offline.resync': 'Re-sync now',
|
||
'settings.offline.resyncing': 'Syncing…',
|
||
'settings.offline.storage.title': 'What to store offline',
|
||
'settings.offline.storage.tiles': 'Store map tiles offline',
|
||
'settings.offline.storage.tilesHint':
|
||
'Map tiles use the most storage. Turn this off to keep only trip data and documents offline.',
|
||
'settings.offline.storage.tripsTitle': 'Trips',
|
||
'settings.offline.storage.tripOn': 'Stored offline',
|
||
'settings.offline.storage.tripOff': 'Not stored',
|
||
'settings.offline.storage.tripFinished': 'Finished. Only stored if you switch it on.',
|
||
'settings.offline.notice.stored': 'Stored {count} trips on this device',
|
||
'settings.offline.notice.stored.one': 'Stored {count} trip on this device',
|
||
'settings.offline.notice.nothing': 'Nothing to store. Switch on the trips you want to keep.',
|
||
'settings.offline.notice.busy': 'A sync is already running. Try again in a moment.',
|
||
'settings.offline.notice.offline': 'No connection. Connect to store trips for offline use.',
|
||
'settings.offline.notice.signedOut': 'Your session has ended. Sign in again to sync.',
|
||
'settings.offline.notice.failed': 'The download could not finish. Check your connection and try again.',
|
||
'settings.offline.notice.loadFailed':
|
||
'Could not read this device’s offline storage. Clearing the cache usually fixes it.',
|
||
'settings.offline.clear': 'Clear cache',
|
||
'settings.offline.clearConfirm': 'Clear all offline trip data? You can re-sync anytime while online.',
|
||
'settings.offline.stats.trips': 'Cached trips',
|
||
'settings.offline.stats.pending': 'Pending changes',
|
||
'settings.offline.stats.failed': 'Failed changes',
|
||
'settings.offline.failed.hint':
|
||
"These changes never reached the server. Try them again, or discard them to keep the server's version.",
|
||
'settings.offline.failed.retry': 'Try again',
|
||
'settings.offline.failed.discard': 'Discard',
|
||
'settings.offline.stats.conflicts': 'Conflicts',
|
||
'settings.offline.empty': 'No trips cached yet. Connect to the internet to sync.',
|
||
'settings.offline.loading': 'Loading…',
|
||
'settings.offline.conflicts.title': 'Sync conflicts',
|
||
'settings.offline.conflicts.hint':
|
||
'Changes you made offline clash with newer changes on the server. Choose which version to keep.',
|
||
'settings.offline.conflicts.keepMine': 'Keep mine',
|
||
'settings.offline.conflicts.keepServer': 'Keep theirs',
|
||
'settings.offline.conflicts.mine': 'Your version',
|
||
'settings.offline.conflicts.server': 'Server version',
|
||
'settings.offline.conflicts.item': 'Change to “{name}”',
|
||
'settings.offline.conflicts.strategyTitle': 'When a conflict happens',
|
||
'settings.offline.conflicts.strategy.ask': 'Ask me each time',
|
||
'settings.offline.conflicts.strategy.mine': 'Always keep my version',
|
||
'settings.offline.conflicts.strategy.server': 'Always keep the server version',
|
||
'settings.offline.banner.offline': 'Offline',
|
||
'settings.offline.banner.forced': 'Offline mode',
|
||
'settings.offline.banner.queued': 'Offline · {count} queued',
|
||
'settings.offline.banner.queued.one': 'Offline · {count} queued',
|
||
'settings.offline.banner.syncing': 'Syncing {count}…',
|
||
'settings.offline.banner.syncing.one': 'Syncing {count}…',
|
||
'settings.offline.banner.failed': 'Failed to sync: {count}',
|
||
'settings.offline.banner.failed.one': 'Failed to sync: {count}',
|
||
'settings.offline.banner.conflicts': 'Conflicts: {count}',
|
||
'settings.offline.banner.conflicts.one': 'Conflicts: {count}',
|
||
'settings.alwaysShowRoutes': 'Always show booking routes',
|
||
'settings.alwaysShowRoutesHint':
|
||
'Automatically draw the route for every flight, train and other booking on the map — no need to switch it on per item.',
|
||
|
||
// Public API keys (Settings -> Integrations)
|
||
// ── API keys: what a key may read ─────────────────────────────────────────
|
||
'settings.apiScopes.title': 'What this key may read',
|
||
'settings.apiScopes.hint':
|
||
'Leave everything on for a key that should see all of it. Anything you switch off is refused for this key, not just left out of the answer.',
|
||
'settings.apiScopes.all': 'Everything',
|
||
'settings.apiScopes.noneSelected': 'Pick at least one area, or the key could not read anything.',
|
||
'settings.apiScopes.limited': '{count} of {total}',
|
||
'settings.apiScopes.limited.one': '{count} of {total}',
|
||
'settings.apiScopes.trips': 'Trips',
|
||
'settings.apiScopes.days': 'Days',
|
||
'settings.apiScopes.places': 'Places',
|
||
'settings.apiScopes.notes': 'Day notes',
|
||
'settings.apiScopes.reservations': 'Bookings',
|
||
'settings.apiScopes.accommodations': 'Accommodation',
|
||
'settings.apiScopes.travellers': 'Who is coming',
|
||
'settings.apiScopes.bucket-list': 'Wishlist',
|
||
'settings.apiScopes.stats': 'Totals',
|
||
'settings.apiKeys.title': 'API Keys',
|
||
'settings.apiKeys.description':
|
||
'Keys for the public API, so other software can read your trips. Read-only: a key cannot change or delete anything.',
|
||
'settings.apiKeys.create': 'Create key',
|
||
'settings.apiKeys.empty': 'No keys yet. Create one to connect other software.',
|
||
'settings.apiKeys.createdAt': 'created',
|
||
'settings.apiKeys.usedAt': 'last used',
|
||
'settings.apiKeys.deleteTitle': 'Delete key',
|
||
'settings.apiKeys.deleteMessage': 'Anything using this key stops working immediately. This cannot be undone.',
|
||
'settings.apiKeys.deleted': 'Key deleted',
|
||
'settings.apiKeys.deleteFailed': 'Could not delete the key',
|
||
'settings.apiKeys.createFailed': 'Could not create the key',
|
||
'settings.apiKeys.copy': 'Copy',
|
||
'settings.apiKeys.docsHint': 'Send the key as "Authorization: Bearer ..." or "X-API-Key: ..." to /api/v1.',
|
||
'settings.apiKeys.endpoint': 'Endpoint',
|
||
'settings.apiKeys.neverUsed': 'never used',
|
||
'settings.apiKeys.loadFailed': 'Could not load your keys. Reload the page to try again.',
|
||
'settings.apiKeys.limitReached':
|
||
'You have {count} keys, the most an account can hold. Delete one you no longer use to create another.',
|
||
'settings.apiKeys.limitReached.one':
|
||
'You have {count} key, the most an account can hold. Delete it if you no longer use it to create another.',
|
||
'settings.apiKeys.copyFailed': 'Could not copy. Select the text and copy it by hand.',
|
||
'settings.apiKeys.modal.createTitle': 'Create API key',
|
||
'settings.apiKeys.modal.name': 'Name',
|
||
'settings.apiKeys.modal.namePlaceholder': 'e.g. Dawarich',
|
||
'settings.apiKeys.modal.nameHint': 'Only for you, so you recognise the key later.',
|
||
'settings.apiKeys.modal.creating': 'Creating...',
|
||
'settings.apiKeys.modal.create': 'Create',
|
||
'settings.apiKeys.modal.createdTitle': 'API key created',
|
||
'settings.apiKeys.modal.createdWarning': 'Copy the key now. It is shown once and cannot be retrieved later.',
|
||
'settings.apiKeys.modal.done': 'Done',
|
||
};
|
||
|
||
export default settings;
|