2be608ba95
Cache engine: - TelegramFileCache: configurable max_entries (LRU cap applies in both TTL and thumbhash modes), ttl_seconds<=0 disables TTL, stats() method. - Dispatcher builds an asset.id -> thumbhash resolver from event.added_assets (Immich populates thumbhash in extra) and passes it to TelegramClient, so asset-cache entries invalidate on visual change rather than age. - Watcher wires app settings into cache init: URL cache = TTL + LRU cap, asset cache = thumbhash + LRU cap. Adds soft-reset (in-memory only) used when cache params change. Settings: - New key telegram_asset_cache_max_entries (default 5000). - telegram_cache_ttl_hours default bumped 48 -> 720 (30d); now URL-only. - PUT /settings resets in-memory caches when cache keys change (files kept). - New endpoints: GET/POST /settings/telegram-cache/stats and /clear. Settings page: - Cache stats card (count + size + oldest/newest per bucket) with a hint explaining that the size is cumulative uploaded-to-Telegram bytes. - Clear-cache button behind a confirm modal. - New TimezoneSelector + LocaleSelector components replace raw inputs. - max-entries input, TTL range updated (0..8760, 0 = disabled). Mobile nav: - "More" panel now mirrors the full sidebar tree (groups + subnodes) so every destination is reachable on mobile; previously flat hand-picked list. - Nav height uses env(safe-area-inset-bottom); panel bottom + z-index fixed so content can't visually overlay the bottom bar. A11y / DOM warnings: - Password-change form has a hidden username field for password-manager association; autocomplete hints on all three password inputs. - Telegram webhook secret wrapped in a no-op form + autocomplete=off. Bug fix: - update_settings used any(await ... for ...) which raised TypeError at runtime (async generator not an iterator); replaced with explicit loop.
1213 lines
48 KiB
JSON
1213 lines
48 KiB
JSON
{
|
||
"app": {
|
||
"name": "Notify Bridge",
|
||
"tagline": "Service notifications"
|
||
},
|
||
"nav": {
|
||
"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"
|
||
},
|
||
"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",
|
||
"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"
|
||
},
|
||
"providers": {
|
||
"title": "Providers",
|
||
"description": "Manage service provider connections",
|
||
"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 Trackers",
|
||
"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...",
|
||
"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",
|
||
"batchDuration": "Batch duration (seconds)",
|
||
"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",
|
||
"checkingLinks": "Checking links...",
|
||
"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": {
|
||
"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": {
|
||
"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": {
|
||
"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",
|
||
"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": {
|
||
"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"
|
||
},
|
||
"templateConfig": {
|
||
"title": "Template Configs",
|
||
"description": "Define how notification messages are formatted",
|
||
"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"
|
||
},
|
||
"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": {
|
||
"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.",
|
||
"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": "The reference date for calculating periodic intervals. Summaries are sent every N days from this date.",
|
||
"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.",
|
||
"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.",
|
||
"batchDuration": "Time to accumulate changes before dispatching notifications. 0 = send 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": {
|
||
"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": {
|
||
"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": {
|
||
"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": {
|
||
"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": {
|
||
"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)…",
|
||
"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": {
|
||
"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": {
|
||
"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."
|
||
}
|
||
} |