1077 lines
57 KiB
JSON
1077 lines
57 KiB
JSON
{
|
||
"translation": {
|
||
"app": {
|
||
"name": "Kapteins Daagbok",
|
||
"tagline": "Private Yacht Logbook",
|
||
"beta": "Beta",
|
||
"beta_hint": "Beta release — features may still change"
|
||
},
|
||
"footer": {
|
||
"kofi_label": "Ko-fi",
|
||
"kofi_title": "Support the project, development, and running costs on Ko-fi"
|
||
},
|
||
"languages": {
|
||
"de": "Deutsch",
|
||
"en": "English",
|
||
"da": "Dansk",
|
||
"sv": "Svenska",
|
||
"nb": "Norsk"
|
||
},
|
||
"dialog": {
|
||
"ok": "OK",
|
||
"yes": "Yes",
|
||
"no": "No"
|
||
},
|
||
"errors": {
|
||
"load_failed": "Could not load data.",
|
||
"save_failed": "Could not save changes.",
|
||
"delete_failed": "Could not delete.",
|
||
"export_failed": "Export failed."
|
||
},
|
||
"common": {
|
||
"unsaved_changes_title": "Unsaved changes",
|
||
"unsaved_changes_message": "You have unsaved changes. Leave this page anyway? Your changes will be lost.",
|
||
"unsaved_changes_stay": "Stay",
|
||
"unsaved_changes_save_leave": "Save & leave",
|
||
"unsaved_changes_discard": "Discard",
|
||
"unsaved_changes_leave": "Leave"
|
||
},
|
||
"nav": {
|
||
"dashboard": "Dashboard",
|
||
"vessel": "Vessel Profile",
|
||
"crew": "Crew",
|
||
"deviation": "Deviation Table",
|
||
"logs": "Logbook Entries",
|
||
"stats": "Statistics",
|
||
"settings": "Settings",
|
||
"admin": "Admin"
|
||
},
|
||
"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.",
|
||
"error_invalid_host": "Passkeys do not work on 127.0.0.1. Please open the app via localhost.",
|
||
"use_localhost_link": "Switch to localhost",
|
||
"error_passkey_cancelled": "Passkey sign-in was cancelled or timed out. Please try again.",
|
||
"error_invalid_rp_id": "Passkey domain mismatch (RP ID). For local dev use http://localhost:5173 with RP_ID=localhost in .env.",
|
||
"error_session_incomplete": "Sign-in incomplete. Please sign in with your passkey again.",
|
||
"restore_checking": "Checking session…",
|
||
"restore_title": "Restore session",
|
||
"restore_subtitle": "You are still signed in. Unlock your logbook with passkey or PIN.",
|
||
"restore_unlocking": "Unlocking…",
|
||
"restore_with_passkey": "Unlock with passkey ({{name}})",
|
||
"restore_with_pin": "Unlock with PIN",
|
||
"restore_pin_warning": "Enter your local PIN to unlock your logbook after reload.",
|
||
"restore_other_account": "Sign in with another account"
|
||
},
|
||
"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…",
|
||
"storage_persist_hint": "Your browser may delete offline data. Allow persistent storage to keep your logbook safe (browser settings or when prompted)."
|
||
},
|
||
"sync": {
|
||
"status_synced": "Synced",
|
||
"status_syncing": "Syncing…",
|
||
"status_offline": "Offline Cache",
|
||
"status_unsynced": "Unsynced changes",
|
||
"conflict_title": "Sync conflict",
|
||
"conflict_message": "{{count}} change(s) could not be synced (entry {{id}}…). Choose which version to keep.",
|
||
"conflict_use_server": "Use server version",
|
||
"conflict_keep_local": "Keep my version"
|
||
},
|
||
"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": "Travel day",
|
||
"travel_day_number": "Travel day {{number}}",
|
||
"departure": "Departure Port (von)",
|
||
"destination": "Destination Port (nach)",
|
||
"route": "Route / Journey",
|
||
"tanks": "Tanks",
|
||
"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...",
|
||
"view_mode_label": "View",
|
||
"view_list": "List",
|
||
"live_mode": "Live",
|
||
"live_title": "Live Journal",
|
||
"live_loading": "Loading live journal...",
|
||
"live_retry": "Try again",
|
||
"live_load_error": "Could not load live journal.",
|
||
"live_action_error": "Could not save entry.",
|
||
"live_open_editor": "Full editor",
|
||
"live_actions_label": "Quick actions",
|
||
"live_stream_label": "Event log",
|
||
"live_stream_title": "Journal",
|
||
"live_no_events": "No entries yet — tap an action.",
|
||
"live_motor_start": "Engine Start",
|
||
"live_motor_stop": "Engine Stop",
|
||
"live_cast_off": "Cast off",
|
||
"live_moor": "Moor",
|
||
"live_sails_btn": "Sails",
|
||
"live_sails_pick": "Select sails",
|
||
"live_sails_pick_hint": "Tap multiple sails (tap again to deselect), then log.",
|
||
"live_sails_selected": "Selected: {{sails}}",
|
||
"live_sails_confirm": "Log entry",
|
||
"live_sails_confirm_count": "Log entry ({{count}})",
|
||
"live_sails": "Sails: {{sails}}",
|
||
"live_position": "Position",
|
||
"live_position_coords": "Position {{lat}}, {{lng}}",
|
||
"live_position_manual_hint": "GPS unavailable. Enter latitude and longitude manually, or try again with the GPS button.",
|
||
"live_position_gps_loading": "Getting GPS position…",
|
||
"live_position_invalid": "Please enter valid coordinates (latitude −90…90, longitude −180…180).",
|
||
"live_position_lat_placeholder": "Latitude (Lat)",
|
||
"live_position_lng_placeholder": "Longitude (Lng)",
|
||
"live_photo_btn": "Photo (camera)",
|
||
"live_photo_capture_btn": "Capture",
|
||
"live_photo_save_btn": "Save",
|
||
"live_photo_retake_btn": "Retake",
|
||
"live_photo_capture_failed": "Capture failed. Please try again.",
|
||
"live_photo_open_camera_btn": "Open camera",
|
||
"live_photo_native_hint": "Take a photo with your device camera, then save it here.",
|
||
"live_photo_camera_starting": "Starting camera…",
|
||
"live_photo_camera_denied": "Camera access denied or unavailable.",
|
||
"live_photo_camera_unavailable": "Camera is not supported in this browser.",
|
||
"live_photo_no_camera": "No camera is available on this device.",
|
||
"live_photo_error": "Could not save photo.",
|
||
"live_photo_entry": "Photo: {{caption}}",
|
||
"live_photo_entry_plain": "Photo captured",
|
||
"live_undo_photo_hint": "Photo saved",
|
||
"live_voice_btn": "Voice memo",
|
||
"live_voice_hint": "Record a short voice memo (max. 60 seconds).",
|
||
"live_voice_record": "Start recording",
|
||
"live_voice_stop": "Stop recording",
|
||
"live_voice_recording": "Recording {{time}}",
|
||
"live_voice_save": "Save",
|
||
"live_voice_saving": "Saving…",
|
||
"live_voice_retake": "Record again",
|
||
"live_voice_mic_denied": "Microphone access denied or unavailable.",
|
||
"live_voice_record_failed": "Recording failed. Please try again.",
|
||
"live_voice_unavailable": "Voice memo unavailable",
|
||
"live_voice_too_large": "Recording is too large. Please record a shorter memo.",
|
||
"live_voice_error": "Could not save voice memo.",
|
||
"live_voice_entry": "Voice memo: {{caption}}",
|
||
"live_voice_entry_plain": "Voice memo",
|
||
"live_voice_caption_label": "Caption (optional)",
|
||
"live_voice_caption_placeholder": "e.g. radio call with harbour master",
|
||
"live_voice_transcribe_action": "Transcribe",
|
||
"live_voice_transcribing": "Transcribing…",
|
||
"live_voice_transcribe_failed": "Voice memo saved, but transcription failed.",
|
||
"live_undo_voice_hint": "Voice memo saved",
|
||
"live_comment_btn": "Comment",
|
||
"live_comment_placeholder": "Enter text…",
|
||
"live_comment_confirm": "Log entry",
|
||
"live_gps_error": "Could not determine GPS position.",
|
||
"live_gps_start_hint": "Always start your day's voyage with a position.",
|
||
"live_event_generic": "Event",
|
||
"live_weather_btn": "Weather",
|
||
"live_weather_owm_btn": "Fetch OpenWeatherMap weather",
|
||
"live_weather_owm_loading": "Loading weather…",
|
||
"live_weather_position_required": "Log a position first (Position button) to fetch OpenWeatherMap weather. The position must be at most 6 hours old.",
|
||
"live_weather_position_stale": "The last position is older than 6 hours. Log a new position before fetching weather.",
|
||
"live_wind_btn": "Wind",
|
||
"live_temp_btn": "Temp °C",
|
||
"live_pressure_btn": "Pressure",
|
||
"live_precip_btn": "Precipitation",
|
||
"live_sea_state_btn": "Sea state",
|
||
"live_visibility_btn": "Visibility",
|
||
"live_course_btn": "Course",
|
||
"live_fuel_btn": "+ Fuel",
|
||
"live_water_btn": "+ Water",
|
||
"live_wind_entry": "Wind {{value}}",
|
||
"live_temp_entry": "Temperature {{temp}} °C",
|
||
"live_pressure_entry": "Pressure {{value}} hPa",
|
||
"live_precip_entry": "Precipitation {{value}}",
|
||
"live_sea_state_entry": "Sea state {{value}}",
|
||
"live_visibility_entry": "Visibility {{value}}",
|
||
"live_course_entry": "Course {{course}}",
|
||
"live_fuel_entry": "Fuel +{{liters}} L",
|
||
"live_water_entry": "Water +{{liters}} L",
|
||
"live_auto_position": "Auto position",
|
||
"live_undo_hint": "Entry saved",
|
||
"live_undo_btn": "Undo",
|
||
"live_cancel": "Cancel",
|
||
"live_pressure_placeholder": "e.g. 1013",
|
||
"live_temp_placeholder": "e.g. 18",
|
||
"live_precip_placeholder": "e.g. light rain",
|
||
"live_sea_state_placeholder": "e.g. 3",
|
||
"live_visibility_placeholder": "e.g. 10 km",
|
||
"live_course_placeholder": "e.g. 245",
|
||
"live_fuel_placeholder": "Liters refilled",
|
||
"live_water_placeholder": "Liters refilled",
|
||
"live_sog_btn": "SOG",
|
||
"live_stw_btn": "STW",
|
||
"live_sog_entry": "SOG {{speed}} kn",
|
||
"live_stw_entry": "STW {{speed}} kn",
|
||
"live_sog_placeholder": "e.g. 5.2",
|
||
"live_stw_placeholder": "e.g. 4.8",
|
||
"live_sog_hint": "Speed over ground (kn) — prefilled from GPS when available.",
|
||
"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",
|
||
"event_creator": "Entered by",
|
||
"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_visibility": "Visibility",
|
||
"event_visibility_placeholder": "e.g. 10 km",
|
||
"weather_slider_unset": "—",
|
||
"weather_slider_pressure": "{{value}} hPa",
|
||
"weather_slider_sea_state": "State {{value}}",
|
||
"weather_slider_heel": "{{value}}°",
|
||
"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",
|
||
"gps_permission_denied": "Location access was denied. Allow it in your browser or device settings and try again.",
|
||
"gps_timeout": "GPS timed out. Try again outdoors with a clear view of the sky.",
|
||
"gps_position_unavailable": "No GPS signal available. Wait and retry, or enter coordinates manually.",
|
||
"gps_unavailable": "GPS is not supported by this browser or device.",
|
||
"gps_failed": "Could not determine GPS position.",
|
||
"gps_fallback_no_location": "GPS failed. Enter a place under Location / harbour, departure, or destination, or type coordinates manually.",
|
||
"gps_fallback_success": "Coordinates for \"{{location}}\" resolved from place name (not GPS).",
|
||
"gps_fallback_failed": "GPS and place-name lookup both failed. Please enter coordinates manually.",
|
||
"gps_quality_excellent": "Strong GPS reception (±{{accuracy}} m)",
|
||
"gps_quality_good": "Good GPS reception (±{{accuracy}} m)",
|
||
"gps_quality_fair": "Fair GPS reception (±{{accuracy}} m) — move outdoors for a better fix.",
|
||
"gps_quality_poor": "Weak GPS reception (±{{accuracy}} m) — likely few satellites. Retry outdoors or verify the position.",
|
||
"gps_quality_unknown": "GPS position applied (accuracy not reported by device).",
|
||
"gps_live_intro_title": "Location for Live Log",
|
||
"gps_live_intro_body": "The app needs your location for automatic position entries and the GPS button.\n\nTap “Allow location” and confirm in the next dialog. You can always enter a position manually via “Position”.",
|
||
"gps_live_intro_allow": "Allow location",
|
||
"gps_live_intro_later": "Later",
|
||
"gps_enable_in_settings_hint": "Location access is blocked. You can allow it later in your browser or device settings (site / app → Location).",
|
||
"weather_btn": "Fetch OpenWeatherMap Weather",
|
||
"weather_offline": "OpenWeatherMap requires an internet connection. You are currently offline.",
|
||
"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...",
|
||
"ai_summary_title": "AI Summary",
|
||
"ai_summary_read_only": "Created by the skipper — read-only for crew.",
|
||
"ai_summary_empty": "No summary yet.",
|
||
"ai_summary_generate": "Generate summary",
|
||
"ai_summary_regenerate": "Regenerate",
|
||
"ai_summary_generating": "Generating…",
|
||
"ai_summary_attempts_remaining": "{{remaining}} of {{max}} attempts remaining",
|
||
"ai_summary_error": "AI summary failed. Please try again later.",
|
||
"ai_summary_error_no_key": "No OpenRouter API key configured on the server.",
|
||
"ai_summary_error_rate_limited": "Maximum number of generations reached for this travel day.",
|
||
"ai_summary_error_forbidden": "Only the skipper may generate AI summaries.",
|
||
"ai_summary_offline": "AI summary generation requires an internet connection. You are currently offline.",
|
||
"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_camera_btn": "Take Photo",
|
||
"photo_gallery_btn": "Choose from Gallery",
|
||
"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",
|
||
"nmea_import_title": "Import NMEA log",
|
||
"nmea_import_intro": "Upload a .nmea file from your onboard logger. The app suggests journal entries — you choose what to import.",
|
||
"nmea_import_btn": "Import NMEA",
|
||
"nmea_file_label": "NMEA file",
|
||
"nmea_stats": "{{lines}} sentences parsed · types: {{types}}",
|
||
"nmea_warn_no_position": "No position sentences found — track and GPS fields may stay empty.",
|
||
"nmea_warn_duplicate_file": "This NMEA file has already been imported. Importing the same file again will add duplicate journal entries.",
|
||
"nmea_mode_label": "Generate journal entries",
|
||
"nmea_mode_interval": "By time interval",
|
||
"nmea_mode_change": "On significant change",
|
||
"nmea_mode_both": "Both (merge)",
|
||
"nmea_interval_label": "Interval (minutes)",
|
||
"nmea_import_track": "Import GPS track from NMEA",
|
||
"nmea_preview": "Preview",
|
||
"nmea_preview_hint": "{{count}} suggested journal entries",
|
||
"nmea_select_all": "Select all",
|
||
"nmea_select_none": "Select none",
|
||
"nmea_source_interval": "Interval",
|
||
"nmea_source_change": "Event",
|
||
"nmea_apply": "Apply to journal",
|
||
"nmea_back": "Back",
|
||
"nmea_cancel": "Cancel",
|
||
"nmea_archive_question": "Archive raw log locally? (This device only, not synced.)",
|
||
"nmea_archive_keep": "Archive",
|
||
"nmea_archive_discard": "Discard",
|
||
"nmea_archive_stored": "NMEA archived: {{name}}",
|
||
"nmea_archive_delete_confirm": "Delete archived NMEA log from this device?",
|
||
"nmea_error_no_samples": "No usable NMEA sentences in the file.",
|
||
"nmea_error_parse": "Could not read NMEA file.",
|
||
"nmea_error_read": "Could not read file.",
|
||
"nmea_error_no_file": "Please choose an NMEA file first.",
|
||
"nmea_error_no_selection": "Please select at least one journal entry.",
|
||
"nmea_remark_interval": "NMEA interval",
|
||
"nmea_remark_uncertain": "uncertain",
|
||
"nmea_remark_depth": "Depth {{depth}} m",
|
||
"nmea_change_course": "Course change {{from}}° → {{to}}°",
|
||
"nmea_change_wind": "Wind {{from}}° → {{to}}°",
|
||
"nmea_change_wind_speed": "Wind {{from}} → {{to}} kn",
|
||
"nmea_change_pressure": "Pressure {{from}} → {{to}} hPa",
|
||
"nmea_change_depth": "Depth {{from}} → {{to}} m",
|
||
"nmea_change_engine_start": "Engine on ({{rpm}} rpm)",
|
||
"nmea_change_engine_stop": "Engine off",
|
||
"nmea_change_autopilot_on": "Autopilot on",
|
||
"nmea_change_autopilot_off": "Autopilot off",
|
||
"nmea_change_gps_lost": "GPS position lost",
|
||
"nmea_change_gps_regained": "GPS position restored",
|
||
"nmea_change_water_temp": "Water temp. {{from}} → {{to}} °C",
|
||
"nmea_change_departure": "Departure / underway",
|
||
"nmea_change_anchor": "Anchored / stop",
|
||
"nmea_change_speed": "Speed {{from}} → {{to}} kn",
|
||
"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) 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}}",
|
||
"open_logbook": "Open logbook “{{title}}”",
|
||
"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, date, crew or vessel …",
|
||
"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.",
|
||
"ai_title": "AI Features & Privacy",
|
||
"ai_desc": "Authorize artificial intelligence integrations for your logbooks.",
|
||
"ai_help": "Enabling AI features allows the app to summarize travel days and transcribe recorded voice memos. To process these requests, raw voice data and travel logs are sent securely on-the-fly to OpenRouter. No data is stored permanently by the AI model.\n\nThese cloud resources cost money to run; if you enjoy using them, please consider supporting the project voluntarily with a donation via the Ko-fi link in the footer to keep them free and sustainable for everyone.",
|
||
"ai_enable_label": "Enable transcription and travel day summaries",
|
||
"ai_unauthorized_alert_title": "AI Features Not Authorized",
|
||
"ai_unauthorized_alert_desc": "To use transcription or travel day summaries, please authorize the data transmission to OpenRouter in your User Profile under 'AI Features & Privacy'.",
|
||
"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.",
|
||
"sections": {
|
||
"account": "Account & settings",
|
||
"fleet": "Fleet & crew",
|
||
"security": "Security & device",
|
||
"stats": "Statistics",
|
||
"danger": "Danger zone"
|
||
}
|
||
},
|
||
"vessel_pool": {
|
||
"title": "Vessel fleet",
|
||
"section_title": "Your vessels",
|
||
"subtitle": "Maintain all vessels for your logbooks here. Select the active vessel per logbook from this list.",
|
||
"loading": "Loading vessel fleet…",
|
||
"add_vessel": "Add vessel",
|
||
"edit_vessel": "Edit vessel",
|
||
"no_vessels": "No vessels in the pool yet.",
|
||
"delete_confirm": "Remove this vessel from the fleet?",
|
||
"max_vessels": "Maximum of 20 vessels in the pool reached."
|
||
},
|
||
"logbook_vessel": {
|
||
"title": "Vessel for this logbook",
|
||
"subtitle": "Choose the vessel for this logbook. Travel days use sails and tank data from the selected vessel.",
|
||
"active_vessel": "Vessel for this logbook",
|
||
"no_vessels_in_pool": "No vessel in the fleet — add one in your user profile first.",
|
||
"no_vessel": "No vessel selected",
|
||
"unnamed": "Unnamed",
|
||
"save": "Save vessel",
|
||
"saved": "Logbook vessel saved.",
|
||
"selection_only_hint": "You see the vessel chosen by the owner (shared logbook).",
|
||
"manage_in_profile": "Manage vessels in user profile"
|
||
},
|
||
"person_pool": {
|
||
"title": "Core Crew & skippers",
|
||
"subtitle": "Maintain your person pool here — skippers and crew for all logbooks. Select active crew per logbook and travel day from this pool.",
|
||
"loading": "Loading person pool…",
|
||
"skippers_section": "Skippers",
|
||
"crew_section": "Core Crew",
|
||
"add_skipper": "Add skipper",
|
||
"add_crew": "Add crew member",
|
||
"edit_skipper": "Edit skipper",
|
||
"no_skippers": "No skippers in the pool yet.",
|
||
"no_crew": "No crew members in the pool yet.",
|
||
"delete_confirm": "Remove this person from the pool?"
|
||
},
|
||
"logbook_crew": {
|
||
"title": "Crew for this logbook",
|
||
"subtitle": "Choose skipper and crew for this logbook. New travel days inherit this selection by default.",
|
||
"loading": "Loading crew…",
|
||
"active_skipper": "Skipper for this logbook",
|
||
"active_crew": "Crew for this logbook",
|
||
"no_skippers_in_pool": "No skipper in the pool — add one in your user profile first.",
|
||
"no_crew_in_pool": "No crew in the pool — add members in your user profile first.",
|
||
"no_skipper": "No skipper selected",
|
||
"unnamed": "Unnamed",
|
||
"save": "Save crew",
|
||
"saved": "Logbook crew saved.",
|
||
"selection_only_hint": "You see the crew set by the owner (shared logbook)."
|
||
},
|
||
"entry_crew": {
|
||
"title": "Crew on this travel day",
|
||
"subtitle": "May differ from the logbook default. Following days inherit from the previous day.",
|
||
"day_skipper": "Skipper on this day",
|
||
"day_crew": "Crew on this day",
|
||
"no_skipper": "No skipper selected",
|
||
"no_crew": "No crew selected"
|
||
},
|
||
"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 12 crew members in the pool 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_unauthorized": "Failed to fetch weather. The API key is invalid or unauthorized.",
|
||
"weather_not_found": "Failed to fetch weather. The specified location or coordinates were not found.",
|
||
"weather_bad_request": "Failed to fetch weather. No location or GPS position was specified.",
|
||
"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",
|
||
"link_qr_hint": "Scan this QR code with your phone",
|
||
"link_qr_alt": "QR code for the 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) 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, voice memos, 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 compressed .daagbok archive. 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)",
|
||
"backup_export_progress": "Packing files {{current}} / {{total}}…",
|
||
"backup_invalid_archive": "The file is not a valid backup archive.",
|
||
"backup_version_unsupported": "Legacy backup format (v1). Please use a current .daagbok backup.",
|
||
"backup_import_size_confirm": "This backup is about {{size}} uncompressed. Restore may take longer and use significant memory. Continue?",
|
||
"backup_stat_voice": "{{count}} voice memos",
|
||
"backup_stat_size": "Approx. {{size}} uncompressed",
|
||
"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",
|
||
"category_translation": "Translation error",
|
||
"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",
|
||
"event_series_title": "Event series",
|
||
"event_series_hint": "Chronological values from the event log.",
|
||
"event_series_pressure": "Barometric pressure",
|
||
"event_series_wind": "Wind",
|
||
"event_series_motor": "Engine",
|
||
"event_series_empty": "No entries yet."
|
||
},
|
||
"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. The tour covers log entries and vessel and crew selection for this logbook. Manage your fleet and core crew later in your user profile."
|
||
},
|
||
"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 for logbook",
|
||
"body": "Choose a vessel from your fleet for this logbook. Manage vessels in your user profile under Fleet & crew."
|
||
},
|
||
"profile_vessel_pool": {
|
||
"title": "Vessel fleet",
|
||
"body": "In your user profile you add all your vessels — charter yachts, your own boat, etc. Then pick the right vessel per logbook."
|
||
},
|
||
"profile_crew_pool": {
|
||
"title": "Core Crew & skippers",
|
||
"body": "In your user profile you maintain a person pool — multiple skippers (e.g. charter) and crew for all logbooks."
|
||
},
|
||
"nav_logbook_crew": {
|
||
"title": "Crew per logbook",
|
||
"body": "Pick skipper and crew from the pool for this logbook. Travel days inherit this selection by default."
|
||
},
|
||
"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"
|
||
}
|
||
}
|
||
}
|