79a6f26c2f
The tab order was Watch, Search, Feed, Browse, Downloads, and the app opened on Watch -- which is where the other tabs send you, not somewhere you start. It is now Feed, Search, Browse, Downloads, Watch, with icons. Routing is unaffected: _tab_index_of resolves by widget identity, not position. Refresh-on-open needed care rather than a call in showEvent. A local refresh is one yt-dlp subprocess per subscribed channel, serially, so it is braked four ways: only channels not seen for feed.auto_refresh_on_open_minutes (30, 0 to disable), at most eight per visit, once per interval per session, and after a delay so it does not race the tab transition or first-run setup. The cached feed is already on screen throughout. That is a new config key rather than the dead auto_refresh_minutes, because existing configs store that as 0 and would have read as opting out of a feature that did not exist yet. SmoothTabWidget gained the currentChanged signal, icons and a corner slot it never had. Its set_current_index needed a re-entrancy flag, not just an index check: setting the tab bar's index emits its currentChanged straight back into the same method, and at that point the stack has not moved, so every switch fired the activation hook twice. The grid was cleared and rebuilt after every channel finished -- flicker, lost scroll position and every thumbnail re-read from disk each time. merge_entries keeps existing cards. While there, _relayout was re-adding cards the layout already owned, so layout items accumulated on every Load more, and the resize check compared against columnCount(), which never shrinks, so it relaid out on every resize event. Smaller things this exposed: feed errors were written into the label the next success overwrote, so failures were invisible; switching to account mode left the local videos on screen; cancel() had no callers, so a refresh outlived the tab and the window; Browse's Subscribe never said Unsubscribe though it toggles; "Play all" queued one page while claiming otherwise; and the feed sorted publish times against wall-clock fetch times in one COALESCE, so the last-refreshed channel floated to the top. Feed is the first thing seen now, so an empty one says what to do about it instead of showing a bare grid. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
763 lines
38 KiB
JSON
763 lines
38 KiB
JSON
{
|
|
"language": {
|
|
"display_name": "English",
|
|
"select_language": "Select language:",
|
|
"current_language": "Current language: {language}",
|
|
"restart_required": "Language changes will take effect after restarting the application.",
|
|
"english": "English",
|
|
"spanish": "Español (Spanish)",
|
|
"portuguese": "Português (Portuguese)",
|
|
"russian": "Русский (Russian)",
|
|
"chinese": "中文 (简体) (Chinese Simplified)",
|
|
"german": "Deutsch (German)",
|
|
"french": "Français (French)",
|
|
"hindi": "हिन्दी (Hindi)",
|
|
"indonesian": "Bahasa Indonesia (Indonesian)",
|
|
"turkish": "Türkçe (Turkish)",
|
|
"polish": "Polski (Polish)",
|
|
"italian": "Italiano (Italian)",
|
|
"arabic": "العربية (Arabic)",
|
|
"japanese": "日本語 (Japanese)",
|
|
"help_text": "Select your preferred language for the interface.",
|
|
"restart_notice": "Language change will take effect after restarting the application."
|
|
},
|
|
"app": {
|
|
"title": "SageTube",
|
|
"version": "v{version}",
|
|
"ready": "Ready"
|
|
},
|
|
"formats": {
|
|
"show_formats": "Show Formats:",
|
|
"video_format": "Video Format:",
|
|
"audio_format": "Audio Format:",
|
|
"no_formats": "No formats available",
|
|
"loading": "Loading formats...",
|
|
"select": "Select",
|
|
"quality": "Quality",
|
|
"extension": "Extension",
|
|
"resolution": "Resolution",
|
|
"file_size": "File Size",
|
|
"codec": "Codec",
|
|
"audio": "Audio",
|
|
"fps": "FPS",
|
|
"hdr": "HDR",
|
|
"will_merge_audio": "Will merge audio",
|
|
"has_audio": "✓ Has Audio",
|
|
"audio_only": "Audio Only",
|
|
"best_4k": "Best (4K)",
|
|
"best_2k": "Best (2K)",
|
|
"high_1080p": "High (1080p)",
|
|
"high_720p": "High (720p)",
|
|
"medium_480p": "Medium (480p)",
|
|
"low_quality": "Low Quality",
|
|
"best_audio": "Best Audio",
|
|
"high_audio": "High Audio",
|
|
"medium_audio": "Medium Audio",
|
|
"low_audio": "Low Audio",
|
|
"audio_only_resolution": "Audio only"
|
|
},
|
|
"buttons": {
|
|
"download": "Download",
|
|
"pause": "Pause",
|
|
"resume": "Resume",
|
|
"cancel": "Cancel",
|
|
"browse": "Browse",
|
|
"clear": "Clear",
|
|
"ok": "OK",
|
|
"apply": "Apply",
|
|
"close": "Close",
|
|
"run_command": "Run Command",
|
|
"custom_command_help": "Help",
|
|
"about": "About",
|
|
"history": "History",
|
|
"analyze": "Analyze",
|
|
"paste_url": "Paste URL",
|
|
"select_videos": "Select Videos...",
|
|
"video": "Video",
|
|
"audio_only": "Audio Only",
|
|
"custom_options": "Custom Options",
|
|
"trim_video": "Trim Video",
|
|
"download_settings": "Download Settings",
|
|
"update": "Update yt-dlp",
|
|
"select_defaults": "Select Defaults",
|
|
"select_all": "Select All",
|
|
"deselect_all": "Deselect All",
|
|
"open_folder": "Open folder location",
|
|
"save_playlist": "Save Playlist As",
|
|
"reset": "Reset"
|
|
},
|
|
"dialogs": {
|
|
"custom_options": "Custom Options",
|
|
"settings": "Settings",
|
|
"select_folder": "Select Download Folder",
|
|
"sponsorblock_categories": "SponsorBlock Categories",
|
|
"sponsorblock_description": "Select which types of video segments to automatically remove during download.\nSponsorBlock uses community-submitted data to identify these segments.",
|
|
"select_subtitles": "Select Subtitles",
|
|
"filter_languages_placeholder": "Filter languages (e.g., en, es)...",
|
|
"filter_playlist_placeholder": "Filter videos...",
|
|
"no_subtitles_available": "No subtitles available",
|
|
"matching": "matching",
|
|
"ytdlp_log_title": "yt-dlp Log"
|
|
},
|
|
"tabs": {
|
|
"cookies": "Login with Cookies",
|
|
"custom_command": "Custom Command",
|
|
"proxy": "Proxy",
|
|
"language": "Language",
|
|
"updater": "Updater"
|
|
},
|
|
"cookies": {
|
|
"help_text": "Choose how to provide cookies for logging in.\nThis allows downloading of private videos and premium quality audio.",
|
|
"cookie_source": "Cookie Source",
|
|
"use_cookie_file": "Use cookie file",
|
|
"extract_from_browser": "Extract from browser",
|
|
"recommended": "Recommended",
|
|
"cookie_file": "Cookie File",
|
|
"cookie_file_placeholder": "Path to cookies.txt file...",
|
|
"browser_selection": "Browser Selection",
|
|
"browser_help": "Select the browser to extract cookies from:",
|
|
"browser_label": "Browser:",
|
|
"profile_label": "Profile:",
|
|
"profile_placeholder": "default",
|
|
"browser_extract_message": "Browser cookies will be extracted when applied",
|
|
"file_selected_message": "Cookie file selected - Click OK to apply",
|
|
"select_file_title": "Select Cookie File",
|
|
"file_filter": "Cookies files (*.txt *.lwp)",
|
|
"file_selected_title": "Cookie File Applied",
|
|
"file_applied_message": "Cookie file applied: {path}",
|
|
"browser_selected_title": "Browser Cookies Applied",
|
|
"browser_applied_message": "Browser cookies will be extracted from: {browser}",
|
|
"cleared_title": "Cookies Cleared",
|
|
"cleared_message": "Cookie settings have been cleared",
|
|
"active_browser": "✓ Active: Browser cookies ({browser})",
|
|
"active_file": "✓ Active: Cookie file ({file})",
|
|
"none_active": "○ No cookies active",
|
|
"remember_settings": "Remember cookie settings on next startup"
|
|
},
|
|
"custom_command": {
|
|
"help_text": "Enter your custom yt-dlp command below. The current URL will be appended automatically.<br><br>For the full list of options and usage examples, <a href=\"{docs_url}\">click here to view the official yt-dlp documentation</a>.<br><br>Note: Download path and filename template will be handled automatically.",
|
|
"input_label": "yt-dlp Arguments:",
|
|
"input_placeholder": "Enter yt-dlp arguments here...\n\ne.g. --extract-audio --audio-format mp3",
|
|
"output_label": "Command Output:",
|
|
"output_placeholder": "Command output will appear here...",
|
|
"command_placeholder": "Enter custom yt-dlp command...",
|
|
"command_help": "Available placeholders:\n{url} - Video URL\n{output} - Output directory\n\nExample: --write-info-json --write-thumbnail",
|
|
"full_command": "🔧 Full command: {command}",
|
|
"command_success": "✅ Custom command completed successfully!",
|
|
"command_failed": "❌ Command failed with exit code {code}",
|
|
"command_error": "❌ Error running custom command: {error}",
|
|
"error_no_url": "❌ Error: No URL provided. Please enter a URL in the main window.",
|
|
"error_no_command": "❌ Error: No command provided. Please enter yt-dlp arguments.",
|
|
"executing": "🚀 Executing custom yt-dlp command",
|
|
"url_label": "📍 URL: {url}",
|
|
"args_label": "⚙️ Arguments: {command}",
|
|
"download_path_label": "📁 Download path: {path}",
|
|
"separator": "=================================================="
|
|
},
|
|
"proxy": {
|
|
"help_text": "Configure proxy settings for downloading. Leave empty to use direct connection.",
|
|
"main_proxy": "Main Proxy",
|
|
"main_proxy_help": "Primary proxy server for all downloads. Supports HTTP/HTTPS and SOCKS5 protocols.",
|
|
"proxy_url_label": "Proxy URL:",
|
|
"proxy_url_placeholder": "http://proxy:port or socks5://proxy:port",
|
|
"proxy_examples": "Examples:\n• HTTP: http://proxy.example.com:8080\n• SOCKS5: socks5://proxy.example.com:1080",
|
|
"geo_proxy": "Geo-bypass Proxy",
|
|
"geo_proxy_help": "Secondary proxy specifically for bypassing geographic restrictions.",
|
|
"geo_proxy_url_label": "Geo-bypass Proxy URL:",
|
|
"geo_proxy_url_placeholder": "http://geo-proxy:port",
|
|
"clear_main_proxy": "Clear Main Proxy",
|
|
"clear_geo_proxy": "Clear Geo Proxy",
|
|
"proxy_url": "Proxy URL",
|
|
"proxy_placeholder": "http://proxy:port or socks5://proxy:port",
|
|
"geo_bypass": "Geo-bypass proxy (for geographic restrictions)",
|
|
"geo_bypass_placeholder": "http://proxy:port for bypassing geo-blocks",
|
|
"invalid_main_url": "Invalid main proxy URL format",
|
|
"invalid_geo_url": "Invalid geo proxy URL format",
|
|
"main_configured": "Main proxy configured",
|
|
"geo_configured": "Geo proxy configured",
|
|
"set_title": "Proxy Set",
|
|
"set_message": "Main proxy set and saved: {proxy}",
|
|
"geo_set_title": "Geo Proxy Set",
|
|
"geo_set_message": "Geo-verification proxy set and saved: {proxy}",
|
|
"cleared_title": "Proxy Settings Cleared",
|
|
"cleared_message": "All proxy settings have been cleared and saved.",
|
|
"saved_main": "Saved main proxy: {proxy}",
|
|
"saved_geo": "Saved geo proxy: {proxy}"
|
|
},
|
|
"download": {
|
|
"preparing": "Preparing download...",
|
|
"starting": "🚀 Starting download...",
|
|
"fetching_info": "🔍 Fetching video information...",
|
|
"preparing_streams": "🎯 Preparing video streams...",
|
|
"downloading_audio": "⏬ Downloading audio...",
|
|
"downloading_video": "⏬ Downloading video...",
|
|
"downloading_subtitle": "⏬ Downloading subtitle...",
|
|
"downloading": "⏬ Downloading...",
|
|
"completed": "✅ Download completed!",
|
|
"video_completed": "✅ Video download completed!",
|
|
"audio_completed": "✅ Audio download completed!",
|
|
"subtitle_completed": "✅ Subtitle download completed!",
|
|
"completed_cleaning": "✅ Download completed! Cleaning up...",
|
|
"cancelled": "Download cancelled",
|
|
"processing_playlist": "📋 Processing playlist data...",
|
|
"paused": "Download paused",
|
|
"resumed": "Download resumed",
|
|
"merging_formats": "✨ Post-processing: Merging formats...",
|
|
"removing_sponsor_segments": "✨ Post-processing: Removing sponsor segments...",
|
|
"speed": "Speed",
|
|
"eta": "ETA",
|
|
"please_enter_url": "Please enter a URL first.",
|
|
"please_set_path": "Please set a download path first.",
|
|
"please_enter_url_and_path": "Please enter a URL and set download path.",
|
|
"please_select_format": "Please select a format first.",
|
|
"downloading_fallback": "⚡ Downloading..."
|
|
},
|
|
"update": {
|
|
"title": "Update yt-dlp",
|
|
"checking": "Checking for updates...",
|
|
"update_available": "Update available!\nCurrent version: {current}\nLatest version: {latest}",
|
|
"up_to_date": "yt-dlp is up to date (version {version})",
|
|
"already_up_to_date": "✅ yt-dlp is already up to date!",
|
|
"could_not_determine": "Could not determine versions.",
|
|
"error_comparing": "Error comparing versions: {error}",
|
|
"update_available_failed": "Update available! (Comparison failed)\nCurrent: {current}\nLatest: {latest}",
|
|
"updating": "Updating...",
|
|
"initializing": "🚀 Initializing update process...",
|
|
"checking_current": "🔍 Checking current installation...",
|
|
"found_at": "📍 Found yt-dlp at: {path}",
|
|
"error_getting_path": "❌ Error getting yt-dlp path: {error}",
|
|
"updating_binary": "📦 Updating app-managed yt-dlp binary...",
|
|
"update_failed": "❌ Failed to update yt-dlp. Please try again or check your internet connection.",
|
|
"binary_updated": "✅ Binary successfully updated!",
|
|
"update_failed_stderr": "❌ yt-dlp update failed: {error}",
|
|
"update_timeout": "❌ yt-dlp update timed out.",
|
|
"unexpected_error": "❌ Unexpected error during update: {error}",
|
|
"update_success": "✅ yt-dlp has been successfully updated!",
|
|
"already_latest": "yt-dlp is up to date (version {version})",
|
|
"network_error": "❌ Network error during update: {error}",
|
|
"general_error": "❌ Update failed: {error}",
|
|
"update_in_progress_title": "Update in Progress",
|
|
"update_in_progress_message": "yt-dlp is currently updating. Please wait a moment."
|
|
},
|
|
"about": {
|
|
"title": "About SageTube",
|
|
"version": "Version {version}",
|
|
"description": "Watch-first YouTube client with embedded mpv playback and yt-dlp downloading. Fork of YTSage by oop7 (MIT).",
|
|
"author": "By: {author}",
|
|
"github": "GitHub: {repo}",
|
|
"system_info": "System Information",
|
|
"loading": "🔄 Loading system information...",
|
|
"refresh": "🔄",
|
|
"open_logs": "📂 Logs",
|
|
"logs_tooltip": "Open application logs folder",
|
|
"refreshing": "🔄 Refreshing...",
|
|
"refresh_failed": "Refresh Failed",
|
|
"refresh_failed_message": "Could not refresh version information.",
|
|
"detected": "✓ Detected",
|
|
"missing": "✗ Missing",
|
|
"not_available": "Not Available"
|
|
},
|
|
"time_range": {
|
|
"title": "Trim Video",
|
|
"time_range_group": "Time Range",
|
|
"start_time": "Start Time (HH:MM:SS)",
|
|
"end_time": "End Time (HH:MM:SS)",
|
|
"start_placeholder": "00:00:00",
|
|
"end_placeholder": "00:00:00",
|
|
"start_time_placeholder": "Start time (HH:MM:SS)",
|
|
"end_time_placeholder": "End time (HH:MM:SS)",
|
|
"force_keyframes": "Force keyframes at cut points",
|
|
"help_text": "Set the start and end times to trim the video.\nLeave empty to download the full video.",
|
|
"invalid_format": "Invalid time format. Use HH:MM:SS format.",
|
|
"start_after_end": "Start time cannot be after end time."
|
|
},
|
|
"settings": {
|
|
"title": "Download Settings",
|
|
"download_path": "Download Path",
|
|
"browse": "Browse...",
|
|
"speed_limit": "Speed Limit",
|
|
"speed_limit_placeholder": "None",
|
|
"generic_mode": "Generic Mode",
|
|
"enable_generic_mode": "Enable Generic Mode (support non-YouTube sites)",
|
|
"generic_mode_help": "Allows downloading from Dailymotion, CBC Gem, and other sites supported by yt-dlp.",
|
|
"auto_update_ytdlp": "Auto-Update yt-dlp",
|
|
"enable_auto_updates": "Enable automatic yt-dlp updates",
|
|
"update_frequency": "Update frequency:",
|
|
"check_startup": "Check on every startup (minimum 1 hour between checks)",
|
|
"check_daily": "Check daily",
|
|
"check_weekly": "Check weekly",
|
|
"check_updates_now": "Update yt-dlp",
|
|
"update_check_title": "Update Check",
|
|
"could_not_determine_version": "Could not determine current yt-dlp version.",
|
|
"update_available_dialog": "Update available!\n\nCurrent: {current}\nLatest: {latest}\n\nClick OK to proceed with the update.",
|
|
"up_to_date_dialog": "yt-dlp is up to date!\n\nCurrent version: {version}",
|
|
"error_checking_updates": "Error checking for updates: {error}",
|
|
"settings_saved_title": "Settings Saved",
|
|
"settings_saved_message": "Auto-update settings have been saved successfully!",
|
|
"error_title": "Error",
|
|
"failed_save_settings": "Failed to save auto-update settings.",
|
|
"error_saving_settings": "Error saving auto-update settings: {error}",
|
|
"ytdlp_channel": "yt-dlp Release Channel",
|
|
"ytdlp_channel_stable": "Stable (Tested releases)",
|
|
"ytdlp_channel_nightly": "Nightly (Daily updates, recommended by yt-dlp)",
|
|
"ytdlp_channel_description": "Choose between stable and nightly releases. Nightly builds are updated daily with the latest fixes and features. You can switch channels at any time.",
|
|
"ytdlp_switching_channel": "Switching to {channel} channel...",
|
|
"ytdlp_channel_switched": "✅ Successfully switched to {channel} channel!",
|
|
"ytdlp_channel_switch_failed": "❌ Failed to switch channel: {error}",
|
|
"ytdlp_current_channel": "Current channel: {channel}",
|
|
"app_updates_title": "SageTube Updates",
|
|
"check_app_updates": "Check for SageTube updates on startup",
|
|
"check_beta_updates": "Receive Beta Updates",
|
|
"auto_update_title": "Auto-Update Settings",
|
|
"auto_update_header": "🔄 Auto-Update Settings",
|
|
"auto_update_description": "Configure automatic updates for yt-dlp to ensure you always have the latest features and bug fixes.",
|
|
"current_status": "Current Status",
|
|
"current_version_label": "Current yt-dlp version: Checking...",
|
|
"last_check_label": "Last update check: Never",
|
|
"next_check_label": "Next check: Based on settings",
|
|
"manual_check_button": "🔍 Check for Updates Now",
|
|
"update_frequency_group": "Update Frequency",
|
|
"save_settings": "Save Settings",
|
|
"settings_saved_successfully": "✅ Settings saved successfully!",
|
|
"error_saving": "❌ Error saving settings: {error}",
|
|
"output_format_settings": "Output Format Settings",
|
|
"force_output_format": "Force output format when merging",
|
|
"preferred_format": "Preferred format:",
|
|
"force_format_help": "When enabled, merged videos will be converted to your preferred format. Disable to let yt-dlp decide automatically.",
|
|
"format_mp4": "MP4 (Most compatible)",
|
|
"format_webm": "WebM (Modern, open)",
|
|
"format_mkv": "MKV (Feature-rich)",
|
|
"audio_format_settings": "Audio Format Settings",
|
|
"force_audio_format": "Force audio format for audio-only downloads",
|
|
"audio_normalization": "Audio Normalization (EBU R128)",
|
|
"audio_normalization_help": "When enabled, audio tracks will be normalized. Note: This requires re-encoding, so a specific audio format (like MP3 or M4A) must be forced.",
|
|
"filename_format": "Output Filename Format",
|
|
"filename_format_help": "Available variables: %(title)s, %(uploader)s, %(upload_date)s, %(resolution)s, %(id)s, %(ext)s, %(playlist_index)s. Standard yt-dlp output template syntax is supported.",
|
|
"defaults_settings": "Default Selection Settings",
|
|
"default_video_quality": "Default Video Resolution (Height):",
|
|
"default_subtitle_language": "Default Subtitle Language(s):",
|
|
"defaults_help": "Set your preferred video height and subtitle languages (comma-separated). They will be auto-selected if available.",
|
|
"concurrent_fragments": "Concurrent Connections",
|
|
"concurrent_fragments_help": "Number of connections per download. Higher values bypass throttling but may cause temporary blocks if set too high. Default: 1.",
|
|
"preferred_audio_format": "Preferred audio format:",
|
|
"force_audio_format_help": "When enabled, audio-only downloads will be converted to your preferred format. This only applies when downloading audio formats.",
|
|
"audio_format_best": "Best (No conversion)",
|
|
"audio_format_aac": "AAC (Good for editing)",
|
|
"audio_format_mp3": "MP3 (Universal)",
|
|
"audio_format_flac": "FLAC (Lossless)",
|
|
"audio_format_wav": "WAV (Uncompressed)",
|
|
"audio_format_opus": "Opus (Efficient)",
|
|
"audio_format_m4a": "M4A (Apple)",
|
|
"audio_format_vorbis": "Vorbis (Open)",
|
|
"tab_general": "General",
|
|
"tab_format": "Format",
|
|
"tab_file": "File"
|
|
},
|
|
"main_ui": {
|
|
"url_placeholder": "Enter YouTube video or playlist URL",
|
|
"url_placeholder_generic": "Enter video or playlist URL from any supported site",
|
|
"merge_subtitles": "Merge Subtitles",
|
|
"save_thumbnail": "Save Thumbnail",
|
|
"save_description": "Save Description",
|
|
"embed_chapters": "Embed Chapters",
|
|
"subtitles_selected": "{count} selected",
|
|
"all_selected": "All selected",
|
|
"select_videos_all": "Select Videos... (All selected)",
|
|
"please_enter_url": "Please enter a URL first",
|
|
"error_title": "Error",
|
|
"cookie_file_selected_title": "Cookie File Selected",
|
|
"cookie_file_selected_message": "Cookie file selected: {path}",
|
|
"browser_cookies_selected_title": "Browser Cookies Selected",
|
|
"browser_cookies_selected_message": "Browser cookies will be extracted from: {browser}",
|
|
"error_no_format_info": "Error: No format information available.",
|
|
"error_extract_info": "Error: Could not extract basic video information. Please check your link.",
|
|
"analyzing_preparing": "Preparing request...",
|
|
"analyzing_extracting_basic": "Extracting basic info...",
|
|
"analyzing_extracting_detailed": "Extracting detailed info...",
|
|
"analyzing_processing_video": "Processing video data...",
|
|
"analyzing_processing_formats": "Processing formats...",
|
|
"analyzing_loading_thumbnail": "Loading thumbnail...",
|
|
"analyzing_processing_subtitles": "Processing subtitles...",
|
|
"analyzing_updating_table": "Updating format table...",
|
|
"analysis_complete": "Analysis complete!",
|
|
"analyzing_extracting_ytdlp": "Extracting info...",
|
|
"analyzing_fetching_first_video": "Fetching formats for first video...",
|
|
"analyzing_processing_data": "Processing data...",
|
|
"analyzing_processing_formats_ytdlp": "Processing formats...",
|
|
"analyzing_loading_thumbnail_ytdlp": "Loading thumbnail...",
|
|
"analyzing_processing_subtitles_ytdlp": "Processing subtitles...",
|
|
"select_subtitles": "Select Subtitles...",
|
|
"sponsorblock_categories": "SponsorBlock Categories...",
|
|
"invalid_url_or_enter": "Invalid URL or please enter a URL.",
|
|
"zero_selected": "0 selected",
|
|
"analyze_first_tooltip": "Please analyze the video first",
|
|
"audio_mode_disabled": "Not available in audio-only mode",
|
|
"select_subtitles_first": "Please select subtitles first",
|
|
"settings_tooltip": "Current Path: {path}\nSpeed Limit: {speed_limit}",
|
|
"speed_limit_none": "None",
|
|
"open_folder_error": "Could not open folder: {error}",
|
|
"time_range_set": "Section set: {section}"
|
|
},
|
|
"sponsorblock": {
|
|
"sponsor": "Sponsor",
|
|
"sponsor_desc": "Paid promotion, paid referrals and direct advertisements",
|
|
"selfpromo": "Unpaid/Self Promotion",
|
|
"selfpromo_desc": "Unpaid promotion of creators' own content",
|
|
"interaction": "Interaction Reminder",
|
|
"interaction_desc": "Asking viewers to like, subscribe, or follow social media",
|
|
"intro": "Intro",
|
|
"intro_desc": "Video introduction that can be skipped",
|
|
"outro": "Outro/End Cards",
|
|
"outro_desc": "Credits or when the video ends",
|
|
"preview": "Preview/Recap",
|
|
"preview_desc": "Quick recap of previous videos or preview of what's coming up",
|
|
"music_offtopic": "Non-Music Section",
|
|
"music_offtopic_desc": "Only for music videos. Marks non-music sections",
|
|
"filler": "Filler Tangent",
|
|
"filler_desc": "Tangential scenes added only for filler or humor"
|
|
},
|
|
"video_info": {
|
|
"channel": "Channel",
|
|
"views": "👁 Views",
|
|
"likes": "👍 Likes",
|
|
"upload_date": "📅 Upload date",
|
|
"duration": "⏱ Duration",
|
|
"unknown_channel": "Unknown channel",
|
|
"unknown_date": "Unknown date",
|
|
"unknown_title": "Unknown title"
|
|
},
|
|
"command": {
|
|
"running": "Running...",
|
|
"run_command": "Run Command"
|
|
},
|
|
"selection": {
|
|
"none_selected": "0 selected",
|
|
"one_selected": "1 category selected",
|
|
"count_selected": "{count} selected"
|
|
},
|
|
"status": {
|
|
"ready": "Ready",
|
|
"file_exists": "⚠️ File already exists",
|
|
"video_file_exists": "⚠️ Video file already exists",
|
|
"audio_file_exists": "⚠️ Audio file already exists",
|
|
"subtitle_file_exists": "⚠️ Subtitle file already exists",
|
|
"cancelling": "Cancelling download...",
|
|
"thumbnail_saved": "✅ Thumbnail saved: {filename}",
|
|
"thumbnail_error": "❌ Thumbnail error: {error}",
|
|
"thumbnail_no_image": "No thumbnail available to save"
|
|
},
|
|
"errors": {
|
|
"playlist_no_videos": "Error: Playlist contains no valid videos.",
|
|
"playlist_no_url": "Error: Could not get URL for the first playlist video.",
|
|
"ytdlp_not_found": "Error: yt-dlp executable not found. Please install yt-dlp first.",
|
|
"ytdlp_not_found_path": "Error: yt-dlp executable not found. This could be due to improper installation or a PATH issue.",
|
|
"no_data_returned": "Error: No data returned from yt-dlp",
|
|
"no_format_info": "Error: No format information available.",
|
|
"analysis_timeout": "Error: Analysis timed out. Please try again.",
|
|
"invalid_speed_limit": "❌ Error: Invalid speed limit value set in settings.",
|
|
"ytdlp_failed": "Error: yt-dlp failed: {error}",
|
|
"private_video": "This video might be private. Please use cookies from the custom options.",
|
|
"parse_failed": "Error: Failed to parse yt-dlp output: {error}",
|
|
"analysis_failed": "Error: Analysis failed: {error}",
|
|
"generic_error": "Error: {error}",
|
|
"download_failed_return_code_conflict": "Download failed with return code {return_code}. This may be due to a conflict with multiple yt-dlp installations. Try uninstalling any system-installed yt-dlp (e.g. through snap or apt) and restart the application.",
|
|
"download_failed_return_code": "Download failed with return code {return_code}",
|
|
"direct_command_error": "Error in direct command: {error}"
|
|
},
|
|
"update_dialog": {
|
|
"title": "Update Available",
|
|
"new_version_available": "A new version of SageTube is available!",
|
|
"current_version_label": "Current version:",
|
|
"latest_version_label": "Latest version:",
|
|
"changelog": "Changelog",
|
|
"download_update": "Download Update",
|
|
"remind_later": "Remind Me Later",
|
|
"skip_version": "Skip This Version",
|
|
"skip_version_tooltip": "Never offer {version} again. Later versions will still be shown.",
|
|
"changelog_unavailable": "No release notes were published for this version."
|
|
},
|
|
"playlist": {
|
|
"unknown": "Unknown Playlist",
|
|
"total_videos": "Total Videos: {count}",
|
|
"display_format": "Playlist: {title} | {count} videos",
|
|
"select_videos_title": "Select Playlist Videos",
|
|
"save_as": "Save Playlist As",
|
|
"save_success_title": "Success",
|
|
"saved_successfully": "Playlist saved successfully.",
|
|
"save_error_title": "Save Error",
|
|
"no_videos_to_save": "No playlist entries gathered!",
|
|
"save_error_msg": "Failed to save playlist."
|
|
},
|
|
"subtitle_selection": {
|
|
"count_selected": "{count} selected"
|
|
},
|
|
"file_exists_dialog": {
|
|
"title": "File Already Exists",
|
|
"message": "The file already exists:\n{filename}",
|
|
"info": "This video has already been downloaded."
|
|
},
|
|
"auto_update": {
|
|
"last_check_never": "Last update check: Never",
|
|
"last_check": "Last update check: {time}",
|
|
"next_check_disabled": "Next check: Disabled",
|
|
"next_check_startup": "Next check: On next startup",
|
|
"next_check_overdue": "Next check: Now (overdue)",
|
|
"next_check": "Next check: {time}",
|
|
"next_check_error": "Next check: Error calculating",
|
|
"checking": "🔄 Checking...",
|
|
"check_now": "🔍 Check for Updates Now",
|
|
"current_version": "Current yt-dlp version: {version}"
|
|
},
|
|
"url_validation": {
|
|
"empty_url": "URL cannot be empty",
|
|
"invalid_format": "Invalid URL format",
|
|
"invalid_scheme": "URL must start with http:// or https://",
|
|
"missing_domain": "Invalid URL: missing domain name",
|
|
"unsupported_platform": "YTSage only supports YouTube and YouTube Music URLs.\nThe domain '{domain}' is not supported.",
|
|
"invalid_youtu_be": "Invalid youtu.be URL: missing video ID"
|
|
},
|
|
"ytdlp_errors": {
|
|
"private_video": "This is a private video. You can download it by logging into your account using cookies.\nGo to 'Custom Options' → 'Login with Cookies' → 'Extract cookies from browser' to authenticate.",
|
|
"age_restricted": "This video is age-restricted. You need to be logged in to access it.\nUse 'Custom Options' → 'Login with Cookies' to authenticate with your account.",
|
|
"geo_blocked": "This video is not available in your region (geo-blocked).\nYou may need to use a VPN or the video might be restricted in your country.",
|
|
"video_unavailable": "This video has been removed or is no longer available.\nThe video may have been deleted by the uploader or removed due to policy violations.",
|
|
"live_stream": "This is a live stream that cannot be downloaded while active.\nWait for the stream to end, then try downloading the archived version.",
|
|
"playlist_error": "Unable to access this playlist. It may be private, deleted, or empty.\nCheck if the playlist exists and is publicly accessible.",
|
|
"network_error": "Network connection error. Please check your internet connection and try again.\nIf the problem persists, the video server might be temporarily unavailable.",
|
|
"invalid_url": "Invalid or unsupported URL. Please check the link and try again.\nMake sure you're using a valid YouTube, Vimeo, or other supported platform URL.",
|
|
"premium_content": "This content requires YouTube Premium or channel membership.\nYou need to be logged in with an account that has access to this content.",
|
|
"copyright_blocked": "This video is blocked due to copyright claims.\nThe content owner has restricted access to this video.",
|
|
"extraction_failed": "Failed to extract video information. This might be a temporary issue.\nPlease try again in a few minutes, or check if the video link is correct.",
|
|
"generic_error": "Could not extract video information. Please check your link.\nTechnical details: {error}"
|
|
},
|
|
"history": {
|
|
"title": "Download History",
|
|
"clear_all": "Clear All History",
|
|
"clear_confirm_title": "Clear History?",
|
|
"clear_confirm_message": "Are you sure you want to clear all download history? This cannot be undone.",
|
|
"no_history": "No download history yet",
|
|
"no_history_description": "Your downloaded videos and audio will appear here",
|
|
"loading": "Loading history...",
|
|
"search_placeholder": "Search history...",
|
|
"open_location": "Open File Location",
|
|
"redownload": "Redownload",
|
|
"remove": "Remove from History",
|
|
"file_not_found": "File not found at original location",
|
|
"file_not_found_message": "The file was moved or deleted:\n{path}",
|
|
"downloaded_on": "Downloaded on {date}",
|
|
"file_size": "Size: {size}",
|
|
"audio_download": "Audio",
|
|
"video_download": "Video",
|
|
"remove_confirm_title": "Remove from History?",
|
|
"remove_confirm_message": "Remove this item from history?\n\n{title}",
|
|
"item_removed": "Item removed from history",
|
|
"history_cleared": "History cleared",
|
|
"entries_count": "{count} downloads",
|
|
"one_entry": "1 download",
|
|
"redownload_confirm_title": "Redownload Video?",
|
|
"redownload_confirm_message": "Download this video again using the same settings?\n\n{title}",
|
|
"redownload_started": "Redownload started",
|
|
"no_url_error": "No URL found in history entry",
|
|
"redownload_failed": "Failed to start redownload: {error}"
|
|
},
|
|
"ffmpeg": {
|
|
"installation_title": "FFmpeg Installation",
|
|
"installation_message": "YTSage needs FFmpeg to process videos.\n\nChoose an installation option below:",
|
|
"install_button": "Install FFmpeg",
|
|
"manual_guide": "Manual Guide",
|
|
"installation_failed": "FFmpeg installation encountered an issue.",
|
|
"already_installed": "FFmpeg is already installed!",
|
|
"installation_complete": "Installation complete. You can close this dialog and continue using YTSage.",
|
|
"installing": "Installing FFmpeg... Please wait",
|
|
"install_success": "FFmpeg has been installed successfully!",
|
|
"installation_complete_close": "Installation complete. You can now close this dialog and continue using YTSage.",
|
|
"try_manual": "Please try using the manual installation guide instead."
|
|
},
|
|
"ytdlp_setup": {
|
|
"required_title": "yt-dlp Setup Required",
|
|
"description": "YTSage requires yt-dlp to download videos.<br><br>yt-dlp was not found in the app's local directory. YTSage needs to set up yt-dlp for your {os_name} system.<br><br>Please choose an option below:",
|
|
"option_auto": "Download automatically (Recommended)",
|
|
"option_manual": "Select path manually",
|
|
"setup_button": "Setup yt-dlp",
|
|
"downloading": "Downloading yt-dlp...",
|
|
"success": "yt-dlp was successfully installed!",
|
|
"error": "Error: {error}",
|
|
"download_failed_title": "Download Failed",
|
|
"download_failed_message": "Failed to download yt-dlp: {error}",
|
|
"select_executable_title": "Select yt-dlp executable",
|
|
"copied_to": "yt-dlp successfully copied to {path}",
|
|
"setup_error_title": "Setup Error",
|
|
"copy_error": "Error copying yt-dlp to app directory: {error}",
|
|
"invalid_executable_title": "Invalid Executable",
|
|
"invalid_executable_message": "The selected file does not appear to be a valid yt-dlp executable.",
|
|
"verify_error": "Error verifying yt-dlp executable: {error}",
|
|
"setup_failed_title": "Setup Failed",
|
|
"setup_failed_message": "Failed to set up yt-dlp. Some features may not work correctly.",
|
|
"success_dialog_title": "yt-dlp Setup",
|
|
"success_dialog_message": "yt-dlp has been successfully configured at:\n{path}",
|
|
"file_filter_windows": "Executable Files (*.exe)",
|
|
"file_filter_all": "All Files (*)"
|
|
},
|
|
"ffmpeg_updater": {
|
|
"title": "FFmpeg Version Checker",
|
|
"current_version": "Current Version:",
|
|
"latest_version": "Latest Version:",
|
|
"status_up_to_date": "✓ Up to date",
|
|
"status_update_available": "⚠ Update available",
|
|
"status_not_installed": "✗ Not installed",
|
|
"status_idle": "Click 'Check Version' to get started",
|
|
"status_checking": "🔄 Checking version...",
|
|
"check_updates": "Check Version",
|
|
"check_failed": "Failed to check version. Please check your internet connection.",
|
|
"description": "Check your FFmpeg version and compare it with the latest available version.",
|
|
"guide_info": " To install or update FFmpeg, <a href='https://github.com/oop7/ffmpeg-install-guide'>click here to view our comprehensive installation guide</a>."
|
|
},
|
|
"deno": {
|
|
"setup_required": "Deno Setup Required",
|
|
"setup_description": "YTSage requires Deno to run certain features.<br><br>Deno was not found in the app's local directory. YTSage needs to set up Deno for your {os_name} system.<br><br>Click 'Setup Deno' to download and install automatically.",
|
|
"setup_button": "Setup Deno",
|
|
"downloading": "Downloading Deno...",
|
|
"extracting": "Extracting Deno...",
|
|
"verifying": "Verifying Deno...",
|
|
"success": "Deno was successfully installed!",
|
|
"download_failed": "Download Failed",
|
|
"download_error": "Failed to download Deno: {error}",
|
|
"verification_failed": "SHA256 verification failed. The downloaded file may be corrupted or tampered with.",
|
|
"setup_failed": "Failed to set up Deno. Some features may not work correctly.",
|
|
"setup_error": "Setup Error"
|
|
},
|
|
"deno_updater": {
|
|
"title": "Deno Version Checker & Updater",
|
|
"description": "Check your Deno version and update to the latest release.",
|
|
"current_version": "Current Version:",
|
|
"latest_version": "Latest Version:",
|
|
"status_idle": "Click 'Check for Updates' to get started",
|
|
"status_checking": "🔄 Checking for updates...",
|
|
"status_up_to_date": "✓ Up to date",
|
|
"status_update_available": "⚠ Update available",
|
|
"status_not_installed": "✗ Not installed",
|
|
"check_updates": "Check for Updates",
|
|
"update_now": "Update Deno",
|
|
"updating": "🔄 Updating Deno...",
|
|
"update_success": "✅ Deno has been successfully updated!",
|
|
"update_failed": "❌ Update failed: {error}",
|
|
"check_failed": "Failed to check for updates. Please check your internet connection."
|
|
},
|
|
"player": {
|
|
"quality_auto": "Auto",
|
|
"subtitles": "CC",
|
|
"unavailable": "Video player unavailable",
|
|
"now_playing": "Now Playing",
|
|
"queue": "Queue",
|
|
"play": "Play",
|
|
"pause": "Pause",
|
|
"stream_stalled": "Stream failed to start after several attempts - YouTube may be throttling. Try again or pick a lower quality.",
|
|
"play_pause": "Play / pause (Space)",
|
|
"fullscreen": "Fullscreen (F)",
|
|
"seek_tooltip": "Seek through the video",
|
|
"quality_tooltip": "Maximum playback resolution",
|
|
"speed_tooltip": "Playback speed",
|
|
"volume_tooltip": "Volume",
|
|
"subtitles_tooltip": "Toggle subtitles (C)",
|
|
"previous": "Previous in queue (P)",
|
|
"next": "Next in queue (N)",
|
|
"buffering": "Buffering…",
|
|
"act_play_pause": "Play / pause",
|
|
"act_seek_back_5": "Back 5 seconds",
|
|
"act_seek_fwd_5": "Forward 5 seconds",
|
|
"act_seek_back_10": "Back 10 seconds",
|
|
"act_seek_fwd_10": "Forward 10 seconds",
|
|
"act_seek_back_1": "Back 1 second",
|
|
"act_seek_fwd_1": "Forward 1 second",
|
|
"act_frame_back": "Previous frame",
|
|
"act_frame_fwd": "Next frame",
|
|
"act_vol_up": "Volume up",
|
|
"act_vol_down": "Volume down",
|
|
"act_mute": "Mute",
|
|
"act_unmute": "Unmute",
|
|
"act_speed_up": "Speed up",
|
|
"act_speed_down": "Slow down",
|
|
"act_speed_reset": "Normal speed",
|
|
"act_subtitles": "Subtitles on / off",
|
|
"act_fullscreen": "Fullscreen",
|
|
"act_leave_fullscreen": "Leave fullscreen",
|
|
"act_next": "Next in queue",
|
|
"act_previous": "Previous",
|
|
"act_start": "Back to start",
|
|
"act_end": "Jump to end",
|
|
"act_copy_url": "Copy video link",
|
|
"act_open_browser": "Open in browser"
|
|
},
|
|
"cards": {
|
|
"play": "▶ Play",
|
|
"queue": "+ Queue",
|
|
"download": "⬇",
|
|
"load_more": "Load more",
|
|
"empty": "Nothing here yet",
|
|
"play_tooltip": "Play this video now",
|
|
"queue_tooltip": "Add to the play queue",
|
|
"download_tooltip": "Open in Downloads with this video ready to analyse",
|
|
"load_more_tooltip": "Load the next page of results"
|
|
},
|
|
"main_tabs": {
|
|
"watch": "Watch",
|
|
"search": "Search",
|
|
"feed": "Feed",
|
|
"browse": "Browse",
|
|
"downloads": "Downloads"
|
|
},
|
|
"search": {
|
|
"placeholder": "Search YouTube...",
|
|
"button": "Search",
|
|
"searching": "Searching...",
|
|
"results_count": "{count} results",
|
|
"failed": "Search failed: {error}",
|
|
"button_tooltip": "Search YouTube"
|
|
},
|
|
"watch": {
|
|
"clear_queue": "Clear queue"
|
|
},
|
|
"browse": {
|
|
"placeholder": "Paste a channel or playlist URL...",
|
|
"open": "Open",
|
|
"subscribe": "Subscribe",
|
|
"unsubscribe": "Unsubscribe",
|
|
"play_all": "Play all",
|
|
"download_playlist": "Download",
|
|
"tab_videos": "Videos",
|
|
"tab_shorts": "Shorts",
|
|
"tab_live": "Live",
|
|
"loading": "Loading...",
|
|
"entry_count": "{count} videos",
|
|
"failed": "Failed to load: {error}",
|
|
"hint": "Open a channel (youtube.com/@name) or playlist URL, or navigate here from Search.",
|
|
"open_tooltip": "Open this channel or playlist",
|
|
"subscribe_tooltip": "Follow this channel so its uploads appear in your Feed",
|
|
"unsubscribe_tooltip": "Stop following this channel",
|
|
"play_all_tooltip": "Queue everything loaded here",
|
|
"download_playlist_tooltip": "Open this playlist in Downloads",
|
|
"queued_loaded": "Queued {count} loaded videos — press Load more first to queue the rest"
|
|
},
|
|
"feed": {
|
|
"mode_local": "Local subscriptions",
|
|
"mode_account": "YouTube account (cookies)",
|
|
"refresh": "Refresh",
|
|
"subscriptions": "Subscriptions",
|
|
"no_subscriptions": "No subscriptions yet - subscribe from a channel page in Browse",
|
|
"refreshing": "Refreshing... {done}/{total}",
|
|
"refreshed": "{count} videos in feed",
|
|
"channel_failed": "A channel failed to refresh: {error}",
|
|
"fetching_account": "Fetching your subscription feed...",
|
|
"account_failed": "Account feed failed (are cookies valid?): {error}",
|
|
"subscribed": "Subscribed to {title}",
|
|
"unsubscribed": "Unsubscribed from {title}",
|
|
"open_channel": "Open channel",
|
|
"refresh_tooltip": "Fetch the latest uploads from every subscribed channel",
|
|
"mode_tooltip": "Where the feed comes from: your local subscriptions, or your signed-in YouTube account",
|
|
"refreshed_with_failures": "{count} videos — {failed} channel(s) could not be reached",
|
|
"account_needs_refresh": "Press Refresh to load your account feed",
|
|
"empty_no_subscriptions": "No subscriptions yet.\n\nFind channels in Search or Browse, then use Subscribe to follow them — their new uploads will appear here.",
|
|
"empty_not_refreshed": "Nothing here yet.\n\nPress Refresh to fetch the latest uploads from your subscriptions."
|
|
}
|
|
}
|