From c4e6cb370ff05bbba0265ae8a4eacefc4d723821 Mon Sep 17 00:00:00 2001 From: Kayvan Sylvan Date: Sat, 13 Sep 2025 07:43:04 -0700 Subject: [PATCH] feat(i18n): add de/fr/ja/pt/zh/fa locales; expand tests, improve changelog spacing CHANGES - Add DE, FR, JA, PT, ZH, FA i18n locale files. - Expand i18n tests with table-driven multilingual coverage. - Verify 'html_readability_error' translations across all supported languages. - Update README with release notes for added languages. - Watch new locale and test files in VSCode. - Insert blank lines between aggregated PR changelog sections. - Append direct commits section only when content exists. --- .vscode/settings.json | 8 +- README.md | 2 + cmd/generate_changelog/incoming/1767.txt | 7 + .../internal/changelog/processing.go | 15 +- internal/i18n/i18n_test.go | 38 +++-- internal/i18n/locales/de.json | 136 ++++++++++++++++++ internal/i18n/locales/fa.json | 136 ++++++++++++++++++ internal/i18n/locales/fr.json | 136 ++++++++++++++++++ internal/i18n/locales/it.json | 136 ++++++++++++++++++ internal/i18n/locales/ja.json | 136 ++++++++++++++++++ internal/i18n/locales/pt.json | 136 ++++++++++++++++++ internal/i18n/locales/zh.json | 136 ++++++++++++++++++ 12 files changed, 1008 insertions(+), 14 deletions(-) create mode 100644 cmd/generate_changelog/incoming/1767.txt create mode 100644 internal/i18n/locales/de.json create mode 100644 internal/i18n/locales/fa.json create mode 100644 internal/i18n/locales/fr.json create mode 100644 internal/i18n/locales/it.json create mode 100644 internal/i18n/locales/ja.json create mode 100644 internal/i18n/locales/pt.json create mode 100644 internal/i18n/locales/zh.json diff --git a/.vscode/settings.json b/.vscode/settings.json index 0ca7352e..c34f6321 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -192,7 +192,13 @@ "web/static/data/pattern_descriptions.json", "scripts/pattern_descriptions/*.json", "data/patterns/pattern_explanations.md", - "internal/i18n/locales/es.json" + "internal/i18n/locales/es.json", + "internal/i18n/locales/fr.json", + "internal/i18n/locales/de.json", + "internal/i18n/locales/it.json", + "internal/i18n/locales/pt.json", + "internal/i18n/locales/zh.json", + "internal/i18n/i18n_test.go" ], "markdownlint.config": { "MD004": false, diff --git a/README.md b/README.md index 63b4baeb..8185fee8 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ Below are the **new features and capabilities** we've added (newest first): ### Recent Major Features +- [v1.4.311](https://github.com/danielmiessler/fabric/releases/tag/v1.4.311) (Sep 13, 2025) — **More internationalization support**: Adds de (German), fa (Persian / Farsi), fr (French), it (Italian), + ja (Japanese), pt (Portuguese), zh (Chinese) - [v1.4.309](https://github.com/danielmiessler/fabric/releases/tag/v1.4.309) (Sep 9, 2025) — **Comprehensive internationalization support**: Includes English and Spanish locale files. - [v1.4.303](https://github.com/danielmiessler/fabric/releases/tag/v1.4.303) (Aug 29, 2025) — **New Binary Releases**: Linux ARM and Windows ARM targets. You can run Fabric on the Raspberry PI and on your Windows Surface! - [v1.4.294](https://github.com/danielmiessler/fabric/releases/tag/v1.4.294) (Aug 20, 2025) — **Venice AI Support**: Added the Venice AI provider. Venice is a Privacy-First, Open-Source AI provider. See their ["About Venice"](https://docs.venice.ai/overview/about-venice) page for details. diff --git a/cmd/generate_changelog/incoming/1767.txt b/cmd/generate_changelog/incoming/1767.txt new file mode 100644 index 00000000..b4e5fb44 --- /dev/null +++ b/cmd/generate_changelog/incoming/1767.txt @@ -0,0 +1,7 @@ +### PR [#1767](https://github.com/danielmiessler/Fabric/pull/1767) by [ksylvan](https://github.com/ksylvan): feat(i18n): add de, fr, ja, pt, zh, fa locales; expand tests + +- Add DE, FR, JA, PT, ZH, FA i18n locale files +- Expand i18n tests with table-driven multilingual coverage +- Verify 'html_readability_error' translations across all supported languages +- Update README with release notes for added languages +- Insert blank lines between aggregated PR changelog sections diff --git a/cmd/generate_changelog/internal/changelog/processing.go b/cmd/generate_changelog/internal/changelog/processing.go index eb509f0f..c1988b8a 100644 --- a/cmd/generate_changelog/internal/changelog/processing.go +++ b/cmd/generate_changelog/internal/changelog/processing.go @@ -133,14 +133,17 @@ func (g *Generator) CreateNewChangelogEntry(version string) error { var processingErrors []string // First, aggregate all incoming PR files - for _, file := range files { + for i, file := range files { data, err := os.ReadFile(file) if err != nil { processingErrors = append(processingErrors, fmt.Sprintf("failed to read %s: %v", file, err)) continue // Continue to attempt processing other files } content.WriteString(string(data)) - // Note: No extra newline needed here as each incoming file already ends with a newline + // Add an extra newline between PR sections for proper spacing + if i < len(files)-1 { + content.WriteString("\n") + } } if len(processingErrors) > 0 { @@ -177,7 +180,13 @@ func (g *Generator) CreateNewChangelogEntry(version string) error { if err != nil { return fmt.Errorf("failed to get direct commits since last release: %w", err) } - content.WriteString(directCommitsContent) + if directCommitsContent != "" { + // Add spacing before direct commits section if we have PR content + if content.Len() > 0 { + content.WriteString("\n") + } + content.WriteString(directCommitsContent) + } // Check if we have any content at all if content.Len() == 0 { diff --git a/internal/i18n/i18n_test.go b/internal/i18n/i18n_test.go index 5e97710c..666cb98b 100644 --- a/internal/i18n/i18n_test.go +++ b/internal/i18n/i18n_test.go @@ -7,16 +7,34 @@ import ( ) func TestTranslation(t *testing.T) { - loc, err := Init("es") - if err != nil { - t.Fatalf("init failed: %v", err) + testCases := []struct { + lang string + expected string + }{ + {"es", "usa la entrada original, porque no se puede aplicar la legibilidad de html"}, + {"en", "use original input, because can't apply html readability"}, + {"zh", "使用原始输入,因为无法应用 HTML 可读性处理"}, + {"de", "verwende ursprüngliche Eingabe, da HTML-Lesbarkeit nicht angewendet werden kann"}, + {"ja", "HTML可読性を適用できないため、元の入力を使用します"}, + {"fr", "utilise l'entrée originale, car la lisibilité HTML ne peut pas être appliquée"}, + {"pt", "usa a entrada original, porque não é possível aplicar a legibilidade HTML"}, + {"fa", "از ورودی اصلی استفاده کن، چون نمی‌توان خوانایی HTML را اعمال کرد"}, + {"it", "usa l'input originale, perché non è possibile applicare la leggibilità HTML"}, } - msg, err := loc.Localize(&gi18n.LocalizeConfig{MessageID: "html_readability_error"}) - if err != nil { - t.Fatalf("localize failed: %v", err) - } - expected := "usa la entrada original, porque no se puede aplicar la legibilidad de html" - if msg != expected { - t.Fatalf("unexpected translation: %s", msg) + + for _, tc := range testCases { + t.Run(tc.lang, func(t *testing.T) { + loc, err := Init(tc.lang) + if err != nil { + t.Fatalf("init failed for %s: %v", tc.lang, err) + } + msg, err := loc.Localize(&gi18n.LocalizeConfig{MessageID: "html_readability_error"}) + if err != nil { + t.Fatalf("localize failed for %s: %v", tc.lang, err) + } + if msg != tc.expected { + t.Fatalf("unexpected translation for %s: got %s, expected %s", tc.lang, msg, tc.expected) + } + }) } } diff --git a/internal/i18n/locales/de.json b/internal/i18n/locales/de.json new file mode 100644 index 00000000..f0d775ee --- /dev/null +++ b/internal/i18n/locales/de.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "verwende ursprüngliche Eingabe, da HTML-Lesbarkeit nicht angewendet werden kann", + "vendor_not_configured": "Anbieter %s ist nicht konfiguriert", + "vendor_no_transcription_support": "Anbieter %s unterstützt keine Audio-Transkription", + "transcription_model_required": "Transkriptionsmodell ist erforderlich (verwende --transcribe-model)", + "youtube_not_configured": "YouTube ist nicht konfiguriert, bitte führe das Setup-Verfahren aus", + "error_fetching_playlist_videos": "Fehler beim Abrufen der Playlist-Videos: %w", + "scraping_not_configured": "Scraping-Funktionalität ist nicht konfiguriert. Bitte richte Jina ein, um Scraping zu aktivieren", + "could_not_determine_home_dir": "konnte Benutzer-Home-Verzeichnis nicht bestimmen: %w", + "could_not_stat_env_file": "konnte .env-Datei nicht überprüfen: %w", + "could_not_create_config_dir": "konnte Konfigurationsverzeichnis nicht erstellen: %w", + "could_not_create_env_file": "konnte .env-Datei nicht erstellen: %w", + "could_not_copy_to_clipboard": "konnte nicht in die Zwischenablage kopieren: %v", + "file_already_exists_not_overwriting": "Datei %s existiert bereits, wird nicht überschrieben. Benenne die vorhandene Datei um oder wähle einen anderen Namen", + "error_creating_file": "Fehler beim Erstellen der Datei: %v", + "error_writing_to_file": "Fehler beim Schreiben in die Datei: %v", + "error_creating_audio_file": "Fehler beim Erstellen der Audio-Datei: %v", + "error_writing_audio_data": "Fehler beim Schreiben von Audio-Daten in die Datei: %v", + "tts_model_requires_audio_output": "TTS-Modell '%s' benötigt Audio-Ausgabe. Bitte gib eine Audio-Ausgabedatei mit dem -o Flag an (z.B., -o output.wav)", + "audio_output_file_specified_but_not_tts_model": "Audio-Ausgabedatei '%s' angegeben, aber Modell '%s' ist kein TTS-Modell. Bitte verwende ein TTS-Modell wie gemini-2.5-flash-preview-tts", + "file_already_exists_choose_different": "Datei %s existiert bereits. Bitte wähle einen anderen Dateinamen oder entferne die vorhandene Datei", + "no_notification_system_available": "kein Benachrichtigungssystem verfügbar", + "cannot_convert_string": "kann String %q nicht zu %v konvertieren", + "unsupported_conversion": "nicht unterstützte Konvertierung von %v zu %v", + "invalid_config_path": "ungültiger Konfigurationspfad: %w", + "config_file_not_found": "Konfigurationsdatei nicht gefunden: %s", + "error_reading_config_file": "Fehler beim Lesen der Konfigurationsdatei: %w", + "error_parsing_config_file": "Fehler beim Parsen der Konfigurationsdatei: %w", + "error_reading_piped_message": "Fehler beim Lesen der weitergeleiteten Nachricht von stdin: %w", + "image_file_already_exists": "Bilddatei existiert bereits: %s", + "invalid_image_file_extension": "ungültige Bilddatei-Erweiterung '%s'. Unterstützte Formate: .png, .jpeg, .jpg, .webp", + "image_parameters_require_image_file": "Bildparameter (--image-size, --image-quality, --image-background, --image-compression) können nur mit --image-file verwendet werden", + "invalid_image_size": "ungültige Bildgröße '%s'. Unterstützte Größen: 1024x1024, 1536x1024, 1024x1536, auto", + "invalid_image_quality": "ungültige Bildqualität '%s'. Unterstützte Qualitäten: low, medium, high, auto", + "invalid_image_background": "ungültiger Bildhintergrund '%s'. Unterstützte Hintergründe: opaque, transparent", + "image_compression_jpeg_webp_only": "Bildkomprimierung kann nur mit JPEG- und WebP-Formaten verwendet werden, nicht %s", + "image_compression_range_error": "Bildkomprimierung muss zwischen 0 und 100 liegen, erhalten: %d", + "transparent_background_png_webp_only": "transparenter Hintergrund kann nur mit PNG- und WebP-Formaten verwendet werden, nicht %s", + "available_transcription_models": "Verfügbare Transkriptionsmodelle:", + "tts_audio_generated_successfully": "TTS-Audio erfolgreich generiert und gespeichert unter: %s\n", + "fabric_command_complete": "Fabric-Befehl abgeschlossen", + "fabric_command_complete_with_pattern": "Fabric: %s abgeschlossen", + "command_completed_successfully": "Befehl erfolgreich abgeschlossen", + "output_truncated": "Ausgabe: %s...", + "output_full": "Ausgabe: %s", + "choose_pattern_from_available": "Wähle ein Muster aus den verfügbaren Mustern", + "pattern_variables_help": "Werte für Mustervariablen, z.B. -v=#role:expert -v=#points:30", + "choose_context_from_available": "Wähle einen Kontext aus den verfügbaren Kontexten", + "choose_session_from_available": "Wähle eine Sitzung aus den verfügbaren Sitzungen", + "attachment_path_or_url_help": "Anhangspfad oder URL (z.B. für OpenAI-Bilderkennungsnachrichten)", + "run_setup_for_reconfigurable_parts": "Setup für alle rekonfigurierbaren Teile von Fabric ausführen", + "set_temperature": "Temperatur festlegen", + "set_top_p": "Top P festlegen", + "stream_help": "Streaming", + "set_presence_penalty": "Präsenzstrafe festlegen", + "use_model_defaults_raw_help": "Verwende die Standardwerte des Modells ohne Senden von Chat-Optionen (wie Temperatur usw.) und verwende die Benutzerrolle anstelle der Systemrolle für Muster.", + "set_frequency_penalty": "Häufigkeitsstrafe festlegen", + "list_all_patterns": "Alle Muster auflisten", + "list_all_available_models": "Alle verfügbaren Modelle auflisten", + "list_all_contexts": "Alle Kontexte auflisten", + "list_all_sessions": "Alle Sitzungen auflisten", + "update_patterns": "Muster aktualisieren", + "messages_to_send_to_chat": "Nachrichten zum Senden an den Chat", + "copy_to_clipboard": "In Zwischenablage kopieren", + "choose_model": "Modell wählen", + "specify_vendor_for_model": "Anbieter für das ausgewählte Modell angeben (z.B., -V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "Modell-Kontextlänge (betrifft nur ollama)", + "output_to_file": "Ausgabe in Datei", + "output_entire_session": "Gesamte Sitzung (auch eine temporäre) in die Ausgabedatei ausgeben", + "number_of_latest_patterns": "Anzahl der neuesten Muster zum Auflisten", + "change_default_model": "Standardmodell ändern", + "youtube_url_help": "YouTube-Video oder Playlist-\"URL\" zum Abrufen von Transkript und Kommentaren und Senden an Chat oder Ausgabe in Konsole und Speichern in Ausgabedatei", + "prefer_playlist_over_video": "Playlist gegenüber Video bevorzugen, wenn beide IDs in der URL vorhanden sind", + "grab_transcript_from_youtube": "Transkript von YouTube-Video abrufen und an Chat senden (wird standardmäßig verwendet).", + "grab_transcript_with_timestamps": "Transkript von YouTube-Video mit Zeitstempeln abrufen und an Chat senden", + "grab_comments_from_youtube": "Kommentare von YouTube-Video abrufen und an Chat senden", + "output_video_metadata": "Video-Metadaten ausgeben", + "additional_yt_dlp_args": "Zusätzliche Argumente für yt-dlp (z.B. '--cookies-from-browser brave')", + "specify_language_code": "Sprachcode für den Chat angeben, z.B. -g=en -g=zh", + "scrape_website_url": "Website-URL zu Markdown mit Jina AI scrapen", + "search_question_jina": "Suchanfrage mit Jina AI", + "seed_for_lmm_generation": "Seed für LMM-Generierung", + "wipe_context": "Kontext löschen", + "wipe_session": "Sitzung löschen", + "print_context": "Kontext ausgeben", + "print_session": "Sitzung ausgeben", + "convert_html_readability": "HTML-Eingabe in eine saubere, lesbare Ansicht konvertieren", + "apply_variables_to_input": "Variablen auf Benutzereingabe anwenden", + "disable_pattern_variable_replacement": "Mustervariablenersetzung deaktivieren", + "show_dry_run": "Zeige, was an das Modell gesendet würde, ohne es tatsächlich zu senden", + "serve_fabric_rest_api": "Fabric REST API bereitstellen", + "serve_fabric_api_ollama_endpoints": "Fabric REST API mit ollama-Endpunkten bereitstellen", + "address_to_bind_rest_api": "Adresse zum Binden der REST API", + "api_key_secure_server_routes": "API-Schlüssel zum Sichern der Server-Routen", + "path_to_yaml_config": "Pfad zur YAML-Konfigurationsdatei", + "print_current_version": "Aktuelle Version ausgeben", + "list_all_registered_extensions": "Alle registrierten Erweiterungen auflisten", + "register_new_extension": "Neue Erweiterung aus Konfigurationsdateipfad registrieren", + "remove_registered_extension": "Registrierte Erweiterung nach Name entfernen", + "choose_strategy_from_available": "Strategie aus den verfügbaren Strategien wählen", + "list_all_strategies": "Alle Strategien auflisten", + "list_all_vendors": "Alle Anbieter auflisten", + "output_raw_list_shell_completion": "Rohe Liste ohne Kopfzeilen/Formatierung ausgeben (für Shell-Vervollständigung)", + "enable_web_search_tool": "Web-Such-Tool für unterstützte Modelle aktivieren (Anthropic, OpenAI, Gemini)", + "set_location_web_search": "Standort für Web-Suchergebnisse festlegen (z.B., 'America/Los_Angeles')", + "save_generated_image_to_file": "Generiertes Bild in angegebenem Dateipfad speichern (z.B., 'output.png')", + "image_dimensions_help": "Bildabmessungen: 1024x1024, 1536x1024, 1024x1536, auto (Standard: auto)", + "image_quality_help": "Bildqualität: low, medium, high, auto (Standard: auto)", + "compression_level_jpeg_webp": "Komprimierungslevel 0-100 für JPEG/WebP-Formate (Standard: nicht gesetzt)", + "background_type_help": "Hintergrundtyp: opaque, transparent (Standard: opaque, nur für PNG/WebP)", + "suppress_thinking_tags": "In Denk-Tags eingeschlossenen Text unterdrücken", + "start_tag_thinking_sections": "Start-Tag für Denk-Abschnitte", + "end_tag_thinking_sections": "End-Tag für Denk-Abschnitte", + "disable_openai_responses_api": "OpenAI Responses API deaktivieren (Standard: false)", + "audio_video_file_transcribe": "Audio- oder Video-Datei zum Transkribieren", + "model_for_transcription": "Modell für Transkription (getrennt vom Chat-Modell)", + "split_media_files_ffmpeg": "Audio/Video-Dateien größer als 25MB mit ffmpeg aufteilen", + "tts_voice_name": "TTS-Stimmenname für unterstützte Modelle (z.B., Kore, Charon, Puck)", + "list_gemini_tts_voices": "Alle verfügbaren Gemini TTS-Stimmen auflisten", + "list_transcription_models": "Alle verfügbaren Transkriptionsmodelle auflisten", + "send_desktop_notification": "Desktop-Benachrichtigung senden, wenn Befehl abgeschlossen ist", + "custom_notification_command": "Benutzerdefinierter Befehl für Benachrichtigungen (überschreibt eingebaute Benachrichtigungen)", + "set_reasoning_thinking_level": "Reasoning/Thinking-Level festlegen (z.B., off, low, medium, high, oder numerische Token für Anthropic oder Google Gemini)", + "set_debug_level": "Debug-Level festlegen (0=aus, 1=grundlegend, 2=detailliert, 3=Trace)", + "usage_header": "Verwendung:", + "application_options_header": "Anwendungsoptionen:", + "help_options_header": "Hilfe-Optionen:", + "help_message": "Diese Hilfenachricht anzeigen", + "options_placeholder": "[OPTIONEN]", + "available_vendors_header": "Verfügbare Anbieter:", + "available_models_header": "Verfügbare Modelle", + "no_items_found": "Keine %s", + "no_description_available": "Keine Beschreibung verfügbar", + "i18n_download_failed": "Fehler beim Herunterladen der Übersetzung für Sprache '%s': %v", + "i18n_load_failed": "Fehler beim Laden der Übersetzungsdatei: %v" +} \ No newline at end of file diff --git a/internal/i18n/locales/fa.json b/internal/i18n/locales/fa.json new file mode 100644 index 00000000..3723ec62 --- /dev/null +++ b/internal/i18n/locales/fa.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "از ورودی اصلی استفاده کن، چون نمی‌توان خوانایی HTML را اعمال کرد", + "vendor_not_configured": "تامین‌کننده %s پیکربندی نشده است", + "vendor_no_transcription_support": "تامین‌کننده %s از رونویسی صوتی پشتیبانی نمی‌کند", + "transcription_model_required": "مدل رونویسی الزامی است (از --transcribe-model استفاده کنید)", + "youtube_not_configured": "یوتیوب پیکربندی نشده است، لطفاً روند تنظیمات را اجرا کنید", + "error_fetching_playlist_videos": "خطا در دریافت ویدیوهای فهرست پخش: %w", + "scraping_not_configured": "قابلیت استخراج داده پیکربندی نشده است. لطفاً Jina را برای فعال‌سازی استخراج تنظیم کنید", + "could_not_determine_home_dir": "نتوانست دایرکتوری خانه کاربر را تعیین کند: %w", + "could_not_stat_env_file": "نتوانست وضعیت فایل .env را بررسی کند: %w", + "could_not_create_config_dir": "نتوانست دایرکتوری پیکربندی را ایجاد کند: %w", + "could_not_create_env_file": "نتوانست فایل .env را ایجاد کند: %w", + "could_not_copy_to_clipboard": "نتوانست به کلیپ‌بورد کپی کند: %v", + "file_already_exists_not_overwriting": "فایل %s از قبل وجود دارد، بازنویسی نمی‌شود. فایل موجود را تغییر نام دهید یا نام متفاوتی انتخاب کنید", + "error_creating_file": "خطا در ایجاد فایل: %v", + "error_writing_to_file": "خطا در نوشتن به فایل: %v", + "error_creating_audio_file": "خطا در ایجاد فایل صوتی: %v", + "error_writing_audio_data": "خطا در نوشتن داده‌های صوتی به فایل: %v", + "tts_model_requires_audio_output": "مدل TTS '%s' نیاز به خروجی صوتی دارد. لطفاً فایل خروجی صوتی را با پرچم -o مشخص کنید (مثال: -o output.wav)", + "audio_output_file_specified_but_not_tts_model": "فایل خروجی صوتی '%s' مشخص شده اما مدل '%s' یک مدل TTS نیست. لطفاً از مدل TTS مثل gemini-2.5-flash-preview-tts استفاده کنید", + "file_already_exists_choose_different": "فایل %s از قبل وجود دارد. لطفاً نام فایل متفاوتی انتخاب کنید یا فایل موجود را حذف کنید", + "no_notification_system_available": "هیچ سیستم اعلان‌رسانی در دسترس نیست", + "cannot_convert_string": "نمی‌توان رشته %q را به %v تبدیل کرد", + "unsupported_conversion": "تبدیل پشتیبانی نشده از %v به %v", + "invalid_config_path": "مسیر پیکربندی نامعتبر: %w", + "config_file_not_found": "فایل پیکربندی یافت نشد: %s", + "error_reading_config_file": "خطا در خواندن فایل پیکربندی: %w", + "error_parsing_config_file": "خطا در تجزیه فایل پیکربندی: %w", + "error_reading_piped_message": "خطا در خواندن پیام هدایت شده از stdin: %w", + "image_file_already_exists": "فایل تصویر از قبل وجود دارد: %s", + "invalid_image_file_extension": "پسوند فایل تصویر نامعتبر '%s'. فرمت‌های پشتیبانی شده: .png، .jpeg، .jpg، .webp", + "image_parameters_require_image_file": "پارامترهای تصویر (--image-size، --image-quality، --image-background، --image-compression) فقط با --image-file قابل استفاده هستند", + "invalid_image_size": "اندازه تصویر نامعتبر '%s'. اندازه‌های پشتیبانی شده: 1024x1024، 1536x1024، 1024x1536، auto", + "invalid_image_quality": "کیفیت تصویر نامعتبر '%s'. کیفیت‌های پشتیبانی شده: low، medium، high، auto", + "invalid_image_background": "پس‌زمینه تصویر نامعتبر '%s'. پس‌زمینه‌های پشتیبانی شده: opaque، transparent", + "image_compression_jpeg_webp_only": "فشرده‌سازی تصویر فقط با فرمت‌های JPEG و WebP قابل استفاده است، نه %s", + "image_compression_range_error": "فشرده‌سازی تصویر باید بین 0 تا 100 باشد، دریافت شده: %d", + "transparent_background_png_webp_only": "پس‌زمینه شفاف فقط با فرمت‌های PNG و WebP قابل استفاده است، نه %s", + "available_transcription_models": "مدل‌های رونویسی موجود:", + "tts_audio_generated_successfully": "صوت TTS با موفقیت ایجاد و ذخیره شد در: %s\n", + "fabric_command_complete": "دستور Fabric تکمیل شد", + "fabric_command_complete_with_pattern": "Fabric: %s تکمیل شد", + "command_completed_successfully": "دستور با موفقیت تکمیل شد", + "output_truncated": "خروجی: %s...", + "output_full": "خروجی: %s", + "choose_pattern_from_available": "الگویی از الگوهای موجود انتخاب کنید", + "pattern_variables_help": "مقادیر برای متغیرهای الگو، مثال: -v=#role:expert -v=#points:30", + "choose_context_from_available": "زمینه‌ای از زمینه‌های موجود انتخاب کنید", + "choose_session_from_available": "جلسه‌ای از جلسات موجود انتخاب کنید", + "attachment_path_or_url_help": "مسیر ضمیمه یا URL (مثال برای پیام‌های تشخیص تصویر OpenAI)", + "run_setup_for_reconfigurable_parts": "اجرای تنظیمات برای تمام بخش‌های قابل پیکربندی مجدد fabric", + "set_temperature": "تنظیم دما", + "set_top_p": "تنظیم top P", + "stream_help": "پخش زنده", + "set_presence_penalty": "تنظیم جریمه حضور", + "use_model_defaults_raw_help": "استفاده از پیش‌فرض‌های مدل بدون ارسال گزینه‌های گفتگو (مثل دما و غیره) و استفاده از نقش کاربر به جای نقش سیستم برای الگوها.", + "set_frequency_penalty": "تنظیم جریمه فرکانس", + "list_all_patterns": "فهرست تمام الگوها", + "list_all_available_models": "فهرست تمام مدل‌های موجود", + "list_all_contexts": "فهرست تمام زمینه‌ها", + "list_all_sessions": "فهرست تمام جلسات", + "update_patterns": "به‌روزرسانی الگوها", + "messages_to_send_to_chat": "پیام‌هایی برای ارسال به گفتگو", + "copy_to_clipboard": "کپی به کلیپ‌بورد", + "choose_model": "انتخاب مدل", + "specify_vendor_for_model": "تعیین تامین‌کننده برای مدل انتخابی (مثال: -V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "طول زمینه مدل (فقط ollama را تحت تأثیر قرار می‌دهد)", + "output_to_file": "خروجی به فایل", + "output_entire_session": "خروجی کل جلسه (حتی موقت) به فایل خروجی", + "number_of_latest_patterns": "تعداد جدیدترین الگوها برای فهرست", + "change_default_model": "تغییر مدل پیش‌فرض", + "youtube_url_help": "ویدیو یوتیوب یا \"URL\" فهرست پخش برای دریافت رونوشت، نظرات و ارسال به گفتگو یا چاپ در کنسول و ذخیره در فایل خروجی", + "prefer_playlist_over_video": "اولویت فهرست پخش نسبت به ویدیو اگر هر دو ID در URL موجود باشند", + "grab_transcript_from_youtube": "دریافت رونوشت از ویدیو یوتیوب و ارسال به گفتگو (به طور پیش‌فرض استفاده می‌شود).", + "grab_transcript_with_timestamps": "دریافت رونوشت از ویدیو یوتیوب با مهر زمان و ارسال به گفتگو", + "grab_comments_from_youtube": "دریافت نظرات از ویدیو یوتیوب و ارسال به گفتگو", + "output_video_metadata": "نمایش فراداده ویدیو", + "additional_yt_dlp_args": "آرگومان‌های اضافی برای ارسال به yt-dlp (مثال: '--cookies-from-browser brave')", + "specify_language_code": "تعیین کد زبان برای گفتگو، مثال: -g=en -g=zh", + "scrape_website_url": "استخراج URL وب‌سایت به markdown با استفاده از Jina AI", + "search_question_jina": "سؤال جستجو با استفاده از Jina AI", + "seed_for_lmm_generation": "Seed برای استفاده در تولید LMM", + "wipe_context": "پاک کردن زمینه", + "wipe_session": "پاک کردن جلسه", + "print_context": "چاپ زمینه", + "print_session": "چاپ جلسه", + "convert_html_readability": "تبدیل ورودی HTML به نمای تمیز و خوانا", + "apply_variables_to_input": "اعمال متغیرها به ورودی کاربر", + "disable_pattern_variable_replacement": "غیرفعال کردن جایگزینی متغیرهای الگو", + "show_dry_run": "نمایش آنچه به مدل ارسال خواهد شد بدون ارسال واقعی", + "serve_fabric_rest_api": "سرویس API REST Fabric", + "serve_fabric_api_ollama_endpoints": "سرویس API REST Fabric با نقاط پایانی ollama", + "address_to_bind_rest_api": "آدرس برای متصل کردن API REST", + "api_key_secure_server_routes": "کلید API برای امن‌سازی مسیرهای سرور", + "path_to_yaml_config": "مسیر فایل پیکربندی YAML", + "print_current_version": "چاپ نسخه فعلی", + "list_all_registered_extensions": "فهرست تمام افزونه‌های ثبت شده", + "register_new_extension": "ثبت افزونه جدید از مسیر فایل پیکربندی", + "remove_registered_extension": "حذف افزونه ثبت شده با نام", + "choose_strategy_from_available": "انتخاب استراتژی از استراتژی‌های موجود", + "list_all_strategies": "فهرست تمام استراتژی‌ها", + "list_all_vendors": "فهرست تمام تامین‌کنندگان", + "output_raw_list_shell_completion": "خروجی فهرست خام بدون سرتیتر/قالب‌بندی (برای تکمیل shell)", + "enable_web_search_tool": "فعال‌سازی ابزار جستجوی وب برای مدل‌های پشتیبانی شده (Anthropic، OpenAI، Gemini)", + "set_location_web_search": "تنظیم مکان برای نتایج جستجوی وب (مثال: 'America/Los_Angeles')", + "save_generated_image_to_file": "ذخیره تصویر تولید شده در مسیر فایل مشخص (مثال: 'output.png')", + "image_dimensions_help": "ابعاد تصویر: 1024x1024، 1536x1024، 1024x1536، auto (پیش‌فرض: auto)", + "image_quality_help": "کیفیت تصویر: low، medium، high، auto (پیش‌فرض: auto)", + "compression_level_jpeg_webp": "سطح فشرده‌سازی 0-100 برای فرمت‌های JPEG/WebP (پیش‌فرض: تنظیم نشده)", + "background_type_help": "نوع پس‌زمینه: opaque، transparent (پیش‌فرض: opaque، فقط برای PNG/WebP)", + "suppress_thinking_tags": "سرکوب متن محصور در تگ‌های تفکر", + "start_tag_thinking_sections": "تگ شروع برای بخش‌های تفکر", + "end_tag_thinking_sections": "تگ پایان برای بخش‌های تفکر", + "disable_openai_responses_api": "غیرفعال کردن API OpenAI Responses (پیش‌فرض: false)", + "audio_video_file_transcribe": "فایل صوتی یا ویدیویی برای رونویسی", + "model_for_transcription": "مدل برای استفاده در رونویسی (جدا از مدل گفتگو)", + "split_media_files_ffmpeg": "تقسیم فایل‌های صوتی/ویدیویی بزرگتر از 25MB با استفاده از ffmpeg", + "tts_voice_name": "نام صدای TTS برای مدل‌های پشتیبانی شده (مثال: Kore، Charon، Puck)", + "list_gemini_tts_voices": "فهرست تمام صداهای TTS Gemini موجود", + "list_transcription_models": "فهرست تمام مدل‌های رونویسی موجود", + "send_desktop_notification": "ارسال اعلان دسک‌تاپ هنگام تکمیل دستور", + "custom_notification_command": "دستور سفارشی برای اجرای اعلان‌ها (جایگزین اعلان‌های داخلی)", + "set_reasoning_thinking_level": "تنظیم سطح استدلال/تفکر (مثال: off، low، medium، high، یا توکن‌های عددی برای Anthropic یا Google Gemini)", + "set_debug_level": "تنظیم سطح اشکال‌زدایی (0=خاموش، 1=پایه، 2=تفصیلی، 3=ردیابی)", + "usage_header": "استفاده:", + "application_options_header": "گزینه‌های برنامه:", + "help_options_header": "گزینه‌های راهنما:", + "help_message": "نمایش این پیام راهنما", + "options_placeholder": "[گزینه‌ها]", + "available_vendors_header": "تامین‌کنندگان موجود:", + "available_models_header": "مدل‌های موجود", + "no_items_found": "هیچ %s", + "no_description_available": "توضیحی در دسترس نیست", + "i18n_download_failed": "دانلود ترجمه برای زبان '%s' ناموفق بود: %v", + "i18n_load_failed": "بارگذاری فایل ترجمه ناموفق بود: %v" +} \ No newline at end of file diff --git a/internal/i18n/locales/fr.json b/internal/i18n/locales/fr.json new file mode 100644 index 00000000..dd8b634d --- /dev/null +++ b/internal/i18n/locales/fr.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "utilise l'entrée originale, car la lisibilité HTML ne peut pas être appliquée", + "vendor_not_configured": "le fournisseur %s n'est pas configuré", + "vendor_no_transcription_support": "le fournisseur %s ne prend pas en charge la transcription audio", + "transcription_model_required": "un modèle de transcription est requis (utilisez --transcribe-model)", + "youtube_not_configured": "YouTube n'est pas configuré, veuillez exécuter la procédure de configuration", + "error_fetching_playlist_videos": "erreur lors de la récupération des vidéos de la liste de lecture : %w", + "scraping_not_configured": "la fonctionnalité de scraping n'est pas configurée. Veuillez configurer Jina pour activer le scraping", + "could_not_determine_home_dir": "impossible de déterminer le répertoire home de l'utilisateur : %w", + "could_not_stat_env_file": "impossible de vérifier le fichier .env : %w", + "could_not_create_config_dir": "impossible de créer le répertoire de configuration : %w", + "could_not_create_env_file": "impossible de créer le fichier .env : %w", + "could_not_copy_to_clipboard": "impossible de copier dans le presse-papiers : %v", + "file_already_exists_not_overwriting": "le fichier %s existe déjà, ne sera pas écrasé. Renommez le fichier existant ou choisissez un nom différent", + "error_creating_file": "erreur lors de la création du fichier : %v", + "error_writing_to_file": "erreur lors de l'écriture dans le fichier : %v", + "error_creating_audio_file": "erreur lors de la création du fichier audio : %v", + "error_writing_audio_data": "erreur lors de l'écriture des données audio dans le fichier : %v", + "tts_model_requires_audio_output": "le modèle TTS '%s' nécessite une sortie audio. Veuillez spécifier un fichier de sortie audio avec le flag -o (ex. -o output.wav)", + "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", + "file_already_exists_choose_different": "le fichier %s existe déjà. Veuillez choisir un nom de fichier différent ou supprimer le fichier existant", + "no_notification_system_available": "aucun système de notification disponible", + "cannot_convert_string": "impossible de convertir la chaîne %q en %v", + "unsupported_conversion": "conversion non prise en charge de %v vers %v", + "invalid_config_path": "chemin de configuration invalide : %w", + "config_file_not_found": "fichier de configuration non trouvé : %s", + "error_reading_config_file": "erreur lors de la lecture du fichier de configuration : %w", + "error_parsing_config_file": "erreur lors de l'analyse du fichier de configuration : %w", + "error_reading_piped_message": "erreur lors de la lecture du message redirigé depuis stdin : %w", + "image_file_already_exists": "le fichier image existe déjà : %s", + "invalid_image_file_extension": "extension de fichier image invalide '%s'. Formats pris en charge : .png, .jpeg, .jpg, .webp", + "image_parameters_require_image_file": "les paramètres d'image (--image-size, --image-quality, --image-background, --image-compression) ne peuvent être utilisés qu'avec --image-file", + "invalid_image_size": "taille d'image invalide '%s'. Tailles prises en charge : 1024x1024, 1536x1024, 1024x1536, auto", + "invalid_image_quality": "qualité d'image invalide '%s'. Qualités prises en charge : low, medium, high, auto", + "invalid_image_background": "arrière-plan d'image invalide '%s'. Arrière-plans pris en charge : opaque, transparent", + "image_compression_jpeg_webp_only": "la compression d'image ne peut être utilisée qu'avec les formats JPEG et WebP, pas %s", + "image_compression_range_error": "la compression d'image doit être entre 0 et 100, reçu %d", + "transparent_background_png_webp_only": "l'arrière-plan transparent ne peut être utilisé qu'avec les formats PNG et WebP, pas %s", + "available_transcription_models": "Modèles de transcription disponibles :", + "tts_audio_generated_successfully": "Audio TTS généré avec succès et sauvegardé dans : %s\n", + "fabric_command_complete": "Commande Fabric terminée", + "fabric_command_complete_with_pattern": "Fabric : %s terminé", + "command_completed_successfully": "Commande terminée avec succès", + "output_truncated": "Sortie : %s...", + "output_full": "Sortie : %s", + "choose_pattern_from_available": "Choisissez un motif parmi les motifs disponibles", + "pattern_variables_help": "Valeurs pour les variables de motif, ex. -v=#role:expert -v=#points:30", + "choose_context_from_available": "Choisissez un contexte parmi les contextes disponibles", + "choose_session_from_available": "Choisissez une session parmi les sessions disponibles", + "attachment_path_or_url_help": "Chemin de pièce jointe ou URL (ex. pour les messages de reconnaissance d'image OpenAI)", + "run_setup_for_reconfigurable_parts": "Exécuter la configuration pour toutes les parties reconfigurables de fabric", + "set_temperature": "Définir la température", + "set_top_p": "Définir le top P", + "stream_help": "Streaming", + "set_presence_penalty": "Définir la pénalité de présence", + "use_model_defaults_raw_help": "Utiliser les valeurs par défaut du modèle sans envoyer d'options de chat (comme la température, etc.) et utiliser le rôle utilisateur au lieu du rôle système pour les motifs.", + "set_frequency_penalty": "Définir la pénalité de fréquence", + "list_all_patterns": "Lister tous les motifs", + "list_all_available_models": "Lister tous les modèles disponibles", + "list_all_contexts": "Lister tous les contextes", + "list_all_sessions": "Lister toutes les sessions", + "update_patterns": "Mettre à jour les motifs", + "messages_to_send_to_chat": "Messages à envoyer au chat", + "copy_to_clipboard": "Copier dans le presse-papiers", + "choose_model": "Choisir le modèle", + "specify_vendor_for_model": "Spécifier le fournisseur pour le modèle sélectionné (ex. -V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "Longueur de contexte du modèle (affecte seulement ollama)", + "output_to_file": "Sortie vers fichier", + "output_entire_session": "Sortie de toute la session (même temporaire) vers le fichier de sortie", + "number_of_latest_patterns": "Nombre des motifs les plus récents à lister", + "change_default_model": "Changer le modèle par défaut", + "youtube_url_help": "Vidéo YouTube ou \"URL\" de liste de lecture pour récupérer la transcription, les commentaires et envoyer au chat ou afficher dans la console et stocker dans le fichier de sortie", + "prefer_playlist_over_video": "Préférer la liste de lecture à la vidéo si les deux IDs sont présents dans l'URL", + "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", + "grab_comments_from_youtube": "Récupérer les commentaires de la vidéo YouTube et envoyer au chat", + "output_video_metadata": "Afficher les métadonnées de la vidéo", + "additional_yt_dlp_args": "Arguments supplémentaires à passer à yt-dlp (ex. '--cookies-from-browser brave')", + "specify_language_code": "Spécifier le code de langue pour le chat, ex. -g=en -g=zh", + "scrape_website_url": "Scraper l'URL du site web en markdown en utilisant Jina AI", + "search_question_jina": "Question de recherche en utilisant Jina AI", + "seed_for_lmm_generation": "Graine à utiliser pour la génération LMM", + "wipe_context": "Effacer le contexte", + "wipe_session": "Effacer la session", + "print_context": "Afficher le contexte", + "print_session": "Afficher la session", + "convert_html_readability": "Convertir l'entrée HTML en vue propre et lisible", + "apply_variables_to_input": "Appliquer les variables à l'entrée utilisateur", + "disable_pattern_variable_replacement": "Désactiver le remplacement des variables de motif", + "show_dry_run": "Montrer ce qui serait envoyé au modèle sans l'envoyer réellement", + "serve_fabric_rest_api": "Servir l'API REST Fabric", + "serve_fabric_api_ollama_endpoints": "Servir l'API REST Fabric avec les endpoints ollama", + "address_to_bind_rest_api": "Adresse pour lier l'API REST", + "api_key_secure_server_routes": "Clé API utilisée pour sécuriser les routes du serveur", + "path_to_yaml_config": "Chemin vers le fichier de configuration YAML", + "print_current_version": "Afficher la version actuelle", + "list_all_registered_extensions": "Lister toutes les extensions enregistrées", + "register_new_extension": "Enregistrer une nouvelle extension depuis le chemin du fichier de configuration", + "remove_registered_extension": "Supprimer une extension enregistrée par nom", + "choose_strategy_from_available": "Choisir une stratégie parmi les stratégies disponibles", + "list_all_strategies": "Lister toutes les stratégies", + "list_all_vendors": "Lister tous les fournisseurs", + "output_raw_list_shell_completion": "Sortie de liste brute sans en-têtes/formatage (pour la complétion shell)", + "enable_web_search_tool": "Activer l'outil de recherche web pour les modèles pris en charge (Anthropic, OpenAI, Gemini)", + "set_location_web_search": "Définir l'emplacement pour les résultats de recherche web (ex. 'America/Los_Angeles')", + "save_generated_image_to_file": "Sauvegarder l'image générée dans le chemin de fichier spécifié (ex. 'output.png')", + "image_dimensions_help": "Dimensions de l'image : 1024x1024, 1536x1024, 1024x1536, auto (par défaut : auto)", + "image_quality_help": "Qualité de l'image : low, medium, high, auto (par défaut : auto)", + "compression_level_jpeg_webp": "Niveau de compression 0-100 pour les formats JPEG/WebP (par défaut : non défini)", + "background_type_help": "Type d'arrière-plan : opaque, transparent (par défaut : opaque, seulement pour PNG/WebP)", + "suppress_thinking_tags": "Supprimer le texte encadré par les balises de réflexion", + "start_tag_thinking_sections": "Balise de début pour les sections de réflexion", + "end_tag_thinking_sections": "Balise de fin pour les sections de réflexion", + "disable_openai_responses_api": "Désactiver l'API OpenAI Responses (par défaut : false)", + "audio_video_file_transcribe": "Fichier audio ou vidéo à transcrire", + "model_for_transcription": "Modèle à utiliser pour la transcription (séparé du modèle de chat)", + "split_media_files_ffmpeg": "Diviser les fichiers audio/vidéo de plus de 25MB en utilisant ffmpeg", + "tts_voice_name": "Nom de voix TTS pour les modèles pris en charge (ex. Kore, Charon, Puck)", + "list_gemini_tts_voices": "Lister toutes les voix TTS Gemini disponibles", + "list_transcription_models": "Lister tous les modèles de transcription disponibles", + "send_desktop_notification": "Envoyer une notification de bureau quand la commande se termine", + "custom_notification_command": "Commande personnalisée à exécuter pour les notifications (remplace les notifications intégrées)", + "set_reasoning_thinking_level": "Définir le niveau de raisonnement/réflexion (ex. off, low, medium, high, ou tokens numériques pour Anthropic ou Google Gemini)", + "set_debug_level": "Définir le niveau de débogage (0=désactivé, 1=basique, 2=détaillé, 3=trace)", + "usage_header": "Utilisation :", + "application_options_header": "Options de l'application :", + "help_options_header": "Options d'aide :", + "help_message": "Afficher ce message d'aide", + "options_placeholder": "[OPTIONS]", + "available_vendors_header": "Fournisseurs disponibles :", + "available_models_header": "Modèles disponibles", + "no_items_found": "Aucun %s", + "no_description_available": "Aucune description disponible", + "i18n_download_failed": "Échec du téléchargement de la traduction pour la langue '%s' : %v", + "i18n_load_failed": "Échec du chargement du fichier de traduction : %v" +} \ No newline at end of file diff --git a/internal/i18n/locales/it.json b/internal/i18n/locales/it.json new file mode 100644 index 00000000..86c686f1 --- /dev/null +++ b/internal/i18n/locales/it.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "usa l'input originale, perché non è possibile applicare la leggibilità HTML", + "vendor_not_configured": "il fornitore %s non è configurato", + "vendor_no_transcription_support": "il fornitore %s non supporta la trascrizione audio", + "transcription_model_required": "è richiesto un modello di trascrizione (usa --transcribe-model)", + "youtube_not_configured": "YouTube non è configurato, per favore esegui la procedura di configurazione", + "error_fetching_playlist_videos": "errore nel recupero dei video della playlist: %w", + "scraping_not_configured": "la funzionalità di scraping non è configurata. Per favore configura Jina per abilitare lo scraping", + "could_not_determine_home_dir": "impossibile determinare la directory home dell'utente: %w", + "could_not_stat_env_file": "impossibile verificare il file .env: %w", + "could_not_create_config_dir": "impossibile creare la directory di configurazione: %w", + "could_not_create_env_file": "impossibile creare il file .env: %w", + "could_not_copy_to_clipboard": "impossibile copiare negli appunti: %v", + "file_already_exists_not_overwriting": "il file %s esiste già, non verrà sovrascritto. Rinomina il file esistente o scegli un nome diverso", + "error_creating_file": "errore nella creazione del file: %v", + "error_writing_to_file": "errore nella scrittura del file: %v", + "error_creating_audio_file": "errore nella creazione del file audio: %v", + "error_writing_audio_data": "errore nella scrittura dei dati audio nel file: %v", + "tts_model_requires_audio_output": "il modello TTS '%s' richiede un output audio. Per favore specifica un file di output audio con il flag -o (es. -o output.wav)", + "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", + "file_already_exists_choose_different": "il file %s esiste già. Per favore scegli un nome file diverso o rimuovi il file esistente", + "no_notification_system_available": "nessun sistema di notifica disponibile", + "cannot_convert_string": "impossibile convertire la stringa %q in %v", + "unsupported_conversion": "conversione non supportata da %v a %v", + "invalid_config_path": "percorso di configurazione non valido: %w", + "config_file_not_found": "file di configurazione non trovato: %s", + "error_reading_config_file": "errore nella lettura del file di configurazione: %w", + "error_parsing_config_file": "errore nell'analisi del file di configurazione: %w", + "error_reading_piped_message": "errore nella lettura del messaggio reindirizzato da stdin: %w", + "image_file_already_exists": "il file immagine esiste già: %s", + "invalid_image_file_extension": "estensione file immagine non valida '%s'. Formati supportati: .png, .jpeg, .jpg, .webp", + "image_parameters_require_image_file": "i parametri immagine (--image-size, --image-quality, --image-background, --image-compression) possono essere utilizzati solo con --image-file", + "invalid_image_size": "dimensione immagine non valida '%s'. Dimensioni supportate: 1024x1024, 1536x1024, 1024x1536, auto", + "invalid_image_quality": "qualità immagine non valida '%s'. Qualità supportate: low, medium, high, auto", + "invalid_image_background": "sfondo immagine non valido '%s'. Sfondi supportati: opaque, transparent", + "image_compression_jpeg_webp_only": "la compressione immagine può essere utilizzata solo con formati JPEG e WebP, non %s", + "image_compression_range_error": "la compressione immagine deve essere tra 0 e 100, ricevuto %d", + "transparent_background_png_webp_only": "lo sfondo trasparente può essere utilizzato solo con formati PNG e WebP, non %s", + "available_transcription_models": "Modelli di trascrizione disponibili:", + "tts_audio_generated_successfully": "Audio TTS generato con successo e salvato in: %s\n", + "fabric_command_complete": "Comando Fabric completato", + "fabric_command_complete_with_pattern": "Fabric: %s completato", + "command_completed_successfully": "Comando completato con successo", + "output_truncated": "Output: %s...", + "output_full": "Output: %s", + "choose_pattern_from_available": "Scegli un pattern dai pattern disponibili", + "pattern_variables_help": "Valori per le variabili pattern, es. -v=#role:expert -v=#points:30", + "choose_context_from_available": "Scegli un contesto dai contesti disponibili", + "choose_session_from_available": "Scegli una sessione dalle sessioni disponibili", + "attachment_path_or_url_help": "Percorso allegato o URL (es. per messaggi di riconoscimento immagine OpenAI)", + "run_setup_for_reconfigurable_parts": "Esegui la configurazione per tutte le parti riconfigurabili di fabric", + "set_temperature": "Imposta temperatura", + "set_top_p": "Imposta top P", + "stream_help": "Streaming", + "set_presence_penalty": "Imposta penalità di presenza", + "use_model_defaults_raw_help": "Usa i valori predefiniti del modello senza inviare opzioni di chat (come temperatura, ecc.) e usa il ruolo utente invece del ruolo sistema per i pattern.", + "set_frequency_penalty": "Imposta penalità di frequenza", + "list_all_patterns": "Elenca tutti i pattern", + "list_all_available_models": "Elenca tutti i modelli disponibili", + "list_all_contexts": "Elenca tutti i contesti", + "list_all_sessions": "Elenca tutte le sessioni", + "update_patterns": "Aggiorna pattern", + "messages_to_send_to_chat": "Messaggi da inviare alla chat", + "copy_to_clipboard": "Copia negli appunti", + "choose_model": "Scegli modello", + "specify_vendor_for_model": "Specifica il fornitore per il modello selezionato (es. -V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "Lunghezza del contesto del modello (influisce solo su ollama)", + "output_to_file": "Output su file", + "output_entire_session": "Output dell'intera sessione (anche temporanea) nel file di output", + "number_of_latest_patterns": "Numero dei pattern più recenti da elencare", + "change_default_model": "Cambia modello predefinito", + "youtube_url_help": "Video YouTube o \"URL\" della playlist per ottenere trascrizioni, commenti e inviarli alla chat o stamparli sulla console e memorizzarli nel file di output", + "prefer_playlist_over_video": "Preferisci playlist al video se entrambi gli ID sono presenti nell'URL", + "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", + "grab_comments_from_youtube": "Ottieni commenti dal video YouTube e invia alla chat", + "output_video_metadata": "Output metadati video", + "additional_yt_dlp_args": "Argomenti aggiuntivi da passare a yt-dlp (es. '--cookies-from-browser brave')", + "specify_language_code": "Specifica il codice lingua per la chat, es. -g=en -g=zh", + "scrape_website_url": "Scraping dell'URL del sito web in markdown usando Jina AI", + "search_question_jina": "Domanda di ricerca usando Jina AI", + "seed_for_lmm_generation": "Seed da utilizzare per la generazione LMM", + "wipe_context": "Cancella contesto", + "wipe_session": "Cancella sessione", + "print_context": "Stampa contesto", + "print_session": "Stampa sessione", + "convert_html_readability": "Converti input HTML in una vista pulita e leggibile", + "apply_variables_to_input": "Applica variabili all'input utente", + "disable_pattern_variable_replacement": "Disabilita sostituzione variabili pattern", + "show_dry_run": "Mostra cosa verrebbe inviato al modello senza inviarlo effettivamente", + "serve_fabric_rest_api": "Servi l'API REST di Fabric", + "serve_fabric_api_ollama_endpoints": "Servi l'API REST di Fabric con endpoint ollama", + "address_to_bind_rest_api": "Indirizzo per associare l'API REST", + "api_key_secure_server_routes": "Chiave API utilizzata per proteggere le route del server", + "path_to_yaml_config": "Percorso del file di configurazione YAML", + "print_current_version": "Stampa versione corrente", + "list_all_registered_extensions": "Elenca tutte le estensioni registrate", + "register_new_extension": "Registra una nuova estensione dal percorso del file di configurazione", + "remove_registered_extension": "Rimuovi un'estensione registrata per nome", + "choose_strategy_from_available": "Scegli una strategia dalle strategie disponibili", + "list_all_strategies": "Elenca tutte le strategie", + "list_all_vendors": "Elenca tutti i fornitori", + "output_raw_list_shell_completion": "Output lista grezza senza intestazioni/formattazione (per completamento shell)", + "enable_web_search_tool": "Abilita strumento di ricerca web per modelli supportati (Anthropic, OpenAI, Gemini)", + "set_location_web_search": "Imposta posizione per risultati ricerca web (es. 'America/Los_Angeles')", + "save_generated_image_to_file": "Salva immagine generata nel percorso file specificato (es. 'output.png')", + "image_dimensions_help": "Dimensioni immagine: 1024x1024, 1536x1024, 1024x1536, auto (predefinito: auto)", + "image_quality_help": "Qualità immagine: low, medium, high, auto (predefinito: auto)", + "compression_level_jpeg_webp": "Livello di compressione 0-100 per formati JPEG/WebP (predefinito: non impostato)", + "background_type_help": "Tipo di sfondo: opaque, transparent (predefinito: opaque, solo per PNG/WebP)", + "suppress_thinking_tags": "Sopprimi testo racchiuso in tag di pensiero", + "start_tag_thinking_sections": "Tag di inizio per sezioni di pensiero", + "end_tag_thinking_sections": "Tag di fine per sezioni di pensiero", + "disable_openai_responses_api": "Disabilita API OpenAI Responses (predefinito: false)", + "audio_video_file_transcribe": "File audio o video da trascrivere", + "model_for_transcription": "Modello da utilizzare per la trascrizione (separato dal modello di chat)", + "split_media_files_ffmpeg": "Dividi file audio/video più grandi di 25MB usando ffmpeg", + "tts_voice_name": "Nome voce TTS per modelli supportati (es. Kore, Charon, Puck)", + "list_gemini_tts_voices": "Elenca tutte le voci TTS Gemini disponibili", + "list_transcription_models": "Elenca tutti i modelli di trascrizione disponibili", + "send_desktop_notification": "Invia notifica desktop quando il comando è completato", + "custom_notification_command": "Comando personalizzato da eseguire per le notifiche (sovrascrive le notifiche integrate)", + "set_reasoning_thinking_level": "Imposta livello di ragionamento/pensiero (es. off, low, medium, high, o token numerici per Anthropic o Google Gemini)", + "set_debug_level": "Imposta livello di debug (0=spento, 1=base, 2=dettagliato, 3=traccia)", + "usage_header": "Uso:", + "application_options_header": "Opzioni dell'applicazione:", + "help_options_header": "Opzioni di aiuto:", + "help_message": "Mostra questo messaggio di aiuto", + "options_placeholder": "[OPZIONI]", + "available_vendors_header": "Fornitori disponibili:", + "available_models_header": "Modelli disponibili", + "no_items_found": "Nessun %s", + "no_description_available": "Nessuna descrizione disponibile", + "i18n_download_failed": "Fallito il download della traduzione per la lingua '%s': %v", + "i18n_load_failed": "Fallito il caricamento del file di traduzione: %v" +} \ No newline at end of file diff --git a/internal/i18n/locales/ja.json b/internal/i18n/locales/ja.json new file mode 100644 index 00000000..a478165b --- /dev/null +++ b/internal/i18n/locales/ja.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "HTML可読性を適用できないため、元の入力を使用します", + "vendor_not_configured": "ベンダー %s が設定されていません", + "vendor_no_transcription_support": "ベンダー %s は音声転写をサポートしていません", + "transcription_model_required": "転写モデルが必要です(--transcribe-model を使用)", + "youtube_not_configured": "YouTubeが設定されていません。セットアップ手順を実行してください", + "error_fetching_playlist_videos": "プレイリスト動画の取得エラー: %w", + "scraping_not_configured": "スクレイピング機能が設定されていません。スクレイピングを有効にするためにJinaを設定してください", + "could_not_determine_home_dir": "ユーザーのホームディレクトリを特定できませんでした: %w", + "could_not_stat_env_file": ".envファイルの状態を確認できませんでした: %w", + "could_not_create_config_dir": "設定ディレクトリを作成できませんでした: %w", + "could_not_create_env_file": ".envファイルを作成できませんでした: %w", + "could_not_copy_to_clipboard": "クリップボードにコピーできませんでした: %v", + "file_already_exists_not_overwriting": "ファイル %s は既に存在するため、上書きしません。既存のファイルの名前を変更するか、別の名前を選択してください", + "error_creating_file": "ファイルの作成エラー: %v", + "error_writing_to_file": "ファイルへの書き込みエラー: %v", + "error_creating_audio_file": "音声ファイルの作成エラー: %v", + "error_writing_audio_data": "音声データのファイルへの書き込みエラー: %v", + "tts_model_requires_audio_output": "TTSモデル '%s' には音声出力が必要です。-oフラグで音声出力ファイルを指定してください(例:-o output.wav)", + "audio_output_file_specified_but_not_tts_model": "音声出力ファイル '%s' が指定されましたが、モデル '%s' はTTSモデルではありません。gemini-2.5-flash-preview-tts などのTTSモデルを使用してください", + "file_already_exists_choose_different": "ファイル %s は既に存在します。別のファイル名を選択するか、既存のファイルを削除してください", + "no_notification_system_available": "利用可能な通知システムがありません", + "cannot_convert_string": "文字列 %q を %v に変換できません", + "unsupported_conversion": "%v から %v への変換はサポートされていません", + "invalid_config_path": "無効な設定パス: %w", + "config_file_not_found": "設定ファイルが見つかりません: %s", + "error_reading_config_file": "設定ファイルの読み込みエラー: %w", + "error_parsing_config_file": "設定ファイルの解析エラー: %w", + "error_reading_piped_message": "stdinからパイプされたメッセージの読み込みエラー: %w", + "image_file_already_exists": "画像ファイルが既に存在します: %s", + "invalid_image_file_extension": "無効な画像ファイル拡張子 '%s'。サポートされている形式:.png、.jpeg、.jpg、.webp", + "image_parameters_require_image_file": "画像パラメータ(--image-size、--image-quality、--image-background、--image-compression)は --image-file と一緒に使用する必要があります", + "invalid_image_size": "無効な画像サイズ '%s'。サポートされているサイズ:1024x1024、1536x1024、1024x1536、auto", + "invalid_image_quality": "無効な画像品質 '%s'。サポートされている品質:low、medium、high、auto", + "invalid_image_background": "無効な画像背景 '%s'。サポートされている背景:opaque、transparent", + "image_compression_jpeg_webp_only": "画像圧縮はJPEGおよびWebP形式でのみ使用できます。%s では使用できません", + "image_compression_range_error": "画像圧縮は0から100の間である必要があります。取得値:%d", + "transparent_background_png_webp_only": "透明背景はPNGおよびWebP形式でのみ使用できます。%s では使用できません", + "available_transcription_models": "利用可能な転写モデル:", + "tts_audio_generated_successfully": "TTS音声が正常に生成され、保存されました:%s\n", + "fabric_command_complete": "Fabricコマンド完了", + "fabric_command_complete_with_pattern": "Fabric:%s 完了", + "command_completed_successfully": "コマンドが正常に完了しました", + "output_truncated": "出力:%s...", + "output_full": "出力:%s", + "choose_pattern_from_available": "利用可能なパターンからパターンを選択", + "pattern_variables_help": "パターン変数の値、例:-v=#role:expert -v=#points:30", + "choose_context_from_available": "利用可能なコンテキストからコンテキストを選択", + "choose_session_from_available": "利用可能なセッションからセッションを選択", + "attachment_path_or_url_help": "添付ファイルのパスまたはURL(例:OpenAI画像認識メッセージ用)", + "run_setup_for_reconfigurable_parts": "fabricのすべての再設定可能な部分のセットアップを実行", + "set_temperature": "温度を設定", + "set_top_p": "Top Pを設定", + "stream_help": "ストリーミング", + "set_presence_penalty": "プレゼンスペナルティを設定", + "use_model_defaults_raw_help": "チャットオプション(温度など)を送信せずにモデルのデフォルトを使用し、パターンにシステムロールではなくユーザーロールを使用します。", + "set_frequency_penalty": "頻度ペナルティを設定", + "list_all_patterns": "すべてのパターンを一覧表示", + "list_all_available_models": "すべての利用可能なモデルを一覧表示", + "list_all_contexts": "すべてのコンテキストを一覧表示", + "list_all_sessions": "すべてのセッションを一覧表示", + "update_patterns": "パターンを更新", + "messages_to_send_to_chat": "チャットに送信するメッセージ", + "copy_to_clipboard": "クリップボードにコピー", + "choose_model": "モデルを選択", + "specify_vendor_for_model": "選択したモデルのベンダーを指定(例:-V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "モデルのコンテキスト長(ollamaのみに影響)", + "output_to_file": "ファイルに出力", + "output_entire_session": "セッション全体(一時的なものも含む)を出力ファイルに出力", + "number_of_latest_patterns": "一覧表示する最新パターンの数", + "change_default_model": "デフォルトモデルを変更", + "youtube_url_help": "YouTube動画またはプレイリスト\"URL\"から転写、コメントを取得してチャットに送信、またはコンソールに出力して出力ファイルに保存", + "prefer_playlist_over_video": "URLに両方のIDが存在する場合、動画よりプレイリストを優先", + "grab_transcript_from_youtube": "YouTube動画から転写を取得してチャットに送信(デフォルトで使用)。", + "grab_transcript_with_timestamps": "YouTube動画からタイムスタンプ付きの転写を取得してチャットに送信", + "grab_comments_from_youtube": "YouTube動画からコメントを取得してチャットに送信", + "output_video_metadata": "動画メタデータを出力", + "additional_yt_dlp_args": "yt-dlpに渡す追加の引数(例:'--cookies-from-browser brave')", + "specify_language_code": "チャットの言語コードを指定、例:-g=en -g=zh", + "scrape_website_url": "Jina AIを使用してウェブサイトURLをマークダウンにスクレイピング", + "search_question_jina": "Jina AIを使用した検索質問", + "seed_for_lmm_generation": "LMM生成で使用するシード", + "wipe_context": "コンテキストをクリア", + "wipe_session": "セッションをクリア", + "print_context": "コンテキストを出力", + "print_session": "セッションを出力", + "convert_html_readability": "HTML入力をクリーンで読みやすいビューに変換", + "apply_variables_to_input": "ユーザー入力に変数を適用", + "disable_pattern_variable_replacement": "パターン変数の置換を無効化", + "show_dry_run": "実際に送信せずにモデルに送信される内容を表示", + "serve_fabric_rest_api": "Fabric REST APIを提供", + "serve_fabric_api_ollama_endpoints": "ollamaエンドポイント付きのFabric REST APIを提供", + "address_to_bind_rest_api": "REST APIをバインドするアドレス", + "api_key_secure_server_routes": "サーバールートを保護するために使用するAPIキー", + "path_to_yaml_config": "YAML設定ファイルのパス", + "print_current_version": "現在のバージョンを出力", + "list_all_registered_extensions": "すべての登録済み拡張機能を一覧表示", + "register_new_extension": "設定ファイルパスから新しい拡張機能を登録", + "remove_registered_extension": "名前で登録済み拡張機能を削除", + "choose_strategy_from_available": "利用可能な戦略から戦略を選択", + "list_all_strategies": "すべての戦略を一覧表示", + "list_all_vendors": "すべてのベンダーを一覧表示", + "output_raw_list_shell_completion": "生リストをヘッダー/フォーマットなしで出力(シェル補完用)", + "enable_web_search_tool": "サポートされているモデル(Anthropic、OpenAI、Gemini)でウェブ検索ツールを有効化", + "set_location_web_search": "ウェブ検索結果の場所を設定(例:'America/Los_Angeles')", + "save_generated_image_to_file": "生成された画像を指定ファイルパスに保存(例:'output.png')", + "image_dimensions_help": "画像サイズ:1024x1024、1536x1024、1024x1536、auto(デフォルト:auto)", + "image_quality_help": "画像品質:low、medium、high、auto(デフォルト:auto)", + "compression_level_jpeg_webp": "JPEG/WebP形式の圧縮レベル0-100(デフォルト:未設定)", + "background_type_help": "背景タイプ:opaque、transparent(デフォルト:opaque、PNG/WebPのみ)", + "suppress_thinking_tags": "思考タグで囲まれたテキストを抑制", + "start_tag_thinking_sections": "思考セクションの開始タグ", + "end_tag_thinking_sections": "思考セクションの終了タグ", + "disable_openai_responses_api": "OpenAI Responses APIを無効化(デフォルト:false)", + "audio_video_file_transcribe": "転写する音声または動画ファイル", + "model_for_transcription": "転写に使用するモデル(チャットモデルとは別)", + "split_media_files_ffmpeg": "25MBを超える音声/動画ファイルをffmpegを使用して分割", + "tts_voice_name": "サポートされているモデルのTTS音声名(例:Kore、Charon、Puck)", + "list_gemini_tts_voices": "すべての利用可能なGemini TTS音声を一覧表示", + "list_transcription_models": "すべての利用可能な転写モデルを一覧表示", + "send_desktop_notification": "コマンド完了時にデスクトップ通知を送信", + "custom_notification_command": "通知用のカスタムコマンド(内蔵通知を上書き)", + "set_reasoning_thinking_level": "推論/思考レベルを設定(例:off、low、medium、high、またはAnthropicやGoogle Gemini用の数値トークン)", + "set_debug_level": "デバッグレベルを設定(0=オフ、1=基本、2=詳細、3=トレース)", + "usage_header": "使用法:", + "application_options_header": "アプリケーションオプション:", + "help_options_header": "ヘルプオプション:", + "help_message": "このヘルプメッセージを表示", + "options_placeholder": "[オプション]", + "available_vendors_header": "利用可能なベンダー:", + "available_models_header": "利用可能なモデル", + "no_items_found": "%s がありません", + "no_description_available": "説明がありません", + "i18n_download_failed": "言語 '%s' の翻訳のダウンロードに失敗しました: %v", + "i18n_load_failed": "翻訳ファイルの読み込みに失敗しました: %v" +} \ No newline at end of file diff --git a/internal/i18n/locales/pt.json b/internal/i18n/locales/pt.json new file mode 100644 index 00000000..1298a53e --- /dev/null +++ b/internal/i18n/locales/pt.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "usa a entrada original, porque não é possível aplicar a legibilidade HTML", + "vendor_not_configured": "o fornecedor %s não está configurado", + "vendor_no_transcription_support": "o fornecedor %s não suporta transcrição de áudio", + "transcription_model_required": "modelo de transcrição é necessário (use --transcribe-model)", + "youtube_not_configured": "YouTube não está configurado, por favor execute o procedimento de configuração", + "error_fetching_playlist_videos": "erro ao buscar vídeos da playlist: %w", + "scraping_not_configured": "funcionalidade de scraping não está configurada. Por favor configure o Jina para ativar o scraping", + "could_not_determine_home_dir": "não foi possível determinar o diretório home do usuário: %w", + "could_not_stat_env_file": "não foi possível verificar o arquivo .env: %w", + "could_not_create_config_dir": "não foi possível criar o diretório de configuração: %w", + "could_not_create_env_file": "não foi possível criar o arquivo .env: %w", + "could_not_copy_to_clipboard": "não foi possível copiar para a área de transferência: %v", + "file_already_exists_not_overwriting": "o arquivo %s já existe, não será sobrescrito. Renomeie o arquivo existente ou escolha um nome diferente", + "error_creating_file": "erro ao criar arquivo: %v", + "error_writing_to_file": "erro ao escrever no arquivo: %v", + "error_creating_audio_file": "erro ao criar arquivo de áudio: %v", + "error_writing_audio_data": "erro ao escrever dados de áudio no arquivo: %v", + "tts_model_requires_audio_output": "modelo TTS '%s' requer saída de áudio. Por favor especifique um arquivo de saída de áudio com a flag -o (ex. -o output.wav)", + "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", + "file_already_exists_choose_different": "arquivo %s já existe. Por favor escolha um nome de arquivo diferente ou remova o arquivo existente", + "no_notification_system_available": "nenhum sistema de notificação disponível", + "cannot_convert_string": "não é possível converter a string %q para %v", + "unsupported_conversion": "conversão não suportada de %v para %v", + "invalid_config_path": "caminho de configuração inválido: %w", + "config_file_not_found": "arquivo de configuração não encontrado: %s", + "error_reading_config_file": "erro ao ler arquivo de configuração: %w", + "error_parsing_config_file": "erro ao analisar arquivo de configuração: %w", + "error_reading_piped_message": "erro ao ler mensagem redirecionada do stdin: %w", + "image_file_already_exists": "arquivo de imagem já existe: %s", + "invalid_image_file_extension": "extensão de arquivo de imagem inválida '%s'. Formatos suportados: .png, .jpeg, .jpg, .webp", + "image_parameters_require_image_file": "parâmetros de imagem (--image-size, --image-quality, --image-background, --image-compression) só podem ser usados com --image-file", + "invalid_image_size": "tamanho de imagem inválido '%s'. Tamanhos suportados: 1024x1024, 1536x1024, 1024x1536, auto", + "invalid_image_quality": "qualidade de imagem inválida '%s'. Qualidades suportadas: low, medium, high, auto", + "invalid_image_background": "fundo de imagem inválido '%s'. Fundos suportados: opaque, transparent", + "image_compression_jpeg_webp_only": "compressão de imagem só pode ser usada com formatos JPEG e WebP, não %s", + "image_compression_range_error": "compressão de imagem deve estar entre 0 e 100, recebido %d", + "transparent_background_png_webp_only": "fundo transparente só pode ser usado com formatos PNG e WebP, não %s", + "available_transcription_models": "Modelos de transcrição disponíveis:", + "tts_audio_generated_successfully": "Áudio TTS gerado com sucesso e salvo em: %s\n", + "fabric_command_complete": "Comando Fabric concluído", + "fabric_command_complete_with_pattern": "Fabric: %s concluído", + "command_completed_successfully": "Comando concluído com sucesso", + "output_truncated": "Saída: %s...", + "output_full": "Saída: %s", + "choose_pattern_from_available": "Escolha um padrão dos padrões disponíveis", + "pattern_variables_help": "Valores para variáveis de padrão, ex. -v=#role:expert -v=#points:30", + "choose_context_from_available": "Escolha um contexto dos contextos disponíveis", + "choose_session_from_available": "Escolha uma sessão das sessões disponíveis", + "attachment_path_or_url_help": "Caminho do anexo ou URL (ex. para mensagens de reconhecimento de imagem do OpenAI)", + "run_setup_for_reconfigurable_parts": "Executar configuração para todas as partes reconfiguráveis do fabric", + "set_temperature": "Definir temperatura", + "set_top_p": "Definir top P", + "stream_help": "Streaming", + "set_presence_penalty": "Definir penalidade de presença", + "use_model_defaults_raw_help": "Usar os padrões do modelo sem enviar opções de chat (como temperatura, etc.) e usar o papel de usuário em vez do papel de sistema para padrões.", + "set_frequency_penalty": "Definir penalidade de frequência", + "list_all_patterns": "Listar todos os padrões", + "list_all_available_models": "Listar todos os modelos disponíveis", + "list_all_contexts": "Listar todos os contextos", + "list_all_sessions": "Listar todas as sessões", + "update_patterns": "Atualizar padrões", + "messages_to_send_to_chat": "Mensagens para enviar ao chat", + "copy_to_clipboard": "Copiar para área de transferência", + "choose_model": "Escolher modelo", + "specify_vendor_for_model": "Especificar fornecedor para o modelo selecionado (ex. -V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "Comprimento do contexto do modelo (afeta apenas ollama)", + "output_to_file": "Saída para arquivo", + "output_entire_session": "Saída de toda a sessão (incluindo temporária) para o arquivo de saída", + "number_of_latest_patterns": "Número dos padrões mais recentes a listar", + "change_default_model": "Mudar modelo padrão", + "youtube_url_help": "Vídeo do YouTube ou \"URL\" de playlist para obter transcrição, comentários e enviar ao chat ou imprimir no console e armazenar no arquivo de saída", + "prefer_playlist_over_video": "Preferir playlist ao vídeo se ambos os IDs estiverem presentes na URL", + "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", + "grab_comments_from_youtube": "Obter comentários do vídeo do YouTube e enviar ao chat", + "output_video_metadata": "Exibir metadados do vídeo", + "additional_yt_dlp_args": "Argumentos adicionais para passar ao yt-dlp (ex. '--cookies-from-browser brave')", + "specify_language_code": "Especificar código de idioma para o chat, ex. -g=en -g=zh", + "scrape_website_url": "Fazer scraping da URL do site para markdown usando Jina AI", + "search_question_jina": "Pergunta de busca usando Jina AI", + "seed_for_lmm_generation": "Seed para ser usado na geração LMM", + "wipe_context": "Limpar contexto", + "wipe_session": "Limpar sessão", + "print_context": "Imprimir contexto", + "print_session": "Imprimir sessão", + "convert_html_readability": "Converter entrada HTML em uma visualização limpa e legível", + "apply_variables_to_input": "Aplicar variáveis à entrada do usuário", + "disable_pattern_variable_replacement": "Desabilitar substituição de variáveis de padrão", + "show_dry_run": "Mostrar o que seria enviado ao modelo sem enviar de fato", + "serve_fabric_rest_api": "Servir a API REST do Fabric", + "serve_fabric_api_ollama_endpoints": "Servir a API REST do Fabric com endpoints ollama", + "address_to_bind_rest_api": "Endereço para vincular a API REST", + "api_key_secure_server_routes": "Chave API usada para proteger rotas do servidor", + "path_to_yaml_config": "Caminho para arquivo de configuração YAML", + "print_current_version": "Imprimir versão atual", + "list_all_registered_extensions": "Listar todas as extensões registradas", + "register_new_extension": "Registrar uma nova extensão do caminho do arquivo de configuração", + "remove_registered_extension": "Remover uma extensão registrada por nome", + "choose_strategy_from_available": "Escolher uma estratégia das estratégias disponíveis", + "list_all_strategies": "Listar todas as estratégias", + "list_all_vendors": "Listar todos os fornecedores", + "output_raw_list_shell_completion": "Saída de lista bruta sem cabeçalhos/formatação (para conclusão de shell)", + "enable_web_search_tool": "Habilitar ferramenta de busca web para modelos suportados (Anthropic, OpenAI, Gemini)", + "set_location_web_search": "Definir localização para resultados de busca web (ex. 'America/Los_Angeles')", + "save_generated_image_to_file": "Salvar imagem gerada no caminho de arquivo especificado (ex. 'output.png')", + "image_dimensions_help": "Dimensões da imagem: 1024x1024, 1536x1024, 1024x1536, auto (padrão: auto)", + "image_quality_help": "Qualidade da imagem: low, medium, high, auto (padrão: auto)", + "compression_level_jpeg_webp": "Nível de compressão 0-100 para formatos JPEG/WebP (padrão: não definido)", + "background_type_help": "Tipo de fundo: opaque, transparent (padrão: opaque, apenas para PNG/WebP)", + "suppress_thinking_tags": "Suprimir texto contido em tags de pensamento", + "start_tag_thinking_sections": "Tag inicial para seções de pensamento", + "end_tag_thinking_sections": "Tag final para seções de pensamento", + "disable_openai_responses_api": "Desabilitar API OpenAI Responses (padrão: false)", + "audio_video_file_transcribe": "Arquivo de áudio ou vídeo para transcrever", + "model_for_transcription": "Modelo para usar na transcrição (separado do modelo de chat)", + "split_media_files_ffmpeg": "Dividir arquivos de áudio/vídeo maiores que 25MB usando ffmpeg", + "tts_voice_name": "Nome da voz TTS para modelos suportados (ex. Kore, Charon, Puck)", + "list_gemini_tts_voices": "Listar todas as vozes TTS do Gemini disponíveis", + "list_transcription_models": "Listar todos os modelos de transcrição disponíveis", + "send_desktop_notification": "Enviar notificação desktop quando o comando for concluído", + "custom_notification_command": "Comando personalizado para executar notificações (substitui notificações integradas)", + "set_reasoning_thinking_level": "Definir nível de raciocínio/pensamento (ex. off, low, medium, high, ou tokens numéricos para Anthropic ou Google Gemini)", + "set_debug_level": "Definir nível de debug (0=desligado, 1=básico, 2=detalhado, 3=rastreamento)", + "usage_header": "Uso:", + "application_options_header": "Opções da aplicação:", + "help_options_header": "Opções de ajuda:", + "help_message": "Mostrar esta mensagem de ajuda", + "options_placeholder": "[OPÇÕES]", + "available_vendors_header": "Fornecedores disponíveis:", + "available_models_header": "Modelos disponíveis", + "no_items_found": "Nenhum %s", + "no_description_available": "Nenhuma descrição disponível", + "i18n_download_failed": "Falha ao baixar tradução para o idioma '%s': %v", + "i18n_load_failed": "Falha ao carregar arquivo de tradução: %v" +} \ No newline at end of file diff --git a/internal/i18n/locales/zh.json b/internal/i18n/locales/zh.json new file mode 100644 index 00000000..5a33a413 --- /dev/null +++ b/internal/i18n/locales/zh.json @@ -0,0 +1,136 @@ +{ + "html_readability_error": "使用原始输入,因为无法应用 HTML 可读性处理", + "vendor_not_configured": "供应商 %s 未配置", + "vendor_no_transcription_support": "供应商 %s 不支持音频转录", + "transcription_model_required": "需要转录模型(使用 --transcribe-model)", + "youtube_not_configured": "YouTube 未配置,请运行设置程序", + "error_fetching_playlist_videos": "获取播放列表视频时出错: %w", + "scraping_not_configured": "抓取功能未配置。请设置 Jina 以启用抓取功能", + "could_not_determine_home_dir": "无法确定用户主目录: %w", + "could_not_stat_env_file": "无法获取 .env 文件状态: %w", + "could_not_create_config_dir": "无法创建配置目录: %w", + "could_not_create_env_file": "无法创建 .env 文件: %w", + "could_not_copy_to_clipboard": "无法复制到剪贴板: %v", + "file_already_exists_not_overwriting": "文件 %s 已存在,不会覆盖。请重命名现有文件或选择其他名称", + "error_creating_file": "创建文件时出错: %v", + "error_writing_to_file": "写入文件时出错: %v", + "error_creating_audio_file": "创建音频文件时出错: %v", + "error_writing_audio_data": "写入音频数据到文件时出错: %v", + "tts_model_requires_audio_output": "TTS 模型 '%s' 需要音频输出。请使用 -o 标志指定音频输出文件(例如,-o output.wav)", + "audio_output_file_specified_but_not_tts_model": "指定了音频输出文件 '%s' 但模型 '%s' 不是 TTS 模型。请使用 TTS 模型,如 gemini-2.5-flash-preview-tts", + "file_already_exists_choose_different": "文件 %s 已存在。请选择不同的文件名或删除现有文件", + "no_notification_system_available": "没有可用的通知系统", + "cannot_convert_string": "无法将字符串 %q 转换为 %v", + "unsupported_conversion": "不支持从 %v 到 %v 的转换", + "invalid_config_path": "无效的配置路径: %w", + "config_file_not_found": "找不到配置文件: %s", + "error_reading_config_file": "读取配置文件时出错: %w", + "error_parsing_config_file": "解析配置文件时出错: %w", + "error_reading_piped_message": "从 stdin 读取管道消息时出错: %w", + "image_file_already_exists": "图像文件已存在: %s", + "invalid_image_file_extension": "无效的图像文件扩展名 '%s'。支持的格式:.png、.jpeg、.jpg、.webp", + "image_parameters_require_image_file": "图像参数(--image-size、--image-quality、--image-background、--image-compression)只能与 --image-file 一起使用", + "invalid_image_size": "无效的图像尺寸 '%s'。支持的尺寸:1024x1024、1536x1024、1024x1536、auto", + "invalid_image_quality": "无效的图像质量 '%s'。支持的质量:low、medium、high、auto", + "invalid_image_background": "无效的图像背景 '%s'。支持的背景:opaque、transparent", + "image_compression_jpeg_webp_only": "图像压缩只能用于 JPEG 和 WebP 格式,不支持 %s", + "image_compression_range_error": "图像压缩必须在 0 到 100 之间,得到 %d", + "transparent_background_png_webp_only": "透明背景只能用于 PNG 和 WebP 格式,不支持 %s", + "available_transcription_models": "可用的转录模型:", + "tts_audio_generated_successfully": "TTS 音频生成成功并保存到: %s\n", + "fabric_command_complete": "Fabric 命令完成", + "fabric_command_complete_with_pattern": "Fabric: %s 完成", + "command_completed_successfully": "命令执行成功", + "output_truncated": "输出: %s...", + "output_full": "输出: %s", + "choose_pattern_from_available": "从可用模式中选择一个模式", + "pattern_variables_help": "模式变量的值,例如 -v=#role:expert -v=#points:30", + "choose_context_from_available": "从可用上下文中选择一个上下文", + "choose_session_from_available": "从可用会话中选择一个会话", + "attachment_path_or_url_help": "附件路径或 URL(例如用于 OpenAI 图像识别消息)", + "run_setup_for_reconfigurable_parts": "为 fabric 的所有可重新配置部分运行设置", + "set_temperature": "设置温度", + "set_top_p": "设置 top P", + "stream_help": "流式传输", + "set_presence_penalty": "设置存在惩罚", + "use_model_defaults_raw_help": "使用模型默认设置,不发送聊天选项(如温度等),对于模式使用用户角色而非系统角色。", + "set_frequency_penalty": "设置频率惩罚", + "list_all_patterns": "列出所有模式", + "list_all_available_models": "列出所有可用模型", + "list_all_contexts": "列出所有上下文", + "list_all_sessions": "列出所有会话", + "update_patterns": "更新模式", + "messages_to_send_to_chat": "发送到聊天的消息", + "copy_to_clipboard": "复制到剪贴板", + "choose_model": "选择模型", + "specify_vendor_for_model": "为所选模型指定供应商(例如,-V \"LM Studio\" -m openai/gpt-oss-20b)", + "model_context_length_ollama": "模型上下文长度(仅影响 ollama)", + "output_to_file": "输出到文件", + "output_entire_session": "将整个会话(包括临时会话)输出到输出文件", + "number_of_latest_patterns": "要列出的最新模式数量", + "change_default_model": "更改默认模型", + "youtube_url_help": "YouTube 视频或播放列表 \"URL\",用于获取转录、评论并发送到聊天或打印到控制台并存储到输出文件", + "prefer_playlist_over_video": "如果 URL 中同时存在两个 ID,则优先选择播放列表而不是视频", + "grab_transcript_from_youtube": "从 YouTube 视频获取转录并发送到聊天(默认使用)。", + "grab_transcript_with_timestamps": "从 YouTube 视频获取带时间戳的转录并发送到聊天", + "grab_comments_from_youtube": "从 YouTube 视频获取评论并发送到聊天", + "output_video_metadata": "输出视频元数据", + "additional_yt_dlp_args": "传递给 yt-dlp 的其他参数(例如 '--cookies-from-browser brave')", + "specify_language_code": "指定聊天的语言代码,例如 -g=en -g=zh", + "scrape_website_url": "使用 Jina AI 将网站 URL 抓取为 markdown", + "search_question_jina": "使用 Jina AI 搜索问题", + "seed_for_lmm_generation": "用于 LMM 生成的种子", + "wipe_context": "清除上下文", + "wipe_session": "清除会话", + "print_context": "打印上下文", + "print_session": "打印会话", + "convert_html_readability": "将 HTML 输入转换为清洁、可读的视图", + "apply_variables_to_input": "将变量应用于用户输入", + "disable_pattern_variable_replacement": "禁用模式变量替换", + "show_dry_run": "显示将发送给模型的内容而不实际发送", + "serve_fabric_rest_api": "提供 Fabric REST API 服务", + "serve_fabric_api_ollama_endpoints": "提供带有 ollama 端点的 Fabric REST API 服务", + "address_to_bind_rest_api": "绑定 REST API 的地址", + "api_key_secure_server_routes": "用于保护服务器路由的 API 密钥", + "path_to_yaml_config": "YAML 配置文件路径", + "print_current_version": "打印当前版本", + "list_all_registered_extensions": "列出所有已注册的扩展", + "register_new_extension": "从配置文件路径注册新扩展", + "remove_registered_extension": "按名称删除已注册的扩展", + "choose_strategy_from_available": "从可用策略中选择一个策略", + "list_all_strategies": "列出所有策略", + "list_all_vendors": "列出所有供应商", + "output_raw_list_shell_completion": "输出不带标题/格式的原始列表(用于 shell 补全)", + "enable_web_search_tool": "为支持的模型启用网络搜索工具(Anthropic、OpenAI、Gemini)", + "set_location_web_search": "设置网络搜索结果的位置(例如,'America/Los_Angeles')", + "save_generated_image_to_file": "将生成的图像保存到指定文件路径(例如,'output.png')", + "image_dimensions_help": "图像尺寸:1024x1024、1536x1024、1024x1536、auto(默认:auto)", + "image_quality_help": "图像质量:low、medium、high、auto(默认:auto)", + "compression_level_jpeg_webp": "JPEG/WebP 格式的压缩级别 0-100(默认:未设置)", + "background_type_help": "背景类型:opaque、transparent(默认:opaque,仅适用于 PNG/WebP)", + "suppress_thinking_tags": "抑制包含在思考标签中的文本", + "start_tag_thinking_sections": "思考部分的开始标签", + "end_tag_thinking_sections": "思考部分的结束标签", + "disable_openai_responses_api": "禁用 OpenAI 响应 API(默认:false)", + "audio_video_file_transcribe": "要转录的音频或视频文件", + "model_for_transcription": "用于转录的模型(与聊天模型分离)", + "split_media_files_ffmpeg": "使用 ffmpeg 分割大于 25MB 的音频/视频文件", + "tts_voice_name": "支持模型的 TTS 语音名称(例如,Kore、Charon、Puck)", + "list_gemini_tts_voices": "列出所有可用的 Gemini TTS 语音", + "list_transcription_models": "列出所有可用的转录模型", + "send_desktop_notification": "命令完成时发送桌面通知", + "custom_notification_command": "用于通知的自定义命令(覆盖内置通知)", + "set_reasoning_thinking_level": "设置推理/思考级别(例如,off、low、medium、high,或 Anthropic 或 Google Gemini 的数字令牌)", + "set_debug_level": "设置调试级别(0=关闭,1=基本,2=详细,3=跟踪)", + "usage_header": "用法:", + "application_options_header": "应用程序选项:", + "help_options_header": "帮助选项:", + "help_message": "显示此帮助消息", + "options_placeholder": "[选项]", + "available_vendors_header": "可用供应商:", + "available_models_header": "可用模型", + "no_items_found": "没有 %s", + "no_description_available": "没有可用描述", + "i18n_download_failed": "下载语言 '%s' 的翻译失败: %v", + "i18n_load_failed": "加载翻译文件失败: %v" +} \ No newline at end of file