Files
haos-hacs-immich-album-watcher/frontend/src/lib/i18n/en.json
alexei.dolgolyov 482f54d620
All checks were successful
Validate / Hassfest (push) Successful in 4s
Persist Telegram chats in DB, auto-save from webhooks, click-to-copy
- 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>
2026-03-19 21:45:20 +03:00

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"
}
}