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