42af7a6551
- Gitea: NotificationTracker now exposes sender allowlist / blocklist filters via MultiEntitySelect, populated from Gitea /users/search merged with past EventLog senders so the picker is useful before the first webhook arrives. - Webhook providers (gitea, planka, webhook): stop scheduling interval polling jobs on tracker create/update/startup; hide the "every Xs" indicator in the tracker list since there is no polling. - Dashboard: stat cards are now <a> links that route to providers, trackers, targets, command-trackers, or scroll to the events panel. Provider deck rows highlight the target provider on click. - Command trackers / command configs: auto-reselect the right config when the provider type changes (matches notification-tracker behavior). - Migration: drop legacy batch_duration column from notification_tracker — the field is gone from the model but its NOT NULL constraint blocked inserts on older DBs. - Docs: refresh entity-relationships.md with current NotificationTracker fields (filters, adaptive_max_skip, default_*_config_id).
1322 lines
54 KiB
JSON
1322 lines
54 KiB
JSON
{
|
||
"app": {
|
||
"name": "Notify Bridge",
|
||
"tagline": "Service notifications"
|
||
},
|
||
"nav": {
|
||
"sectionOverview": "Overview",
|
||
"sectionRouting": "Routing",
|
||
"sectionOperators": "Operators",
|
||
"sectionSystem": "System",
|
||
"dashboard": "Dashboard",
|
||
"providers": "Providers",
|
||
"notificationTrackers": "Notif. Trackers",
|
||
"trackingConfigs": "Tracking",
|
||
"templateConfigs": "Templates",
|
||
"telegramBots": "Bots",
|
||
"targets": "Targets",
|
||
"commandConfigs": "Cmd Configs",
|
||
"commandTrackers": "Cmd Trackers",
|
||
"cmdTemplateConfigs": "Cmd Templates",
|
||
"users": "Users",
|
||
"settings": "Settings",
|
||
"backup": "Backup",
|
||
"logout": "Logout",
|
||
"notification": "Notification",
|
||
"commands": "Commands",
|
||
"bots": "Bots",
|
||
"trackers": "Trackers",
|
||
"configs": "Configs",
|
||
"templates": "Templates",
|
||
"telegram": "Telegram",
|
||
"email": "Email",
|
||
"matrix": "Matrix",
|
||
"common": "Common",
|
||
"targetTelegram": "Telegram",
|
||
"targetWebhook": "Webhook",
|
||
"targetEmail": "Email",
|
||
"targetDiscord": "Discord",
|
||
"targetSlack": "Slack",
|
||
"targetNtfy": "ntfy",
|
||
"targetMatrix": "Matrix",
|
||
"targetBroadcast": "Broadcast",
|
||
"automation": "Automation",
|
||
"actions": "Actions",
|
||
"more": "More"
|
||
},
|
||
"auth": {
|
||
"signIn": "Sign in",
|
||
"signInTitle": "Sign in to your account",
|
||
"signingIn": "Signing in...",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"confirmPassword": "Confirm password",
|
||
"setupTitle": "Welcome",
|
||
"setupDescription": "Create your admin account to get started",
|
||
"createAccount": "Create account",
|
||
"creatingAccount": "Creating account...",
|
||
"passwordMismatch": "Passwords do not match",
|
||
"passwordTooShort": "Password must be at least 8 characters",
|
||
"or": "or",
|
||
"loginFailed": "Login failed",
|
||
"setupFailed": "Setup failed",
|
||
"backendUnreachable": "Cannot reach the server. Check that it's running and try again."
|
||
},
|
||
"dashboard": {
|
||
"title": "Dashboard",
|
||
"description": "Overview of your Notify Bridge setup",
|
||
"providers": "Providers",
|
||
"activeTrackers": "Active Trackers",
|
||
"targets": "Targets",
|
||
"recentEvents": "Events",
|
||
"clearEvents": "Clear",
|
||
"confirmClearEvents": "Delete all event log entries? This cannot be undone.",
|
||
"chart": "Event chart",
|
||
"noEvents": "No events yet. Create a tracker to start monitoring.",
|
||
"loading": "Loading...",
|
||
"justNow": "just now",
|
||
"minutesAgo": "{n}m ago",
|
||
"hoursAgo": "{n}h ago",
|
||
"daysAgo": "{n}d ago",
|
||
"assetsAdded": "assets added",
|
||
"assetsRemoved": "assets removed",
|
||
"collectionRenamed": "collection renamed",
|
||
"collectionDeleted": "collection deleted",
|
||
"sharingChanged": "sharing changed",
|
||
"scheduledMessage": "scheduled message",
|
||
"actionSuccess": "action run",
|
||
"actionPartial": "action partial",
|
||
"actionFailed": "action failed",
|
||
"searchEvents": "Search events...",
|
||
"allEvents": "All Events",
|
||
"filterAssetsAdded": "Assets Added",
|
||
"filterAssetsRemoved": "Assets Removed",
|
||
"filterRenamed": "Renamed",
|
||
"filterDeleted": "Deleted",
|
||
"filterSharingChanged": "Sharing Changed",
|
||
"filterActionSuccess": "Action Success",
|
||
"filterActionPartial": "Action Partial",
|
||
"filterActionFailed": "Action Failed",
|
||
"allProviders": "All Providers",
|
||
"newestFirst": "Newest first",
|
||
"oldestFirst": "Oldest first",
|
||
"loadingEvents": "Loading events...",
|
||
"asset": "asset",
|
||
"assets": "assets",
|
||
"eventActivity": "Event Activity",
|
||
"last14days": "Last 14 days",
|
||
"event": "event",
|
||
"events": "events",
|
||
"noChartData": "No event data yet",
|
||
"live": "Live",
|
||
"attention": "Attention",
|
||
"heroPrefix": "Tonight,",
|
||
"heroEmphasis": "everything",
|
||
"heroSuffix": "is flowing.",
|
||
"heroSummary": "{providers} providers listening, {armed} of {total} trackers armed, {throughput} events dispatched across {targets} targets in 24h.",
|
||
"throughput24h": "throughput · 24h",
|
||
"eventsShort": "events",
|
||
"armedShort": "armed",
|
||
"providersShort": "providers",
|
||
"targetsShort": "targets",
|
||
"trackersShort": "trackers",
|
||
"streamTitle": "Signal",
|
||
"streamEmphasis": "stream",
|
||
"eventsLabel": "events",
|
||
"onWatchTitle": "On",
|
||
"onWatchEmphasis": "watch",
|
||
"noProviders": "No providers yet.",
|
||
"addProvider": "Add provider",
|
||
"addProviderHint": "Connect a service to start tracking",
|
||
"pulseTitle": "Pulse",
|
||
"pulseEmphasis": "· last 14 days",
|
||
"pulseSub": "Events grouped by day",
|
||
"wiresTitle": "Active",
|
||
"wiresEmphasis": "wires",
|
||
"wiresSub": "routes",
|
||
"composeTitle": "Pick a source. Choose a channel.",
|
||
"composeEmphasis": "Compose the wire.",
|
||
"composeSub": "Walk from provider → tracker → template → target. Or paste a webhook URL and we'll infer the rest.",
|
||
"viewTrackers": "View trackers",
|
||
"newTracker": "New tracker",
|
||
"eventsTotal": "Events"
|
||
},
|
||
"providers": {
|
||
"title": "Service",
|
||
"titleEmphasis": "providers",
|
||
"description": "Connect to external services and webhooks. Each provider feeds events into trackers, which dispatch notifications across your channels.",
|
||
"typeSingular": "type",
|
||
"typePlural": "types",
|
||
"addProvider": "Add Provider",
|
||
"cancel": "Cancel",
|
||
"type": "Provider Type",
|
||
"name": "Name",
|
||
"url": "Provider URL",
|
||
"urlPlaceholder": "http://provider:2283",
|
||
"apiKey": "API Key",
|
||
"apiKeyKeep": "API Key (leave empty to keep current)",
|
||
"connecting": "Connecting...",
|
||
"noProviders": "No providers configured yet.",
|
||
"delete": "Delete",
|
||
"confirmDelete": "Delete this provider?",
|
||
"online": "Online",
|
||
"offline": "Offline",
|
||
"checking": "Checking...",
|
||
"typeImmich": "Immich",
|
||
"typeGitea": "Gitea",
|
||
"typePlanka": "Planka",
|
||
"typeScheduler": "Scheduler",
|
||
"typeNut": "NUT (UPS)",
|
||
"typeGooglePhotos": "Google Photos",
|
||
"typeWebhook": "Generic Webhook",
|
||
"loadError": "Failed to load providers.",
|
||
"externalDomain": "External Domain",
|
||
"optional": "optional",
|
||
"urlApiKeyRequired": "URL and API Key are required",
|
||
"externalDomainHint": "Public-facing URL for notification links. Falls back to server URL.",
|
||
"webhookSecret": "Webhook Secret",
|
||
"webhookSecretKeep": "Webhook Secret (leave empty to keep current)",
|
||
"webhookSecretHint": "Shared secret for HMAC-SHA256 signature verification. Set the same secret in Gitea webhook settings.",
|
||
"plankaWebhookSecretHint": "Bearer token for webhook authentication. Set the same token as WEBHOOK_ACCESS_TOKEN in Planka.",
|
||
"plankaApiKeyHint": "Optional. Needed for connection testing and board listing.",
|
||
"plankaWebhookUrlHint": "Set this as the Webhook URL in Planka environment config (relative to your bridge host).",
|
||
"authMode": "Authentication Mode",
|
||
"authModeHint": "Choose hmac_sha256, bearer_token, or none",
|
||
"authNone": "None",
|
||
"authBearer": "Bearer Token",
|
||
"authHmac": "HMAC-SHA256",
|
||
"genericWebhookSecretHint": "Secret for HMAC-SHA256 or Bearer token authentication. Leave empty for no authentication.",
|
||
"maxStoredPayloads": "Max stored payloads",
|
||
"maxStoredPayloadsHint": "Number of recent payloads to keep for debugging (0 = disabled, max 100)",
|
||
"webhookSecretRequired": "Webhook secret is required",
|
||
"apiToken": "API Token",
|
||
"apiTokenHint": "Optional. Needed for connection testing and repository listing.",
|
||
"webhookUrl": "Webhook URL",
|
||
"webhookUrlHint": "Set this as the Target URL in Gitea webhook settings (relative to your bridge host).",
|
||
"nutHost": "NUT Server Host",
|
||
"nutHostPlaceholder": "192.168.1.100 or ups.local",
|
||
"nutPort": "NUT Server Port",
|
||
"nutUsername": "Username",
|
||
"nutPassword": "Password",
|
||
"nutUsernameHint": "Optional — only needed if upsd requires authentication",
|
||
"nutPasswordHint": "Optional — upsd user password",
|
||
"gpClientId": "OAuth Client ID",
|
||
"gpClientSecret": "OAuth Client Secret",
|
||
"gpClientSecretKeep": "OAuth Client Secret (leave empty to keep current)",
|
||
"gpRefreshToken": "Refresh Token",
|
||
"gpRefreshTokenKeep": "Refresh Token (leave empty to keep current)",
|
||
"gpRefreshTokenHint": "Obtain from Google OAuth Playground (developers.google.com/oauthplayground) with the Photos Library API scope.",
|
||
"gpAllFieldsRequired": "Client ID, Client Secret, and Refresh Token are all required",
|
||
"storePayloads": "Store incoming payloads",
|
||
"storePayloadsHint": "Save recent webhook request bodies for debugging",
|
||
"maxStoredPayloads": "Max stored payloads",
|
||
"maxStoredPayloadsHint": "Number of recent payloads to keep (1-100)",
|
||
"testAndSave": "Test & Save",
|
||
"saveWithoutTest": "Save without testing",
|
||
"selectType": "Select a provider type",
|
||
"testFailed": "Connection test failed"
|
||
},
|
||
"webhookLogs": {
|
||
"title": "Recent Payloads",
|
||
"empty": "No payloads recorded yet",
|
||
"clear": "Clear history",
|
||
"confirmClear": "Clear all stored payloads for this provider?",
|
||
"statusMatched": "Matched",
|
||
"statusUnmatched": "Unmatched",
|
||
"statusError": "Error",
|
||
"headers": "Headers",
|
||
"body": "Request Body",
|
||
"extractedFields": "Extracted Fields",
|
||
"errorMessage": "Error",
|
||
"cleared": "Payload history cleared"
|
||
},
|
||
"notificationTracker": {
|
||
"title": "Notification",
|
||
"titleEmphasis": "trackers",
|
||
"armed": "armed",
|
||
"paused": "paused",
|
||
"description": "Monitor albums for changes",
|
||
"newTracker": "New Tracker",
|
||
"cancel": "Cancel",
|
||
"name": "Name",
|
||
"namePlaceholder": "Family photos tracker",
|
||
"server": "Provider",
|
||
"selectServer": "Select provider...",
|
||
"albums": "Albums",
|
||
"selectAlbums": "Select albums...",
|
||
"repositories": "Repositories",
|
||
"selectRepositories": "Select repositories...",
|
||
"userAllowlist": "Only from users",
|
||
"userBlocklist": "Exclude users",
|
||
"selectUsers": "Pick users...",
|
||
"boards": "Boards",
|
||
"selectBoards": "Select boards...",
|
||
"upsDevices": "UPS Devices",
|
||
"selectUpsDevices": "Select UPS devices...",
|
||
"eventTypes": "Event Types",
|
||
"notificationTargets": "Notification Targets",
|
||
"scanInterval": "Scan Interval (seconds)",
|
||
"scheduleType": "Schedule",
|
||
"intervalMode": "Interval",
|
||
"cronMode": "Cron expression",
|
||
"cronExpression": "Cron expression",
|
||
"cronHint": "Standard 5-field cron: minute hour day month weekday. Example: 0 9 * * 1-5 (weekdays at 9:00)",
|
||
"customVariables": "Custom Variables",
|
||
"customVariablesHint": "Define key-value pairs available in templates as {{ key }}.",
|
||
"addVariable": "Add variable",
|
||
"createTracker": "Create Tracker",
|
||
"noTrackers": "No trackers yet. Add a provider first, then create a tracker.",
|
||
"active": "Active",
|
||
"paused": "Paused",
|
||
"pause": "Pause",
|
||
"resume": "Resume",
|
||
"delete": "Delete",
|
||
"confirmDelete": "Delete this tracker?",
|
||
"albums_count": "album(s)",
|
||
"repos_count": "repo(s)",
|
||
"boards_count": "board(s)",
|
||
"devices_count": "device(s)",
|
||
"collections_count": "collection(s)",
|
||
"every": "every",
|
||
"trackImages": "Track images",
|
||
"trackVideos": "Track videos",
|
||
"favoritesOnly": "Favorites only",
|
||
"includePeople": "Include people in notifications",
|
||
"includeAssetDetails": "Include asset details",
|
||
"maxAssetsToShow": "Max assets to show",
|
||
"sortBy": "Sort by",
|
||
"sortOrder": "Sort order",
|
||
"sortNone": "Original order",
|
||
"sortDate": "Date",
|
||
"sortRating": "Rating",
|
||
"sortName": "Name",
|
||
"sortRandom": "Random",
|
||
"ascending": "Ascending",
|
||
"descending": "Descending",
|
||
"quietHoursStart": "Quiet hours start",
|
||
"quietHoursEnd": "Quiet hours end",
|
||
"adaptiveMaxSkip": "Adaptive polling cap",
|
||
"adaptiveMaxSkipPlaceholder": "Off (blank or 0)",
|
||
"defaultTrackingConfig": "Default tracking config",
|
||
"defaultTemplateConfig": "Default template config",
|
||
"linkedTargets": "targets",
|
||
"noLinkedTargets": "No targets linked. Add a target below.",
|
||
"addTarget": "Add target",
|
||
"selectTarget": "Select target to add...",
|
||
"alreadyLinked": "Already linked",
|
||
"testBasic": "Send test message",
|
||
"testPeriodic": "Test periodic summary",
|
||
"testScheduled": "Test scheduled assets",
|
||
"testMemory": "Test memory / On This Day",
|
||
"testDisabledHint": "Enable this feature in the tracker's default Tracking Config first.",
|
||
"checkingLinks": "Checking links...",
|
||
"featureDiscovery": "Configure periodic summaries, scheduled photo picks, memories, and quiet hours in the default Tracking Config.",
|
||
"openTrackingConfig": "Open Tracking Config",
|
||
"linkReplace": "Replace",
|
||
"linkReplacing": "Replacing...",
|
||
"linkReplaceFailed": "Failed to replace link for \"{name}\"",
|
||
"linkPasswordProtectedNote": "Telegram users can't open password-protected links without the password. Remove the password in Immich or replace the link.",
|
||
"missingLinksTitle": "Albums Missing Public Links",
|
||
"missingLinksDesc": "The following albums don't have public shared links. Without links, notification recipients won't be able to view photos.",
|
||
"expired": "Expired",
|
||
"passwordProtected": "Password Protected",
|
||
"noLink": "No Link",
|
||
"saveWithoutLinks": "Save without links",
|
||
"createLinks": "Create {count} link(s)",
|
||
"linksNote": "You can also create links manually in Immich.",
|
||
"createdLinks": "Created {count} public link(s)"
|
||
},
|
||
"templates": {
|
||
"title": "Templates",
|
||
"description": "Jinja2 message templates for notifications",
|
||
"newTemplate": "New Template",
|
||
"cancel": "Cancel",
|
||
"name": "Name",
|
||
"body": "Template Body (Jinja2)",
|
||
"variables": "Variables",
|
||
"preview": "Preview",
|
||
"edit": "Edit",
|
||
"delete": "Delete",
|
||
"confirmDelete": "Delete this template?",
|
||
"create": "Create Template",
|
||
"update": "Update Template",
|
||
"noTemplates": "No templates yet. A default template will be used if none is configured.",
|
||
"eventType": "Event type",
|
||
"allEvents": "All events",
|
||
"assetsAdded": "Assets added",
|
||
"assetsRemoved": "Assets removed",
|
||
"albumRenamed": "Album renamed",
|
||
"albumDeleted": "Album deleted"
|
||
},
|
||
"targets": {
|
||
"titleEmphasis": "channel",
|
||
"titleEmphasisAll": "channels",
|
||
"receiver": "receiver",
|
||
"receivers": "receivers",
|
||
"channelsCount": "channels",
|
||
"title": "Targets",
|
||
"description": "Notification delivery destinations",
|
||
"descTelegram": "Telegram chat destinations for notifications",
|
||
"descWebhook": "HTTP webhook endpoints for notification delivery",
|
||
"descEmail": "Email recipients for notifications",
|
||
"descDiscord": "Discord channel webhooks for notifications",
|
||
"descSlack": "Slack channel webhooks for notifications",
|
||
"descNtfy": "ntfy push notification topics",
|
||
"descMatrix": "Matrix room destinations for notifications",
|
||
"descBroadcast": "Send to multiple targets at once",
|
||
"childTargets": "target(s)",
|
||
"selectChildTargets": "Select child targets",
|
||
"noChildTargets": "No child targets configured.",
|
||
"noChildTargetsAvailable": "Create other targets first, then add them here.",
|
||
"addTarget": "Add Target",
|
||
"cancel": "Cancel",
|
||
"type": "Type",
|
||
"name": "Name",
|
||
"namePlaceholder": "My notifications",
|
||
"botToken": "Bot Token",
|
||
"chatId": "Chat ID",
|
||
"webhookUrl": "Webhook URL",
|
||
"create": "Add Target",
|
||
"test": "Test",
|
||
"delete": "Delete",
|
||
"confirmDelete": "Delete this target?",
|
||
"noTargets": "No notification targets configured yet.",
|
||
"testSent": "Test sent successfully!",
|
||
"aiCaptions": "Enable AI captions",
|
||
"telegramSettings": "Telegram Settings",
|
||
"maxMedia": "Max media to send",
|
||
"maxGroupSize": "Max group size",
|
||
"chunkDelay": "Delay between groups (ms)",
|
||
"maxAssetSize": "Max asset size (MB)",
|
||
"videoWarning": "Video size warning",
|
||
"disableUrlPreview": "Disable link previews",
|
||
"sendLargeAsDocuments": "Send large photos as documents",
|
||
"chatAction": "Chat action",
|
||
"chatActionNone": "None (no action)",
|
||
"chatActionTyping": "Typing",
|
||
"chatActionUploadPhoto": "Upload Photo",
|
||
"chatActionUploadVideo": "Upload Video",
|
||
"chatActionUploadDoc": "Upload Doc",
|
||
"chatActionRecordVideo": "Record Video",
|
||
"chatActionRecordVoice": "Record Voice",
|
||
"typeTelegram": "Telegram",
|
||
"typeWebhook": "Webhook",
|
||
"overrideUsername": "Override bot username",
|
||
"ntfyServer": "ntfy Server URL",
|
||
"ntfyTopic": "Topic",
|
||
"ntfyToken": "Auth Token",
|
||
"ntfyTokenPlaceholder": "Optional (for protected topics)",
|
||
"selectEmailBot": "Select Email Bot",
|
||
"selectMatrixBot": "Select Matrix Bot",
|
||
"recipientEmail": "Recipient Email",
|
||
"matrixRoomId": "Room ID",
|
||
"receivers": "Receivers",
|
||
"noReceivers": "No receivers yet",
|
||
"alreadyAdded": "already added",
|
||
"addReceiver": "Add Receiver",
|
||
"receiverAdded": "Receiver added",
|
||
"receiverDeleted": "Receiver deleted",
|
||
"receiverUpdated": "Receiver updated",
|
||
"confirmDeleteReceiver": "Delete this receiver?",
|
||
"receiverEnabled": "Receiver enabled",
|
||
"receiverDisabled": "Receiver disabled"
|
||
},
|
||
"users": {
|
||
"titleEmphasis": "& access",
|
||
"countLabel": "users",
|
||
"title": "Users",
|
||
"description": "Manage user accounts (admin only)",
|
||
"addUser": "Add User",
|
||
"cancel": "Cancel",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"role": "Role",
|
||
"roleUser": "User",
|
||
"roleAdmin": "Admin",
|
||
"create": "Create User",
|
||
"delete": "Delete",
|
||
"edit": "Edit user",
|
||
"confirmDelete": "Delete this user?",
|
||
"joined": "joined",
|
||
"noUsers": "No users found"
|
||
},
|
||
"telegramBot": {
|
||
"titleEmphasis": "telegram",
|
||
"countLabel": "bots",
|
||
"title": "Telegram Bots",
|
||
"description": "Register and manage Telegram bots",
|
||
"addBot": "Add Bot",
|
||
"name": "Display name",
|
||
"namePlaceholder": "Family notifications bot",
|
||
"token": "Bot Token",
|
||
"tokenPlaceholder": "123456:ABC-DEF...",
|
||
"noBots": "No bots registered yet.",
|
||
"chats": "Chats",
|
||
"noChats": "No chats found. Send a message to the bot first.",
|
||
"refreshChats": "Refresh",
|
||
"selectBot": "Select bot",
|
||
"selectChat": "Select chat",
|
||
"private": "Private",
|
||
"group": "Group",
|
||
"supergroup": "Supergroup",
|
||
"channel": "Channel",
|
||
"confirmDelete": "Delete this bot?",
|
||
"commands": "Commands",
|
||
"enabledCommands": "Enabled commands",
|
||
"defaultCount": "Default count",
|
||
"responseMode": "Response mode",
|
||
"modeMedia": "Media (files)",
|
||
"modeText": "Text only",
|
||
"botLocale": "Bot language",
|
||
"rateLimits": "Rate Limits",
|
||
"rateSearch": "Search cooldown",
|
||
"rateFind": "Find cooldown",
|
||
"rateDefault": "Default cooldown",
|
||
"noCommandsForProvider": "This provider type does not support bot commands.",
|
||
"syncCommands": "Sync Commands",
|
||
"discoverChats": "Discover chats from Telegram",
|
||
"clickToCopy": "Click to copy chat ID",
|
||
"chatsDiscovered": "Chats discovered",
|
||
"chatDeleted": "Chat removed",
|
||
"chatName": "Name",
|
||
"chatType": "Type",
|
||
"chatLang": "Lang",
|
||
"langOverride": "Override",
|
||
"cmds": "Cmds",
|
||
"commandsToggle": "Toggle command listening for this chat",
|
||
"chatId": "Chat ID",
|
||
"languageUpdated": "Chat language updated",
|
||
"cmdLocale": "Bot language",
|
||
"searchCooldown": "Search cooldown (s)",
|
||
"saveConfig": "Save config",
|
||
"commandsSynced": "Commands synced with Telegram",
|
||
"registerWebhook": "Register webhook",
|
||
"unregisterWebhook": "Unregister webhook",
|
||
"webhookRegistered": "Webhook registered",
|
||
"webhookUnregistered": "Webhook unregistered",
|
||
"updateMode": "Update mode",
|
||
"none": "None",
|
||
"noneActive": "Listener disabled",
|
||
"polling": "Polling",
|
||
"webhook": "Webhook",
|
||
"webhookStatus": "Webhook status",
|
||
"webhookActive": "Webhook active",
|
||
"webhookNotSet": "No webhook set",
|
||
"webhookVerified": "Webhook verified",
|
||
"webhookError": "Last error",
|
||
"pendingUpdates": "pending updates",
|
||
"pollingActive": "Polling active",
|
||
"telegramSettings": "Telegram Settings",
|
||
"externalUrl": "External URL",
|
||
"externalUrlHint": "Public URL of this Notify Bridge instance. Required for webhook mode.",
|
||
"webhookSecret": "Webhook secret",
|
||
"webhookSecretHint": "Optional secret token to verify webhook requests from Telegram",
|
||
"cacheTtl": "Media cache TTL (hours)",
|
||
"cacheTtlHint": "How long to cache uploaded Telegram file_ids before re-uploading (default: 48h)",
|
||
"settingsSaved": "Settings saved",
|
||
"noExternalDomain": "External domain URL not configured",
|
||
"saveFailed": "Failed to save bot",
|
||
"webhookFailed": "Failed to register webhook"
|
||
},
|
||
"trackingConfig": {
|
||
"titleEmphasis": "configs",
|
||
"countLabel": "configs",
|
||
"title": "Tracking Configs",
|
||
"description": "Define what events and assets to react to",
|
||
"newConfig": "New Config",
|
||
"name": "Name",
|
||
"namePlaceholder": "Default tracking",
|
||
"noConfigs": "No tracking configs yet.",
|
||
"unknownProviderType": "Unknown provider type",
|
||
"eventTracking": "Event Tracking",
|
||
"assetsAdded": "Assets added",
|
||
"assetsRemoved": "Assets removed",
|
||
"albumRenamed": "Album renamed",
|
||
"albumDeleted": "Album deleted",
|
||
"sharingChanged": "Sharing changed",
|
||
"push": "Push",
|
||
"issueOpened": "Issue opened",
|
||
"issueClosed": "Issue closed",
|
||
"issueCommented": "Issue commented",
|
||
"prOpened": "PR opened",
|
||
"prClosed": "PR closed",
|
||
"prMerged": "PR merged",
|
||
"prCommented": "PR commented",
|
||
"releasePublished": "Release published",
|
||
"cardCreated": "Card created",
|
||
"cardUpdated": "Card updated",
|
||
"cardMoved": "Card moved",
|
||
"cardDeleted": "Card deleted",
|
||
"cardCommented": "Card commented",
|
||
"commentUpdated": "Comment updated",
|
||
"boardCreated": "Board created",
|
||
"boardUpdated": "Board updated",
|
||
"boardDeleted": "Board deleted",
|
||
"listCreated": "List created",
|
||
"listUpdated": "List updated",
|
||
"listDeleted": "List deleted",
|
||
"attachmentCreated": "Attachment added",
|
||
"cardLabelAdded": "Label added",
|
||
"taskCompleted": "Task completed",
|
||
"upsOnline": "UPS online (mains restored)",
|
||
"upsOnBattery": "UPS on battery",
|
||
"upsLowBattery": "Low battery",
|
||
"upsBatteryRestored": "Battery recovered",
|
||
"upsCommsLost": "Communication lost",
|
||
"upsCommsRestored": "Communication restored",
|
||
"upsReplaceBattery": "Replace battery",
|
||
"upsOverload": "UPS overloaded",
|
||
"scheduledMessage": "Scheduled message",
|
||
"webhookReceived": "Webhook received",
|
||
"trackImages": "Track images",
|
||
"trackVideos": "Track videos",
|
||
"favoritesOnly": "Favorites only",
|
||
"assetDisplay": "Asset Display",
|
||
"includePeople": "Include people",
|
||
"includeDetails": "Include asset details",
|
||
"maxAssets": "Max assets to show",
|
||
"sortBy": "Sort by",
|
||
"sortOrder": "Sort order",
|
||
"periodicSummary": "Periodic Summary",
|
||
"enabled": "Enabled",
|
||
"intervalDays": "Interval (days)",
|
||
"startDate": "Start date",
|
||
"times": "Times (HH:MM)",
|
||
"scheduledAssets": "Scheduled Assets",
|
||
"albumMode": "Album mode",
|
||
"limit": "Limit",
|
||
"assetType": "Asset type",
|
||
"minRating": "Min rating",
|
||
"memoryMode": "Memory Mode (On This Day)",
|
||
"memorySource": "Memory source",
|
||
"memorySourceAlbums": "Scan tracked albums",
|
||
"memorySourceNative": "Immich native memories",
|
||
"quietHours": "Quiet hours",
|
||
"quietHoursStart": "Start",
|
||
"quietHoursEnd": "End",
|
||
"test": "Test",
|
||
"confirmDelete": "Delete this tracking config?",
|
||
"sortNone": "None",
|
||
"sortDate": "Date",
|
||
"sortRating": "Rating",
|
||
"sortName": "Name",
|
||
"orderDesc": "Descending",
|
||
"orderAsc": "Ascending",
|
||
"albumModePerAlbum": "Per album",
|
||
"albumModeCombined": "Combined",
|
||
"albumModeRandom": "Random",
|
||
"assetTypeAll": "All",
|
||
"assetTypePhoto": "Photo",
|
||
"assetTypeVideo": "Video",
|
||
"periodic": "periodic",
|
||
"scheduled": "scheduled",
|
||
"memory": "memory",
|
||
"added": "added",
|
||
"removed": "removed",
|
||
"renamed": "renamed",
|
||
"deleted": "deleted",
|
||
"providerType": "Provider Type",
|
||
"sortRandom": "Random",
|
||
"timesInlineHelp": "HH:MM, comma-separated",
|
||
"invalidTimeList": "Use HH:MM format, e.g. 09:00 or 09:00, 18:30",
|
||
"previewTemplate": "Preview template",
|
||
"previewSampleNote": "Rendered with sample data — not your real assets. Shows the shipped default template.",
|
||
"editTemplate": "Edit template",
|
||
"quietHoursZero": "Quiet period is 0 minutes — adjust times",
|
||
"nextDay": "next day"
|
||
},
|
||
"templateConfig": {
|
||
"titleEmphasis": "templates",
|
||
"countLabel": "templates",
|
||
"title": "Template Configs",
|
||
"description": "Define how notification messages are formatted",
|
||
"language": "Language",
|
||
"providerType": "Service Provider Type",
|
||
"newConfig": "New Config",
|
||
"name": "Name",
|
||
"namePlaceholder": "Default EN",
|
||
"descriptionPlaceholder": "e.g. English templates for family notifications",
|
||
"noConfigs": "No template configs yet.",
|
||
"eventMessages": "Event Messages",
|
||
"assetsAdded": "Assets added",
|
||
"assetsRemoved": "Assets removed",
|
||
"albumRenamed": "Album renamed",
|
||
"albumDeleted": "Album deleted",
|
||
"sharingChanged": "Sharing changed",
|
||
"assetFormatting": "Asset Formatting",
|
||
"imageTemplate": "Image item",
|
||
"videoTemplate": "Video item",
|
||
"assetsWrapper": "Assets wrapper",
|
||
"moreMessage": "More message",
|
||
"peopleFormat": "People format",
|
||
"dateLocation": "Date & Location",
|
||
"dateFormat": "Date & time format",
|
||
"dateOnlyFormat": "Date only format",
|
||
"commonDate": "Common date",
|
||
"uniqueDate": "Per-asset date",
|
||
"locationFormat": "Location format",
|
||
"commonLocation": "Common location",
|
||
"uniqueLocation": "Per-asset location",
|
||
"favoriteIndicator": "Favorite indicator",
|
||
"scheduledMessages": "Scheduled Messages",
|
||
"periodicSummary": "Periodic summary",
|
||
"periodicAlbum": "Per-album item",
|
||
"scheduledAssets": "Scheduled assets",
|
||
"memoryMode": "Memory mode",
|
||
"settings": "Settings",
|
||
"previewAs": "Preview as",
|
||
"preview": "Preview",
|
||
"variables": "Variables",
|
||
"assetFields": "Asset fields (in {% for asset in added_assets %})",
|
||
"albumFields": "Album fields (in {% for album in albums %})",
|
||
"confirmDelete": "Delete this template config?",
|
||
"invalidFormat": "Invalid format string",
|
||
"filterSlots": "Filter slots...",
|
||
"slots": "slots",
|
||
"resetToDefault": "Reset to default",
|
||
"resetAllToDefaults": "Reset all to defaults",
|
||
"resetSlotConfirm": "Replace this slot's {locale} template with the shipped default? Your current edits will be lost.",
|
||
"resetAllConfirm": "Replace every slot's {locale} template with the shipped defaults? All your {locale} edits will be lost.",
|
||
"resetNoDefault": "No shipped default for this slot.",
|
||
"resetApplied": "Reset to default (not saved yet — click Save to persist)",
|
||
"deepLinkNoConfig": "No template config found for this provider. Create one first."
|
||
},
|
||
"templateVars": {
|
||
"message_assets_added": {
|
||
"description": "Notification when new assets are added to an album"
|
||
},
|
||
"message_assets_removed": {
|
||
"description": "Notification when assets are removed from an album"
|
||
},
|
||
"message_album_renamed": {
|
||
"description": "Notification when an album is renamed"
|
||
},
|
||
"message_album_deleted": {
|
||
"description": "Notification when an album is deleted"
|
||
},
|
||
"periodic_summary_message": {
|
||
"description": "Periodic album summary (scheduler not yet implemented)"
|
||
},
|
||
"scheduled_assets_message": {
|
||
"description": "Scheduled asset delivery (scheduler not yet implemented)"
|
||
},
|
||
"memory_mode_message": {
|
||
"description": "\"On This Day\" memories (scheduler not yet implemented)"
|
||
},
|
||
"album_id": "Album ID (UUID)",
|
||
"album_name": "Album name",
|
||
"album_url": "Public share URL (empty if not shared)",
|
||
"added_count": "Number of assets added",
|
||
"removed_count": "Number of assets removed",
|
||
"change_type": "Type of change (assets_added, assets_removed, album_renamed, album_deleted)",
|
||
"people": "Detected people names (list, use {{ people | join(', ') }})",
|
||
"added_assets": "List of asset dicts (use {% for asset in added_assets %})",
|
||
"removed_assets": "List of removed asset IDs (strings)",
|
||
"shared": "Whether album is shared (boolean)",
|
||
"target_type": "Target type: telegram, webhook, email, discord, slack, ntfy, or matrix",
|
||
"has_videos": "Whether added assets contain videos (boolean)",
|
||
"has_photos": "Whether added assets contain photos (boolean)",
|
||
"old_name": "Previous album name (rename events)",
|
||
"new_name": "New album name (rename events)",
|
||
"old_shared": "Was album shared before rename (boolean)",
|
||
"new_shared": "Is album shared after rename (boolean)",
|
||
"albums": "List of album dicts (use {% for album in albums %})",
|
||
"assets": "List of asset dicts (use {% for asset in assets %})",
|
||
"date": "Current date string",
|
||
"asset_id": "Asset ID (UUID)",
|
||
"asset_filename": "Original filename",
|
||
"asset_type": "IMAGE or VIDEO",
|
||
"asset_created_at": "Creation date/time (ISO 8601)",
|
||
"asset_owner": "Owner display name",
|
||
"asset_owner_id": "Owner user ID",
|
||
"asset_description": "User or EXIF description",
|
||
"asset_people": "People detected in this asset (list)",
|
||
"asset_is_favorite": "Whether asset is favorited (boolean)",
|
||
"asset_rating": "Star rating (1-5 or null)",
|
||
"asset_latitude": "GPS latitude (float or null)",
|
||
"asset_longitude": "GPS longitude (float or null)",
|
||
"asset_city": "City name",
|
||
"asset_state": "State/region name",
|
||
"asset_country": "Country name",
|
||
"asset_url": "Public viewer URL (if shared)",
|
||
"asset_download_url": "Direct download URL (if shared)",
|
||
"asset_photo_url": "Preview image URL (images only, if shared)",
|
||
"asset_playback_url": "Video playback URL (videos only, if shared)",
|
||
"album_name_field": "Album name (in album list)",
|
||
"album_asset_count": "Total assets in album",
|
||
"album_url_field": "Album share URL",
|
||
"album_shared": "Whether album is shared"
|
||
},
|
||
"settings": {
|
||
"titleEmphasis": "options",
|
||
"title": "Settings",
|
||
"description": "Global application settings",
|
||
"general": "General",
|
||
"externalUrl": "External URL",
|
||
"externalUrlHint": "Public URL of this Notify Bridge instance (e.g. https://notify.example.com)",
|
||
"telegram": "Telegram",
|
||
"webhookSecret": "Webhook Secret",
|
||
"webhookSecretHint": "Secret token to verify webhook requests from Telegram",
|
||
"cacheTtl": "URL Cache TTL (hours)",
|
||
"cacheTtlHint": "How long to keep URL-keyed Telegram file_ids (e.g. shared links). Set 0 to disable TTL. The asset cache uses content hashing (thumbhash) and ignores this.",
|
||
"cacheMaxEntries": "Cache Max Entries",
|
||
"cacheMaxEntriesHint": "Upper bound per cache (URL and asset). Oldest entries are evicted first (LRU). Default 5000.",
|
||
"cacheStats": "Cache contents",
|
||
"cacheStatsHint": "Size shown is the total bytes of media originally uploaded to Telegram for cached entries — i.e. approximate re-upload bandwidth the cache is saving. The cache file itself is only a few KB; the media lives on Telegram's servers.",
|
||
"cacheStatsUrl": "URL cache",
|
||
"cacheStatsAsset": "Asset cache",
|
||
"cacheStatsEntries": "entries",
|
||
"cacheStatsEmpty": "empty",
|
||
"cacheStatsOldest": "oldest",
|
||
"cacheStatsNewest": "newest",
|
||
"clearCache": "Clear Media Cache",
|
||
"clearCacheHint": "Delete cached Telegram file_ids. Next send will re-upload media.",
|
||
"clearCacheConfirmTitle": "Clear Telegram cache?",
|
||
"clearCacheConfirm": "This removes all cached Telegram file_ids. Subsequent notifications will re-upload media, which may take longer and use more bandwidth.",
|
||
"clearCacheConfirmBtn": "Clear cache",
|
||
"clearCacheDone": "Telegram cache cleared",
|
||
"timezone": "Timezone",
|
||
"timezoneHint": "IANA timezone (e.g. UTC, Europe/Warsaw, America/New_York). Used to interpret HH:MM fields like quiet hours.",
|
||
"locales": "Template Languages",
|
||
"supportedLocales": "Supported Locales",
|
||
"supportedLocalesHint": "Languages available when authoring notification and command templates. Built-in defaults ship for English and Russian; other languages start empty.",
|
||
"logging": "Logging",
|
||
"logLevel": "Log Level",
|
||
"logLevelHint": "Root log level for the server. Raise to DEBUG while investigating; keep at INFO in production. WARNING/ERROR hide per-command progress lines.",
|
||
"logFormat": "Log Format",
|
||
"logFormatHint": "Output format. 'text' is human-readable; 'json' emits one object per line for log aggregators (Loki, ELK). Changing this requires a server restart.",
|
||
"logLevels": "Per-Module Overrides",
|
||
"logLevelsHint": "Comma-separated 'module=LEVEL' pairs to silence noisy modules or drill into one area. Example: sqlalchemy.engine=WARNING,notify_bridge_core.notifications.telegram.client=DEBUG",
|
||
"saved": "Settings saved"
|
||
},
|
||
"hints": {
|
||
"periodicSummary": "Sends a scheduled summary of all tracked albums at specified times. Great for daily/weekly digests.",
|
||
"scheduledAssets": "Sends random or selected photos from tracked albums on a schedule. Like a daily photo pick.",
|
||
"memoryMode": "\"On This Day\" — sends photos taken on this date in previous years. Nostalgic flashbacks.",
|
||
"memorySource": "Albums: scans tracked albums for date-matching assets. Native: uses Immich's built-in memories (covers entire library, optionally filtered by tracked albums).",
|
||
"quietHours": "Suppress all notifications during this HH:MM window (interpreted in the app timezone). Overnight windows like 22:00–07:00 are supported.",
|
||
"favoritesOnly": "Only include assets marked as favorites.",
|
||
"maxAssets": "Maximum number of asset details to include in a single notification message.",
|
||
"periodicStartDate": "Reference date in the app timezone. The first summary fires at the next configured HH:MM on/after this date, then every N days.",
|
||
"intervalDays": "Days between successive summaries. 1 = daily, 7 = weekly.",
|
||
"times": "Time(s) of day to send notifications, in HH:MM format. Use commas for multiple times: 09:00,18:00",
|
||
"albumMode": "Per album: separate notification per album. Combined: one notification with all albums. Random: pick one album randomly.",
|
||
"scheduledAlbumMode": "How albums are grouped in scheduled deliveries. Default: Per album (one notification per tracked album).",
|
||
"memoryAlbumMode": "How albums are grouped in memory deliveries. Default: Combined (a single notification aggregating matches from all tracked albums).",
|
||
"minRating": "Only include assets with at least this star rating (0 = no filter).",
|
||
"eventMessages": "Templates for real-time event notifications. Use {variables} for dynamic content.",
|
||
"assetFormatting": "How individual assets are formatted within notification messages.",
|
||
"dateLocation": "Date and location formatting in notifications. Uses strftime syntax for dates.",
|
||
"scheduledMessages": "Templates for periodic summaries, scheduled photo picks, and On This Day memories.",
|
||
"aiCaptions": "Use Claude AI to generate a natural-language caption for notifications instead of the template.",
|
||
"maxMedia": "Maximum number of photos/videos to attach per notification (0 = text only).",
|
||
"groupSize": "Telegram media groups can contain 2-10 items. Larger batches are split into chunks.",
|
||
"chunkDelay": "Delay in milliseconds between sending media chunks. Prevents Telegram rate limiting.",
|
||
"maxAssetSize": "Skip assets larger than this size in MB. Telegram limits files to 50 MB.",
|
||
"trackingConfig": "Controls which events trigger notifications and how assets are filtered.",
|
||
"templateConfig": "Controls the message format. Uses default templates if not set.",
|
||
"scanInterval": "How often to poll the provider for changes, in seconds. Lower = faster detection but more API calls.",
|
||
"adaptiveMaxSkip": "Reduces polling when the tracker is idle, to save load on the upstream server. Leave blank or set to 0 for snappy notifications — every tick runs at the configured interval. Set to 2 to allow up to 2× slower polling after ~5 min of silence, or 4 for up to 4× slower polling after ~15 min. Activity resets back to the base rate immediately.",
|
||
"defaultTrackingConfig": "Applied to all linked targets unless overridden per target.",
|
||
"defaultTemplateConfig": "Applied to all linked targets unless overridden per target.",
|
||
"defaultCount": "How many results to return when the user doesn't specify a count (1-20).",
|
||
"responseMode": "Media: send actual photos. Text: send filenames/links only. Media mode uses more bandwidth.",
|
||
"botLocale": "Language for command descriptions in Telegram's menu and bot response messages.",
|
||
"rateLimits": "Cooldown in seconds between uses of each command category per chat. 0 = no limit."
|
||
},
|
||
"matrixBot": {
|
||
"titleEmphasis": "matrix",
|
||
"countLabel": "bots",
|
||
"title": "Matrix Bots",
|
||
"description": "Matrix homeserver connections for room notifications",
|
||
"addBot": "Add Matrix Bot",
|
||
"name": "Name",
|
||
"namePlaceholder": "Home Server Bot",
|
||
"homeserverUrl": "Homeserver URL",
|
||
"accessToken": "Access Token",
|
||
"tokenPlaceholder": "syt_...",
|
||
"tokenUnchanged": "(unchanged)",
|
||
"displayName": "Display Name",
|
||
"testConnection": "Test connection",
|
||
"noBots": "No Matrix bots yet.",
|
||
"confirmDelete": "Delete this Matrix bot?",
|
||
"operationFailed": "Operation failed"
|
||
},
|
||
"emailBot": {
|
||
"titleEmphasis": "email",
|
||
"countLabel": "accounts",
|
||
"title": "Email Bots",
|
||
"description": "SMTP email senders for notifications",
|
||
"addBot": "Add Email Bot",
|
||
"name": "Name",
|
||
"namePlaceholder": "Family Notifications",
|
||
"email": "From Email",
|
||
"smtpHost": "SMTP Host",
|
||
"smtpPort": "Port",
|
||
"smtpUsername": "Username",
|
||
"smtpUsernamePlaceholder": "Same as email or app password",
|
||
"smtpPassword": "Password",
|
||
"passwordUnchanged": "(unchanged)",
|
||
"useTls": "Use TLS/SSL",
|
||
"testConnection": "Send test email",
|
||
"noBots": "No email bots yet.",
|
||
"confirmDelete": "Delete this email bot?",
|
||
"operationFailed": "Operation failed"
|
||
},
|
||
"cmdTemplateConfig": {
|
||
"titleEmphasis": "templates",
|
||
"countLabel": "templates",
|
||
"title": "Command Templates",
|
||
"description": "Customize command response messages with Jinja2 templates",
|
||
"newConfig": "New Config",
|
||
"name": "Name",
|
||
"namePlaceholder": "Default Immich Commands",
|
||
"descriptionPlaceholder": "e.g. Custom response formats for family bot",
|
||
"noConfigs": "No command template configs yet.",
|
||
"confirmDelete": "Delete this command template config?",
|
||
"commandResponses": "Command Responses",
|
||
"commandResponsesHint": "Leave a slot empty to use the default hardcoded response."
|
||
},
|
||
"commandConfig": {
|
||
"titleEmphasis": "configs",
|
||
"countLabel": "configs",
|
||
"title": "Command Configs",
|
||
"description": "Define command settings for Telegram bot interactions",
|
||
"newConfig": "New Config",
|
||
"name": "Name",
|
||
"namePlaceholder": "Default commands",
|
||
"providerType": "Provider Type",
|
||
"enabledCommands": "Enabled Commands",
|
||
"locale": "Locale",
|
||
"responseMode": "Response Mode",
|
||
"modeMedia": "Media (files)",
|
||
"modeText": "Text only",
|
||
"defaultCount": "Default Count",
|
||
"rateLimits": "Rate Limits",
|
||
"searchCooldown": "Search cooldown (s)",
|
||
"defaultCooldown": "Default cooldown (s)",
|
||
"noConfigs": "No command configs yet.",
|
||
"confirmDelete": "Delete this command config?",
|
||
"commands": "commands",
|
||
"responseTemplate": "Response Template",
|
||
"noTemplate": "Default (hardcoded)"
|
||
},
|
||
"commandTracker": {
|
||
"titleEmphasis": "trackers",
|
||
"title": "Command Trackers",
|
||
"description": "Manage command trackers and their listeners",
|
||
"newTracker": "New Tracker",
|
||
"name": "Name",
|
||
"namePlaceholder": "Family commands",
|
||
"provider": "Provider",
|
||
"selectProvider": "Select provider...",
|
||
"commandConfig": "Command Config",
|
||
"selectCommandConfig": "Select command config...",
|
||
"listeners": "Listeners",
|
||
"addListener": "Add Listener",
|
||
"removeListener": "Remove",
|
||
"noTrackers": "No command trackers yet.",
|
||
"confirmDelete": "Delete this command tracker?",
|
||
"enabled": "Enabled",
|
||
"disabled": "Disabled",
|
||
"noListeners": "No listeners attached.",
|
||
"selectBot": "Select bot...",
|
||
"listenerType": "telegram_bot",
|
||
"editScope": "Edit album scope",
|
||
"scopeAll": "derived from notification routing",
|
||
"albumsShort": "albums",
|
||
"scopeTitle": "Album Scope Override for This Bot",
|
||
"scopeDescription": "By default this bot's commands see only the albums that actually deliver notifications to the chats it speaks to (computed from your notification trackers). Set an explicit override here to widen or narrow that set for every chat this bot serves.",
|
||
"scopeInherit": "Inherit: derive from notification routing",
|
||
"noCollections": "No albums available."
|
||
},
|
||
"snackbar": {
|
||
"showDetails": "Show details",
|
||
"hideDetails": "Hide details"
|
||
},
|
||
"timezone": {
|
||
"searchPlaceholder": "Search cities or IANA codes…",
|
||
"detect": "Detect",
|
||
"utc": "UTC",
|
||
"noMatches": "No timezones match"
|
||
},
|
||
"locales": {
|
||
"empty": "No languages selected. Add one below to start authoring templates.",
|
||
"add": "Add language",
|
||
"searchPlaceholder": "Search or type a code (e.g. de-CH)…",
|
||
"customPlaceholder": "or de-CH",
|
||
"addCustom": "Add custom code",
|
||
"noSuggestions": "No matches. Type a valid locale code (2–3 letters).",
|
||
"primary": "Primary",
|
||
"shipped": "Built-in",
|
||
"shippedHint": "Default notification & command templates ship for this language.",
|
||
"makePrimary": "Make primary",
|
||
"moveUp": "Move up",
|
||
"moveDown": "Move down",
|
||
"remove": "Remove",
|
||
"removeLast": "At least one language is required",
|
||
"reorder": "Drag to reorder",
|
||
"orderHint": "First language is the primary fallback when a translation is missing. Drag to reorder."
|
||
},
|
||
"snack": {
|
||
"eventsCleared": "{count} event(s) cleared",
|
||
"providerSaved": "Provider saved",
|
||
"providerDeleted": "Provider deleted",
|
||
"trackerCreated": "Tracker created",
|
||
"trackerUpdated": "Tracker updated",
|
||
"trackerDeleted": "Tracker deleted",
|
||
"trackerPaused": "Tracker paused",
|
||
"trackerResumed": "Tracker resumed",
|
||
"targetSaved": "Target saved",
|
||
"targetDeleted": "Target deleted",
|
||
"targetTestSent": "Test notification sent",
|
||
"templateSaved": "Template config saved",
|
||
"templateDeleted": "Template config deleted",
|
||
"trackingConfigSaved": "Tracking config saved",
|
||
"trackingConfigDeleted": "Tracking config deleted",
|
||
"botRegistered": "Bot registered",
|
||
"botDeleted": "Bot deleted",
|
||
"userCreated": "User created",
|
||
"userDeleted": "User deleted",
|
||
"userUpdated": "User updated",
|
||
"passwordChanged": "Password changed",
|
||
"copied": "Copied to clipboard",
|
||
"genericError": "Something went wrong",
|
||
"commandsSaved": "Commands config saved",
|
||
"commandsSynced": "Commands synced to Telegram",
|
||
"targetLinked": "Target linked",
|
||
"targetUnlinked": "Target unlinked",
|
||
"botUpdated": "Bot updated",
|
||
"commandConfigSaved": "Command config saved",
|
||
"commandConfigDeleted": "Command config deleted",
|
||
"commandTrackerCreated": "Command tracker created",
|
||
"commandTrackerUpdated": "Command tracker updated",
|
||
"commandTrackerDeleted": "Command tracker deleted",
|
||
"commandTrackerEnabled": "Command tracker enabled",
|
||
"commandTrackerDisabled": "Command tracker disabled",
|
||
"listenerAdded": "Listener added",
|
||
"listenerRemoved": "Listener removed",
|
||
"listenerScopeSaved": "Scope updated",
|
||
"cmdTemplateSaved": "Command template saved",
|
||
"cmdTemplateDeleted": "Command template deleted",
|
||
"emailBotCreated": "Email bot created",
|
||
"emailBotUpdated": "Email bot updated",
|
||
"emailBotDeleted": "Email bot deleted",
|
||
"emailBotTestSent": "Test email sent successfully",
|
||
"matrixBotCreated": "Matrix bot created",
|
||
"matrixBotUpdated": "Matrix bot updated",
|
||
"matrixBotDeleted": "Matrix bot deleted",
|
||
"matrixBotTestOk": "Matrix connection verified"
|
||
},
|
||
"common": {
|
||
"loading": "Loading...",
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete",
|
||
"clone": "Clone",
|
||
"edit": "Edit",
|
||
"description": "Description",
|
||
"close": "Close",
|
||
"confirm": "Confirm",
|
||
"cannotDelete": "Cannot delete",
|
||
"blockedByIntro": "Referenced by:",
|
||
"error": "Error",
|
||
"success": "Success",
|
||
"none": "None",
|
||
"noneDefault": "None (default)",
|
||
"loadError": "Failed to load data",
|
||
"headersInvalid": "Invalid JSON",
|
||
"language": "Language",
|
||
"theme": "Theme",
|
||
"apiDocs": "API Docs",
|
||
"light": "Light",
|
||
"dark": "Dark",
|
||
"system": "System",
|
||
"test": "Test",
|
||
"create": "Create",
|
||
"changePassword": "Change Password",
|
||
"currentPassword": "Current password",
|
||
"newPassword": "New password",
|
||
"passwordChanged": "Password changed successfully",
|
||
"expand": "Expand",
|
||
"collapse": "Collapse",
|
||
"syntaxError": "Syntax error",
|
||
"undefinedVar": "Unknown variable",
|
||
"line": "line",
|
||
"enable": "Enable",
|
||
"disable": "Disable",
|
||
"add": "Add",
|
||
"filterByName": "Filter by name...",
|
||
"allTypes": "All types",
|
||
"allProviders": "All providers",
|
||
"noFilterResults": "No items match the current filter.",
|
||
"redirecting": "Redirecting...",
|
||
"noMatches": "No matches",
|
||
"saveFailed": "Save failed",
|
||
"loadFailed": "Failed to load data",
|
||
"dismiss": "Dismiss",
|
||
"systemSuffix": " (System)",
|
||
"search": "Search...",
|
||
"nSelected": "{0} selected",
|
||
"unknown": "Unknown"
|
||
},
|
||
"templateSlot": {
|
||
"message_assets_added": "New assets added to album",
|
||
"message_assets_removed": "Assets removed from album",
|
||
"message_collection_renamed": "Album renamed",
|
||
"message_collection_deleted": "Album deleted",
|
||
"message_sharing_changed": "Sharing status changed",
|
||
"periodic_summary_message": "Periodic album summary",
|
||
"scheduled_assets_message": "Scheduled asset delivery",
|
||
"memory_mode_message": "On This Day memories",
|
||
"message_push": "Code pushed to repository",
|
||
"message_issue_opened": "Issue opened",
|
||
"message_issue_closed": "Issue closed",
|
||
"message_issue_commented": "Comment on issue",
|
||
"message_pr_opened": "Pull request opened",
|
||
"message_pr_closed": "Pull request closed",
|
||
"message_pr_merged": "Pull request merged",
|
||
"message_pr_commented": "Comment on pull request",
|
||
"message_release_published": "Release published",
|
||
"message_scheduled_message": "Scheduled message",
|
||
"message_card_created": "Card created",
|
||
"message_card_updated": "Card updated",
|
||
"message_card_moved": "Card moved between lists",
|
||
"message_card_deleted": "Card deleted",
|
||
"message_card_commented": "Comment added to card",
|
||
"message_comment_updated": "Comment updated",
|
||
"message_board_created": "Board created",
|
||
"message_board_updated": "Board updated",
|
||
"message_board_deleted": "Board deleted",
|
||
"message_list_created": "List created",
|
||
"message_list_updated": "List updated",
|
||
"message_list_deleted": "List deleted",
|
||
"message_attachment_created": "Attachment added to card",
|
||
"message_card_label_added": "Label added to card",
|
||
"message_task_completed": "Task completed",
|
||
"message_ups_online": "UPS back on mains power",
|
||
"message_ups_on_battery": "UPS switched to battery",
|
||
"message_ups_low_battery": "Battery critically low",
|
||
"message_ups_battery_restored": "Battery charge recovered",
|
||
"message_ups_comms_lost": "Communication with UPS lost",
|
||
"message_ups_comms_restored": "Communication with UPS restored",
|
||
"message_ups_replace_battery": "Battery needs replacement",
|
||
"message_ups_overload": "UPS load exceeded capacity"
|
||
},
|
||
"gridDesc": {
|
||
"authNone": "No authentication required",
|
||
"authBearer": "Verify requests with a Bearer token",
|
||
"authHmac": "Verify payload signature with HMAC-SHA256",
|
||
"sortNone": "No sorting applied",
|
||
"sortDate": "Sort by creation date",
|
||
"sortRating": "Sort by star rating",
|
||
"sortName": "Sort by file name",
|
||
"sortRandom": "Randomize order",
|
||
"orderDesc": "Newest or highest first",
|
||
"orderAsc": "Oldest or lowest first",
|
||
"albumModePerAlbum": "One message per album",
|
||
"albumModeCombined": "All albums in one message",
|
||
"albumModeRandom": "Pick a random album",
|
||
"assetTypeAll": "Photos and videos",
|
||
"assetTypePhoto": "Photos only",
|
||
"assetTypeVideo": "Videos only",
|
||
"memorySourceAlbums": "Scan tracked albums for On This Day matches",
|
||
"memorySourceNative": "Use Immich native memories API",
|
||
"localeEn": "English interface",
|
||
"localeRu": "Russian interface",
|
||
"modeMedia": "Send actual photo/video files",
|
||
"modeText": "Send file names and links only",
|
||
"allEvents": "Show all event types",
|
||
"assetsAdded": "New files added to album",
|
||
"assetsRemoved": "Files removed from album",
|
||
"renamed": "Album was renamed",
|
||
"deleted": "Album was deleted",
|
||
"sharingChanged": "Album sharing toggled",
|
||
"actionSuccess": "Scheduled action completed",
|
||
"actionPartial": "Scheduled action partially succeeded",
|
||
"actionFailed": "Scheduled action failed",
|
||
"newestFirst": "Most recent events on top",
|
||
"oldestFirst": "Oldest events on top",
|
||
"chatActionNone": "No indicator shown",
|
||
"chatActionTyping": "Show typing... bubble",
|
||
"chatActionUploadPhoto": "Show uploading photo...",
|
||
"chatActionUploadVideo": "Show uploading video...",
|
||
"chatActionUploadDoc": "Show uploading document...",
|
||
"chatActionRecordVideo": "Show recording video...",
|
||
"chatActionRecordVoice": "Show recording voice...",
|
||
"previewTelegram": "Preview with Telegram HTML format",
|
||
"previewWebhook": "Preview as plain text",
|
||
"previewEmail": "Preview with email HTML format",
|
||
"previewDiscord": "Preview with Discord markdown",
|
||
"previewSlack": "Preview with Slack markdown",
|
||
"previewNtfy": "Preview as ntfy notification",
|
||
"previewMatrix": "Preview with Matrix HTML format",
|
||
"providerImmich": "Self-hosted photo server",
|
||
"providerGitea": "Self-hosted Git service",
|
||
"providerPlanka": "Self-hosted Kanban board",
|
||
"providerScheduler": "Time-based scheduled messages",
|
||
"providerNut": "Network UPS monitoring",
|
||
"providerGooglePhotos": "Google Photos albums & shared libraries",
|
||
"providerWebhook": "Receive events via HTTP POST"
|
||
},
|
||
"webhookLogs": {
|
||
"title": "Recent Payloads",
|
||
"empty": "No payloads recorded yet",
|
||
"clear": "Clear history",
|
||
"confirmClear": "Clear all stored payloads for this provider?",
|
||
"statusMatched": "Matched",
|
||
"statusUnmatched": "Unmatched",
|
||
"statusError": "Error",
|
||
"headers": "Headers",
|
||
"body": "Request Body",
|
||
"extractedFields": "Extracted Fields",
|
||
"errorMessage": "Error",
|
||
"cleared": "Payload history cleared"
|
||
},
|
||
"error": {
|
||
"notFound": "Page not found",
|
||
"goHome": "Go home"
|
||
},
|
||
"searchPalette": {
|
||
"placeholder": "Search entities...",
|
||
"noResults": "No results found",
|
||
"typeToSearch": "Start typing to search",
|
||
"navigate": "navigate",
|
||
"open": "open",
|
||
"close": "close"
|
||
},
|
||
"actions": {
|
||
"titleEmphasis": "automations",
|
||
"countLabel": "actions",
|
||
"title": "Actions",
|
||
"description": "Scheduled mutations on external services",
|
||
"addAction": "Add Action",
|
||
"noActions": "No actions configured yet.",
|
||
"provider": "Provider",
|
||
"selectProvider": "Select provider...",
|
||
"actionType": "Action Type",
|
||
"name": "Name",
|
||
"schedule": "Schedule",
|
||
"interval": "Interval",
|
||
"cronMode": "Cron expression",
|
||
"seconds": "seconds",
|
||
"cronHint": "Standard cron expression (e.g. 0 3 * * * for daily at 3 AM)",
|
||
"enabled": "Enabled",
|
||
"rules": "rules",
|
||
"addRule": "Add Rule",
|
||
"ruleName": "Rule Name",
|
||
"ruleNamePlaceholder": "e.g. Alice → Family Album",
|
||
"unnamedRule": "Unnamed rule",
|
||
"noRules": "No rules yet. Add a rule to define what this action does.",
|
||
"on": "ON",
|
||
"off": "OFF",
|
||
"criteria": "Criteria",
|
||
"persons": "Persons",
|
||
"addPerson": "Add person...",
|
||
"excludePersons": "Exclude persons",
|
||
"addExcludePerson": "Add person to exclude...",
|
||
"searchQuery": "Smart Search Query",
|
||
"searchQueryPlaceholder": "e.g. sunset, beach, birthday...",
|
||
"assetType": "Asset type",
|
||
"dateFrom": "From date",
|
||
"dateTo": "To date",
|
||
"favoritesOnly": "Favorites only",
|
||
"targetAlbum": "Target Album",
|
||
"selectAlbum": "Album",
|
||
"selectAlbumPlaceholder": "Select album",
|
||
"albumId": "Album ID",
|
||
"createAlbumIfMissing": "Create album if it doesn't exist",
|
||
"newAlbumName": "New album name",
|
||
"execute": "Execute",
|
||
"dryRun": "Dry Run",
|
||
"history": "History",
|
||
"affected": "affected",
|
||
"executeResult": "Action executed: {affected} items affected",
|
||
"dryRunResult": "Dry run: {affected} items would be affected",
|
||
"saved": "Action saved",
|
||
"deleted": "Action deleted",
|
||
"ruleSaved": "Rule saved",
|
||
"ruleDeleted": "Rule deleted",
|
||
"confirmDelete": "Are you sure you want to delete this action? All rules and execution history will be lost.",
|
||
"loadError": "Failed to load actions",
|
||
"noExecutions": "No executions yet.",
|
||
"triggerManual": "manual",
|
||
"triggerDryRun": "dry-run",
|
||
"triggerScheduled": "scheduled"
|
||
},
|
||
"backup": {
|
||
"titleEmphasis": "& restore",
|
||
"title": "Backup & Restore",
|
||
"description": "Export and import your configuration, or set up automatic backups",
|
||
"export": "Export Configuration",
|
||
"exportDescription": "Download your configuration as a JSON file. Select which categories to include.",
|
||
"import": "Import Configuration",
|
||
"importDescription": "Upload a previously exported backup file to restore configuration.",
|
||
"categories": "Categories",
|
||
"selectAll": "Select all",
|
||
"deselectAll": "Deselect all",
|
||
"catProviders": "Providers",
|
||
"catTelegramBots": "Telegram Bots",
|
||
"catMatrixBots": "Matrix Bots",
|
||
"catEmailBots": "Email Bots",
|
||
"catTargets": "Targets",
|
||
"catTrackingConfigs": "Tracking Configs",
|
||
"catTemplateConfigs": "Template Configs",
|
||
"catCommandConfigs": "Command Configs",
|
||
"catCommandTemplateConfigs": "Cmd Template Configs",
|
||
"catNotificationTrackers": "Notif. Trackers",
|
||
"catCommandTrackers": "Cmd Trackers",
|
||
"catActions": "Actions",
|
||
"catAppSettings": "App Settings",
|
||
"secretsMode": "Secrets",
|
||
"secretsExclude": "Exclude secrets (safe)",
|
||
"secretsMasked": "Mask secrets (for review)",
|
||
"secretsInclude": "Include secrets (plaintext)",
|
||
"secretsWarningExport": "Warning: The export file will contain sensitive data (API keys, tokens, passwords) in plaintext.",
|
||
"exportBtn": "Export",
|
||
"exportSuccess": "Configuration exported",
|
||
"validateBtn": "Validate",
|
||
"validating": "Validating...",
|
||
"validationPassed": "Validation passed",
|
||
"validationFailed": "Validation failed",
|
||
"entities": "Entities",
|
||
"conflictMode": "Conflict resolution",
|
||
"conflictSkip": "Skip existing (keep current)",
|
||
"conflictRename": "Rename duplicates (add suffix)",
|
||
"conflictOverwrite": "Overwrite existing (replace)",
|
||
"importBtn": "Import",
|
||
"importing": "Importing...",
|
||
"importSuccess": "Configuration imported",
|
||
"importResults": "Import Results",
|
||
"resultCreated": "Created",
|
||
"resultSkipped": "Skipped",
|
||
"resultOverwritten": "Overwritten",
|
||
"resultErrors": "Errors",
|
||
"confirmExportTitle": "Export with secrets?",
|
||
"confirmExportMessage": "The exported file will contain all secrets (API keys, bot tokens, passwords) in plaintext. Only use this for secure transfers or trusted storage.",
|
||
"confirmImportTitle": "Import configuration?",
|
||
"confirmImportMessage": "This will create new entities in your database. Make sure you have validated the backup file first.",
|
||
"scheduled": "Scheduled Backups",
|
||
"enableScheduled": "Enable automatic backups",
|
||
"interval": "Interval",
|
||
"hours": "hours",
|
||
"retention": "Keep last",
|
||
"scheduleSaved": "Backup schedule saved",
|
||
"savedFiles": "Saved Backups",
|
||
"noFiles": "No backup files yet.",
|
||
"download": "Download",
|
||
"fileDeleted": "Backup file deleted",
|
||
"createManual": "Create backup",
|
||
"manualCreated": "Backup created",
|
||
"pendingTitle": "Restore pending — restart to apply",
|
||
"pendingBy": "Uploaded by {by}",
|
||
"pendingAt": "at {at}",
|
||
"pendingCancelled": "Pending restore cancelled",
|
||
"restorePrepared": "Restore prepared",
|
||
"restoreApplyPrompt": "Apply the restore now (the backend will restart) or later on the next natural restart?",
|
||
"applyLater": "Apply later",
|
||
"restartNow": "Restart now",
|
||
"restartingTitle": "Restarting backend…",
|
||
"restartingDescription": "The page will reload once the server is back online."
|
||
}
|
||
} |