From caf7d81ac98e737c0b09cd94698739954e1855c2 Mon Sep 17 00:00:00 2001 From: elpatron Date: Sat, 30 May 2026 14:18:47 +0200 Subject: [PATCH] i18n: Du-Ansprache und Einladungstexte in Locales auslagern Deutsche UI-Texte und Beta-Flyer auf informelles Deutsch umstellen; hardcodierte Strings aus InvitationAcceptance in de/en.json verschieben. Co-authored-by: Cursor --- .../src/components/InvitationAcceptance.tsx | 79 ++++----- client/src/i18n/locales/de.json | 160 +++++++++++------- client/src/i18n/locales/en.json | 30 ++++ docs/marketing/beta-flyer.html | 6 +- .../marketing/kapteins-daagbok-beta-flyer.pdf | Bin 249353 -> 249369 bytes 5 files changed, 159 insertions(+), 116 deletions(-) diff --git a/client/src/components/InvitationAcceptance.tsx b/client/src/components/InvitationAcceptance.tsx index 39f130c..d1b7c6f 100644 --- a/client/src/components/InvitationAcceptance.tsx +++ b/client/src/components/InvitationAcceptance.tsx @@ -57,8 +57,6 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio const autoAcceptStarted = useRef(false) - const isDe = i18n.language.startsWith('de') - const sessionReady = (): boolean => { return !!(getActiveMasterKey() && localStorage.getItem('active_userid')) } @@ -83,19 +81,16 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio setLogbookKey(hexToBuffer(hexKey)) } catch (err) { console.error('Invalid key in URL fragment:', err) - setError(isDe - ? 'Der Einladungslink ist kryptografisch ungültig (Schlüssel fehlerhaft).' - : 'The invitation link is cryptographically invalid (corrupted key).') + setError(t('invitation.error_invalid_key')) } } else { - setError(isDe - ? 'Der Einladungslink enthält keinen Entschlüsselungsschlüssel (#key=...). Bitte den vollständigen Link vom Eigner verwenden.' - : 'The invitation link is missing the decryption key (#key=...). Please use the complete link from the owner.') + setError(t('invitation.error_missing_key')) } const rand = Math.floor(1000 + Math.random() * 9000) setRegUsername(`CrewSkipper_${rand}`) - }, [isDe]) + // eslint-disable-next-line react-hooks/exhaustive-deps -- mount-only: URL parsing and default username + }, []) useEffect(() => { if (token && logbookKey) { @@ -110,14 +105,12 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio const res = await fetch(`/api/collaboration/invite-details?token=${token}`) if (res.status === 410) { - setError(isDe - ? 'Diese Einladung ist abgelaufen (48 Stunden gültig).' - : 'This invitation link has expired (valid for 48 hours only).') + setError(t('invitation.error_expired')) return } if (!res.ok) { - throw new Error(isDe ? 'Einladungstoken ungültig.' : 'Failed to verify invitation token.') + throw new Error(t('invitation.error_invalid_token')) } const details = await res.json() @@ -130,7 +123,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio setDecryptedTitle(title) } catch (err: any) { console.error('Failed to load invitation details:', err) - setError(err.message || (isDe ? 'Einladungsdetails konnten nicht geladen werden.' : 'Invitation details could not be retrieved.')) + setError(err.message || t('invitation.error_load_failed')) } finally { setLoading(false) } @@ -141,9 +134,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio const activeUserId = localStorage.getItem('active_userid') if (!masterKey || !activeUserId) { autoAcceptStarted.current = false - setError(isDe - ? 'Sitzung unvollständig — bitte erneut anmelden (Benutzer-ID fehlt).' - : 'Incomplete session — please log in again (user ID missing).') + setError(t('invitation.error_incomplete_session')) setIsLoggedIn(false) return } @@ -194,12 +185,12 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio onAccepted(logbookId, decryptedTitle) } catch (err: any) { console.error('Accepting invitation failed:', err) - setError(err.message || (isDe ? 'Beitritt fehlgeschlagen.' : 'Acceptance failed.')) + setError(err.message || t('invitation.error_accept_failed')) autoAcceptStarted.current = false } finally { setAccepting(false) } - }, [logbookId, logbookKey, token, rawEncryptedTitle, decryptedTitle, onAccepted, isDe]) + }, [logbookId, logbookKey, token, rawEncryptedTitle, decryptedTitle, onAccepted, t]) useEffect(() => { if (loading || accepting || autoAcceptStarted.current) return @@ -235,7 +226,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio if (resolvedUser) setUsername(resolvedUser) setShowRecoveryFallback(true) } catch (err: any) { - setAuthError(err.message || (isDe ? 'Passkey-Anmeldung fehlgeschlagen.' : 'Passkey authentication failed.')) + setAuthError(err.message || t('invitation.error_login_failed')) } finally { setLoading(false) } @@ -247,9 +238,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio const resolvedUser = (username.trim() || encryptedPayloads.username || '').trim() if (!resolvedUser) { - setAuthError(isDe - ? 'Benutzername konnte nicht ermittelt werden — bitte erneut anmelden.' - : 'Could not determine username — please try logging in again.') + setAuthError(t('invitation.error_username_missing')) return } @@ -285,7 +274,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio setRecoveryPhrase(result.recoveryPhrase) } } catch (err: any) { - setAuthError(err.message || (isDe ? 'Registrierung fehlgeschlagen.' : 'Registration failed.')) + setAuthError(err.message || t('invitation.error_register_failed')) } finally { setLoading(false) } @@ -344,7 +333,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio />
@@ -393,18 +380,18 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio
-

{isDe ? 'Logbuch-Einladung' : 'Logbook Invitation'}

+

{t('invitation.title')}

- {isDe ? 'Einladung von' : 'INVITED BY'} + {t('invitation.invited_by')}

Skipper {ownerUsername}

- {isDe ? 'Schiff / Logbuch' : 'VESSEL / LOGBOOK'} + {t('invitation.vessel_logbook')}

{decryptedTitle} @@ -414,12 +401,10 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio {isLoggedIn ? (

- {isDe - ? `Angemeldet als ${username}. Beitritt wird vorbereitet...` - : `Signed in as ${username}. Preparing to join...`} + {t('invitation.signed_in_preparing', { username })}

@@ -428,27 +413,25 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio {loginMode === 'options' && (

- {isDe - ? 'Melden Sie sich an oder registrieren Sie ein Konto, um dem Logbuch beizutreten.' - : 'Sign in or register an account to join this logbook.'} + {t('invitation.login_or_register_hint')}

- {isDe ? 'ODER NEU REGISTRIEREN' : 'OR SIGN UP'} + {t('invitation.or_sign_up')}
)} @@ -457,7 +440,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio
@@ -485,7 +468,7 @@ export default function InvitationAcceptance({ onAccepted, onCancel }: Invitatio
diff --git a/client/src/i18n/locales/de.json b/client/src/i18n/locales/de.json index aeb8fad..c360709 100644 --- a/client/src/i18n/locales/de.json +++ b/client/src/i18n/locales/de.json @@ -22,43 +22,43 @@ "quick_login": "Schnell-Login", "forget_account": "Account auf diesem Gerät vergessen", "not_user": "Nicht {{name}}?", - "recovery_title": "Ihr Wiederherstellungsschlüssel", - "recovery_warning": "WICHTIG: Schreiben Sie diese 12 Wörter auf. Wenn Sie Ihren Passkey und diese Wörter verlieren, können Ihre Daten nicht wiederhergestellt werden.", + "recovery_title": "Dein Wiederherstellungsschlüssel", + "recovery_warning": "WICHTIG: Schreib diese 12 Wörter auf. Wenn du deinen Passkey und diese Wörter verlierst, können deine Daten nicht wiederhergestellt werden.", "confirm_recovery": "Ich habe die Wörter aufgeschrieben", "status_logged_in": "Angemeldet", "status_logged_out": "Abgemeldet", "copied": "Kopiert!", "copy_phrase": "Schlüssel kopieren", "enter_recovery": "Wiederherstellungsschlüssel eingeben", - "recovery_fallback_warning": "Ihr Passkey wurde erfolgreich authentifiziert, aber Ihr Gerät unterstützt keine hardwarebasierte Schlüsselableitung. Geben Sie Ihren 12-Wörter-Wiederherstellungsschlüssel ein, um Ihr Logbuch zu entschlüsseln.", - "recovery_placeholder": "Geben Sie Ihren aus 12 Wörtern bestehenden Wiederherstellungsschlüssel getrennt durch Leerzeichen ein...", + "recovery_fallback_warning": "Dein Passkey wurde erfolgreich authentifiziert, aber dein Gerät unterstützt keine hardwarebasierte Schlüsselableitung. Gib deinen 12-Wörter-Wiederherstellungsschlüssel ein, um dein Logbuch zu entschlüsseln.", + "recovery_placeholder": "Gib deinen aus 12 Wörtern bestehenden Wiederherstellungsschlüssel getrennt durch Leerzeichen ein...", "back": "Zurück", "decrypting": "Entschlüsselung...", "decrypt_logbook": "Logbuch entschlüsseln", "error_incorrect_recovery": "Falscher Wiederherstellungsschlüssel. Entschlüsselung fehlgeschlagen.", - "error_decryption_failed": "Entschlüsselung fehlgeschlagen. Bitte überprüfen Sie Ihren Wiederherstellungsschlüssel.", + "error_decryption_failed": "Entschlüsselung fehlgeschlagen. Bitte überprüfe deinen Wiederherstellungsschlüssel.", "or_register": "oder Registrieren", "explore_demo": "Demo ohne Account erkunden", "username_placeholder": "Benutzername / Skippername", "processing": "Verarbeitung...", "help": "Hilfe", "setup_pin_title": "Lokale PIN einrichten (Optional)", - "setup_pin_warning": "Da Ihr Gerät keine direkte Passkey-Schlüsselableitung unterstützt, müssten Sie andernfalls bei jedem Login auf diesem Gerät Ihren 12-Wörter-Schlüssel eingeben. Richten Sie eine lokale PIN ein, um das zu vermeiden.", + "setup_pin_warning": "Da dein Gerät keine direkte Passkey-Schlüsselableitung unterstützt, müsstest du andernfalls bei jedem Login auf diesem Gerät deinen 12-Wörter-Schlüssel eingeben. Richte eine lokale PIN ein, um das zu vermeiden.", "pin_placeholder": "Z.B. 123456", "pin_label": "Lokaler PIN-Code (4-8 Ziffern)", "save_pin": "PIN speichern & Fortfahren", "skip_pin": "Überspringen & recovery verwenden", "enter_pin_title": "Mit PIN entschlüsseln", - "enter_pin_warning": "Geben Sie Ihre lokale PIN ein, um den Entschlüsselungsschlüssel auf diesem Gerät freizuschalten.", - "enter_pin_placeholder": "Geben Sie Ihre PIN ein...", + "enter_pin_warning": "Gib deine lokale PIN ein, um den Entschlüsselungsschlüssel auf diesem Gerät freizuschalten.", + "enter_pin_placeholder": "Gib deine PIN ein...", "decrypt_with_pin": "Entschlüsseln", "use_recovery_instead": "Stattdessen Wiederherstellungsschlüssel verwenden", "error_incorrect_pin": "Falsche PIN. Entschlüsselung fehlgeschlagen." }, "pwa": { "title": "App installieren", - "generic_benefit": "Installieren Sie Kapteins Daagbok auf Ihrem Gerät für schnelleren Zugriff, Offline-Nutzung und dauerhafte Datenspeicherung.", - "ios_instructions": "Auf dem iPad/iPhone: Fügen Sie die App zum Home-Bildschirm hinzu, damit Ihre Logbuchdaten geschützt bleiben und die App wie eine native App startet.", + "generic_benefit": "Installiere Kapteins Daagbok auf deinem Gerät für schnelleren Zugriff, Offline-Nutzung und dauerhafte Datenspeicherung.", + "ios_instructions": "Auf dem iPad/iPhone: Füge die App zum Home-Bildschirm hinzu, damit deine Logbuchdaten geschützt bleiben und die App wie eine native App startet.", "ios_step_share": "Teilen-Symbol in der Safari-Leiste antippen", "ios_step_add": "„Zum Home-Bildschirm“ wählen", "install_now": "Jetzt installieren", @@ -102,7 +102,7 @@ "saved": "Schiffsdaten erfolgreich gespeichert!", "loading": "Schiffsdaten werden geladen...", "sails_list": "Besegelung (vorhandene Segel)", - "sails_help": "Tragen Sie hier die Segel ein, die an Eurem Schiff zur Verfügung stehen (z. B. Großsegel, Genua, Fock).", + "sails_help": "Trag hier die Segel ein, die an deinem Schiff zur Verfügung stehen (z. B. Großsegel, Genua, Fock).", "add_sail": "Segel hinzufügen", "sail_name_placeholder": "z. B. Großsegel", "no_sails": "Keine Segel hinterlegt.", @@ -159,19 +159,19 @@ "sign_lock_notice": "Nach der Unterschrift sind Änderungen am Logbucheintrag (außer Fotos) nicht möglich, ohne dass Skipper und Crew erneut unterschreiben müssen.", "sign_lock_active": "Dieser Eintrag ist unterschrieben. Änderungen am Logbuch (außer Fotos) entfernen Skipper- und Crew-Unterschrift automatisch.", "sign_lock_warning_title": "Unterschrift bestätigen", - "sign_lock_warning": "Nach dem Unterschreiben sind Änderungen am Logbucheintrag (außer Fotos) nicht mehr möglich, ohne dass Skipper und Crew erneut unterschreiben müssen.\n\nMöchten Sie fortfahren?", + "sign_lock_warning": "Nach dem Unterschreiben sind Änderungen am Logbucheintrag (außer Fotos) nicht mehr möglich, ohne dass Skipper und Crew erneut unterschreiben müssen.\n\nMöchtest du fortfahren?", "sign_proceed": "Unterschreiben", "sign_cancel": "Abbrechen", "sign_cleared_re_sign_title": "Unterschriften entfernt", "sign_cleared_re_sign": "Der Logbucheintrag wurde geändert. Skipper- und Crew-Unterschrift wurden entfernt. Bitte erneut unterschreiben.", - "no_entries": "Keine Logbucheinträge für diese Yacht gefunden. Erstellen Sie Ihren ersten Reisetag!", + "no_entries": "Keine Logbucheinträge für diese Yacht gefunden. Erstelle deinen ersten Reisetag!", "back_to_list": "Zurück zur Journal-Liste", "save": "Logbuchseite speichern", "saving": "Wird gespeichert...", "saved": "Logbuchseite erfolgreich gespeichert!", "loading": "Journal wird geladen...", "delete_entry": "Tag löschen", - "delete_confirm": "Sind Sie sicher, dass Sie diesen Reisetag unwiderruflich löschen möchten?", + "delete_confirm": "Bist du sicher, dass du diesen Reisetag unwiderruflich löschen möchtest?", "carry_over_tanks_title": "Daten vom Vortag übernehmen?", "carry_over_tanks_confirm": "Start-Hafen, Frischwasser- und Kraftstoff-Morgenstände vom letzten Reisetag übernehmen?\n\nStart-Hafen: {{departure}}\nFrischwasser: {{fw}} L\nKraftstoff: {{fuel}} L", "carry_over_tanks_yes": "Übernehmen", @@ -207,16 +207,16 @@ "photo_btn": "Foto aufnehmen / Hochladen", "photo_processing": "Wird verarbeitet...", "no_photos": "Noch keine Fotos an diesen Reisetag angehängt.", - "photo_delete_confirm": "Sind Sie sicher, dass Sie dieses Foto unwiderruflich löschen möchten?", + "photo_delete_confirm": "Bist du sicher, dass du dieses Foto unwiderruflich löschen möchtest?", "confirm_yes": "Ja", "confirm_no": "Nein", "track_upload_title": "GPS-Track (Datei)", "track_upload_points": "Punkte", "gps_tracking_btn_gpx": "Track-Datei herunterladen", - "gps_track_upload_help": "Ziehen Sie eine GPX-, KML- oder GeoJSON-Datei hierher oder klicken Sie zum Auswählen", + "gps_track_upload_help": "Zieh eine GPX-, KML- oder GeoJSON-Datei hierher oder klicke zum Auswählen", "gps_track_upload_btn": "GPS-Track hochladen", "gps_track_delete": "Track-Datei löschen", - "gps_track_delete_confirm": "Sind Sie sicher, dass Sie diese Track-Datei dauerhaft löschen möchten?", + "gps_track_delete_confirm": "Bist du sicher, dass du diese Track-Datei dauerhaft löschen möchtest?", "track_distance": "GPS-Strecke (sm)", "track_speed_max": "Max. Geschwindigkeit (kn)", "track_speed_avg": "Ø Geschwindigkeit (kn)", @@ -230,33 +230,33 @@ "share_unsupported": "Teilen wird auf diesem Gerät nicht unterstützt. Datei wurde stattdessen heruntergeladen.", "invite_crew": "Crew einladen", "invite_link_copied": "Einladungslink in die Zwischenablage kopiert!", - "invite_link_desc": "Teilen Sie diesen Link mit Crewmitgliedern, um ihnen Schreibrechte für dieses Logbuch zu gewähren.", + "invite_link_desc": "Teile diesen Link mit Crewmitgliedern, um ihnen Schreibrechte für dieses Logbuch zu gewähren.", "collaborators_list": "Mitglieder / Crew", "revoke": "Entfernen", - "revoke_confirm": "Sind Sie sicher, dass Sie diesem Crewmitglied den Zugriff entziehen möchten?", + "revoke_confirm": "Bist du sicher, dass du diesem Crewmitglied den Zugriff entziehen möchtest?", "invite_role": "Rolle", "invite_expires": "Link ist 48 Stunden lang gültig" }, "dashboard": { - "title": "Ihre Logbücher", - "subtitle": "Wählen Sie ein Logbuch aus oder erstellen Sie ein neues, um Ihre Reisen zu verwalten.", + "title": "Deine Logbücher", + "subtitle": "Wähle ein Logbuch aus oder erstelle ein neues, um deine Reisen zu verwalten.", "create_btn": "Logbuch erstellen", "new_logbook_placeholder": "Name des Logbuchs oder der Yacht", "logout": "Abmelden", "logged_in_as": "Angemeldet als {{name}}", - "delete_confirm": "Sind Sie sicher, dass Sie dieses Logbuch unwiderruflich löschen möchten? Alle lokalen Daten und Server-Kopien werden vernichtet.\n\nTipp: Erstellen Sie vorher unter Einstellungen → Backup & Wiederherstellung eine Sicherungskopie (.daagbok.json), falls Sie die Daten später behalten möchten.", - "no_logbooks": "Keine Logbücher gefunden. Erstellen Sie Ihr erstes Logbuch, um zu beginnen!", + "delete_confirm": "Bist du sicher, dass du dieses Logbuch unwiderruflich löschen möchtest? Alle lokalen Daten und Server-Kopien werden vernichtet.\n\nTipp: Erstelle vorher unter Einstellungen → Backup & Wiederherstellung eine Sicherungskopie (.daagbok.json), falls du die Daten später behalten möchtest.", + "no_logbooks": "Keine Logbücher gefunden. Erstelle dein erstes Logbuch, um zu beginnen!", "loading": "Logbücher werden geladen...", "status_synced": "Synchronisiert", "status_local": "Nur lokaler Cache", "delete_btn": "Logbuch löschen", "section_owned": "Meine Logbücher", "section_shared": "Geteilte Logbücher", - "section_shared_hint": "Sie wurden als Crew-Mitglied eingeladen. Skipper-Profil und Einstellungen gehören dem Eigner.", + "section_shared_hint": "Du wurdest als Crew-Mitglied eingeladen. Skipper-Profil und Einstellungen gehören dem Eigner.", "role_owner": "Eigenes Logbuch", - "role_owner_hint": "Sie sind Eigner und Skipper dieses Logbuchs", + "role_owner_hint": "Du bist Eigner und Skipper dieses Logbuchs", "role_crew": "Crew-Zugang", - "role_crew_hint": "Eingeladenes Logbuch — Sie können als Crew mitarbeiten und signieren", + "role_crew_hint": "Eingeladenes Logbuch — du kannst als Crew mitarbeiten und signieren", "role_read": "Nur Lesen", "role_read_hint": "Geteiltes Logbuch — nur Ansicht, keine Bearbeitung" }, @@ -281,11 +281,11 @@ "save_member": "Mitglied speichern", "saved": "Skipper-Profil erfolgreich gespeichert!", "loading": "Crew-Dateien werden geladen...", - "delete_confirm": "Sind Sie sicher, dass Sie dieses Crew-Mitglied entfernen möchten?" + "delete_confirm": "Bist du sicher, dass du dieses Crew-Mitglied entfernen möchtest?" }, "deviation": { "title": "Ablenkungstabelle (Compass Deviation)", - "subtitle": "Tragen Sie die Magnetkompass-Ablenkung (Abl.) für Kurse (MgK) von 000° bis 360° in 10°-Schritten ein.", + "subtitle": "Trag die Magnetkompass-Ablenkung (Abl.) für Kurse (MgK) von 000° bis 360° in 10°-Schritten ein.", "heading": "MgK", "deviation": "Ablenkung", "save": "Kalibrierungsgitter speichern", @@ -295,18 +295,18 @@ }, "settings": { "title": "Systemeinstellungen", - "subtitle": "Konfigurieren Sie externe Integrationen und Anmeldedaten.", + "subtitle": "Konfiguriere externe Integrationen und Anmeldedaten.", "owm_title": "Wetter-Integration", "owm_key": "OpenWeatherMap API-Schlüssel", "save": "Konfiguration speichern", "saving": "Wird gespeichert...", "saved": "Einstellungen erfolgreich gespeichert!", "key_help": "Optional: eigener OpenWeatherMap-API-Schlüssel. Ohne Eintrag wird der serverseitige Schlüssel aus der Betreiber-Konfiguration verwendet.", - "no_key": "Kein OpenWeatherMap-API-Schlüssel verfügbar. Hinterlegen Sie einen eigenen Schlüssel in den Einstellungen oder kontaktieren Sie den Betreiber.", + "no_key": "Kein OpenWeatherMap-API-Schlüssel verfügbar. Hinterlege einen eigenen Schlüssel in den Einstellungen oder kontaktiere den Betreiber.", "weather_success": "Wetterdaten erfolgreich abgerufen!", - "weather_error": "Wetterdatenabruf fehlgeschlagen. Überprüfen Sie den API-Schlüssel und die Verbindung.", + "weather_error": "Wetterdatenabruf fehlgeschlagen. Überprüfe den API-Schlüssel und die Verbindung.", "weather_date_mismatch": "Wetterdaten können nur für den heutigen Tag ({{today}}) abgerufen werden. Dieser Logbucheintrag ist auf den {{date}} datiert.", - "gps_error": "Bitte geben Sie einen Ort an oder ermitteln Sie die GPS-Koordinaten.", + "gps_error": "Bitte gib einen Ort an oder ermittle die GPS-Koordinaten.", "theme_title": "Design-Anpassung", "theme_label": "Design-Stil der App", "theme_auto": "Automatisch (OS-Erkennung)", @@ -319,36 +319,36 @@ "color_scheme_light": "Hell", "color_scheme_dark": "Dunkel", "share_title": "Logbuch teilen (Schreibgeschützt)", - "share_desc": "Aktivieren Sie diese Option, um einen öffentlichen, schreibgeschützten Link zu erstellen. Jeder mit dem Link kann Ihre Reisen, Yacht-Profile und Besatzung ansehen. Die Verschlüsselungsschlüssel werden niemals an den Server übertragen (sie bleiben im Hash-Teil der URL).", + "share_desc": "Aktiviere diese Option, um einen öffentlichen, schreibgeschützten Link zu erstellen. Jeder mit dem Link kann deine Reisen, Yacht-Profile und Besatzung ansehen. Die Verschlüsselungsschlüssel werden niemals an den Server übertragen (sie bleiben im Hash-Teil der URL).", "share_enable": "Öffentlichen Link aktivieren", "share_copied": "Link kopiert!", "share_copy_btn": "Link kopieren", "danger_zone_title": "Gefahrenzone", - "danger_zone_desc": "Durch das Löschen Ihres Kontos werden alle Ihre Passkeys, Logbücher, Schiffsdaten, Crew-Profile, Reiseeinträge und E2E-Schlüssel unwiderruflich gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.", + "danger_zone_desc": "Durch das Löschen deines Kontos werden alle deine Passkeys, Logbücher, Schiffsdaten, Crew-Profile, Reiseeinträge und E2E-Schlüssel unwiderruflich gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.", "delete_account_btn": "Konto unwiderruflich löschen", "delete_account_confirm_title": "Konto löschen?", - "delete_account_confirm_desc": "Sind Sie absolut sicher, dass Sie Ihr Konto und alle zugehörigen Logbücher und E2E-verschlüsselten Daten unwiderruflich löschen möchten?", + "delete_account_confirm_desc": "Bist du absolut sicher, dass du dein Konto und alle zugehörigen Logbücher und E2E-verschlüsselten Daten unwiderruflich löschen möchtest?", "delete_account_confirm_yes": "Ja, Konto und alle Daten löschen", "delete_account_confirm_no": "Abbrechen", - "delete_account_failed": "Konto konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.", + "delete_account_failed": "Konto konnte nicht gelöscht werden. Bitte versuche es erneut.", "deleting_account": "Konto wird gelöscht…", "tour_title": "App-Tour", - "tour_desc": "Lassen Sie sich erneut durch die wichtigsten Bereiche der App führen.", + "tour_desc": "Lass dich erneut durch die wichtigsten Bereiche der App führen.", "tour_restart": "Tour erneut starten", "push_title": "Push-Benachrichtigungen", - "push_desc": "Als Logbuch-Eigner werden Sie benachrichtigt, wenn eingeladene Crewmitglieder Änderungen synchronisieren. Es werden keine Inhalte im Klartext übermittelt.", + "push_desc": "Als Logbuch-Eigner wirst du benachrichtigt, wenn eingeladene Crewmitglieder Änderungen synchronisieren. Es werden keine Inhalte im Klartext übermittelt.", "push_enable": "Bei Crew-Änderungen benachrichtigen", "push_active": "Push-Benachrichtigungen sind auf diesem Gerät aktiv.", "push_unsupported": "Push-Benachrichtigungen werden in diesem Browser nicht unterstützt.", - "push_denied_hint": "Benachrichtigungen sind blockiert. Erlauben Sie sie in den Browser- oder Geräteeinstellungen.", + "push_denied_hint": "Benachrichtigungen sind blockiert. Erlaube sie in den Browser- oder Geräteeinstellungen.", "push_ios_install_hint": "Auf dem iPhone/iPad: App zum Home-Bildschirm hinzufügen (iOS 16.4+), um Push zu nutzen.", "push_error": "Push-Benachrichtigungen konnten nicht aktiviert werden.", "backup_title": "Backup & Wiederherstellung", "backup_desc": "Vollständiges verschlüsseltes Backup dieses Logbuchs (Einträge, Fotos, GPS-Tracks, Crew, Schiff). Mit Backup-Passphrase geschützt — für Restore auf diesem oder einem neuen Account.", "backup_export_title": "Backup erstellen", - "backup_export_desc": "Lädt alle lokalen Daten als .daagbok.json herunter. Bewahren Sie Datei und Passphrase getrennt und sicher auf.", + "backup_export_desc": "Lädt alle lokalen Daten als .daagbok.json herunter. Bewahre Datei und Passphrase getrennt und sicher auf.", "backup_restore_title": "Backup wiederherstellen", - "backup_restore_desc": "Stellt ein Backup in Ihrem aktuellen Account wieder her — auch nach Registrierung eines neuen Accounts.", + "backup_restore_desc": "Stellt ein Backup in deinem aktuellen Account wieder her — auch nach Registrierung eines neuen Accounts.", "backup_passphrase": "Backup-Passphrase", "backup_passphrase_placeholder": "Mindestens 8 Zeichen", "backup_passphrase_confirm": "Passphrase bestätigen", @@ -368,7 +368,7 @@ "backup_invalid_json": "Die Datei ist keine gültige JSON-Datei.", "backup_invalid_format": "Unbekanntes oder veraltetes Backup-Format.", "backup_not_owner": "Nur der Logbuch-Eigner kann Backups erstellen.", - "backup_not_authenticated": "Bitte melden Sie sich an, um ein Backup wiederherzustellen.", + "backup_not_authenticated": "Bitte melde dich an, um ein Backup wiederherzustellen.", "backup_id_conflict": "Ein Logbuch mit dieser ID existiert bereits.", "backup_overwrite_confirm": "Das vorhandene Logbuch mit gleicher ID wird ersetzt. Fortfahren?", "backup_new_id_confirm": "Das Backup als neues Logbuch mit neuer ID importieren?", @@ -380,13 +380,13 @@ }, "disclaimer": { "title": "Wichtige Hinweise", - "intro": "Bitte lesen Sie die folgenden Hinweise, bevor Sie Kapteins Daagbok nutzen.", + "intro": "Bitte lies die folgenden Hinweise, bevor du Kapteins Daagbok nutzt.", "e2e_title": "Ende-zu-Ende-Verschlüsselung", - "e2e_body": "Ihre Logbuchdaten werden Ende-zu-Ende verschlüsselt. Nur Sie – bzw. Personen mit Ihrem Schlüssel – können die Inhalte lesen. Auf dem Server werden ausschließlich verschlüsselte Daten gespeichert.", + "e2e_body": "Deine Logbuchdaten werden Ende-zu-Ende verschlüsselt. Nur du – bzw. Personen mit deinem Schlüssel – können die Inhalte lesen. Auf dem Server werden ausschließlich verschlüsselte Daten gespeichert.", "pwa_title": "Progressive Web App (PWA)", - "pwa_body": "Kapteins Daagbok läuft als Progressive Web App in Ihrem Browser und kann auf Ihrem Gerät installiert werden – ähnlich wie eine native App, ohne App-Store.", + "pwa_body": "Kapteins Daagbok läuft als Progressive Web App in deinem Browser und kann auf deinem Gerät installiert werden – ähnlich wie eine native App, ohne App-Store.", "storage_title": "Lokale Speicherung & Synchronisation", - "storage_body": "Ihre Daten werden lokal auf Ihrem Gerät zwischengespeichert (IndexedDB). Bei aktiver Internetverbindung werden Änderungen mit dem Server synchronisiert. Ohne Verbindung können Sie weiterarbeiten; die Synchronisation erfolgt später.", + "storage_body": "Deine Daten werden lokal auf deinem Gerät zwischengespeichert (IndexedDB). Bei aktiver Internetverbindung werden Änderungen mit dem Server synchronisiert. Ohne Verbindung kannst du weiterarbeiten; die Synchronisation erfolgt später.", "free_title": "Kostenlos & werbefrei", "free_body": "Kapteins Daagbok ist kostenlos und enthält keine Werbung.", "liability_title": "Haftungsausschluss", @@ -401,24 +401,24 @@ "feedback": { "button_title": "Feedback senden", "title": "Feedback", - "intro": "Teilen Sie Fehler, Ideen oder allgemeines Feedback. Ihre Nachricht wird über einen sicheren Benachrichtigungskanal an das Projektteam gesendet.", + "intro": "Teile Fehler, Ideen oder allgemeines Feedback. Deine Nachricht wird über einen sicheren Benachrichtigungskanal an das Projektteam gesendet.", "category_label": "Kategorie", "category_general": "Allgemein", "category_bug": "Fehler melden", "category_feature": "Feature-Wunsch", "contact_label": "E-Mail (optional)", - "contact_placeholder": "ihre@email.beispiel", + "contact_placeholder": "deine@email.beispiel", "message_label": "Nachricht", - "message_placeholder": "Beschreiben Sie Ihr Feedback…", + "message_placeholder": "Beschreib dein Feedback…", "send": "Senden", "sending": "Wird gesendet…", "cancel": "Abbrechen", - "success": "Vielen Dank! Ihr Feedback wurde gesendet.", - "error_send": "Feedback konnte nicht gesendet werden. Bitte versuchen Sie es später erneut.", - "error_invalid_email": "Bitte geben Sie eine gültige E-Mail-Adresse ein.", + "success": "Vielen Dank! Dein Feedback wurde gesendet.", + "error_send": "Feedback konnte nicht gesendet werden. Bitte versuche es später erneut.", + "error_invalid_email": "Bitte gib eine gültige E-Mail-Adresse ein.", "error_not_configured": "Feedback ist auf diesem Server nicht verfügbar.", - "error_rate_limited": "Zu viele Feedback-Nachrichten in kurzer Zeit. Bitte warten Sie einige Minuten.", - "error_spam": "Diese Nachricht konnte nicht gesendet werden. Bitte formulieren Sie sie anders." + "error_rate_limited": "Zu viele Feedback-Nachrichten in kurzer Zeit. Bitte warte einige Minuten.", + "error_spam": "Diese Nachricht konnte nicht gesendet werden. Bitte formuliere sie anders." }, "demo": { "logbook_title": "Demo-Logbuch Ostsee", @@ -427,6 +427,36 @@ "cta_register": "Account erstellen", "back_to_login": "Zur Anmeldung" }, + "invitation": { + "error_invalid_key": "Der Einladungslink ist kryptografisch ungültig (Schlüssel fehlerhaft).", + "error_missing_key": "Der Einladungslink enthält keinen Entschlüsselungsschlüssel (#key=...). Bitte den vollständigen Link vom Eigner verwenden.", + "error_expired": "Diese Einladung ist abgelaufen (48 Stunden gültig).", + "error_invalid_token": "Einladungstoken ungültig.", + "error_load_failed": "Einladungsdetails konnten nicht geladen werden.", + "error_incomplete_session": "Sitzung unvollständig — bitte erneut anmelden (Benutzer-ID fehlt).", + "error_accept_failed": "Beitritt fehlgeschlagen.", + "error_login_failed": "Passkey-Anmeldung fehlgeschlagen.", + "error_username_missing": "Benutzername konnte nicht ermittelt werden — bitte erneut anmelden.", + "error_register_failed": "Registrierung fehlgeschlagen.", + "loading_joining": "Beitritt...", + "loading_checking": "Einladung wird geprüft...", + "loading_unlocking": "Logbuch wird freigeschaltet und synchronisiert...", + "loading_retrieving_key": "Lade Verschlüsselungsschlüssel...", + "error_title": "Einladungsfehler", + "back_to_start": "Zurück zum Start", + "title": "Logbuch-Einladung", + "invited_by": "Einladung von", + "vessel_logbook": "Schiff / Logbuch", + "signed_in_preparing": "Angemeldet als {{username}}. Beitritt wird vorbereitet...", + "join_again": "Erneut beitreten", + "login_or_register_hint": "Melde dich an oder registriere ein Konto, um dem Logbuch beizutreten.", + "or_sign_up": "ODER NEU REGISTRIEREN", + "register_crew_account": "Neues Crew-Konto erstellen", + "username_label": "Benutzername", + "create_passkey": "Passkey erstellen", + "switch_language_en": "English", + "switch_language_de": "Deutsch" + }, "stats": { "title": "Statistik", "subtitle": "Strecken, Verbrauch und Antriebsart auf einen Blick", @@ -469,19 +499,19 @@ "steps": { "welcome": { "title": "Willkommen an Bord!", - "body": "Wir haben ein Demo-Logbuch mit drei Reisetagen in der Kieler Förde für Sie angelegt. Die Beispieleinträge können Sie jederzeit löschen, wenn Sie mit dem eigenen Logbuch starten möchten. Diese kurze Tour zeigt Ihnen die wichtigsten Funktionen." + "body": "Wir haben ein Demo-Logbuch mit drei Reisetagen in der Kieler Förde für dich angelegt. Die Beispieleinträge kannst du jederzeit löschen, wenn du mit dem eigenen Logbuch starten möchtest. Diese kurze Tour zeigt dir die wichtigsten Funktionen." }, "welcome_public": { "title": "Willkommen an Bord!", - "body": "Erkunden Sie unser Demo-Logbuch mit drei Reisetagen in der Kieler Förde – ganz ohne Account. Diese kurze Tour zeigt Ihnen Schiffsdaten, Crew und Logbucheinträge." + "body": "Erkunde unser Demo-Logbuch mit drei Reisetagen in der Kieler Förde – ganz ohne Account. Diese kurze Tour zeigt dir Schiffsdaten, Crew und Logbucheinträge." }, "nav_logs": { "title": "Logbucheinträge", - "body": "Hier verwalten Sie Ihre Reisetage – Abfahrt, Ziel, Wetter, Tankstände und GPS-Tracks." + "body": "Hier verwaltest du deine Reisetage – Abfahrt, Ziel, Wetter, Tankstände und GPS-Tracks." }, "entry_list": { - "title": "Ihre Reisetage", - "body": "Jede Karte steht für einen Reisetag. Tippen Sie auf einen Eintrag, um Details zu sehen oder zu bearbeiten." + "title": "Deine Reisetage", + "body": "Jede Karte steht für einen Reisetag. Tippe auf einen Eintrag, um Details zu sehen oder zu bearbeiten." }, "entry_open": { "title": "Reisetag öffnen", @@ -489,27 +519,27 @@ }, "entry_track": { "title": "GPS-Track", - "body": "Laden Sie GPX-Dateien hoch oder sehen Sie bereits gespeicherte Routen auf der Karte – inklusive Distanz und Geschwindigkeit." + "body": "Lade GPX-Dateien hoch oder sieh bereits gespeicherte Routen auf der Karte – inklusive Distanz und Geschwindigkeit." }, "nav_vessel": { "title": "Schiffsdaten", - "body": "Hinterlegen Sie Name, Maße und technische Daten Ihrer Yacht – einmal ausfüllen, für alle Reisetage verfügbar." + "body": "Hinterlege Name, Maße und technische Daten deiner Yacht – einmal ausfüllen, für alle Reisetage verfügbar." }, "nav_crew": { "title": "Crew-Liste", - "body": "Verwalten Sie Besatzungsmitglieder und weisen Sie sie später Reisetagen zu." + "body": "Verwalte Besatzungsmitglieder und weise sie später Reisetagen zu." }, "nav_stats": { "title": "Statistik-Dashboard", - "body": "Hier sehen Sie Reisedistanzen, Verbrauch, Routenkarten und Antriebsanteile – automatisch aus Ihren Logbucheinträgen berechnet." + "body": "Hier siehst du Reisedistanzen, Verbrauch, Routenkarten und Antriebsanteile – automatisch aus deinen Logbucheinträgen berechnet." }, "nav_feedback": { "title": "Feedback senden", - "body": "Über dieses Formular können Sie Fehler, Ideen oder allgemeines Feedback direkt an das Projektteam schicken – auch nach der Tour jederzeit über das Symbol oben rechts." + "body": "Über dieses Formular kannst du Fehler, Ideen oder allgemeines Feedback direkt an das Projektteam schicken – auch nach der Tour jederzeit über das Symbol oben rechts." }, "finish": { "title": "Alles klar!", - "body": "Sie landen gleich im Statistik-Dashboard. Die Tour können Sie jederzeit unter Einstellungen erneut starten. Gute Fahrt!" + "body": "Du landest gleich im Statistik-Dashboard. Die Tour kannst du jederzeit unter Einstellungen erneut starten. Gute Fahrt!" } } } diff --git a/client/src/i18n/locales/en.json b/client/src/i18n/locales/en.json index 6e0d89d..a813db7 100644 --- a/client/src/i18n/locales/en.json +++ b/client/src/i18n/locales/en.json @@ -427,6 +427,36 @@ "cta_register": "Create account", "back_to_login": "Back to login" }, + "invitation": { + "error_invalid_key": "The invitation link is cryptographically invalid (corrupted key).", + "error_missing_key": "The invitation link is missing the decryption key (#key=...). Please use the complete link from the owner.", + "error_expired": "This invitation link has expired (valid for 48 hours only).", + "error_invalid_token": "Failed to verify invitation token.", + "error_load_failed": "Invitation details could not be retrieved.", + "error_incomplete_session": "Incomplete session — please log in again (user ID missing).", + "error_accept_failed": "Acceptance failed.", + "error_login_failed": "Passkey authentication failed.", + "error_username_missing": "Could not determine username — please try logging in again.", + "error_register_failed": "Registration failed.", + "loading_joining": "Joining...", + "loading_checking": "Checking Invitation...", + "loading_unlocking": "Unlocking logbook and syncing data...", + "loading_retrieving_key": "Retrieving encryption key...", + "error_title": "Invitation Error", + "back_to_start": "Back to Dashboard", + "title": "Logbook Invitation", + "invited_by": "INVITED BY", + "vessel_logbook": "VESSEL / LOGBOOK", + "signed_in_preparing": "Signed in as {{username}}. Preparing to join...", + "join_again": "Join again", + "login_or_register_hint": "Sign in or register an account to join this logbook.", + "or_sign_up": "OR SIGN UP", + "register_crew_account": "Register New Crew Account", + "username_label": "Username", + "create_passkey": "Create Passkey", + "switch_language_en": "English", + "switch_language_de": "Deutsch" + }, "stats": { "title": "Statistics", "subtitle": "Routes, consumption and propulsion at a glance", diff --git a/docs/marketing/beta-flyer.html b/docs/marketing/beta-flyer.html index 0aa2024..dae5c85 100644 --- a/docs/marketing/beta-flyer.html +++ b/docs/marketing/beta-flyer.html @@ -241,7 +241,7 @@

- Führen Sie Ihr Bordlogbuch digital: Reisetage, GPS-Tracks, Crew und Schiffsdaten — + Führe dein Bordlogbuch digital: Reisetage, GPS-Tracks, Crew und Schiffsdaten — End-to-End-verschlüsselt, als App installierbar und auch offline auf See nutzbar.

@@ -258,10 +258,10 @@
-

Beta-Phase — Ihr Feedback zählt

+

Beta-Phase — Dein Feedback zählt

Kapteins Daagbok ist ein privates Hobbyprojekt ohne Gewinnabsicht. - Als Beta-Tester helfen Sie, die App für Skipper und Crew im Alltag zu verbessern — + Als Beta-Tester hilfst du, die App für Skipper und Crew im Alltag zu verbessern — Rückmeldungen sind ausdrücklich willkommen.

diff --git a/docs/marketing/kapteins-daagbok-beta-flyer.pdf b/docs/marketing/kapteins-daagbok-beta-flyer.pdf index 5443d72c2c111d3a70daad6a95fa56aefc285d42..82b61bf1d4ba0e54f0a707e352cc7da22b7f4828 100644 GIT binary patch delta 22628 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 LF0Q9aQe^)HDR6?7 delta 22682 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 q6b$kwU8Fx0M!;a?EWi