3749f87c1d
Integrate new locale bundles, language cycling in the UI, SEO hreflang tags, and localized beta flyer HTML variants with scripts for batch translation and key validation. Co-authored-by: Cursor <cursoragent@cursor.com>
736 lines
38 KiB
JSON
736 lines
38 KiB
JSON
{
|
||
"translation": {
|
||
"app": {
|
||
"name": "Kapteins Daagbok",
|
||
"tagline": "Private Yacht Logbook",
|
||
"beta": "Beta",
|
||
"beta_hint": "Beta release — features may still change"
|
||
},
|
||
"languages": {
|
||
"de": "Deutsch",
|
||
"en": "English",
|
||
"da": "Dansk",
|
||
"sv": "Svenska",
|
||
"nb": "Norsk"
|
||
},
|
||
"common": {
|
||
"unsaved_changes_title": "Unsaved changes",
|
||
"unsaved_changes_message": "You have unsaved changes. Leave this page anyway? Your changes will be lost.",
|
||
"unsaved_changes_leave": "Leave",
|
||
"unsaved_changes_stay": "Stay"
|
||
},
|
||
"nav": {
|
||
"dashboard": "Dashboard",
|
||
"vessel": "Vessel Profile",
|
||
"crew": "Crew List",
|
||
"deviation": "Deviation Table",
|
||
"logs": "Logbook Entries",
|
||
"stats": "Statistics",
|
||
"settings": "Settings"
|
||
},
|
||
"auth": {
|
||
"welcome": "Welcome to Kapteins Daagbok",
|
||
"tagline": "Secure, E2E encrypted maritime logbook.",
|
||
"register": "Register with Passkey",
|
||
"login": "Login with Passkey",
|
||
"login_as": "Login as {{name}}",
|
||
"quick_login": "Quick login",
|
||
"forget_account": "Forget account on this device",
|
||
"not_user": "Not {{name}}?",
|
||
"recovery_title": "Your Recovery Phrase",
|
||
"recovery_warning": "IMPORTANT: Write down these 12 words. If you lose your Passkey and these words, your data cannot be recovered.",
|
||
"confirm_recovery": "I have written down the recovery phrase",
|
||
"status_logged_in": "Logged in",
|
||
"status_logged_out": "Logged out",
|
||
"copied": "Copied!",
|
||
"copy_phrase": "Copy Phrase",
|
||
"enter_recovery": "Enter Recovery Phrase",
|
||
"recovery_fallback_warning": "Your Passkey authenticated successfully, but your device does not support hardware key derivation. Enter your 12-word recovery phrase to decrypt your logbook.",
|
||
"recovery_placeholder": "Enter your 12-word recovery phrase separated by spaces...",
|
||
"back": "Back",
|
||
"decrypting": "Decrypting...",
|
||
"decrypt_logbook": "Decrypt Logbook",
|
||
"error_incorrect_recovery": "Incorrect recovery phrase. Decryption failed.",
|
||
"error_decryption_failed": "Decryption failed. Please check your recovery phrase.",
|
||
"or_register": "or register",
|
||
"explore_demo": "Explore demo without account",
|
||
"username_placeholder": "Username / Skipper Name",
|
||
"processing": "Processing...",
|
||
"help": "Help",
|
||
"setup_pin_title": "Setup Local PIN (Optional)",
|
||
"setup_pin_warning": "Since your device does not support hardware passkey key derivation, you would otherwise need to enter your 12-word recovery phrase on every login on this device. Setup a local PIN to avoid this.",
|
||
"pin_placeholder": "E.g. 123456",
|
||
"pin_label": "Local PIN Code (4-8 digits)",
|
||
"save_pin": "Save PIN & Continue",
|
||
"skip_pin": "Skip & use recovery phrase",
|
||
"enter_pin_title": "Decrypt with PIN",
|
||
"enter_pin_warning": "Enter your local PIN to unlock the decryption key on this device.",
|
||
"enter_pin_placeholder": "Enter your PIN...",
|
||
"decrypt_with_pin": "Decrypt",
|
||
"use_recovery_instead": "Use recovery phrase instead",
|
||
"error_incorrect_pin": "Incorrect PIN. Decryption failed."
|
||
},
|
||
"pwa": {
|
||
"title": "Install app",
|
||
"generic_benefit": "Install Kapteins Daagbok on your device for faster access, offline use, and persistent data storage.",
|
||
"ios_instructions": "On iPad/iPhone: Add the app to your Home Screen so your logbook data stays protected and the app launches like a native app.",
|
||
"ios_step_share": "Tap the Share button in the Safari toolbar",
|
||
"ios_step_add": "Choose “Add to Home Screen”",
|
||
"install_now": "Install now",
|
||
"installing": "Installing…",
|
||
"later": "Later",
|
||
"never": "Don't show again",
|
||
"platform_ios": "Install via Safari",
|
||
"platform_android": "Install via browser",
|
||
"platform_desktop": "Install as desktop app",
|
||
"settings_section": "App installation",
|
||
"update_title": "Update available",
|
||
"update_desc": "A new version of Kapteins Daagbok is ready. Reload to get the latest changes.",
|
||
"update_now": "Reload now",
|
||
"update_reloading": "Reloading…"
|
||
},
|
||
"sync": {
|
||
"status_synced": "Synced",
|
||
"status_syncing": "Syncing…",
|
||
"status_offline": "Offline Cache",
|
||
"status_unsynced": "Unsynced changes"
|
||
},
|
||
"vessel": {
|
||
"title": "Vessel Master Data",
|
||
"name": "Yacht Name",
|
||
"type": "Vessel Type",
|
||
"type_unset": "— not specified —",
|
||
"type_sailing": "Sailing yacht",
|
||
"type_motor": "Motor yacht",
|
||
"length_m": "Length (m)",
|
||
"draft_m": "Draft (m)",
|
||
"air_draft_m": "Air draft (m)",
|
||
"invalid_metric": "Invalid number — please enter meters as a decimal (e.g. 12.5).",
|
||
"port": "Home Port",
|
||
"owner": "Owner",
|
||
"charter": "Charter Company",
|
||
"registration": "Registration Number",
|
||
"callsign": "Call Sign",
|
||
"atis": "ATIS Number",
|
||
"mmsi": "MMSI Number",
|
||
"save": "Save Vessel Data",
|
||
"saving": "Saving...",
|
||
"saved": "Vessel details saved successfully!",
|
||
"loading": "Loading vessel details...",
|
||
"sails_list": "Sails (Available Sails)",
|
||
"sails_help": "List the sails available on your vessel (e.g. Mainsail, Genoa, Jib).",
|
||
"add_sail": "Add Sail",
|
||
"sail_name_placeholder": "e.g. Mainsail",
|
||
"no_sails": "No sails defined.",
|
||
"photo_add": "Add Photo",
|
||
"photo_change": "Change Photo",
|
||
"photo_delete": "Delete Photo",
|
||
"tanks_section": "Tanks (capacity)",
|
||
"tanks_help": "Optional, in liters — enables sliders in the journal when tank sizes are known.",
|
||
"freshwater_capacity_l": "Freshwater (liters)",
|
||
"fuel_capacity_l": "Fuel (liters)",
|
||
"greywater_capacity_l": "Greywater (liters)",
|
||
"invalid_tank_liters": "Invalid number — please enter capacity in liters (e.g. 200)."
|
||
},
|
||
"logs": {
|
||
"title": "Logbook Journal",
|
||
"new_entry": "New Travel Day",
|
||
"travel_details": "Travel Details",
|
||
"add_event": "Add Event Log Record",
|
||
"add_event_btn": "Add Event Entry",
|
||
"edit_event": "Edit event",
|
||
"save_event_btn": "Save changes",
|
||
"cancel_event_edit": "Cancel",
|
||
"delete_event": "Delete event",
|
||
"sign_cleared_skipper_re_sign_title": "Skipper signature removed",
|
||
"sign_cleared_skipper_re_sign": "The event log was changed. The skipper signature was removed. Please sign again.",
|
||
"date": "Date",
|
||
"day_of_travel": "Day of Travel",
|
||
"departure": "Departure Port (von)",
|
||
"destination": "Destination Port (nach)",
|
||
"route": "Route / Journey",
|
||
"freshwater": "Freshwater (Liters)",
|
||
"fuel": "Fuel (Liters)",
|
||
"greywater": "Greywater (Liters)",
|
||
"greywater_level": "Fill level",
|
||
"tank_slider_of_max": "{{current}} / {{max}} L",
|
||
"tank_capacity_tooltip": "If tank capacities (liters) are set in vessel master data, you can enter fill levels here using sliders.",
|
||
"morning": "Morning Level",
|
||
"refilled": "Refilled",
|
||
"evening": "Evening Level",
|
||
"consumption": "Consumption",
|
||
"signatures": "Signatures / Sign-Off",
|
||
"sign_skipper": "Skipper signature",
|
||
"sign_crew": "Crew signature",
|
||
"sign_hint": "Sign with finger, stylus, or mouse",
|
||
"sign_clear": "Clear",
|
||
"sign_export_image": "[Signature]",
|
||
"sign_with_passkey": "Sign with Passkey",
|
||
"sign_passkey_signing": "Requesting Passkey…",
|
||
"sign_passkey_signed": "Signed by {{username}}",
|
||
"sign_passkey_export": "Passkey: {{username}} ({{date}})",
|
||
"sign_attribution_export": "{{username}} ({{date}})",
|
||
"sign_passkey_clear": "Remove Passkey signature",
|
||
"sign_mode_passkey": "Passkey",
|
||
"sign_mode_classic": "Classic",
|
||
"sign_passkey_failed": "Passkey signing failed",
|
||
"sign_passkey_cancelled": "Passkey signing cancelled",
|
||
"sign_invalid": "Signature invalid — entry content changed",
|
||
"sign_badge_skipper": "Skipper",
|
||
"sign_badge_skipper_invalid": "Invalid",
|
||
"sign_badge_skipper_title_valid": "Signed by skipper",
|
||
"sign_badge_skipper_title_invalid": "Skipper signature invalid — entry content changed",
|
||
"sign_classic_or_passkey": "Optional: sign classically below or use Passkey above",
|
||
"sign_crew_passkey_hint": "Write collaborators can sign with their Passkey",
|
||
"sign_offline_hint": "Passkey signing requires internet — classic signature works offline",
|
||
"sign_lock_notice": "After signing, log entry changes (except photos) require Skipper and Crew to sign again.",
|
||
"sign_lock_active": "This entry is signed. Changes to the log (except photos) will automatically remove Skipper and Crew signatures.",
|
||
"sign_lock_warning_title": "Confirm signature",
|
||
"sign_lock_warning": "After signing, changes to the log entry (except photos) are not possible without Skipper and Crew signing again.\n\nDo you want to proceed?",
|
||
"sign_proceed": "Sign",
|
||
"sign_cancel": "Cancel",
|
||
"sign_cleared_re_sign_title": "Signatures removed",
|
||
"sign_cleared_re_sign": "The log entry was changed. Skipper and Crew signatures were removed. Please sign again.",
|
||
"no_entries": "No logbook entries found for this yacht. Create your first travel day to begin!",
|
||
"back_to_list": "Back to Journal List",
|
||
"save": "Save Logbook Page",
|
||
"saving": "Saving...",
|
||
"saved": "Logbook page saved successfully!",
|
||
"loading": "Loading journal...",
|
||
"delete_entry": "Delete Day",
|
||
"delete_confirm": "Are you sure you want to permanently delete this travel day?",
|
||
"carry_over_tanks_title": "Carry over from previous day?",
|
||
"carry_over_tanks_confirm": "Use the previous travel day's destination as departure port and closing tank levels as morning levels?\n\nDeparture port: {{departure}}\nFreshwater: {{fw}} L\nFuel: {{fuel}} L\nGreywater: {{greywater}} L",
|
||
"carry_over_tanks_yes": "Carry over",
|
||
"carry_over_tanks_no": "Start at 0",
|
||
"event_title": "Chronological Event Logbook",
|
||
"no_events": "No events logged for this travel day yet.",
|
||
"event_time": "Time",
|
||
"event_mgk": "MgK Course",
|
||
"event_rwk": "RwK Course",
|
||
"event_course_section": "Course",
|
||
"course_dial_hint": "Drag the ring or enter degrees",
|
||
"course_dial_step_label": "Step size",
|
||
"course_step_fine": "1°",
|
||
"course_step_medium": "5°",
|
||
"course_step_coarse": "10°",
|
||
"course_tab_mgk": "MgK",
|
||
"course_tab_rwk": "rwK",
|
||
"course_invalid": "Invalid course (0–360)",
|
||
"course_placeholder_degrees": "e.g. 180",
|
||
"course_placeholder_cardinal": "e.g. NW",
|
||
"compass_n": "N",
|
||
"compass_e": "E",
|
||
"compass_s": "S",
|
||
"compass_w": "W",
|
||
"wind_mode_cardinal": "Cardinal",
|
||
"wind_mode_degrees": "As degrees",
|
||
"event_wind_direction": "Wind Dir",
|
||
"event_wind_strength": "Wind Str",
|
||
"event_sea_state": "Sea State",
|
||
"event_weather": "Weather",
|
||
"event_log": "Log (nm)",
|
||
"event_gps": "GPS Position",
|
||
"event_location": "Location / Port",
|
||
"event_location_placeholder": "e.g. Kiel",
|
||
"event_remarks": "Remarks / Events",
|
||
"gps_btn": "Get GPS Location",
|
||
"weather_btn": "Fetch OpenWeatherMap Weather",
|
||
"event_wind_pressure": "Barometer (hPa)",
|
||
"event_heel": "Heel Angle (°)",
|
||
"event_sails": "Sails / Motor Status",
|
||
"motor_propulsion": "Engine Propulsion",
|
||
"sails_picker_show_more": "Show all sails",
|
||
"sails_picker_show_less": "Show less",
|
||
"motor_hours": "Engine hours (total)",
|
||
"fuel_per_motor_hour": "Consumption per engine hour",
|
||
"event_distance": "Distance (nm)",
|
||
"export_csv": "Download CSV",
|
||
"share_csv": "Share CSV",
|
||
"export_pdf": "Download PDF",
|
||
"exporting_pdf": "Generating PDF...",
|
||
"photos_title": "Photo Attachments (E2E Encrypted)",
|
||
"photo_caption_label": "Photo Caption / Label (Optional)",
|
||
"photo_caption_placeholder": "e.g. Setting sails near harbor entrance",
|
||
"photo_btn": "Take Photo / Upload",
|
||
"photo_processing": "Processing...",
|
||
"no_photos": "No photos attached to this journal entry yet.",
|
||
"photo_delete_confirm": "Are you sure you want to permanently delete this photo?",
|
||
"confirm_yes": "Yes",
|
||
"confirm_no": "No",
|
||
"track_upload_title": "GPS track file",
|
||
"track_upload_points": "points",
|
||
"gps_tracking_btn_gpx": "Download track file",
|
||
"gps_track_upload_help": "Drag & drop a GPX, KML, or GeoJSON file here, or click to select",
|
||
"gps_track_upload_btn": "Upload GPS Track File",
|
||
"gps_track_delete": "Delete Track File",
|
||
"gps_track_delete_confirm": "Are you sure you want to permanently delete this track file?",
|
||
"track_distance": "GPS distance (nm)",
|
||
"track_speed_max": "Max speed (kn)",
|
||
"track_speed_avg": "Avg speed (kn)",
|
||
"track_map_title": "GPS track on OpenSeaMap",
|
||
"track_map_start": "Start",
|
||
"track_map_end": "End",
|
||
"track_map_speed_slow": "slow",
|
||
"track_map_speed_fast": "fast",
|
||
"track_map_error": "Could not load map.",
|
||
"exporting": "Exporting...",
|
||
"share_unsupported": "Web sharing is not supported on this device. File downloaded instead.",
|
||
"invite_crew": "Invite Crew",
|
||
"invite_link_copied": "Invitation link copied to clipboard!",
|
||
"invite_link_desc": "Share this link with crew members to grant them write permissions for this logbook.",
|
||
"collaborators_list": "Members / Crew",
|
||
"revoke": "Revoke Access",
|
||
"revoke_confirm": "Are you sure you want to revoke access for this crew member?",
|
||
"invite_role": "Role",
|
||
"invite_expires": "Link expires in 48 hours"
|
||
},
|
||
"dashboard": {
|
||
"title": "Your Logbooks",
|
||
"subtitle": "Select a logbook or create a new one to manage your journeys.",
|
||
"create_btn": "Create Logbook",
|
||
"new_logbook_placeholder": "Logbook or Yacht Name",
|
||
"logout": "Logout",
|
||
"logged_in_as": "Signed in as {{name}}",
|
||
"delete_confirm": "Are you sure you want to permanently delete this logbook? All local data and server copies will be destroyed.\n\nTip: Create a backup first under Settings → Backup & restore (.daagbok.json) if you may need the data later.",
|
||
"no_logbooks": "No logbooks found. Create your first logbook to begin!",
|
||
"loading": "Loading logbooks...",
|
||
"status_synced": "Synced",
|
||
"status_local": "Local Cache Only",
|
||
"delete_btn": "Delete logbook",
|
||
"section_owned": "My logbooks",
|
||
"section_shared": "Shared logbooks",
|
||
"section_shared_hint": "You were invited as crew. Skipper profile and settings belong to the owner.",
|
||
"role_owner": "Own logbook",
|
||
"role_owner_hint": "You own this logbook and act as skipper",
|
||
"role_crew": "Crew access",
|
||
"role_crew_hint": "Invited logbook — you can collaborate and sign as crew",
|
||
"role_read": "Read only",
|
||
"role_read_hint": "Shared logbook — view only, no editing",
|
||
"open_profile": "Open profile for {{name}}",
|
||
"edit_title": "Rename Logbook",
|
||
"edit_placeholder": "New name of the logbook",
|
||
"edit_success": "Logbook renamed successfully",
|
||
"edit_btn": "Rename",
|
||
"filter_label": "Filter logbooks",
|
||
"filter_placeholder": "Name, year or date …",
|
||
"filter_clear": "Clear filter",
|
||
"filter_results": "{{count}} matches",
|
||
"filter_no_results": "No logbooks match your search. Try a different name or year.",
|
||
"sort_label": "Sort",
|
||
"sort_by_label": "Sort by",
|
||
"sort_by_name": "Name",
|
||
"sort_by_date": "Date",
|
||
"sort_dir_label": "Order",
|
||
"sort_asc": "Ascending",
|
||
"sort_desc": "Descending",
|
||
"sort_name_asc": "Name A to Z",
|
||
"sort_name_desc": "Name Z to A",
|
||
"sort_date_asc": "Oldest first",
|
||
"sort_date_desc": "Newest first"
|
||
},
|
||
"profile": {
|
||
"title": "User profile",
|
||
"subtitle": "Account, passkeys and statistics for {{name}}",
|
||
"back": "Back to dashboard",
|
||
"loading": "Loading profile…",
|
||
"load_error": "Could not load profile.",
|
||
"copy_failed": "Copy failed.",
|
||
"processing": "Processing…",
|
||
"identity_title": "Account identity",
|
||
"username": "Username",
|
||
"user_id": "User ID",
|
||
"copy_user_id": "Copy user ID",
|
||
"account_since": "Account since",
|
||
"prf_status": "Passkey key derivation (PRF)",
|
||
"prf_active": "Active",
|
||
"prf_inactive": "Not configured",
|
||
"passkeys_title": "Passkeys",
|
||
"passkeys_desc": "Register a passkey on each device you use. This helps when switching platforms or browsers.",
|
||
"passkeys_empty": "No passkeys found.",
|
||
"add_passkey_btn": "Add new passkey",
|
||
"add_passkey_success": "Passkey added successfully.",
|
||
"add_passkey_failed": "Could not add passkey.",
|
||
"remove_passkey_btn": "Remove passkey",
|
||
"remove_passkey_last_title": "Last passkey",
|
||
"remove_passkey_last_desc": "The only passkey cannot be removed without losing access to your account. To delete the account entirely, use the danger zone at the bottom of this page.",
|
||
"remove_passkey_failed": "Could not remove passkey.",
|
||
"remove_passkey_confirm_title": "Remove passkey?",
|
||
"remove_passkey_confirm_desc": "This device will no longer be able to sign in with this passkey.",
|
||
"remove_passkey_confirm_yes": "Remove",
|
||
"remove_passkey_confirm_no": "Cancel",
|
||
"pin_title": "Local PIN",
|
||
"pin_status": "Status",
|
||
"pin_active": "Active on this device",
|
||
"pin_inactive": "Not configured",
|
||
"pin_confirm_label": "Confirm PIN",
|
||
"pin_confirm_placeholder": "Re-enter PIN",
|
||
"pin_set_btn": "Set PIN",
|
||
"pin_change_btn": "Change PIN",
|
||
"pin_remove_btn": "Remove PIN",
|
||
"pin_saved": "PIN saved.",
|
||
"pin_save_failed": "Could not save PIN.",
|
||
"pin_mismatch": "PIN entries do not match.",
|
||
"pin_length_error": "PIN must be at least 4 characters.",
|
||
"pin_no_session": "Session expired — please sign in again.",
|
||
"remove_pin_confirm_title": "Remove PIN?",
|
||
"remove_pin_confirm_desc": "You will need to sign in on this device with passkey or recovery phrase again.",
|
||
"remove_pin_confirm_yes": "Remove PIN",
|
||
"remove_pin_confirm_no": "Cancel",
|
||
"security_title": "Security checklist",
|
||
"security_desc": "Overview of the most important protections for your account.",
|
||
"security_passkeys_ok": "At least one passkey registered",
|
||
"security_passkeys_missing": "No passkey registered",
|
||
"security_prf_ok": "PRF key derivation active",
|
||
"security_prf_missing": "PRF not configured",
|
||
"security_pin_ok": "Local PIN on this device",
|
||
"security_pin_missing": "No local PIN",
|
||
"security_recovery_ok": "Recovery phrase configured",
|
||
"security_recovery_hint": "The 12 words were shown at registration. Store them offline and separately from this device. You can create a new phrase below — the old one will then be invalidated.",
|
||
"recovery_rotate_btn": "Create new recovery phrase",
|
||
"recovery_rotate_confirm_title": "Create new recovery phrase?",
|
||
"recovery_rotate_confirm_desc": "Your previous 12-word phrase will be invalidated immediately. Make sure you can store the new phrase securely before continuing.",
|
||
"recovery_rotate_confirm_yes": "Create new phrase",
|
||
"recovery_rotate_confirm_no": "Cancel",
|
||
"recovery_rotate_new_warning": "IMPORTANT: Write down these 12 words and store them offline. Your previous recovery phrase is no longer valid.",
|
||
"recovery_rotate_failed": "Could not create a new recovery phrase.",
|
||
"recovery_rotate_no_session": "Encryption session expired — please sign out and sign in again, then retry.",
|
||
"device_title": "This device",
|
||
"device_desc": "Local cache, sync status, and quick login on this browser.",
|
||
"device_sync_pending": "{{count}} pending sync items",
|
||
"device_sync_ok": "All local changes synced",
|
||
"device_remembered": "Account saved for quick login on this device",
|
||
"device_not_remembered": "Account not in the quick-login list",
|
||
"device_forget_btn": "Forget account on this device",
|
||
"device_forget_confirm_title": "Remove quick login?",
|
||
"device_forget_confirm_desc": "The account will be removed from the quick-login list on this device. Your session and local logbooks stay on this device.",
|
||
"device_forget_confirm_yes": "Remove",
|
||
"device_forget_confirm_no": "Cancel",
|
||
"passkey_label": "Name for new passkey (optional)",
|
||
"passkey_label_placeholder": "e.g. MacBook, iPhone",
|
||
"passkey_rename_btn": "Save name",
|
||
"passkey_rename_success": "Passkey name saved.",
|
||
"passkey_rename_failed": "Could not save passkey name.",
|
||
"passkey_unnamed": "Unnamed passkey",
|
||
"stats_title": "Statistics",
|
||
"stats_subtitle": "Across all your logbooks on this device",
|
||
"stats_logbooks": "Logbooks",
|
||
"stats_account_since": "Account since",
|
||
"stats_shared_logbooks": "Shared logbooks",
|
||
"appearance_title": "App & appearance",
|
||
"appearance_desc": "Theme and color scheme apply to the entire app on this device.",
|
||
"theme_label": "Application style / theme",
|
||
"theme_auto": "Auto (OS detect)",
|
||
"theme_ocean": "Ocean (glassmorphism)",
|
||
"theme_material": "Material (Android)",
|
||
"theme_cupertino": "Cupertino (iOS)",
|
||
"color_scheme_label": "Light or dark mode",
|
||
"color_scheme_auto": "Auto (system)",
|
||
"color_scheme_light": "Light",
|
||
"color_scheme_dark": "Dark",
|
||
"integrations_title": "Integrations",
|
||
"owm_key": "OpenWeatherMap API key",
|
||
"owm_help": "Optional: your own OpenWeatherMap API key. If left empty, the operator-configured server key is used.",
|
||
"prefs_save": "Save",
|
||
"prefs_saving": "Saving…",
|
||
"prefs_saved": "Saved",
|
||
"tour_title": "App tour",
|
||
"tour_desc": "Take a guided walkthrough of the main areas of the app again.",
|
||
"tour_restart": "Restart tour",
|
||
"push_title": "Push notifications",
|
||
"push_desc": "As logbook owner you are notified when invited crew members sync changes. No logbook content is sent in plain text.",
|
||
"push_enable": "Notify on crew changes",
|
||
"push_active": "Push notifications are active on this device.",
|
||
"push_unsupported": "Push notifications are not supported in this browser.",
|
||
"push_denied_hint": "Notifications are blocked. Allow them in your browser or device settings.",
|
||
"push_ios_install_hint": "On iPhone/iPad: add the app to your Home Screen (iOS 16.4+) to use push notifications.",
|
||
"push_error": "Could not enable push notifications."
|
||
},
|
||
"crew": {
|
||
"title": "Skipper & Crew Profiles",
|
||
"skipper_section": "Skipper Profile",
|
||
"skipper_read_only_hint": "The skipper profile can only be edited by the logbook owner.",
|
||
"crew_section": "Crew List",
|
||
"add_crew": "Add Crew Member",
|
||
"edit_crew": "Edit Crew Member",
|
||
"no_crew": "No crew members added yet.",
|
||
"max_crew": "Maximum of 5 crew members reached.",
|
||
"name": "Full Name",
|
||
"address": "Address",
|
||
"birthdate": "Date of Birth",
|
||
"phone": "Phone Number",
|
||
"nationality": "Nationality",
|
||
"passport": "Passport / ID Number",
|
||
"bloodtype": "Blood Type",
|
||
"allergies": "Allergies",
|
||
"diseases": "Medical Conditions / Diseases",
|
||
"save": "Save Skipper Data",
|
||
"save_member": "Save Member",
|
||
"saved": "Skipper profile saved successfully!",
|
||
"loading": "Loading crew files...",
|
||
"delete_confirm": "Are you sure you want to remove this crew member?"
|
||
},
|
||
"deviation": {
|
||
"title": "Compass Deviation Table",
|
||
"subtitle": "Calibrate magnetic compass headings (MgK) from 000° to 360° in 10° steps.",
|
||
"heading": "MgK",
|
||
"deviation": "Deviation",
|
||
"save": "Save Calibration Grid",
|
||
"saving": "Saving...",
|
||
"saved": "Calibration grid saved successfully!",
|
||
"loading": "Loading calibration table..."
|
||
},
|
||
"settings": {
|
||
"title": "Logbook settings",
|
||
"subtitle": "Sharing, backup, and collaboration for this logbook.",
|
||
"select_logbook_hint": "Select a logbook to edit its settings.",
|
||
"no_key": "No OpenWeatherMap API key available. Add your own key in your user profile or contact the operator.",
|
||
"weather_success": "Weather details fetched successfully!",
|
||
"weather_error": "Failed to fetch weather. Check your API key and connection.",
|
||
"weather_date_mismatch": "Weather data can only be fetched for today ({{today}}). This logbook entry is dated {{date}}.",
|
||
"gps_error": "Please enter a location or fetch GPS coordinates first.",
|
||
"share_title": "Share Logbook (Read-Only)",
|
||
"share_desc": "Enable this to generate a public, read-only link. Anyone with the link can view your travels, yacht profile, and crew members. Decryption keys are never transmitted to the server (they stay in the hash part of the URL).",
|
||
"share_privacy_warning": "Recommendation: Share this link only privately (e.g. via email or messenger), not on social media.",
|
||
"share_enable": "Enable Public Link",
|
||
"share_copied": "Link copied!",
|
||
"share_copy_btn": "Copy Link",
|
||
"danger_zone_title": "Danger Zone",
|
||
"danger_zone_desc": "Deleting your account will permanently delete all your passkeys, logbooks, vessel data, crew profiles, travel logs, and E2E keys. This action cannot be undone.",
|
||
"delete_account_btn": "Permanently Delete Account",
|
||
"delete_account_confirm_title": "Delete Account?",
|
||
"delete_account_confirm_desc": "Are you absolutely sure you want to permanently delete your account and all associated logbooks and E2E-encrypted data?",
|
||
"delete_account_confirm_yes": "Yes, Delete Account and All Data",
|
||
"delete_account_confirm_no": "Cancel",
|
||
"delete_account_failed": "Failed to delete account. Please try again.",
|
||
"delete_backup_hint": "Tip: Before deleting, create backups of your logbooks (.daagbok.json) in each logbook's settings.",
|
||
"deleting_account": "Deleting account…",
|
||
"invite_push_prompt_title": "Enable push notifications?",
|
||
"invite_push_prompt_message": "When invited crew members sync changes, you can be notified via push. No logbook content is sent in plain text.",
|
||
"invite_push_prompt_ios_message": "When crew members sync changes, you can get push notifications. On iPhone/iPad: add the app to your Home Screen (iOS 16.4+), then enable push in your user profile.",
|
||
"invite_push_prompt_enable": "Enable now",
|
||
"invite_push_prompt_later": "Later",
|
||
"invite_push_prompt_success": "Push notifications are active on this device.",
|
||
"backup_title": "Backup & restore",
|
||
"backup_desc": "Full encrypted backup of this logbook (entries, photos, GPS tracks, crew, vessel). Protected with a backup passphrase — restore on this or a new account.",
|
||
"backup_export_title": "Create backup",
|
||
"backup_export_desc": "Downloads all local data as a .daagbok.json file. Keep the file and passphrase separate and secure.",
|
||
"backup_restore_title": "Restore backup",
|
||
"backup_restore_desc": "Restores a backup into your current account — including after registering a new account.",
|
||
"backup_passphrase": "Backup passphrase",
|
||
"backup_passphrase_placeholder": "At least 8 characters",
|
||
"backup_passphrase_confirm": "Confirm passphrase",
|
||
"backup_passphrase_short": "The backup passphrase must be at least 8 characters.",
|
||
"backup_passphrase_mismatch": "Passphrases do not match.",
|
||
"backup_wrong_passphrase": "Wrong passphrase or corrupted backup.",
|
||
"backup_export_btn": "Download backup",
|
||
"backup_exporting": "Creating backup…",
|
||
"backup_export_success": "Backup created ({{count}} travel days).",
|
||
"backup_file_label": "Backup file (.daagbok.json)",
|
||
"backup_preview_btn": "Verify contents",
|
||
"backup_previewing": "Verifying…",
|
||
"backup_restore_btn": "Restore",
|
||
"backup_restoring": "Restoring…",
|
||
"backup_restore_success": "Logbook “{{title}}” has been restored.",
|
||
"backup_restore_cancelled": "Restore cancelled.",
|
||
"backup_invalid_json": "The file is not valid JSON.",
|
||
"backup_invalid_format": "Unknown or outdated backup format.",
|
||
"backup_not_owner": "Only the logbook owner can create backups.",
|
||
"backup_not_authenticated": "Please sign in to restore a backup.",
|
||
"backup_id_conflict": "A logbook with this ID already exists.",
|
||
"backup_overwrite_confirm": "The existing logbook with the same ID will be replaced. Continue?",
|
||
"backup_new_id_confirm": "Import the backup as a new logbook with a new ID?",
|
||
"backup_stat_entries": "{{count}} travel days",
|
||
"backup_stat_photos": "{{count}} photos",
|
||
"backup_stat_crew": "{{count}} crew records",
|
||
"backup_stat_tracks": "{{count}} GPS tracks",
|
||
"backup_exported_at": "Exported: {{date}}"
|
||
},
|
||
"disclaimer": {
|
||
"title": "Important notice",
|
||
"intro": "Please read the following information before using Kapteins Daagbok.",
|
||
"e2e_title": "End-to-end encryption",
|
||
"e2e_body": "Your logbook data is encrypted end-to-end. Only you – or people with your key – can read the contents. The server stores encrypted data only.",
|
||
"pwa_title": "Progressive Web App (PWA)",
|
||
"pwa_body": "Kapteins Daagbok runs as a Progressive Web App in your browser and can be installed on your device – similar to a native app, without an app store.",
|
||
"storage_title": "Local storage & sync",
|
||
"storage_body": "Your data is cached locally on your device (IndexedDB). When online, changes are synced to the server. You can keep working offline; sync happens when connectivity returns.",
|
||
"free_title": "Free & ad-free",
|
||
"free_body": "Kapteins Daagbok is free to use and contains no advertising.",
|
||
"liability_title": "Disclaimer of liability",
|
||
"liability_body": "Use is at your own risk. No liability is accepted for damages arising from use of the app – including incorrect or incomplete log entries, data loss, or technical failures.",
|
||
"warranty_title": "No warranty",
|
||
"warranty_body": "No warranty is provided for functionality, accuracy, or availability of the service. Operation may be interrupted, limited, or discontinued at any time.",
|
||
"copyright": "© 2026 KnorrLabs, Markus F.J. Busche",
|
||
"accept": "Accept and continue",
|
||
"close": "Close",
|
||
"button_title": "Legal notice & disclaimer"
|
||
},
|
||
"feedback": {
|
||
"button_title": "Send feedback",
|
||
"title": "Feedback",
|
||
"intro": "Share bugs, ideas or general feedback. Your message is sent to the project team via a secure notification channel.",
|
||
"category_label": "Category",
|
||
"category_general": "General",
|
||
"category_bug": "Bug report",
|
||
"category_feature": "Feature request",
|
||
"contact_label": "Email (optional)",
|
||
"contact_placeholder": "your@email.example",
|
||
"message_label": "Message",
|
||
"message_placeholder": "Describe your feedback…",
|
||
"send": "Send",
|
||
"sending": "Sending…",
|
||
"cancel": "Cancel",
|
||
"success": "Thank you! Your feedback has been sent.",
|
||
"error_send": "Could not send feedback. Please try again later.",
|
||
"error_invalid_email": "Please enter a valid email address.",
|
||
"error_not_configured": "Feedback is not available on this server.",
|
||
"error_rate_limited": "Too many feedback messages in a short time. Please wait a few minutes.",
|
||
"error_spam": "This message could not be sent. Please rephrase it and try again."
|
||
},
|
||
"demo": {
|
||
"logbook_title": "Baltic Sea Demo Logbook",
|
||
"badge": "Demo",
|
||
"public_banner": "Read-only demo view",
|
||
"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",
|
||
"scope_label": "Scope",
|
||
"scope_logbook": "This logbook",
|
||
"scope_account": "All logbooks",
|
||
"loading": "Calculating statistics…",
|
||
"no_data": "No travel days yet.",
|
||
"total_distance": "Total distance",
|
||
"travel_days": "Travel days",
|
||
"sail_distance": "Under sail",
|
||
"motor_distance": "Engine",
|
||
"motor_hours_total": "Total engine hours",
|
||
"daily_motor_hours": "Engine hours per travel day",
|
||
"avg_motor_hours": "Avg. engine hours per travel day",
|
||
"unknown_propulsion": "Unknown",
|
||
"fuel_total": "Total fuel",
|
||
"water_total": "Total water",
|
||
"daily_etmal": "Daily mileage",
|
||
"daily_consumption": "Daily consumption",
|
||
"route_overview": "Route",
|
||
"route_map_title": "Route overview",
|
||
"propulsion_title": "Sail vs. engine",
|
||
"propulsion_hint": "Split is based on logbook events per travel day, not GPS segments.",
|
||
"avg_distance": "Avg. per travel day",
|
||
"avg_fuel": "Avg. fuel",
|
||
"avg_water": "Avg. water",
|
||
"fuel_per_nm": "Fuel per nm",
|
||
"fuel_per_motor_hour": "Fuel per engine hour",
|
||
"daily_fuel_per_motor_hour": "Fuel consumption per engine hour by travel day",
|
||
"fuel_legend": "Fuel",
|
||
"water_legend": "Water",
|
||
"unit_nm": "nm",
|
||
"unit_h": "h",
|
||
"unit_l": "L",
|
||
"day_label": "Day {{day}}",
|
||
"account_logbooks": "Logbooks overview",
|
||
"col_logbook": "Logbook"
|
||
},
|
||
"tour": {
|
||
"skip": "Skip tour",
|
||
"back": "Back",
|
||
"next": "Next",
|
||
"finish": "Done",
|
||
"progress": "Step {{current}} of {{total}}",
|
||
"steps": {
|
||
"welcome": {
|
||
"title": "Welcome aboard!",
|
||
"body": "We created a demo logbook with three travel days in Kiel Bay. You can delete the sample entries anytime when you're ready to start your own logbook. This short tour shows you the key features."
|
||
},
|
||
"welcome_public": {
|
||
"title": "Welcome aboard!",
|
||
"body": "Explore our demo logbook with three travel days in Kiel Bay — no account required. This short tour shows vessel data, crew, and log entries."
|
||
},
|
||
"nav_logs": {
|
||
"title": "Log entries",
|
||
"body": "Manage your travel days here – departure, destination, weather, tank levels, and GPS tracks."
|
||
},
|
||
"entry_list": {
|
||
"title": "Your travel days",
|
||
"body": "Each card represents one travel day. Tap an entry to view or edit the details."
|
||
},
|
||
"entry_open": {
|
||
"title": "Open a travel day",
|
||
"body": "This is what a filled log entry looks like – with events, tank levels, and more."
|
||
},
|
||
"entry_track": {
|
||
"title": "GPS track",
|
||
"body": "Upload GPX files or view saved routes on the map – including distance and speed stats."
|
||
},
|
||
"nav_vessel": {
|
||
"title": "Vessel data",
|
||
"body": "Enter your yacht's name, dimensions, and technical details – fill once, use on every travel day."
|
||
},
|
||
"nav_crew": {
|
||
"title": "Crew list",
|
||
"body": "Manage crew members and assign them to travel days later."
|
||
},
|
||
"nav_stats": {
|
||
"title": "Statistics dashboard",
|
||
"body": "View travel distances, consumption, route maps, and propulsion breakdown — calculated automatically from your log entries."
|
||
},
|
||
"nav_feedback": {
|
||
"title": "Send feedback",
|
||
"body": "Use this form to report bugs, ideas, or general feedback to the project team — you can also open it anytime later via the icon in the top right."
|
||
},
|
||
"nav_profile": {
|
||
"title": "Your user profile",
|
||
"body": "Tap the skipper button at the top to open your personal profile — independent of the current logbook."
|
||
},
|
||
"profile_preferences": {
|
||
"title": "Account & appearance",
|
||
"body": "Manage your account identity, theme, and light/dark mode here. You can restart the app tour anytime. Passkeys and security settings are further down on the profile page."
|
||
},
|
||
"finish": {
|
||
"title": "You're all set!",
|
||
"body": "You'll land on the statistics dashboard next. You can restart the tour anytime from your user profile. Fair winds!"
|
||
}
|
||
}
|
||
},
|
||
"seo": {
|
||
"title": "Kapteins Daagbok – Free Digital Yacht Logbook (Ad-Free)",
|
||
"description": "Free, ad-free digital yacht logbook with end-to-end encryption and Passkey sign-in. Document travel days, GPS tracks, crew and vessel data securely — offline-capable PWA.",
|
||
"keywords": "yacht logbook, ship logbook, sailing log, maritime logbook, passkey, E2E encryption, GPS track, free, ad-free, offline PWA",
|
||
"ogImageAlt": "Kapteins Daagbok logo"
|
||
}
|
||
}
|
||
}
|