@tduncan / Cortana / commits / d506ec8

feat: add German language support

abdulmominsakib committed Aug 13, 2026 at 15:05 UTC d506ec8688c7c801198ede431a07186186391bf0
32 files changed +4670 -287
assets/images/flag_de.png
Binary files /dev/null and b/assets/images/flag_de.png differ
lib/core/widgets/crash_error_widget.dart
+11 -2
@@ -220,7 +220,12 @@ class CrashErrorWidget extends StatelessWidget {
220 } catch (e) {
221 if (messenger != null) {
222 messenger.showSnackBar(
223 - SnackBar(content: Text('Failed to open URL: $e')),
223 + SnackBar(
224 + content: Text(
225 + l10n?.failed_to_open_url(e.toString()) ??
226 + 'Failed to open URL: $e',
227 + ),
228 + ),
229 );
230 }
231 }
@@ -243,7 +248,11 @@ class CrashErrorWidget extends StatelessWidget {
248 } catch (e) {
249 if (messenger != null) {
250 messenger.showSnackBar(
246 - SnackBar(content: Text('Failed to copy: $e')),
251 + SnackBar(
252 + content: Text(
253 + l10n?.failed_to_copy(e.toString()) ?? 'Failed to copy: $e',
254 + ),
255 + ),
256 );
257 }
258 }
lib/features/cloud_sync/views/cloud_sync_screen.dart
+6 -1
@@ -81,8 +81,13 @@ class _CloudSyncScreenState extends ConsumerState<CloudSyncScreen> {
81 try {
82 await action();
83 if (mounted) {
84 + final l10n = AppLocalizations.of(context);
85 ScaffoldMessenger.of(context).showSnackBar(
85 - const SnackBar(content: Text('S3 connection succeeded.')),
86 + SnackBar(
87 + content: Text(
88 + l10n?.s3_connection_succeeded ?? 'S3 connection succeeded.',
89 + ),
90 + ),
91 );
92 }
93 } catch (error) {
lib/features/onboarding/screens/onboarding_language_screen.dart
+10
@@ -152,6 +152,16 @@ const _languages = [
152 shortText: 'Fr',
153 gradient: [Color(0xFF2563EB), Color(0xFF1D4ED8)],
154 ),
155 + _LanguageOption(
156 + code: 'de',
157 + nativeName: 'Deutsch',
158 + englishName: 'German',
159 + flag: '🇩🇪',
160 + flagAsset: 'assets/images/flag_de.png',
161 + countryCode: 'DE',
162 + shortText: 'De',
163 + gradient: [Color(0xFFF59E0B), Color(0xFFEF4444)],
164 + ),
165 ];
166
167 class OnboardingLanguageScreen extends ConsumerStatefulWidget {
lib/features/settings/views/settings_screen.dart
+14 -6
@@ -196,9 +196,8 @@ class SettingsViews extends ConsumerWidget {
196 .setTtsProcessMarkdown(value),
197 ),
198 _ToggleSetting(
199 - label: 'Concise Voice Mode Responses',
200 - description:
201 - 'Keep LLM responses brief (1 short paragraph) and ask follow-up questions in voice mode.',
199 + label: l10n.settings_concise_voice_responses,
200 + description: l10n.settings_concise_voice_responses_desc,
201 value: settings.conciseVoiceResponsesEnabled,
202 onChanged: (value) => ref
203 .read(settingsProvider.notifier)
@@ -678,11 +677,13 @@ class _AndroidAssistantSettingState
677 await service.openSettings();
678 }
679 await _refreshStatus();
681 - } on PlatformException {
680 + } on PlatformException catch (e) {
681 if (mounted) {
682 ScaffoldMessenger.of(context).showSnackBar(
683 SnackBar(
685 - content: Text(AppLocalizations.of(context)!.assistant_error),
684 + content: Text(
685 + AppLocalizations.of(context)!.assistant_error(e.toString()),
686 + ),
687 ),
688 );
689 }
@@ -1236,6 +1237,7 @@ class _LanguageSetting extends StatelessWidget {
1237 ('ru', 'Русский', 'assets/images/flag_ru.png', '🇷🇺'),
1238 ('tr', 'Türkçe', 'assets/images/flag_tr.png', '🇹🇷'),
1239 ('fr', 'Français', 'assets/images/flag_fr.png', '🇫🇷'),
1240 + ('de', 'Deutsch', 'assets/images/flag_de.png', '🇩🇪'),
1241 ];
1242
1243 final String? current;
@@ -2658,7 +2660,13 @@ Future<void> _openFeedbackIssue(BuildContext context) async {
2660 }
2661 } catch (e) {
2662 if (messenger != null) {
2661 - messenger.showSnackBar(SnackBar(content: Text('Failed to open URL: $e')));
2663 + messenger.showSnackBar(
2664 + SnackBar(
2665 + content: Text(
2666 + l10n?.failed_to_open_url(e.toString()) ?? 'Failed to open URL: $e',
2667 + ),
2668 + ),
2669 + );
2670 }
2671 }
2672 }
lib/l10n/app_ar.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "أدنى",
901 "reasoning_effort_xhigh": "عالي جداً",
902 "reasoning_effort_max": "أقصى",
903 - "reasoning_effort_off": "موقف"
903 + "reasoning_effort_off": "موقف",
904 + "settings_android_assistant": "مساعد أندرويد",
905 + "assistant_default_title": "المساعد الصوتي الافتراضي",
906 + "assistant_default_description": "تعيين Localmind كمساعد صوتي افتراضي للنظام على أندرويد.",
907 + "assistant_status_active": "Localmind محدد كمساعدك الافتراضي",
908 + "assistant_status_available": "يمكن تعيين Localmind كمساعدك الافتراضي",
909 + "assistant_status_manual": "افتح إعدادات النظام وحدد Localmind يدويًا",
910 + "assistant_status_unsupported": "إعداد المساعد الافتراضي متاح فقط على أندرويد 7.0+",
911 + "assistant_status_checking": "جاري التحقق من حالة المساعد…",
912 + "assistant_set_default": "تعيين المساعد الافتراضي",
913 + "assistant_open_settings": "فتح إعدادات المساعد",
914 + "assistant_error": "خطأ: {error}",
915 + "settings_concise_voice_responses": "إجابات وضع الصوت الموجزة",
916 + "settings_concise_voice_responses_desc": "اجعل ردود النموذج قصيرة (فقرة واحدة قصيرة) واطرح أسئلة متابعة في وضع الصوت.",
917 + "s3_connection_succeeded": "نجح الاتصال بـ S3.",
918 + "failed_to_open_url": "فشل فتح الرابط: {error}",
919 + "failed_to_copy": "فشل النسخ: {error}"
920 }
lib/l10n/app_bn.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "ন্যূনতম",
901 "reasoning_effort_xhigh": "অতিরিক্ত উচ্চ",
902 "reasoning_effort_max": "সর্বোচ্চ",
903 - "reasoning_effort_off": "বন্ধ"
903 + "reasoning_effort_off": "বন্ধ",
904 + "settings_android_assistant": "অ্যান্ড্রয়েড অ্যাসিস্ট্যান্ট",
905 + "assistant_default_title": "ডিফল্ট ভয়েস অ্যাসিস্ট্যান্ট",
906 + "assistant_default_description": "অ্যান্ড্রয়েডে Localmind-কে আপনার সিস্টেমের ডিফল্ট ভয়েস অ্যাসিস্ট্যান্ট হিসেবে সেট করুন।",
907 + "assistant_status_active": "Localmind আপনার ডিফল্ট অ্যাসিস্ট্যান্ট হিসেবে সেট করা আছে",
908 + "assistant_status_available": "Localmind-কে ডিফল্ট অ্যাসিস্ট্যান্ট হিসেবে সেট করা যাবে",
909 + "assistant_status_manual": "সিস্টেম সেটিংস খুলুন এবং ম্যানুয়ালি Localmind নির্বাচন করুন",
910 + "assistant_status_unsupported": "ডিফল্ট অ্যাসিস্ট্যান্ট সেটিংস কেবল অ্যান্ড্রয়েড 7.0+ এ সমর্থিত",
911 + "assistant_status_checking": "অ্যাসিস্ট্যান্ট স্ট্যাটাস পরীক্ষা করা হচ্ছে…",
912 + "assistant_set_default": "ডিফল্ট অ্যাসিস্ট্যান্ট সেট করুন",
913 + "assistant_open_settings": "অ্যাসিস্ট্যান্ট সেটিংস খুলুন",
914 + "assistant_error": "ত্রুটি: {error}",
915 + "settings_concise_voice_responses": "সংক্ষিপ্ত ভয়েস মোড উত্তর",
916 + "settings_concise_voice_responses_desc": "ভয়েস মোডে মডেলের উত্তর সংক্ষেপে (১টি ছোট অনুচ্ছেদ) রাখুন এবং ফলো-আপ প্রশ্ন করুন।",
917 + "s3_connection_succeeded": "S3 সংযোগ সফল হয়েছে।",
918 + "failed_to_open_url": "ইউআরএল খুলতে ব্যর্থ হয়েছে: {error}",
919 + "failed_to_copy": "কপি করতে ব্যর্থ হয়েছে: {error}"
920 }
lib/l10n/app_de.arb new
+917
@@ -0,0 +1,917 @@
1 +{
2 + "@@locale": "de",
3 + "app_name": "LocalMind",
4 + "app_tagline": "Ihre KI. Ihr Gerät. Ihre Regeln.",
5 + "app_version": "1.0.0",
6 + "cancel": "Abbrechen",
7 + "confirm": "Bestätigen",
8 + "delete": "Löschen",
9 + "save": "Speichern",
10 + "retry": "Wiederholen",
11 + "close": "Schließen",
12 + "done": "Fertig",
13 + "continue_action": "Weiter",
14 + "skip": "Überspringen",
15 + "install": "Installieren",
16 + "download": "Herunterladen",
17 + "resume": "Fortsetzen",
18 + "pause": "Pausieren",
19 + "stop": "Stoppen",
20 + "edit": "Bearbeiten",
21 + "preview": "Vorschau",
22 + "unload": "Entladen",
23 + "load": "Laden",
24 + "rename": "Umbenennen",
25 + "pin": "Anheften",
26 + "unpin": "Ablösen",
27 + "share": "Teilen",
28 + "copy": "Kopieren",
29 + "copied": "Kopiert!",
30 + "copied_to_clipboard": "In Zwischenablage kopiert",
31 + "select": "Select",
32 + "active": "Active",
33 + "all": "Alle",
34 + "none": "Keine",
35 + "none_selected": "None selected",
36 + "online": "Online",
37 + "connected": "Connected",
38 + "checking": "Checking",
39 + "offline": "Offline",
40 + "error": "Fehler",
41 + "unknown_error": "Unknown error",
42 + "not_now": "Not Now",
43 + "enable": "Enable",
44 + "proceed_anyway": "Proceed Anyway",
45 + "test_connection": "Verbindung testen",
46 + "testing": "Testing...",
47 + "connection_successful": "Verbindung erfolgreich!",
48 + "connection_failed": "Verbindung fehlgeschlagen. Überprüfen Sie Ihre Einstellungen.",
49 + "save_continue": "Speichern & Continue",
50 + "save_changes": "Speichern Changes",
51 + "finish_setup": "Finish Setup",
52 + "start_new_chat": "Start New Chat",
53 + "cannot_undo": "This action cannot be undone.",
54 + "ram_warning": "RAM Warnung",
55 + "recommended": "RECOMMENDED",
56 + "may_be_large": "May be too large for this device",
57 + "calculating": "Calculating...",
58 + "download_failed": "Download fehlgeschlagen",
59 + "downloaded": "Downloaded",
60 + "not_downloaded": "Not downloaded",
61 + "installed": "Installed",
62 + "not_installed": "Not installed",
63 + "loading": "Wird geladen…",
64 + "thinking": "Thinking",
65 + "processing": "Processing...",
66 + "initializing": "Initializing...",
67 + "ready": "Ready",
68 + "preparing_app": "Preparing app...",
69 + "initializing_services": "Initializing services...",
70 + "configuring_server": "Configuring server...",
71 + "startup_failed": "Startup failed",
72 + "something_went_wrong": "Something went wrong",
73 + "delete_model_title": "Modell löschen?",
74 + "delete_model_body": "Möchten Sie {name} wirklich löschen?",
75 + "delete_model_body_with_size": "Möchten Sie {name} wirklich löschen? Dadurch werden ca. {size} Speicherplatz freigegeben.\n\nSie können dieses Modell später bei Bedarf erneut herunterladen.",
76 + "delete_voice_title": "Löschen Voice",
77 + "delete_voice_body": "Möchten Sie wirklich löschen: {name}? This will free up approximately {size} of space.\n\nYou can download this voice again later if needed.",
78 + "delete_server_title": "Server löschen?",
79 + "delete_server_body": "Möchten Sie den Server \"{name}\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.",
80 + "delete_conversation_title": "Unterhaltung löschen?",
81 + "delete_conversation_body": "Möchten Sie \"{title}\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.",
82 + "delete_message_title": "Löschen message?",
83 + "delete_persona_title": "\"{name}\" löschen?",
84 + "delete_persona_body": "Dies kann nicht rückgängig gemacht werden.",
85 + "delete_builtin_persona_body": "This is a built-in persona. You can restore it later from Einstellungen.",
86 + "restore_builtin_personas": "Restore default personas",
87 + "restore_builtin_personas_desc": "Re-add any built-in personas you've deleted",
88 + "restore_builtin_personas_success": "Default personas restored",
89 + "clear_personas": "Clear personas",
90 + "enable_image_compression": "Compress images before sending",
91 + "enable_image_compression_desc": "Resize and compress attached images so uploads stay within server limits",
92 + "image_compression_level": "Compression aggressiveness",
93 + "image_compression_level_desc": "Higher aggressiveness produces smaller uploads at lower quality",
94 + "image_compression_level_low": "Low",
95 + "image_compression_level_medium": "Medium",
96 + "image_compression_level_high": "High",
97 + "sort_models_tooltip": "Sort models",
98 + "sort_by_favorites": "Favorites first",
99 + "sort_by_name": "Name (A-Z)",
100 + "sort_by_size_smallest": "Size (smallest first)",
101 + "sort_by_size_largest": "Size (largest first)",
102 + "sort_by_context_length": "Context length",
103 + "bulk_ai_rename_progress": "Renaming {done}/{total}...",
104 + "selected_count": "{count} ausgewählt",
105 + "ai_rename_tooltip": "Rename selected with AI",
106 + "new_chat_in_folder_tooltip": "New chat in this folder",
107 + "total_tokens_count": "{count} Tokens",
108 + "smart_replies_use_persona": "Use persona in smart replies",
109 + "smart_replies_use_persona_desc": "Suggested replies match the tone of the active persona instead of a generic assistant",
110 + "keep_persona_on_new_chat": "Keep persona on new chat",
111 + "keep_persona_on_new_chat_desc": "Don't clear the selected persona(s) after starting a new chat",
112 + "role_swap_button_enabled": "Show role-swap button",
113 + "role_swap_button_enabled_desc": "Show a button in the chat input to send your message as the assistant instead of the user, without generating a response",
114 + "send_as_user_tooltip": "Send as user",
115 + "send_as_assistant_tooltip": "Send as assistant (no response)",
116 + "insert_without_generating_tooltip": "Insert without generating",
117 + "token_usage_title": "Token Usage",
118 + "total_tokens_label": "Tokens used",
119 + "usage_percent_label": "Context used",
120 + "export_choice_title": "Export",
121 + "export_choice_body": "How would you like to export this?",
122 + "copy_to_clipboard": "Copy to Clipboard",
123 + "bulk_export_conversations_success": "Exported {count} conversations",
124 + "bulk_ai_rename_confirm_title": "Rename with AI?",
125 + "bulk_ai_rename_confirm_body": "This will ask the AI to generate a new title for each of the {count} selected conversations, replacing their current titles. This can take a while and cannot be undone.",
126 + "sort_by_modified_date": "Last modified",
127 + "sort_by_created_date": "Date created",
128 + "sort_title": "Sort",
129 + "clear_conversation_title": "Clear conversation?",
130 + "clear_conversation_body": "This will delete all messages in this conversation.",
131 + "clear": "Leeren",
132 + "label_completed": "{label} completed",
133 + "error_with_message": "Fehler: {error}",
134 + "preview_failed": "Vorschau fehlgeschlagen: {error}",
135 + "loading_model": "Lade {modelId}…",
136 + "model_loaded": "Modell geladen: {modelId} ({backend})",
137 + "no_model_loaded": "No model loaded. Tap \"Manage On-Device Modelle\" to download and load a model.",
138 + "loading_model_error": "Fehler: {error}",
139 + "delete_conversation": "Unterhaltung löschen",
140 + "nav_history": "History",
141 + "nav_servers": "Server",
142 + "nav_local_models": "Local Modelle",
143 + "nav_tts": "Sprachmodelle",
144 + "nav_personas": "Personas",
145 + "nav_settings": "Einstellungen",
146 + "nav_new_chat": "New Chat",
147 + "search_hint": "Suchen conversations...",
148 + "no_server_selected": "No server selected",
149 + "switch_server": "Switch Server",
150 + "switch_server_subtitle": "Choose a server to connect to",
151 + "manage_servers": "Manage Servers",
152 + "open_source": "Open Source",
153 + "open_source_desc": "LocalMind ist Open-Source-Software.",
154 + "star_on_github": "Star on GitHub",
155 + "add_more": "Hinzufügen more",
156 + "on_github": "on GitHub",
157 + "could_not_open_github": "GitHub konnte nicht geöffnet werden. Bitte versuchen Sie es später erneut.",
158 + "settings_title": "Einstellungen",
159 + "settings_appearance": "Erscheinungsbild",
160 + "settings_language": "Sprache",
161 + "language_system_default": "Systemstandard",
162 + "settings_tts": "Text-to-Speech (TTS)",
163 + "settings_android_assistant": "Android-Assistent",
164 + "assistant_default_title": "Standard-Sprachassistent",
165 + "assistant_default_description": "Legen Sie Localmind als Ihren Standard-Sprachassistenten auf Android fest.",
166 + "assistant_status_active": "Localmind ist als Standard-Assistent festgelegt",
167 + "assistant_status_available": "Localmind kann als Standard-Assistent festgelegt werden",
168 + "assistant_status_manual": "Öffnen Sie die Systemeinstellungen und wählen Sie Localmind manuell aus",
169 + "assistant_status_unsupported": "Die Standard-Assistenteneinstellung ist nur ab Android 7.0+ verfügbar",
170 + "assistant_status_checking": "Assistentenstatus wird überprüft…",
171 + "assistant_set_default": "Standard-Assistent festlegen",
172 + "assistant_open_settings": "Assistenteneinstellungen öffnen",
173 + "assistant_error": "Fehler: {error}",
174 + "settings_behavior": "Verhalten",
175 + "settings_on_device": "On-Device Inference",
176 + "settings_default_server": "Standardserver",
177 + "settings_default_persona": "Standard-Persona",
178 + "settings_default_model": "Standardmodell",
179 + "settings_default_model_desc": "Automatically selected when you start a new chat.",
180 + "settings_privacy": "Datenschutz & Daten",
181 + "settings_data_management": "Data Management",
182 + "settings_about": "Über LocalMind",
183 + "theme": "Theme",
184 + "theme_system": "System",
185 + "theme_light": "Light",
186 + "theme_dark": "Dark",
187 + "theme_claude": "Claude",
188 + "font_size": "Font Size",
189 + "font_size_desc": "Adjust text size in chat.",
190 + "font_preview": "The quick brown fox jumps over the lazy dog.",
191 + "code_theme_dark": "Code Theme (Dark)",
192 + "code_theme_light": "Code Theme (Light)",
193 + "code_theme_desc": "Choose syntax highlighting theme for code blocks.",
194 + "tts_engine": "TTS Engine",
195 + "tts_engine_system": "System TTS",
196 + "tts_engine_kitten": "Kitten TTS",
197 + "voice": "Voice",
198 + "voice_female": "Female",
199 + "voice_male": "Male",
200 + "voice_other": "Other",
201 + "tts_speed": "TTS Speed",
202 + "tts_speed_desc": "Adjust the playback rate.",
203 + "manage_tts_models": "Manage TTS Modelle",
204 + "manage_on_device_models": "Manage On-Device Modelle",
205 + "enable_smart_reply": "On-Device Smart Replies",
206 + "ai_user_response_enabled": "AI user message (hold send)",
207 + "ai_user_response_enabled_desc": "Hold the send button for 3 seconds to have the AI write and send your next message",
208 + "ai_user_response_tooltip": "Generate user message with AI",
209 + "streaming_responses": "Streaming Responses",
210 + "auto_generate_titles": "Auto-generate Titles",
211 + "send_on_enter": "Send on Enter",
212 + "show_system_messages": "Send Default System Prompt",
213 + "show_system_messages_desc": "When no persona is selected, send a default assistant system prompt with each request",
214 + "show_system_messages_in_chat": "Show System Messages in Chat",
215 + "show_system_messages_in_chat_desc": "Display system messages (e.g. from an imported backup) as visible bubbles in the conversation",
216 + "haptic_feedback": "Haptic Feedback",
217 + "enable_mcp": "Enable MCP",
218 + "new_chat_mcp_default": "New Chat MCP Default",
219 + "show_data_indicator": "Show Data Indicator",
220 + "privacy_info": "\"LocalMind never sees your data\"",
221 + "delete_all_conversations": "Löschen All Conversations",
222 + "reset_settings_defaults": "Reset Einstellungen to Defaults",
223 + "chat_title": "LocalMind",
224 + "chat_parameters_tooltip": "Chat Parameters",
225 + "change_persona": "Change Persona",
226 + "set_persona": "Set Persona",
227 + "remove_persona": "Entfernen Persona",
228 + "clear_conversation": "Clear Conversation",
229 + "connection_error": "Connection error. Check your server.",
230 + "disconnected": "Disconnected from server.",
231 + "configure": "Configure",
232 + "select_model": "Modell auswählen",
233 + "select_persona": "Persona auswählen",
234 + "manage_personas": "Manage personas",
235 + "personas_combine_hint": "Select multiple personas in chat to stack their system prompts.",
236 + "start_conversation": "Start a conversation",
237 + "recent_chats": "Recent chats",
238 + "see_all": "See all",
239 + "quick_write": "Help me write a function",
240 + "quick_explain": "Explain this code",
241 + "quick_debug": "Debug this for me",
242 + "quick_async": "How do I use async/await?",
243 + "history_missing_title": "History Missing",
244 + "history_missing_desc": "Either the messages in this chat were deleted or the history record is corrupted.",
245 + "technical_details": "Technical Details",
246 + "last_error": "Last Fehler:",
247 + "copy_info": "Copy Info",
248 + "conversation_id": "Conversation ID",
249 + "created_at": "Created At",
250 + "expected_messages": "Expected Messages",
251 + "debug_dialog_desc": "Diagnostic information to help identify synchronization issues.",
252 + "chat_input_hint": "Ask anything",
253 + "send_message_tooltip": "Send message",
254 + "stop_generation_tooltip": "Stop generation",
255 + "attach_images_tooltip": "Attach images or text",
256 + "start_listening_tooltip": "Start listening",
257 + "stop_listening_tooltip": "Stop listening",
258 + "tool_label": "Tool: {toolCallId}",
259 + "tool_unknown": "Tool: Unknown",
260 + "message_options": "Message options",
261 + "copy_markdown": "Copy as Markdown",
262 + "copied_markdown": "Copied as Markdown",
263 + "read_aloud": "Read Aloud",
264 + "stop_reading": "Stop Reading",
265 + "more": "More",
266 + "character_count": "{length} Zeichen",
267 + "edit_message": "Nachricht bearbeiten",
268 + "edit_message_desc": "Saving will remove the assistant response below and regenerate.",
269 + "save_regenerate": "Speichern & regenerate",
270 + "chat_settings_title": "Chat Einstellungen",
271 + "reset_defaults": "Reset Defaults",
272 + "parameters_tab": "Parameters",
273 + "mcp_tab": "MCP",
274 + "temperature": "Temperatur",
275 + "temperature_desc": "Controls randomness: Higher = Creative, Lower = Focused",
276 + "top_p": "Top P",
277 + "top_p_desc": "Nucleus sampling threshold",
278 + "max_tokens": "Max Tokens",
279 + "max_tokens_desc": "Response limit",
280 + "context_length": "Context Length",
281 + "context_length_desc": "History window",
282 + "mcp_disabled_warning": "MCP is disabled globally. Enable it in Einstellungen to use these features.",
283 + "mcp_enable_chat": "Enable MCP for this chat",
284 + "auto_execute_tools": "Auto-execute tools",
285 + "beta_label": "Beta",
286 + "experimental_label": "Experimental",
287 + "add_ephemeral_mcp": "Hinzufügen Ephemeral MCP Server",
288 + "mcp_label_placeholder": "Label",
289 + "mcp_url_placeholder": "URL (https://...)",
290 + "active_integrations": "Active Integrations",
291 + "import_mcp_json": "Import JSON",
292 + "import_mcp_json_dialog_title": "Import MCP Config JSON",
293 + "import_mcp_json_instructions": "Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:",
294 + "import_mcp_json_placeholder": "Paste mcpServers JSON or plugin list here...",
295 + "mcp_import_success": "{count} Integration(en) erfolgreich importiert",
296 + "mcp_import_failed": "No valid MCP integrations found in JSON",
297 + "enable_notifications": "Enable Notifications",
298 + "enable_notifications_desc": "Get notified when models finish downloading.",
299 + "chat_history_title": "Chat History",
300 + "conversation_just_now": "Just now",
301 + "conversation_minutes_ago": "{minutes}m ago",
302 + "conversation_hours_ago": "{hours}h ago",
303 + "conversation_yesterday": "Yesterday",
304 + "conversation_days_ago": "{days}d ago",
305 + "conversation_date": "{month}/{day}/{year}",
306 + "options_tooltip": "Options",
307 + "no_results_found": "No results found",
308 + "no_conversations_yet": "No conversations yet",
309 + "try_different_search": "Try a different search term",
310 + "start_new_conversation": "Start a new conversation",
311 + "rename_conversation": "Unterhaltung umbenennen",
312 + "enter_new_title": "Enter new title",
313 + "pinned_section": "PINNED",
314 + "today_section": "TODAY",
315 + "yesterday_section": "YESTERDAY",
316 + "previous_7_days": "PREVIOUS 7 DAYS",
317 + "previous_30_days": "PREVIOUS 30 DAYS",
318 + "older_section": "OLDER",
319 + "onboarding_choose_language": "Wählen Sie Ihre Sprache",
320 + "onboarding_choose_language_desc": "Sie können dies später jederzeit in den Einstellungen ändern.",
321 + "onboarding_localmind": "LOCALMIND",
322 + "onboarding_connect_server": "Connect Your\nServer",
323 + "onboarding_connect_desc": "Geben Sie die Verbindungsdetails für Ihren KI-Server ein.",
324 + "openai_compatible_api": "OpenAI-compatible API",
325 + "https_requires_ssl": "HTTPS requires SSL",
326 + "most_local_setups_use_http": "Most local setups use http://",
327 + "onboarding_welcome": "Willkommen bei LocalMind",
328 + "server_type_on_device": "Auf dem Gerät",
329 + "server_type_lm_studio": "LM Studio",
330 + "server_type_ollama": "Ollama",
331 + "server_type_ollama_cloud": "Ollama Cloud",
332 + "server_type_ollama_cloud_sub": "CLOUD MANAGED",
333 + "server_type_ollama_cloud_display": "Ollama Cloud",
334 + "server_address_ollama_cloud": "ollama.com",
335 + "ollama_cloud_disclosure": "By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama's managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.",
336 + "api_key_required_ollama_cloud": "API Key required for Ollama Cloud",
337 + "api_key_hint_ollama_cloud": "Paste your Ollama Cloud API key",
338 + "add_server_ollama_cloud_subtitle": "Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.",
339 + "add_server_openrouter_subtitle": "Connect through OpenRouter with a valid API key and keep this profile ready for model routing.",
340 + "add_server_endpoint_subtitle": "Configure a local or self-hosted endpoint, then verify the connection before saving.",
341 + "server_type_openrouter": "OpenRouter",
342 + "server_type_openrouter_sub": "UNIFIED CLOUD",
343 + "ready_continue": "BEREIT ZUM FORTFAHREN",
344 + "waiting_selection": "WAITING FOR SELECTION",
345 + "setup_connection": "Setup Connection",
346 + "setup_connection_desc": "Configure your {server} server to start chatting.",
347 + "server_name": "Servername",
348 + "name_required": "Name required",
349 + "name_max_50": "Max 50 characters",
350 + "host_label": "Host / IP Address",
351 + "host_required": "Host required",
352 + "port_label": "Port",
353 + "port_required": "Port required",
354 + "port_invalid": "Must be a number",
355 + "port_range": "Enter a valid port (1-65535)",
356 + "api_key_required": "API Key *",
357 + "api_key_optional": "API Key (Optional)",
358 + "api_key_required_openrouter": "API Key required for OpenRouter",
359 + "api_key_format": "OpenRouter API keys start with sk-",
360 + "my_server_hint": "My Server",
361 + "name_length_validation": "Name must be 50 characters or less",
362 + "host_valid": "Enter a valid hostname or IP address",
363 + "api_key_hint_openrouter": "sk-...",
364 + "api_key_hint_generic": "For authenticated servers",
365 + "update_server": "Update Server",
366 + "save_server": "Speichern Server",
367 + "server_updated": "Server updated",
368 + "server_added": "Server added",
369 + "download_model_title": "Download a Modell",
370 + "download_model_desc": "Choose a model to download.\nIt will run locally on your device.",
371 + "on_device_android_only": "On-device inference is currently available on Android only.",
372 + "total_ram": "Total RAM",
373 + "available": "Available",
374 + "ram_min_required": "{fileSize} GB RAM min",
375 + "download_progress": "{percent}% • {speed}",
376 + "eta_label": "ETA: {eta}",
377 + "paused_progress": "Paused - {percent}%",
378 + "ram_warning_body_download": "This model requires at least {ram} GB RAM, but your device has {totalMemory}. It may not run correctly or could cause the app to crash.",
379 + "ram_warning_body_load": "Your device has {availableRAM} available RAM, but this model recommends at least {ram} GB. Loading it might fail or cause instability.",
380 + "choose_theme": "Choose Theme",
381 + "choose_theme_desc": "Personalize the app appearance. You can always change this later in settings.",
382 + "theme_card_system": "System",
383 + "theme_card_system_sub": "Matches your device settings",
384 + "theme_card_light": "Light",
385 + "theme_card_light_sub": "Clean and bright",
386 + "theme_card_dark": "Dark",
387 + "theme_card_dark_sub": "Easy on the eyes",
388 + "theme_card_claude": "Claude",
389 + "theme_card_claude_sub": "A warm, peach-tinted theme",
390 + "stay_updated": "Stay Updated",
391 + "stay_updated_desc": "Get notified when your AI models finish downloading or when long-running tasks complete.",
392 + "notification_benefit_downloads": "Modell download progress",
393 + "notification_benefit_completions": "Generation completions",
394 + "notification_benefit_background": "Background tasks status",
395 + "allow_notifications": "Allow Notifications",
396 + "servers_title": "Servers",
397 + "no_servers_yet": "No Servers Yet",
398 + "no_servers_desc": "Hinzufügen your first server to start chatting with AI models.",
399 + "add_server": "Server hinzufügen",
400 + "switched_to_server": "Switched to {name}",
401 + "edit_server": "Server bearbeiten",
402 + "add_server_title": "Hinzufügen Server",
403 + "server_type_label": "Server Type",
404 + "server_icon_label": "Server Icon",
405 + "default_icon": "Default icon",
406 + "server_type_lm_studio_display": "LM Studio",
407 + "server_type_openai_display": "OpenAI Compatible",
408 + "server_type_ollama_display": "Ollama",
409 + "server_type_openrouter_display": "OpenRouter",
410 + "server_type_on_device_display": "On-Device",
411 + "server_address_openrouter": "openrouter.ai",
412 + "server_address_on_device": "Local inference",
413 + "server_address_format": "{host}:{port}",
414 + "default_badge": "Default",
415 + "set_as_default": "Set as Default",
416 + "select_icon": "Select Icon",
417 + "select_icon_desc": "Choose an icon for your server",
418 + "search_icons_hint": "Suchen icons...",
419 + "server_icon_stack": "Server Stack",
420 + "server_icon_stack2": "Server Stack 02",
421 + "server_icon_stack3": "Server Stack 03",
422 + "server_icon_cloud": "Cloud",
423 + "server_icon_cloud_server": "Cloud Server",
424 + "server_icon_mcp": "MCP Server",
425 + "server_icon_database": "Database",
426 + "server_icon_database1": "Database 01",
427 + "server_icon_database2": "Database 02",
428 + "server_icon_cpu": "CPU",
429 + "server_icon_chip": "Chip",
430 + "server_icon_chip2": "Chip 02",
431 + "server_icon_computer": "Computer",
432 + "server_icon_laptop": "Laptop",
433 + "server_icon_terminal": "Computer Terminal",
434 + "server_icon_code": "Code",
435 + "server_icon_ai_brain": "AI Brain",
436 + "server_icon_ai_brain2": "AI Brain 02",
437 + "server_icon_ai_cloud": "AI Cloud",
438 + "server_icon_ai_network": "AI Network",
439 + "server_icon_ai_chat": "AI Chat",
440 + "server_icon_cellular": "Cellular Network",
441 + "server_icon_plug1": "Plug 01",
442 + "server_icon_plug2": "Plug 02",
443 + "server_icon_bot": "Bot",
444 + "server_icon_bot2": "Bot 02",
445 + "server_icon_robotic": "Robotic",
446 + "server_icon_rocket": "Rocket",
447 + "server_icon_star": "Star",
448 + "server_icon_settings1": "Einstellungen 01",
449 + "server_icon_settings2": "Einstellungen 02",
450 + "server_icon_home1": "Home 01",
451 + "server_icon_home2": "Home 02",
452 + "server_icon_folder1": "Folder 01",
453 + "server_icon_folder2": "Folder 02",
454 + "server_icon_file1": "File 01",
455 + "server_icon_lock": "Lock",
456 + "server_icon_key": "Key 01",
457 + "server_icon_link": "Link 01",
458 + "server_icon_globe": "Globe",
459 + "server_icon_api": "API",
460 + "server_icon_arrow_right": "Arrow Right 01",
461 + "server_icon_check": "Check Circle",
462 + "server_icon_alert": "Alert Circle",
463 + "server_icon_info": "Info Circle",
464 + "server_icon_zap": "Zap",
465 + "server_icon_cloud_upload": "Cloud Upload",
466 + "server_icon_cloud_download": "Cloud Download",
467 + "server_icon_refresh": "Refresh",
468 + "server_icon_hard_drive": "Hard Drive",
469 + "server_icon_drive": "Drive",
470 + "personas_title": "Personas",
471 + "persona_category_general": "Allgemein",
472 + "persona_category_coding": "Coding",
473 + "persona_category_education": "Education",
474 + "persona_category_creative": "Creative",
475 + "persona_builtin_section": "BUILT-IN",
476 + "persona_my_section": "MY PERSONAS",
477 + "clone_edit": "Clone & Bearbeiten",
478 + "builtin_badge": "Built-in",
479 + "no_personas_found": "No personas found",
480 + "no_personas_desc": "Create your first persona to customize AI behavior.",
481 + "edit_persona": "Persona bearbeiten",
482 + "create_persona": "Persona erstellen",
483 + "create_persona_button": "Create",
484 + "emoji_label": "Emoji",
485 + "name_label": "Name",
486 + "my_persona_hint": "My Persona",
487 + "category_label": "Category",
488 + "description_optional": "Description (optional)",
489 + "description_hint": "What this persona does...",
490 + "system_prompt": "System-Prompt",
491 + "character_count_max": "{currentLen}/4000",
492 + "no_prompt_placeholder": "No prompt yet...",
493 + "prompt_hint": "You are a helpful assistant...",
494 + "prompt_required": "System prompt is required",
495 + "prompt_max_chars": "Max 4000 characters",
496 + "advanced_settings": "Erweitert Einstellungen",
497 + "temperature_label": "Temperature (0.0-2.0)",
498 + "top_p_label": "Top P (0.0-1.0)",
499 + "temp_hint": "0.7",
500 + "top_p_hint": "0.9",
501 + "range_0_2": "0.0-2.0",
502 + "range_0_1": "0.0-1.0",
503 + "persona_updated": "Persona updated",
504 + "persona_created": "Persona created",
505 + "tts_models_title": "Text To Speech Modelle",
506 + "always_available": "Always available",
507 + "tts_system_desc": "Uses your device's built-in text-to-speech engine.\nNo downloads required. Voice selection uses your device's system settings.",
508 + "downloading_status": "Downloading...",
509 + "tts_kitten_desc": "Lightning-fast neural TTS with 8 expressive voices.\nRequires {size} download.",
510 + "tts_piper_desc": "Fast offline Piper voices with 2 expressive voices.\nRequires {size} download per voice.",
511 + "engine_spec": "{sizeMb} MB · {ramMb} MB RAM · {voiceCount} voices",
512 + "on_device_models_title": "On-Device Modelle",
513 + "settings_huggingface_token": "Hugging Face Token (Optional)",
514 + "settings_huggingface_token_desc": "Required only for gated models (e.g. Gemma). Get a token at huggingface.co/settings/tokens.",
515 + "settings_huggingface_token_set": "Token saved",
516 + "settings_huggingface_token_cleared": "Token cleared",
517 + "model_requires_huggingface_token": "Requires a Hugging Face token",
518 + "model_missing_huggingface_token": "This model is gated on Hugging Face. Hinzufügen a token in Einstellungen → On-Device Inference to download it.",
519 + "set_huggingface_token": "Set token",
520 + "clear_huggingface_token": "Clear",
521 + "edit_huggingface_token_dialog_title": "Hugging Face Access Token",
522 + "huggingface_token_dialog_hint": "hf_…",
523 + "server_type_ollama_desc": "Lokal auf Ihrem Computer oder im Netzwerk ausgeführt",
524 + "server_type_on_device_desc": "Modelle direkt auf diesem Gerät ausführen",
525 + "server_type_lm_studio_desc": "Verbindung zur lokalen LM Studio Entwickler-API",
526 + "available_models": "Available Modelle",
527 + "device_memory": "Device Memory",
528 + "ram_usage": "RAM Usage",
529 + "memory_healthy": "Healthy",
530 + "memory_critical": "Critical",
531 + "memory_low": "Low",
532 + "ram_used": "{percent}% used",
533 + "available_ram": "Available RAM",
534 + "total_capacity": "Total Capacity",
535 + "loaded_status": "Loaded",
536 + "inference_backend": "Inference Backend",
537 + "backend_ios_notice": "Only CPU backend is available on iOS.",
538 + "backend_cpu_desc": "Works on all devices. Most compatible.",
539 + "backend_gpu_desc": "OpenCL acceleration. Faster on supported devices.",
540 + "backend_npu_desc": "Vendor NPU (Qualcomm/MediaTek). Fastest inference.",
541 + "select_model_title": "Select Modell",
542 + "refresh_models": "Refresh models",
543 + "search_models_hint": "Suchen models...",
544 + "no_server_connected": "No server connected",
545 + "add_server_first": "Hinzufügen a server first to see available models.",
546 + "failed_load_models": "Fehlgeschlagen beim load models",
547 + "no_models_available": "Keine Modelle verfügbar",
548 + "no_models_match": "No models match \"{searchQuery}\"",
549 + "model_load_failed": "Fehlgeschlagen beim load model: {error}",
550 + "model_unloaded_ollama": "Unload requested for {name}. If Ollama is reachable, the model is released immediately.",
551 + "model_unloaded_success": "{name} unloaded successfully",
552 + "model_unload_failed": "Fehlgeschlagen beim unload model: {error}",
553 + "unload_from_server": "Unload from server",
554 + "context_chip": "{ctx} ctx",
555 + "unload_all_models": "Unload all",
556 + "loaded_models_count": "{count} loaded",
557 + "all_models_unloaded": "All models unloaded",
558 + "branch_chat": "Branch chat",
559 + "branch_chat_desc": "Start a new conversation from this message",
560 + "edit_assistant_message_desc": "Bearbeiten the assistant response text.",
561 + "switch_to_model": "Switch to {modelName}",
562 + "download_notification_title": "Downloading {modelName}...",
563 + "download_complete_notification": "Download abgeschlossen!",
564 + "download_complete_body": "{modelName} has been downloaded successfully.",
565 + "download_failed_notification": "Download fehlgeschlagen: {error}",
566 + "download_failed_body": "Fehlgeschlagen beim download {modelName}.",
567 + "engine_name_system": "System TTS",
568 + "engine_tagline_system": "Built-in device engine",
569 + "engine_name_kitten": "Kitten TTS",
570 + "engine_tagline_kitten": "High-speed neural TTS",
571 + "engine_name_sherpa": "Sherpa ONNX VITS",
572 + "engine_tagline_sherpa": "Offline Piper voices",
573 + "voice_jasper": "Jasper",
574 + "voice_bella": "Bella",
575 + "voice_bruno": "Bruno",
576 + "voice_luna": "Luna",
577 + "voice_hugo": "Hugo",
578 + "voice_rosie": "Rosie",
579 + "voice_leo": "Leo",
580 + "voice_kiki": "Kiki",
581 + "voice_lessac": "Lessac (US)",
582 + "voice_ryan": "Ryan (US)",
583 + "model_qwen_3": "Qwen 3 0.6B",
584 + "model_qwen_3_desc": "Smallest general-purpose chat model. Fast responses, low memory usage.",
585 + "model_license_apache": "Apache-2.0",
586 + "model_qwen_25": "Qwen 2.5 1.5B Instruct",
587 + "model_qwen_25_desc": "Balanced quality and size. Good for general conversation.",
588 + "model_deepseek": "DeepSeek R1 Distill Qwen 1.5B",
589 + "model_deepseek_desc": "Reasoning and chain-of-thought model. Best for logical tasks.",
590 + "model_license_mit": "MIT",
591 + "model_gemma": "Gemma 4 E2B Instruct",
592 + "model_gemma_desc": "Google flagship model. Highest quality, requires more RAM.",
593 + "export_header": "*Exported from LocalMind — {date}*",
594 + "export_role_user": "## 👤 User",
595 + "export_role_assistant": "## 🤖 Assistant",
596 + "export_role_system": "## ⚙️ System",
597 + "export_role_tool": "## 🔧 Tool",
598 + "export_text_user": "[USER]",
599 + "export_text_assistant": "[ASSISTANT]",
600 + "export_text_system": "[SYSTEM]",
601 + "export_text_tool": "[TOOL]",
602 + "export_label_user": "USER",
603 + "export_label_assistant": "ASSISTANT",
604 + "export_label_system": "SYSTEM",
605 + "export_label_tool": "TOOL",
606 + "select_model_hint": "Wählen Sie ein Modell to start chatting",
607 + "test_notification_title": "Test notification",
608 + "test_notification_body": "This is a test notification for model download progress.",
609 + "tts_supports_background": "Supports background playback as native audio",
610 + "tts_other_services_background_note": "Note: The other TTS services support background playback as native audio.",
611 + "gguf_imported_models_title": "Imported GGUF models",
612 + "gguf_imported_models_empty_subtitle": "Import a GGUF from your device or add one from Hugging Face. Imported models run locally with llama.cpp.",
613 + "gguf_imported_models_ready": "imported models ready for local inference.",
614 + "gguf_curated_models_subtitle": "Curated on-device models you can download and manage inside LocalMind.",
615 + "gguf_only_supported": "Only GGUF models are supported for this import.",
616 + "gguf_imported_from_local_file": "imported from local file.",
617 + "gguf_import_failed": "Fehlgeschlagen beim import GGUF model",
618 + "gguf_imported_from_huggingface": "imported from Hugging Face.",
619 + "gguf_import_canceled": "GGUF import canceled.",
620 + "gguf_enter_huggingface_url": "Enter a Hugging Face GGUF URL.",
621 + "gguf_only_official_huggingface_urls": "Only official Hugging Face GGUF URLs are supported.",
622 + "gguf_use_https_url": "Use an HTTPS Hugging Face URL for GGUF import.",
623 + "gguf_url_must_point_to_file": "The Hugging Face URL must point directly to a .gguf file.",
624 + "gguf_unable_to_detect_file_name": "Unable to determine the GGUF file name.",
625 + "gguf_download_empty": "The downloaded GGUF file was empty or missing.",
626 + "gguf_selected_file_missing": "Selected model file does not exist.",
627 + "gguf_import_action": "Import GGUF",
628 + "gguf_overview_title": "Bring your own GGUF models",
629 + "gguf_overview_subtitle": "Import a .gguf from local storage or download one straight from Hugging Face. Imported models stay on this device and load with llama.cpp.",
630 + "gguf_imported_count_label": "imported",
631 + "gguf_local_files_label": "local files",
632 + "gguf_huggingface_label": "Hugging Face",
633 + "gguf_import_local_title": "Import local GGUF",
634 + "gguf_import_local_subtitle": "Copy a .gguf file from this device",
635 + "gguf_import_huggingface_title": "Import from Hugging Face",
636 + "gguf_import_huggingface_subtitle": "Paste a GGUF URL or repo path",
637 + "gguf_no_imported_title": "No imported GGUF models yet",
638 + "gguf_no_imported_subtitle": "You can bring your own GGUF file from device storage or paste a Hugging Face URL or repo path that points to a .gguf file.",
639 + "gguf_import_huggingface_dialog_title": "Import GGUF from Hugging Face",
640 + "gguf_import_huggingface_dialog_subtitle": "Paste a direct GGUF URL or a Hugging Face repo path like `owner/repo/blob/main/model.gguf`. Blob links are converted automatically.",
641 + "gguf_url_or_repo_path": "GGUF URL or repo path",
642 + "paste": "Paste",
643 + "gguf_browse": "Browse GGUFs",
644 + "gguf_huggingface_token_ready": "Hugging Face token ready",
645 + "gguf_huggingface_token_optional": "Token optional but recommended",
646 + "gguf_huggingface_token_ready_desc": "Your saved token will be used automatically for gated or private repositories.",
647 + "gguf_huggingface_token_optional_desc": "Requires a Hugging Face token. Hinzufügen one in Einstellungen if this GGUF is gated or private.",
648 + "gguf_downloading": "Downloading GGUF",
649 + "gguf_preparing": "Preparing",
650 + "gguf_preparing_download": "Preparing download...",
651 + "gguf_cancel_import": "Abbrechen import",
652 + "clipboard_empty": "Clipboard is empty.",
653 + "could_not_open_huggingface": "Could not open Hugging Face.",
654 + "gguf_paste_url_error": "Paste a Hugging Face GGUF URL or repo path.",
655 + "gguf_blob_link": "Blob link",
656 + "gguf_repository_label": "Repository",
657 + "gguf_detected_path_label": "Detected path",
658 + "gguf_imported_section_label": "Imported GGUF",
659 + "gguf_already_available": "Already available on this device",
660 + "gguf_curated_models_short": "Curated on-device models",
661 + "execute_tool_title": "Execute Tool",
662 + "execute_tool_request_desc": "The model is requesting to execute the following tool:",
663 + "reject": "Reject",
664 + "approve": "Approve",
665 + "server_type_help": "Pick the provider before filling connection details.",
666 + "server_identity_title": "Identity",
667 + "server_identity_desc": "Name this server and choose how it appears in the list.",
668 + "server_connection_title": "Connection",
669 + "server_connection_desc": "Use the address and port exposed by your server.",
670 + "server_authentication_title": "Authentication",
671 + "server_authentication_required_desc": "OpenRouter requires an API key before testing.",
672 + "server_authentication_optional_desc": "Leave the API key empty if this server does not require one.",
673 + "mcp_tools_title": "MCP Tools",
674 + "available_tools": "Available tools",
675 + "unable_load_tools": "Unable to load tools",
676 + "no_tools_registered": "No tools registered",
677 + "no_tools_registered_desc": "Enable the example MCP server or add MCP integrations from chat settings.",
678 + "example_mcp_server_title": "Example MCP server",
679 + "example_mcp_server_desc": "Registers example.echo and example.word_count through the same MCP tool provider used by external servers.",
680 + "disable_example_server": "Disable example server",
681 + "enable_example_server": "Enable example server",
682 + "built_in_label": "Built-in",
683 + "highlights_label": "Highlights",
684 + "built_with_label": "Built with",
685 + "local_label": "Local",
686 + "gguf_format_label": "GGUF",
687 + "tool_status_requested": "Requested",
688 + "tool_status_approved": "Approved",
689 + "tool_status_rejected": "Rejected",
690 + "tool_status_running": "Running",
691 + "tool_status_done": "Done",
692 + "tool_status_failed": "Fehlgeschlagen",
693 + "model_favorite_toggle": "Toggle favorite",
694 + "model_set_default": "Set as default model",
695 + "model_clear_default": "Entfernen as default model",
696 + "model_default_badge": "Default",
697 + "model_note_label": "Note",
698 + "model_note_hint": "Hinzufügen a note about this model…",
699 + "unload_models_before_load": "Unload all models before loading a new one",
700 + "temp_chat_keyboard_incognito": "Incognito keyboard in temporary chat",
701 + "temp_chat_keyboard_incognito_desc": "Disables keyboard learning and suggestions in temporary chats (e.g. SwiftKey incognito).",
702 + "resume_last_chat": "Resume last chat on launch",
703 + "resume_last_chat_desc": "Restore your last open conversation when reopening the app.",
704 + "export_all_data": "Export all data",
705 + "import_all_data": "Import all data",
706 + "export_data_success": "Backup exported successfully",
707 + "import_data_success": "Backup imported successfully",
708 + "import_data_failed": "Fehlgeschlagen beim import backup: {error}",
709 + "import_data_confirm": "Import conversations and custom personas from this backup? Existing items with the same IDs will be updated.",
710 + "import_settings_confirm": "Replace current settings with the imported backup?",
711 + "export_conversations": "Export conversations",
712 + "import_conversations": "Import conversations",
713 + "export_personas": "Export personas",
714 + "import_personas": "Import personas",
715 + "export_settings": "Export settings",
716 + "import_settings": "Import settings",
717 + "export_all_zip": "Export all (ZIP)",
718 + "import_all_zip": "Import all (ZIP)",
719 + "duplicate_chat": "Duplicate chat",
720 + "duplicate_chat_success": "Chat duplicated",
721 + "move_to_folder": "Move to folder",
722 + "remove_from_folder": "Entfernen from folder",
723 + "create_folder": "Create folder",
724 + "new_folder": "New folder",
725 + "folder_name_hint": "Folder name",
726 + "all_chats": "All",
727 + "unfiled_chats": "Unfiled",
728 + "create": "Create",
729 + "server_path_prefix_label": "API path prefix",
730 + "server_path_prefix_hint": "/your-secret-token",
731 + "search_message_contents": "Suchen message contents",
732 + "message_search_results": "Message matches",
733 + "saved_messages_title": "Saved Messages",
734 + "nav_saved_messages": "Saved Messages",
735 + "saved_messages_empty": "No saved messages yet. Bookmark a message from its options menu.",
736 + "save_message": "Nachricht speichern",
737 + "message_saved": "Message saved",
738 + "token_count": "{count} tokens",
739 + "estimated_token_count": "~{count} tokens (estimated)",
740 + "test_tts_section_title": "Test voice",
741 + "test_tts_hint": "Enter text to hear the current TTS engine…",
742 + "test_speak_button": "Speak",
743 + "scroll_to_bottom": "Scroll to bottom",
744 + "generate_ai_response": "Generate AI response",
745 + "no_response": "No response",
746 + "export": "Export",
747 + "import": "Import",
748 + "conversations_label": "Conversations",
749 + "personas_label": "Personas",
750 + "settings_label": "Einstellungen",
751 + "export_conversation": "Export conversation",
752 + "tts_process_markdown": "Process markdown for speech",
753 + "tts_process_markdown_desc": "Strip formatting like **bold** before reading aloud",
754 + "tts_skip_seconds": "Skip interval",
755 + "tts_skip_seconds_desc": "Forward and rewind jump size during playback",
756 + "tts_skip_seconds_value": "{seconds}s",
757 + "preview_system_prompts": "Preview system prompts",
758 + "welcome_message_1": "What can I help you with today?",
759 + "welcome_message_2": "Ask me anything — I'm ready when you are.",
760 + "welcome_message_3": "Your data is processed locally and never leaves your device.",
761 + "welcome_message_4": "Need ideas? Try one of the quick prompts.",
762 + "temporary_chat": "Temporary chat",
763 + "temporary_chat_desc": "Chats aren't saved to history.",
764 + "temporary_chat_banner": "Temporary chat — not saved to history",
765 + "temporary_chat_save_warning_title": "Speichern message in temporary chat?",
766 + "temporary_chat_save_warning_body": "This chat is temporary and hidden from history. The saved message will still appear in Saved Messages.",
767 + "save_to_history": "Speichern to history",
768 + "share_conversation": "Share conversation",
769 + "download_tts_audio": "Download audio",
770 + "tts_download_unavailable": "Download is only available for Piper and Kitten TTS",
771 + "tts_download_no_audio": "No audio available to download yet",
772 + "tts_download_success": "Audio saved",
773 + "return_to_chat": "Return to chat",
774 + "return_to_temp_chat": "Return to temporary chat",
775 + "insert_saved_message": "Insert saved message",
776 + "insert_saved_message_desc": "Choose a saved message to add to your input",
777 + "model_info": "Modell info",
778 + "model_name": "Modell name",
779 + "model_identifier": "Identifier",
780 + "model_capabilities": "Capabilities",
781 + "model_api_pricing": "API pricing (per 1M tokens)",
782 + "not_available": "Not available",
783 + "save_message_folders": "Speichern message",
784 + "remove_from_saved": "Entfernen from saved",
785 + "message_already_saved": "Saved",
786 + "stream_ttft": "Time to first token",
787 + "stream_tokens_per_sec": "Tokens per second",
788 + "stream_stop_reason": "Stop reason",
789 + "stream_input_tokens": "Input tokens",
790 + "stream_output_tokens": "Output tokens",
791 + "stream_generation_time": "Generation time",
792 + "attach_image": "Photos",
793 + "attach_text_document": "Documents",
794 + "attach_shortcut_images": "Photos",
795 + "attach_shortcut_documents": "Files",
796 + "attach_shortcut_saved": "Saved",
797 + "add_attachment": "Hinzufügen attachment",
798 + "add_to_chat": "Hinzufügen to chat",
799 + "choose_what_to_attach": "What would you like to add?",
800 + "choose_attachment_subtitle": "Pick a source to attach to your message",
801 + "photo_permission_denied": "Photo access is required to attach images",
802 + "select_model_prompt": "Select model",
803 + "characters_label": "Characters",
804 + "exit_temporary_chat_title": "Exit temporary chat?",
805 + "exit_temporary_chat_body": "This will discard the current temporary chat and return to a new chat.",
806 + "saved_message_temp_snap_unavailable": "This message was saved from a temporary chat and can't be opened in its original conversation.",
807 + "filter_title": "Filter",
808 + "filter_pinned": "Pinned",
809 + "filter_archived": "Archived",
810 + "filter_temp_chats": "Temporary chats",
811 + "filter_user_messages": "User messages",
812 + "filter_assistant_messages": "Assistant messages",
813 + "archive_chat": "Archive",
814 + "unarchive_chat": "Unarchive",
815 + "conversation_message_count": "{count, plural, one{1 message} other{{count} messages}}",
816 + "conversation_character_count": "{count} chars",
817 + "generate_title_with_ai": "Generate with AI",
818 + "generating_title": "Generating...",
819 + "generate_title_failed": "Could not generate a title",
820 + "lm_studio_model_browser_title": "Browse models",
821 + "lm_studio_model_search_hint": "Suchen models by name or author…",
822 + "lm_studio_staff_picks": "Staff picks",
823 + "lm_studio_community_models": "Community models",
824 + "lm_studio_no_models": "Keine Modelle gefunden",
825 + "lm_studio_models_count": "{count} models",
826 + "lm_studio_browse_models": "Browse & download",
827 + "lm_studio_model_search": "LMS Modell Suchen",
828 + "lm_studio_downloads_title": "Downloads",
829 + "lm_studio_choose_quant": "Choose a download option",
830 + "lm_studio_use_default_quant": "Use default",
831 + "lm_studio_recommended": "Recommended",
832 + "lm_studio_clear_downloads": "Clear finished",
833 + "lm_studio_no_downloads": "No downloads yet",
834 + "lm_studio_downloads_disclaimer": "Downloads run on the LM Studio host. Pausing, stopping, and deleting models must be done on that computer — not from this app.",
835 + "lm_studio_staff_pick": "Staff pick",
836 + "lm_studio_params": "PARAMS",
837 + "lm_studio_arch": "ARCH",
838 + "lm_studio_domain": "DOMAIN",
839 + "lm_studio_format": "FORMAT",
840 + "lm_studio_vision": "Vision",
841 + "lm_studio_tool_use": "Tool use",
842 + "lm_studio_reasoning": "Reasoning",
843 + "openrouter_pricing_free": "Free",
844 + "openrouter_pricing_tooltip": "Input {input} / Output {output} per 1M tokens",
845 + "lm_studio_download_options": "Download options",
846 + "lm_studio_download": "Download",
847 + "lm_studio_download_size": "Download {size}",
848 + "lm_studio_downloading_percent": "Downloading {percent}%",
849 + "lm_studio_readme_unavailable": "README not available for this model.",
850 + "lm_studio_full_gpu_offload": "Full GPU offload possible",
851 + "lm_studio_partial_gpu_offload": "Partial GPU offload possible",
852 + "lm_studio_likely_too_large": "Likely too large",
853 + "lm_studio_available_ram_gb": "Available RAM (GB, optional)",
854 + "lm_studio_available_vram_gb": "Available VRAM (GB, optional)",
855 + "lm_studio_memory_settings_title": "Memory for recommendations",
856 + "lm_studio_memory_settings_desc": "Used to estimate whether models fit on your machine in the model browser.",
857 + "think_button_label": "Think",
858 + "thinking_mode_title": "Thinking mode",
859 + "reasoning_effort_low": "Low",
860 + "reasoning_effort_medium": "Medium",
861 + "reasoning_effort_high": "High",
862 + "reasoning_effort_minimal": "Minimal",
863 + "reasoning_effort_xhigh": "X-High",
864 + "reasoning_effort_max": "Max",
865 + "reasoning_effort_off": "Off",
866 + "could_not_read_file": "Could not read file",
867 + "server_offline": "Server Offline",
868 + "could_not_establish_connection": "Could not establish a connection to the server. Please check if your server is running and the host/port settings are correct.",
869 + "retry_connection": "Retry Connection",
870 + "tokens_label": "Tokens",
871 + "enter_context_length": "Enter context length...",
872 + "openrouter_disclosure": "By connecting this provider, your chat messages and inputs will be sent to their servers. LocalMind does not track or store your conversations.",
873 + "welcome_message_cloud": "Your messages are sent to your connected provider.",
874 + "privacy_policy": "Privacy Policy",
875 + "cloud_sync": "S3 Cloud Sync",
876 + "cloud_sync_description": "End-to-end encrypted sync to your own S3-compatible server",
877 + "cloud_sync_endpoint": "Endpoint URL",
878 + "cloud_sync_bucket": "Bucket",
879 + "cloud_sync_region": "Region",
880 + "cloud_sync_prefix": "Prefix",
881 + "cloud_sync_access_key": "Access key ID",
882 + "cloud_sync_secret_key": "Secret access key",
883 + "cloud_sync_session_token": "Session token (optional)",
884 + "cloud_sync_passphrase": "Encryption passphrase",
885 + "cloud_sync_confirm_passphrase": "Confirm passphrase",
886 + "cloud_sync_path_style": "Use path-style addressing",
887 + "cloud_sync_allow_http": "Allow insecure HTTP",
888 + "cloud_sync_http_warning": "HTTP exposes request metadata and credentials to the network. Use it only for a trusted local S3 server.",
889 + "cloud_sync_test": "Test connection",
890 + "cloud_sync_enable": "Enable encrypted sync",
891 + "cloud_sync_now": "Sync now",
892 + "cloud_sync_disconnect": "Disconnect this device",
893 + "cloud_sync_last_synced": "Last synced",
894 + "cloud_sync_never": "Never",
895 + "cloud_sync_conflicts": "Conflicts preserved",
896 + "cloud_sync_passphrase_mismatch": "Passphrases do not match",
897 + "crash_report_title": "Something went wrong",
898 + "crash_report_stack_trace": "Stack trace",
899 + "crash_report_tap_to_expand": "Tap to expand",
900 + "crash_report_button": "Report this crash",
901 + "crash_try_again": "Try again",
902 + "crash_report_empty_stack": "<empty>",
903 + "crash_report_disclaimer": "Reporting opens GitHub with diagnostics prefilled. You stay in control — nothing is submitted automatically. Please review and remove any sensitive content before submitting.",
904 + "crash_report_copied": "In Zwischenablage kopiert",
905 + "report_a_problem": "Problem melden",
906 + "rename_folder": "Ordner umbenennen",
907 + "delete_folder": "Ordner löschen",
908 + "delete_folder_title": "Ordner löschen?",
909 + "delete_folder_body": "Möchten Sie den Ordner \"{name}\" wirklich löschen? Enthaltene Unterhaltungen oder gespeicherte Nachrichten werden nach \"Unsortiert\" verschoben. Dies kann nicht rückgängig gemacht werden.",
910 + "folder_name_required": "Bitte geben Sie einen Ordnernamen ein",
911 + "model_required_toast": "Sie müssen zuerst ein Modell auswählen",
912 + "settings_concise_voice_responses": "Prägnante Sprachmodus-Antworten",
913 + "settings_concise_voice_responses_desc": "Halten Sie LLM-Antworten im Sprachmodus kurz (1 kurzer Absatz) und stellen Sie Nachfragen.",
914 + "s3_connection_succeeded": "S3-Verbindung erfolgreich.",
915 + "failed_to_open_url": "URL konnte nicht geöffnet werden: {error}",
916 + "failed_to_copy": "Kopieren fehlgeschlagen: {error}"
917 +}
lib/l10n/app_en.arb
+32
@@ -3285,5 +3285,37 @@
3285 "model_required_toast": "You need to select a model first",
3286 "@model_required_toast": {
3287 "description": "Toast shown when the user tries to send a message but no model is selected"
3288 + },
3289 + "settings_concise_voice_responses": "Concise Voice Mode Responses",
3290 + "@settings_concise_voice_responses": {
3291 + "description": "Label for concise voice responses toggle"
3292 + },
3293 + "settings_concise_voice_responses_desc": "Keep LLM responses brief (1 short paragraph) and ask follow-up questions in voice mode.",
3294 + "@settings_concise_voice_responses_desc": {
3295 + "description": "Description for concise voice responses toggle"
3296 + },
3297 + "s3_connection_succeeded": "S3 connection succeeded.",
3298 + "@s3_connection_succeeded": {
3299 + "description": "Toast message when S3 connection succeeds"
3300 + },
3301 + "failed_to_open_url": "Failed to open URL: {error}",
3302 + "@failed_to_open_url": {
3303 + "description": "Error message when opening a URL fails",
3304 + "placeholders": {
3305 + "error": {
3306 + "type": "String",
3307 + "example": "Could not launch URL"
3308 + }
3309 + }
3310 + },
3311 + "failed_to_copy": "Failed to copy: {error}",
3312 + "@failed_to_copy": {
3313 + "description": "Error message when copying text fails",
3314 + "placeholders": {
3315 + "error": {
3316 + "type": "String",
3317 + "example": "Permission denied"
3318 + }
3319 + }
3320 }
3321 }
lib/l10n/app_es.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "Mínimo",
901 "reasoning_effort_xhigh": "Muy alto",
902 "reasoning_effort_max": "Máximo",
903 - "reasoning_effort_off": "Desactivado"
903 + "reasoning_effort_off": "Desactivado",
904 + "settings_android_assistant": "Asistente de Android",
905 + "assistant_default_title": "Asistente de voz predeterminado",
906 + "assistant_default_description": "Establece Localmind como tu asistente de voz predeterminado en Android.",
907 + "assistant_status_active": "Localmind está configurado como tu asistente predeterminado",
908 + "assistant_status_available": "Localmind se puede configurar como tu asistente predeterminado",
909 + "assistant_status_manual": "Abre los ajustes del sistema y selecciona Localmind manualmente",
910 + "assistant_status_unsupported": "El asistente predeterminado solo está disponible en Android 7.0 o superior",
911 + "assistant_status_checking": "Comprobando el estado del asistente…",
912 + "assistant_set_default": "Establecer asistente predeterminado",
913 + "assistant_open_settings": "Abrir ajustes del asistente",
914 + "assistant_error": "Error: {error}",
915 + "settings_concise_voice_responses": "Respuestas concisas en modo voz",
916 + "settings_concise_voice_responses_desc": "Mantén las respuestas del modelo breves (1 párrafo corto) y haz preguntas de seguimiento en modo voz.",
917 + "s3_connection_succeeded": "Conexión a S3 realizada con éxito.",
918 + "failed_to_open_url": "Error al abrir la URL: {error}",
919 + "failed_to_copy": "Error al copiar: {error}"
920 }
lib/l10n/app_fr.arb
+17 -1
@@ -897,5 +897,21 @@
897 "reasoning_effort_minimal": "Minimal",
898 "reasoning_effort_xhigh": "Très élevé",
899 "reasoning_effort_max": "Maximal",
900 - "reasoning_effort_off": "Désactivé"
900 + "reasoning_effort_off": "Désactivé",
901 + "settings_android_assistant": "Assistant Android",
902 + "assistant_default_title": "Assistant vocal par défaut",
903 + "assistant_default_description": "Définissez Localmind comme assistant vocal par défaut de votre système Android.",
904 + "assistant_status_active": "Localmind est défini comme votre assistant par défaut",
905 + "assistant_status_available": "Localmind peut être défini comme votre assistant par défaut",
906 + "assistant_status_manual": "Ouvrez les paramètres système et sélectionnez Localmind manuellement",
907 + "assistant_status_unsupported": "L'assistant par défaut est disponible uniquement à partir d'Android 7.0+",
908 + "assistant_status_checking": "Vérification du statut de l'assistant…",
909 + "assistant_set_default": "Définir l'assistant par défaut",
910 + "assistant_open_settings": "Ouvrir les paramètres de l'assistant",
911 + "assistant_error": "Erreur : {error}",
912 + "settings_concise_voice_responses": "Réponses concises en mode vocal",
913 + "settings_concise_voice_responses_desc": "Conservez les réponses du LLM concises (1 court paragraphe) et posez des questions de suivi en mode vocal.",
914 + "s3_connection_succeeded": "Connexion S3 réussie.",
915 + "failed_to_open_url": "Échec de l'ouverture de l'URL : {error}",
916 + "failed_to_copy": "Échec de la copie : {error}"
917 }
lib/l10n/app_hi.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "न्यूनतम",
901 "reasoning_effort_xhigh": "अत्यधिक उच्च",
902 "reasoning_effort_max": "अधिकतम",
903 - "reasoning_effort_off": "बंद"
903 + "reasoning_effort_off": "बंद",
904 + "settings_android_assistant": "एंड्रॉइड असिस्टेंट",
905 + "assistant_default_title": "डिफ़ॉल्ट वॉयस असिस्टेंट",
906 + "assistant_default_description": "Localmind को एंड्रॉइड पर अपना डिफ़ॉल्ट सिस्टम वॉयस असिस्टेंट सेट करें।",
907 + "assistant_status_active": "Localmind आपके डिफ़ॉल्ट असिस्टेंट के रूप में सेट है",
908 + "assistant_status_available": "Localmind को डिफ़ॉल्ट असिस्टेंट के रूप में सेट किया जा सकता है",
909 + "assistant_status_manual": "सिस्टम सेटिंग्स खोलें और मैन्युअल रूप से Localmind चुनें",
910 + "assistant_status_unsupported": "डिफ़ॉल्ट असिस्टेंट सेटिंग केवल एंड्रॉइड 7.0+ पर उपलब्ध है",
911 + "assistant_status_checking": "असिस्टेंट स्थिति की जांच की जा रही है…",
912 + "assistant_set_default": "डिफ़ॉल्ट असिस्टेंट सेट करें",
913 + "assistant_open_settings": "असिस्टेंट सेटिंग्स खोलें",
914 + "assistant_error": "त्रुटि: {error}",
915 + "settings_concise_voice_responses": "संक्षिप्त वॉयस मोड उत्तर",
916 + "settings_concise_voice_responses_desc": "वॉयस मोड में LLM उत्तरों को संक्षिप्त (1 छोटा अनुच्छेद) रखें और अनुवर्ती प्रश्न पूछें।",
917 + "s3_connection_succeeded": "S3 कनेक्शन सफल रहा।",
918 + "failed_to_open_url": "URL खोलने में विफल: {error}",
919 + "failed_to_copy": "कॉपी करने में विफल: {error}"
920 }
lib/l10n/app_it.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "Minimo",
901 "reasoning_effort_xhigh": "Molto alto",
902 "reasoning_effort_max": "Massimo",
903 - "reasoning_effort_off": "Disattivato"
903 + "reasoning_effort_off": "Disattivato",
904 + "settings_android_assistant": "Assistente Android",
905 + "assistant_default_title": "Assistente vocale predefinito",
906 + "assistant_default_description": "Imposta Localmind come assistente vocale predefinito del sistema su Android.",
907 + "assistant_status_active": "Localmind è impostato come assistente predefinito",
908 + "assistant_status_available": "Localmind può essere impostato come assistente predefinito",
909 + "assistant_status_manual": "Apri le impostazioni di sistema e seleziona Localmind manualmente",
910 + "assistant_status_unsupported": "L'impostazione dell'assistente predefinito è disponibile solo su Android 7.0+",
911 + "assistant_status_checking": "Verifica dello stato dell'assistente in corso…",
912 + "assistant_set_default": "Imposta assistente predefinito",
913 + "assistant_open_settings": "Apri impostazioni assistente",
914 + "assistant_error": "Errore: {error}",
915 + "settings_concise_voice_responses": "Risposte concise in modalità vocale",
916 + "settings_concise_voice_responses_desc": "Mantieni le risposte LLM brevi (1 breve paragrafo) e fai domande di approfondimento in modalità vocale.",
917 + "s3_connection_succeeded": "Connessione S3 riuscita.",
918 + "failed_to_open_url": "Impossibile aprire l'URL: {error}",
919 + "failed_to_copy": "Copia non riuscita: {error}"
920 }
lib/l10n/app_ja.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "最小",
901 "reasoning_effort_xhigh": "極高",
902 "reasoning_effort_max": "最大",
903 - "reasoning_effort_off": "オフ"
903 + "reasoning_effort_off": "オフ",
904 + "settings_android_assistant": "Android アシスタント",
905 + "assistant_default_title": "デフォルトの音声アシスタント",
906 + "assistant_default_description": "Localmind を Android のシステムデフォルト音声アシスタントに設定します。",
907 + "assistant_status_active": "Localmind がデフォルトのアシスタントに設定されています",
908 + "assistant_status_available": "Localmind をデフォルトのアシスタントに設定できます",
909 + "assistant_status_manual": "システム設定を開き、Localmind を手動で選択してください",
910 + "assistant_status_unsupported": "デフォルトアシスタントの設定は Android 7.0 以降でのみ利用可能です",
911 + "assistant_status_checking": "アシスタントのステータスを確認中…",
912 + "assistant_set_default": "デフォルトアシスタントに設定",
913 + "assistant_open_settings": "アシスタント設定を開く",
914 + "assistant_error": "エラー: {error}",
915 + "settings_concise_voice_responses": "簡潔な音声モード応答",
916 + "settings_concise_voice_responses_desc": "音声モードでのLLMの応答を短く(短い1段落)保ち、フォローアップの質問を行います。",
917 + "s3_connection_succeeded": "S3 接続に成功しました。",
918 + "failed_to_open_url": "URL を開くことができませんでした: {error}",
919 + "failed_to_copy": "コピーに失敗しました: {error}"
920 }
lib/l10n/app_localizations.dart
+36 -1
@@ -7,6 +7,7 @@ import 'package:intl/intl.dart' as intl;
7
8 import 'app_localizations_ar.dart';
9 import 'app_localizations_bn.dart';
10 +import 'app_localizations_de.dart';
11 import 'app_localizations_en.dart';
12 import 'app_localizations_es.dart';
13 import 'app_localizations_fr.dart';
@@ -105,6 +106,7 @@ abstract class AppLocalizations {
106 static const List<Locale> supportedLocales = <Locale>[
107 Locale('ar'),
108 Locale('bn'),
109 + Locale('de'),
110 Locale('en'),
111 Locale('es'),
112 Locale('fr'),
@@ -1141,7 +1143,7 @@ abstract class AppLocalizations {
1143 ///
1144 /// In en, this message translates to:
1145 /// **'Could not open Android assistant settings.'**
1144 - String get assistant_error;
1146 + String assistant_error(Object error);
1147
1148 /// Settings section header for behavior
1149 ///
@@ -5570,6 +5572,36 @@ abstract class AppLocalizations {
5572 /// In en, this message translates to:
5573 /// **'You need to select a model first'**
5574 String get model_required_toast;
5575 +
5576 + /// Label for concise voice responses toggle
5577 + ///
5578 + /// In en, this message translates to:
5579 + /// **'Concise Voice Mode Responses'**
5580 + String get settings_concise_voice_responses;
5581 +
5582 + /// Description for concise voice responses toggle
5583 + ///
5584 + /// In en, this message translates to:
5585 + /// **'Keep LLM responses brief (1 short paragraph) and ask follow-up questions in voice mode.'**
5586 + String get settings_concise_voice_responses_desc;
5587 +
5588 + /// Toast message when S3 connection succeeds
5589 + ///
5590 + /// In en, this message translates to:
5591 + /// **'S3 connection succeeded.'**
5592 + String get s3_connection_succeeded;
5593 +
5594 + /// Error message when opening a URL fails
5595 + ///
5596 + /// In en, this message translates to:
5597 + /// **'Failed to open URL: {error}'**
5598 + String failed_to_open_url(String error);
5599 +
5600 + /// Error message when copying text fails
5601 + ///
5602 + /// In en, this message translates to:
5603 + /// **'Failed to copy: {error}'**
5604 + String failed_to_copy(String error);
5605 }
5606
5607 class _AppLocalizationsDelegate
@@ -5585,6 +5617,7 @@ class _AppLocalizationsDelegate
5617 bool isSupported(Locale locale) => <String>[
5618 'ar',
5619 'bn',
5620 + 'de',
5621 'en',
5622 'es',
5623 'fr',
@@ -5619,6 +5652,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
5652 return AppLocalizationsAr();
5653 case 'bn':
5654 return AppLocalizationsBn();
5655 + case 'de':
5656 + return AppLocalizationsDe();
5657 case 'en':
5658 return AppLocalizationsEn();
5659 case 'es':
lib/l10n/app_localizations_ar.dart
+36 -11
@@ -536,38 +536,43 @@ class AppLocalizationsAr extends AppLocalizations {
536 String get settings_tts => 'تحويل النص إلى كلام';
537
538 @override
539 - String get settings_android_assistant => 'Android Assistant';
539 + String get settings_android_assistant => 'مساعد أندرويد';
540
541 @override
542 - String get assistant_default_title => 'Use LocalMind as your assistant';
542 + String get assistant_default_title => 'المساعد الصوتي الافتراضي';
543
544 @override
545 String get assistant_default_description =>
546 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
546 + 'تعيين Localmind كمساعد صوتي افتراضي للنظام على أندرويد.';
547
548 @override
549 - String get assistant_status_active => 'Active';
549 + String get assistant_status_active => 'Localmind محدد كمساعدك الافتراضي';
550
551 @override
552 - String get assistant_status_available => 'Not active';
552 + String get assistant_status_available =>
553 + 'يمكن تعيين Localmind كمساعدك الافتراضي';
554
555 @override
555 - String get assistant_status_manual => 'Check settings';
556 + String get assistant_status_manual =>
557 + 'افتح إعدادات النظام وحدد Localmind يدويًا';
558
559 @override
558 - String get assistant_status_unsupported => 'Unavailable';
560 + String get assistant_status_unsupported =>
561 + 'إعداد المساعد الافتراضي متاح فقط على أندرويد 7.0+';
562
563 @override
561 - String get assistant_status_checking => 'Checking…';
564 + String get assistant_status_checking => 'جاري التحقق من حالة المساعد…';
565
566 @override
564 - String get assistant_set_default => 'Set as default assistant';
567 + String get assistant_set_default => 'تعيين المساعد الافتراضي';
568
569 @override
567 - String get assistant_open_settings => 'Open Android assistant settings';
570 + String get assistant_open_settings => 'فتح إعدادات المساعد';
571
572 @override
570 - String get assistant_error => 'Could not open Android assistant settings.';
573 + String assistant_error(Object error) {
574 + return 'خطأ: $error';
575 + }
576
577 @override
578 String get settings_behavior => 'السلوك';
@@ -2963,4 +2968,24 @@ class AppLocalizationsAr extends AppLocalizations {
2968
2969 @override
2970 String get model_required_toast => 'يجب عليك اختيار نموذج أولاً';
2971 +
2972 + @override
2973 + String get settings_concise_voice_responses => 'إجابات وضع الصوت الموجزة';
2974 +
2975 + @override
2976 + String get settings_concise_voice_responses_desc =>
2977 + 'اجعل ردود النموذج قصيرة (فقرة واحدة قصيرة) واطرح أسئلة متابعة في وضع الصوت.';
2978 +
2979 + @override
2980 + String get s3_connection_succeeded => 'نجح الاتصال بـ S3.';
2981 +
2982 + @override
2983 + String failed_to_open_url(String error) {
2984 + return 'فشل فتح الرابط: $error';
2985 + }
2986 +
2987 + @override
2988 + String failed_to_copy(String error) {
2989 + return 'فشل النسخ: $error';
2990 + }
2991 }
lib/l10n/app_localizations_bn.dart
+38 -11
@@ -537,38 +537,45 @@ class AppLocalizationsBn extends AppLocalizations {
537 String get settings_tts => 'টেক্সট-টু-স্পিচ';
538
539 @override
540 - String get settings_android_assistant => 'Android Assistant';
540 + String get settings_android_assistant => 'অ্যান্ড্রয়েড অ্যাসিস্ট্যান্ট';
541
542 @override
543 - String get assistant_default_title => 'Use LocalMind as your assistant';
543 + String get assistant_default_title => 'ডিফল্ট ভয়েস অ্যাসিস্ট্যান্ট';
544
545 @override
546 String get assistant_default_description =>
547 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
547 + 'অ্যান্ড্রয়েডে Localmind-কে আপনার সিস্টেমের ডিফল্ট ভয়েস অ্যাসিস্ট্যান্ট হিসেবে সেট করুন।';
548
549 @override
550 - String get assistant_status_active => 'Active';
550 + String get assistant_status_active =>
551 + 'Localmind আপনার ডিফল্ট অ্যাসিস্ট্যান্ট হিসেবে সেট করা আছে';
552
553 @override
553 - String get assistant_status_available => 'Not active';
554 + String get assistant_status_available =>
555 + 'Localmind-কে ডিফল্ট অ্যাসিস্ট্যান্ট হিসেবে সেট করা যাবে';
556
557 @override
556 - String get assistant_status_manual => 'Check settings';
558 + String get assistant_status_manual =>
559 + 'সিস্টেম সেটিংস খুলুন এবং ম্যানুয়ালি Localmind নির্বাচন করুন';
560
561 @override
559 - String get assistant_status_unsupported => 'Unavailable';
562 + String get assistant_status_unsupported =>
563 + 'ডিফল্ট অ্যাসিস্ট্যান্ট সেটিংস কেবল অ্যান্ড্রয়েড 7.0+ এ সমর্থিত';
564
565 @override
562 - String get assistant_status_checking => 'Checking…';
566 + String get assistant_status_checking =>
567 + 'অ্যাসিস্ট্যান্ট স্ট্যাটাস পরীক্ষা করা হচ্ছে…';
568
569 @override
565 - String get assistant_set_default => 'Set as default assistant';
570 + String get assistant_set_default => 'ডিফল্ট অ্যাসিস্ট্যান্ট সেট করুন';
571
572 @override
568 - String get assistant_open_settings => 'Open Android assistant settings';
573 + String get assistant_open_settings => 'অ্যাসিস্ট্যান্ট সেটিংস খুলুন';
574
575 @override
571 - String get assistant_error => 'Could not open Android assistant settings.';
576 + String assistant_error(Object error) {
577 + return 'ত্রুটি: $error';
578 + }
579
580 @override
581 String get settings_behavior => 'আচরণ';
@@ -2986,4 +2993,24 @@ class AppLocalizationsBn extends AppLocalizations {
2993 @override
2994 String get model_required_toast =>
2995 'আপনাকে প্রথমে একটি মডেল নির্বাচন করতে হবে';
2996 +
2997 + @override
2998 + String get settings_concise_voice_responses => 'সংক্ষিপ্ত ভয়েস মোড উত্তর';
2999 +
3000 + @override
3001 + String get settings_concise_voice_responses_desc =>
3002 + 'ভয়েস মোডে মডেলের উত্তর সংক্ষেপে (১টি ছোট অনুচ্ছেদ) রাখুন এবং ফলো-আপ প্রশ্ন করুন।';
3003 +
3004 + @override
3005 + String get s3_connection_succeeded => 'S3 সংযোগ সফল হয়েছে।';
3006 +
3007 + @override
3008 + String failed_to_open_url(String error) {
3009 + return 'ইউআরএল খুলতে ব্যর্থ হয়েছে: $error';
3010 + }
3011 +
3012 + @override
3013 + String failed_to_copy(String error) {
3014 + return 'কপি করতে ব্যর্থ হয়েছে: $error';
3015 + }
3016 }
lib/l10n/app_localizations_de.dart new
+3006
@@ -0,0 +1,3006 @@
1 +// ignore: unused_import
2 +import 'package:intl/intl.dart' as intl;
3 +import 'app_localizations.dart';
4 +
5 +// ignore_for_file: type=lint
6 +
7 +/// The translations for German (`de`).
8 +class AppLocalizationsDe extends AppLocalizations {
9 + AppLocalizationsDe([String locale = 'de']) : super(locale);
10 +
11 + @override
12 + String get app_name => 'LocalMind';
13 +
14 + @override
15 + String get app_tagline => 'Ihre KI. Ihr Gerät. Ihre Regeln.';
16 +
17 + @override
18 + String get app_version => '1.0.0';
19 +
20 + @override
21 + String get cancel => 'Abbrechen';
22 +
23 + @override
24 + String get confirm => 'Bestätigen';
25 +
26 + @override
27 + String get delete => 'Löschen';
28 +
29 + @override
30 + String get save => 'Speichern';
31 +
32 + @override
33 + String get retry => 'Wiederholen';
34 +
35 + @override
36 + String get close => 'Schließen';
37 +
38 + @override
39 + String get done => 'Fertig';
40 +
41 + @override
42 + String get continue_action => 'Weiter';
43 +
44 + @override
45 + String get skip => 'Überspringen';
46 +
47 + @override
48 + String get install => 'Installieren';
49 +
50 + @override
51 + String get download => 'Herunterladen';
52 +
53 + @override
54 + String get resume => 'Fortsetzen';
55 +
56 + @override
57 + String get pause => 'Pausieren';
58 +
59 + @override
60 + String get stop => 'Stoppen';
61 +
62 + @override
63 + String get edit => 'Bearbeiten';
64 +
65 + @override
66 + String get preview => 'Vorschau';
67 +
68 + @override
69 + String get unload => 'Entladen';
70 +
71 + @override
72 + String get load => 'Laden';
73 +
74 + @override
75 + String get rename => 'Umbenennen';
76 +
77 + @override
78 + String get pin => 'Anheften';
79 +
80 + @override
81 + String get unpin => 'Ablösen';
82 +
83 + @override
84 + String get share => 'Teilen';
85 +
86 + @override
87 + String get copy => 'Kopieren';
88 +
89 + @override
90 + String get copied => 'Kopiert!';
91 +
92 + @override
93 + String get copied_to_clipboard => 'In Zwischenablage kopiert';
94 +
95 + @override
96 + String get select => 'Select';
97 +
98 + @override
99 + String get active => 'Active';
100 +
101 + @override
102 + String get all => 'Alle';
103 +
104 + @override
105 + String get none => 'Keine';
106 +
107 + @override
108 + String get none_selected => 'None selected';
109 +
110 + @override
111 + String get online => 'Online';
112 +
113 + @override
114 + String get connected => 'Connected';
115 +
116 + @override
117 + String get checking => 'Checking';
118 +
119 + @override
120 + String get offline => 'Offline';
121 +
122 + @override
123 + String get error => 'Fehler';
124 +
125 + @override
126 + String get unknown_error => 'Unknown error';
127 +
128 + @override
129 + String get not_now => 'Not Now';
130 +
131 + @override
132 + String get enable => 'Enable';
133 +
134 + @override
135 + String get proceed_anyway => 'Proceed Anyway';
136 +
137 + @override
138 + String get test_connection => 'Verbindung testen';
139 +
140 + @override
141 + String get testing => 'Testing...';
142 +
143 + @override
144 + String get connection_successful => 'Verbindung erfolgreich!';
145 +
146 + @override
147 + String get connection_failed =>
148 + 'Verbindung fehlgeschlagen. Überprüfen Sie Ihre Einstellungen.';
149 +
150 + @override
151 + String get save_continue => 'Speichern & Continue';
152 +
153 + @override
154 + String get save_changes => 'Speichern Changes';
155 +
156 + @override
157 + String get finish_setup => 'Finish Setup';
158 +
159 + @override
160 + String get start_new_chat => 'Start New Chat';
161 +
162 + @override
163 + String get cannot_undo => 'This action cannot be undone.';
164 +
165 + @override
166 + String get ram_warning => 'RAM Warnung';
167 +
168 + @override
169 + String get recommended => 'RECOMMENDED';
170 +
171 + @override
172 + String get may_be_large => 'May be too large for this device';
173 +
174 + @override
175 + String get calculating => 'Calculating...';
176 +
177 + @override
178 + String get download_failed => 'Download fehlgeschlagen';
179 +
180 + @override
181 + String get downloaded => 'Downloaded';
182 +
183 + @override
184 + String get not_downloaded => 'Not downloaded';
185 +
186 + @override
187 + String get installed => 'Installed';
188 +
189 + @override
190 + String get not_installed => 'Not installed';
191 +
192 + @override
193 + String get loading => 'Wird geladen…';
194 +
195 + @override
196 + String get thinking => 'Thinking';
197 +
198 + @override
199 + String get processing => 'Processing...';
200 +
201 + @override
202 + String get initializing => 'Initializing...';
203 +
204 + @override
205 + String get ready => 'Ready';
206 +
207 + @override
208 + String get preparing_app => 'Preparing app...';
209 +
210 + @override
211 + String get initializing_services => 'Initializing services...';
212 +
213 + @override
214 + String get configuring_server => 'Configuring server...';
215 +
216 + @override
217 + String get startup_failed => 'Startup failed';
218 +
219 + @override
220 + String get something_went_wrong => 'Something went wrong';
221 +
222 + @override
223 + String get delete_model_title => 'Modell löschen?';
224 +
225 + @override
226 + String delete_model_body(String name) {
227 + return 'Möchten Sie $name wirklich löschen?';
228 + }
229 +
230 + @override
231 + String delete_model_body_with_size(String name, String size) {
232 + return 'Möchten Sie $name wirklich löschen? Dadurch werden ca. $size Speicherplatz freigegeben.\n\nSie können dieses Modell später bei Bedarf erneut herunterladen.';
233 + }
234 +
235 + @override
236 + String get delete_voice_title => 'Löschen Voice';
237 +
238 + @override
239 + String delete_voice_body(String name, String size) {
240 + return 'Möchten Sie wirklich löschen: $name? This will free up approximately $size of space.\n\nYou can download this voice again later if needed.';
241 + }
242 +
243 + @override
244 + String get delete_server_title => 'Server löschen?';
245 +
246 + @override
247 + String delete_server_body(String name) {
248 + return 'Möchten Sie den Server \"$name\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.';
249 + }
250 +
251 + @override
252 + String get delete_conversation_title => 'Unterhaltung löschen?';
253 +
254 + @override
255 + String delete_conversation_body(String title) {
256 + return 'Möchten Sie \"$title\" wirklich löschen? Dies kann nicht rückgängig gemacht werden.';
257 + }
258 +
259 + @override
260 + String get delete_message_title => 'Löschen message?';
261 +
262 + @override
263 + String delete_persona_title(String name) {
264 + return '\"$name\" löschen?';
265 + }
266 +
267 + @override
268 + String get delete_persona_body =>
269 + 'Dies kann nicht rückgängig gemacht werden.';
270 +
271 + @override
272 + String get delete_builtin_persona_body =>
273 + 'This is a built-in persona. You can restore it later from Einstellungen.';
274 +
275 + @override
276 + String get restore_builtin_personas => 'Restore default personas';
277 +
278 + @override
279 + String get restore_builtin_personas_desc =>
280 + 'Re-add any built-in personas you\'ve deleted';
281 +
282 + @override
283 + String get restore_builtin_personas_success => 'Default personas restored';
284 +
285 + @override
286 + String get clear_personas => 'Clear personas';
287 +
288 + @override
289 + String get enable_image_compression => 'Compress images before sending';
290 +
291 + @override
292 + String get enable_image_compression_desc =>
293 + 'Resize and compress attached images so uploads stay within server limits';
294 +
295 + @override
296 + String get image_compression_level => 'Compression aggressiveness';
297 +
298 + @override
299 + String get image_compression_level_desc =>
300 + 'Higher aggressiveness produces smaller uploads at lower quality';
301 +
302 + @override
303 + String get image_compression_level_low => 'Low';
304 +
305 + @override
306 + String get image_compression_level_medium => 'Medium';
307 +
308 + @override
309 + String get image_compression_level_high => 'High';
310 +
311 + @override
312 + String get sort_models_tooltip => 'Sort models';
313 +
314 + @override
315 + String get sort_by_favorites => 'Favorites first';
316 +
317 + @override
318 + String get sort_by_name => 'Name (A-Z)';
319 +
320 + @override
321 + String get sort_by_size_smallest => 'Size (smallest first)';
322 +
323 + @override
324 + String get sort_by_size_largest => 'Size (largest first)';
325 +
326 + @override
327 + String get sort_by_context_length => 'Context length';
328 +
329 + @override
330 + String bulk_ai_rename_progress(int done, int total) {
331 + return 'Renaming $done/$total...';
332 + }
333 +
334 + @override
335 + String selected_count(int count) {
336 + return '$count ausgewählt';
337 + }
338 +
339 + @override
340 + String get ai_rename_tooltip => 'Rename selected with AI';
341 +
342 + @override
343 + String get new_chat_in_folder_tooltip => 'New chat in this folder';
344 +
345 + @override
346 + String total_tokens_count(int count) {
347 + return '$count Tokens';
348 + }
349 +
350 + @override
351 + String get smart_replies_use_persona => 'Use persona in smart replies';
352 +
353 + @override
354 + String get smart_replies_use_persona_desc =>
355 + 'Suggested replies match the tone of the active persona instead of a generic assistant';
356 +
357 + @override
358 + String get keep_persona_on_new_chat => 'Keep persona on new chat';
359 +
360 + @override
361 + String get keep_persona_on_new_chat_desc =>
362 + 'Don\'t clear the selected persona(s) after starting a new chat';
363 +
364 + @override
365 + String get role_swap_button_enabled => 'Show role-swap button';
366 +
367 + @override
368 + String get role_swap_button_enabled_desc =>
369 + 'Show a button in the chat input to send your message as the assistant instead of the user, without generating a response';
370 +
371 + @override
372 + String get send_as_user_tooltip => 'Send as user';
373 +
374 + @override
375 + String get send_as_assistant_tooltip => 'Send as assistant (no response)';
376 +
377 + @override
378 + String get insert_without_generating_tooltip => 'Insert without generating';
379 +
380 + @override
381 + String get token_usage_title => 'Token Usage';
382 +
383 + @override
384 + String get total_tokens_label => 'Tokens used';
385 +
386 + @override
387 + String get usage_percent_label => 'Context used';
388 +
389 + @override
390 + String get export_choice_title => 'Export';
391 +
392 + @override
393 + String get export_choice_body => 'How would you like to export this?';
394 +
395 + @override
396 + String get copy_to_clipboard => 'Copy to Clipboard';
397 +
398 + @override
399 + String bulk_export_conversations_success(int count) {
400 + return 'Exported $count conversations';
401 + }
402 +
403 + @override
404 + String get bulk_ai_rename_confirm_title => 'Rename with AI?';
405 +
406 + @override
407 + String bulk_ai_rename_confirm_body(int count) {
408 + return 'This will ask the AI to generate a new title for each of the $count selected conversations, replacing their current titles. This can take a while and cannot be undone.';
409 + }
410 +
411 + @override
412 + String get sort_by_modified_date => 'Last modified';
413 +
414 + @override
415 + String get sort_by_created_date => 'Date created';
416 +
417 + @override
418 + String get sort_title => 'Sort';
419 +
420 + @override
421 + String get clear_conversation_title => 'Clear conversation?';
422 +
423 + @override
424 + String get clear_conversation_body =>
425 + 'This will delete all messages in this conversation.';
426 +
427 + @override
428 + String get clear => 'Leeren';
429 +
430 + @override
431 + String label_completed(String label) {
432 + return '$label completed';
433 + }
434 +
435 + @override
436 + String error_with_message(String error) {
437 + return 'Fehler: $error';
438 + }
439 +
440 + @override
441 + String preview_failed(String error) {
442 + return 'Vorschau fehlgeschlagen: $error';
443 + }
444 +
445 + @override
446 + String loading_model(String modelId) {
447 + return 'Lade $modelId…';
448 + }
449 +
450 + @override
451 + String model_loaded(String modelId, String backend) {
452 + return 'Modell geladen: $modelId ($backend)';
453 + }
454 +
455 + @override
456 + String get no_model_loaded =>
457 + 'No model loaded. Tap \"Manage On-Device Modelle\" to download and load a model.';
458 +
459 + @override
460 + String loading_model_error(String error) {
461 + return 'Fehler: $error';
462 + }
463 +
464 + @override
465 + String get delete_conversation => 'Unterhaltung löschen';
466 +
467 + @override
468 + String get nav_history => 'History';
469 +
470 + @override
471 + String get nav_servers => 'Server';
472 +
473 + @override
474 + String get nav_local_models => 'Local Modelle';
475 +
476 + @override
477 + String get nav_tts => 'Sprachmodelle';
478 +
479 + @override
480 + String get nav_personas => 'Personas';
481 +
482 + @override
483 + String get nav_settings => 'Einstellungen';
484 +
485 + @override
486 + String get nav_new_chat => 'New Chat';
487 +
488 + @override
489 + String get search_hint => 'Suchen conversations...';
490 +
491 + @override
492 + String get no_server_selected => 'No server selected';
493 +
494 + @override
495 + String get switch_server => 'Switch Server';
496 +
497 + @override
498 + String get switch_server_subtitle => 'Choose a server to connect to';
499 +
500 + @override
501 + String get manage_servers => 'Manage Servers';
502 +
503 + @override
504 + String get open_source => 'Open Source';
505 +
506 + @override
507 + String get open_source_desc => 'LocalMind ist Open-Source-Software.';
508 +
509 + @override
510 + String get star_on_github => 'Star on GitHub';
511 +
512 + @override
513 + String get add_more => 'Hinzufügen more';
514 +
515 + @override
516 + String get on_github => 'on GitHub';
517 +
518 + @override
519 + String get could_not_open_github =>
520 + 'GitHub konnte nicht geöffnet werden. Bitte versuchen Sie es später erneut.';
521 +
522 + @override
523 + String get settings_title => 'Einstellungen';
524 +
525 + @override
526 + String get settings_appearance => 'Erscheinungsbild';
527 +
528 + @override
529 + String get settings_language => 'Sprache';
530 +
531 + @override
532 + String get language_system_default => 'Systemstandard';
533 +
534 + @override
535 + String get settings_tts => 'Text-to-Speech (TTS)';
536 +
537 + @override
538 + String get settings_android_assistant => 'Android-Assistent';
539 +
540 + @override
541 + String get assistant_default_title => 'Standard-Sprachassistent';
542 +
543 + @override
544 + String get assistant_default_description =>
545 + 'Legen Sie Localmind als Ihren Standard-Sprachassistenten auf Android fest.';
546 +
547 + @override
548 + String get assistant_status_active =>
549 + 'Localmind ist als Standard-Assistent festgelegt';
550 +
551 + @override
552 + String get assistant_status_available =>
553 + 'Localmind kann als Standard-Assistent festgelegt werden';
554 +
555 + @override
556 + String get assistant_status_manual =>
557 + 'Öffnen Sie die Systemeinstellungen und wählen Sie Localmind manuell aus';
558 +
559 + @override
560 + String get assistant_status_unsupported =>
561 + 'Die Standard-Assistenteneinstellung ist nur ab Android 7.0+ verfügbar';
562 +
563 + @override
564 + String get assistant_status_checking => 'Assistentenstatus wird überprüft…';
565 +
566 + @override
567 + String get assistant_set_default => 'Standard-Assistent festlegen';
568 +
569 + @override
570 + String get assistant_open_settings => 'Assistenteneinstellungen öffnen';
571 +
572 + @override
573 + String assistant_error(Object error) {
574 + return 'Fehler: $error';
575 + }
576 +
577 + @override
578 + String get settings_behavior => 'Verhalten';
579 +
580 + @override
581 + String get settings_on_device => 'On-Device Inference';
582 +
583 + @override
584 + String get settings_default_server => 'Standardserver';
585 +
586 + @override
587 + String get settings_default_persona => 'Standard-Persona';
588 +
589 + @override
590 + String get settings_default_model => 'Standardmodell';
591 +
592 + @override
593 + String get settings_default_model_desc =>
594 + 'Automatically selected when you start a new chat.';
595 +
596 + @override
597 + String get settings_privacy => 'Datenschutz & Daten';
598 +
599 + @override
600 + String get settings_data_management => 'Data Management';
601 +
602 + @override
603 + String get settings_about => 'Über LocalMind';
604 +
605 + @override
606 + String get theme => 'Theme';
607 +
608 + @override
609 + String get theme_system => 'System';
610 +
611 + @override
612 + String get theme_light => 'Light';
613 +
614 + @override
615 + String get theme_dark => 'Dark';
616 +
617 + @override
618 + String get theme_claude => 'Claude';
619 +
620 + @override
621 + String get font_size => 'Font Size';
622 +
623 + @override
624 + String get font_size_desc => 'Adjust text size in chat.';
625 +
626 + @override
627 + String get font_preview => 'The quick brown fox jumps over the lazy dog.';
628 +
629 + @override
630 + String get code_theme_dark => 'Code Theme (Dark)';
631 +
632 + @override
633 + String get code_theme_light => 'Code Theme (Light)';
634 +
635 + @override
636 + String get code_theme_desc =>
637 + 'Choose syntax highlighting theme for code blocks.';
638 +
639 + @override
640 + String get tts_engine => 'TTS Engine';
641 +
642 + @override
643 + String get tts_engine_system => 'System TTS';
644 +
645 + @override
646 + String get tts_engine_kitten => 'Kitten TTS';
647 +
648 + @override
649 + String get voice => 'Voice';
650 +
651 + @override
652 + String get voice_female => 'Female';
653 +
654 + @override
655 + String get voice_male => 'Male';
656 +
657 + @override
658 + String get voice_other => 'Other';
659 +
660 + @override
661 + String get tts_speed => 'TTS Speed';
662 +
663 + @override
664 + String get tts_speed_desc => 'Adjust the playback rate.';
665 +
666 + @override
667 + String get manage_tts_models => 'Manage TTS Modelle';
668 +
669 + @override
670 + String get manage_on_device_models => 'Manage On-Device Modelle';
671 +
672 + @override
673 + String get enable_smart_reply => 'On-Device Smart Replies';
674 +
675 + @override
676 + String get ai_user_response_enabled => 'AI user message (hold send)';
677 +
678 + @override
679 + String get ai_user_response_enabled_desc =>
680 + 'Hold the send button for 3 seconds to have the AI write and send your next message';
681 +
682 + @override
683 + String get ai_user_response_tooltip => 'Generate user message with AI';
684 +
685 + @override
686 + String get streaming_responses => 'Streaming Responses';
687 +
688 + @override
689 + String get auto_generate_titles => 'Auto-generate Titles';
690 +
691 + @override
692 + String get send_on_enter => 'Send on Enter';
693 +
694 + @override
695 + String get show_system_messages => 'Send Default System Prompt';
696 +
697 + @override
698 + String get show_system_messages_desc =>
699 + 'When no persona is selected, send a default assistant system prompt with each request';
700 +
701 + @override
702 + String get show_system_messages_in_chat => 'Show System Messages in Chat';
703 +
704 + @override
705 + String get show_system_messages_in_chat_desc =>
706 + 'Display system messages (e.g. from an imported backup) as visible bubbles in the conversation';
707 +
708 + @override
709 + String get haptic_feedback => 'Haptic Feedback';
710 +
711 + @override
712 + String get enable_mcp => 'Enable MCP';
713 +
714 + @override
715 + String get new_chat_mcp_default => 'New Chat MCP Default';
716 +
717 + @override
718 + String get show_data_indicator => 'Show Data Indicator';
719 +
720 + @override
721 + String get privacy_info => '\"LocalMind never sees your data\"';
722 +
723 + @override
724 + String get delete_all_conversations => 'Löschen All Conversations';
725 +
726 + @override
727 + String get reset_settings_defaults => 'Reset Einstellungen to Defaults';
728 +
729 + @override
730 + String get chat_title => 'LocalMind';
731 +
732 + @override
733 + String get chat_parameters_tooltip => 'Chat Parameters';
734 +
735 + @override
736 + String get change_persona => 'Change Persona';
737 +
738 + @override
739 + String get set_persona => 'Set Persona';
740 +
741 + @override
742 + String get remove_persona => 'Entfernen Persona';
743 +
744 + @override
745 + String get clear_conversation => 'Clear Conversation';
746 +
747 + @override
748 + String get connection_error => 'Connection error. Check your server.';
749 +
750 + @override
751 + String get disconnected => 'Disconnected from server.';
752 +
753 + @override
754 + String get configure => 'Configure';
755 +
756 + @override
757 + String get select_model => 'Modell auswählen';
758 +
759 + @override
760 + String get select_persona => 'Persona auswählen';
761 +
762 + @override
763 + String get manage_personas => 'Manage personas';
764 +
765 + @override
766 + String get personas_combine_hint =>
767 + 'Select multiple personas in chat to stack their system prompts.';
768 +
769 + @override
770 + String get start_conversation => 'Start a conversation';
771 +
772 + @override
773 + String get recent_chats => 'Recent chats';
774 +
775 + @override
776 + String get see_all => 'See all';
777 +
778 + @override
779 + String get quick_write => 'Help me write a function';
780 +
781 + @override
782 + String get quick_explain => 'Explain this code';
783 +
784 + @override
785 + String get quick_debug => 'Debug this for me';
786 +
787 + @override
788 + String get quick_async => 'How do I use async/await?';
789 +
790 + @override
791 + String get history_missing_title => 'History Missing';
792 +
793 + @override
794 + String get history_missing_desc =>
795 + 'Either the messages in this chat were deleted or the history record is corrupted.';
796 +
797 + @override
798 + String get technical_details => 'Technical Details';
799 +
800 + @override
801 + String get last_error => 'Last Fehler:';
802 +
803 + @override
804 + String get copy_info => 'Copy Info';
805 +
806 + @override
807 + String get conversation_id => 'Conversation ID';
808 +
809 + @override
810 + String get created_at => 'Created At';
811 +
812 + @override
813 + String get expected_messages => 'Expected Messages';
814 +
815 + @override
816 + String get debug_dialog_desc =>
817 + 'Diagnostic information to help identify synchronization issues.';
818 +
819 + @override
820 + String get chat_input_hint => 'Ask anything';
821 +
822 + @override
823 + String get send_message_tooltip => 'Send message';
824 +
825 + @override
826 + String get stop_generation_tooltip => 'Stop generation';
827 +
828 + @override
829 + String get attach_images_tooltip => 'Attach images or text';
830 +
831 + @override
832 + String get start_listening_tooltip => 'Start listening';
833 +
834 + @override
835 + String get stop_listening_tooltip => 'Stop listening';
836 +
837 + @override
838 + String tool_label(String toolCallId) {
839 + return 'Tool: $toolCallId';
840 + }
841 +
842 + @override
843 + String get tool_unknown => 'Tool: Unknown';
844 +
845 + @override
846 + String get message_options => 'Message options';
847 +
848 + @override
849 + String get copy_markdown => 'Copy as Markdown';
850 +
851 + @override
852 + String get copied_markdown => 'Copied as Markdown';
853 +
854 + @override
855 + String get read_aloud => 'Read Aloud';
856 +
857 + @override
858 + String get stop_reading => 'Stop Reading';
859 +
860 + @override
861 + String get more => 'More';
862 +
863 + @override
864 + String character_count(int length) {
865 + return '$length Zeichen';
866 + }
867 +
868 + @override
869 + String get edit_message => 'Nachricht bearbeiten';
870 +
871 + @override
872 + String get edit_message_desc =>
873 + 'Saving will remove the assistant response below and regenerate.';
874 +
875 + @override
876 + String get save_regenerate => 'Speichern & regenerate';
877 +
878 + @override
879 + String get chat_settings_title => 'Chat Einstellungen';
880 +
881 + @override
882 + String get reset_defaults => 'Reset Defaults';
883 +
884 + @override
885 + String get parameters_tab => 'Parameters';
886 +
887 + @override
888 + String get mcp_tab => 'MCP';
889 +
890 + @override
891 + String get temperature => 'Temperatur';
892 +
893 + @override
894 + String get temperature_desc =>
895 + 'Controls randomness: Higher = Creative, Lower = Focused';
896 +
897 + @override
898 + String get top_p => 'Top P';
899 +
900 + @override
901 + String get top_p_desc => 'Nucleus sampling threshold';
902 +
903 + @override
904 + String get max_tokens => 'Max Tokens';
905 +
906 + @override
907 + String get max_tokens_desc => 'Response limit';
908 +
909 + @override
910 + String get context_length => 'Context Length';
911 +
912 + @override
913 + String get context_length_desc => 'History window';
914 +
915 + @override
916 + String get mcp_disabled_warning =>
917 + 'MCP is disabled globally. Enable it in Einstellungen to use these features.';
918 +
919 + @override
920 + String get mcp_enable_chat => 'Enable MCP for this chat';
921 +
922 + @override
923 + String get auto_execute_tools => 'Auto-execute tools';
924 +
925 + @override
926 + String get beta_label => 'Beta';
927 +
928 + @override
929 + String get experimental_label => 'Experimental';
930 +
931 + @override
932 + String get add_ephemeral_mcp => 'Hinzufügen Ephemeral MCP Server';
933 +
934 + @override
935 + String get mcp_label_placeholder => 'Label';
936 +
937 + @override
938 + String get mcp_url_placeholder => 'URL (https://...)';
939 +
940 + @override
941 + String get active_integrations => 'Active Integrations';
942 +
943 + @override
944 + String get import_mcp_json => 'Import JSON';
945 +
946 + @override
947 + String get import_mcp_json_dialog_title => 'Import MCP Config JSON';
948 +
949 + @override
950 + String get import_mcp_json_instructions =>
951 + 'Copy your mcpServers JSON directly from LM Studio (mcp.json) or paste a plugin array below:';
952 +
953 + @override
954 + String get import_mcp_json_placeholder =>
955 + 'Paste mcpServers JSON or plugin list here...';
956 +
957 + @override
958 + String mcp_import_success(int count) {
959 + return '$count Integration(en) erfolgreich importiert';
960 + }
961 +
962 + @override
963 + String get mcp_import_failed => 'No valid MCP integrations found in JSON';
964 +
965 + @override
966 + String get enable_notifications => 'Enable Notifications';
967 +
968 + @override
969 + String get enable_notifications_desc =>
970 + 'Get notified when models finish downloading.';
971 +
972 + @override
973 + String get chat_history_title => 'Chat History';
974 +
975 + @override
976 + String get conversation_just_now => 'Just now';
977 +
978 + @override
979 + String conversation_minutes_ago(int minutes) {
980 + return '${minutes}m ago';
981 + }
982 +
983 + @override
984 + String conversation_hours_ago(int hours) {
985 + return '${hours}h ago';
986 + }
987 +
988 + @override
989 + String get conversation_yesterday => 'Yesterday';
990 +
991 + @override
992 + String conversation_days_ago(int days) {
993 + return '${days}d ago';
994 + }
995 +
996 + @override
997 + String conversation_date(int month, int day, int year) {
998 + return '$month/$day/$year';
999 + }
1000 +
1001 + @override
1002 + String get options_tooltip => 'Options';
1003 +
1004 + @override
1005 + String get no_results_found => 'No results found';
1006 +
1007 + @override
1008 + String get no_conversations_yet => 'No conversations yet';
1009 +
1010 + @override
1011 + String get try_different_search => 'Try a different search term';
1012 +
1013 + @override
1014 + String get start_new_conversation => 'Start a new conversation';
1015 +
1016 + @override
1017 + String get rename_conversation => 'Unterhaltung umbenennen';
1018 +
1019 + @override
1020 + String get enter_new_title => 'Enter new title';
1021 +
1022 + @override
1023 + String get pinned_section => 'PINNED';
1024 +
1025 + @override
1026 + String get today_section => 'TODAY';
1027 +
1028 + @override
1029 + String get yesterday_section => 'YESTERDAY';
1030 +
1031 + @override
1032 + String get previous_7_days => 'PREVIOUS 7 DAYS';
1033 +
1034 + @override
1035 + String get previous_30_days => 'PREVIOUS 30 DAYS';
1036 +
1037 + @override
1038 + String get older_section => 'OLDER';
1039 +
1040 + @override
1041 + String get onboarding_choose_language => 'Wählen Sie Ihre Sprache';
1042 +
1043 + @override
1044 + String get onboarding_choose_language_desc =>
1045 + 'Sie können dies später jederzeit in den Einstellungen ändern.';
1046 +
1047 + @override
1048 + String get onboarding_localmind => 'LOCALMIND';
1049 +
1050 + @override
1051 + String get onboarding_connect_server => 'Connect Your\nServer';
1052 +
1053 + @override
1054 + String get onboarding_connect_desc =>
1055 + 'Geben Sie die Verbindungsdetails für Ihren KI-Server ein.';
1056 +
1057 + @override
1058 + String get openai_compatible_api => 'OpenAI-compatible API';
1059 +
1060 + @override
1061 + String get https_requires_ssl => 'HTTPS requires SSL';
1062 +
1063 + @override
1064 + String get most_local_setups_use_http => 'Most local setups use http://';
1065 +
1066 + @override
1067 + String get onboarding_welcome => 'Willkommen bei LocalMind';
1068 +
1069 + @override
1070 + String get server_type_on_device => 'Auf dem Gerät';
1071 +
1072 + @override
1073 + String get server_type_lm_studio => 'LM Studio';
1074 +
1075 + @override
1076 + String get server_type_ollama => 'Ollama';
1077 +
1078 + @override
1079 + String get server_type_ollama_cloud => 'Ollama Cloud';
1080 +
1081 + @override
1082 + String get server_type_ollama_cloud_sub => 'CLOUD MANAGED';
1083 +
1084 + @override
1085 + String get server_type_ollama_cloud_display => 'Ollama Cloud';
1086 +
1087 + @override
1088 + String get server_address_ollama_cloud => 'ollama.com';
1089 +
1090 + @override
1091 + String get ollama_cloud_disclosure =>
1092 + 'By connecting Ollama Cloud, your chat messages and inputs are sent to Ollama\'s managed servers for inference. LocalMind does not track or store your conversations. You can revoke this key any time at ollama.com/settings/keys.';
1093 +
1094 + @override
1095 + String get api_key_required_ollama_cloud =>
1096 + 'API Key required for Ollama Cloud';
1097 +
1098 + @override
1099 + String get api_key_hint_ollama_cloud => 'Paste your Ollama Cloud API key';
1100 +
1101 + @override
1102 + String get add_server_ollama_cloud_subtitle =>
1103 + 'Connect to Ollama Cloud with an API key from ollama.com/settings/keys to access managed cloud models.';
1104 +
1105 + @override
1106 + String get add_server_openrouter_subtitle =>
1107 + 'Connect through OpenRouter with a valid API key and keep this profile ready for model routing.';
1108 +
1109 + @override
1110 + String get add_server_endpoint_subtitle =>
1111 + 'Configure a local or self-hosted endpoint, then verify the connection before saving.';
1112 +
1113 + @override
1114 + String get server_type_openrouter => 'OpenRouter';
1115 +
1116 + @override
1117 + String get server_type_openrouter_sub => 'UNIFIED CLOUD';
1118 +
1119 + @override
1120 + String get ready_continue => 'BEREIT ZUM FORTFAHREN';
1121 +
1122 + @override
1123 + String get waiting_selection => 'WAITING FOR SELECTION';
1124 +
1125 + @override
1126 + String get setup_connection => 'Setup Connection';
1127 +
1128 + @override
1129 + String setup_connection_desc(String server) {
1130 + return 'Configure your $server server to start chatting.';
1131 + }
1132 +
1133 + @override
1134 + String get server_name => 'Servername';
1135 +
1136 + @override
1137 + String get name_required => 'Name required';
1138 +
1139 + @override
1140 + String get name_max_50 => 'Max 50 characters';
1141 +
1142 + @override
1143 + String get host_label => 'Host / IP Address';
1144 +
1145 + @override
1146 + String get host_required => 'Host required';
1147 +
1148 + @override
1149 + String get port_label => 'Port';
1150 +
1151 + @override
1152 + String get port_required => 'Port required';
1153 +
1154 + @override
1155 + String get port_invalid => 'Must be a number';
1156 +
1157 + @override
1158 + String get port_range => 'Enter a valid port (1-65535)';
1159 +
1160 + @override
1161 + String get api_key_required => 'API Key *';
1162 +
1163 + @override
1164 + String get api_key_optional => 'API Key (Optional)';
1165 +
1166 + @override
1167 + String get api_key_required_openrouter => 'API Key required for OpenRouter';
1168 +
1169 + @override
1170 + String get api_key_format => 'OpenRouter API keys start with sk-';
1171 +
1172 + @override
1173 + String get my_server_hint => 'My Server';
1174 +
1175 + @override
1176 + String get name_length_validation => 'Name must be 50 characters or less';
1177 +
1178 + @override
1179 + String get host_valid => 'Enter a valid hostname or IP address';
1180 +
1181 + @override
1182 + String get api_key_hint_openrouter => 'sk-...';
1183 +
1184 + @override
1185 + String get api_key_hint_generic => 'For authenticated servers';
1186 +
1187 + @override
1188 + String get update_server => 'Update Server';
1189 +
1190 + @override
1191 + String get save_server => 'Speichern Server';
1192 +
1193 + @override
1194 + String get server_updated => 'Server updated';
1195 +
1196 + @override
1197 + String get server_added => 'Server added';
1198 +
1199 + @override
1200 + String get download_model_title => 'Download a Modell';
1201 +
1202 + @override
1203 + String get download_model_desc =>
1204 + 'Choose a model to download.\nIt will run locally on your device.';
1205 +
1206 + @override
1207 + String get on_device_android_only =>
1208 + 'On-device inference is currently available on Android only.';
1209 +
1210 + @override
1211 + String get total_ram => 'Total RAM';
1212 +
1213 + @override
1214 + String get available => 'Available';
1215 +
1216 + @override
1217 + String ram_min_required(String fileSize) {
1218 + return '$fileSize GB RAM min';
1219 + }
1220 +
1221 + @override
1222 + String download_progress(String percent, String speed) {
1223 + return '$percent% • $speed';
1224 + }
1225 +
1226 + @override
1227 + String eta_label(String eta) {
1228 + return 'ETA: $eta';
1229 + }
1230 +
1231 + @override
1232 + String paused_progress(String percent) {
1233 + return 'Paused - $percent%';
1234 + }
1235 +
1236 + @override
1237 + String ram_warning_body_download(String ram, String totalMemory) {
1238 + return 'This model requires at least $ram GB RAM, but your device has $totalMemory. It may not run correctly or could cause the app to crash.';
1239 + }
1240 +
1241 + @override
1242 + String ram_warning_body_load(String availableRAM, String ram) {
1243 + return 'Your device has $availableRAM available RAM, but this model recommends at least $ram GB. Loading it might fail or cause instability.';
1244 + }
1245 +
1246 + @override
1247 + String get choose_theme => 'Choose Theme';
1248 +
1249 + @override
1250 + String get choose_theme_desc =>
1251 + 'Personalize the app appearance. You can always change this later in settings.';
1252 +
1253 + @override
1254 + String get theme_card_system => 'System';
1255 +
1256 + @override
1257 + String get theme_card_system_sub => 'Matches your device settings';
1258 +
1259 + @override
1260 + String get theme_card_light => 'Light';
1261 +
1262 + @override
1263 + String get theme_card_light_sub => 'Clean and bright';
1264 +
1265 + @override
1266 + String get theme_card_dark => 'Dark';
1267 +
1268 + @override
1269 + String get theme_card_dark_sub => 'Easy on the eyes';
1270 +
1271 + @override
1272 + String get theme_card_claude => 'Claude';
1273 +
1274 + @override
1275 + String get theme_card_claude_sub => 'A warm, peach-tinted theme';
1276 +
1277 + @override
1278 + String get stay_updated => 'Stay Updated';
1279 +
1280 + @override
1281 + String get stay_updated_desc =>
1282 + 'Get notified when your AI models finish downloading or when long-running tasks complete.';
1283 +
1284 + @override
1285 + String get notification_benefit_downloads => 'Modell download progress';
1286 +
1287 + @override
1288 + String get notification_benefit_completions => 'Generation completions';
1289 +
1290 + @override
1291 + String get notification_benefit_background => 'Background tasks status';
1292 +
1293 + @override
1294 + String get allow_notifications => 'Allow Notifications';
1295 +
1296 + @override
1297 + String get servers_title => 'Servers';
1298 +
1299 + @override
1300 + String get no_servers_yet => 'No Servers Yet';
1301 +
1302 + @override
1303 + String get no_servers_desc =>
1304 + 'Hinzufügen your first server to start chatting with AI models.';
1305 +
1306 + @override
1307 + String get add_server => 'Server hinzufügen';
1308 +
1309 + @override
1310 + String switched_to_server(String name) {
1311 + return 'Switched to $name';
1312 + }
1313 +
1314 + @override
1315 + String get edit_server => 'Server bearbeiten';
1316 +
1317 + @override
1318 + String get add_server_title => 'Hinzufügen Server';
1319 +
1320 + @override
1321 + String get server_type_label => 'Server Type';
1322 +
1323 + @override
1324 + String get server_icon_label => 'Server Icon';
1325 +
1326 + @override
1327 + String get default_icon => 'Default icon';
1328 +
1329 + @override
1330 + String get server_type_lm_studio_display => 'LM Studio';
1331 +
1332 + @override
1333 + String get server_type_openai_display => 'OpenAI Compatible';
1334 +
1335 + @override
1336 + String get server_type_ollama_display => 'Ollama';
1337 +
1338 + @override
1339 + String get server_type_openrouter_display => 'OpenRouter';
1340 +
1341 + @override
1342 + String get server_type_on_device_display => 'On-Device';
1343 +
1344 + @override
1345 + String get server_address_openrouter => 'openrouter.ai';
1346 +
1347 + @override
1348 + String get server_address_on_device => 'Local inference';
1349 +
1350 + @override
1351 + String server_address_format(String host, String port) {
1352 + return '$host:$port';
1353 + }
1354 +
1355 + @override
1356 + String get default_badge => 'Default';
1357 +
1358 + @override
1359 + String get set_as_default => 'Set as Default';
1360 +
1361 + @override
1362 + String get select_icon => 'Select Icon';
1363 +
1364 + @override
1365 + String get select_icon_desc => 'Choose an icon for your server';
1366 +
1367 + @override
1368 + String get search_icons_hint => 'Suchen icons...';
1369 +
1370 + @override
1371 + String get server_icon_stack => 'Server Stack';
1372 +
1373 + @override
1374 + String get server_icon_stack2 => 'Server Stack 02';
1375 +
1376 + @override
1377 + String get server_icon_stack3 => 'Server Stack 03';
1378 +
1379 + @override
1380 + String get server_icon_cloud => 'Cloud';
1381 +
1382 + @override
1383 + String get server_icon_cloud_server => 'Cloud Server';
1384 +
1385 + @override
1386 + String get server_icon_mcp => 'MCP Server';
1387 +
1388 + @override
1389 + String get server_icon_database => 'Database';
1390 +
1391 + @override
1392 + String get server_icon_database1 => 'Database 01';
1393 +
1394 + @override
1395 + String get server_icon_database2 => 'Database 02';
1396 +
1397 + @override
1398 + String get server_icon_cpu => 'CPU';
1399 +
1400 + @override
1401 + String get server_icon_chip => 'Chip';
1402 +
1403 + @override
1404 + String get server_icon_chip2 => 'Chip 02';
1405 +
1406 + @override
1407 + String get server_icon_computer => 'Computer';
1408 +
1409 + @override
1410 + String get server_icon_laptop => 'Laptop';
1411 +
1412 + @override
1413 + String get server_icon_terminal => 'Computer Terminal';
1414 +
1415 + @override
1416 + String get server_icon_code => 'Code';
1417 +
1418 + @override
1419 + String get server_icon_ai_brain => 'AI Brain';
1420 +
1421 + @override
1422 + String get server_icon_ai_brain2 => 'AI Brain 02';
1423 +
1424 + @override
1425 + String get server_icon_ai_cloud => 'AI Cloud';
1426 +
1427 + @override
1428 + String get server_icon_ai_network => 'AI Network';
1429 +
1430 + @override
1431 + String get server_icon_ai_chat => 'AI Chat';
1432 +
1433 + @override
1434 + String get server_icon_cellular => 'Cellular Network';
1435 +
1436 + @override
1437 + String get server_icon_plug1 => 'Plug 01';
1438 +
1439 + @override
1440 + String get server_icon_plug2 => 'Plug 02';
1441 +
1442 + @override
1443 + String get server_icon_bot => 'Bot';
1444 +
1445 + @override
1446 + String get server_icon_bot2 => 'Bot 02';
1447 +
1448 + @override
1449 + String get server_icon_robotic => 'Robotic';
1450 +
1451 + @override
1452 + String get server_icon_rocket => 'Rocket';
1453 +
1454 + @override
1455 + String get server_icon_star => 'Star';
1456 +
1457 + @override
1458 + String get server_icon_settings1 => 'Einstellungen 01';
1459 +
1460 + @override
1461 + String get server_icon_settings2 => 'Einstellungen 02';
1462 +
1463 + @override
1464 + String get server_icon_home1 => 'Home 01';
1465 +
1466 + @override
1467 + String get server_icon_home2 => 'Home 02';
1468 +
1469 + @override
1470 + String get server_icon_folder1 => 'Folder 01';
1471 +
1472 + @override
1473 + String get server_icon_folder2 => 'Folder 02';
1474 +
1475 + @override
1476 + String get server_icon_file1 => 'File 01';
1477 +
1478 + @override
1479 + String get server_icon_lock => 'Lock';
1480 +
1481 + @override
1482 + String get server_icon_key => 'Key 01';
1483 +
1484 + @override
1485 + String get server_icon_link => 'Link 01';
1486 +
1487 + @override
1488 + String get server_icon_globe => 'Globe';
1489 +
1490 + @override
1491 + String get server_icon_api => 'API';
1492 +
1493 + @override
1494 + String get server_icon_arrow_right => 'Arrow Right 01';
1495 +
1496 + @override
1497 + String get server_icon_check => 'Check Circle';
1498 +
1499 + @override
1500 + String get server_icon_alert => 'Alert Circle';
1501 +
1502 + @override
1503 + String get server_icon_info => 'Info Circle';
1504 +
1505 + @override
1506 + String get server_icon_zap => 'Zap';
1507 +
1508 + @override
1509 + String get server_icon_cloud_upload => 'Cloud Upload';
1510 +
1511 + @override
1512 + String get server_icon_cloud_download => 'Cloud Download';
1513 +
1514 + @override
1515 + String get server_icon_refresh => 'Refresh';
1516 +
1517 + @override
1518 + String get server_icon_hard_drive => 'Hard Drive';
1519 +
1520 + @override
1521 + String get server_icon_drive => 'Drive';
1522 +
1523 + @override
1524 + String get personas_title => 'Personas';
1525 +
1526 + @override
1527 + String get persona_category_general => 'Allgemein';
1528 +
1529 + @override
1530 + String get persona_category_coding => 'Coding';
1531 +
1532 + @override
1533 + String get persona_category_education => 'Education';
1534 +
1535 + @override
1536 + String get persona_category_creative => 'Creative';
1537 +
1538 + @override
1539 + String get persona_builtin_section => 'BUILT-IN';
1540 +
1541 + @override
1542 + String get persona_my_section => 'MY PERSONAS';
1543 +
1544 + @override
1545 + String get clone_edit => 'Clone & Bearbeiten';
1546 +
1547 + @override
1548 + String get builtin_badge => 'Built-in';
1549 +
1550 + @override
1551 + String get no_personas_found => 'No personas found';
1552 +
1553 + @override
1554 + String get no_personas_desc =>
1555 + 'Create your first persona to customize AI behavior.';
1556 +
1557 + @override
1558 + String get edit_persona => 'Persona bearbeiten';
1559 +
1560 + @override
1561 + String get create_persona => 'Persona erstellen';
1562 +
1563 + @override
1564 + String get create_persona_button => 'Create';
1565 +
1566 + @override
1567 + String get emoji_label => 'Emoji';
1568 +
1569 + @override
1570 + String get name_label => 'Name';
1571 +
1572 + @override
1573 + String get my_persona_hint => 'My Persona';
1574 +
1575 + @override
1576 + String get category_label => 'Category';
1577 +
1578 + @override
1579 + String get description_optional => 'Description (optional)';
1580 +
1581 + @override
1582 + String get description_hint => 'What this persona does...';
1583 +
1584 + @override
1585 + String get system_prompt => 'System-Prompt';
1586 +
1587 + @override
1588 + String character_count_max(int currentLen) {
1589 + return '$currentLen/4000';
1590 + }
1591 +
1592 + @override
1593 + String get no_prompt_placeholder => 'No prompt yet...';
1594 +
1595 + @override
1596 + String get prompt_hint => 'You are a helpful assistant...';
1597 +
1598 + @override
1599 + String get prompt_required => 'System prompt is required';
1600 +
1601 + @override
1602 + String get prompt_max_chars => 'Max 4000 characters';
1603 +
1604 + @override
1605 + String get advanced_settings => 'Erweitert Einstellungen';
1606 +
1607 + @override
1608 + String get temperature_label => 'Temperature (0.0-2.0)';
1609 +
1610 + @override
1611 + String get top_p_label => 'Top P (0.0-1.0)';
1612 +
1613 + @override
1614 + String get temp_hint => '0.7';
1615 +
1616 + @override
1617 + String get top_p_hint => '0.9';
1618 +
1619 + @override
1620 + String get range_0_2 => '0.0-2.0';
1621 +
1622 + @override
1623 + String get range_0_1 => '0.0-1.0';
1624 +
1625 + @override
1626 + String get persona_updated => 'Persona updated';
1627 +
1628 + @override
1629 + String get persona_created => 'Persona created';
1630 +
1631 + @override
1632 + String get tts_models_title => 'Text To Speech Modelle';
1633 +
1634 + @override
1635 + String get always_available => 'Always available';
1636 +
1637 + @override
1638 + String get tts_system_desc =>
1639 + 'Uses your device\'s built-in text-to-speech engine.\nNo downloads required. Voice selection uses your device\'s system settings.';
1640 +
1641 + @override
1642 + String get downloading_status => 'Downloading...';
1643 +
1644 + @override
1645 + String tts_kitten_desc(String size) {
1646 + return 'Lightning-fast neural TTS with 8 expressive voices.\nRequires $size download.';
1647 + }
1648 +
1649 + @override
1650 + String tts_piper_desc(String size) {
1651 + return 'Fast offline Piper voices with 2 expressive voices.\nRequires $size download per voice.';
1652 + }
1653 +
1654 + @override
1655 + String engine_spec(String sizeMb, String ramMb, int voiceCount) {
1656 + return '$sizeMb MB · $ramMb MB RAM · $voiceCount voices';
1657 + }
1658 +
1659 + @override
1660 + String get on_device_models_title => 'On-Device Modelle';
1661 +
1662 + @override
1663 + String get settings_huggingface_token => 'Hugging Face Token (Optional)';
1664 +
1665 + @override
1666 + String get settings_huggingface_token_desc =>
1667 + 'Required only for gated models (e.g. Gemma). Get a token at huggingface.co/settings/tokens.';
1668 +
1669 + @override
1670 + String get settings_huggingface_token_set => 'Token saved';
1671 +
1672 + @override
1673 + String get settings_huggingface_token_cleared => 'Token cleared';
1674 +
1675 + @override
1676 + String get model_requires_huggingface_token =>
1677 + 'Requires a Hugging Face token';
1678 +
1679 + @override
1680 + String get model_missing_huggingface_token =>
1681 + 'This model is gated on Hugging Face. Hinzufügen a token in Einstellungen → On-Device Inference to download it.';
1682 +
1683 + @override
1684 + String get set_huggingface_token => 'Set token';
1685 +
1686 + @override
1687 + String get clear_huggingface_token => 'Clear';
1688 +
1689 + @override
1690 + String get edit_huggingface_token_dialog_title => 'Hugging Face Access Token';
1691 +
1692 + @override
1693 + String get huggingface_token_dialog_hint => 'hf_…';
1694 +
1695 + @override
1696 + String get server_type_ollama_desc =>
1697 + 'Lokal auf Ihrem Computer oder im Netzwerk ausgeführt';
1698 +
1699 + @override
1700 + String get server_type_on_device_desc =>
1701 + 'Modelle direkt auf diesem Gerät ausführen';
1702 +
1703 + @override
1704 + String get server_type_lm_studio_desc =>
1705 + 'Verbindung zur lokalen LM Studio Entwickler-API';
1706 +
1707 + @override
1708 + String get available_models => 'Available Modelle';
1709 +
1710 + @override
1711 + String get device_memory => 'Device Memory';
1712 +
1713 + @override
1714 + String get ram_usage => 'RAM Usage';
1715 +
1716 + @override
1717 + String get memory_healthy => 'Healthy';
1718 +
1719 + @override
1720 + String get memory_critical => 'Critical';
1721 +
1722 + @override
1723 + String get memory_low => 'Low';
1724 +
1725 + @override
1726 + String ram_used(String percent) {
1727 + return '$percent% used';
1728 + }
1729 +
1730 + @override
1731 + String get available_ram => 'Available RAM';
1732 +
1733 + @override
1734 + String get total_capacity => 'Total Capacity';
1735 +
1736 + @override
1737 + String get loaded_status => 'Loaded';
1738 +
1739 + @override
1740 + String get inference_backend => 'Inference Backend';
1741 +
1742 + @override
1743 + String get backend_ios_notice => 'Only CPU backend is available on iOS.';
1744 +
1745 + @override
1746 + String get backend_cpu_desc => 'Works on all devices. Most compatible.';
1747 +
1748 + @override
1749 + String get backend_gpu_desc =>
1750 + 'OpenCL acceleration. Faster on supported devices.';
1751 +
1752 + @override
1753 + String get backend_npu_desc =>
1754 + 'Vendor NPU (Qualcomm/MediaTek). Fastest inference.';
1755 +
1756 + @override
1757 + String get select_model_title => 'Select Modell';
1758 +
1759 + @override
1760 + String get refresh_models => 'Refresh models';
1761 +
1762 + @override
1763 + String get search_models_hint => 'Suchen models...';
1764 +
1765 + @override
1766 + String get no_server_connected => 'No server connected';
1767 +
1768 + @override
1769 + String get add_server_first =>
1770 + 'Hinzufügen a server first to see available models.';
1771 +
1772 + @override
1773 + String get failed_load_models => 'Fehlgeschlagen beim load models';
1774 +
1775 + @override
1776 + String get no_models_available => 'Keine Modelle verfügbar';
1777 +
1778 + @override
1779 + String no_models_match(String searchQuery) {
1780 + return 'No models match \"$searchQuery\"';
1781 + }
1782 +
1783 + @override
1784 + String model_load_failed(String error) {
1785 + return 'Fehlgeschlagen beim load model: $error';
1786 + }
1787 +
1788 + @override
1789 + String model_unloaded_ollama(String name) {
1790 + return 'Unload requested for $name. If Ollama is reachable, the model is released immediately.';
1791 + }
1792 +
1793 + @override
1794 + String model_unloaded_success(String name) {
1795 + return '$name unloaded successfully';
1796 + }
1797 +
1798 + @override
1799 + String model_unload_failed(String error) {
1800 + return 'Fehlgeschlagen beim unload model: $error';
1801 + }
1802 +
1803 + @override
1804 + String get unload_from_server => 'Unload from server';
1805 +
1806 + @override
1807 + String context_chip(String ctx) {
1808 + return '$ctx ctx';
1809 + }
1810 +
1811 + @override
1812 + String get unload_all_models => 'Unload all';
1813 +
1814 + @override
1815 + String loaded_models_count(int count) {
1816 + return '$count loaded';
1817 + }
1818 +
1819 + @override
1820 + String get all_models_unloaded => 'All models unloaded';
1821 +
1822 + @override
1823 + String get branch_chat => 'Branch chat';
1824 +
1825 + @override
1826 + String get branch_chat_desc => 'Start a new conversation from this message';
1827 +
1828 + @override
1829 + String get edit_assistant_message_desc =>
1830 + 'Bearbeiten the assistant response text.';
1831 +
1832 + @override
1833 + String switch_to_model(String modelName, Object model) {
1834 + return 'Switch to $modelName';
1835 + }
1836 +
1837 + @override
1838 + String download_notification_title(String modelName) {
1839 + return 'Downloading $modelName...';
1840 + }
1841 +
1842 + @override
1843 + String get download_complete_notification => 'Download abgeschlossen!';
1844 +
1845 + @override
1846 + String download_complete_body(String modelName) {
1847 + return '$modelName has been downloaded successfully.';
1848 + }
1849 +
1850 + @override
1851 + String download_failed_notification(String error) {
1852 + return 'Download fehlgeschlagen: $error';
1853 + }
1854 +
1855 + @override
1856 + String download_failed_body(String modelName) {
1857 + return 'Fehlgeschlagen beim download $modelName.';
1858 + }
1859 +
1860 + @override
1861 + String get engine_name_system => 'System TTS';
1862 +
1863 + @override
1864 + String get engine_tagline_system => 'Built-in device engine';
1865 +
1866 + @override
1867 + String get engine_name_kitten => 'Kitten TTS';
1868 +
1869 + @override
1870 + String get engine_tagline_kitten => 'High-speed neural TTS';
1871 +
1872 + @override
1873 + String get engine_name_sherpa => 'Sherpa ONNX VITS';
1874 +
1875 + @override
1876 + String get engine_tagline_sherpa => 'Offline Piper voices';
1877 +
1878 + @override
1879 + String get voice_jasper => 'Jasper';
1880 +
1881 + @override
1882 + String get voice_bella => 'Bella';
1883 +
1884 + @override
1885 + String get voice_bruno => 'Bruno';
1886 +
1887 + @override
1888 + String get voice_luna => 'Luna';
1889 +
1890 + @override
1891 + String get voice_hugo => 'Hugo';
1892 +
1893 + @override
1894 + String get voice_rosie => 'Rosie';
1895 +
1896 + @override
1897 + String get voice_leo => 'Leo';
1898 +
1899 + @override
1900 + String get voice_kiki => 'Kiki';
1901 +
1902 + @override
1903 + String get voice_lessac => 'Lessac (US)';
1904 +
1905 + @override
1906 + String get voice_ryan => 'Ryan (US)';
1907 +
1908 + @override
1909 + String get model_qwen_3 => 'Qwen 3 0.6B';
1910 +
1911 + @override
1912 + String get model_qwen_3_desc =>
1913 + 'Smallest general-purpose chat model. Fast responses, low memory usage.';
1914 +
1915 + @override
1916 + String get model_license_apache => 'Apache-2.0';
1917 +
1918 + @override
1919 + String get model_qwen_25 => 'Qwen 2.5 1.5B Instruct';
1920 +
1921 + @override
1922 + String get model_qwen_25_desc =>
1923 + 'Balanced quality and size. Good for general conversation.';
1924 +
1925 + @override
1926 + String get model_deepseek => 'DeepSeek R1 Distill Qwen 1.5B';
1927 +
1928 + @override
1929 + String get model_deepseek_desc =>
1930 + 'Reasoning and chain-of-thought model. Best for logical tasks.';
1931 +
1932 + @override
1933 + String get model_license_mit => 'MIT';
1934 +
1935 + @override
1936 + String get model_gemma => 'Gemma 4 E2B Instruct';
1937 +
1938 + @override
1939 + String get model_gemma_desc =>
1940 + 'Google flagship model. Highest quality, requires more RAM.';
1941 +
1942 + @override
1943 + String export_header(String date) {
1944 + return '*Exported from LocalMind — $date*';
1945 + }
1946 +
1947 + @override
1948 + String get export_role_user => '## 👤 User';
1949 +
1950 + @override
1951 + String get export_role_assistant => '## 🤖 Assistant';
1952 +
1953 + @override
1954 + String get export_role_system => '## ⚙️ System';
1955 +
1956 + @override
1957 + String get export_role_tool => '## 🔧 Tool';
1958 +
1959 + @override
1960 + String get export_text_user => '[USER]';
1961 +
1962 + @override
1963 + String get export_text_assistant => '[ASSISTANT]';
1964 +
1965 + @override
1966 + String get export_text_system => '[SYSTEM]';
1967 +
1968 + @override
1969 + String get export_text_tool => '[TOOL]';
1970 +
1971 + @override
1972 + String get export_label_user => 'USER';
1973 +
1974 + @override
1975 + String get export_label_assistant => 'ASSISTANT';
1976 +
1977 + @override
1978 + String get export_label_system => 'SYSTEM';
1979 +
1980 + @override
1981 + String get export_label_tool => 'TOOL';
1982 +
1983 + @override
1984 + String get select_model_hint => 'Wählen Sie ein Modell to start chatting';
1985 +
1986 + @override
1987 + String get test_notification_title => 'Test notification';
1988 +
1989 + @override
1990 + String get test_notification_body =>
1991 + 'This is a test notification for model download progress.';
1992 +
1993 + @override
1994 + String get tts_supports_background =>
1995 + 'Supports background playback as native audio';
1996 +
1997 + @override
1998 + String get tts_other_services_background_note =>
1999 + 'Note: The other TTS services support background playback as native audio.';
2000 +
2001 + @override
2002 + String get gguf_imported_models_title => 'Imported GGUF models';
2003 +
2004 + @override
2005 + String get gguf_imported_models_empty_subtitle =>
2006 + 'Import a GGUF from your device or add one from Hugging Face. Imported models run locally with llama.cpp.';
2007 +
2008 + @override
2009 + String get gguf_imported_models_ready =>
2010 + 'imported models ready for local inference.';
2011 +
2012 + @override
2013 + String get gguf_curated_models_subtitle =>
2014 + 'Curated on-device models you can download and manage inside LocalMind.';
2015 +
2016 + @override
2017 + String get gguf_only_supported =>
2018 + 'Only GGUF models are supported for this import.';
2019 +
2020 + @override
2021 + String get gguf_imported_from_local_file => 'imported from local file.';
2022 +
2023 + @override
2024 + String get gguf_import_failed => 'Fehlgeschlagen beim import GGUF model';
2025 +
2026 + @override
2027 + String get gguf_imported_from_huggingface => 'imported from Hugging Face.';
2028 +
2029 + @override
2030 + String get gguf_import_canceled => 'GGUF import canceled.';
2031 +
2032 + @override
2033 + String get gguf_enter_huggingface_url => 'Enter a Hugging Face GGUF URL.';
2034 +
2035 + @override
2036 + String get gguf_only_official_huggingface_urls =>
2037 + 'Only official Hugging Face GGUF URLs are supported.';
2038 +
2039 + @override
2040 + String get gguf_use_https_url =>
2041 + 'Use an HTTPS Hugging Face URL for GGUF import.';
2042 +
2043 + @override
2044 + String get gguf_url_must_point_to_file =>
2045 + 'The Hugging Face URL must point directly to a .gguf file.';
2046 +
2047 + @override
2048 + String get gguf_unable_to_detect_file_name =>
2049 + 'Unable to determine the GGUF file name.';
2050 +
2051 + @override
2052 + String get gguf_download_empty =>
2053 + 'The downloaded GGUF file was empty or missing.';
2054 +
2055 + @override
2056 + String get gguf_selected_file_missing =>
2057 + 'Selected model file does not exist.';
2058 +
2059 + @override
2060 + String get gguf_import_action => 'Import GGUF';
2061 +
2062 + @override
2063 + String get gguf_overview_title => 'Bring your own GGUF models';
2064 +
2065 + @override
2066 + String get gguf_overview_subtitle =>
2067 + 'Import a .gguf from local storage or download one straight from Hugging Face. Imported models stay on this device and load with llama.cpp.';
2068 +
2069 + @override
2070 + String get gguf_imported_count_label => 'imported';
2071 +
2072 + @override
2073 + String get gguf_local_files_label => 'local files';
2074 +
2075 + @override
2076 + String get gguf_huggingface_label => 'Hugging Face';
2077 +
2078 + @override
2079 + String get gguf_import_local_title => 'Import local GGUF';
2080 +
2081 + @override
2082 + String get gguf_import_local_subtitle => 'Copy a .gguf file from this device';
2083 +
2084 + @override
2085 + String get gguf_import_huggingface_title => 'Import from Hugging Face';
2086 +
2087 + @override
2088 + String get gguf_import_huggingface_subtitle =>
2089 + 'Paste a GGUF URL or repo path';
2090 +
2091 + @override
2092 + String get gguf_no_imported_title => 'No imported GGUF models yet';
2093 +
2094 + @override
2095 + String get gguf_no_imported_subtitle =>
2096 + 'You can bring your own GGUF file from device storage or paste a Hugging Face URL or repo path that points to a .gguf file.';
2097 +
2098 + @override
2099 + String get gguf_import_huggingface_dialog_title =>
2100 + 'Import GGUF from Hugging Face';
2101 +
2102 + @override
2103 + String get gguf_import_huggingface_dialog_subtitle =>
2104 + 'Paste a direct GGUF URL or a Hugging Face repo path like `owner/repo/blob/main/model.gguf`. Blob links are converted automatically.';
2105 +
2106 + @override
2107 + String get gguf_url_or_repo_path => 'GGUF URL or repo path';
2108 +
2109 + @override
2110 + String get paste => 'Paste';
2111 +
2112 + @override
2113 + String get gguf_browse => 'Browse GGUFs';
2114 +
2115 + @override
2116 + String get gguf_huggingface_token_ready => 'Hugging Face token ready';
2117 +
2118 + @override
2119 + String get gguf_huggingface_token_optional =>
2120 + 'Token optional but recommended';
2121 +
2122 + @override
2123 + String get gguf_huggingface_token_ready_desc =>
2124 + 'Your saved token will be used automatically for gated or private repositories.';
2125 +
2126 + @override
2127 + String get gguf_huggingface_token_optional_desc =>
2128 + 'Requires a Hugging Face token. Hinzufügen one in Einstellungen if this GGUF is gated or private.';
2129 +
2130 + @override
2131 + String get gguf_downloading => 'Downloading GGUF';
2132 +
2133 + @override
2134 + String get gguf_preparing => 'Preparing';
2135 +
2136 + @override
2137 + String get gguf_preparing_download => 'Preparing download...';
2138 +
2139 + @override
2140 + String get gguf_cancel_import => 'Abbrechen import';
2141 +
2142 + @override
2143 + String get clipboard_empty => 'Clipboard is empty.';
2144 +
2145 + @override
2146 + String get could_not_open_huggingface => 'Could not open Hugging Face.';
2147 +
2148 + @override
2149 + String get gguf_paste_url_error =>
2150 + 'Paste a Hugging Face GGUF URL or repo path.';
2151 +
2152 + @override
2153 + String get gguf_blob_link => 'Blob link';
2154 +
2155 + @override
2156 + String get gguf_repository_label => 'Repository';
2157 +
2158 + @override
2159 + String get gguf_detected_path_label => 'Detected path';
2160 +
2161 + @override
2162 + String get gguf_imported_section_label => 'Imported GGUF';
2163 +
2164 + @override
2165 + String get gguf_already_available => 'Already available on this device';
2166 +
2167 + @override
2168 + String get gguf_curated_models_short => 'Curated on-device models';
2169 +
2170 + @override
2171 + String get execute_tool_title => 'Execute Tool';
2172 +
2173 + @override
2174 + String get execute_tool_request_desc =>
2175 + 'The model is requesting to execute the following tool:';
2176 +
2177 + @override
2178 + String get reject => 'Reject';
2179 +
2180 + @override
2181 + String get approve => 'Approve';
2182 +
2183 + @override
2184 + String get server_type_help =>
2185 + 'Pick the provider before filling connection details.';
2186 +
2187 + @override
2188 + String get server_identity_title => 'Identity';
2189 +
2190 + @override
2191 + String get server_identity_desc =>
2192 + 'Name this server and choose how it appears in the list.';
2193 +
2194 + @override
2195 + String get server_connection_title => 'Connection';
2196 +
2197 + @override
2198 + String get server_connection_desc =>
2199 + 'Use the address and port exposed by your server.';
2200 +
2201 + @override
2202 + String get server_authentication_title => 'Authentication';
2203 +
2204 + @override
2205 + String get server_authentication_required_desc =>
2206 + 'OpenRouter requires an API key before testing.';
2207 +
2208 + @override
2209 + String get server_authentication_optional_desc =>
2210 + 'Leave the API key empty if this server does not require one.';
2211 +
2212 + @override
2213 + String get mcp_tools_title => 'MCP Tools';
2214 +
2215 + @override
2216 + String get available_tools => 'Available tools';
2217 +
2218 + @override
2219 + String get unable_load_tools => 'Unable to load tools';
2220 +
2221 + @override
2222 + String get no_tools_registered => 'No tools registered';
2223 +
2224 + @override
2225 + String get no_tools_registered_desc =>
2226 + 'Enable the example MCP server or add MCP integrations from chat settings.';
2227 +
2228 + @override
2229 + String get example_mcp_server_title => 'Example MCP server';
2230 +
2231 + @override
2232 + String get example_mcp_server_desc =>
2233 + 'Registers example.echo and example.word_count through the same MCP tool provider used by external servers.';
2234 +
2235 + @override
2236 + String get disable_example_server => 'Disable example server';
2237 +
2238 + @override
2239 + String get enable_example_server => 'Enable example server';
2240 +
2241 + @override
2242 + String get built_in_label => 'Built-in';
2243 +
2244 + @override
2245 + String get highlights_label => 'Highlights';
2246 +
2247 + @override
2248 + String get built_with_label => 'Built with';
2249 +
2250 + @override
2251 + String get local_label => 'Local';
2252 +
2253 + @override
2254 + String get gguf_format_label => 'GGUF';
2255 +
2256 + @override
2257 + String get tool_status_requested => 'Requested';
2258 +
2259 + @override
2260 + String get tool_status_approved => 'Approved';
2261 +
2262 + @override
2263 + String get tool_status_rejected => 'Rejected';
2264 +
2265 + @override
2266 + String get tool_status_running => 'Running';
2267 +
2268 + @override
2269 + String get tool_status_done => 'Done';
2270 +
2271 + @override
2272 + String get tool_status_failed => 'Fehlgeschlagen';
2273 +
2274 + @override
2275 + String get model_favorite_toggle => 'Toggle favorite';
2276 +
2277 + @override
2278 + String get model_set_default => 'Set as default model';
2279 +
2280 + @override
2281 + String get model_clear_default => 'Entfernen as default model';
2282 +
2283 + @override
2284 + String get model_default_badge => 'Default';
2285 +
2286 + @override
2287 + String get model_note_label => 'Note';
2288 +
2289 + @override
2290 + String get model_note_hint => 'Hinzufügen a note about this model…';
2291 +
2292 + @override
2293 + String get unload_models_before_load =>
2294 + 'Unload all models before loading a new one';
2295 +
2296 + @override
2297 + String get temp_chat_keyboard_incognito =>
2298 + 'Incognito keyboard in temporary chat';
2299 +
2300 + @override
2301 + String get temp_chat_keyboard_incognito_desc =>
2302 + 'Disables keyboard learning and suggestions in temporary chats (e.g. SwiftKey incognito).';
2303 +
2304 + @override
2305 + String get resume_last_chat => 'Resume last chat on launch';
2306 +
2307 + @override
2308 + String get resume_last_chat_desc =>
2309 + 'Restore your last open conversation when reopening the app.';
2310 +
2311 + @override
2312 + String get export_all_data => 'Export all data';
2313 +
2314 + @override
2315 + String get import_all_data => 'Import all data';
2316 +
2317 + @override
2318 + String get export_data_success => 'Backup exported successfully';
2319 +
2320 + @override
2321 + String get import_data_success => 'Backup imported successfully';
2322 +
2323 + @override
2324 + String import_data_failed(String error) {
2325 + return 'Fehlgeschlagen beim import backup: $error';
2326 + }
2327 +
2328 + @override
2329 + String get import_data_confirm =>
2330 + 'Import conversations and custom personas from this backup? Existing items with the same IDs will be updated.';
2331 +
2332 + @override
2333 + String get import_settings_confirm =>
2334 + 'Replace current settings with the imported backup?';
2335 +
2336 + @override
2337 + String get export_conversations => 'Export conversations';
2338 +
2339 + @override
2340 + String get import_conversations => 'Import conversations';
2341 +
2342 + @override
2343 + String get export_personas => 'Export personas';
2344 +
2345 + @override
2346 + String get import_personas => 'Import personas';
2347 +
2348 + @override
2349 + String get export_settings => 'Export settings';
2350 +
2351 + @override
2352 + String get import_settings => 'Import settings';
2353 +
2354 + @override
2355 + String get export_all_zip => 'Export all (ZIP)';
2356 +
2357 + @override
2358 + String get import_all_zip => 'Import all (ZIP)';
2359 +
2360 + @override
2361 + String get duplicate_chat => 'Duplicate chat';
2362 +
2363 + @override
2364 + String get duplicate_chat_success => 'Chat duplicated';
2365 +
2366 + @override
2367 + String get move_to_folder => 'Move to folder';
2368 +
2369 + @override
2370 + String get remove_from_folder => 'Entfernen from folder';
2371 +
2372 + @override
2373 + String get create_folder => 'Create folder';
2374 +
2375 + @override
2376 + String get new_folder => 'New folder';
2377 +
2378 + @override
2379 + String get folder_name_hint => 'Folder name';
2380 +
2381 + @override
2382 + String get all_chats => 'All';
2383 +
2384 + @override
2385 + String get unfiled_chats => 'Unfiled';
2386 +
2387 + @override
2388 + String get create => 'Create';
2389 +
2390 + @override
2391 + String get server_path_prefix_label => 'API path prefix';
2392 +
2393 + @override
2394 + String get server_path_prefix_hint => '/your-secret-token';
2395 +
2396 + @override
2397 + String get search_message_contents => 'Suchen message contents';
2398 +
2399 + @override
2400 + String get message_search_results => 'Message matches';
2401 +
2402 + @override
2403 + String get saved_messages_title => 'Saved Messages';
2404 +
2405 + @override
2406 + String get nav_saved_messages => 'Saved Messages';
2407 +
2408 + @override
2409 + String get saved_messages_empty =>
2410 + 'No saved messages yet. Bookmark a message from its options menu.';
2411 +
2412 + @override
2413 + String get save_message => 'Nachricht speichern';
2414 +
2415 + @override
2416 + String get message_saved => 'Message saved';
2417 +
2418 + @override
2419 + String token_count(int count) {
2420 + return '$count tokens';
2421 + }
2422 +
2423 + @override
2424 + String estimated_token_count(int count) {
2425 + return '~$count tokens (estimated)';
2426 + }
2427 +
2428 + @override
2429 + String get test_tts_section_title => 'Test voice';
2430 +
2431 + @override
2432 + String get test_tts_hint => 'Enter text to hear the current TTS engine…';
2433 +
2434 + @override
2435 + String get test_speak_button => 'Speak';
2436 +
2437 + @override
2438 + String get scroll_to_bottom => 'Scroll to bottom';
2439 +
2440 + @override
2441 + String get generate_ai_response => 'Generate AI response';
2442 +
2443 + @override
2444 + String get no_response => 'No response';
2445 +
2446 + @override
2447 + String get export => 'Export';
2448 +
2449 + @override
2450 + String get import => 'Import';
2451 +
2452 + @override
2453 + String get conversations_label => 'Conversations';
2454 +
2455 + @override
2456 + String get personas_label => 'Personas';
2457 +
2458 + @override
2459 + String get settings_label => 'Einstellungen';
2460 +
2461 + @override
2462 + String get export_conversation => 'Export conversation';
2463 +
2464 + @override
2465 + String get tts_process_markdown => 'Process markdown for speech';
2466 +
2467 + @override
2468 + String get tts_process_markdown_desc =>
2469 + 'Strip formatting like **bold** before reading aloud';
2470 +
2471 + @override
2472 + String get tts_skip_seconds => 'Skip interval';
2473 +
2474 + @override
2475 + String get tts_skip_seconds_desc =>
2476 + 'Forward and rewind jump size during playback';
2477 +
2478 + @override
2479 + String tts_skip_seconds_value(int seconds) {
2480 + return '${seconds}s';
2481 + }
2482 +
2483 + @override
2484 + String get preview_system_prompts => 'Preview system prompts';
2485 +
2486 + @override
2487 + String get welcome_message_1 => 'What can I help you with today?';
2488 +
2489 + @override
2490 + String get welcome_message_2 => 'Ask me anything — I\'m ready when you are.';
2491 +
2492 + @override
2493 + String get welcome_message_3 =>
2494 + 'Your data is processed locally and never leaves your device.';
2495 +
2496 + @override
2497 + String get welcome_message_4 => 'Need ideas? Try one of the quick prompts.';
2498 +
2499 + @override
2500 + String get temporary_chat => 'Temporary chat';
2501 +
2502 + @override
2503 + String get temporary_chat_desc => 'Chats aren\'t saved to history.';
2504 +
2505 + @override
2506 + String get temporary_chat_banner => 'Temporary chat — not saved to history';
2507 +
2508 + @override
2509 + String get temporary_chat_save_warning_title =>
2510 + 'Speichern message in temporary chat?';
2511 +
2512 + @override
2513 + String get temporary_chat_save_warning_body =>
2514 + 'This chat is temporary and hidden from history. The saved message will still appear in Saved Messages.';
2515 +
2516 + @override
2517 + String get save_to_history => 'Speichern to history';
2518 +
2519 + @override
2520 + String get share_conversation => 'Share conversation';
2521 +
2522 + @override
2523 + String get download_tts_audio => 'Download audio';
2524 +
2525 + @override
2526 + String get tts_download_unavailable =>
2527 + 'Download is only available for Piper and Kitten TTS';
2528 +
2529 + @override
2530 + String get tts_download_no_audio => 'No audio available to download yet';
2531 +
2532 + @override
2533 + String get tts_download_success => 'Audio saved';
2534 +
2535 + @override
2536 + String get return_to_chat => 'Return to chat';
2537 +
2538 + @override
2539 + String get return_to_temp_chat => 'Return to temporary chat';
2540 +
2541 + @override
2542 + String get insert_saved_message => 'Insert saved message';
2543 +
2544 + @override
2545 + String get insert_saved_message_desc =>
2546 + 'Choose a saved message to add to your input';
2547 +
2548 + @override
2549 + String get model_info => 'Modell info';
2550 +
2551 + @override
2552 + String get model_name => 'Modell name';
2553 +
2554 + @override
2555 + String get model_identifier => 'Identifier';
2556 +
2557 + @override
2558 + String get model_capabilities => 'Capabilities';
2559 +
2560 + @override
2561 + String get model_api_pricing => 'API pricing (per 1M tokens)';
2562 +
2563 + @override
2564 + String get not_available => 'Not available';
2565 +
2566 + @override
2567 + String get save_message_folders => 'Speichern message';
2568 +
2569 + @override
2570 + String get remove_from_saved => 'Entfernen from saved';
2571 +
2572 + @override
2573 + String get message_already_saved => 'Saved';
2574 +
2575 + @override
2576 + String get stream_ttft => 'Time to first token';
2577 +
2578 + @override
2579 + String get stream_tokens_per_sec => 'Tokens per second';
2580 +
2581 + @override
2582 + String get stream_stop_reason => 'Stop reason';
2583 +
2584 + @override
2585 + String get stream_input_tokens => 'Input tokens';
2586 +
2587 + @override
2588 + String get stream_output_tokens => 'Output tokens';
2589 +
2590 + @override
2591 + String get stream_generation_time => 'Generation time';
2592 +
2593 + @override
2594 + String get attach_image => 'Photos';
2595 +
2596 + @override
2597 + String get attach_text_document => 'Documents';
2598 +
2599 + @override
2600 + String get attach_shortcut_images => 'Photos';
2601 +
2602 + @override
2603 + String get attach_shortcut_documents => 'Files';
2604 +
2605 + @override
2606 + String get attach_shortcut_saved => 'Saved';
2607 +
2608 + @override
2609 + String get add_attachment => 'Hinzufügen attachment';
2610 +
2611 + @override
2612 + String get add_to_chat => 'Hinzufügen to chat';
2613 +
2614 + @override
2615 + String get choose_what_to_attach => 'What would you like to add?';
2616 +
2617 + @override
2618 + String get choose_attachment_subtitle =>
2619 + 'Pick a source to attach to your message';
2620 +
2621 + @override
2622 + String get photo_permission_denied =>
2623 + 'Photo access is required to attach images';
2624 +
2625 + @override
2626 + String get select_model_prompt => 'Select model';
2627 +
2628 + @override
2629 + String get characters_label => 'Characters';
2630 +
2631 + @override
2632 + String get exit_temporary_chat_title => 'Exit temporary chat?';
2633 +
2634 + @override
2635 + String get exit_temporary_chat_body =>
2636 + 'This will discard the current temporary chat and return to a new chat.';
2637 +
2638 + @override
2639 + String get saved_message_temp_snap_unavailable =>
2640 + 'This message was saved from a temporary chat and can\'t be opened in its original conversation.';
2641 +
2642 + @override
2643 + String get filter_title => 'Filter';
2644 +
2645 + @override
2646 + String get filter_pinned => 'Pinned';
2647 +
2648 + @override
2649 + String get filter_archived => 'Archived';
2650 +
2651 + @override
2652 + String get filter_temp_chats => 'Temporary chats';
2653 +
2654 + @override
2655 + String get filter_user_messages => 'User messages';
2656 +
2657 + @override
2658 + String get filter_assistant_messages => 'Assistant messages';
2659 +
2660 + @override
2661 + String get archive_chat => 'Archive';
2662 +
2663 + @override
2664 + String get unarchive_chat => 'Unarchive';
2665 +
2666 + @override
2667 + String conversation_message_count(int count) {
2668 + String _temp0 = intl.Intl.pluralLogic(
2669 + count,
2670 + locale: localeName,
2671 + other: '$count messages',
2672 + one: '1 message',
2673 + );
2674 + return '$_temp0';
2675 + }
2676 +
2677 + @override
2678 + String conversation_character_count(int count) {
2679 + return '$count chars';
2680 + }
2681 +
2682 + @override
2683 + String get generate_title_with_ai => 'Generate with AI';
2684 +
2685 + @override
2686 + String get generating_title => 'Generating...';
2687 +
2688 + @override
2689 + String get generate_title_failed => 'Could not generate a title';
2690 +
2691 + @override
2692 + String get lm_studio_model_browser_title => 'Browse models';
2693 +
2694 + @override
2695 + String get lm_studio_model_search_hint => 'Suchen models by name or author…';
2696 +
2697 + @override
2698 + String get lm_studio_staff_picks => 'Staff picks';
2699 +
2700 + @override
2701 + String get lm_studio_community_models => 'Community models';
2702 +
2703 + @override
2704 + String get lm_studio_no_models => 'Keine Modelle gefunden';
2705 +
2706 + @override
2707 + String lm_studio_models_count(int count) {
2708 + return '$count models';
2709 + }
2710 +
2711 + @override
2712 + String get lm_studio_browse_models => 'Browse & download';
2713 +
2714 + @override
2715 + String get lm_studio_model_search => 'LMS Modell Suchen';
2716 +
2717 + @override
2718 + String get lm_studio_downloads_title => 'Downloads';
2719 +
2720 + @override
2721 + String get lm_studio_choose_quant => 'Choose a download option';
2722 +
2723 + @override
2724 + String get lm_studio_use_default_quant => 'Use default';
2725 +
2726 + @override
2727 + String get lm_studio_recommended => 'Recommended';
2728 +
2729 + @override
2730 + String get lm_studio_clear_downloads => 'Clear finished';
2731 +
2732 + @override
2733 + String get lm_studio_no_downloads => 'No downloads yet';
2734 +
2735 + @override
2736 + String get lm_studio_downloads_disclaimer =>
2737 + 'Downloads run on the LM Studio host. Pausing, stopping, and deleting models must be done on that computer — not from this app.';
2738 +
2739 + @override
2740 + String get lm_studio_staff_pick => 'Staff pick';
2741 +
2742 + @override
2743 + String get lm_studio_params => 'PARAMS';
2744 +
2745 + @override
2746 + String get lm_studio_arch => 'ARCH';
2747 +
2748 + @override
2749 + String get lm_studio_domain => 'DOMAIN';
2750 +
2751 + @override
2752 + String get lm_studio_format => 'FORMAT';
2753 +
2754 + @override
2755 + String get lm_studio_vision => 'Vision';
2756 +
2757 + @override
2758 + String get lm_studio_tool_use => 'Tool use';
2759 +
2760 + @override
2761 + String get lm_studio_reasoning => 'Reasoning';
2762 +
2763 + @override
2764 + String get openrouter_pricing_free => 'Free';
2765 +
2766 + @override
2767 + String openrouter_pricing_tooltip(String input, String output) {
2768 + return 'Input $input / Output $output per 1M tokens';
2769 + }
2770 +
2771 + @override
2772 + String get lm_studio_download_options => 'Download options';
2773 +
2774 + @override
2775 + String get lm_studio_download => 'Download';
2776 +
2777 + @override
2778 + String lm_studio_download_size(String size) {
2779 + return 'Download $size';
2780 + }
2781 +
2782 + @override
2783 + String lm_studio_downloading_percent(int percent) {
2784 + return 'Downloading $percent%';
2785 + }
2786 +
2787 + @override
2788 + String get lm_studio_readme_unavailable =>
2789 + 'README not available for this model.';
2790 +
2791 + @override
2792 + String get lm_studio_full_gpu_offload => 'Full GPU offload possible';
2793 +
2794 + @override
2795 + String get lm_studio_partial_gpu_offload => 'Partial GPU offload possible';
2796 +
2797 + @override
2798 + String get lm_studio_likely_too_large => 'Likely too large';
2799 +
2800 + @override
2801 + String get lm_studio_available_ram_gb => 'Available RAM (GB, optional)';
2802 +
2803 + @override
2804 + String get lm_studio_available_vram_gb => 'Available VRAM (GB, optional)';
2805 +
2806 + @override
2807 + String get lm_studio_memory_settings_title => 'Memory for recommendations';
2808 +
2809 + @override
2810 + String get lm_studio_memory_settings_desc =>
2811 + 'Used to estimate whether models fit on your machine in the model browser.';
2812 +
2813 + @override
2814 + String get think_button_label => 'Think';
2815 +
2816 + @override
2817 + String get thinking_mode_title => 'Thinking mode';
2818 +
2819 + @override
2820 + String get reasoning_effort_low => 'Low';
2821 +
2822 + @override
2823 + String get reasoning_effort_medium => 'Medium';
2824 +
2825 + @override
2826 + String get reasoning_effort_high => 'High';
2827 +
2828 + @override
2829 + String get reasoning_effort_minimal => 'Minimal';
2830 +
2831 + @override
2832 + String get reasoning_effort_xhigh => 'X-High';
2833 +
2834 + @override
2835 + String get reasoning_effort_max => 'Max';
2836 +
2837 + @override
2838 + String get reasoning_effort_off => 'Off';
2839 +
2840 + @override
2841 + String get could_not_read_file => 'Could not read file';
2842 +
2843 + @override
2844 + String get server_offline => 'Server Offline';
2845 +
2846 + @override
2847 + String get could_not_establish_connection =>
2848 + 'Could not establish a connection to the server. Please check if your server is running and the host/port settings are correct.';
2849 +
2850 + @override
2851 + String get retry_connection => 'Retry Connection';
2852 +
2853 + @override
2854 + String get tokens_label => 'Tokens';
2855 +
2856 + @override
2857 + String get enter_context_length => 'Enter context length...';
2858 +
2859 + @override
2860 + String get openrouter_disclosure =>
2861 + 'By connecting this provider, your chat messages and inputs will be sent to their servers. LocalMind does not track or store your conversations.';
2862 +
2863 + @override
2864 + String get welcome_message_cloud =>
2865 + 'Your messages are sent to your connected provider.';
2866 +
2867 + @override
2868 + String get privacy_policy => 'Privacy Policy';
2869 +
2870 + @override
2871 + String get cloud_sync => 'S3 Cloud Sync';
2872 +
2873 + @override
2874 + String get cloud_sync_description =>
2875 + 'End-to-end encrypted sync to your own S3-compatible server';
2876 +
2877 + @override
2878 + String get cloud_sync_endpoint => 'Endpoint URL';
2879 +
2880 + @override
2881 + String get cloud_sync_bucket => 'Bucket';
2882 +
2883 + @override
2884 + String get cloud_sync_region => 'Region';
2885 +
2886 + @override
2887 + String get cloud_sync_prefix => 'Prefix';
2888 +
2889 + @override
2890 + String get cloud_sync_access_key => 'Access key ID';
2891 +
2892 + @override
2893 + String get cloud_sync_secret_key => 'Secret access key';
2894 +
2895 + @override
2896 + String get cloud_sync_session_token => 'Session token (optional)';
2897 +
2898 + @override
2899 + String get cloud_sync_passphrase => 'Encryption passphrase';
2900 +
2901 + @override
2902 + String get cloud_sync_confirm_passphrase => 'Confirm passphrase';
2903 +
2904 + @override
2905 + String get cloud_sync_path_style => 'Use path-style addressing';
2906 +
2907 + @override
2908 + String get cloud_sync_allow_http => 'Allow insecure HTTP';
2909 +
2910 + @override
2911 + String get cloud_sync_http_warning =>
2912 + 'HTTP exposes request metadata and credentials to the network. Use it only for a trusted local S3 server.';
2913 +
2914 + @override
2915 + String get cloud_sync_test => 'Test connection';
2916 +
2917 + @override
2918 + String get cloud_sync_enable => 'Enable encrypted sync';
2919 +
2920 + @override
2921 + String get cloud_sync_now => 'Sync now';
2922 +
2923 + @override
2924 + String get cloud_sync_disconnect => 'Disconnect this device';
2925 +
2926 + @override
2927 + String get cloud_sync_last_synced => 'Last synced';
2928 +
2929 + @override
2930 + String get cloud_sync_never => 'Never';
2931 +
2932 + @override
2933 + String get cloud_sync_conflicts => 'Conflicts preserved';
2934 +
2935 + @override
2936 + String get cloud_sync_passphrase_mismatch => 'Passphrases do not match';
2937 +
2938 + @override
2939 + String get crash_report_title => 'Something went wrong';
2940 +
2941 + @override
2942 + String get crash_report_stack_trace => 'Stack trace';
2943 +
2944 + @override
2945 + String get crash_report_tap_to_expand => 'Tap to expand';
2946 +
2947 + @override
2948 + String get crash_report_button => 'Report this crash';
2949 +
2950 + @override
2951 + String get crash_try_again => 'Try again';
2952 +
2953 + @override
2954 + String get crash_report_empty_stack => '<empty>';
2955 +
2956 + @override
2957 + String get crash_report_disclaimer =>
2958 + 'Reporting opens GitHub with diagnostics prefilled. You stay in control — nothing is submitted automatically. Please review and remove any sensitive content before submitting.';
2959 +
2960 + @override
2961 + String get crash_report_copied => 'In Zwischenablage kopiert';
2962 +
2963 + @override
2964 + String get report_a_problem => 'Problem melden';
2965 +
2966 + @override
2967 + String get rename_folder => 'Ordner umbenennen';
2968 +
2969 + @override
2970 + String get delete_folder => 'Ordner löschen';
2971 +
2972 + @override
2973 + String get delete_folder_title => 'Ordner löschen?';
2974 +
2975 + @override
2976 + String delete_folder_body(String name) {
2977 + return 'Möchten Sie den Ordner \"$name\" wirklich löschen? Enthaltene Unterhaltungen oder gespeicherte Nachrichten werden nach \"Unsortiert\" verschoben. Dies kann nicht rückgängig gemacht werden.';
2978 + }
2979 +
2980 + @override
2981 + String get folder_name_required => 'Bitte geben Sie einen Ordnernamen ein';
2982 +
2983 + @override
2984 + String get model_required_toast => 'Sie müssen zuerst ein Modell auswählen';
2985 +
2986 + @override
2987 + String get settings_concise_voice_responses =>
2988 + 'Prägnante Sprachmodus-Antworten';
2989 +
2990 + @override
2991 + String get settings_concise_voice_responses_desc =>
2992 + 'Halten Sie LLM-Antworten im Sprachmodus kurz (1 kurzer Absatz) und stellen Sie Nachfragen.';
2993 +
2994 + @override
2995 + String get s3_connection_succeeded => 'S3-Verbindung erfolgreich.';
2996 +
2997 + @override
2998 + String failed_to_open_url(String error) {
2999 + return 'URL konnte nicht geöffnet werden: $error';
3000 + }
3001 +
3002 + @override
3003 + String failed_to_copy(String error) {
3004 + return 'Kopieren fehlgeschlagen: $error';
3005 + }
3006 +}
lib/l10n/app_localizations_en.dart
+23 -1
@@ -564,7 +564,9 @@ class AppLocalizationsEn extends AppLocalizations {
564 String get assistant_open_settings => 'Open Android assistant settings';
565
566 @override
567 - String get assistant_error => 'Could not open Android assistant settings.';
567 + String assistant_error(Object error) {
568 + return 'Could not open Android assistant settings.';
569 + }
570
571 @override
572 String get settings_behavior => 'Behavior';
@@ -2971,4 +2973,24 @@ class AppLocalizationsEn extends AppLocalizations {
2973
2974 @override
2975 String get model_required_toast => 'You need to select a model first';
2976 +
2977 + @override
2978 + String get settings_concise_voice_responses => 'Concise Voice Mode Responses';
2979 +
2980 + @override
2981 + String get settings_concise_voice_responses_desc =>
2982 + 'Keep LLM responses brief (1 short paragraph) and ask follow-up questions in voice mode.';
2983 +
2984 + @override
2985 + String get s3_connection_succeeded => 'S3 connection succeeded.';
2986 +
2987 + @override
2988 + String failed_to_open_url(String error) {
2989 + return 'Failed to open URL: $error';
2990 + }
2991 +
2992 + @override
2993 + String failed_to_copy(String error) {
2994 + return 'Failed to copy: $error';
2995 + }
2996 }
lib/l10n/app_localizations_es.dart
+39 -11
@@ -537,38 +537,45 @@ class AppLocalizationsEs extends AppLocalizations {
537 String get settings_tts => 'Texto a voz';
538
539 @override
540 - String get settings_android_assistant => 'Android Assistant';
540 + String get settings_android_assistant => 'Asistente de Android';
541
542 @override
543 - String get assistant_default_title => 'Use LocalMind as your assistant';
543 + String get assistant_default_title => 'Asistente de voz predeterminado';
544
545 @override
546 String get assistant_default_description =>
547 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
547 + 'Establece Localmind como tu asistente de voz predeterminado en Android.';
548
549 @override
550 - String get assistant_status_active => 'Active';
550 + String get assistant_status_active =>
551 + 'Localmind está configurado como tu asistente predeterminado';
552
553 @override
553 - String get assistant_status_available => 'Not active';
554 + String get assistant_status_available =>
555 + 'Localmind se puede configurar como tu asistente predeterminado';
556
557 @override
556 - String get assistant_status_manual => 'Check settings';
558 + String get assistant_status_manual =>
559 + 'Abre los ajustes del sistema y selecciona Localmind manualmente';
560
561 @override
559 - String get assistant_status_unsupported => 'Unavailable';
562 + String get assistant_status_unsupported =>
563 + 'El asistente predeterminado solo está disponible en Android 7.0 o superior';
564
565 @override
562 - String get assistant_status_checking => 'Checking…';
566 + String get assistant_status_checking =>
567 + 'Comprobando el estado del asistente…';
568
569 @override
565 - String get assistant_set_default => 'Set as default assistant';
570 + String get assistant_set_default => 'Establecer asistente predeterminado';
571
572 @override
568 - String get assistant_open_settings => 'Open Android assistant settings';
573 + String get assistant_open_settings => 'Abrir ajustes del asistente';
574
575 @override
571 - String get assistant_error => 'Could not open Android assistant settings.';
576 + String assistant_error(Object error) {
577 + return 'Error: $error';
578 + }
579
580 @override
581 String get settings_behavior => 'Comportamiento';
@@ -2989,4 +2996,25 @@ class AppLocalizationsEs extends AppLocalizations {
2996
2997 @override
2998 String get model_required_toast => 'Primero debes seleccionar un modelo';
2999 +
3000 + @override
3001 + String get settings_concise_voice_responses =>
3002 + 'Respuestas concisas en modo voz';
3003 +
3004 + @override
3005 + String get settings_concise_voice_responses_desc =>
3006 + 'Mantén las respuestas del modelo breves (1 párrafo corto) y haz preguntas de seguimiento en modo voz.';
3007 +
3008 + @override
3009 + String get s3_connection_succeeded => 'Conexión a S3 realizada con éxito.';
3010 +
3011 + @override
3012 + String failed_to_open_url(String error) {
3013 + return 'Error al abrir la URL: $error';
3014 + }
3015 +
3016 + @override
3017 + String failed_to_copy(String error) {
3018 + return 'Error al copiar: $error';
3019 + }
3020 }
lib/l10n/app_localizations_fr.dart
+39 -11
@@ -535,38 +535,45 @@ class AppLocalizationsFr extends AppLocalizations {
535 String get settings_tts => 'Text-to-Speech';
536
537 @override
538 - String get settings_android_assistant => 'Android Assistant';
538 + String get settings_android_assistant => 'Assistant Android';
539
540 @override
541 - String get assistant_default_title => 'Use LocalMind as your assistant';
541 + String get assistant_default_title => 'Assistant vocal par défaut';
542
543 @override
544 String get assistant_default_description =>
545 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
545 + 'Définissez Localmind comme assistant vocal par défaut de votre système Android.';
546
547 @override
548 - String get assistant_status_active => 'Active';
548 + String get assistant_status_active =>
549 + 'Localmind est défini comme votre assistant par défaut';
550
551 @override
551 - String get assistant_status_available => 'Not active';
552 + String get assistant_status_available =>
553 + 'Localmind peut être défini comme votre assistant par défaut';
554
555 @override
554 - String get assistant_status_manual => 'Check settings';
556 + String get assistant_status_manual =>
557 + 'Ouvrez les paramètres système et sélectionnez Localmind manuellement';
558
559 @override
557 - String get assistant_status_unsupported => 'Unavailable';
560 + String get assistant_status_unsupported =>
561 + 'L\'assistant par défaut est disponible uniquement à partir d\'Android 7.0+';
562
563 @override
560 - String get assistant_status_checking => 'Checking…';
564 + String get assistant_status_checking =>
565 + 'Vérification du statut de l\'assistant…';
566
567 @override
563 - String get assistant_set_default => 'Set as default assistant';
568 + String get assistant_set_default => 'Définir l\'assistant par défaut';
569
570 @override
566 - String get assistant_open_settings => 'Open Android assistant settings';
571 + String get assistant_open_settings => 'Ouvrir les paramètres de l\'assistant';
572
573 @override
569 - String get assistant_error => 'Could not open Android assistant settings.';
574 + String assistant_error(Object error) {
575 + return 'Erreur : $error';
576 + }
577
578 @override
579 String get settings_behavior => 'Behavior';
@@ -2978,4 +2985,25 @@ class AppLocalizationsFr extends AppLocalizations {
2985
2986 @override
2987 String get model_required_toast => 'You need to select a model first';
2988 +
2989 + @override
2990 + String get settings_concise_voice_responses =>
2991 + 'Réponses concises en mode vocal';
2992 +
2993 + @override
2994 + String get settings_concise_voice_responses_desc =>
2995 + 'Conservez les réponses du LLM concises (1 court paragraphe) et posez des questions de suivi en mode vocal.';
2996 +
2997 + @override
2998 + String get s3_connection_succeeded => 'Connexion S3 réussie.';
2999 +
3000 + @override
3001 + String failed_to_open_url(String error) {
3002 + return 'Échec de l\'ouverture de l\'URL : $error';
3003 + }
3004 +
3005 + @override
3006 + String failed_to_copy(String error) {
3007 + return 'Échec de la copie : $error';
3008 + }
3009 }
lib/l10n/app_localizations_hi.dart
+38 -11
@@ -538,38 +538,45 @@ class AppLocalizationsHi extends AppLocalizations {
538 String get settings_tts => 'टेक्स्ट-टू-स्पीच';
539
540 @override
541 - String get settings_android_assistant => 'Android Assistant';
541 + String get settings_android_assistant => 'एंड्रॉइड असिस्टेंट';
542
543 @override
544 - String get assistant_default_title => 'Use LocalMind as your assistant';
544 + String get assistant_default_title => 'डिफ़ॉल्ट वॉयस असिस्टेंट';
545
546 @override
547 String get assistant_default_description =>
548 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
548 + 'Localmind को एंड्रॉइड पर अपना डिफ़ॉल्ट सिस्टम वॉयस असिस्टेंट सेट करें।';
549
550 @override
551 - String get assistant_status_active => 'Active';
551 + String get assistant_status_active =>
552 + 'Localmind आपके डिफ़ॉल्ट असिस्टेंट के रूप में सेट है';
553
554 @override
554 - String get assistant_status_available => 'Not active';
555 + String get assistant_status_available =>
556 + 'Localmind को डिफ़ॉल्ट असिस्टेंट के रूप में सेट किया जा सकता है';
557
558 @override
557 - String get assistant_status_manual => 'Check settings';
559 + String get assistant_status_manual =>
560 + 'सिस्टम सेटिंग्स खोलें और मैन्युअल रूप से Localmind चुनें';
561
562 @override
560 - String get assistant_status_unsupported => 'Unavailable';
563 + String get assistant_status_unsupported =>
564 + 'डिफ़ॉल्ट असिस्टेंट सेटिंग केवल एंड्रॉइड 7.0+ पर उपलब्ध है';
565
566 @override
563 - String get assistant_status_checking => 'Checking…';
567 + String get assistant_status_checking =>
568 + 'असिस्टेंट स्थिति की जांच की जा रही है…';
569
570 @override
566 - String get assistant_set_default => 'Set as default assistant';
571 + String get assistant_set_default => 'डिफ़ॉल्ट असिस्टेंट सेट करें';
572
573 @override
569 - String get assistant_open_settings => 'Open Android assistant settings';
574 + String get assistant_open_settings => 'असिस्टेंट सेटिंग्स खोलें';
575
576 @override
572 - String get assistant_error => 'Could not open Android assistant settings.';
577 + String assistant_error(Object error) {
578 + return 'त्रुटि: $error';
579 + }
580
581 @override
582 String get settings_behavior => 'व्यवहार';
@@ -2977,4 +2984,24 @@ class AppLocalizationsHi extends AppLocalizations {
2984
2985 @override
2986 String get model_required_toast => 'आपको पहले एक मॉडल चुनना होगा';
2987 +
2988 + @override
2989 + String get settings_concise_voice_responses => 'संक्षिप्त वॉयस मोड उत्तर';
2990 +
2991 + @override
2992 + String get settings_concise_voice_responses_desc =>
2993 + 'वॉयस मोड में LLM उत्तरों को संक्षिप्त (1 छोटा अनुच्छेद) रखें और अनुवर्ती प्रश्न पूछें।';
2994 +
2995 + @override
2996 + String get s3_connection_succeeded => 'S3 कनेक्शन सफल रहा।';
2997 +
2998 + @override
2999 + String failed_to_open_url(String error) {
3000 + return 'URL खोलने में विफल: $error';
3001 + }
3002 +
3003 + @override
3004 + String failed_to_copy(String error) {
3005 + return 'कॉपी करने में विफल: $error';
3006 + }
3007 }
lib/l10n/app_localizations_it.dart
+39 -11
@@ -539,38 +539,45 @@ class AppLocalizationsIt extends AppLocalizations {
539 String get settings_tts => 'Sintesi vocale';
540
541 @override
542 - String get settings_android_assistant => 'Android Assistant';
542 + String get settings_android_assistant => 'Assistente Android';
543
544 @override
545 - String get assistant_default_title => 'Use LocalMind as your assistant';
545 + String get assistant_default_title => 'Assistente vocale predefinito';
546
547 @override
548 String get assistant_default_description =>
549 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
549 + 'Imposta Localmind come assistente vocale predefinito del sistema su Android.';
550
551 @override
552 - String get assistant_status_active => 'Active';
552 + String get assistant_status_active =>
553 + 'Localmind è impostato come assistente predefinito';
554
555 @override
555 - String get assistant_status_available => 'Not active';
556 + String get assistant_status_available =>
557 + 'Localmind può essere impostato come assistente predefinito';
558
559 @override
558 - String get assistant_status_manual => 'Check settings';
560 + String get assistant_status_manual =>
561 + 'Apri le impostazioni di sistema e seleziona Localmind manualmente';
562
563 @override
561 - String get assistant_status_unsupported => 'Unavailable';
564 + String get assistant_status_unsupported =>
565 + 'L\'impostazione dell\'assistente predefinito è disponibile solo su Android 7.0+';
566
567 @override
564 - String get assistant_status_checking => 'Checking…';
568 + String get assistant_status_checking =>
569 + 'Verifica dello stato dell\'assistente in corso…';
570
571 @override
567 - String get assistant_set_default => 'Set as default assistant';
572 + String get assistant_set_default => 'Imposta assistente predefinito';
573
574 @override
570 - String get assistant_open_settings => 'Open Android assistant settings';
575 + String get assistant_open_settings => 'Apri impostazioni assistente';
576
577 @override
573 - String get assistant_error => 'Could not open Android assistant settings.';
578 + String assistant_error(Object error) {
579 + return 'Errore: $error';
580 + }
581
582 @override
583 String get settings_behavior => 'Comportamento';
@@ -2992,4 +2999,25 @@ class AppLocalizationsIt extends AppLocalizations {
2999
3000 @override
3001 String get model_required_toast => 'Devi prima selezionare un modello';
3002 +
3003 + @override
3004 + String get settings_concise_voice_responses =>
3005 + 'Risposte concise in modalità vocale';
3006 +
3007 + @override
3008 + String get settings_concise_voice_responses_desc =>
3009 + 'Mantieni le risposte LLM brevi (1 breve paragrafo) e fai domande di approfondimento in modalità vocale.';
3010 +
3011 + @override
3012 + String get s3_connection_succeeded => 'Connessione S3 riuscita.';
3013 +
3014 + @override
3015 + String failed_to_open_url(String error) {
3016 + return 'Impossibile aprire l\'URL: $error';
3017 + }
3018 +
3019 + @override
3020 + String failed_to_copy(String error) {
3021 + return 'Copia non riuscita: $error';
3022 + }
3023 }
lib/l10n/app_localizations_ja.dart
+34 -11
@@ -528,38 +528,41 @@ class AppLocalizationsJa extends AppLocalizations {
528 String get settings_tts => '音声合成';
529
530 @override
531 - String get settings_android_assistant => 'Android Assistant';
531 + String get settings_android_assistant => 'Android アシスタント';
532
533 @override
534 - String get assistant_default_title => 'Use LocalMind as your assistant';
534 + String get assistant_default_title => 'デフォルトの音声アシスタント';
535
536 @override
537 String get assistant_default_description =>
538 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
538 + 'Localmind を Android のシステムデフォルト音声アシスタントに設定します。';
539
540 @override
541 - String get assistant_status_active => 'Active';
541 + String get assistant_status_active => 'Localmind がデフォルトのアシスタントに設定されています';
542
543 @override
544 - String get assistant_status_available => 'Not active';
544 + String get assistant_status_available => 'Localmind をデフォルトのアシスタントに設定できます';
545
546 @override
547 - String get assistant_status_manual => 'Check settings';
547 + String get assistant_status_manual => 'システム設定を開き、Localmind を手動で選択してください';
548
549 @override
550 - String get assistant_status_unsupported => 'Unavailable';
550 + String get assistant_status_unsupported =>
551 + 'デフォルトアシスタントの設定は Android 7.0 以降でのみ利用可能です';
552
553 @override
553 - String get assistant_status_checking => 'Checking…';
554 + String get assistant_status_checking => 'アシスタントのステータスを確認中…';
555
556 @override
556 - String get assistant_set_default => 'Set as default assistant';
557 + String get assistant_set_default => 'デフォルトアシスタントに設定';
558
559 @override
559 - String get assistant_open_settings => 'Open Android assistant settings';
560 + String get assistant_open_settings => 'アシスタント設定を開く';
561
562 @override
562 - String get assistant_error => 'Could not open Android assistant settings.';
563 + String assistant_error(Object error) {
564 + return 'エラー: $error';
565 + }
566
567 @override
568 String get settings_behavior => '動作';
@@ -2920,4 +2923,24 @@ class AppLocalizationsJa extends AppLocalizations {
2923
2924 @override
2925 String get model_required_toast => '最初にモデルを選択する必要があります';
2926 +
2927 + @override
2928 + String get settings_concise_voice_responses => '簡潔な音声モード応答';
2929 +
2930 + @override
2931 + String get settings_concise_voice_responses_desc =>
2932 + '音声モードでのLLMの応答を短く(短い1段落)保ち、フォローアップの質問を行います。';
2933 +
2934 + @override
2935 + String get s3_connection_succeeded => 'S3 接続に成功しました。';
2936 +
2937 + @override
2938 + String failed_to_open_url(String error) {
2939 + return 'URL を開くことができませんでした: $error';
2940 + }
2941 +
2942 + @override
2943 + String failed_to_copy(String error) {
2944 + return 'コピーに失敗しました: $error';
2945 + }
2946 }
lib/l10n/app_localizations_ru.dart
+38 -11
@@ -537,38 +537,44 @@ class AppLocalizationsRu extends AppLocalizations {
537 String get settings_tts => 'Преобразование текста в речь';
538
539 @override
540 - String get settings_android_assistant => 'Android Assistant';
540 + String get settings_android_assistant => 'Помощник Android';
541
542 @override
543 - String get assistant_default_title => 'Use LocalMind as your assistant';
543 + String get assistant_default_title => 'Голосовой помощник по умолчанию';
544
545 @override
546 String get assistant_default_description =>
547 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
547 + 'Установите Localmind в качестве голосового помощника по умолчанию на Android.';
548
549 @override
550 - String get assistant_status_active => 'Active';
550 + String get assistant_status_active =>
551 + 'Localmind установлен в качестве помощника по умолчанию';
552
553 @override
553 - String get assistant_status_available => 'Not active';
554 + String get assistant_status_available =>
555 + 'Localmind можно установить в качестве помощника по умолчанию';
556
557 @override
556 - String get assistant_status_manual => 'Check settings';
558 + String get assistant_status_manual =>
559 + 'Откройте системные настройки и выберите Localmind вручную';
560
561 @override
559 - String get assistant_status_unsupported => 'Unavailable';
562 + String get assistant_status_unsupported =>
563 + 'Настройка помощника по умолчанию доступна только на Android 7.0+';
564
565 @override
562 - String get assistant_status_checking => 'Checking…';
566 + String get assistant_status_checking => 'Проверка статуса помощника…';
567
568 @override
565 - String get assistant_set_default => 'Set as default assistant';
569 + String get assistant_set_default => 'Установить помощник по умолчанию';
570
571 @override
568 - String get assistant_open_settings => 'Open Android assistant settings';
572 + String get assistant_open_settings => 'Открыть настройки помощника';
573
574 @override
571 - String get assistant_error => 'Could not open Android assistant settings.';
575 + String assistant_error(Object error) {
576 + return 'Ошибка: $error';
577 + }
578
579 @override
580 String get settings_behavior => 'Поведение';
@@ -2991,4 +2997,25 @@ class AppLocalizationsRu extends AppLocalizations {
2997
2998 @override
2999 String get model_required_toast => 'Сначала выберите модель';
3000 +
3001 + @override
3002 + String get settings_concise_voice_responses =>
3003 + 'Краткие ответы в голосовом режиме';
3004 +
3005 + @override
3006 + String get settings_concise_voice_responses_desc =>
3007 + 'Делайте ответы LLM короткими (1 короткий абзац) и задавайте уточняющие вопросы в голосовом режиме.';
3008 +
3009 + @override
3010 + String get s3_connection_succeeded => 'Подключение к S3 успешно.';
3011 +
3012 + @override
3013 + String failed_to_open_url(String error) {
3014 + return 'Не удалось открыть URL: $error';
3015 + }
3016 +
3017 + @override
3018 + String failed_to_copy(String error) {
3019 + return 'Не удалось скопировать: $error';
3020 + }
3021 }
lib/l10n/app_localizations_tr.dart
+37 -11
@@ -537,38 +537,44 @@ class AppLocalizationsTr extends AppLocalizations {
537 String get settings_tts => 'Metin Okuma';
538
539 @override
540 - String get settings_android_assistant => 'Android Assistant';
540 + String get settings_android_assistant => 'Android Asistanı';
541
542 @override
543 - String get assistant_default_title => 'Use LocalMind as your assistant';
543 + String get assistant_default_title => 'Varsayılan Sesli Asistan';
544
545 @override
546 String get assistant_default_description =>
547 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
547 + 'Localmind\'ı Android sisteminizdeki varsayılan sesli asistan olarak ayarlayın.';
548
549 @override
550 - String get assistant_status_active => 'Active';
550 + String get assistant_status_active =>
551 + 'Localmind varsayılan asistanınız olarak ayarlandı';
552
553 @override
553 - String get assistant_status_available => 'Not active';
554 + String get assistant_status_available =>
555 + 'Localmind varsayılan asistanınız olarak ayarlanabilir';
556
557 @override
556 - String get assistant_status_manual => 'Check settings';
558 + String get assistant_status_manual =>
559 + 'Sistem ayarlarını açın ve Localmind\'ı manuel olarak seçin';
560
561 @override
559 - String get assistant_status_unsupported => 'Unavailable';
562 + String get assistant_status_unsupported =>
563 + 'Varsayılan asistan ayarı yalnızca Android 7.0+ sürümünde mevcuttur';
564
565 @override
562 - String get assistant_status_checking => 'Checking…';
566 + String get assistant_status_checking => 'Asistan durumu kontrol ediliyor…';
567
568 @override
565 - String get assistant_set_default => 'Set as default assistant';
569 + String get assistant_set_default => 'Varsayılan Asistanı Ayarla';
570
571 @override
568 - String get assistant_open_settings => 'Open Android assistant settings';
572 + String get assistant_open_settings => 'Asistan Ayarlarını Aç';
573
574 @override
571 - String get assistant_error => 'Could not open Android assistant settings.';
575 + String assistant_error(Object error) {
576 + return 'Hata: $error';
577 + }
578
579 @override
580 String get settings_behavior => 'Davranış';
@@ -2997,4 +3003,24 @@ class AppLocalizationsTr extends AppLocalizations {
3003
3004 @override
3005 String get model_required_toast => 'Önce bir model seçmeniz gerekiyor';
3006 +
3007 + @override
3008 + String get settings_concise_voice_responses => 'Özet Sesli Mod Yanıtları';
3009 +
3010 + @override
3011 + String get settings_concise_voice_responses_desc =>
3012 + 'Sesli modda LLM yanıtlarını kısa tutun (1 kısa paragraf) ve takip soruları sorun.';
3013 +
3014 + @override
3015 + String get s3_connection_succeeded => 'S3 bağlantısı başarılı.';
3016 +
3017 + @override
3018 + String failed_to_open_url(String error) {
3019 + return 'URL açılamadı: $error';
3020 + }
3021 +
3022 + @override
3023 + String failed_to_copy(String error) {
3024 + return 'Kopyalanamadı: $error';
3025 + }
3026 }
lib/l10n/app_localizations_zh.dart
+89 -11
@@ -524,38 +524,40 @@ class AppLocalizationsZh extends AppLocalizations {
524 String get settings_tts => '语音合成 (TTS)';
525
526 @override
527 - String get settings_android_assistant => 'Android Assistant';
527 + String get settings_android_assistant => 'Android 助手';
528
529 @override
530 - String get assistant_default_title => 'Use LocalMind as your assistant';
530 + String get assistant_default_title => '默认语音助手';
531
532 @override
533 String get assistant_default_description =>
534 - 'Launch voice mode with Android\'s assistant gesture or power-button shortcut.';
534 + '将 Localmind 设置为 Android 系统默认的语音助手。';
535
536 @override
537 - String get assistant_status_active => 'Active';
537 + String get assistant_status_active => 'Localmind 已设置为默认助手';
538
539 @override
540 - String get assistant_status_available => 'Not active';
540 + String get assistant_status_available => '可将 Localmind 设置为默认助手';
541
542 @override
543 - String get assistant_status_manual => 'Check settings';
543 + String get assistant_status_manual => '打开系统设置并手动选择 Localmind';
544
545 @override
546 - String get assistant_status_unsupported => 'Unavailable';
546 + String get assistant_status_unsupported => '默认助手设置仅适用于 Android 7.0+';
547
548 @override
549 - String get assistant_status_checking => 'Checking…';
549 + String get assistant_status_checking => '正在检查助手状态…';
550
551 @override
552 - String get assistant_set_default => 'Set as default assistant';
552 + String get assistant_set_default => '设置默认助手';
553
554 @override
555 - String get assistant_open_settings => 'Open Android assistant settings';
555 + String get assistant_open_settings => '打开助手设置';
556
557 @override
558 - String get assistant_error => 'Could not open Android assistant settings.';
558 + String assistant_error(Object error) {
559 + return '错误: $error';
560 + }
561
562 @override
563 String get settings_behavior => '行为';
@@ -2898,6 +2900,26 @@ class AppLocalizationsZh extends AppLocalizations {
2900
2901 @override
2902 String get model_required_toast => '您需要先选择一个模型';
2903 +
2904 + @override
2905 + String get settings_concise_voice_responses => '简短语音模式回复';
2906 +
2907 + @override
2908 + String get settings_concise_voice_responses_desc =>
2909 + '在语音模式下保持 LLM 回复简短(1个短段落)并提出后续问题。';
2910 +
2911 + @override
2912 + String get s3_connection_succeeded => 'S3 连接成功。';
2913 +
2914 + @override
2915 + String failed_to_open_url(String error) {
2916 + return '无法打开 URL: $error';
2917 + }
2918 +
2919 + @override
2920 + String failed_to_copy(String error) {
2921 + return '复制失败: $error';
2922 + }
2923 }
2924
2925 /// The translations for Chinese, as used in Taiwan (`zh_TW`).
@@ -3419,6 +3441,42 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
3441 @override
3442 String get settings_tts => '語音合成 (TTS)';
3443
3444 + @override
3445 + String get settings_android_assistant => 'Android 助理';
3446 +
3447 + @override
3448 + String get assistant_default_title => '預設語音助理';
3449 +
3450 + @override
3451 + String get assistant_default_description =>
3452 + '將 Localmind 設定為 Android 系統預設的語音助理。';
3453 +
3454 + @override
3455 + String get assistant_status_active => 'Localmind 已設定為預設助理';
3456 +
3457 + @override
3458 + String get assistant_status_available => '可將 Localmind 設定為預設助理';
3459 +
3460 + @override
3461 + String get assistant_status_manual => '開啟系統設定並手動選擇 Localmind';
3462 +
3463 + @override
3464 + String get assistant_status_unsupported => '預設助理設定僅適用於 Android 7.0+';
3465 +
3466 + @override
3467 + String get assistant_status_checking => '正在檢查助理狀態…';
3468 +
3469 + @override
3470 + String get assistant_set_default => '設定預設助理';
3471 +
3472 + @override
3473 + String get assistant_open_settings => '開啟助理設定';
3474 +
3475 + @override
3476 + String assistant_error(Object error) {
3477 + return '錯誤: $error';
3478 + }
3479 +
3480 @override
3481 String get settings_behavior => '行為';
3482
@@ -5761,4 +5819,24 @@ class AppLocalizationsZhTw extends AppLocalizationsZh {
5819
5820 @override
5821 String get model_required_toast => '您需要先選擇一個模型';
5822 +
5823 + @override
5824 + String get settings_concise_voice_responses => '精簡語音模式回應';
5825 +
5826 + @override
5827 + String get settings_concise_voice_responses_desc =>
5828 + '在語音模式下保持 LLM 回應精簡(1個短段落)並提出後續問題。';
5829 +
5830 + @override
5831 + String get s3_connection_succeeded => 'S3 連線成功。';
5832 +
5833 + @override
5834 + String failed_to_open_url(String error) {
5835 + return '無法開啟 URL: $error';
5836 + }
5837 +
5838 + @override
5839 + String failed_to_copy(String error) {
5840 + return '複製失敗: $error';
5841 + }
5842 }
lib/l10n/app_ru.arb
+17 -1
@@ -897,5 +897,21 @@
897 "reasoning_effort_minimal": "Минимальный",
898 "reasoning_effort_xhigh": "Очень высокий",
899 "reasoning_effort_max": "Максимальный",
900 - "reasoning_effort_off": "Выкл"
900 + "reasoning_effort_off": "Выкл",
901 + "settings_android_assistant": "Помощник Android",
902 + "assistant_default_title": "Голосовой помощник по умолчанию",
903 + "assistant_default_description": "Установите Localmind в качестве голосового помощника по умолчанию на Android.",
904 + "assistant_status_active": "Localmind установлен в качестве помощника по умолчанию",
905 + "assistant_status_available": "Localmind можно установить в качестве помощника по умолчанию",
906 + "assistant_status_manual": "Откройте системные настройки и выберите Localmind вручную",
907 + "assistant_status_unsupported": "Настройка помощника по умолчанию доступна только на Android 7.0+",
908 + "assistant_status_checking": "Проверка статуса помощника…",
909 + "assistant_set_default": "Установить помощник по умолчанию",
910 + "assistant_open_settings": "Открыть настройки помощника",
911 + "assistant_error": "Ошибка: {error}",
912 + "settings_concise_voice_responses": "Краткие ответы в голосовом режиме",
913 + "settings_concise_voice_responses_desc": "Делайте ответы LLM короткими (1 короткий абзац) и задавайте уточняющие вопросы в голосовом режиме.",
914 + "s3_connection_succeeded": "Подключение к S3 успешно.",
915 + "failed_to_open_url": "Не удалось открыть URL: {error}",
916 + "failed_to_copy": "Не удалось скопировать: {error}"
917 }
lib/l10n/app_tr.arb
+17 -1
@@ -897,5 +897,21 @@
897 "reasoning_effort_minimal": "Minimum",
898 "reasoning_effort_xhigh": "Çok Yüksek",
899 "reasoning_effort_max": "Maksimum",
900 - "reasoning_effort_off": "Kapalı"
900 + "reasoning_effort_off": "Kapalı",
901 + "settings_android_assistant": "Android Asistanı",
902 + "assistant_default_title": "Varsayılan Sesli Asistan",
903 + "assistant_default_description": "Localmind'ı Android sisteminizdeki varsayılan sesli asistan olarak ayarlayın.",
904 + "assistant_status_active": "Localmind varsayılan asistanınız olarak ayarlandı",
905 + "assistant_status_available": "Localmind varsayılan asistanınız olarak ayarlanabilir",
906 + "assistant_status_manual": "Sistem ayarlarını açın ve Localmind'ı manuel olarak seçin",
907 + "assistant_status_unsupported": "Varsayılan asistan ayarı yalnızca Android 7.0+ sürümünde mevcuttur",
908 + "assistant_status_checking": "Asistan durumu kontrol ediliyor…",
909 + "assistant_set_default": "Varsayılan Asistanı Ayarla",
910 + "assistant_open_settings": "Asistan Ayarlarını Aç",
911 + "assistant_error": "Hata: {error}",
912 + "settings_concise_voice_responses": "Özet Sesli Mod Yanıtları",
913 + "settings_concise_voice_responses_desc": "Sesli modda LLM yanıtlarını kısa tutun (1 kısa paragraf) ve takip soruları sorun.",
914 + "s3_connection_succeeded": "S3 bağlantısı başarılı.",
915 + "failed_to_open_url": "URL açılamadı: {error}",
916 + "failed_to_copy": "Kopyalanamadı: {error}"
917 }
lib/l10n/app_zh.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "极低",
901 "reasoning_effort_xhigh": "极高",
902 "reasoning_effort_max": "最大",
903 - "reasoning_effort_off": "关闭"
903 + "reasoning_effort_off": "关闭",
904 + "settings_android_assistant": "Android 助手",
905 + "assistant_default_title": "默认语音助手",
906 + "assistant_default_description": "将 Localmind 设置为 Android 系统默认的语音助手。",
907 + "assistant_status_active": "Localmind 已设置为默认助手",
908 + "assistant_status_available": "可将 Localmind 设置为默认助手",
909 + "assistant_status_manual": "打开系统设置并手动选择 Localmind",
910 + "assistant_status_unsupported": "默认助手设置仅适用于 Android 7.0+",
911 + "assistant_status_checking": "正在检查助手状态…",
912 + "assistant_set_default": "设置默认助手",
913 + "assistant_open_settings": "打开助手设置",
914 + "assistant_error": "错误: {error}",
915 + "settings_concise_voice_responses": "简短语音模式回复",
916 + "settings_concise_voice_responses_desc": "在语音模式下保持 LLM 回复简短(1个短段落)并提出后续问题。",
917 + "s3_connection_succeeded": "S3 连接成功。",
918 + "failed_to_open_url": "无法打开 URL: {error}",
919 + "failed_to_copy": "复制失败: {error}"
920 }
lib/l10n/app_zh_TW.arb
+17 -1
@@ -900,5 +900,21 @@
900 "reasoning_effort_minimal": "極低",
901 "reasoning_effort_xhigh": "極高",
902 "reasoning_effort_max": "最大",
903 - "reasoning_effort_off": "關閉"
903 + "reasoning_effort_off": "關閉",
904 + "settings_android_assistant": "Android 助理",
905 + "assistant_default_title": "預設語音助理",
906 + "assistant_default_description": "將 Localmind 設定為 Android 系統預設的語音助理。",
907 + "assistant_status_active": "Localmind 已設定為預設助理",
908 + "assistant_status_available": "可將 Localmind 設定為預設助理",
909 + "assistant_status_manual": "開啟系統設定並手動選擇 Localmind",
910 + "assistant_status_unsupported": "預設助理設定僅適用於 Android 7.0+",
911 + "assistant_status_checking": "正在檢查助理狀態…",
912 + "assistant_set_default": "設定預設助理",
913 + "assistant_open_settings": "開啟助理設定",
914 + "assistant_error": "錯誤: {error}",
915 + "settings_concise_voice_responses": "精簡語音模式回應",
916 + "settings_concise_voice_responses_desc": "在語音模式下保持 LLM 回應精簡(1個短段落)並提出後續問題。",
917 + "s3_connection_succeeded": "S3 連線成功。",
918 + "failed_to_open_url": "無法開啟 URL: {error}",
919 + "failed_to_copy": "複製失敗: {error}"
920 }
lib/l10n/untranslated.txt
+1 -155
@@ -1,155 +1 @@
1 -{
2 - "ar": [
3 - "settings_android_assistant",
4 - "assistant_default_title",
5 - "assistant_default_description",
6 - "assistant_status_active",
7 - "assistant_status_available",
8 - "assistant_status_manual",
9 - "assistant_status_unsupported",
10 - "assistant_status_checking",
11 - "assistant_set_default",
12 - "assistant_open_settings",
13 - "assistant_error"
14 - ],
15 -
16 - "bn": [
17 - "settings_android_assistant",
18 - "assistant_default_title",
19 - "assistant_default_description",
20 - "assistant_status_active",
21 - "assistant_status_available",
22 - "assistant_status_manual",
23 - "assistant_status_unsupported",
24 - "assistant_status_checking",
25 - "assistant_set_default",
26 - "assistant_open_settings",
27 - "assistant_error"
28 - ],
29 -
30 - "es": [
31 - "settings_android_assistant",
32 - "assistant_default_title",
33 - "assistant_default_description",
34 - "assistant_status_active",
35 - "assistant_status_available",
36 - "assistant_status_manual",
37 - "assistant_status_unsupported",
38 - "assistant_status_checking",
39 - "assistant_set_default",
40 - "assistant_open_settings",
41 - "assistant_error"
42 - ],
43 -
44 - "fr": [
45 - "settings_android_assistant",
46 - "assistant_default_title",
47 - "assistant_default_description",
48 - "assistant_status_active",
49 - "assistant_status_available",
50 - "assistant_status_manual",
51 - "assistant_status_unsupported",
52 - "assistant_status_checking",
53 - "assistant_set_default",
54 - "assistant_open_settings",
55 - "assistant_error"
56 - ],
57 -
58 - "hi": [
59 - "settings_android_assistant",
60 - "assistant_default_title",
61 - "assistant_default_description",
62 - "assistant_status_active",
63 - "assistant_status_available",
64 - "assistant_status_manual",
65 - "assistant_status_unsupported",
66 - "assistant_status_checking",
67 - "assistant_set_default",
68 - "assistant_open_settings",
69 - "assistant_error"
70 - ],
71 -
72 - "it": [
73 - "settings_android_assistant",
74 - "assistant_default_title",
75 - "assistant_default_description",
76 - "assistant_status_active",
77 - "assistant_status_available",
78 - "assistant_status_manual",
79 - "assistant_status_unsupported",
80 - "assistant_status_checking",
81 - "assistant_set_default",
82 - "assistant_open_settings",
83 - "assistant_error"
84 - ],
85 -
86 - "ja": [
87 - "settings_android_assistant",
88 - "assistant_default_title",
89 - "assistant_default_description",
90 - "assistant_status_active",
91 - "assistant_status_available",
92 - "assistant_status_manual",
93 - "assistant_status_unsupported",
94 - "assistant_status_checking",
95 - "assistant_set_default",
96 - "assistant_open_settings",
97 - "assistant_error"
98 - ],
99 -
100 - "ru": [
101 - "settings_android_assistant",
102 - "assistant_default_title",
103 - "assistant_default_description",
104 - "assistant_status_active",
105 - "assistant_status_available",
106 - "assistant_status_manual",
107 - "assistant_status_unsupported",
108 - "assistant_status_checking",
109 - "assistant_set_default",
110 - "assistant_open_settings",
111 - "assistant_error"
112 - ],
113 -
114 - "tr": [
115 - "settings_android_assistant",
116 - "assistant_default_title",
117 - "assistant_default_description",
118 - "assistant_status_active",
119 - "assistant_status_available",
120 - "assistant_status_manual",
121 - "assistant_status_unsupported",
122 - "assistant_status_checking",
123 - "assistant_set_default",
124 - "assistant_open_settings",
125 - "assistant_error"
126 - ],
127 -
128 - "zh": [
129 - "settings_android_assistant",
130 - "assistant_default_title",
131 - "assistant_default_description",
132 - "assistant_status_active",
133 - "assistant_status_available",
134 - "assistant_status_manual",
135 - "assistant_status_unsupported",
136 - "assistant_status_checking",
137 - "assistant_set_default",
138 - "assistant_open_settings",
139 - "assistant_error"
140 - ],
141 -
142 - "zh_TW": [
143 - "settings_android_assistant",
144 - "assistant_default_title",
145 - "assistant_default_description",
146 - "assistant_status_active",
147 - "assistant_status_available",
148 - "assistant_status_manual",
149 - "assistant_status_unsupported",
150 - "assistant_status_checking",
151 - "assistant_set_default",
152 - "assistant_open_settings",
153 - "assistant_error"
154 - ]
155 -}
1 +{}
\ No newline at end of file