@tduncan / Cortana / commits / 7359802

feat: add Italian localization support and refactor language selection to a list view layout

abdulmominsakib committed May 23, 2026 at 19:16 UTC 735980240c03cc28b4c0053d6bed57a78067c213
9 files changed +2285 -112
assets/images/flag_it.png
Binary files /dev/null and b/assets/images/flag_it.png differ
lib/app.dart
+1
@@ -217,6 +217,7 @@ class App extends ConsumerWidget {
217 Locale('zh'),
218 Locale('es'),
219 Locale('hi'),
220 + Locale('it'),
221 ],
222 locale: localeCode != null ? Locale(localeCode) : null,
223 localeResolutionCallback: (locale, supportedLocales) {
lib/features/onboarding/screens/onboarding_language_screen.dart
+111 -93
@@ -41,6 +41,16 @@ const _languages = [
41 shortText: 'En',
42 gradient: [Color(0xFF6366F1), Color(0xFF4F46E5)],
43 ),
44 + _LanguageOption(
45 + code: 'it',
46 + nativeName: 'Italiano',
47 + englishName: 'Italian',
48 + flag: '🇮🇹',
49 + flagAsset: 'assets/images/flag_it.png',
50 + countryCode: 'IT',
51 + shortText: 'It',
52 + gradient: [Color(0xFF3B82F6), Color(0xFF1D4ED8)],
53 + ),
54 _LanguageOption(
55 code: 'es',
56 nativeName: 'Español',
@@ -71,16 +81,6 @@ const _languages = [
81 shortText: 'Ar',
82 gradient: [Color(0xFF10B981), Color(0xFF059669)],
83 ),
74 - _LanguageOption(
75 - code: 'hi',
76 - nativeName: 'हिन्दी',
77 - englishName: 'Hindi',
78 - flag: '🇮🇳',
79 - flagAsset: 'assets/images/flag_in.png',
80 - countryCode: 'IN',
81 - shortText: 'Hi',
82 - gradient: [Color(0xFFEC4899), Color(0xFFDB2777)],
83 - ),
84 _LanguageOption(
85 code: 'bn',
86 nativeName: 'বাংলা',
@@ -91,6 +91,16 @@ const _languages = [
91 shortText: 'Bn',
92 gradient: [Color(0xFF06B6D4), Color(0xFF0891B2)],
93 ),
94 + _LanguageOption(
95 + code: 'hi',
96 + nativeName: 'हिन्दी',
97 + englishName: 'Hindi',
98 + flag: '🇮🇳',
99 + flagAsset: 'assets/images/flag_in.png',
100 + countryCode: 'IN',
101 + shortText: 'Hi',
102 + gradient: [Color(0xFFEC4899), Color(0xFFDB2777)],
103 + ),
104 ];
105
106 class OnboardingLanguageScreen extends ConsumerStatefulWidget {
@@ -121,8 +131,7 @@ class _OnboardingLanguageScreenState
131 Widget build(BuildContext context) {
132 final l10n = AppLocalizations.of(context)!;
133 final theme = Theme.of(context);
124 - final screenWidth = MediaQuery.of(context).size.width;
125 - final crossAxisCount = screenWidth > 600 ? 3 : 2;
134 +
135
136 return Scaffold(
137 appBar: AppBar(
@@ -192,16 +201,11 @@ class _OnboardingLanguageScreenState
201 ),
202 ),
203 const SizedBox(height: 32),
195 - GridView.builder(
204 + ListView.separated(
205 shrinkWrap: true,
206 physics: const NeverScrollableScrollPhysics(),
198 - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
199 - crossAxisCount: crossAxisCount,
200 - crossAxisSpacing: 16,
201 - mainAxisSpacing: 16,
202 - childAspectRatio: 1.05,
203 - ),
207 itemCount: _languages.length,
208 + separatorBuilder: (context, index) => const SizedBox(height: 12),
209 itemBuilder: (context, index) {
210 final lang = _languages[index];
211 final isSelected = _selectedCode == lang.code;
@@ -218,7 +222,10 @@ class _OnboardingLanguageScreenState
222 },
223 child: AnimatedContainer(
224 duration: const Duration(milliseconds: 200),
221 - padding: const EdgeInsets.all(16),
225 + padding: const EdgeInsets.symmetric(
226 + horizontal: 16,
227 + vertical: 12,
228 + ),
229 decoration: BoxDecoration(
230 color: theme.colorScheme.surface,
231 borderRadius: BorderRadius.circular(16),
@@ -226,96 +233,107 @@ class _OnboardingLanguageScreenState
233 color: isSelected
234 ? theme.colorScheme.primary
235 : theme.colorScheme.outline
229 - .withValues(alpha: 0.3),
236 + .withValues(alpha: 0.15),
237 width: isSelected ? 2 : 1,
238 ),
239 boxShadow: isSelected
240 ? [
241 BoxShadow(
242 color: theme.colorScheme.primary
236 - .withValues(alpha: 0.15),
237 - blurRadius: 10,
238 - offset: const Offset(0, 4),
243 + .withValues(alpha: 0.1),
244 + blurRadius: 8,
245 + offset: const Offset(0, 2),
246 )
247 ]
248 : null,
249 ),
243 - child: Column(
244 - crossAxisAlignment: CrossAxisAlignment.start,
245 - mainAxisAlignment: MainAxisAlignment.spaceBetween,
250 + child: Row(
251 children: [
247 - Row(
248 - mainAxisAlignment:
249 - MainAxisAlignment.spaceBetween,
250 - children: [
251 - Container(
252 - width: 52,
253 - height: 36,
254 - decoration: BoxDecoration(
255 - color: Colors.white,
256 - borderRadius: BorderRadius.circular(6),
257 - border: Border.all(
258 - color: theme.colorScheme.outline
259 - .withValues(alpha: 0.15),
260 - width: 1,
261 - ),
262 - boxShadow: [
263 - BoxShadow(
264 - color: Colors.black.withValues(alpha: 0.05),
265 - blurRadius: 4,
266 - offset: const Offset(0, 2),
267 - ),
268 - ],
269 - ),
270 - alignment: Alignment.center,
271 - child: ClipRRect(
272 - borderRadius: BorderRadius.circular(5),
273 - child: Image.asset(
274 - lang.flagAsset,
275 - width: 52,
276 - height: 36,
277 - fit: BoxFit.cover,
278 - errorBuilder: (context, error, stackTrace) {
279 - return Text(
280 - lang.flag,
281 - style: const TextStyle(fontSize: 18),
282 - );
283 - },
284 - ),
285 - ),
252 + Container(
253 + width: 48,
254 + height: 32,
255 + decoration: BoxDecoration(
256 + color: Colors.white,
257 + borderRadius: BorderRadius.circular(6),
258 + border: Border.all(
259 + color: theme.colorScheme.outline
260 + .withValues(alpha: 0.15),
261 + width: 1,
262 ),
287 - if (isSelected)
288 - Icon(
289 - Icons.check_circle_rounded,
290 - color: theme.colorScheme.primary,
291 - size: 20,
263 + boxShadow: [
264 + BoxShadow(
265 + color: Colors.black.withValues(alpha: 0.05),
266 + blurRadius: 4,
267 + offset: const Offset(0, 2),
268 ),
293 - ],
269 + ],
270 + ),
271 + alignment: Alignment.center,
272 + child: ClipRRect(
273 + borderRadius: BorderRadius.circular(5),
274 + child: Image.asset(
275 + lang.flagAsset,
276 + width: 48,
277 + height: 32,
278 + fit: BoxFit.cover,
279 + errorBuilder: (context, error, stackTrace) {
280 + return Text(
281 + lang.flag,
282 + style: const TextStyle(fontSize: 18),
283 + );
284 + },
285 + ),
286 + ),
287 ),
295 - const SizedBox(height: 12),
296 - Column(
297 - crossAxisAlignment: CrossAxisAlignment.start,
298 - children: [
299 - Text(
300 - lang.nativeName,
301 - style:
302 - theme.textTheme.titleMedium?.copyWith(
303 - fontWeight: FontWeight.bold,
288 + const SizedBox(width: 16),
289 + Expanded(
290 + child: Column(
291 + crossAxisAlignment: CrossAxisAlignment.start,
292 + mainAxisSize: MainAxisSize.min,
293 + children: [
294 + Text(
295 + lang.nativeName,
296 + style:
297 + theme.textTheme.titleMedium?.copyWith(
298 + fontWeight: FontWeight.bold,
299 + ),
300 ),
305 - maxLines: 1,
306 - overflow: TextOverflow.ellipsis,
307 - ),
308 - const SizedBox(height: 2),
309 - Text(
310 - '${lang.englishName} • ${lang.shortText.toUpperCase()}',
311 - style: theme.textTheme.labelSmall?.copyWith(
312 - color: theme.colorScheme.onSurface
313 - .withValues(alpha: 0.5),
301 + const SizedBox(height: 2),
302 + Text(
303 + '${lang.englishName} • ${lang.shortText.toUpperCase()}',
304 + style: theme.textTheme.labelSmall?.copyWith(
305 + color: theme.colorScheme.onSurface
306 + .withValues(alpha: 0.5),
307 + ),
308 ),
315 - maxLines: 1,
316 - overflow: TextOverflow.ellipsis,
309 + ],
310 + ),
311 + ),
312 + const SizedBox(width: 8),
313 + AnimatedContainer(
314 + duration: const Duration(milliseconds: 200),
315 + width: 22,
316 + height: 22,
317 + decoration: BoxDecoration(
318 + shape: BoxShape.circle,
319 + color: isSelected
320 + ? theme.colorScheme.primary
321 + : Colors.transparent,
322 + border: Border.all(
323 + color: isSelected
324 + ? theme.colorScheme.primary
325 + : theme.colorScheme.outline
326 + .withValues(alpha: 0.3),
327 + width: 2,
328 ),
318 - ],
329 + ),
330 + child: isSelected
331 + ? const Icon(
332 + Icons.check,
333 + color: Colors.white,
334 + size: 14,
335 + )
336 + : null,
337 ),
338 ],
339 ),
lib/features/settings/views/settings_screen.dart
+38 -10
@@ -309,13 +309,14 @@ class _LanguageSetting extends StatelessWidget {
309 required this.isDark,
310 });
311
312 - static const _localeItems = <(String?, String)>[
313 - ('en', 'English'),
314 - ('ar', 'العربية'),
315 - ('bn', 'বাংলা'),
316 - ('zh', '中文'),
317 - ('es', 'Español'),
318 - ('hi', 'हिन्दी'),
312 + static const _localeItems = <(String, String, String, String)>[
313 + ('en', 'English', 'assets/images/flag_us.png', '🇺🇸'),
314 + ('it', 'Italiano', 'assets/images/flag_it.png', '🇮🇹'),
315 + ('es', 'Español', 'assets/images/flag_es.png', '🇪🇸'),
316 + ('zh', '中文', 'assets/images/flag_cn.png', '🇨🇳'),
317 + ('ar', 'العربية', 'assets/images/flag_sa.png', '🇸🇦'),
318 + ('bn', 'বাংলা', 'assets/images/flag_bd.png', '🇧🇩'),
319 + ('hi', 'हिन्दी', 'assets/images/flag_in.png', '🇮🇳'),
320 ];
321
322 final String? current;
@@ -364,7 +365,7 @@ class _LanguageSetting extends StatelessWidget {
365 children: [
366 Icon(
367 Icons.settings_suggest,
367 - size: 16,
368 + size: 18,
369 color: isDark
370 ? const Color(0xFF888888)
371 : const Color(0xFF999999),
@@ -384,8 +385,35 @@ class _LanguageSetting extends StatelessWidget {
385 value: item.$1,
386 child: Row(
387 children: [
387 - const Icon(Icons.language, size: 16),
388 - const SizedBox(width: 8),
388 + Container(
389 + width: 24,
390 + height: 16,
391 + decoration: BoxDecoration(
392 + borderRadius: BorderRadius.circular(2),
393 + border: Border.all(
394 + color: isDark
395 + ? const Color(0xFF444444)
396 + : const Color(0xFFDDDDDD),
397 + width: 0.5,
398 + ),
399 + ),
400 + child: ClipRRect(
401 + borderRadius: BorderRadius.circular(2),
402 + child: Image.asset(
403 + item.$3,
404 + width: 24,
405 + height: 16,
406 + fit: BoxFit.cover,
407 + errorBuilder: (context, error, stackTrace) {
408 + return Text(
409 + item.$4,
410 + style: const TextStyle(fontSize: 12),
411 + );
412 + },
413 + ),
414 + ),
415 + ),
416 + const SizedBox(width: 10),
417 Text(
418 item.$2,
419 style: TextStyle(
lib/l10n/app_it.arb new
+499
@@ -0,0 +1,499 @@
1 +{
2 + "@@locale": "it",
3 + "app_name": "LocalMind",
4 + "app_tagline": "La tua IA. Il tuo dispositivo. Le tue regole.",
5 + "app_version": "1.0.0",
6 + "cancel": "Annulla",
7 + "confirm": "Conferma",
8 + "delete": "Elimina",
9 + "save": "Salva",
10 + "retry": "Riprova",
11 + "close": "Chiudi",
12 + "done": "Done",
13 + "continue_action": "Continua",
14 + "skip": "Salta",
15 + "install": "Installa",
16 + "download": "Download",
17 + "resume": "Riprendi",
18 + "pause": "Pausa",
19 + "stop": "Stop",
20 + "edit": "Modificare",
21 + "preview": "Anteprima",
22 + "unload": "Scarico",
23 + "load": "Carico",
24 + "rename": "Rinomina",
25 + "pin": "Pin",
26 + "unpin": "Sblocca",
27 + "share": "Condividi",
28 + "copy": "Copia",
29 + "copied": "Copiato!",
30 + "copied_to_clipboard": "Copiato negli appunti",
31 + "select": "Seleziona",
32 + "active": "Attivo",
33 + "all": "Tutto",
34 + "none": "Nessuna",
35 + "none_selected": "Nessuna selezione",
36 + "online": "Online",
37 + "offline": "Offline",
38 + "error": "Errore",
39 + "unknown_error": "Errore sconosciuto",
40 + "not_now": "Non ora",
41 + "enable": "Abilita",
42 + "proceed_anyway": "Procedi Comunque",
43 + "test_connection": "Connessione di prova",
44 + "testing": "Collaudo",
45 + "connection_successful": "Connessione effettuata con successo!",
46 + "connection_failed": "Connessione non riuscita. Controlla le impostazioni.",
47 + "save_continue": "Salva e continua",
48 + "save_changes": "Salva modifiche",
49 + "finish_setup": "Fine impostazioni",
50 + "start_new_chat": "Avvia una nuova sessione di chat",
51 + "cannot_undo": "Non sarà possibile annullare questa operazione.",
52 + "ram_warning": "Avviso RAM",
53 + "recommended": "CONSIGLIATO",
54 + "may_be_large": "Potrebbe essere troppo grande per questo dispositivo",
55 + "calculating": "Calcolo in corso...",
56 + "download_failed": "Download non riuscito",
57 + "downloaded": "Scaricato",
58 + "not_downloaded": "Non scaricato",
59 + "installed": "Presente",
60 + "not_installed": "Non installata",
61 + "loading": "Caricamento in corso...",
62 + "thinking": "Pensiero",
63 + "processing": "Elaborazione in corso",
64 + "initializing": "Inizializzazione in corso...",
65 + "ready": "Pronto",
66 + "preparing_app": "Preparazione dell'app in corso...",
67 + "initializing_services": "Inizializzazione servizi in corso...",
68 + "configuring_server": "Configurazione del server in corso ...",
69 + "startup_failed": "Avvio non riuscito",
70 + "something_went_wrong": "Qualcosa non ha funzionato",
71 + "delete_model_title": "ELIMINARE UN MODELLO.",
72 + "delete_model_body": "Eliminare",
73 + "delete_model_body_with_size": "Sei sicuro di voler eliminare {name}? In questo modo libererai circa {size} di spazio.\n\nÈ possibile scaricare nuovamente questo modello in seguito, se necessario.",
74 + "delete_voice_title": "Elimina tag vocale",
75 + "chat_title": "LocalMind",
76 + "api_key_hint_openrouter": "sk-...",
77 + "delete_voice_body": "Sei sicuro di voler eliminare {name}? In questo modo libererai circa {size} di spazio.\n\nPuoi scaricare di nuovo questa voce in un secondo momento, se necessario.",
78 + "delete_server_title": "Elimina server",
79 + "delete_server_body": "Sei sicuro di voler eliminare \"{name}\"? L'operazione non può essere annullata.",
80 + "delete_conversation_title": "Eliminare la conversazione?",
81 + "delete_conversation_body": "Sei sicuro di voler eliminare \"{title}\"? L'operazione non può essere annullata.",
82 + "delete_message_title": "Eliminare il messaggio?",
83 + "delete_persona_title": "Eliminare \"{name}\"?",
84 + "delete_persona_body": "L'operazione non può essere annullata.",
85 + "clear_conversation_title": "Conversazioni chiare?",
86 + "clear_conversation_body": "Questo eliminerà tutti i messaggi in questa conversazione.",
87 + "clear": "Cancella",
88 + "label_completed": "{label} completato",
89 + "error_with_message": "Errore: {error}",
90 + "preview_failed": "Anteprima non riuscita: {error}",
91 + "loading_model": "Caricamento di {modelId}...",
92 + "model_loaded": "Modello caricato: {modelId} ({backend})",
93 + "no_model_loaded": "Nessun modello caricato. Tocca \"Gestisci modelli sul dispositivo\" per scaricare e caricare un modello.",
94 + "loading_model_error": "Errore: {error}",
95 + "delete_conversation": "Eliminare la conversazione?",
96 + "nav_history": "Storia",
97 + "nav_servers": "Server",
98 + "nav_local_models": "Modelli locali",
99 + "nav_tts": "Sintesi vocale",
100 + "nav_personas": "Personas",
101 + "nav_settings": "Impostazioni",
102 + "nav_new_chat": "Nuova chat",
103 + "search_hint": "Cerca conversazioni...",
104 + "no_server_selected": "Nessun server selezionato",
105 + "switch_server": "Cambia server",
106 + "switch_server_subtitle": "Scegli un server a cui connetterti",
107 + "manage_servers": "Gestisci server",
108 + "open_source": "Open Source",
109 + "open_source_desc": "LocalMind è open source. Segui i nostri progressi o contribuisci su GitHub.",
110 + "star_on_github": "Metti in evidenza su GitHub",
111 + "settings_title": "Impostazioni",
112 + "settings_appearance": "Aspetto",
113 + "settings_language": "Lingua",
114 + "language_system_default": "Predefinito di sistema",
115 + "settings_tts": "Sintesi vocale",
116 + "settings_behavior": "Comportamento",
117 + "settings_on_device": "Inferenza sul dispositivo",
118 + "settings_default_server": "Server predefinito",
119 + "settings_default_persona": "Persona predefinita",
120 + "settings_privacy": "Privacy",
121 + "settings_data_management": "Gestione dei dati",
122 + "settings_about": "Informazioni su",
123 + "theme": "Tema",
124 + "theme_system": "Sistema",
125 + "theme_light": "Luce",
126 + "theme_dark": "Scuro",
127 + "theme_claude": "Claude",
128 + "font_size": "Dimensione carattere",
129 + "font_size_desc": "Regola le dimensioni del testo in chat.",
130 + "font_preview": "La veloce volpe marrone salta sul cane pigro.",
131 + "code_theme_dark": "Tema codice (scuro)",
132 + "code_theme_light": "Tema codice (chiaro)",
133 + "code_theme_desc": "Scegli il tema di evidenziazione della sintassi per i blocchi di codice.",
134 + "tts_engine": "Motore TTS",
135 + "tts_engine_system": "System TTS",
136 + "tts_engine_kitten": "Gattino TTS",
137 + "voice": "Voce",
138 + "voice_female": "Donna",
139 + "voice_male": "Uomo",
140 + "voice_other": "Altro",
141 + "tts_speed": "Velocità TTS",
142 + "tts_speed_desc": "Regola la velocità di riproduzione.",
143 + "manage_tts_models": "Gestisci modelli TTS",
144 + "manage_on_device_models": "Gestisci modelli sul dispositivo",
145 + "enable_smart_reply": "Risposte intelligenti sul dispositivo",
146 + "streaming_responses": "Risposte in streaming",
147 + "auto_generate_titles": "Genera automaticamente titoli",
148 + "send_on_enter": "Invia su Invio",
149 + "show_system_messages": "Mostra messaggi di sistema",
150 + "haptic_feedback": "Feedback aptico",
151 + "enable_mcp": "Abilita MCP",
152 + "new_chat_mcp_default": "Nuova chat MCP predefinita",
153 + "show_data_indicator": "Mostra indicatore dati",
154 + "privacy_info": "\"LocalMind non vede mai i tuoi dati\"",
155 + "delete_all_conversations": "Elimina tutte le conversazioni",
156 + "reset_settings_defaults": "Ripristina impostazioni predefinite",
157 + "chat_parameters_tooltip": "Parametri della chat",
158 + "change_persona": "Cambia persona",
159 + "set_persona": "Imposta persona",
160 + "remove_persona": "Rimuovi Persona",
161 + "clear_conversation": "Cancella conversazione",
162 + "connection_error": "Errore di connessione. Controlla il tuo server.",
163 + "disconnected": "Disconnesso dal server.",
164 + "configure": "Configura",
165 + "select_model": "Seleziona modello",
166 + "select_persona": "Seleziona Persona",
167 + "start_conversation": "Avvia una conversazione",
168 + "recent_chats": "Chat recenti",
169 + "see_all": "Vedi tutto",
170 + "quick_write": "Aiutami a scrivere una funzione",
171 + "quick_explain": "Spiega questo codice",
172 + "quick_debug": "Esegui il debug per me",
173 + "quick_async": "Come si usa async/await?",
174 + "history_missing_title": "Cronologia mancante",
175 + "history_missing_desc": "I messaggi in questa chat sono stati eliminati o il record della cronologia è danneggiato.",
176 + "technical_details": "Dati tecnici",
177 + "last_error": "Ultimo errore:",
178 + "copy_info": "Copia informazioni",
179 + "conversation_id": "ID conversazione",
180 + "created_at": "Creato il",
181 + "expected_messages": "Messaggi previsti",
182 + "debug_dialog_desc": "Informazioni diagnostiche per aiutare a identificare i problemi di sincronizzazione.",
183 + "chat_input_hint": "Chiedi qualsiasi cosa",
184 + "send_message_tooltip": "Invia messaggio",
185 + "stop_generation_tooltip": "Interrompi generazione",
186 + "attach_images_tooltip": "Allega immagini",
187 + "tool_label": "Strumento: {toolCallId}",
188 + "tool_unknown": "Strumento: sconosciuto",
189 + "message_options": "Opzioni messaggio",
190 + "copy_markdown": "Copia come sconto",
191 + "copied_markdown": "Copiato come Markdown",
192 + "read_aloud": "Leggi ad alta voce",
193 + "stop_reading": "Smetti di leggere",
194 + "more": "Altro",
195 + "character_count": "{length} caratteri",
196 + "edit_message": "Modifica messaggio",
197 + "edit_message_desc": "Il salvataggio rimuoverà la risposta dell'assistente sottostante e la rigenererà.",
198 + "save_regenerate": "Salva e rigenera",
199 + "chat_settings_title": "Impostazioni chat",
200 + "reset_defaults": "Ripristina predefiniti",
201 + "parameters_tab": "Parametri",
202 + "mcp_tab": "MCP",
203 + "temperature": "Temperatura",
204 + "temperature_desc": "Controlla la casualità: Più alto = Creativo, Più basso = Concentrato",
205 + "top_p": "Top P",
206 + "top_p_desc": "Soglia di campionamento del nucleo",
207 + "max_tokens": "Numero massimo di token",
208 + "max_tokens_desc": "Limite di risposta",
209 + "context_length": "Lunghezza del contesto",
210 + "context_length_desc": "Finestra Cronologia",
211 + "mcp_disabled_warning": "MCP è disabilitato a livello globale. Abilitalo nelle Impostazioni per utilizzare queste funzionalità.",
212 + "mcp_enable_chat": "Abilita MCP per questa chat",
213 + "auto_execute_tools": "Esecuzione automatica degli strumenti",
214 + "add_ephemeral_mcp": "Aggiungi server MCP effimero",
215 + "mcp_label_placeholder": "Etichetta",
216 + "mcp_url_placeholder": "URL (https://...)",
217 + "active_integrations": "Integrazioni attive",
218 + "enable_notifications": "Abilita notifiche",
219 + "enable_notifications_desc": "Ricevi una notifica quando i modelli terminano il download.",
220 + "chat_history_title": "Cronologia chat",
221 + "conversation_just_now": "Proprio ora",
222 + "conversation_minutes_ago": "{minutes}m fa",
223 + "conversation_hours_ago": "{hours}h fa",
224 + "conversation_yesterday": "Ieri",
225 + "conversation_days_ago": "{days}d fa",
226 + "conversation_date": "{month}/{day}/{year}",
227 + "options_tooltip": "Opzioni",
228 + "no_results_found": "Nessun risultato trovato",
229 + "no_conversations_yet": "Ancora nessuna conversazione",
230 + "try_different_search": "Prova un altro termine di ricerca",
231 + "start_new_conversation": "Inizia una nuova conversazione",
232 + "rename_conversation": "Rinomina conversazione",
233 + "enter_new_title": "Inserisci un nuovo titolo",
234 + "pinned_section": "BLOCCATO",
235 + "today_section": "OGGI",
236 + "yesterday_section": "IERI",
237 + "previous_7_days": "7 GIORNI PRECEDENTI",
238 + "previous_30_days": "30 GIORNI PRECEDENTI",
239 + "older_section": "PRECEDENTE",
240 + "onboarding_choose_language": "Scegli la lingua",
241 + "onboarding_choose_language_desc": "Seleziona la tua lingua preferita. Puoi modificarlo in qualsiasi momento nelle impostazioni.",
242 + "onboarding_localmind": "LOCALMIND",
243 + "onboarding_connect_server": "Collega il tuo\nServer",
244 + "onboarding_connect_desc": "Connettiti a LM Studio, Ollama o\nOpenRouter per avviare la tua IA privata\nesperienza.",
245 + "onboarding_welcome": "Benvenuto in LocalMind",
246 + "server_type_on_device": "On-Device",
247 + "server_type_on_device_sub": "NESSUN SERVER NECESSARIO",
248 + "server_type_lm_studio": "LM Studio",
249 + "server_type_lm_studio_sub": "API LOCALE",
250 + "server_type_ollama": "Ollama",
251 + "server_type_ollama_sub": "MOTORE CLI",
252 + "server_type_openrouter": "OpenRouter",
253 + "server_type_openrouter_sub": "CLOUD UNIFICATO",
254 + "ready_continue": "PRONTO A CONTINUARE",
255 + "waiting_selection": "IN ATTESA DI SELEZIONE",
256 + "setup_connection": "Configura connessione",
257 + "setup_connection_desc": "Configura il tuo server {server} per iniziare a chattare.",
258 + "server_name": "Nome server",
259 + "name_required": "Nome obbligatorio",
260 + "name_max_50": "Max 50 caratteri",
261 + "host_label": "Indirizzo host / IP",
262 + "host_required": "Host obbligatorio",
263 + "port_label": "Porta",
264 + "port_required": "Porta richiesta",
265 + "port_invalid": "Deve essere un numero",
266 + "port_range": "Inserisci una porta valida (1-65535)",
267 + "api_key_required": "Chiave API *",
268 + "api_key_optional": "Chiave API (opzionale)",
269 + "api_key_required_openrouter": "Chiave API richiesta per OpenRouter",
270 + "api_key_format": "Le chiavi API OpenRouter iniziano con sk-",
271 + "my_server_hint": "Il mio server",
272 + "name_length_validation": "Il nome deve contenere al massimo 50 caratteri",
273 + "host_valid": "Inserisci un nome host o un indirizzo IP valido",
274 + "api_key_hint_generic": "Per server autenticati",
275 + "update_server": "Aggiorna server",
276 + "save_server": "Salva server",
277 + "server_updated": "Server aggiornato",
278 + "server_added": "Server aggiunto",
279 + "download_model_title": "Scarica un modello",
280 + "download_model_desc": "Scegli un modello da scaricare.\nVerrà eseguito localmente sul tuo dispositivo.",
281 + "on_device_android_only": "L'inferenza sul dispositivo è attualmente disponibile solo su Android.",
282 + "total_ram": "RAM totale",
283 + "available": "Disponibile",
284 + "ram_min_required": "{fileSize} GB RAM min",
285 + "download_progress": "{percent}% • {speed}",
286 + "eta_label": "ETA: {eta}",
287 + "paused_progress": "In pausa - {percent}%",
288 + "ram_warning_body_download": "Questo modello richiede almeno {ram} GB di RAM, ma il suo dispositivo dispone di {totalMemory}. Potrebbe non funzionare correttamente o causare l'arresto anomalo dell'app.",
289 + "ram_warning_body_load": "Il suo dispositivo ha {availableRAM} RAM disponibile, ma questo modello consiglia almeno {ram} GB. Il caricamento potrebbe non riuscire o causare instabilità.",
290 + "choose_theme": "Scegli tema",
291 + "choose_theme_desc": "Personalizza l'aspetto dell'app. Puoi sempre modificarlo in seguito nelle impostazioni.",
292 + "theme_card_system": "Sistema",
293 + "theme_card_system_sub": "Corrisponde alle impostazioni del tuo dispositivo",
294 + "theme_card_light": "Luce",
295 + "theme_card_light_sub": "Pulito e luminoso",
296 + "theme_card_dark": "Scuro",
297 + "theme_card_dark_sub": "Occhi facili",
298 + "theme_card_claude": "Claude",
299 + "theme_card_claude_sub": "Un tema caldo color\n pesca",
300 + "stay_updated": "Resta aggiornato",
301 + "stay_updated_desc": "Ricevi una notifica quando i tuoi modelli di intelligenza artificiale terminano il download o quando le attività di lunga durata vengono completate.",
302 + "notification_benefit_downloads": "Avanzamento download modello",
303 + "notification_benefit_completions": "Completamenti della generazione",
304 + "notification_benefit_background": "Stato delle attività in background",
305 + "allow_notifications": "Consenti notifiche",
306 + "servers_title": "Server",
307 + "no_servers_yet": "Ancora nessun server",
308 + "no_servers_desc": "Aggiungi il tuo primo server per iniziare a chattare con i modelli di intelligenza artificiale.",
309 + "add_server": "Aggiungi server",
310 + "switched_to_server": "Passato a {name}",
311 + "edit_server": "Modifica server",
312 + "add_server_title": "Aggiungi server",
313 + "server_type_label": "Tipo di server",
314 + "server_icon_label": "Icona del server",
315 + "default_icon": "Icona predefinita",
316 + "server_type_lm_studio_display": "LM Studio",
317 + "server_type_openai_display": "Compatibile con OpenAI",
318 + "server_type_ollama_display": "Ollama",
319 + "server_type_openrouter_display": "OpenRouter",
320 + "server_type_on_device_display": "On-Device",
321 + "server_address_openrouter": "openrouter.ai",
322 + "server_address_on_device": "Inferenza locale",
323 + "server_address_format": "{host}:{port}",
324 + "default_badge": "Predefinito",
325 + "set_as_default": "Imposta come predefinito",
326 + "select_icon": "Seleziona icona",
327 + "select_icon_desc": "Scegli un'icona per il tuo server",
328 + "search_icons_hint": "Cerca icone...",
329 + "server_icon_stack": "Stack di server",
330 + "server_icon_stack2": "Server Stack 02",
331 + "server_icon_stack3": "Server Stack 03",
332 + "server_icon_cloud": "Cloud",
333 + "server_icon_cloud_server": "Cloud Server",
334 + "server_icon_mcp": "Server MCP",
335 + "server_icon_database": "Database",
336 + "server_icon_database1": "Database 01",
337 + "server_icon_database2": "Database 02",
338 + "server_icon_cpu": "CPU",
339 + "server_icon_chip": "Chip",
340 + "server_icon_chip2": "Chip 02",
341 + "server_icon_computer": "Computer",
342 + "server_icon_laptop": "Laptop",
343 + "server_icon_terminal": "Terminale informatico",
344 + "server_icon_code": "Codice",
345 + "server_icon_ai_brain": "Cervello AI",
346 + "server_icon_ai_brain2": "AI Brain 02",
347 + "server_icon_ai_cloud": "AI Cloud",
348 + "server_icon_ai_network": "Rete AI",
349 + "server_icon_ai_chat": "AI Chat",
350 + "server_icon_cellular": "Rete cellulare",
351 + "server_icon_plug1": "Plug 01",
352 + "server_icon_plug2": "Plug 02",
353 + "server_icon_bot": "Bot",
354 + "server_icon_bot2": "Bot 02",
355 + "server_icon_robotic": "Robotica",
356 + "server_icon_rocket": "Razzo",
357 + "server_icon_star": "Stella",
358 + "server_icon_settings1": "Impostazioni 01",
359 + "server_icon_settings2": "Impostazioni 02",
360 + "server_icon_home1": "Home 01",
361 + "server_icon_home2": "Home 02",
362 + "server_icon_folder1": "Cartella 01",
363 + "server_icon_folder2": "Cartella 02",
364 + "server_icon_file1": "File 01",
365 + "server_icon_lock": "Blocca",
366 + "server_icon_key": "Chiave 01",
367 + "server_icon_link": "Link 01",
368 + "server_icon_globe": "Globe",
369 + "server_icon_api": "API",
370 + "server_icon_arrow_right": "Freccia destra 01",
371 + "server_icon_check": "Cerchio di controllo",
372 + "server_icon_alert": "Cerchio di allerta",
373 + "server_icon_info": "Info Circle",
374 + "server_icon_zap": "Zap",
375 + "server_icon_cloud_upload": "Caricamento cloud",
376 + "server_icon_cloud_download": "Cloud Download",
377 + "server_icon_refresh": "Aggiorna",
378 + "server_icon_hard_drive": "Disco rigido",
379 + "server_icon_drive": "Guida",
380 + "personas_title": "Personas",
381 + "persona_category_general": "Generale",
382 + "persona_category_coding": "Codifica",
383 + "persona_category_education": "Istruzione",
384 + "persona_category_creative": "Creativo",
385 + "persona_builtin_section": "INTEGRATO",
386 + "persona_my_section": "LE MIE PERSONAS",
387 + "clone_edit": "Clona e modifica",
388 + "builtin_badge": "Integrato",
389 + "no_personas_found": "Nessuna persona trovata",
390 + "no_personas_desc": "Crea la tua prima persona per personalizzare il comportamento dell'IA.",
391 + "edit_persona": "Modifica Persona",
392 + "create_persona": "Crea persona",
393 + "create_persona_button": "Crea",
394 + "emoji_label": "Emoji",
395 + "name_label": "Nome",
396 + "my_persona_hint": "La mia Persona",
397 + "category_label": "Categoria",
398 + "description_optional": "Descrizione (opzionale)",
399 + "description_hint": "Cosa fa questo personaggio...",
400 + "system_prompt": "Prompt di sistema",
401 + "character_count_max": "{currentLen}/4000",
402 + "no_prompt_placeholder": "Ancora nessun prompt...",
403 + "prompt_hint": "Sei un assistente utile...",
404 + "prompt_required": "Il prompt di sistema è obbligatorio",
405 + "prompt_max_chars": "Max 4000 caratteri",
406 + "advanced_settings": "Impostazioni avanzate",
407 + "temperature_label": "Temperatura (0,0-2,0)",
408 + "top_p_label": "Top P (0,0-1,0)",
409 + "temp_hint": "0.7",
410 + "top_p_hint": "0,9",
411 + "range_0_2": "0,0-2,0",
412 + "range_0_1": "0,0-1,0",
413 + "persona_updated": "Persona aggiornata",
414 + "persona_created": "Persona creata",
415 + "tts_models_title": "Modelli di sintesi vocale",
416 + "always_available": "Sempre disponibile",
417 + "tts_system_desc": "Utilizza il motore di sintesi vocale integrato nel dispositivo.\nNessun download richiesto. La selezione vocale utilizza le impostazioni di sistema del tuo dispositivo.",
418 + "downloading_status": "Download in corso...",
419 + "tts_kitten_desc": "TTS neurale fulmineo con 8 voci espressive.\nRichiede il download di {size}.",
420 + "tts_piper_desc": "Veloce voce Piper offline con 2 voci espressive.\nRichiede {size} download per voce.",
421 + "engine_spec": "{sizeMb} MB · {ramMb} MB RAM · {voiceCount} voci",
422 + "on_device_models_title": "Modelli sul dispositivo",
423 + "available_models": "Modelli disponibili",
424 + "device_memory": "Memoria del dispositivo",
425 + "ram_usage": "Utilizzo della RAM",
426 + "memory_healthy": "Sano",
427 + "memory_critical": "Critico",
428 + "memory_low": "Basso",
429 + "ram_used": "{percent}% utilizzato",
430 + "available_ram": "RAM disponibile",
431 + "total_capacity": "Capacità totale",
432 + "loaded_status": "Caricato",
433 + "inference_backend": "Backend di inferenza",
434 + "backend_ios_notice": "Solo il back-end della CPU è disponibile su iOS.",
435 + "backend_cpu_desc": "Funziona su tutti i dispositivi. Più compatibile.",
436 + "backend_gpu_desc": "Accelerazione OpenCL. Più veloce sui dispositivi supportati.",
437 + "backend_npu_desc": "NPU del fornitore (Qualcomm/MediaTek). L'inferenza più veloce.",
438 + "select_model_title": "Seleziona modello",
439 + "refresh_models": "Aggiorna modelli",
440 + "search_models_hint": "Cerca modelli...",
441 + "no_server_connected": "Nessun server connesso",
442 + "add_server_first": "Aggiungi prima un server per vedere i modelli disponibili.",
443 + "failed_load_models": "Impossibile caricare i modelli",
444 + "no_models_available": "Nessun modello disponibile",
445 + "no_models_match": "Nessun modello corrisponde a \"{searchQuery}\"",
446 + "model_load_failed": "Impossibile caricare il modello: {error}",
447 + "model_unloaded_ollama": "{name} verrà scaricato una volta trascorso il tempo di mantenimento in vita",
448 + "model_unloaded_success": "{name} scaricato correttamente",
449 + "model_unload_failed": "Impossibile scaricare il modello: {error}",
450 + "unload_from_server": "Scarica dal server",
451 + "context_chip": "{ctx} ctx",
452 + "download_notification_title": "Download di {modelName} in corso...",
453 + "download_complete_notification": "Download completato!",
454 + "download_complete_body": "{modelName} è stato scaricato correttamente.",
455 + "download_failed_notification": "Download non riuscito: {error}",
456 + "download_failed_body": "Impossibile scaricare {modelName}.",
457 + "engine_name_system": "System TTS",
458 + "engine_tagline_system": "Motore del dispositivo integrato",
459 + "engine_name_kitten": "Gattino TTS",
460 + "engine_tagline_kitten": "TTS neurale ad alta velocità",
461 + "engine_name_sherpa": "Sherpa ONNX VITS",
462 + "engine_tagline_sherpa": "Voci Piper offline",
463 + "voice_jasper": "Jasper",
464 + "voice_bella": "Bella",
465 + "voice_bruno": "Bruno",
466 + "voice_luna": "Luna",
467 + "voice_hugo": "Hugo",
468 + "voice_rosie": "Rosie",
469 + "voice_leo": "Leone",
470 + "voice_kiki": "Kiki",
471 + "voice_lessac": "Lessac (US)",
472 + "voice_ryan": "Ryan (US)",
473 + "model_qwen_3": "Qwen 3 0.6B",
474 + "model_qwen_3_desc": "Il più piccolo modello di chat generico. Risposte rapide, basso utilizzo della memoria.",
475 + "model_license_apache": "Apache-2.0",
476 + "model_qwen_25": "Qwen 2.5 1.5B Instruct",
477 + "model_qwen_25_desc": "Qualità e dimensioni equilibrate. Ottimo per una conversazione generale.",
478 + "model_deepseek": "Distillato DeepSeek R1 Qwen 1.5B",
479 + "model_deepseek_desc": "Modello di ragionamento e catena di pensiero. Ideale per attività logiche.",
480 + "model_license_mit": "MIT",
481 + "model_gemma": "Gemma 4 E2B Instruct",
482 + "model_gemma_desc": "Modello di punta di Google. Massima qualità, richiede più RAM.",
483 + "export_header": "*Esportato da LocalMind — {date}*",
484 + "export_role_user": "## 👤 Utente",
485 + "export_role_assistant": "## 🤖 Assistente",
486 + "export_role_system": "## ⚙️ Sistema",
487 + "export_role_tool": "## 🔧 Strumento",
488 + "export_text_user": "[USER]",
489 + "export_text_assistant": "[ASSISTENTE]",
490 + "export_text_system": "[SISTEMA]",
491 + "export_text_tool": "[STRUMENTO]",
492 + "export_label_user": "UTENTE",
493 + "export_label_assistant": "ASSISTENTE",
494 + "export_label_system": "SISTEMA",
495 + "export_label_tool": "STRUMENTO",
496 + "select_model_hint": "Seleziona un modello per iniziare a chattare",
497 + "test_notification_title": "Notifica di prova",
498 + "test_notification_body": "Questa è una notifica di prova per l'avanzamento del download del modello."
499 +}
\ No newline at end of file
lib/l10n/app_localizations.dart
+5
@@ -10,6 +10,7 @@ import 'app_localizations_bn.dart';
10 import 'app_localizations_en.dart';
11 import 'app_localizations_es.dart';
12 import 'app_localizations_hi.dart';
13 +import 'app_localizations_it.dart';
14 import 'app_localizations_zh.dart';
15
16 // ignore_for_file: type=lint
@@ -103,6 +104,7 @@ abstract class AppLocalizations {
104 Locale('en'),
105 Locale('es'),
106 Locale('hi'),
107 + Locale('it'),
108 Locale('zh'),
109 ];
110
@@ -3099,6 +3101,7 @@ class _AppLocalizationsDelegate
3101 'en',
3102 'es',
3103 'hi',
3104 + 'it',
3105 'zh',
3106 ].contains(locale.languageCode);
3107
@@ -3119,6 +3122,8 @@ AppLocalizations lookupAppLocalizations(Locale locale) {
3122 return AppLocalizationsEs();
3123 case 'hi':
3124 return AppLocalizationsHi();
3125 + case 'it':
3126 + return AppLocalizationsIt();
3127 case 'zh':
3128 return AppLocalizationsZh();
3129 }
lib/l10n/app_localizations_it.dart new
+1622
@@ -0,0 +1,1622 @@
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 Italian (`it`).
8 +class AppLocalizationsIt extends AppLocalizations {
9 + AppLocalizationsIt([String locale = 'it']) : super(locale);
10 +
11 + @override
12 + String get app_name => 'LocalMind';
13 +
14 + @override
15 + String get app_tagline => 'La tua IA. Il tuo dispositivo. Le tue regole.';
16 +
17 + @override
18 + String get app_version => '1.0.0';
19 +
20 + @override
21 + String get cancel => 'Annulla';
22 +
23 + @override
24 + String get confirm => 'Conferma';
25 +
26 + @override
27 + String get delete => 'Elimina';
28 +
29 + @override
30 + String get save => 'Salva';
31 +
32 + @override
33 + String get retry => 'Riprova';
34 +
35 + @override
36 + String get close => 'Chiudi';
37 +
38 + @override
39 + String get done => 'Done';
40 +
41 + @override
42 + String get continue_action => 'Continua';
43 +
44 + @override
45 + String get skip => 'Salta';
46 +
47 + @override
48 + String get install => 'Installa';
49 +
50 + @override
51 + String get download => 'Download';
52 +
53 + @override
54 + String get resume => 'Riprendi';
55 +
56 + @override
57 + String get pause => 'Pausa';
58 +
59 + @override
60 + String get stop => 'Stop';
61 +
62 + @override
63 + String get edit => 'Modificare';
64 +
65 + @override
66 + String get preview => 'Anteprima';
67 +
68 + @override
69 + String get unload => 'Scarico';
70 +
71 + @override
72 + String get load => 'Carico';
73 +
74 + @override
75 + String get rename => 'Rinomina';
76 +
77 + @override
78 + String get pin => 'Pin';
79 +
80 + @override
81 + String get unpin => 'Sblocca';
82 +
83 + @override
84 + String get share => 'Condividi';
85 +
86 + @override
87 + String get copy => 'Copia';
88 +
89 + @override
90 + String get copied => 'Copiato!';
91 +
92 + @override
93 + String get copied_to_clipboard => 'Copiato negli appunti';
94 +
95 + @override
96 + String get select => 'Seleziona';
97 +
98 + @override
99 + String get active => 'Attivo';
100 +
101 + @override
102 + String get all => 'Tutto';
103 +
104 + @override
105 + String get none => 'Nessuna';
106 +
107 + @override
108 + String get none_selected => 'Nessuna selezione';
109 +
110 + @override
111 + String get online => 'Online';
112 +
113 + @override
114 + String get offline => 'Offline';
115 +
116 + @override
117 + String get error => 'Errore';
118 +
119 + @override
120 + String get unknown_error => 'Errore sconosciuto';
121 +
122 + @override
123 + String get not_now => 'Non ora';
124 +
125 + @override
126 + String get enable => 'Abilita';
127 +
128 + @override
129 + String get proceed_anyway => 'Procedi Comunque';
130 +
131 + @override
132 + String get test_connection => 'Connessione di prova';
133 +
134 + @override
135 + String get testing => 'Collaudo';
136 +
137 + @override
138 + String get connection_successful => 'Connessione effettuata con successo!';
139 +
140 + @override
141 + String get connection_failed =>
142 + 'Connessione non riuscita. Controlla le impostazioni.';
143 +
144 + @override
145 + String get save_continue => 'Salva e continua';
146 +
147 + @override
148 + String get save_changes => 'Salva modifiche';
149 +
150 + @override
151 + String get finish_setup => 'Fine impostazioni';
152 +
153 + @override
154 + String get start_new_chat => 'Avvia una nuova sessione di chat';
155 +
156 + @override
157 + String get cannot_undo => 'Non sarà possibile annullare questa operazione.';
158 +
159 + @override
160 + String get ram_warning => 'Avviso RAM';
161 +
162 + @override
163 + String get recommended => 'CONSIGLIATO';
164 +
165 + @override
166 + String get may_be_large =>
167 + 'Potrebbe essere troppo grande per questo dispositivo';
168 +
169 + @override
170 + String get calculating => 'Calcolo in corso...';
171 +
172 + @override
173 + String get download_failed => 'Download non riuscito';
174 +
175 + @override
176 + String get downloaded => 'Scaricato';
177 +
178 + @override
179 + String get not_downloaded => 'Non scaricato';
180 +
181 + @override
182 + String get installed => 'Presente';
183 +
184 + @override
185 + String get not_installed => 'Non installata';
186 +
187 + @override
188 + String get loading => 'Caricamento in corso...';
189 +
190 + @override
191 + String get thinking => 'Pensiero';
192 +
193 + @override
194 + String get processing => 'Elaborazione in corso';
195 +
196 + @override
197 + String get initializing => 'Inizializzazione in corso...';
198 +
199 + @override
200 + String get ready => 'Pronto';
201 +
202 + @override
203 + String get preparing_app => 'Preparazione dell\'app in corso...';
204 +
205 + @override
206 + String get initializing_services => 'Inizializzazione servizi in corso...';
207 +
208 + @override
209 + String get configuring_server => 'Configurazione del server in corso ...';
210 +
211 + @override
212 + String get startup_failed => 'Avvio non riuscito';
213 +
214 + @override
215 + String get something_went_wrong => 'Qualcosa non ha funzionato';
216 +
217 + @override
218 + String get delete_model_title => 'ELIMINARE UN MODELLO.';
219 +
220 + @override
221 + String delete_model_body(String name) {
222 + return 'Eliminare';
223 + }
224 +
225 + @override
226 + String delete_model_body_with_size(String name, String size) {
227 + return 'Sei sicuro di voler eliminare $name? In questo modo libererai circa $size di spazio.\n\nÈ possibile scaricare nuovamente questo modello in seguito, se necessario.';
228 + }
229 +
230 + @override
231 + String get delete_voice_title => 'Elimina tag vocale';
232 +
233 + @override
234 + String delete_voice_body(String name, String size) {
235 + return 'Sei sicuro di voler eliminare $name? In questo modo libererai circa $size di spazio.\n\nPuoi scaricare di nuovo questa voce in un secondo momento, se necessario.';
236 + }
237 +
238 + @override
239 + String get delete_server_title => 'Elimina server';
240 +
241 + @override
242 + String delete_server_body(String name) {
243 + return 'Sei sicuro di voler eliminare \"$name\"? L\'operazione non può essere annullata.';
244 + }
245 +
246 + @override
247 + String get delete_conversation_title => 'Eliminare la conversazione?';
248 +
249 + @override
250 + String delete_conversation_body(String title) {
251 + return 'Sei sicuro di voler eliminare \"$title\"? L\'operazione non può essere annullata.';
252 + }
253 +
254 + @override
255 + String get delete_message_title => 'Eliminare il messaggio?';
256 +
257 + @override
258 + String delete_persona_title(String name) {
259 + return 'Eliminare \"$name\"?';
260 + }
261 +
262 + @override
263 + String get delete_persona_body => 'L\'operazione non può essere annullata.';
264 +
265 + @override
266 + String get clear_conversation_title => 'Conversazioni chiare?';
267 +
268 + @override
269 + String get clear_conversation_body =>
270 + 'Questo eliminerà tutti i messaggi in questa conversazione.';
271 +
272 + @override
273 + String get clear => 'Cancella';
274 +
275 + @override
276 + String label_completed(String label) {
277 + return '$label completato';
278 + }
279 +
280 + @override
281 + String error_with_message(String error) {
282 + return 'Errore: $error';
283 + }
284 +
285 + @override
286 + String preview_failed(String error) {
287 + return 'Anteprima non riuscita: $error';
288 + }
289 +
290 + @override
291 + String loading_model(String modelId) {
292 + return 'Caricamento di $modelId...';
293 + }
294 +
295 + @override
296 + String model_loaded(String modelId, String backend) {
297 + return 'Modello caricato: $modelId ($backend)';
298 + }
299 +
300 + @override
301 + String get no_model_loaded =>
302 + 'Nessun modello caricato. Tocca \"Gestisci modelli sul dispositivo\" per scaricare e caricare un modello.';
303 +
304 + @override
305 + String loading_model_error(String error) {
306 + return 'Errore: $error';
307 + }
308 +
309 + @override
310 + String get delete_conversation => 'Eliminare la conversazione?';
311 +
312 + @override
313 + String get nav_history => 'Storia';
314 +
315 + @override
316 + String get nav_servers => 'Server';
317 +
318 + @override
319 + String get nav_local_models => 'Modelli locali';
320 +
321 + @override
322 + String get nav_tts => 'Sintesi vocale';
323 +
324 + @override
325 + String get nav_personas => 'Personas';
326 +
327 + @override
328 + String get nav_settings => 'Impostazioni';
329 +
330 + @override
331 + String get nav_new_chat => 'Nuova chat';
332 +
333 + @override
334 + String get search_hint => 'Cerca conversazioni...';
335 +
336 + @override
337 + String get no_server_selected => 'Nessun server selezionato';
338 +
339 + @override
340 + String get switch_server => 'Cambia server';
341 +
342 + @override
343 + String get switch_server_subtitle => 'Scegli un server a cui connetterti';
344 +
345 + @override
346 + String get manage_servers => 'Gestisci server';
347 +
348 + @override
349 + String get open_source => 'Open Source';
350 +
351 + @override
352 + String get open_source_desc =>
353 + 'LocalMind è open source. Segui i nostri progressi o contribuisci su GitHub.';
354 +
355 + @override
356 + String get star_on_github => 'Metti in evidenza su GitHub';
357 +
358 + @override
359 + String get settings_title => 'Impostazioni';
360 +
361 + @override
362 + String get settings_appearance => 'Aspetto';
363 +
364 + @override
365 + String get settings_language => 'Lingua';
366 +
367 + @override
368 + String get language_system_default => 'Predefinito di sistema';
369 +
370 + @override
371 + String get settings_tts => 'Sintesi vocale';
372 +
373 + @override
374 + String get settings_behavior => 'Comportamento';
375 +
376 + @override
377 + String get settings_on_device => 'Inferenza sul dispositivo';
378 +
379 + @override
380 + String get settings_default_server => 'Server predefinito';
381 +
382 + @override
383 + String get settings_default_persona => 'Persona predefinita';
384 +
385 + @override
386 + String get settings_privacy => 'Privacy';
387 +
388 + @override
389 + String get settings_data_management => 'Gestione dei dati';
390 +
391 + @override
392 + String get settings_about => 'Informazioni su';
393 +
394 + @override
395 + String get theme => 'Tema';
396 +
397 + @override
398 + String get theme_system => 'Sistema';
399 +
400 + @override
401 + String get theme_light => 'Luce';
402 +
403 + @override
404 + String get theme_dark => 'Scuro';
405 +
406 + @override
407 + String get theme_claude => 'Claude';
408 +
409 + @override
410 + String get font_size => 'Dimensione carattere';
411 +
412 + @override
413 + String get font_size_desc => 'Regola le dimensioni del testo in chat.';
414 +
415 + @override
416 + String get font_preview => 'La veloce volpe marrone salta sul cane pigro.';
417 +
418 + @override
419 + String get code_theme_dark => 'Tema codice (scuro)';
420 +
421 + @override
422 + String get code_theme_light => 'Tema codice (chiaro)';
423 +
424 + @override
425 + String get code_theme_desc =>
426 + 'Scegli il tema di evidenziazione della sintassi per i blocchi di codice.';
427 +
428 + @override
429 + String get tts_engine => 'Motore TTS';
430 +
431 + @override
432 + String get tts_engine_system => 'System TTS';
433 +
434 + @override
435 + String get tts_engine_kitten => 'Gattino TTS';
436 +
437 + @override
438 + String get voice => 'Voce';
439 +
440 + @override
441 + String get voice_female => 'Donna';
442 +
443 + @override
444 + String get voice_male => 'Uomo';
445 +
446 + @override
447 + String get voice_other => 'Altro';
448 +
449 + @override
450 + String get tts_speed => 'Velocità TTS';
451 +
452 + @override
453 + String get tts_speed_desc => 'Regola la velocità di riproduzione.';
454 +
455 + @override
456 + String get manage_tts_models => 'Gestisci modelli TTS';
457 +
458 + @override
459 + String get manage_on_device_models => 'Gestisci modelli sul dispositivo';
460 +
461 + @override
462 + String get enable_smart_reply => 'Risposte intelligenti sul dispositivo';
463 +
464 + @override
465 + String get streaming_responses => 'Risposte in streaming';
466 +
467 + @override
468 + String get auto_generate_titles => 'Genera automaticamente titoli';
469 +
470 + @override
471 + String get send_on_enter => 'Invia su Invio';
472 +
473 + @override
474 + String get show_system_messages => 'Mostra messaggi di sistema';
475 +
476 + @override
477 + String get haptic_feedback => 'Feedback aptico';
478 +
479 + @override
480 + String get enable_mcp => 'Abilita MCP';
481 +
482 + @override
483 + String get new_chat_mcp_default => 'Nuova chat MCP predefinita';
484 +
485 + @override
486 + String get show_data_indicator => 'Mostra indicatore dati';
487 +
488 + @override
489 + String get privacy_info => '\"LocalMind non vede mai i tuoi dati\"';
490 +
491 + @override
492 + String get delete_all_conversations => 'Elimina tutte le conversazioni';
493 +
494 + @override
495 + String get reset_settings_defaults => 'Ripristina impostazioni predefinite';
496 +
497 + @override
498 + String get chat_title => 'LocalMind';
499 +
500 + @override
501 + String get chat_parameters_tooltip => 'Parametri della chat';
502 +
503 + @override
504 + String get change_persona => 'Cambia persona';
505 +
506 + @override
507 + String get set_persona => 'Imposta persona';
508 +
509 + @override
510 + String get remove_persona => 'Rimuovi Persona';
511 +
512 + @override
513 + String get clear_conversation => 'Cancella conversazione';
514 +
515 + @override
516 + String get connection_error =>
517 + 'Errore di connessione. Controlla il tuo server.';
518 +
519 + @override
520 + String get disconnected => 'Disconnesso dal server.';
521 +
522 + @override
523 + String get configure => 'Configura';
524 +
525 + @override
526 + String get select_model => 'Seleziona modello';
527 +
528 + @override
529 + String get select_persona => 'Seleziona Persona';
530 +
531 + @override
532 + String get start_conversation => 'Avvia una conversazione';
533 +
534 + @override
535 + String get recent_chats => 'Chat recenti';
536 +
537 + @override
538 + String get see_all => 'Vedi tutto';
539 +
540 + @override
541 + String get quick_write => 'Aiutami a scrivere una funzione';
542 +
543 + @override
544 + String get quick_explain => 'Spiega questo codice';
545 +
546 + @override
547 + String get quick_debug => 'Esegui il debug per me';
548 +
549 + @override
550 + String get quick_async => 'Come si usa async/await?';
551 +
552 + @override
553 + String get history_missing_title => 'Cronologia mancante';
554 +
555 + @override
556 + String get history_missing_desc =>
557 + 'I messaggi in questa chat sono stati eliminati o il record della cronologia è danneggiato.';
558 +
559 + @override
560 + String get technical_details => 'Dati tecnici';
561 +
562 + @override
563 + String get last_error => 'Ultimo errore:';
564 +
565 + @override
566 + String get copy_info => 'Copia informazioni';
567 +
568 + @override
569 + String get conversation_id => 'ID conversazione';
570 +
571 + @override
572 + String get created_at => 'Creato il';
573 +
574 + @override
575 + String get expected_messages => 'Messaggi previsti';
576 +
577 + @override
578 + String get debug_dialog_desc =>
579 + 'Informazioni diagnostiche per aiutare a identificare i problemi di sincronizzazione.';
580 +
581 + @override
582 + String get chat_input_hint => 'Chiedi qualsiasi cosa';
583 +
584 + @override
585 + String get send_message_tooltip => 'Invia messaggio';
586 +
587 + @override
588 + String get stop_generation_tooltip => 'Interrompi generazione';
589 +
590 + @override
591 + String get attach_images_tooltip => 'Allega immagini';
592 +
593 + @override
594 + String tool_label(String toolCallId) {
595 + return 'Strumento: $toolCallId';
596 + }
597 +
598 + @override
599 + String get tool_unknown => 'Strumento: sconosciuto';
600 +
601 + @override
602 + String get message_options => 'Opzioni messaggio';
603 +
604 + @override
605 + String get copy_markdown => 'Copia come sconto';
606 +
607 + @override
608 + String get copied_markdown => 'Copiato come Markdown';
609 +
610 + @override
611 + String get read_aloud => 'Leggi ad alta voce';
612 +
613 + @override
614 + String get stop_reading => 'Smetti di leggere';
615 +
616 + @override
617 + String get more => 'Altro';
618 +
619 + @override
620 + String character_count(int length) {
621 + return '$length caratteri';
622 + }
623 +
624 + @override
625 + String get edit_message => 'Modifica messaggio';
626 +
627 + @override
628 + String get edit_message_desc =>
629 + 'Il salvataggio rimuoverà la risposta dell\'assistente sottostante e la rigenererà.';
630 +
631 + @override
632 + String get save_regenerate => 'Salva e rigenera';
633 +
634 + @override
635 + String get chat_settings_title => 'Impostazioni chat';
636 +
637 + @override
638 + String get reset_defaults => 'Ripristina predefiniti';
639 +
640 + @override
641 + String get parameters_tab => 'Parametri';
642 +
643 + @override
644 + String get mcp_tab => 'MCP';
645 +
646 + @override
647 + String get temperature => 'Temperatura';
648 +
649 + @override
650 + String get temperature_desc =>
651 + 'Controlla la casualità: Più alto = Creativo, Più basso = Concentrato';
652 +
653 + @override
654 + String get top_p => 'Top P';
655 +
656 + @override
657 + String get top_p_desc => 'Soglia di campionamento del nucleo';
658 +
659 + @override
660 + String get max_tokens => 'Numero massimo di token';
661 +
662 + @override
663 + String get max_tokens_desc => 'Limite di risposta';
664 +
665 + @override
666 + String get context_length => 'Lunghezza del contesto';
667 +
668 + @override
669 + String get context_length_desc => 'Finestra Cronologia';
670 +
671 + @override
672 + String get mcp_disabled_warning =>
673 + 'MCP è disabilitato a livello globale. Abilitalo nelle Impostazioni per utilizzare queste funzionalità.';
674 +
675 + @override
676 + String get mcp_enable_chat => 'Abilita MCP per questa chat';
677 +
678 + @override
679 + String get auto_execute_tools => 'Esecuzione automatica degli strumenti';
680 +
681 + @override
682 + String get add_ephemeral_mcp => 'Aggiungi server MCP effimero';
683 +
684 + @override
685 + String get mcp_label_placeholder => 'Etichetta';
686 +
687 + @override
688 + String get mcp_url_placeholder => 'URL (https://...)';
689 +
690 + @override
691 + String get active_integrations => 'Integrazioni attive';
692 +
693 + @override
694 + String get enable_notifications => 'Abilita notifiche';
695 +
696 + @override
697 + String get enable_notifications_desc =>
698 + 'Ricevi una notifica quando i modelli terminano il download.';
699 +
700 + @override
701 + String get chat_history_title => 'Cronologia chat';
702 +
703 + @override
704 + String get conversation_just_now => 'Proprio ora';
705 +
706 + @override
707 + String conversation_minutes_ago(int minutes) {
708 + return '${minutes}m fa';
709 + }
710 +
711 + @override
712 + String conversation_hours_ago(int hours) {
713 + return '${hours}h fa';
714 + }
715 +
716 + @override
717 + String get conversation_yesterday => 'Ieri';
718 +
719 + @override
720 + String conversation_days_ago(int days) {
721 + return '${days}d fa';
722 + }
723 +
724 + @override
725 + String conversation_date(int month, int day, int year) {
726 + return '$month/$day/$year';
727 + }
728 +
729 + @override
730 + String get options_tooltip => 'Opzioni';
731 +
732 + @override
733 + String get no_results_found => 'Nessun risultato trovato';
734 +
735 + @override
736 + String get no_conversations_yet => 'Ancora nessuna conversazione';
737 +
738 + @override
739 + String get try_different_search => 'Prova un altro termine di ricerca';
740 +
741 + @override
742 + String get start_new_conversation => 'Inizia una nuova conversazione';
743 +
744 + @override
745 + String get rename_conversation => 'Rinomina conversazione';
746 +
747 + @override
748 + String get enter_new_title => 'Inserisci un nuovo titolo';
749 +
750 + @override
751 + String get pinned_section => 'BLOCCATO';
752 +
753 + @override
754 + String get today_section => 'OGGI';
755 +
756 + @override
757 + String get yesterday_section => 'IERI';
758 +
759 + @override
760 + String get previous_7_days => '7 GIORNI PRECEDENTI';
761 +
762 + @override
763 + String get previous_30_days => '30 GIORNI PRECEDENTI';
764 +
765 + @override
766 + String get older_section => 'PRECEDENTE';
767 +
768 + @override
769 + String get onboarding_choose_language => 'Scegli la lingua';
770 +
771 + @override
772 + String get onboarding_choose_language_desc =>
773 + 'Seleziona la tua lingua preferita. Puoi modificarlo in qualsiasi momento nelle impostazioni.';
774 +
775 + @override
776 + String get onboarding_localmind => 'LOCALMIND';
777 +
778 + @override
779 + String get onboarding_connect_server => 'Collega il tuo\nServer';
780 +
781 + @override
782 + String get onboarding_connect_desc =>
783 + 'Connettiti a LM Studio, Ollama o\nOpenRouter per avviare la tua IA privata\nesperienza.';
784 +
785 + @override
786 + String get onboarding_welcome => 'Benvenuto in LocalMind';
787 +
788 + @override
789 + String get server_type_on_device => 'On-Device';
790 +
791 + @override
792 + String get server_type_on_device_sub => 'NESSUN SERVER NECESSARIO';
793 +
794 + @override
795 + String get server_type_lm_studio => 'LM Studio';
796 +
797 + @override
798 + String get server_type_lm_studio_sub => 'API LOCALE';
799 +
800 + @override
801 + String get server_type_ollama => 'Ollama';
802 +
803 + @override
804 + String get server_type_ollama_sub => 'MOTORE CLI';
805 +
806 + @override
807 + String get server_type_openrouter => 'OpenRouter';
808 +
809 + @override
810 + String get server_type_openrouter_sub => 'CLOUD UNIFICATO';
811 +
812 + @override
813 + String get ready_continue => 'PRONTO A CONTINUARE';
814 +
815 + @override
816 + String get waiting_selection => 'IN ATTESA DI SELEZIONE';
817 +
818 + @override
819 + String get setup_connection => 'Configura connessione';
820 +
821 + @override
822 + String setup_connection_desc(String server) {
823 + return 'Configura il tuo server $server per iniziare a chattare.';
824 + }
825 +
826 + @override
827 + String get server_name => 'Nome server';
828 +
829 + @override
830 + String get name_required => 'Nome obbligatorio';
831 +
832 + @override
833 + String get name_max_50 => 'Max 50 caratteri';
834 +
835 + @override
836 + String get host_label => 'Indirizzo host / IP';
837 +
838 + @override
839 + String get host_required => 'Host obbligatorio';
840 +
841 + @override
842 + String get port_label => 'Porta';
843 +
844 + @override
845 + String get port_required => 'Porta richiesta';
846 +
847 + @override
848 + String get port_invalid => 'Deve essere un numero';
849 +
850 + @override
851 + String get port_range => 'Inserisci una porta valida (1-65535)';
852 +
853 + @override
854 + String get api_key_required => 'Chiave API *';
855 +
856 + @override
857 + String get api_key_optional => 'Chiave API (opzionale)';
858 +
859 + @override
860 + String get api_key_required_openrouter =>
861 + 'Chiave API richiesta per OpenRouter';
862 +
863 + @override
864 + String get api_key_format => 'Le chiavi API OpenRouter iniziano con sk-';
865 +
866 + @override
867 + String get my_server_hint => 'Il mio server';
868 +
869 + @override
870 + String get name_length_validation =>
871 + 'Il nome deve contenere al massimo 50 caratteri';
872 +
873 + @override
874 + String get host_valid => 'Inserisci un nome host o un indirizzo IP valido';
875 +
876 + @override
877 + String get api_key_hint_openrouter => 'sk-...';
878 +
879 + @override
880 + String get api_key_hint_generic => 'Per server autenticati';
881 +
882 + @override
883 + String get update_server => 'Aggiorna server';
884 +
885 + @override
886 + String get save_server => 'Salva server';
887 +
888 + @override
889 + String get server_updated => 'Server aggiornato';
890 +
891 + @override
892 + String get server_added => 'Server aggiunto';
893 +
894 + @override
895 + String get download_model_title => 'Scarica un modello';
896 +
897 + @override
898 + String get download_model_desc =>
899 + 'Scegli un modello da scaricare.\nVerrà eseguito localmente sul tuo dispositivo.';
900 +
901 + @override
902 + String get on_device_android_only =>
903 + 'L\'inferenza sul dispositivo è attualmente disponibile solo su Android.';
904 +
905 + @override
906 + String get total_ram => 'RAM totale';
907 +
908 + @override
909 + String get available => 'Disponibile';
910 +
911 + @override
912 + String ram_min_required(String fileSize) {
913 + return '$fileSize GB RAM min';
914 + }
915 +
916 + @override
917 + String download_progress(String percent, String speed) {
918 + return '$percent% • $speed';
919 + }
920 +
921 + @override
922 + String eta_label(String eta) {
923 + return 'ETA: $eta';
924 + }
925 +
926 + @override
927 + String paused_progress(String percent) {
928 + return 'In pausa - $percent%';
929 + }
930 +
931 + @override
932 + String ram_warning_body_download(String ram, String totalMemory) {
933 + return 'Questo modello richiede almeno $ram GB di RAM, ma il suo dispositivo dispone di $totalMemory. Potrebbe non funzionare correttamente o causare l\'arresto anomalo dell\'app.';
934 + }
935 +
936 + @override
937 + String ram_warning_body_load(String availableRAM, String ram) {
938 + return 'Il suo dispositivo ha $availableRAM RAM disponibile, ma questo modello consiglia almeno $ram GB. Il caricamento potrebbe non riuscire o causare instabilità.';
939 + }
940 +
941 + @override
942 + String get choose_theme => 'Scegli tema';
943 +
944 + @override
945 + String get choose_theme_desc =>
946 + 'Personalizza l\'aspetto dell\'app. Puoi sempre modificarlo in seguito nelle impostazioni.';
947 +
948 + @override
949 + String get theme_card_system => 'Sistema';
950 +
951 + @override
952 + String get theme_card_system_sub =>
953 + 'Corrisponde alle impostazioni del tuo dispositivo';
954 +
955 + @override
956 + String get theme_card_light => 'Luce';
957 +
958 + @override
959 + String get theme_card_light_sub => 'Pulito e luminoso';
960 +
961 + @override
962 + String get theme_card_dark => 'Scuro';
963 +
964 + @override
965 + String get theme_card_dark_sub => 'Occhi facili';
966 +
967 + @override
968 + String get theme_card_claude => 'Claude';
969 +
970 + @override
971 + String get theme_card_claude_sub => 'Un tema caldo color\n pesca';
972 +
973 + @override
974 + String get stay_updated => 'Resta aggiornato';
975 +
976 + @override
977 + String get stay_updated_desc =>
978 + 'Ricevi una notifica quando i tuoi modelli di intelligenza artificiale terminano il download o quando le attività di lunga durata vengono completate.';
979 +
980 + @override
981 + String get notification_benefit_downloads => 'Avanzamento download modello';
982 +
983 + @override
984 + String get notification_benefit_completions =>
985 + 'Completamenti della generazione';
986 +
987 + @override
988 + String get notification_benefit_background =>
989 + 'Stato delle attività in background';
990 +
991 + @override
992 + String get allow_notifications => 'Consenti notifiche';
993 +
994 + @override
995 + String get servers_title => 'Server';
996 +
997 + @override
998 + String get no_servers_yet => 'Ancora nessun server';
999 +
1000 + @override
1001 + String get no_servers_desc =>
1002 + 'Aggiungi il tuo primo server per iniziare a chattare con i modelli di intelligenza artificiale.';
1003 +
1004 + @override
1005 + String get add_server => 'Aggiungi server';
1006 +
1007 + @override
1008 + String switched_to_server(String name) {
1009 + return 'Passato a $name';
1010 + }
1011 +
1012 + @override
1013 + String get edit_server => 'Modifica server';
1014 +
1015 + @override
1016 + String get add_server_title => 'Aggiungi server';
1017 +
1018 + @override
1019 + String get server_type_label => 'Tipo di server';
1020 +
1021 + @override
1022 + String get server_icon_label => 'Icona del server';
1023 +
1024 + @override
1025 + String get default_icon => 'Icona predefinita';
1026 +
1027 + @override
1028 + String get server_type_lm_studio_display => 'LM Studio';
1029 +
1030 + @override
1031 + String get server_type_openai_display => 'Compatibile con OpenAI';
1032 +
1033 + @override
1034 + String get server_type_ollama_display => 'Ollama';
1035 +
1036 + @override
1037 + String get server_type_openrouter_display => 'OpenRouter';
1038 +
1039 + @override
1040 + String get server_type_on_device_display => 'On-Device';
1041 +
1042 + @override
1043 + String get server_address_openrouter => 'openrouter.ai';
1044 +
1045 + @override
1046 + String get server_address_on_device => 'Inferenza locale';
1047 +
1048 + @override
1049 + String server_address_format(String host, String port) {
1050 + return '$host:$port';
1051 + }
1052 +
1053 + @override
1054 + String get default_badge => 'Predefinito';
1055 +
1056 + @override
1057 + String get set_as_default => 'Imposta come predefinito';
1058 +
1059 + @override
1060 + String get select_icon => 'Seleziona icona';
1061 +
1062 + @override
1063 + String get select_icon_desc => 'Scegli un\'icona per il tuo server';
1064 +
1065 + @override
1066 + String get search_icons_hint => 'Cerca icone...';
1067 +
1068 + @override
1069 + String get server_icon_stack => 'Stack di server';
1070 +
1071 + @override
1072 + String get server_icon_stack2 => 'Server Stack 02';
1073 +
1074 + @override
1075 + String get server_icon_stack3 => 'Server Stack 03';
1076 +
1077 + @override
1078 + String get server_icon_cloud => 'Cloud';
1079 +
1080 + @override
1081 + String get server_icon_cloud_server => 'Cloud Server';
1082 +
1083 + @override
1084 + String get server_icon_mcp => 'Server MCP';
1085 +
1086 + @override
1087 + String get server_icon_database => 'Database';
1088 +
1089 + @override
1090 + String get server_icon_database1 => 'Database 01';
1091 +
1092 + @override
1093 + String get server_icon_database2 => 'Database 02';
1094 +
1095 + @override
1096 + String get server_icon_cpu => 'CPU';
1097 +
1098 + @override
1099 + String get server_icon_chip => 'Chip';
1100 +
1101 + @override
1102 + String get server_icon_chip2 => 'Chip 02';
1103 +
1104 + @override
1105 + String get server_icon_computer => 'Computer';
1106 +
1107 + @override
1108 + String get server_icon_laptop => 'Laptop';
1109 +
1110 + @override
1111 + String get server_icon_terminal => 'Terminale informatico';
1112 +
1113 + @override
1114 + String get server_icon_code => 'Codice';
1115 +
1116 + @override
1117 + String get server_icon_ai_brain => 'Cervello AI';
1118 +
1119 + @override
1120 + String get server_icon_ai_brain2 => 'AI Brain 02';
1121 +
1122 + @override
1123 + String get server_icon_ai_cloud => 'AI Cloud';
1124 +
1125 + @override
1126 + String get server_icon_ai_network => 'Rete AI';
1127 +
1128 + @override
1129 + String get server_icon_ai_chat => 'AI Chat';
1130 +
1131 + @override
1132 + String get server_icon_cellular => 'Rete cellulare';
1133 +
1134 + @override
1135 + String get server_icon_plug1 => 'Plug 01';
1136 +
1137 + @override
1138 + String get server_icon_plug2 => 'Plug 02';
1139 +
1140 + @override
1141 + String get server_icon_bot => 'Bot';
1142 +
1143 + @override
1144 + String get server_icon_bot2 => 'Bot 02';
1145 +
1146 + @override
1147 + String get server_icon_robotic => 'Robotica';
1148 +
1149 + @override
1150 + String get server_icon_rocket => 'Razzo';
1151 +
1152 + @override
1153 + String get server_icon_star => 'Stella';
1154 +
1155 + @override
1156 + String get server_icon_settings1 => 'Impostazioni 01';
1157 +
1158 + @override
1159 + String get server_icon_settings2 => 'Impostazioni 02';
1160 +
1161 + @override
1162 + String get server_icon_home1 => 'Home 01';
1163 +
1164 + @override
1165 + String get server_icon_home2 => 'Home 02';
1166 +
1167 + @override
1168 + String get server_icon_folder1 => 'Cartella 01';
1169 +
1170 + @override
1171 + String get server_icon_folder2 => 'Cartella 02';
1172 +
1173 + @override
1174 + String get server_icon_file1 => 'File 01';
1175 +
1176 + @override
1177 + String get server_icon_lock => 'Blocca';
1178 +
1179 + @override
1180 + String get server_icon_key => 'Chiave 01';
1181 +
1182 + @override
1183 + String get server_icon_link => 'Link 01';
1184 +
1185 + @override
1186 + String get server_icon_globe => 'Globe';
1187 +
1188 + @override
1189 + String get server_icon_api => 'API';
1190 +
1191 + @override
1192 + String get server_icon_arrow_right => 'Freccia destra 01';
1193 +
1194 + @override
1195 + String get server_icon_check => 'Cerchio di controllo';
1196 +
1197 + @override
1198 + String get server_icon_alert => 'Cerchio di allerta';
1199 +
1200 + @override
1201 + String get server_icon_info => 'Info Circle';
1202 +
1203 + @override
1204 + String get server_icon_zap => 'Zap';
1205 +
1206 + @override
1207 + String get server_icon_cloud_upload => 'Caricamento cloud';
1208 +
1209 + @override
1210 + String get server_icon_cloud_download => 'Cloud Download';
1211 +
1212 + @override
1213 + String get server_icon_refresh => 'Aggiorna';
1214 +
1215 + @override
1216 + String get server_icon_hard_drive => 'Disco rigido';
1217 +
1218 + @override
1219 + String get server_icon_drive => 'Guida';
1220 +
1221 + @override
1222 + String get personas_title => 'Personas';
1223 +
1224 + @override
1225 + String get persona_category_general => 'Generale';
1226 +
1227 + @override
1228 + String get persona_category_coding => 'Codifica';
1229 +
1230 + @override
1231 + String get persona_category_education => 'Istruzione';
1232 +
1233 + @override
1234 + String get persona_category_creative => 'Creativo';
1235 +
1236 + @override
1237 + String get persona_builtin_section => 'INTEGRATO';
1238 +
1239 + @override
1240 + String get persona_my_section => 'LE MIE PERSONAS';
1241 +
1242 + @override
1243 + String get clone_edit => 'Clona e modifica';
1244 +
1245 + @override
1246 + String get builtin_badge => 'Integrato';
1247 +
1248 + @override
1249 + String get no_personas_found => 'Nessuna persona trovata';
1250 +
1251 + @override
1252 + String get no_personas_desc =>
1253 + 'Crea la tua prima persona per personalizzare il comportamento dell\'IA.';
1254 +
1255 + @override
1256 + String get edit_persona => 'Modifica Persona';
1257 +
1258 + @override
1259 + String get create_persona => 'Crea persona';
1260 +
1261 + @override
1262 + String get create_persona_button => 'Crea';
1263 +
1264 + @override
1265 + String get emoji_label => 'Emoji';
1266 +
1267 + @override
1268 + String get name_label => 'Nome';
1269 +
1270 + @override
1271 + String get my_persona_hint => 'La mia Persona';
1272 +
1273 + @override
1274 + String get category_label => 'Categoria';
1275 +
1276 + @override
1277 + String get description_optional => 'Descrizione (opzionale)';
1278 +
1279 + @override
1280 + String get description_hint => 'Cosa fa questo personaggio...';
1281 +
1282 + @override
1283 + String get system_prompt => 'Prompt di sistema';
1284 +
1285 + @override
1286 + String character_count_max(int currentLen) {
1287 + return '$currentLen/4000';
1288 + }
1289 +
1290 + @override
1291 + String get no_prompt_placeholder => 'Ancora nessun prompt...';
1292 +
1293 + @override
1294 + String get prompt_hint => 'Sei un assistente utile...';
1295 +
1296 + @override
1297 + String get prompt_required => 'Il prompt di sistema è obbligatorio';
1298 +
1299 + @override
1300 + String get prompt_max_chars => 'Max 4000 caratteri';
1301 +
1302 + @override
1303 + String get advanced_settings => 'Impostazioni avanzate';
1304 +
1305 + @override
1306 + String get temperature_label => 'Temperatura (0,0-2,0)';
1307 +
1308 + @override
1309 + String get top_p_label => 'Top P (0,0-1,0)';
1310 +
1311 + @override
1312 + String get temp_hint => '0.7';
1313 +
1314 + @override
1315 + String get top_p_hint => '0,9';
1316 +
1317 + @override
1318 + String get range_0_2 => '0,0-2,0';
1319 +
1320 + @override
1321 + String get range_0_1 => '0,0-1,0';
1322 +
1323 + @override
1324 + String get persona_updated => 'Persona aggiornata';
1325 +
1326 + @override
1327 + String get persona_created => 'Persona creata';
1328 +
1329 + @override
1330 + String get tts_models_title => 'Modelli di sintesi vocale';
1331 +
1332 + @override
1333 + String get always_available => 'Sempre disponibile';
1334 +
1335 + @override
1336 + String get tts_system_desc =>
1337 + 'Utilizza il motore di sintesi vocale integrato nel dispositivo.\nNessun download richiesto. La selezione vocale utilizza le impostazioni di sistema del tuo dispositivo.';
1338 +
1339 + @override
1340 + String get downloading_status => 'Download in corso...';
1341 +
1342 + @override
1343 + String tts_kitten_desc(String size) {
1344 + return 'TTS neurale fulmineo con 8 voci espressive.\nRichiede il download di $size.';
1345 + }
1346 +
1347 + @override
1348 + String tts_piper_desc(String size) {
1349 + return 'Veloce voce Piper offline con 2 voci espressive.\nRichiede $size download per voce.';
1350 + }
1351 +
1352 + @override
1353 + String engine_spec(String sizeMb, String ramMb, int voiceCount) {
1354 + return '$sizeMb MB · $ramMb MB RAM · $voiceCount voci';
1355 + }
1356 +
1357 + @override
1358 + String get on_device_models_title => 'Modelli sul dispositivo';
1359 +
1360 + @override
1361 + String get available_models => 'Modelli disponibili';
1362 +
1363 + @override
1364 + String get device_memory => 'Memoria del dispositivo';
1365 +
1366 + @override
1367 + String get ram_usage => 'Utilizzo della RAM';
1368 +
1369 + @override
1370 + String get memory_healthy => 'Sano';
1371 +
1372 + @override
1373 + String get memory_critical => 'Critico';
1374 +
1375 + @override
1376 + String get memory_low => 'Basso';
1377 +
1378 + @override
1379 + String ram_used(String percent) {
1380 + return '$percent% utilizzato';
1381 + }
1382 +
1383 + @override
1384 + String get available_ram => 'RAM disponibile';
1385 +
1386 + @override
1387 + String get total_capacity => 'Capacità totale';
1388 +
1389 + @override
1390 + String get loaded_status => 'Caricato';
1391 +
1392 + @override
1393 + String get inference_backend => 'Backend di inferenza';
1394 +
1395 + @override
1396 + String get backend_ios_notice =>
1397 + 'Solo il back-end della CPU è disponibile su iOS.';
1398 +
1399 + @override
1400 + String get backend_cpu_desc =>
1401 + 'Funziona su tutti i dispositivi. Più compatibile.';
1402 +
1403 + @override
1404 + String get backend_gpu_desc =>
1405 + 'Accelerazione OpenCL. Più veloce sui dispositivi supportati.';
1406 +
1407 + @override
1408 + String get backend_npu_desc =>
1409 + 'NPU del fornitore (Qualcomm/MediaTek). L\'inferenza più veloce.';
1410 +
1411 + @override
1412 + String get select_model_title => 'Seleziona modello';
1413 +
1414 + @override
1415 + String get refresh_models => 'Aggiorna modelli';
1416 +
1417 + @override
1418 + String get search_models_hint => 'Cerca modelli...';
1419 +
1420 + @override
1421 + String get no_server_connected => 'Nessun server connesso';
1422 +
1423 + @override
1424 + String get add_server_first =>
1425 + 'Aggiungi prima un server per vedere i modelli disponibili.';
1426 +
1427 + @override
1428 + String get failed_load_models => 'Impossibile caricare i modelli';
1429 +
1430 + @override
1431 + String get no_models_available => 'Nessun modello disponibile';
1432 +
1433 + @override
1434 + String no_models_match(String searchQuery) {
1435 + return 'Nessun modello corrisponde a \"$searchQuery\"';
1436 + }
1437 +
1438 + @override
1439 + String model_load_failed(String error) {
1440 + return 'Impossibile caricare il modello: $error';
1441 + }
1442 +
1443 + @override
1444 + String model_unloaded_ollama(String name) {
1445 + return '$name verrà scaricato una volta trascorso il tempo di mantenimento in vita';
1446 + }
1447 +
1448 + @override
1449 + String model_unloaded_success(String name) {
1450 + return '$name scaricato correttamente';
1451 + }
1452 +
1453 + @override
1454 + String model_unload_failed(String error) {
1455 + return 'Impossibile scaricare il modello: $error';
1456 + }
1457 +
1458 + @override
1459 + String get unload_from_server => 'Scarica dal server';
1460 +
1461 + @override
1462 + String context_chip(String ctx) {
1463 + return '$ctx ctx';
1464 + }
1465 +
1466 + @override
1467 + String download_notification_title(String modelName) {
1468 + return 'Download di $modelName in corso...';
1469 + }
1470 +
1471 + @override
1472 + String get download_complete_notification => 'Download completato!';
1473 +
1474 + @override
1475 + String download_complete_body(String modelName) {
1476 + return '$modelName è stato scaricato correttamente.';
1477 + }
1478 +
1479 + @override
1480 + String download_failed_notification(String error) {
1481 + return 'Download non riuscito: $error';
1482 + }
1483 +
1484 + @override
1485 + String download_failed_body(String modelName) {
1486 + return 'Impossibile scaricare $modelName.';
1487 + }
1488 +
1489 + @override
1490 + String get engine_name_system => 'System TTS';
1491 +
1492 + @override
1493 + String get engine_tagline_system => 'Motore del dispositivo integrato';
1494 +
1495 + @override
1496 + String get engine_name_kitten => 'Gattino TTS';
1497 +
1498 + @override
1499 + String get engine_tagline_kitten => 'TTS neurale ad alta velocità';
1500 +
1501 + @override
1502 + String get engine_name_sherpa => 'Sherpa ONNX VITS';
1503 +
1504 + @override
1505 + String get engine_tagline_sherpa => 'Voci Piper offline';
1506 +
1507 + @override
1508 + String get voice_jasper => 'Jasper';
1509 +
1510 + @override
1511 + String get voice_bella => 'Bella';
1512 +
1513 + @override
1514 + String get voice_bruno => 'Bruno';
1515 +
1516 + @override
1517 + String get voice_luna => 'Luna';
1518 +
1519 + @override
1520 + String get voice_hugo => 'Hugo';
1521 +
1522 + @override
1523 + String get voice_rosie => 'Rosie';
1524 +
1525 + @override
1526 + String get voice_leo => 'Leone';
1527 +
1528 + @override
1529 + String get voice_kiki => 'Kiki';
1530 +
1531 + @override
1532 + String get voice_lessac => 'Lessac (US)';
1533 +
1534 + @override
1535 + String get voice_ryan => 'Ryan (US)';
1536 +
1537 + @override
1538 + String get model_qwen_3 => 'Qwen 3 0.6B';
1539 +
1540 + @override
1541 + String get model_qwen_3_desc =>
1542 + 'Il più piccolo modello di chat generico. Risposte rapide, basso utilizzo della memoria.';
1543 +
1544 + @override
1545 + String get model_license_apache => 'Apache-2.0';
1546 +
1547 + @override
1548 + String get model_qwen_25 => 'Qwen 2.5 1.5B Instruct';
1549 +
1550 + @override
1551 + String get model_qwen_25_desc =>
1552 + 'Qualità e dimensioni equilibrate. Ottimo per una conversazione generale.';
1553 +
1554 + @override
1555 + String get model_deepseek => 'Distillato DeepSeek R1 Qwen 1.5B';
1556 +
1557 + @override
1558 + String get model_deepseek_desc =>
1559 + 'Modello di ragionamento e catena di pensiero. Ideale per attività logiche.';
1560 +
1561 + @override
1562 + String get model_license_mit => 'MIT';
1563 +
1564 + @override
1565 + String get model_gemma => 'Gemma 4 E2B Instruct';
1566 +
1567 + @override
1568 + String get model_gemma_desc =>
1569 + 'Modello di punta di Google. Massima qualità, richiede più RAM.';
1570 +
1571 + @override
1572 + String export_header(String date) {
1573 + return '*Esportato da LocalMind — $date*';
1574 + }
1575 +
1576 + @override
1577 + String get export_role_user => '## 👤 Utente';
1578 +
1579 + @override
1580 + String get export_role_assistant => '## 🤖 Assistente';
1581 +
1582 + @override
1583 + String get export_role_system => '## ⚙️ Sistema';
1584 +
1585 + @override
1586 + String get export_role_tool => '## 🔧 Strumento';
1587 +
1588 + @override
1589 + String get export_text_user => '[USER]';
1590 +
1591 + @override
1592 + String get export_text_assistant => '[ASSISTENTE]';
1593 +
1594 + @override
1595 + String get export_text_system => '[SISTEMA]';
1596 +
1597 + @override
1598 + String get export_text_tool => '[STRUMENTO]';
1599 +
1600 + @override
1601 + String get export_label_user => 'UTENTE';
1602 +
1603 + @override
1604 + String get export_label_assistant => 'ASSISTENTE';
1605 +
1606 + @override
1607 + String get export_label_system => 'SISTEMA';
1608 +
1609 + @override
1610 + String get export_label_tool => 'STRUMENTO';
1611 +
1612 + @override
1613 + String get select_model_hint =>
1614 + 'Seleziona un modello per iniziare a chattare';
1615 +
1616 + @override
1617 + String get test_notification_title => 'Notifica di prova';
1618 +
1619 + @override
1620 + String get test_notification_body =>
1621 + 'Questa è una notifica di prova per l\'avanzamento del download del modello.';
1622 +}
pubspec.lock
+8 -8
@@ -769,10 +769,10 @@ packages:
769 dependency: transitive
770 description:
771 name: matcher
772 - sha256: "12956d0ad8390bbcc63ca2e1469c0619946ccb52809807067a7020d57e647aa6"
772 + sha256: dc0b7dc7651697ea4ff3e69ef44b0407ea32c487a39fff6a4004fa585e901861
773 url: "https://pub.dev"
774 source: hosted
775 - version: "0.12.18"
775 + version: "0.12.19"
776 material_color_utilities:
777 dependency: transitive
778 description:
@@ -1311,26 +1311,26 @@ packages:
1311 dependency: transitive
1312 description:
1313 name: test
1314 - sha256: "54c516bbb7cee2754d327ad4fca637f78abfc3cbcc5ace83b3eda117e42cd71a"
1314 + sha256: "280d6d890011ca966ad08df7e8a4ddfab0fb3aa49f96ed6de56e3521347a9ae7"
1315 url: "https://pub.dev"
1316 source: hosted
1317 - version: "1.29.0"
1317 + version: "1.30.0"
1318 test_api:
1319 dependency: transitive
1320 description:
1321 name: test_api
1322 - sha256: "93167629bfc610f71560ab9312acdda4959de4df6fac7492c89ff0d3886f6636"
1322 + sha256: "8161c84903fd860b26bfdefb7963b3f0b68fee7adea0f59ef805ecca346f0c7a"
1323 url: "https://pub.dev"
1324 source: hosted
1325 - version: "0.7.9"
1325 + version: "0.7.10"
1326 test_core:
1327 dependency: transitive
1328 description:
1329 name: test_core
1330 - sha256: "394f07d21f0f2255ec9e3989f21e54d3c7dc0e6e9dbce160e5a9c1a6be0e2943"
1330 + sha256: "0381bd1585d1a924763c308100f2138205252fb90c9d4eeaf28489ee65ccde51"
1331 url: "https://pub.dev"
1332 source: hosted
1333 - version: "0.6.15"
1333 + version: "0.6.16"
1334 theme_extensions_builder_annotation:
1335 dependency: transitive
1336 description:
pubspec.yaml
+1 -1
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
16 # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
17 # In Windows, build-name is used as the major, minor, and patch parts
18 # of the product and file versions while build-number is used as the build suffix.
19 -version: 1.2.7+26
19 +version: 1.2.8+27
20
21 environment:
22 sdk: ^3.11.0