feat: internationalize YouTube visual extraction flags and error messages

- Move visual flag descriptions to i18n locale system
- Add visual extraction strings to all 11 locale files
- Replace hardcoded English error messages with i18n lookups
- Register visual flags in `flagDescriptionMap` for help system
- Remove inline `description` tags from visual CLI flag structs
- Localize FFmpeg, Tesseract, and yt-dlp error messages
- Add `youtube_visual_frame_cue` translation key across locales
This commit is contained in:
Kayvan Sylvan 2026-04-05 15:22:28 -07:00
parent 428df31486
commit c78576deb7
14 changed files with 154 additions and 18 deletions

View file

@ -56,9 +56,9 @@ type Flags struct {
YouTubePlaylist bool `long:"playlist" description:"Prefer playlist over video if both ids are present in the URL"`
YouTubeTranscript bool `long:"transcript" description:"Grab transcript from YouTube video and send to chat (it is used per default)."`
YouTubeTranscriptWithTimestamps bool `long:"transcript-with-timestamps" description:"Grab transcript from YouTube video with timestamps and send to chat"`
YouTubeVisual bool `long:"visual" description:"Extract visual data from video using OCR and FFmpeg"`
YouTubeVisualSensitivity float64 `long:"visual-sensitivity" default:"0.4" description:"Tolerance for FFmpeg scene detection (0.0 - 1.0)"`
YouTubeVisualFps int `long:"visual-fps" default:"0" description:"Extract a specific number of frames per second instead of using scene detection"`
YouTubeVisual bool `long:"visual"`
YouTubeVisualSensitivity float64 `long:"visual-sensitivity" default:"0.4"`
YouTubeVisualFps int `long:"visual-fps" default:"0"`
YouTubeComments bool `long:"comments" description:"Grab comments from YouTube video and send to chat"`
YouTubeMetadata bool `long:"metadata" description:"Output video metadata"`
YtDlpArgs string `long:"yt-dlp-args" yaml:"ytDlpArgs" description:"Additional arguments to pass to yt-dlp (e.g. '--cookies-from-browser brave')"`

View file

@ -43,6 +43,9 @@ var flagDescriptionMap = map[string]string{
"playlist": "prefer_playlist_over_video",
"transcript": "grab_transcript_from_youtube",
"transcript-with-timestamps": "grab_transcript_with_timestamps",
"visual": "youtube_extract_visual_data_help",
"visual-sensitivity": "youtube_visual_sensitivity_help",
"visual-fps": "youtube_visual_fps_help",
"comments": "grab_comments_from_youtube",
"metadata": "output_video_metadata",
"yt-dlp-args": "additional_yt_dlp_args",

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "Fehler beim Abrufen der Videodetails: %v",
"youtube_error_parsing_duration": "Fehler beim Parsen der Videodauer: %v",
"youtube_error_saving_csv": "Fehler beim Speichern der Videos in CSV: %v",
"youtube_extract_visual_data_help": "Visuelle Daten mit OCR und FFmpeg aus dem Video extrahieren",
"youtube_failed_create_temp_dir": "temporäres Verzeichnis konnte nicht erstellt werden: %v",
"youtube_failed_fetch_comments": "Kommentare konnten nicht abgerufen werden: %v",
"youtube_failed_get_stream_url": "Stream-URL konnte über yt-dlp nicht ermittelt werden: %v",
"youtube_failed_parse_http_stream_url": "gültige HTTP-Stream-URL konnte aus der yt-dlp-Ausgabe nicht geparst werden",
"youtube_failed_walk_directory": "Verzeichnis konnte nicht durchlaufen werden: %v",
"youtube_ffmpeg_frame_extraction_failed": "FFmpeg-Frame-Extraktion fehlgeschlagen: %v, Ausgabe: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg wird für die visuelle Extraktion benötigt, wurde aber im PATH nicht gefunden",
"youtube_invalid_duration_string": "ungültige Dauer-Zeichenfolge: %s",
"youtube_invalid_seconds_format": "ungültiges Sekundenformat %q: %w",
"youtube_invalid_timestamp_format": "ungültiges Zeitstempel-Format: %s",
"youtube_invalid_url": "ungültige YouTube-URL, kann keine Video- oder Playlist-ID abrufen: '%s'",
"youtube_invalid_ytdlp_arguments": "ungültige yt-dlp-Argumente: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "kein klarer Text in visuellen Videoframes gefunden",
"youtube_no_transcript_content": "kein Transkriptinhalt in VTT-Datei gefunden",
"youtube_no_url_provided": "Keine YouTube-URL angegeben",
"youtube_no_video_found_with_id": "kein Video mit ID gefunden: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Wiedergabeliste gespeichert unter %s",
"youtube_rate_limit_exceeded": "YouTube-Ratenlimit überschritten. Versuche es später erneut oder verwende andere yt-dlp-Argumente wie '--sleep-requests 1', um Anfragen zu verlangsamen.",
"youtube_setup_description": "YouTube - zum Erfassen von Video-Transkripten (via yt-dlp) und Kommentaren/Metadaten (via YouTube API)",
"youtube_tesseract_frame_failed": "tesseract für Frame %d fehlgeschlagen: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract wird für die visuelle Extraktion benötigt, wurde aber im PATH nicht gefunden",
"youtube_url_help": "YouTube-Video oder Playlist-\"URL\" zum Abrufen von Transkript und Kommentaren und Senden an Chat oder Ausgabe in Konsole und Speichern in Ausgabedatei",
"youtube_url_is_playlist_not_video": "URL ist eine Playlist, kein Video",
"youtube_video_id_title_header": "VideoID: Titel",
"youtube_visual_fps_help": "Eine bestimmte Anzahl von Frames pro Sekunde extrahieren, statt Szenenerkennung zu verwenden",
"youtube_visual_frame_cue": "[VISUELLER FRAME-HINWEIS]",
"youtube_visual_sensitivity_help": "Toleranz für die FFmpeg-Szenenerkennung (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp wurde nicht in PATH gefunden. Bitte installiere yt-dlp, um die YouTube-Transkript-Funktionalität zu nutzen",
"youtube_ytdlp_required_visual_extraction": "yt-dlp wird für die visuelle Extraktion benötigt, wurde aber im PATH nicht gefunden",
"youtube_ytdlp_stderr_error": "fehler beim Lesen von yt-dlp stderr"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "error getting video details: %v",
"youtube_error_parsing_duration": "error parsing video duration: %v",
"youtube_error_saving_csv": "error saving videos to CSV: %v",
"youtube_extract_visual_data_help": "Extract visual data from video using OCR and FFmpeg",
"youtube_failed_create_temp_dir": "failed to create temp directory: %v",
"youtube_failed_fetch_comments": "failed to fetch comments: %v",
"youtube_failed_get_stream_url": "failed to get stream URL via yt-dlp: %v",
"youtube_failed_parse_http_stream_url": "failed to parse valid HTTP stream URL from yt-dlp output",
"youtube_failed_walk_directory": "failed to walk directory: %v",
"youtube_ffmpeg_frame_extraction_failed": "ffmpeg frame extraction failed: %v, output: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg is required for visual extraction but not found in PATH",
"youtube_invalid_duration_string": "invalid duration string: %s",
"youtube_invalid_seconds_format": "invalid seconds format %q: %w",
"youtube_invalid_timestamp_format": "invalid timestamp format: %s",
"youtube_invalid_url": "invalid YouTube URL, can't get video or playlist ID: '%s'",
"youtube_invalid_ytdlp_arguments": "invalid yt-dlp arguments: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "no clear text found in video visual frames",
"youtube_no_transcript_content": "no transcript content found in VTT file",
"youtube_no_url_provided": "No YouTube URL provided",
"youtube_no_video_found_with_id": "no video found with ID: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Playlist saved to %s",
"youtube_rate_limit_exceeded": "YouTube rate limit exceeded. Try again later or use different yt-dlp arguments like '--sleep-requests 1' to slow down requests.",
"youtube_setup_description": "YouTube - to grab video transcripts (via yt-dlp) and comments/metadata (via YouTube API)",
"youtube_tesseract_frame_failed": "tesseract failed on frame %d: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract is required for visual extraction but not found in PATH",
"youtube_url_help": "YouTube video or play list \"URL\" to grab transcript, comments from it and send to chat or print it put to the console and store it in the output file",
"youtube_url_is_playlist_not_video": "URL is a playlist, not a video",
"youtube_video_id_title_header": "VideoID: Title",
"youtube_visual_fps_help": "Extract a specific number of frames per second instead of using scene detection",
"youtube_visual_frame_cue": "[VISUAL FRAME CUE]",
"youtube_visual_sensitivity_help": "Tolerance for FFmpeg scene detection (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp not found in PATH. Please install yt-dlp to use YouTube transcript functionality",
"youtube_ytdlp_required_visual_extraction": "yt-dlp is required for visual extraction but not found in PATH",
"youtube_ytdlp_stderr_error": "error reading yt-dlp stderr"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "error al obtener detalles del video: %v",
"youtube_error_parsing_duration": "error al analizar la duración del video: %v",
"youtube_error_saving_csv": "error al guardar videos en CSV: %v",
"youtube_extract_visual_data_help": "Extraer datos visuales del video usando OCR y FFmpeg",
"youtube_failed_create_temp_dir": "falló al crear directorio temporal: %v",
"youtube_failed_fetch_comments": "No se pudieron obtener los comentarios: %v",
"youtube_failed_get_stream_url": "no se pudo obtener la URL del flujo mediante yt-dlp: %v",
"youtube_failed_parse_http_stream_url": "no se pudo analizar una URL HTTP de flujo válida desde la salida de yt-dlp",
"youtube_failed_walk_directory": "falló al recorrer el directorio: %v",
"youtube_ffmpeg_frame_extraction_failed": "la extracción de fotogramas con ffmpeg falló: %v, salida: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg es requerido para la extracción visual pero no se encontró en PATH",
"youtube_invalid_duration_string": "cadena de duración inválida: %s",
"youtube_invalid_seconds_format": "formato de segundos inválido %q: %w",
"youtube_invalid_timestamp_format": "formato de marca de tiempo inválido: %s",
"youtube_invalid_url": "URL de YouTube no válida, no se puede obtener ID de video o lista de reproducción: '%s'",
"youtube_invalid_ytdlp_arguments": "argumentos de yt-dlp inválidos: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "no se encontró texto legible en los fotogramas visuales del video",
"youtube_no_transcript_content": "no se encontró contenido de transcripción en el archivo VTT",
"youtube_no_url_provided": "No se proporcionó una URL de YouTube",
"youtube_no_video_found_with_id": "no se encontró video con ID: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Lista de reproducción guardada en %s",
"youtube_rate_limit_exceeded": "Límite de tasa de YouTube excedido. Intenta de nuevo más tarde o usa diferentes argumentos de yt-dlp como '--sleep-requests 1' para ralentizar las solicitudes.",
"youtube_setup_description": "YouTube - para obtener transcripciones de video (vía yt-dlp) y comentarios/metadatos (vía API de YouTube)",
"youtube_tesseract_frame_failed": "tesseract falló en el fotograma %d: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract es requerido para la extracción visual pero no se encontró en PATH",
"youtube_url_help": "Video de YouTube o \"URL\" de lista de reproducción para obtener transcripción, comentarios y enviar al chat o imprimir en la consola y almacenar en el archivo de salida",
"youtube_url_is_playlist_not_video": "la URL es una lista de reproducción, no un video",
"youtube_video_id_title_header": "VideoID: Título",
"youtube_visual_fps_help": "Extraer un número específico de fotogramas por segundo en lugar de usar detección de escenas",
"youtube_visual_frame_cue": "[MARCADOR DE FOTOGRAMA VISUAL]",
"youtube_visual_sensitivity_help": "Tolerancia para la detección de escenas de FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp no encontrado en PATH. Por favor instala yt-dlp para usar la funcionalidad de transcripción de YouTube",
"youtube_ytdlp_required_visual_extraction": "yt-dlp es requerido para la extracción visual pero no se encontró en PATH",
"youtube_ytdlp_stderr_error": "error al leer stderr de yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "خطا در دریافت جزئیات ویدیو: %v",
"youtube_error_parsing_duration": "خطا در تجزیه مدت زمان ویدیو: %v",
"youtube_error_saving_csv": "خطا در ذخیره ویدیوها در CSV: %v",
"youtube_extract_visual_data_help": "استخراج داده‌های بصری از ویدیو با استفاده از OCR و FFmpeg",
"youtube_failed_create_temp_dir": "ایجاد دایرکتوری موقت ناموفق بود: %v",
"youtube_failed_fetch_comments": "دریافت نظرات ناموفق بود: %v",
"youtube_failed_get_stream_url": "دریافت URL جریان از طریق yt-dlp ناموفق بود: %v",
"youtube_failed_parse_http_stream_url": "تجزیه یک URL معتبر HTTP برای جریان از خروجی yt-dlp ناموفق بود",
"youtube_failed_walk_directory": "پیمایش دایرکتوری ناموفق بود: %v",
"youtube_ffmpeg_frame_extraction_failed": "استخراج فریم با ffmpeg ناموفق بود: %v، خروجی: %s",
"youtube_ffmpeg_required_visual_extraction": "برای استخراج بصری به ffmpeg نیاز است اما در PATH پیدا نشد",
"youtube_invalid_duration_string": "رشته مدت زمان نامعتبر: %s",
"youtube_invalid_seconds_format": "فرمت ثانیه نامعتبر %q: %w",
"youtube_invalid_timestamp_format": "فرمت مهر زمانی نامعتبر: %s",
"youtube_invalid_url": "URL یوتیوب نامعتبر است، نمی‌توان ID ویدیو یا فهرست پخش را دریافت کرد: '%s'",
"youtube_invalid_ytdlp_arguments": "آرگومان‌های yt-dlp نامعتبر: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "متن واضحی در فریم‌های بصری ویدیو پیدا نشد",
"youtube_no_transcript_content": "محتوای رونوشتی در فایل VTT یافت نشد",
"youtube_no_url_provided": "هیچ URL یوتیوبی ارائه نشده است",
"youtube_no_video_found_with_id": "هیچ ویدیویی با ID یافت نشد: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "لیست پخش ذخیره شد در %s",
"youtube_rate_limit_exceeded": "محدودیت نرخ یوتیوب فراتر رفته است. بعداً دوباره امتحان کنید یا از آرگومان‌های مختلف yt-dlp مانند '--sleep-requests 1' برای کاهش سرعت درخواست‌ها استفاده کنید.",
"youtube_setup_description": "YouTube - برای دریافت رونوشت ویدیو (از طریق yt-dlp) و نظرات/متادیتا (از طریق API یوتیوب)",
"youtube_tesseract_frame_failed": "tesseract روی فریم %d شکست خورد: %v، stderr: %s",
"youtube_tesseract_required_visual_extraction": "برای استخراج بصری به tesseract نیاز است اما در PATH پیدا نشد",
"youtube_url_help": "ویدیو یوتیوب یا \"URL\" فهرست پخش برای دریافت رونوشت، نظرات و ارسال به گفتگو یا چاپ در کنسول و ذخیره در فایل خروجی",
"youtube_url_is_playlist_not_video": "URL یک فهرست پخش است، نه یک ویدیو",
"youtube_video_id_title_header": "شناسه ویدیو: عنوان",
"youtube_visual_fps_help": "استخراج تعداد مشخصی فریم در هر ثانیه به‌جای استفاده از تشخیص صحنه",
"youtube_visual_frame_cue": "[نشانه فریم بصری]",
"youtube_visual_sensitivity_help": "میزان حساسیت تشخیص صحنه در FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp در PATH یافت نشد. لطفاً yt-dlp را نصب کنید تا از قابلیت رونویسی یوتیوب استفاده کنید",
"youtube_ytdlp_required_visual_extraction": "برای استخراج بصری به yt-dlp نیاز است اما در PATH پیدا نشد",
"youtube_ytdlp_stderr_error": "خطا در خواندن stderr yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "erreur lors de l'obtention des détails de la vidéo : %v",
"youtube_error_parsing_duration": "erreur lors de l'analyse de la durée de la vidéo : %v",
"youtube_error_saving_csv": "erreur lors de l'enregistrement des vidéos en CSV : %v",
"youtube_extract_visual_data_help": "Extraire les données visuelles de la vidéo avec OCR et FFmpeg",
"youtube_failed_create_temp_dir": "échec de création du répertoire temporaire : %v",
"youtube_failed_fetch_comments": "Échec de la récupération des commentaires : %v",
"youtube_failed_get_stream_url": "échec de récupération de lURL du flux via yt-dlp : %v",
"youtube_failed_parse_http_stream_url": "échec de lanalyse dune URL HTTP de flux valide depuis la sortie de yt-dlp",
"youtube_failed_walk_directory": "échec du parcours du répertoire : %v",
"youtube_ffmpeg_frame_extraction_failed": "extraction des images avec ffmpeg échouée : %v, sortie : %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg est requis pour lextraction visuelle mais est introuvable dans PATH",
"youtube_invalid_duration_string": "chaîne de durée invalide : %s",
"youtube_invalid_seconds_format": "format de secondes invalide %q : %w",
"youtube_invalid_timestamp_format": "format d'horodatage invalide : %s",
"youtube_invalid_url": "URL YouTube invalide, impossible d'obtenir l'ID de vidéo ou de liste de lecture : '%s'",
"youtube_invalid_ytdlp_arguments": "arguments yt-dlp invalides : %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "aucun texte lisible trouvé dans les images visuelles de la vidéo",
"youtube_no_transcript_content": "aucun contenu de transcription trouvé dans le fichier VTT",
"youtube_no_url_provided": "Aucune URL YouTube fournie",
"youtube_no_video_found_with_id": "aucune vidéo trouvée avec l'ID : %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Liste de lecture enregistrée dans %s",
"youtube_rate_limit_exceeded": "Limite de taux YouTube dépassée. Réessayez plus tard ou utilisez différents arguments yt-dlp comme '--sleep-requests 1' pour ralentir les requêtes.",
"youtube_setup_description": "YouTube - pour récupérer les transcriptions vidéo (via yt-dlp) et les commentaires/métadonnées (via l'API YouTube)",
"youtube_tesseract_frame_failed": "tesseract a échoué sur limage %d : %v, stderr : %s",
"youtube_tesseract_required_visual_extraction": "tesseract est requis pour lextraction visuelle mais est introuvable dans PATH",
"youtube_url_help": "Vidéo YouTube ou \"URL\" de liste de lecture pour récupérer la transcription, les commentaires et envoyer au chat ou afficher dans la console et stocker dans le fichier de sortie",
"youtube_url_is_playlist_not_video": "l'URL est une liste de lecture, pas une vidéo",
"youtube_video_id_title_header": "VideoID : Titre",
"youtube_visual_fps_help": "Extraire un nombre précis dimages par seconde au lieu dutiliser la détection de scènes",
"youtube_visual_frame_cue": "[REPÈRE DIMAGE VISUELLE]",
"youtube_visual_sensitivity_help": "Tolérance pour la détection de scènes FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp introuvable dans PATH. Veuillez installer yt-dlp pour utiliser la fonctionnalité de transcription YouTube",
"youtube_ytdlp_required_visual_extraction": "yt-dlp est requis pour lextraction visuelle mais est introuvable dans PATH",
"youtube_ytdlp_stderr_error": "erreur lors de la lecture du stderr de yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "errore nell'ottenere i dettagli del video: %v",
"youtube_error_parsing_duration": "errore nell'analizzare la durata del video: %v",
"youtube_error_saving_csv": "errore nel salvare i video in CSV: %v",
"youtube_extract_visual_data_help": "Estrarre dati visivi dal video usando OCR e FFmpeg",
"youtube_failed_create_temp_dir": "impossibile creare la directory temporanea: %v",
"youtube_failed_fetch_comments": "Recupero dei commenti fallito: %v",
"youtube_failed_get_stream_url": "impossibile ottenere lURL dello stream tramite yt-dlp: %v",
"youtube_failed_parse_http_stream_url": "impossibile analizzare un URL HTTP di stream valido dalloutput di yt-dlp",
"youtube_failed_walk_directory": "impossibile esplorare la directory: %v",
"youtube_ffmpeg_frame_extraction_failed": "estrazione dei fotogrammi con ffmpeg non riuscita: %v, output: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg è richiesto per lestrazione visiva ma non è stato trovato nel PATH",
"youtube_invalid_duration_string": "stringa di durata non valida: %s",
"youtube_invalid_seconds_format": "formato secondi non valido %q: %w",
"youtube_invalid_timestamp_format": "formato timestamp non valido: %s",
"youtube_invalid_url": "URL YouTube non valido, impossibile ottenere l'ID del video o della playlist: '%s'",
"youtube_invalid_ytdlp_arguments": "argomenti yt-dlp non validi: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "nessun testo leggibile trovato nei fotogrammi visivi del video",
"youtube_no_transcript_content": "nessun contenuto di trascrizione trovato nel file VTT",
"youtube_no_url_provided": "Nessun URL YouTube fornito",
"youtube_no_video_found_with_id": "nessun video trovato con ID: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Playlist salvata in %s",
"youtube_rate_limit_exceeded": "Limite di richieste YouTube superato. Riprova più tardi o usa argomenti yt-dlp diversi come '--sleep-requests 1' per rallentare le richieste.",
"youtube_setup_description": "YouTube - per ottenere trascrizioni video (tramite yt-dlp) e commenti/metadati (tramite API YouTube)",
"youtube_tesseract_frame_failed": "tesseract non riuscito sul fotogramma %d: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract è richiesto per lestrazione visiva ma non è stato trovato nel PATH",
"youtube_url_help": "Video YouTube o \"URL\" della playlist per ottenere trascrizioni, commenti e inviarli alla chat o stamparli sulla console e memorizzarli nel file di output",
"youtube_url_is_playlist_not_video": "l'URL è una playlist, non un video",
"youtube_video_id_title_header": "VideoID: Titolo",
"youtube_visual_fps_help": "Estrarre un numero specifico di fotogrammi al secondo invece di usare il rilevamento scene",
"youtube_visual_frame_cue": "[INDICATORE FOTOGRAMMA VISIVO]",
"youtube_visual_sensitivity_help": "Tolleranza per il rilevamento scene di FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp non trovato in PATH. Per favore installa yt-dlp per usare la funzionalità di trascrizione YouTube",
"youtube_ytdlp_required_visual_extraction": "yt-dlp è richiesto per lestrazione visiva ma non è stato trovato nel PATH",
"youtube_ytdlp_stderr_error": "errore durante la lettura dello stderr di yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "動画の詳細取得エラー: %v",
"youtube_error_parsing_duration": "動画の長さ解析エラー: %v",
"youtube_error_saving_csv": "動画のCSV保存エラー: %v",
"youtube_extract_visual_data_help": "OCR と FFmpeg を使用して動画から視覚データを抽出",
"youtube_failed_create_temp_dir": "一時ディレクトリの作成に失敗しました: %v",
"youtube_failed_fetch_comments": "コメントの取得に失敗しました: %v",
"youtube_failed_get_stream_url": "yt-dlp 経由でストリーム URL を取得できませんでした: %v",
"youtube_failed_parse_http_stream_url": "yt-dlp の出力から有効な HTTP ストリーム URL を解析できませんでした",
"youtube_failed_walk_directory": "ディレクトリの走査に失敗しました: %v",
"youtube_ffmpeg_frame_extraction_failed": "ffmpeg によるフレーム抽出に失敗しました: %v, 出力: %s",
"youtube_ffmpeg_required_visual_extraction": "視覚抽出には ffmpeg が必要ですが、PATH に見つかりません",
"youtube_invalid_duration_string": "無効な長さ文字列: %s",
"youtube_invalid_seconds_format": "無効な秒形式 %q: %w",
"youtube_invalid_timestamp_format": "無効なタイムスタンプ形式: %s",
"youtube_invalid_url": "無効なYouTube URL、動画またはプレイリストIDを取得できません: '%s'",
"youtube_invalid_ytdlp_arguments": "無効なyt-dlp引数: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "動画の視覚フレーム内に判読可能なテキストが見つかりませんでした",
"youtube_no_transcript_content": "VTTファイルにトランスクリプトコンテンツが見つかりません",
"youtube_no_url_provided": "YouTube URLが提供されていません",
"youtube_no_video_found_with_id": "IDの動画が見つかりません: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "プレイリストが %s に保存されました",
"youtube_rate_limit_exceeded": "YouTubeのレート制限を超えました。後でもう一度試すか、'--sleep-requests 1'のような異なるyt-dlp引数を使用してリクエストを遅くしてください。",
"youtube_setup_description": "YouTube - 動画の転写(yt-dlp経由)とコメント/メタデータ(YouTube API経由)を取得",
"youtube_tesseract_frame_failed": "フレーム %d で tesseract が失敗しました: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "視覚抽出には tesseract が必要ですが、PATH に見つかりません",
"youtube_url_help": "YouTube動画またはプレイリスト\"URL\"から転写、コメントを取得してチャットに送信、またはコンソールに出力して出力ファイルに保存",
"youtube_url_is_playlist_not_video": "URLはプレイリストであり、動画ではありません",
"youtube_video_id_title_header": "動画ID: タイトル",
"youtube_visual_fps_help": "シーン検出の代わりに、1 秒あたりの特定フレーム数を抽出",
"youtube_visual_frame_cue": "[視覚フレームキュー]",
"youtube_visual_sensitivity_help": "FFmpeg のシーン検出の許容度 (0.0 - 1.0)",
"youtube_ytdlp_not_found": "PATHにyt-dlpが見つかりません。YouTubeトランスクリプト機能を使用するにはyt-dlpをインストールしてください",
"youtube_ytdlp_required_visual_extraction": "視覚抽出には yt-dlp が必要ですが、PATH に見つかりません",
"youtube_ytdlp_stderr_error": "yt-dlp stderrの読み取りエラー"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "błąd podczas pobierania szczegółów wideo: %v",
"youtube_error_parsing_duration": "błąd podczas przetwarzania czasu trwania wideo: %v",
"youtube_error_saving_csv": "błąd podczas zapisywania filmów do CSV: %v",
"youtube_extract_visual_data_help": "Wyodrębnij dane wizualne z filmu przy użyciu OCR i FFmpeg",
"youtube_failed_create_temp_dir": "nie udało się utworzyć katalogu tymczasowego: %v",
"youtube_failed_fetch_comments": "nie udało się pobrać komentarzy: %v",
"youtube_failed_get_stream_url": "nie udało się pobrać adresu URL strumienia przez yt-dlp: %v",
"youtube_failed_parse_http_stream_url": "nie udało się przetworzyć prawidłowego adresu URL strumienia HTTP z danych wyjściowych yt-dlp",
"youtube_failed_walk_directory": "nie udało się przejść przez katalog: %v",
"youtube_ffmpeg_frame_extraction_failed": "ekstrakcja klatek przez ffmpeg nie powiodła się: %v, wyjście: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg jest wymagany do ekstrakcji wizualnej, ale nie został znaleziony w PATH",
"youtube_invalid_duration_string": "nieprawidłowy ciąg czasu trwania: %s",
"youtube_invalid_seconds_format": "nieprawidłowy format sekund %q: %w",
"youtube_invalid_timestamp_format": "nieprawidłowy format znacznika czasu: %s",
"youtube_invalid_url": "nieprawidłowy URL YouTube, nie można uzyskać identyfikatora wideo lub playlisty: '%s'",
"youtube_invalid_ytdlp_arguments": "nieprawidłowe argumenty yt-dlp: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "nie znaleziono czytelnego tekstu w wizualnych klatkach wideo",
"youtube_no_transcript_content": "nie znaleziono zawartości transkrypcji w pliku VTT",
"youtube_no_url_provided": "Nie podano URL YouTube",
"youtube_no_video_found_with_id": "nie znaleziono wideo o ID: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Playlista zapisana do %s",
"youtube_rate_limit_exceeded": "Przekroczono limit żądań YouTube. Spróbuj ponownie później lub użyj innych argumentów yt-dlp, np. '--sleep-requests 1', aby spowolnić żądania.",
"youtube_setup_description": "YouTube - do pobierania transkrypcji wideo (przez yt-dlp) i komentarzy/metadanych (przez API YouTube)",
"youtube_tesseract_frame_failed": "tesseract nie powiódł się dla klatki %d: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract jest wymagany do ekstrakcji wizualnej, ale nie został znaleziony w PATH",
"youtube_url_help": "URL wideo lub playlisty YouTube do pobrania transkrypcji, komentarzy i wysłania do czatu lub wypisania na konsolę i zapisania w pliku wyjściowym",
"youtube_url_is_playlist_not_video": "URL jest playlistą, nie filmem",
"youtube_video_id_title_header": "ID wideo: Tytuł",
"youtube_visual_fps_help": "Wyodrębnij określoną liczbę klatek na sekundę zamiast używać wykrywania scen",
"youtube_visual_frame_cue": "[ZNACZNIK KLATKI WIZUALNEJ]",
"youtube_visual_sensitivity_help": "Czułość wykrywania scen FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "nie znaleziono yt-dlp w PATH. Zainstaluj yt-dlp, aby korzystać z funkcji transkrypcji YouTube",
"youtube_ytdlp_required_visual_extraction": "yt-dlp jest wymagany do ekstrakcji wizualnej, ale nie został znaleziony w PATH",
"youtube_ytdlp_stderr_error": "błąd podczas odczytu stderr yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "erro ao obter detalhes do vídeo: %v",
"youtube_error_parsing_duration": "erro ao analisar a duração do vídeo: %v",
"youtube_error_saving_csv": "erro ao salvar vídeos em CSV: %v",
"youtube_extract_visual_data_help": "Extrair dados visuais do vídeo usando OCR e FFmpeg",
"youtube_failed_create_temp_dir": "falha ao criar diretório temporário: %v",
"youtube_failed_fetch_comments": "Falha ao buscar comentários: %v",
"youtube_failed_get_stream_url": "falha ao obter a URL do stream via yt-dlp: %v",
"youtube_failed_parse_http_stream_url": "falha ao analisar uma URL HTTP válida de stream da saída do yt-dlp",
"youtube_failed_walk_directory": "falha ao percorrer o diretório: %v",
"youtube_ffmpeg_frame_extraction_failed": "extração de quadros com ffmpeg falhou: %v, saída: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg é necessário para extração visual, mas não foi encontrado no PATH",
"youtube_invalid_duration_string": "string de duração inválida: %s",
"youtube_invalid_seconds_format": "formato de segundos inválido %q: %w",
"youtube_invalid_timestamp_format": "formato de timestamp inválido: %s",
"youtube_invalid_url": "URL do YouTube inválida, não é possível obter o ID do vídeo ou da playlist: '%s'",
"youtube_invalid_ytdlp_arguments": "argumentos do yt-dlp inválidos: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "nenhum texto legível encontrado nos quadros visuais do vídeo",
"youtube_no_transcript_content": "nenhum conteúdo de transcrição encontrado no arquivo VTT",
"youtube_no_url_provided": "Nenhuma URL do YouTube fornecida",
"youtube_no_video_found_with_id": "nenhum vídeo encontrado com o ID: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Lista de reprodução salva em %s",
"youtube_rate_limit_exceeded": "Limite de taxa do YouTube excedido. Tente novamente mais tarde ou use argumentos diferentes do yt-dlp como '--sleep-requests 1' para desacelerar as requisições.",
"youtube_setup_description": "YouTube - para obter transcrições de vídeo (via yt-dlp) e comentários/metadados (via API do YouTube)",
"youtube_tesseract_frame_failed": "tesseract falhou no quadro %d: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract é necessário para extração visual, mas não foi encontrado no PATH",
"youtube_url_help": "Vídeo do YouTube ou URL da playlist para obter transcrição, comentários e enviar ao chat ou imprimir no console e armazenar no arquivo de saída",
"youtube_url_is_playlist_not_video": "a URL é uma playlist, não um vídeo",
"youtube_video_id_title_header": "VideoID: Título",
"youtube_visual_fps_help": "Extrair um número específico de quadros por segundo em vez de usar detecção de cenas",
"youtube_visual_frame_cue": "[MARCADOR DE QUADRO VISUAL]",
"youtube_visual_sensitivity_help": "Tolerância para detecção de cenas do FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp não encontrado no PATH. Por favor instale o yt-dlp para usar a funcionalidade de transcrição do YouTube",
"youtube_ytdlp_required_visual_extraction": "yt-dlp é necessário para extração visual, mas não foi encontrado no PATH",
"youtube_ytdlp_stderr_error": "erro ao ler stderr do yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "erro ao obter detalhes do vídeo: %v",
"youtube_error_parsing_duration": "erro ao analisar a duração do vídeo: %v",
"youtube_error_saving_csv": "erro ao guardar vídeos em CSV: %v",
"youtube_extract_visual_data_help": "Extrair dados visuais do vídeo usando OCR e FFmpeg",
"youtube_failed_create_temp_dir": "falha ao criar diretório temporário: %v",
"youtube_failed_fetch_comments": "Falha ao obter comentários: %v",
"youtube_failed_get_stream_url": "falha ao obter o URL do stream via yt-dlp: %v",
"youtube_failed_parse_http_stream_url": "falha ao analisar um URL HTTP válido de stream a partir da saída do yt-dlp",
"youtube_failed_walk_directory": "falha ao percorrer o diretório: %v",
"youtube_ffmpeg_frame_extraction_failed": "a extração de fotogramas com ffmpeg falhou: %v, saída: %s",
"youtube_ffmpeg_required_visual_extraction": "ffmpeg é necessário para extração visual, mas não foi encontrado no PATH",
"youtube_invalid_duration_string": "cadeia de duração inválida: %s",
"youtube_invalid_seconds_format": "formato de segundos inválido %q: %w",
"youtube_invalid_timestamp_format": "formato de timestamp inválido: %s",
"youtube_invalid_url": "URL do YouTube inválido, não é possível obter o ID do vídeo ou da lista de reprodução: '%s'",
"youtube_invalid_ytdlp_arguments": "argumentos do yt-dlp inválidos: %v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "nenhum texto legível encontrado nos fotogramas visuais do vídeo",
"youtube_no_transcript_content": "nenhum conteúdo de transcrição encontrado no ficheiro VTT",
"youtube_no_url_provided": "Nenhum URL do YouTube fornecido",
"youtube_no_video_found_with_id": "nenhum vídeo encontrado com o ID: %s",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "Lista de reprodução guardada em %s",
"youtube_rate_limit_exceeded": "Limite de taxa do YouTube excedido. Tente novamente mais tarde ou utilize argumentos diferentes do yt-dlp como '--sleep-requests 1' para desacelerar os pedidos.",
"youtube_setup_description": "YouTube - para obter transcrições de vídeo (via yt-dlp) e comentários/metadados (via API do YouTube)",
"youtube_tesseract_frame_failed": "tesseract falhou no fotograma %d: %v, stderr: %s",
"youtube_tesseract_required_visual_extraction": "tesseract é necessário para extração visual, mas não foi encontrado no PATH",
"youtube_url_help": "Vídeo do YouTube ou \"URL\" de playlist para obter transcrição, comentários e enviar ao chat ou imprimir na consola e armazenar no ficheiro de saída",
"youtube_url_is_playlist_not_video": "o URL é uma lista de reprodução, não um vídeo",
"youtube_video_id_title_header": "VideoID: Título",
"youtube_visual_fps_help": "Extrair um número específico de fotogramas por segundo em vez de usar deteção de cenas",
"youtube_visual_frame_cue": "[MARCADOR DE FOTOGRAMA VISUAL]",
"youtube_visual_sensitivity_help": "Tolerância para deteção de cenas do FFmpeg (0.0 - 1.0)",
"youtube_ytdlp_not_found": "yt-dlp não encontrado no PATH. Por favor instale o yt-dlp para usar a funcionalidade de transcrição do YouTube",
"youtube_ytdlp_required_visual_extraction": "yt-dlp é necessário para extração visual, mas não foi encontrado no PATH",
"youtube_ytdlp_stderr_error": "erro ao ler stderr do yt-dlp"
}

View file

@ -715,15 +715,21 @@
"youtube_error_getting_video_details": "获取视频详情时出错:%v",
"youtube_error_parsing_duration": "解析视频时长时出错:%v",
"youtube_error_saving_csv": "将视频保存为 CSV 时出错:%v",
"youtube_extract_visual_data_help": "使用 OCR 和 FFmpeg 从视频中提取视觉数据",
"youtube_failed_create_temp_dir": "创建临时目录失败:%v",
"youtube_failed_fetch_comments": "获取评论失败:%v",
"youtube_failed_get_stream_url": "无法通过 yt-dlp 获取流 URL%v",
"youtube_failed_parse_http_stream_url": "无法从 yt-dlp 输出中解析出有效的 HTTP 流 URL",
"youtube_failed_walk_directory": "遍历目录失败:%v",
"youtube_ffmpeg_frame_extraction_failed": "ffmpeg 提取帧失败:%v输出%s",
"youtube_ffmpeg_required_visual_extraction": "视觉提取需要 ffmpeg但在 PATH 中未找到",
"youtube_invalid_duration_string": "无效的时长字符串:%s",
"youtube_invalid_seconds_format": "无效的秒数格式 %q%w",
"youtube_invalid_timestamp_format": "无效的时间戳格式:%s",
"youtube_invalid_url": "无效的 YouTube URL无法获取视频或播放列表 ID'%s'",
"youtube_invalid_ytdlp_arguments": "无效的 yt-dlp 参数:%v",
"youtube_label": "YouTube",
"youtube_no_clear_text_visual_frames": "在视频视觉帧中未找到清晰文本",
"youtube_no_transcript_content": "在 VTT 文件中未找到转录内容",
"youtube_no_url_provided": "未提供 YouTube URL",
"youtube_no_video_found_with_id": "未找到 ID 为 %s 的视频",
@ -734,9 +740,15 @@
"youtube_playlist_saved_to": "播放列表已保存到 %s",
"youtube_rate_limit_exceeded": "超过 YouTube 速率限制。请稍后重试,或使用不同的 yt-dlp 参数(如 '--sleep-requests 1')来减慢请求速度。",
"youtube_setup_description": "YouTube - 获取视频转录(通过 yt-dlp和评论/元数据(通过 YouTube API",
"youtube_tesseract_frame_failed": "tesseract 在第 %d 帧上失败:%vstderr%s",
"youtube_tesseract_required_visual_extraction": "视觉提取需要 tesseract但在 PATH 中未找到",
"youtube_url_help": "YouTube 视频或播放列表 \"URL\",用于获取转录、评论并发送到聊天或打印到控制台并存储到输出文件",
"youtube_url_is_playlist_not_video": "URL 是播放列表,而不是视频",
"youtube_video_id_title_header": "视频 ID标题",
"youtube_visual_fps_help": "按指定的每秒帧数提取画面,而不是使用场景检测",
"youtube_visual_frame_cue": "[视觉帧提示]",
"youtube_visual_sensitivity_help": "FFmpeg 场景检测的容差0.0 - 1.0",
"youtube_ytdlp_not_found": "在 PATH 中未找到 yt-dlp。请安装 yt-dlp 以使用 YouTube 转录功能",
"youtube_ytdlp_required_visual_extraction": "视觉提取需要 yt-dlp但在 PATH 中未找到",
"youtube_ytdlp_stderr_error": "读取 yt-dlp stderr 时出错"
}

View file

@ -840,13 +840,13 @@ func (o *YouTube) GrabByFlags() (ret *VideoInfo, err error) {
flag.BoolVar(&options.Duration, "duration", false, "Output only the duration")
flag.BoolVar(&options.Transcript, "transcript", false, "Output only the transcript")
flag.BoolVar(&options.TranscriptWithTimestamps, "transcriptWithTimestamps", false, "Output only the transcript with timestamps")
flag.BoolVar(&options.Visual, "visual", false, "Output visual text extracted from video frames")
flag.Float64Var(&options.VisualSensitivity, "visual-sensitivity", 0.4, "Tolerance for FFmpeg scene detection (0.0 - 1.0)")
flag.IntVar(&options.VisualFps, "visual-fps", 0, "Extract a specific number of frames per second instead of using scene detection")
flag.BoolVar(&options.Visual, "visual", false, i18n.T("youtube_extract_visual_data_help"))
flag.Float64Var(&options.VisualSensitivity, "visual-sensitivity", 0.4, i18n.T("youtube_visual_sensitivity_help"))
flag.IntVar(&options.VisualFps, "visual-fps", 0, i18n.T("youtube_visual_fps_help"))
flag.BoolVar(&options.Comments, "comments", false, "Output the comments on the video")
flag.StringVar(&options.Lang, "lang", "en", "Language for the transcript (default: English)")
flag.BoolVar(&options.Metadata, "metadata", false, "Output video metadata")
flag.StringVar(&options.YtDlpArgs, "yt-dlp-args", "", "Additional arguments to pass to yt-dlp")
flag.StringVar(&options.YtDlpArgs, "yt-dlp-args", "", i18n.T("additional_yt_dlp_args"))
flag.Parse()
if flag.NArg() == 0 {
@ -861,13 +861,13 @@ func (o *YouTube) GrabByFlags() (ret *VideoInfo, err error) {
// GrabVisual retrieves visual data from the video by extracting frames via FFmpeg and OCR parsing them via Tesseract.
func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs string, sensitivity float64, fps int) (string, error) {
if _, err := exec.LookPath("yt-dlp"); err != nil {
return "", errors.New("yt-dlp is required for visual extraction but not found in PATH")
return "", errors.New(i18n.T("youtube_ytdlp_required_visual_extraction"))
}
if _, err := exec.LookPath("ffmpeg"); err != nil {
return "", errors.New("ffmpeg is required for visual extraction but not found in PATH")
return "", errors.New(i18n.T("youtube_ffmpeg_required_visual_extraction"))
}
if _, err := exec.LookPath("tesseract"); err != nil {
return "", errors.New("tesseract is required for visual extraction but not found in PATH")
return "", errors.New(i18n.T("youtube_tesseract_required_visual_extraction"))
}
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Minute)
@ -875,7 +875,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
tempDir, err := os.MkdirTemp("", "fabric-vfabric-"+videoId+"-*")
if err != nil {
return "", fmt.Errorf("failed to create temp directory: %v", err)
return "", fmt.Errorf(i18n.T("youtube_failed_create_temp_dir"), err)
}
defer os.RemoveAll(tempDir)
@ -885,7 +885,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
if additionalArgs != "" {
parsed, parseErr := shellquote.Split(additionalArgs)
if parseErr != nil {
return "", fmt.Errorf("invalid yt-dlp-args: %v", parseErr)
return "", fmt.Errorf(i18n.T("youtube_invalid_ytdlp_arguments"), parseErr)
}
ytArgs = append(ytArgs, parsed...)
}
@ -894,7 +894,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
cmdUrl := exec.CommandContext(ctx, "yt-dlp", ytArgs...)
urlBytes, err := cmdUrl.Output()
if err != nil {
return "", fmt.Errorf("failed to get stream URL via yt-dlp: %v", err)
return "", fmt.Errorf(i18n.T("youtube_failed_get_stream_url"), err)
}
streamUrls := strings.Split(strings.TrimSpace(string(urlBytes)), "\n")
@ -906,7 +906,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
}
}
if streamUrl == "" {
return "", errors.New("failed to parse valid http stream url from yt-dlp output")
return "", errors.New(i18n.T("youtube_failed_parse_http_stream_url"))
}
var filter string
@ -919,7 +919,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
framePattern := filepath.Join(tempDir, "frame_%04d.jpg")
cmdFfmpeg := exec.CommandContext(ctx, "ffmpeg", "-i", streamUrl, "-vf", filter, "-fps_mode", "vfr", framePattern)
if out, err := cmdFfmpeg.CombinedOutput(); err != nil {
return "", fmt.Errorf("ffmpeg frame extraction failed: %v, output: %s", err, string(out))
return "", fmt.Errorf(i18n.T("youtube_ffmpeg_frame_extraction_failed"), err, string(out))
}
files, err := filepath.Glob(filepath.Join(tempDir, "frame_*.jpg"))
@ -947,7 +947,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
ocrErr := cmdOcr.Run()
if ocrErr != nil {
errMut.Lock()
errs = append(errs, fmt.Errorf("tesseract failed on frame %d: %v, stderr: %s", idx, ocrErr, stderrBuf.String()))
errs = append(errs, fmt.Errorf(i18n.T("youtube_tesseract_frame_failed"), idx, ocrErr, stderrBuf.String()))
errMut.Unlock()
return
}
@ -972,7 +972,8 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
mins := (secs % 3600) / 60
sec := secs % 60
sb.WriteString(fmt.Sprintf("\n%02d:%02d:%02d.000 --> %02d:%02d:%02d.999\n", hours, mins, sec, hours, mins, sec))
sb.WriteString("[VISUAL FRAME CUE]\n")
sb.WriteString(i18n.T("youtube_visual_frame_cue"))
sb.WriteString("\n")
sb.WriteString(text)
sb.WriteString("\n")
}
@ -980,7 +981,7 @@ func (o *YouTube) GrabVisual(videoId string, language string, additionalArgs str
ret := sb.String()
if ret == "" {
return "", errors.New("no clear text found in video visual frames")
return "", errors.New(i18n.T("youtube_no_clear_text_visual_frames"))
}
return ret, nil
}