From e9b1b88d8683be8c166937a82ed9c7056a656a12 Mon Sep 17 00:00:00 2001 From: Kayvan Sylvan Date: Sat, 21 Feb 2026 13:23:17 -0800 Subject: [PATCH] feat: replace hardcoded error strings with i18n translation keys - Replace hardcoded error messages with `i18n.T()` calls across Go source files - Add ~80 new translation keys to all locale files (en, de, es, fa, fr, it, ja, pt-BR, pt-PT, zh) - Internationalize error strings in chat, attachment, storage, and template packages - Internationalize error strings in plugin registry, server, and utility modules - Internationalize githelper, notifications, patterns, and sessions modules - Add i18n support for DigitalOcean, Gemini, and OpenAI-compatible providers - Sort existing locale keys alphabetically in JSON files - chore: incoming 2019 changelog entry --- cmd/generate_changelog/incoming/2019.txt | 7 +++ internal/chat/chat.go | 4 +- internal/core/plugin_registry.go | 4 +- internal/domain/attachment.go | 9 +-- internal/i18n/locales/de.json | 63 ++++++++++++++++++- internal/i18n/locales/en.json | 61 +++++++++++++++++- internal/i18n/locales/es.json | 59 +++++++++++++++++ internal/i18n/locales/fa.json | 61 +++++++++++++++++- internal/i18n/locales/fr.json | 63 ++++++++++++++++++- internal/i18n/locales/it.json | 61 +++++++++++++++++- internal/i18n/locales/ja.json | 61 +++++++++++++++++- internal/i18n/locales/pt-BR.json | 61 +++++++++++++++++- internal/i18n/locales/pt-PT.json | 61 +++++++++++++++++- internal/i18n/locales/zh.json | 61 +++++++++++++++++- .../plugins/ai/digitalocean/digitalocean.go | 4 +- internal/plugins/ai/gemini/voices.go | 4 +- .../ai/openai_compatible/providers_config.go | 5 +- internal/plugins/db/fsdb/db.go | 3 +- internal/plugins/db/fsdb/patterns.go | 14 ++--- internal/plugins/db/fsdb/sessions.go | 3 +- internal/plugins/db/fsdb/storage.go | 18 +++--- internal/plugins/template/hash.go | 6 +- internal/plugins/template/template.go | 11 ++-- internal/plugins/template/text.go | 6 +- internal/plugins/template/utils.go | 8 ++- internal/server/chat.go | 9 +-- .../tools/custom_patterns/custom_patterns.go | 2 +- internal/tools/githelper/githelper.go | 11 ++-- internal/tools/notifications/notifications.go | 4 +- internal/util/utils.go | 14 +++-- 30 files changed, 688 insertions(+), 70 deletions(-) create mode 100644 cmd/generate_changelog/incoming/2019.txt diff --git a/cmd/generate_changelog/incoming/2019.txt b/cmd/generate_changelog/incoming/2019.txt new file mode 100644 index 00000000..d6adb1eb --- /dev/null +++ b/cmd/generate_changelog/incoming/2019.txt @@ -0,0 +1,7 @@ +### PR [#2019](https://github.com/danielmiessler/Fabric/pull/2019) by [ksylvan](https://github.com/ksylvan): feat: replace hardcoded error strings with i18n translation keys + +- Replace hardcoded error messages with `i18n.T()` calls across Go source files +- Add ~80 new translation keys to all locale files (en, de, es, fa, fr, it, ja, pt-BR, pt-PT, zh) +- Internationalize error strings in chat, attachment, storage, template, plugin registry, server, and utility modules +- Add i18n support for DigitalOcean, Gemini, and OpenAI-compatible providers +- Sort existing locale keys alphabetically in JSON files diff --git a/internal/chat/chat.go b/internal/chat/chat.go index b5e7f027..0179c6ea 100644 --- a/internal/chat/chat.go +++ b/internal/chat/chat.go @@ -3,6 +3,8 @@ package chat import ( "encoding/json" "errors" + + "github.com/danielmiessler/fabric/internal/i18n" ) const ( @@ -14,7 +16,7 @@ const ( ChatMessageRoleDeveloper = "developer" ) -var ErrContentFieldsMisused = errors.New("can't use both Content and MultiContent properties simultaneously") +var ErrContentFieldsMisused = errors.New(i18n.T("chat_error_content_fields_misused")) type ChatMessagePartType string diff --git a/internal/core/plugin_registry.go b/internal/core/plugin_registry.go index de698dd4..f6069b26 100644 --- a/internal/core/plugin_registry.go +++ b/internal/core/plugin_registry.go @@ -478,7 +478,7 @@ func (o *PluginRegistry) Configure() (err error) { o.ConfigureVendors() _ = o.Defaults.Configure() if err := o.CustomPatterns.Configure(); err != nil { - return fmt.Errorf("error configuring CustomPatterns: %w", err) + return fmt.Errorf(i18n.T("plugin_registry_error_configuring_custom_patterns"), err) } _ = o.PatternsLoader.Configure() @@ -559,7 +559,7 @@ func (o *PluginRegistry) GetChatter(model string, modelContextLength int, vendor return strings.EqualFold(name, vendorName) }) if ret.vendor == nil || !vendorAvailable { - err = fmt.Errorf("model %s not available for vendor %s", model, vendorName) + err = fmt.Errorf(i18n.T("plugin_registry_model_not_available_for_vendor"), model, vendorName) return } } else { diff --git a/internal/domain/attachment.go b/internal/domain/attachment.go index 38c38a81..7e311ee0 100644 --- a/internal/domain/attachment.go +++ b/internal/domain/attachment.go @@ -11,6 +11,7 @@ import ( "os" "path/filepath" + "github.com/danielmiessler/fabric/internal/i18n" "github.com/gabriel-vasile/mimetype" ) @@ -73,7 +74,7 @@ func (a *Attachment) ResolveType() (ret string, err error) { ret = mimetype.Detect(a.Content).String() return } - err = fmt.Errorf("attachment has no type and no content to derive it from") + err = fmt.Errorf("%s", i18n.T("attachment_no_type_no_content")) return } @@ -99,7 +100,7 @@ func (a *Attachment) ContentBytes() (ret []byte, err error) { } return } - err = fmt.Errorf("no content available") + err = fmt.Errorf("%s", i18n.T("attachment_no_content_available")) return } @@ -130,7 +131,7 @@ func NewAttachment(value string) (ret *Attachment, err error) { return } if _, err = os.Stat(absPath); os.IsNotExist(err) { - err = fmt.Errorf("file %s does not exist", value) + err = fmt.Errorf(i18n.T("attachment_file_not_exist"), value) return } @@ -153,7 +154,7 @@ func detectMimeTypeFromURL(url string) (string, error) { defer resp.Body.Close() mimeType := resp.Header.Get("Content-Type") if mimeType == "" { - return "", fmt.Errorf("could not determine mimetype of URL") + return "", fmt.Errorf("%s", i18n.T("attachment_could_not_determine_mimetype")) } return mimeType, nil } diff --git a/internal/i18n/locales/de.json b/internal/i18n/locales/de.json index 75fd95ac..8c168831 100644 --- a/internal/i18n/locales/de.json +++ b/internal/i18n/locales/de.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "Abacus-Modell-Endpunkt gab Status %d zurück", "additional_yt_dlp_args": "Zusätzliche Argumente für yt-dlp (z.B. '--cookies-from-browser brave')", "address_to_bind_rest_api": "Adresse zum Binden der REST API", "anthropic_stream_error": "Stream-Fehler: %v", "api_key_secure_server_routes": "API-Schlüssel zum Sichern der Server-Routen", "application_options_header": "Anwendungsoptionen:", "apply_variables_to_input": "Variablen auf Benutzereingabe anwenden", + "attachment_could_not_determine_mimetype": "MIME-Typ der URL konnte nicht ermittelt werden", + "attachment_file_not_exist": "Datei %s existiert nicht", + "attachment_no_content_available": "Kein Inhalt verfügbar", + "attachment_no_type_no_content": "Anhang hat keinen Typ und keinen Inhalt zur Ableitung", "attachment_path_or_url_help": "Anhangspfad oder URL (z.B. für OpenAI-Bilderkennungsnachrichten)", "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", "audio_video_file_transcribe": "Audio- oder Video-Datei zum Transkribieren", @@ -15,12 +20,12 @@ "azure_api_version_question": "Geben Sie die Azure API-Version ein (leer lassen für Standard)", "azure_base_url_question": "API Basis-URL", "azure_base_url_required": "Azure Basis-URL ist erforderlich", + "azure_credential_failure": "Fehler beim Erstellen der Azure-Anmeldeinformationen", "azure_deployments_question": "Geben Sie Ihre Azure-Bereitstellungsnamen ein (kommagetrennt)", "azure_deployments_required": "Mindestens ein Azure-Bereitstellungsname ist erforderlich", "azure_failed_extract_deployment": "Bereitstellungsname konnte nicht aus der Anfrage extrahiert werden", "azure_model_field_empty": "Modellfeld ist im Anfragekörper leer", "azure_request_body_nil": "Anfragekörper ist nil", - "azure_credential_failure": "Fehler beim Erstellen der Azure-Anmeldeinformationen", "background_type_help": "Hintergrundtyp: opaque, transparent (Standard: opaque, nur für PNG/WebP)", "bedrock_aws_region_label": "AWS-Region", "bedrock_converse_failed": "Bedrock Converse für Modell %s fehlgeschlagen: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "unbekannter Stream-Event-Typ: %T", "cannot_convert_string": "kann String %q nicht zu %v konvertieren", "change_default_model": "Standardmodell ändern", + "chat_error_content_fields_misused": "Content und MultiContent können nicht gleichzeitig verwendet werden", "chatter_error_empty_response": "leere Antwort", "chatter_error_find_context": "Kontext %s konnte nicht gefunden werden: %v", "chatter_error_find_session": "Sitzung %s konnte nicht gefunden werden: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Geben Sie den Pfad zu Ihrem benutzerdefinierten Pattern-Verzeichnis ein", "custom_patterns_label": "Benutzerdefinierte Patterns", "custom_patterns_setup_description": "Benutzerdefinierte Patterns - Verzeichnis für Ihre benutzerdefinierten Patterns festlegen", + "custom_patterns_warning_create_directory": "Warnung: Benutzerdefiniertes Musterverzeichnis %s konnte nicht erstellt werden: %v\n", + "db_error_loading_env_file": "Fehler beim Laden der .env-Datei: %s", "defaults_model_context_length_question": "Geben Sie die Kontextlänge des Modells ein", "defaults_model_question": "Geben Sie den Index oder den Namen Ihres Standardmodells ein", "defaults_setup_description": "Standard-KI-Anbieter und -Modell", + "digitalocean_failed_parse_control_plane_url": "DigitalOcean Control Plane URL konnte nicht geparst werden: %w", + "digitalocean_model_list_unavailable": "DigitalOcean-Modellliste nicht verfügbar. Setzen Sie DIGITALOCEAN_TOKEN, um Modelle von der Control Plane abzurufen", "disable_openai_responses_api": "OpenAI Responses API deaktivieren (Standard: false)", "disable_pattern_variable_replacement": "Mustervariablenersetzung deaktivieren", "enable_web_search_tool": "Web-Such-Tool für unterstützte Modelle aktivieren (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Fehler: %v", "gemini_tts_failed": "TTS-Generierung fehlgeschlagen: %w", "gemini_unexpected_data_type": "unerwarteter Datentyp: %s, Audiodaten erwartet", + "gemini_voice_not_found": "Stimme '%s' nicht gefunden", "gemini_wav_data_invalid": "generierte WAV-Daten sind ungültig: %d Bytes, mindestens erforderlich: %d", "gemini_wav_generation_failed": "WAV-Datei konnte nicht generiert werden: %w", + "githelper_failed_clone_repository": "Repository konnte nicht geklont werden: %w", + "githelper_failed_create_dest_directory": "Zielverzeichnis konnte nicht erstellt werden: %w", + "githelper_failed_get_commit": "Commit konnte nicht abgerufen werden: %w", + "githelper_failed_get_head": "Repository HEAD konnte nicht abgerufen werden: %w", + "githelper_failed_get_tree": "Verzeichnisbaum konnte nicht abgerufen werden: %w", "grab_comments_from_youtube": "Kommentare von YouTube-Video abrufen und an Chat senden", "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", @@ -239,6 +255,7 @@ "no_description_available": "Keine Beschreibung verfügbar", "no_items_found": "Keine %s", "no_notification_system_available": "kein Benachrichtigungssystem verfügbar", + "notifications_no_provider_available": "Kein Benachrichtigungsanbieter verfügbar", "number_of_latest_patterns": "Anzahl der neuesten Muster zum Auflisten", "ollama_cannot_parse_url": "URL '%s' kann nicht geparst werden: %v", "ollama_chat_request_failed": "Chat-Anfrage fehlgeschlagen: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "Datei konnte nicht in akzeptable Teile aufgeteilt werden", "openai_audio_unsupported_audio_format": "nicht unterstütztes Audioformat '%s'", "openai_audio_using_model_to_transcribe_part": "Verwende Modell %s zur Transkription von Teil %d (Dateiname: %s)...", + "openai_compatible_unknown_static_model_list": "Unbekannte statische Modellliste: %s", "openai_failed_to_create_models_url": "Modell-URL konnte nicht erstellt werden: %w", "openai_image_failed_to_create_directory": "Verzeichnis %s konnte nicht erstellt werden: %w", "openai_image_failed_to_decode_image_data": "Bilddaten konnten nicht dekodiert werden: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Patterns erfolgreich nach %s heruntergeladen und installiert\\n", "patterns_downloaded_temp": "%d Patterns in temporäres Verzeichnis heruntergeladen\\n", "patterns_downloading": "Lade Patterns herunter und befülle %s...\\n", + "patterns_error_create_directory": "Musterverzeichnis konnte nicht erstellt werden: %v", + "patterns_error_get_home_directory": "Home-Verzeichnis konnte nicht ermittelt werden: %v", + "patterns_error_load_from_file": "Muster konnte nicht aus Datei %s geladen werden: %w", + "patterns_error_read_pattern_file": "Musterdatei %s konnte nicht gelesen werden: %v", + "patterns_error_read_unique_file": "Eindeutige Musterdatei konnte nicht gelesen werden. Bitte --updatepatterns ausführen (%s)", + "patterns_error_resolve_file_path": "Dateipfad konnte nicht aufgelöst werden: %v", + "patterns_error_save_pattern": "Muster konnte nicht gespeichert werden: %v", "patterns_failed_access_directory": "Fehler beim Zugriff auf den Pattern-Ordner '%s': %w", "patterns_failed_create_temp_dir": "Fehler beim Erstellen des temporären Verzeichnisses: %w", "patterns_failed_create_temp_folder": "Fehler beim Erstellen des temporären Pattern-Ordners: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, leer lassen für '%s' oder '%v' eingeben, um den Wert zu entfernen):", "plugin_question_optional": "%v%v (leer lassen zum Überspringen):", "plugin_question_with_default": "%v%v (leer lassen für '%s' oder '%v' eingeben, um den Wert zu entfernen):", + "plugin_registry_error_configuring_custom_patterns": "Fehler beim Konfigurieren von CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "Modell %s nicht verfügbar für Anbieter %s", "plugin_setting_not_valid": "%v=%v ist nicht gültig", "plugin_setup_configured": "[%v] konfiguriert", "plugin_setup_skipped": "[%v] übersprungen\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Desktop-Benachrichtigung senden, wenn Befehl abgeschlossen ist", "serve_fabric_api_ollama_endpoints": "Fabric REST API mit ollama-Endpunkten bereitstellen", "serve_fabric_rest_api": "Fabric REST API bereitstellen", + "server_chat_error": "Fehler: %v", + "server_error_marshaling_response": "Fehler beim Serialisieren der Antwort: %v", + "server_error_writing_response": "Fehler beim Schreiben der Antwort: %v", + "server_invalid_request_format": "Ungültiges Anfrageformat: %v", + "sessions_creating_new": "Erstelle neue Sitzung: %s\n", "set_debug_level": "Debug-Level festlegen (0=aus, 1=grundlegend, 2=detailliert, 3=Trace)", "set_frequency_penalty": "Häufigkeitsstrafe festlegen", "set_location_web_search": "Standort für Web-Suchergebnisse festlegen (z.B., 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Episoden insgesamt**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "Start-Tag für Denk-Abschnitte", + "storage_error_delete": "%s konnte nicht gelöscht werden: %v", + "storage_error_load": "%s konnte nicht geladen werden: %v", + "storage_error_marshal": "%s konnte nicht serialisiert werden: %s", + "storage_error_read_directory": "Einträge aus dem Verzeichnis konnten nicht gelesen werden: %v", + "storage_error_rename": "%s konnte nicht in %s umbenannt werden: %v", + "storage_error_resolve_directory": "Verzeichnispfad konnte nicht aufgelöst werden: %v", + "storage_error_save": "%s konnte nicht gespeichert werden: %v", + "storage_error_stat_entry": "Eintrag %s konnte nicht abgefragt werden: %v", + "storage_error_unmarshal": "%s konnte nicht deserialisiert werden: %s", "strategies_available_header": "Verfügbare Strategien:", "strategies_cloning_repository": "Repository %s wird geklont (Pfad: %s)...\\n", "strategies_download_success": "✅ Strategien erfolgreich nach %s heruntergeladen und installiert\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "Erweiterung %s Fehler: %v", "template_file_error_expand_home_dir": "datei: home-verzeichnis konnte nicht erweitert werden: %v", "template_file_error_invalid_line_count": "datei: ungültige zeilenanzahl %q", "template_file_error_line_count_positive": "datei: zeilenanzahl muss positiv sein", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "Datei: größe=%d für Pfad %q", "template_file_log_tail_returning_lines": "Datei: tail gibt %d Zeilen zurück", "template_file_log_validating_path": "Datei: Pfad %q wird validiert", + "template_hash_open_file": "Datei öffnen: %w", + "template_hash_read_file": "Datei lesen: %w", + "template_missing_required_variable": "Erforderliche Variable fehlt: %s", + "template_plugin_error": "Plugin %s Fehler: %v", + "template_processing_stuck": "Vorlagenverarbeitung blockiert - mögliche Endlosschleife", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "Text: Leere Eingabe für Operation %q", + "template_text_unknown_operation": "Text: Unbekannte Textoperation %q (unterstützt: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "Unbekannter Plugin-Namespace: %s", + "template_utils_failed_get_absolute_path": "Absoluter Pfad konnte nicht ermittelt werden: %w", + "template_utils_failed_get_home_dir": "Benutzer-Home-Verzeichnis konnte nicht ermittelt werden: %w", + "template_utils_path_not_exist": "Pfad existiert nicht: %w", "transcription_model_required": "Transkriptionsmodell ist erforderlich (verwende --transcribe-model)", "transparent_background_png_webp_only": "transparenter Hintergrund kann nur mit PNG- und WebP-Formaten verwendet werden, nicht %s", "tts_audio_generated_successfully": "TTS-Audio erfolgreich generiert und gespeichert unter: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "Muster aktualisieren", "usage_header": "Verwendung:", "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.", + "util_error_accessing_config_path": "Fehler beim Zugriff auf den Standard-Konfigurationspfad: %w", + "util_error_determine_home_directory": "Benutzer-Home-Verzeichnis konnte nicht ermittelt werden: %w", + "util_error_get_absolute_path": "Absoluter Pfad konnte nicht ermittelt werden", + "util_error_path_is_empty": "Pfad ist leer", + "util_error_resolve_home_directory": "Home-Verzeichnis konnte nicht aufgelöst werden", + "util_error_resolve_symlinks": "Symbolische Links konnten nicht aufgelöst werden: %w", "vendor_no_transcription_support": "Anbieter %s unterstützt keine Audio-Transkription", "vendor_not_configured": "Anbieter %s ist nicht konfiguriert", "vendor_not_found": "Anbieter %s nicht gefunden", @@ -592,4 +651,4 @@ "youtube_video_id_title_header": "VideoID: Titel", "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_stderr_error": "Fehler beim Lesen von yt-dlp stderr" -} +} \ No newline at end of file diff --git a/internal/i18n/locales/en.json b/internal/i18n/locales/en.json index 83523387..ccfb74fe 100644 --- a/internal/i18n/locales/en.json +++ b/internal/i18n/locales/en.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "abacus models endpoint returned status %d", "additional_yt_dlp_args": "Additional arguments to pass to yt-dlp (e.g. '--cookies-from-browser brave')", "address_to_bind_rest_api": "The address to bind the REST API", "anthropic_stream_error": "Stream error: %v", "api_key_secure_server_routes": "API key used to secure server routes", "application_options_header": "Application Options:", "apply_variables_to_input": "Apply variables to user input", + "attachment_could_not_determine_mimetype": "could not determine mimetype of URL", + "attachment_file_not_exist": "file %s does not exist", + "attachment_no_content_available": "no content available", + "attachment_no_type_no_content": "attachment has no type and no content to derive it from", "attachment_path_or_url_help": "Attachment path or URL (e.g. for OpenAI image recognition messages)", "audio_output_file_specified_but_not_tts_model": "audio output file '%s' specified but model '%s' is not a TTS model. Please use a TTS model like gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "Audio or video file to transcribe", @@ -15,12 +20,12 @@ "azure_api_version_question": "Enter the Azure API version (leave blank for default)", "azure_base_url_question": "API Base URL", "azure_base_url_required": "Azure base URL is required", + "azure_credential_failure": "Failed to create Azure credential", "azure_deployments_question": "Enter your Azure deployment names (comma-separated)", "azure_deployments_required": "At least one Azure deployment name is required", "azure_failed_extract_deployment": "failed to extract deployment name from request", "azure_model_field_empty": "model field is empty in request body", "azure_request_body_nil": "request body is nil", - "azure_credential_failure": "Failed to create Azure credential", "background_type_help": "Background type: opaque, transparent (default: opaque, only for PNG/WebP)", "bedrock_aws_region_label": "AWS Region", "bedrock_converse_failed": "bedrock converse failed for model %s: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "unknown stream event type: %T", "cannot_convert_string": "cannot convert string %q to %v", "change_default_model": "Change default model", + "chat_error_content_fields_misused": "can't use both Content and MultiContent properties simultaneously", "chatter_error_empty_response": "empty response", "chatter_error_find_context": "could not find context %s: %v", "chatter_error_find_session": "could not find session %s: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Enter the path to your custom patterns directory", "custom_patterns_label": "Custom Patterns", "custom_patterns_setup_description": "Custom Patterns - Set directory for your custom patterns", + "custom_patterns_warning_create_directory": "Warning: Could not create custom patterns directory %s: %v\n", + "db_error_loading_env_file": "error loading .env file: %s", "defaults_model_context_length_question": "Enter model context length", "defaults_model_question": "Enter the index or the name of your default model", "defaults_setup_description": "Default AI Vendor and Model", + "digitalocean_failed_parse_control_plane_url": "failed to parse DigitalOcean control plane URL: %w", + "digitalocean_model_list_unavailable": "DigitalOcean model list unavailable. Set DIGITALOCEAN_TOKEN to fetch models from the control plane", "disable_openai_responses_api": "Disable OpenAI Responses API (default: false)", "disable_pattern_variable_replacement": "Disable pattern variable replacement", "enable_web_search_tool": "Enable web search tool for supported models (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Error: %v", "gemini_tts_failed": "TTS generation failed: %w", "gemini_unexpected_data_type": "unexpected data type: %s, expected audio data", + "gemini_voice_not_found": "voice '%s' not found", "gemini_wav_data_invalid": "generated WAV data is invalid: %d bytes, minimum required: %d", "gemini_wav_generation_failed": "failed to generate WAV file: %w", + "githelper_failed_clone_repository": "failed to clone repository: %w", + "githelper_failed_create_dest_directory": "failed to create destination directory: %w", + "githelper_failed_get_commit": "failed to get commit: %w", + "githelper_failed_get_head": "failed to get repository HEAD: %w", + "githelper_failed_get_tree": "failed to get tree: %w", "grab_comments_from_youtube": "Grab comments from YouTube video and send to chat", "grab_transcript_from_youtube": "Grab transcript from YouTube video and send to chat (it is used per default).", "grab_transcript_with_timestamps": "Grab transcript from YouTube video with timestamps and send to chat", @@ -239,6 +255,7 @@ "no_description_available": "No description available", "no_items_found": "No %s", "no_notification_system_available": "no notification system available", + "notifications_no_provider_available": "no notification provider available", "number_of_latest_patterns": "Number of latest patterns to list", "ollama_cannot_parse_url": "Cannot parse URL '%s': %v", "ollama_chat_request_failed": "Chat request failed: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "unable to split file into acceptably sized chunks", "openai_audio_unsupported_audio_format": "unsupported audio format '%s'", "openai_audio_using_model_to_transcribe_part": "Using model %s to transcribe part %d (filename: %s)...", + "openai_compatible_unknown_static_model_list": "unknown static model list: %s", "openai_failed_to_create_models_url": "failed to create models URL: %w", "openai_image_failed_to_create_directory": "failed to create directory %s: %w", "openai_image_failed_to_decode_image_data": "failed to decode image data: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Successfully downloaded and installed patterns to %s\n", "patterns_downloaded_temp": "Downloaded %d patterns to temporary directory\n", "patterns_downloading": "Downloading patterns and Populating %s...\n", + "patterns_error_create_directory": "could not create pattern directory: %v", + "patterns_error_get_home_directory": "could not get home directory: %v", + "patterns_error_load_from_file": "could not load pattern from file %s: %w", + "patterns_error_read_pattern_file": "could not read pattern file %s: %v", + "patterns_error_read_unique_file": "could not read unique patterns file. Please run --updatepatterns (%s)", + "patterns_error_resolve_file_path": "could not resolve file path: %v", + "patterns_error_save_pattern": "could not save pattern: %v", "patterns_failed_access_directory": "failed to access patterns directory '%s': %w", "patterns_failed_create_temp_dir": "failed to create temp directory: %w", "patterns_failed_create_temp_folder": "failed to create temporary patterns folder: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, leave empty for '%s' or type '%v' to remove the value):", "plugin_question_optional": "%v%v (leave empty to skip):", "plugin_question_with_default": "%v%v (leave empty for '%s' or type '%v' to remove the value):", + "plugin_registry_error_configuring_custom_patterns": "error configuring CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "model %s not available for vendor %s", "plugin_setting_not_valid": "%v=%v, is not valid", "plugin_setup_configured": "[%v] configured", "plugin_setup_skipped": "[%v] skipped\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Send desktop notification when command completes", "serve_fabric_api_ollama_endpoints": "Serve the Fabric Rest API with ollama endpoints", "serve_fabric_rest_api": "Serve the Fabric Rest API", + "server_chat_error": "Error: %v", + "server_error_marshaling_response": "error marshaling response: %v", + "server_error_writing_response": "error writing response: %v", + "server_invalid_request_format": "Invalid request format: %v", + "sessions_creating_new": "Creating new session: %s\n", "set_debug_level": "Set debug level (0=off, 1=basic, 2=detailed, 3=trace)", "set_frequency_penalty": "Set frequency penalty", "set_location_web_search": "Set location for web search results (e.g., 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Total Episodes**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "Start tag for thinking sections", + "storage_error_delete": "could not delete %s: %v", + "storage_error_load": "could not load %s: %v", + "storage_error_marshal": "could not marshal %s: %s", + "storage_error_read_directory": "could not read items from directory: %v", + "storage_error_rename": "could not rename %s to %s: %v", + "storage_error_resolve_directory": "could not resolve directory path: %v", + "storage_error_save": "could not save %s: %v", + "storage_error_stat_entry": "could not stat entry %s: %v", + "storage_error_unmarshal": "could not unmarshal %s: %s", "strategies_available_header": "Available Strategies:", "strategies_cloning_repository": "Cloning repository %s (path: %s)...\n", "strategies_download_success": "✅ Successfully downloaded and installed strategies to %s\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "extension %s error: %v", "template_file_error_expand_home_dir": "file: could not expand home directory: %v", "template_file_error_invalid_line_count": "file: invalid line count %q", "template_file_error_line_count_positive": "file: line count must be positive", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "File: size=%d for path %q", "template_file_log_tail_returning_lines": "File: tail returning %d lines", "template_file_log_validating_path": "File: validating path %q", + "template_hash_open_file": "open file: %w", + "template_hash_read_file": "read file: %w", + "template_missing_required_variable": "missing required variable: %s", + "template_plugin_error": "plugin %s error: %v", + "template_processing_stuck": "template processing stuck - potential infinite loop", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "text: empty input for operation %q", + "template_text_unknown_operation": "text: unknown text operation %q (supported: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "unknown plugin namespace: %s", + "template_utils_failed_get_absolute_path": "failed to get absolute path: %w", + "template_utils_failed_get_home_dir": "failed to get user home directory: %w", + "template_utils_path_not_exist": "path does not exist: %w", "transcription_model_required": "transcription model is required (use --transcribe-model)", "transparent_background_png_webp_only": "transparent background can only be used with PNG and WebP formats, not %s", "tts_audio_generated_successfully": "TTS audio generated successfully and saved to: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "Update patterns", "usage_header": "Usage:", "use_model_defaults_raw_help": "Use the defaults of the model without sending chat options (temperature, top_p, etc.). Only affects OpenAI-compatible providers. Anthropic models always use smart parameter selection to comply with model-specific requirements.", + "util_error_accessing_config_path": "error accessing default config path: %w", + "util_error_determine_home_directory": "could not determine user home directory: %w", + "util_error_get_absolute_path": "could not get absolute path", + "util_error_path_is_empty": "path is empty", + "util_error_resolve_home_directory": "could not resolve home directory", + "util_error_resolve_symlinks": "could not resolve symlinks: %w", "vendor_no_transcription_support": "vendor %s does not support audio transcription", "vendor_not_configured": "vendor %s not configured", "vendor_not_found": "vendor %s not found", diff --git a/internal/i18n/locales/es.json b/internal/i18n/locales/es.json index db99c0a1..028f743d 100644 --- a/internal/i18n/locales/es.json +++ b/internal/i18n/locales/es.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "El endpoint de modelos de Abacus devolvió el estado %d", "additional_yt_dlp_args": "Argumentos adicionales para pasar a yt-dlp (ej. '--cookies-from-browser brave')", "address_to_bind_rest_api": "La dirección para vincular la API REST", "anthropic_stream_error": "Error de transmisión: %v", "api_key_secure_server_routes": "Clave API usada para asegurar rutas del servidor", "application_options_header": "Opciones de la Aplicación:", "apply_variables_to_input": "Aplicar variables a la entrada del usuario", + "attachment_could_not_determine_mimetype": "No se pudo determinar el tipo MIME de la URL", + "attachment_file_not_exist": "El archivo %s no existe", + "attachment_no_content_available": "No hay contenido disponible", + "attachment_no_type_no_content": "El adjunto no tiene tipo ni contenido del cual derivarlo", "attachment_path_or_url_help": "Ruta de adjunto o URL (ej. para mensajes de reconocimiento de imagen de OpenAI)", "audio_output_file_specified_but_not_tts_model": "se especificó el archivo de salida de audio '%s' pero el modelo '%s' no es un modelo TTS. Por favor usa un modelo TTS como gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "Archivo de audio o video para transcribir", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "tipo de evento de stream desconocido: %T", "cannot_convert_string": "no se puede convertir la cadena %q a %v", "change_default_model": "Cambiar modelo predeterminado", + "chat_error_content_fields_misused": "No se pueden usar Content y MultiContent simultáneamente", "chatter_error_empty_response": "respuesta vacía", "chatter_error_find_context": "no se pudo encontrar el contexto %s: %v", "chatter_error_find_session": "no se pudo encontrar la sesion %s: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Introduce la ruta a tu directorio de patrones personalizados", "custom_patterns_label": "Patrones personalizados", "custom_patterns_setup_description": "Patrones personalizados - Establecer directorio para tus patrones personalizados", + "custom_patterns_warning_create_directory": "Advertencia: No se pudo crear el directorio de patrones personalizados %s: %v\n", + "db_error_loading_env_file": "Error al cargar el archivo .env: %s", "defaults_model_context_length_question": "Introduce la longitud del contexto del modelo", "defaults_model_question": "Introduce el índice o el nombre de tu modelo predeterminado", "defaults_setup_description": "Proveedor y modelo de IA predeterminados", + "digitalocean_failed_parse_control_plane_url": "No se pudo analizar la URL del plano de control de DigitalOcean: %w", + "digitalocean_model_list_unavailable": "Lista de modelos de DigitalOcean no disponible. Configure DIGITALOCEAN_TOKEN para obtener modelos del plano de control", "disable_openai_responses_api": "Deshabilitar API de Respuestas de OpenAI (predeterminado: false)", "disable_pattern_variable_replacement": "Deshabilitar reemplazo de variables de patrón", "enable_web_search_tool": "Habilitar herramienta de búsqueda web para modelos soportados (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Error: %v", "gemini_tts_failed": "generación TTS fallida: %w", "gemini_unexpected_data_type": "tipo de dato inesperado: %s, se esperaban datos de audio", + "gemini_voice_not_found": "Voz '%s' no encontrada", "gemini_wav_data_invalid": "datos WAV generados inválidos: %d bytes, mínimo requerido: %d", "gemini_wav_generation_failed": "no se pudo generar el archivo WAV: %w", + "githelper_failed_clone_repository": "No se pudo clonar el repositorio: %w", + "githelper_failed_create_dest_directory": "No se pudo crear el directorio de destino: %w", + "githelper_failed_get_commit": "No se pudo obtener el commit: %w", + "githelper_failed_get_head": "No se pudo obtener el HEAD del repositorio: %w", + "githelper_failed_get_tree": "No se pudo obtener el árbol: %w", "grab_comments_from_youtube": "Obtener comentarios del video de YouTube y enviar al chat", "grab_transcript_from_youtube": "Obtener transcripción del video de YouTube y enviar al chat (se usa por defecto).", "grab_transcript_with_timestamps": "Obtener transcripción del video de YouTube con marcas de tiempo y enviar al chat", @@ -239,6 +255,7 @@ "no_description_available": "No hay descripción disponible", "no_items_found": "No hay %s", "no_notification_system_available": "no hay sistema de notificaciones disponible", + "notifications_no_provider_available": "No hay proveedor de notificaciones disponible", "number_of_latest_patterns": "Número de patrones más recientes a listar", "ollama_cannot_parse_url": "No se puede analizar la URL '%s': %v", "ollama_chat_request_failed": "Solicitud de chat fallida: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "no se pudo dividir el archivo en fragmentos de tamaño aceptable", "openai_audio_unsupported_audio_format": "formato de audio no compatible '%s'", "openai_audio_using_model_to_transcribe_part": "Usando el modelo %s para transcribir la parte %d (archivo: %s)...", + "openai_compatible_unknown_static_model_list": "Lista de modelos estática desconocida: %s", "openai_failed_to_create_models_url": "error al crear URL de modelos: %w", "openai_image_failed_to_create_directory": "no se pudo crear el directorio %s: %w", "openai_image_failed_to_decode_image_data": "no se pudieron decodificar los datos de la imagen: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Patrones descargados e instalados correctamente en %s\\n", "patterns_downloaded_temp": "Se descargaron %d patrones al directorio temporal\\n", "patterns_downloading": "Descargando patrones y llenando %s...\\n", + "patterns_error_create_directory": "No se pudo crear el directorio de patrones: %v", + "patterns_error_get_home_directory": "No se pudo obtener el directorio de inicio: %v", + "patterns_error_load_from_file": "No se pudo cargar el patrón del archivo %s: %w", + "patterns_error_read_pattern_file": "No se pudo leer el archivo de patrones %s: %v", + "patterns_error_read_unique_file": "No se pudo leer el archivo de patrones únicos. Ejecute --updatepatterns (%s)", + "patterns_error_resolve_file_path": "No se pudo resolver la ruta del archivo: %v", + "patterns_error_save_pattern": "No se pudo guardar el patrón: %v", "patterns_failed_access_directory": "error al acceder al directorio de patrones '%s': %w", "patterns_failed_create_temp_dir": "no se pudo crear el directorio temporal: %w", "patterns_failed_create_temp_folder": "no se pudo crear la carpeta temporal de patrones: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, deja vacío para '%s' o escribe '%v' para eliminar el valor):", "plugin_question_optional": "%v%v (deja vacío para omitir):", "plugin_question_with_default": "%v%v (deja vacío para '%s' o escribe '%v' para eliminar el valor):", + "plugin_registry_error_configuring_custom_patterns": "Error al configurar CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "Modelo %s no disponible para el proveedor %s", "plugin_setting_not_valid": "%v=%v no es válido", "plugin_setup_configured": "[%v] configurado", "plugin_setup_skipped": "[%v] omitido\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Enviar notificación de escritorio cuando se complete el comando", "serve_fabric_api_ollama_endpoints": "Servir la API REST de Fabric con endpoints de ollama", "serve_fabric_rest_api": "Servir la API REST de Fabric", + "server_chat_error": "Error: %v", + "server_error_marshaling_response": "error al serializar la respuesta: %v", + "server_error_writing_response": "error al escribir la respuesta: %v", + "server_invalid_request_format": "Formato de solicitud no válido: %v", + "sessions_creating_new": "Creando nueva sesión: %s\n", "set_debug_level": "Establecer nivel de depuración (0=apagado, 1=básico, 2=detallado, 3=rastreo)", "set_frequency_penalty": "Establecer penalización de frecuencia", "set_location_web_search": "Establecer ubicación para resultados de búsqueda web (ej., 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Total de episodios**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "Etiqueta de inicio para secciones de pensamiento", + "storage_error_delete": "No se pudo eliminar %s: %v", + "storage_error_load": "No se pudo cargar %s: %v", + "storage_error_marshal": "No se pudo serializar %s: %s", + "storage_error_read_directory": "No se pudieron leer los elementos del directorio: %v", + "storage_error_rename": "No se pudo renombrar %s a %s: %v", + "storage_error_resolve_directory": "No se pudo resolver la ruta del directorio: %v", + "storage_error_save": "No se pudo guardar %s: %v", + "storage_error_stat_entry": "No se pudo obtener información de la entrada %s: %v", + "storage_error_unmarshal": "No se pudo deserializar %s: %s", "strategies_available_header": "Estrategias disponibles:", "strategies_cloning_repository": "Clonando el repositorio %s (ruta: %s)...\\n", "strategies_download_success": "✅ Estrategias descargadas e instaladas correctamente en %s\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "Error en extensión %s: %v", "template_file_error_expand_home_dir": "archivo: no se pudo expandir el directorio home: %v", "template_file_error_invalid_line_count": "archivo: número de líneas no válido %q", "template_file_error_line_count_positive": "archivo: el número de líneas debe ser positivo", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "Archivo: tamaño=%d para la ruta %q", "template_file_log_tail_returning_lines": "Archivo: tail devuelve %d líneas", "template_file_log_validating_path": "Archivo: validando ruta %q", + "template_hash_open_file": "Abrir archivo: %w", + "template_hash_read_file": "Leer archivo: %w", + "template_missing_required_variable": "Variable requerida faltante: %s", + "template_plugin_error": "Error en plugin %s: %v", + "template_processing_stuck": "Procesamiento de plantilla bloqueado - posible bucle infinito", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "Texto: entrada vacía para la operación %q", + "template_text_unknown_operation": "Texto: operación de texto desconocida %q (soportadas: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "Espacio de nombres de plugin desconocido: %s", + "template_utils_failed_get_absolute_path": "No se pudo obtener la ruta absoluta: %w", + "template_utils_failed_get_home_dir": "No se pudo obtener el directorio de inicio del usuario: %w", + "template_utils_path_not_exist": "La ruta no existe: %w", "transcription_model_required": "se requiere un modelo de transcripción (usa --transcribe-model)", "transparent_background_png_webp_only": "el fondo transparente solo puede usarse con formatos PNG y WebP, no %s", "tts_audio_generated_successfully": "Audio TTS generado exitosamente y guardado en: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "Actualizar patrones", "usage_header": "Uso:", "use_model_defaults_raw_help": "Utiliza los valores predeterminados del modelo sin enviar opciones de chat (temperature, top_p, etc.). Solo afecta a los proveedores compatibles con OpenAI. Los modelos de Anthropic siempre usan una selección inteligente de parámetros para cumplir los requisitos específicos del modelo.", + "util_error_accessing_config_path": "Error al acceder a la ruta de configuración predeterminada: %w", + "util_error_determine_home_directory": "No se pudo determinar el directorio de inicio del usuario: %w", + "util_error_get_absolute_path": "No se pudo obtener la ruta absoluta", + "util_error_path_is_empty": "La ruta está vacía", + "util_error_resolve_home_directory": "No se pudo resolver el directorio de inicio", + "util_error_resolve_symlinks": "No se pudieron resolver los enlaces simbólicos: %w", "vendor_no_transcription_support": "el proveedor %s no admite transcripción de audio", "vendor_not_configured": "el proveedor %s no está configurado", "vendor_not_found": "proveedor %s no encontrado", diff --git a/internal/i18n/locales/fa.json b/internal/i18n/locales/fa.json index 2064b12a..9099d985 100644 --- a/internal/i18n/locales/fa.json +++ b/internal/i18n/locales/fa.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "نقطه پایانی مدل‌های Abacus وضعیت %d را برگرداند", "additional_yt_dlp_args": "آرگومان‌های اضافی برای ارسال به yt-dlp (مثال: '--cookies-from-browser brave')", "address_to_bind_rest_api": "آدرس برای متصل کردن API REST", "anthropic_stream_error": "خطای جریان: %v", "api_key_secure_server_routes": "کلید API برای امن‌سازی مسیرهای سرور", "application_options_header": "گزینه‌های برنامه:", "apply_variables_to_input": "اعمال متغیرها به ورودی کاربر", + "attachment_could_not_determine_mimetype": "امکان تعیین نوع MIME آدرس URL وجود ندارد", + "attachment_file_not_exist": "فایل %s وجود ندارد", + "attachment_no_content_available": "محتوایی در دسترس نیست", + "attachment_no_type_no_content": "پیوست نوع و محتوایی برای استخراج ندارد", "attachment_path_or_url_help": "مسیر ضمیمه یا URL (مثال برای پیام‌های تشخیص تصویر OpenAI)", "audio_output_file_specified_but_not_tts_model": "فایل خروجی صوتی '%s' مشخص شده اما مدل '%s' یک مدل TTS نیست. لطفاً از مدل TTS مثل gemini-2.5-flash-preview-tts استفاده کنید", "audio_video_file_transcribe": "فایل صوتی یا ویدیویی برای رونویسی", @@ -15,12 +20,12 @@ "azure_api_version_question": "نسخه API Azure را وارد کنید (برای پیش‌فرض خالی بگذارید)", "azure_base_url_question": "URL پایه API", "azure_base_url_required": "URL پایه Azure الزامی است", + "azure_credential_failure": "ایجاد اعتبارنامه Azure ناموفق بود", "azure_deployments_question": "نام‌های استقرار Azure خود را وارد کنید (با کاما جدا شده)", "azure_deployments_required": "حداقل یک نام استقرار Azure الزامی است", "azure_failed_extract_deployment": "استخراج نام استقرار از درخواست ناموفق بود", "azure_model_field_empty": "فیلد مدل در بدنه درخواست خالی است", "azure_request_body_nil": "بدنه درخواست خالی است", - "azure_credential_failure": "ایجاد اعتبارنامه Azure ناموفق بود", "background_type_help": "نوع پس‌زمینه: opaque، transparent (پیش‌فرض: opaque، فقط برای PNG/WebP)", "bedrock_aws_region_label": "منطقه AWS", "bedrock_converse_failed": "bedrock converse برای مدل %s ناموفق بود: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "نوع رویداد جریان ناشناخته: %T", "cannot_convert_string": "نمی‌توان رشته %q را به %v تبدیل کرد", "change_default_model": "تغییر مدل پیش‌فرض", + "chat_error_content_fields_misused": "امکان استفاده همزمان از Content و MultiContent وجود ندارد", "chatter_error_empty_response": "پاسخ خالی", "chatter_error_find_context": "زمينه %s پيدا نشد: %v", "chatter_error_find_session": "نشست %s پيدا نشد: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "مسیر دایرکتوری الگوهای سفارشی خود را وارد کنید", "custom_patterns_label": "الگوهای سفارشی", "custom_patterns_setup_description": "الگوهای سفارشی - تنظیم دایرکتوری برای الگوهای سفارشی شما", + "custom_patterns_warning_create_directory": "هشدار: امکان ایجاد پوشه الگوهای سفارشی %s وجود ندارد: %v\n", + "db_error_loading_env_file": "خطا در بارگذاری فایل .env: %s", "defaults_model_context_length_question": "طول زمینه مدل را وارد کنید", "defaults_model_question": "شاخص یا نام مدل پیش‌فرض خود را وارد کنید", "defaults_setup_description": "ارائه‌دهنده و مدل هوش مصنوعی پیش‌فرض", + "digitalocean_failed_parse_control_plane_url": "تجزیه URL صفحه کنترل DigitalOcean ناموفق بود: %w", + "digitalocean_model_list_unavailable": "لیست مدل‌های DigitalOcean در دسترس نیست. DIGITALOCEAN_TOKEN را تنظیم کنید تا مدل‌ها از صفحه کنترل دریافت شوند", "disable_openai_responses_api": "غیرفعال کردن API OpenAI Responses (پیش‌فرض: false)", "disable_pattern_variable_replacement": "غیرفعال کردن جایگزینی متغیرهای الگو", "enable_web_search_tool": "فعال‌سازی ابزار جستجوی وب برای مدل‌های پشتیبانی شده (Anthropic، OpenAI، Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "خطا: %v", "gemini_tts_failed": "تولید TTS ناموفق بود: %w", "gemini_unexpected_data_type": "نوع داده غیرمنتظره: %s، داده صوتی مورد انتظار بود", + "gemini_voice_not_found": "صدای '%s' یافت نشد", "gemini_wav_data_invalid": "داده WAV تولید شده نامعتبر است: %d بایت، حداقل مورد نیاز: %d", "gemini_wav_generation_failed": "تولید فایل WAV ناموفق بود: %w", + "githelper_failed_clone_repository": "شبیه‌سازی مخزن ناموفق بود: %w", + "githelper_failed_create_dest_directory": "ایجاد پوشه مقصد ناموفق بود: %w", + "githelper_failed_get_commit": "دریافت کامیت ناموفق بود: %w", + "githelper_failed_get_head": "دریافت HEAD مخزن ناموفق بود: %w", + "githelper_failed_get_tree": "دریافت درخت ناموفق بود: %w", "grab_comments_from_youtube": "دریافت نظرات از ویدیو یوتیوب و ارسال به گفتگو", "grab_transcript_from_youtube": "دریافت رونوشت از ویدیو یوتیوب و ارسال به گفتگو (به طور پیش‌فرض استفاده می‌شود).", "grab_transcript_with_timestamps": "دریافت رونوشت از ویدیو یوتیوب با مهر زمان و ارسال به گفتگو", @@ -239,6 +255,7 @@ "no_description_available": "توضیحی در دسترس نیست", "no_items_found": "هیچ %s", "no_notification_system_available": "هیچ سیستم اعلان‌رسانی در دسترس نیست", + "notifications_no_provider_available": "ارائه‌دهنده اعلان در دسترس نیست", "number_of_latest_patterns": "تعداد جدیدترین الگوها برای فهرست", "ollama_cannot_parse_url": "نمی‌توان URL '%s' را تجزیه کرد: %v", "ollama_chat_request_failed": "درخواست چت ناموفق بود: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "امکان تقسیم فایل به بخش‌های قابل قبول وجود ندارد", "openai_audio_unsupported_audio_format": "فرمت صوتی پشتیبانی نشده '%s'", "openai_audio_using_model_to_transcribe_part": "استفاده از مدل %s برای رونویسی بخش %d (نام فایل: %s)...", + "openai_compatible_unknown_static_model_list": "لیست مدل ایستا ناشناخته: %s", "openai_failed_to_create_models_url": "ایجاد URL مدل‌ها ناموفق بود: %w", "openai_image_failed_to_create_directory": "ایجاد پوشه %s ناموفق بود: %w", "openai_image_failed_to_decode_image_data": "رمزگشایی داده‌های تصویر ناموفق بود: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ الگوها با موفقیت در %s دانلود و نصب شدند\\n", "patterns_downloaded_temp": "%d الگو در پوشه موقت دانلود شد\\n", "patterns_downloading": "در حال دانلود الگوها و پر کردن %s...\\n", + "patterns_error_create_directory": "ایجاد پوشه الگو ناموفق بود: %v", + "patterns_error_get_home_directory": "دریافت پوشه خانگی ناموفق بود: %v", + "patterns_error_load_from_file": "بارگذاری الگو از فایل %s ناموفق بود: %w", + "patterns_error_read_pattern_file": "خواندن فایل الگو %s ناموفق بود: %v", + "patterns_error_read_unique_file": "خواندن فایل الگوهای یکتا ناموفق بود. لطفاً --updatepatterns را اجرا کنید (%s)", + "patterns_error_resolve_file_path": "حل مسیر فایل ناموفق بود: %v", + "patterns_error_save_pattern": "ذخیره الگو ناموفق بود: %v", "patterns_failed_access_directory": "دسترسی به پوشه الگو '%s' ناموفق بود: %w", "patterns_failed_create_temp_dir": "ایجاد پوشه موقت ناموفق بود: %w", "patterns_failed_create_temp_folder": "ایجاد پوشه موقت الگوها ناموفق بود: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false، برای '%s' خالی بگذارید یا '%v' را برای حذف مقدار بنویسید):", "plugin_question_optional": "%v%v (برای رد کردن خالی بگذارید):", "plugin_question_with_default": "%v%v (برای '%s' خالی بگذارید یا '%v' را برای حذف مقدار بنویسید):", + "plugin_registry_error_configuring_custom_patterns": "خطا در پیکربندی CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "مدل %s برای ارائه‌دهنده %s در دسترس نیست", "plugin_setting_not_valid": "%v=%v معتبر نیست", "plugin_setup_configured": "[%v] پیکربندی شد", "plugin_setup_skipped": "[%v] رد شد\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "ارسال اعلان دسک‌تاپ هنگام تکمیل دستور", "serve_fabric_api_ollama_endpoints": "سرویس API REST Fabric با نقاط پایانی ollama", "serve_fabric_rest_api": "سرویس API REST Fabric", + "server_chat_error": "خطا: %v", + "server_error_marshaling_response": "خطا در سریال‌سازی پاسخ: %v", + "server_error_writing_response": "خطا در نوشتن پاسخ: %v", + "server_invalid_request_format": "فرمت درخواست نامعتبر: %v", + "sessions_creating_new": "ایجاد نشست جدید: %s\n", "set_debug_level": "تنظیم سطح اشکال‌زدایی (0=خاموش، 1=پایه، 2=تفصیلی، 3=ردیابی)", "set_frequency_penalty": "تنظیم جریمه فرکانس", "set_location_web_search": "تنظیم مکان برای نتایج جستجوی وب (مثال: 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**مجموع اپیزودها**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "تگ شروع برای بخش‌های تفکر", + "storage_error_delete": "حذف %s ناموفق بود: %v", + "storage_error_load": "بارگذاری %s ناموفق بود: %v", + "storage_error_marshal": "سریال‌سازی %s ناموفق بود: %s", + "storage_error_read_directory": "خواندن موارد از پوشه ناموفق بود: %v", + "storage_error_rename": "تغییر نام %s به %s ناموفق بود: %v", + "storage_error_resolve_directory": "حل مسیر پوشه ناموفق بود: %v", + "storage_error_save": "ذخیره %s ناموفق بود: %v", + "storage_error_stat_entry": "دریافت اطلاعات ورودی %s ناموفق بود: %v", + "storage_error_unmarshal": "بازسریال‌سازی %s ناموفق بود: %s", "strategies_available_header": "راهبردهای موجود:", "strategies_cloning_repository": "در حال کلون کردن مخزن %s (مسیر: %s)...\\n", "strategies_download_success": "✅ راهبردها با موفقیت در %s دانلود و نصب شدند\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "خطای افزونه %s: %v", "template_file_error_expand_home_dir": "فایل: گسترش پوشه خانگی ممکن نشد: %v", "template_file_error_invalid_line_count": "فایل: تعداد خط نامعتبر %q", "template_file_error_line_count_positive": "فایل: تعداد خط باید مثبت باشد", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "فایل: size=%d برای مسیر %q", "template_file_log_tail_returning_lines": "فایل: tail در حال بازگرداندن %d خط است", "template_file_log_validating_path": "فایل: در حال اعتبارسنجی مسیر %q", + "template_hash_open_file": "باز کردن فایل: %w", + "template_hash_read_file": "خواندن فایل: %w", + "template_missing_required_variable": "متغیر الزامی موجود نیست: %s", + "template_plugin_error": "خطای پلاگین %s: %v", + "template_processing_stuck": "پردازش قالب متوقف شده - احتمال حلقه بی‌نهایت", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "متن: ورودی خالی برای عملیات %q", + "template_text_unknown_operation": "متن: عملیات متنی ناشناخته %q (پشتیبانی شده: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "فضای نام پلاگین ناشناخته: %s", + "template_utils_failed_get_absolute_path": "دریافت مسیر مطلق ناموفق بود: %w", + "template_utils_failed_get_home_dir": "دریافت پوشه خانگی کاربر ناموفق بود: %w", + "template_utils_path_not_exist": "مسیر وجود ندارد: %w", "transcription_model_required": "مدل رونویسی الزامی است (از --transcribe-model استفاده کنید)", "transparent_background_png_webp_only": "پس‌زمینه شفاف فقط با فرمت‌های PNG و WebP قابل استفاده است، نه %s", "tts_audio_generated_successfully": "صوت TTS با موفقیت ایجاد و ذخیره شد در: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "به‌روزرسانی الگوها", "usage_header": "استفاده:", "use_model_defaults_raw_help": "از مقادیر پیش‌فرض مدل بدون ارسال گزینه‌های چت (temperature، top_p و غیره) استفاده می‌کند. فقط بر ارائه‌دهندگان سازگار با OpenAI تأثیر می‌گذارد. مدل‌های Anthropic همواره برای رعایت نیازهای خاص هر مدل از انتخاب هوشمند پارامتر استفاده می‌کنند.", + "util_error_accessing_config_path": "خطا در دسترسی به مسیر پیکربندی پیش‌فرض: %w", + "util_error_determine_home_directory": "تعیین پوشه خانگی کاربر ناموفق بود: %w", + "util_error_get_absolute_path": "دریافت مسیر مطلق ناموفق بود", + "util_error_path_is_empty": "مسیر خالی است", + "util_error_resolve_home_directory": "حل پوشه خانگی ناموفق بود", + "util_error_resolve_symlinks": "حل پیوندهای نمادین ناموفق بود: %w", "vendor_no_transcription_support": "تامین‌کننده %s از رونویسی صوتی پشتیبانی نمی‌کند", "vendor_not_configured": "تامین‌کننده %s پیکربندی نشده است", "vendor_not_found": "ارائه‌دهنده %s یافت نشد", diff --git a/internal/i18n/locales/fr.json b/internal/i18n/locales/fr.json index 1860c2df..f1479a89 100644 --- a/internal/i18n/locales/fr.json +++ b/internal/i18n/locales/fr.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "Le point de terminaison des modèles Abacus a renvoyé le statut %d", "additional_yt_dlp_args": "Arguments supplémentaires à passer à yt-dlp (ex. '--cookies-from-browser brave')", "address_to_bind_rest_api": "Adresse pour lier l'API REST", "anthropic_stream_error": "Erreur de flux : %v", "api_key_secure_server_routes": "Clé API utilisée pour sécuriser les routes du serveur", "application_options_header": "Options de l'application :", "apply_variables_to_input": "Appliquer les variables à l'entrée utilisateur", + "attachment_could_not_determine_mimetype": "Impossible de déterminer le type MIME de l'URL", + "attachment_file_not_exist": "Le fichier %s n'existe pas", + "attachment_no_content_available": "Aucun contenu disponible", + "attachment_no_type_no_content": "La pièce jointe n'a ni type ni contenu pour le déduire", "attachment_path_or_url_help": "Chemin de pièce jointe ou URL (ex. pour les messages de reconnaissance d'image OpenAI)", "audio_output_file_specified_but_not_tts_model": "fichier de sortie audio '%s' spécifié mais le modèle '%s' n'est pas un modèle TTS. Veuillez utiliser un modèle TTS comme gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "Fichier audio ou vidéo à transcrire", @@ -15,12 +20,12 @@ "azure_api_version_question": "Entrez la version de l'API Azure (laissez vide pour la valeur par défaut)", "azure_base_url_question": "URL de base de l'API", "azure_base_url_required": "L'URL de base Azure est requise", + "azure_credential_failure": "Échec de la création des identifiants Azure", "azure_deployments_question": "Entrez les noms de vos déploiements Azure (séparés par des virgules)", "azure_deployments_required": "Au moins un nom de déploiement Azure est requis", "azure_failed_extract_deployment": "échec de l'extraction du nom de déploiement de la requête", "azure_model_field_empty": "le champ modèle est vide dans le corps de la requête", "azure_request_body_nil": "le corps de la requête est nil", - "azure_credential_failure": "Échec de la création des identifiants Azure", "background_type_help": "Type d'arrière-plan : opaque, transparent (par défaut : opaque, seulement pour PNG/WebP)", "bedrock_aws_region_label": "Région AWS", "bedrock_converse_failed": "bedrock converse a échoué pour le modèle %s : %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "type d'événement de flux inconnu : %T", "cannot_convert_string": "impossible de convertir la chaîne %q en %v", "change_default_model": "Changer le modèle par défaut", + "chat_error_content_fields_misused": "Impossible d'utiliser Content et MultiContent simultanément", "chatter_error_empty_response": "réponse vide", "chatter_error_find_context": "impossible de trouver le contexte %s : %v", "chatter_error_find_session": "impossible de trouver la session %s : %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Saisissez le chemin vers votre répertoire de patrons personnalisés", "custom_patterns_label": "Patrons personnalisés", "custom_patterns_setup_description": "Patrons personnalisés - Définir le répertoire pour vos patrons personnalisés", + "custom_patterns_warning_create_directory": "Avertissement : Impossible de créer le répertoire de modèles personnalisés %s : %v\n", + "db_error_loading_env_file": "Erreur lors du chargement du fichier .env : %s", "defaults_model_context_length_question": "Saisissez la longueur du contexte du modèle", "defaults_model_question": "Saisissez l'index ou le nom de votre modèle par défaut", "defaults_setup_description": "Fournisseur et modèle d'IA par défaut", + "digitalocean_failed_parse_control_plane_url": "Impossible d'analyser l'URL du plan de contrôle DigitalOcean : %w", + "digitalocean_model_list_unavailable": "Liste des modèles DigitalOcean non disponible. Définissez DIGITALOCEAN_TOKEN pour récupérer les modèles depuis le plan de contrôle", "disable_openai_responses_api": "Désactiver l'API OpenAI Responses (par défaut : false)", "disable_pattern_variable_replacement": "Désactiver le remplacement des variables de motif", "enable_web_search_tool": "Activer l'outil de recherche web pour les modèles pris en charge (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Erreur : %v", "gemini_tts_failed": "échec de la génération TTS : %w", "gemini_unexpected_data_type": "type de données inattendu : %s, données audio attendues", + "gemini_voice_not_found": "Voix '%s' non trouvée", "gemini_wav_data_invalid": "données WAV générées invalides : %d octets, minimum requis : %d", "gemini_wav_generation_failed": "échec de la génération du fichier WAV : %w", + "githelper_failed_clone_repository": "Échec du clonage du dépôt : %w", + "githelper_failed_create_dest_directory": "Échec de la création du répertoire de destination : %w", + "githelper_failed_get_commit": "Échec de la récupération du commit : %w", + "githelper_failed_get_head": "Échec de la récupération du HEAD du dépôt : %w", + "githelper_failed_get_tree": "Échec de la récupération de l'arborescence : %w", "grab_comments_from_youtube": "Récupérer les commentaires de la vidéo YouTube et envoyer au chat", "grab_transcript_from_youtube": "Récupérer la transcription de la vidéo YouTube et envoyer au chat (utilisé par défaut).", "grab_transcript_with_timestamps": "Récupérer la transcription de la vidéo YouTube avec horodatage et envoyer au chat", @@ -239,6 +255,7 @@ "no_description_available": "Aucune description disponible", "no_items_found": "Aucun %s", "no_notification_system_available": "aucun système de notification disponible", + "notifications_no_provider_available": "Aucun fournisseur de notifications disponible", "number_of_latest_patterns": "Nombre des motifs les plus récents à lister", "ollama_cannot_parse_url": "Impossible d'analyser l'URL '%s' : %v", "ollama_chat_request_failed": "Requête de chat échouée : %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "impossible de découper le fichier en morceaux de taille acceptable", "openai_audio_unsupported_audio_format": "format audio non pris en charge '%s'", "openai_audio_using_model_to_transcribe_part": "Utilisation du modèle %s pour transcrire la partie %d (fichier : %s)...", + "openai_compatible_unknown_static_model_list": "Liste de modèles statique inconnue : %s", "openai_failed_to_create_models_url": "échec de création de l'URL des modèles : %w", "openai_image_failed_to_create_directory": "échec de la création du répertoire %s : %w", "openai_image_failed_to_decode_image_data": "échec du décodage des données d'image : %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Patrons téléchargés et installés avec succès dans %s\\n", "patterns_downloaded_temp": "%d patrons téléchargés dans le répertoire temporaire\\n", "patterns_downloading": "Téléchargement des patrons et remplissage de %s...\\n", + "patterns_error_create_directory": "Impossible de créer le répertoire de modèles : %v", + "patterns_error_get_home_directory": "Impossible d'obtenir le répertoire personnel : %v", + "patterns_error_load_from_file": "Impossible de charger le modèle depuis le fichier %s : %w", + "patterns_error_read_pattern_file": "Impossible de lire le fichier de modèle %s : %v", + "patterns_error_read_unique_file": "Impossible de lire le fichier de modèles uniques. Veuillez exécuter --updatepatterns (%s)", + "patterns_error_resolve_file_path": "Impossible de résoudre le chemin du fichier : %v", + "patterns_error_save_pattern": "Impossible de sauvegarder le modèle : %v", "patterns_failed_access_directory": "impossible d'accéder au répertoire des patrons '%s' : %w", "patterns_failed_create_temp_dir": "impossible de créer le répertoire temporaire : %w", "patterns_failed_create_temp_folder": "impossible de créer le dossier temporaire des patrons : %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, laissez vide pour '%s' ou tapez '%v' pour supprimer la valeur) :", "plugin_question_optional": "%v%v (laissez vide pour passer) :", "plugin_question_with_default": "%v%v (laissez vide pour '%s' ou tapez '%v' pour supprimer la valeur) :", + "plugin_registry_error_configuring_custom_patterns": "Erreur lors de la configuration de CustomPatterns : %w", + "plugin_registry_model_not_available_for_vendor": "Modèle %s non disponible pour le fournisseur %s", "plugin_setting_not_valid": "%v=%v n'est pas valide", "plugin_setup_configured": "[%v] configuré", "plugin_setup_skipped": "[%v] ignoré\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Envoyer une notification de bureau quand la commande se termine", "serve_fabric_api_ollama_endpoints": "Servir l'API REST Fabric avec les endpoints ollama", "serve_fabric_rest_api": "Servir l'API REST Fabric", + "server_chat_error": "Erreur : %v", + "server_error_marshaling_response": "erreur de sérialisation de la réponse : %v", + "server_error_writing_response": "erreur d'écriture de la réponse : %v", + "server_invalid_request_format": "Format de requête invalide : %v", + "sessions_creating_new": "Création d'une nouvelle session : %s\n", "set_debug_level": "Définir le niveau de débogage (0=désactivé, 1=basique, 2=détaillé, 3=trace)", "set_frequency_penalty": "Définir la pénalité de fréquence", "set_location_web_search": "Définir l'emplacement pour les résultats de recherche web (ex. 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Épisodes au total** : %d", "spotify_url_label": "**URL** : %s", "start_tag_thinking_sections": "Balise de début pour les sections de réflexion", + "storage_error_delete": "Impossible de supprimer %s : %v", + "storage_error_load": "Impossible de charger %s : %v", + "storage_error_marshal": "Impossible de sérialiser %s : %s", + "storage_error_read_directory": "Impossible de lire les éléments du répertoire : %v", + "storage_error_rename": "Impossible de renommer %s en %s : %v", + "storage_error_resolve_directory": "Impossible de résoudre le chemin du répertoire : %v", + "storage_error_save": "Impossible de sauvegarder %s : %v", + "storage_error_stat_entry": "Impossible d'obtenir les informations de l'entrée %s : %v", + "storage_error_unmarshal": "Impossible de désérialiser %s : %s", "strategies_available_header": "Stratégies disponibles :", "strategies_cloning_repository": "Clonage du dépôt %s (chemin : %s)...\\n", "strategies_download_success": "✅ Stratégies téléchargées et installées avec succès dans %s\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "Erreur d'extension %s : %v", "template_file_error_expand_home_dir": "fichier : impossible d'étendre le répertoire personnel : %v", "template_file_error_invalid_line_count": "fichier : nombre de lignes invalide %q", "template_file_error_line_count_positive": "fichier : le nombre de lignes doit être positif", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "Fichier : taille=%d pour le chemin %q", "template_file_log_tail_returning_lines": "Fichier : tail renvoie %d lignes", "template_file_log_validating_path": "Fichier : validation du chemin %q", + "template_hash_open_file": "Ouverture du fichier : %w", + "template_hash_read_file": "Lecture du fichier : %w", + "template_missing_required_variable": "Variable requise manquante : %s", + "template_plugin_error": "Erreur du plugin %s : %v", + "template_processing_stuck": "Traitement du modèle bloqué - boucle infinie potentielle", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "Texte : entrée vide pour l'opération %q", + "template_text_unknown_operation": "Texte : opération de texte inconnue %q (supportées : upper, lower, title, trim)", + "template_unknown_plugin_namespace": "Espace de noms de plugin inconnu : %s", + "template_utils_failed_get_absolute_path": "Impossible d'obtenir le chemin absolu : %w", + "template_utils_failed_get_home_dir": "Impossible d'obtenir le répertoire personnel de l'utilisateur : %w", + "template_utils_path_not_exist": "Le chemin n'existe pas : %w", "transcription_model_required": "un modèle de transcription est requis (utilisez --transcribe-model)", "transparent_background_png_webp_only": "l'arrière-plan transparent ne peut être utilisé qu'avec les formats PNG et WebP, pas %s", "tts_audio_generated_successfully": "Audio TTS généré avec succès et sauvegardé dans : %s\n", @@ -539,7 +592,13 @@ "unsupported_conversion": "conversion non prise en charge de %v vers %v", "update_patterns": "Mettre à jour les motifs", "usage_header": "Utilisation :", - "use_model_defaults_raw_help": "Utilise les valeurs par défaut du modèle sans envoyer d’options de discussion (temperature, top_p, etc.). N’affecte que les fournisseurs compatibles avec OpenAI. Les modèles Anthropic utilisent toujours une sélection intelligente des paramètres pour respecter les exigences propres à chaque modèle.", + "use_model_defaults_raw_help": "Utilise les valeurs par défaut du modèle sans envoyer d'options de discussion (temperature, top_p, etc.). N'affecte que les fournisseurs compatibles avec OpenAI. Les modèles Anthropic utilisent toujours une sélection intelligente des paramètres pour respecter les exigences propres à chaque modèle.", + "util_error_accessing_config_path": "Erreur d'accès au chemin de configuration par défaut : %w", + "util_error_determine_home_directory": "Impossible de déterminer le répertoire personnel de l'utilisateur : %w", + "util_error_get_absolute_path": "Impossible d'obtenir le chemin absolu", + "util_error_path_is_empty": "Le chemin est vide", + "util_error_resolve_home_directory": "Impossible de résoudre le répertoire personnel", + "util_error_resolve_symlinks": "Impossible de résoudre les liens symboliques : %w", "vendor_no_transcription_support": "le fournisseur %s ne prend pas en charge la transcription audio", "vendor_not_configured": "le fournisseur %s n'est pas configuré", "vendor_not_found": "fournisseur %s introuvable", diff --git a/internal/i18n/locales/it.json b/internal/i18n/locales/it.json index 7598864b..31cdb2f1 100644 --- a/internal/i18n/locales/it.json +++ b/internal/i18n/locales/it.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "L'endpoint dei modelli Abacus ha restituito lo stato %d", "additional_yt_dlp_args": "Argomenti aggiuntivi da passare a yt-dlp (es. '--cookies-from-browser brave')", "address_to_bind_rest_api": "Indirizzo per associare l'API REST", "anthropic_stream_error": "Errore di streaming: %v", "api_key_secure_server_routes": "Chiave API utilizzata per proteggere le route del server", "application_options_header": "Opzioni dell'applicazione:", "apply_variables_to_input": "Applica variabili all'input utente", + "attachment_could_not_determine_mimetype": "Impossibile determinare il tipo MIME dell'URL", + "attachment_file_not_exist": "Il file %s non esiste", + "attachment_no_content_available": "Nessun contenuto disponibile", + "attachment_no_type_no_content": "L'allegato non ha tipo né contenuto da cui derivarlo", "attachment_path_or_url_help": "Percorso allegato o URL (es. per messaggi di riconoscimento immagine OpenAI)", "audio_output_file_specified_but_not_tts_model": "file di output audio '%s' specificato ma il modello '%s' non è un modello TTS. Per favore usa un modello TTS come gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "File audio o video da trascrivere", @@ -15,12 +20,12 @@ "azure_api_version_question": "Inserire la versione dell'API Azure (lasciare vuoto per il valore predefinito)", "azure_base_url_question": "URL base dell'API", "azure_base_url_required": "L'URL base di Azure è obbligatorio", + "azure_credential_failure": "Impossibile creare le credenziali Azure", "azure_deployments_question": "Inserire i nomi delle distribuzioni Azure (separati da virgola)", "azure_deployments_required": "È necessario almeno un nome di distribuzione Azure", "azure_failed_extract_deployment": "impossibile estrarre il nome della distribuzione dalla richiesta", "azure_model_field_empty": "il campo modello è vuoto nel corpo della richiesta", "azure_request_body_nil": "il corpo della richiesta è nil", - "azure_credential_failure": "Impossibile creare le credenziali Azure", "background_type_help": "Tipo di sfondo: opaque, transparent (predefinito: opaque, solo per PNG/WebP)", "bedrock_aws_region_label": "Regione AWS", "bedrock_converse_failed": "bedrock converse fallito per il modello %s: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "tipo di evento stream sconosciuto: %T", "cannot_convert_string": "impossibile convertire la stringa %q in %v", "change_default_model": "Cambia modello predefinito", + "chat_error_content_fields_misused": "Impossibile usare Content e MultiContent simultaneamente", "chatter_error_empty_response": "risposta vuota", "chatter_error_find_context": "impossibile trovare il contesto %s: %v", "chatter_error_find_session": "impossibile trovare la sessione %s: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Inserisci il percorso della directory dei tuoi pattern personalizzati", "custom_patterns_label": "Pattern personalizzati", "custom_patterns_setup_description": "Pattern personalizzati - Imposta la directory per i tuoi pattern personalizzati", + "custom_patterns_warning_create_directory": "Avviso: Impossibile creare la directory dei modelli personalizzati %s: %v\n", + "db_error_loading_env_file": "Errore nel caricamento del file .env: %s", "defaults_model_context_length_question": "Inserisci la lunghezza del contesto del modello", "defaults_model_question": "Inserisci l'indice o il nome del tuo modello predefinito", "defaults_setup_description": "Fornitore e modello AI predefiniti", + "digitalocean_failed_parse_control_plane_url": "Impossibile analizzare l'URL del piano di controllo DigitalOcean: %w", + "digitalocean_model_list_unavailable": "Lista modelli DigitalOcean non disponibile. Impostare DIGITALOCEAN_TOKEN per recuperare i modelli dal piano di controllo", "disable_openai_responses_api": "Disabilita API OpenAI Responses (predefinito: false)", "disable_pattern_variable_replacement": "Disabilita sostituzione variabili pattern", "enable_web_search_tool": "Abilita strumento di ricerca web per modelli supportati (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Errore: %v", "gemini_tts_failed": "generazione TTS fallita: %w", "gemini_unexpected_data_type": "tipo di dato inaspettato: %s, attesi dati audio", + "gemini_voice_not_found": "Voce '%s' non trovata", "gemini_wav_data_invalid": "dati WAV generati non validi: %d byte, minimo richiesto: %d", "gemini_wav_generation_failed": "generazione file WAV fallita: %w", + "githelper_failed_clone_repository": "Clonazione del repository fallita: %w", + "githelper_failed_create_dest_directory": "Creazione della directory di destinazione fallita: %w", + "githelper_failed_get_commit": "Recupero del commit fallito: %w", + "githelper_failed_get_head": "Recupero dell'HEAD del repository fallito: %w", + "githelper_failed_get_tree": "Recupero dell'albero fallito: %w", "grab_comments_from_youtube": "Ottieni commenti dal video YouTube e invia alla chat", "grab_transcript_from_youtube": "Ottieni trascrizione dal video YouTube e invia alla chat (usato per impostazione predefinita).", "grab_transcript_with_timestamps": "Ottieni trascrizione dal video YouTube con timestamp e invia alla chat", @@ -239,6 +255,7 @@ "no_description_available": "Nessuna descrizione disponibile", "no_items_found": "Nessun %s", "no_notification_system_available": "nessun sistema di notifica disponibile", + "notifications_no_provider_available": "Nessun provider di notifiche disponibile", "number_of_latest_patterns": "Numero dei pattern più recenti da elencare", "ollama_cannot_parse_url": "Impossibile analizzare l'URL '%s': %v", "ollama_chat_request_failed": "Richiesta di chat fallita: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "impossibile dividere il file in parti di dimensioni accettabili", "openai_audio_unsupported_audio_format": "formato audio non supportato '%s'", "openai_audio_using_model_to_transcribe_part": "Utilizzo del modello %s per trascrivere la parte %d (nome file: %s)...", + "openai_compatible_unknown_static_model_list": "Lista di modelli statica sconosciuta: %s", "openai_failed_to_create_models_url": "impossibile creare URL modelli: %w", "openai_image_failed_to_create_directory": "creazione della directory %s fallita: %w", "openai_image_failed_to_decode_image_data": "decodifica dei dati dell'immagine fallita: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Pattern scaricati e installati correttamente in %s\\n", "patterns_downloaded_temp": "%d pattern scaricati nella directory temporanea\\n", "patterns_downloading": "Download dei pattern e popolamento di %s...\\n", + "patterns_error_create_directory": "Impossibile creare la directory dei modelli: %v", + "patterns_error_get_home_directory": "Impossibile ottenere la directory home: %v", + "patterns_error_load_from_file": "Impossibile caricare il modello dal file %s: %w", + "patterns_error_read_pattern_file": "Impossibile leggere il file del modello %s: %v", + "patterns_error_read_unique_file": "Impossibile leggere il file dei modelli unici. Eseguire --updatepatterns (%s)", + "patterns_error_resolve_file_path": "Impossibile risolvere il percorso del file: %v", + "patterns_error_save_pattern": "Impossibile salvare il modello: %v", "patterns_failed_access_directory": "impossibile accedere alla directory dei pattern '%s': %w", "patterns_failed_create_temp_dir": "impossibile creare la directory temporanea: %w", "patterns_failed_create_temp_folder": "impossibile creare la cartella temporanea dei pattern: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, lascia vuoto per '%s' o digita '%v' per rimuovere il valore):", "plugin_question_optional": "%v%v (lascia vuoto per saltare):", "plugin_question_with_default": "%v%v (lascia vuoto per '%s' o digita '%v' per rimuovere il valore):", + "plugin_registry_error_configuring_custom_patterns": "Errore nella configurazione di CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "Modello %s non disponibile per il fornitore %s", "plugin_setting_not_valid": "%v=%v non è valido", "plugin_setup_configured": "[%v] configurato", "plugin_setup_skipped": "[%v] saltato\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Invia notifica desktop quando il comando è completato", "serve_fabric_api_ollama_endpoints": "Servi l'API REST di Fabric con endpoint ollama", "serve_fabric_rest_api": "Servi l'API REST di Fabric", + "server_chat_error": "Errore: %v", + "server_error_marshaling_response": "errore nella serializzazione della risposta: %v", + "server_error_writing_response": "errore nella scrittura della risposta: %v", + "server_invalid_request_format": "Formato della richiesta non valido: %v", + "sessions_creating_new": "Creazione nuova sessione: %s\n", "set_debug_level": "Imposta livello di debug (0=spento, 1=base, 2=dettagliato, 3=traccia)", "set_frequency_penalty": "Imposta penalità di frequenza", "set_location_web_search": "Imposta posizione per risultati ricerca web (es. 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Episodi totali**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "Tag di inizio per sezioni di pensiero", + "storage_error_delete": "Impossibile eliminare %s: %v", + "storage_error_load": "Impossibile caricare %s: %v", + "storage_error_marshal": "Impossibile serializzare %s: %s", + "storage_error_read_directory": "Impossibile leggere gli elementi dalla directory: %v", + "storage_error_rename": "Impossibile rinominare %s in %s: %v", + "storage_error_resolve_directory": "Impossibile risolvere il percorso della directory: %v", + "storage_error_save": "Impossibile salvare %s: %v", + "storage_error_stat_entry": "Impossibile ottenere informazioni sulla voce %s: %v", + "storage_error_unmarshal": "Impossibile deserializzare %s: %s", "strategies_available_header": "Strategie disponibili:", "strategies_cloning_repository": "Clonazione del repository %s (percorso: %s)...\\n", "strategies_download_success": "✅ Strategie scaricate e installate correttamente in %s\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "Errore dell'estensione %s: %v", "template_file_error_expand_home_dir": "file: impossibile espandere la directory home: %v", "template_file_error_invalid_line_count": "file: numero di righe non valido %q", "template_file_error_line_count_positive": "file: il numero di righe deve essere positivo", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "File: dimensione=%d per il percorso %q", "template_file_log_tail_returning_lines": "File: tail restituisce %d righe", "template_file_log_validating_path": "File: convalida del percorso %q", + "template_hash_open_file": "Apertura file: %w", + "template_hash_read_file": "Lettura file: %w", + "template_missing_required_variable": "Variabile richiesta mancante: %s", + "template_plugin_error": "Errore del plugin %s: %v", + "template_processing_stuck": "Elaborazione del modello bloccata - possibile ciclo infinito", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "Testo: input vuoto per l'operazione %q", + "template_text_unknown_operation": "Testo: operazione di testo sconosciuta %q (supportate: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "Namespace del plugin sconosciuto: %s", + "template_utils_failed_get_absolute_path": "Impossibile ottenere il percorso assoluto: %w", + "template_utils_failed_get_home_dir": "Impossibile ottenere la directory home dell'utente: %w", + "template_utils_path_not_exist": "Il percorso non esiste: %w", "transcription_model_required": "è richiesto un modello di trascrizione (usa --transcribe-model)", "transparent_background_png_webp_only": "lo sfondo trasparente può essere utilizzato solo con formati PNG e WebP, non %s", "tts_audio_generated_successfully": "Audio TTS generato con successo e salvato in: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "Aggiorna pattern", "usage_header": "Uso:", "use_model_defaults_raw_help": "Usa i valori predefiniti del modello senza inviare opzioni della chat (temperature, top_p, ecc.). Si applica solo ai provider compatibili con OpenAI. I modelli Anthropic utilizzano sempre una selezione intelligente dei parametri per rispettare i requisiti specifici del modello.", + "util_error_accessing_config_path": "Errore nell'accesso al percorso di configurazione predefinito: %w", + "util_error_determine_home_directory": "Impossibile determinare la directory home dell'utente: %w", + "util_error_get_absolute_path": "Impossibile ottenere il percorso assoluto", + "util_error_path_is_empty": "Il percorso è vuoto", + "util_error_resolve_home_directory": "Impossibile risolvere la directory home", + "util_error_resolve_symlinks": "Impossibile risolvere i link simbolici: %w", "vendor_no_transcription_support": "il fornitore %s non supporta la trascrizione audio", "vendor_not_configured": "il fornitore %s non è configurato", "vendor_not_found": "fornitore %s non trovato", diff --git a/internal/i18n/locales/ja.json b/internal/i18n/locales/ja.json index e3708f50..3c537cc4 100644 --- a/internal/i18n/locales/ja.json +++ b/internal/i18n/locales/ja.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "Abacusモデルエンドポイントがステータス%dを返しました", "additional_yt_dlp_args": "yt-dlpに渡す追加の引数(例:'--cookies-from-browser brave')", "address_to_bind_rest_api": "REST APIをバインドするアドレス", "anthropic_stream_error": "ストリームエラー: %v", "api_key_secure_server_routes": "サーバールートを保護するために使用するAPIキー", "application_options_header": "アプリケーションオプション:", "apply_variables_to_input": "ユーザー入力に変数を適用", + "attachment_could_not_determine_mimetype": "URLのMIMEタイプを判定できませんでした", + "attachment_file_not_exist": "ファイル%sが存在しません", + "attachment_no_content_available": "利用可能なコンテンツがありません", + "attachment_no_type_no_content": "添付ファイルにタイプもコンテンツもありません", "attachment_path_or_url_help": "添付ファイルのパスまたはURL(例:OpenAI画像認識メッセージ用)", "audio_output_file_specified_but_not_tts_model": "音声出力ファイル '%s' が指定されましたが、モデル '%s' はTTSモデルではありません。gemini-2.5-flash-preview-tts などのTTSモデルを使用してください", "audio_video_file_transcribe": "転写する音声または動画ファイル", @@ -15,12 +20,12 @@ "azure_api_version_question": "Azure APIバージョンを入力してください(デフォルトの場合は空白のまま)", "azure_base_url_question": "API ベース URL", "azure_base_url_required": "Azure ベースURLが必要です", + "azure_credential_failure": "Azure 認証情報の作成に失敗しました", "azure_deployments_question": "Azureデプロイメント名を入力してください(カンマ区切り)", "azure_deployments_required": "少なくとも1つのAzureデプロイメント名が必要です", "azure_failed_extract_deployment": "リクエストからデプロイメント名を抽出できませんでした", "azure_model_field_empty": "リクエストボディのモデルフィールドが空です", "azure_request_body_nil": "リクエストボディがnilです", - "azure_credential_failure": "Azure 認証情報の作成に失敗しました", "background_type_help": "背景タイプ:opaque、transparent(デフォルト:opaque、PNG/WebPのみ)", "bedrock_aws_region_label": "AWSリージョン", "bedrock_converse_failed": "モデル %s のbedrock converseが失敗しました: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "不明なストリームイベントタイプ: %T", "cannot_convert_string": "文字列 %q を %v に変換できません", "change_default_model": "デフォルトモデルを変更", + "chat_error_content_fields_misused": "ContentとMultiContentを同時に使用することはできません", "chatter_error_empty_response": "空の応答", "chatter_error_find_context": "コンテキスト %s が見つかりませんでした: %v", "chatter_error_find_session": "セッション %s が見つかりませんでした: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "カスタムパターンディレクトリのパスを入力してください", "custom_patterns_label": "カスタムパターン", "custom_patterns_setup_description": "カスタムパターン - カスタムパターン用のディレクトリを設定", + "custom_patterns_warning_create_directory": "警告: カスタムパターンディレクトリ%sを作成できませんでした: %v\n", + "db_error_loading_env_file": ".envファイルの読み込みエラー: %s", "defaults_model_context_length_question": "モデルのコンテキスト長を入力してください", "defaults_model_question": "デフォルトモデルのインデックスまたは名前を入力してください", "defaults_setup_description": "デフォルトのAIプロバイダーとモデル", + "digitalocean_failed_parse_control_plane_url": "DigitalOceanコントロールプレーンURLの解析に失敗しました: %w", + "digitalocean_model_list_unavailable": "DigitalOceanモデルリストが利用できません。DIGITALOCEAN_TOKENを設定してコントロールプレーンからモデルを取得してください", "disable_openai_responses_api": "OpenAI Responses APIを無効化(デフォルト:false)", "disable_pattern_variable_replacement": "パターン変数の置換を無効化", "enable_web_search_tool": "サポートされているモデル(Anthropic、OpenAI、Gemini)でウェブ検索ツールを有効化", @@ -183,8 +193,14 @@ "gemini_stream_error": "エラー: %v", "gemini_tts_failed": "TTS生成に失敗しました: %w", "gemini_unexpected_data_type": "予期しないデータ型: %s、オーディオデータが必要です", + "gemini_voice_not_found": "音声'%s'が見つかりません", "gemini_wav_data_invalid": "生成されたWAVデータが無効です: %d バイト、最小要件: %d", "gemini_wav_generation_failed": "WAVファイルの生成に失敗しました: %w", + "githelper_failed_clone_repository": "リポジトリのクローンに失敗しました: %w", + "githelper_failed_create_dest_directory": "宛先ディレクトリの作成に失敗しました: %w", + "githelper_failed_get_commit": "コミットの取得に失敗しました: %w", + "githelper_failed_get_head": "リポジトリHEADの取得に失敗しました: %w", + "githelper_failed_get_tree": "ツリーの取得に失敗しました: %w", "grab_comments_from_youtube": "YouTube動画からコメントを取得してチャットに送信", "grab_transcript_from_youtube": "YouTube動画から転写を取得してチャットに送信(デフォルトで使用)。", "grab_transcript_with_timestamps": "YouTube動画からタイムスタンプ付きの転写を取得してチャットに送信", @@ -239,6 +255,7 @@ "no_description_available": "説明がありません", "no_items_found": "%s がありません", "no_notification_system_available": "利用可能な通知システムがありません", + "notifications_no_provider_available": "通知プロバイダーが利用できません", "number_of_latest_patterns": "一覧表示する最新パターンの数", "ollama_cannot_parse_url": "URL '%s' を解析できません: %v", "ollama_chat_request_failed": "チャットリクエストが失敗しました: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "許容サイズのチャンクに分割できません", "openai_audio_unsupported_audio_format": "サポートされていない音声フォーマット '%s'", "openai_audio_using_model_to_transcribe_part": "モデル %s を使用してパート %d を文字起こし中(ファイル名: %s)...", + "openai_compatible_unknown_static_model_list": "不明な静的モデルリスト: %s", "openai_failed_to_create_models_url": "モデルURLの作成に失敗しました: %w", "openai_image_failed_to_create_directory": "ディレクトリ %s の作成に失敗しました: %w", "openai_image_failed_to_decode_image_data": "画像データのデコードに失敗しました: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ パターンを %s に正常にダウンロードしてインストールしました\\n", "patterns_downloaded_temp": "%d 個のパターンを一時ディレクトリにダウンロードしました\\n", "patterns_downloading": "パターンをダウンロードして %s を構成しています...\\n", + "patterns_error_create_directory": "パターンディレクトリを作成できませんでした: %v", + "patterns_error_get_home_directory": "ホームディレクトリを取得できませんでした: %v", + "patterns_error_load_from_file": "ファイル%sからパターンを読み込めませんでした: %w", + "patterns_error_read_pattern_file": "パターンファイル%sを読み込めませんでした: %v", + "patterns_error_read_unique_file": "ユニークパターンファイルを読み込めませんでした。--updatepatternsを実行してください (%s)", + "patterns_error_resolve_file_path": "ファイルパスを解決できませんでした: %v", + "patterns_error_save_pattern": "パターンを保存できませんでした: %v", "patterns_failed_access_directory": "パターンディレクトリ '%s' にアクセスできませんでした: %w", "patterns_failed_create_temp_dir": "一時ディレクトリの作成に失敗しました: %w", "patterns_failed_create_temp_folder": "一時パターンフォルダーの作成に失敗しました: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false、'%s' を使うには空欄のまま、値を削除するには '%v' と入力):", "plugin_question_optional": "%v%v (スキップするには空欄のまま):", "plugin_question_with_default": "%v%v ('%s' を使うには空欄のまま、値を削除するには '%v' と入力):", + "plugin_registry_error_configuring_custom_patterns": "CustomPatternsの設定エラー: %w", + "plugin_registry_model_not_available_for_vendor": "モデル%sはベンダー%sでは利用できません", "plugin_setting_not_valid": "%v=%v は無効です", "plugin_setup_configured": "[%v] 設定済み", "plugin_setup_skipped": "[%v] スキップされました\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "コマンド完了時にデスクトップ通知を送信", "serve_fabric_api_ollama_endpoints": "ollamaエンドポイント付きのFabric REST APIを提供", "serve_fabric_rest_api": "Fabric REST APIを提供", + "server_chat_error": "エラー: %v", + "server_error_marshaling_response": "レスポンスのシリアライズエラー: %v", + "server_error_writing_response": "レスポンスの書き込みエラー: %v", + "server_invalid_request_format": "無効なリクエスト形式: %v", + "sessions_creating_new": "新しいセッションを作成中: %s\n", "set_debug_level": "デバッグレベルを設定(0=オフ、1=基本、2=詳細、3=トレース)", "set_frequency_penalty": "頻度ペナルティを設定", "set_location_web_search": "ウェブ検索結果の場所を設定(例:'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**エピソード合計**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "思考セクションの開始タグ", + "storage_error_delete": "%sを削除できませんでした: %v", + "storage_error_load": "%sを読み込めませんでした: %v", + "storage_error_marshal": "%sをシリアライズできませんでした: %s", + "storage_error_read_directory": "ディレクトリからアイテムを読み込めませんでした: %v", + "storage_error_rename": "%sを%sにリネームできませんでした: %v", + "storage_error_resolve_directory": "ディレクトリパスを解決できませんでした: %v", + "storage_error_save": "%sを保存できませんでした: %v", + "storage_error_stat_entry": "エントリ%sの情報を取得できませんでした: %v", + "storage_error_unmarshal": "%sをデシリアライズできませんでした: %s", "strategies_available_header": "利用可能な戦略:", "strategies_cloning_repository": "リポジトリ %s をクローン中 (パス: %s)...\\n", "strategies_download_success": "✅ 戦略を %s に正常にダウンロードしてインストールしました\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "拡張機能%sエラー: %v", "template_file_error_expand_home_dir": "file: ホームディレクトリを展開できませんでした: %v", "template_file_error_invalid_line_count": "file: 無効な行数 %q", "template_file_error_line_count_positive": "file: 行数は正の値である必要があります", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "File: パス %q の size=%d", "template_file_log_tail_returning_lines": "File: tail は %d 行を返します", "template_file_log_validating_path": "File: パス %q を検証中", + "template_hash_open_file": "ファイルを開く: %w", + "template_hash_read_file": "ファイルを読む: %w", + "template_missing_required_variable": "必須変数が不足しています: %s", + "template_plugin_error": "プラグイン%sエラー: %v", + "template_processing_stuck": "テンプレート処理が停止 - 無限ループの可能性", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "テキスト: 操作%qに対する入力が空です", + "template_text_unknown_operation": "テキスト: 不明なテキスト操作%q (対応: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "不明なプラグイン名前空間: %s", + "template_utils_failed_get_absolute_path": "絶対パスの取得に失敗しました: %w", + "template_utils_failed_get_home_dir": "ユーザーホームディレクトリの取得に失敗しました: %w", + "template_utils_path_not_exist": "パスが存在しません: %w", "transcription_model_required": "転写モデルが必要です(--transcribe-model を使用)", "transparent_background_png_webp_only": "透明背景はPNGおよびWebP形式でのみ使用できます。%s では使用できません", "tts_audio_generated_successfully": "TTS音声が正常に生成され、保存されました:%s\n", @@ -540,6 +593,12 @@ "update_patterns": "パターンを更新", "usage_header": "使用法:", "use_model_defaults_raw_help": "チャットオプション(temperature、top_p など)を送信せずにモデルのデフォルトを使用します。OpenAI 互換プロバイダーにのみ適用されます。Anthropic モデルは常に、モデル固有の要件に準拠するためにスマートなパラメーター選択を使用します。", + "util_error_accessing_config_path": "デフォルト設定パスへのアクセスエラー: %w", + "util_error_determine_home_directory": "ユーザーホームディレクトリを特定できませんでした: %w", + "util_error_get_absolute_path": "絶対パスを取得できませんでした", + "util_error_path_is_empty": "パスが空です", + "util_error_resolve_home_directory": "ホームディレクトリを解決できませんでした", + "util_error_resolve_symlinks": "シンボリックリンクを解決できませんでした: %w", "vendor_no_transcription_support": "ベンダー %s は音声転写をサポートしていません", "vendor_not_configured": "ベンダー %s が設定されていません", "vendor_not_found": "ベンダー %s が見つかりません", diff --git a/internal/i18n/locales/pt-BR.json b/internal/i18n/locales/pt-BR.json index afc4f524..a9c25c35 100644 --- a/internal/i18n/locales/pt-BR.json +++ b/internal/i18n/locales/pt-BR.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "O endpoint de modelos do Abacus retornou o status %d", "additional_yt_dlp_args": "Argumentos adicionais para passar ao yt-dlp (ex. '--cookies-from-browser brave')", "address_to_bind_rest_api": "Endereço para vincular a API REST", "anthropic_stream_error": "Erro de transmissão: %v", "api_key_secure_server_routes": "Chave API usada para proteger rotas do servidor", "application_options_header": "Opções da aplicação:", "apply_variables_to_input": "Aplicar variáveis à entrada do usuário", + "attachment_could_not_determine_mimetype": "Não foi possível determinar o tipo MIME da URL", + "attachment_file_not_exist": "O arquivo %s não existe", + "attachment_no_content_available": "Nenhum conteúdo disponível", + "attachment_no_type_no_content": "O anexo não tem tipo nem conteúdo para derivá-lo", "attachment_path_or_url_help": "Caminho para o anexo ou URL (ex. para mensagens de reconhecimento de imagem do OpenAI)", "audio_output_file_specified_but_not_tts_model": "arquivo de saída de áudio '%s' especificado mas o modelo '%s' não é um modelo TTS. Por favor use um modelo TTS como gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "Arquivo de áudio ou vídeo para transcrever", @@ -15,12 +20,12 @@ "azure_api_version_question": "Insira a versão da API do Azure (deixe em branco para o padrão)", "azure_base_url_question": "URL base da API", "azure_base_url_required": "A URL base do Azure é obrigatória", + "azure_credential_failure": "Falha ao criar a credencial do Azure", "azure_deployments_question": "Insira os nomes das implantações do Azure (separados por vírgula)", "azure_deployments_required": "Pelo menos um nome de implantação do Azure é obrigatório", "azure_failed_extract_deployment": "falha ao extrair o nome da implantação da requisição", "azure_model_field_empty": "o campo de modelo está vazio no corpo da requisição", "azure_request_body_nil": "o corpo da requisição é nil", - "azure_credential_failure": "Falha ao criar a credencial do Azure", "background_type_help": "Tipo de fundo: opaque, transparent (padrão: opaque, apenas para PNG/WebP)", "bedrock_aws_region_label": "Regiao AWS", "bedrock_converse_failed": "bedrock converse falhou para o modelo %s: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "tipo de evento de stream desconhecido: %T", "cannot_convert_string": "não é possível converter a string %q para %v", "change_default_model": "Mudar modelo padrão", + "chat_error_content_fields_misused": "Não é possível usar Content e MultiContent simultaneamente", "chatter_error_empty_response": "resposta vazia", "chatter_error_find_context": "nao foi possivel encontrar o contexto %s: %v", "chatter_error_find_session": "nao foi possivel encontrar a sessao %s: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Informe o caminho para seu diretório de padrões personalizados", "custom_patterns_label": "Padrões personalizados", "custom_patterns_setup_description": "Padrões personalizados - Definir diretório para seus padrões personalizados", + "custom_patterns_warning_create_directory": "Aviso: Não foi possível criar o diretório de padrões personalizados %s: %v\n", + "db_error_loading_env_file": "Erro ao carregar o arquivo .env: %s", "defaults_model_context_length_question": "Informe o comprimento do contexto do modelo", "defaults_model_question": "Informe o índice ou o nome do seu modelo padrão", "defaults_setup_description": "Provedor e modelo de IA padrão", + "digitalocean_failed_parse_control_plane_url": "Falha ao analisar a URL do plano de controle do DigitalOcean: %w", + "digitalocean_model_list_unavailable": "Lista de modelos do DigitalOcean indisponível. Defina DIGITALOCEAN_TOKEN para buscar modelos do plano de controle", "disable_openai_responses_api": "Desabilitar API OpenAI Responses (padrão: false)", "disable_pattern_variable_replacement": "Desabilitar substituição de variáveis de padrão", "enable_web_search_tool": "Habilitar ferramenta de busca web para modelos suportados (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Erro: %v", "gemini_tts_failed": "falha na geracao TTS: %w", "gemini_unexpected_data_type": "tipo de dado inesperado: %s, esperado dados de audio", + "gemini_voice_not_found": "Voz '%s' não encontrada", "gemini_wav_data_invalid": "dados WAV gerados invalidos: %d bytes, minimo requerido: %d", "gemini_wav_generation_failed": "falha ao gerar arquivo WAV: %w", + "githelper_failed_clone_repository": "Falha ao clonar o repositório: %w", + "githelper_failed_create_dest_directory": "Falha ao criar o diretório de destino: %w", + "githelper_failed_get_commit": "Falha ao obter o commit: %w", + "githelper_failed_get_head": "Falha ao obter o HEAD do repositório: %w", + "githelper_failed_get_tree": "Falha ao obter a árvore: %w", "grab_comments_from_youtube": "Obter comentários do vídeo do YouTube e enviar ao chat", "grab_transcript_from_youtube": "Obter transcrição do vídeo do YouTube e enviar ao chat (usado por padrão).", "grab_transcript_with_timestamps": "Obter transcrição do vídeo do YouTube com timestamps e enviar ao chat", @@ -239,6 +255,7 @@ "no_description_available": "Nenhuma descrição disponível", "no_items_found": "Nenhum %s", "no_notification_system_available": "nenhum sistema de notificação disponível", + "notifications_no_provider_available": "Nenhum provedor de notificações disponível", "number_of_latest_patterns": "Número dos padrões mais recentes a listar", "ollama_cannot_parse_url": "Não é possível analisar a URL '%s': %v", "ollama_chat_request_failed": "Requisição de chat falhou: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "não foi possível dividir o arquivo em partes de tamanho aceitável", "openai_audio_unsupported_audio_format": "formato de áudio não suportado '%s'", "openai_audio_using_model_to_transcribe_part": "Usando o modelo %s para transcrever a parte %d (arquivo: %s)...", + "openai_compatible_unknown_static_model_list": "Lista de modelos estática desconhecida: %s", "openai_failed_to_create_models_url": "falha ao criar URL de modelos: %w", "openai_image_failed_to_create_directory": "falha ao criar o diretório %s: %w", "openai_image_failed_to_decode_image_data": "falha ao decodificar os dados da imagem: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Padrões baixados e instalados com sucesso em %s\\n", "patterns_downloaded_temp": "%d padrões baixados para o diretório temporário\\n", "patterns_downloading": "Baixando padrões e populando %s...\\n", + "patterns_error_create_directory": "Não foi possível criar o diretório de padrões: %v", + "patterns_error_get_home_directory": "Não foi possível obter o diretório home: %v", + "patterns_error_load_from_file": "Não foi possível carregar o padrão do arquivo %s: %w", + "patterns_error_read_pattern_file": "Não foi possível ler o arquivo de padrão %s: %v", + "patterns_error_read_unique_file": "Não foi possível ler o arquivo de padrões únicos. Execute --updatepatterns (%s)", + "patterns_error_resolve_file_path": "Não foi possível resolver o caminho do arquivo: %v", + "patterns_error_save_pattern": "Não foi possível salvar o padrão: %v", "patterns_failed_access_directory": "falha ao acessar o diretório de padrões '%s': %w", "patterns_failed_create_temp_dir": "falha ao criar diretório temporário: %w", "patterns_failed_create_temp_folder": "falha ao criar a pasta temporária de padrões: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, deixe em branco para '%s' ou digite '%v' para remover o valor):", "plugin_question_optional": "%v%v (deixe em branco para pular):", "plugin_question_with_default": "%v%v (deixe em branco para '%s' ou digite '%v' para remover o valor):", + "plugin_registry_error_configuring_custom_patterns": "Erro ao configurar CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "Modelo %s não disponível para o fornecedor %s", "plugin_setting_not_valid": "%v=%v não é válido", "plugin_setup_configured": "[%v] configurado", "plugin_setup_skipped": "[%v] ignorado\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Enviar notificação desktop quando o comando for concluído", "serve_fabric_api_ollama_endpoints": "Servir a API REST do Fabric com endpoints ollama", "serve_fabric_rest_api": "Servir a API REST do Fabric", + "server_chat_error": "Erro: %v", + "server_error_marshaling_response": "erro ao serializar resposta: %v", + "server_error_writing_response": "erro ao escrever resposta: %v", + "server_invalid_request_format": "Formato de solicitação inválido: %v", + "sessions_creating_new": "Criando nova sessão: %s\n", "set_debug_level": "Definir nível de debug (0=desligado, 1=básico, 2=detalhado, 3=rastreamento)", "set_frequency_penalty": "Definir penalidade de frequência", "set_location_web_search": "Definir localização para resultados de busca web (ex. 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Total de episódios**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "Tag inicial para seções de pensamento", + "storage_error_delete": "Não foi possível excluir %s: %v", + "storage_error_load": "Não foi possível carregar %s: %v", + "storage_error_marshal": "Não foi possível serializar %s: %s", + "storage_error_read_directory": "Não foi possível ler os itens do diretório: %v", + "storage_error_rename": "Não foi possível renomear %s para %s: %v", + "storage_error_resolve_directory": "Não foi possível resolver o caminho do diretório: %v", + "storage_error_save": "Não foi possível salvar %s: %v", + "storage_error_stat_entry": "Não foi possível obter informações da entrada %s: %v", + "storage_error_unmarshal": "Não foi possível desserializar %s: %s", "strategies_available_header": "Estratégias disponíveis:", "strategies_cloning_repository": "Clonando repositório %s (caminho: %s)...\\n", "strategies_download_success": "✅ Estratégias baixadas e instaladas com sucesso em %s\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "Erro na extensão %s: %v", "template_file_error_expand_home_dir": "arquivo: não foi possível expandir o diretório home: %v", "template_file_error_invalid_line_count": "arquivo: contagem de linhas inválida %q", "template_file_error_line_count_positive": "arquivo: a contagem de linhas deve ser positiva", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "Arquivo: tamanho=%d para o caminho %q", "template_file_log_tail_returning_lines": "Arquivo: tail retornando %d linhas", "template_file_log_validating_path": "Arquivo: validando caminho %q", + "template_hash_open_file": "Abrir arquivo: %w", + "template_hash_read_file": "Ler arquivo: %w", + "template_missing_required_variable": "Variável obrigatória ausente: %s", + "template_plugin_error": "Erro no plugin %s: %v", + "template_processing_stuck": "Processamento do modelo travado - possível loop infinito", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "Texto: entrada vazia para a operação %q", + "template_text_unknown_operation": "Texto: operação de texto desconhecida %q (suportadas: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "Namespace de plugin desconhecido: %s", + "template_utils_failed_get_absolute_path": "Falha ao obter o caminho absoluto: %w", + "template_utils_failed_get_home_dir": "Falha ao obter o diretório home do usuário: %w", + "template_utils_path_not_exist": "O caminho não existe: %w", "transcription_model_required": "modelo de transcrição é necessário (use --transcribe-model)", "transparent_background_png_webp_only": "fundo transparente só pode ser usado com formatos PNG e WebP, não %s", "tts_audio_generated_successfully": "Áudio TTS gerado com sucesso e salvo em: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "Atualizar os padrões/patterns", "usage_header": "Uso:", "use_model_defaults_raw_help": "Usa os padrões do modelo sem enviar opções de chat (temperature, top_p etc.). Afeta apenas provedores compatíveis com o OpenAI. Os modelos da Anthropic sempre utilizam seleção inteligente de parâmetros para cumprir os requisitos específicos de cada modelo.", + "util_error_accessing_config_path": "Erro ao acessar o caminho de configuração padrão: %w", + "util_error_determine_home_directory": "Não foi possível determinar o diretório home do usuário: %w", + "util_error_get_absolute_path": "Não foi possível obter o caminho absoluto", + "util_error_path_is_empty": "O caminho está vazio", + "util_error_resolve_home_directory": "Não foi possível resolver o diretório home", + "util_error_resolve_symlinks": "Não foi possível resolver os links simbólicos: %w", "vendor_no_transcription_support": "o fornecedor %s não suporta transcrição de áudio", "vendor_not_configured": "o fornecedor %s não está configurado", "vendor_not_found": "provedor %s não encontrado", diff --git a/internal/i18n/locales/pt-PT.json b/internal/i18n/locales/pt-PT.json index 9fb74046..808deda3 100644 --- a/internal/i18n/locales/pt-PT.json +++ b/internal/i18n/locales/pt-PT.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "O endpoint de modelos do Abacus devolveu o estado %d", "additional_yt_dlp_args": "Argumentos adicionais para passar ao yt-dlp (ex. '--cookies-from-browser brave')", "address_to_bind_rest_api": "Endereço para associar a API REST", "anthropic_stream_error": "Erro de transmissão: %v", "api_key_secure_server_routes": "Chave API usada para proteger as rotas do servidor", "application_options_header": "Opções da aplicação:", "apply_variables_to_input": "Aplicar variáveis à entrada do utilizador", + "attachment_could_not_determine_mimetype": "Não foi possível determinar o tipo MIME do URL", + "attachment_file_not_exist": "O ficheiro %s não existe", + "attachment_no_content_available": "Nenhum conteúdo disponível", + "attachment_no_type_no_content": "O anexo não tem tipo nem conteúdo para o derivar", "attachment_path_or_url_help": "Caminho do anexo ou URL (ex. para mensagens de reconhecimento de imagem do OpenAI)", "audio_output_file_specified_but_not_tts_model": "ficheiro de saída de áudio '%s' especificado mas o modelo '%s' não é um modelo TTS. Por favor use um modelo TTS como gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "Ficheiro de áudio ou vídeo para transcrever", @@ -15,12 +20,12 @@ "azure_api_version_question": "Introduza a versão da API do Azure (deixe vazio para o padrão)", "azure_base_url_question": "URL base da API", "azure_base_url_required": "O URL base do Azure é obrigatório", + "azure_credential_failure": "Falha ao criar a credencial do Azure", "azure_deployments_question": "Introduza os nomes das implementações do Azure (separados por vírgula)", "azure_deployments_required": "É necessário pelo menos um nome de implementação do Azure", "azure_failed_extract_deployment": "falha ao extrair o nome da implementação do pedido", "azure_model_field_empty": "o campo de modelo está vazio no corpo do pedido", "azure_request_body_nil": "o corpo do pedido é nil", - "azure_credential_failure": "Falha ao criar a credencial do Azure", "background_type_help": "Tipo de fundo: opaque, transparent (por omissão: opaque, apenas para PNG/WebP)", "bedrock_aws_region_label": "Regiao AWS", "bedrock_converse_failed": "bedrock converse falhou para o modelo %s: %w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "tipo de evento de stream desconhecido: %T", "cannot_convert_string": "não é possível converter a string %q para %v", "change_default_model": "Mudar modelo predefinido", + "chat_error_content_fields_misused": "Não é possível utilizar Content e MultiContent simultaneamente", "chatter_error_empty_response": "resposta vazia", "chatter_error_find_context": "nao foi possivel encontrar o contexto %s: %v", "chatter_error_find_session": "nao foi possivel encontrar a sessao %s: %v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "Indique o caminho para o seu diretório de padrões personalizados", "custom_patterns_label": "Padrões personalizados", "custom_patterns_setup_description": "Padrões personalizados - Definir diretório para os seus padrões personalizados", + "custom_patterns_warning_create_directory": "Aviso: Não foi possível criar o diretório de padrões personalizados %s: %v\n", + "db_error_loading_env_file": "Erro ao carregar o ficheiro .env: %s", "defaults_model_context_length_question": "Indique o comprimento do contexto do modelo", "defaults_model_question": "Indique o índice ou o nome do seu modelo padrão", "defaults_setup_description": "Fornecedor e modelo de IA padrão", + "digitalocean_failed_parse_control_plane_url": "Falha ao analisar o URL do plano de controlo do DigitalOcean: %w", + "digitalocean_model_list_unavailable": "Lista de modelos do DigitalOcean indisponível. Defina DIGITALOCEAN_TOKEN para obter modelos do plano de controlo", "disable_openai_responses_api": "Desabilitar API OpenAI Responses (por omissão: false)", "disable_pattern_variable_replacement": "Desabilitar substituição de variáveis de padrão", "enable_web_search_tool": "Habilitar ferramenta de pesquisa web para modelos suportados (Anthropic, OpenAI, Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "Erro: %v", "gemini_tts_failed": "falha na geracao TTS: %w", "gemini_unexpected_data_type": "tipo de dado inesperado: %s, esperado dados de audio", + "gemini_voice_not_found": "Voz '%s' não encontrada", "gemini_wav_data_invalid": "dados WAV gerados invalidos: %d bytes, minimo requerido: %d", "gemini_wav_generation_failed": "falha ao gerar ficheiro WAV: %w", + "githelper_failed_clone_repository": "Falha ao clonar o repositório: %w", + "githelper_failed_create_dest_directory": "Falha ao criar o diretório de destino: %w", + "githelper_failed_get_commit": "Falha ao obter o commit: %w", + "githelper_failed_get_head": "Falha ao obter o HEAD do repositório: %w", + "githelper_failed_get_tree": "Falha ao obter a árvore: %w", "grab_comments_from_youtube": "Obter comentários do vídeo do YouTube e enviar ao chat", "grab_transcript_from_youtube": "Obter transcrição do vídeo do YouTube e enviar ao chat (usado por omissão).", "grab_transcript_with_timestamps": "Obter transcrição do vídeo do YouTube com timestamps e enviar ao chat", @@ -239,6 +255,7 @@ "no_description_available": "Nenhuma descrição disponível", "no_items_found": "Nenhum %s", "no_notification_system_available": "nenhum sistema de notificação disponível", + "notifications_no_provider_available": "Nenhum fornecedor de notificações disponível", "number_of_latest_patterns": "Número dos padrões mais recentes a listar", "ollama_cannot_parse_url": "Não é possível analisar o URL '%s': %v", "ollama_chat_request_failed": "Pedido de chat falhou: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "não foi possível dividir o ficheiro em partes de tamanho aceitável", "openai_audio_unsupported_audio_format": "formato de áudio não suportado '%s'", "openai_audio_using_model_to_transcribe_part": "A utilizar o modelo %s para transcrever a parte %d (ficheiro: %s)...", + "openai_compatible_unknown_static_model_list": "Lista de modelos estática desconhecida: %s", "openai_failed_to_create_models_url": "falha ao criar URL de modelos: %w", "openai_image_failed_to_create_directory": "falha ao criar o diretório %s: %w", "openai_image_failed_to_decode_image_data": "falha ao descodificar os dados da imagem: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ Padrões transferidos e instalados com sucesso em %s\\n", "patterns_downloaded_temp": "%d padrões transferidos para o directório temporário\\n", "patterns_downloading": "A transferir padrões e a preencher %s...\\n", + "patterns_error_create_directory": "Não foi possível criar o diretório de padrões: %v", + "patterns_error_get_home_directory": "Não foi possível obter o diretório pessoal: %v", + "patterns_error_load_from_file": "Não foi possível carregar o padrão do ficheiro %s: %w", + "patterns_error_read_pattern_file": "Não foi possível ler o ficheiro de padrão %s: %v", + "patterns_error_read_unique_file": "Não foi possível ler o ficheiro de padrões únicos. Execute --updatepatterns (%s)", + "patterns_error_resolve_file_path": "Não foi possível resolver o caminho do ficheiro: %v", + "patterns_error_save_pattern": "Não foi possível guardar o padrão: %v", "patterns_failed_access_directory": "falha ao aceder ao directório de padrões '%s': %w", "patterns_failed_create_temp_dir": "falha ao criar directório temporário: %w", "patterns_failed_create_temp_folder": "falha ao criar a pasta temporária de padrões: %w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v (true/false, deixe em branco para '%s' ou escreva '%v' para remover o valor):", "plugin_question_optional": "%v%v (deixe em branco para ignorar):", "plugin_question_with_default": "%v%v (deixe em branco para '%s' ou escreva '%v' para remover o valor):", + "plugin_registry_error_configuring_custom_patterns": "Erro ao configurar CustomPatterns: %w", + "plugin_registry_model_not_available_for_vendor": "Modelo %s não disponível para o fornecedor %s", "plugin_setting_not_valid": "%v=%v não é válido", "plugin_setup_configured": "[%v] configurado", "plugin_setup_skipped": "[%v] ignorado\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "Enviar notificação no ambiente de trabalho quando o comando for concluído", "serve_fabric_api_ollama_endpoints": "Servir a API REST do Fabric com endpoints ollama", "serve_fabric_rest_api": "Servir a API REST do Fabric", + "server_chat_error": "Erro: %v", + "server_error_marshaling_response": "erro ao serializar resposta: %v", + "server_error_writing_response": "erro ao escrever resposta: %v", + "server_invalid_request_format": "Formato de pedido inválido: %v", + "sessions_creating_new": "A criar nova sessão: %s\n", "set_debug_level": "Definir nível de debug (0=desligado, 1=básico, 2=detalhado, 3=rastreio)", "set_frequency_penalty": "Definir penalidade de frequência", "set_location_web_search": "Definir localização para resultados de pesquisa web (ex. 'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**Total de episódios**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "Tag inicial para secções de pensamento", + "storage_error_delete": "Não foi possível eliminar %s: %v", + "storage_error_load": "Não foi possível carregar %s: %v", + "storage_error_marshal": "Não foi possível serializar %s: %s", + "storage_error_read_directory": "Não foi possível ler os itens do diretório: %v", + "storage_error_rename": "Não foi possível renomear %s para %s: %v", + "storage_error_resolve_directory": "Não foi possível resolver o caminho do diretório: %v", + "storage_error_save": "Não foi possível guardar %s: %v", + "storage_error_stat_entry": "Não foi possível obter informações da entrada %s: %v", + "storage_error_unmarshal": "Não foi possível desserializar %s: %s", "strategies_available_header": "Estratégias disponíveis:", "strategies_cloning_repository": "A clonar repositório %s (caminho: %s)...\\n", "strategies_download_success": "✅ Estratégias transferidas e instaladas com sucesso em %s\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "Erro na extensão %s: %v", "template_file_error_expand_home_dir": "ficheiro: não foi possível expandir a diretoria home: %v", "template_file_error_invalid_line_count": "ficheiro: contagem de linhas inválida %q", "template_file_error_line_count_positive": "ficheiro: a contagem de linhas tem de ser positiva", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "Ficheiro: tamanho=%d para o caminho %q", "template_file_log_tail_returning_lines": "Ficheiro: tail a devolver %d linhas", "template_file_log_validating_path": "Ficheiro: a validar caminho %q", + "template_hash_open_file": "Abrir ficheiro: %w", + "template_hash_read_file": "Ler ficheiro: %w", + "template_missing_required_variable": "Variável obrigatória em falta: %s", + "template_plugin_error": "Erro no plugin %s: %v", + "template_processing_stuck": "Processamento do modelo bloqueado - possível ciclo infinito", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "Texto: entrada vazia para a operação %q", + "template_text_unknown_operation": "Texto: operação de texto desconhecida %q (suportadas: upper, lower, title, trim)", + "template_unknown_plugin_namespace": "Espaço de nomes do plugin desconhecido: %s", + "template_utils_failed_get_absolute_path": "Falha ao obter o caminho absoluto: %w", + "template_utils_failed_get_home_dir": "Falha ao obter o diretório pessoal do utilizador: %w", + "template_utils_path_not_exist": "O caminho não existe: %w", "transcription_model_required": "modelo de transcrição é necessário (use --transcribe-model)", "transparent_background_png_webp_only": "fundo transparente só pode ser usado com formatos PNG e WebP, não %s", "tts_audio_generated_successfully": "Áudio TTS gerado com sucesso e guardado em: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "Atualizar padrões", "usage_header": "Uso:", "use_model_defaults_raw_help": "Utiliza os valores predefinidos do modelo sem enviar opções de chat (temperature, top_p, etc.). Só afeta fornecedores compatíveis com o OpenAI. Os modelos Anthropic usam sempre uma seleção inteligente de parâmetros para cumprir os requisitos específicos do modelo.", + "util_error_accessing_config_path": "Erro ao aceder ao caminho de configuração predefinido: %w", + "util_error_determine_home_directory": "Não foi possível determinar o diretório pessoal do utilizador: %w", + "util_error_get_absolute_path": "Não foi possível obter o caminho absoluto", + "util_error_path_is_empty": "O caminho está vazio", + "util_error_resolve_home_directory": "Não foi possível resolver o diretório pessoal", + "util_error_resolve_symlinks": "Não foi possível resolver as ligações simbólicas: %w", "vendor_no_transcription_support": "o fornecedor %s não suporta transcrição de áudio", "vendor_not_configured": "o fornecedor %s não está configurado", "vendor_not_found": "fornecedor %s não encontrado", diff --git a/internal/i18n/locales/zh.json b/internal/i18n/locales/zh.json index 3269f699..9c585d41 100644 --- a/internal/i18n/locales/zh.json +++ b/internal/i18n/locales/zh.json @@ -1,10 +1,15 @@ { + "abacus_models_endpoint_status": "Abacus模型端点返回状态%d", "additional_yt_dlp_args": "传递给 yt-dlp 的其他参数(例如 '--cookies-from-browser brave')", "address_to_bind_rest_api": "绑定 REST API 的地址", "anthropic_stream_error": "流式传输错误: %v", "api_key_secure_server_routes": "用于保护服务器路由的 API 密钥", "application_options_header": "应用程序选项:", "apply_variables_to_input": "将变量应用于用户输入", + "attachment_could_not_determine_mimetype": "无法确定URL的MIME类型", + "attachment_file_not_exist": "文件%s不存在", + "attachment_no_content_available": "没有可用内容", + "attachment_no_type_no_content": "附件没有类型也没有内容可供推导", "attachment_path_or_url_help": "附件路径或 URL(例如用于 OpenAI 图像识别消息)", "audio_output_file_specified_but_not_tts_model": "指定了音频输出文件 '%s' 但模型 '%s' 不是 TTS 模型。请使用 TTS 模型,如 gemini-2.5-flash-preview-tts", "audio_video_file_transcribe": "要转录的音频或视频文件", @@ -15,12 +20,12 @@ "azure_api_version_question": "请输入 Azure API 版本(留空使用默认值)", "azure_base_url_question": "API 基础 URL", "azure_base_url_required": "Azure 基础 URL 是必需的", + "azure_credential_failure": "创建 Azure 凭据失败", "azure_deployments_question": "请输入您的 Azure 部署名称(用逗号分隔)", "azure_deployments_required": "至少需要一个 Azure 部署名称", "azure_failed_extract_deployment": "无法从请求中提取部署名称", "azure_model_field_empty": "请求正文中的模型字段为空", "azure_request_body_nil": "请求正文为空", - "azure_credential_failure": "创建 Azure 凭据失败", "background_type_help": "背景类型:opaque、transparent(默认:opaque,仅适用于 PNG/WebP)", "bedrock_aws_region_label": "AWS 区域", "bedrock_converse_failed": "模型 %s 的 bedrock converse 失败:%w", @@ -37,6 +42,7 @@ "bedrock_unknown_stream_event_type": "未知的流事件类型:%T", "cannot_convert_string": "无法将字符串 %q 转换为 %v", "change_default_model": "更改默认模型", + "chat_error_content_fields_misused": "不能同时使用Content和MultiContent属性", "chatter_error_empty_response": "空响应", "chatter_error_find_context": "找不到上下文 %s:%v", "chatter_error_find_session": "找不到会话 %s:%v", @@ -81,9 +87,13 @@ "custom_patterns_directory_question": "请输入您的自定义模式目录路径", "custom_patterns_label": "自定义模式", "custom_patterns_setup_description": "自定义模式 - 设置您的自定义模式目录", + "custom_patterns_warning_create_directory": "警告:无法创建自定义模式目录%s:%v\n", + "db_error_loading_env_file": "加载.env文件错误:%s", "defaults_model_context_length_question": "请输入模型上下文长度", "defaults_model_question": "请输入您的默认模型的索引或名称", "defaults_setup_description": "默认 AI 提供商和模型", + "digitalocean_failed_parse_control_plane_url": "解析DigitalOcean控制面板URL失败:%w", + "digitalocean_model_list_unavailable": "DigitalOcean模型列表不可用。请设置DIGITALOCEAN_TOKEN以从控制面板获取模型", "disable_openai_responses_api": "禁用 OpenAI 响应 API(默认:false)", "disable_pattern_variable_replacement": "禁用模式变量替换", "enable_web_search_tool": "为支持的模型启用网络搜索工具(Anthropic、OpenAI、Gemini)", @@ -183,8 +193,14 @@ "gemini_stream_error": "错误:%v", "gemini_tts_failed": "TTS 生成失败:%w", "gemini_unexpected_data_type": "意外的数据类型:%s,预期为音频数据", + "gemini_voice_not_found": "未找到语音'%s'", "gemini_wav_data_invalid": "生成的 WAV 数据无效:%d 字节,最少需要:%d", "gemini_wav_generation_failed": "生成 WAV 文件失败:%w", + "githelper_failed_clone_repository": "克隆仓库失败:%w", + "githelper_failed_create_dest_directory": "创建目标目录失败:%w", + "githelper_failed_get_commit": "获取提交失败:%w", + "githelper_failed_get_head": "获取仓库HEAD失败:%w", + "githelper_failed_get_tree": "获取树失败:%w", "grab_comments_from_youtube": "从 YouTube 视频获取评论并发送到聊天", "grab_transcript_from_youtube": "从 YouTube 视频获取转录并发送到聊天(默认使用)。", "grab_transcript_with_timestamps": "从 YouTube 视频获取带时间戳的转录并发送到聊天", @@ -239,6 +255,7 @@ "no_description_available": "没有可用描述", "no_items_found": "没有 %s", "no_notification_system_available": "没有可用的通知系统", + "notifications_no_provider_available": "没有可用的通知提供者", "number_of_latest_patterns": "要列出的最新模式数量", "ollama_cannot_parse_url": "无法解析 URL '%s': %v", "ollama_chat_request_failed": "聊天请求失败: %v", @@ -293,6 +310,7 @@ "openai_audio_unable_to_split_acceptable_size_chunks": "无法将文件分割为可接受大小的片段", "openai_audio_unsupported_audio_format": "不支持的音频格式 '%s'", "openai_audio_using_model_to_transcribe_part": "使用模型 %s 转录第 %d 部分(文件名: %s)...", + "openai_compatible_unknown_static_model_list": "未知的静态模型列表:%s", "openai_failed_to_create_models_url": "创建模型 URL 失败:%w", "openai_image_failed_to_create_directory": "创建目录 %s 失败: %w", "openai_image_failed_to_decode_image_data": "解码图像数据失败: %w", @@ -322,6 +340,13 @@ "patterns_download_success": "✅ 已成功下载并安装模式到 %s\\n", "patterns_downloaded_temp": "已将 %d 个模式下载到临时目录\\n", "patterns_downloading": "正在下载模式并填充 %s...\\n", + "patterns_error_create_directory": "无法创建模式目录:%v", + "patterns_error_get_home_directory": "无法获取主目录:%v", + "patterns_error_load_from_file": "无法从文件%s加载模式:%w", + "patterns_error_read_pattern_file": "无法读取模式文件%s:%v", + "patterns_error_read_unique_file": "无法读取唯一模式文件。请运行--updatepatterns (%s)", + "patterns_error_resolve_file_path": "无法解析文件路径:%v", + "patterns_error_save_pattern": "无法保存模式:%v", "patterns_failed_access_directory": "访问模式目录 '%s' 失败:%w", "patterns_failed_create_temp_dir": "创建临时目录失败:%w", "patterns_failed_create_temp_folder": "创建模式临时文件夹失败:%w", @@ -370,6 +395,8 @@ "plugin_question_bool": "%v%v(true/false,留空表示使用 '%s',或输入 '%v' 清除值):", "plugin_question_optional": "%v%v(留空以跳过):", "plugin_question_with_default": "%v%v(留空表示使用 '%s',或输入 '%v' 清除值):", + "plugin_registry_error_configuring_custom_patterns": "配置CustomPatterns错误:%w", + "plugin_registry_model_not_available_for_vendor": "模型%s对供应商%s不可用", "plugin_setting_not_valid": "%v=%v 无效", "plugin_setup_configured": "[%v] 已配置", "plugin_setup_skipped": "[%v] 已跳过\\n", @@ -389,6 +416,11 @@ "send_desktop_notification": "命令完成时发送桌面通知", "serve_fabric_api_ollama_endpoints": "提供带有 ollama 端点的 Fabric REST API 服务", "serve_fabric_rest_api": "提供 Fabric REST API 服务", + "server_chat_error": "错误: %v", + "server_error_marshaling_response": "序列化响应错误: %v", + "server_error_writing_response": "写入响应错误: %v", + "server_invalid_request_format": "无效的请求格式: %v", + "sessions_creating_new": "正在创建新会话:%s\n", "set_debug_level": "设置调试级别(0=关闭,1=基本,2=详细,3=跟踪)", "set_frequency_penalty": "设置频率惩罚", "set_location_web_search": "设置网络搜索结果的位置(例如,'America/Los_Angeles')", @@ -481,6 +513,15 @@ "spotify_total_episodes_label": "**总剧集数**: %d", "spotify_url_label": "**URL**: %s", "start_tag_thinking_sections": "思考部分的开始标签", + "storage_error_delete": "无法删除%s:%v", + "storage_error_load": "无法加载%s:%v", + "storage_error_marshal": "无法序列化%s:%s", + "storage_error_read_directory": "无法读取目录中的项目:%v", + "storage_error_rename": "无法将%s重命名为%s:%v", + "storage_error_resolve_directory": "无法解析目录路径:%v", + "storage_error_save": "无法保存%s:%v", + "storage_error_stat_entry": "无法获取条目%s的信息:%v", + "storage_error_unmarshal": "无法反序列化%s:%s", "strategies_available_header": "可用的策略:", "strategies_cloning_repository": "正在克隆仓库 %s(路径:%s)...\\n", "strategies_download_success": "✅ 已成功下载并安装策略到 %s\\n", @@ -503,6 +544,7 @@ "template_datetime_error_invalid_unit": "invalid time unit: %q", "template_datetime_error_relative_requires_value": "relative time requires a value", "template_datetime_error_unknown_operation": "datetime: unknown operation %q", + "template_extension_error": "扩展%s错误:%v", "template_file_error_expand_home_dir": "file: 无法展开主目录: %v", "template_file_error_invalid_line_count": "file: 无效的行数 %q", "template_file_error_line_count_positive": "file: 行数必须为正数", @@ -525,12 +567,23 @@ "template_file_log_size_for_path": "文件:路径 %q 的 size=%d", "template_file_log_tail_returning_lines": "文件:tail 返回 %d 行", "template_file_log_validating_path": "文件:正在验证路径 %q", + "template_hash_open_file": "打开文件:%w", + "template_hash_read_file": "读取文件:%w", + "template_missing_required_variable": "缺少必需变量:%s", + "template_plugin_error": "插件%s错误:%v", + "template_processing_stuck": "模板处理卡住 - 可能存在无限循环", "template_sys_error_env_requires_var": "env: variable name required", "template_sys_error_home": "failed to get home directory: %v", "template_sys_error_hostname": "failed to get hostname: %v", "template_sys_error_pwd": "failed to get working directory: %v", "template_sys_error_unknown_operation": "sys: unknown operation %q", "template_sys_error_user": "failed to get current user: %v", + "template_text_empty_input": "文本:操作%q的输入为空", + "template_text_unknown_operation": "文本:未知文本操作%q(支持:upper、lower、title、trim)", + "template_unknown_plugin_namespace": "未知的插件命名空间:%s", + "template_utils_failed_get_absolute_path": "获取绝对路径失败:%w", + "template_utils_failed_get_home_dir": "获取用户主目录失败:%w", + "template_utils_path_not_exist": "路径不存在:%w", "transcription_model_required": "需要转录模型(使用 --transcribe-model)", "transparent_background_png_webp_only": "透明背景只能用于 PNG 和 WebP 格式,不支持 %s", "tts_audio_generated_successfully": "TTS 音频生成成功并保存到: %s\n", @@ -540,6 +593,12 @@ "update_patterns": "更新模式", "usage_header": "用法:", "use_model_defaults_raw_help": "在不发送聊天选项(temperature、top_p 等)的情况下使用模型默认值。仅影响兼容 OpenAI 的提供商。Anthropic 模型始终使用智能参数选择以满足特定模型的要求。", + "util_error_accessing_config_path": "访问默认配置路径错误:%w", + "util_error_determine_home_directory": "无法确定用户主目录:%w", + "util_error_get_absolute_path": "无法获取绝对路径", + "util_error_path_is_empty": "路径为空", + "util_error_resolve_home_directory": "无法解析主目录", + "util_error_resolve_symlinks": "无法解析符号链接:%w", "vendor_no_transcription_support": "供应商 %s 不支持音频转录", "vendor_not_configured": "供应商 %s 未配置", "vendor_not_found": "未找到供应商 %s", diff --git a/internal/plugins/ai/digitalocean/digitalocean.go b/internal/plugins/ai/digitalocean/digitalocean.go index f24e98b8..cd2fd943 100644 --- a/internal/plugins/ai/digitalocean/digitalocean.go +++ b/internal/plugins/ai/digitalocean/digitalocean.go @@ -63,7 +63,7 @@ func (c *Client) ListModels() ([]string, error) { err, ) } - return nil, fmt.Errorf("DigitalOcean model list unavailable. Set DIGITALOCEAN_TOKEN to fetch models from the control plane") + return nil, fmt.Errorf("%s", i18n.T("digitalocean_model_list_unavailable")) } return c.fetchModelsFromControlPlane(context.Background()) } @@ -75,7 +75,7 @@ func (c *Client) fetchModelsFromControlPlane(ctx context.Context) ([]string, err fullURL, err := url.Parse(controlPlaneModelsURL) if err != nil { - return nil, fmt.Errorf("failed to parse DigitalOcean control plane URL: %w", err) + return nil, fmt.Errorf(i18n.T("digitalocean_failed_parse_control_plane_url"), err) } req, err := http.NewRequestWithContext(ctx, http.MethodGet, fullURL.String(), nil) diff --git a/internal/plugins/ai/gemini/voices.go b/internal/plugins/ai/gemini/voices.go index 0f3e9839..c8f85c9b 100644 --- a/internal/plugins/ai/gemini/voices.go +++ b/internal/plugins/ai/gemini/voices.go @@ -4,6 +4,8 @@ import ( "fmt" "sort" "strings" + + "github.com/danielmiessler/fabric/internal/i18n" ) // GeminiVoice represents a Gemini TTS voice with its characteristics @@ -119,7 +121,7 @@ func GetGeminiVoiceByName(name string) (*GeminiVoice, error) { return &voice, nil } } - return nil, fmt.Errorf("voice '%s' not found", name) + return nil, fmt.Errorf(i18n.T("gemini_voice_not_found"), name) } // ListGeminiVoices formats the voice list for display diff --git a/internal/plugins/ai/openai_compatible/providers_config.go b/internal/plugins/ai/openai_compatible/providers_config.go index 9ace993c..8f86dbd4 100644 --- a/internal/plugins/ai/openai_compatible/providers_config.go +++ b/internal/plugins/ai/openai_compatible/providers_config.go @@ -9,6 +9,7 @@ import ( "strings" "time" + "github.com/danielmiessler/fabric/internal/i18n" "github.com/danielmiessler/fabric/internal/plugins/ai/openai" ) @@ -92,7 +93,7 @@ func (c *Client) fetchAbacusModels() ([]string, error) { defer resp.Body.Close() if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("abacus models endpoint returned status %d", resp.StatusCode) + return nil, fmt.Errorf(i18n.T("abacus_models_endpoint_status"), resp.StatusCode) } var response struct { @@ -200,7 +201,7 @@ func (c *Client) getStaticModels(modelsKey string) ([]string, error) { "MiniMax-M2.1-lightning", }, nil default: - return nil, fmt.Errorf("unknown static model list: %s", modelsKey) + return nil, fmt.Errorf(i18n.T("openai_compatible_unknown_static_model_list"), modelsKey) } } diff --git a/internal/plugins/db/fsdb/db.go b/internal/plugins/db/fsdb/db.go index caca2353..e3c6dea1 100644 --- a/internal/plugins/db/fsdb/db.go +++ b/internal/plugins/db/fsdb/db.go @@ -7,6 +7,7 @@ import ( "strings" "time" + "github.com/danielmiessler/fabric/internal/i18n" "github.com/joho/godotenv" ) @@ -80,7 +81,7 @@ func (o *Db) Configure() (err error) { func (o *Db) LoadEnvFile() (err error) { if err = godotenv.Load(o.EnvFilePath); err != nil { - err = fmt.Errorf("error loading .env file: %s", err) + err = fmt.Errorf(i18n.T("db_error_loading_env_file"), err) } return } diff --git a/internal/plugins/db/fsdb/patterns.go b/internal/plugins/db/fsdb/patterns.go index 4edd2562..0bbc315e 100644 --- a/internal/plugins/db/fsdb/patterns.go +++ b/internal/plugins/db/fsdb/patterns.go @@ -61,12 +61,12 @@ func (o *PatternsEntity) loadPattern(source string) (pattern *Pattern, err error // Resolve the file path using GetAbsolutePath var absPath string if absPath, err = util.GetAbsolutePath(source); err != nil { - return nil, fmt.Errorf("could not resolve file path: %v", err) + return nil, fmt.Errorf(i18n.T("patterns_error_resolve_file_path"), err) } // Use the resolved absolute path to get the pattern if pattern, err = o.getFromFile(absPath); err != nil { - return nil, fmt.Errorf("could not load pattern from file %s: %w", absPath, err) + return nil, fmt.Errorf(i18n.T("patterns_error_load_from_file"), absPath, err) } } else { // Otherwise, get the pattern from the database @@ -154,7 +154,7 @@ func (o *PatternsEntity) getFromDB(name string) (ret *Pattern, err error) { func (o *PatternsEntity) PrintLatestPatterns(latestNumber int) (err error) { var contents []byte if contents, err = os.ReadFile(o.UniquePatternsFilePath); err != nil { - err = fmt.Errorf("could not read unique patterns file. Please run --updatepatterns (%s)", err) + err = fmt.Errorf(i18n.T("patterns_error_read_unique_file"), err) return } uniquePatterns := strings.Split(string(contents), "\n") @@ -174,7 +174,7 @@ func (o *PatternsEntity) getFromFile(pathStr string) (pattern *Pattern, err erro if strings.HasPrefix(pathStr, "~/") { var homedir string if homedir, err = os.UserHomeDir(); err != nil { - err = fmt.Errorf("could not get home directory: %v", err) + err = fmt.Errorf(i18n.T("patterns_error_get_home_directory"), err) return } pathStr = filepath.Join(homedir, pathStr[2:]) @@ -182,7 +182,7 @@ func (o *PatternsEntity) getFromFile(pathStr string) (pattern *Pattern, err erro var content []byte if content, err = os.ReadFile(pathStr); err != nil { - err = fmt.Errorf("could not read pattern file %s: %v", pathStr, err) + err = fmt.Errorf(i18n.T("patterns_error_read_pattern_file"), pathStr, err) return } pattern = &Pattern{ @@ -265,11 +265,11 @@ func (o *PatternsEntity) Get(name string) (*Pattern, error) { func (o *PatternsEntity) Save(name string, content []byte) (err error) { patternDir := filepath.Join(o.Dir, name) if err = os.MkdirAll(patternDir, os.ModePerm); err != nil { - return fmt.Errorf("could not create pattern directory: %v", err) + return fmt.Errorf(i18n.T("patterns_error_create_directory"), err) } patternPath := filepath.Join(patternDir, o.SystemPatternFile) if err = os.WriteFile(patternPath, content, 0644); err != nil { - return fmt.Errorf("could not save pattern: %v", err) + return fmt.Errorf(i18n.T("patterns_error_save_pattern"), err) } return nil } diff --git a/internal/plugins/db/fsdb/sessions.go b/internal/plugins/db/fsdb/sessions.go index 53649742..f3dd91e6 100644 --- a/internal/plugins/db/fsdb/sessions.go +++ b/internal/plugins/db/fsdb/sessions.go @@ -5,6 +5,7 @@ import ( "github.com/danielmiessler/fabric/internal/chat" "github.com/danielmiessler/fabric/internal/domain" + "github.com/danielmiessler/fabric/internal/i18n" ) type SessionsEntity struct { @@ -17,7 +18,7 @@ func (o *SessionsEntity) Get(name string) (session *Session, err error) { if o.Exists(name) { err = o.LoadAsJson(name, &session.Messages) } else { - fmt.Printf("Creating new session: %s\n", name) + fmt.Printf(i18n.T("sessions_creating_new"), name) } return } diff --git a/internal/plugins/db/fsdb/storage.go b/internal/plugins/db/fsdb/storage.go index af3d3b82..2e9add11 100644 --- a/internal/plugins/db/fsdb/storage.go +++ b/internal/plugins/db/fsdb/storage.go @@ -30,13 +30,13 @@ func (o *StorageEntity) GetNames() (ret []string, err error) { // Resolve the directory path to an absolute path absDir, err := util.GetAbsolutePath(o.Dir) if err != nil { - return nil, fmt.Errorf("could not resolve directory path: %v", err) + return nil, fmt.Errorf(i18n.T("storage_error_resolve_directory"), err) } // Read the directory entries var entries []os.DirEntry if entries, err = os.ReadDir(absDir); err != nil { - return nil, fmt.Errorf("could not read items from directory: %v", err) + return nil, fmt.Errorf(i18n.T("storage_error_read_directory"), err) } for _, entry := range entries { @@ -45,7 +45,7 @@ func (o *StorageEntity) GetNames() (ret []string, err error) { // Get metadata for the entry, including symlink info fileInfo, err := os.Lstat(entryPath) if err != nil { - return nil, fmt.Errorf("could not stat entry %s: %v", entryPath, err) + return nil, fmt.Errorf(i18n.T("storage_error_stat_entry"), entryPath, err) } // Determine if the entry should be included @@ -69,7 +69,7 @@ func (o *StorageEntity) GetNames() (ret []string, err error) { func (o *StorageEntity) Delete(name string) (err error) { if err = os.RemoveAll(o.BuildFilePathByName(name)); err != nil { - err = fmt.Errorf("could not delete %s: %v", name, err) + err = fmt.Errorf(i18n.T("storage_error_delete"), name, err) } return } @@ -82,21 +82,21 @@ func (o *StorageEntity) Exists(name string) (ret bool) { func (o *StorageEntity) Rename(oldName, newName string) (err error) { if err = os.Rename(o.BuildFilePathByName(oldName), o.BuildFilePathByName(newName)); err != nil { - err = fmt.Errorf("could not rename %s to %s: %v", oldName, newName, err) + err = fmt.Errorf(i18n.T("storage_error_rename"), oldName, newName, err) } return } func (o *StorageEntity) Save(name string, content []byte) (err error) { if err = os.WriteFile(o.BuildFilePathByName(name), content, 0644); err != nil { - err = fmt.Errorf("could not save %s: %v", name, err) + err = fmt.Errorf(i18n.T("storage_error_save"), name, err) } return } func (o *StorageEntity) Load(name string) (ret []byte, err error) { if ret, err = os.ReadFile(o.BuildFilePathByName(name)); err != nil { - err = fmt.Errorf("could not load %s: %v", name, err) + err = fmt.Errorf(i18n.T("storage_error_load"), name, err) } return } @@ -139,7 +139,7 @@ func (o *StorageEntity) SaveAsJson(name string, item any) (err error) { if jsonString, err = json.Marshal(item); err == nil { err = o.Save(name, jsonString) } else { - err = fmt.Errorf("could not marshal %s: %s", name, err) + err = fmt.Errorf(i18n.T("storage_error_marshal"), name, err) } return err @@ -152,7 +152,7 @@ func (o *StorageEntity) LoadAsJson(name string, item any) (err error) { } if err = json.Unmarshal(content, &item); err != nil { - err = fmt.Errorf("could not unmarshal %s: %s", name, err) + err = fmt.Errorf(i18n.T("storage_error_unmarshal"), name, err) } return } diff --git a/internal/plugins/template/hash.go b/internal/plugins/template/hash.go index 8e616bed..5edb2130 100644 --- a/internal/plugins/template/hash.go +++ b/internal/plugins/template/hash.go @@ -6,6 +6,8 @@ import ( "fmt" "io" "os" + + "github.com/danielmiessler/fabric/internal/i18n" ) // ComputeHash computes SHA-256 hash of a file at given path. @@ -13,13 +15,13 @@ import ( func ComputeHash(path string) (string, error) { f, err := os.Open(path) if err != nil { - return "", fmt.Errorf("open file: %w", err) + return "", fmt.Errorf(i18n.T("template_hash_open_file"), err) } defer f.Close() h := sha256.New() if _, err := io.Copy(h, f); err != nil { - return "", fmt.Errorf("read file: %w", err) + return "", fmt.Errorf(i18n.T("template_hash_read_file"), err) } return hex.EncodeToString(h.Sum(nil)), nil diff --git a/internal/plugins/template/template.go b/internal/plugins/template/template.go index cfdd3df5..d9ee61a4 100644 --- a/internal/plugins/template/template.go +++ b/internal/plugins/template/template.go @@ -7,6 +7,7 @@ import ( "regexp" "strings" + "github.com/danielmiessler/fabric/internal/i18n" debuglog "github.com/danielmiessler/fabric/internal/log" ) @@ -80,7 +81,7 @@ func ApplyTemplate(content string, variables map[string]string, input string) (s debugf("Extension call: name=%s operation=%s value=%s\n", name, operation, value) result, err := extensionManager.ProcessExtension(name, operation, value) if err != nil { - return "", fmt.Errorf("extension %s error: %v", name, err) + return "", fmt.Errorf(i18n.T("template_extension_error"), name, err) } content = strings.ReplaceAll(content, full, result) progress = true @@ -114,11 +115,11 @@ func ApplyTemplate(content string, variables map[string]string, input string) (s debugf("Executing sys plugin\n") result, err = sysPlugin.Apply(operation, value) default: - return "", fmt.Errorf("unknown plugin namespace: %s", namespace) + return "", fmt.Errorf(i18n.T("template_unknown_plugin_namespace"), namespace) } if err != nil { debugf("Plugin error: %v\n", err) - return "", fmt.Errorf("plugin %s error: %v", namespace, err) + return "", fmt.Errorf(i18n.T("template_plugin_error"), namespace, err) } content = strings.ReplaceAll(content, full, result) progress = true @@ -134,7 +135,7 @@ func ApplyTemplate(content string, variables map[string]string, input string) (s default: val, ok := variables[raw] if !ok { - return "", fmt.Errorf("missing required variable: %s", raw) + return "", fmt.Errorf(i18n.T("template_missing_required_variable"), raw) } content = strings.ReplaceAll(content, full, val) progress = true @@ -142,7 +143,7 @@ func ApplyTemplate(content string, variables map[string]string, input string) (s } if !progress { - return "", fmt.Errorf("template processing stuck - potential infinite loop") + return "", fmt.Errorf("%s", i18n.T("template_processing_stuck")) } } diff --git a/internal/plugins/template/text.go b/internal/plugins/template/text.go index 646d6955..de65ce9d 100644 --- a/internal/plugins/template/text.go +++ b/internal/plugins/template/text.go @@ -5,6 +5,8 @@ import ( "fmt" "strings" "unicode" + + "github.com/danielmiessler/fabric/internal/i18n" ) // TextPlugin provides string manipulation operations @@ -34,7 +36,7 @@ func (p *TextPlugin) Apply(operation string, value string) (string, error) { debugf("TextPlugin: operation=%s value=%q", operation, value) if value == "" { - return "", fmt.Errorf("text: empty input for operation %q", operation) + return "", fmt.Errorf(i18n.T("template_text_empty_input"), operation) } switch operation { @@ -59,6 +61,6 @@ func (p *TextPlugin) Apply(operation string, value string) (string, error) { return result, nil default: - return "", fmt.Errorf("text: unknown text operation %q (supported: upper, lower, title, trim)", operation) + return "", fmt.Errorf(i18n.T("template_text_unknown_operation"), operation) } } diff --git a/internal/plugins/template/utils.go b/internal/plugins/template/utils.go index a5a9f4ab..aeb709f6 100644 --- a/internal/plugins/template/utils.go +++ b/internal/plugins/template/utils.go @@ -7,6 +7,8 @@ import ( "os/user" "path/filepath" "strings" + + "github.com/danielmiessler/fabric/internal/i18n" ) // ExpandPath expands the ~ to user's home directory and returns absolute path @@ -20,7 +22,7 @@ func ExpandPath(path string) (string, error) { if strings.HasPrefix(path, "~/") { usr, err := user.Current() if err != nil { - return "", fmt.Errorf("failed to get user home directory: %w", err) + return "", fmt.Errorf(i18n.T("template_utils_failed_get_home_dir"), err) } // Replace ~/ with actual home directory path = filepath.Join(usr.HomeDir, path[2:]) @@ -29,12 +31,12 @@ func ExpandPath(path string) (string, error) { // Convert to absolute path absPath, err := filepath.Abs(path) if err != nil { - return "", fmt.Errorf("failed to get absolute path: %w", err) + return "", fmt.Errorf(i18n.T("template_utils_failed_get_absolute_path"), err) } // Check if path exists if _, err := os.Stat(absPath); err != nil { - return "", fmt.Errorf("path does not exist: %w", err) + return "", fmt.Errorf(i18n.T("template_utils_path_not_exist"), err) } return absPath, nil diff --git a/internal/server/chat.go b/internal/server/chat.go index 2a9be61e..70ec48ff 100755 --- a/internal/server/chat.go +++ b/internal/server/chat.go @@ -13,6 +13,7 @@ import ( "github.com/danielmiessler/fabric/internal/core" "github.com/danielmiessler/fabric/internal/domain" + "github.com/danielmiessler/fabric/internal/i18n" "github.com/danielmiessler/fabric/internal/plugins/db/fsdb" "github.com/gin-gonic/gin" ) @@ -75,7 +76,7 @@ func (h *ChatHandler) HandleChat(c *gin.Context) { if err := c.BindJSON(&request); err != nil { log.Printf("Error binding JSON: %v", err) c.Writer.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains") - c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("Invalid request format: %v", err)}) + c.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf(i18n.T("server_invalid_request_format"), err)}) return } @@ -122,7 +123,7 @@ func (h *ChatHandler) HandleChat(c *gin.Context) { chatter, err := h.registry.GetChatter(p.Model, request.ModelContextLength, p.Vendor, "", true, false) if err != nil { log.Printf("Error creating chatter: %v", err) - streamChan <- domain.StreamUpdate{Type: domain.StreamTypeError, Content: fmt.Sprintf("Error: %v", err)} + streamChan <- domain.StreamUpdate{Type: domain.StreamTypeError, Content: fmt.Sprintf(i18n.T("server_chat_error"), err)} return } @@ -209,11 +210,11 @@ func (h *ChatHandler) HandleChat(c *gin.Context) { func writeSSEResponse(w gin.ResponseWriter, response StreamResponse) error { data, err := json.Marshal(response) if err != nil { - return fmt.Errorf("error marshaling response: %v", err) + return fmt.Errorf("%s", fmt.Sprintf(i18n.T("server_error_marshaling_response"), err)) } if _, err := fmt.Fprintf(w, "data: %s\n\n", string(data)); err != nil { - return fmt.Errorf("error writing response: %v", err) + return fmt.Errorf("%s", fmt.Sprintf(i18n.T("server_error_writing_response"), err)) } w.(http.Flusher).Flush() diff --git a/internal/tools/custom_patterns/custom_patterns.go b/internal/tools/custom_patterns/custom_patterns.go index 230f2373..4faeadbc 100644 --- a/internal/tools/custom_patterns/custom_patterns.go +++ b/internal/tools/custom_patterns/custom_patterns.go @@ -50,7 +50,7 @@ func (o *CustomPatterns) configure() error { if _, err := os.Stat(o.CustomPatternsDir.Value); os.IsNotExist(err) { if err := os.MkdirAll(o.CustomPatternsDir.Value, 0755); err != nil { // Log the error but don't clear the value - let it persist in env file - fmt.Printf("Warning: Could not create custom patterns directory %s: %v\n", o.CustomPatternsDir.Value, err) + fmt.Printf(i18n.T("custom_patterns_warning_create_directory"), o.CustomPatternsDir.Value, err) } } } diff --git a/internal/tools/githelper/githelper.go b/internal/tools/githelper/githelper.go index d95b0206..0444e6e7 100644 --- a/internal/tools/githelper/githelper.go +++ b/internal/tools/githelper/githelper.go @@ -7,6 +7,7 @@ import ( "path/filepath" "strings" + "github.com/danielmiessler/fabric/internal/i18n" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/storage/memory" @@ -41,30 +42,30 @@ func FetchFilesFromRepo(opts FetchOptions) error { Depth: 1, }) if err != nil { - return fmt.Errorf("failed to clone repository: %w", err) + return fmt.Errorf(i18n.T("githelper_failed_clone_repository"), err) } // Get HEAD reference ref, err := r.Head() if err != nil { - return fmt.Errorf("failed to get repository HEAD: %w", err) + return fmt.Errorf(i18n.T("githelper_failed_get_head"), err) } // Get commit object commit, err := r.CommitObject(ref.Hash()) if err != nil { - return fmt.Errorf("failed to get commit: %w", err) + return fmt.Errorf(i18n.T("githelper_failed_get_commit"), err) } // Get the file tree tree, err := commit.Tree() if err != nil { - return fmt.Errorf("failed to get tree: %w", err) + return fmt.Errorf(i18n.T("githelper_failed_get_tree"), err) } // Ensure destination directory exists if err := os.MkdirAll(opts.DestDir, 0755); err != nil { - return fmt.Errorf("failed to create destination directory: %w", err) + return fmt.Errorf(i18n.T("githelper_failed_create_dest_directory"), err) } // Extract files from the tree diff --git a/internal/tools/notifications/notifications.go b/internal/tools/notifications/notifications.go index 3b19dbc9..48c4175a 100644 --- a/internal/tools/notifications/notifications.go +++ b/internal/tools/notifications/notifications.go @@ -5,6 +5,8 @@ import ( "os" "os/exec" "runtime" + + "github.com/danielmiessler/fabric/internal/i18n" ) // NotificationProvider interface for different notification backends @@ -43,7 +45,7 @@ func NewNotificationManager() *NotificationManager { // Send sends a notification using the configured provider func (nm *NotificationManager) Send(title, message string) error { if nm.provider == nil { - return fmt.Errorf("no notification provider available") + return fmt.Errorf("%s", i18n.T("notifications_no_provider_available")) } return nm.provider.Send(title, message) } diff --git a/internal/util/utils.go b/internal/util/utils.go index 780dfb09..e633c2dc 100644 --- a/internal/util/utils.go +++ b/internal/util/utils.go @@ -7,12 +7,14 @@ import ( "path/filepath" "runtime" "strings" + + "github.com/danielmiessler/fabric/internal/i18n" ) // GetAbsolutePath resolves a given path to its absolute form, handling ~, ./, ../, UNC paths, and symlinks. func GetAbsolutePath(path string) (string, error) { if path == "" { - return "", errors.New("path is empty") + return "", errors.New(i18n.T("util_error_path_is_empty")) } // Handle UNC paths on Windows @@ -24,7 +26,7 @@ func GetAbsolutePath(path string) (string, error) { if strings.HasPrefix(path, "~") { home, err := os.UserHomeDir() if err != nil { - return "", errors.New("could not resolve home directory") + return "", errors.New(i18n.T("util_error_resolve_home_directory")) } path = filepath.Join(home, path[1:]) } @@ -32,7 +34,7 @@ func GetAbsolutePath(path string) (string, error) { // Convert to absolute path absPath, err := filepath.Abs(path) if err != nil { - return "", errors.New("could not get absolute path") + return "", errors.New(i18n.T("util_error_get_absolute_path")) } // Resolve symlinks, but allow non-existent paths @@ -45,7 +47,7 @@ func GetAbsolutePath(path string) (string, error) { return absPath, nil } - return "", fmt.Errorf("could not resolve symlinks: %w", err) + return "", fmt.Errorf(i18n.T("util_error_resolve_symlinks"), err) } // Helper function to check if a symlink points to a directory @@ -77,7 +79,7 @@ func IsSymlinkToDir(path string) bool { func GetDefaultConfigPath() (string, error) { homeDir, err := os.UserHomeDir() if err != nil { - return "", fmt.Errorf("could not determine user home directory: %w", err) + return "", fmt.Errorf(i18n.T("util_error_determine_home_directory"), err) } defaultConfigPath := filepath.Join(homeDir, ".config", "fabric", "config.yaml") @@ -85,7 +87,7 @@ func GetDefaultConfigPath() (string, error) { if os.IsNotExist(err) { return "", nil // Return no error for non-existent config path } - return "", fmt.Errorf("error accessing default config path: %w", err) + return "", fmt.Errorf(i18n.T("util_error_accessing_config_path"), err) } return defaultConfigPath, nil }