diff --git a/.vscode/settings.json b/.vscode/settings.json index cca70c75..2457e8f9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,6 +9,7 @@ "Aoede", "apikey", "aplicar", + "Astley", "atotto", "Autonoe", "azureml", diff --git a/internal/cli/listing.go b/internal/cli/listing.go index 01388778..a2a9f7d3 100644 --- a/internal/cli/listing.go +++ b/internal/cli/listing.go @@ -30,6 +30,28 @@ func handleListingCommands(currentFlags *Flags, fabricDb *fsdb.Db, registry *cor } if currentFlags.ListPatterns { + // Check if patterns exist before listing + var names []string + if names, err = fabricDb.Patterns.GetNames(); err != nil { + return true, err + } + + if len(names) == 0 && !currentFlags.ShellCompleteOutput { + // No patterns found - provide helpful guidance + fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + fmt.Println(i18n.T("patterns_not_found_header")) + fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + fmt.Printf("\n%s\n", i18n.T("patterns_required_to_work")) + fmt.Println() + fmt.Println(i18n.T("patterns_option_run_setup")) + fmt.Printf(" %s\n", i18n.T("patterns_option_run_setup_command")) + fmt.Println() + fmt.Println(i18n.T("patterns_option_run_update")) + fmt.Printf(" %s\n", i18n.T("patterns_option_run_update_command")) + fmt.Println() + return true, nil + } + err = fabricDb.Patterns.ListNames(currentFlags.ShellCompleteOutput) return true, err } diff --git a/internal/core/plugin_registry.go b/internal/core/plugin_registry.go index 49851afe..2adb88a5 100644 --- a/internal/core/plugin_registry.go +++ b/internal/core/plugin_registry.go @@ -176,29 +176,178 @@ func (o *PluginRegistry) SaveEnvFile() (err error) { } func (o *PluginRegistry) Setup() (err error) { - setupQuestion := plugins.NewSetupQuestion("Enter the number of the plugin to setup") - groupsPlugins := util.NewGroupsItemsSelector("Available plugins (please configure all required plugins):", + // Check if this is a first-time setup + isFirstRun := o.isFirstTimeSetup() + + if isFirstRun { + err = o.runFirstTimeSetup() + } else { + err = o.runInteractiveSetup() + } + + if err != nil { + return + } + + // Validate setup after completion + o.validateSetup() + + return +} + +// isFirstTimeSetup checks if this is a first-time setup +func (o *PluginRegistry) isFirstTimeSetup() bool { + // Check if patterns and strategies are not configured + patternsConfigured := o.PatternsLoader.IsConfigured() + strategiesConfigured := o.Strategies.IsConfigured() + hasVendor := len(o.VendorManager.Vendors) > 0 + + return !patternsConfigured || !strategiesConfigured || !hasVendor +} + +// runFirstTimeSetup handles first-time setup with automatic pattern/strategy download +func (o *PluginRegistry) runFirstTimeSetup() (err error) { + fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + fmt.Println(i18n.T("setup_welcome_header")) + fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + + // Step 1: Download patterns (required, automatic) + if !o.PatternsLoader.IsConfigured() { + fmt.Printf("\n%s\n", i18n.T("setup_step_downloading_patterns")) + if err = o.PatternsLoader.Setup(); err != nil { + return fmt.Errorf(i18n.T("setup_failed_download_patterns"), err) + } + if err = o.SaveEnvFile(); err != nil { + return + } + } + + // Step 2: Download strategies (required, automatic) + if !o.Strategies.IsConfigured() { + fmt.Printf("\n%s\n", i18n.T("setup_step_downloading_strategies")) + if err = o.Strategies.Setup(); err != nil { + return fmt.Errorf(i18n.T("setup_failed_download_strategies"), err) + } + if err = o.SaveEnvFile(); err != nil { + return + } + } + + // Step 3: Configure AI vendor (interactive) + if len(o.VendorManager.Vendors) == 0 { + fmt.Printf("\n%s\n", i18n.T("setup_step_configure_ai_provider")) + fmt.Printf(" %s\n", i18n.T("setup_ai_provider_required")) + fmt.Printf(" %s\n", i18n.T("setup_add_more_providers_later")) + fmt.Println() + + if err = o.runVendorSetup(); err != nil { + return + } + } + + // Step 4: Set default vendor and model + if !o.Defaults.IsConfigured() { + fmt.Printf("\n%s\n", i18n.T("setup_step_setting_defaults")) + if err = o.Defaults.Setup(); err != nil { + return fmt.Errorf(i18n.T("setup_failed_set_defaults"), err) + } + if err = o.SaveEnvFile(); err != nil { + return + } + } + + fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + fmt.Println(i18n.T("setup_complete_header")) + fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + fmt.Printf("\n%s\n", i18n.T("setup_next_steps")) + fmt.Printf(" %s\n", i18n.T("setup_list_patterns")) + fmt.Printf(" %s\n", i18n.T("setup_try_pattern")) + fmt.Printf(" %s\n", i18n.T("setup_configure_more")) + fmt.Println() + + return +} + +// runVendorSetup helps user select and configure their first AI vendor +func (o *PluginRegistry) runVendorSetup() (err error) { + setupQuestion := plugins.NewSetupQuestion("Enter the number of the AI provider to configure") + groupsPlugins := util.NewGroupsItemsSelector(i18n.T("setup_available_ai_providers"), func(plugin plugins.Plugin) string { - var configuredLabel string - if plugin.IsConfigured() { - configuredLabel = " (configured)" - } else { - configuredLabel = "" - } - return fmt.Sprintf("%v%v", plugin.GetSetupDescription(), configuredLabel) + return plugin.GetSetupDescription() }) - groupsPlugins.AddGroupItems("AI Vendors [at least one, required]", lo.Map(o.VendorsAll.Vendors, + groupsPlugins.AddGroupItems("", lo.Map(o.VendorsAll.Vendors, func(vendor ai.Vendor, _ int) plugins.Plugin { return vendor })...) - groupsPlugins.AddGroupItems("Tools", o.CustomPatterns, o.Defaults, o.Jina, o.Language, o.PatternsLoader, o.Strategies, o.YouTube) + groupsPlugins.Print(false) + + if answerErr := setupQuestion.Ask(i18n.T("setup_enter_ai_provider_number")); answerErr != nil { + return answerErr + } + + if setupQuestion.Value == "" { + return fmt.Errorf("%s", i18n.T("setup_no_ai_provider_selected")) + } + + number, parseErr := strconv.Atoi(setupQuestion.Value) + if parseErr != nil { + return fmt.Errorf(i18n.T("setup_invalid_selection"), setupQuestion.Value) + } + + var plugin plugins.Plugin + if _, plugin, err = groupsPlugins.GetGroupAndItemByItemNumber(number); err != nil { + return + } + + if pluginSetupErr := plugin.Setup(); pluginSetupErr != nil { + return pluginSetupErr + } + + if err = o.SaveEnvFile(); err != nil { + return + } + + if o.VendorManager.FindByName(plugin.GetName()) == nil { + if vendor, ok := plugin.(ai.Vendor); ok { + o.VendorManager.AddVendors(vendor) + } + } + + return +} + +// runInteractiveSetup runs the standard interactive setup menu +func (o *PluginRegistry) runInteractiveSetup() (err error) { + setupQuestion := plugins.NewSetupQuestion("Enter the number of the plugin to setup") + groupsPlugins := util.NewGroupsItemsSelector(i18n.T("setup_available_plugins"), + func(plugin plugins.Plugin) string { + var configuredLabel string + if plugin.IsConfigured() { + configuredLabel = i18n.T("plugin_configured") + } else { + configuredLabel = i18n.T("plugin_not_configured") + } + return fmt.Sprintf("%v%v", plugin.GetSetupDescription(), configuredLabel) + }) + + // Add vendors first under REQUIRED section + groupsPlugins.AddGroupItems(i18n.T("setup_required_configuration_header"), lo.Map(o.VendorsAll.Vendors, + func(vendor ai.Vendor, _ int) plugins.Plugin { + return vendor + })...) + + // Add required tools + groupsPlugins.AddGroupItems(i18n.T("setup_required_tools"), o.Defaults, o.PatternsLoader, o.Strategies) + + // Add optional tools + groupsPlugins.AddGroupItems(i18n.T("setup_optional_configuration_header"), o.CustomPatterns, o.Jina, o.Language, o.YouTube) for { groupsPlugins.Print(false) - if answerErr := setupQuestion.Ask("Plugin Number"); answerErr != nil { + if answerErr := setupQuestion.Ask(i18n.T("setup_plugin_number")); answerErr != nil { break } @@ -237,6 +386,58 @@ func (o *PluginRegistry) Setup() (err error) { return } +// validateSetup checks if required components are configured and warns user +func (o *PluginRegistry) validateSetup() { + fmt.Println("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + fmt.Println(i18n.T("setup_validation_header")) + fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + + missingRequired := false + + // Check AI vendor + if len(o.VendorManager.Vendors) > 0 { + fmt.Printf(" %s\n", i18n.T("setup_validation_ai_provider_configured")) + } else { + fmt.Printf(" %s\n", i18n.T("setup_validation_ai_provider_missing")) + missingRequired = true + } + + // Check default model + if o.Defaults.IsConfigured() { + fmt.Printf(" %s\n", fmt.Sprintf(i18n.T("setup_validation_defaults_configured"), o.Defaults.Vendor.Value, o.Defaults.Model.Value)) + } else { + fmt.Printf(" %s\n", i18n.T("setup_validation_defaults_missing")) + missingRequired = true + } + + // Check patterns + if o.PatternsLoader.IsConfigured() { + fmt.Printf(" %s\n", i18n.T("setup_validation_patterns_configured")) + } else { + fmt.Printf(" %s\n", i18n.T("setup_validation_patterns_missing")) + missingRequired = true + } + + // Check strategies + if o.Strategies.IsConfigured() { + fmt.Printf(" %s\n", i18n.T("setup_validation_strategies_configured")) + } else { + fmt.Printf(" %s\n", i18n.T("setup_validation_strategies_missing")) + missingRequired = true + } + + fmt.Println("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━") + + if missingRequired { + fmt.Printf("\n%s\n", i18n.T("setup_validation_incomplete_warning")) + fmt.Printf(" %s\n", i18n.T("setup_validation_incomplete_help")) + fmt.Println() + } else { + fmt.Printf("\n%s\n", i18n.T("setup_validation_complete")) + fmt.Println() + } +} + func (o *PluginRegistry) SetupVendor(vendorName string) (err error) { if err = o.VendorsAll.SetupVendor(vendorName, o.VendorManager.VendorsByName); err != nil { return diff --git a/internal/i18n/locales/de.json b/internal/i18n/locales/de.json index 74649225..20d167bd 100644 --- a/internal/i18n/locales/de.json +++ b/internal/i18n/locales/de.json @@ -1,165 +1,211 @@ { - "html_readability_error": "verwende ursprüngliche Eingabe, da HTML-Lesbarkeit nicht angewendet werden kann", - "vendor_not_configured": "Anbieter %s ist nicht konfiguriert", - "vendor_no_transcription_support": "Anbieter %s unterstützt keine Audio-Transkription", - "transcription_model_required": "Transkriptionsmodell ist erforderlich (verwende --transcribe-model)", - "youtube_not_configured": "YouTube ist nicht konfiguriert, bitte führe das Setup-Verfahren aus", - "youtube_api_key_required": "YouTube API-Schlüssel für Kommentare und Metadaten erforderlich. Führe 'fabric --setup' aus, um zu konfigurieren", - "youtube_ytdlp_not_found": "yt-dlp wurde nicht in PATH gefunden. Bitte installiere yt-dlp, um die YouTube-Transkript-Funktionalität zu nutzen", - "youtube_invalid_url": "ungültige YouTube-URL, kann keine Video- oder Playlist-ID abrufen: '%s'", - "youtube_url_is_playlist_not_video": "URL ist eine Playlist, kein Video", - "youtube_no_video_id_found": "keine Video-ID in URL gefunden", - "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_auth_required_bot_detection": "YouTube erfordert Authentifizierung (Bot-Erkennung). Verwende --yt-dlp-args='--cookies-from-browser BROWSER' wobei BROWSER chrome, firefox, brave usw. sein kann.", - "youtube_ytdlp_stderr_error": "Fehler beim Lesen von yt-dlp stderr", - "youtube_invalid_ytdlp_arguments": "ungültige yt-dlp-Argumente: %v", - "youtube_failed_create_temp_dir": "temporäres Verzeichnis konnte nicht erstellt werden: %v", - "youtube_no_transcript_content": "kein Transkriptinhalt in VTT-Datei gefunden", - "youtube_no_vtt_files_found": "keine VTT-Dateien im Verzeichnis gefunden", - "youtube_failed_walk_directory": "Verzeichnis konnte nicht durchlaufen werden: %v", - "youtube_error_getting_video_details": "Fehler beim Abrufen der Videodetails: %v", - "youtube_invalid_duration_string": "ungültige Dauer-Zeichenfolge: %s", - "youtube_error_getting_metadata": "Fehler beim Abrufen der Video-Metadaten: %v", - "youtube_error_parsing_duration": "Fehler beim Parsen der Videodauer: %v", - "youtube_error_getting_comments": "Fehler beim Abrufen der Kommentare: %v", - "youtube_error_saving_csv": "Fehler beim Speichern der Videos in CSV: %v", - "youtube_no_video_found_with_id": "kein Video mit ID gefunden: %s", - "youtube_invalid_timestamp_format": "ungültiges Zeitstempel-Format: %s", - "youtube_empty_seconds_string": "leere Sekunden-Zeichenfolge", - "youtube_invalid_seconds_format": "ungültiges Sekundenformat %q: %w", - "error_fetching_playlist_videos": "Fehler beim Abrufen der Playlist-Videos: %w", - "openai_api_base_url_not_configured": "API-Basis-URL für Anbieter %s nicht konfiguriert", - "openai_failed_to_create_models_url": "Modell-URL konnte nicht erstellt werden: %w", - "openai_unexpected_status_code_with_body": "unerwarteter Statuscode: %d von Anbieter %s, Antwort: %s", - "openai_unexpected_status_code_read_error_partial": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen: %v), teilweise Antwort: %s", - "openai_unexpected_status_code_read_error": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen der Antwort: %v)", - "openai_unable_to_parse_models_response": "Modell-Antwort konnte nicht geparst werden; rohe Antwort: %s", - "scraping_not_configured": "Scraping-Funktionalität ist nicht konfiguriert. Bitte richte Jina ein, um Scraping zu aktivieren", - "could_not_determine_home_dir": "konnte Benutzer-Home-Verzeichnis nicht bestimmen: %w", - "could_not_stat_env_file": "konnte .env-Datei nicht überprüfen: %w", - "could_not_create_config_dir": "konnte Konfigurationsverzeichnis nicht erstellen: %w", - "could_not_create_env_file": "konnte .env-Datei nicht erstellen: %w", - "could_not_copy_to_clipboard": "konnte nicht in die Zwischenablage kopieren: %v", - "file_already_exists_not_overwriting": "Datei %s existiert bereits, wird nicht überschrieben. Benenne die vorhandene Datei um oder wähle einen anderen Namen", - "error_creating_file": "Fehler beim Erstellen der Datei: %v", - "error_writing_to_file": "Fehler beim Schreiben in die Datei: %v", - "error_creating_audio_file": "Fehler beim Erstellen der Audio-Datei: %v", - "error_writing_audio_data": "Fehler beim Schreiben von Audio-Daten in die Datei: %v", - "tts_model_requires_audio_output": "TTS-Modell '%s' benötigt Audio-Ausgabe. Bitte gib eine Audio-Ausgabedatei mit dem -o Flag an (z.B., -o output.wav)", - "audio_output_file_specified_but_not_tts_model": "Audio-Ausgabedatei '%s' angegeben, aber Modell '%s' ist kein TTS-Modell. Bitte verwende ein TTS-Modell wie gemini-2.5-flash-preview-tts", - "file_already_exists_choose_different": "Datei %s existiert bereits. Bitte wähle einen anderen Dateinamen oder entferne die vorhandene Datei", - "no_notification_system_available": "kein Benachrichtigungssystem verfügbar", - "cannot_convert_string": "kann String %q nicht zu %v konvertieren", - "unsupported_conversion": "nicht unterstützte Konvertierung von %v zu %v", - "invalid_config_path": "ungültiger Konfigurationspfad: %w", - "config_file_not_found": "Konfigurationsdatei nicht gefunden: %s", - "error_reading_config_file": "Fehler beim Lesen der Konfigurationsdatei: %w", - "error_parsing_config_file": "Fehler beim Parsen der Konfigurationsdatei: %w", - "error_reading_piped_message": "Fehler beim Lesen der weitergeleiteten Nachricht von stdin: %w", - "image_file_already_exists": "Bilddatei existiert bereits: %s", - "invalid_image_file_extension": "ungültige Bilddatei-Erweiterung '%s'. Unterstützte Formate: .png, .jpeg, .jpg, .webp", - "image_parameters_require_image_file": "Bildparameter (--image-size, --image-quality, --image-background, --image-compression) können nur mit --image-file verwendet werden", - "invalid_image_size": "ungültige Bildgröße '%s'. Unterstützte Größen: 1024x1024, 1536x1024, 1024x1536, auto", - "invalid_image_quality": "ungültige Bildqualität '%s'. Unterstützte Qualitäten: low, medium, high, auto", - "invalid_image_background": "ungültiger Bildhintergrund '%s'. Unterstützte Hintergründe: opaque, transparent", - "image_compression_jpeg_webp_only": "Bildkomprimierung kann nur mit JPEG- und WebP-Formaten verwendet werden, nicht %s", - "image_compression_range_error": "Bildkomprimierung muss zwischen 0 und 100 liegen, erhalten: %d", - "transparent_background_png_webp_only": "transparenter Hintergrund kann nur mit PNG- und WebP-Formaten verwendet werden, nicht %s", - "available_transcription_models": "Verfügbare Transkriptionsmodelle:", - "tts_audio_generated_successfully": "TTS-Audio erfolgreich generiert und gespeichert unter: %s\n", - "fabric_command_complete": "Fabric-Befehl abgeschlossen", - "fabric_command_complete_with_pattern": "Fabric: %s abgeschlossen", - "command_completed_successfully": "Befehl erfolgreich abgeschlossen", - "output_truncated": "Ausgabe: %s...", - "output_full": "Ausgabe: %s", - "choose_pattern_from_available": "Wähle ein Muster aus den verfügbaren Mustern", - "pattern_variables_help": "Werte für Mustervariablen, z.B. -v=#role:expert -v=#points:30", - "choose_context_from_available": "Wähle einen Kontext aus den verfügbaren Kontexten", - "choose_session_from_available": "Wähle eine Sitzung aus den verfügbaren Sitzungen", - "attachment_path_or_url_help": "Anhangspfad oder URL (z.B. für OpenAI-Bilderkennungsnachrichten)", - "run_setup_for_reconfigurable_parts": "Setup für alle rekonfigurierbaren Teile von Fabric ausführen", - "set_temperature": "Temperatur festlegen", - "set_top_p": "Top P festlegen", - "stream_help": "Streaming", - "set_presence_penalty": "Präsenzstrafe festlegen", - "use_model_defaults_raw_help": "Verwende die Standardwerte des Modells, ohne Chat-Optionen (temperature, top_p usw.) zu senden. Gilt nur für OpenAI-kompatible Anbieter. Anthropic-Modelle verwenden stets eine intelligente Parameterauswahl, um modell-spezifische Anforderungen einzuhalten.", - "set_frequency_penalty": "Häufigkeitsstrafe festlegen", - "list_all_patterns": "Alle Muster auflisten", - "list_all_available_models": "Alle verfügbaren Modelle auflisten", - "list_all_contexts": "Alle Kontexte auflisten", - "list_all_sessions": "Alle Sitzungen auflisten", - "update_patterns": "Muster aktualisieren", - "messages_to_send_to_chat": "Nachrichten zum Senden an den Chat", - "copy_to_clipboard": "In Zwischenablage kopieren", - "choose_model": "Modell wählen", - "specify_vendor_for_model": "Anbieter für das ausgewählte Modell angeben (z.B., -V \"LM Studio\" -m openai/gpt-oss-20b)", - "model_context_length_ollama": "Modell-Kontextlänge (betrifft nur ollama)", - "output_to_file": "Ausgabe in Datei", - "output_entire_session": "Gesamte Sitzung (auch eine temporäre) in die Ausgabedatei ausgeben", - "number_of_latest_patterns": "Anzahl der neuesten Muster zum Auflisten", - "change_default_model": "Standardmodell ändern", - "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", - "prefer_playlist_over_video": "Playlist gegenüber Video bevorzugen, wenn beide IDs in der URL vorhanden sind", - "grab_transcript_from_youtube": "Transkript von YouTube-Video abrufen und an Chat senden (wird standardmäßig verwendet).", - "grab_transcript_with_timestamps": "Transkript von YouTube-Video mit Zeitstempeln abrufen und an Chat senden", - "grab_comments_from_youtube": "Kommentare von YouTube-Video abrufen und an Chat senden", - "output_video_metadata": "Video-Metadaten ausgeben", - "additional_yt_dlp_args": "Zusätzliche Argumente für yt-dlp (z.B. '--cookies-from-browser brave')", - "specify_language_code": "Sprachencode für den Chat angeben, z.B. -g=en -g=zh -g=pt-BR -g=pt-PT", - "scrape_website_url": "Website-URL zu Markdown mit Jina AI scrapen", - "search_question_jina": "Suchanfrage mit Jina AI", - "seed_for_lmm_generation": "Seed für LMM-Generierung", - "wipe_context": "Kontext löschen", - "wipe_session": "Sitzung löschen", - "print_context": "Kontext ausgeben", - "print_session": "Sitzung ausgeben", - "convert_html_readability": "HTML-Eingabe in eine saubere, lesbare Ansicht konvertieren", - "apply_variables_to_input": "Variablen auf Benutzereingabe anwenden", - "disable_pattern_variable_replacement": "Mustervariablenersetzung deaktivieren", - "show_dry_run": "Zeige, was an das Modell gesendet würde, ohne es tatsächlich zu senden", - "serve_fabric_rest_api": "Fabric REST API bereitstellen", - "serve_fabric_api_ollama_endpoints": "Fabric REST API mit ollama-Endpunkten bereitstellen", - "address_to_bind_rest_api": "Adresse zum Binden der REST API", - "api_key_secure_server_routes": "API-Schlüssel zum Sichern der Server-Routen", - "path_to_yaml_config": "Pfad zur YAML-Konfigurationsdatei", - "print_current_version": "Aktuelle Version ausgeben", - "list_all_registered_extensions": "Alle registrierten Erweiterungen auflisten", - "register_new_extension": "Neue Erweiterung aus Konfigurationsdateipfad registrieren", - "remove_registered_extension": "Registrierte Erweiterung nach Name entfernen", - "choose_strategy_from_available": "Strategie aus den verfügbaren Strategien wählen", - "list_all_strategies": "Alle Strategien auflisten", - "list_all_vendors": "Alle Anbieter auflisten", - "output_raw_list_shell_completion": "Rohe Liste ohne Kopfzeilen/Formatierung ausgeben (für Shell-Vervollständigung)", - "enable_web_search_tool": "Web-Such-Tool für unterstützte Modelle aktivieren (Anthropic, OpenAI, Gemini)", - "set_location_web_search": "Standort für Web-Suchergebnisse festlegen (z.B., 'America/Los_Angeles')", - "save_generated_image_to_file": "Generiertes Bild in angegebenem Dateipfad speichern (z.B., 'output.png')", - "image_dimensions_help": "Bildabmessungen: 1024x1024, 1536x1024, 1024x1536, auto (Standard: auto)", - "image_quality_help": "Bildqualität: low, medium, high, auto (Standard: auto)", - "compression_level_jpeg_webp": "Komprimierungslevel 0-100 für JPEG/WebP-Formate (Standard: nicht gesetzt)", - "background_type_help": "Hintergrundtyp: opaque, transparent (Standard: opaque, nur für PNG/WebP)", - "suppress_thinking_tags": "In Denk-Tags eingeschlossenen Text unterdrücken", - "start_tag_thinking_sections": "Start-Tag für Denk-Abschnitte", - "end_tag_thinking_sections": "End-Tag für Denk-Abschnitte", - "disable_openai_responses_api": "OpenAI Responses API deaktivieren (Standard: false)", - "audio_video_file_transcribe": "Audio- oder Video-Datei zum Transkribieren", - "model_for_transcription": "Modell für Transkription (getrennt vom Chat-Modell)", - "split_media_files_ffmpeg": "Audio/Video-Dateien größer als 25MB mit ffmpeg aufteilen", - "tts_voice_name": "TTS-Stimmenname für unterstützte Modelle (z.B., Kore, Charon, Puck)", - "list_gemini_tts_voices": "Alle verfügbaren Gemini TTS-Stimmen auflisten", - "list_transcription_models": "Alle verfügbaren Transkriptionsmodelle auflisten", - "send_desktop_notification": "Desktop-Benachrichtigung senden, wenn Befehl abgeschlossen ist", - "custom_notification_command": "Benutzerdefinierter Befehl für Benachrichtigungen (überschreibt eingebaute Benachrichtigungen)", - "set_reasoning_thinking_level": "Reasoning/Thinking-Level festlegen (z.B., off, low, medium, high, oder numerische Token für Anthropic oder Google Gemini)", - "set_debug_level": "Debug-Level festlegen (0=aus, 1=grundlegend, 2=detailliert, 3=Trace)", - "usage_header": "Verwendung:", - "application_options_header": "Anwendungsoptionen:", - "help_options_header": "Hilfe-Optionen:", - "help_message": "Diese Hilfenachricht anzeigen", - "options_placeholder": "[OPTIONEN]", - "available_vendors_header": "Verfügbare Anbieter:", - "available_models_header": "Verfügbare Modelle", - "no_items_found": "Keine %s", - "no_description_available": "Keine Beschreibung verfügbar", - "i18n_download_failed": "Fehler beim Herunterladen der Übersetzung für Sprache '%s': %v", - "i18n_load_failed": "Fehler beim Laden der Übersetzungsdatei: %v" + "html_readability_error": "verwende ursprüngliche Eingabe, da HTML-Lesbarkeit nicht angewendet werden kann", + "vendor_not_configured": "Anbieter %s ist nicht konfiguriert", + "vendor_no_transcription_support": "Anbieter %s unterstützt keine Audio-Transkription", + "transcription_model_required": "Transkriptionsmodell ist erforderlich (verwende --transcribe-model)", + "youtube_not_configured": "YouTube ist nicht konfiguriert, bitte führe das Setup-Verfahren aus", + "youtube_api_key_required": "YouTube API-Schlüssel für Kommentare und Metadaten erforderlich. Führe 'fabric --setup' aus, um zu konfigurieren", + "youtube_ytdlp_not_found": "yt-dlp wurde nicht in PATH gefunden. Bitte installiere yt-dlp, um die YouTube-Transkript-Funktionalität zu nutzen", + "youtube_invalid_url": "ungültige YouTube-URL, kann keine Video- oder Playlist-ID abrufen: '%s'", + "youtube_url_is_playlist_not_video": "URL ist eine Playlist, kein Video", + "youtube_no_video_id_found": "keine Video-ID in URL gefunden", + "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_auth_required_bot_detection": "YouTube erfordert Authentifizierung (Bot-Erkennung). Verwende --yt-dlp-args='--cookies-from-browser BROWSER' wobei BROWSER chrome, firefox, brave usw. sein kann.", + "youtube_ytdlp_stderr_error": "Fehler beim Lesen von yt-dlp stderr", + "youtube_invalid_ytdlp_arguments": "ungültige yt-dlp-Argumente: %v", + "youtube_failed_create_temp_dir": "temporäres Verzeichnis konnte nicht erstellt werden: %v", + "youtube_no_transcript_content": "kein Transkriptinhalt in VTT-Datei gefunden", + "youtube_no_vtt_files_found": "keine VTT-Dateien im Verzeichnis gefunden", + "youtube_failed_walk_directory": "Verzeichnis konnte nicht durchlaufen werden: %v", + "youtube_error_getting_video_details": "Fehler beim Abrufen der Videodetails: %v", + "youtube_invalid_duration_string": "ungültige Dauer-Zeichenfolge: %s", + "youtube_error_getting_metadata": "Fehler beim Abrufen der Video-Metadaten: %v", + "youtube_error_parsing_duration": "Fehler beim Parsen der Videodauer: %v", + "youtube_error_getting_comments": "Fehler beim Abrufen der Kommentare: %v", + "youtube_error_saving_csv": "Fehler beim Speichern der Videos in CSV: %v", + "youtube_no_video_found_with_id": "kein Video mit ID gefunden: %s", + "youtube_invalid_timestamp_format": "ungültiges Zeitstempel-Format: %s", + "youtube_empty_seconds_string": "leere Sekunden-Zeichenfolge", + "youtube_invalid_seconds_format": "ungültiges Sekundenformat %q: %w", + "error_fetching_playlist_videos": "Fehler beim Abrufen der Playlist-Videos: %w", + "openai_api_base_url_not_configured": "API-Basis-URL für Anbieter %s nicht konfiguriert", + "openai_failed_to_create_models_url": "Modell-URL konnte nicht erstellt werden: %w", + "openai_unexpected_status_code_with_body": "unerwarteter Statuscode: %d von Anbieter %s, Antwort: %s", + "openai_unexpected_status_code_read_error_partial": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen: %v), teilweise Antwort: %s", + "openai_unexpected_status_code_read_error": "unerwarteter Statuscode: %d von Anbieter %s (Fehler beim Lesen der Antwort: %v)", + "openai_unable_to_parse_models_response": "Modell-Antwort konnte nicht geparst werden; rohe Antwort: %s", + "scraping_not_configured": "Scraping-Funktionalität ist nicht konfiguriert. Bitte richte Jina ein, um Scraping zu aktivieren", + "could_not_determine_home_dir": "konnte Benutzer-Home-Verzeichnis nicht bestimmen: %w", + "could_not_stat_env_file": "konnte .env-Datei nicht überprüfen: %w", + "could_not_create_config_dir": "konnte Konfigurationsverzeichnis nicht erstellen: %w", + "could_not_create_env_file": "konnte .env-Datei nicht erstellen: %w", + "could_not_copy_to_clipboard": "konnte nicht in die Zwischenablage kopieren: %v", + "file_already_exists_not_overwriting": "Datei %s existiert bereits, wird nicht überschrieben. Benenne die vorhandene Datei um oder wähle einen anderen Namen", + "error_creating_file": "Fehler beim Erstellen der Datei: %v", + "error_writing_to_file": "Fehler beim Schreiben in die Datei: %v", + "error_creating_audio_file": "Fehler beim Erstellen der Audio-Datei: %v", + "error_writing_audio_data": "Fehler beim Schreiben von Audio-Daten in die Datei: %v", + "tts_model_requires_audio_output": "TTS-Modell '%s' benötigt Audio-Ausgabe. Bitte gib eine Audio-Ausgabedatei mit dem -o Flag an (z.B., -o output.wav)", + "audio_output_file_specified_but_not_tts_model": "Audio-Ausgabedatei '%s' angegeben, aber Modell '%s' ist kein TTS-Modell. Bitte verwende ein TTS-Modell wie gemini-2.5-flash-preview-tts", + "file_already_exists_choose_different": "Datei %s existiert bereits. Bitte wähle einen anderen Dateinamen oder entferne die vorhandene Datei", + "no_notification_system_available": "kein Benachrichtigungssystem verfügbar", + "cannot_convert_string": "kann String %q nicht zu %v konvertieren", + "unsupported_conversion": "nicht unterstützte Konvertierung von %v zu %v", + "invalid_config_path": "ungültiger Konfigurationspfad: %w", + "config_file_not_found": "Konfigurationsdatei nicht gefunden: %s", + "error_reading_config_file": "Fehler beim Lesen der Konfigurationsdatei: %w", + "error_parsing_config_file": "Fehler beim Parsen der Konfigurationsdatei: %w", + "error_reading_piped_message": "Fehler beim Lesen der weitergeleiteten Nachricht von stdin: %w", + "image_file_already_exists": "Bilddatei existiert bereits: %s", + "invalid_image_file_extension": "ungültige Bilddatei-Erweiterung '%s'. Unterstützte Formate: .png, .jpeg, .jpg, .webp", + "image_parameters_require_image_file": "Bildparameter (--image-size, --image-quality, --image-background, --image-compression) können nur mit --image-file verwendet werden", + "invalid_image_size": "ungültige Bildgröße '%s'. Unterstützte Größen: 1024x1024, 1536x1024, 1024x1536, auto", + "invalid_image_quality": "ungültige Bildqualität '%s'. Unterstützte Qualitäten: low, medium, high, auto", + "invalid_image_background": "ungültiger Bildhintergrund '%s'. Unterstützte Hintergründe: opaque, transparent", + "image_compression_jpeg_webp_only": "Bildkomprimierung kann nur mit JPEG- und WebP-Formaten verwendet werden, nicht %s", + "image_compression_range_error": "Bildkomprimierung muss zwischen 0 und 100 liegen, erhalten: %d", + "transparent_background_png_webp_only": "transparenter Hintergrund kann nur mit PNG- und WebP-Formaten verwendet werden, nicht %s", + "available_transcription_models": "Verfügbare Transkriptionsmodelle:", + "tts_audio_generated_successfully": "TTS-Audio erfolgreich generiert und gespeichert unter: %s\n", + "fabric_command_complete": "Fabric-Befehl abgeschlossen", + "fabric_command_complete_with_pattern": "Fabric: %s abgeschlossen", + "command_completed_successfully": "Befehl erfolgreich abgeschlossen", + "output_truncated": "Ausgabe: %s...", + "output_full": "Ausgabe: %s", + "choose_pattern_from_available": "Wähle ein Muster aus den verfügbaren Mustern", + "pattern_variables_help": "Werte für Mustervariablen, z.B. -v=#role:expert -v=#points:30", + "choose_context_from_available": "Wähle einen Kontext aus den verfügbaren Kontexten", + "choose_session_from_available": "Wähle eine Sitzung aus den verfügbaren Sitzungen", + "attachment_path_or_url_help": "Anhangspfad oder URL (z.B. für OpenAI-Bilderkennungsnachrichten)", + "run_setup_for_reconfigurable_parts": "Setup für alle rekonfigurierbaren Teile von Fabric ausführen", + "set_temperature": "Temperatur festlegen", + "set_top_p": "Top P festlegen", + "stream_help": "Streaming", + "set_presence_penalty": "Präsenzstrafe festlegen", + "use_model_defaults_raw_help": "Verwende die Standardwerte des Modells, ohne Chat-Optionen (temperature, top_p usw.) zu senden. Gilt nur für OpenAI-kompatible Anbieter. Anthropic-Modelle verwenden stets eine intelligente Parameterauswahl, um modell-spezifische Anforderungen einzuhalten.", + "set_frequency_penalty": "Häufigkeitsstrafe festlegen", + "list_all_patterns": "Alle Muster auflisten", + "list_all_available_models": "Alle verfügbaren Modelle auflisten", + "list_all_contexts": "Alle Kontexte auflisten", + "list_all_sessions": "Alle Sitzungen auflisten", + "update_patterns": "Muster aktualisieren", + "messages_to_send_to_chat": "Nachrichten zum Senden an den Chat", + "copy_to_clipboard": "In Zwischenablage kopieren", + "choose_model": "Modell wählen", + "specify_vendor_for_model": "Anbieter für das ausgewählte Modell angeben (z.B., -V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "Modell-Kontextlänge (betrifft nur ollama)", + "output_to_file": "Ausgabe in Datei", + "output_entire_session": "Gesamte Sitzung (auch eine temporäre) in die Ausgabedatei ausgeben", + "number_of_latest_patterns": "Anzahl der neuesten Muster zum Auflisten", + "change_default_model": "Standardmodell ändern", + "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", + "prefer_playlist_over_video": "Playlist gegenüber Video bevorzugen, wenn beide IDs in der URL vorhanden sind", + "grab_transcript_from_youtube": "Transkript von YouTube-Video abrufen und an Chat senden (wird standardmäßig verwendet).", + "grab_transcript_with_timestamps": "Transkript von YouTube-Video mit Zeitstempeln abrufen und an Chat senden", + "grab_comments_from_youtube": "Kommentare von YouTube-Video abrufen und an Chat senden", + "output_video_metadata": "Video-Metadaten ausgeben", + "additional_yt_dlp_args": "Zusätzliche Argumente für yt-dlp (z.B. '--cookies-from-browser brave')", + "specify_language_code": "Sprachencode für den Chat angeben, z.B. -g=en -g=zh -g=pt-BR -g=pt-PT", + "scrape_website_url": "Website-URL zu Markdown mit Jina AI scrapen", + "search_question_jina": "Suchanfrage mit Jina AI", + "seed_for_lmm_generation": "Seed für LMM-Generierung", + "wipe_context": "Kontext löschen", + "wipe_session": "Sitzung löschen", + "print_context": "Kontext ausgeben", + "print_session": "Sitzung ausgeben", + "convert_html_readability": "HTML-Eingabe in eine saubere, lesbare Ansicht konvertieren", + "apply_variables_to_input": "Variablen auf Benutzereingabe anwenden", + "disable_pattern_variable_replacement": "Mustervariablenersetzung deaktivieren", + "show_dry_run": "Zeige, was an das Modell gesendet würde, ohne es tatsächlich zu senden", + "serve_fabric_rest_api": "Fabric REST API bereitstellen", + "serve_fabric_api_ollama_endpoints": "Fabric REST API mit ollama-Endpunkten bereitstellen", + "address_to_bind_rest_api": "Adresse zum Binden der REST API", + "api_key_secure_server_routes": "API-Schlüssel zum Sichern der Server-Routen", + "path_to_yaml_config": "Pfad zur YAML-Konfigurationsdatei", + "print_current_version": "Aktuelle Version ausgeben", + "list_all_registered_extensions": "Alle registrierten Erweiterungen auflisten", + "register_new_extension": "Neue Erweiterung aus Konfigurationsdateipfad registrieren", + "remove_registered_extension": "Registrierte Erweiterung nach Name entfernen", + "choose_strategy_from_available": "Strategie aus den verfügbaren Strategien wählen", + "list_all_strategies": "Alle Strategien auflisten", + "list_all_vendors": "Alle Anbieter auflisten", + "output_raw_list_shell_completion": "Rohe Liste ohne Kopfzeilen/Formatierung ausgeben (für Shell-Vervollständigung)", + "enable_web_search_tool": "Web-Such-Tool für unterstützte Modelle aktivieren (Anthropic, OpenAI, Gemini)", + "set_location_web_search": "Standort für Web-Suchergebnisse festlegen (z.B., 'America/Los_Angeles')", + "save_generated_image_to_file": "Generiertes Bild in angegebenem Dateipfad speichern (z.B., 'output.png')", + "image_dimensions_help": "Bildabmessungen: 1024x1024, 1536x1024, 1024x1536, auto (Standard: auto)", + "image_quality_help": "Bildqualität: low, medium, high, auto (Standard: auto)", + "compression_level_jpeg_webp": "Komprimierungslevel 0-100 für JPEG/WebP-Formate (Standard: nicht gesetzt)", + "background_type_help": "Hintergrundtyp: opaque, transparent (Standard: opaque, nur für PNG/WebP)", + "suppress_thinking_tags": "In Denk-Tags eingeschlossenen Text unterdrücken", + "start_tag_thinking_sections": "Start-Tag für Denk-Abschnitte", + "end_tag_thinking_sections": "End-Tag für Denk-Abschnitte", + "disable_openai_responses_api": "OpenAI Responses API deaktivieren (Standard: false)", + "audio_video_file_transcribe": "Audio- oder Video-Datei zum Transkribieren", + "model_for_transcription": "Modell für Transkription (getrennt vom Chat-Modell)", + "split_media_files_ffmpeg": "Audio/Video-Dateien größer als 25MB mit ffmpeg aufteilen", + "tts_voice_name": "TTS-Stimmenname für unterstützte Modelle (z.B., Kore, Charon, Puck)", + "list_gemini_tts_voices": "Alle verfügbaren Gemini TTS-Stimmen auflisten", + "list_transcription_models": "Alle verfügbaren Transkriptionsmodelle auflisten", + "send_desktop_notification": "Desktop-Benachrichtigung senden, wenn Befehl abgeschlossen ist", + "custom_notification_command": "Benutzerdefinierter Befehl für Benachrichtigungen (überschreibt eingebaute Benachrichtigungen)", + "set_reasoning_thinking_level": "Reasoning/Thinking-Level festlegen (z.B., off, low, medium, high, oder numerische Token für Anthropic oder Google Gemini)", + "set_debug_level": "Debug-Level festlegen (0=aus, 1=grundlegend, 2=detailliert, 3=Trace)", + "usage_header": "Verwendung:", + "application_options_header": "Anwendungsoptionen:", + "help_options_header": "Hilfe-Optionen:", + "help_message": "Diese Hilfenachricht anzeigen", + "options_placeholder": "[OPTIONEN]", + "available_vendors_header": "Verfügbare Anbieter:", + "available_models_header": "Verfügbare Modelle", + "no_items_found": "Keine %s", + "no_description_available": "Keine Beschreibung verfügbar", + "i18n_download_failed": "Fehler beim Herunterladen der Übersetzung für Sprache '%s': %v", + "i18n_load_failed": "Fehler beim Laden der Übersetzungsdatei: %v", + "setup_welcome_header": "🎉 Willkommen bei Fabric! Lass uns mit der Einrichtung beginnen.", + "setup_step_downloading_patterns": "📥 Schritt 1: Patterns werden heruntergeladen (erforderlich für Fabric)...", + "setup_step_downloading_strategies": "📥 Schritt 2: Strategien werden heruntergeladen (erforderlich für Fabric)...", + "setup_step_configure_ai_provider": "🤖 Schritt 3: KI-Anbieter konfigurieren", + "setup_ai_provider_required": "Fabric benötigt mindestens einen KI-Anbieter.", + "setup_add_more_providers_later": "Sie können später weitere Anbieter mit 'fabric --setup' hinzufügen", + "setup_step_setting_defaults": "⚙️ Schritt 4: Standard-Anbieter und -Modell werden festgelegt...", + "setup_complete_header": "✅ Einrichtung abgeschlossen! Sie können Fabric jetzt verwenden.", + "setup_next_steps": "Nächste Schritte:", + "setup_list_patterns": "• Verfügbare Patterns auflisten: fabric -l", + "setup_try_pattern": "• Ein Pattern ausprobieren: echo 'Ihr Text' | fabric --pattern summarize", + "setup_configure_more": "• Weitere Einstellungen konfigurieren: fabric --setup", + "setup_failed_download_patterns": "Fehler beim Herunterladen der Patterns: %w", + "setup_failed_download_strategies": "Fehler beim Herunterladen der Strategien: %w", + "setup_failed_set_defaults": "Fehler beim Festlegen des Standard-Anbieters und -Modells: %w", + "setup_no_ai_provider_selected": "Kein KI-Anbieter ausgewählt - mindestens einer ist erforderlich", + "setup_invalid_selection": "Ungültige Auswahl: %s", + "setup_available_ai_providers": "Verfügbare KI-Anbieter:", + "setup_enter_ai_provider_number": "KI-Anbieter-Nummer", + "setup_available_plugins": "Verfügbare Plugins:", + "setup_plugin_number": "Plugin-Nummer", + "setup_required_configuration_header": "━━━ ERFORDERLICHE KONFIGURATION ━━━\n\nKI-Anbieter [mindestens einer erforderlich]", + "setup_required_tools": "Erforderliche Werkzeuge", + "setup_optional_configuration_header": "━━━ OPTIONALE KONFIGURATION ━━━\n\nOptionale Werkzeuge", + "setup_validation_header": "Konfigurationsstatus:", + "setup_validation_ai_provider_configured": "✓ KI-Anbieter konfiguriert", + "setup_validation_ai_provider_missing": "✗ KI-Anbieter nicht konfiguriert - Erforderlich für Fabric", + "setup_validation_defaults_configured": "✓ Standard-Anbieter/-Modell festgelegt: %s/%s", + "setup_validation_defaults_missing": "✗ Standard-Anbieter/-Modell nicht festgelegt - Erforderlich für Fabric", + "setup_validation_patterns_configured": "✓ Patterns heruntergeladen", + "setup_validation_patterns_missing": "✗ Patterns nicht gefunden - Erforderlich für Fabric", + "setup_validation_strategies_configured": "✓ Strategien heruntergeladen", + "setup_validation_strategies_missing": "✗ Strategien nicht gefunden - Erforderlich für Fabric", + "setup_validation_incomplete_warning": "⚠️ Einrichtung unvollständig! Erforderliche Komponenten fehlen.", + "setup_validation_incomplete_help": "Führen Sie 'fabric --setup' erneut aus, um fehlende Elemente zu konfigurieren,\noder 'fabric -U', um Patterns und Strategien herunterzuladen.", + "setup_validation_complete": "✓ Alle erforderlichen Komponenten konfiguriert!", + "patterns_not_found_header": "⚠️ Keine Patterns gefunden!", + "patterns_required_to_work": "Patterns sind erforderlich, damit Fabric funktioniert. Um dies zu beheben:", + "patterns_option_run_setup": "Option 1 (Empfohlen): Setup ausführen, um Patterns herunterzuladen", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Option 2: Patterns direkt herunterladen/aktualisieren", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "Pattern '%s' nicht gefunden.\n\nKeine Patterns installiert! Um dies zu beheben:\n • Führen Sie 'fabric --setup' aus, um Patterns zu konfigurieren und herunterzuladen\n • Oder führen Sie 'fabric -U' aus, um Patterns direkt herunterzuladen/zu aktualisieren", + "pattern_not_found_list_available": "Pattern '%s' nicht gefunden. Führen Sie 'fabric -l' aus, um verfügbare Patterns anzuzeigen", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NICHT KONFIGURIERT" } diff --git a/internal/i18n/locales/en.json b/internal/i18n/locales/en.json index 26d5330b..3ab72179 100644 --- a/internal/i18n/locales/en.json +++ b/internal/i18n/locales/en.json @@ -161,5 +161,51 @@ "no_items_found": "No %s", "no_description_available": "No description available", "i18n_download_failed": "Failed to download translation for language '%s': %v", - "i18n_load_failed": "Failed to load translation file: %v" + "i18n_load_failed": "Failed to load translation file: %v", + "setup_welcome_header": "🎉 Welcome to Fabric! Let's get you set up.", + "setup_step_downloading_patterns": "📥 Step 1: Downloading patterns (required for Fabric to work)...", + "setup_step_downloading_strategies": "📥 Step 2: Downloading strategies (required for Fabric to work)...", + "setup_step_configure_ai_provider": "🤖 Step 3: Configure an AI provider", + "setup_ai_provider_required": "Fabric needs at least one AI provider to work.", + "setup_add_more_providers_later": "You'll be able to add more providers later with 'fabric --setup'", + "setup_step_setting_defaults": "⚙️ Step 4: Setting default vendor and model...", + "setup_complete_header": "✅ Setup complete! You can now use Fabric.", + "setup_next_steps": "Next steps:", + "setup_list_patterns": "• List available patterns: fabric -l", + "setup_try_pattern": "• Try a pattern: echo 'your text' | fabric --pattern summarize", + "setup_configure_more": "• Configure more settings: fabric --setup", + "setup_failed_download_patterns": "failed to download patterns: %w", + "setup_failed_download_strategies": "failed to download strategies: %w", + "setup_failed_set_defaults": "failed to set default vendor and model: %w", + "setup_no_ai_provider_selected": "no AI provider selected - at least one is required", + "setup_invalid_selection": "invalid selection: %s", + "setup_available_ai_providers": "Available AI Providers:", + "setup_enter_ai_provider_number": "AI Provider Number", + "setup_available_plugins": "Available plugins:", + "setup_plugin_number": "Plugin Number", + "setup_required_configuration_header": "━━━ REQUIRED CONFIGURATION ━━━\n\nAI Vendors [at least one required]", + "setup_required_tools": "Required Tools", + "setup_optional_configuration_header": "━━━ OPTIONAL CONFIGURATION ━━━\n\nOptional Tools", + "setup_validation_header": "Configuration Status:", + "setup_validation_ai_provider_configured": "✓ AI Provider configured", + "setup_validation_ai_provider_missing": "✗ AI Provider not configured - Required for Fabric to work", + "setup_validation_defaults_configured": "✓ Default vendor/model set: %s/%s", + "setup_validation_defaults_missing": "✗ Default vendor/model not set - Required for Fabric to work", + "setup_validation_patterns_configured": "✓ Patterns downloaded", + "setup_validation_patterns_missing": "✗ Patterns not found - Required for Fabric to work", + "setup_validation_strategies_configured": "✓ Strategies downloaded", + "setup_validation_strategies_missing": "✗ Strategies not found - Required for Fabric to work", + "setup_validation_incomplete_warning": "⚠️ Setup incomplete! Missing required components.", + "setup_validation_incomplete_help": "Run 'fabric --setup' again to configure missing items,\nor run 'fabric -U' to download patterns and strategies.", + "setup_validation_complete": "✓ All required components configured!", + "patterns_not_found_header": "⚠️ No patterns found!", + "patterns_required_to_work": "Patterns are required for Fabric to work. To fix this:", + "patterns_option_run_setup": "Option 1 (Recommended): Run setup to download patterns", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Option 2: Download/update patterns directly", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "pattern '%s' not found.\n\nNo patterns are installed! To fix this:\n • Run 'fabric --setup' to configure and download patterns\n • Or run 'fabric -U' to download/update patterns directly", + "pattern_not_found_list_available": "pattern '%s' not found. Run 'fabric -l' to see available patterns", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NOT CONFIGURED" } diff --git a/internal/i18n/locales/es.json b/internal/i18n/locales/es.json index e70e76d3..0c716308 100644 --- a/internal/i18n/locales/es.json +++ b/internal/i18n/locales/es.json @@ -161,5 +161,51 @@ "no_items_found": "No hay %s", "no_description_available": "No hay descripción disponible", "i18n_download_failed": "Error al descargar traducción para el idioma '%s': %v", - "i18n_load_failed": "Error al cargar archivo de traducción: %v" + "i18n_load_failed": "Error al cargar archivo de traducción: %v", + "setup_welcome_header": "🎉 ¡Bienvenido a Fabric! Vamos a configurarte.", + "setup_step_downloading_patterns": "📥 Paso 1: Descargando patrones (requeridos para que Fabric funcione)...", + "setup_step_downloading_strategies": "📥 Paso 2: Descargando estrategias (requeridas para que Fabric funcione)...", + "setup_step_configure_ai_provider": "🤖 Paso 3: Configurar un proveedor de IA", + "setup_ai_provider_required": "Fabric necesita al menos un proveedor de IA para funcionar.", + "setup_add_more_providers_later": "Podrás agregar más proveedores después con 'fabric --setup'", + "setup_step_setting_defaults": "⚙️ Paso 4: Estableciendo proveedor y modelo predeterminados...", + "setup_complete_header": "✅ ¡Configuración completa! Ya puedes usar Fabric.", + "setup_next_steps": "Próximos pasos:", + "setup_list_patterns": "• Listar patrones disponibles: fabric -l", + "setup_try_pattern": "• Probar un patrón: echo 'tu texto' | fabric --pattern summarize", + "setup_configure_more": "• Configurar más opciones: fabric --setup", + "setup_failed_download_patterns": "error al descargar patrones: %w", + "setup_failed_download_strategies": "error al descargar estrategias: %w", + "setup_failed_set_defaults": "error al establecer proveedor y modelo predeterminados: %w", + "setup_no_ai_provider_selected": "no se seleccionó proveedor de IA - se requiere al menos uno", + "setup_invalid_selection": "selección inválida: %s", + "setup_available_ai_providers": "Proveedores de IA Disponibles:", + "setup_enter_ai_provider_number": "Número de Proveedor de IA", + "setup_available_plugins": "Plugins disponibles:", + "setup_plugin_number": "Número de Plugin", + "setup_required_configuration_header": "━━━ CONFIGURACIÓN REQUERIDA ━━━\n\nProveedores de IA [se requiere al menos uno]", + "setup_required_tools": "Herramientas Requeridas", + "setup_optional_configuration_header": "━━━ CONFIGURACIÓN OPCIONAL ━━━\n\nHerramientas Opcionales", + "setup_validation_header": "Estado de Configuración:", + "setup_validation_ai_provider_configured": "✓ Proveedor de IA configurado", + "setup_validation_ai_provider_missing": "✗ Proveedor de IA no configurado - Requerido para que Fabric funcione", + "setup_validation_defaults_configured": "✓ Proveedor/modelo predeterminado establecido: %s/%s", + "setup_validation_defaults_missing": "✗ Proveedor/modelo predeterminado no establecido - Requerido para que Fabric funcione", + "setup_validation_patterns_configured": "✓ Patrones descargados", + "setup_validation_patterns_missing": "✗ Patrones no encontrados - Requeridos para que Fabric funcione", + "setup_validation_strategies_configured": "✓ Estrategias descargadas", + "setup_validation_strategies_missing": "✗ Estrategias no encontradas - Requeridas para que Fabric funcione", + "setup_validation_incomplete_warning": "⚠️ ¡Configuración incompleta! Faltan componentes requeridos.", + "setup_validation_incomplete_help": "Ejecuta 'fabric --setup' de nuevo para configurar los elementos faltantes,\no ejecuta 'fabric -U' para descargar patrones y estrategias.", + "setup_validation_complete": "✓ ¡Todos los componentes requeridos configurados!", + "patterns_not_found_header": "⚠️ ¡No se encontraron patrones!", + "patterns_required_to_work": "Los patrones son requeridos para que Fabric funcione. Para solucionar esto:", + "patterns_option_run_setup": "Opción 1 (Recomendada): Ejecutar configuración para descargar patrones", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Opción 2: Descargar/actualizar patrones directamente", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "patrón '%s' no encontrado.\n\n¡No hay patrones instalados! Para solucionar esto:\n • Ejecuta 'fabric --setup' para configurar y descargar patrones\n • O ejecuta 'fabric -U' para descargar/actualizar patrones directamente", + "pattern_not_found_list_available": "patrón '%s' no encontrado. Ejecuta 'fabric -l' para ver los patrones disponibles", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NO CONFIGURADO" } diff --git a/internal/i18n/locales/fa.json b/internal/i18n/locales/fa.json index a5bbdec9..b2074754 100644 --- a/internal/i18n/locales/fa.json +++ b/internal/i18n/locales/fa.json @@ -161,5 +161,51 @@ "no_items_found": "هیچ %s", "no_description_available": "توضیحی در دسترس نیست", "i18n_download_failed": "دانلود ترجمه برای زبان '%s' ناموفق بود: %v", - "i18n_load_failed": "بارگذاری فایل ترجمه ناموفق بود: %v" + "i18n_load_failed": "بارگذاری فایل ترجمه ناموفق بود: %v", + "setup_welcome_header": "🎉 به Fabric خوش آمدید! بیایید تنظیمات را انجام دهیم.", + "setup_step_downloading_patterns": "📥 مرحله ۱: دانلود الگوها (برای کار Fabric ضروری است)...", + "setup_step_downloading_strategies": "📥 مرحله ۲: دانلود استراتژی‌ها (برای کار Fabric ضروری است)...", + "setup_step_configure_ai_provider": "🤖 مرحله ۳: پیکربندی یک ارائه‌دهنده هوش مصنوعی", + "setup_ai_provider_required": "Fabric برای کار کردن به حداقل یک ارائه‌دهنده هوش مصنوعی نیاز دارد.", + "setup_add_more_providers_later": "می‌توانید بعداً با 'fabric --setup' ارائه‌دهندگان بیشتری اضافه کنید", + "setup_step_setting_defaults": "⚙️ مرحله ۴: تنظیم ارائه‌دهنده و مدل پیش‌فرض...", + "setup_complete_header": "✅ تنظیمات کامل شد! اکنون می‌توانید از Fabric استفاده کنید.", + "setup_next_steps": "مراحل بعدی:", + "setup_list_patterns": "• نمایش الگوهای موجود: fabric -l", + "setup_try_pattern": "• امتحان یک الگو: echo 'متن شما' | fabric --pattern summarize", + "setup_configure_more": "• پیکربندی تنظیمات بیشتر: fabric --setup", + "setup_failed_download_patterns": "دانلود الگوها ناموفق بود: %w", + "setup_failed_download_strategies": "دانلود استراتژی‌ها ناموفق بود: %w", + "setup_failed_set_defaults": "تنظیم ارائه‌دهنده و مدل پیش‌فرض ناموفق بود: %w", + "setup_no_ai_provider_selected": "هیچ ارائه‌دهنده هوش مصنوعی انتخاب نشده - حداقل یکی ضروری است", + "setup_invalid_selection": "انتخاب نامعتبر: %s", + "setup_available_ai_providers": "ارائه‌دهندگان هوش مصنوعی موجود:", + "setup_enter_ai_provider_number": "شماره ارائه‌دهنده هوش مصنوعی", + "setup_available_plugins": "افزونه‌های موجود:", + "setup_plugin_number": "شماره افزونه", + "setup_required_configuration_header": "━━━ پیکربندی ضروری ━━━\n\nارائه‌دهندگان هوش مصنوعی [حداقل یکی ضروری است]", + "setup_required_tools": "ابزارهای ضروری", + "setup_optional_configuration_header": "━━━ پیکربندی اختیاری ━━━\n\nابزارهای اختیاری", + "setup_validation_header": "وضعیت پیکربندی:", + "setup_validation_ai_provider_configured": "✓ ارائه‌دهنده هوش مصنوعی پیکربندی شده", + "setup_validation_ai_provider_missing": "✗ ارائه‌دهنده هوش مصنوعی پیکربندی نشده - برای کار Fabric ضروری است", + "setup_validation_defaults_configured": "✓ ارائه‌دهنده/مدل پیش‌فرض تنظیم شده: %s/%s", + "setup_validation_defaults_missing": "✗ ارائه‌دهنده/مدل پیش‌فرض تنظیم نشده - برای کار Fabric ضروری است", + "setup_validation_patterns_configured": "✓ الگوها دانلود شده", + "setup_validation_patterns_missing": "✗ الگوها یافت نشد - برای کار Fabric ضروری است", + "setup_validation_strategies_configured": "✓ استراتژی‌ها دانلود شده", + "setup_validation_strategies_missing": "✗ استراتژی‌ها یافت نشد - برای کار Fabric ضروری است", + "setup_validation_incomplete_warning": "⚠️ تنظیمات ناقص! اجزای ضروری وجود ندارند.", + "setup_validation_incomplete_help": "دوباره 'fabric --setup' را اجرا کنید تا موارد ناقص را پیکربندی کنید،\nیا 'fabric -U' را برای دانلود الگوها و استراتژی‌ها اجرا کنید.", + "setup_validation_complete": "✓ تمام اجزای ضروری پیکربندی شده‌اند!", + "patterns_not_found_header": "⚠️ هیچ الگویی یافت نشد!", + "patterns_required_to_work": "الگوها برای کار Fabric ضروری هستند. برای رفع این مشکل:", + "patterns_option_run_setup": "گزینه ۱ (توصیه شده): اجرای تنظیمات برای دانلود الگوها", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "گزینه ۲: دانلود/به‌روزرسانی مستقیم الگوها", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "الگوی '%s' یافت نشد.\n\nهیچ الگویی نصب نشده است! برای رفع این مشکل:\n • 'fabric --setup' را برای پیکربندی و دانلود الگوها اجرا کنید\n • یا 'fabric -U' را برای دانلود/به‌روزرسانی الگوها اجرا کنید", + "pattern_not_found_list_available": "الگوی '%s' یافت نشد. برای مشاهده الگوهای موجود 'fabric -l' را اجرا کنید", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ پیکربندی نشده" } diff --git a/internal/i18n/locales/fr.json b/internal/i18n/locales/fr.json index 7368a87a..28743bcb 100644 --- a/internal/i18n/locales/fr.json +++ b/internal/i18n/locales/fr.json @@ -161,5 +161,51 @@ "no_items_found": "Aucun %s", "no_description_available": "Aucune description disponible", "i18n_download_failed": "Échec du téléchargement de la traduction pour la langue '%s' : %v", - "i18n_load_failed": "Échec du chargement du fichier de traduction : %v" + "i18n_load_failed": "Échec du chargement du fichier de traduction : %v", + "setup_welcome_header": "🎉 Bienvenue sur Fabric ! Configurons votre installation.", + "setup_step_downloading_patterns": "📥 Étape 1 : Téléchargement des modèles (requis pour le fonctionnement de Fabric)...", + "setup_step_downloading_strategies": "📥 Étape 2 : Téléchargement des stratégies (requis pour le fonctionnement de Fabric)...", + "setup_step_configure_ai_provider": "🤖 Étape 3 : Configurer un fournisseur d'IA", + "setup_ai_provider_required": "Fabric a besoin d'au moins un fournisseur d'IA pour fonctionner.", + "setup_add_more_providers_later": "Vous pourrez ajouter d'autres fournisseurs plus tard avec 'fabric --setup'", + "setup_step_setting_defaults": "⚙️ Étape 4 : Configuration du fournisseur et du modèle par défaut...", + "setup_complete_header": "✅ Configuration terminée ! Vous pouvez maintenant utiliser Fabric.", + "setup_next_steps": "Prochaines étapes :", + "setup_list_patterns": "• Lister les modèles disponibles : fabric -l", + "setup_try_pattern": "• Essayer un modèle : echo 'votre texte' | fabric --pattern summarize", + "setup_configure_more": "• Configurer plus de paramètres : fabric --setup", + "setup_failed_download_patterns": "échec du téléchargement des modèles : %w", + "setup_failed_download_strategies": "échec du téléchargement des stratégies : %w", + "setup_failed_set_defaults": "échec de la configuration du fournisseur et du modèle par défaut : %w", + "setup_no_ai_provider_selected": "aucun fournisseur d'IA sélectionné - au moins un est requis", + "setup_invalid_selection": "sélection invalide : %s", + "setup_available_ai_providers": "Fournisseurs d'IA disponibles :", + "setup_enter_ai_provider_number": "Numéro du fournisseur d'IA", + "setup_available_plugins": "Plugins disponibles :", + "setup_plugin_number": "Numéro du plugin", + "setup_required_configuration_header": "━━━ CONFIGURATION REQUISE ━━━\n\nFournisseurs d'IA [au moins un requis]", + "setup_required_tools": "Outils requis", + "setup_optional_configuration_header": "━━━ CONFIGURATION OPTIONNELLE ━━━\n\nOutils optionnels", + "setup_validation_header": "État de la configuration :", + "setup_validation_ai_provider_configured": "✓ Fournisseur d'IA configuré", + "setup_validation_ai_provider_missing": "✗ Fournisseur d'IA non configuré - Requis pour le fonctionnement de Fabric", + "setup_validation_defaults_configured": "✓ Fournisseur/modèle par défaut défini : %s/%s", + "setup_validation_defaults_missing": "✗ Fournisseur/modèle par défaut non défini - Requis pour le fonctionnement de Fabric", + "setup_validation_patterns_configured": "✓ Modèles téléchargés", + "setup_validation_patterns_missing": "✗ Modèles non trouvés - Requis pour le fonctionnement de Fabric", + "setup_validation_strategies_configured": "✓ Stratégies téléchargées", + "setup_validation_strategies_missing": "✗ Stratégies non trouvées - Requises pour le fonctionnement de Fabric", + "setup_validation_incomplete_warning": "⚠️ Configuration incomplète ! Composants requis manquants.", + "setup_validation_incomplete_help": "Exécutez à nouveau 'fabric --setup' pour configurer les éléments manquants,\nou exécutez 'fabric -U' pour télécharger les modèles et stratégies.", + "setup_validation_complete": "✓ Tous les composants requis sont configurés !", + "patterns_not_found_header": "⚠️ Aucun modèle trouvé !", + "patterns_required_to_work": "Les modèles sont requis pour le fonctionnement de Fabric. Pour résoudre ce problème :", + "patterns_option_run_setup": "Option 1 (Recommandée) : Exécuter la configuration pour télécharger les modèles", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Option 2 : Télécharger/mettre à jour les modèles directement", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "modèle '%s' non trouvé.\n\nAucun modèle n'est installé ! Pour résoudre ce problème :\n • Exécutez 'fabric --setup' pour configurer et télécharger les modèles\n • Ou exécutez 'fabric -U' pour télécharger/mettre à jour les modèles directement", + "pattern_not_found_list_available": "modèle '%s' non trouvé. Exécutez 'fabric -l' pour voir les modèles disponibles", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NON CONFIGURÉ" } diff --git a/internal/i18n/locales/it.json b/internal/i18n/locales/it.json index a50d63b8..e6466075 100644 --- a/internal/i18n/locales/it.json +++ b/internal/i18n/locales/it.json @@ -161,5 +161,51 @@ "no_items_found": "Nessun %s", "no_description_available": "Nessuna descrizione disponibile", "i18n_download_failed": "Fallito il download della traduzione per la lingua '%s': %v", - "i18n_load_failed": "Fallito il caricamento del file di traduzione: %v" + "i18n_load_failed": "Fallito il caricamento del file di traduzione: %v", + "setup_welcome_header": "🎉 Benvenuto su Fabric! Configuriamo tutto.", + "setup_step_downloading_patterns": "📥 Passo 1: Download dei pattern (richiesti per il funzionamento di Fabric)...", + "setup_step_downloading_strategies": "📥 Passo 2: Download delle strategie (richieste per il funzionamento di Fabric)...", + "setup_step_configure_ai_provider": "🤖 Passo 3: Configura un fornitore di IA", + "setup_ai_provider_required": "Fabric necessita di almeno un fornitore di IA per funzionare.", + "setup_add_more_providers_later": "Potrai aggiungere altri fornitori in seguito con 'fabric --setup'", + "setup_step_setting_defaults": "⚙️ Passo 4: Impostazione del fornitore e del modello predefiniti...", + "setup_complete_header": "✅ Configurazione completata! Ora puoi usare Fabric.", + "setup_next_steps": "Prossimi passi:", + "setup_list_patterns": "• Elenca i pattern disponibili: fabric -l", + "setup_try_pattern": "• Prova un pattern: echo 'il tuo testo' | fabric --pattern summarize", + "setup_configure_more": "• Configura altre impostazioni: fabric --setup", + "setup_failed_download_patterns": "download dei pattern fallito: %w", + "setup_failed_download_strategies": "download delle strategie fallito: %w", + "setup_failed_set_defaults": "impostazione del fornitore e del modello predefiniti fallita: %w", + "setup_no_ai_provider_selected": "nessun fornitore di IA selezionato - almeno uno è richiesto", + "setup_invalid_selection": "selezione non valida: %s", + "setup_available_ai_providers": "Fornitori di IA disponibili:", + "setup_enter_ai_provider_number": "Numero del fornitore di IA", + "setup_available_plugins": "Plugin disponibili:", + "setup_plugin_number": "Numero del plugin", + "setup_required_configuration_header": "━━━ CONFIGURAZIONE RICHIESTA ━━━\n\nFornitori di IA [almeno uno richiesto]", + "setup_required_tools": "Strumenti richiesti", + "setup_optional_configuration_header": "━━━ CONFIGURAZIONE OPZIONALE ━━━\n\nStrumenti opzionali", + "setup_validation_header": "Stato della configurazione:", + "setup_validation_ai_provider_configured": "✓ Fornitore di IA configurato", + "setup_validation_ai_provider_missing": "✗ Fornitore di IA non configurato - Richiesto per il funzionamento di Fabric", + "setup_validation_defaults_configured": "✓ Fornitore/modello predefinito impostato: %s/%s", + "setup_validation_defaults_missing": "✗ Fornitore/modello predefinito non impostato - Richiesto per il funzionamento di Fabric", + "setup_validation_patterns_configured": "✓ Pattern scaricati", + "setup_validation_patterns_missing": "✗ Pattern non trovati - Richiesti per il funzionamento di Fabric", + "setup_validation_strategies_configured": "✓ Strategie scaricate", + "setup_validation_strategies_missing": "✗ Strategie non trovate - Richieste per il funzionamento di Fabric", + "setup_validation_incomplete_warning": "⚠️ Configurazione incompleta! Componenti richiesti mancanti.", + "setup_validation_incomplete_help": "Esegui di nuovo 'fabric --setup' per configurare gli elementi mancanti,\noppure esegui 'fabric -U' per scaricare pattern e strategie.", + "setup_validation_complete": "✓ Tutti i componenti richiesti sono configurati!", + "patterns_not_found_header": "⚠️ Nessun pattern trovato!", + "patterns_required_to_work": "I pattern sono richiesti per il funzionamento di Fabric. Per risolvere:", + "patterns_option_run_setup": "Opzione 1 (Consigliata): Esegui la configurazione per scaricare i pattern", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Opzione 2: Scarica/aggiorna i pattern direttamente", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "pattern '%s' non trovato.\n\nNessun pattern installato! Per risolvere:\n • Esegui 'fabric --setup' per configurare e scaricare i pattern\n • Oppure esegui 'fabric -U' per scaricare/aggiornare i pattern direttamente", + "pattern_not_found_list_available": "pattern '%s' non trovato. Esegui 'fabric -l' per vedere i pattern disponibili", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NON CONFIGURATO" } diff --git a/internal/i18n/locales/ja.json b/internal/i18n/locales/ja.json index df74ac55..7490c562 100644 --- a/internal/i18n/locales/ja.json +++ b/internal/i18n/locales/ja.json @@ -161,5 +161,51 @@ "no_items_found": "%s がありません", "no_description_available": "説明がありません", "i18n_download_failed": "言語 '%s' の翻訳のダウンロードに失敗しました: %v", - "i18n_load_failed": "翻訳ファイルの読み込みに失敗しました: %v" + "i18n_load_failed": "翻訳ファイルの読み込みに失敗しました: %v", + "setup_welcome_header": "🎉 Fabricへようこそ!セットアップを始めましょう。", + "setup_step_downloading_patterns": "📥 ステップ1: パターンをダウンロード中(Fabricの動作に必要です)...", + "setup_step_downloading_strategies": "📥 ステップ2: ストラテジーをダウンロード中(Fabricの動作に必要です)...", + "setup_step_configure_ai_provider": "🤖 ステップ3: AIプロバイダーを設定", + "setup_ai_provider_required": "Fabricを動作させるには、少なくとも1つのAIプロバイダーが必要です。", + "setup_add_more_providers_later": "'fabric --setup'で後からプロバイダーを追加できます", + "setup_step_setting_defaults": "⚙️ ステップ4: デフォルトのベンダーとモデルを設定中...", + "setup_complete_header": "✅ セットアップ完了!Fabricを使用できます。", + "setup_next_steps": "次のステップ:", + "setup_list_patterns": "• 利用可能なパターンを一覧表示: fabric -l", + "setup_try_pattern": "• パターンを試す: echo 'テキスト' | fabric --pattern summarize", + "setup_configure_more": "• その他の設定: fabric --setup", + "setup_failed_download_patterns": "パターンのダウンロードに失敗しました: %w", + "setup_failed_download_strategies": "ストラテジーのダウンロードに失敗しました: %w", + "setup_failed_set_defaults": "デフォルトのベンダーとモデルの設定に失敗しました: %w", + "setup_no_ai_provider_selected": "AIプロバイダーが選択されていません - 少なくとも1つは必要です", + "setup_invalid_selection": "無効な選択: %s", + "setup_available_ai_providers": "利用可能なAIプロバイダー:", + "setup_enter_ai_provider_number": "AIプロバイダー番号", + "setup_available_plugins": "利用可能なプラグイン:", + "setup_plugin_number": "プラグイン番号", + "setup_required_configuration_header": "━━━ 必須設定 ━━━\n\nAIベンダー [少なくとも1つ必要]", + "setup_required_tools": "必須ツール", + "setup_optional_configuration_header": "━━━ オプション設定 ━━━\n\nオプションツール", + "setup_validation_header": "設定状況:", + "setup_validation_ai_provider_configured": "✓ AIプロバイダー設定済み", + "setup_validation_ai_provider_missing": "✗ AIプロバイダー未設定 - Fabricの動作に必要です", + "setup_validation_defaults_configured": "✓ デフォルトのベンダー/モデル設定済み: %s/%s", + "setup_validation_defaults_missing": "✗ デフォルトのベンダー/モデル未設定 - Fabricの動作に必要です", + "setup_validation_patterns_configured": "✓ パターンダウンロード済み", + "setup_validation_patterns_missing": "✗ パターンが見つかりません - Fabricの動作に必要です", + "setup_validation_strategies_configured": "✓ ストラテジーダウンロード済み", + "setup_validation_strategies_missing": "✗ ストラテジーが見つかりません - Fabricの動作に必要です", + "setup_validation_incomplete_warning": "⚠️ セットアップ未完了!必要なコンポーネントが不足しています。", + "setup_validation_incomplete_help": "'fabric --setup'を再度実行して不足項目を設定するか、\n'fabric -U'を実行してパターンとストラテジーをダウンロードしてください。", + "setup_validation_complete": "✓ 必要なコンポーネントがすべて設定されています!", + "patterns_not_found_header": "⚠️ パターンが見つかりません!", + "patterns_required_to_work": "Fabricを動作させるにはパターンが必要です。解決するには:", + "patterns_option_run_setup": "オプション1(推奨): セットアップを実行してパターンをダウンロード", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "オプション2: パターンを直接ダウンロード/更新", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "パターン '%s' が見つかりません。\n\nパターンがインストールされていません!解決するには:\n • 'fabric --setup'を実行してパターンを設定・ダウンロード\n • または'fabric -U'を実行してパターンをダウンロード/更新", + "pattern_not_found_list_available": "パターン '%s' が見つかりません。'fabric -l'で利用可能なパターンを確認してください", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ 未設定" } diff --git a/internal/i18n/locales/pt-BR.json b/internal/i18n/locales/pt-BR.json index fb05e8f4..61be781d 100644 --- a/internal/i18n/locales/pt-BR.json +++ b/internal/i18n/locales/pt-BR.json @@ -161,5 +161,51 @@ "no_items_found": "Nenhum %s", "no_description_available": "Nenhuma descrição disponível", "i18n_download_failed": "Falha ao baixar tradução para o idioma '%s': %v", - "i18n_load_failed": "Falha ao carregar arquivo de tradução: %v" + "i18n_load_failed": "Falha ao carregar arquivo de tradução: %v", + "setup_welcome_header": "🎉 Bem-vindo ao Fabric! Vamos configurar tudo.", + "setup_step_downloading_patterns": "📥 Passo 1: Baixando padrões (necessários para o Fabric funcionar)...", + "setup_step_downloading_strategies": "📥 Passo 2: Baixando estratégias (necessárias para o Fabric funcionar)...", + "setup_step_configure_ai_provider": "🤖 Passo 3: Configurar um provedor de IA", + "setup_ai_provider_required": "O Fabric precisa de pelo menos um provedor de IA para funcionar.", + "setup_add_more_providers_later": "Você poderá adicionar mais provedores depois com 'fabric --setup'", + "setup_step_setting_defaults": "⚙️ Passo 4: Configurando provedor e modelo padrão...", + "setup_complete_header": "✅ Configuração completa! Agora você pode usar o Fabric.", + "setup_next_steps": "Próximos passos:", + "setup_list_patterns": "• Listar padrões disponíveis: fabric -l", + "setup_try_pattern": "• Experimentar um padrão: echo 'seu texto' | fabric --pattern summarize", + "setup_configure_more": "• Configurar mais opções: fabric --setup", + "setup_failed_download_patterns": "falha ao baixar padrões: %w", + "setup_failed_download_strategies": "falha ao baixar estratégias: %w", + "setup_failed_set_defaults": "falha ao configurar provedor e modelo padrão: %w", + "setup_no_ai_provider_selected": "nenhum provedor de IA selecionado - pelo menos um é necessário", + "setup_invalid_selection": "seleção inválida: %s", + "setup_available_ai_providers": "Provedores de IA Disponíveis:", + "setup_enter_ai_provider_number": "Número do Provedor de IA", + "setup_available_plugins": "Plugins disponíveis:", + "setup_plugin_number": "Número do Plugin", + "setup_required_configuration_header": "━━━ CONFIGURAÇÃO OBRIGATÓRIA ━━━\n\nProvedores de IA [pelo menos um obrigatório]", + "setup_required_tools": "Ferramentas Obrigatórias", + "setup_optional_configuration_header": "━━━ CONFIGURAÇÃO OPCIONAL ━━━\n\nFerramentas Opcionais", + "setup_validation_header": "Status da Configuração:", + "setup_validation_ai_provider_configured": "✓ Provedor de IA configurado", + "setup_validation_ai_provider_missing": "✗ Provedor de IA não configurado - Necessário para o Fabric funcionar", + "setup_validation_defaults_configured": "✓ Provedor/modelo padrão definido: %s/%s", + "setup_validation_defaults_missing": "✗ Provedor/modelo padrão não definido - Necessário para o Fabric funcionar", + "setup_validation_patterns_configured": "✓ Padrões baixados", + "setup_validation_patterns_missing": "✗ Padrões não encontrados - Necessários para o Fabric funcionar", + "setup_validation_strategies_configured": "✓ Estratégias baixadas", + "setup_validation_strategies_missing": "✗ Estratégias não encontradas - Necessárias para o Fabric funcionar", + "setup_validation_incomplete_warning": "⚠️ Configuração incompleta! Componentes necessários ausentes.", + "setup_validation_incomplete_help": "Execute 'fabric --setup' novamente para configurar itens faltantes,\nou execute 'fabric -U' para baixar padrões e estratégias.", + "setup_validation_complete": "✓ Todos os componentes necessários estão configurados!", + "patterns_not_found_header": "⚠️ Nenhum padrão encontrado!", + "patterns_required_to_work": "Padrões são necessários para o Fabric funcionar. Para resolver:", + "patterns_option_run_setup": "Opção 1 (Recomendada): Execute a configuração para baixar padrões", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Opção 2: Baixar/atualizar padrões diretamente", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "padrão '%s' não encontrado.\n\nNenhum padrão instalado! Para resolver:\n • Execute 'fabric --setup' para configurar e baixar padrões\n • Ou execute 'fabric -U' para baixar/atualizar padrões diretamente", + "pattern_not_found_list_available": "padrão '%s' não encontrado. Execute 'fabric -l' para ver os padrões disponíveis", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NÃO CONFIGURADO" } diff --git a/internal/i18n/locales/pt-PT.json b/internal/i18n/locales/pt-PT.json index 2b9a118c..ef806880 100644 --- a/internal/i18n/locales/pt-PT.json +++ b/internal/i18n/locales/pt-PT.json @@ -161,5 +161,51 @@ "no_items_found": "Nenhum %s", "no_description_available": "Nenhuma descrição disponível", "i18n_download_failed": "Falha ao descarregar tradução para o idioma '%s': %v", - "i18n_load_failed": "Falha ao carregar ficheiro de tradução: %v" + "i18n_load_failed": "Falha ao carregar ficheiro de tradução: %v", + "setup_welcome_header": "🎉 Bem-vindo ao Fabric! Vamos configurar tudo.", + "setup_step_downloading_patterns": "📥 Passo 1: A descarregar padrões (necessários para o Fabric funcionar)...", + "setup_step_downloading_strategies": "📥 Passo 2: A descarregar estratégias (necessárias para o Fabric funcionar)...", + "setup_step_configure_ai_provider": "🤖 Passo 3: Configurar um fornecedor de IA", + "setup_ai_provider_required": "O Fabric precisa de pelo menos um fornecedor de IA para funcionar.", + "setup_add_more_providers_later": "Poderá adicionar mais fornecedores depois com 'fabric --setup'", + "setup_step_setting_defaults": "⚙️ Passo 4: A configurar fornecedor e modelo predefinido...", + "setup_complete_header": "✅ Configuração completa! Agora pode usar o Fabric.", + "setup_next_steps": "Próximos passos:", + "setup_list_patterns": "• Listar padrões disponíveis: fabric -l", + "setup_try_pattern": "• Experimentar um padrão: echo 'o seu texto' | fabric --pattern summarize", + "setup_configure_more": "• Configurar mais opções: fabric --setup", + "setup_failed_download_patterns": "falha ao descarregar padrões: %w", + "setup_failed_download_strategies": "falha ao descarregar estratégias: %w", + "setup_failed_set_defaults": "falha ao configurar fornecedor e modelo predefinido: %w", + "setup_no_ai_provider_selected": "nenhum fornecedor de IA selecionado - pelo menos um é necessário", + "setup_invalid_selection": "seleção inválida: %s", + "setup_available_ai_providers": "Fornecedores de IA Disponíveis:", + "setup_enter_ai_provider_number": "Número do Fornecedor de IA", + "setup_available_plugins": "Plugins disponíveis:", + "setup_plugin_number": "Número do Plugin", + "setup_required_configuration_header": "━━━ CONFIGURAÇÃO OBRIGATÓRIA ━━━\n\nFornecedores de IA [pelo menos um obrigatório]", + "setup_required_tools": "Ferramentas Obrigatórias", + "setup_optional_configuration_header": "━━━ CONFIGURAÇÃO OPCIONAL ━━━\n\nFerramentas Opcionais", + "setup_validation_header": "Estado da Configuração:", + "setup_validation_ai_provider_configured": "✓ Fornecedor de IA configurado", + "setup_validation_ai_provider_missing": "✗ Fornecedor de IA não configurado - Necessário para o Fabric funcionar", + "setup_validation_defaults_configured": "✓ Fornecedor/modelo predefinido definido: %s/%s", + "setup_validation_defaults_missing": "✗ Fornecedor/modelo predefinido não definido - Necessário para o Fabric funcionar", + "setup_validation_patterns_configured": "✓ Padrões descarregados", + "setup_validation_patterns_missing": "✗ Padrões não encontrados - Necessários para o Fabric funcionar", + "setup_validation_strategies_configured": "✓ Estratégias descarregadas", + "setup_validation_strategies_missing": "✗ Estratégias não encontradas - Necessárias para o Fabric funcionar", + "setup_validation_incomplete_warning": "⚠️ Configuração incompleta! Componentes necessários em falta.", + "setup_validation_incomplete_help": "Execute 'fabric --setup' novamente para configurar itens em falta,\nou execute 'fabric -U' para descarregar padrões e estratégias.", + "setup_validation_complete": "✓ Todos os componentes necessários estão configurados!", + "patterns_not_found_header": "⚠️ Nenhum padrão encontrado!", + "patterns_required_to_work": "Padrões são necessários para o Fabric funcionar. Para resolver:", + "patterns_option_run_setup": "Opção 1 (Recomendada): Execute a configuração para descarregar padrões", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "Opção 2: Descarregar/atualizar padrões diretamente", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "padrão '%s' não encontrado.\n\nNenhum padrão instalado! Para resolver:\n • Execute 'fabric --setup' para configurar e descarregar padrões\n • Ou execute 'fabric -U' para descarregar/atualizar padrões diretamente", + "pattern_not_found_list_available": "padrão '%s' não encontrado. Execute 'fabric -l' para ver os padrões disponíveis", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ NÃO CONFIGURADO" } diff --git a/internal/i18n/locales/zh.json b/internal/i18n/locales/zh.json index 9dee849e..d0feda53 100644 --- a/internal/i18n/locales/zh.json +++ b/internal/i18n/locales/zh.json @@ -161,5 +161,51 @@ "no_items_found": "没有 %s", "no_description_available": "没有可用描述", "i18n_download_failed": "下载语言 '%s' 的翻译失败: %v", - "i18n_load_failed": "加载翻译文件失败: %v" + "i18n_load_failed": "加载翻译文件失败: %v", + "setup_welcome_header": "🎉 欢迎使用 Fabric!让我们开始设置。", + "setup_step_downloading_patterns": "📥 步骤 1:正在下载模式(Fabric 运行所需)...", + "setup_step_downloading_strategies": "📥 步骤 2:正在下载策略(Fabric 运行所需)...", + "setup_step_configure_ai_provider": "🤖 步骤 3:配置 AI 提供商", + "setup_ai_provider_required": "Fabric 需要至少一个 AI 提供商才能运行。", + "setup_add_more_providers_later": "您可以稍后通过 'fabric --setup' 添加更多提供商", + "setup_step_setting_defaults": "⚙️ 步骤 4:正在设置默认提供商和模型...", + "setup_complete_header": "✅ 设置完成!您现在可以使用 Fabric 了。", + "setup_next_steps": "下一步:", + "setup_list_patterns": "• 列出可用模式:fabric -l", + "setup_try_pattern": "• 尝试一个模式:echo '您的文本' | fabric --pattern summarize", + "setup_configure_more": "• 配置更多设置:fabric --setup", + "setup_failed_download_patterns": "下载模式失败:%w", + "setup_failed_download_strategies": "下载策略失败:%w", + "setup_failed_set_defaults": "设置默认提供商和模型失败:%w", + "setup_no_ai_provider_selected": "未选择 AI 提供商 - 至少需要一个", + "setup_invalid_selection": "无效的选择:%s", + "setup_available_ai_providers": "可用的 AI 提供商:", + "setup_enter_ai_provider_number": "AI 提供商编号", + "setup_available_plugins": "可用的插件:", + "setup_plugin_number": "插件编号", + "setup_required_configuration_header": "━━━ 必需配置 ━━━\n\nAI 提供商 [至少需要一个]", + "setup_required_tools": "必需工具", + "setup_optional_configuration_header": "━━━ 可选配置 ━━━\n\n可选工具", + "setup_validation_header": "配置状态:", + "setup_validation_ai_provider_configured": "✓ AI 提供商已配置", + "setup_validation_ai_provider_missing": "✗ AI 提供商未配置 - Fabric 运行所需", + "setup_validation_defaults_configured": "✓ 默认提供商/模型已设置:%s/%s", + "setup_validation_defaults_missing": "✗ 默认提供商/模型未设置 - Fabric 运行所需", + "setup_validation_patterns_configured": "✓ 模式已下载", + "setup_validation_patterns_missing": "✗ 未找到模式 - Fabric 运行所需", + "setup_validation_strategies_configured": "✓ 策略已下载", + "setup_validation_strategies_missing": "✗ 未找到策略 - Fabric 运行所需", + "setup_validation_incomplete_warning": "⚠️ 设置不完整!缺少必需组件。", + "setup_validation_incomplete_help": "再次运行 'fabric --setup' 配置缺失项,\n或运行 'fabric -U' 下载模式和策略。", + "setup_validation_complete": "✓ 所有必需组件已配置!", + "patterns_not_found_header": "⚠️ 未找到模式!", + "patterns_required_to_work": "Fabric 需要模式才能运行。要解决此问题:", + "patterns_option_run_setup": "选项 1(推荐):运行设置以下载模式", + "patterns_option_run_setup_command": "fabric --setup", + "patterns_option_run_update": "选项 2:直接下载/更新模式", + "patterns_option_run_update_command": "fabric -U", + "pattern_not_found_no_patterns": "未找到模式 '%s'。\n\n未安装任何模式!要解决此问题:\n • 运行 'fabric --setup' 配置并下载模式\n • 或运行 'fabric -U' 直接下载/更新模式", + "pattern_not_found_list_available": "未找到模式 '%s'。运行 'fabric -l' 查看可用模式", + "plugin_configured": " ✓", + "plugin_not_configured": " ⚠️ 未配置" } diff --git a/internal/plugins/db/fsdb/patterns.go b/internal/plugins/db/fsdb/patterns.go index f8fca6e9..d1536add 100644 --- a/internal/plugins/db/fsdb/patterns.go +++ b/internal/plugins/db/fsdb/patterns.go @@ -7,6 +7,7 @@ import ( "sort" "strings" + "github.com/danielmiessler/fabric/internal/i18n" "github.com/danielmiessler/fabric/internal/plugins/template" "github.com/danielmiessler/fabric/internal/util" ) @@ -128,7 +129,16 @@ func (o *PatternsEntity) getFromDB(name string) (ret *Pattern, err error) { var pattern []byte if pattern, err = os.ReadFile(patternPath); err != nil { - return + // Check if the patterns directory is empty to provide helpful error message + if os.IsNotExist(err) { + var entries []os.DirEntry + entries, _ = os.ReadDir(o.Dir) + if len(entries) == 0 || (len(entries) == 1 && entries[0].Name() == "loaded") { + // Patterns directory is empty or only has 'loaded' file + return nil, fmt.Errorf(i18n.T("pattern_not_found_no_patterns"), name) + } + } + return nil, fmt.Errorf(i18n.T("pattern_not_found_list_available"), name) } patternStr := string(pattern) diff --git a/internal/plugins/strategy/strategy.go b/internal/plugins/strategy/strategy.go index a67dc5b0..3cde6b2e 100644 --- a/internal/plugins/strategy/strategy.go +++ b/internal/plugins/strategy/strategy.go @@ -103,17 +103,20 @@ func (sm *StrategiesManager) Setup() (err error) { if err = sm.PopulateDB(); err != nil { return } + // Reload strategies after downloading so IsConfigured() reflects the new state + sm.Strategies, _ = LoadAllFiles() return } // PopulateDB downloads strategies from the internet and populates the strategies folder func (sm *StrategiesManager) PopulateDB() (err error) { - stageDir, _ := getStrategyDir() - fmt.Printf("Downloading strategies and Populating %s...\n", stageDir) + strategyDir, _ := getStrategyDir() + fmt.Printf("Downloading strategies and Populating %s...\n", strategyDir) fmt.Println() if err = sm.gitCloneAndCopy(); err != nil { return } + fmt.Printf("✅ Successfully downloaded and installed strategies to %s\n", strategyDir) return } @@ -130,6 +133,8 @@ func (sm *StrategiesManager) gitCloneAndCopy() (err error) { return fmt.Errorf("failed to create strategies directory: %w", err) } + fmt.Printf("Cloning repository %s (path: %s)...\n", sm.DefaultGitRepoUrl.Value, sm.DefaultFolder.Value) + // Use the helper to fetch files err = githelper.FetchFilesFromRepo(githelper.FetchOptions{ RepoURL: sm.DefaultGitRepoUrl.Value, @@ -141,6 +146,18 @@ func (sm *StrategiesManager) gitCloneAndCopy() (err error) { return fmt.Errorf("failed to download strategies: %w", err) } + // Count downloaded strategies + entries, readErr := os.ReadDir(strategyDir) + if readErr == nil { + strategyCount := 0 + for _, entry := range entries { + if !entry.IsDir() && filepath.Ext(entry.Name()) == ".json" { + strategyCount++ + } + } + fmt.Printf("Downloaded %d strategies\n", strategyCount) + } + return nil }