No locking (plan 03, decision 5): openForEdit keeps an EditSnapshot — the prefilled form plus the raw Events-row times, which the form itself can't see (it derives its times from the tapped occurrence, so an externally moved event would otherwise stay invisible). Right before writing, performSave re-reads the event and compares snapshots: a mismatch parks the save in SaveUiState.AwaitingConflict carrying the already-chosen recurring scope, and the dialog offers overwrite / discard / cancel (OptionCard style). Overwrite still writes only dirty fields, so external changes to untouched fields survive either way. A deleted event lands in SaveUiState.Gone — an informational dialog that closes form and detail. Fields the form can't write (attendees, status, self response, reminder methods) are excluded from the comparison so sync noise can't fake a conflict. The load-time zone is pinned in the EditTarget so a device timezone change mid-edit can't either. Store metadata: F-Droid descriptions (DE+EN) and the README stop claiming read-only and now describe write support and reminder delivery. New fastlane phoneScreenshots (6 per locale: week/month/day/detail/form/ reminder onboarding), captured on-device against demo-only calendars. Tests: EditSnapshot equality (unchanged event, field change, row-time move the form can't see, non-writable changes stay quiet). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
225 lines
14 KiB
XML
225 lines
14 KiB
XML
<resources>
|
|
<string name="app_name">Calendula</string>
|
|
<string name="app_tagline">Ein moderner Kalender.</string>
|
|
|
|
<string name="state_loading">Lädt…</string>
|
|
<string name="state_retry">Erneut versuchen</string>
|
|
<string name="state_failure_unknown">Etwas ist schiefgelaufen.</string>
|
|
<string name="state_failure_permission">Zugriff auf den Kalender wird benötigt.</string>
|
|
<string name="state_failure_permission_action">Zugriff erlauben</string>
|
|
<string name="state_failure_no_calendars">Keine Kalender eingerichtet.</string>
|
|
<string name="state_failure_no_calendars_action">System-Kalender-Einstellungen öffnen</string>
|
|
<string name="state_failure_provider">Kalender konnte nicht gelesen werden.</string>
|
|
|
|
<!-- Permission-Flow (F1) -->
|
|
<string name="permission_rationale_title">Alle Termine, schön im Blick</string>
|
|
<string name="permission_rationale_body">Calendula braucht Zugriff auf deinen Kalender, um deine Termine zu zeigen und zu verwalten. Mehr verlangt die App nie.</string>
|
|
<string name="permission_request_button">Kalender-Zugriff erlauben</string>
|
|
<string name="permission_denied_title">Kalender-Zugriff abgelehnt</string>
|
|
<string name="permission_denied_body">Ohne Kalender-Zugriff kann Calendula keine Termine anzeigen. Du kannst den Zugriff in den System-Einstellungen wieder erlauben.</string>
|
|
<string name="permission_open_settings_button">System-Einstellungen öffnen</string>
|
|
<string name="permission_retry_button">Erneut versuchen</string>
|
|
<string name="permission_benefit_private_title">Bleibt auf deinem Gerät</string>
|
|
<string name="permission_benefit_private_body">Deine Kalender werden lokal gelesen und verlassen das Telefon nie.</string>
|
|
<string name="permission_benefit_sync_title">Alle Kalender vereint</string>
|
|
<string name="permission_benefit_sync_body">Google, CalDAV, lokal — alles, was synchronisiert ist, erscheint automatisch.</string>
|
|
<string name="permission_benefit_privacy_title">Kein Tracking, niemals</string>
|
|
<string name="permission_benefit_privacy_body">Keine Telemetrie, keine Analyse, keine Werbung.</string>
|
|
<string name="permission_privacy_footnote">Bleibt auf deinem Gerät · keine Internet-Berechtigung</string>
|
|
|
|
<!-- Monatsansicht (S1) -->
|
|
<string name="month_prev">Vorheriger Monat</string>
|
|
<string name="month_next">Nächster Monat</string>
|
|
<string name="month_today_action">Heute</string>
|
|
<string name="month_more_actions">Weitere Aktionen</string>
|
|
<string name="month_open_menu">Menü öffnen</string>
|
|
<string name="month_action_settings">Einstellungen</string>
|
|
<string name="month_a11y_today_prefix">Heute</string>
|
|
|
|
<!-- Wochenansicht (S2) -->
|
|
<string name="week_today_action">Diese Woche</string>
|
|
<string name="week_number_label">KW</string>
|
|
|
|
<!-- Tagesansicht (S3) -->
|
|
<string name="day_today_action">Heute</string>
|
|
|
|
<!-- Event-Detail-Screen (S4) -->
|
|
<string name="event_detail_back">Zurück</string>
|
|
<string name="event_detail_edit">Bearbeiten</string>
|
|
<string name="event_detail_delete">Löschen</string>
|
|
<string name="event_delete_title">Termin löschen?</string>
|
|
<string name="event_delete_body">Der Termin wird aus deinem Kalender und von allen synchronisierten Geräten entfernt.</string>
|
|
<string name="event_delete_recurring_title">Wiederkehrenden Termin löschen</string>
|
|
<string name="event_delete_option_occurrence">Nur dieser Termin</string>
|
|
<string name="event_delete_option_following">Dieser und alle folgenden Termine</string>
|
|
<string name="event_delete_option_series">Alle Termine der Serie</string>
|
|
<string name="event_edit_recurring_title">Wiederkehrenden Termin bearbeiten</string>
|
|
<string name="event_delete_failed">Termin konnte nicht gelöscht werden</string>
|
|
<string name="event_delete_write_denied">Calendula braucht Schreibzugriff, um Termine zu löschen</string>
|
|
<string name="dialog_cancel">Abbrechen</string>
|
|
<string name="dialog_ok">OK</string>
|
|
|
|
<!-- Termin-Formular (v1.2 Erstellen) -->
|
|
<string name="event_edit_new_title">Neuer Termin</string>
|
|
<string name="event_edit_close">Schließen</string>
|
|
<string name="event_edit_save">Speichern</string>
|
|
<string name="event_edit_title_hint">Titel hinzufügen</string>
|
|
<string name="event_edit_starts">Beginn</string>
|
|
<string name="event_edit_ends">Ende</string>
|
|
<string name="event_edit_error_end_before_start">Endet vor dem Beginn</string>
|
|
<string name="event_edit_error_no_calendar">Kein beschreibbarer Kalender verfügbar</string>
|
|
<string name="event_edit_save_failed">Termin konnte nicht gespeichert werden</string>
|
|
<string name="event_edit_write_denied">Calendula braucht Schreibzugriff, um Termine zu erstellen</string>
|
|
<string name="event_edit_more_fields">Weitere Felder</string>
|
|
<string name="event_edit_add">Hinzufügen</string>
|
|
<string name="event_edit_add_reminder">Erinnerung hinzufügen</string>
|
|
<string name="event_edit_remove_reminder">Erinnerung entfernen</string>
|
|
<string name="event_edit_reminder_custom">Benutzerdefiniert</string>
|
|
<string name="reminder_unit_minutes">Minuten</string>
|
|
<string name="reminder_unit_hours">Stunden</string>
|
|
<string name="reminder_unit_days">Tage</string>
|
|
<string name="reminder_unit_weeks">Wochen</string>
|
|
<string name="event_edit_availability">Verfügbarkeit</string>
|
|
<string name="event_edit_visibility">Sichtbarkeit</string>
|
|
|
|
<!-- Termin-Formular — Speicher-Konflikt (v2.0) -->
|
|
<string name="event_edit_conflict_title">Termin wurde extern geändert</string>
|
|
<string name="event_edit_conflict_body">Während du bearbeitet hast, wurde dieser Termin anderswo geändert — durch Synchronisierung oder eine andere App. Was soll mit deinen Änderungen passieren?</string>
|
|
<string name="event_edit_conflict_overwrite">Meine Änderungen speichern</string>
|
|
<string name="event_edit_conflict_overwrite_hint">Nur von dir bearbeitete Felder überschreiben die externe Änderung</string>
|
|
<string name="event_edit_conflict_discard">Meine Änderungen verwerfen</string>
|
|
<string name="event_edit_conflict_discard_hint">Der Termin bleibt, wie er jetzt ist</string>
|
|
<string name="event_edit_gone_title">Termin wurde gelöscht</string>
|
|
<string name="event_edit_gone_body">Dieser Termin wurde zwischenzeitlich gelöscht, etwa auf einem anderen Gerät. Deine Änderungen können nicht mehr gespeichert werden.</string>
|
|
|
|
<!-- Termin-Formular — Wiederholungs-Picker (v1.3) -->
|
|
<string name="event_edit_recurrence_none">Wiederholt sich nicht</string>
|
|
<string name="event_edit_recurrence_custom">Benutzerdefiniert</string>
|
|
<string name="event_edit_recurrence_every">Alle</string>
|
|
<string name="recurrence_unit_days">Tage</string>
|
|
<string name="recurrence_unit_weeks">Wochen</string>
|
|
<string name="recurrence_unit_months">Monate</string>
|
|
<string name="recurrence_unit_years">Jahre</string>
|
|
<string name="event_edit_recurrence_ends">Endet</string>
|
|
<string name="event_edit_recurrence_end_never">Nie</string>
|
|
<string name="event_edit_recurrence_end_until">An einem Datum</string>
|
|
<string name="event_edit_recurrence_end_count">Nach einer Anzahl</string>
|
|
<string name="event_edit_recurrence_times">Mal</string>
|
|
<string name="event_edit_error_recurrence_ends_before_start">Wiederholung endet vor dem Beginn</string>
|
|
<string name="event_availability_busy">Beschäftigt</string>
|
|
<string name="event_access_default">Standard</string>
|
|
<string name="event_access_public">Öffentlich</string>
|
|
<string name="event_detail_all_day">Ganztägig</string>
|
|
<string name="event_detail_calendar">Kalender</string>
|
|
<string name="event_detail_calendar_unknown">Unbekannter Kalender</string>
|
|
<string name="event_detail_location">Ort</string>
|
|
<string name="event_detail_description">Beschreibung</string>
|
|
<string name="event_detail_attendees">Teilnehmer</string>
|
|
<string name="event_detail_recurrence">Wiederholung</string>
|
|
<string name="event_detail_recurring">Wiederkehrender Termin</string>
|
|
<string name="recurrence_daily">Jeden Tag</string>
|
|
<string name="recurrence_weekly">Jede Woche</string>
|
|
<string name="recurrence_monthly">Jeden Monat</string>
|
|
<string name="recurrence_yearly">Jedes Jahr</string>
|
|
<string name="recurrence_every_n_days">Alle %1$d Tage</string>
|
|
<string name="recurrence_every_n_weeks">Alle %1$d Wochen</string>
|
|
<string name="recurrence_every_n_months">Alle %1$d Monate</string>
|
|
<string name="recurrence_every_n_years">Alle %1$d Jahre</string>
|
|
<string name="recurrence_on_days">%1$s am %2$s</string>
|
|
<string name="recurrence_with_until">%1$s bis %2$s</string>
|
|
<string name="recurrence_with_count">%1$s, %2$d Mal</string>
|
|
<string name="event_detail_not_found">Dieser Termin existiert nicht mehr.</string>
|
|
<string name="event_attendee_accepted">Zugesagt</string>
|
|
<string name="event_attendee_declined">Abgesagt</string>
|
|
<string name="event_attendee_tentative">Vorläufig</string>
|
|
<string name="event_attendee_needs_action">Keine Antwort</string>
|
|
<string name="event_attendee_unknown">—</string>
|
|
|
|
<!-- Event-Detail — vollständiges Auslesen (v0.6) -->
|
|
<string name="event_detail_reminders">Erinnerungen</string>
|
|
<string name="event_detail_timezone">Zeitzone</string>
|
|
<string name="event_status_tentative">Vorläufig</string>
|
|
<string name="event_status_cancelled">Abgesagt</string>
|
|
<string name="event_availability_free">Frei</string>
|
|
<string name="event_access_private">Privat</string>
|
|
<string name="event_access_confidential">Vertraulich</string>
|
|
<string name="event_attendee_organizer">Organisator</string>
|
|
<string name="event_attendee_optional">Optional</string>
|
|
<string name="event_attendee_resource">Ressource</string>
|
|
<string name="event_detail_self_response">Deine Antwort: %1$s</string>
|
|
<string name="reminder_at_time">Zur Startzeit</string>
|
|
<string name="reminder_default">Standarderinnerung</string>
|
|
<plurals name="reminder_minutes">
|
|
<item quantity="one">%d Minute vorher</item>
|
|
<item quantity="other">%d Minuten vorher</item>
|
|
</plurals>
|
|
<plurals name="reminder_hours">
|
|
<item quantity="one">%d Stunde vorher</item>
|
|
<item quantity="other">%d Stunden vorher</item>
|
|
</plurals>
|
|
<plurals name="reminder_days">
|
|
<item quantity="one">%d Tag vorher</item>
|
|
<item quantity="other">%d Tage vorher</item>
|
|
</plurals>
|
|
<plurals name="reminder_weeks">
|
|
<item quantity="one">%d Woche vorher</item>
|
|
<item quantity="other">%d Wochen vorher</item>
|
|
</plurals>
|
|
|
|
<!-- Geteilte Event-Strings -->
|
|
<string name="event_untitled">(Ohne Titel)</string>
|
|
|
|
<!-- Erinnerungs-Benachrichtigungen (v1.4) -->
|
|
<string name="reminder_channel_name">Termin-Erinnerungen</string>
|
|
<string name="reminder_channel_description">Benachrichtigungen zu den Erinnerungszeiten deiner Termine</string>
|
|
<string name="reminder_onboarding_title">Keinen Termin mehr verpassen</string>
|
|
<string name="reminder_onboarding_body">Android zeigt Termin-Erinnerungen nicht von selbst — das muss eine Kalender-App tun. Überlass Calendula den Job.</string>
|
|
<string name="reminder_benefit_delivery_title">Erinnerungen, zugestellt</string>
|
|
<string name="reminder_benefit_delivery_body">Jede Erinnerung an deinen Terminen kommt pünktlich als Benachrichtigung an.</string>
|
|
<string name="reminder_benefit_duplicates_title">Noch eine zweite Kalender-App?</string>
|
|
<string name="reminder_benefit_duplicates_body">Wenn eine andere App ebenfalls Erinnerungen zeigt, siehst du sie doppelt — schalte sie dort oder hier ab.</string>
|
|
<string name="reminder_benefit_reversible_title">Jederzeit änderbar</string>
|
|
<string name="reminder_benefit_reversible_body">Der Schalter liegt in den Einstellungen unter Benachrichtigungen.</string>
|
|
<string name="reminder_onboarding_enable_button">Erinnerungen einschalten</string>
|
|
<string name="reminder_onboarding_skip_button">Später</string>
|
|
|
|
<!-- View-Switcher (M1) -->
|
|
<string name="view_month">Monat</string>
|
|
<string name="view_week">Woche</string>
|
|
<string name="view_day">Tag</string>
|
|
|
|
<!-- Kalender-Filter (M3) -->
|
|
<string name="filter_title">Kalender</string>
|
|
|
|
<!-- Einstellungen (M4) -->
|
|
<string name="settings_title">Einstellungen</string>
|
|
<string name="settings_back">Zurück</string>
|
|
<string name="settings_section_appearance">Darstellung</string>
|
|
<string name="settings_theme">Design</string>
|
|
<string name="settings_theme_system">System</string>
|
|
<string name="settings_theme_light">Hell</string>
|
|
<string name="settings_theme_dark">Dunkel</string>
|
|
<string name="settings_dynamic_color">Dynamische Farben</string>
|
|
<string name="settings_dynamic_color_unavailable">Erfordert Android 12 oder neuer</string>
|
|
<string name="settings_week_start">Wochenstart</string>
|
|
<string name="settings_week_start_auto">Automatisch</string>
|
|
<string name="settings_week_start_monday">Montag</string>
|
|
<string name="settings_week_start_sunday">Sonntag</string>
|
|
<string name="settings_section_event_form">Termin-Formular</string>
|
|
<string name="settings_form_fields_hint">Standardmäßig angezeigte Felder — alles Weitere liegt hinter \"Weitere Felder\"</string>
|
|
<string name="settings_section_notifications">Benachrichtigungen</string>
|
|
<string name="settings_reminders">Termin-Erinnerungen</string>
|
|
<string name="settings_reminders_hint">Erinnerungen doppelt? Eine andere Kalender-App zeigt sie ebenfalls — schalte sie in einer der beiden ab.</string>
|
|
<string name="settings_section_language">Sprache</string>
|
|
<string name="settings_language">App-Sprache</string>
|
|
<string name="settings_language_auto">Systemstandard</string>
|
|
<string name="settings_language_german">Deutsch</string>
|
|
<string name="settings_language_english">English</string>
|
|
<string name="settings_section_about">Über</string>
|
|
<string name="settings_version">Version</string>
|
|
<string name="settings_license">Lizenz</string>
|
|
<string name="settings_license_value">MIT</string>
|
|
<string name="settings_source">Quellcode</string>
|
|
<string name="settings_source_open">Öffnen</string>
|
|
</resources>
|