All checks were successful
Validate / Hassfest (push) Successful in 4s
- Add TelegramChat model (bot_id, chat_id, title, type, username) - Chats auto-saved when bot receives webhook messages - New API: GET/DELETE chats, POST discover (merges from getUpdates) - Cascade delete chats when bot is deleted - Frontend: click chat row to copy chat ID to clipboard - Frontend: delete button per chat, "Discover chats" sync button - Add 4 i18n keys (EN/RU) for chat management Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
427 lines
16 KiB
JSON
427 lines
16 KiB
JSON
{
|
|
"app": {
|
|
"name": "Immich Watcher",
|
|
"tagline": "Album notifications"
|
|
},
|
|
"nav": {
|
|
"dashboard": "Dashboard",
|
|
"servers": "Servers",
|
|
"trackers": "Trackers",
|
|
"trackingConfigs": "Tracking",
|
|
"templateConfigs": "Templates",
|
|
"telegramBots": "Bots",
|
|
"targets": "Targets",
|
|
"users": "Users",
|
|
"logout": "Logout"
|
|
},
|
|
"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 6 characters",
|
|
"loginWithImmich": "Login with Immich",
|
|
"or": "or"
|
|
},
|
|
"dashboard": {
|
|
"title": "Dashboard",
|
|
"description": "Overview of your Immich Watcher setup",
|
|
"servers": "Servers",
|
|
"activeTrackers": "Active Trackers",
|
|
"targets": "Targets",
|
|
"recentEvents": "Recent Events",
|
|
"noEvents": "No events yet. Create a tracker to start monitoring albums.",
|
|
"loading": "Loading..."
|
|
},
|
|
"servers": {
|
|
"title": "Servers",
|
|
"description": "Manage Immich server connections",
|
|
"addServer": "Add Server",
|
|
"cancel": "Cancel",
|
|
"name": "Name",
|
|
"url": "Immich URL",
|
|
"urlPlaceholder": "http://immich:2283",
|
|
"apiKey": "API Key",
|
|
"apiKeyKeep": "API Key (leave empty to keep current)",
|
|
"connecting": "Connecting...",
|
|
"noServers": "No servers configured yet.",
|
|
"delete": "Delete",
|
|
"confirmDelete": "Delete this server?",
|
|
"online": "Online",
|
|
"offline": "Offline",
|
|
"checking": "Checking...",
|
|
"loadError": "Failed to load servers."
|
|
},
|
|
"trackers": {
|
|
"title": "Trackers",
|
|
"description": "Monitor albums for changes",
|
|
"newTracker": "New Tracker",
|
|
"cancel": "Cancel",
|
|
"name": "Name",
|
|
"namePlaceholder": "Family photos tracker",
|
|
"server": "Server",
|
|
"selectServer": "Select server...",
|
|
"albums": "Albums",
|
|
"eventTypes": "Event Types",
|
|
"notificationTargets": "Notification Targets",
|
|
"scanInterval": "Scan Interval (seconds)",
|
|
"createTracker": "Create Tracker",
|
|
"noTrackers": "No trackers yet. Add a server first, then create a tracker.",
|
|
"active": "Active",
|
|
"paused": "Paused",
|
|
"pause": "Pause",
|
|
"resume": "Resume",
|
|
"delete": "Delete",
|
|
"confirmDelete": "Delete this tracker?",
|
|
"albums_count": "album(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"
|
|
},
|
|
"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 destinations (Telegram, webhooks)",
|
|
"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"
|
|
},
|
|
"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",
|
|
"confirmDelete": "Delete this user?",
|
|
"joined": "joined"
|
|
},
|
|
"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 result count",
|
|
"responseMode": "Response mode",
|
|
"modeMedia": "Media (send photos)",
|
|
"modeText": "Text (send links)",
|
|
"botLocale": "Bot language",
|
|
"rateLimits": "Rate Limits",
|
|
"rateSearch": "Search cooldown",
|
|
"rateFind": "Find cooldown",
|
|
"rateDefault": "Default cooldown",
|
|
"syncCommands": "Sync to Telegram",
|
|
"discoverChats": "Discover chats from Telegram",
|
|
"clickToCopy": "Click to copy chat ID",
|
|
"chatsDiscovered": "Chats discovered",
|
|
"chatDeleted": "Chat removed"
|
|
},
|
|
"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.",
|
|
"eventTracking": "Event Tracking",
|
|
"assetsAdded": "Assets added",
|
|
"assetsRemoved": "Assets removed",
|
|
"albumRenamed": "Album renamed",
|
|
"albumDeleted": "Album deleted",
|
|
"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)",
|
|
"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"
|
|
},
|
|
"templateConfig": {
|
|
"title": "Template Configs",
|
|
"description": "Define how notification messages are formatted",
|
|
"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",
|
|
"assetFormatting": "Asset Formatting",
|
|
"imageTemplate": "Image item",
|
|
"videoTemplate": "Video item",
|
|
"assetsWrapper": "Assets wrapper",
|
|
"moreMessage": "More message",
|
|
"peopleFormat": "People format",
|
|
"dateLocation": "Date & Location",
|
|
"dateFormat": "Date 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?"
|
|
},
|
|
"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' or 'webhook'",
|
|
"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"
|
|
},
|
|
"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.",
|
|
"favoritesOnly": "Only include assets marked as favorites in Immich.",
|
|
"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 Immich server for changes, in seconds. Lower = faster detection but more API calls.",
|
|
"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."
|
|
},
|
|
"snack": {
|
|
"serverSaved": "Server saved",
|
|
"serverDeleted": "Server 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",
|
|
"passwordChanged": "Password changed",
|
|
"copied": "Copied to clipboard",
|
|
"genericError": "Something went wrong",
|
|
"commandsSaved": "Commands config saved",
|
|
"commandsSynced": "Commands synced to Telegram"
|
|
},
|
|
"common": {
|
|
"loading": "Loading...",
|
|
"save": "Save",
|
|
"cancel": "Cancel",
|
|
"delete": "Delete",
|
|
"edit": "Edit",
|
|
"description": "Description",
|
|
"close": "Close",
|
|
"confirm": "Confirm",
|
|
"error": "Error",
|
|
"success": "Success",
|
|
"none": "None",
|
|
"noneDefault": "None (default)",
|
|
"loadError": "Failed to load data",
|
|
"headersInvalid": "Invalid JSON",
|
|
"language": "Language",
|
|
"theme": "Theme",
|
|
"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"
|
|
}
|
|
}
|