2206 lines
118 KiB
JSON
2206 lines
118 KiB
JSON
{
|
||
"card": {
|
||
"min": "min",
|
||
"entity_not_found": "Entity not found",
|
||
"running_long": "Running long",
|
||
"stalled": "Stalled",
|
||
"remaining": "remaining",
|
||
"progress": "progress",
|
||
"show_time_remaining": "Show time remaining",
|
||
"show_percentage": "Show percentage",
|
||
"layout": {
|
||
"tile": "Tile (compact)",
|
||
"detail": "Detail (rich)",
|
||
"glance": "Glance (multiple devices)"
|
||
},
|
||
"btn": {
|
||
"pause": "Pause",
|
||
"resume": "Resume",
|
||
"terminate": "End cycle",
|
||
"record_start": "Start recording",
|
||
"record_stop": "Stop recording",
|
||
"program": "Program",
|
||
"open_panel": "Open WashData"
|
||
},
|
||
"editor": {
|
||
"layout": "Layout",
|
||
"entity": "Appliance entity",
|
||
"entities": "Appliances",
|
||
"title": "Title",
|
||
"icon": "Icon",
|
||
"show_state": "Show state",
|
||
"show_program": "Show program",
|
||
"show_progress_bar": "Show progress bar",
|
||
"spin_icon": "Spin icon while running",
|
||
"display_mode": "Detail line",
|
||
"active_color": "Active color override",
|
||
"show_phase": "Show phase",
|
||
"show_energy": "Show energy and cost",
|
||
"show_anomaly": "Show overrun warning",
|
||
"show_sparkline": "Show live power graph",
|
||
"buttons": "Action buttons",
|
||
"program_entity": "Program entity (override)",
|
||
"time_entity": "Time entity (override)",
|
||
"pct_entity": "Progress entity (override)",
|
||
"power_entity": "Power entity (override)",
|
||
"tap_action": "Tap action",
|
||
"hold_action": "Hold action",
|
||
"double_tap_action": "Double tap action"
|
||
}
|
||
},
|
||
"badge": {
|
||
"artifact_tip": "{n} anomalies detected (e.g. door opened mid-cycle) – open to see them on the graph",
|
||
"artifact_tip_one": "{n} anomaly detected (e.g. door opened mid-cycle) - open to see it on the graph",
|
||
"artifact_tip_other": "{n} anomalies detected (e.g. door opened mid-cycle) - open to see them on the graph",
|
||
"auto": "(auto-detected)",
|
||
"backfilled_tip": "Detected in imported power history. Shapes program matching only, not counted in stats.",
|
||
"built_in_tag": "built-in",
|
||
"declining": "↘ declining",
|
||
"energy_low": "Lower energy than usual",
|
||
"energy_spike": "Higher energy than usual",
|
||
"exists": "exists",
|
||
"feedback_requested": "Feedback requested",
|
||
"golden_cycle": "Recorded reference cycle",
|
||
"duration_outlier": "{n} odd-length cycle(s)",
|
||
"imported_tip": "Imported from the community store. Used for matching only, not counted in stats.",
|
||
"matcher_unused": "Not matched to your cycles yet",
|
||
"matcher_used": "Matched {n} of your cycles",
|
||
"matcher_used_one": "Matched {n} of your cycles",
|
||
"matcher_used_other": "Matched {n} of your cycles",
|
||
"matcher_used_tip": "Cycles on this appliance that WashData matched to this imported program on its own. An import that never matches may not fit your appliance; you can remove it. Counted locally; nothing is sent to the store.",
|
||
"unmatchable": "can't be matched",
|
||
"quiet_tail": "~{mins}m quiet tail",
|
||
"quiet_tail_tip": "Near the end this program goes quiet for about {mins} min, then draws about {watts} W for {secs} s. Seen in {seen} of {measured} measured cycles.",
|
||
"improving": "↗ improving",
|
||
"manual": "(manually selected)",
|
||
"needs_review": "Needs review",
|
||
"not_importable": "n/a here",
|
||
"overrun": "Ran longer than usual",
|
||
"overrun_ratio": "({x}x expected)",
|
||
"poor_fit": "poor quality",
|
||
"restart_gap_tip": "{n} HA restart gap: power trace has a hole",
|
||
"restart_gap_tip_one": "{n} HA restart gap: power trace has a hole",
|
||
"restart_gap_tip_other": "{n} HA restart gaps: power trace has holes",
|
||
"reviewed": "Reviewed",
|
||
"steady": "→ steady",
|
||
"underrun": "Finished faster than usual",
|
||
"underrun_ratio": "({pct}% of expected)",
|
||
"armed": "(applies to the next cycle)",
|
||
"awaiting_tip": "Awaiting community approval",
|
||
"awaiting_n": "Awaiting approval · {n} confirmed",
|
||
"awaiting": "Awaiting approval",
|
||
"approved": "Approved"
|
||
},
|
||
"btn": {
|
||
"log_done_task": "Log done: {task}",
|
||
"add_task": "Add task",
|
||
"add_appliance": "Add appliance",
|
||
"add_brand": "Add brand",
|
||
"add_device": "+ Add device",
|
||
"add_device_tip": "Add another WashData device",
|
||
"add_maintenance": "Add maintenance event",
|
||
"add_phase": "+ Add phase",
|
||
"add_timer": "+ Add timer",
|
||
"analyze_import": "Analyze file",
|
||
"apply_all": "Apply all",
|
||
"apply_label": "Apply Label",
|
||
"apply_split": "Apply Split",
|
||
"apply_trim": "Apply Trim",
|
||
"auto_detect_split": "Auto-detect",
|
||
"auto_label_cycles": "Auto-label cycles",
|
||
"auto_label_cycles_tip": "Name unlabelled cycles whose match confidence clears the threshold.",
|
||
"back": "Back",
|
||
"browse_community_setups": "Browse community setups",
|
||
"cancel": "Cancel",
|
||
"clear": "Clear",
|
||
"clear_debug": "Clear Debug Data",
|
||
"clear_splits": "Clear",
|
||
"close": "Close",
|
||
"compare": "Compare",
|
||
"confirm": "Confirm",
|
||
"confirm_appliance": "Confirm this appliance",
|
||
"confirmed": "Confirmed",
|
||
"connect_github": "Connect GitHub",
|
||
"convert_to_automation": "Convert to automation",
|
||
"correct": "Correct…",
|
||
"create": "Create",
|
||
"create_profile_from_gap": "Create profile",
|
||
"delete": "Delete",
|
||
"delete_group": "Delete Group",
|
||
"delete_group_tip": "Delete this group only - the member profiles are kept",
|
||
"delete_profile": "Delete Profile",
|
||
"delete_selected": "Delete selected ({n})",
|
||
"discard": "Discard",
|
||
"discard_tip": "Discard the recorded trace without saving",
|
||
"disconnect": "Disconnect",
|
||
"dismiss": "Dismiss",
|
||
"done": "Done",
|
||
"download_device": "Download this setup",
|
||
"download_export": "Download export",
|
||
"edit": "Edit",
|
||
"export": "Export",
|
||
"export_all": "Quick export everything",
|
||
"export_selected": "Export (choose data)",
|
||
"force_stop": "Force Stop",
|
||
"force_stop_tip": "Immediately end the current cycle and mark it as force-stopped",
|
||
"from_template": "From template ▾",
|
||
"hist_goto_cycles": "Show me the cycles",
|
||
"hist_import_n": "Import {n} cycles",
|
||
"hist_read_recorder": "Read from Home Assistant",
|
||
"hist_scan": "Scan for cycles",
|
||
"ignore": "Ignore",
|
||
"import": "Import",
|
||
"import_json": "Import from JSON",
|
||
"import_power_history": "Import power history",
|
||
"import_selected": "Import selected",
|
||
"inspect": "Inspect",
|
||
"label": "Label",
|
||
"load_more": "Load more",
|
||
"manage": "Manage",
|
||
"merge": "Merge",
|
||
"mute_suggestion": "Stop suggesting this setting",
|
||
"new_automation": "+ New Automation",
|
||
"new_group": "+ New Group",
|
||
"new_group_tip": "Group near-identical profiles (same shape, different temperature or spin) so matching can tell them apart.",
|
||
"new_phase": "+ New Phase",
|
||
"new_profile": "+ New Profile",
|
||
"new_profile_tip": "Create a new program profile from an existing labelled cycle or recording",
|
||
"on_cycle_finished": "On cycle finished",
|
||
"on_cycle_started": "On cycle started",
|
||
"pause_cycle": "Pause",
|
||
"pause_cycle_tip": "Pause the running cycle – the appliance will resume where it left off",
|
||
"pg_apply_best": "Apply best",
|
||
"pg_apply_to_settings_tip": "Copy the values you edited here into this device's live settings",
|
||
"pg_load_live": "Load live settings",
|
||
"pg_load_live_tip": "Re-read the integration's current settings and drop every Playground edit",
|
||
"pg_load_suggested": "Load suggested ({n})",
|
||
"pg_load_suggested_tip": "Stage the auto-tuner's current suggestions as Playground overrides",
|
||
"pg_preset_delete": "Delete preset",
|
||
"pg_preset_load": "Load preset",
|
||
"pg_preset_load_tip": "Replace the Playground values with this preset (live settings are untouched)",
|
||
"pg_preset_save": "Save as preset",
|
||
"pg_preset_save_tip": "Save every value below as a named preset for this device",
|
||
"pg_publish_all": "Publish {n} to integration",
|
||
"pg_publish_one": "Publish {label} to the integration",
|
||
"process": "Process",
|
||
"process_history": "Process Now",
|
||
"process_recording": "Save Recording",
|
||
"process_tip": "Save the recorded trace as a new or existing profile",
|
||
"rebuild": "Rebuild Envelopes",
|
||
"rebuild_envelope": "Rebuild Envelope",
|
||
"rebuild_tip": "Rebuild every profile's expected power band from its labelled cycles. Run after labelling or correcting cycles.",
|
||
"rec_start_tip": "Begin recording the appliance's power trace – start just before running a cycle",
|
||
"rec_stop": "Stop",
|
||
"rec_stop_tip": "Stop recording and hold the captured trace for review",
|
||
"record": "Start Recording",
|
||
"refresh": "Refresh",
|
||
"refresh_catalog": "Refresh catalog",
|
||
"refresh_diag_tip": "Reload storage statistics",
|
||
"refresh_settings_tip": "Reload settings from the server",
|
||
"relabel": "Relabel ({count})",
|
||
"remove": "Remove",
|
||
"remove_timer": "Delete",
|
||
"reset": "Reset",
|
||
"reset_ml_models_tip": "Discard the fine-tuned models and go back to the built-in ones. WashData can re-learn them later.",
|
||
"reset_muted": "Reset muted",
|
||
"reset_phase_tip": "Undo your edit and restore the built-in phase",
|
||
"reset_to_builtin": "Reset to built-in models",
|
||
"reset_zoom": "Reset zoom",
|
||
"resume_cycle": "Resume cycle",
|
||
"resume_cycle_tip": "Resume the paused cycle",
|
||
"retry": "Retry",
|
||
"revert": "Revert",
|
||
"revert_settings": "Revert changes",
|
||
"revert_settings_tip": "Restore settings from before your last save",
|
||
"revert_settings_tip_none": "Save first to enable undo",
|
||
"revert_to_previous": "Restore this setting to its previous value",
|
||
"review": "Review",
|
||
"run": "Run",
|
||
"run_analysis": "🔍 Run suggestion analysis",
|
||
"run_analysis_tip": "Analyze your recorded cycles now and refresh tuning suggestions",
|
||
"run_auto_label": "Run Auto-Label",
|
||
"save": "Save",
|
||
"save_access_control": "Save Access Control",
|
||
"save_group": "Save Group",
|
||
"save_panel_settings": "Save Panel Settings",
|
||
"save_phases": "Save phases",
|
||
"save_preferences": "Save Preferences",
|
||
"save_reminders": "Save reminders",
|
||
"save_review": "Save Review",
|
||
"save_settings": "Save Settings",
|
||
"save_total_cycles": "Save total",
|
||
"select": "Select",
|
||
"select_all": "Select all",
|
||
"select_none": "Clear",
|
||
"set_brand_model": "Set brand & model",
|
||
"share": "Share",
|
||
"share_device": "⬆ Share this device",
|
||
"share_device_tip": "Share this appliance and its reference cycles to the community store so owners of the same machine can adopt them.",
|
||
"share_n": "Share {n} cycle(s)",
|
||
"share_to_store": "Share to store",
|
||
"show_only": "Show only",
|
||
"split": "Split",
|
||
"stop": "Stop",
|
||
"submit_correction": "Submit Correction",
|
||
"train_now": "Train now",
|
||
"trim": "Trim",
|
||
"trim_split": "Trim / Split",
|
||
"undo": "Undo",
|
||
"undo_import": "Undo last import",
|
||
"unlabel_selected": "Unlabel selected ({n})",
|
||
"unlabel_selected_tip": "Remove the label from the selected cycles. They stay in your history but stop shaping this profile.",
|
||
"use": "Use",
|
||
"wipe_all": "Wipe All Data",
|
||
"pg_rerun": "Update simulation"
|
||
},
|
||
"note": {
|
||
"off_delay": {
|
||
"effective": "A finished cycle actually waits {eff} s, not {delay} s: Min Off Gap ({gap} s) is longer and takes precedence."
|
||
}
|
||
},
|
||
"conflict": {
|
||
"anti_wrinkle_max": {
|
||
"max": "Must be above Start Threshold ({start} W); otherwise anti-wrinkle duration limit is bypassed",
|
||
"start": "Must be below Anti-Wrinkle Max Power ({max} W)"
|
||
},
|
||
"attn_sub": "Fix conflicts before saving",
|
||
"attn_title": "Setting conflicts: {n}",
|
||
"price_entity": {
|
||
"power_sensor": "This is the device's Power Sensor, not a price. Cycles would be costed in watts per kWh; clear this field.",
|
||
"energy_sensor": "This is the device's Energy Meter, not a price. Cycles would be costed at the meter reading per kWh; clear this field.",
|
||
"device_class": "This sensor measures {dc}, not a price per kWh. Clear this field or pick a tariff sensor.",
|
||
"unit": "This sensor reads in {unit}, not a price per kWh. Clear this field or pick a tariff sensor."
|
||
},
|
||
"settings_banner": "Setting conflicts: {n}. Check the highlighted sections and fix them before saving.",
|
||
"settings_banner_btn": "Go to first",
|
||
"confidence": {
|
||
"auto": "Must be at or above Match Threshold ({match})",
|
||
"learning": "Must be at or above Match Threshold ({match})",
|
||
"match_for_auto": "Must be at or below Auto-Label Confidence ({alc})",
|
||
"match_for_learning": "Must be at or below Learning Confidence ({lc})"
|
||
},
|
||
"duration_ratio": {
|
||
"max": "Must be greater than Min Duration Ratio ({min})",
|
||
"min": "Must be less than Max Duration Ratio ({max})"
|
||
},
|
||
"hysteresis": {
|
||
"start": "Must be above Stop Threshold ({stop} W)",
|
||
"stop": "Must be below Start Threshold ({start} W)"
|
||
},
|
||
"min_power": {
|
||
"min_power": "Must be at or below Stop Threshold ({stop} W)",
|
||
"stop": "Must be at or above Min Power ({min} W)"
|
||
},
|
||
"no_update_timeout": {
|
||
"timeout": "Must be greater than Watchdog Interval ({wi} s)",
|
||
"watchdog": "Must be less than No-Update Timeout ({to} s)"
|
||
},
|
||
"off_delay": {
|
||
"gap": "Min Off Gap should be at least Off Delay ({delay} s)",
|
||
"off_delay": "Off Delay ({off_delay} s) exceeds Min Off Gap ({gap} s); consecutive cycles may merge"
|
||
},
|
||
"power_off": {
|
||
"stop": "Must be above Power Off Threshold ({pot} W)",
|
||
"threshold": "Must be below Stop Threshold ({stop} W) to take effect"
|
||
},
|
||
"pump_stuck": {
|
||
"duration": "Must be below No-Update Timeout ({to} s) so the stuck alarm can fire first",
|
||
"timeout": "Must exceed Pump Stuck Duration ({ps} s) so the stuck alarm can fire first"
|
||
},
|
||
"start_dur": {
|
||
"sampling": "Sampling Interval exceeds Start Duration ({sdt} s); single-sample spikes can open a cycle",
|
||
"threshold": "Should be at least one Sampling Interval ({si} s) to prevent single-sample false starts"
|
||
},
|
||
"unmatch": {
|
||
"match": "Must be above Unmatch Threshold ({un})",
|
||
"unmatch": "Must be below Match Threshold ({match}); otherwise a committed match un-matches instantly"
|
||
},
|
||
"cascade_toast": "Other settings adjusted for consistency: {n}",
|
||
"suggestion_resolves": "Stage the pending suggestion ({val}) below to fix this",
|
||
"use_fix": "Use {val}",
|
||
"watchdog": {
|
||
"interval": "Should be at least 2x Sampling Interval ({si} s)",
|
||
"sampling": "Sampling Interval should be at most half of Watchdog Interval ({wi} s)"
|
||
},
|
||
"end_energy": {
|
||
"energy": "Too strict for Stop Threshold ({w} W) over Off Delay ({d} s); the cycle can only end through a fallback path",
|
||
"stop": "End Energy Threshold ({e} Wh over {d} s) only permits {p} W"
|
||
}
|
||
},
|
||
"hdr": {
|
||
"custom_tasks": "Your own tasks",
|
||
"maintenance_supporter": "Need more?",
|
||
"access_control": "Access Control",
|
||
"add_maintenance": "Add Maintenance Event",
|
||
"automation_delete": "Delete this automation",
|
||
"automation_needs_review": "This cycle needs review",
|
||
"automation_open": "Open in the automation editor",
|
||
"automation_review_this_cycle": "Review this cycle",
|
||
"automations": "Automations",
|
||
"clear_debug": "Clear Debug Traces",
|
||
"community_store": "Community Store",
|
||
"diagnostics_pref": "Diagnostics",
|
||
"display": "Display",
|
||
"export_import": "Export / Import",
|
||
"import_power_history": "Import power history",
|
||
"live_power": "Live Power",
|
||
"logs": "Logs",
|
||
"maintenance": "Maintenance Actions",
|
||
"maintenance_log": "Maintenance Log",
|
||
"maintenance_reminders": "Service Reminders",
|
||
"manual_recording": "Manual Recording",
|
||
"manual_recording_tip": "Record a cycle on purpose: press Start just before the appliance starts and Stop when it finishes, then Process to save it as a profile.",
|
||
"ml_learned": "What WashData has learned",
|
||
"ml_settings_card": "Settings",
|
||
"ml_smart_learning": "Smart Learning",
|
||
"my_preferences": "My Preferences",
|
||
"no_automations": "No automations reference this device yet.",
|
||
"online_account": "Community Store & online features",
|
||
"online_account_tab": "Online & Community",
|
||
"panel_settings": "Panel Settings",
|
||
"pg_across_cycles": "Across your cycles",
|
||
"pg_detection_params": "Detection settings",
|
||
"pg_outcome": "Simulation outcome",
|
||
"pg_settings_source": "Settings source",
|
||
"phase_catalog": "Phase Catalog",
|
||
"playground": "Playground",
|
||
"process_history": "Process History",
|
||
"service_status": "Service Status",
|
||
"settings_history": "Settings history",
|
||
"status": "Status",
|
||
"status_graph": "Status Graph",
|
||
"storage_stats": "Storage Stats",
|
||
"toggle_sidebar": "Toggle Home Assistant sidebar",
|
||
"wipe_history": "Wipe History",
|
||
"live_match_debug": "Live Match Debug"
|
||
},
|
||
"health": {
|
||
"fair": "Acceptable profile quality",
|
||
"good": "✓ Good profile quality",
|
||
"poor": "⚠ Poor profile quality"
|
||
},
|
||
"lbl": {
|
||
"task_name": "Task",
|
||
"every_cycles": "Every (cycles)",
|
||
"every_days": "Every (days)",
|
||
"new_task_name": "New task",
|
||
"days_since_service": "{since} / {total} days",
|
||
"actions": "Actions",
|
||
"activity": "Activity",
|
||
"administrators": "Administrators",
|
||
"adopt_settings": "Also adopt settings",
|
||
"anonymous": "Anonymous",
|
||
"aria_compare_chart": "Cycle comparison chart",
|
||
"aria_cycle_chart": "Cycle power trace",
|
||
"aria_envelope_chart": "Profile power envelope chart",
|
||
"aria_phase_chart": "Phase editor chart",
|
||
"aria_playground_chart3": "Interactive cycle power graph: hover to read time/power, scroll or pinch to zoom, drag to pan",
|
||
"aria_power_chart": "Power consumption chart",
|
||
"aria_spaghetti_chart": "Overlaid cycle power traces",
|
||
"artifact_anomaly": "Anomaly",
|
||
"artifact_high_power": "High power",
|
||
"artifact_interruption": "Interruption",
|
||
"artifact_low_power": "Low power",
|
||
"at": "at",
|
||
"auto_detect": "Auto-detect",
|
||
"auto_fine_tune_off": "auto fine-tune off",
|
||
"auto_fine_tune_on": "auto fine-tune on (around {hour}:00)",
|
||
"avg_cost": "Avg cost",
|
||
"cat_backfill_cycles": "Cycles found in imported power history",
|
||
"cat_custom_phases": "Custom phases",
|
||
"cat_feedback": "Feedback & review labels",
|
||
"cat_history_logs": "History & change logs",
|
||
"cat_lifetime_stats": "Lifetime totals",
|
||
"cat_maintenance_log": "Maintenance log",
|
||
"cat_ml_models": "ML models",
|
||
"cat_profile_groups": "Profile groups",
|
||
"cat_profiles": "Profiles (programs)",
|
||
"cat_real_cycles": "Cycles (run history)",
|
||
"cat_reference_cycles": "Reference cycles (imported)",
|
||
"cat_settings": "Detection & matching settings",
|
||
"cat_suggestions": "Suggestions",
|
||
"change": "Change",
|
||
"click_to_select": "click to select",
|
||
"clock_time": "Clock time",
|
||
"cohesion_good": "cohesion {pct}%",
|
||
"cohesion_low": "⚠ low cohesion {pct}%",
|
||
"compare_profiles": "Compare with profiles",
|
||
"confidence": "Confidence",
|
||
"confidence_threshold": "Confidence threshold",
|
||
"conflict_import_copy": "Import as copy",
|
||
"conflict_keep_mine": "Keep mine",
|
||
"conflict_overwrite": "Overwrite",
|
||
"conflict_resolution": "Name clashes",
|
||
"correct_duration": "Correct Duration (min, optional)",
|
||
"correct_profile": "Correct Profile",
|
||
"cost": "Cost",
|
||
"create_new_profile": "+ Create new profile…",
|
||
"current_phase": "Current phase",
|
||
"cycle": "Cycle",
|
||
"cycle_date_display": "Cycle date display",
|
||
"cycle_context": "Recorder history around the cycle",
|
||
"cycle_context_off": "Off",
|
||
"cycle_context_minutes": "{min} min",
|
||
"cycle_context_series": "Recorder history",
|
||
"before_start": "Before start",
|
||
"after_end": "After end",
|
||
"cycle_destination": "Where should imported cycles go?",
|
||
"cycles_count": "Cycles",
|
||
"cycles_lc": "cycles",
|
||
"cycles_short": "cycles",
|
||
"cycles_title": "Cycles ({n})",
|
||
"date": "Date",
|
||
"debug_traces": "Debug Traces",
|
||
"device_unresolved": "Unavailable device ({id})",
|
||
"default_access_level": "Default level for users not listed below",
|
||
"default_other": "Default (other devices)",
|
||
"default_tab": "Default tab when opening the panel",
|
||
"description": "Description",
|
||
"dest_real_history": "Real history (counts in stats)",
|
||
"dest_reference": "Reference (shape only)",
|
||
"drag_to_resize": "Drag to resize",
|
||
"duration": "Duration",
|
||
"duration_avg": "~{v}m avg",
|
||
"enable_access_control": "Enable per-user access control",
|
||
"enable_online": "Enable online features",
|
||
"end": "End",
|
||
"energy": "Energy",
|
||
"envelope": "Envelope",
|
||
"eta_mins": "~{n}m left",
|
||
"eta_secs": "~{n}s left",
|
||
"event_type": "Event type",
|
||
"evidence_backfill_cycles": "Found in imported power history",
|
||
"evidence_real_cycles": "Cycles this machine ran",
|
||
"evidence_reference_cycles": "Downloaded from the community store",
|
||
"expected": "Expected",
|
||
"suspected_profile": "{name} (suspected)",
|
||
"runner_up_profile": "{name} (runner-up)",
|
||
"expected_duration": "Expected Duration (min)",
|
||
"file_kb": "File (kB)",
|
||
"flags": "Flags",
|
||
"font_size": "Panel font size",
|
||
"from": "From",
|
||
"from_start": "From start",
|
||
"gap_s": "Gap (s)",
|
||
"group_name": "Group name",
|
||
"ha_restarted": "HA restarted",
|
||
"head_trim": "Head Trim (s)",
|
||
"hide_tabs": "Hide tabs for non-admins",
|
||
"hist_csv_data": "CSV data",
|
||
"hist_from_recorder": "Or read it from Home Assistant",
|
||
"hist_keep": "Keep this cycle",
|
||
"hist_looks_complete": "complete",
|
||
"hist_reason_no_end": "never ended cleanly",
|
||
"hist_reason_short": "shorter than this appliance's shortest real cycle",
|
||
"hist_since": "Since",
|
||
"hist_skip_idle": "nothing running",
|
||
"hist_skip_long": "no break long enough to split on",
|
||
"hist_skip_short": "too few readings",
|
||
"hist_skip_sparse": "readings too far apart",
|
||
"import_mode": "How to combine",
|
||
"include_phase_map": "Include phase map",
|
||
"include_settings": "Include detection & matching settings",
|
||
"input": "Input:",
|
||
"json_data": "JSON Data",
|
||
"label": "Matched program",
|
||
"last": "Last",
|
||
"last_checked": "Last checked:",
|
||
"load_from_file": "Load from file",
|
||
"loading_paren": "(loading…)",
|
||
"manual_duration": "Manual Duration (min, optional)",
|
||
"match": "Match",
|
||
"members": "Members",
|
||
"mode_existing_profile": "Add to Existing Profile",
|
||
"mode_merge": "Merge (keep mine)",
|
||
"mode_new_profile": "Create New Profile",
|
||
"mode_replace": "Replace selected",
|
||
"models_fine_tuned": "(fine-tuned models: {count})",
|
||
"n_imported_note": ", {n} imported",
|
||
"n_selected": "{n} selected",
|
||
"n_shown": ", {n} shown",
|
||
"n_tuning_suggestions": "{n} tuning suggestion",
|
||
"n_tuning_suggestions_one": "{n} tuning suggestion",
|
||
"n_tuning_suggestions_other": "{n} tuning suggestions",
|
||
"name_placeholder": "(name)",
|
||
"new_profile_name": "New Profile Name",
|
||
"no_duration": "no duration",
|
||
"notes": "Notes",
|
||
"panel_default_tab": "Default tab",
|
||
"panel_language": "Panel language",
|
||
"pct_match_confidence": "{pct}% match confidence",
|
||
"peak_power_short": "Peak",
|
||
"per_cycle_short": "cycle",
|
||
"pg_alert_ambiguous": "Ambiguous match",
|
||
"pg_alert_did_not_finish": "Did not finish",
|
||
"pg_alert_energy": "Energy anomaly",
|
||
"pg_alert_false_end": "Split into multiple cycles",
|
||
"pg_alert_indefinite": "Would run indefinitely",
|
||
"pg_alert_overrun": "Overrun",
|
||
"pg_alert_timeout_end": "Ended by timeout, not prediction",
|
||
"pg_alert_underrun": "Underrun",
|
||
"pg_alert_unmatched": "Unmatched",
|
||
"pg_anti_wrinkle": "Anti-wrinkle",
|
||
"pg_best_value": "Best value found",
|
||
"pg_broke": "broke",
|
||
"pg_current_value": "Current value:",
|
||
"pg_detecting": "Detecting",
|
||
"pg_drag_hint": "Drag line on graph",
|
||
"pg_end_timing_changed": "end-timing changed",
|
||
"pg_ended": "Ended",
|
||
"pg_ev_ambiguous": "Ambiguous",
|
||
"pg_ev_detected": "Detected",
|
||
"pg_ev_ending": "Ending",
|
||
"pg_ev_finished": "Finished",
|
||
"pg_ev_match": "Match committed",
|
||
"pg_ev_match_changed": "Match changed",
|
||
"pg_ev_notify_finish": "Finish notification",
|
||
"pg_ev_notify_held": "Notification held (quiet hours)",
|
||
"pg_ev_notify_milestone": "Milestone notification",
|
||
"pg_ev_notify_pre": "Almost-done notification",
|
||
"pg_ev_notify_start": "Start notification",
|
||
"pg_ev_running": "Running",
|
||
"pg_ev_unmatched": "Unmatched",
|
||
"pg_fixed": "fixed",
|
||
"pg_group_advanced": "Edge cases",
|
||
"pg_group_detection": "Detection triggers",
|
||
"pg_group_matching": "Program matching",
|
||
"pg_group_timing": "Timing rules",
|
||
"pg_idle": "Idle",
|
||
"pg_load_run": "Reload this run",
|
||
"pg_match_confidence": "Match confidence",
|
||
"pg_mode_history": "Test on history",
|
||
"pg_mode_optimize": "Optimize",
|
||
"pg_newly_correct": "newly correct",
|
||
"pg_obj_ambiguity": "Ambiguity rate",
|
||
"pg_obj_endtiming": "End-timing accuracy",
|
||
"pg_obj_falseend": "False-end rate",
|
||
"pg_obj_match": "Match accuracy",
|
||
"pg_obj_overrun": "Duration off-target",
|
||
"pg_objective": "Objective",
|
||
"pg_poor_match": "Poor match",
|
||
"pg_preset": "Playground preset",
|
||
"pg_preset_name": "New preset name",
|
||
"pg_preset_none": "Select a preset…",
|
||
"pg_proj_energy": "Proj. energy",
|
||
"pg_recent_runs": "Recent runs",
|
||
"pg_regressed": "regressed",
|
||
"pg_steps": "Steps",
|
||
"pg_strong_match": "Strong match",
|
||
"pg_sweep_param": "Parameter",
|
||
"pg_time_left_model": "Time left (model)",
|
||
"pg_time_left_model_tip": "Estimated from the program's phases, not a fixed countdown",
|
||
"pg_vs_current": "vs current",
|
||
"pg_weak_match": "Weak match",
|
||
"pg_zoom_hint": "double-click to reset zoom",
|
||
"phase": "Phase",
|
||
"phase_name": "Phase Name",
|
||
"name": "Name",
|
||
"phase_timeline": "Phase timeline",
|
||
"power": "Power",
|
||
"profile": "Profile",
|
||
"profile_name": "Profile Name",
|
||
"program": "Program",
|
||
"program_tip": "Choose which program the current cycle is matched to. Auto-detect picks the best match. Pin a program when auto-detect is wrong; pick one before starting and it applies to the next cycle.",
|
||
"progress": "Progress",
|
||
"envelope_position": "curve {pct}%",
|
||
"envelope_position_tip": "Position on the matched program's recorded curve: {pct}%. Found by aligning the cycle to the profile, so it stays right when a run is longer or shorter. Updates while the appliance is quiet, so it can lag.",
|
||
"quality": "Quality",
|
||
"raw_socket": "Raw socket",
|
||
"ref_cycle": "Reference Cycle (optional)",
|
||
"remaining": "Remaining",
|
||
"reminder_every": "Remind every (cycles)",
|
||
"remove_label": "- Remove label -",
|
||
"rename_profile": "Rename Profile",
|
||
"resulting_profile": "Resulting profile",
|
||
"reviewed_on": "reviewed {date}",
|
||
"save_mode": "Save Mode",
|
||
"seconds_from_start": "Seconds from start",
|
||
"select_profile": "Select Profile",
|
||
"setting": "Setting",
|
||
"settings_advanced": "Advanced",
|
||
"settings_basic": "Basic",
|
||
"settings_detail_level": "Settings detail level",
|
||
"shape": "Shape",
|
||
"show_contributor": "Show contributor names",
|
||
"show_debug": "Show live match debug card on the Status page (confidence, ambiguity, top candidates)",
|
||
"show_expected": "Show expected curve overlay (matched profile, orange)",
|
||
"show_raw": "Show raw socket toggle in live power graph",
|
||
"sparkline": "Recent cycle-duration trend",
|
||
"start": "Start",
|
||
"status": "Status",
|
||
"tags": "Tags",
|
||
"tail_trim": "Tail Trim (s)",
|
||
"task_history_import": "Scanning power history",
|
||
"task_history_import_apply": "Importing cycles",
|
||
"task_merge": "Merging cycles",
|
||
"task_ml_training": "Learning",
|
||
"task_pg_detail": "Simulate cycle",
|
||
"task_pg_history": "Test on history",
|
||
"task_pg_sweep": "Optimize",
|
||
"task_rebuild": "Rebuilding envelopes",
|
||
"task_reprocess": "Reprocessing",
|
||
"task_split": "Splitting cycle",
|
||
"task_trim": "Trimming cycle",
|
||
"time_remaining": "~{v} remaining",
|
||
"timer_auto_pause": "Auto-pause",
|
||
"timer_min": "min",
|
||
"timer_msg_placeholder": "Message (optional, {device}/{program}/{minutes})",
|
||
"to": "To",
|
||
"to_end": "To end",
|
||
"ungrouped": "Ungrouped",
|
||
"unit_s": "(s)",
|
||
"unknown": "Unknown",
|
||
"unlabelled": "Unlabelled",
|
||
"unlabelled_paren": "(unlabelled)",
|
||
"tap_to_dismiss": "tap the chart to dismiss",
|
||
"zoom_hint": "scroll to zoom · dblclick to reset",
|
||
"zoom_hint_touch": "pinch to zoom",
|
||
"zoom_hint_touch_zoomed": "pinch to zoom · double-tap to reset",
|
||
"cycles_since_service": "{since} / {total} cycles",
|
||
"total_cycles_run": "cycles run in total",
|
||
"correct_total_cycles": "Correct the total",
|
||
"hist_reason_already_recorded": "overlaps a cycle WashData already recorded",
|
||
"share_consent": "I confirm these cycles ran to normal completion without interruption",
|
||
"show_internal": "Show internal settings",
|
||
"show_internal_tip": "Settings WashData tunes for you (sampling, watchdog, match cadence, thresholds). Shown when this device has its own value, a conflict or a suggestion.",
|
||
"rate_n": "{n} stars",
|
||
"rate_quality": "Rate quality",
|
||
"pg_autolabel": "Auto-label",
|
||
"pg_label_review": "Asks for review",
|
||
"pg_ev_match_reverted": "Match reverted",
|
||
"pg_ev_verified_pause": "Verified pause",
|
||
"n_samples": "{n} samples",
|
||
"n_samples_one": "{n} sample",
|
||
"n_samples_other": "{n} samples",
|
||
"n_cycles": "{n} cycles",
|
||
"n_cycles_one": "{n} cycle",
|
||
"n_cycles_other": "{n} cycles",
|
||
"energy_per_cycle": "{v}/cycle",
|
||
"energy_total": "{v} total",
|
||
"automation_off": "(off)",
|
||
"ref_cycle_none": "None",
|
||
"share_name": "Show my name on what I share",
|
||
"pg_compare_profile": "Compare with profile",
|
||
"pg_obj_endlag": "End delay (median)",
|
||
"pg_obj_early": "Early-end rate",
|
||
"pg_obj_split": "Split rate",
|
||
"pg_sweep_cycles": "Recent cycles"
|
||
},
|
||
"log": {
|
||
"all_levels": "All levels",
|
||
"all_devices": "All devices",
|
||
"all_components": "All components",
|
||
"search_ph": "Search logs…"
|
||
},
|
||
"maint": {
|
||
"salt": "Refill salt",
|
||
"rinse_aid": "Refill rinse aid",
|
||
"lint_filter": "Clean lint filter",
|
||
"condenser_clean": "Clean condenser",
|
||
"descale": "Descale",
|
||
"filter_clean": "Clean filter",
|
||
"drum_clean": "Clean drum",
|
||
"bearing_service": "Bearing service",
|
||
"other": "Other"
|
||
},
|
||
"ml": {
|
||
"builtin_models": "● Using built-in models",
|
||
"fit_good": "Good",
|
||
"fit_slight": "Slight",
|
||
"fit_strong": "Strong",
|
||
"fit_word": "fit",
|
||
"personalized": "● Personalized to this machine",
|
||
"better_than_baseline": "{pct}% better than the baseline estimate ({metric})",
|
||
"trend_improving_tip": "This model's fit has improved across recent re-checks.",
|
||
"trend_declining_tip": "This model's fit has slipped across recent re-checks – reviewing more cycles may help it re-learn.",
|
||
"trend_steady_tip": "This model's fit has held roughly steady across recent re-checks.",
|
||
"cap_label": {
|
||
"total_energy": "Energy estimate"
|
||
},
|
||
"cap_blurb": {
|
||
"total_energy": "Predicting total energy and cost"
|
||
},
|
||
"metric_mae": "error {model} vs {baseline} baseline",
|
||
"fine_tuned_at": "fine-tuned {when}",
|
||
"never": "never",
|
||
"trained_unknown": "at an unknown time",
|
||
"held_out_count": "measured on {count} held-out cycles",
|
||
"held_out_count_one": "measured on {count} held-out cycle",
|
||
"held_out_count_other": "measured on {count} held-out cycles",
|
||
"last_run_not_promoted": "Last check ({when}): {reason}",
|
||
"skip_reason": {
|
||
"insufficient_rows": "Not enough usable cycles yet: {count} labelled, clean cycles so far.",
|
||
"insufficient_rows_one": "Not enough usable cycles yet: {count} labelled, clean cycle so far.",
|
||
"insufficient_rows_other": "Not enough usable cycles yet: {count} labelled, clean cycles so far.",
|
||
"holdout_too_small": "Too few cycles to test a new model fairly: {held_out} could be set aside for testing, {min} are needed.",
|
||
"not_better_than_naive": "The new model was not clearly better than the simple estimate (error {model} vs {naive}).",
|
||
"not_better_than_incumbent": "The new model was not better than the one in use (error {model} vs {incumbent}), so the current one was kept.",
|
||
"fit_failed": "Training failed: {error}",
|
||
"unknown": "Nothing new was learnt."
|
||
}
|
||
},
|
||
"modal": {
|
||
"remove_task_title": "Remove Task",
|
||
"remove_task_msg": "Remove the reminder \"{task}\"? Its entries in the maintenance log are kept.",
|
||
"apply_suggestions_msg": "Change these {n} settings? The integration reloads after saving.",
|
||
"apply_suggestions_title": "Apply suggestions",
|
||
"auto_label": "Auto-Label Cycles",
|
||
"clear_debug_msg": "Delete all stored debug traces?",
|
||
"clear_debug_title": "Clear Debug Data",
|
||
"correct_feedback": "Correct Feedback",
|
||
"create_profile": "Create Profile",
|
||
"cycle": "Cycle",
|
||
"delete_automation_msg": "Delete the automation \"{name}\" from Home Assistant? This cannot be undone.",
|
||
"delete_automation_title": "Delete Automation",
|
||
"delete_maintenance_msg": "Delete this maintenance record? This cannot be undone.",
|
||
"delete_maintenance_title": "Delete Maintenance Event",
|
||
"delete_phase_msg": "Delete phase \"{name}\"?",
|
||
"delete_phase_title": "Delete Phase",
|
||
"discard_recording_msg": "Discard the saved recording? This cannot be undone.",
|
||
"discard_recording_title": "Discard Recording",
|
||
"discard_settings_msg": "{n} setting change(s) are not saved yet. Leave Settings and discard them?",
|
||
"discard_settings_title": "Discard unsaved changes?",
|
||
"dismiss_all_msg": "Dismiss all {count} pending feedback requests?",
|
||
"dismiss_all_ok": "Dismiss All",
|
||
"dismiss_all_title": "Dismiss All Feedbacks",
|
||
"edit_group": "Edit profile group",
|
||
"edit_phase": "Edit Phase",
|
||
"export_select": "Export - choose data",
|
||
"force_stop_msg": "Force-stop the active cycle now? The cycle will be saved as interrupted.",
|
||
"force_stop_title": "Force Stop Cycle",
|
||
"history_import": "Import power history",
|
||
"import_wizard": "Import - choose data",
|
||
"label_cycle": "Label Cycle",
|
||
"merge_cycles": "Merge {n} Cycles",
|
||
"new_group": "New profile group",
|
||
"new_phase": "New Phase",
|
||
"process_history_msg": "Re-run matching, refresh suggestions, retrain ML (if enabled), recost cycles against recorded energy prices and recompute cycle health across all stored cycles. This may take a while.",
|
||
"process_history_ok": "Process",
|
||
"process_history_title": "Process History",
|
||
"process_recording": "Process Recording",
|
||
"relabel_cycles": "Relabel {count} cycles",
|
||
"remove_legacy_msg": "Remove the legacy custom actions? They will stop firing on cycle events. This cannot be undone from the panel.",
|
||
"remove_legacy_title": "Remove Legacy Actions",
|
||
"reset_phase_msg": "Undo your edit of \"{name}\" and restore the built-in phase? Programs keep their ranges.",
|
||
"reset_phase_title": "Reset Phase",
|
||
"store_import": "Import reference cycle",
|
||
"store_share": "Share to community store",
|
||
"store_share_device": "Share this device",
|
||
"undo_import_msg": "This device's data and settings go back to how they were before the last import ({when}). Cycles recorded and changes made since then are lost.",
|
||
"undo_import_ok": "Undo import",
|
||
"undo_import_title": "Undo last import",
|
||
"wipe_all_msg": "⚠️ This permanently deletes ALL cycles and profiles. This cannot be undone.",
|
||
"wipe_all_ok": "Wipe Everything",
|
||
"wipe_all_title": "Wipe All Data",
|
||
"profile_title": "Profile · {name}"
|
||
},
|
||
"msg": {
|
||
"custom_task_limit": "You have reached the limit of {max} tasks.",
|
||
"custom_tasks_intro": "Add anything else you want to be reminded of. A task is due when either interval is reached; leave one blank or 0 to use only the other.",
|
||
"maintenance_due_sensor_hint": "The Maintenance due binary sensor is on while any task is due, for your own notification automations.",
|
||
"maintenance_supporter_intro": "Maintenance Supporter is a separate integration that does much more: any appliance or task, schedules by time, usage or a sensor, notifications and a history. It can use the WashData cycle counter.",
|
||
"adopt_settings_hint": "Overwrite this device's detection & matching thresholds with the shared ones. Your notifications, entities and energy price are never changed.",
|
||
"advisory_duration_trend_up": "'{name}' cycles keep getting longer (about +{pct}% per cycle). If the appliance changed, re-record or rebuild this profile.",
|
||
"advisory_energy_trend_up": "'{name}' uses more energy each cycle (about +{pct}% per cycle). Check the appliance if that is unexpected.",
|
||
"advisory_poor_health": "'{name}' fits poorly: its recent cycles vary a lot or match weakly. Review its cycles or re-record it to keep matching and estimates accurate.",
|
||
"advisory_shape_drift": "'{name}' has drifted from its original power shape, perhaps from limescale or wear. Consider re-recording it with recent cycles.",
|
||
"advisory_shape_drift_corr": "'{name}' has drifted from its original power shape (correlation {corr}), perhaps from limescale or wear. Consider re-recording it with recent cycles.",
|
||
"advisory_unmatchable": "'{name}' can never match: no cycle with power data is behind it. Label or record a cycle of this program to fix it.",
|
||
"advisory_unmatchable_no_duration": "'{name}' can never match: its cycle has no usable duration. Re-record this program or set its expected duration.",
|
||
"analyzing": "Analyzing…",
|
||
"appliance_monitor": "Appliance monitor",
|
||
"artifact_dip_detail": "Dropped below the usual power band for ~{n}s.",
|
||
"artifact_footer": "Highlighted on the graph above. These are transient artifacts (e.g. the door opened mid-cycle), not necessarily problems.",
|
||
"artifact_header": "{n} anomalies detected during this cycle",
|
||
"artifact_header_one": "{n} anomaly detected during this cycle",
|
||
"artifact_header_other": "{n} anomalies detected during this cycle",
|
||
"artifact_pause_detail": "Power dropped to near zero for ~{n}s, then resumed. The door was probably opened or the cycle paused.",
|
||
"artifact_spike_detail": "Drew above the usual power band for ~{n}s.",
|
||
"auto_label_intro": "Assign profiles to unlabelled cycles whose match confidence clears the threshold.",
|
||
"automations_intro": "WashData fires {start} / {end} events and exposes entities, so notifications and actions are best built as normal Home Assistant automations. Automations that use this device appear below.",
|
||
"cleanup_intro": "All labelled cycles overlaid. Tick outliers, then unlabel them (kept in history, no longer shaping this profile) or delete them.",
|
||
"clear_debug_hint": "Remove stored debug data to free space.",
|
||
"collecting_data": "Collecting data. Cycles still needed before fine-tuning can start: {need} ({current}/{min}).",
|
||
"compare_overlay_profiles": "Overlay profiles (faint)",
|
||
"compare_overlay_tip": "Overlay learned profile envelopes to see which program each cycle resembles.",
|
||
"compare_profiles_tip": "Overlay other profiles on the chart to see which fits this cycle best.",
|
||
"compare_selected_cycles": "Selected cycles (solid) – show / hide",
|
||
"cycles_deleted": "{count} cycle(s) deleted",
|
||
"cycle_context_loading": "Loading recorder history…",
|
||
"cycle_context_note": "Grey: the power sensor's recorder history around this cycle. It is not part of the cycle and does not affect duration, energy or matching.",
|
||
"cycle_context_none": "The recorder holds no readings around this cycle (Home Assistant keeps 10 days of history by default).",
|
||
"cycle_context_tip": "Display only: shows the power sensor's recorder history around this cycle, if still kept. To add failed start attempts to future cycles, use Curve Pre-roll (Settings > Detection > Cycle Start), which changes stored durations.",
|
||
"dest_real_history_hint": "Imported cycles count as this device's own history and statistics. Use this to move an appliance to a new install.",
|
||
"dest_reference_hint": "Imported cycles only improve program matching and never affect usage/energy statistics.",
|
||
"device_type_mismatch_warn": "This export is from a different appliance type ({src} vs {local}). Programs and cycles can still be imported as reference data, but not device settings or real history.",
|
||
"diagnostics_load_failed": "Could not load diagnostics: {error}",
|
||
"enough_data": "Enough data to learn from ({current}/{min} cycles).",
|
||
"export_description": "Choose exactly which profiles, cycles, settings and more to export to JSON, or analyze a file and import only the parts you want.",
|
||
"export_select_intro": "Tick what to include. Profiles without their cycles still export a matchable program.",
|
||
"feedback_cycles_pending": "To review: {n}",
|
||
"feedback_prompt": "Confirm it was right, correct the program, or ignore.",
|
||
"feedback_relabel_hint": "Re-labelling this cycle resolves it too.",
|
||
"filter_by_profile": "Filter by profile…",
|
||
"font_size_hint": "Make everything in this panel larger or smaller. Applies to your account on this device.",
|
||
"group_modal_help": "Group programs with the same shape that differ in temperature or spin. Matching scores the group as one, then picks the best-fitting member. Pick at least 2; the overlay shows how alike they are.",
|
||
"group_not_cohesive": "These profiles aren't similar enough to group reliably, so matching treats them individually until you remove the outlier or split the group.",
|
||
"group_preview_hint": "Tick 2+ members to preview and compare their power curves.",
|
||
"head_trim_hint": "Remove this many seconds from the start",
|
||
"hist_breaks": "{n} gaps where the sensor was unavailable",
|
||
"hist_capped": "The per-device limit for imported cycles was reached; the rest were not stored.",
|
||
"hist_duplicates": "{n} were already imported and were skipped.",
|
||
"hist_entity_substituted": "read {used} (this device is configured for {wanted})",
|
||
"hist_found": "Found {n} cycles. Untick anything that does not look like a real run - nothing is stored until you import.",
|
||
"hist_import_failed": "Import failed.",
|
||
"hist_imported_count": "{n} cycles imported.",
|
||
"hist_input_hint": "Upload a CSV from the History panel (entity, state, last changed), or let WashData read the sensor's history directly. Live detection runs over it and you choose which cycles to keep.",
|
||
"hist_next_step": "They are in your Cycles list, tagged as imported history. Open one and use Label to name its program.",
|
||
"hist_none_found": "No cycles could be detected in that history.",
|
||
"hist_other_entity": "{n} readings for other entities ignored",
|
||
"hist_recorder_empty": "Home Assistant has no detailed history for this sensor in that window.",
|
||
"hist_recorder_hint": "Reads from the date you pick until now. Home Assistant keeps detailed history for 10 days by default; older hourly averages are too coarse for cycle detection.",
|
||
"hist_rows_read": "{n} readings read",
|
||
"hist_scan_capped": "Only the first candidates are shown ({n} were found).",
|
||
"hist_scan_expired": "That scan is no longer available. Scan again.",
|
||
"hist_scan_failed": "Scanning failed.",
|
||
"hist_scanning": "Running your history through the detector in the background. You can close this dialog and come back.",
|
||
"hist_settings_used": "Detected using this device's current settings (minimum power {w} W, off delay {s} s).",
|
||
"hist_skipped_spans": "Skipped stretches",
|
||
"import_analyze_hint": "Load an exported file (or paste its JSON). WashData shows what can be imported before anything changes.",
|
||
"import_history_description": "Had a smart plug before WashData? Upload its power history or read it from Home Assistant. Detection runs over it, and past cycles appear in your Cycles list ready to name.",
|
||
"import_undo_hint": "A restore point from before the last import ({when}) is kept: {profiles} profile(s) and {cycles} cycle(s).",
|
||
"imported_history_readonly": "Found in imported power history. It helps matching but is not counted in your statistics and cannot be trimmed or split. Label it to name the program.",
|
||
"imported_readonly": "Imported from the community store. Used for reference and matching, not counted in your stats, and cannot be edited.",
|
||
"include_settings_hint": "Share this device's detection and matching thresholds (not notifications, entities or energy price). Others choose whether to apply them.",
|
||
"legacy_actions_title": "{count} legacy custom action still running",
|
||
"legacy_actions_title_one": "{count} legacy custom action still running",
|
||
"legacy_actions_title_other": "{count} legacy custom actions still running",
|
||
"live_chart_loading": "Live power chart appears as readings arrive.",
|
||
"loading": "Loading…",
|
||
"loading_curve": "Loading curve…",
|
||
"loading_settings": "Loading settings…",
|
||
"log_buffer_hint": "Newest first · buffers the last 500 ha_washdata records since restart · drag the bottom edge to resize.",
|
||
"maintenance_due": "Maintenance due: {items}",
|
||
"maintenance_intro": "Log servicing on this appliance and get reminded when each task is due again.",
|
||
"maintenance_load_error": "Could not load maintenance data: {error}",
|
||
"maintenance_requires_access": "Maintenance and export/import require full access.",
|
||
"manual_duration_hint": "The profile's expected cycle length, used for time-remaining estimates. Leave it unchanged to keep the current value.",
|
||
"manual_duration_ref_hint": "Only used without a reference cycle; a reference cycle sets the duration from its own length.",
|
||
"duration_learned_hint": "Worked out from this program's cycles (outliers left out) and updated after each new one. To change it, trim or remove the cycles that are off.",
|
||
"merge_hint": "Imported items are added; nothing local is lost. Name clashes are resolved below.",
|
||
"merge_intro": "The selected cycles are combined into one (chronological order; gaps filled with 0 W). Pick the resulting profile.",
|
||
"merge_no_imports": "Imported recordings cannot be merged into a real cycle. Deselect them to merge.",
|
||
"ml_intro": "WashData ships with smart models that work out of the box.",
|
||
"ml_learned_intro": "Models fine-tuned to this machine.",
|
||
"ml_settings_intro": "Two independent switches: one applies the models while a cycle runs, the other lets WashData fine-tune them to your machine over time.",
|
||
"n_suggestions_muted": "{count} muted; the auto-tuner will not propose these.",
|
||
"n_suggestions_muted_one": "{count} suggestion muted; the auto-tuner will not propose it.",
|
||
"n_suggestions_muted_other": "{count} suggestions muted; the auto-tuner will not propose these.",
|
||
"no_cycles_match": "No cycles match the current filter.",
|
||
"no_cycles_profile": "No cycles for this profile.",
|
||
"no_cycles_selected": "Select at least one cycle first.",
|
||
"no_cycles_yet": "No cycles recorded yet.",
|
||
"no_device_selected": "No device selected.",
|
||
"no_devices": "No WashData devices configured yet.",
|
||
"no_envelope": "No envelope yet - rebuild after labelling cycles.",
|
||
"no_envelope_overlay": "No envelope available to overlay.",
|
||
"no_fine_tuned": "Nothing fine-tuned yet – WashData is using its built-in models.",
|
||
"no_logs": "No log records buffered yet.",
|
||
"no_logs_match": "No log records match these filters.",
|
||
"no_maintenance": "No maintenance recorded yet.",
|
||
"no_match_yet": "No match attempt yet - this populates during a running cycle.",
|
||
"no_other_users": "No other Home Assistant users found.",
|
||
"no_phases": "No phases defined.",
|
||
"no_phases_assigned": "No phases assigned.",
|
||
"no_profiles_compare": "No profiles to compare.",
|
||
"no_profiles_overlay": "No profiles to overlay.",
|
||
"no_profiles_yet": "No profiles yet. Create one from a labelled cycle.",
|
||
"no_profiles_option": "(no profiles yet - add one)",
|
||
"no_profiles_yet_short": "No profiles yet.",
|
||
"no_reminders_set": "No service reminders are set yet.",
|
||
"no_settings_match": "No settings match \"{q}\"",
|
||
"no_split_points": "No split points yet.",
|
||
"no_suggestions": "No active suggestions.",
|
||
"notify_services_hint": "Use {entity} service IDs (comma-separated for multiple). Template variables: {vars}.",
|
||
"odometer_correct_hint": "Set this if WashData counted a run that never happened, or the appliance ran cycles before WashData was installed.",
|
||
"odometer_intro": "This total only goes up. Deleting a cycle does not lower it, so service reminders stay correct.",
|
||
"old_actions_warning": "Configured with the old actions editor (now removed). They still fire on cycle events but can no longer be edited here. Convert them into a normal automation, or remove them.",
|
||
"onboard_download": "New device? Adopt a ready-made setup (programs, reference cycles and phases) from another WashData user with the same appliance.",
|
||
"online_intro_global": "Browse and share reference recordings with other WashData users. One connection covers all your WashData devices; brand and model are set per device under Basic. Online features are off until you turn them on.",
|
||
"online_unavailable": "Online features are not available on this server.",
|
||
"pending_feedback": "Pending detection feedback",
|
||
"performance_trend": "Performance trend ({n} cycles)",
|
||
"pg_analysis_hint2": "Pick a cycle and press Run to load match analysis.",
|
||
"pg_apply_confirm": "Apply best value: {label} = {value}?",
|
||
"pg_apply_settings_confirm": "Save these {n} setting(s) to this device? {list}",
|
||
"pg_canvas_empty3": "Pick a cycle above and press Run to simulate it. Then hover to read values, scroll or pinch to zoom, and drag to pan.",
|
||
"pg_ctrl_intro": "Values start from this device's live integration settings. Edits stay in the Playground until you publish them.",
|
||
"pg_history_empty": "Press Run to replay your cycles.",
|
||
"pg_history_intro2": "Replay recent cycles through the real detector and matcher with the settings above. Click a row to load it in the graph; change a setting to compare before and after.",
|
||
"pg_history_summary": "{detected}/{total} detected · {correct} matched correctly",
|
||
"pg_in_sample_note": "These cycles helped build the profiles they are matched against, so results are optimistic: expect slightly fewer correct matches on new cycles.",
|
||
"pg_live_unavailable": "Live settings unavailable, showing defaults.",
|
||
"pg_load_live_confirm": "Discard {n} Playground edit(s) and reload the integration's current settings?",
|
||
"pg_matches_live": "Matches live settings",
|
||
"pg_n_changed": "{n} changed vs live settings",
|
||
"pg_no_alerts": "No issues detected in this run.",
|
||
"pg_override_active": "Using your edited settings vs. current",
|
||
"pg_preset_delete_confirm": "Delete the preset \"{name}\"?",
|
||
"pg_preset_limit": "Preset limit reached ({n})",
|
||
"pg_preset_overwrite": "Overwrite the preset \"{name}\"?",
|
||
"pg_publish_one_confirm": "Save {label} = {value} to this device's settings?",
|
||
"pg_restart_note": "Restart Home Assistant to enable simulation tools.",
|
||
"pg_row_load_hint": "Load this cycle in the graph above",
|
||
"pg_simulating": "Simulating cycle…",
|
||
"pg_sugg_none": "All suggestions already match the current settings",
|
||
"pg_sweep_intro2": "Find the setting that best meets an objective across your recent cycles. Nothing changes until you apply it.",
|
||
"pg_sweep_no_metric": "Not enough data to score this objective.",
|
||
"phase_catalog_intro": "Named segments of a cycle (Pre-wash, Heating, Spin…). Assign them to a profile from its control panel.",
|
||
"phase_ranges_intro": "Phase ranges (minutes from cycle start) overlaid on the average curve. Edit values to preview live.",
|
||
"pick_brand_first": "Pick an appliance brand first.",
|
||
"playground_intro": "Try settings on your real cycle data. Nothing here changes your live settings until you apply it.",
|
||
"prefs_personal": "These apply to your Home Assistant account only.",
|
||
"process_history_hint": "Re-run matching on all stored cycles, refresh suggestions, retrain ML models (if enabled), recost cycles from recorded prices and recompute cycle health. Run it after a batch of reviews.",
|
||
"profile_deleted": "Profile deleted",
|
||
"profiles_intro": "Click a profile for stats, phases and cleanup. Group near-identical programs (same shape/duration, different temperature or spin) so matching reliably picks between them.",
|
||
"rbac_hint": "Off: every Home Assistant user has full access (default). Administrators always have full access and can manage everyone.",
|
||
"recording_in_progress": "Recording in progress",
|
||
"refresh_catalog_hint": "Community brand and appliance lists are cached to save the store's daily budget. Refresh to see entries others added or approved.",
|
||
"reminders_intro": "Show a reminder in the panel this many cycles after the last service. Leave blank or 0 to turn a reminder off.",
|
||
"replace_undo_hint": "A restore point is saved first, so you can undo this import from Export / Import.",
|
||
"replace_warn": "Each ticked category is wiped and replaced from the file. Unticked categories are left untouched.",
|
||
"restart_gap_footer": "Highlighted on the graph. Power data is missing for these intervals; matching used only real readings.",
|
||
"restart_gap_header": "{n} HA restart gap during this cycle",
|
||
"restart_gap_header_one": "{n} HA restart gap during this cycle",
|
||
"restart_gap_header_other": "{n} HA restart gaps during this cycle",
|
||
"restart_gap_item": "{dur} gap",
|
||
"review_confirm_help": "Was this cycle detected correctly? Confirming cycles improves matching for your machine. A quick Good/Bad is enough.",
|
||
"review_in_settings": "Review in Settings",
|
||
"review_notes_placeholder": "Notes (optional)",
|
||
"review_notes_tip": "Free-text notes for your own reference. Not used by matching or training.",
|
||
"review_profile_tip": "The program this cycle is labelled as. If it is wrong, correct it here; labels teach matching.",
|
||
"review_quality_tip": "How clean this cycle is. Good: a textbook run of this program. Bad: detected, but noisy or unusual. Unusable: mis-detected (merged, cut short or spurious). Affects the health score and which cycles train the model.",
|
||
"review_recorded_tip": "Mark this as a hand-picked reference cycle for its program, like a manually recorded cycle. Reference cycles are always kept, seed the matching template, and are never removed by cleanup.",
|
||
"review_tags_tip": "Optional flags for what went wrong, so training and cleanup can allow for it.",
|
||
"review_to_cycles": "Open the Cycles review queue",
|
||
"samples_decimated": "Showing {shown} of {total} samples (thinned for display; peaks kept). A wide gap here is thinning, not missing data.",
|
||
"saving_triggers_reload": "Saving reloads the integration. Entities may briefly show as unavailable.",
|
||
"search_placeholder": "Search settings…",
|
||
"see_recorder": "See recorder widget below",
|
||
"setting_changed": "Changed from {old} to {new} on {date}",
|
||
"settings_basic_note": "Showing essential settings. Switch to Advanced for the full list.",
|
||
"share_device_none": "No shareable cycles yet. Mark a recorded or hand-picked cycle as a reference cycle (⭐) in the Cycles tab first.",
|
||
"share_guideline_naming": "Name each profile exactly as shown on the appliance dial or display (e.g. 'Cotton 40', 'Eco 60').",
|
||
"share_guideline_quality": "Only share cycles that finished normally: no interruptions, door openings or power blips.",
|
||
"share_guideline_review": "Your upload starts as pending and appears publicly once enough community members confirm it.",
|
||
"share_guidelines_title": "Before you share",
|
||
"share_profile_no_cycles": "No reference cycles – mark a cycle as ⭐ in the Cycles tab to include this profile",
|
||
"show_all_settings": "Show all settings",
|
||
"showing_suggestions": "Showing {count} setting with suggestions.",
|
||
"showing_suggestions_one": "Showing {count} setting with suggestions.",
|
||
"showing_suggestions_other": "Showing {count} settings with suggestions.",
|
||
"split_intro": "Click the graph to add or remove a split point, or auto-detect by idle gaps. Each part can get its own profile.",
|
||
"store_declare_appliance": "Tell WashData which appliance you own to see setups others shared for it. Or type a brand above to look around.",
|
||
"store_download_device_intro": "Add every shared program and its reference cycles to your device. Your own cycles and stats are not affected.",
|
||
"store_enable_hint": "Turn on online features in Preferences > Online & Community to browse and import community reference cycles.",
|
||
"advisory_duration_outlier": "{n} cycle(s) labelled ‘{name}’ are too far from its usual length to ever match (worst: {ratio}x). They are probably mislabelled or hold two runs. Relabel or split them so they stop skewing its time estimate.",
|
||
"standby_above_stop_title": "Still drawing {idle} W when the cycle ended",
|
||
"standby_above_stop_sub": "{n} of the last {total} cycles. The off delay only starts once power is below the Stop Threshold ({stop} W), so cycles finish late or need stopping by hand.",
|
||
"store_picker_offline": "Enable online features in the settings gear to pick from the community catalog.",
|
||
"store_share_device_intro": "Upload {brand} {model} with the reference cycles you select. Others with the same appliance can adopt your programs. Entries are reviewed before appearing publicly.",
|
||
"store_share_intro": "Upload this reference cycle so others with the same appliance can use it. It is reviewed before appearing publicly.",
|
||
"store_sibling_hint": "Nothing shared for your model? A related model from the same brand is usually a good start.",
|
||
"sug_mute_failed": "Could not mute suggestion",
|
||
"sug_muted": "Won't suggest this setting again",
|
||
"sug_staged": "Set {key} = {val}. Save to apply.",
|
||
"sug_unmuted_all": "Muted suggestions reset",
|
||
"tail_trim_hint": "Remove this many seconds from the end",
|
||
"toast_auto_detect_enabled": "Auto-detect enabled",
|
||
"toast_auto_label_complete": "Auto-label complete",
|
||
"toast_auto_label_failed": "Auto-label failed: {error}",
|
||
"toast_automation_failed": "Could not create automation: {error}",
|
||
"toast_automation_migrated": "Actions migrated to an automation; opening editor",
|
||
"toast_convert_failed": "Convert failed: {error}",
|
||
"toast_convert_orphan": "The automation was created, but clearing the old actions failed. Do not retry: remove the legacy actions manually to avoid a duplicate automation.",
|
||
"toast_convert_rolled_back": "Migration failed and was rolled back (no automation left behind): {error}",
|
||
"toast_create_failed": "Create failed: {error}",
|
||
"toast_delete_failed": "Delete failed: {error}",
|
||
"toast_error": "Error: {error}",
|
||
"toast_failed": "Failed: {error}",
|
||
"toast_force_stop_failed": "Force stop failed: {error}",
|
||
"toast_name_required": "Name required",
|
||
"toast_range_required": "Set a valid From/To range.",
|
||
"toast_no_automation": "Cannot create automation here",
|
||
"toast_profile_name_required": "Profile name is required",
|
||
"toast_program_armed": "Program armed for the next cycle: {program}",
|
||
"toast_program_set": "Program set: {program}",
|
||
"toast_resume_failed": "Resume failed: {error}",
|
||
"toast_revert_failed": "Revert failed: {error}",
|
||
"toast_reverted": "{key} reverted",
|
||
"toast_save_failed": "Save failed: {error}",
|
||
"trend_duration_longer": "Duration trending longer ({pct}%/cycle) – recent avg {avg}",
|
||
"trend_duration_shorter": "Duration trending shorter ({pct}%/cycle) – recent avg {avg}",
|
||
"trend_energy_down": "Energy trending down ({pct}%/cycle)",
|
||
"trend_energy_up": "Energy trending up ({pct}%/cycle) – recent avg {avg}",
|
||
"trim_destructive_confirm": "This keeps only {pct}% of the cycle and cannot be undone. Continue?",
|
||
"trim_intro": "Drag the red handles, or enter values. Everything outside the window is removed.",
|
||
"tuning_suggestions_available": "{count} tuning suggestion available from observed cycles. They appear beside the relevant fields.",
|
||
"tuning_suggestions_available_one": "{count} tuning suggestion available from observed cycles. It appears beside the relevant field.",
|
||
"tuning_suggestions_available_other": "{count} tuning suggestions available from observed cycles. They appear beside the relevant fields.",
|
||
"unsure_detected_prefix": "WashData is unsure it detected",
|
||
"warmup_badge": "Still learning ({done}/{needed} cycles)",
|
||
"warmup_detail": "Matching already works. WashData asks you to confirm the first {needed} cycles of this profile before labelling on its own.",
|
||
"wipe_history_warning": "Permanently delete all cycles and profiles. Cannot be undone.",
|
||
"compare_cycles_title": "Compare {count} cycles",
|
||
"edit_builtin_phase": "This is a built-in phase. Saving creates a custom copy; delete the copy to restore the original.",
|
||
"fetch_error": "Failed to load data.",
|
||
"connection_lost": "Connection lost - showing data from {time}.",
|
||
"pg_notify_partial": "Markers show start, almost-done, finish, milestone and quiet-hours notifications only. Live updates, unload reminders and overrun alerts are not simulated.",
|
||
"connect_to_confirm": "Connect in the settings gear to confirm or rate.",
|
||
"coverage_gap_cluster": "{count} recent unlabelled cycles of about {min} min look like one program you have not created yet.",
|
||
"pg_label_yes": "Would be labelled \"{name}\" at cycle end",
|
||
"pg_label_no": "Would ask for review: {reason}",
|
||
"live_match_debug_tip": "Confidence: how closely the current power curve matches the top candidate profile (0-100%). Ambiguous: the two best candidates score within 5% of each other - the label is uncertain until the cycle finishes.",
|
||
"automation_alias_started": "{device}: cycle started",
|
||
"automation_alias_finished": "{device}: cycle finished",
|
||
"automation_desc_started": "Runs when a {device} cycle starts. Add your actions (notify, lights, ...).",
|
||
"automation_desc_finished": "Runs when a {device} cycle finishes. Add your actions (notify, lights, ...).",
|
||
"feedback_detected": "WashData detected: {name}",
|
||
"pg_outcome_stale": "Settings changed since this simulation ran. It still shows the old result.",
|
||
"pg_compare_profile_tip": "Only picks the profile drawn over the graph. The simulation always matches the cycle on its own, as the live integration does.",
|
||
"pg_task_busy": "A Test-on-history or Optimize run is already in progress for this device. Wait for it or cancel it.",
|
||
"pg_sweep_guarded": "Ends more cycles early, splits more of them, or misses cycles the current setting catches, so it is never recommended.",
|
||
"pg_sweep_n_cycles": "over {count} cycles",
|
||
"pg_sweep_n_cycles_one": "over {count} cycle",
|
||
"pg_sweep_n_cycles_other": "over {count} cycles",
|
||
"pg_sweep_keep_current": "Keep the current value ({value}, {metric}): no value did better by at least one cycle.",
|
||
"hist_truncated": "stopped at the {n}-reading limit, so the rest of the history was not scanned",
|
||
"hist_warn_kw": "The highest reading is only {w}. This sensor seems to report kilowatts; WashData needs watts, so no cycles can be detected.",
|
||
"hist_warn_naive_time": "{n} timestamps have no time zone and were read as UTC. If the file uses local time, cycles are shifted by your UTC offset and readings near a DST change may be dropped.",
|
||
"hist_warn_naive_time_one": "{n} timestamp has no time zone and was read as UTC. If the file uses local time, cycles are shifted by your UTC offset and readings near a DST change may be dropped.",
|
||
"hist_warn_naive_time_other": "{n} timestamps have no time zone and were read as UTC. If the file uses local time, cycles are shifted by your UTC offset and readings near a DST change may be dropped.",
|
||
"hist_tail_trimmed": "{min} min of waiting after the cycle ended were trimmed, as the live integration trims them",
|
||
"invalid_threshold_pair": "Stop Threshold ({stop} W) must be below Start Threshold ({start} W). Nothing was saved; change both together."
|
||
},
|
||
"pg_desc": {
|
||
"completion_min_seconds": "Shortest run that counts as a real cycle",
|
||
"interrupted_min_seconds": "Short cycles flagged as interrupted",
|
||
"min_off_gap": "Gap required to separate two cycles",
|
||
"off_delay": "Seconds of low power before cycle ends",
|
||
"start_duration_threshold": "Seconds above threshold to confirm start",
|
||
"start_threshold_w": "Minimum watts to count as started",
|
||
"stop_threshold_w": "Below this, machine counts as off",
|
||
"profile_match_min_duration_ratio": "Minimum cycle length as a fraction of the profile's duration; default 0.1 (10%)",
|
||
"profile_match_max_duration_ratio": "Maximum cycle length as a fraction of the profile's duration; default 1.8 (180%)",
|
||
"anti_wrinkle_idle_timeout": "Quiet time allowed between two tumble pulses before anti-wrinkle ends",
|
||
"dishwasher_end_spike_quiet_release": "Dishwasher: quiet seconds after expected duration before the end-of-cycle drain wait is released",
|
||
"smart_termination_duration_ratio": "Fraction of the program's average duration a cycle must reach before Smart Termination may end it early; lower it if run times vary",
|
||
"anti_crease_finalize_ratio": "Fraction of the program's average duration a cycle must reach before the anti-crease tail may finish it; lower it on dryers, keep washers at the default",
|
||
"anti_wrinkle_max_power": "A pulse above this ends anti-wrinkle and opens a new cycle",
|
||
"anti_wrinkle_enabled": "Absorb the tumble pulses after the main phase instead of reading them as new cycles",
|
||
"anti_wrinkle_max_duration": "A pulse longer than this ends anti-wrinkle and opens a new cycle",
|
||
"anti_wrinkle_exit_power": "Quiet level between tumble pulses; only takes effect above the Stop Threshold",
|
||
"curve_preroll_seconds": "Seconds of readings from aborted start attempts carried into the front of a cycle's curve; 0 = off"
|
||
},
|
||
"phase_desc": {
|
||
"anti_crease": "Occasional short tumbles after completion to reduce wrinkles.",
|
||
"anti_wrinkle": "Periodic post-cycle tumbling to reduce wrinkles.",
|
||
"baking": "High-temperature heating element active for crust and crumb formation.",
|
||
"cooking": "Main cooking phase with active heater and fan.",
|
||
"cool_down": "Tumbling without heat near cycle end.",
|
||
"cool_down_af": "Fan-only cool-down stage after heating.",
|
||
"drain_and_switch": "Transition period from washing to drying mode.",
|
||
"dry": "Drying stage using heater and/or residual heat.",
|
||
"drying": "Main heated tumbling period.",
|
||
"heat_up": "Initial heater warm-up before full drying begins.",
|
||
"keep_warm": "Low-heat holding stage to keep food warm.",
|
||
"keep_warm_bm": "Low-heat holding stage to keep the loaf warm after baking.",
|
||
"kneading": "Motor-driven dough mixing and development. High power draw.",
|
||
"pause_af": "Short pause for shaking or inspection.",
|
||
"pre_heat": "Initial chamber heating before full cooking.",
|
||
"pre_rinse": "Initial spray-down before detergent wash.",
|
||
"proving": "Low-heat rising period to allow yeast fermentation and dough expansion.",
|
||
"resting": "Short low-power pause between kneading stages for gluten relaxation.",
|
||
"pre_wash": "Initial soak or pre-treatment before the main wash.",
|
||
"rinse": "Clean-water rinse stage. This phase may repeat multiple times.",
|
||
"sanitize": "High-temperature cleaning stage for sanitization programs.",
|
||
"sensor_check": "Short low-power pause while dryness is measured.",
|
||
"soak": "Low-activity soaking period between active wash stages.",
|
||
"soak_dw": "Extended soak period for heavy soil.",
|
||
"spin": "High-speed extraction to remove water from the load.",
|
||
"spin_wd": "High-speed extraction before drying transition.",
|
||
"wash": "Main washing cycle with drum movement and optional heating.",
|
||
"wash_dw": "Main detergent wash with heating."
|
||
},
|
||
"placeholder": {
|
||
"custom_task": "e.g. Clean door seal",
|
||
"add": "add…",
|
||
"group_name": "e.g. Cotton 2:47",
|
||
"json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]",
|
||
"maintenance_notes": "e.g. replaced filter, cleaned door seal",
|
||
"notify": "add a notify service…",
|
||
"notify_services_list": "notify.mobile_app_phone, ...",
|
||
"person": "add a person…",
|
||
"phase_name": "e.g. Pre-wash",
|
||
"profile_name": "e.g. Cotton 40°C",
|
||
"store_brand": "e.g. Bosch",
|
||
"store_model": "e.g. WAT28401"
|
||
},
|
||
"pref": {
|
||
"date_absolute": "Absolute (e.g. 14:32 on 2 Jul)",
|
||
"date_relative": "Relative (e.g. 2 hours ago)",
|
||
"lang_auto": "System default ({lang})",
|
||
"lang_en": "English",
|
||
"use_panel_default": "(panel default)"
|
||
},
|
||
"quality": {
|
||
"bad": "Bad",
|
||
"good": "Good",
|
||
"unusable": "Unusable"
|
||
},
|
||
"section": {
|
||
"anti_wrinkle": {
|
||
"intro": "Keeps a dryer's low-power tumble pulses after the main phase attached to the finished cycle.",
|
||
"label": "Anti-Wrinkle"
|
||
},
|
||
"basic": {
|
||
"intro": "Core identity and the essentials most setups need.",
|
||
"label": "Basic"
|
||
},
|
||
"delay": {
|
||
"intro": "Detects an appliance that is on and waiting for a delayed start.",
|
||
"label": "Delayed Start"
|
||
},
|
||
"detection": {
|
||
"intro": "How a cycle is detected as starting, running and finishing.",
|
||
"label": "Detection"
|
||
},
|
||
"dishwasher": {
|
||
"intro": "End handling for dishwashers, which often dry quietly for a long time before a short final drain.",
|
||
"label": "Dishwasher"
|
||
},
|
||
"matching": {
|
||
"intro": "How finished cycles are matched to learned profiles and labelled.",
|
||
"label": "Matching"
|
||
},
|
||
"ml_training": {
|
||
"intro": "On-device machine learning retraining schedule and data settings.",
|
||
"label": "ML Training"
|
||
},
|
||
"notifications": {
|
||
"intro": "When and how you are notified about cycle events.",
|
||
"label": "Notifications"
|
||
},
|
||
"timing": {
|
||
"intro": "Background cadence, the offline watchdog and housekeeping.",
|
||
"label": "Timing & Watchdog"
|
||
},
|
||
"triggers": {
|
||
"intro": "Optional extras: end trigger, door sensor, pause switch and unload reminder.",
|
||
"label": "Triggers & Doors"
|
||
}
|
||
},
|
||
"setting": {
|
||
"anti_crease_finalize_ratio": {
|
||
"doc": "Fraction of the program's average duration a cycle must reach before its low-power tumbling counts as the anti-crease tail. Lower it (e.g. 0.75) on load-sensing dryers. Keep washers at the default (0.98), or a wash can end halfway.",
|
||
"label": "Anti-Crease Finalize Ratio"
|
||
},
|
||
"anti_wrinkle_enabled": {
|
||
"doc": "Keep a dryer's short low-power tumble pulses after the main heat phase with the finished cycle, instead of reading them as new cycles.",
|
||
"label": "Enable Anti-Wrinkle Detection"
|
||
},
|
||
"anti_wrinkle_exit_power": {
|
||
"doc": "In anti-wrinkle mode, power below this counts as quiet between tumble pulses, and quiet for longer than the Max Pulse Gap ends the mode. The Stop Threshold is used when it is higher, so this only changes anything when set above the Stop Threshold.",
|
||
"label": "Exit Power Threshold"
|
||
},
|
||
"anti_wrinkle_idle_timeout": {
|
||
"label": "Max Pulse Gap",
|
||
"doc": "How long the dryer may stay quiet between tumble pulses before anti-wrinkle mode ends. Set it above your dryer's longest gap, or later pulses are read as false starts."
|
||
},
|
||
"anti_wrinkle_max_duration": {
|
||
"doc": "A pulse longer than this counts as a real cycle, not an anti-wrinkle tumble.",
|
||
"label": "Max Duration"
|
||
},
|
||
"anti_wrinkle_max_power": {
|
||
"doc": "A pulse above this power counts as a real new cycle, not a tumble. Set it just above your tumble-pulse power.",
|
||
"label": "Max Anti-Wrinkle Power"
|
||
},
|
||
"auto_label_confidence": {
|
||
"doc": "Match score at cycle end at or above which the program is labelled without asking. Raise it for more certainty; lower it to label more cycles automatically. Keep it above Learning Confidence.",
|
||
"label": "Auto-Label Confidence"
|
||
},
|
||
"auto_maintenance": {
|
||
"doc": "Nightly cleanup: label old cycles that now clearly match a program, rebuild program curves, refresh anomaly marks and cycle health, and remove debug traces if Save Debug Traces is off. Cycles and their power traces are always kept.",
|
||
"label": "Auto Maintenance (nightly cleanup)"
|
||
},
|
||
"completion_min_seconds": {
|
||
"doc": "Cycles shorter than this (test runs, opening the door to add a sock) are saved as Interrupted and get no finish notification.",
|
||
"label": "Min Cycle Duration"
|
||
},
|
||
"curve_preroll_seconds": {
|
||
"doc": "Adds readings from failed start attempts to the front of a cycle, for machines that probe before starting (door lock, first fill). 300 s covers most; 0 = off. Recorded starts move earlier, so learned durations drift for a while.",
|
||
"label": "Curve Pre-roll"
|
||
},
|
||
"delay_confirm_seconds": {
|
||
"doc": "Power must stay in the standby band this long before the appliance counts as waiting to start.",
|
||
"label": "Confirm Seconds"
|
||
},
|
||
"delay_start_detect_enabled": {
|
||
"doc": "Detect an appliance that is on and waiting for a delayed start, so its standby draw is not taken for a running cycle.",
|
||
"label": "Enable Delay-Start Detection"
|
||
},
|
||
"delay_timeout_hours": {
|
||
"doc": "Give up waiting for a delayed start after this many hours and return to idle.",
|
||
"label": "Timeout Hours"
|
||
},
|
||
"device_type": {
|
||
"doc": "Sets detection defaults (thresholds, off delay, end handling) for this kind of appliance. Change it only if the device was set up as the wrong type.",
|
||
"label": "Device Type"
|
||
},
|
||
"dishwasher_end_spike_quiet_release": {
|
||
"doc": "After the expected duration, how long the dishwasher must stay below the Stop Threshold before WashData stops waiting for the final drain. Raise it if a late drain after a long dry is missed. The wait never exceeds 30 minutes.",
|
||
"label": "Passive-Dry Quiet Release"
|
||
},
|
||
"door_end_dwell_seconds": {
|
||
"label": "Door-Open End Dwell",
|
||
"doc": "With \"Door Opens Automatically At End\" on: how long the door must stay open before the cycle ends. Long enough to ignore adding a dish (default 60 s)."
|
||
},
|
||
"door_opens_at_end": {
|
||
"label": "Door Opens Automatically At End",
|
||
"doc": "For dishwashers that open the door at the end to dry (e.g. AirDry). A door left open for the dwell time below ends the cycle instead of pausing it; a brief open is ignored. Needs a Door Sensor Entity."
|
||
},
|
||
"door_sensor_entity": {
|
||
"doc": "Optional door sensor. Shows when the appliance was opened to unload after a cycle.",
|
||
"label": "Door Sensor Entity"
|
||
},
|
||
"duration_tolerance": {
|
||
"doc": "Learning feedback only: a cycle within +/-X% of its estimated duration counts as a good estimate. Does not affect matching.",
|
||
"label": "Estimate Tolerance"
|
||
},
|
||
"enable_ml_models": {
|
||
"doc": "Use a model trained on this machine to predict a running cycle's energy and cost, and let a well-known program that stops unusually early finish without the full off delay. Off: power-based logic only.",
|
||
"label": "Apply smart models during a cycle"
|
||
},
|
||
"end_energy_threshold": {
|
||
"doc": "Energy allowed during the off delay. More than this and the cycle keeps going, so tumbles and drying tails stay attached. Lower it if cycles end during a tail; raise it if finished cycles keep waiting.",
|
||
"label": "End Energy"
|
||
},
|
||
"energy_price_dynamic": {
|
||
"doc": "Charge each cycle at the price at each moment it ran, instead of the price when it finished. Needs a price entity. Process History (Diagnostics) recosts older cycles.",
|
||
"label": "Time-Weighted Cost"
|
||
},
|
||
"energy_price_entity": {
|
||
"doc": "Sensor with the current price per kWh (e.g. a dynamic tariff). It overrides the static price below, so it must be a price, not the plug's power or energy sensor.",
|
||
"label": "Energy Price Entity"
|
||
},
|
||
"energy_price_static": {
|
||
"doc": "Fixed price per kWh, used when no price entity is set.",
|
||
"label": "Static Energy Price (per kWh)"
|
||
},
|
||
"energy_sensor": {
|
||
"doc": "Optional kWh or Wh counter (total_increasing, e.g. the plug's own meter). Cycle energy is then read from it, which is more accurate than computing it from a slow power sensor. If its reading is unusable, the computed value is used.",
|
||
"label": "Energy Meter Entity"
|
||
},
|
||
"expose_debug_entities": {
|
||
"doc": "Add diagnostic entities (match confidence, ambiguity, internal state). Off keeps the entity list clean.",
|
||
"label": "Expose Debug Entities"
|
||
},
|
||
"external_end_trigger": {
|
||
"doc": "Binary sensor whose change marks the cycle end (e.g. a \"finished\" contact or another integration).",
|
||
"label": "External Trigger Entity"
|
||
},
|
||
"external_end_trigger_enabled": {
|
||
"doc": "Let a binary sensor signal the end of a cycle, in addition to power-based detection.",
|
||
"label": "Enable External End Trigger"
|
||
},
|
||
"external_end_trigger_inverted": {
|
||
"doc": "Treat the sensor turning OFF (not ON) as the end signal.",
|
||
"label": "Invert External Trigger (trigger on OFF)"
|
||
},
|
||
"learning_confidence": {
|
||
"doc": "Lowest match score for labelling a finished cycle. A clear winner is labelled; a close call goes to the review queue in Cycles. Below this, nothing is labelled or asked. Keep it below Auto-Label Confidence.",
|
||
"label": "Learning Confidence"
|
||
},
|
||
"linked_device": {
|
||
"doc": "Optional. Show this WashData device under another device (e.g. the smart plug) in Home Assistant, as \"Connected via ...\".",
|
||
"label": "Group Under Device"
|
||
},
|
||
"min_off_gap": {
|
||
"doc": "An off period shorter than this does not split a cycle, so soak pauses stay in one wash. Keep it shorter than the gap between back-to-back loads, or those merge into one cycle.",
|
||
"label": "Min Off Gap"
|
||
},
|
||
"min_power": {
|
||
"doc": "Readings below this count as 0 W (standby). Filters out the idle draw of smart plugs and standby LEDs.",
|
||
"label": "Minimum Power"
|
||
},
|
||
"ml_training_enabled": {
|
||
"doc": "Retrain the energy model on this machine's finished cycles from time to time. A new model is kept only if it beats the simple estimate on test cycles.",
|
||
"label": "Learn from this machine"
|
||
},
|
||
"ml_training_hour": {
|
||
"doc": "Hour of day (0-23) for overnight training. Pick a quiet hour, e.g. 2.",
|
||
"label": "Learn at hour"
|
||
},
|
||
"ml_training_interval_days": {
|
||
"doc": "Retrain at most once every this many days.",
|
||
"label": "Check at most every"
|
||
},
|
||
"ml_training_min_cycles": {
|
||
"doc": "Wait for at least this many recorded cycles before training.",
|
||
"label": "Cycles needed first"
|
||
},
|
||
"name": {
|
||
"doc": "Name shown in Home Assistant for this device.",
|
||
"label": "Device Name"
|
||
},
|
||
"no_update_active_timeout": {
|
||
"doc": "If no power update arrives for this long during a cycle, assume the plug went offline and force-stop the cycle. The default 600 s allows for cloud or mesh delays.",
|
||
"label": "No-Update Timeout"
|
||
},
|
||
"notify_before_end_minutes": {
|
||
"doc": "Send an Almost Done alert when estimated time remaining drops below this. 0 disables it.",
|
||
"label": "Pre-End Alert"
|
||
},
|
||
"notify_channel": {
|
||
"doc": "Android channel for start and live messages; the channel sets sound and priority. Blank: app default.",
|
||
"label": "Android Channel (start/live)"
|
||
},
|
||
"notify_cycle_timers": {
|
||
"doc": "Notifications at set minutes into a cycle (e.g. to add softener). Message supports {device}, {program}, {minutes}. With Auto-pause, the cycle also pauses there and the notification gets a Resume button.",
|
||
"label": "Cycle Timers"
|
||
},
|
||
"notify_finish_channel": {
|
||
"doc": "Android channel for the finish message. Blank reuses the start/live channel.",
|
||
"label": "Android Channel (finish)"
|
||
},
|
||
"notify_finish_message": {
|
||
"doc": "Body sent when a cycle finishes. Variables: {device}, {program}, {duration} (minutes), {duration_hm} (1 h 05 min), {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}, {status} (completed or force_stopped; interrupted cycles send nothing). Any other variable falls back to the default text.",
|
||
"label": "Finish Message"
|
||
},
|
||
"notify_finish_services": {
|
||
"doc": "notify.* services to call when a cycle finishes. Leave empty for none.",
|
||
"label": "Finish Services"
|
||
},
|
||
"notify_fire_events": {
|
||
"doc": "Also fire ha_washdata_* events on cycle start and finish for your own automations.",
|
||
"label": "Fire HA Events for Notifications"
|
||
},
|
||
"notify_icon": {
|
||
"doc": "Small icon on the notification (e.g. mdi:washing-machine). Sent only to mobile_app targets, not notify groups. On iOS it replaces the app icon and needs companion app 2026.8 or newer. Blank: platform default.",
|
||
"label": "Notification Icon"
|
||
},
|
||
"notify_icon_color": {
|
||
"doc": "Accent colour for this appliance's notifications, so washer, dryer and dishwasher are easy to tell apart. On iOS it fills the circle behind the icon and colours the Live Activity bar. Many Android phones (Samsung especially) ignore it. Use hex, e.g. #03A9F4. Blank: platform default.",
|
||
"label": "Notification Colour"
|
||
},
|
||
"notify_live_chronometer": {
|
||
"doc": "Show a live countdown timer in the notification (where supported) instead of a fixed estimate.",
|
||
"label": "Use Live Chronometer"
|
||
},
|
||
"notify_live_click_action": {
|
||
"label": "Notification Tap Target",
|
||
"doc": "What a tap on this appliance's notification opens. Blank: the WashData panel on this appliance. Enter a dashboard path (e.g. /lovelace/laundry) or URL, or \"none\" for no tap action."
|
||
},
|
||
"notify_live_interval_seconds": {
|
||
"doc": "How often live-progress notifications are refreshed while a cycle runs.",
|
||
"label": "Live Update Interval"
|
||
},
|
||
"notify_live_overrun_percent": {
|
||
"doc": "Live updates stop once a cycle runs this percent past its expected duration (20 = up to 1.2x the expected time).",
|
||
"label": "Live Overrun % Before Alert"
|
||
},
|
||
"notify_live_services": {
|
||
"doc": "notify.* services for live progress updates while a cycle runs. Leave empty to turn them off.",
|
||
"label": "Live Progress Services"
|
||
},
|
||
"notify_live_silent": {
|
||
"label": "Silent Live Updates",
|
||
"doc": "iOS only. Update live progress silently, at a battery-saving priority that iOS may batch. The first update and the start/finish notifications still alert. Off: every update alerts."
|
||
},
|
||
"notify_live_sticky": {
|
||
"label": "Keep Live Notification On Tap",
|
||
"doc": "Android only. Keep the live progress notification when tapped. Off: a tap dismisses it."
|
||
},
|
||
"notify_milestone_message": {
|
||
"doc": "Message for the milestone notification. Template variables: {device}, {cycle_count}.",
|
||
"label": "Milestone Message"
|
||
},
|
||
"notify_milestones": {
|
||
"doc": "Cycle counts that trigger a one-off celebration notification, comma-separated (e.g. 50, 100, 500, 1000). Blank disables them.",
|
||
"label": "Cycle Milestones"
|
||
},
|
||
"notify_only_when_home": {
|
||
"doc": "Only notify when at least one of the people above is home.",
|
||
"label": "Notify Only When Home"
|
||
},
|
||
"notify_people": {
|
||
"doc": "person.* entities that \"Notify Only When Home\" checks.",
|
||
"label": "People (for Only When Home)"
|
||
},
|
||
"notify_pre_complete_message": {
|
||
"doc": "Text of each live progress update. Template variables: {device}, {program}, {minutes} (minutes left). Any other variable falls back to the default text.",
|
||
"label": "Pre-Complete Message"
|
||
},
|
||
"notify_quiet_end_hour": {
|
||
"doc": "End of the do-not-disturb window (0-23); held notifications are sent then. Blank disables it.",
|
||
"label": "Quiet Hours End"
|
||
},
|
||
"notify_quiet_start_hour": {
|
||
"doc": "Start of a do-not-disturb window (0-23). Finish, reminder and clean-laundry notifications in this window are held until it ends. Can cross midnight (e.g. 22 to 7). Blank disables it.",
|
||
"label": "Quiet Hours Start"
|
||
},
|
||
"notify_reminder_message": {
|
||
"doc": "Text of the one-time Pre-End Alert. Template variables: {device}, {program}, {minutes} (the Pre-End Alert setting). Any other variable falls back to the default text.",
|
||
"label": "Reminder Message"
|
||
},
|
||
"notify_start_message": {
|
||
"doc": "Body sent when a cycle starts. Template variables: {device}, {program}. Any other variable falls back to the default text.",
|
||
"label": "Start Message"
|
||
},
|
||
"notify_start_services": {
|
||
"doc": "notify.* services to call when a cycle starts (phone, dashboard, ...). Leave empty for none.",
|
||
"label": "Start Services"
|
||
},
|
||
"notify_timeout_seconds": {
|
||
"doc": "Dismiss the notification after this many seconds (where supported). 0 keeps it until you dismiss it.",
|
||
"label": "Auto-Dismiss After"
|
||
},
|
||
"notify_title": {
|
||
"doc": "Notification title. Only {device} is substituted; any other variable falls back to the default title.",
|
||
"label": "Notification Title"
|
||
},
|
||
"notify_unload_delay_minutes": {
|
||
"doc": "Minutes after a cycle ends before the \"unload the machine\" reminder. 0 disables it.",
|
||
"label": "Unload Nag Delay"
|
||
},
|
||
"notify_unload_repeat": {
|
||
"doc": "Resend the unload reminder every \"Unload Nag Delay\" minutes until the unload is confirmed or you tap \"Stop reminding\" (mobile app). Needs a Door Sensor Entity, an Unload Confirmation Entity, or \"Confirm Unload Manually\".",
|
||
"label": "Repeat Until Unloaded"
|
||
},
|
||
"off_delay": {
|
||
"doc": "How long power must stay low before the cycle is finished. Power coming back within this time continues the cycle. Dishwashers can be idle 20-60 min while drying, so set it longer than that.",
|
||
"label": "Off Delay"
|
||
},
|
||
"pause_cuts_power": {
|
||
"doc": "When a cycle is paused, also switch off the Switch Entity below. Only for appliances that can safely lose power mid-cycle.",
|
||
"label": "Pause Also Cuts Power (via switch)"
|
||
},
|
||
"peak_rate_message": {
|
||
"doc": "Custom text for the peak-rate tip. Template variables: {device}, {price}. Blank uses the default.",
|
||
"label": "Peak-Rate Message"
|
||
},
|
||
"peak_rate_threshold": {
|
||
"doc": "If the price per kWh is at or above this when a cycle starts, add a peak-rate tip to the start notification. 0 or blank disables it.",
|
||
"label": "Peak-Rate Threshold (per kWh)"
|
||
},
|
||
"power_off_delay": {
|
||
"doc": "How long power must stay below the Power Off Threshold after a cycle before the state returns to Off. Only used when that threshold is above 0. Checked periodically, so the real wait can be slightly longer.",
|
||
"label": "Power Off Delay"
|
||
},
|
||
"power_off_threshold_w": {
|
||
"doc": "After a cycle, power below this for the Power Off Delay sets the state to Off, instead of the Progress Reset Delay doing it. Set it above the switched-off draw, below standby and the Stop Threshold. 0 disables it (default).",
|
||
"label": "Power Off Threshold"
|
||
},
|
||
"power_profile_interval_min": {
|
||
"label": "Power Profile Interval",
|
||
"doc": "Bucket size of the power_profile attribute (average watts per slot) used by planners such as EMHASS and tibber_prices. Smaller keeps short spikes; larger smooths the curve. Default 15 min. Does not affect detection."
|
||
},
|
||
"power_sensor": {
|
||
"doc": "The sensor that reports this appliance's live power in watts (e.g. sensor.washer_power). All detection is based on it.",
|
||
"label": "Power Sensor"
|
||
},
|
||
"profile_evidence_sources": {
|
||
"label": "Cycles that shape a program",
|
||
"doc": "Which kinds of cycles shape each program's curve and matching. Unticking a kind deletes nothing; useful if you do not trust imported data. Statistics always count only this machine's cycles. Unticking all is ignored."
|
||
},
|
||
"profile_match_interval": {
|
||
"doc": "How often to match a running cycle against profiles. Default 300 s (5 min).",
|
||
"label": "Match Interval"
|
||
},
|
||
"profile_match_max_duration_ratio": {
|
||
"doc": "A program is dropped once the cycle has run longer than this multiple of its typical duration. 1.8: a cycle 80% longer than the program no longer matches it.",
|
||
"label": "Max Duration Ratio"
|
||
},
|
||
"profile_match_min_duration_ratio": {
|
||
"doc": "A program is only considered after the cycle has run this fraction of its typical duration. 0.10: a 2-hour program becomes a candidate after 12 minutes. Not applied in a cycle's first 15 minutes.",
|
||
"label": "Min Duration Ratio"
|
||
},
|
||
"profile_match_threshold": {
|
||
"doc": "Live match score a cycle needs before Smart Termination or the anti-crease finish may end it early. It does not change the shown program. Raise it if weak matches end cycles early; lower it if clear matches wait the off delay.",
|
||
"label": "Match Threshold"
|
||
},
|
||
"profile_unmatch_threshold": {
|
||
"doc": "If the live match score drops below this, the current program guess is cleared. Keep it a little below the Match Threshold so a brief dip does not reset it.",
|
||
"label": "Unmatch Threshold"
|
||
},
|
||
"progress_reset_delay": {
|
||
"doc": "After a cycle, keep progress at 100% this long before resetting to Idle.",
|
||
"label": "Progress Reset Delay"
|
||
},
|
||
"pump_stuck_duration": {
|
||
"doc": "How long a pump may run nonstop before the stuck-pump event fires.",
|
||
"label": "Pump Stuck Duration"
|
||
},
|
||
"sampling_interval": {
|
||
"doc": "Minimum time between processed readings. Readings that arrive sooner are skipped (low readings during a cycle are always kept). Set it to your plug's reporting interval or lower; a higher value only throws readings away.",
|
||
"label": "Sampling Interval"
|
||
},
|
||
"save_debug_traces": {
|
||
"doc": "Also store the matcher's debug data (every candidate's scores) with each cycle, for troubleshooting. Adds about 20 KB per cycle.",
|
||
"label": "Save Debug Traces"
|
||
},
|
||
"show_contributor": {
|
||
"doc": "Show the \"by <contributor>\" attribution on community appliances and reference cycles."
|
||
},
|
||
"smart_termination_duration_ratio": {
|
||
"doc": "Fraction of the program's average duration a cycle must reach before Smart Termination may end it early. If run times vary (water temperature, sensor-dry, load size), lower it (e.g. 0.85). Leave empty for 0.98 (0.99 on dishwashers).",
|
||
"label": "Smart Termination Ratio"
|
||
},
|
||
"start_duration_threshold": {
|
||
"doc": "Power must stay above the Start Threshold this long before a cycle starts, so brief on/off blips are ignored.",
|
||
"label": "Start Duration"
|
||
},
|
||
"start_energy_threshold": {
|
||
"doc": "Energy the appliance must use before the cycle counts as running. A short power spike uses little energy, so it does not start a cycle.",
|
||
"label": "Start Energy"
|
||
},
|
||
"start_threshold_w": {
|
||
"doc": "Power must rise above this to start a cycle. Too low: standby power causes false starts. Too high: slow-starting programs (cold fill) are missed.",
|
||
"label": "Start Threshold"
|
||
},
|
||
"stop_threshold_w": {
|
||
"doc": "Power must fall below this before the off delay starts counting. Keep it below the Start Threshold. Too high, and low-power phases (rinse holds, anti-crease) start the end countdown by mistake.",
|
||
"label": "Stop Threshold"
|
||
},
|
||
"store_brand": {
|
||
"label": "Appliance Brand",
|
||
"doc": "Optional. Your appliance brand from the community catalog, used to find and share reference recordings. Leave blank if you do not use online features."
|
||
},
|
||
"store_model": {
|
||
"label": "Appliance Model",
|
||
"doc": "Optional. Your appliance model from the community catalog (pick a brand first). If it is not listed, you can add it."
|
||
},
|
||
"switch_entity": {
|
||
"doc": "Optional switch turned off on pause and back on when resuming, with \"Pause Also Cuts Power\".",
|
||
"label": "Switch Entity"
|
||
},
|
||
"unload_confirm_entity": {
|
||
"doc": "Optional. Any entity that confirms the load was taken out, for machines without a door sensor (a button, input_button, motion sensor, scene). Every state change counts except turning off or unavailable. Also enables the unload reminder.",
|
||
"label": "Unload Confirmation Entity"
|
||
},
|
||
"unload_track_without_door": {
|
||
"doc": "Run the unload reminder without a door sensor or confirmation entity. Confirm the unload from your own automation with the \"Mark Unloaded\" button or the ha_washdata.mark_unloaded service. Ignored when a Door Sensor Entity is set.",
|
||
"label": "Confirm Unload Manually"
|
||
},
|
||
"watchdog_interval": {
|
||
"doc": "How often the background check looks for stalled sensors and timeouts. Default 30 s.",
|
||
"label": "Watchdog Interval"
|
||
},
|
||
"share_name": {
|
||
"doc": "Show your account name as the uploader of cycles you share. Off: shared without a name."
|
||
}
|
||
},
|
||
"setting_group": {
|
||
"auto_labeling": {
|
||
"label": "Auto-Labeling"
|
||
},
|
||
"basic_configuration": {
|
||
"label": "Basic configuration"
|
||
},
|
||
"cycle_end": {
|
||
"label": "Cycle End"
|
||
},
|
||
"cycle_start": {
|
||
"label": "Cycle Start"
|
||
},
|
||
"cycle_timers": {
|
||
"label": "Cycle Timers"
|
||
},
|
||
"data_management": {
|
||
"label": "Data Management"
|
||
},
|
||
"debug": {
|
||
"label": "Debug"
|
||
},
|
||
"device_info": {
|
||
"label": "Device info"
|
||
},
|
||
"dishwasher_end": {
|
||
"label": "Dishwasher End"
|
||
},
|
||
"door_pause": {
|
||
"label": "Door & Pause"
|
||
},
|
||
"duration_gates": {
|
||
"label": "Duration Gates"
|
||
},
|
||
"energy": {
|
||
"label": "Energy"
|
||
},
|
||
"external_end_trigger": {
|
||
"label": "External End Trigger"
|
||
},
|
||
"housekeeping": {
|
||
"label": "Housekeeping"
|
||
},
|
||
"match_scoring": {
|
||
"label": "Match Scoring"
|
||
},
|
||
"messages": {
|
||
"label": "Messages"
|
||
},
|
||
"power_off": {
|
||
"label": "Power Off"
|
||
},
|
||
"predictive_end": {
|
||
"label": "Predictive End"
|
||
},
|
||
"profile_evidence": {
|
||
"label": "Profile Evidence"
|
||
},
|
||
"quiet_hours_milestones": {
|
||
"label": "Quiet Hours & Milestones"
|
||
},
|
||
"schedule": {
|
||
"label": "Schedule"
|
||
},
|
||
"services": {
|
||
"label": "Services"
|
||
},
|
||
"signal_processing": {
|
||
"label": "Signal Processing"
|
||
},
|
||
"thresholds_gap": {
|
||
"label": "Thresholds & Gap"
|
||
},
|
||
"timing": {
|
||
"label": "Timing"
|
||
},
|
||
"unload_reminder": {
|
||
"label": "Unload Reminder"
|
||
},
|
||
"watchdog": {
|
||
"label": "Watchdog"
|
||
}
|
||
},
|
||
"status": {
|
||
"active": "Active",
|
||
"all_statuses": "All statuses",
|
||
"ambiguous": "Ambiguous",
|
||
"analyzing": "Analyzing…",
|
||
"auto_detect": "Auto-detect",
|
||
"clear": "Clear",
|
||
"completed": "Completed",
|
||
"deleting": "Deleting…",
|
||
"fine_tuning": "fine-tuning now…",
|
||
"force_stopped": "Force stopped",
|
||
"idle": "Idle",
|
||
"imported": "Imported",
|
||
"interrupted": "Interrupted",
|
||
"match_sure": "~{pct}% sure",
|
||
"match_uncertain": "Uncertain: {top} or {runner}",
|
||
"match_uncertain_single": "Uncertain: maybe {top}",
|
||
"match_uncertain_tip": "WashData has not settled on a program yet. The figure is how often the leading guess, {top}, was right in past cycles when it led by this much. Information only.",
|
||
"preparing": "Preparing…",
|
||
"ready": "Ready to process",
|
||
"rebuilding": "Rebuilding…",
|
||
"recording": "Recording",
|
||
"resetting": "Resetting…",
|
||
"saving": "Saving…",
|
||
"splitting": "Splitting…",
|
||
"stalled": "Stalled",
|
||
"training": "Training…",
|
||
"trimming": "Trimming…",
|
||
"unlabelling": "Unlabelling…",
|
||
"working": "Working…"
|
||
},
|
||
"suggestion": {
|
||
"observed_label": "Observed",
|
||
"impact": {
|
||
"auto_label_confidence": {
|
||
"higher": "Labels fewer cycles automatically; more go to review",
|
||
"lower": "Labels more cycles automatically; some may be misidentified"
|
||
},
|
||
"duration_tolerance": {
|
||
"higher": "Accepts a wider duration range – more flexible matching",
|
||
"lower": "Requires closer duration match – stricter but may reject unusual cycles"
|
||
},
|
||
"end_energy_threshold": {
|
||
"higher": "Closes only cycles that used substantial energy",
|
||
"lower": "Closes shorter or lower-energy cycles too"
|
||
},
|
||
"learning_confidence": {
|
||
"higher": "Learns only from very confident matches – slower but more reliable",
|
||
"lower": "Learns from more cycles; model may be noisier"
|
||
},
|
||
"min_off_gap": {
|
||
"higher": "Longer idle needed before a new cycle starts",
|
||
"lower": "Brief idle triggers a new cycle – back-to-back runs may split"
|
||
},
|
||
"min_power": {
|
||
"higher": "Less sensitive to idle power draw; may miss very quiet programs",
|
||
"lower": "More sensitive; may log standby power as activity"
|
||
},
|
||
"no_update_active_timeout": {
|
||
"higher": "More time before declaring a cycle stuck",
|
||
"lower": "Force-stops a stuck cycle sooner"
|
||
},
|
||
"off_delay": {
|
||
"higher": "More time for appliance pauses – handles long soak or drying phases",
|
||
"lower": "Faster end detection – works well for clean on/off appliances"
|
||
},
|
||
"profile_match_threshold": {
|
||
"higher": "Commits only high-confidence matches; more cycles stay unlabelled",
|
||
"lower": "Matches more cycles; some may be slightly wrong"
|
||
},
|
||
"start_threshold_w": {
|
||
"higher": "Avoids false starts from brief power spikes",
|
||
"lower": "Catches low-power programs; may trigger on noise"
|
||
},
|
||
"stop_threshold_w": {
|
||
"higher": "Ends cycle faster – may close during a pause",
|
||
"lower": "Waits longer to end – fewer premature completions"
|
||
},
|
||
"watchdog_interval": {
|
||
"higher": "Longer quiet phases allowed; fewer false force-stops",
|
||
"lower": "Catches stuck cycles more aggressively"
|
||
}
|
||
},
|
||
"reason": {
|
||
"watchdog": "Kept as low as safe (just above the p95 update gap of {p95}s and at least 2x the sampling interval of {median}s, min 30s) so stalls are caught quickly without false stops.",
|
||
"no_update_timeout": "Based on observed update cadence (p95={p95}s) * 20 (min 60s).",
|
||
"off_delay_cadence": "Based on observed update cadence (p95={p95}s) * 5",
|
||
"off_delay_device_floor": "Used device-specific safe minimum for {device} ({floor}s).",
|
||
"off_delay_generic_floor": "Used generic safe minimum ({floor}s).",
|
||
"off_delay_pauses": "Sized to outlast real pauses: p95 intra-cycle pause {p95}s + 60s buffer, from {pauses} pauses across {cycles} clean cycles (floor {floor}s).",
|
||
"match_interval": "Based on observed update cadence (median={median}s) * 10.",
|
||
"match_interval_capped": "Capped so {persistence} consecutive matches fit in {pct}% of the shortest program ({shortest}s); the update cadence (median={median}s) alone would have suggested a longer interval.",
|
||
"match_interval_floored": "The shortest program ({shortest}s) would cap this at {cap}s, below the {minimum}s minimum, so the minimum is used: {persistence} consecutive matches take {budget}s, over {pct}% of that program. Matching only runs when a reading arrives (median={median}s), so this costs nothing.",
|
||
"max_duration_ratio": "Based on labeled cycle durations (p95={p95}).",
|
||
"min_power": "40% of the p05 lowest active power ({p05}W) across {cycles} clean cycles, keeping the off-gate below real draw.{excl}",
|
||
"completion_min_seconds": "Half the p05 clean-cycle duration ({minutes} min) across {cycles} cycles; filters ghost cycles.{excl}",
|
||
"min_off_gap": "Based on {gaps} observed inter-cycle gaps (p05={p05}s). Device floor: {floor}s.",
|
||
"min_off_gap_bridge": "Sized to bridge the longest quiet stretch inside a cycle: {span}s + 60s buffer, from {spans} bridged gaps across {cycles} clean cycles (stays under your {ceiling}s back-to-back headroom).",
|
||
"standby_floor": "Every recent cycle was still drawing {idle}W when it ended, so a threshold below that can never see the appliance switch off. Kept above it; the {cycles} clean cycles on record never paused under it for more than {pause}s.",
|
||
"thr_batch": "Just above the lowest active power (p05) across {cycles} cycles ({p05}W), so starts are caught early and the stop threshold stays below the lowest running power.",
|
||
"max_duration_ratio_default": "Back to the default: a lower ceiling rejects the right programme whenever a run is longer than usual.",
|
||
"min_duration_ratio_default": "Back to the default: a higher floor stops a running cycle from being recognised until it is well under way.",
|
||
"end_energy_floor": "Raised to the floor the stop threshold ({stop} W) over the off delay ({off_delay} s) implies; below it the cycle can only end through a fallback path."
|
||
},
|
||
"exclusions": {
|
||
"summary": "Excluded {total} mis-detected cycle(s): {parts}.",
|
||
"reason": {
|
||
"force_stopped": "force-stopped",
|
||
"user_stopped": "manually stopped",
|
||
"interrupted": "interrupted",
|
||
"incomplete": "incomplete",
|
||
"noise": "noise",
|
||
"unlabeled": "unlabeled",
|
||
"no_trace_short": "too short to inspect",
|
||
"high_start": "started at high power",
|
||
"abrupt_end": "ended abruptly",
|
||
"mid_restart": "mid-cycle restart",
|
||
"no_power": "no power",
|
||
"no_active_power": "no active power"
|
||
}
|
||
},
|
||
"now_value": "(now {v})"
|
||
},
|
||
"tab": {
|
||
"advanced": "Advanced",
|
||
"diagnostics": "Diagnostics",
|
||
"history": "Cycles",
|
||
"maintenance": "Maintenance",
|
||
"ml": "ML Training",
|
||
"playground": "Playground",
|
||
"pp_cleanup": "Cleanup",
|
||
"pp_manage": "Manage",
|
||
"pp_overview": "Overview",
|
||
"pp_phases": "Phases",
|
||
"profiles": "Profiles",
|
||
"settings": "Settings",
|
||
"status": "Overview",
|
||
"subtab_phase_catalog": "Phase Catalog",
|
||
"subtab_profiles": "Profiles",
|
||
"store": "Store"
|
||
},
|
||
"tag": {
|
||
"early_end": "Early end",
|
||
"late_start": "Late start",
|
||
"merged": "Merged cycles",
|
||
"noise": "Noise",
|
||
"sensor_gap": "Sensor gap",
|
||
"split": "Split cycle",
|
||
"wrong_profile": "Wrong profile"
|
||
},
|
||
"toast": {
|
||
"task_name_required": "Give the task a name",
|
||
"task_added": "Task added",
|
||
"task_save_failed": "Could not save task: {error}",
|
||
"task_removed": "Task removed",
|
||
"maint_logged": "Logged as done: {task}",
|
||
"access_saved": "Access control saved",
|
||
"all_wiped": "All data wiped",
|
||
"analysis_complete": "Analysis complete: {count} suggestion(s)",
|
||
"analysis_complete_none": "Analysis complete: no new suggestions",
|
||
"analysis_failed": "Analysis failed: {error}",
|
||
"appliance_added": "Appliance added - awaiting approval",
|
||
"apply_failed": "Apply failed: {error}",
|
||
"auto_detect_failed": "Auto-detect failed: {error}",
|
||
"auto_label_complete": "Auto-label complete",
|
||
"auto_label_failed": "Auto-label failed: {error}",
|
||
"auto_label_done": "Auto-label complete: {count} cycles labelled, {skipped} left unlabelled.",
|
||
"auto_label_done_one": "Auto-label complete: {count} cycle labelled, {skipped} left unlabelled.",
|
||
"auto_label_done_other": "Auto-label complete: {count} cycles labelled, {skipped} left unlabelled.",
|
||
"auto_label_cancelled": "Auto-label cancelled after labelling {count} cycles.",
|
||
"auto_label_cancelled_one": "Auto-label cancelled after labelling {count} cycle.",
|
||
"auto_label_cancelled_other": "Auto-label cancelled after labelling {count} cycles.",
|
||
"automation_deleted": "Automation deleted",
|
||
"brand_added": "Brand added - awaiting approval",
|
||
"catalog_refreshed": "Community catalog refreshed",
|
||
"contrib_device_changed": "Added to the community store, but the device changed while the form was open. Select it in Settings.",
|
||
"correction_submitted": "Correction submitted",
|
||
"could_not_load_cycle": "Could not load cycle: {error}",
|
||
"create_failed": "Create failed: {error}",
|
||
"cycle_force_stopped": "Cycle force-stopped",
|
||
"cycle_labelled": "Cycle labelled",
|
||
"cycle_paused": "Cycle paused",
|
||
"cycle_resumed": "Cycle resumed",
|
||
"cycle_trimmed": "Cycle trimmed",
|
||
"cycles_deleted": "Deleted {count} cycle(s)",
|
||
"cycles_merged": "Cycles merged",
|
||
"debug_cleared": "Cleared {count} debug traces",
|
||
"delete_failed": "Delete failed: {error}",
|
||
"delete_partial_failed": "Some items could not be deleted and were restored",
|
||
"device_approved": "Approved by the community",
|
||
"discard_failed": "Discard failed: {error}",
|
||
"envelope_rebuilt": "Envelope rebuilt",
|
||
"envelopes_rebuilt": "Envelopes rebuilt",
|
||
"error": "Error: {error}",
|
||
"export_downloaded": "Export downloaded",
|
||
"export_failed": "Export failed: {error}",
|
||
"export_selective_done": "Export downloaded",
|
||
"feedback_all_dismissed": "All feedbacks dismissed",
|
||
"feedback_confirmed": "Feedback confirmed",
|
||
"feedback_dismissed": "Feedback dismissed",
|
||
"file_read_failed": "Could not read that file",
|
||
"group_deleted": "Group deleted",
|
||
"group_name_required": "Group name is required",
|
||
"group_saved": "Group saved",
|
||
"hist_csv_required": "Load a CSV file or paste its contents first",
|
||
"import_failed": "Import failed: {error}",
|
||
"import_no_restore_point": "Imported, but no restore point could be saved, so this import cannot be undone",
|
||
"import_selective_done": "Imported {profiles} profile(s) and {cycles} cycle(s)",
|
||
"import_undo_failed": "Could not undo the import: {error}",
|
||
"import_undone": "Import undone: {profiles} profile(s) and {cycles} cycle(s) restored",
|
||
"invalid_json": "\"{key}\" is not valid JSON - fix it or clear the field before saving.",
|
||
"json_required": "JSON data is required",
|
||
"label_failed": "Label failed: {error}",
|
||
"legacy_removed": "Legacy actions removed",
|
||
"load_more_failed": "Could not load more: {error}",
|
||
"logs_exported": "Logs exported",
|
||
"maint_add_failed": "Could not add event: {error}",
|
||
"maint_added": "Maintenance event added",
|
||
"maint_delete_failed": "Could not delete event: {error}",
|
||
"maint_deleted": "Maintenance event deleted",
|
||
"min_2_profiles": "Select at least 2 profiles for a group",
|
||
"ml_training_no_improvement": "Training complete: baseline kept (no improvement)",
|
||
"ml_training_promoted": "Training complete: promoted {count} model(s)",
|
||
"models_reverted": "On-device models reverted to baseline",
|
||
"name_required": "Name required",
|
||
"no_split_found": "No idle gaps found to split on",
|
||
"odometer_save_failed": "Could not save total: {error}",
|
||
"odometer_saved": "Total cycles saved",
|
||
"panel_settings_saved": "Panel settings saved",
|
||
"pause_failed": "Pause failed: {error}",
|
||
"pause_no_cycle": "No active cycle to pause",
|
||
"pg_preset_loaded": "Preset \"{name}\" loaded",
|
||
"pg_preset_saved": "Preset \"{name}\" saved",
|
||
"pg_run_gone": "That run is no longer available.",
|
||
"pg_sugg_loaded": "Staged {n} suggested value(s) - run the Playground to compare",
|
||
"phase_created": "Phase \"{name}\" created",
|
||
"phase_deleted": "Phase \"{name}\" deleted",
|
||
"phase_name_required": "Phase name is required",
|
||
"phase_reset": "\"{name}\" restored to the built-in phase",
|
||
"phase_updated": "Phase updated",
|
||
"phases_saved": "Phases saved",
|
||
"preferences_saved": "Preferences saved",
|
||
"processed": "Processed {bits}",
|
||
"processed_cycles": "{n} cycles",
|
||
"processed_models": "{n} model(s) promoted",
|
||
"processed_suggestions": "{n} suggestion(s)",
|
||
"profile_added": "Profile added - awaiting approval",
|
||
"profile_created": "Profile \"{name}\" created",
|
||
"profile_name_required": "Profile name is required",
|
||
"profile_renamed": "Profile renamed",
|
||
"rating_saved": "Quality rating saved",
|
||
"recording_discarded": "Recording discarded",
|
||
"recording_saved": "Recording saved to profile",
|
||
"recording_started": "Recording started",
|
||
"recording_stopped": "Recording stopped",
|
||
"relabel_done": "Relabelled {count} cycle(s)",
|
||
"relabel_failed": "Relabel failed: {error}",
|
||
"reminders_save_failed": "Could not save reminders: {error}",
|
||
"reminders_saved": "Service reminders saved",
|
||
"remove_failed": "Remove failed: {error}",
|
||
"rename_failed": "Rename failed: {error}",
|
||
"resume_no_cycle": "No paused cycle to resume",
|
||
"review_saved": "Review saved",
|
||
"save_failed": "Save failed: {error}",
|
||
"saved_except_conflicts": "Saved. Fix the highlighted conflicts to save the rest.",
|
||
"settings_conflicts": "Fix the highlighted setting conflicts before saving.",
|
||
"settings_no_changes": "No changes to save",
|
||
"settings_reverted": "Settings reverted; integration reloading",
|
||
"settings_saved": "Settings saved; integration reloading",
|
||
"share_device_none_sel": "Select at least one cycle to share",
|
||
"split_complete": "Split into {count} cycles",
|
||
"start_failed": "Start failed: {error}",
|
||
"stop_failed": "Stop failed: {error}",
|
||
"store_connect_failed": "Connect failed: {error}",
|
||
"store_connected": "Connected to the community store",
|
||
"store_device_downloaded": "{p} program(s), {c} recording(s) added",
|
||
"store_device_downloaded_phases": "{p} program(s), {c} recording(s), {ph} phase map(s) added",
|
||
"store_device_downloaded_settings": "{p} program(s), {c} recording(s), {ph} phase map(s), {s} setting(s) added",
|
||
"store_device_shared": "Shared {n} cycle(s) to the community store - pending review.",
|
||
"store_device_shared_all_dup": "All {n} cycle(s) were already in the community store.",
|
||
"store_device_shared_partial": "Shared {n} cycle(s); {failed} could not be uploaded.",
|
||
"store_device_shared_some_dup": "Shared {created} cycle(s); {dup} were already in the store.",
|
||
"store_disconnected": "Disconnected from the community store",
|
||
"store_download_failed": "Download failed: {error}",
|
||
"store_download_nothing": "Nothing new to download - this setup is already on your device.",
|
||
"store_download_skipped": "{n} recording(s) skipped: too short, too gappy or already on your device.",
|
||
"store_error": "Error: {error}",
|
||
"store_import_duplicate": "This recording is already on your device.",
|
||
"store_import_failed": "Import failed: {error}",
|
||
"store_import_low_quality": "This recording is too short, too gappy or implausible to import.",
|
||
"store_imported": "Imported into {profile}",
|
||
"store_name_required": "Enter a profile name",
|
||
"store_no_appliance": "Set your appliance brand and model in Settings first.",
|
||
"store_pick_profile": "Pick a profile to merge into",
|
||
"store_pick_profile_share": "Pick a profile to share into",
|
||
"store_search_failed": "Search failed: {error}",
|
||
"store_share_failed": "Share failed: {error}",
|
||
"store_shared": "Shared to the community store - pending review.",
|
||
"store_unavailable": "The community store is not available.",
|
||
"suggestions_applied": "Suggestions applied; integration reloading",
|
||
"suggestions_dismissed": "Suggestions dismissed",
|
||
"task_cancelled": "Cancelled.",
|
||
"thanks_confirming": "Thanks for confirming",
|
||
"unlabel_done": "Unlabelled {count} cycle(s)",
|
||
"unlabel_failed": "Unlabel failed: {error}",
|
||
"update_failed": "Update failed: {error}",
|
||
"store_download_partial": "{n} program(s) could not be downloaded; try again later."
|
||
},
|
||
"trend": {
|
||
"down": "Trending down",
|
||
"up": "Trending up"
|
||
},
|
||
"col": {
|
||
"profile_tip": "Matched program name. Unlabelled means no profile matched at end of cycle.",
|
||
"status_tip": "Cycle outcome: Completed (natural end), Interrupted (abrupt power drop), Force Stopped (manual), or Needs Review (feedback pending).",
|
||
"date_tip": "Date and time the cycle started.",
|
||
"duration_tip": "Total cycle run time from start to end.",
|
||
"energy_tip": "Total energy used (kWh), computed from power over time.",
|
||
"cost_dynamic_tip": "Time-weighted: charged at the price in force during the cycle (effective {price} {cur}/kWh).",
|
||
"cost_tip": "Energy cost of this cycle, fixed when it finished. With Time-Weighted Cost on, each moment is charged at its own price; otherwise at the price at the end. Set a price in Settings to fill this in.",
|
||
"confidence_tip": "Profile match confidence (0-100%). How closely the cycle power curve matched the identified program.",
|
||
"flags_tip": "Review, anomaly and source flags for the cycle. Hover an icon for detail.",
|
||
"dbg_conf": "Conf",
|
||
"dbg_mae": "MAE",
|
||
"dbg_corr": "Corr"
|
||
},
|
||
"stat": {
|
||
"avg": "avg",
|
||
"min": "min {v}",
|
||
"max": "max {v}",
|
||
"consistency": "consistency ±{v}",
|
||
"total": "total {v}",
|
||
"last_run": "last run {v}",
|
||
"score": "score {pct}%",
|
||
"duration_cv": "duration CV {pct}%",
|
||
"avg_confidence": "avg confidence {pct}%"
|
||
},
|
||
"pg_evd": {
|
||
"detected": "The detector recognized a cycle had started.",
|
||
"match_commit": "The matcher committed to a program with enough confidence.",
|
||
"match_changed": "The leading program changed as more of the cycle was seen.",
|
||
"match_ambiguous": "Two programs scored close together, so the match was uncertain.",
|
||
"unmatched": "No saved program fit this cycle.",
|
||
"notify_start": "A start notification would be sent.",
|
||
"notify_pre_complete": "An almost-done notification would be sent.",
|
||
"notify_finish": "A finish notification would be sent.",
|
||
"notify_milestone": "A milestone notification would be sent.",
|
||
"notify_held": "A notification was held back for quiet hours.",
|
||
"finished": "The cycle reached a terminal state and ended.",
|
||
"match_reverted": "The program fell back to detecting: its score dropped well below its own peak.",
|
||
"verified_pause": "The live alignment confirmed (or released) a pause inside the program. While it holds, the cycle is not ended.",
|
||
"stalled": "The cycle sat at standby draw longer than this program ever pauses there, with work left. Shown as Paused (Stalled); the cycle stays open."
|
||
},
|
||
"store": {
|
||
"browse": "Browse",
|
||
"device": "Device",
|
||
"programs_count": "Programs: {n}",
|
||
"search_ph2": "Search by brand or model…",
|
||
"your_model": "Yours",
|
||
"your_model_tip": "This is the appliance you declared in Settings",
|
||
"no_results": "No matching appliances found. Try a different search.",
|
||
"no_programs": "No shared programs for this appliance yet.",
|
||
"no_cycles": "No reference cycles shared for this program yet.",
|
||
"anon": "anonymous",
|
||
"uploaded_by": "Shared by {name}",
|
||
"connected_as": "Connected as {name}",
|
||
"not_connected": "Not connected. Connect a GitHub account to share your own cycles.",
|
||
"import_new": "New profile",
|
||
"import_merge": "Merge into existing",
|
||
"merge_target": "Merge into profile",
|
||
"description": "Description (optional)",
|
||
"contributed_by": "by {name}",
|
||
"website": "Store website ↗",
|
||
"website_tip": "Open the community store website",
|
||
"favorites": "Favourites",
|
||
"rating_summary": "★ {avg} ({n})",
|
||
"no_ratings": "No ratings yet",
|
||
"unreachable": "Couldn't reach the community store. Check your connection and try again."
|
||
},
|
||
"settings": {
|
||
"gear": {
|
||
"title": "Preferences"
|
||
}
|
||
},
|
||
"link": {
|
||
"maintenance_supporter": "Maintenance Supporter on GitHub ↗",
|
||
"manual": "Manual ↗"
|
||
},
|
||
"tip": {
|
||
"add_brand": "Brand not listed? Add it to the community catalog",
|
||
"add_appliance": "Model not listed? Add your appliance to the community catalog",
|
||
"add_profile": "Add a profile for this appliance on the community site"
|
||
},
|
||
"task": {
|
||
"reprocess": {
|
||
"matching": "Reprocessing: matching cycles",
|
||
"golden": "Reprocessing: backfilling golden",
|
||
"suggestions": "Reprocessing: suggestions",
|
||
"ml_training": "Reprocessing: ML training",
|
||
"costs": "Reprocessing: energy costs",
|
||
"health": "Reprocessing: cycle health"
|
||
},
|
||
"pg_sweep": {
|
||
"optimize": "Optimize: {param}"
|
||
},
|
||
"pg_detail": {
|
||
"simulate": "Simulate cycle"
|
||
},
|
||
"split": {
|
||
"apply": "Splitting cycle"
|
||
},
|
||
"trim": {
|
||
"apply": "Trimming cycle"
|
||
},
|
||
"merge": {
|
||
"apply": "Merging cycles"
|
||
},
|
||
"rebuild": {
|
||
"envelopes": "Rebuilding envelopes"
|
||
},
|
||
"cancelling": "Cancelling...",
|
||
"auto_label": {
|
||
"running": "Auto-labelling cycles"
|
||
},
|
||
"store_download": {
|
||
"running": "Downloading from the store"
|
||
}
|
||
},
|
||
"setup": {
|
||
"hdr": {
|
||
"card": "Device Setup",
|
||
"healthy_chip": "Setup complete"
|
||
},
|
||
"phase0": {
|
||
"washer": "WashData is already detecting your cycles. Record your first cycle to enable program names and time estimates.",
|
||
"dishwasher": "WashData is watching. Dishwasher cycles are complex, so record your first cycle. If a detected cycle runs too long, trim it in the cycle editor before saving it as a profile.",
|
||
"generic": "WashData is watching. Record or label a detected cycle to start building profiles."
|
||
},
|
||
"phase1a": {
|
||
"labelled": "Good start: your first program is saved. For the cleanest data, record your next cycle with the recorder."
|
||
},
|
||
"phase1b": {
|
||
"recorded": "Your recording was saved as {profile_name}. Now record or label your other common programs."
|
||
},
|
||
"phase1c": {
|
||
"verify": "You have {count} programs from the community. Run a cycle to check WashData recognises it; matching improves as your device builds its own history."
|
||
},
|
||
"phase2": {
|
||
"cluster": "WashData has seen {count} similar cycles that match no saved program. Create a new profile for them?",
|
||
"unmatched": "Your last cycle didn't match any saved program. Is it a new program?"
|
||
},
|
||
"phase3": {
|
||
"suggestions": "WashData has setting suggestions from your cycle history. Review them to improve detection."
|
||
},
|
||
"phase4": {
|
||
"healthy": "This device is fully set up ({profile_count} profiles)."
|
||
},
|
||
"cta": {
|
||
"start_recording": "Start Recording",
|
||
"label_detected_cycle": "I already have a detected cycle – label it instead",
|
||
"browse_cycles": "Browse cycles to label another",
|
||
"view_profiles": "View your profiles",
|
||
"create_from_cluster": "Create profile from these cycles",
|
||
"create_profile": "Create a profile for it",
|
||
"review_suggestions": "Review suggestions",
|
||
"skip_step": "Skip this step",
|
||
"skip_forever": "Don't show again",
|
||
"hide_guidance": "Hide guidance",
|
||
"show_guidance": "Show guidance"
|
||
}
|
||
},
|
||
"access": {
|
||
"edit": "Edit",
|
||
"full": "Full",
|
||
"inherit": "Inherit",
|
||
"none": "None (hidden)",
|
||
"read": "Read"
|
||
},
|
||
"pg_label_reason": {
|
||
"no_winner": "No program fit",
|
||
"below_floor": "Below the learning confidence",
|
||
"ambiguous": "Flagged ambiguous",
|
||
"margin": "Too close to the runner-up",
|
||
"unknown_profile": "Program no longer exists",
|
||
"not_evaluated": "Not evaluated"
|
||
},
|
||
"diagram": {
|
||
"accum": "accum",
|
||
"auto": "auto",
|
||
"below_off": "below = off",
|
||
"confirmed": "confirmed",
|
||
"energy_counts": "energy counts",
|
||
"feedback": "feedback",
|
||
"gap_below_min": "gap below min = one cycle",
|
||
"heat_phase": "heat phase",
|
||
"held_at_100": "held at 100%",
|
||
"ignored": "ignored",
|
||
"kept": "kept",
|
||
"max": "max",
|
||
"min": "min",
|
||
"minus_tol": "-tol",
|
||
"no_match": "no match",
|
||
"no_updates": "no updates",
|
||
"off_delay_wait": "off-delay wait",
|
||
"off_gap": "off-gap",
|
||
"plus_tol": "+tol",
|
||
"profile": "profile",
|
||
"reading_interval": "typical reading interval",
|
||
"sensor_offline": "sensor offline: force-stop",
|
||
"si": "SI",
|
||
"spike_ignored": "spike ignored",
|
||
"spike_ignored_short": "spike: ignored",
|
||
"start": "start",
|
||
"stop": "stop",
|
||
"tail_energy_resets": "tail energy above thresh: timer resets",
|
||
"thr": "thr",
|
||
"too_short": "too short",
|
||
"tumble_kept": "tumble pulses kept"
|
||
}
|
||
}
|