audio-front: - AudioUploadField.svelte: Datei-Upload statt rohem media_ref-Textfeld; ruft uploadMedia() auf, zeigt Dateiname nach Upload + Replace-Button - Karten-Erstellungsseite: AudioUploadField ersetzt das unbrauchbare Textfeld - Edit-Seite: audio-front wird jetzt korrekt geladen (audio_ref + back statt dem falschen basic-else-Zweig) und gespeichert typing: - Aliases-Feld in Erstellungs- und Edit-Seite; kommagetrennte Alternativ- antworten werden in fields.aliases gespeichert und von checkTypingAnswer ausgewertet - Edit-Seite: typing wird jetzt korrekt geladen (front + answer + aliases) i18n: alle 5 Sprachen mit audio_upload_btn/uploading/failed/replace, typing_aliases_label/hint Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
330 lines
13 KiB
TypeScript
330 lines
13 KiB
TypeScript
import type { TranslationNode } from './de.ts';
|
|
|
|
export const it: TranslationNode = {
|
|
app: {
|
|
name: 'Cards',
|
|
title_suffix: 'Cards',
|
|
},
|
|
nav: {
|
|
decks: 'Mazzi',
|
|
study: 'Studio',
|
|
explore: 'Libreria',
|
|
import: 'Importa',
|
|
stats: 'Statistiche',
|
|
login_dev: 'Accesso (dev)',
|
|
account: 'Account',
|
|
},
|
|
landing: {
|
|
welcome: 'Flashcard con ripetizione spaziata.',
|
|
intro:
|
|
"Cardecky è l'app di flashcard federata di mana e.V. — pianificatore FSRS, carte cloze, importazione Anki.",
|
|
cta_login: 'Accesso (dev)',
|
|
dev_user_prompt: 'ID utente (dev):',
|
|
},
|
|
decks: {
|
|
title: 'Mazzi',
|
|
new: 'Nuovo mazzo',
|
|
empty: 'Nessun mazzo.',
|
|
empty_cta: 'Crea il primo mazzo',
|
|
loading: 'Caricamento…',
|
|
error: 'Errore: {msg}',
|
|
card_count: '{n} carte',
|
|
card_count_one: '1 carta',
|
|
card_count_more: '{n} altre carte nel mazzo',
|
|
card_count_more_one: '1 altra carta nel mazzo',
|
|
due_count: '{n} da ripassare',
|
|
delete_confirm:
|
|
'Eliminare il mazzo "{name}"? Tutte le carte e i dati di ripasso andranno persi.',
|
|
deleted: 'Mazzo "{name}" eliminato',
|
|
delete_failed: 'Eliminazione non riuscita: {msg}',
|
|
},
|
|
deck_detail: {
|
|
back: '← Torna ai mazzi',
|
|
study_button: 'Studia',
|
|
new_card: 'Nuova carta',
|
|
empty: 'Nessuna carta in questo mazzo.',
|
|
empty_cta: 'Crea la prima carta →',
|
|
card_summary_due: '{cards} · {due} da ripassare',
|
|
card_delete_aria: 'Elimina carta',
|
|
card_delete_label: 'Elimina',
|
|
card_delete_confirm: 'Eliminare la carta? I ripassi verranno eliminati insieme ad essa.',
|
|
fan_aria: 'Carte aperte a ventaglio dal mazzo "{name}"',
|
|
card_open: 'Apri carta — {type}',
|
|
export_csv: 'CSV',
|
|
print_cards: 'Stampa',
|
|
},
|
|
deck_stack: {
|
|
aria_label: 'Mazzo "{name}" — {cards} carte, {due} da ripassare',
|
|
},
|
|
deck_edit: {
|
|
title: 'Modifica mazzo',
|
|
back: '← Torna al mazzo',
|
|
name_label: 'Nome',
|
|
description_label: 'Descrizione (opzionale)',
|
|
color_label: 'Colore',
|
|
save: 'Salva',
|
|
saving: 'Salvataggio…',
|
|
cancel: 'Annulla',
|
|
save_failed: 'Salvataggio non riuscito: {msg}',
|
|
saved: 'Mazzo salvato',
|
|
},
|
|
deck_new: {
|
|
title: 'Nuovo mazzo',
|
|
name_label: 'Nome',
|
|
description_label: 'Descrizione (opzionale)',
|
|
color_label: 'Colore (opzionale)',
|
|
create: 'Crea mazzo',
|
|
creating: 'Creazione…',
|
|
cancel: 'Annulla',
|
|
create_failed: 'Creazione non riuscita: {msg}',
|
|
},
|
|
card_new: {
|
|
title: 'Nuova carta',
|
|
back: '← Indietro',
|
|
deck_label: 'Mazzo',
|
|
type_label: 'Tipo',
|
|
type_basic: 'Base (fronte → retro)',
|
|
type_basic_reverse: 'Base + Inverso (fronte ↔ retro, 2 ripassi)',
|
|
type_cloze: 'Cloze (completamento, 1 ripasso per gruppo)',
|
|
front_label: 'Fronte (Markdown)',
|
|
back_label: 'Retro (Markdown)',
|
|
back_placeholder: 'Risposta',
|
|
front_placeholder: '# Markdown è supportato\n**grassetto**, _corsivo_, `codice`',
|
|
preview_label: 'Anteprima',
|
|
cloze_text_label: 'Testo con spazi (Markdown)',
|
|
cloze_text_placeholder: 'La capitale di {{c1::Francia}} è {{c2::Parigi}}.',
|
|
cloze_help: "{{c1::Risposta}} definisce uno spazio. Ogni ID gruppo (c1, c2, …) crea il proprio ripasso. Suggerimento opzionale: {{c1::Risposta::Suggerimento}} — il suggerimento sostituisce «…» nella domanda.",
|
|
cloze_no_clusters: 'È richiesto almeno un gruppo {{cN::…}}.',
|
|
cloze_clusters_detected: '{n} gruppi rilevati: c{ids} → {n} ripassi.',
|
|
cloze_preview_label: 'Anteprima (c{first} mascherato)',
|
|
cloze_extra_label: 'Extra (opzionale)',
|
|
cloze_extra_placeholder: 'Contesto aggiuntivo, mostrato sotto la risposta.',
|
|
create: 'Crea carta',
|
|
creating: 'Salvataggio…',
|
|
cancel: 'Annulla',
|
|
create_failed: 'Creazione non riuscita: {msg}',
|
|
toast_basic: 'Carta creata',
|
|
toast_basic_reverse: '2 ripassi inizializzati (fronte→retro, retro→fronte)',
|
|
toast_cloze: '{n} ripassi inizializzati (1 per gruppo)',
|
|
toast_image_occlusion: '{n} ripassi inizializzati (1 per maschera)',
|
|
type_image_occlusion: "Occlusione immagine (immagine + N maschere)",
|
|
type_typing: 'Digitazione (testo libero, corrispondenza approssimativa)',
|
|
type_multiple_choice: 'Scelta multipla (4 opzioni, distrattori IA)',
|
|
type_audio_front: 'Audio fronte (ascolta e rispondi)',
|
|
answer_label: 'Risposta (Markdown)',
|
|
answer_placeholder: 'Risposta corretta',
|
|
distractor_pool_label: 'Pool distrattori (opzionale)',
|
|
distractor_pool_placeholder: 'Un elemento per riga — usato se il mazzo è troppo piccolo per i distrattori IA',
|
|
audio_ref_label: 'Riferimento audio (media_ref)',
|
|
audio_ref_placeholder: 'es. abc123.mp3',
|
|
audio_upload_btn: '🎵 Carica file audio',
|
|
audio_uploading: 'Caricamento…',
|
|
audio_upload_failed: 'Caricamento fallito: {msg}',
|
|
audio_replace: 'Sostituisci',
|
|
typing_aliases_label: 'Alias (facoltativo)',
|
|
typing_aliases_hint: 'Risposte alternative separate da virgola — es. Parigi, Parigi (Francia)',
|
|
back_audio_label: 'Testo risposta (Markdown)',
|
|
toast_typing: 'Carta di digitazione creata',
|
|
toast_multiple_choice: 'Carta a scelta multipla creata',
|
|
toast_audio_front: 'Carta audio fronte creata',
|
|
decks_load_failed: 'Impossibile caricare i mazzi: {msg}',
|
|
},
|
|
card_edit: {
|
|
title: 'Modifica carta',
|
|
back: '← Torna al mazzo',
|
|
type_locked_help: 'Il tipo di carta non può essere modificato — la tabella dei ripassi dipende da esso.',
|
|
save: 'Salva',
|
|
saving: 'Salvataggio…',
|
|
cancel: 'Annulla',
|
|
delete: 'Elimina',
|
|
deleting: 'Eliminazione…',
|
|
delete_confirm: 'Eliminare la carta? I ripassi verranno eliminati insieme ad essa.',
|
|
updated: 'Carta aggiornata',
|
|
save_failed: 'Salvataggio non riuscito: {msg}',
|
|
delete_failed: 'Eliminazione non riuscita: {msg}',
|
|
deleted: 'Carta eliminata',
|
|
},
|
|
study: {
|
|
title: 'Studio',
|
|
empty: 'Nessun mazzo.',
|
|
none_due: 'Niente da ripassare al momento.',
|
|
study_now: 'Studia ora',
|
|
due_count: '{n} da ripassare',
|
|
},
|
|
study_session: {
|
|
back: '← Panoramica',
|
|
all_done: 'Ottimo! Tutte le carte in scadenza sono state ripassate.',
|
|
stats: 'Ripassi: {reviewed} · Da rivedere: {again}',
|
|
reveal: 'Mostra risposta',
|
|
reveal_hint: 'Spazio / Invio per rivelare',
|
|
grade_again: 'Di nuovo',
|
|
grade_hard: 'Difficile',
|
|
grade_good: 'Bene',
|
|
grade_easy: 'Facile',
|
|
grade_hint: '1=Di nuovo · 2=Difficile · 3=Bene · 4=Facile',
|
|
loading: 'Caricamento…',
|
|
error: 'Errore: {msg}',
|
|
manage_link: 'Gestisci carte →',
|
|
},
|
|
import: {
|
|
title: 'Importa',
|
|
intro: "Importa mazzi e carte da un file Anki (.apkg o .colpkg). La cronologia FSRS non viene importata — tutte le carte partono come «nuove».",
|
|
what_works_title: 'Cosa viene importato',
|
|
what_works_decks: 'Mazzi (la gerarchia Anki Foo::Bar diventa Foo / Bar).',
|
|
what_works_basic: 'Base + Base-Inverso: fronte/retro direttamente.',
|
|
what_works_cloze: 'Cloze: {{c1::…}} creato con sotto-indice per gruppo.',
|
|
what_works_media: 'Immagini + audio (incorporati come Markdown / tag <audio>).',
|
|
what_skipped_title: 'Cosa non viene importato',
|
|
what_skipped_media: '— (Immagini + audio vengono importati dallo Sprint 9k, vedi sopra)',
|
|
what_skipped_history: 'Cronologia di apprendimento FSRS (i ripassi Anki vengono deliberatamente azzerati).',
|
|
what_skipped_addons: 'Tipi di carte specifici dei componenti aggiuntivi (occlusione immagine, ecc.).',
|
|
anki_label: 'Importa da Anki',
|
|
dropzone: '📦 Trascina il file .apkg qui o fai clic',
|
|
dropzone_hint: 'Base, Base + Inverso, Cloze · Immagini + audio vengono importati (limite 25 MB per file).',
|
|
parsing: 'Lettura di {file}…',
|
|
preview_found: 'Trovato in',
|
|
preview_decks_one: '1 mazzo',
|
|
preview_decks: '{n} mazzi',
|
|
preview_cards_one: '1 carta',
|
|
preview_cards: '{n} carte',
|
|
preview_breakdown: '({basic} base, {basic_reverse} base-inverso, {cloze} cloze)',
|
|
preview_media: '{n} file multimediali verranno caricati',
|
|
preview_skipped: '{n} ignorato/i (tipo sconosciuto)',
|
|
preview_warnings: 'Avvisi ({n})',
|
|
cancel: 'Annulla',
|
|
import_now: 'Importa',
|
|
stage_media: 'Caricamento media · {current} / {total}',
|
|
stage_decks: 'Creazione mazzi · {current} / {total}',
|
|
stage_cards: 'Importazione carte · {current} / {total}',
|
|
stage_done: 'Completato.',
|
|
done_summary_one: '✓ {cards} carte in 1 mazzo.',
|
|
done_summary: '✓ {cards} carte in {decks} mazzi.',
|
|
done_dupes: '{n} duplicato/i ignorato/i (contenuto già presente).',
|
|
done_media: '{uploaded} media caricati, {failed} non riusciti.',
|
|
done_failures: '{n} errori',
|
|
done_more: 'Un altro file',
|
|
error_label: 'Errore: {msg}',
|
|
retry: 'Riprova',
|
|
tab_anki: 'Anki',
|
|
tab_csv: 'CSV',
|
|
tab_quizlet: 'Formato tab',
|
|
csv_label: 'Importa file CSV',
|
|
csv_dropzone: '📄 Trascina un file CSV qui o clicca',
|
|
csv_dropzone_hint:
|
|
'Formato: type,front,back — intestazione facoltativa. Supporta: basic, basic-reverse, cloze.',
|
|
csv_deck_label: 'Nome del mazzo',
|
|
csv_deck_placeholder: 'Il mio mazzo importato',
|
|
csv_done_summary: '✓ {cards} carte aggiunte a "{deck}".',
|
|
csv_format_title: 'Formato CSV',
|
|
csv_format_example:
|
|
'type,front,back\nbasic,What is 2+2?,4\nbasic-reverse,Paris,Capital of France\ncloze,"The {{c1::mitochondria}} are the powerhouse",',
|
|
csv_format_note: 'Senza colonna type, tutte le carte vengono create come basic.',
|
|
quizlet_label: 'Importa formato tabulato',
|
|
quizlet_hint:
|
|
'Funziona con Quizlet (tramite estensione), Excel, Notion, Google Sheets o qualsiasi strumento che copia righe separate da tabulazioni.',
|
|
quizlet_paste_label: 'Incolla testo (termine Tab definizione)',
|
|
quizlet_placeholder: 'Termine\tDefinizione',
|
|
quizlet_deck_label: 'Nome del mazzo',
|
|
quizlet_deck_placeholder: 'Il mio mazzo importato',
|
|
quizlet_preview: 'Anteprima',
|
|
quizlet_how_title: 'Da dove viene questo formato?',
|
|
quizlet_how_1: 'Excel / Google Sheets: seleziona due colonne, copia → incolla qui.',
|
|
quizlet_how_2: 'Tabella Notion: seleziona le colonne, copia → incolla qui.',
|
|
quizlet_how_3:
|
|
'Quizlet: l\'esportazione è a pagamento. Alternativa gratuita: installa l\'estensione "Quizlet Exporter" → esporta come CSV tabulato → incolla qui.',
|
|
},
|
|
print: {
|
|
title: 'Stampa {deck}',
|
|
loading: 'Caricamento…',
|
|
btn: 'Stampa',
|
|
back: '← Indietro',
|
|
n_cards_one: '1 carta',
|
|
n_cards: '{n} carte',
|
|
front: 'Fronte',
|
|
back_side: 'Retro',
|
|
},
|
|
inbox_banner: {
|
|
label: '📥 In arrivo',
|
|
count_one: "1 carta ricevuta da altre app",
|
|
count: "{n} carte ricevute da altre app",
|
|
cta: '— ordina →',
|
|
},
|
|
account: {
|
|
title: 'Account',
|
|
user_id_label: 'ID utente',
|
|
logout: 'Disconnetti',
|
|
edit_profile: 'Modifica profilo',
|
|
name_label: 'Nome',
|
|
name_placeholder: 'Il tuo nome',
|
|
save: 'Salva',
|
|
cancel: 'Annulla',
|
|
profile_saved: 'Profilo salvato',
|
|
phase2_hint:
|
|
"Note fase 2: l'identità è attualmente uno stub dev (sessionStorage). Con la federazione auth, passerà a un login mana-auth su auth.mana.how.",
|
|
export_title: 'Esporta dati',
|
|
export_intro:
|
|
'Scarica tutti i tuoi dati Cards in JSON — mazzi, carte, ripassi, sessioni di studio, tag, riferimenti media, import. GDPR Art. 15/20.',
|
|
export_button: 'Esporta dati',
|
|
export_loading: 'Caricamento…',
|
|
export_done: 'Esportazione scaricata: {decks} mazzi, {cards} carte, {reviews} ripassi.',
|
|
export_failed: 'Esportazione non riuscita: {msg}',
|
|
delete_title: 'Elimina account',
|
|
delete_intro:
|
|
"Elimina definitivamente tutti i tuoi dati Cards. GDPR Art. 17. Le altre app mana (Memoro, Who, …) conservano i propri dati indipendentemente — per eliminarli, fallo in ogni app o tramite la richiesta GDPR collettiva su mana-admin.",
|
|
delete_button: 'Elimina tutti i dati Cards',
|
|
delete_loading: 'Eliminazione…',
|
|
delete_confirm:
|
|
'TUTTI i tuoi dati Cards verranno eliminati definitivamente. Digita ELIMINA per confermare.',
|
|
delete_confirm_word: 'ELIMINA',
|
|
delete_done: 'Eliminato: {decks} mazzi, {imports} import.',
|
|
delete_failed: 'Eliminazione non riuscita: {msg}',
|
|
},
|
|
stats: {
|
|
title: 'Statistiche',
|
|
generated_at: 'Aggiornato al {date}',
|
|
decks: 'Mazzi',
|
|
cards: 'Carte',
|
|
reviews: 'Ripassi',
|
|
due_now: 'Da ripassare ora',
|
|
days_title: 'Giorni di studio',
|
|
streak: 'Serie: {n} giorni · ultimi 7 giorni: {total} ripassi',
|
|
streak_one: 'Serie: 1 giorno · ultimi 7 giorni: {total} ripassi',
|
|
fsrs_title: 'Stato FSRS',
|
|
fsrs_intro: 'Distribuzione dei tuoi ripassi tra gli stati FSRS.',
|
|
fsrs_new: 'Nuovo',
|
|
fsrs_learning: 'In apprendimento',
|
|
fsrs_review: 'Ripasso',
|
|
fsrs_relearning: 'Riapprendimento',
|
|
activity_title: 'Cronologia attività',
|
|
activity_desc: '{weeks} settimane · ogni cella = 1 giorno',
|
|
retention_title: 'Ritenzione',
|
|
retention_desc: 'Quota di ripassi senza ricadute.',
|
|
retention_reps: '{reps} ripassi',
|
|
retention_lapses: '{lapses} ricadute',
|
|
retention_none: 'Nessun ripasso ancora.',
|
|
forecast_title: 'Prossimi 7 giorni',
|
|
forecast_desc: 'Carte da ripassare per giorno.',
|
|
forecast_empty: 'Niente in programma.',
|
|
loading: 'Caricamento…',
|
|
error: 'Errore: {msg}',
|
|
},
|
|
common: {
|
|
empty: '(vuoto)',
|
|
skip_to_content: 'Vai al contenuto',
|
|
main_nav: 'Navigazione principale',
|
|
notifications: 'Notifiche',
|
|
language_switcher: 'Cambia lingua',
|
|
language_desc: "Scegli la lingua dell'app.",
|
|
},
|
|
image_occlusion: {
|
|
image_label: 'Scegli immagine',
|
|
uploading: "Caricamento immagine…",
|
|
not_an_image: "Il file non è un'immagine.",
|
|
canvas_aria: 'Canvas immagine — trascina per creare maschere',
|
|
draw_hint: "Disegna un rettangolo sull'immagine per creare una maschera.",
|
|
label_placeholder: 'Etichetta (opzionale)',
|
|
delete_mask: 'Elimina maschera',
|
|
no_image_selected: "Scegli prima un'immagine.",
|
|
no_masks: 'Crea almeno una maschera.',
|
|
},
|
|
};
|