feat(web): CSV-Import/Export, Tab-Format-Import, PDF-Druckansicht

- CSV-Import: Dropzone für .csv-Dateien, unterstützt 2-spaltig (front,back)
  und 3-spaltig (type,front,back) inkl. cloze; Dedupe via contentHash
- CSV-Export: Button auf Deck-Detail-Seite, lädt type,front,back als .csv
- Tab-Format-Import (ehem. Quizlet): Textarea für tab-getrennte Zeilen;
  funktioniert mit Excel, Google Sheets, Notion und Quizlet-Extension;
  Anleitung erklärt Quizlet-Paywall-Workaround (Quizlet Exporter Extension)
- PDF-Druckansicht: Route /decks/[id]/print, A6-Karten mit alternierenden
  Vorder-/Rückseiten, CSS @page { size: A6 landscape } für Browser-Druck
- Import-Seite: Tab-Bar Anki | CSV | Tab-Format
- i18n: alle 5 Sprachen (DE/EN/FR/ES/IT) vollständig
- docs/FEATURE_IDEAS.md: strukturierte Feature-Liste als Planungsgrundlage

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-11 18:27:39 +02:00
parent 9839737049
commit 926ff685c7
15 changed files with 1332 additions and 17 deletions

View file

@ -50,6 +50,8 @@ export const it: TranslationNode = {
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',
@ -197,6 +199,43 @@ export const it: TranslationNode = {
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',