From c7d80e3423a7adced23779f22f0dc27d2df63b36 Mon Sep 17 00:00:00 2001 From: Till JS Date: Sun, 26 Apr 2026 23:20:09 +0200 Subject: [PATCH] =?UTF-8?q?feat(events):=20full=20i18n=20coverage=20across?= =?UTF-8?q?=2012=20files=20=E2=80=94=20DE/EN/ES/FR/IT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Events (party/RSVP) module had ~38 hardcoded German strings across DetailView (13 incl. share row + map labels), SourceManager (5), DiscoveredEventCard (3), DiscoveryTab (3), EventCard (3), RsvpSummary (3), ListView (3), BringListEditor (2), GuestListEditor (2), PublicRsvpList (2), DiscoverySetup (2), RegionPicker (1). New `events` namespace with 119 keys × 5 locales: - `list_view.*`, `detail_view.*` (incl. share/publish/map sections), `event_card.*` (status badges + summary), `discovered_card.*`, `discovery_tab.*`, `discovery_setup.*`, `region_picker.*`, `source_manager.*` (incl. errors_count + last_scan), `bring_list_editor.*`, `guest_list_editor.*` (RSVP options), `public_rsvp_list.*` (status labels + meta), `rsvp_summary.*` (yes/maybe/no/pending labels). - SourceManager.formatDate now uses get(locale) instead of hardcoded 'de-DE' for last-scan timestamps. - Baseline ratchet: 1640 → 1602 (38 strings cleared) - validate:i18n-parity: 42 namespaces × 5 locales — 4100 keys aligned - svelte-check: no new errors Co-Authored-By: Claude Opus 4.7 (1M context) --- .../web/src/lib/i18n/locales/events/de.json | 145 ++++++++++++++++++ .../web/src/lib/i18n/locales/events/en.json | 145 ++++++++++++++++++ .../web/src/lib/i18n/locales/events/es.json | 145 ++++++++++++++++++ .../web/src/lib/i18n/locales/events/fr.json | 145 ++++++++++++++++++ .../web/src/lib/i18n/locales/events/it.json | 145 ++++++++++++++++++ .../src/lib/modules/events/ListView.svelte | 34 ++-- .../events/components/BringListEditor.svelte | 21 ++- .../components/DiscoveredEventCard.svelte | 19 ++- .../events/components/DiscoverySetup.svelte | 21 ++- .../events/components/DiscoveryTab.svelte | 23 +-- .../events/components/EventCard.svelte | 23 ++- .../events/components/GuestListEditor.svelte | 29 ++-- .../events/components/PublicRsvpList.svelte | 35 +++-- .../events/components/RegionPicker.svelte | 19 ++- .../events/components/RsvpSummary.svelte | 11 +- .../events/components/SourceManager.svelte | 64 +++++--- .../modules/events/views/DetailView.svelte | 74 +++++---- scripts/i18n-hardcoded-baseline.json | 16 +- 18 files changed, 975 insertions(+), 139 deletions(-) create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/events/de.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/events/en.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/events/es.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/events/fr.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/events/it.json diff --git a/apps/mana/apps/web/src/lib/i18n/locales/events/de.json b/apps/mana/apps/web/src/lib/i18n/locales/events/de.json new file mode 100644 index 000000000..2eace4aae --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/events/de.json @@ -0,0 +1,145 @@ +{ + "list_view": { + "doc_title": "Events - Mana", + "tab_mine": "Meine Events", + "tab_discover": "Entdecken", + "subtitle_count": "{upcoming} bevorstehend · {past} vergangen", + "new_event_btn": "+ Neues Event", + "cancel_btn": "Abbrechen", + "placeholder_title": "Worum geht's? (z. B. Geburtstag Anna)", + "placeholder_location": "Ort (optional)", + "submit_create": "Event anlegen", + "section_upcoming": "Bevorstehend", + "section_past": "Vergangen", + "empty_upcoming": "Keine bevorstehenden Events. Zeit für eine Party?" + }, + "detail_view": { + "loading": "Lade Event...", + "back": "← Zurück", + "action_edit": "Bearbeiten", + "action_delete": "Löschen", + "confirm_delete": "Event \"{title}\" wirklich löschen?", + "placeholder_title": "Event-Titel", + "placeholder_description": "Beschreibung", + "placeholder_location": "Ort — tippe eine Adresse...", + "location_pinned_title": "Koordinaten gesetzt", + "label_start": "Start", + "label_end": "Ende", + "label_all_day": "Ganztägig", + "action_cancel": "Abbrechen", + "action_save": "Speichern", + "map_iframe_title": "Event-Ort auf Karte", + "map_open": "In OpenStreetMap öffnen →", + "label_visibility": "Sichtbarkeit", + "section_rsvps": "RSVPs", + "section_guests": "Gäste", + "section_bring_list": "Bring-Liste", + "section_share": "Teilen", + "action_copy_link": "Kopieren", + "action_make_private": "Privat machen", + "share_hint": "Antworten erscheinen automatisch unten in „Antworten via Link\" (Polling alle 30s).", + "action_publish": "Event veröffentlichen & Link generieren" + }, + "event_card": { + "badge_draft": "Entwurf", + "badge_cancelled": "Abgesagt", + "badge_published": "Geteilt", + "all_day": "Ganztägig", + "yes_count": "{count} kommen", + "pending_count": "· {count} offen" + }, + "discovered_card": { + "all_day": "Ganztag", + "source_fallback": "Quelle", + "saved_label": "Gespeichert", + "action_save": "Merken", + "action_dismiss": "Ausblenden" + }, + "discovery_tab": { + "loading": "Lade...", + "action_refresh": "Aktualisieren", + "action_sources": "Quellen", + "action_sources_count": "Quellen ({count})", + "loading_events": "Lade Events...", + "empty_title": "Noch keine Events gefunden", + "empty_hint": "Füge iCal-Feeds von Venues oder Vereinen hinzu, um Events zu entdecken.", + "action_manage_sources": "Quellen verwalten", + "action_load_more": "Mehr laden" + }, + "discovery_setup": { + "title": "Event-Entdeckung einrichten", + "step1_desc": "Welche Regionen sollen nach Events durchsucht werden?", + "action_next": "Weiter", + "step2_desc": "Was interessiert dich?", + "placeholder_freetext": "Weitere Interessen (kommagetrennt, z.B. Impro-Theater, Rust Meetups)", + "action_back": "Zurück", + "action_finish": "Fertig" + }, + "region_picker": { + "radius_unit": "{km} km", + "add_region": "+ Region", + "placeholder_search": "Stadt oder Region suchen...", + "radius_label": "Radius: {km} km", + "searching": "Suche...", + "action_cancel": "Abbrechen" + }, + "source_manager": { + "section_title": "Quellen", + "action_discover": "Automatisch finden", + "action_discovering": "Suche...", + "action_add_ical": "+ iCal-Feed", + "placeholder_name": "Name (z.B. Jazzhaus Freiburg)", + "placeholder_url": "iCal URL (.ics)", + "action_submit_add": "Hinzufügen", + "action_cancel": "Abbrechen", + "section_suggested": "Vorgeschlagene Quellen", + "action_activate": "Aktivieren", + "action_reject": "x", + "empty": "Noch keine Quellen. Nutze \"Automatisch finden\" oder füge iCal-Feeds manuell hinzu.", + "meta_last_scan": "Letzter Scan: {date}", + "never_scanned": "nie", + "errors_count": "{count} Fehler", + "action_scan": "Scannen", + "action_scan_title": "Jetzt scannen", + "action_remove_title": "Entfernen" + }, + "bring_list_editor": { + "placeholder_label": "z. B. Salat, Wein, Lautsprecher", + "placeholder_quantity": "Anzahl", + "action_add": "Hinzufügen", + "option_no_one": "— Niemand —", + "action_remove_title": "Entfernen", + "empty": "Noch nichts auf der Liste.", + "claimed_via_link": "{name} (via Link)", + "unknown_assignee": "?" + }, + "guest_list_editor": { + "placeholder_name": "Name", + "placeholder_email": "E-Mail (optional)", + "action_add": "Hinzufügen", + "action_remove_title": "Entfernen", + "empty": "Noch keine Gäste hinzugefügt.", + "rsvp_pending": "Offen", + "rsvp_yes": "Ja", + "rsvp_maybe": "Vielleicht", + "rsvp_no": "Nein" + }, + "public_rsvp_list": { + "title": "Antworten via Link", + "action_refresh": "Neu laden", + "err_load": "Fehler beim Laden", + "empty": "Noch keine Antworten via Share-Link.", + "status_yes": "Ja", + "status_no": "Nein", + "status_maybe": "Vielleicht", + "meta_updated": "Aktualisiert um {time} · Auto-Refresh alle 30s", + "action_import_title": "Zur Gästeliste" + }, + "rsvp_summary": { + "label_yes": "Ja", + "label_maybe": "Vielleicht", + "label_no": "Nein", + "label_pending": "Offen", + "attending": "kommen" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/events/en.json b/apps/mana/apps/web/src/lib/i18n/locales/events/en.json new file mode 100644 index 000000000..6b85d28c1 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/events/en.json @@ -0,0 +1,145 @@ +{ + "list_view": { + "doc_title": "Events - Mana", + "tab_mine": "My events", + "tab_discover": "Discover", + "subtitle_count": "{upcoming} upcoming · {past} past", + "new_event_btn": "+ New event", + "cancel_btn": "Cancel", + "placeholder_title": "What's it about? (e.g. Anna's birthday)", + "placeholder_location": "Location (optional)", + "submit_create": "Create event", + "section_upcoming": "Upcoming", + "section_past": "Past", + "empty_upcoming": "No upcoming events. Time for a party?" + }, + "detail_view": { + "loading": "Loading event...", + "back": "← Back", + "action_edit": "Edit", + "action_delete": "Delete", + "confirm_delete": "Really delete event \"{title}\"?", + "placeholder_title": "Event title", + "placeholder_description": "Description", + "placeholder_location": "Location — type an address...", + "location_pinned_title": "Coordinates set", + "label_start": "Start", + "label_end": "End", + "label_all_day": "All day", + "action_cancel": "Cancel", + "action_save": "Save", + "map_iframe_title": "Event location on map", + "map_open": "Open in OpenStreetMap →", + "label_visibility": "Visibility", + "section_rsvps": "RSVPs", + "section_guests": "Guests", + "section_bring_list": "Bring list", + "section_share": "Share", + "action_copy_link": "Copy", + "action_make_private": "Make private", + "share_hint": "Replies appear automatically below in \"Replies via link\" (polling every 30s).", + "action_publish": "Publish event & generate link" + }, + "event_card": { + "badge_draft": "Draft", + "badge_cancelled": "Cancelled", + "badge_published": "Shared", + "all_day": "All day", + "yes_count": "{count} attending", + "pending_count": "· {count} pending" + }, + "discovered_card": { + "all_day": "All day", + "source_fallback": "Source", + "saved_label": "Saved", + "action_save": "Save", + "action_dismiss": "Dismiss" + }, + "discovery_tab": { + "loading": "Loading...", + "action_refresh": "Refresh", + "action_sources": "Sources", + "action_sources_count": "Sources ({count})", + "loading_events": "Loading events...", + "empty_title": "No events found yet", + "empty_hint": "Add iCal feeds from venues or clubs to discover events.", + "action_manage_sources": "Manage sources", + "action_load_more": "Load more" + }, + "discovery_setup": { + "title": "Set up event discovery", + "step1_desc": "Which regions should be searched for events?", + "action_next": "Next", + "step2_desc": "What interests you?", + "placeholder_freetext": "More interests (comma-separated, e.g. improv theatre, Rust meetups)", + "action_back": "Back", + "action_finish": "Done" + }, + "region_picker": { + "radius_unit": "{km} km", + "add_region": "+ Region", + "placeholder_search": "Search city or region...", + "radius_label": "Radius: {km} km", + "searching": "Searching...", + "action_cancel": "Cancel" + }, + "source_manager": { + "section_title": "Sources", + "action_discover": "Find automatically", + "action_discovering": "Searching...", + "action_add_ical": "+ iCal feed", + "placeholder_name": "Name (e.g. Jazzhaus Freiburg)", + "placeholder_url": "iCal URL (.ics)", + "action_submit_add": "Add", + "action_cancel": "Cancel", + "section_suggested": "Suggested sources", + "action_activate": "Activate", + "action_reject": "x", + "empty": "No sources yet. Use \"Find automatically\" or add iCal feeds manually.", + "meta_last_scan": "Last scan: {date}", + "never_scanned": "never", + "errors_count": "{count} errors", + "action_scan": "Scan", + "action_scan_title": "Scan now", + "action_remove_title": "Remove" + }, + "bring_list_editor": { + "placeholder_label": "e.g. salad, wine, speaker", + "placeholder_quantity": "Count", + "action_add": "Add", + "option_no_one": "— No one —", + "action_remove_title": "Remove", + "empty": "Nothing on the list yet.", + "claimed_via_link": "{name} (via link)", + "unknown_assignee": "?" + }, + "guest_list_editor": { + "placeholder_name": "Name", + "placeholder_email": "Email (optional)", + "action_add": "Add", + "action_remove_title": "Remove", + "empty": "No guests added yet.", + "rsvp_pending": "Pending", + "rsvp_yes": "Yes", + "rsvp_maybe": "Maybe", + "rsvp_no": "No" + }, + "public_rsvp_list": { + "title": "Replies via link", + "action_refresh": "Reload", + "err_load": "Loading error", + "empty": "No replies via share link yet.", + "status_yes": "Yes", + "status_no": "No", + "status_maybe": "Maybe", + "meta_updated": "Updated at {time} · Auto-refresh every 30s", + "action_import_title": "Add to guest list" + }, + "rsvp_summary": { + "label_yes": "Yes", + "label_maybe": "Maybe", + "label_no": "No", + "label_pending": "Pending", + "attending": "attending" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/events/es.json b/apps/mana/apps/web/src/lib/i18n/locales/events/es.json new file mode 100644 index 000000000..27cafc626 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/events/es.json @@ -0,0 +1,145 @@ +{ + "list_view": { + "doc_title": "Eventos - Mana", + "tab_mine": "Mis eventos", + "tab_discover": "Descubrir", + "subtitle_count": "{upcoming} próximos · {past} pasados", + "new_event_btn": "+ Nuevo evento", + "cancel_btn": "Cancelar", + "placeholder_title": "¿De qué se trata? (p. ej. cumpleaños de Anna)", + "placeholder_location": "Lugar (opcional)", + "submit_create": "Crear evento", + "section_upcoming": "Próximos", + "section_past": "Pasados", + "empty_upcoming": "No hay eventos próximos. ¿Tiempo para una fiesta?" + }, + "detail_view": { + "loading": "Cargando evento...", + "back": "← Atrás", + "action_edit": "Editar", + "action_delete": "Eliminar", + "confirm_delete": "¿Eliminar de verdad el evento \"{title}\"?", + "placeholder_title": "Título del evento", + "placeholder_description": "Descripción", + "placeholder_location": "Lugar — escribe una dirección...", + "location_pinned_title": "Coordenadas establecidas", + "label_start": "Inicio", + "label_end": "Fin", + "label_all_day": "Todo el día", + "action_cancel": "Cancelar", + "action_save": "Guardar", + "map_iframe_title": "Lugar del evento en el mapa", + "map_open": "Abrir en OpenStreetMap →", + "label_visibility": "Visibilidad", + "section_rsvps": "RSVPs", + "section_guests": "Invitados", + "section_bring_list": "Lista de cosas", + "section_share": "Compartir", + "action_copy_link": "Copiar", + "action_make_private": "Hacer privado", + "share_hint": "Las respuestas aparecen automáticamente abajo en «Respuestas vía enlace» (polling cada 30s).", + "action_publish": "Publicar evento y generar enlace" + }, + "event_card": { + "badge_draft": "Borrador", + "badge_cancelled": "Cancelado", + "badge_published": "Compartido", + "all_day": "Todo el día", + "yes_count": "{count} asisten", + "pending_count": "· {count} pendientes" + }, + "discovered_card": { + "all_day": "Todo el día", + "source_fallback": "Fuente", + "saved_label": "Guardado", + "action_save": "Guardar", + "action_dismiss": "Descartar" + }, + "discovery_tab": { + "loading": "Cargando...", + "action_refresh": "Actualizar", + "action_sources": "Fuentes", + "action_sources_count": "Fuentes ({count})", + "loading_events": "Cargando eventos...", + "empty_title": "Aún no se han encontrado eventos", + "empty_hint": "Añade feeds iCal de salas o clubes para descubrir eventos.", + "action_manage_sources": "Gestionar fuentes", + "action_load_more": "Cargar más" + }, + "discovery_setup": { + "title": "Configurar descubrimiento de eventos", + "step1_desc": "¿En qué regiones se deben buscar eventos?", + "action_next": "Siguiente", + "step2_desc": "¿Qué te interesa?", + "placeholder_freetext": "Más intereses (separados por coma, p. ej. teatro improv, meetups Rust)", + "action_back": "Atrás", + "action_finish": "Listo" + }, + "region_picker": { + "radius_unit": "{km} km", + "add_region": "+ Región", + "placeholder_search": "Buscar ciudad o región...", + "radius_label": "Radio: {km} km", + "searching": "Buscando...", + "action_cancel": "Cancelar" + }, + "source_manager": { + "section_title": "Fuentes", + "action_discover": "Buscar automáticamente", + "action_discovering": "Buscando...", + "action_add_ical": "+ Feed iCal", + "placeholder_name": "Nombre (p. ej. Jazzhaus Freiburg)", + "placeholder_url": "URL iCal (.ics)", + "action_submit_add": "Añadir", + "action_cancel": "Cancelar", + "section_suggested": "Fuentes sugeridas", + "action_activate": "Activar", + "action_reject": "x", + "empty": "Aún no hay fuentes. Usa \"Buscar automáticamente\" o añade feeds iCal manualmente.", + "meta_last_scan": "Último escaneo: {date}", + "never_scanned": "nunca", + "errors_count": "{count} errores", + "action_scan": "Escanear", + "action_scan_title": "Escanear ahora", + "action_remove_title": "Quitar" + }, + "bring_list_editor": { + "placeholder_label": "p. ej. ensalada, vino, altavoz", + "placeholder_quantity": "Cantidad", + "action_add": "Añadir", + "option_no_one": "— Nadie —", + "action_remove_title": "Quitar", + "empty": "Aún no hay nada en la lista.", + "claimed_via_link": "{name} (vía enlace)", + "unknown_assignee": "?" + }, + "guest_list_editor": { + "placeholder_name": "Nombre", + "placeholder_email": "Correo electrónico (opcional)", + "action_add": "Añadir", + "action_remove_title": "Quitar", + "empty": "Aún no se han añadido invitados.", + "rsvp_pending": "Pendiente", + "rsvp_yes": "Sí", + "rsvp_maybe": "Quizás", + "rsvp_no": "No" + }, + "public_rsvp_list": { + "title": "Respuestas vía enlace", + "action_refresh": "Recargar", + "err_load": "Error al cargar", + "empty": "Aún no hay respuestas vía enlace.", + "status_yes": "Sí", + "status_no": "No", + "status_maybe": "Quizás", + "meta_updated": "Actualizado a las {time} · Auto-refresco cada 30s", + "action_import_title": "A la lista de invitados" + }, + "rsvp_summary": { + "label_yes": "Sí", + "label_maybe": "Quizás", + "label_no": "No", + "label_pending": "Pendiente", + "attending": "asisten" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/events/fr.json b/apps/mana/apps/web/src/lib/i18n/locales/events/fr.json new file mode 100644 index 000000000..efc72d5c8 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/events/fr.json @@ -0,0 +1,145 @@ +{ + "list_view": { + "doc_title": "Événements - Mana", + "tab_mine": "Mes événements", + "tab_discover": "Découvrir", + "subtitle_count": "{upcoming} à venir · {past} passés", + "new_event_btn": "+ Nouvel événement", + "cancel_btn": "Annuler", + "placeholder_title": "De quoi s'agit-il ? (p. ex. anniversaire d'Anna)", + "placeholder_location": "Lieu (optionnel)", + "submit_create": "Créer l'événement", + "section_upcoming": "À venir", + "section_past": "Passés", + "empty_upcoming": "Aucun événement à venir. C'est l'heure d'une fête ?" + }, + "detail_view": { + "loading": "Chargement de l'événement...", + "back": "← Retour", + "action_edit": "Modifier", + "action_delete": "Supprimer", + "confirm_delete": "Vraiment supprimer l'événement « {title} » ?", + "placeholder_title": "Titre de l'événement", + "placeholder_description": "Description", + "placeholder_location": "Lieu — saisis une adresse...", + "location_pinned_title": "Coordonnées définies", + "label_start": "Début", + "label_end": "Fin", + "label_all_day": "Toute la journée", + "action_cancel": "Annuler", + "action_save": "Enregistrer", + "map_iframe_title": "Lieu de l'événement sur la carte", + "map_open": "Ouvrir dans OpenStreetMap →", + "label_visibility": "Visibilité", + "section_rsvps": "RSVPs", + "section_guests": "Invités", + "section_bring_list": "Liste à apporter", + "section_share": "Partager", + "action_copy_link": "Copier", + "action_make_private": "Rendre privé", + "share_hint": "Les réponses apparaissent automatiquement ci-dessous dans « Réponses via le lien » (polling toutes les 30s).", + "action_publish": "Publier l'événement & générer le lien" + }, + "event_card": { + "badge_draft": "Brouillon", + "badge_cancelled": "Annulé", + "badge_published": "Partagé", + "all_day": "Toute la journée", + "yes_count": "{count} viennent", + "pending_count": "· {count} en attente" + }, + "discovered_card": { + "all_day": "Toute la journée", + "source_fallback": "Source", + "saved_label": "Enregistré", + "action_save": "Enregistrer", + "action_dismiss": "Masquer" + }, + "discovery_tab": { + "loading": "Chargement...", + "action_refresh": "Actualiser", + "action_sources": "Sources", + "action_sources_count": "Sources ({count})", + "loading_events": "Chargement des événements...", + "empty_title": "Aucun événement trouvé pour l'instant", + "empty_hint": "Ajoute des flux iCal de salles ou d'associations pour découvrir des événements.", + "action_manage_sources": "Gérer les sources", + "action_load_more": "Charger plus" + }, + "discovery_setup": { + "title": "Configurer la découverte d'événements", + "step1_desc": "Quelles régions doivent être recherchées ?", + "action_next": "Suivant", + "step2_desc": "Qu'est-ce qui t'intéresse ?", + "placeholder_freetext": "Autres centres d'intérêt (séparés par virgule, p. ex. impro-théâtre, meetups Rust)", + "action_back": "Retour", + "action_finish": "Terminé" + }, + "region_picker": { + "radius_unit": "{km} km", + "add_region": "+ Région", + "placeholder_search": "Rechercher une ville ou région...", + "radius_label": "Rayon : {km} km", + "searching": "Recherche...", + "action_cancel": "Annuler" + }, + "source_manager": { + "section_title": "Sources", + "action_discover": "Trouver automatiquement", + "action_discovering": "Recherche...", + "action_add_ical": "+ Flux iCal", + "placeholder_name": "Nom (p. ex. Jazzhaus Freiburg)", + "placeholder_url": "URL iCal (.ics)", + "action_submit_add": "Ajouter", + "action_cancel": "Annuler", + "section_suggested": "Sources suggérées", + "action_activate": "Activer", + "action_reject": "x", + "empty": "Pas encore de sources. Utilise « Trouver automatiquement » ou ajoute des flux iCal manuellement.", + "meta_last_scan": "Dernier scan : {date}", + "never_scanned": "jamais", + "errors_count": "{count} erreurs", + "action_scan": "Scanner", + "action_scan_title": "Scanner maintenant", + "action_remove_title": "Retirer" + }, + "bring_list_editor": { + "placeholder_label": "p. ex. salade, vin, enceinte", + "placeholder_quantity": "Quantité", + "action_add": "Ajouter", + "option_no_one": "— Personne —", + "action_remove_title": "Retirer", + "empty": "Rien sur la liste pour l'instant.", + "claimed_via_link": "{name} (via lien)", + "unknown_assignee": "?" + }, + "guest_list_editor": { + "placeholder_name": "Nom", + "placeholder_email": "E-mail (optionnel)", + "action_add": "Ajouter", + "action_remove_title": "Retirer", + "empty": "Aucun invité ajouté pour l'instant.", + "rsvp_pending": "En attente", + "rsvp_yes": "Oui", + "rsvp_maybe": "Peut-être", + "rsvp_no": "Non" + }, + "public_rsvp_list": { + "title": "Réponses via lien", + "action_refresh": "Recharger", + "err_load": "Erreur de chargement", + "empty": "Pas encore de réponses via lien.", + "status_yes": "Oui", + "status_no": "Non", + "status_maybe": "Peut-être", + "meta_updated": "Mis à jour à {time} · Auto-rafraîchissement toutes les 30s", + "action_import_title": "Vers la liste d'invités" + }, + "rsvp_summary": { + "label_yes": "Oui", + "label_maybe": "Peut-être", + "label_no": "Non", + "label_pending": "En attente", + "attending": "viennent" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/events/it.json b/apps/mana/apps/web/src/lib/i18n/locales/events/it.json new file mode 100644 index 000000000..d474470f1 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/events/it.json @@ -0,0 +1,145 @@ +{ + "list_view": { + "doc_title": "Eventi - Mana", + "tab_mine": "I miei eventi", + "tab_discover": "Scopri", + "subtitle_count": "{upcoming} in arrivo · {past} passati", + "new_event_btn": "+ Nuovo evento", + "cancel_btn": "Annulla", + "placeholder_title": "Di cosa si tratta? (es. compleanno di Anna)", + "placeholder_location": "Luogo (opzionale)", + "submit_create": "Crea evento", + "section_upcoming": "In arrivo", + "section_past": "Passati", + "empty_upcoming": "Nessun evento in arrivo. Tempo di una festa?" + }, + "detail_view": { + "loading": "Caricamento evento...", + "back": "← Indietro", + "action_edit": "Modifica", + "action_delete": "Elimina", + "confirm_delete": "Eliminare davvero l'evento \"{title}\"?", + "placeholder_title": "Titolo dell'evento", + "placeholder_description": "Descrizione", + "placeholder_location": "Luogo — digita un indirizzo...", + "location_pinned_title": "Coordinate impostate", + "label_start": "Inizio", + "label_end": "Fine", + "label_all_day": "Tutto il giorno", + "action_cancel": "Annulla", + "action_save": "Salva", + "map_iframe_title": "Luogo dell'evento sulla mappa", + "map_open": "Apri in OpenStreetMap →", + "label_visibility": "Visibilità", + "section_rsvps": "RSVPs", + "section_guests": "Ospiti", + "section_bring_list": "Lista da portare", + "section_share": "Condividi", + "action_copy_link": "Copia", + "action_make_private": "Rendi privato", + "share_hint": "Le risposte appaiono automaticamente sotto in «Risposte via link» (polling ogni 30s).", + "action_publish": "Pubblica evento & genera link" + }, + "event_card": { + "badge_draft": "Bozza", + "badge_cancelled": "Annullato", + "badge_published": "Condiviso", + "all_day": "Tutto il giorno", + "yes_count": "{count} vengono", + "pending_count": "· {count} in sospeso" + }, + "discovered_card": { + "all_day": "Tutto il giorno", + "source_fallback": "Fonte", + "saved_label": "Salvato", + "action_save": "Salva", + "action_dismiss": "Nascondi" + }, + "discovery_tab": { + "loading": "Caricamento...", + "action_refresh": "Aggiorna", + "action_sources": "Fonti", + "action_sources_count": "Fonti ({count})", + "loading_events": "Caricamento eventi...", + "empty_title": "Ancora nessun evento trovato", + "empty_hint": "Aggiungi feed iCal di locali o associazioni per scoprire eventi.", + "action_manage_sources": "Gestisci fonti", + "action_load_more": "Carica altri" + }, + "discovery_setup": { + "title": "Imposta scoperta eventi", + "step1_desc": "In quali regioni cercare eventi?", + "action_next": "Avanti", + "step2_desc": "Cosa ti interessa?", + "placeholder_freetext": "Altri interessi (separati da virgola, es. teatro improv, meetup Rust)", + "action_back": "Indietro", + "action_finish": "Fatto" + }, + "region_picker": { + "radius_unit": "{km} km", + "add_region": "+ Regione", + "placeholder_search": "Cerca città o regione...", + "radius_label": "Raggio: {km} km", + "searching": "Ricerca...", + "action_cancel": "Annulla" + }, + "source_manager": { + "section_title": "Fonti", + "action_discover": "Trova automaticamente", + "action_discovering": "Ricerca...", + "action_add_ical": "+ Feed iCal", + "placeholder_name": "Nome (es. Jazzhaus Freiburg)", + "placeholder_url": "URL iCal (.ics)", + "action_submit_add": "Aggiungi", + "action_cancel": "Annulla", + "section_suggested": "Fonti suggerite", + "action_activate": "Attiva", + "action_reject": "x", + "empty": "Ancora nessuna fonte. Usa \"Trova automaticamente\" o aggiungi feed iCal manualmente.", + "meta_last_scan": "Ultima scansione: {date}", + "never_scanned": "mai", + "errors_count": "{count} errori", + "action_scan": "Scansiona", + "action_scan_title": "Scansiona ora", + "action_remove_title": "Rimuovi" + }, + "bring_list_editor": { + "placeholder_label": "es. insalata, vino, casse", + "placeholder_quantity": "Quantità", + "action_add": "Aggiungi", + "option_no_one": "— Nessuno —", + "action_remove_title": "Rimuovi", + "empty": "Ancora niente nella lista.", + "claimed_via_link": "{name} (via link)", + "unknown_assignee": "?" + }, + "guest_list_editor": { + "placeholder_name": "Nome", + "placeholder_email": "E-mail (opzionale)", + "action_add": "Aggiungi", + "action_remove_title": "Rimuovi", + "empty": "Ancora nessun ospite aggiunto.", + "rsvp_pending": "In sospeso", + "rsvp_yes": "Sì", + "rsvp_maybe": "Forse", + "rsvp_no": "No" + }, + "public_rsvp_list": { + "title": "Risposte via link", + "action_refresh": "Ricarica", + "err_load": "Errore di caricamento", + "empty": "Ancora nessuna risposta via link.", + "status_yes": "Sì", + "status_no": "No", + "status_maybe": "Forse", + "meta_updated": "Aggiornato alle {time} · Auto-refresh ogni 30s", + "action_import_title": "Alla lista ospiti" + }, + "rsvp_summary": { + "label_yes": "Sì", + "label_maybe": "Forse", + "label_no": "No", + "label_pending": "In sospeso", + "attending": "vengono" + } +} diff --git a/apps/mana/apps/web/src/lib/modules/events/ListView.svelte b/apps/mana/apps/web/src/lib/modules/events/ListView.svelte index 0eb7e1f2d..b9dc4131e 100644 --- a/apps/mana/apps/web/src/lib/modules/events/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/events/ListView.svelte @@ -1,5 +1,6 @@ - Events - Mana + {$_('events.list_view.doc_title')}
{#if activeTab === 'mine'}

- {(upcoming.value ?? []).length} bevorstehend · {(past.value ?? []).length} vergangen + {$_('events.list_view.subtitle_count', { + values: { + upcoming: (upcoming.value ?? []).length, + past: (past.value ?? []).length, + }, + })}

@@ -91,22 +97,28 @@
- +
- + {/if}
-

Bevorstehend

+

{$_('events.list_view.section_upcoming')}

{#if (upcoming.value ?? []).length === 0} -

Keine bevorstehenden Events. Zeit fur eine Party?

+

{$_('events.list_view.empty_upcoming')}

{:else}
{#each upcoming.value ?? [] as event (event.id)} @@ -119,7 +131,7 @@ {#if (past.value ?? []).length > 0}
-

Vergangen

+

{$_('events.list_view.section_past')}

{#each past.value ?? [] as event (event.id)} open(event)} /> diff --git a/apps/mana/apps/web/src/lib/modules/events/components/BringListEditor.svelte b/apps/mana/apps/web/src/lib/modules/events/components/BringListEditor.svelte index bbced59c7..c96c56b3f 100644 --- a/apps/mana/apps/web/src/lib/modules/events/components/BringListEditor.svelte +++ b/apps/mana/apps/web/src/lib/modules/events/components/BringListEditor.svelte @@ -1,4 +1,5 @@
-

Event-Entdeckung einrichten

+

{$_('events.discovery_setup.title')}

{#if step === 1}
-

Welche Regionen sollen nach Events durchsucht werden?

+

{$_('events.discovery_setup.step1_desc')}

- +
{:else}
-

Was interessiert dich?

+

{$_('events.discovery_setup.step2_desc')}

{#each EVENT_CATEGORIES as cat} - + +
{/if} diff --git a/apps/mana/apps/web/src/lib/modules/events/components/DiscoveryTab.svelte b/apps/mana/apps/web/src/lib/modules/events/components/DiscoveryTab.svelte index 480d663f5..1c824a00f 100644 --- a/apps/mana/apps/web/src/lib/modules/events/components/DiscoveryTab.svelte +++ b/apps/mana/apps/web/src/lib/modules/events/components/DiscoveryTab.svelte @@ -1,5 +1,6 @@ @@ -32,11 +35,11 @@

{event.title}

{#if event.status === 'draft'} - Entwurf + {$_('events.event_card.badge_draft')} {:else if event.status === 'cancelled'} - Abgesagt + {$_('events.event_card.badge_cancelled')} {:else if event.isPublished} - Geteilt + {$_('events.event_card.badge_published')} {/if}
{#if event.location} @@ -44,9 +47,17 @@ {/if} {#if summary}
- {summary.totalAttending} kommen + {$_('events.event_card.yes_count', { + values: { count: summary.totalAttending }, + })} {#if summary.pending > 0} - · {summary.pending} offen + {$_('events.event_card.pending_count', { + values: { count: summary.pending }, + })} {/if}
{/if} diff --git a/apps/mana/apps/web/src/lib/modules/events/components/GuestListEditor.svelte b/apps/mana/apps/web/src/lib/modules/events/components/GuestListEditor.svelte index f17f2fb8b..877323259 100644 --- a/apps/mana/apps/web/src/lib/modules/events/components/GuestListEditor.svelte +++ b/apps/mana/apps/web/src/lib/modules/events/components/GuestListEditor.svelte @@ -1,4 +1,5 @@ {#if !event} -
Lade Event...
+
{$_('events.detail_view.loading')}
{:else}
- +
- - + +
{#if editing}
- -
{ if (addressSuggestions.length > 0) showAddressSuggestions = true; }} - placeholder="Ort — tippe eine Adresse..." + placeholder={$_('events.detail_view.placeholder_location')} /> {#if locationLatDraft && locationLonDraft} - + {/if} @@ -206,21 +220,25 @@
- - + +
{:else} @@ -247,7 +265,7 @@ {#if mapUrl}