diff --git a/custom_components/ha_washdata/__init__.py b/custom_components/ha_washdata/__init__.py index 976c3918..2a872d70 100644 --- a/custom_components/ha_washdata/__init__.py +++ b/custom_components/ha_washdata/__init__.py @@ -302,7 +302,7 @@ async def async_migrate_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: minor_version=8, ) _log.info( - "Migrated WashData entry from version %s.%s to 3.7", version, minor_version + "Migrated WashData entry from version %s.%s to 3.8", version, minor_version ) return True @@ -646,6 +646,33 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: await async_load_panel_config(hass) # self-guards; safe to call repeatedly from . import store_account # pylint: disable=import-outside-toplevel await store_account.async_load(hass) # integration-wide online flag + account + + # Cache the integration version from HA's already-loaded manifest (no file IO). + # ws_get_constants reads it from hass.data; we can't do a module-level read_text + # in ws_api.py because the module is imported lazily inside this coroutine and the + # IO runs on the event loop (#328/#335). + if "ha_washdata_version" not in hass.data: + try: + from homeassistant.loader import async_get_integration as _aget_integration # pylint: disable=import-outside-toplevel + _integ = await _aget_integration(hass, DOMAIN) + hass.data["ha_washdata_version"] = _integ.manifest.get("version", "") or "" + except Exception as err: # pylint: disable=broad-exception-caught + _LOGGER.debug("Could not load ha_washdata version from manifest: %s", err) + # Fall back to reading manifest.json off the event loop. Only + # write the key when the read succeeds so that a double failure + # (loader + file) leaves the key absent rather than storing "" + # (which would shadow _INTEGRATION_VERSION in ws_get_constants). + def _read_manifest_version() -> str: + try: + return json.loads( + (Path(__file__).parent / "manifest.json").read_text(encoding="utf-8") + ).get("version") or "" + except Exception: # pylint: disable=broad-exception-caught + return "" + _fallback_version = await hass.async_add_executor_job(_read_manifest_version) + if _fallback_version: + hass.data["ha_washdata_version"] = _fallback_version + async_register_commands(hass) hass.data["ha_washdata_ws_registered"] = True diff --git a/custom_components/ha_washdata/analysis.py b/custom_components/ha_washdata/analysis.py index 97dc4b62..5f5540b7 100644 --- a/custom_components/ha_washdata/analysis.py +++ b/custom_components/ha_washdata/analysis.py @@ -41,9 +41,23 @@ from .const import ( MATCH_MAE_PEAK_FLOOR, MATCH_MAE_REF_PEAK, MATCH_MAE_SCALE, + STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES, ) +def stage4_energy_mode(device_type: str | None) -> str: + """Return the Stage-4 ``energy_mode`` for a device type. + + ``"integrated"`` for device types in + ``STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES`` (washing machine / washer-dryer), + where same-duration temperature/spin variants make integrated energy the + right discriminator; ``"mean"`` (the historical default) otherwise. Single + source of truth for the gate, used by the manager, Playground and matching + tuner so all three stay consistent with the live matcher. + """ + return "integrated" if device_type in STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES else "mean" + + def _agreement(observed: float, expected: float, scale: float) -> float: """1.0 when observed==expected, decaying with the |log-ratio| / scale.""" if observed <= 0 or expected <= 0 or scale <= 0: @@ -426,12 +440,18 @@ def compute_matches_worker( dur_w, en_w = dur_w / de_sum, en_w / de_sum shape_w = max(0.0, 1.0 - dur_w - en_w) if (dur_w > 0 or en_w > 0) and candidates and current_duration > 0: - cur_energy = float(np.mean(curr_arr)) # mean power (W) — no duration multiplication + # energy_mode: "mean" (default) compares whole-cycle mean power (W); + # "integrated" compares true integrated energy (mean x duration). Opt-in so + # the historical default is byte-for-byte preserved. See register item 99. + integrated = config.get("energy_mode", "mean") == "integrated" + cur_mean = float(np.mean(curr_arr)) + cur_energy = cur_mean * current_duration if integrated else cur_mean for cand in candidates: prof_dur = float(cand.get("profile_duration") or 0.0) dur_ag = _agreement(current_duration, prof_dur, dur_scale) sample = cand.get("sample") or [] - cand_energy = float(np.mean(sample)) if sample else 0.0 + cand_mean = float(np.mean(sample)) if sample else 0.0 + cand_energy = cand_mean * prof_dur if integrated else cand_mean en_ag = _agreement(cur_energy, cand_energy, en_scale) cand["shape_score"] = float(cand["score"]) cand["score"] = float( @@ -620,6 +640,27 @@ def compute_envelope_worker( if len(offsets) < 3: continue + # Stored offsets are rounded to 0.1s, so two readings less than 0.1s apart + # collapse onto the same offset. A single such duplicate must not discard the + # whole trace (#377): drop the duplicate sample(s) instead of the cycle. Only + # exact duplicates are collapsed here; a genuinely out-of-order (decreasing) + # offset - which sorted storage never produces - is left for the strict check + # below to reject, exactly as before. + if offsets.size > 1: + diffs = np.diff(offsets) + if np.any(diffs == 0): + keep = np.concatenate(([True], diffs != 0)) + dropped = int((~keep).sum()) + offsets = offsets[keep] + values = values[keep] + _LOGGER.debug( + "compute_envelope_worker: dropped %d duplicate sample offset(s) " + "from a cycle trace (0.1s offset rounding)", + dropped, + ) + if len(offsets) < 3: + continue + if not np.all(np.diff(offsets) > 0): continue diff --git a/custom_components/ha_washdata/const.py b/custom_components/ha_washdata/const.py index 6077bbfd..08fc84a0 100644 --- a/custom_components/ha_washdata/const.py +++ b/custom_components/ha_washdata/const.py @@ -43,6 +43,10 @@ CONF_POWER_SENSOR = "power_sensor" CONF_NAME = "name" CONF_MIN_POWER = "min_power" CONF_OFF_DELAY = "off_delay" +# Bucket size (minutes) for the per-profile `power_profile` sensor attribute that +# external planners (EMHASS, tibber_prices) consume. Configurable so short sharp +# spikes are not blurred by the fixed 15-min default (#367). Read-time only. +CONF_POWER_PROFILE_INTERVAL_MIN = "power_profile_interval_min" CONF_NOTIFY_SERVICE = "notify_service" # Deprecated - kept for migration only CONF_NOTIFY_ACTIONS = "notify_actions" CONF_NOTIFY_PEOPLE = "notify_people" @@ -132,6 +136,7 @@ CONF_ANTI_WRINKLE_MAX_POWER = "anti_wrinkle_max_power" # W threshold for anti-w CONF_ANTI_WRINKLE_MAX_DURATION = "anti_wrinkle_max_duration" # Seconds to treat as anti-wrinkle CONF_ANTI_WRINKLE_EXIT_POWER = "anti_wrinkle_exit_power" # W threshold for true-off exit CONF_ANTI_WRINKLE_IDLE_TIMEOUT = "anti_wrinkle_idle_timeout" # Seconds below exit power before anti-wrinkle ends +CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE = "dishwasher_end_spike_quiet_release" # Dishwasher: sustained-quiet seconds after expected duration that release the end-of-cycle drain wait early (#379) CONF_DELAY_START_DETECT_ENABLED = "delay_start_detect_enabled" # Enable delayed-start detection CONF_DELAY_CONFIRM_SECONDS = "delay_confirm_seconds" # Seconds power must stay in standby band before DELAY_WAIT engages CONF_DELAY_TIMEOUT_HOURS = "delay_timeout_hours" # Safety timeout (hours) while waiting to start @@ -153,6 +158,10 @@ CONF_NOTIFY_PRE_COMPLETE_MESSAGE = "notify_pre_complete_message" CONF_NOTIFY_LIVE_INTERVAL_SECONDS = "notify_live_interval_seconds" CONF_NOTIFY_LIVE_OVERRUN_PERCENT = "notify_live_overrun_percent" CONF_NOTIFY_LIVE_CHRONOMETER = "notify_live_chronometer" +# Opt-in data keys on the EXISTING live progress notification (#347): keep-on-tap +# (sticky) and a tap target (clickAction). Not new notification types. Mobile-only. +CONF_NOTIFY_LIVE_STICKY = "notify_live_sticky" +CONF_NOTIFY_LIVE_CLICK_ACTION = "notify_live_click_action" CONF_NOTIFY_REMINDER_MESSAGE = "notify_reminder_message" # Distinct one-time pre-end alert CONF_NOTIFY_TIMEOUT_SECONDS = "notify_timeout_seconds" # Auto-dismiss after N seconds (0 = never) CONF_NOTIFY_CHANNEL = "notify_channel" # Android channel for status/live/reminder @@ -174,10 +183,19 @@ CONF_PEAK_RATE_MESSAGE = "peak_rate_message" # Door sensor & pause CONF_DOOR_SENSOR_ENTITY = "door_sensor_entity" # Optional binary_sensor for machine door +# Auto-open dishwashers (AirDry etc.) pop the door at cycle end; a sustained +# door-open then means the cycle finished, not a mid-cycle pause (#342). +CONF_DOOR_OPENS_AT_END = "door_opens_at_end" +CONF_DOOR_END_DWELL_SECONDS = "door_end_dwell_seconds" +DEFAULT_DOOR_OPENS_AT_END = False +DEFAULT_DOOR_END_DWELL_SECONDS = 60 # door must stay open this long to finalize CONF_PAUSE_CUTS_POWER = "pause_cuts_power" # Also turn off switch entity when pausing CONF_SWITCH_ENTITY = "switch_entity" # Optional switch entity toggled on pause/resume CONF_NOTIFY_UNLOAD_DELAY_MINUTES = "notify_unload_delay_minutes" # Minutes before "laundry waiting" nag CONF_NOTIFY_UNLOAD_MESSAGE = "notify_unload_message" # Template for the clean-laundry nag message +# Repeat the unload reminder every delay-minutes until the door opens or the user +# taps the notification's "stop reminding" action (opt-in, #374). +CONF_NOTIFY_UNLOAD_REPEAT = "notify_unload_repeat" # Quiet hours (do-not-disturb window). Both hours 0-23; unset/None (or start==end) # = feature off. When configured, finish-type notifications (finish, clean-laundry @@ -209,11 +227,22 @@ DEFAULT_NOTIFY_FIRE_EVENTS = True DEFAULT_NOTIFY_LIVE_INTERVAL_SECONDS = 300 DEFAULT_NOTIFY_LIVE_OVERRUN_PERCENT = 20 DEFAULT_NOTIFY_LIVE_CHRONOMETER = False +DEFAULT_NOTIFY_LIVE_STICKY = False # #347: off = today's behaviour (tap dismisses) +DEFAULT_NOTIFY_LIVE_CLICK_ACTION = "" # #347: empty = no tap target (today's behaviour) DEFAULT_NOTIFY_TIMEOUT_SECONDS = 0 # 0 = notifications never auto-dismiss DEFAULT_NOTIFY_CHANNEL = "" # Empty = omit channel (companion app default) DEFAULT_NOTIFY_FINISH_CHANNEL = "" # Empty = reuse status channel DEFAULT_NOTIFY_UNLOAD_DELAY_MINUTES = 60 # 1 hour before "still waiting" nag notification DEFAULT_NOTIFY_UNLOAD_MESSAGE = "{device} finished {duration}m ago - laundry is still inside." +DEFAULT_NOTIFY_UNLOAD_REPEAT = False # opt-in: re-send the unload reminder until dismissed (#374) +# Safety bound on repeat mode (#374). The reminder is meant to run "until the door +# opens", and the in-notification "Stop reminding" button is mobile_app-only - so a +# user whose only notify target is non-mobile has the door sensor as their sole +# escape. If that sensor never reports open (offline, or nobody home), the reminder +# would re-fire forever AND pin the entity in Clean state, blocking the power-based +# Off detection indefinitely. 48 reminders is ~2 days at the 60-minute default, far +# past any legitimate reminder window, so normal use never reaches it. +NOTIFY_UNLOAD_REPEAT_MAX_REMINDERS = 48 DEFAULT_PEAK_RATE_MESSAGE = "Running at peak rate ({price}/kWh)." # Quiet hours default: feature off (both hours unset). See CONF_NOTIFY_QUIET_*. @@ -227,6 +256,7 @@ DEFAULT_NOTIFY_MILESTONE_MESSAGE = "{device} has completed {cycle_count} cycles! # Defaults DEFAULT_MIN_POWER = 2.0 # Watts DEFAULT_OFF_DELAY = 180 # Seconds (3 minutes, safer for 60s polling) +DEFAULT_POWER_PROFILE_INTERVAL_MIN = 15 # power_profile attribute bucket (#367) DEFAULT_NAME = "Washing Machine" # Seconds without updates while active before forced stop (publish-on-change sockets) DEFAULT_NO_UPDATE_ACTIVE_TIMEOUT = 600 # 10 minutes @@ -492,6 +522,7 @@ MATCH_ENERGY_WEIGHT = 0.22 MATCH_DURATION_SCALE = 0.175 # ~ln ratio at which duration agreement halves MATCH_ENERGY_SCALE = 0.25 # ~ln ratio at which energy agreement halves + # States STATE_OFF = "off" STATE_DELAY_WAIT = "delay_wait" @@ -551,6 +582,21 @@ DEVICE_TYPE_GENERIC = "generic" # to this bucket on load (see __init__.py), preserving their tuned options. DEVICE_TYPE_OTHER = "other" +# Device types whose Stage-4 "energy agreement" compares INTEGRATED energy +# (mean power x duration) instead of mean power. On these, same-base program +# variants differ mainly in temperature/spin at roughly equal duration, so +# integrated energy (which mean power dilutes) is the right discriminator - +# validated on real store data (washer top-1 +3.4pp, FP down). Other device +# types (dishwasher/dryer/...) keep mean power, because their programs are +# distinguished by duration and integrated energy would conflate the two axes +# (validated: it regresses there). See register item 99 / the cycle-variant +# discrimination spec. Defined from the device-type constants above (not string +# literals) so it can never drift from them. +STAGE4_INTEGRATED_ENERGY_DEVICE_TYPES = ( + DEVICE_TYPE_WASHING_MACHINE, + DEVICE_TYPE_WASHER_DRYER, +) + DEVICE_TYPES = { DEVICE_TYPE_WASHING_MACHINE: "Washing Machine", DEVICE_TYPE_DRYER: "Dryer", @@ -1013,3 +1059,10 @@ PLAYGROUND_STRESS_MAX_SPARSE_STEPS: int = 15 # max sparse steps → max PLAYGROUND_STRESS_MAX_IDLE_W: float = 100000.0 # upper bound for a manual idle override # (far beyond any appliance; guards against # inf/absurd values corrupting synthesis) + +# ─── Playground setting presets (sandbox snapshots, per device) ──────────────── +# Named snapshots of the Playground control panel's values, stored under the +# "playground_presets" store key. They never touch the live config: publishing a +# value to entry.options is always an explicit, per-setting user action. +PLAYGROUND_PRESET_MAX: int = 30 # per-device cap (keeps the store small) +PLAYGROUND_PRESET_NAME_MAX: int = 60 # preset name length cap diff --git a/custom_components/ha_washdata/cycle_detector.py b/custom_components/ha_washdata/cycle_detector.py index 6af6bbdf..b8b3f033 100644 --- a/custom_components/ha_washdata/cycle_detector.py +++ b/custom_components/ha_washdata/cycle_detector.py @@ -123,7 +123,7 @@ class CycleDetectorConfig: completion_min_seconds: int = 600 start_duration_threshold: float = 5.0 start_energy_threshold: float = 0.005 - end_energy_threshold: float = 0.05 # 50 Wh threshold for "still active" + end_energy_threshold: float = 0.05 # 0.05 Wh (50 mWh) threshold for "still active" end_repeat_count: int = 1 min_off_gap: int = 60 start_threshold_w: float = 2.0 @@ -141,6 +141,11 @@ class CycleDetectorConfig: anti_wrinkle_max_duration: float = 60.0 anti_wrinkle_exit_power: float = 0.8 anti_wrinkle_idle_timeout: float = 120.0 + # Dishwasher only: sustained-quiet seconds (after reaching expected duration) + # that release the end-of-cycle pump-out/drain wait early (#379). Defaults to + # the shipped constant; per-device configurable so a machine with a long silent + # passive-drying phase before its final drain can absorb profile drift. + dishwasher_end_spike_quiet_release: float = DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS delay_detect_enabled: bool = False # Sustained seconds power must stay in the standby band (between # stop_threshold_w and start_threshold_w) before DELAY_WAIT engages. @@ -221,7 +226,7 @@ class CycleDetector: profile_matcher: ( Callable[ [list[tuple[datetime, float]]], - tuple[str | None, float, float, str | None], + tuple[str | None, float, float, str | None] | None, ] | None ) = None, @@ -276,6 +281,11 @@ class CycleDetector: self._energy_since_idle_wh: float = 0.0 self._time_above_threshold: float = 0.0 self._time_below_threshold: float = 0.0 + # As above, but restarts whenever an outage-sized gap breaks the observed + # quiet tail, so it counts only quiet WashData actually saw. Used by the + # dishwasher quiet-release gates so a single low sample after a telemetry + # dropout can't satisfy them without the quiet having been observed. + self._time_below_threshold_gapfree: float = 0.0 self._last_process_time: datetime | None = None # New State Machine trackers @@ -301,6 +311,7 @@ class CycleDetector: self._end_spike_duration: float = 0.0 # cycle duration (s) when _end_spike_seen was last set self._match_ambiguous: bool = False # last live match was ambiguous (gates predictive end) self._match_prefix_ambiguous: bool = False # longer candidate with good shape exists (prefix guard) + self._last_smart_term_block_reason: str | None = None # #346 diagnostic throttle # Anti-wrinkle tracking (dryers only) self._anti_wrinkle_candidate_start: datetime | None = None @@ -626,6 +637,7 @@ class CycleDetector: # (ANTI_WRINKLE needs to track idle time to determine true-off) if target_state != STATE_ANTI_WRINKLE: self._time_below_threshold = 0.0 + self._time_below_threshold_gapfree = 0.0 self._last_match_time = None self._matched_profile = None # Clear stale match state so the next cycle starts with clean defaults. @@ -635,6 +647,11 @@ class CycleDetector: self._last_match_confidence = 0.0 self._match_ambiguous = False self._match_prefix_ambiguous = False + # Per-cycle diagnostic throttle (#346): the "Smart Termination not applied" + # line only logs when the reason CHANGES. Carrying the previous cycle's + # reason across a reset swallows the new cycle's very first diagnostic + # whenever it happens to be blocked for the same reason. + self._last_smart_term_block_reason = None self._ignore_power_until_idle = False # Reset lockout self._lockout_high_seconds = 0.0 # Clear the verified-pause flag so it can't leak into the next cycle (B6): @@ -688,6 +705,35 @@ class CycleDetector: """Return the expected duration of the current cycle in seconds.""" return self._expected_duration + @staticmethod + def _smart_term_block_reason( + current_duration: float, + expected: float, + smart_ratio: float, + is_confident: bool, + ambiguous: bool, + prefix_ambiguous: bool, + ) -> str | None: + """Why the Smart-Termination fast end-path did NOT fire, for diagnostics. + + Returns None when the gate would pass, or when no expected duration is known + yet (nothing meaningful to report). Mirrors the gate's four conditions in + order so the first blocking reason is surfaced. Pure and side-effect-free; + the detector logs the result (throttled to reason changes) - no behaviour + change (#346). + """ + if expected <= 0: + return None + if current_duration < expected * smart_ratio: + return "duration_not_reached" + if not is_confident: + return "low_confidence" + if ambiguous: + return "match_ambiguous" + if prefix_ambiguous: + return "prefix_ambiguous" + return None + def process_reading(self, power: float, timestamp: datetime) -> None: """Process a new power reading using robust dt-aware logic.""" @@ -731,6 +777,12 @@ class CycleDetector: ) # Fall through: the state machine will start a new cycle. + # Snapshot the cadence BEFORE folding this reading in: the gap-free tally + # below classifies `dt` against a ceiling derived from the cadence, and an + # outage that has already widened p95 would raise the very threshold that + # is supposed to catch it (a 120 s gap after a 10 s cadence lifts p95 to + # ~15.5 s -> ceiling 155 s -> the gap counts as observed quiet). + prior_p95_dt = self._p95_dt self._update_cadence(dt) self._last_process_time = timestamp @@ -751,6 +803,7 @@ class CycleDetector: if is_high: self._time_above_threshold += dt self._time_below_threshold = 0.0 + self._time_below_threshold_gapfree = 0.0 # Energy integration (trapezoidal approx for this single step) # prev_p = self._last_power if self._last_power is not None else power # step_wh = ((power + prev_p) / 2.0) * (dt / 3600.0) @@ -762,6 +815,17 @@ class CycleDetector: self._last_active_time = timestamp else: self._time_below_threshold += dt + # Gap-free tally: an outage-sized step is unobserved time, so restart + # the observed-quiet tally from this sample instead of crediting the + # gap. Ceiling mirrors energy_gap_threshold_s (clip(10x cadence, 60, + # 3600)) but reuses the maintained p95 cadence to stay O(1) in this + # per-reading hot path. Uses the cadence as it stood BEFORE this + # reading, so a gap cannot widen its own acceptance threshold. + outage_ceiling = min(3600.0, max(60.0, 10.0 * prior_p95_dt)) + if dt > outage_ceiling: + self._time_below_threshold_gapfree = 0.0 + else: + self._time_below_threshold_gapfree += dt self._time_above_threshold = 0.0 self._time_in_state += dt @@ -1347,6 +1411,31 @@ class CycleDetector: # waits for the fallback timeout instead of getting an early # close — an acceptable trade-off against the alternative of # splitting a Normal wash into two separate cycle records. + # Surface why the fast end-path is (not) firing, throttled to + # reason changes so a stuck cycle's cause is visible in the log + # without spamming every reading. Pure diagnostic (#346). + _block_reason = self._smart_term_block_reason( + current_duration, + self._expected_duration, + smart_ratio, + is_confident_match, + self._match_ambiguous, + self._match_prefix_ambiguous, + ) + if _block_reason != self._last_smart_term_block_reason: + self._last_smart_term_block_reason = _block_reason + if _block_reason is not None: + self._logger.debug( + "Smart Termination not applied (%s): dur=%.0fs/%.0fs conf=%.2f " + "ambiguous=%s prefix_ambiguous=%s", + _block_reason, + current_duration, + self._expected_duration * smart_ratio, + getattr(self, "_last_match_confidence", 0.0), + self._match_ambiguous, + self._match_prefix_ambiguous, + ) + if ( current_duration >= (self._expected_duration * smart_ratio) and is_confident_match @@ -1421,8 +1510,8 @@ class CycleDetector: + DISHWASHER_END_SPIKE_WAIT_SECONDS ) or ( current_duration >= self._expected_duration - and self._time_below_threshold - >= DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS + and self._time_below_threshold_gapfree + >= self._config.dishwasher_end_spike_quiet_release ) if ( self._config.device_type == "dishwasher" @@ -2130,8 +2219,8 @@ class CycleDetector: # passive-drying phase that still precedes a late pump-out deferred. quiet_released = ( duration >= self._expected_duration - and self._time_below_threshold - >= DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS + and self._time_below_threshold_gapfree + >= self._config.dishwasher_end_spike_quiet_release ) if ( self._config.device_type == "dishwasher" @@ -2142,13 +2231,18 @@ class CycleDetector: < (self._expected_duration + DISHWASHER_END_SPIKE_WAIT_SECONDS) and not quiet_released ): + # Report the gap-free tally: that is what `quiet_released` above reads, + # and after a telemetry outage the two diverge - logging the plain one + # would show quiet time that played no part in the decision. self._logger.debug( "Deferring cycle finish: dishwasher waiting for end-of-cycle " - "pump-out (%.0fs < expected %.0fs + %.0fs wait, quiet %.0fs, profile: %s)", + "pump-out (%.0fs < expected %.0fs + %.0fs wait, observed quiet " + "%.0fs of %.0fs needed, profile: %s)", duration, self._expected_duration, DISHWASHER_END_SPIKE_WAIT_SECONDS, - self._time_below_threshold, + self._time_below_threshold_gapfree, + self._config.dishwasher_end_spike_quiet_release, self._matched_profile, ) return True @@ -2247,9 +2341,13 @@ class CycleDetector: final_readings.append((end_time, last_p)) start_ts = self._current_cycle_start.timestamp() + # Store timestamps in canonical UTC (#369). Reading timestamps arrive from + # dt_util.now() (HA-local-aware) while trim/split paths emit UTC, which left + # past_cycles with a mix of offsets. Normalizing here (instant-preserving) + # keeps stored cycles consistent and safe for cross-device/store transfer. cycle_data: dict[str, Any] = { - "start_time": self._current_cycle_start.isoformat(), - "end_time": end_time.isoformat(), + "start_time": dt_util.as_utc(self._current_cycle_start).isoformat(), + "end_time": dt_util.as_utc(end_time).isoformat(), "duration": duration, "max_power": self._cycle_max_power, "status": status, @@ -2329,6 +2427,7 @@ class CycleDetector: "accumulated_energy_wh": self._energy_since_idle_wh, "time_above": self._time_above_threshold, "time_below": self._time_below_threshold, + "time_below_gapfree": self._time_below_threshold_gapfree, "cycle_max_power": self._cycle_max_power, "last_active_time": ( self._last_active_time.isoformat() if self._last_active_time else None @@ -2366,6 +2465,15 @@ class CycleDetector: self._energy_since_idle_wh = snapshot.get("accumulated_energy_wh", 0.0) self._time_above_threshold = snapshot.get("time_above", 0.0) self._time_below_threshold = snapshot.get("time_below", 0.0) + # Old snapshots lack the gap-free tally, and the plain value they do + # carry may already include outage-sized intervals — the exact + # contamination this field exists to exclude — so it must NOT be used + # as the fallback. 0.0 is also the honest value on a restore in + # general: the restart itself is unobserved time (the manager records + # it as a restart gap), so no quiet observed before it still counts. + self._time_below_threshold_gapfree = float( + snapshot.get("time_below_gapfree", 0.0) or 0.0 + ) self._cycle_max_power = snapshot.get("cycle_max_power", 0.0) # Sanitize via the same helper as update_match so the class # invariant on _expected_duration holds across restarts and the diff --git a/custom_components/ha_washdata/learning.py b/custom_components/ha_washdata/learning.py index 8d062908..291916c9 100644 --- a/custom_components/ha_washdata/learning.py +++ b/custom_components/ha_washdata/learning.py @@ -161,8 +161,23 @@ class LearningManager: and (len(past_cycles) - last_apply_count) < MIN_SUGGESTION_COOLDOWN_CYCLES ) + # Locked keys (#343): the user has told the auto-tuner to stop proposing + # these (e.g. thresholds that break an anti-crease-tuned device). Drop them + # from the pending map so they never re-surface until unlocked. + try: + locked = set(self.profile_store.get_locked_suggestions()) + except Exception: # pylint: disable=broad-exception-caught + locked = set() + + existing_suggestions = self.profile_store.get_suggestions() filtered_suggestions: dict[str, Any] = {} + any_deleted = False for key, data in suggestions.items(): + if key in locked: + if key in existing_suggestions: + self.profile_store.delete_suggestion(key) + any_deleted = True + continue if isinstance(data, dict) and "value" in data: current_val = current_options.get(key) suggested_val = data["value"] @@ -174,6 +189,7 @@ class LearningManager: # Gate 1: exact equality → stale, delete so it doesn't linger. if abs_delta < 1e-9: self.profile_store.delete_suggestion(key) + any_deleted = True continue # Gate 2: change too small to be meaningful → delete (noise). @@ -181,6 +197,7 @@ class LearningManager: if (rel_delta < MIN_SUGGESTION_REL_DELTA and abs_delta < _suggestion_min_abs_delta(key)): self.profile_store.delete_suggestion(key) + any_deleted = True continue # Gate 3: cooldown active → skip update without deleting. @@ -195,6 +212,8 @@ class LearningManager: filtered_suggestions[key] = data if not filtered_suggestions: + if any_deleted: + self.hass.async_create_task(self.profile_store.async_save()) return self.suggestion_engine.apply_suggestions(filtered_suggestions) @@ -295,8 +314,9 @@ class LearningManager: async def _async_run_batch_simulation(self, cycles: list[dict[str, Any]]) -> None: """Run multi-cycle batch simulation asynchronously.""" try: + engine = self.suggestion_engine.for_job() new_suggestions = await self.hass.async_add_executor_job( - self.suggestion_engine.run_batch_simulation, cycles + engine.run_batch_simulation, cycles ) if new_suggestions: self._apply_suggestions_and_notify(new_suggestions) @@ -313,8 +333,9 @@ class LearningManager: try: # Simulation runner derives optimal thresholds # Offload to executor since simulation can be heavy (CPU bound) + engine = self.suggestion_engine.for_job() new_suggestions = await self.hass.async_add_executor_job( - self.suggestion_engine.run_simulation, cycle_data + engine.run_simulation, cycle_data ) if new_suggestions: self._apply_suggestions_and_notify(new_suggestions) @@ -342,8 +363,10 @@ class LearningManager: # Throttle before dispatching so repeated readings within the window do # not schedule overlapping passes. self._last_suggestion_update = now + # Bind the config snapshot here, on the loop, not inside the executor job. + engine = self.suggestion_engine.for_job() self._dispatch_scan_and_apply( - lambda: self.suggestion_engine.generate_operational_suggestions(p95, median), + lambda: engine.generate_operational_suggestions(p95, median), "Operational", ) @@ -354,7 +377,7 @@ class LearningManager: offloaded to an executor thread by ``_dispatch_scan_and_apply``. """ self._dispatch_scan_and_apply( - self.suggestion_engine.generate_model_suggestions, + self.suggestion_engine.for_job().generate_model_suggestions, "Model", ) @@ -408,8 +431,9 @@ class LearningManager: async def _async_run_detection_suggestions(self) -> None: """Run the detection-suggestion pass off the event loop.""" try: + engine = self.suggestion_engine.for_job() new_suggestions = await self.hass.async_add_executor_job( - self.suggestion_engine.generate_detection_suggestions + engine.generate_detection_suggestions ) if new_suggestions: self._apply_suggestions_and_notify(new_suggestions) @@ -432,12 +456,13 @@ class LearningManager: if model.count >= 20 and model.p95 is not None and model.median is not None: p95, median = model.p95, model.median op = await self.hass.async_add_executor_job( - self.suggestion_engine.generate_operational_suggestions, p95, median + self.suggestion_engine.for_job().generate_operational_suggestions, + p95, median ) if op: self._apply_suggestions_and_notify(op) model_sug = await self.hass.async_add_executor_job( - self.suggestion_engine.generate_model_suggestions + self.suggestion_engine.for_job().generate_model_suggestions ) if model_sug: self._apply_suggestions_and_notify(model_sug) @@ -445,7 +470,7 @@ class LearningManager: # Snapshot the live cycles list before handing it to the executor. cycles = list(self.profile_store.get_past_cycles()) batch = await self.hass.async_add_executor_job( - self.suggestion_engine.run_batch_simulation, cycles + self.suggestion_engine.for_job().run_batch_simulation, cycles ) if batch: self._apply_suggestions_and_notify(batch) @@ -844,10 +869,49 @@ class LearningManager: affected envelopes), so this only records the feedback response and removes the pending entry - it deliberately does NOT re-label or rebuild again. - Returns True when a pending entry existed and was resolved. + Returns True when a pending entry existed and was resolved, OR when no + pending feedback was found but the cycle was sitting in the review queue + (uncertain quality / force_stopped / interrupted) and was marked reviewed. + Returns False when there was nothing to resolve or update. """ pending = self.profile_store.get_pending_feedback().get(cycle_id) if not pending: + # No detection feedback to resolve. A manual (re)label is still the user + # engaging with the cycle, so if it is sitting in the review queue only + # for an uncertain quality label or a force_stopped/interrupted status + # (no pending feedback, so it has no resolve buttons), stamp it reviewed + # to clear the red dot (#331 residual). The quality/label fields are left + # untouched, so no training signal is lost; normal cycles are not touched. + try: + cycle = next( + (c for c in self.profile_store.get_past_cycles() if c.get("id") == cycle_id), + None, + ) + except Exception: # pylint: disable=broad-exception-caught + cycle = None + if cycle is not None: + rv = cycle.get("ml_review") if isinstance(cycle.get("ml_review"), dict) else {} + already_reviewed = bool(rv.get("reviewed_at")) + needs_review = ( + rv.get("label") in ("uncertain", "review") + or rv.get("quality") in ("uncertain", "review") + or cycle.get("status") in ("force_stopped", "interrupted") + or (cycle.get("ml_health") or {}).get("label") in ("uncertain", "review") + ) + if needs_review and not already_reviewed: + try: + await self.profile_store.set_cycle_review(cycle_id) + except Exception as err: # pylint: disable=broad-exception-caught + self._logger.debug( + "set_cycle_review failed for cycle %s: %s", cycle_id, err + ) + return False + async_dispatcher_send(self.hass, f"ha_washdata_update_{self.entry_id}") + self._logger.info( + "Marked cycle %s reviewed from manual label (no pending feedback; " + "cleared needs-review red dot)", cycle_id + ) + return True return False detected = pending.get("detected_profile") diff --git a/custom_components/ha_washdata/manager.py b/custom_components/ha_washdata/manager.py index ba063ef8..2bfc46c6 100644 --- a/custom_components/ha_washdata/manager.py +++ b/custom_components/ha_washdata/manager.py @@ -40,6 +40,7 @@ from homeassistant.core import Context, Event, HomeAssistant, State, callback from homeassistant.helpers.event import ( async_call_later, async_track_state_change_event, + async_track_state_report_event, async_track_time_interval, ) from homeassistant.helpers.dispatcher import async_dispatcher_send @@ -110,6 +111,8 @@ from .const import ( CONF_ANTI_WRINKLE_MAX_DURATION, CONF_ANTI_WRINKLE_EXIT_POWER, CONF_ANTI_WRINKLE_IDLE_TIMEOUT, + CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE, + DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS, CONF_DELAY_START_DETECT_ENABLED, CONF_DELAY_CONFIRM_SECONDS, CONF_DELAY_TIMEOUT_HOURS, @@ -166,6 +169,10 @@ from .const import ( CONF_NOTIFY_LIVE_INTERVAL_SECONDS, CONF_NOTIFY_LIVE_OVERRUN_PERCENT, CONF_NOTIFY_LIVE_CHRONOMETER, + CONF_NOTIFY_LIVE_STICKY, + CONF_NOTIFY_LIVE_CLICK_ACTION, + DEFAULT_NOTIFY_LIVE_STICKY, + DEFAULT_NOTIFY_LIVE_CLICK_ACTION, CONF_NOTIFY_REMINDER_MESSAGE, CONF_NOTIFY_TIMEOUT_SECONDS, CONF_NOTIFY_CHANNEL, @@ -177,12 +184,19 @@ from .const import ( CONF_PEAK_RATE_MESSAGE, DEFAULT_PEAK_RATE_MESSAGE, CONF_DOOR_SENSOR_ENTITY, + CONF_DOOR_OPENS_AT_END, + CONF_DOOR_END_DWELL_SECONDS, + DEFAULT_DOOR_OPENS_AT_END, + DEFAULT_DOOR_END_DWELL_SECONDS, CONF_PAUSE_CUTS_POWER, CONF_SWITCH_ENTITY, CONF_NOTIFY_UNLOAD_DELAY_MINUTES, CONF_NOTIFY_UNLOAD_MESSAGE, + CONF_NOTIFY_UNLOAD_REPEAT, DEFAULT_NOTIFY_UNLOAD_DELAY_MINUTES, DEFAULT_NOTIFY_UNLOAD_MESSAGE, + DEFAULT_NOTIFY_UNLOAD_REPEAT, + NOTIFY_UNLOAD_REPEAT_MAX_REMINDERS, CONF_NOTIFY_MILESTONES, CONF_NOTIFY_MILESTONE_MESSAGE, DEFAULT_NOTIFY_MILESTONES, @@ -219,6 +233,7 @@ from .const import ( DEFAULT_MIN_OFF_GAP, DEFAULT_MIN_OFF_GAP_BY_DEVICE, DEFAULT_MAX_DEFERRAL_SECONDS, + ENDING_HARD_FINALIZE_MIN_QUIET_S, DEFAULT_START_ENERGY_THRESHOLDS_BY_DEVICE, DEFAULT_END_ENERGY_THRESHOLD, DEVICE_COMPLETION_THRESHOLDS, @@ -254,12 +269,19 @@ from .recorder import CycleRecorder from .diag_buffer import DiagBuffer from .log_utils import DeviceLoggerAdapter from .time_utils import power_data_to_offsets +from . import analysis from . import progress as progress_mod from . import notification_rules as notif_rules from .phase_segmenter import phase_matching_enabled _LOGGER = logging.getLogger(__name__) +# Sentinel "message" understood by the Home Assistant companion app as "dismiss the +# card carrying this tag" rather than as text to display. It is only meaningful +# alongside a `tag`, and only on mobile_app targets - see _send_notification_service, +# which must never deliver it as a visible message. +_CLEAR_NOTIFICATION_MARKER = "clear_notification" + # Finish-type notification events that would wake someone and are therefore gated by # the quiet-hours (do-not-disturb) window. Live-progress ticks (NOTIFY_EVENT_LIVE) # and the start notification (NOTIFY_EVENT_START) are intentionally excluded. @@ -308,6 +330,7 @@ _MOBILE_ONLY_EXTRA_KEYS = ( "priority", "actions", "sticky", + "clickAction", "subtitle", "content_state", "activity", @@ -410,6 +433,8 @@ class WashDataManager: self._notify_live_interval_seconds = DEFAULT_NOTIFY_LIVE_INTERVAL_SECONDS self._notify_live_overrun_percent = DEFAULT_NOTIFY_LIVE_OVERRUN_PERCENT self._notify_live_chronometer = DEFAULT_NOTIFY_LIVE_CHRONOMETER + self._notify_live_sticky = DEFAULT_NOTIFY_LIVE_STICKY + self._notify_live_click_action = DEFAULT_NOTIFY_LIVE_CLICK_ACTION self._notify_timeout_seconds = DEFAULT_NOTIFY_TIMEOUT_SECONDS self._pending_notifications: list[dict[str, Any]] = [] # Quiet-hours (do-not-disturb) hold queue + release timer. Finish-type @@ -449,6 +474,15 @@ class WashDataManager: self._door_sensor_entity: str | None = config_entry.options.get( CONF_DOOR_SENSOR_ENTITY ) or None + # Auto-open dishwasher (#342): a sustained door-open at cycle end finalizes + # the cycle after a dwell instead of setting the sticky user-pause. + self._door_opens_at_end: bool = bool( + config_entry.options.get(CONF_DOOR_OPENS_AT_END, DEFAULT_DOOR_OPENS_AT_END) + ) + self._door_end_dwell_seconds: int = int( + config_entry.options.get(CONF_DOOR_END_DWELL_SECONDS, DEFAULT_DOOR_END_DWELL_SECONDS) + ) + self._remove_door_end_dwell: Any = None self._remove_door_sensor_listener = None self._is_clean_state: bool = False self._clean_state_start: datetime | None = None @@ -461,6 +495,19 @@ class WashDataManager: CONF_NOTIFY_UNLOAD_DELAY_MINUTES, DEFAULT_NOTIFY_UNLOAD_DELAY_MINUTES ) ) + # Repeat the unload reminder until dismissed / door-open (opt-in, #374). + self._notify_unload_repeat: bool = bool( + config_entry.options.get( + CONF_NOTIFY_UNLOAD_REPEAT, DEFAULT_NOTIFY_UNLOAD_REPEAT + ) + ) + # Set when the user taps the reminder's "stop reminding" action; timestamp of + # the last reminder sent, used to pace the repeats; and the mobile action + # listener remover (mirrors the timer-pause interactive-notification wiring). + self._unload_nag_dismissed: bool = False + self._last_unload_nag_time: datetime | None = None + self._unload_nag_count: int = 0 # repeat-mode safety bound (#374) + self._remove_unload_action_listener: Any | None = None self._live_notification_cap = 0 self._last_live_notification_time: datetime | None = None self._live_waiting_notification_sent = False @@ -543,6 +590,9 @@ class WashDataManager: self.profile_store.dtw_bandwidth = float( config_entry.options.get(CONF_DTW_BANDWIDTH, DEFAULT_DTW_BANDWIDTH) ) + # Stage-4 energy discriminator: integrated energy for WM/washer-dryer, + # mean power elsewhere (see analysis.stage4_energy_mode). + self.profile_store.energy_mode = analysis.stage4_energy_mode(self.device_type) self.learning_manager = LearningManager( hass, self.entry_id, self.profile_store, self.device_type, device_name=config_entry.title, @@ -623,6 +673,17 @@ class WashDataManager: DEFAULT_NOTIFY_LIVE_CHRONOMETER, ) ) + self._notify_live_sticky = bool( + config_entry.options.get( + CONF_NOTIFY_LIVE_STICKY, DEFAULT_NOTIFY_LIVE_STICKY + ) + ) + self._notify_live_click_action = str( + config_entry.options.get( + CONF_NOTIFY_LIVE_CLICK_ACTION, DEFAULT_NOTIFY_LIVE_CLICK_ACTION + ) + or "" + ).strip() self._notify_timeout_seconds = int( config_entry.options.get( CONF_NOTIFY_TIMEOUT_SECONDS, DEFAULT_NOTIFY_TIMEOUT_SECONDS @@ -743,6 +804,12 @@ class WashDataManager: CONF_ANTI_WRINKLE_IDLE_TIMEOUT, DEFAULT_ANTI_WRINKLE_IDLE_TIMEOUT ) ), + dishwasher_end_spike_quiet_release=float( + config_entry.options.get( + CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE, + DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS, + ) + ), delay_detect_enabled=bool( config_entry.options.get( CONF_DELAY_START_DETECT_ENABLED, DEFAULT_DELAY_START_DETECT_ENABLED @@ -758,16 +825,28 @@ class WashDataManager: CONF_DELAY_TIMEOUT_HOURS, DEFAULT_DELAY_TIMEOUT_HOURS ) ) * 3600.0, + # #378: without this the detector keeps the WASHING_MACHINE default and + # every non-washing-machine device runs the washing-machine detection + # path (the whole dishwasher/#43 branch is otherwise dead in production). + device_type=self.device_type, ) self._config = config def profile_matcher_wrapper( readings: list[tuple[datetime, float]], - ) -> tuple[str | None, float, float, str | None]: + ) -> tuple[str | None, float, float, str | None] | None: """Wraps profile store matching logic with detector callback signature. - Returns: None (async offload) + The real match is offloaded to an async task that calls + ``detector.update_match`` later, so this returns ``None`` in that case - + the detector's contract is "None == async offload, I'll be called back" + (see ``_try_profile_match``). It must NOT return a placeholder tuple: + a non-empty tuple is truthy, so the detector would feed it straight into + ``update_match`` on every match tick, spuriously logging the + "invalid raw_expected_duration 0.0" debug line and momentarily zeroing + ``_last_match_confidence`` between real async updates. Only the manual + override path below returns a genuine synchronous tuple. """ # Manual program override if self._manual_program_active and self._current_program: @@ -791,13 +870,13 @@ class WashDataManager: ) if not readings: - return (None, 0.0, 0.0, None) + return None # Snapshotted for thread safety indirectly by task logic # We don't need a wrapper task if we unify with _update_estimates matching # but for now let's keep the detector callback as a trigger self._spawn_tracked(self._async_perform_combined_matching(readings)) - return (None, 0.0, 0.0, None) + return None self.detector = CycleDetector( config, @@ -820,6 +899,7 @@ class WashDataManager: self._terminal_drop_refresh_n: int | None = None self._remove_listener = None + self._remove_report_listener = None # state_reported (unchanged re-reports) #363/#329 self._remove_external_trigger_listener = None # External cycle end trigger self._remove_watchdog = None self._watchdog_interval = int( @@ -1226,14 +1306,28 @@ class WashDataManager: current_matched ) verified_pause = True - # Smart Termination within Envelope block + # Smart Termination within Envelope block. Compare the mapped + # position against the envelope's OWN time span (not avg_duration, + # a differently-derived trimmed mean): mapped_time is capped at the + # grid span, so span/avg_duration < 1 would make the 0.95 release + # unreachable and the cycle would hang to the deferral cap (#348). try: - profile = self.profile_store.get_profile(current_matched) - if profile: - avg_dur = profile.get("avg_duration", 0) - if avg_dur > 0 and (mapped_time / avg_dur) > 0.95: - verified_pause = False - self._logger.info("Smart Termination: Near end of profile. Releasing pause lock.") + span = self.profile_store.envelope_time_span(current_matched) + if span > 0 and (mapped_time / span) > 0.95: + verified_pause = False + self._logger.info( + "Smart Termination: near end of profile (%.0f/%.0fs). Releasing pause lock.", + mapped_time, span, + ) + else: + # Diagnostic (#346): the release is held; show how far the + # trace mapped vs the 95%% release point (no behaviour change). + self._logger.debug( + "Smart Termination held for %s: mapped %.0f/%.0fs (%.0f%%) below 95%% release%s", + current_matched, mapped_time, span, + (100.0 * mapped_time / span) if span > 0 else 0.0, + "" if span > 0 else " (envelope span unavailable)", + ) except Exception as e: self._logger.debug("Smart Termination alignment verification failed: %s", e) else: @@ -1250,6 +1344,50 @@ class WashDataManager: if current_power > stop_threshold * 10: verified_pause = False + # --- Sustained-quiet release of an auto-detected pause (issue #375) --- + # An envelope-verified pause bridges a genuine low-power phase (e.g. a + # dishwasher's passive drying). When the appliance instead goes truly + # silent at the real end, the envelope alignment can keep re-confirming + # against a long near-zero drying tail baked into the profile by earlier + # force-stopped cycles, and Smart Termination's >95%-of-span release is + # unreachable because the trace goes quiet BEFORE that learned tail ends. + # The flag then freezes True and every ENDING finalize backstop (all + # gated on `not _verified_pause`) is defeated, so the cycle hangs for + # hours until the watchdog's multi-hour silence limit force-ends it. + # Release the auto-pause once the cycle has completed its expected + # duration AND has been continuously sub-threshold for the finalize + # quiet floor: the drying (if any) is over, so let the normal end path + # finalize. This mirrors the dishwasher `quiet_released` gate the + # detector already trusts in `_should_defer_finish`. A real user pause + # is authoritative and re-asserted below, so it is never released here. + expected_dur = self.detector.expected_duration_seconds + # Gap-free tally only: a telemetry outage is unobserved time and must + # not satisfy the quiet floor that releases the auto-detected pause + # (mirrors the detector's dishwasher quiet-release gates). Fall back to + # the plain tally if the attribute is missing (older detector). + time_below = getattr( + self.detector, + "_time_below_threshold_gapfree", + getattr(self.detector, "_time_below_threshold", 0.0), + ) + if ( + verified_pause + and not self._is_user_paused + and expected_dur > 0 + and current_duration >= expected_dur + and time_below >= ENDING_HARD_FINALIZE_MIN_QUIET_S + ): + self._logger.info( + "Releasing auto-detected pause for %s: reached expected " + "duration (%.0fs >= %.0fs) and sustained-quiet %.0fs - " + "allowing normal cycle finish (issue #375).", + current_matched or self._current_program, + current_duration, + expected_dur, + time_below, + ) + verified_pause = False + # A user-initiated pause (Pause Cycle button, or the door-open soft # pause) stays in force until the user resumes (issue #306). The # heuristics above only govern *auto-detected* low-power phases; without @@ -1597,6 +1735,17 @@ class WashDataManager: self.detector.restore_state_snapshot(active_snapshot_to_restore) + # Anti-wrinkle keepalive anchor (#339). The keepalive in + # _handle_state_expiry needs a "sensor last spoke" timestamp, but + # _last_real_reading_time is only ever set by a live reading, so a + # restart into ANTI_WRINKLE with an already-silent plug leaves it + # None and the keepalive can never fire -- pinning the mode until + # the next cycle. The snapshot save is driven by real readings, so + # last_save is the best available proxy. Scoped to ANTI_WRINKLE so + # no other timer sees a synthetic anchor. + if self.detector.state == STATE_ANTI_WRINKLE and last_save: + self._last_real_reading_time = last_save + # Restore if in any active state (Running, Paused, Ending) if self.detector.state in (STATE_RUNNING, STATE_PAUSED, STATE_ENDING): # Restore manual program flag if present @@ -1662,6 +1811,11 @@ class WashDataManager: if self._is_user_paused: self.detector.set_verified_pause(True) + # Auto-open dishwasher: arm the dwell if we restored into ENDING + # with the door already open. _on_state_change is not called + # during restoration, so the transition guard there would not fire. + self._maybe_arm_door_end_dwell_if_open() + # Record the restart gap so the Cycles tab can shade it and # anomaly detection can surface it. Only meaningful when # last_save is known and the dark period exceeds 30 s. @@ -1718,6 +1872,7 @@ class WashDataManager: "timer_default_message": "{device}: {minutes} min timer", "timer_pause_action_title": "Resume Cycle", "timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.", + "unload_dismiss_action_title": "Stop reminding", "vs_typical_longer": "{pct}% longer than usual", "vs_typical_shorter": "{pct}% shorter than usual", "notify_live_waiting_message": "{device}: No profile matched yet.", @@ -1768,10 +1923,8 @@ class WashDataManager: "Failed repairing profile sample references for %s", self.entry_id ) - # Subscribe to power sensor updates - self._remove_listener = async_track_state_change_event( - self.hass, [self.power_sensor_entity_id], self._async_power_changed - ) + # Subscribe to power sensor updates (state changes AND unchanged re-reports) + self._subscribe_power_sensor() # Attempt to restore state (BEFORE starting listener) await self._attempt_state_restoration() @@ -1891,13 +2044,9 @@ class WashDataManager: "Power sensor changed: %s -> %s", self.power_sensor_entity_id, new_sensor ) self.power_sensor_entity_id = new_sensor - # Remove old listener - if self._remove_listener: - self._remove_listener() - # Attach new listener - self._remove_listener = async_track_state_change_event( - self.hass, [self.power_sensor_entity_id], self._async_power_changed - ) + # Re-attach change + report listeners to the new sensor + # (helper removes the old ones first). + self._subscribe_power_sensor() # Force update from new sensor state = self.hass.states.get(self.power_sensor_entity_id) if state and state.state not in (STATE_UNKNOWN, STATE_UNAVAILABLE): @@ -1947,6 +2096,9 @@ class WashDataManager: self.profile_store.dtw_bandwidth = float( config_entry.options.get(CONF_DTW_BANDWIDTH, DEFAULT_DTW_BANDWIDTH) ) + # Stage-4 energy discriminator: integrated energy for WM/washer-dryer, + # mean power elsewhere (see analysis.stage4_energy_mode). + self.profile_store.energy_mode = analysis.stage4_energy_mode(self.device_type) # Device default dev_def = DEVICE_COMPLETION_THRESHOLDS.get( @@ -2022,6 +2174,12 @@ class WashDataManager: CONF_ANTI_WRINKLE_IDLE_TIMEOUT, DEFAULT_ANTI_WRINKLE_IDLE_TIMEOUT ) ) + new_dishwasher_end_spike_quiet_release = float( + config_entry.options.get( + CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE, + DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS, + ) + ) new_delay_detect_enabled = bool( config_entry.options.get( CONF_DELAY_START_DETECT_ENABLED, DEFAULT_DELAY_START_DETECT_ENABLED @@ -2039,6 +2197,9 @@ class WashDataManager: ) * 3600.0 # Apply all detector config updates + # #378: keep the detector's device_type in sync when the appliance type + # is changed in the UI, so the correct detection branch runs after reload. + self.detector.config.device_type = self.device_type self.detector.config.min_power = new_min_power self.detector.config.off_delay = new_off_delay self.detector.config.smoothing_window = new_smoothing @@ -2057,6 +2218,7 @@ class WashDataManager: self.detector.config.anti_wrinkle_max_duration = new_anti_wrinkle_max_duration self.detector.config.anti_wrinkle_exit_power = new_anti_wrinkle_exit_power self.detector.config.anti_wrinkle_idle_timeout = new_anti_wrinkle_idle_timeout + self.detector.config.dishwasher_end_spike_quiet_release = new_dishwasher_end_spike_quiet_release self.detector.config.delay_detect_enabled = new_delay_detect_enabled self.detector.config.delay_confirm_seconds = new_delay_confirm_seconds self.detector.config.delay_timeout_seconds = new_delay_timeout_seconds @@ -2178,6 +2340,17 @@ class WashDataManager: DEFAULT_NOTIFY_LIVE_CHRONOMETER, ) ) + self._notify_live_sticky = bool( + config_entry.options.get( + CONF_NOTIFY_LIVE_STICKY, DEFAULT_NOTIFY_LIVE_STICKY + ) + ) + self._notify_live_click_action = str( + config_entry.options.get( + CONF_NOTIFY_LIVE_CLICK_ACTION, DEFAULT_NOTIFY_LIVE_CLICK_ACTION + ) + or "" + ).strip() self._notify_timeout_seconds = int( config_entry.options.get( CONF_NOTIFY_TIMEOUT_SECONDS, DEFAULT_NOTIFY_TIMEOUT_SECONDS @@ -2187,17 +2360,33 @@ class WashDataManager: # Reload door sensor / pause config self._pause_cuts_power = bool(config_entry.options.get(CONF_PAUSE_CUTS_POWER, False)) self._door_sensor_entity = config_entry.options.get(CONF_DOOR_SENSOR_ENTITY) or None + self._door_opens_at_end = bool( + config_entry.options.get(CONF_DOOR_OPENS_AT_END, DEFAULT_DOOR_OPENS_AT_END) + ) + self._door_end_dwell_seconds = int( + config_entry.options.get(CONF_DOOR_END_DWELL_SECONDS, DEFAULT_DOOR_END_DWELL_SECONDS) + ) self._notify_unload_delay_minutes = int( config_entry.options.get( CONF_NOTIFY_UNLOAD_DELAY_MINUTES, DEFAULT_NOTIFY_UNLOAD_DELAY_MINUTES ) ) + self._notify_unload_repeat = bool( + config_entry.options.get( + CONF_NOTIFY_UNLOAD_REPEAT, DEFAULT_NOTIFY_UNLOAD_REPEAT + ) + ) # Re-subscribe to external cycle end trigger await self._setup_external_end_trigger() - # Re-subscribe to door sensor + # Re-subscribe to door sensor. Cancel any dwell armed for the previous door + # config first — after a sensor/auto-open/dwell change the old sensor may no + # longer emit the close event that cancels it, so a stale timer could finalize + # the cycle on outdated config. Re-evaluate for the new configuration after. + self._cancel_door_end_dwell() await self._setup_door_sensor_listener() + self._maybe_arm_door_end_dwell_if_open() # Re-subscribe to person presence changes for notification gating await self._setup_notify_people_listener() @@ -2277,11 +2466,17 @@ class WashDataManager: await asyncio.gather(*_to_await, return_exceptions=True) if self._remove_listener: self._remove_listener() + if self._remove_report_listener: + self._remove_report_listener() + self._remove_report_listener = None if self._remove_external_trigger_listener: self._remove_external_trigger_listener() if self._remove_door_sensor_listener: self._remove_door_sensor_listener() self._remove_door_sensor_listener = None + self._cancel_door_end_dwell() + # Drop the repeat-unload-reminder dismiss action listener (#374). + self._remove_unload_dismiss_listener() if self._remove_notify_people_listener: self._remove_notify_people_listener() self._remove_notify_people_listener = None @@ -2406,10 +2601,26 @@ class WashDataManager: self._is_clean_state = False self._clean_state_start = None self._notified_clean_laundry = False + self._reset_unload_nag_tracking() # Dismiss a delivered clean reminder (and purge any queued ones) # so it does not linger on the phone after the laundry is taken. self._clear_clean_notification() self._notify_update() + elif ( + self._door_opens_at_end + and self.detector.state in (STATE_RUNNING, STATE_ENDING) + ): + # Auto-open dishwasher (#342): the machine pops its door at the end. + # A sustained open means the cycle finished; a brief open (adding an + # item) does not. Arm a dwell timer instead of the sticky user-pause + # (which would strand the cycle in user_paused). If the door stays + # open past the dwell we finalize; if it closes first we cancel. + self._logger.debug( + "Door opened on auto-open device: arming %ss end dwell", + self._door_end_dwell_seconds, + ) + self._arm_door_end_dwell() + self._notify_update() elif self.detector.state in (STATE_RUNNING, STATE_STARTING, STATE_PAUSED, STATE_ENDING): # Door opened during active cycle → soft pause confirmation self._logger.debug( @@ -2420,7 +2631,111 @@ class WashDataManager: self._is_user_paused = True self._user_pause_start = dt_util.now() self._notify_update() - # Door closing is intentionally not handled - no auto-resume + else: + # Door closed: cancel a pending auto-open finalize (it was a brief open, + # not the end-of-cycle door pop). No auto-resume otherwise (#342). + if self._remove_door_end_dwell is not None: + self._logger.debug("Door closed before end dwell: cancelling finalize") + self._cancel_door_end_dwell() + self._notify_update() + + def _maybe_arm_door_end_dwell_if_open(self) -> None: + """Arm the end-dwell timer when in RUNNING or ENDING with the door already open. + + Called from both ``_on_state_change`` (live transition) and the + snapshot-restoration path (where ``_on_state_change`` is not invoked). + Matches the state set accepted by ``_handle_door_sensor_change`` so that + restoring a RUNNING snapshot with the door already open re-arms the dwell. + """ + if not ( + self.detector.state in (STATE_RUNNING, STATE_ENDING) + and self._door_opens_at_end + and self._door_sensor_entity + and self._remove_door_end_dwell is None + ): + return + door_state = self.hass.states.get(self._door_sensor_entity) + if door_state and door_state.state == "on": + self._logger.debug( + "Door already open on ENDING: arming %ss end dwell", + self._door_end_dwell_seconds, + ) + self._arm_door_end_dwell() + + def _arm_door_end_dwell(self) -> None: + """(Re)arm the auto-open door-end dwell timer (#342).""" + self._cancel_door_end_dwell() + self._remove_door_end_dwell = async_call_later( + self.hass, + float(max(1, self._door_end_dwell_seconds)), + self._door_end_dwell_fired, + ) + + def _cancel_door_end_dwell(self) -> None: + """Cancel a pending auto-open door-end dwell timer, if any (#342).""" + if self._remove_door_end_dwell is not None: + self._remove_door_end_dwell() + self._remove_door_end_dwell = None + + @callback + def _door_end_dwell_fired(self, _now: Any) -> None: + """The door stayed open past the dwell on an auto-open device: the cycle has + finished, so finalize it as completed (same path as the External End + Trigger). The dwell is normally cancelled on door-close, but re-validate the + live conditions here defensively — a close event could have been missed, or a + user pause could have landed mid-dwell — before finalizing (#342).""" + self._remove_door_end_dwell = None + door_state = ( + self.hass.states.get(self._door_sensor_entity) + if self._door_sensor_entity + else None + ) + if ( + self.detector.state in (STATE_RUNNING, STATE_ENDING) + and self._door_opens_at_end + and not self._is_user_paused + and door_state is not None + and door_state.state == "on" + ): + # The end-of-cycle door pop follows the power drop, so an appliance still + # drawing above the stop threshold means the door was opened mid-cycle + # (loading a dish and walking off) rather than at the end - finalizing + # there would record a running cycle as completed. + # + # Re-arm rather than abandon: the dwell is one-shot, so dropping it here + # would permanently lose the door-based finalize for a machine that just + # happens to be mid-pulse when the timer lands (fan/zeolite drying can + # draw with the door already popped), leaving the cycle to the power + # timeout that #342 exists to short-circuit. Re-arming is asymmetric: it + # can only ever delay the finalize, never skip it. + stop_thr = 0.0 + try: + stop_thr = float(getattr(self.detector.config, "stop_threshold_w", 0.0) or 0.0) + except (TypeError, ValueError): + stop_thr = 0.0 + if stop_thr > 0.0 and self._current_power >= stop_thr: + self._logger.debug( + "Door-end dwell fired but power %.1fW is still at/above the stop " + "threshold %.1fW: treating as a mid-cycle door open, re-arming", + self._current_power, + stop_thr, + ) + self._arm_door_end_dwell() + return + self._logger.info( + "Door held open %ss on auto-open device: finalizing cycle", + self._door_end_dwell_seconds, + ) + self.detector.user_stop() + self._notify_update() + else: + self._logger.debug( + "Door-end dwell fired but conditions no longer hold " + "(state=%s, door=%s, user_paused=%s): not finalizing", + self.detector.state, + getattr(door_state, "state", None), + self._is_user_paused, + ) async def _setup_notify_people_listener(self) -> None: """Set up listener for person presence changes used by notification gating.""" @@ -2605,7 +2920,11 @@ class WashDataManager: return {"ok": False, "reason": "ml_training_disabled"} opts = {**self.config_entry.data, **self.config_entry.options} - cycles = self.profile_store.get_past_cycles() + # Snapshot on the event loop before any executor offload (training + + # matcher tuning): get_past_cycles() returns the live mutable list, so a + # concurrent cycle add / retention trim could otherwise change the input + # mid-run. + cycles = list(self.profile_store.get_past_cycles()) if not force: # Don't train mid-cycle; wait for a quiet moment. @@ -2717,7 +3036,9 @@ class WashDataManager: try: from .ml.matching_tuner import tune_matching_config - result = await self.hass.async_add_executor_job(tune_matching_config, cycles) + result = await self.hass.async_add_executor_job( + tune_matching_config, cycles, self.device_type + ) except Exception as err: # noqa: BLE001 - tuning must never break training self._logger.debug("Matching-config tuning failed: %s", err) return {"promoted": False, "reason": "exception", "error": str(err)} @@ -2804,6 +3125,33 @@ class WashDataManager: latest = parsed return latest + @callback + def _subscribe_power_sensor(self) -> None: + """(Re)subscribe to the power sensor's state changes AND unchanged reports. + + HA fires EVENT_STATE_CHANGED only when the value (or attributes) change. + A plug that periodically re-reports the same value (Tasmota TelePeriod, + Zigbee max reporting interval) fires EVENT_STATE_REPORTED instead, which a + state_changed-only subscription never receives. Missing those reports means + a flat sub-threshold tail never advances the detector's end-of-cycle timer + (#363) and a finished cycle lags by the plug's reporting interval (#329). + + Both events route into the same handler. Per HA, a single write fires either + state_changed (value/attrs differ) or state_reported (unchanged), never both, + so there is no double-counting. Report events carry ``new_state`` without an + ``old_state``; ``_async_power_changed`` already tolerates a missing old_state. + """ + if self._remove_listener: + self._remove_listener() + if self._remove_report_listener: + self._remove_report_listener() + self._remove_listener = async_track_state_change_event( + self.hass, [self.power_sensor_entity_id], self._async_power_changed + ) + self._remove_report_listener = async_track_state_report_event( + self.hass, [self.power_sensor_entity_id], self._async_power_changed + ) + @callback def _async_power_changed(self, event: Any) -> None: """Handle power sensor state change.""" @@ -2818,9 +3166,13 @@ class WashDataManager: return # Capture every raw sensor reading before any throttling or processing. - # Use the sensor's own last_updated timestamp so the trace reflects - # when the plug actually reported the value, not when we received it. - self.diag_buffer.record_power(power, new_state.last_updated) + # Use the sensor's own report timestamp so the trace reflects when the plug + # actually reported the value, not when we received it. last_reported + # advances on every write (incl. unchanged re-reports #363), whereas + # last_updated only advances on a value change, so an unchanged re-report + # would otherwise be stamped with a stale time. + report_ts = getattr(new_state, "last_reported", None) or new_state.last_updated + self.diag_buffer.record_power(power, report_ts) # RECORD MODE INTERCEPTION if self.recorder.is_recording: @@ -3000,10 +3352,34 @@ class WashDataManager: async def _handle_state_expiry(self, now: datetime) -> None: """Check if state and progress should be reset (auto-expiration).""" + # Anti-wrinkle keepalive (#339): the mode's idle-timeout and 2 h safety cap + # only advance inside CycleDetector.process_reading, and the watchdog is + # stopped for the whole anti-wrinkle tail. A publish-on-change plug can send + # one final 0 W reading and then go fully silent, so with no further events + # the mode is pinned in ANTI_WRINKLE for hours. This timer keeps ticking, so + # when the real sensor has been silent longer than off_delay we inject a + # synthetic 0 W reading, letting the detector's own logic exit the mode. Gate + # on _last_real_reading_time (a genuine tumble pulse still resets the idle + # timer via the normal handler) and never bump it here, so real silence stays + # detectable and a still-reporting plug drives itself. + if self.detector.state == STATE_ANTI_WRINKLE: + last_real = self._last_real_reading_time + if ( + last_real is not None + and (now - last_real).total_seconds() > self._off_delay + ): + self._logger.debug( + "Anti-wrinkle keepalive: sensor silent for %.0fs (> off_delay %ss), " + "injecting synthetic 0 W so the idle/2h-cap timer can advance", + (now - last_real).total_seconds(), + self._off_delay, + ) + self.detector.process_reading(0.0, now) + self._notify_update() + return if ( not self._cycle_completed_time or self.detector.state == STATE_RUNNING - or self.detector.state == STATE_ANTI_WRINKLE or self.detector.state == STATE_DELAY_WAIT ): # Cycle is running or not completed, don't reset @@ -3011,15 +3387,28 @@ class WashDataManager: time_since_complete = (now - self._cycle_completed_time).total_seconds() - # Clean laundry nag notification + # Clean laundry nag notification. In repeat mode (#374) the reminder re-fires + # every delay-minutes and carries a "stop reminding" action; otherwise it is a + # single one-shot (the default, unchanged). if ( self._is_clean_state - and not self._notified_clean_laundry and self._clean_state_start is not None and self._notify_unload_delay_minutes > 0 + and not self._unload_nag_dismissed ): - time_in_clean = (now - self._clean_state_start).total_seconds() - if time_in_clean >= self._notify_unload_delay_minutes * 60: + delay_s = self._notify_unload_delay_minutes * 60 + first_due = ( + not self._notified_clean_laundry + and (now - self._clean_state_start).total_seconds() >= delay_s + ) + repeat_due = ( + self._notify_unload_repeat + and self._notified_clean_laundry + and self._unload_nag_count < NOTIFY_UNLOAD_REPEAT_MAX_REMINDERS + and self._last_unload_nag_time is not None + and (now - self._last_unload_nag_time).total_seconds() >= delay_s + ) + if first_due or repeat_due: if self._notify_finish_services or self._notify_actions: duration_min = int(time_since_complete / 60) msg_template = self.config_entry.options.get( @@ -3032,35 +3421,58 @@ class WashDataManager: duration=duration_min, delay=self._notify_unload_delay_minutes, ) + extra_vars: dict[str, Any] = {"tag": self._clean_tag} + if self._notify_unload_repeat: + # Actionable "stop reminding" button + sticky so the user can + # end the repeats from the notification (mobile_app targets; + # ignored by other platforms). Door-open still ends it too. + extra_vars["actions"] = [ + { + "action": self._unload_dismiss_action_id, + "title": self._timer_ui_strings.get( + "unload_dismiss_action_title", "Stop reminding" + ), + } + ] + extra_vars["sticky"] = "true" sent = self._dispatch_notification( msg, event_type=NOTIFY_EVENT_CLEAN, - extra_vars={"tag": self._clean_tag}, + extra_vars=extra_vars, ) if sent: self._notified_clean_laundry = True + self._last_unload_nag_time = now + self._unload_nag_count += 1 + if self._notify_unload_repeat: + self._ensure_unload_dismiss_listener() self._logger.info( - "Sent clean laundry nag notification (%.0f min after cycle end)", + "Sent clean laundry nag notification (%.0f min after " + "cycle end)%s", time_since_complete / 60, + " [repeat]" if repeat_due else "", ) elif self._last_dispatch_deferred: # Held for quiet-hours / presence delivery; the queued copy # fires later. Mark handled so the 60s expiry tick doesn't # enqueue a duplicate nag every minute for the whole window. self._notified_clean_laundry = True + self._last_unload_nag_time = now + self._unload_nag_count += 1 + if self._notify_unload_repeat: + self._ensure_unload_dismiss_listener() else: self._notified_clean_laundry = True + self._last_unload_nag_time = now + self._unload_nag_count += 1 # Defer leaving the terminal state while a clean-state unload notification is # still pending. Without this guard the 30-min progress reset (or an early # power-off) fires before the unload nag, clearing _is_clean_state before the - # notification can fire. Both expiry modes below honour it. - nag_pending = ( - self._is_clean_state - and not self._notified_clean_laundry - and self._notify_unload_delay_minutes > 0 - and time_since_complete < self._notify_unload_delay_minutes * 60 - ) + # notification can fire. In repeat mode the hold persists across every repeat + # until the user dismisses it or opens the door. Both expiry modes below honour + # it (as does the power-off one-shot timer). + nag_pending = self._unload_nag_active(now) # Power-based Off detection (issue #284): opt-in, and only valid when the # threshold sits below stop_threshold_w (so it cannot fire while a cycle could @@ -3147,6 +3559,7 @@ class WashDataManager: self._is_clean_state = False self._clean_state_start = None self._notified_clean_laundry = False + self._reset_unload_nag_tracking() self._power_off_below_since = None self._cancel_power_off_timer() self.detector.reset(STATE_OFF) @@ -3202,14 +3615,7 @@ class WashDataManager: ).total_seconds() < cfg.power_off_delay: return # Honour the clean-laundry unload nag hold (mirrors the poll path). - if ( - self._is_clean_state - and not self._notified_clean_laundry - and self._notify_unload_delay_minutes > 0 - and self._cycle_completed_time is not None - and (dt_util.now() - self._cycle_completed_time).total_seconds() - < self._notify_unload_delay_minutes * 60 - ): + if self._unload_nag_active(dt_util.now()): return self._logger.debug( "Power-based Off (one-shot timer): %.2fW below %.2fW for >= %.0fs in %s. " @@ -3517,6 +3923,7 @@ class WashDataManager: self._is_clean_state = False self._clean_state_start = None self._notified_clean_laundry = False + self._reset_unload_nag_tracking() self._cycle_progress = 0.0 self._power_off_below_since = None self._cancel_power_off_timer() @@ -3560,6 +3967,7 @@ class WashDataManager: self._clear_timer_pause_notification() self._clean_state_start = None self._notified_clean_laundry = False + self._reset_unload_nag_tracking() self._start_watchdog() # Start watchdog when cycle starts @@ -3622,6 +4030,10 @@ class WashDataManager: # Ensure watchdog is running self._start_watchdog() + # Auto-open dishwasher: arm the dwell if ENDING while the door is already + # open (door event missed, or door popped just as ENDING fired) (#342). + self._maybe_arm_door_end_dwell_if_open() + # Stop watchdog when transitioning to OFF from any active state if new_state == STATE_OFF: self._stop_watchdog() # Stop watchdog regardless of previous state @@ -3655,6 +4067,7 @@ class WashDataManager: self._stop_watchdog() # Stop active cycle watchdog self._stop_state_expiry_timer() # Cancel any pending progress reset self._clear_timer_pause_notification() + self._cancel_door_end_dwell() # Discard stale auto-open dwell (#342) prev_cycle_end_time = self._last_cycle_end_time self._last_cycle_end_time = dt_util.now() self._pump_stuck = False # Reset for next pump cycle @@ -4645,6 +5058,7 @@ class WashDataManager: self._is_clean_state = False self._clean_state_start = None self._notified_clean_laundry = False + self._reset_unload_nag_tracking() if self._door_sensor_entity: door_state = self.hass.states.get(self._door_sensor_entity) if door_state and door_state.state == "off": # binary_sensor: off = closed @@ -4976,6 +5390,60 @@ class WashDataManager: return (finish_channel or status_channel) or None return status_channel or None + def _log_notification( + self, + event_type: str | None, + message: str, + *, + targets: str = "", + deferred_reason: str | None = None, + delivered: bool = True, + ) -> None: + """Emit log lines for a notification's send / defer / drop. + + Every user-facing notification funnels through ``_dispatch_notification``, + so this is the single place that records what WashData notified about, + where it went, and whether it was delivered, deferred (quiet-hours / + presence hold), or dropped. + + Log contract (regression-locked by ``test_manager_notification_logging``): + - **INFO** ``"Notification sent ()"`` — one line per discrete + notification (start/finish/milestone/clean/pause/…). Target list and + message body are omitted to prevent entity-ID PII from leaking into + bug-report logs. + - **DEBUG** ``"Notification sent () via : "`` — + full target list and truncated message body for troubleshooting. + - **DEBUG** for live-progress ticks (high-frequency in-place updates). + - **DEBUG** for deferred (quiet-hours/presence hold) and not-delivered paths. + + Deferred items are re-dispatched when the hold clears and log again as + "sent" on actual delivery. + """ + label = event_type or "notification" + # Countdown / finish messages can span multiple lines - collapse to one. + summary = " ".join(str(message).split()) + if len(summary) > 200: + summary = summary[:197] + "..." + is_live = event_type == NOTIFY_EVENT_LIVE + if deferred_reason: + self._logger.debug( + "Notification deferred (%s) - %s: %s", label, deferred_reason, summary + ) + elif not delivered: + self._logger.debug( + "Notification not delivered (%s) - no matching target: %s", + label, summary, + ) + elif is_live: + self._logger.debug( + "Notification sent (%s) via %s: %s", label, targets, summary + ) + else: + self._logger.info("Notification sent (%s)", label) + self._logger.debug( + "Notification sent (%s) via %s: %s", label, targets, summary + ) + def _dispatch_notification( self, message: str, @@ -5067,6 +5535,7 @@ class WashDataManager: extra_vars=extra_vars, ) self._last_dispatch_deferred = True + self._log_notification(event_type, message, deferred_reason="quiet hours") return False if ( @@ -5091,6 +5560,9 @@ class WashDataManager: } ) self._last_dispatch_deferred = True + self._log_notification( + event_type, message, deferred_reason="nobody home" + ) return False actions_sent = False @@ -5101,6 +5573,7 @@ class WashDataManager: # service/persistent-notification path entirely. services = self._get_services_for_event(event_type) if actions_sent and not services: + self._log_notification(event_type, message, targets="actions") return True service_sent = self._send_notification_service( @@ -5111,6 +5584,20 @@ class WashDataManager: event_type=event_type, extra_vars=extra_vars, ) + + if actions_sent or service_sent: + targets: list[str] = [] + if actions_sent: + targets.append("actions") + if service_sent: + # _send_notification_service falls back to a persistent + # notification only when no notify services are configured. + targets.extend(services if services else ["persistent_notification"]) + self._log_notification( + event_type, message, targets=", ".join(targets) + ) + else: + self._log_notification(event_type, message, delivered=False) return actions_sent or service_sent def _send_notification_service( @@ -5175,15 +5662,41 @@ class WashDataManager: if notify_service.startswith("notify.") else None ) + # A notify *entity* (has a state, domain "notify") only registers the + # entity service notify.send_message — NOT a legacy notify. + # domain service. So route entity targets through send_message + # regardless of svc_data; that schema accepts only entity_id/message/ + # title, so drop any unsupported extras (icon, mobile/iOS keys) rather + # than fall through to a legacy service that would raise ServiceNotFound + # and silently drop the notification. Legacy notify.mobile_app_* targets + # have no entity state (state is None) and correctly take the else path. if state is not None and getattr(state, "domain", None) == "notify": + # A dismiss marker is carried *by* its tag, and send_message cannot + # carry one - delivering it anyway would show the user a card whose + # body literally reads "clear_notification". There is no way to + # dismiss an entity-target card, so skip the send entirely. (Before + # entity targets were routed here, these calls always had a tag and + # so took the legacy-service path, where the tag works.) + if message == _CLEAR_NOTIFICATION_MARKER and ev.get("tag"): + self._logger.debug( + "Notify entity %s: skipping dismiss marker (tag=%s) - " + "notify.send_message cannot carry a tag, so it would be " + "delivered as visible text", + notify_service, ev.get("tag"), + ) + continue + if svc_data: + self._logger.debug( + "Notify entity %s: dropping %d unsupported payload key(s) " + "(%s) - notify.send_message accepts only message/title", + notify_service, len(svc_data), ", ".join(sorted(svc_data)), + ) service_data: dict[str, Any] = { "entity_id": notify_service, "message": message, } if title: service_data["title"] = title - if svc_data: - service_data["data"] = svc_data self.hass.async_create_task( self.hass.services.async_call( "notify", "send_message", service_data @@ -5206,6 +5719,14 @@ class WashDataManager: if not sent: if event_type == NOTIFY_EVENT_LIVE: return False + # A dismiss marker is not content: if no target could carry it, there is + # nothing to show. Falling through would post a persistent-notification + # card whose body reads "clear_notification" - the same leak the entity + # branch above guards against, just via the other exit. The callers that + # send this marker dismiss their own persistent notification separately + # (_pn_dismiss), so nothing is lost by returning early. + if message == _CLEAR_NOTIFICATION_MARKER: + return False # Reuse the notification's tag as a stable persistent-notification id so # the HA notifications tab collapses the lifecycle thread to one entry # instead of accumulating a new card per cycle (issue #248/#249 clutter). @@ -5506,6 +6027,20 @@ class WashDataManager: overrun_ratio = max(0, float(self._notify_live_overrun_percent)) / 100.0 return max(1, int(np.ceil(estimated_updates * (1.0 + overrun_ratio)))) + def _apply_live_notification_prefs(self, extra_vars: dict[str, Any]) -> None: + """Inject the user's opt-in live-notification data keys (#347). + + ``sticky`` keeps the live notification on screen when tapped; ``clickAction`` + gives the notification a tap target (e.g. a dashboard path). Both are + mobile-only keys forwarded only to ``mobile_app_*`` live targets. Defaults + (sticky off, empty clickAction) add nothing, so the payload is byte-identical + to before unless the user opts in. + """ + if self._notify_live_sticky: + extra_vars["sticky"] = "true" + if self._notify_live_click_action: + extra_vars["clickAction"] = self._notify_live_click_action + def _check_live_progress_notification(self) -> None: """Send throttled live progress notifications for compatible mobile targets.""" if not self._notify_live_services and not self._notify_actions: @@ -5549,6 +6084,7 @@ class WashDataManager: # Live Activity even before a profile is matched (mobile-only key). if not self._live_activity_started: waiting_extra_vars["activity"] = "start" + self._apply_live_notification_prefs(waiting_extra_vars) sent = self._dispatch_notification( msg, event_type=NOTIFY_EVENT_LIVE, @@ -5645,6 +6181,7 @@ class WashDataManager: activity=activity_marker, ) ) + self._apply_live_notification_prefs(extra_vars) sent = self._dispatch_notification( msg, event_type=NOTIFY_EVENT_LIVE, @@ -5700,7 +6237,7 @@ class WashDataManager: { "device": self.config_entry.title, "program": "", # Cleared marker - "message": "clear_notification", # Clear marker for action handlers + "message": _CLEAR_NOTIFICATION_MARKER, # Clear marker for action handlers "title": "", # Clear title "icon": None, "event_type": NOTIFY_EVENT_LIVE, @@ -5716,7 +6253,7 @@ class WashDataManager: if clear_services: self._send_notification_service( - "clear_notification", + _CLEAR_NOTIFICATION_MARKER, services=self._notify_live_services, event_type=NOTIFY_EVENT_LIVE, extra_vars={ @@ -5740,6 +6277,9 @@ class WashDataManager: app instead of lingering. A clear for a non-existent tag is harmless, so this runs whenever the user has any clean/finish delivery configured. """ + # Drop the repeat-reminder dismiss action listener too, so no stale mobile + # action stays wired once the reminder is gone (#374). + self._remove_unload_dismiss_listener() # Drop any still-queued clean entries so they cannot replay later — from # both the presence-hold queue and the quiet-hours queue (the nag can be # deferred into either). @@ -5752,8 +6292,14 @@ class WashDataManager: if n.get("event_type") != NOTIFY_EVENT_CLEAN ] - services = self._get_services_for_event(NOTIFY_EVENT_CLEAN) - if not services and not self._notify_actions: + # Only mobile_app targets understand the "clear_notification" marker; + # non-mobile targets (email, Telegram, etc.) would receive it as a + # literal message. Mirror the pattern from _cancel_timer_mobile_notification. + mobile_services = [ + s for s in self._get_services_for_event(NOTIFY_EVENT_CLEAN) + if self._is_mobile_notify_service(s) + ] + if not mobile_services and not self._notify_actions: return if self._notify_actions: @@ -5761,7 +6307,7 @@ class WashDataManager: { "device": self.config_entry.title, "program": "", - "message": "clear_notification", + "message": _CLEAR_NOTIFICATION_MARKER, "title": "", "icon": None, "event_type": NOTIFY_EVENT_CLEAN, @@ -5770,14 +6316,96 @@ class WashDataManager: "tag": self._clean_tag, } ) - if services: + if mobile_services: self._send_notification_service( - "clear_notification", - services=services, + _CLEAR_NOTIFICATION_MARKER, + services=mobile_services, event_type=NOTIFY_EVENT_CLEAN, extra_vars={"tag": self._clean_tag}, ) + @property + def _unload_dismiss_action_id(self) -> str: + """Stable mobile action ID for the unload-reminder dismiss button, per device.""" + return f"UNLOAD_STOP_WD_{self.entry_id[:8].upper()}" + + def _unload_nag_active(self, now: datetime) -> bool: + """Whether the terminal state must be held alive for the unload reminder. + + Default (one-shot) behaviour: hold only until the single reminder is due, so + the 30-min progress reset / power-based Off cannot clear the Clean state before + the reminder fires. Repeat mode (``CONF_NOTIFY_UNLOAD_REPEAT``, #374): hold + indefinitely so the reminder keeps re-firing, until the user dismisses it from + the notification or opens the door (both release the hold). + """ + if ( + not self._is_clean_state + or self._notify_unload_delay_minutes <= 0 + or self._cycle_completed_time is None + ): + return False + if self._notify_unload_repeat: + # Only hold while a delivery channel exists — otherwise no reminder (and + # no dismiss button) is ever sent (dispatch is gated on the same + # condition), so the hold would strand the Clean state forever. + # Also bounded by NOTIFY_UNLOAD_REPEAT_MAX_REMINDERS: the "Stop + # reminding" button is mobile_app-only, so a non-mobile target leaves + # the door sensor as the only escape, and a sensor that never reports + # open would pin Clean state (and suppress power-based Off) forever. + return ( + bool(self._notify_finish_services or self._notify_actions) + and not self._unload_nag_dismissed + and self._unload_nag_count < NOTIFY_UNLOAD_REPEAT_MAX_REMINDERS + ) + return ( + not self._notified_clean_laundry + and (now - self._cycle_completed_time).total_seconds() + < self._notify_unload_delay_minutes * 60 + ) + + def _ensure_unload_dismiss_listener(self) -> None: + """Register the mobile action listener for the reminder's dismiss button (once). + + Mirrors the timer-pause interactive notification wiring: a single + ``mobile_app_notification_action`` listener that matches this device's action + ID, marks the reminder dismissed, and clears the delivered card. + """ + if self._remove_unload_action_listener is not None: + return + action_id = self._unload_dismiss_action_id + + @callback + def _on_unload_action(event: Any) -> None: + if event.data.get("action") == action_id: + self._logger.debug( + "Unload reminder dismissed via notification action" + ) + self._unload_nag_dismissed = True + self._clear_clean_notification() + self._notify_update() + + self._remove_unload_action_listener = self.hass.bus.async_listen( + "mobile_app_notification_action", + _on_unload_action, + ) + + def _remove_unload_dismiss_listener(self) -> None: + """Drop the unload-reminder dismiss action listener, if registered.""" + if self._remove_unload_action_listener is not None: + self._remove_unload_action_listener() + self._remove_unload_action_listener = None + + def _reset_unload_nag_tracking(self) -> None: + """Reset repeat-reminder tracking and drop the dismiss listener. + + Called wherever the Clean state is cleared so the next cycle's reminder starts + fresh and no stale mobile action listener leaks. + """ + self._remove_unload_dismiss_listener() + self._unload_nag_dismissed = False + self._last_unload_nag_time = None + self._unload_nag_count = 0 + def _check_pre_completion_notification(self) -> None: """Check and send pre-completion notification.""" if notif_rules.should_notify_pre_completion( @@ -6094,7 +6722,7 @@ class WashDataManager: mobile_services = [s for s in services if self._is_mobile_notify_service(s)] if mobile_services: self._send_notification_service( - "clear_notification", + _CLEAR_NOTIFICATION_MARKER, services=mobile_services, event_type=NOTIFY_EVENT_TIMER, extra_vars={"tag": self._timer_pause_mobile_tag}, @@ -6428,6 +7056,10 @@ class WashDataManager: self.detector.set_verified_pause(prev_verified) return False + # A user pause overrides an auto-open dwell: cancel it so the pending timer + # can't finalize the cycle out from under the pause (#342). + self._cancel_door_end_dwell() + snapshot = self._augment_active_snapshot(self.detector.get_state_snapshot()) self.hass.async_create_task(self.profile_store.async_save_active_cycle(snapshot)) self._notify_update() diff --git a/custom_components/ha_washdata/manifest.json b/custom_components/ha_washdata/manifest.json index b9764ea8..fcb306de 100644 --- a/custom_components/ha_washdata/manifest.json +++ b/custom_components/ha_washdata/manifest.json @@ -21,5 +21,5 @@ "requirements": [ "numpy" ], - "version": "0.5.3" + "version": "0.5.4" } \ No newline at end of file diff --git a/custom_components/ha_washdata/ml/matching_tuner.py b/custom_components/ha_washdata/ml/matching_tuner.py index e7854132..add321f6 100644 --- a/custom_components/ha_washdata/ml/matching_tuner.py +++ b/custom_components/ha_washdata/ml/matching_tuner.py @@ -156,6 +156,7 @@ def _grid() -> list[dict[str, Any]]: def tune_matching_config( cycles: list[dict[str, Any]], + device_type: str | None = None, *, min_cycles: int = 25, # Kept intentionally low so per-device tuning becomes useful early; the noise @@ -206,7 +207,9 @@ def tune_matching_config( if not holdout_pool: return {"promoted": False, "reason": "too few targets", "n_targets": len(targets)} - base = {**_BASE_CFG} + # Tune under the same Stage-4 energy mode production uses for this device type, + # so promoted weights are consistent with the live matcher. + base = {**_BASE_CFG, "energy_mode": analysis.stage4_energy_mode(device_type)} # Candidate: the grid config with the best top-1 on the SEARCH pool only. best_search = _top1(by_profile, search_pool, base) best_cfg = base diff --git a/custom_components/ha_washdata/playground.py b/custom_components/ha_washdata/playground.py index 8f44fa97..b47dbddf 100644 --- a/custom_components/ha_washdata/playground.py +++ b/custom_components/ha_washdata/playground.py @@ -53,6 +53,7 @@ from .const import ( CONF_ANTI_WRINKLE_ENABLED, CONF_ANTI_WRINKLE_EXIT_POWER, CONF_ANTI_WRINKLE_IDLE_TIMEOUT, + CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE, CONF_ANTI_WRINKLE_MAX_DURATION, CONF_ANTI_WRINKLE_MAX_POWER, CONF_COMPLETION_MIN_SECONDS, @@ -74,19 +75,24 @@ from .const import ( CONF_STOP_THRESHOLD_W, CYCLE_OVERRUN_ANOMALY_RATIO, CYCLE_UNDERRUN_ANOMALY_RATIO, + DEFAULT_DTW_BANDWIDTH, DEFAULT_MATCH_PERSISTENCE, DEFAULT_NOTIFY_BEFORE_END_MINUTES, DEFAULT_NOTIFY_MILESTONES, + DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO, + DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO, MATCH_CORR_WEIGHT, MATCH_DDTW_DIST_SCALE, MATCH_DTW_BLEND, MATCH_DTW_DIST_SCALE, MATCH_DTW_ENSEMBLE_W, + MATCH_DTW_REFINE_TOP_N, MATCH_DTW_RESAMPLE_N, MATCH_DURATION_SCALE, MATCH_DURATION_WEIGHT, MATCH_ENERGY_SCALE, MATCH_ENERGY_WEIGHT, + MATCH_KEEP_MIN_SCORE, MATCH_MAE_PEAK_FLOOR, MATCH_MAE_REF_PEAK, MATCH_MAE_SCALE, @@ -161,6 +167,7 @@ _OVERRIDE_FIELD_MAP: dict[str, tuple[str, Callable[[Any], Any]]] = { CONF_ANTI_WRINKLE_MAX_DURATION: ("anti_wrinkle_max_duration", float), CONF_ANTI_WRINKLE_EXIT_POWER: ("anti_wrinkle_exit_power", float), CONF_ANTI_WRINKLE_IDLE_TIMEOUT: ("anti_wrinkle_idle_timeout", float), + CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE: ("dishwasher_end_spike_quiet_release", float), CONF_OFF_DELAY: ("off_delay", int), CONF_MIN_OFF_GAP: ("min_off_gap", int), CONF_COMPLETION_MIN_SECONDS: ("completion_min_seconds", int), @@ -200,6 +207,112 @@ _MATCH_OVERRIDE_KEYS: dict[str, tuple[str, Callable[[Any], Any]]] = { } +# Canonical default for every matching override key, keyed by the OPTION key the +# Playground uses. The Stage 2-4 entries are code constants (not stored options), +# so this table is the only place the panel can read them from; ``ws_get_constants`` +# ships it as ``pg_match_defaults`` and ``effective_settings`` falls back to it for +# any key the live matcher config does not carry. +MATCH_DEFAULTS_BY_OPTION: dict[str, Any] = { + CONF_PROFILE_MATCH_MIN_DURATION_RATIO: DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO, + CONF_PROFILE_MATCH_MAX_DURATION_RATIO: DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO, + "corr_weight": MATCH_CORR_WEIGHT, + "keep_min_score": MATCH_KEEP_MIN_SCORE, + "dtw_bandwidth": DEFAULT_DTW_BANDWIDTH, + "dtw_blend": MATCH_DTW_BLEND, + "dtw_ensemble_w": MATCH_DTW_ENSEMBLE_W, + "dtw_ddtw_scale": MATCH_DDTW_DIST_SCALE, + "dtw_refine_top_n": MATCH_DTW_REFINE_TOP_N, + "duration_weight": MATCH_DURATION_WEIGHT, + "energy_weight": MATCH_ENERGY_WEIGHT, + "duration_scale": MATCH_DURATION_SCALE, + "energy_scale": MATCH_ENERGY_SCALE, +} + +# Every option key the Playground control panel may carry (detection + matching). +# This is the allow-list for a saved Playground preset: anything else submitted by +# a client is dropped rather than stored. +SETTING_KEYS: frozenset[str] = frozenset(_OVERRIDE_FIELD_MAP) | frozenset(_MATCH_OVERRIDE_KEYS) + +# The subset a user may publish from the Playground back into the live config: +# exactly the override keys that are REAL config-entry options (``CONF_*``). The +# Stage 2-4 scoring knobs above are sandbox-only code constants - there is no +# option behind them, so writing them into ``entry.options`` would create dead +# keys the integration never reads. The panel gates its publish buttons on this +# list (shipped by ``get_playground_settings``). +PUBLISHABLE_SETTING_KEYS: frozenset[str] = frozenset(_OVERRIDE_FIELD_MAP) | { + CONF_PROFILE_MATCH_MIN_DURATION_RATIO, + CONF_PROFILE_MATCH_MAX_DURATION_RATIO, +} + + +def effective_settings( + base_config: CycleDetectorConfig, match_config: dict[str, Any] | None +) -> dict[str, Any]: + """Option-keyed view of the values a simulation runs with when NO override is + staged - i.e. the device's live, fully-resolved settings. + + The exact inverse of ``build_sim_config`` / ``apply_match_overrides``: it reads + back the same fields those two write, so the Playground control panel shows the + values the integration actually uses (device-type defaults included) instead of + a static schema default that may have drifted. Never raises. + """ + out: dict[str, Any] = {} + for opt_key, (field, coerce) in _OVERRIDE_FIELD_MAP.items(): + value = getattr(base_config, field, None) + if value is None: + continue + try: + out[opt_key] = coerce(value) + except (TypeError, ValueError): # pragma: no cover - defensive + continue + cfg = match_config or {} + for opt_key, (cfg_key, coerce) in _MATCH_OVERRIDE_KEYS.items(): + value = cfg.get(cfg_key, MATCH_DEFAULTS_BY_OPTION.get(opt_key)) + if value is None: + continue + try: + out[opt_key] = coerce(value) + except (TypeError, ValueError): # pragma: no cover - defensive + continue + return out + + +def sanitize_setting_values(values: Any) -> dict[str, Any]: + """Filter a client-supplied settings map down to storable Playground values. + + Keeps only keys in :data:`SETTING_KEYS`, coerced with the same coercers the + simulation uses, so a preset can never carry an unknown key or a value that + would be silently ignored at replay time. Never raises. + """ + if not isinstance(values, dict): + return {} + out: dict[str, Any] = {} + for key, value in values.items(): + if value is None: + continue + mapping = _OVERRIDE_FIELD_MAP.get(key) or _MATCH_OVERRIDE_KEYS.get(key) + if mapping is None: + continue + _target, coerce = mapping + try: + coerced = coerce(value) + except (TypeError, ValueError): + continue + if isinstance(coerced, float) and not math.isfinite(coerced): + continue + # Every Playground setting is a physical quantity - watts, seconds, a + # count, or a ratio - so a negative value is structurally meaningless and + # would make the replayed detector behave in ways the live one never can + # (e.g. an off_delay that expires before it starts). Rejected rather than + # clamped: silently rewriting a value the user typed would make the sim + # disagree with the control panel showing it back. + if isinstance(coerced, (int, float)) and not isinstance(coerced, bool): + if coerced < 0: + continue + out[key] = coerced + return out + + def apply_match_overrides( match_config: dict[str, Any], settings_override: dict[str, Any] | None ) -> dict[str, Any]: @@ -207,7 +320,8 @@ def apply_match_overrides( ``settings_override`` overlaid onto the matcher-config keys they drive. Unknown/None/malformed values are ignored, so a detection-only override leaves matching byte-identical to the live config.""" - if not settings_override: + settings_override = sanitize_setting_values(settings_override) + if not isinstance(settings_override, dict) or not settings_override: return match_config out = dict(match_config) for opt_key, (cfg_key, coerce) in _MATCH_OVERRIDE_KEYS.items(): @@ -229,6 +343,7 @@ def build_sim_config( Unknown keys and un-coercible values are ignored so a malformed override can never break a simulation. ``base`` is left untouched. """ + settings_override = sanitize_setting_values(settings_override) if not isinstance(settings_override, dict) or not settings_override: return base changes: dict[str, Any] = {} @@ -348,6 +463,8 @@ def _matching_config(store: Any) -> dict[str, Any]: "min_duration_ratio": float(getattr(store, "_min_duration_ratio", 0.07)), "max_duration_ratio": float(getattr(store, "_max_duration_ratio", 1.5)), "dtw_bandwidth": float(getattr(store, "dtw_bandwidth", 0.2)), + # Mirror the live Stage-4 energy discriminator so the sim is byte-identical. + "energy_mode": str(getattr(store, "energy_mode", "mean")), } try: overrides = store._matching_overrides() # pylint: disable=protected-access @@ -1238,6 +1355,7 @@ def _sim_config_summary(config: CycleDetectorConfig) -> dict[str, Any]: "anti_wrinkle_max_duration": getattr(config, "anti_wrinkle_max_duration", None), "anti_wrinkle_exit_power": getattr(config, "anti_wrinkle_exit_power", None), "anti_wrinkle_idle_timeout": getattr(config, "anti_wrinkle_idle_timeout", None), + "dishwasher_end_spike_quiet_release": getattr(config, "dishwasher_end_spike_quiet_release", None), } diff --git a/custom_components/ha_washdata/profile_store.py b/custom_components/ha_washdata/profile_store.py index 5ca25684..80c15b21 100644 --- a/custom_components/ha_washdata/profile_store.py +++ b/custom_components/ha_washdata/profile_store.py @@ -49,6 +49,8 @@ from .const import ( PHASE_HEAT_CV_WARN, PHASE_HEAT_OCC_MIXED_LO, PHASE_HEAT_OCC_MIXED_HI, + PLAYGROUND_PRESET_MAX, + PLAYGROUND_PRESET_NAME_MAX, REFERENCE_PROFILE_CURVE_POINTS, SHAPE_DRIFT_MIN_CYCLES, SHAPE_DRIFT_RESAMPLE_N, @@ -95,6 +97,12 @@ _LOGGER = logging.getLogger(__name__) # and reference selection so degenerate cycles never become the matching template. _DEGENERATE_POWER_FLOOR = 15.0 # watts +# How far outside the requested trim window a stored sample may still be snapped +# to. Trim boundaries arrive quantized to whole seconds (panel number input, the +# trim_cycle service), so one second is exactly the input's own resolution -- it +# absorbs that rounding without letting the kept window grow measurably. +_TRIM_SNAP_TOLERANCE_S = 1.0 + JSONDict: TypeAlias = dict[str, Any] CycleDict: TypeAlias = dict[str, Any] @@ -1216,6 +1224,10 @@ class ProfileStore: self._match_threshold = match_threshold self._unmatch_threshold = unmatch_threshold self.dtw_bandwidth: float = DEFAULT_DTW_BANDWIDTH + # Stage-4 energy-agreement mode ("mean"|"integrated"); the manager sets it + # from the device type via analysis.stage4_energy_mode. Default "mean" + # keeps behaviour byte-identical until wired. + self.energy_mode: str = "mean" self._save_debug_traces = save_debug_traces # Cache for resampled sample segments: key=(cycle_id, dt) @@ -1255,6 +1267,7 @@ class ProfileStore: "ml_model_versions": {}, # On-device trained model specs (Stage 4) "profile_groups": {}, # Named groups of near-duplicate profiles (Stage 5) "maintenance_log": [], # User-logged maintenance events (Group E) + "playground_presets": {}, # Named Playground setting snapshots (sandbox only) } @@ -1302,6 +1315,31 @@ class ProfileStore: suggestions: JSONDict = self._data.setdefault("suggestions", {}) suggestions.pop(key, None) + def get_locked_suggestions(self) -> list[str]: + """Return the setting keys the user has locked against auto-tuning (#343). + + A locked key is never re-surfaced as a suggestion, so the auto-tuner stops + repeatedly proposing a value the user has rejected (e.g. a stop/start + threshold that breaks an anti-crease-tuned device). Never raises. + """ + raw = self._data.get("locked_suggestions") + return [str(k) for k in raw] if isinstance(raw, list) else [] + + async def set_suggestion_locked(self, key: str, locked: bool) -> None: + """Lock or unlock a suggestion key and persist (#343). + + Locking also drops any currently-pending suggestion for the key so it + disappears immediately; unlocking lets the auto-tuner surface it again. + """ + cur = set(self.get_locked_suggestions()) + if locked: + cur.add(key) + self.delete_suggestion(key) + else: + cur.discard(key) + self._data["locked_suggestions"] = sorted(cur) + await self.async_save() + async def clear_suggestions(self) -> None: """Clear all pending suggestions and persist.""" self._data["suggestions"] = {} @@ -1746,7 +1784,7 @@ class ProfileStore: if pairs[0][0] != 0.0: origin = pairs[0][0] pairs = [[p[0] - origin, p[1]] for p in pairs] - now = dt_util.now() + now = dt_util.as_utc(dt_util.now()) store_id = str(meta.get("store_cycle_id") or "") cycle: CycleDict = { "profile_name": profile_name, @@ -2010,14 +2048,31 @@ class ProfileStore: self, current_power: list[float], current_duration: float, members: list[str], member_snaps: dict[str, dict[str, Any]], ) -> tuple[str, float | None, float | None]: - """Within a winning group, pick the member whose duration + mean power + - peak best match the cycle (temperature -> mean power, spin -> peak). + """Within a winning group, pick the member whose integrated ENERGY best + matches the cycle. + + Group members already share shape and duration (that is what the cohesion + gate collapses them for), so the within-group discriminator is temperature + / spin, and the clean signal for that is integrated energy (Sum P*dt) -- + NOT whole-cycle mean power (diluted, because hotter cycles also run longer) + nor peak (dominated by the ~constant heating-element draw, so it is flat + across variants). Validated on real store data (leave-one-cycle-out member + pick, 196 cycles): energy-only 73.3% vs the old duration*mean*peak product + 63.3%; adding any duration term back regressed it (grouped members are + duration-cohesive, so duration only adds noise). Duration is still returned + (for ETA and the overrun guard) but is intentionally not part of selection. + Returns (member_name, individual_fit_score, member_avg_duration). The fit score is the chosen member's own alignment score, used as a sanity check.""" cur = np.asarray(current_power, dtype=float) if cur.size == 0 or not members: return (members[0] if members else ""), None, None - cur_mp = float(cur.mean()); cur_pk = float(cur.max()) + # Energy proxy = mean power * duration; the 1/3600 Wh factor cancels in the + # log-ratio, so this is exact up to that constant. This proxy equals the + # true integral only because `current_power` is already resampled onto a + # uniform grid by the matcher; raw or irregular traces must use + # signal_processing.integrate_wh instead. + cur_energy = float(cur.mean()) * float(current_duration) def agree(a: float, b: float, scale: float) -> float: if a <= 0 or b <= 0: @@ -2033,9 +2088,9 @@ class ProfileStore: if sp.size == 0: continue md = float(snap.get("avg_duration") or 0.0) - sc = (agree(current_duration, md, 0.15) - * agree(cur_mp, float(sp.mean()), 0.20) - * agree(cur_pk, float(sp.max()), 0.20)) + mem_energy = float(sp.mean()) * md + # Scale 0.30 is validated as insensitive over 0.25-0.40 on real data. + sc = agree(cur_energy, mem_energy, 0.30) if sc > best_sc: best_sc, best_m, best_dur = sc, m, md fit = None @@ -2286,6 +2341,83 @@ class ProfileStore: await self.async_save() return True + # ─── Playground presets ──────────────────────────────────────────────────── + # Named snapshots of the Playground's settings control panel. Sandbox data: + # nothing here ever reaches the live detector or matcher - the user publishes + # individual values to entry.options explicitly (ws_set_options) if they want + # them live. Stored per device because the values are device-scale (watts, + # seconds tuned for THIS appliance). + + def get_playground_presets(self) -> dict[str, JSONDict]: + """Return the mutable playground-presets mapping (name -> record). + + Each record is ``{"values": {...}, "created_at": iso, "updated_at": iso}``. + Self-heals a corrupt/missing key to an empty mapping. Never raises. + """ + raw = self._data.setdefault("playground_presets", {}) + if not isinstance(raw, dict): + self._data["playground_presets"] = {} + return cast(dict[str, JSONDict], self._data["playground_presets"]) + return cast(dict[str, JSONDict], raw) + + @staticmethod + def _playground_preset_key(name: str) -> str: + """Canonical storage key for a Playground preset name. + + Save and delete MUST derive the key the same way: truncating only on save + meant a name longer than the cap was stored truncated but looked up in + full, leaving a preset that could never be deleted. The trailing strip() + runs after the clamp so a cut landing mid-space cannot bake a trailing + space into the key. + """ + return (name or "").strip()[:PLAYGROUND_PRESET_NAME_MAX].strip() + + async def async_save_playground_preset( + self, name: str, values: dict[str, Any] + ) -> JSONDict: + """Create or overwrite a named Playground preset and persist it. + + ``values`` must already be sanitized by ``playground.sanitize_setting_values`` + (the store deliberately does not import the playground module - that would + be a cycle). Raises ``ValueError`` for an empty name, an empty value map, or + when the per-device preset cap is reached by a NEW name. + """ + name = self._playground_preset_key(name) + if not name: + raise ValueError("Preset name is required") + if not isinstance(values, dict) or not values: + raise ValueError("Preset has no settings to save") + presets = self.get_playground_presets() + existing = presets.get(name) + if existing is None and len(presets) >= PLAYGROUND_PRESET_MAX: + raise ValueError( + f"Preset limit reached ({PLAYGROUND_PRESET_MAX}); delete one first" + ) + now = dt_util.now().isoformat() + created = now + if isinstance(existing, dict) and isinstance(existing.get("created_at"), str): + created = existing["created_at"] + record: JSONDict = { + "values": dict(values), + "created_at": created, + "updated_at": now, + } + presets[name] = record + await self.async_save() + self._logger.info( + "Saved playground preset %r with %d values", name, len(values) + ) + return record + + async def async_delete_playground_preset(self, name: str) -> bool: + """Remove a Playground preset by name; report whether one was removed.""" + presets = self.get_playground_presets() + if presets.pop(self._playground_preset_key(name), None) is None: + return False + await self.async_save() + self._logger.info("Deleted playground preset %r", name) + return True + def cycles_since_maintenance(self, event_type: str) -> int: """Count completed cycles since the most recent maintenance event of a type. @@ -3835,9 +3967,11 @@ class ProfileStore: if first_offset > 0: # Leading zeros removed - Must shift start_time forward try: - start_dt = datetime.fromisoformat(cycle["start_time"]) + start_dt = _parse_start_dt(cycle["start_time"]) + if start_dt is None: + raise ValueError("unparseable start_time") new_start = start_dt + timedelta(seconds=first_offset) - cycle["start_time"] = new_start.isoformat() + cycle["start_time"] = dt_util.as_utc(new_start).isoformat() # Re-normalize offsets to 0 shifted_data: list[list[float]] = [] @@ -4501,6 +4635,92 @@ class ProfileStore: return cast(JSONDict, env) if isinstance(env, dict) else None return None + @staticmethod + def _envelope_time_power( + envelope: JSONDict | None, + ) -> tuple[list[float], list[float]] | None: + """Extract (time_grid, power) from an envelope's ``avg`` curve, or None. + + Handles both the new ``[[t, p], ...]`` and legacy ``[p, ...]`` formats + (reconstructing the grid from ``time_grid`` / ``target_duration`` / a 60 s + fallback). Single source of the envelope time axis for both the alignment + worker and the Smart-Termination release span (#348), so the mapped position + and the span it is compared against always live on the same grid. + """ + if not envelope: + return None + env_avg_raw = envelope.get("avg", []) + if not env_avg_raw: + return None + try: + if isinstance(env_avg_raw[0], (list, tuple)) and len(env_avg_raw[0]) >= 2: + env_points = cast(list[list[Any] | tuple[Any, ...]], env_avg_raw) + env_time = [float(p[0]) for p in env_points] + env_power = [float(p[1]) for p in env_points] + else: + env_values = cast(list[float | int], env_avg_raw) + env_power = [float(p) for p in env_values] + env_time_raw = envelope.get("time_grid") + env_time = cast(list[float], env_time_raw) if isinstance(env_time_raw, list) else None + if not env_time or len(env_time) != len(env_power): + target_dur = float(envelope.get("target_duration", 0.0) or 0.0) + if target_dur > 0: + env_time = cast(list[float], np.linspace(0, target_dur, len(env_power)).tolist()) + else: + env_time = [float(i * 60) for i in range(len(env_power))] + # Inside the try: a stored time_grid with non-numeric entries must + # yield the safe None fallback, not propagate to async_verify_alignment. + return [float(t) for t in env_time], env_power + except (TypeError, ValueError, IndexError): + return None + + @staticmethod + def _resample_trace_to_grid( + offsets: list[float], powers: list[float], env_time: list[float] + ) -> list[float]: + """Resample a live ``(offsets, powers)`` trace onto the envelope's uniform + time step, so its sample index maps to elapsed seconds on the envelope grid + (#350). Linear interpolation (matching the envelope build side), bounded at + 2x the envelope length. Falls back to the raw powers when a grid cannot be + formed (too few points / non-positive step), leaving behavior unchanged. + """ + if len(offsets) < 2 or len(env_time) < 2: + return list(powers) + diffs = np.diff(np.asarray(env_time, dtype=float)) + pos = diffs[diffs > 0] + if pos.size == 0: + return list(powers) + step = float(np.median(pos)) + span = float(env_time[-1]) + # Sort and deduplicate before computing t_max so the grid span reflects the + # true maximum offset even when the raw trace is non-monotonic. + off_arr = np.asarray(offsets, dtype=float) + pow_arr = np.asarray(powers, dtype=float) + order = np.argsort(off_arr, kind="stable") + off_arr, pow_arr = off_arr[order], pow_arr[order] + # Remove duplicate offsets; np.unique keeps the first occurrence after sorting. + off_arr, unique_idx = np.unique(off_arr, return_index=True) + pow_arr = pow_arr[unique_idx] + t_max = min(float(off_arr[-1]), 2.0 * span) if span > 0 else float(off_arr[-1]) + if step <= 0 or t_max <= 0: + return list(powers) + n = max(2, round(t_max / step) + 1) + grid = np.arange(n, dtype=float) * step + return np.interp(grid, off_arr, pow_arr).tolist() + + def envelope_time_span(self, profile_name: str) -> float: + """Total time span (seconds) of a profile's envelope grid, 0 if unavailable. + + This is exactly the maximum value ``async_verify_alignment`` maps onto, so + dividing a mapped position by it yields a true 0..1 fraction through the + cycle - unlike ``avg_duration`` (a differently-derived trimmed mean) which + could push the 0.95 Smart-Termination release threshold out of reach (#348). + """ + curves = self._envelope_time_power(self.get_envelope(profile_name)) + if not curves or not curves[0]: + return 0.0 + return float(curves[0][-1]) + def reference_curve( self, profile_name: str, n: int = REFERENCE_PROFILE_CURVE_POINTS ) -> JSONDict | None: @@ -5099,6 +5319,7 @@ class ProfileStore: "min_duration_ratio": self._min_duration_ratio, "max_duration_ratio": self._max_duration_ratio, "dtw_bandwidth": self.dtw_bandwidth, + "energy_mode": self.energy_mode, # On-device tuned scoring weights (opt-in); empty = shipped defaults. **self._matching_overrides(), } @@ -5203,48 +5424,50 @@ class ProfileStore: Verify if the current power trace aligns with an expected low-power region in the envelope. Returns: (is_confirmed_low_power, mapped_envelope_time, mapped_envelope_power) """ + if not current_power_data: + return False, 0.0, 9999.0 + + # "avg" can be a list of [t, p] (new) or [p, ...] (legacy); the shared helper + # normalizes both to (time_grid, power) - identical to envelope_time_span so + # the mapped position and the release span live on the same grid (#348). envelope = self.get_envelope(profile_name) - if not envelope or not envelope.get("avg") or not current_power_data: - return False, 0.0, 9999.0 - - # Extract envelope curves - # "avg" can be list of [t, p] (new) or [p, ...] (legacy) - env_avg_raw = envelope.get("avg", []) - if not env_avg_raw: + curves = self._envelope_time_power(envelope) + if curves is None: + if envelope and envelope.get("avg"): + self._logger.error( + "Malformed envelope 'avg' data for %s", profile_name + ) return False, 0.0, 9999.0 + env_time, env_power = curves + # Resample the live trace onto the envelope's own time step BEFORE alignment, + # so its sample index corresponds to elapsed SECONDS, not sample count (#350). + # The worker warps power-vs-power; with no shared time axis an irregularly or + # sparsely sampled tail (e.g. 0 W keepalives every off_delay) maps one grid + # step per sample regardless of wall-clock, so the position crawls - and a + # dense short prefix instead races to the end. Linear interpolation matches + # the envelope build side so the two curves stay comparable. try: - # Handle both formats: [[t, y], ...] (new) or [y, ...] (legacy) - if isinstance(env_avg_raw[0], (list, tuple)) and len(env_avg_raw[0]) >= 2: - # New format: [[t, y], ...] - env_points = cast(list[list[Any] | tuple[Any, ...]], env_avg_raw) - env_time = [float(p[0]) for p in env_points] - env_power = [float(p[1]) for p in env_points] - else: - # Legacy format: [y, ...] - env_values = cast(list[float | int], env_avg_raw) - env_power = [float(p) for p in env_values] - # Reconstruct time grid from envelope if available, or assume 60s intervals - env_time_raw = envelope.get("time_grid") - env_time = cast(list[float], env_time_raw) if isinstance(env_time_raw, list) else None - if not env_time or len(env_time) != len(env_power): - target_dur = float(envelope.get("target_duration", 0.0) or 0.0) - if target_dur > 0: - env_time = cast(list[float], np.linspace(0, target_dur, len(env_power)).tolist()) - else: - env_time = [float(i * 60) for i in range(len(env_power))] - except (TypeError, ValueError, IndexError) as e: - first_type_name = type(env_avg_raw[0]).__name__ if env_avg_raw else "None" - self._logger.error( - "Malformed envelope 'avg' data for %s. Type: %s, Length: %d, Error: %s", - profile_name, first_type_name, len(env_avg_raw), e + offsets = [float(x[0]) for x in current_power_data] + powers = [float(x[1]) for x in current_power_data] + except (TypeError, ValueError, IndexError): + # A legacy ISO-timestamped trace (x[0] is a string) lands here. The + # signature admits ``list[tuple[Any, ...]]``, so normalize through the + # shared helper instead of bailing out: returning early skipped + # alignment entirely, which silently reduced the legacy-envelope guard + # in tests/repro/test_issue_112.py to a no-op. Production callers pass + # offsets and never reach this branch, so the fast path is unchanged. + normalized = power_data_to_offsets( + cast(list[list[Any] | tuple[Any, ...]], current_power_data) ) - return False, 0.0, 9999.0 - - try: - current_power_list = [float(x[1]) for x in current_power_data] - except Exception: # pylint: disable=broad-exception-caught - return False, 0.0, 9999.0 + if not normalized: + return False, 0.0, 9999.0 + try: + offsets = [float(x[0]) for x in normalized] + powers = [float(x[1]) for x in normalized] + except (TypeError, ValueError, IndexError): + return False, 0.0, 9999.0 + current_power_list = self._resample_trace_to_grid(offsets, powers, env_time) # Offload to worker mapped_time, mapped_power, score = await self.hass.async_add_executor_job( @@ -5593,6 +5816,7 @@ class ProfileStore: self._data["profiles"] = {} self._data["envelopes"] = {} self._data["suggestions"] = {} + self._data["locked_suggestions"] = [] self._data["feedback_history"] = {} self._data["pending_feedback"] = {} self._data["auto_adjustments"] = [] @@ -5604,6 +5828,7 @@ class ProfileStore: self._data["ml_model_versions"] = {} self._data["profile_groups"] = {} self._data["maintenance_log"] = [] + self._data["playground_presets"] = {} self._data["matching_config"] = {} self._data["match_ranking_history"] = [] self._data["ml_last_training_run"] = None @@ -6261,8 +6486,8 @@ class ProfileStore: for c in self._data.get("reference_cycles", []): if not isinstance(c, dict): continue - meta = c.get("meta") - src = meta.get("source") if isinstance(meta, dict) else None + cyc_meta = c.get("meta") + src = cyc_meta.get("source") if isinstance(cyc_meta, dict) else None if src: existing_ref_sources.add(_ref_dedup_key(src)) @@ -6530,6 +6755,36 @@ class ProfileStore: new_start_s = max(0.0, float(new_start_s)) new_end_s = float(new_end_s) + # Guard against a destructive trim (#366): an inverted/empty window would + # produce a zero- or single-sample segment that collapses the cycle to + # duration 0 / energy 0. Reject before touching the cycle. + if new_end_s <= new_start_s: + return False + + # Snap both boundaries to a real sample offset (#373). Trim inputs round + # to whole seconds, but sample offsets are frequently fractional -- a + # nominal 10 s cadence drifts, so ~3132.3 is the norm -- and the + # [start, end] filter below is inclusive, so a whole-second entry lands + # just below the sample the user aimed at and silently drops it. Snapping + # against the full-resolution stored trace (independent of any client-side + # curve decimation) makes the kept window land on the samples the + # boundaries name, on both ends. + # + # Snap *inward*, tolerating only the whole-second input quantization + # (_TRIM_SNAP_TOLERANCE_S). Nearest-in-either-direction snapping could + # widen the window by up to half a sample interval per side -- on a + # coarse trace (samples at 0 s and 100 s, request 40-60 s) that silently + # kept the entire cycle while meta["trim"] claimed a narrow window. + offsets = [float(offset) for offset, _ in p_data] + starts = [o for o in offsets if o >= new_start_s - _TRIM_SNAP_TOLERANCE_S] + ends = [o for o in offsets if o <= new_end_s + _TRIM_SNAP_TOLERANCE_S] + if not starts or not ends: + return False + new_start_s = min(starts) + new_end_s = max(ends) + if new_end_s <= new_start_s: + return False + kept = sorted( ( (offset, power) @@ -6547,6 +6802,13 @@ class ProfileStore: [round(offset - base, 2), power] for offset, power in kept ] + # A window that keeps fewer than two samples (or whose kept span is zero) + # would collapse the cycle to duration 0 with no recovery. Reject here, + # BEFORE the start_time mutation below, so the stored cycle is untouched + # and the caller reports a failure instead of destroying data (#366). + if len(renorm) < 2 or round(renorm[-1][0], 1) <= 0.0: + return False + # Advance start_time when trimming from the front if base > 0: start_ts = _value_to_timestamp(cycle.get("start_time")) @@ -6817,8 +7079,8 @@ class ProfileStore: # Create Cycle Record new_cycle: dict[str, Any] = { - "start_time": new_cycle_start.isoformat(), - "end_time": (new_cycle_start + timedelta(seconds=seg_dur)).isoformat(), + "start_time": dt_util.as_utc(new_cycle_start).isoformat(), + "end_time": dt_util.as_utc(new_cycle_start + timedelta(seconds=seg_dur)).isoformat(), "duration": round(seg_dur, 1), "status": "completed", "power_data": p_data_abs, @@ -6860,6 +7122,10 @@ class ProfileStore: for name in touched: await self.async_rebuild_envelope(name) + # The original cycle is gone; drop its now-orphaned pending feedback so the + # "needs review" badge stays consistent with the review list (#362). + self.prune_orphaned_feedback() + await self.async_save() self._logger.info("Interactive Split Applied to %s -> %s", cycle_id, new_ids) return new_ids @@ -6995,7 +7261,8 @@ class ProfileStore: new_dur = (final_end_dt - c1_start_dt).total_seconds() - c1["end_time"] = final_end_dt.isoformat() + c1["start_time"] = dt_util.as_utc(c1_start_dt).isoformat() + c1["end_time"] = dt_util.as_utc(final_end_dt).isoformat() c1["duration"] = round(new_dur, 1) c1["max_power"] = max_power c1["profile_name"] = target_profile @@ -7050,6 +7317,10 @@ class ProfileStore: except Exception as e: # pylint: disable=broad-exception-caught self._logger.warning("Failed to update signature for merged cycle %s: %s", new_id, e) + # Consumed cycles are gone; drop any pending feedback that pointed at them so + # the "needs review" badge does not keep counting non-existent cycles (#362). + self.prune_orphaned_feedback() + await self.async_save() self._logger.info("Interactive Merge Applied: %s -> %s", cycle_ids, new_id) diff --git a/custom_components/ha_washdata/sensor.py b/custom_components/ha_washdata/sensor.py index 8a89ca5a..63c7d3ee 100644 --- a/custom_components/ha_washdata/sensor.py +++ b/custom_components/ha_washdata/sensor.py @@ -56,6 +56,8 @@ from .const import ( SIGNAL_WASHER_UPDATE, CONF_WATCHDOG_INTERVAL, CONF_EXPOSE_DEBUG_ENTITIES, + CONF_POWER_PROFILE_INTERVAL_MIN, + DEFAULT_POWER_PROFILE_INTERVAL_MIN, DEVICE_TYPE_PUMP, STATE_OFF, STATE_IDLE, @@ -419,6 +421,7 @@ class WasherTimeRemainingSensor(WasherBaseSensor): # duration display-format options, even while the appliance is idle # and the value is unknown (see issue #261). native_unit_of_measurement="min", + suggested_display_precision=0, icon="mdi:timer-sand", ) super().__init__(manager, entry) @@ -444,6 +447,7 @@ class WasherTotalDurationSensor(WasherBaseSensor): # See WasherTimeRemainingSensor / issue #261: keep the unit static so # the duration display-format options are available even while idle. native_unit_of_measurement="min", + suggested_display_precision=0, icon="mdi:timer-check-outline", ) super().__init__(manager, entry) @@ -529,6 +533,7 @@ class WasherElapsedTimeSensor(WasherBaseSensor): translation_key="elapsed_time", native_unit_of_measurement="s", device_class=SensorDeviceClass.DURATION, + suggested_display_precision=0, icon="mdi:timer-outline", ) super().__init__(manager, entry) @@ -736,6 +741,19 @@ class WasherProfileCountSensor(WasherBaseSensor): def _to_min(sec: float) -> int: return int(sec / 60) if sec else 0 + # power_profile bucket size (minutes) is configurable (#367); default 15. + # Clamp to >=1 (get_profile_power_profile returns [] for interval <= 0). + interval_min = DEFAULT_POWER_PROFILE_INTERVAL_MIN + try: + interval_min = int( + self._entry.options.get( + CONF_POWER_PROFILE_INTERVAL_MIN, DEFAULT_POWER_PROFILE_INTERVAL_MIN + ) + ) + except (TypeError, ValueError, OverflowError): + interval_min = DEFAULT_POWER_PROFILE_INTERVAL_MIN + interval_min = max(1, interval_min) + return { "average_consumption_kwh": avg_energy, "total_consumption_kwh": total_energy, @@ -744,16 +762,16 @@ class WasherProfileCountSensor(WasherBaseSensor): "min_length_min": _to_min(profile.get("min_duration", 0)), "max_length_min": _to_min(profile.get("max_duration", 0)), "consistency_min": consistency_min, - # Average power (W) per 15-min slot of this profile's learned shape, + # Average power (W) per configured interval of this profile's learned shape, # e.g. [2200, 2200, 800, ...] - the flat array external planners such # as tibber_prices' `power_profile` consume to pick the cheapest run # window (issue #272). Empty until the profile has a learned envelope. # Refreshes with the profile: the envelope is rebuilt on each new # labelled cycle, which bumps this sensor's cycle_count state. "power_profile": self._manager.profile_store.get_profile_power_profile( - self._profile_name + self._profile_name, interval_s=interval_min * 60.0 ), - "power_profile_interval_min": 15, + "power_profile_interval_min": interval_min, } diff --git a/custom_components/ha_washdata/strings.json b/custom_components/ha_washdata/strings.json index ed07247f..3e056ae6 100644 --- a/custom_components/ha_washdata/strings.json +++ b/custom_components/ha_washdata/strings.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData Setup", - "description": "Configure your washing machine or other appliance.\n\nPower sensor is required.", + "description": "Configure your washing machine or other appliance.\n\nPower sensor is required.\n\nAfter setup, open the WashData panel from the sidebar (or go to [/ha-washdata](/ha-washdata)) to view cycles, tune detection and manage profiles.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Update the device name, appliance type, or power sensor.\n\nThe WashData panel (sidebar, or [/ha-washdata](/ha-washdata)) is where detection, cycles, profiles and notifications are managed.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the WashData panel.", + "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the [WashData panel](/ha-washdata) (also reachable from the sidebar).", "data": { "name": "Device Name", "device_type": "Device Type", @@ -57,6 +57,7 @@ "timer_default_message": "{device}: {minutes} min timer", "timer_pause_action_title": "Resume Cycle", "timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.", + "unload_dismiss_action_title": "Stop reminding", "vs_typical_longer": "{pct}% longer than usual", "vs_typical_shorter": "{pct}% shorter than usual", "notify_live_waiting_message": "{device}: No profile matched yet." diff --git a/custom_components/ha_washdata/suggestion_engine.py b/custom_components/ha_washdata/suggestion_engine.py index 40c82507..14c8579c 100644 --- a/custom_components/ha_washdata/suggestion_engine.py +++ b/custom_components/ha_washdata/suggestion_engine.py @@ -18,12 +18,14 @@ from __future__ import annotations +import copy import logging +import math from datetime import datetime from typing import Any, TYPE_CHECKING, cast import numpy as np -from homeassistant.core import HomeAssistant +from homeassistant.core import HomeAssistant, callback from .const import ( CONF_WATCHDOG_INTERVAL, @@ -51,6 +53,9 @@ from .const import ( CONF_START_DURATION_THRESHOLD, CONF_ANTI_WRINKLE_MAX_POWER, CONF_ANTI_WRINKLE_EXIT_POWER, + CONF_ANTI_WRINKLE_ENABLED, + DEFAULT_ANTI_WRINKLE_ENABLED, + DEFAULT_ANTI_WRINKLE_MAX_POWER, CONF_DEVICE_TYPE, CONF_PUMP_STUCK_DURATION, DEVICE_TYPE_DRYER, @@ -88,6 +93,56 @@ _MAX_PAUSE_GAP_H = 1.0 # a gap > this (hours) between samples i _MIN_RESUME_ACTIVE_S = 120.0 +def _measured_off_delay_floor(device_floor: int) -> int: + """Lower bound for an off_delay suggestion backed by *measured* pauses. + + ``DEFAULT_OFF_DELAY_BY_DEVICE`` is a blind prior for devices we have no + traces for: the dishwasher entry (1800 s) is sized to bridge a passive + drying phase. Once real intra-cycle pauses have been measured that prior is + stale evidence, and clamping the measurement up to it is actively harmful - + off_delay is *never* what holds a cycle together (every finalize path in + ``cycle_detector`` uses ``max(off_delay, min_off_gap)``, and min_off_gap + keeps its own 3600 s dishwasher floor). Solo uses of off_delay are the + end-gate energy lookback window, the watchdog's keepalive cadence and the + Rule-12 end_energy_threshold coupling - all of which get *worse* as it + grows: a 1800 s window sweeps standby blips into the end gate and holds the + cycle open long past the real end. + + So a measured suggestion is floored at the generic ``DEFAULT_OFF_DELAY``, + while device priors that are *below* it (e.g. pumps at 20 s, which cut off + sharply) are still honoured. + """ + return min(int(device_floor), DEFAULT_OFF_DELAY) + + +#: Evidence bar for a *measured* ``min_off_gap`` proposal. Below this we keep the +#: conservative per-device prior rather than guess from a thin sample. +_MIN_GAP_MIN_TRACED_CYCLES = 5 +_MIN_GAP_MIN_SPANS = 3 +#: Absolute sanity cap, mirroring the inter-cycle-gap path. +_MIN_GAP_ABS_CAP = 3600 + + +def _bridged_spans( + points: list[tuple[float, float]], active_thr: float, max_gap_s: float +) -> list[float]: + """Quiet spans a cycle has to survive to stay whole, in seconds. + + The mirror image of the off-delay pause scan: here *any* resumption counts + (``min_resume_active_s=0``), including a dishwasher's short terminal + pump-out. That blip is deliberately excluded from the off-delay statistic - + it must not inflate the end-gate window - but it is exactly what + ``min_off_gap`` exists to bridge, because if the cycle closes before it + lands, the pump-out is recorded as a separate ghost cycle (#43). + """ + return [ + points[resume_idx][0] - low_start + for low_start, resume_idx in _resumed_low_runs( + points, active_thr, max_gap_s, min_resume_active_s=0.0 + ) + ] + + def _resumed_low_runs( points: list[tuple[float, float]], active_thr: float, @@ -569,6 +624,32 @@ def reconcile_suggestions( else: adjust(CONF_PROFILE_MATCH_MIN_DURATION_RATIO, round(max_r * 0.5, 2), "the max duration ratio") + # ── Rule 12: end_energy_threshold >= stop_threshold_w * off_delay / 3600 ── + # The energy end-gate is evaluated over an off_delay-long window, so it + # implies a wattage; below stop_threshold_w it forbids what the power gate + # allows and the cycle can only close via a fallback path (#376). Only ever + # RAISE end_energy to the implied floor (the safe direction that makes the + # end gate satisfiable); never lower stop_threshold_w, which would make + # start/end detection more aggressive. + stop_ee = eff(CONF_STOP_THRESHOLD_W) + off_delay_ee = eff(CONF_OFF_DELAY) + end_energy = eff(CONF_END_ENERGY_THRESHOLD) + if ( + stop_ee is not None and off_delay_ee is not None and end_energy is not None + and off_delay_ee > 0 and end_energy < stop_ee * off_delay_ee / 3600.0 + and in_out(CONF_END_ENERGY_THRESHOLD, CONF_STOP_THRESHOLD_W, CONF_OFF_DELAY) + ): + # Round the floor UP at adjust()'s own 2-decimal precision. Rounding + # to-nearest would land *below* the floor (stop=2 W, off_delay=60 s -> + # 0.0333 Wh -> 0.03 Wh), the next fixpoint pass would then see the same + # violation, find the value unchanged, and return a map that still + # breaks Rule 12. + adjust( + CONF_END_ENERGY_THRESHOLD, + math.ceil(stop_ee * off_delay_ee / 36.0) / 100.0, + "the stop threshold and off delay", + ) + if change_count[0] == prev_count: break @@ -605,22 +686,62 @@ class SuggestionEngine: self.entry_id = entry_id self.profile_store = profile_store self.device_type = device_type + # Loop-affine config snapshot, refreshed by refresh_options_snapshot() + # immediately before an executor dispatch. See _entry_options(). + self._options_snapshot: dict[str, Any] | None = None + + @callback + def for_job(self, options: dict[str, Any] | None = None) -> "SuggestionEngine": + """A throwaway engine bound to one config snapshot; loop-only. + + Every generator below runs in an executor thread, but reading the config + entry is loop-affine: ``async_get_entry`` walks loop-owned state, and the + two-mapping merge in :meth:`_read_entry_options` can tear if + ``async_update_entry`` replaces ``data``/``options`` between the reads. + + The snapshot is bound to a **shallow copy** rather than to ``self`` so + concurrent jobs cannot overwrite each other's view, and so the shared + engine never holds a snapshot that a later loop-side caller would silently + read as stale. The copy shares ``profile_store``/``hass`` deliberately - + the generators only read them. + """ + job = copy.copy(self) + job._options_snapshot = ( + dict(options) if options is not None else self._read_entry_options() + ) + return job def generate_operational_suggestions(self, p95_dt: float, median_dt: float) -> dict[str, Any]: """Generate suggestions for operational parameters based on cadence.""" suggestions: dict[str, dict[str, Any]] = {} # 1. Watchdog Interval - # Goal: as LOW (responsive) as safely possible so a stalled cycle is - # caught quickly. The only hard constraint is that it must sit above the - # normal update cadence to avoid false stops, so target just above p95 - # (3x) rather than a very conservative multiple. - suggested_watchdog = int(max(30, round(p95_dt * 3))) + # This is only the *tick period* of the background timer - it is never + # itself a staleness threshold, so it cannot cause a false stop (those + # are gated by no_update_active_timeout / the device low-power floor in + # ``manager._watchdog_check_stuck_cycle``). It does bound how late the + # 0 W keepalive injection and the timeout checks can fire, so every extra + # second is pure end-detection lag. Tick just past the p95 update gap - + # matching DEFAULT_WATCHDOG_INTERVAL's documented "2 x sampling + 1" + # derivation for a publish-on-change sensor that skips at most one + # sample. The old 3x multiple polled ~6x slower than the sensor updates + # and delayed end detection for no safety benefit. + # Floor at 2 x median + 1 so the suggestion pre-satisfies reconciler + # Rule 3a (watchdog >= 2 x sampling_interval) when CONF_SAMPLING_INTERVAL + # is suggested from the same median_dt. Without this, a regular sensor + # (p95 ≈ median) would produce ceil(p95)+1 which Rule 3a then silently + # overwrites, leaving a stored value whose reason text no longer matches. + suggested_watchdog = int(max(30, max(math.ceil(p95_dt) + 1, + 2 * math.ceil(median_dt) + 1))) suggestions[CONF_WATCHDOG_INTERVAL] = { "value": suggested_watchdog, - "reason": f"Kept as low as safe (3x the p95 update gap of {p95_dt:.1f}s, min 30s) so stalls are caught quickly without false stops.", + "reason": ( + f"Kept as low as safe (just above the p95 update gap of {p95_dt:.1f}s" + f" and at least 2x the sampling interval of {median_dt:.1f}s, min 30s)" + f" so stalls are caught quickly without false stops." + ), "reason_key": "suggestion.reason.watchdog", - "reason_params": {"p95": f"{p95_dt:.1f}"}, + "reason_params": {"p95": f"{p95_dt:.1f}", "median": f"{median_dt:.1f}"}, } # 2. No Update Timeout @@ -645,19 +766,32 @@ class SuggestionEngine: # cadence only sets a lower sanity bound, so fall back to it when we do # not yet have enough traces to measure pauses. raw_cycles = self.profile_store.get_past_cycles()[-100:] - stop_thr = self._current_stop_threshold(self._entry_options()) + # Resolve the config entry once (loop-affine; this runs in an executor) and + # reuse it for both the stop threshold and the anti-crease check below. + _op_opts = self._entry_options() + stop_thr = self._current_stop_threshold(_op_opts) clean, _excl = select_clean_cycles(raw_cycles, stop_threshold_w=stop_thr) - pause_based = self._suggest_off_delay_from_pauses(clean, stop_thr, device_floor) + pause_based = self._suggest_off_delay_from_pauses( + clean, stop_thr, device_floor, options=_op_opts + ) - reason_off_key: str | None = None - reason_off_params: dict[str, Any] | None = None if pause_based is not None: suggested_off_delay, reason_off, reason_off_key, reason_off_params = pause_based - else: + suggestions[CONF_OFF_DELAY] = { + "value": suggested_off_delay, + "reason": reason_off, + "reason_key": reason_off_key, + "reason_params": reason_off_params, + } + elif not self._is_anti_crease_enabled(_op_opts): + # Cadence fallback: p95_dt * 5. Safe for most devices, but on anti-crease + # devices the update gap is dominated by the inter-burst quiet period, so + # the result often exceeds the burst interval and resets the end timer on + # every tumble burst. Skip it when anti-crease is enabled (#343 gap B). suggested_off_delay = int(max(device_floor, p95_dt * 5)) reason_off = f"Based on observed update cadence (p95={p95_dt:.1f}s) * 5" - reason_off_key = "suggestion.reason.off_delay_cadence" - reason_off_params = {"p95": f"{p95_dt:.1f}"} + reason_off_key: str = "suggestion.reason.off_delay_cadence" + reason_off_params: dict[str, Any] = {"p95": f"{p95_dt:.1f}"} if suggested_off_delay == device_floor: if self.device_type and self.device_type in DEFAULT_OFF_DELAY_BY_DEVICE: reason_off = ( @@ -669,13 +803,12 @@ class SuggestionEngine: reason_off = f"Used generic safe minimum ({DEFAULT_OFF_DELAY}s)." reason_off_key = "suggestion.reason.off_delay_generic_floor" reason_off_params = {"floor": DEFAULT_OFF_DELAY} - - suggestions[CONF_OFF_DELAY] = { - "value": suggested_off_delay, - "reason": reason_off, - "reason_key": reason_off_key, - "reason_params": reason_off_params, - } + suggestions[CONF_OFF_DELAY] = { + "value": suggested_off_delay, + "reason": reason_off, + "reason_key": reason_off_key, + "reason_params": reason_off_params, + } # 4. Profile Match Interval suggested_match = int(max(10, median_dt * 10)) @@ -791,14 +924,28 @@ class SuggestionEngine: "reason_params": {"p95": f"{p95_ratio:.2f}"}, } - # Min-off-gap: derived from observed inter-cycle gaps - min_off_gap = self._suggest_min_off_gap(cycles) + # Min-off-gap: measured bridge requirement, capped by back-to-back headroom + min_off_gap = self._suggest_min_off_gap( + cycles, stop_threshold_w=stop_thr, gap_cycles=raw_cycles + ) if min_off_gap is not None: suggestions[CONF_MIN_OFF_GAP] = min_off_gap return suggestions def _entry_options(self) -> dict[str, Any]: + """Config options for this pass: the job-bound snapshot when present. + + Only a :meth:`for_job` copy carries a snapshot; on the shared engine this + is always ``None``, so loop-side callers (tests, direct calls) get a live + read and can never observe a stale snapshot left by a finished job. + """ + snapshot = self._options_snapshot + if snapshot is not None: + return snapshot + return self._read_entry_options() + + def _read_entry_options(self) -> dict[str, Any]: """Best-effort read of the current config entry options.""" try: entry = self.hass.config_entries.async_get_entry(self.entry_id) @@ -898,9 +1045,12 @@ class SuggestionEngine: } # --- min_power: keep the noise gate below the lowest genuine draw --- + # Strip the anti-crease tail before taking the per-cycle minimum so that the + # ~3 W between-burst baseline does not drag the p05 down on anti-crease + # devices and produce a noise gate below the real operating draw (#343 gap A). lowest_active: list[float] = [] for c in clean: - readings = _cycle_readings(c) + readings = self._strip_anti_crease_readings(_cycle_readings(c), options=options) if len(readings) < 5: continue active = np.array([p for _, p in readings if p > 0.5]) @@ -1085,27 +1235,38 @@ class SuggestionEngine: cycles: list[dict[str, Any]], stop_threshold_w: float, device_floor: int, + options: dict[str, Any] | None = None, ) -> tuple[int, str, str, dict[str, Any]] | None: """Off-delay sized to outlast the longest genuine intra-cycle pause. Collects every low-power segment that *resumed* (a proven pause, not the trailing wind-down) across clean cycles and sets off_delay to the p95 - pause length plus a 60 s buffer, floored by the device minimum. Returns - ``None`` when too few traces exist, so the caller falls back to the - update-cadence heuristic. + pause length plus a 60 s buffer. Returns ``None`` when too few traces + exist, so the caller falls back to the update-cadence heuristic. + + The floor is :func:`_measured_off_delay_floor` (the *generic* minimum), + not ``device_floor``: once real pauses have been measured the blind + per-device prior is stale evidence and must not override the + measurement. ``device_floor`` still applies on the caller's no-data + fallback path. """ pause_durations: list[float] = [] n_traced = 0 max_gap_s = _MAX_PAUSE_GAP_H * 3600 + _anti_crease_opts = options if options is not None else self._entry_options() for c in cycles: - readings = _cycle_readings(c) + # Strip the anti-crease tail before pause analysis so that the inter-burst + # quiet periods (up to 180-240 s on Miele/Bosch) are not counted as genuine + # intra-cycle pauses, which would inflate p95 beyond the burst interval and + # reset the end timer on every tumble burst (#343 gap C). + readings = self._strip_anti_crease_readings(_cycle_readings(c), options=_anti_crease_opts) if len(readings) < 10: continue - n_traced += 1 powers = [p for _, p in readings] peak = max(powers) if powers else 0.0 if peak <= 0: continue + n_traced += 1 active_thr = max(stop_threshold_w, _CLEAN_ACTIVE_FLOOR_RATIO * peak) # Genuine intra-cycle pauses only: a low run that resumed into # sustained activity. A terminal drying/pump-out blip that does not @@ -1120,11 +1281,12 @@ class SuggestionEngine: return None p95_pause = float(np.percentile(pause_durations, 95)) - value = int(max(device_floor, round(p95_pause + 60.0))) + floor = _measured_off_delay_floor(device_floor) + value = int(max(floor, round(p95_pause + 60.0))) reason = ( f"Sized to outlast real pauses: p95 intra-cycle pause {p95_pause:.0f}s " f"+ 60s buffer, from {len(pause_durations)} pauses across {n_traced} " - f"clean cycles (floor {device_floor}s)." + f"clean cycles (floor {floor}s)." ) return ( value, @@ -1134,17 +1296,67 @@ class SuggestionEngine: "p95": f"{p95_pause:.0f}", "pauses": len(pause_durations), "cycles": n_traced, - "floor": device_floor, + "floor": floor, }, ) def _suggest_min_off_gap( - self, cycles: list[dict[str, Any]] + self, + cycles: list[dict[str, Any]], + stop_threshold_w: float | None = None, + gap_cycles: list[dict[str, Any]] | None = None, ) -> dict[str, Any] | None: - """Derive a min_off_gap suggestion from observed inter-cycle gaps.""" + """Size ``min_off_gap`` from what the cycles actually need to bridge. + + ``min_off_gap`` is bounded from two sides and both bounds are measurable: + + * **must not split** - it has to outlast the longest quiet span *inside* + a cycle that is followed by more of that same cycle (see + :func:`_bridged_spans`). This is the requirement, so it sets the value. + * **must not merge** - it has to stay under the shortest gap the user + leaves between two separate loads, because a high reading while the + previous cycle is still in ENDING revives that cycle rather than + starting a new one (``cycle_detector`` STATE_ENDING). This is a + *ceiling*, not a target. + + The previous implementation derived the value from the ceiling + (``p05_inter_cycle_gap * 0.8``) and then floored it with the blind + per-device prior. That proposed a value sitting right against the merge + boundary with no evidence any bridging was needed - on a real washer + export it lands at ~1748 s against a measured need of ~1271 s and a real + inter-load gap of 181 s, i.e. it guarantees back-to-back loads merge + (#296). It also suppressed itself whenever the result equalled the + device floor, so a dishwasher user was never told their 3600 s prior was + 1.7x what their machine measurably needs. + + When the two bounds conflict (the cycle needs more bridging than the + user's own turnaround allows) no suggestion is made: that machine cannot + be separated by a quiet-gap rule at all and needs the event-based + splitters instead (anti-crease finalize, dishwasher end-spike), so the + safe move is to leave the current value alone. Splitting a cycle + corrupts the learned profile; merging produces one visibly over-long + record the user can correct. + + ``cycles`` supplies the bridge measurement and must be clean; + ``gap_cycles`` supplies the merge ceiling and must be the *unfiltered* + history (defaults to ``cycles``). The distinction matters: dropping a + mis-detected cycle silently fuses its two neighbouring gaps into one long + gap, which inflates the ceiling and would let the proposal sail past the + user's real turnaround. On a real washer export that is the difference + between a 1748 s and a 181 s ceiling. + + Falls back to the historical inter-cycle-gap heuristic when there are too + few traces to measure a bridge requirement. + + Validated with ``devtools/min_off_gap_eval.py``: replaying all 152 clean + cycles across the ``cycle_data/`` corpus through a real unmatched + ``CycleDetector`` at the proposed value produces zero splits (the only + trace that splits is tron4r's known back-to-back *merged* 206-min cycle, + where splitting is the correct outcome). + """ # Only consider completed, labeled cycles with valid timestamps timed_cycles: list[tuple[float, float]] = [] - for c in cycles: + for c in (cycles if gap_cycles is None else gap_cycles): if not isinstance(c, dict): continue if c.get("status") not in ("completed", "force_stopped"): @@ -1179,15 +1391,59 @@ class SuggestionEngine: return None gaps_arr = np.array(gaps) - # Use the 5th-percentile gap as the safe minimum, with device-type floor + # 5th percentile, kept only for the no-evidence fallback path's reason text. p05_gap = float(np.percentile(gaps_arr, 5)) device_floor = ( DEFAULT_MIN_OFF_GAP_BY_DEVICE.get(self.device_type, DEFAULT_MIN_OFF_GAP) if self.device_type is not None else DEFAULT_MIN_OFF_GAP ) - # Add a 20% safety margin so we never split a real gap into two cycles - suggested = int(max(device_floor, min(p05_gap * 0.8, 3600))) + # Merge ceiling: the SHORTEST turnaround this user has actually run, less a + # 20% margin. Deliberately not a percentile - these distributions are + # strongly skewed (one 181 s turnaround, then a jump to 5000 s+), so p05 + # interpolates straight past the single tight pair that is precisely the + # merge case we must not propose through. Tolerating it as an "outlier" + # would be tolerating the bug. Erring low only ever suppresses a + # suggestion, which leaves the user's current value in place. + ceiling = int(min(float(gaps_arr.min()) * 0.8, _MIN_GAP_ABS_CAP)) + + # --- Preferred: size from the measured bridge requirement --------------- + bridge = self._measured_bridge_requirement(cycles, stop_threshold_w) + if bridge is not None: + longest, n_spans, n_traced = bridge + needed = int( + min( + _MIN_GAP_ABS_CAP, + max(DEFAULT_MIN_OFF_GAP, round(longest + 60.0)), + ) + ) + if needed > ceiling: + # The cycle needs more bridging than this user's turnaround + # allows - no quiet-gap value satisfies both. Leave it alone. + return None + reason = ( + f"Sized to bridge the longest quiet stretch inside a cycle: " + f"{longest:.0f}s + 60s buffer, from {n_spans} bridged gaps across " + f"{n_traced} clean cycles (stays under your {ceiling}s " + f"back-to-back headroom)." + ) + return { + "value": needed, + "reason": reason, + "reason_key": "suggestion.reason.min_off_gap_bridge", + "reason_params": { + "span": f"{longest:.0f}", + "spans": n_spans, + "cycles": n_traced, + "ceiling": ceiling, + }, + } + + # --- Fallback: no trace evidence, keep the conservative prior ---------- + # Unchanged from the historical heuristic (p05-based, device floor wins), + # because with no measured bridge requirement the blind prior is still the + # best evidence available. + suggested = int(max(device_floor, min(p05_gap * 0.8, _MIN_GAP_ABS_CAP))) # When the data-derived value is equal to the device floor, we have no # useful signal to surface - return None to suppress a misleading suggestion. if suggested == device_floor: @@ -1207,6 +1463,139 @@ class SuggestionEngine: }, } + def _measured_bridge_requirement( + self, + cycles: list[dict[str, Any]], + stop_threshold_w: float | None = None, + ) -> tuple[float, int, int] | None: + """Longest quiet span these cycles had to bridge to stay whole. + + Returns ``(longest_span_s, n_spans, n_traced)`` or ``None`` when there is + not enough traced history to trust the measurement. + + The statistic is the **maximum**, not a percentile: ``min_off_gap`` has to + outlast the *longest* gap a cycle ever has to survive, and a percentile + under-shoots it. On washers the bridged-span distribution is dominated by + thousands of sampling-jitter dips, so p95 collapses to ~100 s while the + real phase gap is ~1300 s. Outliers are bounded by construction: + ``select_clean_cycles`` has already dropped mis-detected cycles, + :func:`_resumed_low_runs` abandons any run straddling an outage-sized + sampling gap, and the caller clamps the result under both + ``_MIN_GAP_ABS_CAP`` and the user's own back-to-back headroom. + """ + stop_thr = ( + float(stop_threshold_w) + if stop_threshold_w is not None + else self._current_stop_threshold(self._entry_options()) + ) + max_gap_s = _MAX_PAUSE_GAP_H * 3600 + spans: list[float] = [] + n_traced = 0 + for c in cycles: + if not isinstance(c, dict): + continue + readings = _cycle_readings(c) + if len(readings) < 10: + continue + peak = max((p for _, p in readings), default=0.0) + if peak <= 0: + continue + n_traced += 1 + active_thr = max(stop_thr, _CLEAN_ACTIVE_FLOOR_RATIO * peak) + spans.extend(_bridged_spans(readings, active_thr, max_gap_s)) + + if n_traced < _MIN_GAP_MIN_TRACED_CYCLES or len(spans) < _MIN_GAP_MIN_SPANS: + return None + return (max(spans), len(spans), n_traced) + + #: Device types where the anti-crease/anti-wrinkle tail must be excluded from + #: the stop/start min-active statistic (#343). + _ANTI_CREASE_DEVICE_TYPES = ( + DEVICE_TYPE_WASHING_MACHINE, + DEVICE_TYPE_DRYER, + DEVICE_TYPE_WASHER_DRYER, + ) + + def _strip_anti_crease_tail( + self, + ordered_powers: np.ndarray, + options: dict[str, Any] | None = None, + ) -> np.ndarray: + """Drop the post-cycle anti-crease tail from an ordered power trace (#343). + + Stop/start thresholds detect the MAIN cycle; the anti-crease tumble-pulse + tail is governed by its own ``anti_wrinkle_*`` settings, but its near-zero + between-pulse baseline is the global minimum of the stored trace and used + to poison the min-active statistic (the tuner then proposes thresholds just + above that baseline, breaking end-detection). + + The tail is everything after the last sample that reaches + ``anti_wrinkle_max_power`` - by the config's own rule a pulse above that + ends anti-wrinkle, so nothing in the tail can reach it. Returns the trace + unchanged when anti-crease is off, the device type is ineligible, or no + sample reaches the ceiling (no identifiable main phase) - so it can never + over-exclude for a non-anti-crease device or a gentle program. + + Pass ``options`` when calling from a loop to avoid repeated config-entry + reads (``hass.config_entries.async_get_entry`` is loop-affine). + """ + if self.device_type not in self._ANTI_CREASE_DEVICE_TYPES: + return ordered_powers + opts = options if options is not None else self._entry_options() + if not opts.get(CONF_ANTI_WRINKLE_ENABLED, DEFAULT_ANTI_WRINKLE_ENABLED): + return ordered_powers + try: + max_power = float(opts.get(CONF_ANTI_WRINKLE_MAX_POWER, DEFAULT_ANTI_WRINKLE_MAX_POWER)) + except (TypeError, ValueError): + max_power = DEFAULT_ANTI_WRINKLE_MAX_POWER + if max_power <= 0 or ordered_powers.size == 0: + return ordered_powers + above = np.flatnonzero(ordered_powers >= max_power) + if above.size == 0: + return ordered_powers # no main high-power phase -> nothing to strip + return ordered_powers[: int(above[-1]) + 1] + + def _is_anti_crease_enabled(self, options: dict[str, Any] | None = None) -> bool: + """True when anti-crease mode is active on an eligible device type.""" + if self.device_type not in self._ANTI_CREASE_DEVICE_TYPES: + return False + opts = options if options is not None else self._entry_options() + return bool(opts.get(CONF_ANTI_WRINKLE_ENABLED, DEFAULT_ANTI_WRINKLE_ENABLED)) + + def _strip_anti_crease_readings( + self, + readings: list[tuple[float, float]], + options: dict[str, Any] | None = None, + ) -> list[tuple[float, float]]: + """Time-domain equivalent of _strip_anti_crease_tail for (offset, power) pairs. + + Returns the readings list trimmed to the last sample >= anti_wrinkle_max_power + so that pause-duration and min-power statistics ignore the anti-crease tail + (#343 gap B/C). No-op when anti-crease is off, the device type is ineligible, + or no sample reaches the ceiling. + + Pass ``options`` when calling from a loop to avoid repeated config-entry + reads (``hass.config_entries.async_get_entry`` is loop-affine). + """ + if not readings: + return readings + opts = options if options is not None else self._entry_options() + if not self._is_anti_crease_enabled(opts): + return readings + try: + max_power = float(opts.get(CONF_ANTI_WRINKLE_MAX_POWER, DEFAULT_ANTI_WRINKLE_MAX_POWER)) + except (TypeError, ValueError): + max_power = DEFAULT_ANTI_WRINKLE_MAX_POWER + if max_power <= 0: + return readings + last_above = -1 + for i, (_, p) in enumerate(readings): + if p >= max_power: + last_above = i + if last_above < 0: + return readings # no main high-power phase identifiable + return readings[: last_above + 1] + def run_simulation(self, cycle_data: dict[str, Any]) -> dict[str, Any]: """Replay a single cycle with varied parameters to find optimal settings. @@ -1235,7 +1624,10 @@ class SuggestionEngine: return {} powers = np.array([p[1] for p in readings]) - active_powers = powers[powers > 0.5] + # Exclude the anti-crease tail so its near-zero baseline does not poison the + # stop/start thresholds on anti-crease devices (#343). No-op otherwise. + main_powers = self._strip_anti_crease_tail(powers) + active_powers = main_powers[main_powers > 0.5] if len(active_powers) < 5: return {} @@ -1245,9 +1637,11 @@ class SuggestionEngine: suggested_stop = round(min_active * 0.8, 2) suggested_start = round(min_active * 1.2, 2) - # Energy suggestions - suggested_end_energy = 0.05 - + # end_energy_threshold is intentionally NOT suggested from a single cycle: + # a context-free 0.05 Wh was below the anti-crease baseline energy accumulated + # over the off_delay window, so the end gate never fired (#343 gap D). The + # batch path (run_batch_simulation) derives a cycle-energy-proportional floor + # from actual false-end events once 5+ cycles exist; use that instead. return { CONF_STOP_THRESHOLD_W: { "value": suggested_stop, @@ -1261,12 +1655,6 @@ class SuggestionEngine: "reason_key": "suggestion.reason.min_active", "reason_params": {"min": f"{min_active:.1f}"}, }, - CONF_END_ENERGY_THRESHOLD: { - "value": suggested_end_energy, - "reason": "Default recommended baseline for end-of-cycle noise gate.", - "reason_key": "suggestion.reason.end_energy_default", - "reason_params": {}, - }, } def run_batch_simulation(self, cycles: list[dict[str, Any]]) -> dict[str, Any]: @@ -1289,7 +1677,11 @@ class SuggestionEngine: """ _BATCH_MIN_CYCLES = 5 - stop_thr = self._current_stop_threshold(self._entry_options()) + _batch_opts = self._entry_options() + stop_thr = self._current_stop_threshold(_batch_opts) + # Keep the unfiltered list: the min_off_gap merge ceiling must see the + # user's real turnaround, which dropping a cycle would fuse away. + raw_cycles = list(cycles) cycles, _excluded = select_clean_cycles(cycles, stop_threshold_w=stop_thr) valid_cycles: list[list[tuple[float, float]]] = [] @@ -1326,7 +1718,13 @@ class SuggestionEngine: false_end_energies: list[float] = [] max_gap_s = _MAX_PAUSE_GAP_H * 3600 for readings in valid_cycles: - powers = np.array([p for _, p in readings]) + # Exclude the post-cycle anti-crease tail before ANY per-cycle statistic + # so its low-power baseline drags neither the p05 min-active threshold nor + # the end-energy / false-end floors below the main cycle (#343). No-op for + # non-anti-crease devices. Trim the (offset, power) readings once so the + # threshold stat and the energy scan consume the same main-cycle data. + main_readings = self._strip_anti_crease_readings(readings, options=_batch_opts) + powers = np.array([p for _, p in main_readings]) active = powers[powers > 0.5] peak = float(np.max(powers)) if powers.size else 0.0 active_thr = max(stop_thr, _CLEAN_ACTIVE_FLOOR_RATIO * peak) @@ -1339,9 +1737,9 @@ class SuggestionEngine: in_pause = False pause_energy = 0.0 stop_w = stop_thr - for i in range(1, len(readings)): - t0, p0 = readings[i - 1] - t1, p1 = readings[i] + for i in range(1, len(main_readings)): + t0, p0 = main_readings[i - 1] + t1, p1 = main_readings[i] dt_s = t1 - t0 # Guard against non-positive or excessively large time gaps if dt_s <= 0 or dt_s > max_gap_s: @@ -1436,7 +1834,9 @@ class SuggestionEngine: "reason_params": reason_end_params, } - min_off_gap = self._suggest_min_off_gap(cycles) + min_off_gap = self._suggest_min_off_gap( + cycles, stop_threshold_w=stop_thr, gap_cycles=raw_cycles + ) if min_off_gap is not None: suggestions[CONF_MIN_OFF_GAP] = min_off_gap @@ -1626,7 +2026,12 @@ class MLSuggestionEngine: end_feat_fn: Any, device_floor: int, ) -> dict[str, Any] | None: - """Off-delay from end-detector-confirmed pauses (P(end) < 0.4).""" + """Off-delay from end-detector-confirmed pauses (P(end) < 0.4). + + Floored by :func:`_measured_off_delay_floor` for the same reason as the + classic twin: a model-verified pause measurement outranks the blind + per-device prior. + """ confirmed: list[float] = [] n_cycles = 0 for c in clean: @@ -1643,20 +2048,21 @@ class MLSuggestionEngine: if n_cycles < 5 or len(confirmed) < 3: return None p95 = float(np.percentile(confirmed, 95)) - value = int(max(device_floor, round(p95 + 60.0))) + floor = _measured_off_delay_floor(device_floor) + value = int(max(floor, round(p95 + 60.0))) return { "value": value, "reason": ( f"End-detector-confirmed pauses: p95 {p95:.0f}s + 60s buffer, from " f"{len(confirmed)} model-verified pauses across {n_cycles} cycles " - f"(floor {device_floor}s)." + f"(floor {floor}s)." ), "reason_key": "suggestion.reason.ml_off_delay", "reason_params": { "p95": f"{p95:.0f}", "pauses": len(confirmed), "cycles": n_cycles, - "floor": device_floor, + "floor": floor, }, } diff --git a/custom_components/ha_washdata/translations/bg.json b/custom_components/ha_washdata/translations/bg.json index 9ae8e714..e2ecc145 100644 --- a/custom_components/ha_washdata/translations/bg.json +++ b/custom_components/ha_washdata/translations/bg.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Настройка на WashData", - "description": "Конфигурирайте вашата пералня или друг уред.\n\nНеобходим е сензор за мощност.\n\n**След това ще бъдете попитани дали искате да създадете своя първи профил.**", + "description": "Конфигурирайте вашата пералня или друг уред.\n\nНеобходим е сензор за мощност.\n\nСлед настройката отворете панела на WashData от страничната лента (или отидете на [/ha-washdata](/ha-washdata)), за да преглеждате цикли, да настроите откриването и да управлявате профили.", "data": { "name": "Име на устройството", "device_type": "Тип устройство", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Обновяване на името на устройството, типа на уреда, или сензор за мощност.", + "description": "Обновете името на устройството, типа на уреда или сензора за мощност.\n\nПанелът на WashData (странична лента или [/ha-washdata](/ha-washdata)) е мястото, където се управляват откривате, циклите, профилите и известията.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Всички настройки - откриване, съвпадение, време, уведомления, профили и цикли - са налични в панела на WashData. Използвайте този формуляр само за промяна на датчика за мощност, типа устройство или прага на готовност.", + "description": "Преименувайте устройството или променете основните му хардуерни настройки. Всички настройки за откриване, съвпадение и известия са в [панела на WashData](/ha-washdata) (достъпен и от страничната лента).", "data": { "name": "Име на устройството", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: таймер за {minutes} мин", "timer_pause_action_title": "Възобновяване на цикъла", "timer_pause_body_suffix": "Цикълът е на пауза. Отворете панела на WashData, за да го възобновите.", + "unload_dismiss_action_title": "Спри напомнянията", "notify_live_waiting_message": "{device}: Все още няма съвпадащ профил.", "vs_typical_longer": "{pct}% по-дълго от обичайното", "vs_typical_shorter": "{pct}% по-кратко от обичайното", diff --git a/custom_components/ha_washdata/translations/bs.json b/custom_components/ha_washdata/translations/bs.json index 7cbe206a..52c1a06f 100644 --- a/custom_components/ha_washdata/translations/bs.json +++ b/custom_components/ha_washdata/translations/bs.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData Setup", - "description": "Konfigurišite svoju mašinu za pranje veša ili drugi uređaj.\n\nPotreban je senzor snage.\n\n**Slijedeće ćete biti upitani da li želite da kreirate svoj prvi profil.**", + "description": "Konfigurišite svoju mašinu za pranje veša ili drugi uređaj.\n\nSenzor snage je obavezan.\n\nNakon postavljanja otvorite WashData panel s bočne trake (ili idite na [/ha-washdata](/ha-washdata)) za pregled ciklusa, podešavanje otkrivanja i upravljanje profilima.", "data": { "name": "Naziv uređaja", "device_type": "Tip uređaja", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Ažurirajte naziv uređaja, tip uređaja ili senzor snage.\n\nWashData panel (bočna traka ili [/ha-washdata](/ha-washdata)) služi za upravljanje otkrivanjem, ciklusima, profilima i obavještenjima.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Preimenujte uređaj ili promijenite njegove osnovne postavke hardvera. Sve postavke otkrivanja, podudaranja i obavještavanja nalaze se na [WashData panelu](/ha-washdata) (dostupan i s bočne trake).", "data": { "name": "Naziv uređaja", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: tajmer od {minutes} min", "timer_pause_action_title": "Nastavi ciklus", "timer_pause_body_suffix": "Ciklus je pauziran. Otvorite WashData panel da biste nastavili.", + "unload_dismiss_action_title": "Prestani podsjećati", "notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.", "vs_typical_longer": "{pct}% duže nego obično", "vs_typical_shorter": "{pct}% kraće nego obično", diff --git a/custom_components/ha_washdata/translations/cs.json b/custom_components/ha_washdata/translations/cs.json index 2b95db06..1641adba 100644 --- a/custom_components/ha_washdata/translations/cs.json +++ b/custom_components/ha_washdata/translations/cs.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Nastavení WashData", - "description": "Nakonfigurujte si pračku nebo jiný spotřebič.\n\nJe vyžadován snímač napájení.\n\n**Dále budete dotázáni, zda chcete vytvořit svůj první profil.**", + "description": "Nakonfigurujte si pračku nebo jiný spotřebič.\n\nSenzor výkonu je vyžadován.\n\nPo nastavení otevřete panel WashData z postranního panelu (nebo přejděte na [/ha-washdata](/ha-washdata)) pro zobrazení cyklů, ladění detekce a správu profilů.", "data": { "name": "Název zařízení", "device_type": "Typ zařízení", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Aktualizujte název zařízení, typ spotřebiče nebo senzor výkonu.\n\nPanel WashData (postranní panel nebo [/ha-washdata](/ha-washdata)) slouží ke správě detekce, cyklů, profilů a oznámení.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Přejmenujte zařízení nebo změňte jeho základní hardwarová nastavení. Veškerá nastavení detekce, porovnávání a oznámení jsou na [panelu WashData](/ha-washdata) (dostupný také z postranního panelu).", "data": { "name": "Název zařízení", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min časovač", "timer_pause_action_title": "Obnovit cyklus", "timer_pause_body_suffix": "Cyklus je pozastaven. Pro pokračování otevřete panel WashData.", + "unload_dismiss_action_title": "Přestat připomínat", "notify_live_waiting_message": "{device}: Zatím nebyl rozpoznán žádný profil.", "vs_typical_longer": "o {pct}% déle než obvykle", "vs_typical_shorter": "o {pct}% kratší než obvykle", diff --git a/custom_components/ha_washdata/translations/da.json b/custom_components/ha_washdata/translations/da.json index bd4edcbb..9af90fcb 100644 --- a/custom_components/ha_washdata/translations/da.json +++ b/custom_components/ha_washdata/translations/da.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData opsætning", - "description": "Konfigurer din vaskemaskine eller andet apparat.\n\nStrømsensor er påkrævet.\n\n**Derefter bliver du spurgt, om du vil oprette din første profil.**", + "description": "Konfigurer din vaskemaskine eller andet apparat.\n\nStrømsensor er påkrævet.\n\nEfter opsætning skal du åbne WashData-panelet fra sidebjælken (eller gå til [/ha-washdata](/ha-washdata)) for at se cyklusser, justere registrering og administrere profiler.", "data": { "name": "Enhedens navn", "device_type": "Enhedstype", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Opdater enhedsnavnet, apparattypen eller strømsensoren.\n\nWashData-panelet (sidebjælken eller [/ha-washdata](/ha-washdata)) er, hvor registrering, cyklusser, profiler og notifikationer administreres.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Omdøb enheden eller skift dens grundlæggende hardwareindstillinger. Alle indstillinger for registrering, matching og notifikationer findes i [WashData-panelet](/ha-washdata) (også tilgængeligt fra sidebjælken).", "data": { "name": "Enhedsnavn", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min timer", "timer_pause_action_title": "Genoptag cyklus", "timer_pause_body_suffix": "Cyklussen er sat på pause. Åbn WashData-panelet for at genoptage.", + "unload_dismiss_action_title": "Stop påmindelser", "notify_live_waiting_message": "{device}: Ingen profil genkendt endnu.", "vs_typical_longer": "{pct}% længere end normalt", "vs_typical_shorter": "{pct}% kortere end normalt", diff --git a/custom_components/ha_washdata/translations/de.json b/custom_components/ha_washdata/translations/de.json index 7495121f..bbe328cf 100644 --- a/custom_components/ha_washdata/translations/de.json +++ b/custom_components/ha_washdata/translations/de.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData-Setup", - "description": "Konfigurieren Sie Ihre Waschmaschine oder ein anderes Gerät.\n\nLeistungssensor ist erforderlich.\n\n**Als nächstes werden Sie gefragt, ob Sie Ihr erstes Profil erstellen möchten.**", + "description": "Konfigurieren Sie Ihre Waschmaschine oder ein anderes Gerät.\n\nLeistungssensor ist erforderlich.\n\nNach der Einrichtung öffnen Sie das WashData-Panel über die Seitenleiste (oder gehen Sie zu [/ha-washdata](/ha-washdata)), um Zyklen anzuzeigen, die Erkennung anzupassen und Profile zu verwalten.", "data": { "name": "Gerätename", "device_type": "Gerätetyp", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Aktualisieren Sie den Gerätenamen, den Gerätetyp oder den Leistungssensor.\n\nDas WashData-Panel (Seitenleiste oder [/ha-washdata](/ha-washdata)) ist der Ort, an dem Erkennung, Zyklen, Profile und Benachrichtigungen verwaltet werden.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Benennen Sie das Gerät um oder ändern Sie seine grundlegenden Hardware-Einstellungen. Alle Erkennungs-, Abgleich- und Benachrichtigungseinstellungen befinden sich im [WashData-Panel](/ha-washdata) (auch über die Seitenleiste erreichbar).", "data": { "name": "Name des Geräts", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes}-Min.-Timer", "timer_pause_action_title": "Zyklus fortsetzen", "timer_pause_body_suffix": "Der Zyklus ist angehalten. Öffnen Sie das WashData-Panel, um fortzufahren.", + "unload_dismiss_action_title": "Nicht mehr erinnern", "notify_live_waiting_message": "{device}: Noch kein Profil erkannt.", "vs_typical_longer": "{pct}% länger als üblich", "vs_typical_shorter": "{pct}% kürzer als üblich", diff --git a/custom_components/ha_washdata/translations/el.json b/custom_components/ha_washdata/translations/el.json index 9907a506..cd590fb6 100644 --- a/custom_components/ha_washdata/translations/el.json +++ b/custom_components/ha_washdata/translations/el.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Ρύθμιση WashData", - "description": "Διαμορφώστε το πλυντήριο ή άλλη συσκευή σας.\n\nΑπαιτείται αισθητήρας ισχύος.\n\n**Στη συνέχεια, θα ερωτηθείτε αν θέλετε να δημιουργήσετε το πρώτο σας προφίλ.**", + "description": "Ρυθμίστε το πλυντήριο ρούχων ή άλλη συσκευή σας.\n\nΑπαιτείται αισθητήρας ισχύος.\n\nΜετά τη ρύθμιση, ανοίξτε τον πίνακα WashData από την πλευρική γραμμή (ή μεταβείτε στο [/ha-washdata](/ha-washdata)) για να δείτε κύκλους, να ρυθμίσετε την ανίχνευση και να διαχειριστείτε προφίλ.", "data": { "name": "Όνομα συσκευής", "device_type": "Τύπος συσκευής", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Ενημέρωση του ονόματος της συσκευής, του τύπου συσκευής ή του αισθητήρα ισχύος.", + "description": "Ενημερώστε το όνομα της συσκευής, τον τύπο συσκευής ή τον αισθητήρα ισχύος.\n\nΟ πίνακας WashData (πλευρική γραμμή ή [/ha-washdata](/ha-washdata)) είναι το μέρος όπου διαχειρίζεται η ανίχνευση, οι κύκλοι, τα προφίλ και οι ειδοποιήσεις.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Όλες οι ρυθμίσεις -- ανίχνευση, ταίριασμα, συγχρονισμός, ειδοποιήσεις, προφίλ και κύκλοι -- είναι διαθέσιμες στον πίνακα WashData. Χρησιμοποιήστε αυτή τη φόρμα μόνο για να αλλάξετε τον αισθητήρα ισχύος, τον τύπο της συσκευής, ή το κατώφλι αναμονής.", + "description": "Μετονομάστε τη συσκευή ή αλλάξτε τις βασικές ρυθμίσεις υλικού. Όλες οι ρυθμίσεις ανίχνευσης, αντιστοίχισης και ειδοποιήσεων βρίσκονται στον [πίνακα WashData](/ha-washdata) (επίσης προσβάσιμος από την πλευρική γραμμή).", "data": { "name": "Όνομα συσκευής", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: χρονόμετρο {minutes} λεπτών", "timer_pause_action_title": "Συνέχιση κύκλου", "timer_pause_body_suffix": "Ο κύκλος είναι σε παύση. Ανοίξτε τον πίνακα WashData για να συνεχίσετε.", + "unload_dismiss_action_title": "Διακοπή υπενθυμίσεων", "notify_live_waiting_message": "{device}: Δεν έχει αναγνωριστεί ακόμη κανένα προφίλ.", "vs_typical_longer": "{pct}% περισσότερο από το συνηθισμένο", "vs_typical_shorter": "{pct}% λιγότερο από το συνηθισμένο", diff --git a/custom_components/ha_washdata/translations/en.json b/custom_components/ha_washdata/translations/en.json index ed07247f..3e056ae6 100644 --- a/custom_components/ha_washdata/translations/en.json +++ b/custom_components/ha_washdata/translations/en.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData Setup", - "description": "Configure your washing machine or other appliance.\n\nPower sensor is required.", + "description": "Configure your washing machine or other appliance.\n\nPower sensor is required.\n\nAfter setup, open the WashData panel from the sidebar (or go to [/ha-washdata](/ha-washdata)) to view cycles, tune detection and manage profiles.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Update the device name, appliance type, or power sensor.\n\nThe WashData panel (sidebar, or [/ha-washdata](/ha-washdata)) is where detection, cycles, profiles and notifications are managed.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the WashData panel.", + "description": "Rename the device or change its core hardware settings. All detection, matching and notification settings are in the [WashData panel](/ha-washdata) (also reachable from the sidebar).", "data": { "name": "Device Name", "device_type": "Device Type", @@ -57,6 +57,7 @@ "timer_default_message": "{device}: {minutes} min timer", "timer_pause_action_title": "Resume Cycle", "timer_pause_body_suffix": "The cycle is paused. Open the WashData panel to resume.", + "unload_dismiss_action_title": "Stop reminding", "vs_typical_longer": "{pct}% longer than usual", "vs_typical_shorter": "{pct}% shorter than usual", "notify_live_waiting_message": "{device}: No profile matched yet." diff --git a/custom_components/ha_washdata/translations/es.json b/custom_components/ha_washdata/translations/es.json index 81d7276f..58d1eede 100644 --- a/custom_components/ha_washdata/translations/es.json +++ b/custom_components/ha_washdata/translations/es.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Configuración de WashData", - "description": "Configura tu lavadora u otro electrodoméstico.\n\nSe requiere un sensor de potencia.\n\n**A continuación, se te preguntará si deseas crear tu primer perfil.**", + "description": "Configura tu lavadora u otro electrodoméstico.\n\nSe requiere un sensor de potencia.\n\nTras la configuración, abre el panel de WashData desde la barra lateral (o ve a [/ha-washdata](/ha-washdata)) para ver los ciclos, ajustar la detección y gestionar los perfiles.", "data": { "name": "Nombre del dispositivo", "device_type": "Tipo de dispositivo", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigurar WashData", - "description": "Actualiza el nombre del dispositivo, el tipo de electrodoméstico o el sensor de potencia.", + "description": "Actualiza el nombre del dispositivo, el tipo de electrodoméstico o el sensor de potencia.\n\nEl panel de WashData (barra lateral, o [/ha-washdata](/ha-washdata)) es donde se gestionan la detección, los ciclos, los perfiles y las notificaciones.", "data": { "name": "Nombre del dispositivo", "device_type": "Tipo de dispositivo", @@ -43,7 +43,7 @@ "step": { "init": { "title": "Ajustes de WashData", - "description": "Todos los ajustes — detección, coincidencia, temporización, notificaciones, perfiles y ciclos — están disponibles en el panel de WashData. Usa este formulario solo para cambiar el sensor de potencia, el tipo de dispositivo o el umbral en espera.", + "description": "Cambia el nombre del dispositivo o su configuración de hardware principal. Todos los ajustes de detección, coincidencia y notificaciones están en el [panel de WashData](/ha-washdata) (también accesible desde la barra lateral).", "data": { "name": "Nombre del dispositivo", "device_type": "Tipo de dispositivo", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: temporizador de {minutes} min", "timer_pause_action_title": "Reanudar ciclo", "timer_pause_body_suffix": "El ciclo está en pausa. Abre el panel de WashData para reanudarlo.", + "unload_dismiss_action_title": "Dejar de recordar", "notify_live_waiting_message": "{device}: todavía no se ha reconocido ningún perfil.", "vs_typical_longer": "{pct}% más largo de lo habitual", "vs_typical_shorter": "{pct}% más corto de lo habitual", diff --git a/custom_components/ha_washdata/translations/et.json b/custom_components/ha_washdata/translations/et.json index cf8f48a7..63b75fcf 100644 --- a/custom_components/ha_washdata/translations/et.json +++ b/custom_components/ha_washdata/translations/et.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData häälestus", - "description": "Seadistage oma pesumasin või muu seade.\n\nVajalik on võimsusandur.\n\n**Järgmisena küsitakse teilt, kas soovite luua oma esimese profiili.**", + "description": "Seadistage oma pesumasin või muu seade.\n\nVajalik on võimsusandur.\n\nPärast seadistamist avage WashData paneel külgribalt (või minge [/ha-washdata](/ha-washdata)), et vaadata tsükleid, häälestada tuvastust ja hallata profiile.", "data": { "name": "Seadme nimi", "device_type": "Seadme tüüp", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "WashData uuesti seadistamine", - "description": "Uuendage seadme nime, seadmetüüpi või võimsusandurit.", + "description": "Uuendage seadme nime, seadmetüüpi või võimsusandurit.\n\nWashData paneelis (külgriba või [/ha-washdata](/ha-washdata)) hallatakse tuvastust, tsükleid, profiile ja teavitusi.", "data": { "name": "Seadme nimi", "device_type": "Seadme tüüp", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData seadistused", - "description": "Kõik seadistused — tuvastamine, sobitamine, ajastamine, teated, profiilid ja tsüklid — on saadaval WashData paneelil. Kasutage seda vormi ainult võimsusanduri, seadmetüübi või ooterežiimi läve muutmiseks.", + "description": "Nimetage seade ümber või muutke selle põhilisi riistvara seadeid. Kõik tuvastus-, sobitamis- ja teavitusseaded asuvad [WashData paneelil](/ha-washdata) (ligipääsetav ka külgribalt).", "data": { "name": "Seadme nimi", "device_type": "Seadme tüüp", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min taimer", "timer_pause_action_title": "Tsükli jätkamine", "timer_pause_body_suffix": "Tsükkel on peatatud. Jätkamiseks avage WashData paneel.", + "unload_dismiss_action_title": "Lõpeta meeldetuletused", "notify_live_waiting_message": "{device}: Ühtki profiili pole veel tuvastatud.", "vs_typical_longer": "{pct}% tavapärasest pikem", "vs_typical_shorter": "{pct}% tavapärasest lühem", diff --git a/custom_components/ha_washdata/translations/fi.json b/custom_components/ha_washdata/translations/fi.json index dd1dc44c..5465215a 100644 --- a/custom_components/ha_washdata/translations/fi.json +++ b/custom_components/ha_washdata/translations/fi.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData-asetukset", - "description": "Määritä pesukoneesi tai muu laite.\n\nTehoanturi tarvitaan.\n\n**Seuraavaksi sinulta kysytään, haluatko luoda ensimmäisen profiilisi.**", + "description": "Määritä pesukoneesi tai muu laite.\n\nTehoanturi tarvitaan.\n\nAsetuksen jälkeen avaa WashData-paneeli sivupalkista (tai siirry osoitteeseen [/ha-washdata](/ha-washdata)) nähdäksesi syklit, säätääksesi tunnistuksen ja hallitaksesi profiileja.", "data": { "name": "Laitteen nimi", "device_type": "Laitteen tyyppi", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Konfiguroi WashData uudelleen", - "description": "Päivitä laitteen nimi, laitteen tyyppi tai tehoanturi.", + "description": "Päivitä laitteen nimi, laitteen tyyppi tai tehoanturi.\n\nWashData-paneelissa (sivupalkki tai [/ha-washdata](/ha-washdata)) hallitaan tunnistusta, syklejä, profiileja ja ilmoituksia.", "data": { "name": "Laitteen nimi", "device_type": "Laitteen tyyppi", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData-asetukset", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Nimeä laite uudelleen tai muuta sen ydinlaitteiston asetuksia. Kaikki tunnistus-, täsmäytys- ja ilmoitusasetukset ovat [WashData-paneelissa](/ha-washdata) (saavutettavissa myös sivupalkista).", "data": { "name": "Laitteen nimi", "device_type": "Laitteen tyyppi", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min ajastin", "timer_pause_action_title": "Jatka sykliä", "timer_pause_body_suffix": "Sykli on keskeytetty. Avaa WashData-paneeli jatkaaksesi.", + "unload_dismiss_action_title": "Lopeta muistuttaminen", "notify_live_waiting_message": "{device}: Yhtään profiilia ei ole vielä tunnistettu.", "vs_typical_longer": "{pct}% tavallista pidempi", "vs_typical_shorter": "{pct}% tavallista lyhyempi", diff --git a/custom_components/ha_washdata/translations/fr.json b/custom_components/ha_washdata/translations/fr.json index c812535c..07347a15 100644 --- a/custom_components/ha_washdata/translations/fr.json +++ b/custom_components/ha_washdata/translations/fr.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Configuration des données de lavage", - "description": "Configurez votre lave-linge ou autre appareil.\n\nUn capteur de puissance est requis.\n\n**Ensuite, il vous sera demandé si vous souhaitez créer votre premier profil.**", + "description": "Configurez votre lave-linge ou autre appareil.\n\nUn capteur de puissance est requis.\n\nUne fois la configuration terminée, ouvrez le panneau WashData depuis la barre latérale (ou accédez à [/ha-washdata](/ha-washdata)) pour consulter les cycles, affiner la détection et gérer les profils.", "data": { "name": "Nom de l'appareil", "device_type": "Type d'appareil", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigurer WashData", - "description": "Mettez à jour le nom de l'appareil, le type d'appareil ou le capteur de puissance.", + "description": "Mettez à jour le nom de l'appareil, le type d'appareil ou le capteur de puissance.\n\nLe panneau WashData (barre latérale ou [/ha-washdata](/ha-washdata)) permet de gérer la détection, les cycles, les profils et les notifications.", "data": { "name": "Nom de l'appareil", "device_type": "Type d'appareil", @@ -43,7 +43,7 @@ "step": { "init": { "title": "Paramètres WashData", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Renommez l'appareil ou modifiez ses paramètres matériels de base. Tous les paramètres de détection, de correspondance et de notification se trouvent dans le [panneau WashData](/ha-washdata) (également accessible depuis la barre latérale).", "data": { "name": "Nom du périphérique", "device_type": "Type d'appareil", @@ -56,6 +56,7 @@ "timer_default_message": "{device} : minuterie de {minutes} min", "timer_pause_action_title": "Reprendre le cycle", "timer_pause_body_suffix": "Le cycle est en pause. Ouvrez le panneau WashData pour reprendre.", + "unload_dismiss_action_title": "Arrêter les rappels", "notify_live_waiting_message": "{device} : aucun profil reconnu pour le moment.", "vs_typical_longer": "{pct}% plus long que d'habitude", "vs_typical_shorter": "{pct}% plus court que d'habitude", diff --git a/custom_components/ha_washdata/translations/hr.json b/custom_components/ha_washdata/translations/hr.json index 91f3855a..5234bed5 100644 --- a/custom_components/ha_washdata/translations/hr.json +++ b/custom_components/ha_washdata/translations/hr.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Postavljanje WashData", - "description": "Konfigurirajte svoju perilicu rublja ili neki drugi uređaj.\n\nPotreban je senzor snage.\n\n**Potom ćete biti upitani želite li izraditi svoj prvi profil.**", + "description": "Konfigurirajte svoju perilicu rublja ili neki drugi uređaj.\n\nSenzor snage je obavezan.\n\nNakon postavljanja otvorite WashData panel s bočne trake (ili idite na [/ha-washdata](/ha-washdata)) za pregled ciklusa, podešavanje otkrivanja i upravljanje profilima.", "data": { "name": "Naziv uređaja", "device_type": "Vrsta uređaja", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Ažurirajte naziv uređaja, vrstu uređaja ili senzor snage.\n\nWashData panel (bočna traka ili [/ha-washdata](/ha-washdata)) služi za upravljanje otkrivanjem, ciklusima, profilima i obavijestima.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Preimenujte uređaj ili promijenite njegove osnovne postavke hardvera. Sve postavke otkrivanja, podudaranja i obavijesti nalaze se na [WashData panelu](/ha-washdata) (dostupan i s bočne trake).", "data": { "name": "Naziv uređaja", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min tajmer", "timer_pause_action_title": "Nastavi ciklus", "timer_pause_body_suffix": "Ciklus je pauziran. Otvorite WashData panel za nastavak.", + "unload_dismiss_action_title": "Prestani podsjećati", "notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.", "vs_typical_longer": "{pct}% dulje nego obično", "vs_typical_shorter": "{pct}% kraće nego obično", diff --git a/custom_components/ha_washdata/translations/hu.json b/custom_components/ha_washdata/translations/hu.json index c956bb8d..6e12a236 100644 --- a/custom_components/ha_washdata/translations/hu.json +++ b/custom_components/ha_washdata/translations/hu.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData beállítása", - "description": "Állítsa be a mosógépet vagy más készüléket.\n\nTeljesítményérzékelő szükséges.\n\n**Ezután a rendszer megkérdezi, hogy szeretné-e létrehozni első profilját.**", + "description": "Állítsa be a mosógépet vagy más készüléket.\n\nTeljesítményérzékelő szükséges.\n\nA beállítás után nyissa meg a WashData panelt az oldalsávból (vagy lépjen ide: [/ha-washdata](/ha-washdata)), ahol megtekintheti a ciklusokat, finomhangolhatja a felismerést és kezelheti a profilokat.", "data": { "name": "Eszköz neve", "device_type": "Eszköz típusa", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Frissítse az eszköz nevét, a készülék típusát vagy a teljesítményérzékelőt.\n\nA WashData panel (oldalsáv vagy [/ha-washdata](/ha-washdata)) a felismerés, ciklusok, profilok és értesítések kezelésére szolgál.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Nevezze át az eszközt, vagy módosítsa az alap hardverbeállításait. Az összes felismerési, egyeztetési és értesítési beállítás a [WashData panelen](/ha-washdata) található (az oldalsávból is elérhető).", "data": { "name": "Eszköz neve", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} perces időzítő", "timer_pause_action_title": "Ciklus folytatása", "timer_pause_body_suffix": "A ciklus szünetel. A folytatáshoz nyissa meg a WashData-panelt.", + "unload_dismiss_action_title": "Emlékeztetés leállítása", "notify_live_waiting_message": "{device}: Még nincs illeszkedő profil.", "vs_typical_longer": "{pct}%-kal hosszabb a szokásosnál", "vs_typical_shorter": "{pct}%-kal rövidebb a szokásosnál", diff --git a/custom_components/ha_washdata/translations/is.json b/custom_components/ha_washdata/translations/is.json index 6bf00142..0fb6fca7 100644 --- a/custom_components/ha_washdata/translations/is.json +++ b/custom_components/ha_washdata/translations/is.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData uppsetning", - "description": "Stilltu þvottavélina þína eða annað tæki.\n\nKraftur skynjari er nauðsynlegur.\n\n**Þá verður þú spurður hvort þú viljir búa til fyrsta prófílinn þinn.**", + "description": "Stilltu þvottavélina þína eða annað tæki.\n\nKraftskynjari er nauðsynlegur.\n\nEftir uppsetningu skaltu opna WashData-spjaldið frá hliðarstikunni (eða fara á [/ha-washdata](/ha-washdata)) til að skoða hringrás, stilla skynjun og stjórna sniðum.", "data": { "name": "Nafn tækis", "device_type": "Tegund tækis", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Uppfærðu heiti tækisins, tegund tækis eða kraftskynjara.\n\nWashData-spjaldið (hliðarstikan eða [/ha-washdata](/ha-washdata)) er þar sem skynjun, hringrás, sniðmát og tilkynningar eru stjórnað.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Endurnefndu tækið eða breyttu grunnstillingum vélbúnaðar. Allar stillingar fyrir skynjun, samsvörun og tilkynningar eru í [WashData-spjaldinu](/ha-washdata) (einnig aðgengilegt frá hliðarstikunni).", "data": { "name": "Nafn tækis", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} mín tímataki", "timer_pause_action_title": "Halda áfram hringrás", "timer_pause_body_suffix": "Hringrásin er í bið. Opnaðu WashData-gluggann til að halda áfram.", + "unload_dismiss_action_title": "Hætta að minna", "notify_live_waiting_message": "{device}: Ekkert snið hefur enn verið greint.", "vs_typical_longer": "{pct}% lengri en venjulega", "vs_typical_shorter": "{pct}% styttri en venjulega", diff --git a/custom_components/ha_washdata/translations/it.json b/custom_components/ha_washdata/translations/it.json index 352ee5d6..fa2a3b1f 100644 --- a/custom_components/ha_washdata/translations/it.json +++ b/custom_components/ha_washdata/translations/it.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Configurazione WashData", - "description": "Configura la tua lavatrice o altro elettrodomestico.\n\nÈ richiesto il sensore di potenza.\n\n**Successivamente ti verrà chiesto se desideri creare il tuo primo profilo.**", + "description": "Configura la tua lavatrice o altro elettrodomestico.\n\nÈ richiesto il sensore di potenza.\n\nDopo la configurazione, apri il pannello WashData dalla barra laterale (o vai su [/ha-washdata](/ha-washdata)) per visualizzare i cicli, regolare il rilevamento e gestire i profili.", "data": { "name": "Nome dispositivo", "device_type": "Tipo di dispositivo", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Aggiorna il nome del dispositivo, il tipo di elettrodomestico o il sensore di potenza.\n\nIl pannello WashData (barra laterale, o [/ha-washdata](/ha-washdata)) è dove vengono gestiti rilevamento, cicli, profili e notifiche.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Rinomina il dispositivo o modifica le sue impostazioni hardware principali. Tutte le impostazioni di rilevamento, corrispondenza e notifica si trovano nel [pannello WashData](/ha-washdata) (accessibile anche dalla barra laterale).", "data": { "name": "Nome del dispositivo", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: timer di {minutes} min", "timer_pause_action_title": "Riprendi ciclo", "timer_pause_body_suffix": "Il ciclo è in pausa. Apri il pannello WashData per riprendere.", + "unload_dismiss_action_title": "Interrompi promemoria", "notify_live_waiting_message": "{device}: nessun profilo ancora riconosciuto.", "vs_typical_longer": "{pct}% più lungo del solito", "vs_typical_shorter": "{pct}% più corto del solito", diff --git a/custom_components/ha_washdata/translations/ja.json b/custom_components/ha_washdata/translations/ja.json index bc827600..2d0226a1 100644 --- a/custom_components/ha_washdata/translations/ja.json +++ b/custom_components/ha_washdata/translations/ja.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData セットアップ", - "description": "洗濯機またはその他の家電製品を設定します。\n\n電力センサーが必要です。\n\n**次に、最初のプロファイルを作成するかどうか確認されます。**", + "description": "洗濯機またはその他の家電製品を設定します。\n\n電力センサーが必要です。\n\nセットアップ後、サイドバーの WashData パネルを開くか(または [/ha-washdata](/ha-washdata) にアクセスして)、サイクルの確認、検出の調整、プロファイルの管理を行ってください。", "data": { "name": "デバイス名", "device_type": "デバイスの種類", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "デバイス名、アプライアンスのタイプ、または電力センサーを更新します。", + "description": "デバイス名、家電の種類、または電力センサーを更新します。\n\nWashData パネル(サイドバー、または [/ha-washdata](/ha-washdata))で、検出、サイクル、プロファイル、通知を管理できます。", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "すべての設定 (検出、マッチング、タイミング、通知、プロファイル、サイクル) は、WashData パネルで利用できます。このフォームは、パワー センサー、デバイス タイプ、またはスタンバイしきい値を変更する場合にのみ使用してください。", + "description": "デバイス名を変更するか、主要なハードウェア設定を変更します。すべての検出・照合・通知の設定は [WashData パネル](/ha-washdata) で確認できます(サイドバーからもアクセス可能)。", "data": { "name": "デバイス名", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} 分タイマー", "timer_pause_action_title": "サイクルを再開する", "timer_pause_body_suffix": "サイクルが一時停止中です。再開するには WashData パネルを開いてください。", + "unload_dismiss_action_title": "リマインダーを停止", "notify_live_waiting_message": "{device}: まだ一致するプロファイルがありません。", "vs_typical_longer": "通常より {pct}% 長い", "vs_typical_shorter": "通常より {pct}% 短い", diff --git a/custom_components/ha_washdata/translations/ko.json b/custom_components/ha_washdata/translations/ko.json index 8f50c53e..0983e2d0 100644 --- a/custom_components/ha_washdata/translations/ko.json +++ b/custom_components/ha_washdata/translations/ko.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData 설정", - "description": "세탁기 또는 기타 가전제품을 구성하세요.\n\n전력 센서가 필요합니다.\n\n**다음으로 첫 번째 프로필을 만들지 여부를 묻는 메시지가 표시됩니다.**", + "description": "세탁기 또는 기타 가전제품을 구성하세요.\n\n전력 센서가 필요합니다.\n\n설정 후, 사이드바에서 WashData 패널을 열거나 [/ha-washdata](/ha-washdata)로 이동하여 사이클 확인, 검출 조정 및 프로파일 관리를 하세요.", "data": { "name": "장치 이름", "device_type": "장치 유형", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "장치 이름, 기기 유형 또는 전원 센서를 업데이트합니다.", + "description": "장치 이름, 가전 유형 또는 전력 센서를 업데이트합니다.\n\nWashData 패널(사이드바 또는 [/ha-washdata](/ha-washdata))에서 검출, 사이클, 프로파일 및 알림을 관리합니다.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "감지, 매칭, 타이밍, 알림, 프로필, 주기 등 모든 설정을 WashData 패널에서 사용할 수 있습니다. 전원 센서, 장치 유형 또는 대기 임계값을 변경하는 경우에만 이 양식을 사용하십시오.", + "description": "장치 이름을 변경하거나 핵심 하드웨어 설정을 변경합니다. 모든 검출, 매칭 및 알림 설정은 [WashData 패널](/ha-washdata)에서 확인할 수 있습니다(사이드바에서도 접근 가능).", "data": { "name": "장치 이름", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes}분 타이머", "timer_pause_action_title": "사이클 재개", "timer_pause_body_suffix": "사이클이 일시 정지되었습니다. 재개하려면 WashData 패널을 여세요.", + "unload_dismiss_action_title": "알림 중지", "notify_live_waiting_message": "{device}: 아직 일치하는 프로필이 없습니다.", "vs_typical_longer": "평소보다 {pct}% 더 김", "vs_typical_shorter": "평소보다 {pct}% 더 짧음", diff --git a/custom_components/ha_washdata/translations/lt.json b/custom_components/ha_washdata/translations/lt.json index c3717494..3460c315 100644 --- a/custom_components/ha_washdata/translations/lt.json +++ b/custom_components/ha_washdata/translations/lt.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData sąranka", - "description": "Sukonfigūruokite skalbimo mašiną ar kitą prietaisą.\n\nReikalingas galios jutiklis.\n\n**Toliau jūsų paklaus, ar norite susikurti pirmąjį profilį.**", + "description": "Sukonfigūruokite skalbimo mašiną ar kitą prietaisą.\n\nReikalingas galios jutiklis.\n\nBaigę sąranką, atidarykite WashData skydelį iš šoninės juostos (arba eikite į [/ha-washdata](/ha-washdata)), kad peržiūrėtumėte ciklus, sureguliuotumėte aptikimą ir tvarkytumėte profilius.", "data": { "name": "Įrenginio pavadinimas", "device_type": "Įrenginio tipas", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "WashData rekonfigūracija", - "description": "Atnaujinkite įrenginio pavadinimą, prietaiso tipą arba galios jutiklį.", + "description": "Atnaujinkite įrenginio pavadinimą, prietaiso tipą arba galios jutiklį.\n\nWashData skydelyje (šoninė juosta arba [/ha-washdata](/ha-washdata)) tvarkomas aptikimas, ciklai, profiliai ir pranešimai.", "data": { "name": "Įrenginio pavadinimas", "device_type": "Įrenginio tipas", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData nustatymai", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Pervadinkite įrenginį arba pakeiskite pagrindinius aparatinės įrangos nustatymus. Visi aptikimo, atitikimo ir pranešimų nustatymai yra [WashData skydelyje](/ha-washdata) (taip pat pasiekiami iš šoninės juostos).", "data": { "name": "Įrenginio pavadinimas", "device_type": "Įrenginio tipas", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min. laikmatis", "timer_pause_action_title": "Tęsti ciklą", "timer_pause_body_suffix": "Ciklas pristabdytas. Atidarykite WashData skydelį, kad tęstumėte.", + "unload_dismiss_action_title": "Nustoti priminti", "notify_live_waiting_message": "{device}: Kol kas neatpažintas joks profilis.", "vs_typical_longer": "{pct}% ilgiau nei įprastai", "vs_typical_shorter": "{pct}% trumpiau nei įprastai", diff --git a/custom_components/ha_washdata/translations/lv.json b/custom_components/ha_washdata/translations/lv.json index e9a7b650..c1616ade 100644 --- a/custom_components/ha_washdata/translations/lv.json +++ b/custom_components/ha_washdata/translations/lv.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData iestatīšana", - "description": "Konfigurējiet veļas mašīnu vai citu ierīci.\n\nNepieciešams jaudas sensors.\n\n**Pēc tam jums tiks jautāts, vai vēlaties izveidot savu pirmo profilu.**", + "description": "Konfigurējiet veļas mašīnu vai citu ierīci.\n\nNepieciešams jaudas sensors.\n\nPēc iestatīšanas atveriet WashData paneli no sānjoslas (vai dodieties uz [/ha-washdata](/ha-washdata)), lai skatītu ciklus, pielāgotu noteikšanu un pārvaldītu profilus.", "data": { "name": "Ierīces nosaukums", "device_type": "Ierīces veids", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "WashData pārkonfigurēšana", - "description": "Atjauniniet ierīces nosaukumu, ierīces veidu vai jaudas sensoru.", + "description": "Atjauniniet ierīces nosaukumu, ierīces veidu vai jaudas sensoru.\n\nWashData panelī (sānjosla vai [/ha-washdata](/ha-washdata)) tiek pārvaldīta noteikšana, cikli, profili un paziņojumi.", "data": { "name": "Ierīces nosaukums", "device_type": "Ierīces veids", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData iestatījumi", - "description": "Visi iestatījumi -- noteikšana, saskaņošana, laiks, paziņojumi, profili un cikli -- ir pieejami WashData panelī. Izmantojiet šo veidlapu tikai, lai mainītu jaudas sensoru, ierīces veidu vai gaidstāves slieksni.", + "description": "Pārdēvējiet ierīci vai mainiet tās galvenos aparatūras iestatījumus. Visi noteikšanas, saskaņošanas un paziņojumu iestatījumi atrodas [WashData panelī](/ha-washdata) (pieejams arī no sānjoslas).", "data": { "name": "Ierīces nosaukums", "device_type": "Ierīces veids", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min. taimeris", "timer_pause_action_title": "Atsākt ciklu", "timer_pause_body_suffix": "Cikls ir apturēts. Atveriet WashData paneli, lai atsāktu.", + "unload_dismiss_action_title": "Pārtraukt atgādināšanu", "notify_live_waiting_message": "{device}: Vēl nav atpazīts neviens profils.", "vs_typical_longer": "{pct}% ilgāk nekā parasti", "vs_typical_shorter": "{pct}% īsāk nekā parasti", diff --git a/custom_components/ha_washdata/translations/mk.json b/custom_components/ha_washdata/translations/mk.json index a533d22f..676bffd2 100644 --- a/custom_components/ha_washdata/translations/mk.json +++ b/custom_components/ha_washdata/translations/mk.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Поставување податоци за перење", - "description": "Конфигурирајте ја вашата машина за перење или друг уред.\n\nПотребен е сензор за напојување.\n\n**Следно, ќе бидете прашани дали сакате да го креирате вашиот прв профил.**", + "description": "Конфигурирајте ја вашата машина за перење или друг уред.\n\nПотребен е сензор за напојување.\n\nПо поставувањето, отворете го панелот на WashData од страничната лента (или одете на [/ha-washdata](/ha-washdata)) за преглед на циклусите, подесување на откривањето и управување со профили.", "data": { "name": "Име на уред", "device_type": "Тип на уред", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Реконфигурирај WashData", - "description": "Ажурирајте го името на уредот, типот на апаратот или сензорот за напојување.", + "description": "Ажурирајте го името на уредот, типот на апаратот или сензорот за напојување.\n\nПанелот на WashData (странична лента или [/ha-washdata](/ha-washdata)) е местото каде се управуваат откривањето, циклусите, профилите и известувањата.", "data": { "name": "Име на уред", "device_type": "Тип на уред", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Сите поставки -- откривање, совпаѓање, време, известувања, профили и циклуси -- се достапни во панелот WashData. Користете го овој формулар само за да го промените сензорот за напојување, типот на уредот или прагот на подготвеност.", + "description": "Преименувајте го уредот или сменете ги неговите основни хардверски поставки. Сите поставки за откривање, совпаѓање и известување се во [панелот на WashData](/ha-washdata) (достапен и од страничната лента).", "data": { "name": "Име на уред", "device_type": "Тип на уред", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: тајмер од {minutes} мин.", "timer_pause_action_title": "Продолжи со циклусот", "timer_pause_body_suffix": "Циклусот е паузиран. Отворете го WashData панелот за да продолжите.", + "unload_dismiss_action_title": "Престани да потсетуваш", "notify_live_waiting_message": "{device}: Сè уште нема совпаднат профил.", "vs_typical_longer": "{pct}% подолго од вообичаено", "vs_typical_shorter": "{pct}% пократко од вообичаено", diff --git a/custom_components/ha_washdata/translations/nb.json b/custom_components/ha_washdata/translations/nb.json index bee69bb4..2234937d 100644 --- a/custom_components/ha_washdata/translations/nb.json +++ b/custom_components/ha_washdata/translations/nb.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData-oppsett", - "description": "Konfigurer vaskemaskinen eller annet apparat.\n\nStrømsensor er nødvendig.\n\n**Deretter vil du bli spurt om du vil opprette din første profil.**", + "description": "Konfigurer vaskemaskinen din eller et annet apparat.\n\nStrømsensor er nødvendig.\n\nEtter oppsett åpner du WashData-panelet fra sidefeltet (eller gå til [/ha-washdata](/ha-washdata)) for å se sykluser, justere registrering og administrere profiler.", "data": { "name": "Enhetsnavn", "device_type": "Enhetstype", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Rekonfigurer WashData", - "description": "Oppdater enhetsnavnet, apparattype eller strømsensor.", + "description": "Oppdater enhetsnavnet, apparattypen eller strømsensoren.\n\nWashData-panelet (sidefeltet eller [/ha-washdata](/ha-washdata)) er der registrering, sykluser, profiler og varsler administreres.", "data": { "name": "Enhetsnavn", "device_type": "Enhetstype", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData-innstillinger", - "description": "Alle innstillinger -- deteksjon, samsvar, timing, varsler, profiler og sykluser -- er tilgjengelige i WashData-panelet. Bruk dette skjemaet kun til å endre strømsensoren, enhetstype eller standbyterskelen.", + "description": "Gi enheten nytt navn eller endre de grunnleggende maskinvareinnstillingene. Alle innstillinger for registrering, matching og varsler finnes i [WashData-panelet](/ha-washdata) (også tilgjengelig fra sidefeltet).", "data": { "name": "Enhetsnavn", "device_type": "Enhetstype", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} min. timer", "timer_pause_action_title": "Fortsett syklus", "timer_pause_body_suffix": "Syklusen er satt på pause. Åpne WashData-panelet for å fortsette.", + "unload_dismiss_action_title": "Stopp påminnelser", "notify_live_waiting_message": "{device}: Ingen profil gjenkjent ennå.", "vs_typical_longer": "{pct}% lengre enn vanlig", "vs_typical_shorter": "{pct}% kortere enn vanlig", diff --git a/custom_components/ha_washdata/translations/nl.json b/custom_components/ha_washdata/translations/nl.json index eab27b95..60805690 100644 --- a/custom_components/ha_washdata/translations/nl.json +++ b/custom_components/ha_washdata/translations/nl.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData-instellingen", - "description": "Configureer uw wasmachine of ander apparaat.\n\nVermogenssensor is vereist.\n\n**Vervolgens wordt u gevraagd of u uw eerste profiel wilt aanmaken.**", + "description": "Configureer uw wasmachine of ander apparaat.\n\nVermogenssensor is vereist.\n\nNa de installatie opent u het WashData-paneel via de zijbalk (of ga naar [/ha-washdata](/ha-washdata)) om cycli te bekijken, detectie af te stellen en profielen te beheren.", "data": { "name": "Apparaatnaam", "device_type": "Apparaattype", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "WashData opnieuw configureren", - "description": "Werk de apparaatnaam, het type apparaat of de vermogenssensor bij.", + "description": "Werk de apparaatnaam, het type apparaat of de vermogenssensor bij.\n\nHet WashData-paneel (zijbalk of [/ha-washdata](/ha-washdata)) is waar detectie, cycli, profielen en meldingen worden beheerd.", "data": { "name": "Apparaatnaam", "device_type": "Apparaattype", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData-instellingen", - "description": "Alle instellingen -- detectie, overeenkomst, timing, meldingen, profielen en cycli -- zijn beschikbaar in het WashData-paneel. Gebruik dit formulier alleen om de vermogenssensor, het apparaattype of de standbydrempel te wijzigen.", + "description": "Geef het apparaat een nieuwe naam of wijzig de basishardware-instellingen. Alle instellingen voor detectie, matching en meldingen bevinden zich in het [WashData-paneel](/ha-washdata) (ook bereikbaar via de zijbalk).", "data": { "name": "Apparaatnaam", "device_type": "Apparaattype", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: timer van {minutes} min.", "timer_pause_action_title": "Hervat cyclus", "timer_pause_body_suffix": "De cyclus is gepauzeerd. Open het WashData-paneel om te hervatten.", + "unload_dismiss_action_title": "Stop met herinneren", "notify_live_waiting_message": "{device}: nog geen profiel herkend.", "vs_typical_longer": "{pct}% langer dan gebruikelijk", "vs_typical_shorter": "{pct}% korter dan gebruikelijk", diff --git a/custom_components/ha_washdata/translations/panel/bg.json b/custom_components/ha_washdata/translations/panel/bg.json index b80dfa11..a055c255 100644 --- a/custom_components/ha_washdata/translations/panel/bg.json +++ b/custom_components/ha_washdata/translations/panel/bg.json @@ -1,4 +1,52 @@ { + "card": { + "min": "мин", + "entity_not_found": "Обектът не е намерен", + "running_long": "Работи дълго", + "remaining": "остават", + "progress": "напредък", + "show_time_remaining": "Показване на оставащото време", + "show_percentage": "Показване на процент", + "layout": { + "tile": "Плочка (компактна)", + "detail": "Подробно (разширено)", + "glance": "Преглед (няколко устройства)" + }, + "btn": { + "pause": "Пауза", + "resume": "Възобновяване", + "terminate": "Край на цикъла", + "record_start": "Стартиране на запис", + "record_stop": "Спиране на запис", + "program": "Програма", + "open_panel": "Отваряне на WashData" + }, + "editor": { + "layout": "Оформление", + "entity": "Обект на уреда", + "entities": "Уреди", + "title": "Заглавие", + "icon": "Икона", + "show_state": "Показване на състоянието", + "show_program": "Показване на програмата", + "show_progress_bar": "Показване на лента за напредък", + "spin_icon": "Въртене на иконата по време на работа", + "display_mode": "Ред с подробности", + "active_color": "Замяна на активния цвят", + "show_phase": "Показване на фазата", + "show_energy": "Показване на енергия и разходи", + "show_anomaly": "Показване на предупреждение за превишаване", + "show_sparkline": "Показване на графика на мощността на живо", + "buttons": "Бутони за действие", + "program_entity": "Обект на програмата (замяна)", + "time_entity": "Обект на времето (замяна)", + "pct_entity": "Обект на напредъка (замяна)", + "power_entity": "Обект на мощността (замяна)", + "tap_action": "Действие при докосване", + "hold_action": "Действие при задържане", + "double_tap_action": "Действие при двойно докосване" + } + }, "badge": { "artifact_tip": "{n} открити аномалии (напр. отворена врата по средата на цикъла) – отворете, за да ги видите на графиката", "auto": "(автоматично разпознато)", @@ -64,6 +112,21 @@ "discard": "Изхвърлете", "discard_tip": "Изхвърли записаната следа без запазване", "dismiss": "Отхвърляне", + "mute_suggestion": "Спрете да предлагате тази настройка", + "pg_load_calibrated": "Зареди калибрирани (ML) ({n})", + "pg_load_calibrated_tip": "Зареди ML-калибрираните настройки като замени в тестовата среда", + "pg_load_live": "Зареди активните настройки", + "pg_load_live_tip": "Повторно прочитане на текущите настройки на интеграцията и отхвърляне на всички промени в тестовата среда", + "pg_load_suggested": "Зареди предложени ({n})", + "pg_load_suggested_tip": "Зареди текущите предложения на автоматичния настройчик като замени в тестовата среда", + "pg_preset_delete": "Изтриване на конфигурация", + "pg_preset_load": "Зареди конфигурация", + "pg_preset_load_tip": "Заменяне на стойностите в тестовата среда с тази конфигурация (активните настройки остават непроменени)", + "pg_preset_save": "Запазване като конфигурация", + "pg_preset_save_tip": "Запазване на всички стойности по-долу като именувана конфигурация за това устройство", + "pg_publish_all": "Приложи {n} към интеграцията", + "pg_publish_one": "Приложи {label} към интеграцията", + "reset_muted": "Нулиране на заглушените", "done": "Готово", "edit": "Редактиране", "export": "Експортиране", @@ -275,6 +338,7 @@ "no_automations": "Все още няма автоматизации, които да споменават това устройство.", "panel_settings": "Настройки на панела", "param_sweep": "Обхождане на параметър", + "pg_settings_source": "Източник на настройките", "phase_catalog": "Фазов каталог", "playground": "Тестова среда", "process_history": "История на процеса", @@ -348,6 +412,7 @@ "default_access_level": "Ниво по подразбиране за потребители, които не са изброени по-долу", "default_other": "По подразбиране (други устройства)", "default_tab": "Раздел по подразбиране при отваряне на панела", + "font_size": "Размер на шрифта на панела", "delta": "Δ", "description": "Описание", "dtw_blend_w": "Тегло на смесване", @@ -415,6 +480,9 @@ "pg_match_score": "Оценка на съвпадение", "pg_pct_of": "{p}% от {total}", "pg_poor_match": "Лошо съвпадение", + "pg_preset": "Конфигурация на тестовата среда", + "pg_preset_name": "Име на новата конфигурация", + "pg_preset_none": "Изберете конфигурация…", "pg_strong_match": "Силно съвпадение", "pg_tile_ambiguous": "Двусмислени", "pg_tile_ambiguous_tip": "Цикли с почти равно съвпадение между две програми", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Прилагане на най-добрата стойност: {label} = {value}?", "pg_canvas_empty": "Изберете цикъл по-горе, след което натиснете „Зареди“, за да видите неговата крива на мощността.", "pg_chart_caption": "Дял на откриване/съвпадение по стойности на {param}", + "pg_ctrl_intro": "Стойностите тръгват от активните настройки на интеграцията за това устройство. Промените остават в тестовата среда, докато не ги приложите.", + "pg_live_unavailable": "Активните настройки не са налични, показани са стойностите по подразбиране.", + "pg_load_live_confirm": "Да се отхвърлят ли промените в тестовата среда ({n}) и да се заредят текущите настройки на интеграцията?", "pg_match_rate": "{pct}% съвпадения върху {total} цикъла", + "pg_matches_live": "Съвпада с активните настройки", + "pg_n_changed": "Промени спрямо активните настройки: {n}", + "pg_sugg_none": "Всички предложения вече съответстват на текущите настройки", + "pg_preset_delete_confirm": "Да се изтрие ли конфигурацията „{name}“?", + "pg_preset_limit": "Достигнат е лимитът на конфигурации ({n})", + "pg_preset_overwrite": "Да се презапише ли конфигурацията „{name}“?", + "pg_publish_one_confirm": "Да се запази ли {label} = {value} в настройките на това устройство?", "pg_restart_note": "Рестартирайте Home Assistant, за да активирате инструментите за симулация.", "pg_sim_progress": "{done} / {total} цикъла", "pg_starting": "Стартиране…", @@ -789,6 +867,7 @@ "preferences_admin": "Предпочитания, панел и контрол на достъпа", "preferences_adv": "Предпочитания", "prefs_personal": "Те се отнасят само за вашия акаунт в Home Assistant.", + "font_size_hint": "Направете всичко в този панел по-голямо или по-малко. Прилага се за вашия акаунт на това устройство.", "process_history_hint": "Повторно стартирайте съпоставяне за всички съхранени цикли, обновете предложенията за настройка, обучете отново ML моделите (ако е активирано) и преизчислете качеството на цикъла. Стартирайте след пакетни прегледи.", "profile_deleted": "Профилът е изтрит", "profile_poor_health_detail": "Циклите, присвоени на този профил, имат непоследователни форми или ниска степен на доверие. Помислете за повторно изграждане на обвивката или преглед на циклите с етикети.", @@ -821,6 +900,10 @@ "split_intro": "Щракнете върху графиката, за да добавите или премахнете точка на разделяне или автоматично откриване по неактивни празнини. Всеки получен сегмент може да получи свой собствен профил.", "storage_diagnostics": "Статистика за съхранение, поддръжка, експорт/импорт", "sug_staged": "Зададено {key} = {val}. Запазете, за да приложите.", + "sug_muted": "Тази настройка няма да се предлага повече", + "sug_mute_failed": "Настройката не можа да бъде заглушена", + "sug_unmuted_all": "Заглушените предложения са нулирани", + "n_suggestions_muted": "{count} заглушени; авто-настройката няма да предлага тези.", "toast_auto_detect_enabled": "Автоматичното разпознаване е активирано", "toast_auto_label_complete": "Автоматичното етикетиране е завършено", "toast_auto_label_failed": "Автоматичното етикетиране е неуспешно: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Продължителността се понижава ({pct}%/цикъл) – скорошно средно {avg}", "trend_energy_down": "Енергията намалява ({pct}%/цикъл)", "trend_energy_up": "Тенденция към нарастване на енергията ({pct}%/цикъл) – скорошно средно {avg}", + "trim_destructive_confirm": "Това запазва само {pct}% от цикъла и не може да бъде отменено. Да се продължи ли?", "trim_intro": "Плъзнете червените манипулатори или въведете стойности. Всичко извън прозореца се премахва.", "tuning_suggestions_available": "{count} предложение за настройка налично от наблюдавани цикли. Те се появяват до съответните полета.", "unsure_detected_prefix": "WashData не е сигурен, че е открит", @@ -970,6 +1054,10 @@ "unusable": "Неизползваем" }, "section": { + "dishwasher": { + "intro": "Обработка на края на цикъла за съдомиялни машини, които обикновено завършват с дълга фаза на сушене почти без консумация на енергия преди кратко финално източване.", + "label": "Съдомиялна машина" + }, "anti_wrinkle": { "intro": "Режимът против бръчки/против набръчкване открива импулси на ниска мощност след основната фаза и ги прикрепя към завършения цикъл.", "label": "Против бръчки" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "doc": "След като цикълът надхвърли очакваната си продължителност, колко дълго съдомиялната машина трябва да остане неактивна (под «Праг на спиране»), преди WashData да спре да чака финално източване и да завърши цикъла. Увеличете го, ако вашата машина има дълга тиха фаза на сушене преди късно финално източване, което се пропуска - по-широк прозорец позволява на научената продължителност да следва сезонните промени (по-студена входяща вода = по-дълги цикли), вместо да се фиксира към старата средна стойност. То само съкращава изчакването спрямо вътрешния 30-минутен лимит за изчакване на финалния пик (източване на вода), но никога не го удължава.", + "label": "Тихо завършване на пасивното сушене" + }, "anti_wrinkle_enabled": { "doc": "Разпознайте кратките импулси на сушене с ниска мощност, които сушилнята излъчва след основната топлинна фаза, и ги запазете прикрепени към завършения цикъл, вместо да ги четете като нови цикли.", "label": "Активиране на антибръчково засичане" @@ -1232,6 +1324,10 @@ "doc": "Минути след края на цикъла преди изпращане на все още чакащото напомняне за „разтоварване на машината“. Задайте 0, за да деактивирате напомнянето.", "label": "Закъснение на напомнянето за разтоварване" }, + "notify_unload_repeat": { + "doc": "Продължава да изпраща напомнянето за разтоварване на всеки \"Закъснение на напомнянето за разтоварване\" минути, докато не отворите вратата или не докоснете \"Спри напомнянията\" в известието. Изисква Обект на сензор за врата (както и самото напомняне). Бутонът за отхвърляне работи в известията на мобилното приложение на Home Assistant (companion).", + "label": "Повтаряне до отваряне на вратата" + }, "off_delay": { "doc": "Време за изчакване след падане на захранването, преди да се обяви цикълът за завършен. Ако захранването се възобнови в рамките на този прозорец, цикълът продължава безпроблемно - това свързва паузите между етапите на пране. Съдомиялните машини имат дълги фази на сушене (изключени за 20-60 минути), така че времето за изключване трябва да надвишава това, за да поддържа цялото измиване+сушене като един цикъл.", "label": "Закъснение при изключване" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Острота на енергия", "doc": "Острота на санкцията за несъответствие на енергията в Етап 4. По-малко = по-строго: несъответствието на енергията снижава резултата повече. Стойността по подразбиране 0,25 е умишлено по-щедра от Остротата на продължителността, тъй като енергията варира с натоварването. Комбинирайте с Тежестта на енергията." + }, + "power_profile_interval_min": { + "label": "Интервал на профила на мощността", + "doc": "Размер на кофата за атрибута на сензора power_profile за всеки профил (плоски средни стойности в Вт за слот, използвани от външни планировчици като EMHASS и tibber_prices). По-малките кофи запазват кратките пикове на мощността остри; по-голямата кофа изглажда формата. По подразбиране 15 мин. Само за четене; не засяга откриването." + }, + "notify_live_sticky": { + "label": "Запазване на живото известие при докосване", + "doc": "Само за Android. Направете известието за ход на живо постоянно (закачено), за да не го откажете при докосване. Изключено запазва поведението по подразбиране, при което докосването го откажва." + }, + "notify_live_click_action": { + "label": "Цел при докосване на живото известие", + "doc": "Само за Android. Накъде отваря докосването на известието за ход на живо (напр. /lovelace/laundry или пълен URL адрес), вместо началната страница на приложението. Оставете празно за поведението по подразбиране." + }, + "door_opens_at_end": { + "label": "Вратата се отваря автоматично в края", + "doc": "За съдомиялни, при които вратата се отваря в края на цикъла за сушене (AirDry и подобни). При включено, отварянето на вратата по време на работещ цикъл вече не го поставя на пауза завинаги; вместо това, ако вратата остане отворена за времето за изчакване по-долу, WashData третира цикъла като завършен. Краткото отваряне (добавяне на артикул) се игнорира. Изисква се обект на сензор за врата." + }, + "door_end_dwell_seconds": { + "label": "Изчакване при отворена врата", + "doc": "Колко дълго трябва вратата да остане отворена, преди WashData да приключи цикъла, когато \"Вратата се отваря автоматично в края\" е включено. Достатъчно дълго, за да игнорира бързото добавяне на съд (по подразбиране 60 с), достатъчно кратко, за да приключи бързо, когато машината отвори вратата." } }, "setting_group": { @@ -1576,6 +1692,10 @@ "name_required": "Изисква се име", "no_split_found": "Няма открити празни места, на които да се разцепи", "panel_settings_saved": "Настройките на панела са запазени", + "pg_preset_loaded": "Конфигурацията „{name}“ е заредена", + "pg_preset_saved": "Конфигурацията „{name}“ е запазена", + "pg_sugg_loaded": "Заредени {n} предложени стойности - стартирайте тестовата среда за сравнение", + "pg_sugg_ml_loaded": "Заредени {n} ML-калибрирани стойности - стартирайте тестовата среда за сравнение", "phase_name_required": "Изисква се име на фаза", "phase_updated": "Фазата е актуализирана", "phases_saved": "Фазите са запазени", @@ -1723,6 +1843,7 @@ "min_active": "Въз основа на минималната работна мощност ({min}W), наблюдавана в последния цикъл.", "min_duration_ratio": "Задържано възможно най-ниско, за да се разпознае програмата рано в цикъла; праговете на достоверност и нееднозначност предотвратяват преждевременни потвърждения.", "min_off_gap": "Въз основа на {gaps} наблюдавани интервала между циклите (p05={p05}s). Долна граница на уреда: {floor}s.", + "min_off_gap_bridge": "Оразмерено да покрие най-дългия тих участък в рамките на цикъла: {span}s + 60s буфер, от {spans} покрити интервала за {cycles} чисти цикъла (остава под вашия най-кратък интервал между две последователни стартирания, който е {ceiling}s).", "min_power": "40 % от най-ниската работна мощност p05 ({p05}W) за {cycles} чисти цикъла, за да остане прагът на изключване под реалната консумация.{excl}", "ml_auto_label": "Най-ниската достоверност, която моделът за качество все още е оценил като чиста (p10 от {cycles} чисти цикъла = {p10}).", "ml_end_repeat": "{false}/{total} цикъла ({pct}%) са имали пауза, оценена от детектора за край над 50 %; изисквай {val} потвърждение(я) за край.", @@ -1739,7 +1860,7 @@ "thr_batch": "Задържано точно над най-ниската работна мощност p05 за {cycles} цикъла ({p05}W), за да се улови стартът възможно най-рано и прагът на спиране да остане под най-ниската работна мощност на машината.", "tol_per_profile": "p75 на дисперсията на продължителността по профил за {profiles} профила ({cycles} цикъла); стриктните профили не се санкционират.", "tol_pooled": "Въз основа на обединената дисперсия на продължителността на {cycles} скорошни етикетирани цикъла (p95 отклонение={dev}).", - "watchdog": "Задържано възможно най-ниско при запазена безопасност (3x интервала на обновяване p95 от {p95}s, мин. 30s), за да се улавят бързо блокиранията без фалшиви спирания." + "watchdog": "Задържано възможно най-ниско при запазена безопасност (малко над интервала на обновяване p95 от {p95}s, мин. 30s), за да се улавят бързо блокиранията без фалшиви спирания." }, "exclusions": { "summary": "Изключени са {total} грешно открити цикъла: {parts}.", @@ -1770,6 +1891,7 @@ "other": "Друго" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Съдомиялна машина: секунди неактивност след очакваната продължителност, преди да се освободи изчакването за източване в края на цикъла", "completion_min_seconds": "Най-краткото изпълнение, което се счита за истински цикъл", "end_repeat_count": "Ниски отчитания поред преди приключване", "interrupted_min_seconds": "Кратки цикли се отбелязват като прекъснати", diff --git a/custom_components/ha_washdata/translations/panel/bs.json b/custom_components/ha_washdata/translations/panel/bs.json index c8506187..b9031891 100644 --- a/custom_components/ha_washdata/translations/panel/bs.json +++ b/custom_components/ha_washdata/translations/panel/bs.json @@ -1,1947 +1,2069 @@ { - "badge": { - "artifact_tip": "Otkrivene su {n} anomalije (npr. vrata otvorena sredinom ciklusa) – otvorite da ih vidite na grafikonu", - "auto": "(automatski otkriveno)", - "built_in_tag": "ugrađen", - "declining": "↘ u opadanju", - "energy_low": "Niža potrošnja energije nego inače", - "energy_spike": "Viša potrošnja energije nego inače", - "fair_fit": "prihvatljiva kvaliteta", - "fair_fit_tip": "Umjerena konzistentnost podudaranja – neki ciklusi dodijeljeni ovom profilu imaju niže rezultate pouzdanosti. Označite više ciklusa ili ponovo snimite profil da biste poboljšali preciznost.", - "feedback_requested": "Zatražena je povratna informacija", - "golden_cycle": "Snimljeni referentni ciklus", - "improving": "↗ poboljšanje", - "manual": "(ručno odabrano)", - "needs_review": "Potreban pregled", - "overrun": "Trajao duže nego inače", - "underrun": "Završio brže nego inače", - "poor_fit": "loša kvaliteta", - "poor_fit_tip": "Nedosljedna historija podudaranja - razmislite o ponovnoj izgradnji ovog profila", - "restart_gap_tip": "{n} HA restart praznina: trag snage ima rupu", - "reviewed": "Recenzirano", - "steady": "→ stabilan", - "using_defaults": "Korištenje isporučenih zadanih postavki", - "using_tuned": "Korištenje podešenih težina", - "overrun_ratio": "({x}x očekivanog)", - "underrun_ratio": "({pct}% očekivanog)", - "awaiting_tip": "Čeka odobrenje zajednice", - "awaiting_n": "Čeka odobrenje · potvrđeno {n}", - "approved": "Odobreno", - "awaiting": "Čeka odobrenje", - "imported_tip": "Uvezeno iz zajedničke trgovine. Koristi se samo za podudaranje, ne broji se u statistiku.", - "not_importable": "nije dostupno", - "exists": "postoji" - }, - "btn": { - "add_device": "+ Dodaj uređaj", - "add_device_tip": "Dodajte još jedan WashData uređaj", - "add_maintenance": "Dodaj događaj održavanja", - "add_phase": "+ Dodaj fazu", - "add_timer": "+ Dodajte tajmer", - "apply_all": "Primijeni sve", - "apply_label": "Primijeni oznaku", - "apply_set_b": "Primijeni skup B", - "apply_split": "Primijeni podjelu", - "apply_trim": "Primijeni skraćivanje", - "auto_detect_split": "Automatsko otkrivanje", - "auto_label_cycles": "Ciklusi automatskog označavanja", - "auto_label_cycles_tip": "Automatski dodjeljuje nazive profila neoznačenim ciklusima čija pouzdanost podudaranja prelazi prag", - "cancel": "Otkaži", - "clear_debug": "Obrišite podatke za otklanjanje grešaka", - "clear_splits": "Očisti", - "close": "Zatvori", - "compare": "Uporedite", - "confirm": "Potvrdi", - "convert_to_automation": "Pretvorite u automatizaciju", - "correct": "Ispravi…", - "create": "Kreiraj", - "create_from_cluster": "Kreirajte profil od {count} ciklusa", - "create_profile": "+ Kreirajte profil", - "delete": "Izbriši", - "delete_group": "Izbriši grupu", - "delete_group_tip": "Izbrišite samo ovu grupu - profili članova se čuvaju", - "delete_profile": "Izbriši profil", - "discard": "Odbaci", - "discard_tip": "Odbaci snimljeni trag bez pohrane", - "dismiss": "Odbaci", - "done": "Gotovo", - "edit": "Uredi", - "export": "Izvoz", - "export_json": "Izvezi u JSON", - "force_stop": "Prisilno zaustavi", - "force_stop_tip": "Odmah završi trenutni ciklus i označi ga kao prisilno zaustavljen", - "from_template": "Iz šablona ▾", - "ignore": "Ignoriraj", - "import_json": "Uvoz iz JSON-a", - "import_overwrite": "Uvoz (prepisuje podatke)", - "inspect": "Pregledaj", - "label": "Označi", - "load": "Učitaj", - "load_more": "Učitaj još", - "manage": "Upravljaj", - "merge": "Spoji", - "new_automation": "+ Nova automatizacija", - "new_group": "+ Nova grupa", - "new_group_tip": "Grupirajte skoro identične profile (isti oblik/trajanje, različita temperatura ili centrifuga) da uparivanje pouzdano bira između njih", - "new_phase": "+ Nova faza", - "new_profile": "+ Novi profil", - "new_profile_tip": "Kreirajte novi profil programa iz postojećeg označenog ciklusa ili snimanja", - "on_cycle_finished": "Završen ciklus", - "on_cycle_started": "Započeo ciklus", - "pause_cycle": "Pauza", - "pause_cycle_tip": "Pauzirajte aktivni ciklus – uređaj će se nastaviti od mjesta na kojem je stao", - "pg_apply_device": "Primijeni na uređaj", - "pg_autofill": "Automatsko popunjavanje", - "play": "Reproduciraj", - "process": "Obradi", - "process_history": "Obradi sada", - "process_recording": "Sačuvaj snimanje", - "process_tip": "Sačuvajte snimljeni trag kao novi ili postojeći profil", - "rebuild": "Obnovi koverte", - "rebuild_envelope": "Obnovi kovertu", - "rebuild_tip": "Preračunajte očekivanu kovertu snage (min/maks pojas) za sve profile iz njihovih označenih ciklusa – pokrenite nakon označavanja novih ciklusa ili ispravljanja starih", - "rec_start_tip": "Počnite snimanje traga snage uređaja – pokrenite neposredno prije pokretanja ciklusa", - "rec_stop": "Zaustavi", - "rec_stop_tip": "Zaustavite snimanje i zadržite snimljeni trag radi pregleda", - "record": "Započni snimanje", - "refresh": "Osvježi", - "refresh_diag_tip": "Ponovo učitajte statistike pohrane", - "refresh_logs_tip": "Ponovo učitajte najnovije zapise dnevnika", - "refresh_settings_tip": "Ponovo učitajte postavke sa servera", - "relabel": "Ponovo označi ({count})", - "remove": "Ukloni", - "remove_timer": "Ukloni tajmer", - "reset": "Vrati na zadano", - "reset_ml_models_tip": "Odbacite fino podešene modele i vratite se na one ugrađene. WashData ih može ponovo naučiti kasnije.", - "reset_to_builtin": "Vratite se na ugrađene modele", - "reset_to_defaults": "Vratite na zadane postavke", - "resume_cycle": "Nastavi", - "resume_cycle_tip": "Nastavite pauzirani ciklus", - "revert_settings": "Odbaci izmjene", - "revert_settings_tip": "Vraćanje postavki na stanje prije posljednjeg spremanja", - "revert_settings_tip_none": "Spremi prvo da bi aktivirao poništavanje", - "revert": "Vrati", - "revert_to_previous": "Vrati ovu postavku na prethodnu vrijednost", - "review": "Pregled", - "run": "Pokreni", - "run_analysis": "🔍 Pokrenite analizu prijedloga", - "run_analysis_tip": "Analizirajte svoje snimljene cikluse sada i osvježite prijedloge za podešavanje", - "run_auto_label": "Pokreni Auto-Label", - "run_both": "Pokreni A vs B", - "run_simulation": "Pokreni simulaciju", - "save": "Sačuvaj", - "save_access_control": "Sačuvajte kontrolu pristupa", - "save_group": "Sačuvaj grupu", - "save_panel_settings": "Sačuvaj postavke panela", - "save_phases": "Sačuvaj faze", - "save_preferences": "Sačuvaj postavke", - "save_reminders": "Sačuvaj podsjetnike", - "save_review": "Sačuvaj recenziju", - "save_settings": "Sačuvaj postavke", - "select": "Odaberite", - "select_all": "Odaberi sve", - "select_last20": "Zadnjih 20", - "select_none": "Očisti", - "show_only": "Pokaži samo", - "skip_setup": "Preskoči podešavanje", - "split": "Podijeli", - "stop": "Zaustavi", - "submit_correction": "Pošalji ispravku", - "train_now": "Treniraj sada", - "trim": "Skrati", - "trim_split": "Skrati / Podijeli", - "undo": "Poništi", - "use": "Koristi", - "wipe_all": "Obriši sve podatke", - "delete_selected": "Izbriši odabrano ({n})", - "group_suggest": "Grupa {n}: {members}", - "pg_apply_best": "Primijeni najbolje", - "pg_apply_to_settings": "Sačuvaj u postavke", - "pg_apply_to_settings_tip": "Kopiraj ovdje uređene vrijednosti u aktivne postavke ovog uređaja", - "search": "Pretraži", - "import": "Uvezi", - "disconnect": "Prekini vezu", - "connect_github": "Poveži GitHub", - "save_appliance": "Sačuvaj uređaj", - "share_to_store": "Podijeli u trgovinu", - "share": "Podijeli", - "confirm_appliance": "Potvrdi ovaj uređaj", - "confirmed": "Potvrđeno", - "browse_community_setups": "Pregledaj postavke zajednice", - "download_device": "Preuzmi postavke uređaja", - "share_device": "Podijeli postavke uređaja", - "share_device_tip": "Podijelite programe i postavke ovog uređaja sa zajednicom", - "share_n": "Podijeli {n} program{s}", - "export_selected": "Izvoz (odaberi podatke)", - "export_all": "Brzi izvoz svega", - "import_raw": "Napredno: zamijeni sve iz JSON datoteke", - "download_export": "Preuzmi izvoz", - "analyze_import": "Analiziraj datoteku", - "import_selected": "Uvezi odabrano", - "back": "Nazad" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "Mora biti ispod Praga zaustavljanja ({stop} W); inače se izlazna snaga anti-gužvanja zanemaruje", - "stop": "Mora biti iznad Izlazne snage anti-gužvanja ({exit} W)" + "card": { + "min": "min", + "entity_not_found": "Entitet nije pronađen", + "running_long": "Traje predugo", + "remaining": "preostalo", + "progress": "napredak", + "show_time_remaining": "Prikaži preostalo vrijeme", + "show_percentage": "Prikaži postotak", + "layout": { + "tile": "Pločica (kompaktno)", + "detail": "Detaljno (bogato)", + "glance": "Pregled (više uređaja)" + }, + "btn": { + "pause": "Pauziraj", + "resume": "Nastavi", + "terminate": "Završi ciklus", + "record_start": "Započni snimanje", + "record_stop": "Zaustavi snimanje", + "program": "Program", + "open_panel": "Otvori WashData" + }, + "editor": { + "layout": "Izgled", + "entity": "Entitet uređaja", + "entities": "Uređaji", + "title": "Naslov", + "icon": "Ikona", + "show_state": "Prikaži stanje", + "show_program": "Prikaži program", + "show_progress_bar": "Prikaži traku napretka", + "spin_icon": "Vrti ikonu tokom rada", + "display_mode": "Red s detaljima", + "active_color": "Zamjena aktivne boje", + "show_phase": "Prikaži fazu", + "show_energy": "Prikaži energiju i trošak", + "show_anomaly": "Prikaži upozorenje o produženju", + "show_sparkline": "Prikaži grafikon snage uživo", + "buttons": "Dugmad za radnje", + "program_entity": "Entitet programa (zamjena)", + "time_entity": "Entitet vremena (zamjena)", + "pct_entity": "Entitet napretka (zamjena)", + "power_entity": "Entitet snage (zamjena)", + "tap_action": "Radnja dodira", + "hold_action": "Radnja držanja", + "double_tap_action": "Radnja dvostrukog dodira" + } + }, + "badge": { + "artifact_tip": "Otkrivene su {n} anomalije (npr. vrata otvorena sredinom ciklusa) – otvorite da ih vidite na grafikonu", + "auto": "(automatski otkriveno)", + "built_in_tag": "ugrađen", + "declining": "↘ u opadanju", + "energy_low": "Niža potrošnja energije nego inače", + "energy_spike": "Viša potrošnja energije nego inače", + "fair_fit": "prihvatljiva kvaliteta", + "fair_fit_tip": "Umjerena konzistentnost podudaranja – neki ciklusi dodijeljeni ovom profilu imaju niže rezultate pouzdanosti. Označite više ciklusa ili ponovo snimite profil da biste poboljšali preciznost.", + "feedback_requested": "Zatražena je povratna informacija", + "golden_cycle": "Snimljeni referentni ciklus", + "improving": "↗ poboljšanje", + "manual": "(ručno odabrano)", + "needs_review": "Potreban pregled", + "overrun": "Trajao duže nego inače", + "underrun": "Završio brže nego inače", + "poor_fit": "loša kvaliteta", + "poor_fit_tip": "Nedosljedna historija podudaranja - razmislite o ponovnoj izgradnji ovog profila", + "restart_gap_tip": "{n} HA restart praznina: trag snage ima rupu", + "reviewed": "Recenzirano", + "steady": "→ stabilan", + "using_defaults": "Korištenje isporučenih zadanih postavki", + "using_tuned": "Korištenje podešenih težina", + "overrun_ratio": "({x}x očekivanog)", + "underrun_ratio": "({pct}% očekivanog)", + "awaiting_tip": "Čeka odobrenje zajednice", + "awaiting_n": "Čeka odobrenje · potvrđeno {n}", + "approved": "Odobreno", + "awaiting": "Čeka odobrenje", + "imported_tip": "Uvezeno iz zajedničke trgovine. Koristi se samo za podudaranje, ne broji se u statistiku.", + "not_importable": "nije dostupno", + "exists": "postoji" + }, + "btn": { + "add_device": "+ Dodaj uređaj", + "add_device_tip": "Dodajte još jedan WashData uređaj", + "add_maintenance": "Dodaj događaj održavanja", + "add_phase": "+ Dodaj fazu", + "add_timer": "+ Dodajte tajmer", + "apply_all": "Primijeni sve", + "apply_label": "Primijeni oznaku", + "apply_set_b": "Primijeni skup B", + "apply_split": "Primijeni podjelu", + "apply_trim": "Primijeni skraćivanje", + "auto_detect_split": "Automatsko otkrivanje", + "auto_label_cycles": "Ciklusi automatskog označavanja", + "auto_label_cycles_tip": "Automatski dodjeljuje nazive profila neoznačenim ciklusima čija pouzdanost podudaranja prelazi prag", + "cancel": "Otkaži", + "clear_debug": "Obrišite podatke za otklanjanje grešaka", + "clear_splits": "Očisti", + "close": "Zatvori", + "compare": "Uporedite", + "confirm": "Potvrdi", + "convert_to_automation": "Pretvorite u automatizaciju", + "correct": "Ispravi…", + "create": "Kreiraj", + "create_from_cluster": "Kreirajte profil od {count} ciklusa", + "create_profile": "+ Kreirajte profil", + "delete": "Izbriši", + "delete_group": "Izbriši grupu", + "delete_group_tip": "Izbrišite samo ovu grupu - profili članova se čuvaju", + "delete_profile": "Izbriši profil", + "discard": "Odbaci", + "discard_tip": "Odbaci snimljeni trag bez pohrane", + "dismiss": "Odbaci", + "mute_suggestion": "Prestani predlagati ovu postavku", + "pg_load_calibrated": "Učitaj kalibrirano (ML) ({n})", + "pg_load_calibrated_tip": "Učitava ML kalibrirane postavke kao zamjene u testnom okruženju", + "pg_load_live": "Učitaj aktivne postavke", + "pg_load_live_tip": "Ponovo pročitaj trenutne postavke integracije i odbaci sve izmjene u testnom okruženju", + "pg_load_suggested": "Učitaj prijedloge ({n})", + "pg_load_suggested_tip": "Učitava trenutne prijedloge automatskog podešavača kao zamjene u testnom okruženju", + "pg_preset_delete": "Izbriši konfiguraciju", + "pg_preset_load": "Učitaj konfiguraciju", + "pg_preset_load_tip": "Zamijeni vrijednosti u testnom okruženju ovom konfiguracijom (aktivne postavke ostaju netaknute)", + "pg_preset_save": "Sačuvaj kao konfiguraciju", + "pg_preset_save_tip": "Sačuvaj sve vrijednosti ispod kao imenovanu konfiguraciju za ovaj uređaj", + "pg_publish_all": "Primijeni {n} na integraciju", + "pg_publish_one": "Primijeni {label} na integraciju", + "reset_muted": "Poništi utišane", + "done": "Gotovo", + "edit": "Uredi", + "export": "Izvoz", + "export_json": "Izvezi u JSON", + "force_stop": "Prisilno zaustavi", + "force_stop_tip": "Odmah završi trenutni ciklus i označi ga kao prisilno zaustavljen", + "from_template": "Iz šablona ▾", + "ignore": "Ignoriraj", + "import_json": "Uvoz iz JSON-a", + "import_overwrite": "Uvoz (prepisuje podatke)", + "inspect": "Pregledaj", + "label": "Označi", + "load": "Učitaj", + "load_more": "Učitaj još", + "manage": "Upravljaj", + "merge": "Spoji", + "new_automation": "+ Nova automatizacija", + "new_group": "+ Nova grupa", + "new_group_tip": "Grupirajte skoro identične profile (isti oblik/trajanje, različita temperatura ili centrifuga) da uparivanje pouzdano bira između njih", + "new_phase": "+ Nova faza", + "new_profile": "+ Novi profil", + "new_profile_tip": "Kreirajte novi profil programa iz postojećeg označenog ciklusa ili snimanja", + "on_cycle_finished": "Završen ciklus", + "on_cycle_started": "Započeo ciklus", + "pause_cycle": "Pauza", + "pause_cycle_tip": "Pauzirajte aktivni ciklus – uređaj će se nastaviti od mjesta na kojem je stao", + "pg_apply_device": "Primijeni na uređaj", + "pg_autofill": "Automatsko popunjavanje", + "play": "Reproduciraj", + "process": "Obradi", + "process_history": "Obradi sada", + "process_recording": "Sačuvaj snimanje", + "process_tip": "Sačuvajte snimljeni trag kao novi ili postojeći profil", + "rebuild": "Obnovi koverte", + "rebuild_envelope": "Obnovi kovertu", + "rebuild_tip": "Preračunajte očekivanu kovertu snage (min/maks pojas) za sve profile iz njihovih označenih ciklusa – pokrenite nakon označavanja novih ciklusa ili ispravljanja starih", + "rec_start_tip": "Počnite snimanje traga snage uređaja – pokrenite neposredno prije pokretanja ciklusa", + "rec_stop": "Zaustavi", + "rec_stop_tip": "Zaustavite snimanje i zadržite snimljeni trag radi pregleda", + "record": "Započni snimanje", + "refresh": "Osvježi", + "refresh_diag_tip": "Ponovo učitajte statistike pohrane", + "refresh_logs_tip": "Ponovo učitajte najnovije zapise dnevnika", + "refresh_settings_tip": "Ponovo učitajte postavke sa servera", + "relabel": "Ponovo označi ({count})", + "remove": "Ukloni", + "remove_timer": "Ukloni tajmer", + "reset": "Vrati na zadano", + "reset_ml_models_tip": "Odbacite fino podešene modele i vratite se na one ugrađene. WashData ih može ponovo naučiti kasnije.", + "reset_to_builtin": "Vratite se na ugrađene modele", + "reset_to_defaults": "Vratite na zadane postavke", + "resume_cycle": "Nastavi", + "resume_cycle_tip": "Nastavite pauzirani ciklus", + "revert_settings": "Odbaci izmjene", + "revert_settings_tip": "Vraćanje postavki na stanje prije posljednjeg spremanja", + "revert_settings_tip_none": "Spremi prvo da bi aktivirao poništavanje", + "revert": "Vrati", + "revert_to_previous": "Vrati ovu postavku na prethodnu vrijednost", + "review": "Pregled", + "run": "Pokreni", + "run_analysis": "🔍 Pokrenite analizu prijedloga", + "run_analysis_tip": "Analizirajte svoje snimljene cikluse sada i osvježite prijedloge za podešavanje", + "run_auto_label": "Pokreni Auto-Label", + "run_both": "Pokreni A vs B", + "run_simulation": "Pokreni simulaciju", + "save": "Sačuvaj", + "save_access_control": "Sačuvajte kontrolu pristupa", + "save_group": "Sačuvaj grupu", + "save_panel_settings": "Sačuvaj postavke panela", + "save_phases": "Sačuvaj faze", + "save_preferences": "Sačuvaj postavke", + "save_reminders": "Sačuvaj podsjetnike", + "save_review": "Sačuvaj recenziju", + "save_settings": "Sačuvaj postavke", + "select": "Odaberite", + "select_all": "Odaberi sve", + "select_last20": "Zadnjih 20", + "select_none": "Očisti", + "show_only": "Pokaži samo", + "skip_setup": "Preskoči podešavanje", + "split": "Podijeli", + "stop": "Zaustavi", + "submit_correction": "Pošalji ispravku", + "train_now": "Treniraj sada", + "trim": "Skrati", + "trim_split": "Skrati / Podijeli", + "undo": "Poništi", + "use": "Koristi", + "wipe_all": "Obriši sve podatke", + "delete_selected": "Izbriši odabrano ({n})", + "group_suggest": "Grupa {n}: {members}", + "pg_apply_best": "Primijeni najbolje", + "pg_apply_to_settings": "Sačuvaj u postavke", + "pg_apply_to_settings_tip": "Kopiraj ovdje uređene vrijednosti u aktivne postavke ovog uređaja", + "search": "Pretraži", + "import": "Uvezi", + "disconnect": "Prekini vezu", + "connect_github": "Poveži GitHub", + "save_appliance": "Sačuvaj uređaj", + "share_to_store": "Podijeli u trgovinu", + "share": "Podijeli", + "confirm_appliance": "Potvrdi ovaj uređaj", + "confirmed": "Potvrđeno", + "browse_community_setups": "Pregledaj postavke zajednice", + "download_device": "Preuzmi postavke uređaja", + "share_device": "Podijeli postavke uređaja", + "share_device_tip": "Podijelite programe i postavke ovog uređaja sa zajednicom", + "share_n": "Podijeli {n} program{s}", + "export_selected": "Izvoz (odaberi podatke)", + "export_all": "Brzi izvoz svega", + "import_raw": "Napredno: zamijeni sve iz JSON datoteke", + "download_export": "Preuzmi izvoz", + "analyze_import": "Analiziraj datoteku", + "import_selected": "Uvezi odabrano", + "back": "Nazad" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "Mora biti ispod Praga zaustavljanja ({stop} W); inače se izlazna snaga anti-gužvanja zanemaruje", + "stop": "Mora biti iznad Izlazne snage anti-gužvanja ({exit} W)" + }, + "anti_wrinkle_max": { + "max": "Mora biti iznad Praga pokretanja ({start} W); inače se vremensko ograničenje anti-gužvanja zaobilazi", + "start": "Mora biti ispod Maks. snage anti-gužvanja ({max} W)" + }, + "attn_sub": "Ispravite konflikte prije pohrane", + "attn_title": "{n} konflikt{s} postavki", + "confidence": { + "auto": "Mora biti na razini ili iznad Praga podudaranja ({match})", + "learning": "Mora biti na razini ili ispod Praga podudaranja ({match})", + "match_for_auto": "Mora biti na razini ili ispod Pouzdanosti automatskog označavanja ({alc})", + "match_for_learning": "Mora biti na razini ili iznad Pouzdanosti učenja ({lc})" + }, + "duration_ratio": { + "max": "Mora biti veće od Min. omjera trajanja ({min})", + "min": "Mora biti manje od Maks. omjera trajanja ({max})" + }, + "hysteresis": { + "start": "Mora biti iznad Praga zaustavljanja ({stop} W)", + "stop": "Mora biti ispod Praga pokretanja ({start} W)" + }, + "min_power": { + "min_power": "Mora biti na razini ili ispod Praga zaustavljanja ({stop} W)", + "stop": "Mora biti na razini ili iznad Minimalne snage ({min} W)" + }, + "no_update_timeout": { + "timeout": "Mora biti veće od Intervala čuvara ({wi} s)", + "watchdog": "Mora biti manje od Timeouta bez ažuriranja ({to} s)" + }, + "off_delay": { + "gap": "Min razmak isključivanja treba biti barem Kašnjenje isključivanja ({delay} s)", + "off_delay": "Kašnjenje isključivanja ({off_delay} s) premašuje Min razmak isključivanja ({gap} s); uzastopni ciklusi se mogu spojiti" + }, + "power_off": { + "stop": "Mora biti iznad Praga isključivanja napajanja ({pot} W)", + "threshold": "Mora biti ispod Praga zaustavljanja ({stop} W) da bi stupilo na snagu" + }, + "pump_stuck": { + "duration": "Mora biti manje od Timeouta bez ažuriranja ({to} s) kako bi alarm zaglavljivanja aktivirao prije nego čuvar zaustavi ciklus", + "timeout": "Mora premašiti Trajanje zaglavljivanja pumpe ({ps} s) kako bi alarm aktivirao prije prisilnog zaustavljanja ciklusa" + }, + "start_dur": { + "sampling": "Interval uzorkovanja premašuje Trajanje pokretanja ({sdt} s); skokovi s jednim uzorkom mogu otvoriti ciklus", + "threshold": "Treba biti najmanje jedan Interval uzorkovanja ({si} s) kako bi se spriječili lažni startovi s jednim uzorkom" + }, + "unmatch": { + "match": "Mora biti iznad Praga nepodudaranja ({un})", + "unmatch": "Mora biti ispod Praga podudaranja ({match}); inače se potvrđeno podudaranje odmah poništava" + }, + "cascade_toast": "Radi dosljednosti, automatski je podešeno još {n} postavki.", + "suggestion_resolves": "Primijenite prijedlog na čekanju ({val}) ispod za rješavanje ovog sukoba", + "use_fix": "Koristite {val}", + "watchdog": { + "interval": "Treba biti najmanje 2× Interval uzorkovanja ({si} s)", + "sampling": "Interval uzorkovanja treba biti najviše polovina Intervala čuvara ({wi} s)" + }, + "settings_banner": "{n} konflikt{s} postavki – provjerite istaknute sekcije i ispravite prije pohrane.", + "settings_banner_btn": "Idi na prvi" }, - "anti_wrinkle_max": { - "max": "Mora biti iznad Praga pokretanja ({start} W); inače se vremensko ograničenje anti-gužvanja zaobilazi", - "start": "Mora biti ispod Maks. snage anti-gužvanja ({max} W)" - }, - "attn_sub": "Ispravite konflikte prije pohrane", - "attn_title": "{n} konflikt{s} postavki", - "confidence": { - "auto": "Mora biti na razini ili iznad Praga podudaranja ({match})", - "learning": "Mora biti na razini ili ispod Praga podudaranja ({match})", - "match_for_auto": "Mora biti na razini ili ispod Pouzdanosti automatskog označavanja ({alc})", - "match_for_learning": "Mora biti na razini ili iznad Pouzdanosti učenja ({lc})" - }, - "duration_ratio": { - "max": "Mora biti veće od Min. omjera trajanja ({min})", - "min": "Mora biti manje od Maks. omjera trajanja ({max})" - }, - "hysteresis": { - "start": "Mora biti iznad Praga zaustavljanja ({stop} W)", - "stop": "Mora biti ispod Praga pokretanja ({start} W)" - }, - "min_power": { - "min_power": "Mora biti na razini ili ispod Praga zaustavljanja ({stop} W)", - "stop": "Mora biti na razini ili iznad Minimalne snage ({min} W)" - }, - "no_update_timeout": { - "timeout": "Mora biti veće od Intervala čuvara ({wi} s)", - "watchdog": "Mora biti manje od Timeouta bez ažuriranja ({to} s)" - }, - "off_delay": { - "gap": "Min razmak isključivanja treba biti barem Kašnjenje isključivanja ({delay} s)", - "off_delay": "Kašnjenje isključivanja ({off_delay} s) premašuje Min razmak isključivanja ({gap} s); uzastopni ciklusi se mogu spojiti" - }, - "power_off": { - "stop": "Mora biti iznad Praga isključivanja napajanja ({pot} W)", - "threshold": "Mora biti ispod Praga zaustavljanja ({stop} W) da bi stupilo na snagu" - }, - "pump_stuck": { - "duration": "Mora biti manje od Timeouta bez ažuriranja ({to} s) kako bi alarm zaglavljivanja aktivirao prije nego čuvar zaustavi ciklus", - "timeout": "Mora premašiti Trajanje zaglavljivanja pumpe ({ps} s) kako bi alarm aktivirao prije prisilnog zaustavljanja ciklusa" - }, - "start_dur": { - "sampling": "Interval uzorkovanja premašuje Trajanje pokretanja ({sdt} s); skokovi s jednim uzorkom mogu otvoriti ciklus", - "threshold": "Treba biti najmanje jedan Interval uzorkovanja ({si} s) kako bi se spriječili lažni startovi s jednim uzorkom" - }, - "unmatch": { - "match": "Mora biti iznad Praga nepodudaranja ({un})", - "unmatch": "Mora biti ispod Praga podudaranja ({match}); inače se potvrđeno podudaranje odmah poništava" - }, - "cascade_toast": "Radi dosljednosti, automatski je podešeno još {n} postavki.", - "suggestion_resolves": "Primijenite prijedlog na čekanju ({val}) ispod za rješavanje ovog sukoba", - "use_fix": "Koristite {val}", - "watchdog": { - "interval": "Treba biti najmanje 2× Interval uzorkovanja ({si} s)", - "sampling": "Interval uzorkovanja treba biti najviše polovina Intervala čuvara ({wi} s)" - }, - "settings_banner": "{n} konflikt{s} postavki – provjerite istaknute sekcije i ispravite prije pohrane.", - "settings_banner_btn": "Idi na prvi" - }, - "hdr": { - "ab_comparison": "Poređenje postavki A/B", - "access_control": "Kontrola pristupa", - "add_maintenance": "Dodaj događaj održavanja", - "automation_delete": "Izbrišite ovu automatizaciju", - "automation_needs_review": "Ovaj ciklus treba revidirati", - "automation_open": "Otvorite u uređivaču automatizacije", - "automation_review_this_cycle": "Pregledajte ovaj ciklus", - "automations": "Automatizacija", - "clear_debug": "Obrišite tragove za otklanjanje grešaka", - "cycle_simulator": "Simulator ciklusa", - "diagnostics_pref": "Dijagnostika", - "display": "Prikaz", - "dtw_inspector": "DTW inspektor", - "export_import": "Izvoz/uvoz", - "getting_started": "Početak rada", - "live_power": "Snaga uživo", - "logs": "Dnevnici", - "logs_diagnostics": "Dijagnostika", - "maintenance": "Radnje održavanja", - "maintenance_log": "Dnevnik održavanja", - "maintenance_reminders": "Podsjetnici za servis", - "manual_recording": "Ručno snimanje", - "manual_recording_tip": "Namjerno pokrenite ciklus dok WashData snima trag snage. Pokrenite neposredno prije nego što uređaj krene, zaustavite kada završi, zatim obradite za pohranu kao imenovani profil.", - "ml_learned": "Šta je WashData naučio", - "ml_matching_tuning": "Fino podešavanje usklađenosti programa", - "ml_settings_card": "Postavke", - "ml_smart_learning": "Pametno učenje", - "my_preferences": "Moje postavke", - "no_automations": "Još nijedna automatizacija ne spominje ovaj uređaj.", - "panel_settings": "Postavke panela", - "param_sweep": "Ispitivanje parametra", - "phase_catalog": "Katalog faza", - "playground": "Testno okruženje", - "process_history": "Istorija procesa", - "settings_history": "Historija postavki", - "status": "Status", - "status_graph": "Graf statusa", - "storage_stats": "Statistike pohrane", - "test_history": "Provjera na historiji", - "toggle_sidebar": "Uključite bočnu traku Home Assistant", - "tools_and_data": "Alati i podaci", - "wipe_history": "Obriši historiju", - "recommendations": "Preporuke ({n})", - "pg_detection_params": "Postavke detekcije", - "pg_timeline": "Vremenska linija događaja", - "pg_outcome": "Ishod simulacije", - "pg_across_cycles": "Kroz sve vaše cikluse", - "community_store": "Zajednička trgovina", - "online_account": "Zajednička trgovina i online funkcije" - }, - "health": { - "fair": "Prihvatljiva kvaliteta podudaranja", - "good": "✓ Dobra kvaliteta podudaranja", - "poor": "⚠ Loša kvaliteta podudaranja" - }, - "lbl": { - "actions": "Akcije", - "activity": "Aktivnost", - "administrators": "Administratori", - "aria_compare_chart": "Grafikon poređenja ciklusa", - "aria_cycle_chart": "Kriva snage ciklusa", - "aria_envelope_chart": "Grafikon anvelope snage profila", - "aria_phase_chart": "Grafikon uređivača faza", - "aria_playground_chart": "Kriva snage ciklusa sa pomjerljivim pragovima detekcije", - "aria_power_chart": "Grafikon potrošnje snage", - "aria_spaghetti_chart": "Preklopljene krive snage ciklusa", - "aria_sweep_chart": "Grafikon rezultata pretrage parametara", - "artifact_anomaly": "Anomalija", - "artifact_high_power": "Visoka snaga", - "artifact_interruption": "Prekid", - "artifact_low_power": "Niska snaga", - "auto_detect": "Automatsko otkrivanje", - "auto_fine_tune_off": "automatsko fino podešavanje isključeno", - "auto_fine_tune_on": "automatsko fino podešavanje uključeno (oko {hour}:00)", - "avg_cost": "Prosj. trošak", - "change": "Promjena", - "clock_time": "Vreme na satu", - "cohesion_good": "kohezija {pct}%", - "cohesion_low": "⚠ niska kohezija {pct}%", - "compare_profiles": "Uporedite sa profilima", - "concurrency": "Paralelnost", - "confidence": "Samopouzdanje", - "confidence_threshold": "Prag povjerenja", - "correct_duration": "Ispravno trajanje (min, opcionalno)", - "correct_profile": "Ispravan profil", - "correlation": "Korelacija", - "cost": "Troškovi", - "create_new_profile": "+ Kreirajte novi profil…", - "current_phase": "Trenutna faza", - "curves": "Krive", - "cycle": "Ciklus", - "cycle_date_display": "Prikaz datuma ciklusa", - "cycle_health": "Zdravlje ciklusa", - "cycle_index": "indeks ciklusa →", - "cycles": "Ciklusi", - "cycles_count": "Ciklusi", - "cycles_lc": "ciklusa", - "dashed": "isprekidano", - "date": "Datum", - "debug_traces": "Tragovi otklanjanja grešaka", - "default": "Zadano", - "default_access_level": "Zadani nivo za korisnike koji nisu navedeni ispod", - "default_other": "Zadano (ostali uređaji)", - "default_tab": "Podrazumevana kartica prilikom otvaranja panela", - "delta": "Δ", - "description": "Opis", - "dtw_blend_w": "Težina miješanja", - "dtw_blended": "Miješani rezultat", - "dtw_ddtw": "DDTW rezultat", - "dtw_l1": "L1 rezultat", - "dtw_matched_profile": "(profil podudaran ciklusu)", - "duration": "Trajanje", - "duration_agreement": "Slaganje trajanja", - "emphasis": "Naglasak", - "enable_access_control": "Omogućite kontrolu pristupa po korisniku", - "energy": "Energija", - "energy_agreement": "Slaganje energije", - "event_timeline": "Vremenska linija događaja", - "event_type": "Tip događaja", - "expected": "Očekivano", - "expected_duration": "Očekivano trajanje (min)", - "file_kb": "Fajl (kB)", - "final_score": "Konačni rezultat", - "from": "Od", - "gap_s": "jaz (s)", - "group_name": "Naziv grupe", - "head_trim": "Trim (s) glave", - "health": "Zdravlje", - "hide_tabs": "Sakrij kartice za neadministratore", - "in_use": "U upotrebi", - "json_data": "JSON podaci", - "label": "Podudarajući program", - "last": "Posljednjih", - "last_checked": "Zadnja provjera:", - "load_from_file": "Učitaj iz datoteke", - "mae_score": "MAE rezultat", - "manual_duration": "Ručno trajanje (min, opciono)", - "match": "Podudaranje", - "members": "Članovi", - "metric": "Metrika", - "mode_existing_profile": "Dodaj postojećem profilu", - "mode_new_profile": "Kreirajte novi profil", - "models_fine_tuned": "({count} modela fino podešenih)", - "n_classic_suggestions": "{n} klasičan", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} odabrano", - "n_tuning_suggestions": "{n} prijedlog podešavanja", - "na": "n/a", - "new_profile_name": "Novo ime profila", - "notes": "Napomene", - "of": "od", - "outcome": "Ishod", - "panel_default_tab": "Zadana kartica", - "panel_language": "Jezik ploče", - "per_cycle_short": "ciklus", - "pg_autofill_tip": "Automatski popuni opseg iz trenutne vrijednosti ({lo}–{hi})", - "pg_best_value": "Pronađena najbolja vrijednost", - "pg_current_value": "Trenutna vrijednost:", - "pg_drag_hint": "Povucite liniju na grafikonu", - "pg_anti_wrinkle": "Anti-gužvanje", - "pg_dtw": "DTW", - "pg_ev_ending": "Završava", - "pg_ev_running": "U toku", - "pg_group_advanced": "Granični slučajevi", - "pg_group_detection": "Okidači detekcije", - "pg_group_timing": "Pravila vremena", - "pg_idle": "Neaktivan", - "pg_last_run": "Posljednje pokretanje: {date}", - "pg_match_score": "Ocjena podudaranja", - "pg_pct_of": "{p}% od {total}", - "pg_poor_match": "Loše podudaranje", - "pg_strong_match": "Snažno podudaranje", - "pg_tile_ambiguous": "Dvosmisleno", - "pg_tile_ambiguous_tip": "Ciklusi s gotovo izjednačenim podudaranjem između dva programa", - "pg_tile_detected": "Detektovano", - "pg_tile_detected_tip": "Ciklusi kod kojih je snaga prešla prag pokretanja dovoljno dugo da se registruje kao rad", - "pg_tile_matched": "Podudareno", - "pg_tile_matched_tip": "Ciklusi ispravno pripisani poznatom programu", - "pg_time_left": "Preostalo vrijeme", - "pg_weak_match": "Slabo podudaranje", - "phase_name": "Ime", - "phase_timeline": "Vremenska linija faza", - "power": "Snaga", - "profile": "Profil", - "profile_index": "indeks profila →", - "profile_name": "Ime profila", - "program": "Program", - "program_tip": "Zamijeni koji profil se poklapa s trenutnim ciklusom. Automatsko otkrivanje omogućava integraciji da automatski odabere najboljeg kandidata. Prikvačite određeni program za prisilno podudaranje kada automatsko otkrivanje nije ispravno ili znate što radi.", - "progress": "Napredak", - "raw_socket": "Sirova utičnica", - "read_only": "Samo za čitanje", - "ref_cycle": "Referentni ciklus (opciono)", - "refresh_interval": "Interval osvježavanja (s)", - "remaining": "Preostalo", - "reminder_every": "Podsjeti svakih (ciklusa)", - "remove_label": "- Ukloni etiketu -", - "rename_profile": "Preimenuj profil", - "replay_duration": "Reprodukcija", - "resulting_profile": "Rezultirajući profil", - "save_mode": "Režim spremanja", - "score": "Rezultat", - "score_breakdown": "Raščlamba rezultata", - "seconds_from_start": "Sekunde od početka", - "select_profile": "Odaberite Profil", - "setting": "Postavka", - "settings_a": "Postavke A (trenutne)", - "settings_a_short": "A", - "settings_advanced": "Napredno", - "settings_b": "Postavke B (test)", - "settings_b_short": "B", - "settings_basic": "Osnovno", - "settings_detail_level": "Nivo detalja postavki", - "settings_overrides": "Zamjene postavki", - "show_debug": "Prikaži karticu za otklanjanje grešaka utakmice uživo na stranici Status (pouzdanje, dvosmislenost, najbolji kandidati)", - "show_expected": "Prikaži očekivani prekrivač krivulje (podudarni profil, narandžasta)", - "show_raw": "Prikaži prekidač sirovih očitanja utičnice u živom grafu snage", - "sparkline": "Trend trajanja posljednjih ciklusa", - "stage2": "Faza 2 – osnovna sličnost", - "stage3": "Faza 3 – DTW", - "stage4": "Faza 4 – slaganje", - "status": "Status", - "tail_trim": "Obrub repa (s)", - "timer_auto_pause": "Automatska pauza", - "timer_min": "min", - "timer_msg_placeholder": "Poruka (opcionalno, {device}/{program}/{minutes})", - "to": "Do", - "ungrouped": "Negrupisano", - "unlabelled": "Neoznačeno", - "unlabelled_paren": "(neoznačeno)", - "warp_path": "Warp putanja", - "input": "Ulaz:", - "start": "Početak", - "end": "Kraj", - "unit_s": "(s)", - "reviewed_on": "pregledano {date}", - "unknown": "Nepoznato", - "quality": "Kvaliteta", - "tags": "Oznake", - "at": "u", - "pct_match_confidence": "{pct}% pouzdanosti podudaranja", - "ha_restarted": "HA ponovo pokrenut", - "from_start": "Od početka", - "to_end": "Do kraja", - "click_to_select": "kliknite za odabir", - "envelope": "Koverta", - "zoom_hint": "skrolajte za zumiranje · dvoklik za resetiranje", - "loading_paren": "(učitavanje…)", - "time_remaining": "~{v} preostalo", - "no_duration": "bez trajanja", - "duration_avg": "~{v}m pros.", - "name_placeholder": "(naziv)", - "n_shown": ", prikazano {n}", - "cycles_title": "Ciklusi ({n})", - "pg_detecting": "Otkrivanje", - "pg_best_marker": "Najbolji: {v}", - "pg_time_left_model": "Preostalo vrijeme (model)", - "pg_time_left_model_tip": "Modelom procijenjeno preostalo vrijeme (procjenitelj faza + mješavina s ML), a ne statičko odbrojavanje", - "phase": "Faza", - "pg_mode_simulate": "Simuliraj", - "pg_mode_history": "Provjeri na historiji", - "pg_mode_sweep": "Ispitivanje", - "pg_ev_detected": "Detektovano", - "pg_ev_match": "Podudaranje potvrđeno", - "pg_ev_match_changed": "Podudaranje promijenjeno", - "pg_ev_ambiguous": "Dvosmisleno", - "pg_ev_unmatched": "Bez podudaranja", - "pg_ev_notify_start": "Obavještenje o početku", - "pg_ev_notify_pre": "Obavještenje o skorom kraju", - "pg_ev_notify_finish": "Obavještenje o završetku", - "pg_ev_notify_milestone": "Obavještenje o prekretnici", - "pg_ev_notify_held": "Obavještenje zadržano (tihi sati)", - "pg_ev_finished": "Završeno", - "pg_ended": "Okončano", - "pg_proj_energy": "Proc. energija", - "pg_alert_overrun": "Produženje", - "pg_alert_underrun": "Skraćenje", - "pg_alert_did_not_finish": "Nije završeno", - "pg_alert_false_end": "Podijeljeno na više ciklusa", - "pg_alert_unmatched": "Bez podudaranja", - "pg_alert_ambiguous": "Dvosmisleno podudaranje", - "pg_alert_energy": "Anomalija energije", - "pg_newly_correct": "novo ispravno", - "pg_regressed": "pogoršano", - "pg_end_timing_changed": "promijenjeno vrijeme kraja", - "pg_vs_current": "u odnosu na trenutno", - "pg_fixed": "popravljeno", - "pg_broke": "pokvareno", - "pg_sweep_param": "Parametar", - "pg_objective": "Cilj", - "pg_steps": "Koraci", - "pg_sweep_2d": "Toplotna karta 2D", - "pg_sweep_param_y": "2. parametar", - "pg_obj_match": "Tačnost podudaranja", - "pg_obj_endtiming": "Tačnost kraja", - "pg_obj_falseend": "Stopa lažnih završetaka", - "pg_obj_overrun": "Odstupanje trajanja", - "pg_obj_ambiguity": "Stopa dvosmislenosti", - "pg_best_combo": "najbolja kombinacija", - "pg_mode_optimize": "Optimiziraj", - "pg_group_matching": "Podudaranje programa", - "pg_zoom_hint": "dvostruki klik poništava zumiranje", - "aria_playground_chart2": "Interaktivni grafikon snage ciklusa: pređite mišem za prikaz vremena/snage, pomjerajte točkić za zumiranje, povucite za pomjeranje", - "pg_alert_timeout_end": "Završeno zbog isteka vremena, a ne na osnovu predviđanja", - "pg_alert_indefinite": "Radio bi beskonačno", - "pg_alert_stress_cap": "Dostignut sigurnosni limit", - "pg_alert_stress_ok": "Otkrivanje mirovanja: ciklus zaustavljen", - "pg_alert_stress_warn": "Potrošnja u mirovanju iznad praga zaustavljanja", - "pg_stress_group": "Test otkrivanja mirovanja", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "Razina mirovanja (W)", - "pg_stress_idle_w_desc": "Zamijeni automatski otkrivenu donju granicu u stanju pripravnosti (ostavi prazno za automatsko otkrivanje).", - "pg_stress_toggle": "Testiraj otkrivanje mirovanja", - "pg_stress_toggle_desc": "Simulira da uređaj ostaje na potrošnji u stanju pripravnosti nakon završetka snimanja -- prikazuje ako i kada WashData zaustavi ciklus.", - "task_pg_history": "Test na historiji", - "task_pg_sweep": "Optimiziraj", - "task_reprocess": "Ponovna obrada", - "task_ml_training": "Učenje", - "eta_secs": "još ~{n} s", - "eta_mins": "još ~{n} min", - "pg_recent_runs": "Nedavna pokretanja", - "pg_load_run": "Ponovo učitaj ovo pokretanje", - "pg_match_confidence": "Pouzdanost podudaranja", - "pg_envelope_fit": "Uklapanje u omotač", - "pg_envelope_fit_tip": "Koliko dobro ciklus ostaje unutar sačuvanog omotača snage ovog profila, drugačiji pogled od pouzdanosti podudaranja.", - "n_imported_note": ", {n} uvezeno", - "enable_online": "Omogući online funkcije", - "store_brand": "Marka uređaja", - "store_model": "Model uređaja", - "anonymous": "Anonimno", - "rate_quality": "Ocijeni kvalitet", - "rate_n": "{n} zvjezdica", - "approved_only": "Samo odobreno", - "adopt_settings": "Prihvati postavke", - "flags": "Oznake", - "include_phase_map": "Uključi mapu faza", - "include_settings": "Uključi postavke", - "show_contributor": "Prikaži doprinositelja", - "task_pg_detail": "Simuliraj ciklus", - "task_split": "Dijeljenje ciklusa", - "task_trim": "Obrezivanje ciklusa", - "task_merge": "Spajanje ciklusa", - "task_rebuild": "Ponovna izgradnja omotača", - "cat_profiles": "Profili (programi)", - "cat_real_cycles": "Ciklusi (historija rada)", - "cat_reference_cycles": "Referentni ciklusi (uvezeni)", - "cat_custom_phases": "Prilagođene faze", - "cat_profile_groups": "Grupe profila", - "cat_settings": "Postavke otkrivanja i prepoznavanja", - "cat_matching_config": "Podešavanje prepoznavanja", - "cat_ml_models": "ML modeli", - "cat_feedback": "Oznake povratnih informacija i pregleda", - "cat_suggestions": "Prijedlozi", - "cat_maintenance_log": "Dnevnik održavanja", - "cat_history_logs": "Dnevnici historije i promjena", - "cat_lifetime_stats": "Ukupni zbirovi", - "cycles_short": "ciklusa", - "import_mode": "Kako kombinovati", - "mode_merge": "Spoji (zadrži moje)", - "mode_replace": "Zamijeni odabrano", - "cycle_destination": "Gdje trebaju ići uvezeni ciklusi?", - "dest_reference": "Referenca (samo oblik)", - "dest_real_history": "Stvarna historija (računa se u statistici)", - "conflict_resolution": "Sukobi naziva", - "conflict_import_copy": "Uvezi kao kopiju", - "conflict_keep_mine": "Zadrži moje", - "conflict_overwrite": "Prepiši" - }, - "log": { - "all_levels": "Svi nivoi", - "all_devices": "Svi uređaji", - "all_components": "Sve komponente", - "search_ph": "Pretraži zapisnike…" - }, - "ml": { - "builtin_models": "● Korišćenje ugrađenih modela", - "fit_fair": "Prihvatljivo", - "fit_good": "Dobro", - "fit_slight": "Lagano", - "fit_strong": "Jaka", - "fit_weak": "Slabo", - "fit_word": "kvaliteta", - "personalized": "● Personalizovano za ovu mašinu", - "better_than_baseline": "{pct}% bolje od osnovne procjene ({metric})", - "trend_improving_tip": "Prilagodba ovog modela se poboljšala u nedavnim ponovnim provjerama.", - "trend_declining_tip": "Prilagodba ovog modela se pogoršala u nedavnim ponovnim provjerama, pregled više ciklusa može mu pomoći da ponovo nauči.", - "trend_steady_tip": "Prilagodba ovog modela je ostala otprilike stabilna u nedavnim ponovnim provjerama.", - "cap_blurb": { - "end": "Prepoznavanje kada je ciklus zaista završen", - "live_match": "Brže prepoznavanje programa koji je u toku", - "quality": "Uočavanje pogrešno prepoznatih ili oštećenih ciklusa", - "remaining_time": "Predviđanje preostalog vremena", - "total_energy": "Predviđanje ukupne potrošnje energije i troškova" - }, - "cap_label": { - "end": "Prepoznavanje kraja ciklusa", - "live_match": "Prepoznavanje programa", - "quality": "Provjera kvaliteta ciklusa", - "remaining_time": "Procjena preostalog vremena", - "total_energy": "Procjena potrošnje energije" - }, - "metric_auc": "AUC {auc} na izdvojenim podacima", - "metric_mae": "greška {model} u odnosu na osnovnu vrijednost {baseline}" - }, - "modal": { - "auto_label": "Ciklusi automatskog označavanja", - "correct_feedback": "Ispravne povratne informacije", - "create_profile": "Kreirajte profil", - "cycle": "Ciklus", - "edit_group": "Uredi grupu profila", - "edit_phase": "Uredi fazu", - "import_config": "Uvoz konfiguracije", - "label_cycle": "Označi ciklus", - "merge_cycles": "Spoji {n} ciklusa", - "new_group": "Nova grupa profila", - "new_phase": "Nova faza", - "process_history_msg": "Ponovo pokrenite uparivanje, osvježite prijedloge, trenirajte ML (ako je omogućeno) i preračunajte zdravlje ciklusa za sve pohranjene cikluse. Ovo može potrajati.", - "process_history_ok": "Obradi", - "process_history_title": "Obradi povijest", - "process_recording": "Snimanje procesa", - "delete_maintenance_msg": "Izbrisati ovaj zapis o održavanju? Ovo se ne može poništiti.", - "delete_maintenance_title": "Izbriši događaj održavanja", - "relabel_cycles": "Ponovo označi {count} ciklusa", - "delete_automation_title": "Izbriši automatizaciju", - "delete_automation_msg": "Izbrisati automatizaciju \"{name}\" iz Home Assistant? Ovo se ne može poništiti.", - "remove_legacy_title": "Ukloni zastarjele akcije", - "remove_legacy_msg": "Ukloniti zastarjele prilagođene akcije? Prestat će se aktivirati na događajima ciklusa. Ovo se ne može poništiti iz panela.", - "discard_recording_title": "Odbaci snimak", - "discard_recording_msg": "Odbaciti sačuvani snimak? Ovo se ne može poništiti.", - "dismiss_all_title": "Odbaci sve zahtjeve za povratnu informaciju", - "dismiss_all_msg": "Odbaciti svih {count} zahtjeva za povratnu informaciju na čekanju?", - "dismiss_all_ok": "Odbaci sve", - "delete_phase_title": "Izbriši fazu", - "delete_phase_msg": "Izbrisati fazu \"{name}\"?", - "clear_debug_title": "Očisti podatke za otklanjanje grešaka", - "clear_debug_msg": "Izbrisati sve pohranjene tragove za otklanjanje grešaka?", - "wipe_all_title": "Obriši sve podatke", - "wipe_all_msg": "⚠️ Ovo trajno briše SVE cikluse i profile. Ovo se ne može poništiti.", - "wipe_all_ok": "Obriši sve", - "force_stop_title": "Prisilno zaustavi ciklus", - "force_stop_msg": "Prisilno zaustaviti aktivni ciklus sada? Ciklus će biti sačuvan kao prekinut.", - "store_import": "Uvezi referentni ciklus", - "store_share": "Podijeli u zajedničku trgovinu", - "store_share_device": "Podijeli postavke uređaja", - "export_select": "Izvoz - odaberi podatke", - "import_wizard": "Uvoz - odaberi podatke" - }, - "msg": { - "appliance_monitor": "Monitor uređaja", - "artifact_dip_detail": "Pao ispod uobičajenog pojasa snage za ~{n}s.", - "artifact_footer": "Istaknuto na grafikonu iznad. To su prolazni artefakti (npr. vrata se otvaraju usred ciklusa), ne nužno problemi.", - "artifact_header": "{n} anomalija otkrivenih tokom ovog ciklusa", - "artifact_pause_detail": "Snaga je pala na gotovo nulu za ~{n}s, a zatim se nastavila – vjerovatno su vrata otvorena sredinom ciklusa ili je ciklus pauziran.", - "artifact_spike_detail": "Prešao iznad uobičajenog pojasa snage za ~{n}s.", - "auto_label_intro": "Dodijelite profile neoznačenim ciklusima čija pouzdanost podudaranja briše prag.", - "automations_intro": "WashData pokreće događaje {start} / {end} i izlaže entitete, pa je obavijesti i radnje najbolje graditi kao normalne automatizacije Home Assistanta. Automatizacije koje koriste ovaj uređaj prikazane su ispod.", - "cleanup_intro": "Svaki označeni ciklus se preklapa. Označite nedostatke i izbrišite da biste očistili profil.", - "clear_debug_hint": "Uklonite pohranjene podatke za otklanjanje grešaka kako biste oslobodili prostor.", - "collecting_data": "Prikupljanje podataka: još {need} ciklusa do početka finog podešavanja ({current}/{min}).", - "compare_overlay_profiles": "Profili preklapanja (slabi)", - "compare_profiles_tip": "Prekrijte druge koverte profila na gornjoj tabeli da vidite koja najbolje odgovara ovom ciklusu.", - "compare_selected_cycles": "Odabrani ciklusi (puni) – prikaži / sakrij", - "consider_new_profile": "Razmislite o kreiranju novog profila.", - "coverage_gap": "nedavni ciklusi nemaju odgovarajući profil ({pct}% od posljednjih 30).", - "coverage_gap_similar_cycles": "Pronađeno {count} sličnih neoznačenih ciklusa – kreirajte profil da počnete s njihovim uparivanjem.", - "cycles_deleted": "Izbrisano ciklusa: {count}", - "enough_data": "Dovoljno podataka za učenje ({current}/{min} ciklusa).", - "export_description": "Odaberite tačno koje profile, cikluse, postavke i ostalo želite izvesti u JSON datoteku ili analizirajte datoteku i uvezite samo željene dijelove.", - "feedback_cycles_pending": "{n} ciklus{s} za pregled", - "feedback_prompt": "Potvrdite da je ispravno, ispravite program ili zanemarite.", - "feedback_relabel_hint": "Ponovno označavanje ovog ciklusa takođe ga rješava.", - "filter_by_profile": "Filtriraj po profilu…", - "group_modal_help": "Grupni programi istog oblika koji se razlikuju po temperaturi/centru (trajanja mogu varirati). Uparivanje boduje grupu kao jednog kandidata, a zatim bira najprikladnijeg člana. Odaberite najmanje 2; prekrivanje pokazuje koliko su slični.", - "group_not_cohesive": "Ovi profili nisu dovoljno slični da bi se pouzdano grupirali, tako da ih uparivanje tretira pojedinačno sve dok ne uklonite izuzetak ili podijelite grupu.", - "group_preview_hint": "Označite 2 ili više članova za pregled i usporedbu krivulja snage.", - "import_intro": "Učitajte izvezeni fajl ili zalijepite JSON korisni učitavanje ispod.", - "legacy_actions_title": "{count} naslijeđena prilagođena radnja još uvijek radi", - "live_chart_loading": "Dijagram snage uživo se pojavljuje kako stignu očitanja.", - "loading": "Učitavanje…", - "loading_curve": "Učitavanje krivulje…", - "loading_settings": "Učitavanje postavki…", - "log_buffer_hint": "Najnovije prvo · baferuje poslednjih 500 ha_washdata zapisa od ponovnog pokretanja · prevucite donju ivicu da promenite veličinu.", - "maintenance_advisory": "Povećanje trajanja/energije može ukazivati ​​da je potrebno održavanje uređaja (npr. uklanjanje kamenca, čišćenje filtera).", - "maintenance_due": "Održavanje dospijeva: {items}", - "maintenance_intro": "Zabilježite servis koji obavljate na ovom uređaju i budite podsjećeni kada svaki zadatak ponovo dospije.", - "maintenance_load_error": "Nije moguće učitati podatke o održavanju: {error}", - "maintenance_requires_access": "Održavanje i izvoz/uvoz zahtijevaju pun pristup.", - "manual_duration_hint": "Prosječna/očekivana dužina ciklusa profila, koja se koristi za procjene preostalog vremena. Uredite da biste ga postavili; ostavljanje nepromijenjenog zadržava trenutnu vrijednost.", - "matching_tuning_intro": "Prilikom učenja, WashData također prilagođava koliko usklađivanje programa teži obliku u odnosu na trajanje i energiju.", - "merge_intro": "Odabrani ciklusi se kombinuju u jedan (hronološki red; praznine popunjene sa 0 W). Odaberite rezultirajući profil.", - "ml_intro": "WashData se isporučuje sa pametnim modelima koji rade bez upotrebe.", - "ml_learned_intro": "Modeli fino prilagođeni ovoj mašini.", - "ml_loading": "učitavanje ML-a…", - "ml_settings_intro": "Dva nezavisna prekidača: jedan primenjuje modele dok ciklus traje, drugi omogućava WashData da ih fino podesi prema vašoj mašini tokom vremena.", - "name_first_program": "Imate dovoljno ciklusa – imenujte svoj prvi program da započnete podudaranje.", - "near_duplicate_cluster": "otkriven skoro duplirani klaster profila. Grupisanje omogućava pouzdano uparivanje biranja između sličnih (npr. isti program na različitoj temperaturi/centrifikaciji).", - "no_cycles_match": "Nijedan ciklus ne odgovara trenutnom filteru.", - "no_cycles_profile": "Nema ciklusa za ovaj profil.", - "no_cycles_selected": "Prvo odaberite barem jedan ciklus.", - "no_cycles_yet": "Još uvijek nema zabilježenih ciklusa.", - "no_device_selected": "Nije odabran nijedan uređaj.", - "no_devices": "Još nema konfiguriranih uređaja WashData.", - "no_envelope": "Još nema koverte - obnovite nakon ciklusa označavanja.", - "no_envelope_overlay": "Nema dostupne koverte za preklapanje.", - "no_fine_tuned": "Još ništa fino podešeno – WashData koristi svoje ugrađene modele.", - "no_logs": "Još uvijek nema memorisanih zapisa dnevnika.", - "no_maintenance": "Održavanje još nije zabilježeno.", - "no_match_yet": "Još nema pokušaja podudaranja - ovo se popunjava tokom ciklusa trčanja.", - "no_other_users": "Nisu pronađeni drugi korisnici Home Assistant.", - "no_phases": "Nema definisanih faza.", - "no_phases_assigned": "Nema dodijeljenih faza.", - "no_profiles_compare": "Nema profila za poređenje.", - "no_profiles_overlay": "Nema profila za preklapanje.", - "no_profiles_yet": "Još nema profila. Kreirajte jedan iz označenog ciklusa.", - "no_profiles_yet_short": "Još nema profila.", - "no_settings_match": "Nijedna postavka ne odgovara \"{q}\"", - "no_split_points": "Još nema podijeljenih bodova.", - "no_suggestions": "Nema aktivnih prijedloga.", - "notify_services_hint": "Koristite ID-ove servisa {entity} (odvojene zarezima za više). Varijable predloška: {vars}.", - "old_actions_warning": "Konfigurisano sa starim uređivačem akcija (sada uklonjeno). I dalje se aktiviraju na događaje ciklusa, ali se više ne mogu uređivati ​​ovdje. Pretvorite ih u normalnu automatizaciju ili ih uklonite.", - "onboarding_progress": "{n} / 3 ciklusa promatrano", - "onboarding_watching": "Pustite uređaj da radi normalno – WashData prati. Nakon 3 ciklusa počinje podudaranje programa.", - "pending_feedback": "Čeka se povratna informacija o detekciji", - "performance_trend": "Trend performansi ({n} ciklusa)", - "pg_analysis_empty": "Učitajte ciklus da vidite analizu podudaranja.", - "pg_apply_confirm": "Primijeniti najbolju vrijednost: {label} = {value}?", - "pg_canvas_empty": "Odaberite ciklus iznad, zatim pritisnite „Učitaj“ da vidite njegovu krivu snage.", - "pg_chart_caption": "Stopa detekcije/podudaranja po vrijednostima {param}", - "pg_match_rate": "{pct}% podudaranja na {total} ciklusa", - "pg_restart_note": "Ponovo pokrenite Home Assistant da omogućite alate za simulaciju.", - "pg_sim_progress": "{done} / {total} ciklusa", - "pg_starting": "Pokretanje…", - "pg_stress_synthetic": "simulacija mirovanja počinje ovdje", - "pg_sweep_intro": "Šta ako bi {param} bio drugačiji? Testirajte {steps} vrijednosti na vaših posljednjih {cycles} ciklusa da pronađete postavku pri kojoj se najviše ciklusa ispravno podudara.", - "pg_sweep_step": "Korak {done} / {total}", - "pg_undetected": "{n} neotkrivenih ciklusa", - "pg_verdict_bad": "Zahtijeva pažnju: mnogi ciklusi ostaju neotkriveni.", - "pg_verdict_good": "Dobro podešeno: većina ciklusa se ispravno prepoznaje i podudara.", - "pg_verdict_ok": "Prihvatljivo: neki ciklusi su propušteni. Pokušajte smanjiti prag pokretanja.", - "phase_catalog_intro": "Imenovani segmenti ciklusa (predpranje, grijanje, centrifuga…). Dodijelite ih profilu sa njegove kontrolne ploče.", - "phase_ranges_intro": "Opsezi faza (minuti od početka ciklusa) preklapaju se na krivulju prosjeka. Uredite vrijednosti za pregled uživo.", - "playground_intro": "Sigurno okruženje za ponovnu reprodukciju prošlih ciklusa s različitim postavkama, poređenje dvije konfiguracije jednu pored druge i pregled kako se ciklus poravnava s profilom. Ništa ovdje ne mijenja vaše aktivne podatke dok to izričito ne primijenite.", - "playground_needs_restart": "Ponovo pokrenite Home Assistant da omogućite alate Testnog okruženja.", - "preferences_admin": "Preference, panel i kontrola pristupa", - "preferences_adv": "Postavke", - "prefs_personal": "Ovo se odnosi samo na vaš račun Home Assistant.", - "process_history_hint": "Ponovo pokrenite uparivanje na svim pohranjenim ciklusima, osvježite prijedloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i preračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.", - "profile_deleted": "Profil izbrisan", - "profile_poor_health_detail": "Ciklusi koji su dodijeljeni ovom profilu imaju nedosljedne oblike ili nisku pouzdanost. Razmislite o ponovnoj izgradnji omotača ili pregledu označenih ciklusa.", - "profiles_intro": "Kliknite na profil za statistiku, faze i čišćenje. Grupirajte skoro identične programe (isti oblik/trajanje, različita temperatura ili centrifuga) tako da se pouzdano podudaranje bira između njih.", - "rbac_hint": "Kada je isključeno, svaki korisnik Home Assistant-a ima puni pristup (podrazumevano). Administratori uvijek imaju pun pristup i mogu upravljati svima.", - "recent_logs": "Nedavni zapisi ha_washdata", - "recording_in_progress": "Snimanje je u toku", - "reminders_intro": "Prikaži podsjetnik u panelu toliko ciklusa nakon posljednjeg servisa. Ostavite prazno ili 0 da isključite podsjetnik.", - "restart_gap_footer": "Istaknuto na grafikonu. Podaci o snazi nedostaju za ove intervale; uparivanje je koristilo samo stvarne očitavanja.", - "restart_gap_header": "{n} HA restart praznina tokom ovog ciklusa", - "restart_gap_item": "{dur} praznina", - "review_confirm_help": "Potvrdite da li je ovaj ciklus ispravno detektovan. Vaše recenzije obučavaju model na vašoj mašini - što više ciklusa potvrdite, bolje se podudaraju i ocjenjuju zdravlje. Dovoljno je brzo dobro/loše.", - "review_in_settings": "Pregledajte u Postavkama", - "review_notes_placeholder": "Bilješke (opcionalno)", - "review_notes_tip": "Bilješke u slobodnom tekstu za vlastitu referencu. Ne koristi se za uparivanje ili obuku.", - "review_profile_tip": "Program ovog ciklusa je označen kao. Ako je program koji je automatski detektovan bio pogrešan, ispravite to ovdje - označavanje uči podudaranje za buduće cikluse.", - "review_quality_tip": "Koliko je čist ovaj ciklus. Dobar = primjer iz udžbenika ovog programa; Loše = otkriveno, ali bučno ili netipično; Neupotrebljivo = pogrešno otkriveno (spojeno, skraćeno ili lažno). Upravlja ocjenu zdravlja i koji ciklusi su dozvoljeni za obuku modela.", - "review_recorded_tip": "Označite ovo kao ručno odabran referentni ciklus za njegov program - ista uloga kao i ručno snimljeni ciklus. Referentni ciklusi se uvijek čuvaju, postavljaju podudarni predložak i nikada se ne ispuštaju čišćenjem. (Ovo je \"zlatna\"/snimljena zastava; obje su ista stvar.)", - "review_tags_tip": "Opcione zastavice koje opisuju šta je pošlo po zlu s ovim ciklusom, tako da obuka i čišćenje mogu to objasniti.", - "review_to_cycles": "Otvorite red za pregled ciklusa", - "saving_triggers_reload": "Spremanje pokreće ponovno učitavanje integracije. HA entiteti se mogu nakratko prikazati kao nedostupni.", - "search_placeholder": "Postavke pretraživanja…", - "see_recorder": "Pogledajte widget snimača ispod", - "setting_changed": "Promijenjeno sa {old} na {new} dana {date}", - "settings_basic_note": "Prikazuju se osnovne postavke. Prebacite na Napredno za potpunu listu.", - "shape_drift_advisory": "⚠ Drift oblika", - "shape_drift_detail": "Obrazac snage za ovaj profil je promijenjen tokom vremena – mogući habanje uređaja ili potrebno održavanje (npr. uklanjanje kamenca, čišćenje filtera).", - "show_all_settings": "Prikaži sve postavke", - "showing_suggestions": "Prikazana je postavka {count} s prijedlozima.", - "split_intro": "Kliknite na grafikon da biste dodali ili uklonili tačku razdvajanja, ili automatsko otkrivanje po prazninama u mirovanju. Svaki rezultujući segment može dobiti svoj profil.", - "storage_diagnostics": "Statistika pohrane, održavanje, izvoz/uvoz", - "sug_staged": "Postavljeno {key} = {val}. Sačuvajte za primjenu.", - "toast_auto_detect_enabled": "Automatsko prepoznavanje omogućeno", - "toast_auto_label_complete": "Automatsko označavanje završeno", - "toast_auto_label_failed": "Automatsko označavanje neuspješno: {error}", - "toast_automation_failed": "Nije moguće kreirati automatizaciju: {error}", - "toast_automation_migrated": "Radnje premještene u automatizaciju; otvaranje uređivača", - "toast_convert_failed": "Konverzija neuspješna: {error}", - "toast_create_failed": "Kreiranje neuspješno: {error}", - "toast_delete_failed": "Brisanje neuspješno: {error}", - "toast_error": "Greška: {error}", - "toast_failed": "Neuspješno: {error}", - "toast_force_stop_failed": "Prisilno zaustavljanje neuspješno: {error}", - "toast_name_required": "Naziv je obavezan", - "toast_no_automation": "Ovdje nije moguće kreirati automatizaciju", - "toast_profile_name_required": "Naziv profila je obavezan", - "toast_program_set": "Program postavljen: {program}", - "toast_rebuild_failed": "Obnova neuspješna: {error}", - "toast_resume_failed": "Nastavak neuspješan: {error}", - "toast_revert_failed": "Povrat neuspješan: {error}", - "toast_reverted": "{key} vraćeno", - "toast_save_failed": "Snimanje neuspješno: {error}", - "trend_duration_longer": "Trajanje u trendu duže ({pct}%/ciklus) – nedavno prosječno {avg}", - "trend_duration_shorter": "Trajanje trenda kraće ({pct}%/ciklus) – nedavno prosječno {avg}", - "trend_energy_down": "Opadanje energije ({pct}%/ciklus)", - "trend_energy_up": "Energetski trend porasta ({pct}%/ciklus) – nedavni prosjek {avg}", - "trim_intro": "Prevucite crvene ručke ili unesite vrijednosti. Sve van prozora je uklonjeno.", - "tuning_suggestions_available": "{count} prijedlog podešavanja dostupan je iz posmatranih ciklusa. Pojavljuju se pored relevantnih polja.", - "unsure_detected_prefix": "WashData nije siguran da je otkriven", - "updated": "Ažurirano", - "warmup_badge": "Još uvijek uči ({done}/{needed} ciklusa)", - "warmup_detail": "Ovom profilu je potrebno {needed} označenih ciklusa prije nego što počne automatsko uparivanje. Svaki potvrđeni ciklus pomaže učenju.", - "wipe_history_warning": "Trajno obrišite sve cikluse i profile. Ne može se poništiti.", - "compare_overlay_tip": "Preklopite naučene koverte profila da vidite na koji program podsjeća svaki ciklus.", - "duration_trend_up_tip": "Trajanje raste ({pct}%/ciklus)", - "duration_trend_down_tip": "Trajanje pada ({pct}%/ciklus)", - "energy_trend_up_tip": "Energija raste ({pct}%/ciklus)", - "energy_trend_down_tip": "Energija pada ({pct}%/ciklus)", - "performance_trending": "Trend performansi", - "pg_select_cycle_hint": "Odaberite ciklus i kliknite ↺ za učitavanje", - "pg_sweep_progress": "Korak {done} / {total}", - "pg_analysis_hint": "Odaberite ciklus i kliknite ↺ za učitavanje analize.", - "diagnostics_load_failed": "Nije moguće učitati dijagnostiku: {error}", - "manual_duration_ref_hint": "Koristi se samo kada nije odabran referentni ciklus. Referentni ciklus postavlja trajanje prema vlastitoj dužini.", - "toast_convert_rolled_back": "Konverzija nije uspjela i poništena je (nije ostala nijedna automatizacija): {error}", - "toast_convert_orphan": "Automatizacija je kreirana, ali brisanje starih radnji nije uspjelo. Nemojte pokušavati ponovo: ručno uklonite stare radnje kako biste izbjegli dupliranu automatizaciju.", - "advisory_duration_trend_up": "Ciklusi programa '{name}' postaju sve duži (otprilike +{pct}% po ciklusu). Ako se ponašanje uređaja promijenilo, ponovo snimite ili obnovite ovaj profil.", - "advisory_energy_trend_up": "Program '{name}' troši sve više energije (otprilike +{pct}% po ciklusu) - vrijedi provjeriti uređaj ako je to neočekivano.", - "advisory_poor_health": "Profil '{name}' ima nisku ocjenu podudaranja - njegovi noviji ciklusi znatno variraju ili se slabo podudaraju. Pregledajte njegove cikluse ili ponovo snimite profil kako bi prepoznavanje i procjene vremena ostali tačni.", - "advisory_shape_drift": "Profil '{name}' je znatno odstupio od svog prvobitnog oblika potrošnje snage. Uređaj je možda vremenom promijenio ponašanje (npr. kamenac, habanje). Razmislite o ponovnom snimanju ovog profila sa novijim ciklusima.", - "advisory_shape_drift_corr": "Profil '{name}' je znatno odstupio od svog prvobitnog oblika potrošnje snage (korelacija {corr}). Uređaj je možda vremenom promijenio ponašanje (npr. kamenac, habanje). Razmislite o ponovnom snimanju ovog profila sa novijim ciklusima.", - "pg_no_alerts": "U ovom pokretanju nisu otkriveni problemi.", - "pg_override_active": "Koriste se vaše izmijenjene postavke umjesto trenutnih", - "pg_history_intro": "Ponovo reproducirajte svoje nedavne cikluse kroz stvarni detektor i mehanizam podudaranja. Prvo izmijenite postavku detekcije u načinu Simuliraj da biste ovdje vidjeli poređenje prije/poslije.", - "pg_history_empty": "Pritisnite Pokreni za reprodukciju svojih ciklusa.", - "pg_history_summary": "{detected}/{total} detektovano · {correct} ispravno podudareno", - "pg_sweep_no_metric": "Nedovoljno podataka za ocjenu ovog cilja.", - "pg_sweep_intro2": "Pronađite postavku koja najbolje ispunjava cilj za vaše nedavne cikluse. Ništa se neće promijeniti dok je ne primijenite.", - "pg_running_history": "Ponovno izvođenje vaših ciklusa…", - "pg_running_sweep": "Ispitivanje vrijednosti kroz sve vaše cikluse…", - "pg_row_load_hint": "Učitaj ovaj ciklus u grafikon iznad", - "pg_history_intro2": "Ponovo izvedite svoje nedavne cikluse kroz stvarni detektor i modul za podudaranje s postavkama iznad. Kliknite bilo koji red da učitate taj ciklus u grafikon; izmijenite postavku da vidite poređenje prije i poslije.", - "pg_simulating": "Simuliranje ciklusa…", - "pg_canvas_empty2": "Odaberite ciklus iznad i pritisnite Pokreni da ga simulirate. Zatim pređite mišem za prikaz vrijednosti, pomjerajte točkić za zumiranje i povucite za pomjeranje.", - "pg_apply_settings_confirm": "Sačuvati ovih {n} postavki na ovaj uređaj? {list}", - "pg_stress_terminated_detail": "Ustalilo se na ~{idle}W mirovanja -- ciklus je završio {h} h {m} min kasnije putem {reason}.", - "pg_stress_above_threshold_detail": "Potrošnja u mirovanju ~{idle}W jednaka je ili viša od stvarnog praga zaustavljanja ({stop}W) -- ciklus nikad nije zabilježen kao miran. Za ispravku povećajte stop_threshold_w.", - "pg_stress_hit_cap_detail": "Ciklus je radio {h} h {m} min bez zaustavljanja -- prisilno zaustavljen sigurnosnim limitom. Potrošnja u mirovanju {idle}W u odnosu na prag zaustavljanja {stop}W.", - "no_logs_match": "Nijedan zapis dnevnika ne odgovara ovim filterima.", - "pg_analysis_hint2": "Odaberite ciklus i pritisnite Pokreni za učitavanje analize podudaranja.", - "pg_analysis_empty2": "Pritisnite Pokreni za prikaz analize podudaranja.", - "imported_readonly": "Uvezeno iz zajedničke trgovine. Prikazano za referencu i podudaranje. Ne broji se u vašu statistiku i ne može se uređivati.", - "merge_no_imports": "Uvezene snimke ne mogu se spojiti sa stvarnim ciklusom. Poništite njihov odabir da biste ih spojili.", - "store_enable_hint": "Omogućite online funkcije u Postavkama da biste mogli pregledavati i uvoziti referentne cikluse zajednice.", - "online_intro": "Dijelite i preuzimajte referentne cikluse s drugim korisnicima WashData. Sve online funkcije su dobrovoljne i podrazumijevano isključene.", - "store_share_intro": "Otpremite ovaj referentni ciklus kako bi ga mogli koristiti drugi s istim uređajem. Pregleda se prije nego što postane javno dostupan.", - "online_intro_global": "Pregledavajte i dijelite referentne snimke s drugim korisnicima WashData te potvrđujte unose uređaja. Jedna veza vrijedi za cijelu vašu WashData integraciju; marka i model uređaja postavljaju se za svaki uređaj u odjeljku Osnovno. Sve online funkcije su dobrovoljne i podrazumijevano isključene.", - "online_unavailable": "Online funkcije nisu dostupne na ovom serveru.", - "store_picker_offline": "Omogućite online funkcije u zupčaniku postavki da biste birali iz kataloga zajednice.", - "pick_brand_first": "Prvo odaberite marku uređaja.", - "model_not_found": "Još nije u katalogu.", - "connect_to_confirm": "Povežite se u zupčaniku postavki da biste potvrdili ili ocijenili.", - "adopt_settings_hint": "Primijeni postavke otkrivanja i uspoređivanja dijeljenog uređaja na ovaj uređaj", - "include_settings_hint": "Uključi pragove otkrivanja, težine uspoređivanja i ostale parametre u dijeljeni paket", - "onboard_download": "Preuzmi gotove postavke iz prodavnice zajednice", - "share_consent": "Dijelite stvarne podatke sa svog uređaja. Ne dijelite ako su vaši obrasci korištenja privatni.", - "share_device_none": "Još nema postavljenih uređaja. Prvo dodajte uređaj.", - "share_guideline_naming": "Koristite jasna imena programa (npr. 'Cotton 40', 'Eco 60') kako bi ih drugi mogli prepoznati", - "share_guideline_quality": "Dijelite samo profile sa ⭐ referentnim ciklusima ili najmanje {n} potvrđenih pokretanja", - "share_guideline_review": "Pregledajte profile prije dijeljenja -- uklonite one koji izgledaju pogrešno", - "share_guidelines_title": "Prije dijeljenja", - "store_download_device_intro": "Preuzmite postavke uređaja iz zajednice i primijenite ih na novi ili postojeći uređaj", - "store_share_device_intro": "Podijelite programe svog uređaja (profile + referentne cikluse) sa zajednicom. Postavke su opcione.", - "share_profile_no_cycles": "Profil '{p}' nema ⭐ referentnih ciklusa -- bit će preskočen osim ako nemate {n}+ potvrđenih pokretanja", - "advisory_phase_inconsistent": "Čini se da '{name}' miješa različite programe ili temperature - njegovi ciklusi se griju vrlo različito dugo. Podjela na zasebne profile (npr. po temperaturi) poboljšat će podudaranje i procjene vremena.", - "advisory_phase_inconsistent_title": "⚠ Možda pomiješani programi", - "export_select_intro": "Označite tačno šta treba uključiti. Odabir profila bez njihovih ciklusa i dalje izvozi prepoznatljiv program (njegov naučeni oblik prenosi se s njim).", - "import_analyze_hint": "Učitajte izvezenu datoteku (ili zalijepite njen JSON). WashData je analizira i tačno prikazuje šta se može uvesti prije nego što se išta promijeni.", - "analyzing": "Analiziranje…", - "device_type_mismatch_warn": "Ovaj izvoz je s druge vrste uređaja ({src} vs {local}). Programe i cikluse i dalje je moguće uvesti kao referentne podatke, ali postavke specifične za uređaj i uvoz stvarne historije su onemogućeni.", - "merge_hint": "Uvezene stavke se dodaju; ništa lokalno se ne gubi. Sukobi naziva rješavaju se u nastavku.", - "replace_warn": "Svaka označena kategorija briše se i zamjenjuje podacima iz datoteke. Neoznačene kategorije ostaju nepromijenjene.", - "dest_reference_hint": "Uvezeni ciklusi samo poboljšavaju prepoznavanje programa i nikada ne utiču na statistiku potrošnje/energije.", - "dest_real_history_hint": "Uvezeni ciklusi računaju se kao vlastita historija ovog uređaja i doprinose statistici energije/potrošnje. Koristite pri premještanju jednog uređaja na novu instalaciju." - }, - "phase_desc": { - "anti_crease": "Povremena kratka spuštanja nakon završetka za smanjenje bora.", - "anti_wrinkle": "Periodično prevrtanje nakon ciklusa za smanjenje bora.", - "cool_down": "Vrtanje bez grijanja blizu kraja ciklusa.", - "drain_and_switch": "Period prijelaza sa pranja na način sušenja.", - "dry": "Faza sušenja pomoću grijača i/ili preostale topline.", - "drying": "Glavni period grijanja.", - "heat_up": "Početno zagrijavanje grijača prije početka potpunog sušenja.", - "pre_rinse": "Prvo prskanje prije pranja deterdžentom.", - "pre_wash": "Prvo namakanje ili predtretman prije glavnog pranja.", - "rinse": "Faza ispiranja čistom vodom. Ova faza se može ponoviti više puta.", - "sanitize": "Faza čišćenja na visokim temperaturama za programe dezinfekcije.", - "sensor_check": "Kratka pauza niske snage dok se mjeri suhoća.", - "soak": "Razdoblje namakanja niske aktivnosti između aktivnih faza pranja.", - "soak_dw": "Produženi period namakanja za teška tla.", - "spin": "Ekstrakcija velike brzine za uklanjanje vode iz tereta.", - "spin_wd": "Ekstrakcija velikom brzinom prije prijelaza na sušenje.", - "wash": "Glavni ciklus pranja sa pomicanjem bubnja i opcionim grijanjem.", - "wash_dw": "Glavni deterdžent za pranje sa grijanjem." - }, - "placeholder": { - "add": "dodaj…", - "group_name": "npr. Pamuk 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "dodaj servis obavještavanja…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "dodaj osobu…", - "phase_name": "npr. Pranje", - "profile_name": "npr. Pamuk 40°C", - "maintenance_notes": "npr. zamijenjen filter, očišćena brtva vrata", - "store_brand": "npr. Bosch", - "store_model": "npr. WAT28401" - }, - "pref": { - "date_absolute": "Apsolutno (npr. 14:32 2. jula)", - "date_relative": "Relativno (npr. prije 2 sata)", - "lang_auto": "Sistemski podrazumijevani ({lang})", - "lang_en": "Engleski", - "use_panel_default": "(podrazumijevano ploče)" - }, - "quality": { - "bad": "Loše", - "good": "Dobro", - "unusable": "Neupotrebljivo" - }, - "section": { - "anti_wrinkle": { - "intro": "Mod anti-gužvanja/anti-nabora otkriva impulse bubnjevanja niske snage nakon glavne faze i drži ih vezane za završeni ciklus.", - "label": "Anti-gužvanje" - }, - "basic": { - "intro": "Osnovi identitet i osnove koje većina postavki treba.", - "label": "Osnovno" - }, - "delay": { - "intro": "Detekcija odloženog starta prepoznaje kada je uređaj uključen ali još nije počeo ciklus.", - "label": "Odloženi start" - }, - "detection": { - "intro": "Kako se ciklus otkriva kao pokrenuti, aktivni i završeni.", - "label": "Detekcija" - }, - "matching": { - "intro": "Kako se završeni ciklusi podudaraju s naučenim profilima i označavaju.", - "label": "Podudaranje" - }, - "ml_training": { - "intro": "Raspored ponovne obuke strojnog učenja na uređaju i postavke podataka.", - "label": "ML obuka" - }, - "notifications": { - "intro": "Kada i kako dobivate obavijesti o događajima ciklusa.", - "label": "Obavijesti" - }, - "timing": { - "intro": "Pozadinski ritam, offline čuvar i domaćinstvo.", - "label": "Tajming i čuvar" - }, - "triggers": { - "intro": "Opcioni vanjski signali: okidač kraja, senzor vrata, prekidač za pauzu i podsjetnik za istovar.", - "label": "Okidači i vrata" - }, - "phase_eta": { - "label": "Preostalo vrijeme", - "intro": "Preostalo vrijeme koje uzima u obzir faze, za uređaje čija dužina ciklusa ovisi o temperaturi ili centrifugi." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "Prepoznajte kratke impulse male snage koje sušilica emituje nakon glavne faze zagrijavanja i držite ih priključene na završeni ciklus umjesto da ih čitate kao nove cikluse.", - "label": "Omogućiti detekciju anti-gužvanja" - }, - "anti_wrinkle_exit_power": { - "doc": "Snaga mora pasti ispod ove između impulsa da bi režim protiv bora ostao aktivan.", - "label": "Prag izlazne snage" - }, - "anti_wrinkle_idle_timeout": { - "doc": "Koliko dugo mašina smije ostati mirna između dva impulsa bubnja prije nego što se režim anti-gužvanja završi. Postavite ga iznad najdužeg razmaka koji vaša sušilica ostavlja između impulsa, inače se svaki naredni impuls čita kao lažni početak.", - "label": "Maksimalni razmak između impulsa" - }, - "anti_wrinkle_max_duration": { - "doc": "Pulsevi duži od ovog tretiraju se kao pravi ciklus, a ne kao nalet protiv bora.", - "label": "Maksimalno trajanje" - }, - "anti_wrinkle_max_power": { - "doc": "Puls iznad ove snage tretira se kao pravi novi ciklus, a ne kao protiv bora. Postavite tik iznad snage impulsa prevrtanja.", - "label": "Maks snaga anti-gužvanja" - }, - "auto_label_confidence": { - "doc": "Ako je rezultat meča na kraju ciklusa na ili iznad ovog, program se automatski označava bez ikakvog upita za potvrdu. Podignite ga da zahtijeva veću sigurnost prije automatskog označavanja; snizite ga da više automatizujete. Radi u kombinaciji sa Learning Confidence ispod njega.", - "label": "Pouzdanost automatskog označavanja" - }, - "auto_maintenance": { - "doc": "Pokrenite noćno održavanje: obnovite omote profila, ponovo izračunajte zdravlje ciklusa, smanjite tragove otklanjanja grešaka i zadržite najnovije cikluse.", - "label": "Automatsko održavanje (noćno čišćenje)" - }, - "completion_min_seconds": { - "doc": "Ciklusi kraći od ovoga se odbacuju kao ciklusi duhova (probni radovi, otvaranje vrata da se doda čarapa).", - "label": "Min trajanje ciklusa" - }, - "delay_confirm_seconds": { - "doc": "Napajanje mora ostati u opsegu pripravnosti ovoliko dugo prije nego što se uređaj tretira kao da čeka da se pokrene, a ne da radi.", - "label": "Sekunde potvrde" - }, - "delay_start_detect_enabled": { - "doc": "Otkrijte kada je uređaj uključen i čeka (odgođeni početak/pripravnost), ali nije započeo svoj ciklus, tako da se povlačenje u pripravno stanje ne smatra greškom u radu.", - "label": "Omogućiti detekciju odloženog starta" - }, - "delay_timeout_hours": { - "doc": "Prestanite čekati u režimu odgođenog pokretanja nakon ovoliko sati i vratite se u stanje mirovanja, tako da mašina koja je ostala uključena, ali nikada nije pokrenuta, ne čeka zauvijek.", - "label": "Sati timeouta" - }, - "device_type": { - "doc": "Klasa aparata. Postavlja razumne zadane vrijednosti detekcije (pragovi, kašnjenje isključenja, rukovanje na kraju) podešene za taj tip uređaja; promijenite ga samo ako je uređaj prvobitno podešen kao pogrešan tip.", - "label": "Tip uređaja" - }, - "door_sensor_entity": { - "doc": "Opcioni binarni senzor vrata. Koristi se za otkrivanje kada je uređaj otvoren/istovaren nakon ciklusa.", - "label": "Entitet senzora vrata" - }, - "duration_tolerance": { - "doc": "Tolerancija za procjene preostalog vremena (povratne informacije učenja, ne podudaranje). Ako je stvarno trajanje unutar +/-X% procjene, to se računa kao dobro podudaranje.", - "label": "Tolerancija procjene" - }, - "enable_ml_models": { - "doc": "Dok ciklus traje, pustite modele da preciziraju rezultate uživo: stabilniju procjenu preostalog vremena i energije/troškova, i zaštitu od preranog zaustavljanja pri detekciji kraja (može samo odgoditi završetak, nikada ne završiti ranije, i ograničen je). Koristi vaše fino podešene modele kada su dostupni, inače ugrađene. Isključeno = samo klasična logika zasnovana na napajanju (i dalje pouzdana).", - "label": "Primijeniti pametne modele tokom ciklusa" - }, - "end_energy_threshold": { - "doc": "Tokom odbrojavanja sa kašnjenjem, akumulirana energija (vati x vrijeme) se upoređuje sa ovim pragom. Ako se prekorači, odbrojavanje se poništava - držeći klupe protiv gužvanja i repove za sušenje u mašini za pranje sudova pričvršćene za ciklus umesto da ih skrate. Podignite ga ako se ciklusi završe prerano tokom hlađenja; snizite ako je detekcija spora.", - "label": "Završna energija" - }, - "end_repeat_count": { - "doc": "Broj uzastopnih očitavanja ispod praga zaustavljanja potrebnih prije završetka ciklusa. 1 je u redu za većinu utikača. Povećajte na 2-3 ako vaš pametni utikač povremeno prijavi uzorak lažne nule usred ciklusa i vaši ciklusi se završavaju prerano.", - "label": "Broj ponavljanja kraja" - }, - "energy_price_entity": { - "doc": "Senzor sa trenutnom cijenom električne energije po kWh (npr. dinamička tarifa). Ima prednost nad statičnom cijenom ispod. Svaki ciklus zamrzava cijenu koja je na snazi ​​kada se završi.", - "label": "Entitet cijene energije" - }, - "energy_price_static": { - "doc": "Fiksna cijena po kWh koja se koristi za brojke troškova kada nije postavljen nijedan entitet cijene uživo iznad.", - "label": "Statična cijena energije (po kWh)" - }, - "energy_sensor": { - "doc": "Opcionalno kumulativno brojilo energije (total_increasing kWh/Wh, npr. vlastito brojilo ukupne potrošnje utičnice). Kada je postavljeno, energija prijavljena za svaki ciklus uzima se iz razlike očitanja ovog brojila između početka i kraja, čime se izbjegava podbrojavanje koje nastaje integriranjem sporo izvještavajućeg senzora snage. Vraća se na integriranu vrijednost ako očitanje nedostaje, njegova jedinica je nepoznata ili razlika nije pozitivna. Ostavite prazno da nastavite integrirati senzor snage.", - "label": "Entitet brojila energije" - }, - "expose_debug_entities": { - "doc": "Objavite dodatne dijagnostičke HA entitete (pouzdanost podudaranja, dvosmislenost, unutrašnje karakteristike stanja). Isključeno održava listu entiteta čistom za normalnu upotrebu.", - "label": "Izložiti entitete za otklanjanje grešaka" - }, - "external_end_trigger": { - "doc": "Binarni senzor čija promjena stanja označava kraj ciklusa (npr. \"završen\" kontakt uređaja ili integracija pratioca).", - "label": "Entitet vanjskog okidača" - }, - "external_end_trigger_enabled": { - "doc": "Neka vanjski binarni senzor signalizira kraj ciklusa, uz ugrađenu detekciju zasnovanu na snazi.", - "label": "Omogućiti vanjski okidač kraja" - }, - "external_end_trigger_inverted": { - "doc": "Tretirajte isključivanje senzora okidača (a ne UKLJUČENO) kao signal za kraj ciklusa.", - "label": "Invertirati vanjski okidač (okidač pri ISKLJUČIVANJU)" - }, - "learning_confidence": { - "doc": "Ako rezultat podudaranja pada između ovog i Auto-Label Confidence, povratno obavještenje traži od vas da potvrdite identificirani program. Ispod ovog rezultata meč je previše neizvjestan da bi se pojavio. Mora se držati ispod pouzdanosti automatske oznake.", - "label": "Pouzdanost učenja" - }, - "linked_device": { - "doc": "Opcionalno ugniježdite ovaj WashData uređaj ispod drugog uređaja (npr. pametnog priključka) u registar HA uređaja, prikazan kao \"Povezan putem ...\".", - "label": "Grupisati pod uređaj" - }, - "min_off_gap": { - "doc": "Ako se mašina isključi na kraće od ovog vremena, sekvenca uključivanja/isključivanja/uključivanja se tretira kao jedan kontinuirani ciklus. Sprečava podjelu programa namakanja (mašina se isključuje nekoliko minuta usred pranja) u dva odvojena ciklusa. Postavite ga kraćim od razmaka između vaših uzastopnih opterećenja ako želite da se oni računaju kao zasebni ciklusi. Zadane postavke tipa uređaja štite tipičnu pauzu unutar ciklusa za svaki uređaj.", - "label": "Min razmak isključivanja" - }, - "min_power": { - "doc": "Apsolutna minimalna snaga smatra se aktivnom. Očitavanja ispod ovoga se tretiraju kao 0 W (pripravnost), filtrirajući fantomsko opterećenje pametnih utikača i LED dioda u stanju pripravnosti.", - "label": "Minimalna snaga" - }, - "ml_training_enabled": { - "doc": "Periodično proučavajte svoje recenzirane cikluse preko noći i fino prilagodite modele ovoj specifičnoj mašini. Promjena se zadržava samo kada zaista ima bolje rezultate u ciklusima koji se zadržavaju, tako da ovo može samo pomoći ili ostati ista - nikada ne nazadovati.", - "label": "Učiti od ove mašine" - }, - "ml_training_hour": { - "doc": "Lokalni sat u danu (0-23) za fino podešavanje preko noći. Odaberite mirni sat kao što je 2 (02:00).", - "label": "Učiti u satu" - }, - "ml_training_interval_days": { - "doc": "Ponovo provjerite ima li poboljšanja najviše jednom u ovoliko dana.", - "label": "Provjeravati najvjše svakih" - }, - "ml_training_min_cycles": { - "doc": "Pričekajte dok se barem ovoliko ciklusa ne snimi prije finog podešavanja, tako da ima dovoljno za učiti.", - "label": "Ciklusi potrebni prvo" - }, - "name": { - "doc": "Ime za prikaz prikazano na listi HA integracija i registru uređaja.", - "label": "Naziv uređaja" - }, - "no_update_active_timeout": { - "doc": "Ako ne stigne ažuriranje napajanja ovoliko dugo dok radi, pretpostavite da je utikač ispao van mreže i prisilno se zaustavite kako biste izbjegli zombi ciklus. Zadanih 600 s dozvoljava kašnjenje u oblaku ili mreži.", - "label": "Timeout bez ažuriranja" - }, - "notify_before_end_minutes": { - "doc": "Pošaljite upozorenje Gotovo kada procijenjeno preostalo vrijeme padne ispod ovog. 0 to onemogućava.", - "label": "Upozorenje pred kraj" - }, - "notify_channel": { - "doc": "Naziv kanala Android obavijesti za početne/uživo poruke (kontrolira zvuk po kanalu i prioritet na mobilnoj aplikaciji). Prazno koristi zadanu prateću aplikaciju.", - "label": "Android kanal (pokretanje/uživo)" - }, - "notify_cycle_timers": { - "doc": "Obavještenja u određenim minutama u ciklusu (npr. za dodavanje omekšivača). Poruka podržava {device}, {program}, {minutes}. Omogućite automatsku pauzu da biste pauzirali u tom trenutku i primili interaktivno obavještenje pomoću gumba Nastavi; nastaviti putem panela, usluge pauze/nastavljanja ili radnje obavještenja.", - "label": "Tajmeri ciklusa" - }, - "notify_finish_channel": { - "doc": "Naziv kanala Android obavještenja za završnu poruku. Blank ponovo koristi početni/uživo kanal.", - "label": "Android kanal (završetak)" - }, - "notify_finish_message": { - "doc": "Tekst poslan kada se ciklus završi. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. {time_finished} i {vs_typical} su ovdje najkorisniji.", - "label": "Poruka završetka" - }, - "notify_finish_services": { - "doc": "notify.* usluge se pozivaju kada se ciklus završi. Dodajte jednu po meti; ostavite prazno da nema obavještenja o završetku.", - "label": "Usluge završetka" - }, - "notify_fire_events": { - "doc": "Također aktivirajte ha_washdata_* događaje na početku/završetku ciklusa kako biste mogli izgraditi vlastite automatizacije.", - "label": "Pokrenuti HA događaje za obavijesti" - }, - "notify_icon": { - "doc": "Opcionalna mdi ikona za obavještenje (npr. mdi:mašina za pranje rublja). Ostavite prazno za zadanu platformu.", - "label": "Ikona obavijesti" - }, - "notify_live_chronometer": { - "doc": "Prikaži tajmer za odbrojavanje koji se ažurira uživo u obavještenju (na platformama koje ga podržavaju) umjesto statične procjene.", - "label": "Koristiti hronometar uživo" - }, - "notify_live_interval_seconds": { - "doc": "Koliko često se obavještenja o napretku uživo osvježavaju dok ciklus traje.", - "label": "Interval ažuriranja uživo" - }, - "notify_live_overrun_percent": { - "doc": "Ako ciklus prijeđe svoju procjenu za više od ovog postotka, pošaljite upozorenje o prekoračenju.", - "label": "Prekoračenje uživo % prije upozorenja" - }, - "notify_live_services": { - "doc": "notify.* usluge pozivaju na ažuriranja napretka uživo dok ciklus traje. Ostavite prazno da onemogućite obavještenja o napretku uživo.", - "label": "Usluge napretka uživo" - }, - "notify_only_when_home": { - "doc": "Obavještenja šaljite samo kada je barem jedna od povezanih osoba (gore) kod kuće.", - "label": "Obavijesti samo dok su kod kuće" - }, - "notify_people": { - "doc": "osoba.* entiteti koje koristi \"Notify Only When Home\" da odluči da li je neko kod kuće.", - "label": "Osobe (za samo dok su kod kuće)" - }, - "notify_pre_complete_message": { - "doc": "Tekst upozorenja prije kraja / skoro gotovo. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Poruka pred završetak" - }, - "notify_reminder_message": { - "doc": "Tekst podsjetnika za još neizvađeno rublje. Prazno koristi ugrađenu zadanu vrijednost. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Poruka podsjetnika" - }, - "notify_start_message": { - "doc": "Tekst poslan kada ciklus započne. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Poruka pokretanja" - }, - "notify_start_services": { - "doc": "notify.* usluge koje se pozivaju kada ciklus započne. Dodajte jedan po meti (telefon, kontrolna tabla, itd.); ostavite prazno da nema obaveštenja o početku.", - "label": "Usluge pokretanja" - }, - "notify_timeout_seconds": { - "doc": "Automatski odbacite obavještenje nakon ovoliko sekundi (na platformama koje ga podržavaju). 0 ga čuva dok se ne odbaci ručno.", - "label": "Automatski odbaci nakon" - }, - "notify_title": { - "doc": "Naslov obavještenja. Varijable šablona: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "Naslov obavijesti" - }, - "notify_unload_delay_minutes": { - "doc": "Nekoliko minuta nakon završetka ciklusa prije slanja podsjetnika \"istovarite mašinu\" koji još uvijek čeka. Postavite 0 da onemogućite podsjetnik.", - "label": "Kašnjenje podsjetnika za istovar" - }, - "off_delay": { - "doc": "Vrijeme čekanja nakon pada struje prije nego što se ciklus proglasi završenim. Ako se napajanje nastavi unutar ovog prozora, ciklus se nastavlja neometano - ovo premošćuje pauze između faza pranja. Mašine za pranje posuđa imaju duge faze sušenja (isključenje na 20-60 min) tako da kašnjenje isključenja mora premašiti to da bi se cijelo pranje+sušilo kao jedan ciklus.", - "label": "Kašnjenje isključivanja" - }, - "pause_cuts_power": { - "doc": "Kada je ciklus pauziran, također isključite Switch Entity ispod. Samo za uređaje čiji se utikač može bezbedno iseći usred ciklusa.", - "label": "Pauza također isključuje napajanje (putem prekidača)" - }, - "power_off_delay": { - "doc": "Koliko dugo snaga mora ostati ispod Praga isključivanja napajanja nakon što se ciklus završi prije nego što se stanje vrati na „Isključeno“. Koristi se samo kada je Prag isključivanja napajanja iznad 0. Provjerava se na pozadinskom ritmu, tako da se efektivno kašnjenje zaokružuje naviše na sljedeći otkucaj isteka stanja.", - "label": "Kašnjenje isključivanja napajanja" - }, - "power_off_threshold_w": { - "doc": "Opciono otkrivanje isključenog stanja na osnovu snage. Kada je iznad 0, nakon što se ciklus završi i snaga ostane ispod ovog nivoa tokom Kašnjenja isključivanja napajanja, mašina se tretira kao isključena i stanje se vraća na „Isključeno“. Ostavite na 0 da onemogućite (zadano). Postavite ga iznad stvarnog nivoa isključenog napajanja, a ispod Praga zaustavljanja i ispod potrošnje vaše mašine u stanju pripravnosti (završeno, ali još uključeno); ako nije ispod Praga zaustavljanja, zanemaruje se. Kada je omogućeno, zamjenjuje Kašnjenje poništavanja napretka za povratak na „Isključeno“, tako da završena mašina ostaje na „Završeno/Čisto“ dok se stvarno ne isključi.", - "label": "Prag isključivanja napajanja" - }, - "power_sensor": { - "doc": "Entitet senzora koji prijavljuje živu snagu u vatima za ovaj uređaj (npr. sensor.washer_power). Sve detekcije ciklusa se zasnivaju na ovom signalu.", - "label": "Senzor snage" - }, - "profile_duration_tolerance": { - "doc": "Opseg +/- oko prosečnog trajanja profila koji se koristi tokom uparivanja. 0,25 znači da profil od 60 minuta odgovara ciklusima od 45-75 minuta.", - "label": "Tolerancija trajanja profila" - }, - "profile_match_interval": { - "doc": "Koliko često pokušavati uparivanje profila tokom ciklusa rada. Podrazumevano 300 s (5 minuta) balansira brzinu detekcije i CPU.", - "label": "Interval podudaranja" - }, - "profile_match_max_duration_ratio": { - "doc": "Maksimalna dužina ciklusa u odnosu na profil. 1.3 znači da ciklus mora biti manji od 130% trajanja profila da bi se podudarao.", - "label": "Maks omjer trajanja" - }, - "profile_match_min_duration_ratio": { - "doc": "Minimalna dužina ciklusa u odnosu na profil. 0,9 znači da ciklus mora biti najmanje 90% trajanja profila da bi se podudarao.", - "label": "Min omjer trajanja" - }, - "profile_match_threshold": { - "doc": "Minimalni rezultat sličnosti (0-1) potreban na kraju ciklusa da bi se prihvatila identifikacija programa. Podignite ga da smanjite pogrešne identifikacije; snizite ga ako se programi vaše mašine ne poklapaju. Zadana vrijednost 0,4 je konzervativna polazna tačka.", - "label": "Prag podudaranja" - }, - "profile_unmatch_threshold": { - "doc": "Ako utakmica u sredini ciklusa uživo padne ispod ovog rezultata, privremena identifikacija se briše. Držite ga malo ispod praga podudaranja tako da kratko smanjenje sličnosti ne bi vratilo ekran na neusporedivo.", - "label": "Prag nepodudaranja" - }, - "progress_reset_delay": { - "doc": "Nakon završetka, držite napredak na 100% ovoliko dugo kako bi Završeno bilo vidljivo na kontrolnoj tabli prije nego što se vratite na stanje mirovanja.", - "label": "Kašnjenje poništavanja napretka" - }, - "pump_stuck_duration": { - "doc": "Sekunde kada pumpa može raditi neprekidno prije nego što bude označena kao da je moguće zaglavljena (pokreće događaj zaglavljena pumpa).", - "label": "Trajanje zaglavljivanja pumpe" - }, - "running_dead_zone": { - "doc": "Nakon što ciklus započne, padovi snage u ovom prozoru se zanemaruju. Mašine za pranje rublja se pune hladnom vodom (pada blizu 0 W prije zagrijavanja) - bez ove zaštite ta faza punjenja izgleda kao završetak ciklusa. Ovo NE preskače podatke: puni trag snage se snima od T=0. Mehanizam za prijedloge mjeri stvarni obrazac pokretanja vašeg stroja i automatski ga određuje.", - "label": "Mrtva zona pri radu" - }, - "sampling_interval": { - "doc": "Očekivano vrijeme između očitavanja senzora - koristi se za veličinu prozora za izglađivanje i pravilno pokretanje odbijanja. Svako ažuriranje senzora se snima bez obzira na ovu vrijednost; kalibrira samo nizvodne proračune. Mehanizam za prijedloge mjeri stvarnu kadencu vašeg senzora iz prošlih ciklusa i automatski ga postavlja.", - "label": "Interval uzorkovanja" - }, - "save_debug_traces": { - "doc": "Sačuvajte puni trag napajanja i odgovarajuće podatke za otklanjanje grešaka za svaki ciklus. Korisno za rješavanje problema, ali povećava veličinu skladišta.", - "label": "Sačuvati tragove otklanjanja grešaka" - }, - "smoothing_window": { - "doc": "Koliko je signal sirove snage izglađen. Niska (2) je odzivna, ali bučna; high (5) izglađuje šiljke, ali dodaje zaostajanje.", - "label": "Prozor izglađivanja" - }, - "start_duration_threshold": { - "doc": "Snaga mora ostati iznad početne granice ovoliko dugo kako bi se potvrdio pravi početak, sprečavajući prekidače za uključivanje/isključivanje u djeliću sekunde da započnu ciklus.", - "label": "Trajanje pokretanja" - }, - "start_energy_threshold": { - "doc": "Energija (snaga x vrijeme) koju uređaj mora utrošiti prije POKRETA. Kratak skok velike snage ima vrlo nisku energiju i zanemaruje se, sprječavajući lažne startove.", - "label": "Početna energija" - }, - "start_threshold_w": { - "doc": "Snaga mora porasti iznad ovog nivoa da potvrdi da je ciklus započeo. Ako ga postavite prenisko, uzrokuje lažno pokretanje iz stanja pripravnosti; propušteni su previsoki i spori programi (hladno punjenje). Mehanizam za prijedloge postavlja ovo tik iznad uočene najniže aktivne snage mašine.", - "label": "Prag pokretanja" - }, - "stop_threshold_w": { - "doc": "Snaga mora pasti ispod ovog nivoa prije nego što počne odbrojavanje odgode isključenja. Postavite ga ispod početnog praga - jaz između njih je histerezni pojas koji sprečava treperenje. Ako su postavljene previsoko, faze male snage (zadržavanje ispiranja, zaštita od gužvanja) lažno pokreću krajnju sekvencu.", - "label": "Prag zaustavljanja" - }, - "switch_entity": { - "doc": "Opcioni prekidač se isključuje u pauzi i ponovo uključuje kada se nastavlja, koristi se zajedno sa \"Pauza takođe prekida napajanje\".", - "label": "Entitet prekidača" - }, - "watchdog_interval": { - "doc": "Koliko često pozadinski nadzornik provjerava zastoje senzora i protekla vremena. Standardno 30 s.", - "label": "Interval čuvara" - }, - "notify_milestone_message": { - "doc": "Poruka za obavijest o prekretnici. Varijable predloška: {device}, {cycle_count}.", - "label": "Poruka o prekretnici" - }, - "notify_milestones": { - "doc": "Zarezima odvojeni brojevi ciklusa koji pokreću jednokratnu obavijest o slavlju kada se dosegnu (npr. 50, 100, 500, 1000). Prazno onemogućava obavijesti o prekretnicama.", - "label": "Prekretnice ciklusa" - }, - "notify_quiet_end_hour": { - "doc": "Kraj prozora ne ometaj (0-23). Zadržane obavijesti se dostavljaju u ovaj sat. Ostavite prazno da onemogućite.", - "label": "Kraj tihih sati" - }, - "notify_quiet_start_hour": { - "doc": "Početak prozora ne ometaj (0-23). Obavijesti o završetku, podsjetnici i obavijesti o čistom rublju koje bi se aktivirale tokom tihih sati zadržavaju se i dostavljaju kada prozor završi. Ostavite prazno da onemogućite. Podržava prozore koji prelaze ponoć (npr. početak 22, kraj 7).", - "label": "Početak tihih sati" - }, - "peak_rate_message": { - "doc": "Opcionalni prilagođeni tekst za savjet o vršnoj tarifi dodan uz obavijest o pokretanju. Varijable predloška: {device}, {price}. Prazno koristi ugrađenu zadanu vrijednost.", - "label": "Poruka o vršnoj tarifi" - }, - "peak_rate_threshold": { - "doc": "Kada ciklus započne i trenutna cijena po kWh je na ovoj vrijednosti ili iznad nje, dodaje savjet o vršnoj tarifi uz obavijest o pokretanju. 0 ili prazno onemogućava savjet.", - "label": "Prag vršne tarife (po kWh)" - }, - "dtw_bandwidth": { - "label": "Tolerancija podudaranja oblika", - "doc": "Koliko modul za podudaranje smije vremenski izobličiti ciklus da odgovara obliku sačuvanog programa. Viša vrijednost podnosi veće varijacije brzine; previsoka riskira podudaranje s pogrešnim programom." - }, - "corr_weight": { - "label": "Težina oblika u odnosu na nivo", - "doc": "Ravnoteža između oblika krive i apsolutnog nivoa snage pri ocjenjivanju podudaranja. Viša vrijednost daje prednost obliku; niža daje prednost slaganju nivoa snage." - }, - "duration_weight": { - "label": "Težina trajanja", - "doc": "Koliko snažno se daje prednost programu čije se tipično trajanje podudara s ovim ciklusom." - }, - "energy_weight": { - "label": "Težina energije", - "doc": "Koliko snažno se daje prednost programu čija se tipična potrošnja energije podudara s ovim ciklusom." - }, - "store_brand": { - "label": "Marka uređaja", - "doc": "Opcionalno. Marka uređaja odabrana iz kataloga zajednice. Koristi se za pronalaženje i dijeljenje odgovarajućih referentnih snimki. Ostavite prazno ako ne koristite online funkcije." - }, - "store_model": { - "label": "Model uređaja", - "doc": "Opcionalno. Model uređaja odabran iz kataloga zajednice nakon što je marka postavljena. Ako vaš model nije na spisku, možete ga dodati u katalog." - }, - "show_contributor": { - "doc": "Prikaži ime doprinositelja na profilima preuzetim iz prodavnice zajednice" - }, - "enable_phase_matching": { - "label": "Preostalo vrijeme prema fazama", - "doc": "Svaki aktivni ciklus dijeli na faze (grijanje, pranje, centrifuga) i raspoređuje preostalo vrijeme po fazama, spojeno s klasičnom procjenom - na početku ciklusa oslanja se na budžet faza, a pri kraju na klasičnu procjenu. To prilagođava odbrojavanje tome koliko se vaš uređaj stvarno grije i radi, što je najuočljivije u prvoj polovini ciklusa. Isključeno = samo klasična procjena. Utječe samo na prikaz preostalog vremena; podudaranje programa i detekcija ciklusa ostaju nepromijenjeni." - }, - "keep_min_score": { - "label": "Min. ocjena podudaranja", - "doc": "Minimalna ocjena sličnosti potrebna kandidatu za ostanak u utrci podudaranja. Zadana vrijednost 0,1 je namjerno blaga - dopušta čak i slabe kandidate i oslanja se na kasnijе faze za pronalazak najboljeg podudaranja. Povećajte za ranije odbacivanje neprobabilnih profila; smanjite za proširenje početnog skupa kandidata." - }, - "dtw_blend": { - "label": "Miješanje deformacije", - "doc": "Koliko DTW ocjena poravnanja zamjenjuje osnovnu ocjenu Faze 2. 0 = koristi samo ocjenu Faze 2, 1 = koristi samo DTW ocjenu, 0,5 (zadano) = jednako miješanje. Povećajte za veće oslanjanje na warp poravnanje kada programi imaju slične nivoe snage ali različite obrasce tajminga." - }, - "dtw_ensemble_w": { - "label": "Miks kombinacije DTW", - "doc": "U kombiniranom DTW načinu (zadanom), težina skaliranog L1 nasuprot derivatnog DTW (DDTW). 1,0 = sve skalirano L1, 0 = sve DDTW, 0,7 = zadano. Skalirana L1 varijanta uspoređuje nivoe snage; derivatna varijanta reagira na promjene snage kroz vrijeme. Kombinirani način spaja oboje." - }, - "dtw_ddtw_scale": { - "label": "Skala derivatne deformacije", - "doc": "Udaljenost polu-zasićenja za ocjenjivanje derivatnim DTW. Ocjena se prepolovi kada je DDTW udaljenost jednaka ovoj vrijednosti. Manje = osjetljivije na razlike u obliku. Zadana vrijednost 30 je kalibrirana za tipične tragove snage kućanskih uređaja. Utječe samo na kombinirani i ddtw DTW način." - }, - "dtw_refine_top_n": { - "label": "Broj preciziranih kandidata", - "doc": "Koliko prvih kandidata Faze 2 DTW ponovo ocjenjuje. DTW je skuplji pa se primjenjuje samo na N najboljih kandidata. Zadano 5. Povećajte (na 7-9) ako ispravni profil ponekad dostigne samo 4. ili 5. mjesto nakon Faze 2 - DTW ga može spasiti. Smanjenje malo ubrzava podudaranje." - }, - "duration_scale": { - "label": "Ostrina trajanja", - "doc": "Oštrina kazne za nepodudaranje trajanja u Fazi 4. Ovo je omjer logaritma pri kojemu se ocjena slaganja prepolovi. Manje = strože: nepodudaranje trajanja više snižava ocjenu. Zadana vrijednost 0,175 odgovara toleranciji trajanja od oko 18% pri polu-težini. Koristite zajedno s Težinom trajanja." - }, - "energy_scale": { - "label": "Ostrina energije", - "doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava ocjenu. Zadana vrijednost 0,25 je namjerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije." - } - }, - "setting_group": { - "auto_labeling": { - "label": "Automatsko označavanje" - }, - "cycle_end": { - "label": "Kraj ciklusa" - }, - "cycle_start": { - "label": "Početak ciklusa" - }, - "cycle_timers": { - "label": "Tajmeri ciklusa" - }, - "data_management": { - "label": "Upravljanje podacima" - }, - "debug": { - "label": "Otklanjanje grešaka" - }, - "dishwasher_end": { - "label": "Kraj mašine za suđe" - }, - "door_pause": { - "label": "Vrata i pauza" - }, - "dtw_refinement": { - "label": "DTW preciziranje" - }, - "duration_gates": { - "label": "Vrata trajanja" - }, - "energy": { - "label": "Energija" - }, - "external_end_trigger": { - "label": "Vanjski okidač kraja" - }, - "housekeeping": { - "label": "Domaćinstvo" - }, - "match_scoring": { - "label": "Bodovanje podudaranja" - }, - "messages": { - "label": "Poruke" - }, - "power_off": { - "label": "Isključivanje napajanja" - }, - "predictive_end": { - "label": "Prediktivni kraj" - }, - "schedule": { - "label": "Raspored" - }, - "services": { - "label": "Usluge" - }, - "signal_processing": { - "label": "Obrada signala" - }, - "thresholds_gap": { - "label": "Pragovi i razmak" - }, - "timing": { - "label": "Tajming" - }, - "unload_reminder": { - "label": "Podsjetnik za istovar" - }, - "watchdog": { - "label": "Čuvar" - }, - "quiet_hours_milestones": { - "label": "Tihi sati i prekretnice" - }, - "device_info": { - "label": "Podaci o uređaju" - }, - "basic_configuration": { - "label": "Osnovna konfiguracija" - } - }, - "status": { - "active": "Aktivan", - "all_statuses": "Svi statusi", - "ambiguous": "Dvosmisleno", - "auto_detect": "Automatsko otkrivanje", - "clear": "Jasno", - "completed": "Završeno", - "fine_tuning": "sada fino podešavanje…", - "force_stopped": "Prisilno zaustavljeno", - "idle": "Neaktivan", - "interrupted": "Prekinut", - "ready": "Spreman za obradu", - "recording": "Snimanje", - "training": "Treniranje…", - "saving": "Čuvanje…", - "rebuilding": "Ponovna izgradnja…", - "analyzing": "Analiziranje…", - "resetting": "Resetovanje…", - "reverting": "Vraćanje…", - "trimming": "Obrezivanje…", - "splitting": "Dijeljenje…", - "deleting": "Brisanje…", - "imported": "Uvezeno" - }, - "suggestion": { - "both_agree": "WashData preporučuje", - "calibrated_label": "Kalibrisano", - "observed_label": "Izmjereno", - "impact": { - "auto_label_confidence": { - "higher": "Manje ciklusa se automatski označava; više ih odlazi na pregled", - "lower": "Više ciklusa se automatski označava; neki mogu biti pogrešno identificirani" - }, - "duration_tolerance": { - "higher": "Prihvata širi raspon trajanja – fleksibilnije podudaranje", - "lower": "Zahtijeva bliže podudaranje trajanja – strože, ali može odbiti neobične cikluse" - }, - "end_energy_threshold": { - "higher": "Zatvara samo cikluse sa značajnom potrošnjom energije", - "lower": "Zatvara i kraće ili manje energetske cikluse" - }, - "end_repeat_count": { - "higher": "Zahtijeva više ponavljanja signala kraja – pouzdanije, malo sporije", - "lower": "Završava nakon manje ponavljanja – brže otkrivanje, veći rizik lažnog završetka" - }, - "learning_confidence": { - "higher": "Uči samo iz visoko pouzdanih podudaranja – sporije, ali pouzdanije", - "lower": "Uči iz više ciklusa; model može biti manje precizan" - }, - "min_off_gap": { - "higher": "Potreban je duži odmor prije početka novog ciklusa", - "lower": "Kratak odmor pokreće novi ciklus – uzastopni ciklusi se mogu razdijeliti" - }, - "min_power": { - "higher": "Manje osjetljiv na potrošnju u mirovanju; može propustiti tihe programe", - "lower": "Osjetljiviji; može bilježiti potrošnju u stanju pripravnosti kao aktivnost" - }, - "no_update_active_timeout": { - "higher": "Više vremena prije proglašenja ciklusa zaglavljenim", - "lower": "Zaglavljeni ciklus se prisilno zaustavlja ranije" - }, - "off_delay": { - "higher": "Više vremena za pauze uređaja – prikladno za duge faze namakanja ili sušenja", - "lower": "Brže otkrivanje kraja – dobro za uređaje s čistim uključivanjem/isključivanjem" - }, - "profile_match_threshold": { - "higher": "Potvrđuje samo visoko pouzdana podudaranja; više ciklusa ostaje neoznačeno", - "lower": "Podudara više ciklusa; neki mogu biti blago pogrešni" - }, - "running_dead_zone": { - "higher": "Zanemaruje kratke skokove snage tokom mirovanja – manje osjetljiv na šum", - "lower": "Reagira na kraće impulse snage – otkriva brzu prolaznu aktivnost" - }, - "start_threshold_w": { - "higher": "Sprečava lažne startove od kratkih skokova snage", - "lower": "Otkriva programe s niskom snagom; može reagirati na šum" - }, - "stop_threshold_w": { - "higher": "Završava ciklus brže – može zatvoriti tokom pauze", - "lower": "Dulje čeka na završetak – manje prijevremenih završetaka" - }, - "watchdog_interval": { - "higher": "Dopušta dulje tihe faze; manje lažnih prisilnih zaustavljanja", - "lower": "Zaglavljene cikluse otkriva agresivnije" - } - }, - "reason": { - "auto_label_confidence": "Pouzdanost 15. percentila za {cycles} automatskih oznaka koje korisnik nikada nije ispravio ({p15}).", - "completion_min_seconds": "Polovina trajanja čistog ciklusa p05 ({minutes} min) kroz {cycles} ciklusa; filtrira lažne cikluse.{excl}", - "dead_zone_batch": "Zadržano kratkim (medijana prozora nestabilnosti pri pokretanju kroz {cycles} ciklusa = {s}s) kako bi se stvarni kraj brzo prepoznao.", - "dead_zone_from_dip": "Na osnovu ranog pada snage prepoznatog na {s}s.", - "end_energy_default": "Zadana preporučena osnovna vrijednost za prag šuma na kraju ciklusa.", - "end_energy_false": "Energija lažnih završetaka p95 ({p95}Wh) kroz {cycles} ciklusa, sa donjom granicom od 0,2 % medijane energije ciklusa ({floor}Wh).", - "end_energy_no_false": "Nema lažnih završetaka kroz {cycles} ciklusa; sa donjom granicom od 0,2 % medijane energije ciklusa ({floor}Wh).", - "end_repeat_count": "{false}/{total} čistih ciklusa ({pct}%) imalo je unutrašnju pauzu dužu od 60s koja se nastavila; zahtijevaj {val} potvrdu(e) kraja.", - "learning_confidence": "Pouzdanost p05 za {cycles} korisnički označenih ciklusa ({p05}); ispod ove vrijednosti zahtijevaj provjeru.", - "match_interval": "Na osnovu uočene učestalosti ažuriranja (medijana={median}s) * 10.", - "max_duration_ratio": "Na osnovu trajanja označenih ciklusa (p95={p95}).", - "min_active": "Na osnovu najmanje radne snage ({min}W) uočene u posljednjem ciklusu.", - "min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprečavaju prijevremene potvrde.", - "min_off_gap": "Na osnovu {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.", - "min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}", - "ml_auto_label": "Najniža pouzdanost koju je model kvaliteta još ocijenio čistom (p10 od {cycles} čistih ciklusa = {p10}).", - "ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocijenio sa >50 %; zahtijevaj {val} potvrdu(e) kraja.", - "ml_off_delay": "Pauze potvrđene detektorom kraja: p95 {p95}s + 60s rezerve, iz {pauses} modelom provjerenih pauza kroz {cycles} ciklusa (donja granica {floor}s).", - "no_update_timeout": "Na osnovu uočene učestalosti ažuriranja (p95={p95}s) * 20 (najmanje 60s).", - "off_delay_cadence": "Na osnovu uočene učestalosti ažuriranja (p95={p95}s) * 5", - "off_delay_device_floor": "Korišten siguran minimum specifičan za uređaj {device} ({floor}s).", - "off_delay_generic_floor": "Korišten opći siguran minimum ({floor}s).", - "off_delay_pauses": "Postavljeno tako da nadmaši stvarne pauze: pauza unutar ciklusa p95 {p95}s + 60s rezerve, iz {pauses} pauza kroz {cycles} čistih ciklusa (donja granica {floor}s).", - "profile_match_threshold": "Pouzdanost p10 za {cycles} tačnih automatskih oznaka ({p10}); sigurna donja granica za potvrdu tokom rada.", - "sampling_interval": "Medijana intervala ažuriranja uočena kroz {cycles} čistih ciklusa ({si}s).{excl}", - "smoothing_window": "Postavljeno za izglađivanje ~30s očitavanja pri uzorkovanju od {si}s ({samples} uzoraka).", - "start_duration": "Zadržano kratkim (~jedan interval uzorkovanja od {si}s) kako bi prepoznavanje počelo što ranije, uz zanemarivanje pojedinačnih skokova.", - "thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage mašine.", - "tol_per_profile": "p75 varijanse trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosljedni profili nisu kažnjeni.", - "tol_pooled": "Na osnovu objedinjene varijanse trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).", - "watchdog": "Zadržano što nižim uz sigurnost (3x razmak ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." - }, - "exclusions": { - "summary": "Isključeno {total} pogrešno otkrivenih ciklusa: {parts}.", - "reason": { - "force_stopped": "prisilno zaustavljeni", - "interrupted": "prekinuti", - "incomplete": "nepotpuni", - "noise": "buka", - "unlabeled": "bez oznake", - "no_trace_short": "prekratki za analizu", - "high_start": "počeli pri visokoj snazi", - "abrupt_end": "naglo završeni", - "mid_restart": "restart usred ciklusa", - "no_power": "bez snage", - "no_active_power": "bez aktivne snage" - } - } - }, - "tab": { - "advanced": "Napredno", - "diagnostics": "Dijagnostika", - "history": "Ciklusi", - "ml": "ML obuka", - "pp_cleanup": "Čišćenje", - "pp_manage": "Upravljaj", - "pp_overview": "Pregled", - "pp_phases": "Faze", - "profiles": "Profili", - "settings": "Postavke", - "status": "Pregled", - "subtab_phase_catalog": "Katalog faza", - "subtab_profiles": "Profili", - "maintenance": "Održavanje", - "playground": "Testno okruženje", - "store": "Trgovina" - }, - "tag": { - "early_end": "Rani kraj", - "late_start": "Kasni početak", - "merged": "Spojeni ciklusi", - "noise": "Buka", - "sensor_gap": "Razmak senzora", - "split": "Split ciklus", - "wrong_profile": "Pogrešan profil" - }, - "toast": { - "access_saved": "Kontrola pristupa je sačuvana", - "all_wiped": "Svi podaci su izbrisani", - "analysis_complete_none": "Analiza završena: nema novih prijedloga", - "auto_label_complete": "Automatsko označavanje je završeno", - "automation_deleted": "Automatizacija izbrisana", - "correction_submitted": "Ispravka dostavljena", - "cycle_deleted": "Ciklus je obrisan", - "cycle_force_stopped": "Ciklus prisilno zaustavljen", - "cycle_labelled": "Ciklus označen", - "cycle_paused": "Ciklus je pauziran", - "cycle_resumed": "Ciklus je nastavljen", - "cycle_trimmed": "Ciklus je skraćen", - "cycles_merged": "Ciklusi su spojeni", - "envelope_rebuilt": "Koverta rekonstruisana", - "envelopes_rebuilt": "Koverte obnovljene", - "export_downloaded": "Izvoz je preuzet", - "feedback_all_dismissed": "Sve povratne informacije odbačene", - "feedback_confirmed": "Povratne informacije potvrđene", - "feedback_dismissed": "Povratne informacije su odbačene", - "group_deleted": "Grupa je izbrisana", - "group_name_required": "Naziv grupe je obavezan", - "group_saved": "Grupa je sačuvana", - "import_successful": "Uvoz uspješan; ponovno učitavanje integracije", - "json_required": "Potrebni su JSON podaci", - "legacy_removed": "Naslijeđene radnje su uklonjene", - "logs_exported": "Dnevnici su izvezeni", - "matching_reverted": "Odgovarajuće težine vraćene na zadane vrijednosti", - "min_2_profiles": "Odaberite najmanje 2 profila za grupu", - "ml_training_no_improvement": "Obuka je završena: osnovna linija je zadržana (bez poboljšanja)", - "models_reverted": "Modeli na uređaju vraćeni su na osnovnu liniju", - "name_required": "Potrebno je ime", - "no_split_found": "Nisu pronađeni praznini u praznom hodu za razdvajanje", - "panel_settings_saved": "Postavke panela su sačuvane", - "phase_name_required": "Naziv faze je obavezan", - "phase_updated": "Faza ažurirana", - "phases_saved": "Faze su sačuvane", - "preferences_saved": "Postavke su sačuvane", - "profile_name_required": "Ime profila je obavezno", - "profile_renamed": "Profil je preimenovan", - "recording_discarded": "Snimak je odbačen", - "recording_saved": "Snimak je sačuvan na profilu", - "recording_started": "Snimanje je počelo", - "recording_stopped": "Snimanje je zaustavljeno", - "review_saved": "Recenzija je sačuvana", - "settings_conflicts": "Ispravite istaknute sukobe postavki prije spremanja.", - "settings_reverted": "Postavke vraćene; ponovno učitavanje integracije", - "settings_saved": "Postavke sačuvane; ponovno učitavanje integracije", - "suggestions_applied": "Primijenjeni prijedlozi; ponovno učitavanje integracije", - "suggestions_dismissed": "Prijedlozi su odbačeni", - "apply_failed": "Primjena nije uspjela: {error}", - "delete_failed": "Brisanje nije uspjelo: {error}", - "load_more_failed": "Nije moguće učitati još: {error}", - "maint_add_failed": "Nije moguće dodati događaj: {error}", - "maint_added": "Događaj održavanja dodan", - "maint_delete_failed": "Nije moguće izbrisati događaj: {error}", - "maint_deleted": "Događaj održavanja izbrisan", - "relabel_done": "Ponovo označeno ciklusa: {count}", - "relabel_failed": "Ponovno označavanje nije uspjelo: {error}", - "reminders_save_failed": "Nije moguće sačuvati podsjetnike: {error}", - "reminders_saved": "Podsjetnici za servis sačuvani", - "pause_no_cycle": "Nema aktivnog ciklusa za pauziranje", - "resume_no_cycle": "Nema pauziranog ciklusa za nastavak", - "delete_partial_failed": "Neke stavke nije bilo moguće obrisati i vraćene su", - "pg_run_gone": "To pokretanje više nije dostupno.", - "task_cancelled": "Otkazano.", - "processed": "Obrađeno {bits}", - "processed_cycles": "{n} ciklusa", - "processed_suggestions": "{n} prijedloga", - "processed_models": "{n} aktiviranih modela", - "store_search_failed": "Pretraga nije uspjela: {error}", - "store_connect_failed": "Povezivanje nije uspjelo: {error}", - "store_connected": "Povezano sa zajedničkom trgovinom", - "store_disconnected": "Veza sa zajedničkom trgovinom prekinuta", - "store_error": "Greška: {error}", - "store_unavailable": "Zajednička trgovina nije dostupna.", - "store_pick_profile": "Odaberite profil za spajanje", - "store_name_required": "Unesite naziv profila", - "store_import_failed": "Uvoz nije uspio: {error}", - "store_imported": "Uvezeno u {profile}", - "store_program_required": "Unesite naziv programa", - "store_no_appliance": "Prvo postavite marku i model uređaja u Postavkama.", - "store_share_failed": "Dijeljenje nije uspjelo: {error}", - "store_shared": "Podijeljeno u zajedničku trgovinu, čeka pregled.", - "appliance_added": "Uređaj dodan, čeka odobrenje", - "thanks_confirming": "Hvala na potvrdi", - "device_approved": "Odobreno od strane zajednice", - "rating_saved": "Ocjena kvaliteta sačuvana", - "brand_added": "Marka dodana, čeka odobrenje", - "profile_added": "Profil dodan, čeka odobrenje", - "saved_except_conflicts": "Postavke sačuvane -- {n} postavka{s} preskočena zbog konflikata", - "share_device_none_sel": "Odaberite barem jedan program za dijeljenje", - "store_device_downloaded": "Postavke uređaja preuzete: {created} profil{c} kreiran, {dup} već postoji", - "store_device_downloaded_phases": "Postavke uređaja preuzete: {created} profil{c} kreiran, {dup} već postoji, mapa faza primijenjena", - "store_device_downloaded_settings": "Postavke uređaja preuzete: {created} profil{c} kreiran, {dup} već postoji, postavke primijenjene", - "store_device_shared": "Postavke uređaja podijeljene: {n} program{s} učitan", - "store_device_shared_all_dup": "Nema ničeg novog za dijeljenje -- svi programi već postoje u prodavnici", - "store_device_shared_partial": "Djelimično dijeljenje: {n} program{s} učitan, {failed} preskočeno", - "store_device_shared_some_dup": "Postavke uređaja podijeljene: {n} program{s} učitan ({dup} već postoji)", - "store_download_failed": "Preuzimanje nije uspjelo: {error}", - "store_download_nothing": "Nema ništa za preuzimanje -- svi profili već postoje na ovom uređaju", - "export_selective_done": "Izvoz preuzet", - "import_selective_done": "Uvezeno {profiles} profila i {cycles} ciklusa" - }, - "trend": { - "down": "Opadajući trend", - "up": "Rastući trend" - }, - "maint": { - "bearing_service": "Servis ležajeva", - "descale": "Uklanjanje kamenca", - "drum_clean": "Očisti bubanj", - "filter_clean": "Očisti filter", - "other": "Ostalo" - }, - "pg_desc": { - "anti_wrinkle_enabled": "Upij impulse bubnja nakon glavne faze, a ne čitaj ih kao nove cikluse", - "anti_wrinkle_exit_power": "Snaga mora pasti ispod ove vrijednosti između impulsa da bi anti-gužvanje ostalo aktivno", - "anti_wrinkle_idle_timeout": "Dozvoljeno vrijeme mirovanja između dva impulsa bubnja prije nego što se anti-gužvanje završi", - "anti_wrinkle_max_duration": "Duži impuls završava anti-gužvanje i otvara novi ciklus", - "anti_wrinkle_max_power": "Impuls iznad ove vrijednosti završava anti-gužvanje i otvara novi ciklus", - "completion_min_seconds": "Najkraće pokretanje koje se računa kao pravi ciklus", - "end_repeat_count": "Niska očitanja zaredom prije završetka", - "interrupted_min_seconds": "Kratki ciklusi označeni kao prekinuti", - "min_off_gap": "Razmak potreban za razdvajanje dva ciklusa", - "off_delay": "Sekundi niske snage prije završetka ciklusa", - "start_duration_threshold": "Sekundi iznad praga za potvrdu pokretanja", - "start_threshold_w": "Minimum vati da bi se računalo kao pokrenuto", - "stop_threshold_w": "Ispod ovoga mašina se računa kao isključena", - "dtw_bandwidth": "Faza 3: warp opseg Sakoe-Chiba (0 = DTW isključen; zadano 0,2 = 20% dužine ciklusa)", - "corr_weight": "Faza 2: ravnoteža između oblika krivulje (korelacija) i nivoa snage (MAE); zadano 0,45", - "duration_weight": "Faza 4: koliko jako slaganje trajanja utječe na konačnu ocjenu (zadano 0,22)", - "energy_weight": "Faza 4: koliko jako slaganje energije utječe na konačnu ocjenu (zadano 0,22)", - "profile_match_min_duration_ratio": "Faza 1: minimalna dužina ciklusa kao udio trajanja profila; zadano 0,1 (10%)", - "profile_match_max_duration_ratio": "Faza 1: maksimalna dužina ciklusa kao udio trajanja profila; zadano 1,5 (150%)", - "keep_min_score": "Faza 2: minimalna ocjena za ostanak u utrci; zadano 0,1 dopušta slabe podudarnosti, kasniji koraci biraju najbolje", - "dtw_blend": "Faza 3: 0 = samo osnovna ocjena, 1 = samo DTW ocjena, 0,5 = jednako miješanje (zadano)", - "dtw_ensemble_w": "Faza 3 (kombinirani način): težina skaliranog L1 nasuprot derivatnog DTW; zadano 0,7 favorizira nivo", - "dtw_ddtw_scale": "Faza 3: udaljenost polu-zasićenja DDTW; manja = osjetljivija na oblik (zadano 30)", - "dtw_refine_top_n": "Faza 3: kandidati koje DTW ponovo ocjenjuje; povećajte na 7-9 ako ispravni profil zauzme 4.-5. mjesto (zadano 5)", - "duration_scale": "Faza 4: omjer logaritma gdje se slaganje trajanja prepolovi; manje = stroža kazna (zadano 0,175)", - "energy_scale": "Faza 4: omjer logaritma gdje se slaganje energije prepolovi; manje = stroža kazna (zadano 0,25)" - }, - "col": { - "profile_tip": "Naziv podudarnog programa. Bez oznake znači da se na kraju ciklusa nijedan profil nije podudarao.", - "status_tip": "Ishod ciklusa: Završeno (prirodni kraj), Prekinuto (nagli pad snage), Prisilno zaustavljeno (ručno) ili Potrebna provjera (čeka se povratna informacija).", - "date_tip": "Datum i vrijeme početka ciklusa.", - "duration_tip": "Ukupno vrijeme rada ciklusa od početka do kraja.", - "energy_tip": "Ukupna potrošena energija (kWh). Izračunato integracijom snage kroz vrijeme.", - "cost_tip": "Trošak energije za ovaj ciklus, zamrznut po završetku prema tada važećoj cijeni (energija x cijena po kWh). Postavite cijenu u Postavkama da biste ga popunili.", - "confidence_tip": "Pouzdanost podudaranja profila (0-100%). Koliko se tačno kriva snage ciklusa podudarala s identificiranim programom.", - "health_tip": "Zdravlje ciklusa ML (više = bolje). Kliknite ciklus da biste ga pregledali i ocijenili.", - "flags_tip": "Oznake zajednice i pokazatelji kvalitete podataka" - }, - "stat": { - "avg": "pros.", - "min": "min {v}", - "max": "max {v}", - "consistency": "konzistentnost ±{v}", - "total": "ukupno {v}", - "last_run": "zadnje pokretanje {v}", - "score": "rezultat {pct}%", - "duration_cv": "CV trajanja {pct}%", - "avg_confidence": "pros. pouzdanost {pct}%" - }, - "pg_evd": { - "detected": "Detektor je prepoznao da je ciklus započeo.", - "match_commit": "Mehanizam podudaranja je s dovoljno pouzdanosti odabrao program.", - "match_changed": "Vodeći program se promijenio kako je viđen veći dio ciklusa.", - "match_ambiguous": "Dva programa su postigla slične rezultate, pa je podudaranje bilo nesigurno.", - "unmatched": "Nijedan sačuvani program nije odgovarao ovom ciklusu.", - "notify_start": "Bila bi poslana obavijest o pokretanju.", - "notify_pre_complete": "Bila bi poslana obavijest da je ciklus skoro završen.", - "notify_finish": "Bila bi poslana obavijest o završetku.", - "notify_milestone": "Bila bi poslana obavijest o prekretnici.", - "notify_held": "Obavijest je zadržana zbog tihih sati.", - "finished": "Ciklus je dostigao završno stanje i završio." - }, - "store": { - "browse": "Pregledaj", - "device": "Uređaj", - "favorites": "Favoriti", - "search_ph": "Pretraži po marki ili modelu…", - "no_results": "Nisu pronađeni odgovarajući uređaji. Pokušajte s drugom pretragom.", - "n_programs": "{n} programa", - "n_cycles": "{n} ciklusa", - "no_programs": "Za ovaj uređaj još nema podijeljenih programa.", - "no_cycles": "Za ovaj program još nema podijeljenih referentnih ciklusa.", - "anon": "anonimno", - "uploaded_by": "Podijelio {name}", - "connected_as": "Povezan kao {name}", - "not_connected": "Nije povezano. Povežite GitHub nalog da biste dijelili vlastite cikluse.", - "import_new": "Novi profil", - "import_merge": "Spoji s postojećim", - "merge_target": "Spoji u profil", - "description": "Opis (opcionalno)", - "contributed_by": "od {name}", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "Još nema ocjena", - "website": "Web stranica trgovine ↗", - "website_tip": "Otvorite web stranicu zajedničke trgovine" - }, - "settings": { - "gear": { - "title": "Postavke" - } - }, - "link": { - "manual": "Priručnik ↗", - "add_appliance": "Dodajte svoj uređaj" - }, - "tip": { - "add_brand": "Marke nema na spisku? Dodajte je u katalog zajednice", - "add_appliance": "Modela nema na spisku? Dodajte svoj uređaj u katalog zajednice", - "add_profile": "Dodajte profil za ovaj uređaj na web-stranici zajednice" - }, - "task": { - "reprocess": { - "matching": "Ponovna obrada: podudaranje ciklusa", - "golden": "Ponovna obrada: popunjavanje referentnih", - "suggestions": "Ponovna obrada: prijedlozi", - "ml_training": "Ponovna obrada: ML obuka", - "health": "Ponovna obrada: zdravlje ciklusa" - }, - "pg_sweep": { - "optimize": "Optimizacija: {param}" - }, - "pg_detail": { - "simulate": "Simuliraj ciklus" - }, - "split": { - "apply": "Dijeljenje ciklusa" - }, - "trim": { - "apply": "Obrezivanje ciklusa" - }, - "merge": { - "apply": "Spajanje ciklusa" - }, - "rebuild": { - "envelopes": "Ponovna izgradnja omotača" - } - }, - "setup": { "hdr": { - "card": "Postavljanje uređaja", - "healthy_chip": "Postavljanje dovršeno" + "ab_comparison": "Poređenje postavki A/B", + "access_control": "Kontrola pristupa", + "add_maintenance": "Dodaj događaj održavanja", + "automation_delete": "Izbrišite ovu automatizaciju", + "automation_needs_review": "Ovaj ciklus treba revidirati", + "automation_open": "Otvorite u uređivaču automatizacije", + "automation_review_this_cycle": "Pregledajte ovaj ciklus", + "automations": "Automatizacija", + "clear_debug": "Obrišite tragove za otklanjanje grešaka", + "cycle_simulator": "Simulator ciklusa", + "diagnostics_pref": "Dijagnostika", + "display": "Prikaz", + "dtw_inspector": "DTW inspektor", + "export_import": "Izvoz/uvoz", + "getting_started": "Početak rada", + "live_power": "Snaga uživo", + "logs": "Dnevnici", + "logs_diagnostics": "Dijagnostika", + "maintenance": "Radnje održavanja", + "maintenance_log": "Dnevnik održavanja", + "maintenance_reminders": "Podsjetnici za servis", + "manual_recording": "Ručno snimanje", + "manual_recording_tip": "Namjerno pokrenite ciklus dok WashData snima trag snage. Pokrenite neposredno prije nego što uređaj krene, zaustavite kada završi, zatim obradite za pohranu kao imenovani profil.", + "ml_learned": "Šta je WashData naučio", + "ml_matching_tuning": "Fino podešavanje usklađenosti programa", + "ml_settings_card": "Postavke", + "ml_smart_learning": "Pametno učenje", + "my_preferences": "Moje postavke", + "no_automations": "Još nijedna automatizacija ne spominje ovaj uređaj.", + "panel_settings": "Postavke panela", + "param_sweep": "Ispitivanje parametra", + "pg_settings_source": "Izvor postavki", + "phase_catalog": "Katalog faza", + "playground": "Testno okruženje", + "process_history": "Istorija procesa", + "settings_history": "Historija postavki", + "status": "Status", + "status_graph": "Graf statusa", + "storage_stats": "Statistike pohrane", + "test_history": "Provjera na historiji", + "toggle_sidebar": "Uključite bočnu traku Home Assistant", + "tools_and_data": "Alati i podaci", + "wipe_history": "Obriši historiju", + "recommendations": "Preporuke ({n})", + "pg_detection_params": "Postavke detekcije", + "pg_timeline": "Vremenska linija događaja", + "pg_outcome": "Ishod simulacije", + "pg_across_cycles": "Kroz sve vaše cikluse", + "community_store": "Zajednička trgovina", + "online_account": "Zajednička trgovina i online funkcije" }, - "phase0": { - "washer": "WashData već otkriva vaše cikluse. Snimite prvi ciklus kako biste omogućili nazive programa i procjene vremena.", - "dishwasher": "WashData prati. Mašine za pranje posuđa imaju složene cikluse – snimanje prvog ciklusa je izrazito preporučeno. Ako otkriveni ciklus traje predugo, koristite uređivač ciklusa za rezanje prije pohrane kao profila.", - "generic": "WashData prati. Snimite ili označite otkriveni ciklus kako biste počeli graditi profile." + "health": { + "fair": "Prihvatljiva kvaliteta podudaranja", + "good": "✓ Dobra kvaliteta podudaranja", + "poor": "⚠ Loša kvaliteta podudaranja" }, - "phase1a": { - "labelled": "Dobar početak – vaš prvi program je pohranjen. Za najčišće podatke razmislite o snimanju sljedećeg ciklusa pomoću widgeta snimača." + "lbl": { + "actions": "Akcije", + "activity": "Aktivnost", + "administrators": "Administratori", + "aria_compare_chart": "Grafikon poređenja ciklusa", + "aria_cycle_chart": "Kriva snage ciklusa", + "aria_envelope_chart": "Grafikon anvelope snage profila", + "aria_phase_chart": "Grafikon uređivača faza", + "aria_playground_chart": "Kriva snage ciklusa sa pomjerljivim pragovima detekcije", + "aria_power_chart": "Grafikon potrošnje snage", + "aria_spaghetti_chart": "Preklopljene krive snage ciklusa", + "aria_sweep_chart": "Grafikon rezultata pretrage parametara", + "artifact_anomaly": "Anomalija", + "artifact_high_power": "Visoka snaga", + "artifact_interruption": "Prekid", + "artifact_low_power": "Niska snaga", + "auto_detect": "Automatsko otkrivanje", + "auto_fine_tune_off": "automatsko fino podešavanje isključeno", + "auto_fine_tune_on": "automatsko fino podešavanje uključeno (oko {hour}:00)", + "avg_cost": "Prosj. trošak", + "change": "Promjena", + "clock_time": "Vreme na satu", + "cohesion_good": "kohezija {pct}%", + "cohesion_low": "⚠ niska kohezija {pct}%", + "compare_profiles": "Uporedite sa profilima", + "concurrency": "Paralelnost", + "confidence": "Samopouzdanje", + "confidence_threshold": "Prag povjerenja", + "correct_duration": "Ispravno trajanje (min, opcionalno)", + "correct_profile": "Ispravan profil", + "correlation": "Korelacija", + "cost": "Troškovi", + "create_new_profile": "+ Kreirajte novi profil…", + "current_phase": "Trenutna faza", + "curves": "Krive", + "cycle": "Ciklus", + "cycle_date_display": "Prikaz datuma ciklusa", + "cycle_health": "Zdravlje ciklusa", + "cycle_index": "indeks ciklusa →", + "cycles": "Ciklusi", + "cycles_count": "Ciklusi", + "cycles_lc": "ciklusa", + "dashed": "isprekidano", + "date": "Datum", + "debug_traces": "Tragovi otklanjanja grešaka", + "default": "Zadano", + "default_access_level": "Zadani nivo za korisnike koji nisu navedeni ispod", + "default_other": "Zadano (ostali uređaji)", + "default_tab": "Podrazumevana kartica prilikom otvaranja panela", + "font_size": "Veličina fonta ploče", + "delta": "Δ", + "description": "Opis", + "dtw_blend_w": "Težina miješanja", + "dtw_blended": "Miješani rezultat", + "dtw_ddtw": "DDTW rezultat", + "dtw_l1": "L1 rezultat", + "dtw_matched_profile": "(profil podudaran ciklusu)", + "duration": "Trajanje", + "duration_agreement": "Slaganje trajanja", + "emphasis": "Naglasak", + "enable_access_control": "Omogućite kontrolu pristupa po korisniku", + "energy": "Energija", + "energy_agreement": "Slaganje energije", + "event_timeline": "Vremenska linija događaja", + "event_type": "Tip događaja", + "expected": "Očekivano", + "expected_duration": "Očekivano trajanje (min)", + "file_kb": "Fajl (kB)", + "final_score": "Konačni rezultat", + "from": "Od", + "gap_s": "jaz (s)", + "group_name": "Naziv grupe", + "head_trim": "Trim (s) glave", + "health": "Zdravlje", + "hide_tabs": "Sakrij kartice za neadministratore", + "in_use": "U upotrebi", + "json_data": "JSON podaci", + "label": "Podudarajući program", + "last": "Posljednjih", + "last_checked": "Zadnja provjera:", + "load_from_file": "Učitaj iz datoteke", + "mae_score": "MAE rezultat", + "manual_duration": "Ručno trajanje (min, opciono)", + "match": "Podudaranje", + "members": "Članovi", + "metric": "Metrika", + "mode_existing_profile": "Dodaj postojećem profilu", + "mode_new_profile": "Kreirajte novi profil", + "models_fine_tuned": "({count} modela fino podešenih)", + "n_classic_suggestions": "{n} klasičan", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} odabrano", + "n_tuning_suggestions": "{n} prijedlog podešavanja", + "na": "n/a", + "new_profile_name": "Novo ime profila", + "notes": "Napomene", + "of": "od", + "outcome": "Ishod", + "panel_default_tab": "Zadana kartica", + "panel_language": "Jezik ploče", + "per_cycle_short": "ciklus", + "pg_autofill_tip": "Automatski popuni opseg iz trenutne vrijednosti ({lo}–{hi})", + "pg_best_value": "Pronađena najbolja vrijednost", + "pg_current_value": "Trenutna vrijednost:", + "pg_drag_hint": "Povucite liniju na grafikonu", + "pg_anti_wrinkle": "Anti-gužvanje", + "pg_dtw": "DTW", + "pg_ev_ending": "Završava", + "pg_ev_running": "U toku", + "pg_group_advanced": "Granični slučajevi", + "pg_group_detection": "Okidači detekcije", + "pg_group_timing": "Pravila vremena", + "pg_idle": "Neaktivan", + "pg_last_run": "Posljednje pokretanje: {date}", + "pg_match_score": "Ocjena podudaranja", + "pg_pct_of": "{p}% od {total}", + "pg_poor_match": "Loše podudaranje", + "pg_preset": "Konfiguracija testnog okruženja", + "pg_preset_name": "Naziv nove konfiguracije", + "pg_preset_none": "Odaberite konfiguraciju…", + "pg_strong_match": "Snažno podudaranje", + "pg_tile_ambiguous": "Dvosmisleno", + "pg_tile_ambiguous_tip": "Ciklusi s gotovo izjednačenim podudaranjem između dva programa", + "pg_tile_detected": "Detektovano", + "pg_tile_detected_tip": "Ciklusi kod kojih je snaga prešla prag pokretanja dovoljno dugo da se registruje kao rad", + "pg_tile_matched": "Podudareno", + "pg_tile_matched_tip": "Ciklusi ispravno pripisani poznatom programu", + "pg_time_left": "Preostalo vrijeme", + "pg_weak_match": "Slabo podudaranje", + "phase_name": "Ime", + "phase_timeline": "Vremenska linija faza", + "power": "Snaga", + "profile": "Profil", + "profile_index": "indeks profila →", + "profile_name": "Ime profila", + "program": "Program", + "program_tip": "Zamijeni koji profil se poklapa s trenutnim ciklusom. Automatsko otkrivanje omogućava integraciji da automatski odabere najboljeg kandidata. Prikvačite određeni program za prisilno podudaranje kada automatsko otkrivanje nije ispravno ili znate što radi.", + "progress": "Napredak", + "raw_socket": "Sirova utičnica", + "read_only": "Samo za čitanje", + "ref_cycle": "Referentni ciklus (opciono)", + "refresh_interval": "Interval osvježavanja (s)", + "remaining": "Preostalo", + "reminder_every": "Podsjeti svakih (ciklusa)", + "remove_label": "- Ukloni etiketu -", + "rename_profile": "Preimenuj profil", + "replay_duration": "Reprodukcija", + "resulting_profile": "Rezultirajući profil", + "save_mode": "Režim spremanja", + "score": "Rezultat", + "score_breakdown": "Raščlamba rezultata", + "seconds_from_start": "Sekunde od početka", + "select_profile": "Odaberite Profil", + "setting": "Postavka", + "settings_a": "Postavke A (trenutne)", + "settings_a_short": "A", + "settings_advanced": "Napredno", + "settings_b": "Postavke B (test)", + "settings_b_short": "B", + "settings_basic": "Osnovno", + "settings_detail_level": "Nivo detalja postavki", + "settings_overrides": "Zamjene postavki", + "show_debug": "Prikaži karticu za otklanjanje grešaka utakmice uživo na stranici Status (pouzdanje, dvosmislenost, najbolji kandidati)", + "show_expected": "Prikaži očekivani prekrivač krivulje (podudarni profil, narandžasta)", + "show_raw": "Prikaži prekidač sirovih očitanja utičnice u živom grafu snage", + "sparkline": "Trend trajanja posljednjih ciklusa", + "stage2": "Faza 2 – osnovna sličnost", + "stage3": "Faza 3 – DTW", + "stage4": "Faza 4 – slaganje", + "status": "Status", + "tail_trim": "Obrub repa (s)", + "timer_auto_pause": "Automatska pauza", + "timer_min": "min", + "timer_msg_placeholder": "Poruka (opcionalno, {device}/{program}/{minutes})", + "to": "Do", + "ungrouped": "Negrupisano", + "unlabelled": "Neoznačeno", + "unlabelled_paren": "(neoznačeno)", + "warp_path": "Warp putanja", + "input": "Ulaz:", + "start": "Početak", + "end": "Kraj", + "unit_s": "(s)", + "reviewed_on": "pregledano {date}", + "unknown": "Nepoznato", + "quality": "Kvaliteta", + "tags": "Oznake", + "at": "u", + "pct_match_confidence": "{pct}% pouzdanosti podudaranja", + "ha_restarted": "HA ponovo pokrenut", + "from_start": "Od početka", + "to_end": "Do kraja", + "click_to_select": "kliknite za odabir", + "envelope": "Koverta", + "zoom_hint": "skrolajte za zumiranje · dvoklik za resetiranje", + "loading_paren": "(učitavanje…)", + "time_remaining": "~{v} preostalo", + "no_duration": "bez trajanja", + "duration_avg": "~{v}m pros.", + "name_placeholder": "(naziv)", + "n_shown": ", prikazano {n}", + "cycles_title": "Ciklusi ({n})", + "pg_detecting": "Otkrivanje", + "pg_best_marker": "Najbolji: {v}", + "pg_time_left_model": "Preostalo vrijeme (model)", + "pg_time_left_model_tip": "Modelom procijenjeno preostalo vrijeme (procjenitelj faza + mješavina s ML), a ne statičko odbrojavanje", + "phase": "Faza", + "pg_mode_simulate": "Simuliraj", + "pg_mode_history": "Provjeri na historiji", + "pg_mode_sweep": "Ispitivanje", + "pg_ev_detected": "Detektovano", + "pg_ev_match": "Podudaranje potvrđeno", + "pg_ev_match_changed": "Podudaranje promijenjeno", + "pg_ev_ambiguous": "Dvosmisleno", + "pg_ev_unmatched": "Bez podudaranja", + "pg_ev_notify_start": "Obavještenje o početku", + "pg_ev_notify_pre": "Obavještenje o skorom kraju", + "pg_ev_notify_finish": "Obavještenje o završetku", + "pg_ev_notify_milestone": "Obavještenje o prekretnici", + "pg_ev_notify_held": "Obavještenje zadržano (tihi sati)", + "pg_ev_finished": "Završeno", + "pg_ended": "Okončano", + "pg_proj_energy": "Proc. energija", + "pg_alert_overrun": "Produženje", + "pg_alert_underrun": "Skraćenje", + "pg_alert_did_not_finish": "Nije završeno", + "pg_alert_false_end": "Podijeljeno na više ciklusa", + "pg_alert_unmatched": "Bez podudaranja", + "pg_alert_ambiguous": "Dvosmisleno podudaranje", + "pg_alert_energy": "Anomalija energije", + "pg_newly_correct": "novo ispravno", + "pg_regressed": "pogoršano", + "pg_end_timing_changed": "promijenjeno vrijeme kraja", + "pg_vs_current": "u odnosu na trenutno", + "pg_fixed": "popravljeno", + "pg_broke": "pokvareno", + "pg_sweep_param": "Parametar", + "pg_objective": "Cilj", + "pg_steps": "Koraci", + "pg_sweep_2d": "Toplotna karta 2D", + "pg_sweep_param_y": "2. parametar", + "pg_obj_match": "Tačnost podudaranja", + "pg_obj_endtiming": "Tačnost kraja", + "pg_obj_falseend": "Stopa lažnih završetaka", + "pg_obj_overrun": "Odstupanje trajanja", + "pg_obj_ambiguity": "Stopa dvosmislenosti", + "pg_best_combo": "najbolja kombinacija", + "pg_mode_optimize": "Optimiziraj", + "pg_group_matching": "Podudaranje programa", + "pg_zoom_hint": "dvostruki klik poništava zumiranje", + "aria_playground_chart2": "Interaktivni grafikon snage ciklusa: pređite mišem za prikaz vremena/snage, pomjerajte točkić za zumiranje, povucite za pomjeranje", + "pg_alert_timeout_end": "Završeno zbog isteka vremena, a ne na osnovu predviđanja", + "pg_alert_indefinite": "Radio bi beskonačno", + "pg_alert_stress_cap": "Dostignut sigurnosni limit", + "pg_alert_stress_ok": "Otkrivanje mirovanja: ciklus zaustavljen", + "pg_alert_stress_warn": "Potrošnja u mirovanju iznad praga zaustavljanja", + "pg_stress_group": "Test otkrivanja mirovanja", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "Razina mirovanja (W)", + "pg_stress_idle_w_desc": "Zamijeni automatski otkrivenu donju granicu u stanju pripravnosti (ostavi prazno za automatsko otkrivanje).", + "pg_stress_toggle": "Testiraj otkrivanje mirovanja", + "pg_stress_toggle_desc": "Simulira da uređaj ostaje na potrošnji u stanju pripravnosti nakon završetka snimanja -- prikazuje ako i kada WashData zaustavi ciklus.", + "task_pg_history": "Test na historiji", + "task_pg_sweep": "Optimiziraj", + "task_reprocess": "Ponovna obrada", + "task_ml_training": "Učenje", + "eta_secs": "još ~{n} s", + "eta_mins": "još ~{n} min", + "pg_recent_runs": "Nedavna pokretanja", + "pg_load_run": "Ponovo učitaj ovo pokretanje", + "pg_match_confidence": "Pouzdanost podudaranja", + "pg_envelope_fit": "Uklapanje u omotač", + "pg_envelope_fit_tip": "Koliko dobro ciklus ostaje unutar sačuvanog omotača snage ovog profila, drugačiji pogled od pouzdanosti podudaranja.", + "n_imported_note": ", {n} uvezeno", + "enable_online": "Omogući online funkcije", + "store_brand": "Marka uređaja", + "store_model": "Model uređaja", + "anonymous": "Anonimno", + "rate_quality": "Ocijeni kvalitet", + "rate_n": "{n} zvjezdica", + "approved_only": "Samo odobreno", + "adopt_settings": "Prihvati postavke", + "flags": "Oznake", + "include_phase_map": "Uključi mapu faza", + "include_settings": "Uključi postavke", + "show_contributor": "Prikaži doprinositelja", + "task_pg_detail": "Simuliraj ciklus", + "task_split": "Dijeljenje ciklusa", + "task_trim": "Obrezivanje ciklusa", + "task_merge": "Spajanje ciklusa", + "task_rebuild": "Ponovna izgradnja omotača", + "cat_profiles": "Profili (programi)", + "cat_real_cycles": "Ciklusi (historija rada)", + "cat_reference_cycles": "Referentni ciklusi (uvezeni)", + "cat_custom_phases": "Prilagođene faze", + "cat_profile_groups": "Grupe profila", + "cat_settings": "Postavke otkrivanja i prepoznavanja", + "cat_matching_config": "Podešavanje prepoznavanja", + "cat_ml_models": "ML modeli", + "cat_feedback": "Oznake povratnih informacija i pregleda", + "cat_suggestions": "Prijedlozi", + "cat_maintenance_log": "Dnevnik održavanja", + "cat_history_logs": "Dnevnici historije i promjena", + "cat_lifetime_stats": "Ukupni zbirovi", + "cycles_short": "ciklusa", + "import_mode": "Kako kombinovati", + "mode_merge": "Spoji (zadrži moje)", + "mode_replace": "Zamijeni odabrano", + "cycle_destination": "Gdje trebaju ići uvezeni ciklusi?", + "dest_reference": "Referenca (samo oblik)", + "dest_real_history": "Stvarna historija (računa se u statistici)", + "conflict_resolution": "Sukobi naziva", + "conflict_import_copy": "Uvezi kao kopiju", + "conflict_keep_mine": "Zadrži moje", + "conflict_overwrite": "Prepiši" }, - "phase1b": { - "recorded": "Vaša snimka pohranjena je kao {profile_name}. Sada snimite ili označite ostale uobičajene programe za izgradnju pokrivenosti." + "log": { + "all_levels": "Svi nivoi", + "all_devices": "Svi uređaji", + "all_components": "Sve komponente", + "search_ph": "Pretraži zapisnike…" }, - "phase1c": { - "verify": "Imate {count} programa od zajednice. Pokrenite ciklus kako biste provjerili prepoznaje li ih WashData ispravno – podudaranje će se poboljšati kako vaš uređaj gradi vlastitu historiju." + "ml": { + "builtin_models": "● Korišćenje ugrađenih modela", + "fit_fair": "Prihvatljivo", + "fit_good": "Dobro", + "fit_slight": "Lagano", + "fit_strong": "Jaka", + "fit_weak": "Slabo", + "fit_word": "kvaliteta", + "personalized": "● Personalizovano za ovu mašinu", + "better_than_baseline": "{pct}% bolje od osnovne procjene ({metric})", + "trend_improving_tip": "Prilagodba ovog modela se poboljšala u nedavnim ponovnim provjerama.", + "trend_declining_tip": "Prilagodba ovog modela se pogoršala u nedavnim ponovnim provjerama, pregled više ciklusa može mu pomoći da ponovo nauči.", + "trend_steady_tip": "Prilagodba ovog modela je ostala otprilike stabilna u nedavnim ponovnim provjerama.", + "cap_blurb": { + "end": "Prepoznavanje kada je ciklus zaista završen", + "live_match": "Brže prepoznavanje programa koji je u toku", + "quality": "Uočavanje pogrešno prepoznatih ili oštećenih ciklusa", + "remaining_time": "Predviđanje preostalog vremena", + "total_energy": "Predviđanje ukupne potrošnje energije i troškova" + }, + "cap_label": { + "end": "Prepoznavanje kraja ciklusa", + "live_match": "Prepoznavanje programa", + "quality": "Provjera kvaliteta ciklusa", + "remaining_time": "Procjena preostalog vremena", + "total_energy": "Procjena potrošnje energije" + }, + "metric_auc": "AUC {auc} na izdvojenim podacima", + "metric_mae": "greška {model} u odnosu na osnovnu vrijednost {baseline}" }, - "phase2": { - "cluster": "WashData je vidio {count} ciklusa koji ne odgovaraju nijednom pohranjenome programu – nalikuju jedni drugima. Želite li za njih stvoriti novi profil?", - "unmatched": "Vaš zadnji ciklus nije odgovarao nijednom pohranjenome programu. Je li to novi program?" + "modal": { + "auto_label": "Ciklusi automatskog označavanja", + "correct_feedback": "Ispravne povratne informacije", + "create_profile": "Kreirajte profil", + "cycle": "Ciklus", + "edit_group": "Uredi grupu profila", + "edit_phase": "Uredi fazu", + "import_config": "Uvoz konfiguracije", + "label_cycle": "Označi ciklus", + "merge_cycles": "Spoji {n} ciklusa", + "new_group": "Nova grupa profila", + "new_phase": "Nova faza", + "process_history_msg": "Ponovo pokrenite uparivanje, osvježite prijedloge, trenirajte ML (ako je omogućeno) i preračunajte zdravlje ciklusa za sve pohranjene cikluse. Ovo može potrajati.", + "process_history_ok": "Obradi", + "process_history_title": "Obradi povijest", + "process_recording": "Snimanje procesa", + "delete_maintenance_msg": "Izbrisati ovaj zapis o održavanju? Ovo se ne može poništiti.", + "delete_maintenance_title": "Izbriši događaj održavanja", + "relabel_cycles": "Ponovo označi {count} ciklusa", + "delete_automation_title": "Izbriši automatizaciju", + "delete_automation_msg": "Izbrisati automatizaciju \"{name}\" iz Home Assistant? Ovo se ne može poništiti.", + "remove_legacy_title": "Ukloni zastarjele akcije", + "remove_legacy_msg": "Ukloniti zastarjele prilagođene akcije? Prestat će se aktivirati na događajima ciklusa. Ovo se ne može poništiti iz panela.", + "discard_recording_title": "Odbaci snimak", + "discard_recording_msg": "Odbaciti sačuvani snimak? Ovo se ne može poništiti.", + "dismiss_all_title": "Odbaci sve zahtjeve za povratnu informaciju", + "dismiss_all_msg": "Odbaciti svih {count} zahtjeva za povratnu informaciju na čekanju?", + "dismiss_all_ok": "Odbaci sve", + "delete_phase_title": "Izbriši fazu", + "delete_phase_msg": "Izbrisati fazu \"{name}\"?", + "clear_debug_title": "Očisti podatke za otklanjanje grešaka", + "clear_debug_msg": "Izbrisati sve pohranjene tragove za otklanjanje grešaka?", + "wipe_all_title": "Obriši sve podatke", + "wipe_all_msg": "⚠️ Ovo trajno briše SVE cikluse i profile. Ovo se ne može poništiti.", + "wipe_all_ok": "Obriši sve", + "force_stop_title": "Prisilno zaustavi ciklus", + "force_stop_msg": "Prisilno zaustaviti aktivni ciklus sada? Ciklus će biti sačuvan kao prekinut.", + "store_import": "Uvezi referentni ciklus", + "store_share": "Podijeli u zajedničku trgovinu", + "store_share_device": "Podijeli postavke uređaja", + "export_select": "Izvoz - odaberi podatke", + "import_wizard": "Uvoz - odaberi podatke" }, - "phase3": { - "suggestions": "WashData ima preporuke postavki temeljene na vašoj historiji ciklusa – pregledajte ih kako biste poboljšali tačnost otkrivanja.", - "groups": "Neki vaši profili izgledaju kao isti program pri različitim temperaturama. Organizujte ih u grupu za bolje podudaranje.", - "phases": "Dodajte faze programa u {profile_name} za tačnije procjene preostalog vremena." + "msg": { + "appliance_monitor": "Monitor uređaja", + "artifact_dip_detail": "Pao ispod uobičajenog pojasa snage za ~{n}s.", + "artifact_footer": "Istaknuto na grafikonu iznad. To su prolazni artefakti (npr. vrata se otvaraju usred ciklusa), ne nužno problemi.", + "artifact_header": "{n} anomalija otkrivenih tokom ovog ciklusa", + "artifact_pause_detail": "Snaga je pala na gotovo nulu za ~{n}s, a zatim se nastavila – vjerovatno su vrata otvorena sredinom ciklusa ili je ciklus pauziran.", + "artifact_spike_detail": "Prešao iznad uobičajenog pojasa snage za ~{n}s.", + "auto_label_intro": "Dodijelite profile neoznačenim ciklusima čija pouzdanost podudaranja briše prag.", + "automations_intro": "WashData pokreće događaje {start} / {end} i izlaže entitete, pa je obavijesti i radnje najbolje graditi kao normalne automatizacije Home Assistanta. Automatizacije koje koriste ovaj uređaj prikazane su ispod.", + "cleanup_intro": "Svaki označeni ciklus se preklapa. Označite nedostatke i izbrišite da biste očistili profil.", + "clear_debug_hint": "Uklonite pohranjene podatke za otklanjanje grešaka kako biste oslobodili prostor.", + "collecting_data": "Prikupljanje podataka: još {need} ciklusa do početka finog podešavanja ({current}/{min}).", + "compare_overlay_profiles": "Profili preklapanja (slabi)", + "compare_profiles_tip": "Prekrijte druge koverte profila na gornjoj tabeli da vidite koja najbolje odgovara ovom ciklusu.", + "compare_selected_cycles": "Odabrani ciklusi (puni) – prikaži / sakrij", + "consider_new_profile": "Razmislite o kreiranju novog profila.", + "coverage_gap": "nedavni ciklusi nemaju odgovarajući profil ({pct}% od posljednjih 30).", + "coverage_gap_similar_cycles": "Pronađeno {count} sličnih neoznačenih ciklusa – kreirajte profil da počnete s njihovim uparivanjem.", + "cycles_deleted": "Izbrisano ciklusa: {count}", + "enough_data": "Dovoljno podataka za učenje ({current}/{min} ciklusa).", + "export_description": "Odaberite tačno koje profile, cikluse, postavke i ostalo želite izvesti u JSON datoteku ili analizirajte datoteku i uvezite samo željene dijelove.", + "feedback_cycles_pending": "{n} ciklus{s} za pregled", + "feedback_prompt": "Potvrdite da je ispravno, ispravite program ili zanemarite.", + "feedback_relabel_hint": "Ponovno označavanje ovog ciklusa takođe ga rješava.", + "filter_by_profile": "Filtriraj po profilu…", + "group_modal_help": "Grupni programi istog oblika koji se razlikuju po temperaturi/centru (trajanja mogu varirati). Uparivanje boduje grupu kao jednog kandidata, a zatim bira najprikladnijeg člana. Odaberite najmanje 2; prekrivanje pokazuje koliko su slični.", + "group_not_cohesive": "Ovi profili nisu dovoljno slični da bi se pouzdano grupirali, tako da ih uparivanje tretira pojedinačno sve dok ne uklonite izuzetak ili podijelite grupu.", + "group_preview_hint": "Označite 2 ili više članova za pregled i usporedbu krivulja snage.", + "import_intro": "Učitajte izvezeni fajl ili zalijepite JSON korisni učitavanje ispod.", + "legacy_actions_title": "{count} naslijeđena prilagođena radnja još uvijek radi", + "live_chart_loading": "Dijagram snage uživo se pojavljuje kako stignu očitanja.", + "loading": "Učitavanje…", + "loading_curve": "Učitavanje krivulje…", + "loading_settings": "Učitavanje postavki…", + "log_buffer_hint": "Najnovije prvo · baferuje poslednjih 500 ha_washdata zapisa od ponovnog pokretanja · prevucite donju ivicu da promenite veličinu.", + "maintenance_advisory": "Povećanje trajanja/energije može ukazivati ​​da je potrebno održavanje uređaja (npr. uklanjanje kamenca, čišćenje filtera).", + "maintenance_due": "Održavanje dospijeva: {items}", + "maintenance_intro": "Zabilježite servis koji obavljate na ovom uređaju i budite podsjećeni kada svaki zadatak ponovo dospije.", + "maintenance_load_error": "Nije moguće učitati podatke o održavanju: {error}", + "maintenance_requires_access": "Održavanje i izvoz/uvoz zahtijevaju pun pristup.", + "manual_duration_hint": "Prosječna/očekivana dužina ciklusa profila, koja se koristi za procjene preostalog vremena. Uredite da biste ga postavili; ostavljanje nepromijenjenog zadržava trenutnu vrijednost.", + "matching_tuning_intro": "Prilikom učenja, WashData također prilagođava koliko usklađivanje programa teži obliku u odnosu na trajanje i energiju.", + "merge_intro": "Odabrani ciklusi se kombinuju u jedan (hronološki red; praznine popunjene sa 0 W). Odaberite rezultirajući profil.", + "ml_intro": "WashData se isporučuje sa pametnim modelima koji rade bez upotrebe.", + "ml_learned_intro": "Modeli fino prilagođeni ovoj mašini.", + "ml_loading": "učitavanje ML-a…", + "ml_settings_intro": "Dva nezavisna prekidača: jedan primenjuje modele dok ciklus traje, drugi omogućava WashData da ih fino podesi prema vašoj mašini tokom vremena.", + "name_first_program": "Imate dovoljno ciklusa – imenujte svoj prvi program da započnete podudaranje.", + "near_duplicate_cluster": "otkriven skoro duplirani klaster profila. Grupisanje omogućava pouzdano uparivanje biranja između sličnih (npr. isti program na različitoj temperaturi/centrifikaciji).", + "no_cycles_match": "Nijedan ciklus ne odgovara trenutnom filteru.", + "no_cycles_profile": "Nema ciklusa za ovaj profil.", + "no_cycles_selected": "Prvo odaberite barem jedan ciklus.", + "no_cycles_yet": "Još uvijek nema zabilježenih ciklusa.", + "no_device_selected": "Nije odabran nijedan uređaj.", + "no_devices": "Još nema konfiguriranih uređaja WashData.", + "no_envelope": "Još nema koverte - obnovite nakon ciklusa označavanja.", + "no_envelope_overlay": "Nema dostupne koverte za preklapanje.", + "no_fine_tuned": "Još ništa fino podešeno – WashData koristi svoje ugrađene modele.", + "no_logs": "Još uvijek nema memorisanih zapisa dnevnika.", + "no_maintenance": "Održavanje još nije zabilježeno.", + "no_match_yet": "Još nema pokušaja podudaranja - ovo se popunjava tokom ciklusa trčanja.", + "no_other_users": "Nisu pronađeni drugi korisnici Home Assistant.", + "no_phases": "Nema definisanih faza.", + "no_phases_assigned": "Nema dodijeljenih faza.", + "no_profiles_compare": "Nema profila za poređenje.", + "no_profiles_overlay": "Nema profila za preklapanje.", + "no_profiles_yet": "Još nema profila. Kreirajte jedan iz označenog ciklusa.", + "no_profiles_yet_short": "Još nema profila.", + "no_settings_match": "Nijedna postavka ne odgovara \"{q}\"", + "no_split_points": "Još nema podijeljenih bodova.", + "no_suggestions": "Nema aktivnih prijedloga.", + "notify_services_hint": "Koristite ID-ove servisa {entity} (odvojene zarezima za više). Varijable predloška: {vars}.", + "old_actions_warning": "Konfigurisano sa starim uređivačem akcija (sada uklonjeno). I dalje se aktiviraju na događaje ciklusa, ali se više ne mogu uređivati ​​ovdje. Pretvorite ih u normalnu automatizaciju ili ih uklonite.", + "onboarding_progress": "{n} / 3 ciklusa promatrano", + "onboarding_watching": "Pustite uređaj da radi normalno – WashData prati. Nakon 3 ciklusa počinje podudaranje programa.", + "pending_feedback": "Čeka se povratna informacija o detekciji", + "performance_trend": "Trend performansi ({n} ciklusa)", + "pg_analysis_empty": "Učitajte ciklus da vidite analizu podudaranja.", + "pg_apply_confirm": "Primijeniti najbolju vrijednost: {label} = {value}?", + "pg_canvas_empty": "Odaberite ciklus iznad, zatim pritisnite „Učitaj“ da vidite njegovu krivu snage.", + "pg_chart_caption": "Stopa detekcije/podudaranja po vrijednostima {param}", + "pg_ctrl_intro": "Vrijednosti polaze od aktivnih postavki integracije za ovaj uređaj. Izmjene ostaju u testnom okruženju dok ih ne primijenite.", + "pg_live_unavailable": "Aktivne postavke nisu dostupne, prikazane su zadane vrijednosti.", + "pg_load_live_confirm": "Odbaciti izmjene u testnom okruženju ({n}) i ponovo učitati trenutne postavke integracije?", + "pg_match_rate": "{pct}% podudaranja na {total} ciklusa", + "pg_matches_live": "Odgovara aktivnim postavkama", + "pg_n_changed": "Promjene u odnosu na aktivne postavke: {n}", + "pg_sugg_none": "Svi prijedlozi već odgovaraju trenutnim postavkama", + "pg_preset_delete_confirm": "Izbrisati konfiguraciju \"{name}\"?", + "pg_preset_limit": "Dostignut limit konfiguracija ({n})", + "pg_preset_overwrite": "Prepisati konfiguraciju \"{name}\"?", + "pg_publish_one_confirm": "Sačuvati {label} = {value} u postavke ovog uređaja?", + "pg_restart_note": "Ponovo pokrenite Home Assistant da omogućite alate za simulaciju.", + "pg_sim_progress": "{done} / {total} ciklusa", + "pg_starting": "Pokretanje…", + "pg_stress_synthetic": "simulacija mirovanja počinje ovdje", + "pg_sweep_intro": "Šta ako bi {param} bio drugačiji? Testirajte {steps} vrijednosti na vaših posljednjih {cycles} ciklusa da pronađete postavku pri kojoj se najviše ciklusa ispravno podudara.", + "pg_sweep_step": "Korak {done} / {total}", + "pg_undetected": "{n} neotkrivenih ciklusa", + "pg_verdict_bad": "Zahtijeva pažnju: mnogi ciklusi ostaju neotkriveni.", + "pg_verdict_good": "Dobro podešeno: većina ciklusa se ispravno prepoznaje i podudara.", + "pg_verdict_ok": "Prihvatljivo: neki ciklusi su propušteni. Pokušajte smanjiti prag pokretanja.", + "phase_catalog_intro": "Imenovani segmenti ciklusa (predpranje, grijanje, centrifuga…). Dodijelite ih profilu sa njegove kontrolne ploče.", + "phase_ranges_intro": "Opsezi faza (minuti od početka ciklusa) preklapaju se na krivulju prosjeka. Uredite vrijednosti za pregled uživo.", + "playground_intro": "Sigurno okruženje za ponovnu reprodukciju prošlih ciklusa s različitim postavkama, poređenje dvije konfiguracije jednu pored druge i pregled kako se ciklus poravnava s profilom. Ništa ovdje ne mijenja vaše aktivne podatke dok to izričito ne primijenite.", + "playground_needs_restart": "Ponovo pokrenite Home Assistant da omogućite alate Testnog okruženja.", + "preferences_admin": "Preference, panel i kontrola pristupa", + "preferences_adv": "Postavke", + "prefs_personal": "Ovo se odnosi samo na vaš račun Home Assistant.", + "font_size_hint": "Povećajte ili smanjite sve u ovoj ploči. Primjenjuje se na vaš račun na ovom uređaju.", + "process_history_hint": "Ponovo pokrenite uparivanje na svim pohranjenim ciklusima, osvježite prijedloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i preračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.", + "profile_deleted": "Profil izbrisan", + "profile_poor_health_detail": "Ciklusi koji su dodijeljeni ovom profilu imaju nedosljedne oblike ili nisku pouzdanost. Razmislite o ponovnoj izgradnji omotača ili pregledu označenih ciklusa.", + "profiles_intro": "Kliknite na profil za statistiku, faze i čišćenje. Grupirajte skoro identične programe (isti oblik/trajanje, različita temperatura ili centrifuga) tako da se pouzdano podudaranje bira između njih.", + "rbac_hint": "Kada je isključeno, svaki korisnik Home Assistant-a ima puni pristup (podrazumevano). Administratori uvijek imaju pun pristup i mogu upravljati svima.", + "recent_logs": "Nedavni zapisi ha_washdata", + "recording_in_progress": "Snimanje je u toku", + "reminders_intro": "Prikaži podsjetnik u panelu toliko ciklusa nakon posljednjeg servisa. Ostavite prazno ili 0 da isključite podsjetnik.", + "restart_gap_footer": "Istaknuto na grafikonu. Podaci o snazi nedostaju za ove intervale; uparivanje je koristilo samo stvarne očitavanja.", + "restart_gap_header": "{n} HA restart praznina tokom ovog ciklusa", + "restart_gap_item": "{dur} praznina", + "review_confirm_help": "Potvrdite da li je ovaj ciklus ispravno detektovan. Vaše recenzije obučavaju model na vašoj mašini - što više ciklusa potvrdite, bolje se podudaraju i ocjenjuju zdravlje. Dovoljno je brzo dobro/loše.", + "review_in_settings": "Pregledajte u Postavkama", + "review_notes_placeholder": "Bilješke (opcionalno)", + "review_notes_tip": "Bilješke u slobodnom tekstu za vlastitu referencu. Ne koristi se za uparivanje ili obuku.", + "review_profile_tip": "Program ovog ciklusa je označen kao. Ako je program koji je automatski detektovan bio pogrešan, ispravite to ovdje - označavanje uči podudaranje za buduće cikluse.", + "review_quality_tip": "Koliko je čist ovaj ciklus. Dobar = primjer iz udžbenika ovog programa; Loše = otkriveno, ali bučno ili netipično; Neupotrebljivo = pogrešno otkriveno (spojeno, skraćeno ili lažno). Upravlja ocjenu zdravlja i koji ciklusi su dozvoljeni za obuku modela.", + "review_recorded_tip": "Označite ovo kao ručno odabran referentni ciklus za njegov program - ista uloga kao i ručno snimljeni ciklus. Referentni ciklusi se uvijek čuvaju, postavljaju podudarni predložak i nikada se ne ispuštaju čišćenjem. (Ovo je \"zlatna\"/snimljena zastava; obje su ista stvar.)", + "review_tags_tip": "Opcione zastavice koje opisuju šta je pošlo po zlu s ovim ciklusom, tako da obuka i čišćenje mogu to objasniti.", + "review_to_cycles": "Otvorite red za pregled ciklusa", + "saving_triggers_reload": "Spremanje pokreće ponovno učitavanje integracije. HA entiteti se mogu nakratko prikazati kao nedostupni.", + "search_placeholder": "Postavke pretraživanja…", + "see_recorder": "Pogledajte widget snimača ispod", + "setting_changed": "Promijenjeno sa {old} na {new} dana {date}", + "settings_basic_note": "Prikazuju se osnovne postavke. Prebacite na Napredno za potpunu listu.", + "shape_drift_advisory": "⚠ Drift oblika", + "shape_drift_detail": "Obrazac snage za ovaj profil je promijenjen tokom vremena – mogući habanje uređaja ili potrebno održavanje (npr. uklanjanje kamenca, čišćenje filtera).", + "show_all_settings": "Prikaži sve postavke", + "showing_suggestions": "Prikazana je postavka {count} s prijedlozima.", + "split_intro": "Kliknite na grafikon da biste dodali ili uklonili tačku razdvajanja, ili automatsko otkrivanje po prazninama u mirovanju. Svaki rezultujući segment može dobiti svoj profil.", + "storage_diagnostics": "Statistika pohrane, održavanje, izvoz/uvoz", + "sug_staged": "Postavljeno {key} = {val}. Sačuvajte za primjenu.", + "sug_muted": "Ova postavka više neće biti predlagana", + "sug_mute_failed": "Nije moguće utišati prijedlog", + "sug_unmuted_all": "Utišani prijedlozi poništeni", + "n_suggestions_muted": "{count} utišano; automatski podešavač neće predlagati ove postavke.", + "toast_auto_detect_enabled": "Automatsko prepoznavanje omogućeno", + "toast_auto_label_complete": "Automatsko označavanje završeno", + "toast_auto_label_failed": "Automatsko označavanje neuspješno: {error}", + "toast_automation_failed": "Nije moguće kreirati automatizaciju: {error}", + "toast_automation_migrated": "Radnje premještene u automatizaciju; otvaranje uređivača", + "toast_convert_failed": "Konverzija neuspješna: {error}", + "toast_create_failed": "Kreiranje neuspješno: {error}", + "toast_delete_failed": "Brisanje neuspješno: {error}", + "toast_error": "Greška: {error}", + "toast_failed": "Neuspješno: {error}", + "toast_force_stop_failed": "Prisilno zaustavljanje neuspješno: {error}", + "toast_name_required": "Naziv je obavezan", + "toast_no_automation": "Ovdje nije moguće kreirati automatizaciju", + "toast_profile_name_required": "Naziv profila je obavezan", + "toast_program_set": "Program postavljen: {program}", + "toast_rebuild_failed": "Obnova neuspješna: {error}", + "toast_resume_failed": "Nastavak neuspješan: {error}", + "toast_revert_failed": "Povrat neuspješan: {error}", + "toast_reverted": "{key} vraćeno", + "toast_save_failed": "Snimanje neuspješno: {error}", + "trend_duration_longer": "Trajanje u trendu duže ({pct}%/ciklus) – nedavno prosječno {avg}", + "trend_duration_shorter": "Trajanje trenda kraće ({pct}%/ciklus) – nedavno prosječno {avg}", + "trend_energy_down": "Opadanje energije ({pct}%/ciklus)", + "trend_energy_up": "Energetski trend porasta ({pct}%/ciklus) – nedavni prosjek {avg}", + "trim_destructive_confirm": "Ovo zadržava samo {pct}% ciklusa i ne može se poništiti. Nastaviti?", + "trim_intro": "Prevucite crvene ručke ili unesite vrijednosti. Sve van prozora je uklonjeno.", + "tuning_suggestions_available": "{count} prijedlog podešavanja dostupan je iz posmatranih ciklusa. Pojavljuju se pored relevantnih polja.", + "unsure_detected_prefix": "WashData nije siguran da je otkriven", + "updated": "Ažurirano", + "warmup_badge": "Još uvijek uči ({done}/{needed} ciklusa)", + "warmup_detail": "Ovom profilu je potrebno {needed} označenih ciklusa prije nego što počne automatsko uparivanje. Svaki potvrđeni ciklus pomaže učenju.", + "wipe_history_warning": "Trajno obrišite sve cikluse i profile. Ne može se poništiti.", + "compare_overlay_tip": "Preklopite naučene koverte profila da vidite na koji program podsjeća svaki ciklus.", + "duration_trend_up_tip": "Trajanje raste ({pct}%/ciklus)", + "duration_trend_down_tip": "Trajanje pada ({pct}%/ciklus)", + "energy_trend_up_tip": "Energija raste ({pct}%/ciklus)", + "energy_trend_down_tip": "Energija pada ({pct}%/ciklus)", + "performance_trending": "Trend performansi", + "pg_select_cycle_hint": "Odaberite ciklus i kliknite ↺ za učitavanje", + "pg_sweep_progress": "Korak {done} / {total}", + "pg_analysis_hint": "Odaberite ciklus i kliknite ↺ za učitavanje analize.", + "diagnostics_load_failed": "Nije moguće učitati dijagnostiku: {error}", + "manual_duration_ref_hint": "Koristi se samo kada nije odabran referentni ciklus. Referentni ciklus postavlja trajanje prema vlastitoj dužini.", + "toast_convert_rolled_back": "Konverzija nije uspjela i poništena je (nije ostala nijedna automatizacija): {error}", + "toast_convert_orphan": "Automatizacija je kreirana, ali brisanje starih radnji nije uspjelo. Nemojte pokušavati ponovo: ručno uklonite stare radnje kako biste izbjegli dupliranu automatizaciju.", + "advisory_duration_trend_up": "Ciklusi programa '{name}' postaju sve duži (otprilike +{pct}% po ciklusu). Ako se ponašanje uređaja promijenilo, ponovo snimite ili obnovite ovaj profil.", + "advisory_energy_trend_up": "Program '{name}' troši sve više energije (otprilike +{pct}% po ciklusu) - vrijedi provjeriti uređaj ako je to neočekivano.", + "advisory_poor_health": "Profil '{name}' ima nisku ocjenu podudaranja - njegovi noviji ciklusi znatno variraju ili se slabo podudaraju. Pregledajte njegove cikluse ili ponovo snimite profil kako bi prepoznavanje i procjene vremena ostali tačni.", + "advisory_shape_drift": "Profil '{name}' je znatno odstupio od svog prvobitnog oblika potrošnje snage. Uređaj je možda vremenom promijenio ponašanje (npr. kamenac, habanje). Razmislite o ponovnom snimanju ovog profila sa novijim ciklusima.", + "advisory_shape_drift_corr": "Profil '{name}' je znatno odstupio od svog prvobitnog oblika potrošnje snage (korelacija {corr}). Uređaj je možda vremenom promijenio ponašanje (npr. kamenac, habanje). Razmislite o ponovnom snimanju ovog profila sa novijim ciklusima.", + "pg_no_alerts": "U ovom pokretanju nisu otkriveni problemi.", + "pg_override_active": "Koriste se vaše izmijenjene postavke umjesto trenutnih", + "pg_history_intro": "Ponovo reproducirajte svoje nedavne cikluse kroz stvarni detektor i mehanizam podudaranja. Prvo izmijenite postavku detekcije u načinu Simuliraj da biste ovdje vidjeli poređenje prije/poslije.", + "pg_history_empty": "Pritisnite Pokreni za reprodukciju svojih ciklusa.", + "pg_history_summary": "{detected}/{total} detektovano · {correct} ispravno podudareno", + "pg_sweep_no_metric": "Nedovoljno podataka za ocjenu ovog cilja.", + "pg_sweep_intro2": "Pronađite postavku koja najbolje ispunjava cilj za vaše nedavne cikluse. Ništa se neće promijeniti dok je ne primijenite.", + "pg_running_history": "Ponovno izvođenje vaših ciklusa…", + "pg_running_sweep": "Ispitivanje vrijednosti kroz sve vaše cikluse…", + "pg_row_load_hint": "Učitaj ovaj ciklus u grafikon iznad", + "pg_history_intro2": "Ponovo izvedite svoje nedavne cikluse kroz stvarni detektor i modul za podudaranje s postavkama iznad. Kliknite bilo koji red da učitate taj ciklus u grafikon; izmijenite postavku da vidite poređenje prije i poslije.", + "pg_simulating": "Simuliranje ciklusa…", + "pg_canvas_empty2": "Odaberite ciklus iznad i pritisnite Pokreni da ga simulirate. Zatim pređite mišem za prikaz vrijednosti, pomjerajte točkić za zumiranje i povucite za pomjeranje.", + "pg_apply_settings_confirm": "Sačuvati ovih {n} postavki na ovaj uređaj? {list}", + "pg_stress_terminated_detail": "Ustalilo se na ~{idle}W mirovanja -- ciklus je završio {h} h {m} min kasnije putem {reason}.", + "pg_stress_above_threshold_detail": "Potrošnja u mirovanju ~{idle}W jednaka je ili viša od stvarnog praga zaustavljanja ({stop}W) -- ciklus nikad nije zabilježen kao miran. Za ispravku povećajte stop_threshold_w.", + "pg_stress_hit_cap_detail": "Ciklus je radio {h} h {m} min bez zaustavljanja -- prisilno zaustavljen sigurnosnim limitom. Potrošnja u mirovanju {idle}W u odnosu na prag zaustavljanja {stop}W.", + "no_logs_match": "Nijedan zapis dnevnika ne odgovara ovim filterima.", + "pg_analysis_hint2": "Odaberite ciklus i pritisnite Pokreni za učitavanje analize podudaranja.", + "pg_analysis_empty2": "Pritisnite Pokreni za prikaz analize podudaranja.", + "imported_readonly": "Uvezeno iz zajedničke trgovine. Prikazano za referencu i podudaranje. Ne broji se u vašu statistiku i ne može se uređivati.", + "merge_no_imports": "Uvezene snimke ne mogu se spojiti sa stvarnim ciklusom. Poništite njihov odabir da biste ih spojili.", + "store_enable_hint": "Omogućite online funkcije u Postavkama da biste mogli pregledavati i uvoziti referentne cikluse zajednice.", + "online_intro": "Dijelite i preuzimajte referentne cikluse s drugim korisnicima WashData. Sve online funkcije su dobrovoljne i podrazumijevano isključene.", + "store_share_intro": "Otpremite ovaj referentni ciklus kako bi ga mogli koristiti drugi s istim uređajem. Pregleda se prije nego što postane javno dostupan.", + "online_intro_global": "Pregledavajte i dijelite referentne snimke s drugim korisnicima WashData te potvrđujte unose uređaja. Jedna veza vrijedi za cijelu vašu WashData integraciju; marka i model uređaja postavljaju se za svaki uređaj u odjeljku Osnovno. Sve online funkcije su dobrovoljne i podrazumijevano isključene.", + "online_unavailable": "Online funkcije nisu dostupne na ovom serveru.", + "store_picker_offline": "Omogućite online funkcije u zupčaniku postavki da biste birali iz kataloga zajednice.", + "pick_brand_first": "Prvo odaberite marku uređaja.", + "model_not_found": "Još nije u katalogu.", + "connect_to_confirm": "Povežite se u zupčaniku postavki da biste potvrdili ili ocijenili.", + "adopt_settings_hint": "Primijeni postavke otkrivanja i uspoređivanja dijeljenog uređaja na ovaj uređaj", + "include_settings_hint": "Uključi pragove otkrivanja, težine uspoređivanja i ostale parametre u dijeljeni paket", + "onboard_download": "Preuzmi gotove postavke iz prodavnice zajednice", + "share_consent": "Dijelite stvarne podatke sa svog uređaja. Ne dijelite ako su vaši obrasci korištenja privatni.", + "share_device_none": "Još nema postavljenih uređaja. Prvo dodajte uređaj.", + "share_guideline_naming": "Koristite jasna imena programa (npr. 'Cotton 40', 'Eco 60') kako bi ih drugi mogli prepoznati", + "share_guideline_quality": "Dijelite samo profile sa ⭐ referentnim ciklusima ili najmanje {n} potvrđenih pokretanja", + "share_guideline_review": "Pregledajte profile prije dijeljenja -- uklonite one koji izgledaju pogrešno", + "share_guidelines_title": "Prije dijeljenja", + "store_download_device_intro": "Preuzmite postavke uređaja iz zajednice i primijenite ih na novi ili postojeći uređaj", + "store_share_device_intro": "Podijelite programe svog uređaja (profile + referentne cikluse) sa zajednicom. Postavke su opcione.", + "share_profile_no_cycles": "Profil '{p}' nema ⭐ referentnih ciklusa -- bit će preskočen osim ako nemate {n}+ potvrđenih pokretanja", + "advisory_phase_inconsistent": "Čini se da '{name}' miješa različite programe ili temperature - njegovi ciklusi se griju vrlo različito dugo. Podjela na zasebne profile (npr. po temperaturi) poboljšat će podudaranje i procjene vremena.", + "advisory_phase_inconsistent_title": "⚠ Možda pomiješani programi", + "export_select_intro": "Označite tačno šta treba uključiti. Odabir profila bez njihovih ciklusa i dalje izvozi prepoznatljiv program (njegov naučeni oblik prenosi se s njim).", + "import_analyze_hint": "Učitajte izvezenu datoteku (ili zalijepite njen JSON). WashData je analizira i tačno prikazuje šta se može uvesti prije nego što se išta promijeni.", + "analyzing": "Analiziranje…", + "device_type_mismatch_warn": "Ovaj izvoz je s druge vrste uređaja ({src} vs {local}). Programe i cikluse i dalje je moguće uvesti kao referentne podatke, ali postavke specifične za uređaj i uvoz stvarne historije su onemogućeni.", + "merge_hint": "Uvezene stavke se dodaju; ništa lokalno se ne gubi. Sukobi naziva rješavaju se u nastavku.", + "replace_warn": "Svaka označena kategorija briše se i zamjenjuje podacima iz datoteke. Neoznačene kategorije ostaju nepromijenjene.", + "dest_reference_hint": "Uvezeni ciklusi samo poboljšavaju prepoznavanje programa i nikada ne utiču na statistiku potrošnje/energije.", + "dest_real_history_hint": "Uvezeni ciklusi računaju se kao vlastita historija ovog uređaja i doprinose statistici energije/potrošnje. Koristite pri premještanju jednog uređaja na novu instalaciju." }, - "phase4": { - "healthy": "Ovaj uređaj je u potpunosti postavljen ({profile_count} profila)." + "phase_desc": { + "anti_crease": "Povremena kratka spuštanja nakon završetka za smanjenje bora.", + "anti_wrinkle": "Periodično prevrtanje nakon ciklusa za smanjenje bora.", + "cool_down": "Vrtanje bez grijanja blizu kraja ciklusa.", + "drain_and_switch": "Period prijelaza sa pranja na način sušenja.", + "dry": "Faza sušenja pomoću grijača i/ili preostale topline.", + "drying": "Glavni period grijanja.", + "heat_up": "Početno zagrijavanje grijača prije početka potpunog sušenja.", + "pre_rinse": "Prvo prskanje prije pranja deterdžentom.", + "pre_wash": "Prvo namakanje ili predtretman prije glavnog pranja.", + "rinse": "Faza ispiranja čistom vodom. Ova faza se može ponoviti više puta.", + "sanitize": "Faza čišćenja na visokim temperaturama za programe dezinfekcije.", + "sensor_check": "Kratka pauza niske snage dok se mjeri suhoća.", + "soak": "Razdoblje namakanja niske aktivnosti između aktivnih faza pranja.", + "soak_dw": "Produženi period namakanja za teška tla.", + "spin": "Ekstrakcija velike brzine za uklanjanje vode iz tereta.", + "spin_wd": "Ekstrakcija velikom brzinom prije prijelaza na sušenje.", + "wash": "Glavni ciklus pranja sa pomicanjem bubnja i opcionim grijanjem.", + "wash_dw": "Glavni deterdžent za pranje sa grijanjem." }, - "cta": { - "start_recording": "Pokreni snimanje", - "label_detected_cycle": "Već imam otkriven ciklus – umjesto toga ga označi", - "browse_cycles": "Pregledaj cikluse za označavanje sljedećeg", - "view_profiles": "Prikaži svoje profile", - "create_from_cluster": "Napravi profil od ovih ciklusa", - "create_profile": "Napravi za njega profil", - "review_suggestions": "Preglej prijedloge", - "organise_profiles": "Organizuj profile", - "configure_phases": "Konfiguriraj faze", - "skip_step": "Preskoči ovaj korak", - "skip_forever": "Ne prikazuj više", - "hide_guidance": "Sakrij upute", - "show_guidance": "Prikaži upute" + "placeholder": { + "add": "dodaj…", + "group_name": "npr. Pamuk 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "dodaj servis obavještavanja…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "dodaj osobu…", + "phase_name": "npr. Pranje", + "profile_name": "npr. Pamuk 40°C", + "maintenance_notes": "npr. zamijenjen filter, očišćena brtva vrata", + "store_brand": "npr. Bosch", + "store_model": "npr. WAT28401" + }, + "pref": { + "date_absolute": "Apsolutno (npr. 14:32 2. jula)", + "date_relative": "Relativno (npr. prije 2 sata)", + "lang_auto": "Sistemski podrazumijevani ({lang})", + "lang_en": "Engleski", + "use_panel_default": "(podrazumijevano ploče)" + }, + "quality": { + "bad": "Loše", + "good": "Dobro", + "unusable": "Neupotrebljivo" + }, + "section": { + "dishwasher": { + "label": "Mašina za pranje posuđa", + "intro": "Obrada kraja ciklusa za mašine za pranje posuđa, koje obično završavaju dugom, gotovo tihom fazom sušenja prije kratkog završnog ispumpavanja vode." + }, + "anti_wrinkle": { + "intro": "Mod anti-gužvanja/anti-nabora otkriva impulse bubnjevanja niske snage nakon glavne faze i drži ih vezane za završeni ciklus.", + "label": "Anti-gužvanje" + }, + "basic": { + "intro": "Osnovi identitet i osnove koje većina postavki treba.", + "label": "Osnovno" + }, + "delay": { + "intro": "Detekcija odloženog starta prepoznaje kada je uređaj uključen ali još nije počeo ciklus.", + "label": "Odloženi start" + }, + "detection": { + "intro": "Kako se ciklus otkriva kao pokrenuti, aktivni i završeni.", + "label": "Detekcija" + }, + "matching": { + "intro": "Kako se završeni ciklusi podudaraju s naučenim profilima i označavaju.", + "label": "Podudaranje" + }, + "ml_training": { + "intro": "Raspored ponovne obuke strojnog učenja na uređaju i postavke podataka.", + "label": "ML obuka" + }, + "notifications": { + "intro": "Kada i kako dobivate obavijesti o događajima ciklusa.", + "label": "Obavijesti" + }, + "timing": { + "intro": "Pozadinski ritam, offline čuvar i domaćinstvo.", + "label": "Tajming i čuvar" + }, + "triggers": { + "intro": "Opcioni vanjski signali: okidač kraja, senzor vrata, prekidač za pauzu i podsjetnik za istovar.", + "label": "Okidači i vrata" + }, + "phase_eta": { + "label": "Preostalo vrijeme", + "intro": "Preostalo vrijeme koje uzima u obzir faze, za uređaje čija dužina ciklusa ovisi o temperaturi ili centrifugi." + } + }, + "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Otpuštanje nakon tihe faze sušenja", + "doc": "Kada ciklus pređe svoje očekivano trajanje, koliko dugo mašina mora ostati tiha (ispod Praga zaustavljanja) prije nego što WashData prestane čekati na završno ispumpavanje vode i završi ciklus. Povećajte ako vaš uređaj ima dugu tihu fazu sušenja prije kasnog završnog ispumpavanja koje se propušta - šire okno omogućava da naučeno trajanje prati sezonske promjene (hladnija dovodna voda = duži ciklusi) umjesto da ostane zaključano na staroj prosječnoj vrijednosti. Čekanje samo skraćuje u odnosu na interno ograničenje završnog ispumpavanja od 30 minuta, nikada ga ne produžava." + }, + "anti_wrinkle_enabled": { + "doc": "Prepoznajte kratke impulse male snage koje sušilica emituje nakon glavne faze zagrijavanja i držite ih priključene na završeni ciklus umjesto da ih čitate kao nove cikluse.", + "label": "Omogućiti detekciju anti-gužvanja" + }, + "anti_wrinkle_exit_power": { + "doc": "Snaga mora pasti ispod ove između impulsa da bi režim protiv bora ostao aktivan.", + "label": "Prag izlazne snage" + }, + "anti_wrinkle_idle_timeout": { + "doc": "Koliko dugo mašina smije ostati mirna između dva impulsa bubnja prije nego što se režim anti-gužvanja završi. Postavite ga iznad najdužeg razmaka koji vaša sušilica ostavlja između impulsa, inače se svaki naredni impuls čita kao lažni početak.", + "label": "Maksimalni razmak između impulsa" + }, + "anti_wrinkle_max_duration": { + "doc": "Pulsevi duži od ovog tretiraju se kao pravi ciklus, a ne kao nalet protiv bora.", + "label": "Maksimalno trajanje" + }, + "anti_wrinkle_max_power": { + "doc": "Puls iznad ove snage tretira se kao pravi novi ciklus, a ne kao protiv bora. Postavite tik iznad snage impulsa prevrtanja.", + "label": "Maks snaga anti-gužvanja" + }, + "auto_label_confidence": { + "doc": "Ako je rezultat meča na kraju ciklusa na ili iznad ovog, program se automatski označava bez ikakvog upita za potvrdu. Podignite ga da zahtijeva veću sigurnost prije automatskog označavanja; snizite ga da više automatizujete. Radi u kombinaciji sa Learning Confidence ispod njega.", + "label": "Pouzdanost automatskog označavanja" + }, + "auto_maintenance": { + "doc": "Pokrenite noćno održavanje: obnovite omote profila, ponovo izračunajte zdravlje ciklusa, smanjite tragove otklanjanja grešaka i zadržite najnovije cikluse.", + "label": "Automatsko održavanje (noćno čišćenje)" + }, + "completion_min_seconds": { + "doc": "Ciklusi kraći od ovoga se odbacuju kao ciklusi duhova (probni radovi, otvaranje vrata da se doda čarapa).", + "label": "Min trajanje ciklusa" + }, + "delay_confirm_seconds": { + "doc": "Napajanje mora ostati u opsegu pripravnosti ovoliko dugo prije nego što se uređaj tretira kao da čeka da se pokrene, a ne da radi.", + "label": "Sekunde potvrde" + }, + "delay_start_detect_enabled": { + "doc": "Otkrijte kada je uređaj uključen i čeka (odgođeni početak/pripravnost), ali nije započeo svoj ciklus, tako da se povlačenje u pripravno stanje ne smatra greškom u radu.", + "label": "Omogućiti detekciju odloženog starta" + }, + "delay_timeout_hours": { + "doc": "Prestanite čekati u režimu odgođenog pokretanja nakon ovoliko sati i vratite se u stanje mirovanja, tako da mašina koja je ostala uključena, ali nikada nije pokrenuta, ne čeka zauvijek.", + "label": "Sati timeouta" + }, + "device_type": { + "doc": "Klasa aparata. Postavlja razumne zadane vrijednosti detekcije (pragovi, kašnjenje isključenja, rukovanje na kraju) podešene za taj tip uređaja; promijenite ga samo ako je uređaj prvobitno podešen kao pogrešan tip.", + "label": "Tip uređaja" + }, + "door_sensor_entity": { + "doc": "Opcioni binarni senzor vrata. Koristi se za otkrivanje kada je uređaj otvoren/istovaren nakon ciklusa.", + "label": "Entitet senzora vrata" + }, + "duration_tolerance": { + "doc": "Tolerancija za procjene preostalog vremena (povratne informacije učenja, ne podudaranje). Ako je stvarno trajanje unutar +/-X% procjene, to se računa kao dobro podudaranje.", + "label": "Tolerancija procjene" + }, + "enable_ml_models": { + "doc": "Dok ciklus traje, pustite modele da preciziraju rezultate uživo: stabilniju procjenu preostalog vremena i energije/troškova, i zaštitu od preranog zaustavljanja pri detekciji kraja (može samo odgoditi završetak, nikada ne završiti ranije, i ograničen je). Koristi vaše fino podešene modele kada su dostupni, inače ugrađene. Isključeno = samo klasična logika zasnovana na napajanju (i dalje pouzdana).", + "label": "Primijeniti pametne modele tokom ciklusa" + }, + "end_energy_threshold": { + "doc": "Tokom odbrojavanja sa kašnjenjem, akumulirana energija (vati x vrijeme) se upoređuje sa ovim pragom. Ako se prekorači, odbrojavanje se poništava - držeći klupe protiv gužvanja i repove za sušenje u mašini za pranje sudova pričvršćene za ciklus umesto da ih skrate. Podignite ga ako se ciklusi završe prerano tokom hlađenja; snizite ako je detekcija spora.", + "label": "Završna energija" + }, + "end_repeat_count": { + "doc": "Broj uzastopnih očitavanja ispod praga zaustavljanja potrebnih prije završetka ciklusa. 1 je u redu za većinu utikača. Povećajte na 2-3 ako vaš pametni utikač povremeno prijavi uzorak lažne nule usred ciklusa i vaši ciklusi se završavaju prerano.", + "label": "Broj ponavljanja kraja" + }, + "energy_price_entity": { + "doc": "Senzor sa trenutnom cijenom električne energije po kWh (npr. dinamička tarifa). Ima prednost nad statičnom cijenom ispod. Svaki ciklus zamrzava cijenu koja je na snazi ​​kada se završi.", + "label": "Entitet cijene energije" + }, + "energy_price_static": { + "doc": "Fiksna cijena po kWh koja se koristi za brojke troškova kada nije postavljen nijedan entitet cijene uživo iznad.", + "label": "Statična cijena energije (po kWh)" + }, + "energy_sensor": { + "doc": "Opcionalno kumulativno brojilo energije (total_increasing kWh/Wh, npr. vlastito brojilo ukupne potrošnje utičnice). Kada je postavljeno, energija prijavljena za svaki ciklus uzima se iz razlike očitanja ovog brojila između početka i kraja, čime se izbjegava podbrojavanje koje nastaje integriranjem sporo izvještavajućeg senzora snage. Vraća se na integriranu vrijednost ako očitanje nedostaje, njegova jedinica je nepoznata ili razlika nije pozitivna. Ostavite prazno da nastavite integrirati senzor snage.", + "label": "Entitet brojila energije" + }, + "expose_debug_entities": { + "doc": "Objavite dodatne dijagnostičke HA entitete (pouzdanost podudaranja, dvosmislenost, unutrašnje karakteristike stanja). Isključeno održava listu entiteta čistom za normalnu upotrebu.", + "label": "Izložiti entitete za otklanjanje grešaka" + }, + "external_end_trigger": { + "doc": "Binarni senzor čija promjena stanja označava kraj ciklusa (npr. \"završen\" kontakt uređaja ili integracija pratioca).", + "label": "Entitet vanjskog okidača" + }, + "external_end_trigger_enabled": { + "doc": "Neka vanjski binarni senzor signalizira kraj ciklusa, uz ugrađenu detekciju zasnovanu na snazi.", + "label": "Omogućiti vanjski okidač kraja" + }, + "external_end_trigger_inverted": { + "doc": "Tretirajte isključivanje senzora okidača (a ne UKLJUČENO) kao signal za kraj ciklusa.", + "label": "Invertirati vanjski okidač (okidač pri ISKLJUČIVANJU)" + }, + "learning_confidence": { + "doc": "Ako rezultat podudaranja pada između ovog i Auto-Label Confidence, povratno obavještenje traži od vas da potvrdite identificirani program. Ispod ovog rezultata meč je previše neizvjestan da bi se pojavio. Mora se držati ispod pouzdanosti automatske oznake.", + "label": "Pouzdanost učenja" + }, + "linked_device": { + "doc": "Opcionalno ugniježdite ovaj WashData uređaj ispod drugog uređaja (npr. pametnog priključka) u registar HA uređaja, prikazan kao \"Povezan putem ...\".", + "label": "Grupisati pod uređaj" + }, + "min_off_gap": { + "doc": "Ako se mašina isključi na kraće od ovog vremena, sekvenca uključivanja/isključivanja/uključivanja se tretira kao jedan kontinuirani ciklus. Sprečava podjelu programa namakanja (mašina se isključuje nekoliko minuta usred pranja) u dva odvojena ciklusa. Postavite ga kraćim od razmaka između vaših uzastopnih opterećenja ako želite da se oni računaju kao zasebni ciklusi. Zadane postavke tipa uređaja štite tipičnu pauzu unutar ciklusa za svaki uređaj.", + "label": "Min razmak isključivanja" + }, + "min_power": { + "doc": "Apsolutna minimalna snaga smatra se aktivnom. Očitavanja ispod ovoga se tretiraju kao 0 W (pripravnost), filtrirajući fantomsko opterećenje pametnih utikača i LED dioda u stanju pripravnosti.", + "label": "Minimalna snaga" + }, + "ml_training_enabled": { + "doc": "Periodično proučavajte svoje recenzirane cikluse preko noći i fino prilagodite modele ovoj specifičnoj mašini. Promjena se zadržava samo kada zaista ima bolje rezultate u ciklusima koji se zadržavaju, tako da ovo može samo pomoći ili ostati ista - nikada ne nazadovati.", + "label": "Učiti od ove mašine" + }, + "ml_training_hour": { + "doc": "Lokalni sat u danu (0-23) za fino podešavanje preko noći. Odaberite mirni sat kao što je 2 (02:00).", + "label": "Učiti u satu" + }, + "ml_training_interval_days": { + "doc": "Ponovo provjerite ima li poboljšanja najviše jednom u ovoliko dana.", + "label": "Provjeravati najvjše svakih" + }, + "ml_training_min_cycles": { + "doc": "Pričekajte dok se barem ovoliko ciklusa ne snimi prije finog podešavanja, tako da ima dovoljno za učiti.", + "label": "Ciklusi potrebni prvo" + }, + "name": { + "doc": "Ime za prikaz prikazano na listi HA integracija i registru uređaja.", + "label": "Naziv uređaja" + }, + "no_update_active_timeout": { + "doc": "Ako ne stigne ažuriranje napajanja ovoliko dugo dok radi, pretpostavite da je utikač ispao van mreže i prisilno se zaustavite kako biste izbjegli zombi ciklus. Zadanih 600 s dozvoljava kašnjenje u oblaku ili mreži.", + "label": "Timeout bez ažuriranja" + }, + "notify_before_end_minutes": { + "doc": "Pošaljite upozorenje Gotovo kada procijenjeno preostalo vrijeme padne ispod ovog. 0 to onemogućava.", + "label": "Upozorenje pred kraj" + }, + "notify_channel": { + "doc": "Naziv kanala Android obavijesti za početne/uživo poruke (kontrolira zvuk po kanalu i prioritet na mobilnoj aplikaciji). Prazno koristi zadanu prateću aplikaciju.", + "label": "Android kanal (pokretanje/uživo)" + }, + "notify_cycle_timers": { + "doc": "Obavještenja u određenim minutama u ciklusu (npr. za dodavanje omekšivača). Poruka podržava {device}, {program}, {minutes}. Omogućite automatsku pauzu da biste pauzirali u tom trenutku i primili interaktivno obavještenje pomoću gumba Nastavi; nastaviti putem panela, usluge pauze/nastavljanja ili radnje obavještenja.", + "label": "Tajmeri ciklusa" + }, + "notify_finish_channel": { + "doc": "Naziv kanala Android obavještenja za završnu poruku. Blank ponovo koristi početni/uživo kanal.", + "label": "Android kanal (završetak)" + }, + "notify_finish_message": { + "doc": "Tekst poslan kada se ciklus završi. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. {time_finished} i {vs_typical} su ovdje najkorisniji.", + "label": "Poruka završetka" + }, + "notify_finish_services": { + "doc": "notify.* usluge se pozivaju kada se ciklus završi. Dodajte jednu po meti; ostavite prazno da nema obavještenja o završetku.", + "label": "Usluge završetka" + }, + "notify_fire_events": { + "doc": "Također aktivirajte ha_washdata_* događaje na početku/završetku ciklusa kako biste mogli izgraditi vlastite automatizacije.", + "label": "Pokrenuti HA događaje za obavijesti" + }, + "notify_icon": { + "doc": "Opcionalna mdi ikona za obavještenje (npr. mdi:mašina za pranje rublja). Ostavite prazno za zadanu platformu.", + "label": "Ikona obavijesti" + }, + "notify_live_chronometer": { + "doc": "Prikaži tajmer za odbrojavanje koji se ažurira uživo u obavještenju (na platformama koje ga podržavaju) umjesto statične procjene.", + "label": "Koristiti hronometar uživo" + }, + "notify_live_interval_seconds": { + "doc": "Koliko često se obavještenja o napretku uživo osvježavaju dok ciklus traje.", + "label": "Interval ažuriranja uživo" + }, + "notify_live_overrun_percent": { + "doc": "Ako ciklus prijeđe svoju procjenu za više od ovog postotka, pošaljite upozorenje o prekoračenju.", + "label": "Prekoračenje uživo % prije upozorenja" + }, + "notify_live_services": { + "doc": "notify.* usluge pozivaju na ažuriranja napretka uživo dok ciklus traje. Ostavite prazno da onemogućite obavještenja o napretku uživo.", + "label": "Usluge napretka uživo" + }, + "notify_only_when_home": { + "doc": "Obavještenja šaljite samo kada je barem jedna od povezanih osoba (gore) kod kuće.", + "label": "Obavijesti samo dok su kod kuće" + }, + "notify_people": { + "doc": "osoba.* entiteti koje koristi \"Notify Only When Home\" da odluči da li je neko kod kuće.", + "label": "Osobe (za samo dok su kod kuće)" + }, + "notify_pre_complete_message": { + "doc": "Tekst upozorenja prije kraja / skoro gotovo. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Poruka pred završetak" + }, + "notify_reminder_message": { + "doc": "Tekst podsjetnika za još neizvađeno rublje. Prazno koristi ugrađenu zadanu vrijednost. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Poruka podsjetnika" + }, + "notify_start_message": { + "doc": "Tekst poslan kada ciklus započne. Varijable predloška: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Poruka pokretanja" + }, + "notify_start_services": { + "doc": "notify.* usluge koje se pozivaju kada ciklus započne. Dodajte jedan po meti (telefon, kontrolna tabla, itd.); ostavite prazno da nema obaveštenja o početku.", + "label": "Usluge pokretanja" + }, + "notify_timeout_seconds": { + "doc": "Automatski odbacite obavještenje nakon ovoliko sekundi (na platformama koje ga podržavaju). 0 ga čuva dok se ne odbaci ručno.", + "label": "Automatski odbaci nakon" + }, + "notify_title": { + "doc": "Naslov obavještenja. Varijable šablona: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "Naslov obavijesti" + }, + "notify_unload_delay_minutes": { + "doc": "Nekoliko minuta nakon završetka ciklusa prije slanja podsjetnika \"istovarite mašinu\" koji još uvijek čeka. Postavite 0 da onemogućite podsjetnik.", + "label": "Kašnjenje podsjetnika za istovar" + }, + "notify_unload_repeat": { + "doc": "Ponovo šalje podsjetnik za istovar svakih \"Kašnjenje podsjetnika za istovar\" minuta dok ne otvorite vrata ili ne dodirnete \"Prestani podsjećati\" na obavijesti. Zahtijeva Entitet senzora vrata (kao i sam podsjetnik). Dugme za odbacivanje radi na obavijestima mobilne aplikacije Home Assistant (companion app).", + "label": "Ponavljaj dok se vrata ne otvore" + }, + "off_delay": { + "doc": "Vrijeme čekanja nakon pada struje prije nego što se ciklus proglasi završenim. Ako se napajanje nastavi unutar ovog prozora, ciklus se nastavlja neometano - ovo premošćuje pauze između faza pranja. Mašine za pranje posuđa imaju duge faze sušenja (isključenje na 20-60 min) tako da kašnjenje isključenja mora premašiti to da bi se cijelo pranje+sušilo kao jedan ciklus.", + "label": "Kašnjenje isključivanja" + }, + "pause_cuts_power": { + "doc": "Kada je ciklus pauziran, također isključite Switch Entity ispod. Samo za uređaje čiji se utikač može bezbedno iseći usred ciklusa.", + "label": "Pauza također isključuje napajanje (putem prekidača)" + }, + "power_off_delay": { + "doc": "Koliko dugo snaga mora ostati ispod Praga isključivanja napajanja nakon što se ciklus završi prije nego što se stanje vrati na „Isključeno“. Koristi se samo kada je Prag isključivanja napajanja iznad 0. Provjerava se na pozadinskom ritmu, tako da se efektivno kašnjenje zaokružuje naviše na sljedeći otkucaj isteka stanja.", + "label": "Kašnjenje isključivanja napajanja" + }, + "power_off_threshold_w": { + "doc": "Opciono otkrivanje isključenog stanja na osnovu snage. Kada je iznad 0, nakon što se ciklus završi i snaga ostane ispod ovog nivoa tokom Kašnjenja isključivanja napajanja, mašina se tretira kao isključena i stanje se vraća na „Isključeno“. Ostavite na 0 da onemogućite (zadano). Postavite ga iznad stvarnog nivoa isključenog napajanja, a ispod Praga zaustavljanja i ispod potrošnje vaše mašine u stanju pripravnosti (završeno, ali još uključeno); ako nije ispod Praga zaustavljanja, zanemaruje se. Kada je omogućeno, zamjenjuje Kašnjenje poništavanja napretka za povratak na „Isključeno“, tako da završena mašina ostaje na „Završeno/Čisto“ dok se stvarno ne isključi.", + "label": "Prag isključivanja napajanja" + }, + "power_sensor": { + "doc": "Entitet senzora koji prijavljuje živu snagu u vatima za ovaj uređaj (npr. sensor.washer_power). Sve detekcije ciklusa se zasnivaju na ovom signalu.", + "label": "Senzor snage" + }, + "profile_duration_tolerance": { + "doc": "Opseg +/- oko prosečnog trajanja profila koji se koristi tokom uparivanja. 0,25 znači da profil od 60 minuta odgovara ciklusima od 45-75 minuta.", + "label": "Tolerancija trajanja profila" + }, + "profile_match_interval": { + "doc": "Koliko često pokušavati uparivanje profila tokom ciklusa rada. Podrazumevano 300 s (5 minuta) balansira brzinu detekcije i CPU.", + "label": "Interval podudaranja" + }, + "profile_match_max_duration_ratio": { + "doc": "Maksimalna dužina ciklusa u odnosu na profil. 1.3 znači da ciklus mora biti manji od 130% trajanja profila da bi se podudarao.", + "label": "Maks omjer trajanja" + }, + "profile_match_min_duration_ratio": { + "doc": "Minimalna dužina ciklusa u odnosu na profil. 0,9 znači da ciklus mora biti najmanje 90% trajanja profila da bi se podudarao.", + "label": "Min omjer trajanja" + }, + "profile_match_threshold": { + "doc": "Minimalni rezultat sličnosti (0-1) potreban na kraju ciklusa da bi se prihvatila identifikacija programa. Podignite ga da smanjite pogrešne identifikacije; snizite ga ako se programi vaše mašine ne poklapaju. Zadana vrijednost 0,4 je konzervativna polazna tačka.", + "label": "Prag podudaranja" + }, + "profile_unmatch_threshold": { + "doc": "Ako utakmica u sredini ciklusa uživo padne ispod ovog rezultata, privremena identifikacija se briše. Držite ga malo ispod praga podudaranja tako da kratko smanjenje sličnosti ne bi vratilo ekran na neusporedivo.", + "label": "Prag nepodudaranja" + }, + "progress_reset_delay": { + "doc": "Nakon završetka, držite napredak na 100% ovoliko dugo kako bi Završeno bilo vidljivo na kontrolnoj tabli prije nego što se vratite na stanje mirovanja.", + "label": "Kašnjenje poništavanja napretka" + }, + "pump_stuck_duration": { + "doc": "Sekunde kada pumpa može raditi neprekidno prije nego što bude označena kao da je moguće zaglavljena (pokreće događaj zaglavljena pumpa).", + "label": "Trajanje zaglavljivanja pumpe" + }, + "running_dead_zone": { + "doc": "Nakon što ciklus započne, padovi snage u ovom prozoru se zanemaruju. Mašine za pranje rublja se pune hladnom vodom (pada blizu 0 W prije zagrijavanja) - bez ove zaštite ta faza punjenja izgleda kao završetak ciklusa. Ovo NE preskače podatke: puni trag snage se snima od T=0. Mehanizam za prijedloge mjeri stvarni obrazac pokretanja vašeg stroja i automatski ga određuje.", + "label": "Mrtva zona pri radu" + }, + "sampling_interval": { + "doc": "Očekivano vrijeme između očitavanja senzora - koristi se za veličinu prozora za izglađivanje i pravilno pokretanje odbijanja. Svako ažuriranje senzora se snima bez obzira na ovu vrijednost; kalibrira samo nizvodne proračune. Mehanizam za prijedloge mjeri stvarnu kadencu vašeg senzora iz prošlih ciklusa i automatski ga postavlja.", + "label": "Interval uzorkovanja" + }, + "save_debug_traces": { + "doc": "Sačuvajte puni trag napajanja i odgovarajuće podatke za otklanjanje grešaka za svaki ciklus. Korisno za rješavanje problema, ali povećava veličinu skladišta.", + "label": "Sačuvati tragove otklanjanja grešaka" + }, + "smoothing_window": { + "doc": "Koliko je signal sirove snage izglađen. Niska (2) je odzivna, ali bučna; high (5) izglađuje šiljke, ali dodaje zaostajanje.", + "label": "Prozor izglađivanja" + }, + "start_duration_threshold": { + "doc": "Snaga mora ostati iznad početne granice ovoliko dugo kako bi se potvrdio pravi početak, sprečavajući prekidače za uključivanje/isključivanje u djeliću sekunde da započnu ciklus.", + "label": "Trajanje pokretanja" + }, + "start_energy_threshold": { + "doc": "Energija (snaga x vrijeme) koju uređaj mora utrošiti prije POKRETA. Kratak skok velike snage ima vrlo nisku energiju i zanemaruje se, sprječavajući lažne startove.", + "label": "Početna energija" + }, + "start_threshold_w": { + "doc": "Snaga mora porasti iznad ovog nivoa da potvrdi da je ciklus započeo. Ako ga postavite prenisko, uzrokuje lažno pokretanje iz stanja pripravnosti; propušteni su previsoki i spori programi (hladno punjenje). Mehanizam za prijedloge postavlja ovo tik iznad uočene najniže aktivne snage mašine.", + "label": "Prag pokretanja" + }, + "stop_threshold_w": { + "doc": "Snaga mora pasti ispod ovog nivoa prije nego što počne odbrojavanje odgode isključenja. Postavite ga ispod početnog praga - jaz između njih je histerezni pojas koji sprečava treperenje. Ako su postavljene previsoko, faze male snage (zadržavanje ispiranja, zaštita od gužvanja) lažno pokreću krajnju sekvencu.", + "label": "Prag zaustavljanja" + }, + "switch_entity": { + "doc": "Opcioni prekidač se isključuje u pauzi i ponovo uključuje kada se nastavlja, koristi se zajedno sa \"Pauza takođe prekida napajanje\".", + "label": "Entitet prekidača" + }, + "watchdog_interval": { + "doc": "Koliko često pozadinski nadzornik provjerava zastoje senzora i protekla vremena. Standardno 30 s.", + "label": "Interval čuvara" + }, + "notify_milestone_message": { + "doc": "Poruka za obavijest o prekretnici. Varijable predloška: {device}, {cycle_count}.", + "label": "Poruka o prekretnici" + }, + "notify_milestones": { + "doc": "Zarezima odvojeni brojevi ciklusa koji pokreću jednokratnu obavijest o slavlju kada se dosegnu (npr. 50, 100, 500, 1000). Prazno onemogućava obavijesti o prekretnicama.", + "label": "Prekretnice ciklusa" + }, + "notify_quiet_end_hour": { + "doc": "Kraj prozora ne ometaj (0-23). Zadržane obavijesti se dostavljaju u ovaj sat. Ostavite prazno da onemogućite.", + "label": "Kraj tihih sati" + }, + "notify_quiet_start_hour": { + "doc": "Početak prozora ne ometaj (0-23). Obavijesti o završetku, podsjetnici i obavijesti o čistom rublju koje bi se aktivirale tokom tihih sati zadržavaju se i dostavljaju kada prozor završi. Ostavite prazno da onemogućite. Podržava prozore koji prelaze ponoć (npr. početak 22, kraj 7).", + "label": "Početak tihih sati" + }, + "peak_rate_message": { + "doc": "Opcionalni prilagođeni tekst za savjet o vršnoj tarifi dodan uz obavijest o pokretanju. Varijable predloška: {device}, {price}. Prazno koristi ugrađenu zadanu vrijednost.", + "label": "Poruka o vršnoj tarifi" + }, + "peak_rate_threshold": { + "doc": "Kada ciklus započne i trenutna cijena po kWh je na ovoj vrijednosti ili iznad nje, dodaje savjet o vršnoj tarifi uz obavijest o pokretanju. 0 ili prazno onemogućava savjet.", + "label": "Prag vršne tarife (po kWh)" + }, + "dtw_bandwidth": { + "label": "Tolerancija podudaranja oblika", + "doc": "Koliko modul za podudaranje smije vremenski izobličiti ciklus da odgovara obliku sačuvanog programa. Viša vrijednost podnosi veće varijacije brzine; previsoka riskira podudaranje s pogrešnim programom." + }, + "corr_weight": { + "label": "Težina oblika u odnosu na nivo", + "doc": "Ravnoteža između oblika krive i apsolutnog nivoa snage pri ocjenjivanju podudaranja. Viša vrijednost daje prednost obliku; niža daje prednost slaganju nivoa snage." + }, + "duration_weight": { + "label": "Težina trajanja", + "doc": "Koliko snažno se daje prednost programu čije se tipično trajanje podudara s ovim ciklusom." + }, + "energy_weight": { + "label": "Težina energije", + "doc": "Koliko snažno se daje prednost programu čija se tipična potrošnja energije podudara s ovim ciklusom." + }, + "store_brand": { + "label": "Marka uređaja", + "doc": "Opcionalno. Marka uređaja odabrana iz kataloga zajednice. Koristi se za pronalaženje i dijeljenje odgovarajućih referentnih snimki. Ostavite prazno ako ne koristite online funkcije." + }, + "store_model": { + "label": "Model uređaja", + "doc": "Opcionalno. Model uređaja odabran iz kataloga zajednice nakon što je marka postavljena. Ako vaš model nije na spisku, možete ga dodati u katalog." + }, + "show_contributor": { + "doc": "Prikaži ime doprinositelja na profilima preuzetim iz prodavnice zajednice" + }, + "enable_phase_matching": { + "label": "Preostalo vrijeme prema fazama", + "doc": "Svaki aktivni ciklus dijeli na faze (grijanje, pranje, centrifuga) i raspoređuje preostalo vrijeme po fazama, spojeno s klasičnom procjenom - na početku ciklusa oslanja se na budžet faza, a pri kraju na klasičnu procjenu. To prilagođava odbrojavanje tome koliko se vaš uređaj stvarno grije i radi, što je najuočljivije u prvoj polovini ciklusa. Isključeno = samo klasična procjena. Utječe samo na prikaz preostalog vremena; podudaranje programa i detekcija ciklusa ostaju nepromijenjeni." + }, + "keep_min_score": { + "label": "Min. ocjena podudaranja", + "doc": "Minimalna ocjena sličnosti potrebna kandidatu za ostanak u utrci podudaranja. Zadana vrijednost 0,1 je namjerno blaga - dopušta čak i slabe kandidate i oslanja se na kasnijе faze za pronalazak najboljeg podudaranja. Povećajte za ranije odbacivanje neprobabilnih profila; smanjite za proširenje početnog skupa kandidata." + }, + "dtw_blend": { + "label": "Miješanje deformacije", + "doc": "Koliko DTW ocjena poravnanja zamjenjuje osnovnu ocjenu Faze 2. 0 = koristi samo ocjenu Faze 2, 1 = koristi samo DTW ocjenu, 0,5 (zadano) = jednako miješanje. Povećajte za veće oslanjanje na warp poravnanje kada programi imaju slične nivoe snage ali različite obrasce tajminga." + }, + "dtw_ensemble_w": { + "label": "Miks kombinacije DTW", + "doc": "U kombiniranom DTW načinu (zadanom), težina skaliranog L1 nasuprot derivatnog DTW (DDTW). 1,0 = sve skalirano L1, 0 = sve DDTW, 0,7 = zadano. Skalirana L1 varijanta uspoređuje nivoe snage; derivatna varijanta reagira na promjene snage kroz vrijeme. Kombinirani način spaja oboje." + }, + "dtw_ddtw_scale": { + "label": "Skala derivatne deformacije", + "doc": "Udaljenost polu-zasićenja za ocjenjivanje derivatnim DTW. Ocjena se prepolovi kada je DDTW udaljenost jednaka ovoj vrijednosti. Manje = osjetljivije na razlike u obliku. Zadana vrijednost 30 je kalibrirana za tipične tragove snage kućanskih uređaja. Utječe samo na kombinirani i ddtw DTW način." + }, + "dtw_refine_top_n": { + "label": "Broj preciziranih kandidata", + "doc": "Koliko prvih kandidata Faze 2 DTW ponovo ocjenjuje. DTW je skuplji pa se primjenjuje samo na N najboljih kandidata. Zadano 5. Povećajte (na 7-9) ako ispravni profil ponekad dostigne samo 4. ili 5. mjesto nakon Faze 2 - DTW ga može spasiti. Smanjenje malo ubrzava podudaranje." + }, + "duration_scale": { + "label": "Ostrina trajanja", + "doc": "Oštrina kazne za nepodudaranje trajanja u Fazi 4. Ovo je omjer logaritma pri kojemu se ocjena slaganja prepolovi. Manje = strože: nepodudaranje trajanja više snižava ocjenu. Zadana vrijednost 0,175 odgovara toleranciji trajanja od oko 18% pri polu-težini. Koristite zajedno s Težinom trajanja." + }, + "energy_scale": { + "label": "Ostrina energije", + "doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava ocjenu. Zadana vrijednost 0,25 je namjerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije." + }, + "power_profile_interval_min": { + "label": "Interval profila snage", + "doc": "Veličina segmenta za atribut senzora power_profile po profilu (polje prosječnih vata po slotu koje koriste vanjski planeri poput EMHASS i tibber_prices). Manji segmenti zadržavaju kratke skokove snage oštrima; veći segmenti zaglađuju oblik. Zadano 15 min. Samo za čitanje; ne utječe na otkrivanje." + }, + "notify_live_sticky": { + "label": "Zadrži živo obavještenje pri dodiru", + "doc": "Samo Android. Živo obavještenje o napretku postavite kao trajno (prikvačeno) kako dodir ne bi odbacio aktivnu nit. Isključeno zadržava zadano ponašanje gdje dodir odbacuje obavještenje." + }, + "notify_live_click_action": { + "label": "Odredište dodira na živom obavještenju", + "doc": "Samo Android. Gdje dodir na živo obavještenje o napretku otvara (npr. /lovelace/laundry ili cijeli URL) umjesto početne stranice aplikacije. Ostavite prazno za zadano." + }, + "door_opens_at_end": { + "label": "Vrata se automatski otvaraju na kraju", + "doc": "Za mašine za pranje sudova koje na kraju ciklusa otvaraju vrata radi sušenja (AirDry i slično). Kada je uključeno, otvaranje vrata za vrijeme pokrenuta ciklusa više ne zaustavlja ciklus zauvijek; ako vrata ostanu otvorena koliko je navedeno ispod, WashData smatra ciklus završenim. Kratko otvaranje (dodavanje predmeta) se zanemaruje. Zahtijeva entitet senzora vrata." + }, + "door_end_dwell_seconds": { + "label": "Zadržavanje otvorenih vrata za završetak", + "doc": "Koliko dugo vrata moraju ostati otvorena prije nego WashData završi ciklus, kada je uključena postavka \"Vrata se automatski otvaraju na kraju\". Dovoljno dugo da se ignorira brzo dodavanje posuđa (zadano 60 s), dovoljno kratko za brz završetak kad mašina otvori vrata." + } + }, + "setting_group": { + "auto_labeling": { + "label": "Automatsko označavanje" + }, + "cycle_end": { + "label": "Kraj ciklusa" + }, + "cycle_start": { + "label": "Početak ciklusa" + }, + "cycle_timers": { + "label": "Tajmeri ciklusa" + }, + "data_management": { + "label": "Upravljanje podacima" + }, + "debug": { + "label": "Otklanjanje grešaka" + }, + "dishwasher_end": { + "label": "Kraj mašine za suđe" + }, + "door_pause": { + "label": "Vrata i pauza" + }, + "dtw_refinement": { + "label": "DTW preciziranje" + }, + "duration_gates": { + "label": "Vrata trajanja" + }, + "energy": { + "label": "Energija" + }, + "external_end_trigger": { + "label": "Vanjski okidač kraja" + }, + "housekeeping": { + "label": "Domaćinstvo" + }, + "match_scoring": { + "label": "Bodovanje podudaranja" + }, + "messages": { + "label": "Poruke" + }, + "power_off": { + "label": "Isključivanje napajanja" + }, + "predictive_end": { + "label": "Prediktivni kraj" + }, + "schedule": { + "label": "Raspored" + }, + "services": { + "label": "Usluge" + }, + "signal_processing": { + "label": "Obrada signala" + }, + "thresholds_gap": { + "label": "Pragovi i razmak" + }, + "timing": { + "label": "Tajming" + }, + "unload_reminder": { + "label": "Podsjetnik za istovar" + }, + "watchdog": { + "label": "Čuvar" + }, + "quiet_hours_milestones": { + "label": "Tihi sati i prekretnice" + }, + "device_info": { + "label": "Podaci o uređaju" + }, + "basic_configuration": { + "label": "Osnovna konfiguracija" + } + }, + "status": { + "active": "Aktivan", + "all_statuses": "Svi statusi", + "ambiguous": "Dvosmisleno", + "auto_detect": "Automatsko otkrivanje", + "clear": "Jasno", + "completed": "Završeno", + "fine_tuning": "sada fino podešavanje…", + "force_stopped": "Prisilno zaustavljeno", + "idle": "Neaktivan", + "interrupted": "Prekinut", + "ready": "Spreman za obradu", + "recording": "Snimanje", + "training": "Treniranje…", + "saving": "Čuvanje…", + "rebuilding": "Ponovna izgradnja…", + "analyzing": "Analiziranje…", + "resetting": "Resetovanje…", + "reverting": "Vraćanje…", + "trimming": "Obrezivanje…", + "splitting": "Dijeljenje…", + "deleting": "Brisanje…", + "imported": "Uvezeno" + }, + "suggestion": { + "both_agree": "WashData preporučuje", + "calibrated_label": "Kalibrisano", + "observed_label": "Izmjereno", + "impact": { + "auto_label_confidence": { + "higher": "Manje ciklusa se automatski označava; više ih odlazi na pregled", + "lower": "Više ciklusa se automatski označava; neki mogu biti pogrešno identificirani" + }, + "duration_tolerance": { + "higher": "Prihvata širi raspon trajanja – fleksibilnije podudaranje", + "lower": "Zahtijeva bliže podudaranje trajanja – strože, ali može odbiti neobične cikluse" + }, + "end_energy_threshold": { + "higher": "Zatvara samo cikluse sa značajnom potrošnjom energije", + "lower": "Zatvara i kraće ili manje energetske cikluse" + }, + "end_repeat_count": { + "higher": "Zahtijeva više ponavljanja signala kraja – pouzdanije, malo sporije", + "lower": "Završava nakon manje ponavljanja – brže otkrivanje, veći rizik lažnog završetka" + }, + "learning_confidence": { + "higher": "Uči samo iz visoko pouzdanih podudaranja – sporije, ali pouzdanije", + "lower": "Uči iz više ciklusa; model može biti manje precizan" + }, + "min_off_gap": { + "higher": "Potreban je duži odmor prije početka novog ciklusa", + "lower": "Kratak odmor pokreće novi ciklus – uzastopni ciklusi se mogu razdijeliti" + }, + "min_power": { + "higher": "Manje osjetljiv na potrošnju u mirovanju; može propustiti tihe programe", + "lower": "Osjetljiviji; može bilježiti potrošnju u stanju pripravnosti kao aktivnost" + }, + "no_update_active_timeout": { + "higher": "Više vremena prije proglašenja ciklusa zaglavljenim", + "lower": "Zaglavljeni ciklus se prisilno zaustavlja ranije" + }, + "off_delay": { + "higher": "Više vremena za pauze uređaja – prikladno za duge faze namakanja ili sušenja", + "lower": "Brže otkrivanje kraja – dobro za uređaje s čistim uključivanjem/isključivanjem" + }, + "profile_match_threshold": { + "higher": "Potvrđuje samo visoko pouzdana podudaranja; više ciklusa ostaje neoznačeno", + "lower": "Podudara više ciklusa; neki mogu biti blago pogrešni" + }, + "running_dead_zone": { + "higher": "Zanemaruje kratke skokove snage tokom mirovanja – manje osjetljiv na šum", + "lower": "Reagira na kraće impulse snage – otkriva brzu prolaznu aktivnost" + }, + "start_threshold_w": { + "higher": "Sprečava lažne startove od kratkih skokova snage", + "lower": "Otkriva programe s niskom snagom; može reagirati na šum" + }, + "stop_threshold_w": { + "higher": "Završava ciklus brže – može zatvoriti tokom pauze", + "lower": "Dulje čeka na završetak – manje prijevremenih završetaka" + }, + "watchdog_interval": { + "higher": "Dopušta dulje tihe faze; manje lažnih prisilnih zaustavljanja", + "lower": "Zaglavljene cikluse otkriva agresivnije" + } + }, + "reason": { + "auto_label_confidence": "Pouzdanost 15. percentila za {cycles} automatskih oznaka koje korisnik nikada nije ispravio ({p15}).", + "completion_min_seconds": "Polovina trajanja čistog ciklusa p05 ({minutes} min) kroz {cycles} ciklusa; filtrira lažne cikluse.{excl}", + "dead_zone_batch": "Zadržano kratkim (medijana prozora nestabilnosti pri pokretanju kroz {cycles} ciklusa = {s}s) kako bi se stvarni kraj brzo prepoznao.", + "dead_zone_from_dip": "Na osnovu ranog pada snage prepoznatog na {s}s.", + "end_energy_default": "Zadana preporučena osnovna vrijednost za prag šuma na kraju ciklusa.", + "end_energy_false": "Energija lažnih završetaka p95 ({p95}Wh) kroz {cycles} ciklusa, sa donjom granicom od 0,2 % medijane energije ciklusa ({floor}Wh).", + "end_energy_no_false": "Nema lažnih završetaka kroz {cycles} ciklusa; sa donjom granicom od 0,2 % medijane energije ciklusa ({floor}Wh).", + "end_repeat_count": "{false}/{total} čistih ciklusa ({pct}%) imalo je unutrašnju pauzu dužu od 60s koja se nastavila; zahtijevaj {val} potvrdu(e) kraja.", + "learning_confidence": "Pouzdanost p05 za {cycles} korisnički označenih ciklusa ({p05}); ispod ove vrijednosti zahtijevaj provjeru.", + "match_interval": "Na osnovu uočene učestalosti ažuriranja (medijana={median}s) * 10.", + "max_duration_ratio": "Na osnovu trajanja označenih ciklusa (p95={p95}).", + "min_active": "Na osnovu najmanje radne snage ({min}W) uočene u posljednjem ciklusu.", + "min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprečavaju prijevremene potvrde.", + "min_off_gap": "Na osnovu {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.", + "min_off_gap_bridge": "Postavljeno tako da premosti najduži tihi odsječak unutar ciklusa: {span}s + 60s rezerve, iz {spans} premoštenih razmaka kroz {cycles} čistih ciklusa (ostaje ispod vašeg najkraćeg razmaka između dva uzastopna pokretanja, koji iznosi {ceiling}s).", + "min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}", + "ml_auto_label": "Najniža pouzdanost koju je model kvaliteta još ocijenio čistom (p10 od {cycles} čistih ciklusa = {p10}).", + "ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocijenio sa >50 %; zahtijevaj {val} potvrdu(e) kraja.", + "ml_off_delay": "Pauze potvrđene detektorom kraja: p95 {p95}s + 60s rezerve, iz {pauses} modelom provjerenih pauza kroz {cycles} ciklusa (donja granica {floor}s).", + "no_update_timeout": "Na osnovu uočene učestalosti ažuriranja (p95={p95}s) * 20 (najmanje 60s).", + "off_delay_cadence": "Na osnovu uočene učestalosti ažuriranja (p95={p95}s) * 5", + "off_delay_device_floor": "Korišten siguran minimum specifičan za uređaj {device} ({floor}s).", + "off_delay_generic_floor": "Korišten opći siguran minimum ({floor}s).", + "off_delay_pauses": "Postavljeno tako da nadmaši stvarne pauze: pauza unutar ciklusa p95 {p95}s + 60s rezerve, iz {pauses} pauza kroz {cycles} čistih ciklusa (donja granica {floor}s).", + "profile_match_threshold": "Pouzdanost p10 za {cycles} tačnih automatskih oznaka ({p10}); sigurna donja granica za potvrdu tokom rada.", + "sampling_interval": "Medijana intervala ažuriranja uočena kroz {cycles} čistih ciklusa ({si}s).{excl}", + "smoothing_window": "Postavljeno za izglađivanje ~30s očitavanja pri uzorkovanju od {si}s ({samples} uzoraka).", + "start_duration": "Zadržano kratkim (~jedan interval uzorkovanja od {si}s) kako bi prepoznavanje počelo što ranije, uz zanemarivanje pojedinačnih skokova.", + "thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage mašine.", + "tol_per_profile": "p75 varijanse trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosljedni profili nisu kažnjeni.", + "tol_pooled": "Na osnovu objedinjene varijanse trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).", + "watchdog": "Zadržano što nižim uz sigurnost (tik iznad razmaka ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." + }, + "exclusions": { + "summary": "Isključeno {total} pogrešno otkrivenih ciklusa: {parts}.", + "reason": { + "force_stopped": "prisilno zaustavljeni", + "interrupted": "prekinuti", + "incomplete": "nepotpuni", + "noise": "buka", + "unlabeled": "bez oznake", + "no_trace_short": "prekratki za analizu", + "high_start": "počeli pri visokoj snazi", + "abrupt_end": "naglo završeni", + "mid_restart": "restart usred ciklusa", + "no_power": "bez snage", + "no_active_power": "bez aktivne snage" + } + } + }, + "tab": { + "advanced": "Napredno", + "diagnostics": "Dijagnostika", + "history": "Ciklusi", + "ml": "ML obuka", + "pp_cleanup": "Čišćenje", + "pp_manage": "Upravljaj", + "pp_overview": "Pregled", + "pp_phases": "Faze", + "profiles": "Profili", + "settings": "Postavke", + "status": "Pregled", + "subtab_phase_catalog": "Katalog faza", + "subtab_profiles": "Profili", + "maintenance": "Održavanje", + "playground": "Testno okruženje", + "store": "Trgovina" + }, + "tag": { + "early_end": "Rani kraj", + "late_start": "Kasni početak", + "merged": "Spojeni ciklusi", + "noise": "Buka", + "sensor_gap": "Razmak senzora", + "split": "Split ciklus", + "wrong_profile": "Pogrešan profil" + }, + "toast": { + "access_saved": "Kontrola pristupa je sačuvana", + "all_wiped": "Svi podaci su izbrisani", + "analysis_complete_none": "Analiza završena: nema novih prijedloga", + "auto_label_complete": "Automatsko označavanje je završeno", + "automation_deleted": "Automatizacija izbrisana", + "correction_submitted": "Ispravka dostavljena", + "cycle_deleted": "Ciklus je obrisan", + "cycle_force_stopped": "Ciklus prisilno zaustavljen", + "cycle_labelled": "Ciklus označen", + "cycle_paused": "Ciklus je pauziran", + "cycle_resumed": "Ciklus je nastavljen", + "cycle_trimmed": "Ciklus je skraćen", + "cycles_merged": "Ciklusi su spojeni", + "envelope_rebuilt": "Koverta rekonstruisana", + "envelopes_rebuilt": "Koverte obnovljene", + "export_downloaded": "Izvoz je preuzet", + "feedback_all_dismissed": "Sve povratne informacije odbačene", + "feedback_confirmed": "Povratne informacije potvrđene", + "feedback_dismissed": "Povratne informacije su odbačene", + "group_deleted": "Grupa je izbrisana", + "group_name_required": "Naziv grupe je obavezan", + "group_saved": "Grupa je sačuvana", + "import_successful": "Uvoz uspješan; ponovno učitavanje integracije", + "json_required": "Potrebni su JSON podaci", + "legacy_removed": "Naslijeđene radnje su uklonjene", + "logs_exported": "Dnevnici su izvezeni", + "matching_reverted": "Odgovarajuće težine vraćene na zadane vrijednosti", + "min_2_profiles": "Odaberite najmanje 2 profila za grupu", + "ml_training_no_improvement": "Obuka je završena: osnovna linija je zadržana (bez poboljšanja)", + "models_reverted": "Modeli na uređaju vraćeni su na osnovnu liniju", + "name_required": "Potrebno je ime", + "no_split_found": "Nisu pronađeni praznini u praznom hodu za razdvajanje", + "panel_settings_saved": "Postavke panela su sačuvane", + "pg_preset_loaded": "Konfiguracija \"{name}\" učitana", + "pg_preset_saved": "Konfiguracija \"{name}\" sačuvana", + "pg_sugg_loaded": "Učitano {n} predloženih vrijednosti - pokrenite testno okruženje za usporedbu", + "pg_sugg_ml_loaded": "Učitano {n} ML kalibriranih vrijednosti - pokrenite testno okruženje za usporedbu", + "phase_name_required": "Naziv faze je obavezan", + "phase_updated": "Faza ažurirana", + "phases_saved": "Faze su sačuvane", + "preferences_saved": "Postavke su sačuvane", + "profile_name_required": "Ime profila je obavezno", + "profile_renamed": "Profil je preimenovan", + "recording_discarded": "Snimak je odbačen", + "recording_saved": "Snimak je sačuvan na profilu", + "recording_started": "Snimanje je počelo", + "recording_stopped": "Snimanje je zaustavljeno", + "review_saved": "Recenzija je sačuvana", + "settings_conflicts": "Ispravite istaknute sukobe postavki prije spremanja.", + "settings_reverted": "Postavke vraćene; ponovno učitavanje integracije", + "settings_saved": "Postavke sačuvane; ponovno učitavanje integracije", + "suggestions_applied": "Primijenjeni prijedlozi; ponovno učitavanje integracije", + "suggestions_dismissed": "Prijedlozi su odbačeni", + "apply_failed": "Primjena nije uspjela: {error}", + "delete_failed": "Brisanje nije uspjelo: {error}", + "load_more_failed": "Nije moguće učitati još: {error}", + "maint_add_failed": "Nije moguće dodati događaj: {error}", + "maint_added": "Događaj održavanja dodan", + "maint_delete_failed": "Nije moguće izbrisati događaj: {error}", + "maint_deleted": "Događaj održavanja izbrisan", + "relabel_done": "Ponovo označeno ciklusa: {count}", + "relabel_failed": "Ponovno označavanje nije uspjelo: {error}", + "reminders_save_failed": "Nije moguće sačuvati podsjetnike: {error}", + "reminders_saved": "Podsjetnici za servis sačuvani", + "pause_no_cycle": "Nema aktivnog ciklusa za pauziranje", + "resume_no_cycle": "Nema pauziranog ciklusa za nastavak", + "delete_partial_failed": "Neke stavke nije bilo moguće obrisati i vraćene su", + "pg_run_gone": "To pokretanje više nije dostupno.", + "task_cancelled": "Otkazano.", + "processed": "Obrađeno {bits}", + "processed_cycles": "{n} ciklusa", + "processed_suggestions": "{n} prijedloga", + "processed_models": "{n} aktiviranih modela", + "store_search_failed": "Pretraga nije uspjela: {error}", + "store_connect_failed": "Povezivanje nije uspjelo: {error}", + "store_connected": "Povezano sa zajedničkom trgovinom", + "store_disconnected": "Veza sa zajedničkom trgovinom prekinuta", + "store_error": "Greška: {error}", + "store_unavailable": "Zajednička trgovina nije dostupna.", + "store_pick_profile": "Odaberite profil za spajanje", + "store_name_required": "Unesite naziv profila", + "store_import_failed": "Uvoz nije uspio: {error}", + "store_imported": "Uvezeno u {profile}", + "store_program_required": "Unesite naziv programa", + "store_no_appliance": "Prvo postavite marku i model uređaja u Postavkama.", + "store_share_failed": "Dijeljenje nije uspjelo: {error}", + "store_shared": "Podijeljeno u zajedničku trgovinu, čeka pregled.", + "appliance_added": "Uređaj dodan, čeka odobrenje", + "thanks_confirming": "Hvala na potvrdi", + "device_approved": "Odobreno od strane zajednice", + "rating_saved": "Ocjena kvaliteta sačuvana", + "brand_added": "Marka dodana, čeka odobrenje", + "profile_added": "Profil dodan, čeka odobrenje", + "saved_except_conflicts": "Postavke sačuvane -- {n} postavka{s} preskočena zbog konflikata", + "share_device_none_sel": "Odaberite barem jedan program za dijeljenje", + "store_device_downloaded": "Postavke uređaja preuzete: {created} profil{c} kreiran, {dup} već postoji", + "store_device_downloaded_phases": "Postavke uređaja preuzete: {created} profil{c} kreiran, {dup} već postoji, mapa faza primijenjena", + "store_device_downloaded_settings": "Postavke uređaja preuzete: {created} profil{c} kreiran, {dup} već postoji, postavke primijenjene", + "store_device_shared": "Postavke uređaja podijeljene: {n} program{s} učitan", + "store_device_shared_all_dup": "Nema ničeg novog za dijeljenje -- svi programi već postoje u prodavnici", + "store_device_shared_partial": "Djelimično dijeljenje: {n} program{s} učitan, {failed} preskočeno", + "store_device_shared_some_dup": "Postavke uređaja podijeljene: {n} program{s} učitan ({dup} već postoji)", + "store_download_failed": "Preuzimanje nije uspjelo: {error}", + "store_download_nothing": "Nema ništa za preuzimanje -- svi profili već postoje na ovom uređaju", + "export_selective_done": "Izvoz preuzet", + "import_selective_done": "Uvezeno {profiles} profila i {cycles} ciklusa" + }, + "trend": { + "down": "Opadajući trend", + "up": "Rastući trend" + }, + "maint": { + "bearing_service": "Servis ležajeva", + "descale": "Uklanjanje kamenca", + "drum_clean": "Očisti bubanj", + "filter_clean": "Očisti filter", + "other": "Ostalo" + }, + "pg_desc": { + "dishwasher_end_spike_quiet_release": "Mašina za pranje posuđa: sekunde tišine nakon očekivanog trajanja prije nego što se otpusti čekanje na završno ispumpavanje vode", + "anti_wrinkle_enabled": "Upij impulse bubnja nakon glavne faze, a ne čitaj ih kao nove cikluse", + "anti_wrinkle_exit_power": "Snaga mora pasti ispod ove vrijednosti između impulsa da bi anti-gužvanje ostalo aktivno", + "anti_wrinkle_idle_timeout": "Dozvoljeno vrijeme mirovanja između dva impulsa bubnja prije nego što se anti-gužvanje završi", + "anti_wrinkle_max_duration": "Duži impuls završava anti-gužvanje i otvara novi ciklus", + "anti_wrinkle_max_power": "Impuls iznad ove vrijednosti završava anti-gužvanje i otvara novi ciklus", + "completion_min_seconds": "Najkraće pokretanje koje se računa kao pravi ciklus", + "end_repeat_count": "Niska očitanja zaredom prije završetka", + "interrupted_min_seconds": "Kratki ciklusi označeni kao prekinuti", + "min_off_gap": "Razmak potreban za razdvajanje dva ciklusa", + "off_delay": "Sekundi niske snage prije završetka ciklusa", + "start_duration_threshold": "Sekundi iznad praga za potvrdu pokretanja", + "start_threshold_w": "Minimum vati da bi se računalo kao pokrenuto", + "stop_threshold_w": "Ispod ovoga mašina se računa kao isključena", + "dtw_bandwidth": "Faza 3: warp opseg Sakoe-Chiba (0 = DTW isključen; zadano 0,2 = 20% dužine ciklusa)", + "corr_weight": "Faza 2: ravnoteža između oblika krivulje (korelacija) i nivoa snage (MAE); zadano 0,45", + "duration_weight": "Faza 4: koliko jako slaganje trajanja utječe na konačnu ocjenu (zadano 0,22)", + "energy_weight": "Faza 4: koliko jako slaganje energije utječe na konačnu ocjenu (zadano 0,22)", + "profile_match_min_duration_ratio": "Faza 1: minimalna dužina ciklusa kao udio trajanja profila; zadano 0,1 (10%)", + "profile_match_max_duration_ratio": "Faza 1: maksimalna dužina ciklusa kao udio trajanja profila; zadano 1,5 (150%)", + "keep_min_score": "Faza 2: minimalna ocjena za ostanak u utrci; zadano 0,1 dopušta slabe podudarnosti, kasniji koraci biraju najbolje", + "dtw_blend": "Faza 3: 0 = samo osnovna ocjena, 1 = samo DTW ocjena, 0,5 = jednako miješanje (zadano)", + "dtw_ensemble_w": "Faza 3 (kombinirani način): težina skaliranog L1 nasuprot derivatnog DTW; zadano 0,7 favorizira nivo", + "dtw_ddtw_scale": "Faza 3: udaljenost polu-zasićenja DDTW; manja = osjetljivija na oblik (zadano 30)", + "dtw_refine_top_n": "Faza 3: kandidati koje DTW ponovo ocjenjuje; povećajte na 7-9 ako ispravni profil zauzme 4.-5. mjesto (zadano 5)", + "duration_scale": "Faza 4: omjer logaritma gdje se slaganje trajanja prepolovi; manje = stroža kazna (zadano 0,175)", + "energy_scale": "Faza 4: omjer logaritma gdje se slaganje energije prepolovi; manje = stroža kazna (zadano 0,25)" + }, + "col": { + "profile_tip": "Naziv podudarnog programa. Bez oznake znači da se na kraju ciklusa nijedan profil nije podudarao.", + "status_tip": "Ishod ciklusa: Završeno (prirodni kraj), Prekinuto (nagli pad snage), Prisilno zaustavljeno (ručno) ili Potrebna provjera (čeka se povratna informacija).", + "date_tip": "Datum i vrijeme početka ciklusa.", + "duration_tip": "Ukupno vrijeme rada ciklusa od početka do kraja.", + "energy_tip": "Ukupna potrošena energija (kWh). Izračunato integracijom snage kroz vrijeme.", + "cost_tip": "Trošak energije za ovaj ciklus, zamrznut po završetku prema tada važećoj cijeni (energija x cijena po kWh). Postavite cijenu u Postavkama da biste ga popunili.", + "confidence_tip": "Pouzdanost podudaranja profila (0-100%). Koliko se tačno kriva snage ciklusa podudarala s identificiranim programom.", + "health_tip": "Zdravlje ciklusa ML (više = bolje). Kliknite ciklus da biste ga pregledali i ocijenili.", + "flags_tip": "Oznake zajednice i pokazatelji kvalitete podataka" + }, + "stat": { + "avg": "pros.", + "min": "min {v}", + "max": "max {v}", + "consistency": "konzistentnost ±{v}", + "total": "ukupno {v}", + "last_run": "zadnje pokretanje {v}", + "score": "rezultat {pct}%", + "duration_cv": "CV trajanja {pct}%", + "avg_confidence": "pros. pouzdanost {pct}%" + }, + "pg_evd": { + "detected": "Detektor je prepoznao da je ciklus započeo.", + "match_commit": "Mehanizam podudaranja je s dovoljno pouzdanosti odabrao program.", + "match_changed": "Vodeći program se promijenio kako je viđen veći dio ciklusa.", + "match_ambiguous": "Dva programa su postigla slične rezultate, pa je podudaranje bilo nesigurno.", + "unmatched": "Nijedan sačuvani program nije odgovarao ovom ciklusu.", + "notify_start": "Bila bi poslana obavijest o pokretanju.", + "notify_pre_complete": "Bila bi poslana obavijest da je ciklus skoro završen.", + "notify_finish": "Bila bi poslana obavijest o završetku.", + "notify_milestone": "Bila bi poslana obavijest o prekretnici.", + "notify_held": "Obavijest je zadržana zbog tihih sati.", + "finished": "Ciklus je dostigao završno stanje i završio." + }, + "store": { + "browse": "Pregledaj", + "device": "Uređaj", + "favorites": "Favoriti", + "search_ph": "Pretraži po marki ili modelu…", + "no_results": "Nisu pronađeni odgovarajući uređaji. Pokušajte s drugom pretragom.", + "n_programs": "{n} programa", + "n_cycles": "{n} ciklusa", + "no_programs": "Za ovaj uređaj još nema podijeljenih programa.", + "no_cycles": "Za ovaj program još nema podijeljenih referentnih ciklusa.", + "anon": "anonimno", + "uploaded_by": "Podijelio {name}", + "connected_as": "Povezan kao {name}", + "not_connected": "Nije povezano. Povežite GitHub nalog da biste dijelili vlastite cikluse.", + "import_new": "Novi profil", + "import_merge": "Spoji s postojećim", + "merge_target": "Spoji u profil", + "description": "Opis (opcionalno)", + "contributed_by": "od {name}", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "Još nema ocjena", + "website": "Web stranica trgovine ↗", + "website_tip": "Otvorite web stranicu zajedničke trgovine" + }, + "settings": { + "gear": { + "title": "Postavke" + } + }, + "link": { + "manual": "Priručnik ↗", + "add_appliance": "Dodajte svoj uređaj" + }, + "tip": { + "add_brand": "Marke nema na spisku? Dodajte je u katalog zajednice", + "add_appliance": "Modela nema na spisku? Dodajte svoj uređaj u katalog zajednice", + "add_profile": "Dodajte profil za ovaj uređaj na web-stranici zajednice" + }, + "task": { + "reprocess": { + "matching": "Ponovna obrada: podudaranje ciklusa", + "golden": "Ponovna obrada: popunjavanje referentnih", + "suggestions": "Ponovna obrada: prijedlozi", + "ml_training": "Ponovna obrada: ML obuka", + "health": "Ponovna obrada: zdravlje ciklusa" + }, + "pg_sweep": { + "optimize": "Optimizacija: {param}" + }, + "pg_detail": { + "simulate": "Simuliraj ciklus" + }, + "split": { + "apply": "Dijeljenje ciklusa" + }, + "trim": { + "apply": "Obrezivanje ciklusa" + }, + "merge": { + "apply": "Spajanje ciklusa" + }, + "rebuild": { + "envelopes": "Ponovna izgradnja omotača" + } + }, + "setup": { + "hdr": { + "card": "Postavljanje uređaja", + "healthy_chip": "Postavljanje dovršeno" + }, + "phase0": { + "washer": "WashData već otkriva vaše cikluse. Snimite prvi ciklus kako biste omogućili nazive programa i procjene vremena.", + "dishwasher": "WashData prati. Mašine za pranje posuđa imaju složene cikluse – snimanje prvog ciklusa je izrazito preporučeno. Ako otkriveni ciklus traje predugo, koristite uređivač ciklusa za rezanje prije pohrane kao profila.", + "generic": "WashData prati. Snimite ili označite otkriveni ciklus kako biste počeli graditi profile." + }, + "phase1a": { + "labelled": "Dobar početak – vaš prvi program je pohranjen. Za najčišće podatke razmislite o snimanju sljedećeg ciklusa pomoću widgeta snimača." + }, + "phase1b": { + "recorded": "Vaša snimka pohranjena je kao {profile_name}. Sada snimite ili označite ostale uobičajene programe za izgradnju pokrivenosti." + }, + "phase1c": { + "verify": "Imate {count} programa od zajednice. Pokrenite ciklus kako biste provjerili prepoznaje li ih WashData ispravno – podudaranje će se poboljšati kako vaš uređaj gradi vlastitu historiju." + }, + "phase2": { + "cluster": "WashData je vidio {count} ciklusa koji ne odgovaraju nijednom pohranjenome programu – nalikuju jedni drugima. Želite li za njih stvoriti novi profil?", + "unmatched": "Vaš zadnji ciklus nije odgovarao nijednom pohranjenome programu. Je li to novi program?" + }, + "phase3": { + "suggestions": "WashData ima preporuke postavki temeljene na vašoj historiji ciklusa – pregledajte ih kako biste poboljšali tačnost otkrivanja.", + "groups": "Neki vaši profili izgledaju kao isti program pri različitim temperaturama. Organizujte ih u grupu za bolje podudaranje.", + "phases": "Dodajte faze programa u {profile_name} za tačnije procjene preostalog vremena." + }, + "phase4": { + "healthy": "Ovaj uređaj je u potpunosti postavljen ({profile_count} profila)." + }, + "cta": { + "start_recording": "Pokreni snimanje", + "label_detected_cycle": "Već imam otkriven ciklus – umjesto toga ga označi", + "browse_cycles": "Pregledaj cikluse za označavanje sljedećeg", + "view_profiles": "Prikaži svoje profile", + "create_from_cluster": "Napravi profil od ovih ciklusa", + "create_profile": "Napravi za njega profil", + "review_suggestions": "Preglej prijedloge", + "organise_profiles": "Organizuj profile", + "configure_phases": "Konfiguriraj faze", + "skip_step": "Preskoči ovaj korak", + "skip_forever": "Ne prikazuj više", + "hide_guidance": "Sakrij upute", + "show_guidance": "Prikaži upute" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/cs.json b/custom_components/ha_washdata/translations/panel/cs.json index 45bcb44a..99434504 100644 --- a/custom_components/ha_washdata/translations/panel/cs.json +++ b/custom_components/ha_washdata/translations/panel/cs.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entita nenalezena", + "running_long": "Běží dlouho", + "remaining": "zbývá", + "progress": "postup", + "show_time_remaining": "Zobrazit zbývající čas", + "show_percentage": "Zobrazit procenta", + "layout": { + "tile": "Dlaždice (kompaktní)", + "detail": "Detail (podrobný)", + "glance": "Přehled (více zařízení)" + }, + "btn": { + "pause": "Pozastavit", + "resume": "Pokračovat", + "terminate": "Ukončit cyklus", + "record_start": "Spustit záznam", + "record_stop": "Zastavit záznam", + "program": "Program", + "open_panel": "Otevřít WashData" + }, + "editor": { + "layout": "Rozvržení", + "entity": "Entita spotřebiče", + "entities": "Spotřebiče", + "title": "Název", + "icon": "Ikona", + "show_state": "Zobrazit stav", + "show_program": "Zobrazit program", + "show_progress_bar": "Zobrazit ukazatel průběhu", + "spin_icon": "Otáčet ikonu během běhu", + "display_mode": "Řádek s detaily", + "active_color": "Přepsání aktivní barvy", + "show_phase": "Zobrazit fázi", + "show_energy": "Zobrazit energii a náklady", + "show_anomaly": "Zobrazit varování o překročení", + "show_sparkline": "Zobrazit živý graf výkonu", + "buttons": "Akční tlačítka", + "program_entity": "Entita programu (přepsání)", + "time_entity": "Entita času (přepsání)", + "pct_entity": "Entita postupu (přepsání)", + "power_entity": "Entita výkonu (přepsání)", + "tap_action": "Akce klepnutí", + "hold_action": "Akce podržení", + "double_tap_action": "Akce dvojitého klepnutí" + } + }, "badge": { "artifact_tip": "Zjištěno {n} anomálií (např. dveře otevřené uprostřed cyklu) – otevřete, abyste je viděli na grafu", "auto": "(automaticky zjištěno)", @@ -64,6 +112,21 @@ "discard": "Vyřadit", "discard_tip": "Vyřadit zaznamenaný průběh bez uložení", "dismiss": "Propustit", + "mute_suggestion": "Přestat navrhovat toto nastavení", + "pg_load_calibrated": "Načíst kalibrované (ML) ({n})", + "pg_load_calibrated_tip": "Načíst nastavení kalibrovaná ML jako přepsání v testovacím prostředí", + "pg_load_live": "Načíst aktivní nastavení", + "pg_load_live_tip": "Znovu načíst aktuální nastavení integrace a zahodit všechny úpravy v testovacím prostředí", + "pg_load_suggested": "Načíst navrhované ({n})", + "pg_load_suggested_tip": "Načíst aktuální návrhy automatického ladění jako přepsání v testovacím prostředí", + "pg_preset_delete": "Smazat přednastavení", + "pg_preset_load": "Načíst přednastavení", + "pg_preset_load_tip": "Nahradit hodnoty v testovacím prostředí tímto přednastavením (aktivní nastavení zůstane beze změny)", + "pg_preset_save": "Uložit jako přednastavení", + "pg_preset_save_tip": "Uložit všechny hodnoty níže jako pojmenované přednastavení pro toto zařízení", + "pg_publish_all": "Uložit do integrace ({n})", + "pg_publish_one": "Uložit {label} do integrace", + "reset_muted": "Obnovit skryté", "done": "Hotovo", "edit": "Upravit", "export": "Exportovat", @@ -275,6 +338,7 @@ "no_automations": "Na toto zařízení zatím neodkazuje žádná automatizace.", "panel_settings": "Nastavení panelu", "param_sweep": "Prohledávání parametru", + "pg_settings_source": "Zdroj nastavení", "phase_catalog": "Katalog fází", "playground": "Testovací prostředí", "process_history": "Historie procesu", @@ -348,6 +412,7 @@ "default_access_level": "Výchozí úroveň pro uživatele, kteří nejsou uvedeni níže", "default_other": "Výchozí (ostatní zařízení)", "default_tab": "Výchozí karta při otevření panelu", + "font_size": "Velikost písma panelu", "delta": "Δ", "description": "Popis", "dtw_blend_w": "Váha směsi", @@ -415,6 +480,9 @@ "pg_match_score": "Skóre shody", "pg_pct_of": "{p}% z {total}", "pg_poor_match": "Špatná shoda", + "pg_preset": "Přednastavení testovacího prostředí", + "pg_preset_name": "Název nového přednastavení", + "pg_preset_none": "Vyberte přednastavení…", "pg_strong_match": "Silná shoda", "pg_tile_ambiguous": "Nejednoznačné", "pg_tile_ambiguous_tip": "Cykly s téměř shodným výsledkem mezi dvěma programy", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Použít nejlepší hodnotu: {label} = {value}?", "pg_canvas_empty": "Vyberte cyklus výše a poté stiskněte Načíst pro zobrazení jeho průběhu výkonu.", "pg_chart_caption": "Míra detekce/shody v závislosti na hodnotách {param}", + "pg_ctrl_intro": "Hodnoty vycházejí z aktivního nastavení integrace pro toto zařízení. Úpravy zůstávají v testovacím prostředí, dokud je neuložíte do integrace.", + "pg_live_unavailable": "Aktivní nastavení není k dispozici, zobrazují se výchozí hodnoty.", + "pg_load_live_confirm": "Zahodit úpravy v testovacím prostředí ({n}) a znovu načíst aktuální nastavení integrace?", "pg_match_rate": "{pct}% míra shody na {total} cyklech", + "pg_matches_live": "Odpovídá aktivnímu nastavení", + "pg_n_changed": "Změněno oproti aktivnímu nastavení: {n}", + "pg_sugg_none": "Všechny návrhy již odpovídají aktuálnímu nastavení", + "pg_preset_delete_confirm": "Smazat přednastavení \"{name}\"?", + "pg_preset_limit": "Dosažen limit přednastavení ({n})", + "pg_preset_overwrite": "Přepsat přednastavení \"{name}\"?", + "pg_publish_one_confirm": "Uložit {label} = {value} do nastavení tohoto zařízení?", "pg_restart_note": "Restartujte Home Assistant, abyste povolili nástroje simulace.", "pg_sim_progress": "{done} / {total} cyklů", "pg_starting": "Spouštění…", @@ -789,6 +867,7 @@ "preferences_admin": "Předvolby, panel a řízení přístupu", "preferences_adv": "Předvolby", "prefs_personal": "Platí pouze pro váš účet Home Assistant.", + "font_size_hint": "Zvětšete nebo zmenšete vše v tomto panelu. Platí pro váš účet na tomto zařízení.", "process_history_hint": "Znovu spustí párování na všech uložených cyklech, obnoví návrhy ladění, přetrénuje modely ML (je-li povoleno) a přepočítá zdraví cyklů. Spusťte po skupině revizí.", "profile_deleted": "Profil smazán", "profile_poor_health_detail": "Cykly přiřazené k tomuto profilu mají nekonzistentní tvary nebo nízkou spolehlivost. Zvažte přestavbu obálky nebo revizi označených cyklů.", @@ -821,6 +900,10 @@ "split_intro": "Kliknutím na graf přidáte nebo odstraníte dělicí bod nebo automaticky rozpoznáte mezery v nečinnosti. Každý výsledný segment může získat svůj vlastní profil.", "storage_diagnostics": "Statistiky úložiště, údržba, export/import", "sug_staged": "Nastaveno {key} = {val}. Uložte pro použití.", + "sug_muted": "Toto nastavení již nebude navrhováno", + "sug_mute_failed": "Skrytí návrhu se nezdařilo", + "sug_unmuted_all": "Skryté návrhy obnoveny", + "n_suggestions_muted": "{count} skrytých; automatický ladicí nástroj tato nastavení nebude navrhovat.", "toast_auto_detect_enabled": "Automatické rozpoznávání povoleno", "toast_auto_label_complete": "Automatické označování dokončeno", "toast_auto_label_failed": "Automatické označování selhalo: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Trendy kratší ({pct} %/cyklus) – poslední průměr {avg}", "trend_energy_down": "Energetický trend klesá ({pct} %/cyklus)", "trend_energy_up": "Trend energie stoupá ({pct} %/cyklus) – poslední průměr {avg}", + "trim_destructive_confirm": "Tímto zůstane jen {pct}% cyklu a akci nelze vrátit zpět. Pokračovat?", "trim_intro": "Přetáhněte červené úchyty nebo zadejte hodnoty. Vše mimo okno je odstraněno.", "tuning_suggestions_available": "{count} návrh ladění dostupný z pozorovaných cyklů. Zobrazují se vedle příslušných polí.", "unsure_detected_prefix": "WashData si není jistý, zda jej detekoval", @@ -970,6 +1054,10 @@ "unusable": "Nepoužitelný" }, "section": { + "dishwasher": { + "label": "Myčka nádobí", + "intro": "Zpracování konce cyklu u myček nádobí, které obvykle končí dlouhou téměř tichou fází sušení před krátkým závěrečným odčerpáním vody." + }, "anti_wrinkle": { "intro": "Režim ochrany před zmačkáním detekuje krátké pulzy nízkého výkonu po hlavní fázi a připojuje je k dokončenému cyklu.", "label": "Ochrana před zmačkáním" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Uvolnění po tiché fázi sušení", + "doc": "Jakmile cyklus překročí svou očekávanou dobu trvání, jak dlouho musí myčka zůstat v klidu (pod Prahem zastavení), než WashData přestane čekat na závěrečné odčerpání vody a ukončí cyklus. Zvyšte hodnotu, pokud má váš spotřebič dlouhou tichou fázi sušení před pozdním závěrečným odčerpáním, které uniká detekci - širší okno umožňuje, aby naučená doba trvání sledovala sezonní posun (studenější přiváděná voda = delší cykly) místo toho, aby zůstala uzamčená na starém průměru. Čekání pouze zkracuje vzhledem k internímu 30minutovému limitu čekání na závěrečné odčerpání, nikdy jej neprodlužuje." + }, "anti_wrinkle_enabled": { "doc": "Rozpoznejte krátké impulzy s nízkým příkonem, které sušič emituje po hlavní tepelné fázi, a udržte je připojené k dokončenému cyklu místo čtení jako nové cykly.", "label": "Povolit detekci ochrany před zmačkáním" @@ -1232,6 +1324,10 @@ "doc": "Minuty po ukončení cyklu před odesláním stále čekající připomínky \"vyloučit stroj\". Nastavte 0 pro vypnutí připomínky.", "label": "Zpoždění připomínky vyložení" }, + "notify_unload_repeat": { + "doc": "Znovu odesílá připomínku vyložení každých \"Zpoždění připomínky vyložení\" minut, dokud neotevřete dveře nebo v oznámení neklepnete na \"Přestat připomínat\". Vyžaduje Entitu senzoru dveří (stejně jako samotná připomínka). Tlačítko pro zrušení funguje u oznámení mobilní aplikace Home Assistant (companion app).", + "label": "Opakovat, dokud se neotevřou dveře" + }, "off_delay": { "doc": "Čas čekání po poklesu příkonu před vyhlášením ukončení cyklu. Pokud se příkon obnoví v tomto okně, cyklus plynule pokračuje – to přemostí pauzy mezi fázemi praní. Myčky nádobí mají dlouhé fáze sušení (příkon vypnut po dobu 20–60 minut), takže zpozdění vypnutí musí tuto dobu překročit, aby byl celkový cyklus mytí+sušení zachován jako jeden.", "label": "Zpoždění vypnutí" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Ostrost energie", "doc": "Ostrost penalizace za neshodu energie ve Fázi 4. Menší = přísnější: neshoda energie více snižuje skóre. Výchozí hodnota 0,25 je záměrně benevolentnější než Ostrost délky trvání, protože energie se liší podle zátěže. Kombinujte s Váhou energie." + }, + "power_profile_interval_min": { + "label": "Interval výkonového profilu", + "doc": "Velikost segmentu pro atribut senzoru power_profile pro daný profil (plochá sada průměrných wattů za slot spotřebovaná externími plánovači jako EMHASS a tibber_prices). Menší segmenty zachovávají krátké výkonové špičky ostré; větší segmenty vyhlazují tvar. Výchozí 15 min. Pouze při načítání; neovlivňuje detekci." + }, + "notify_live_sticky": { + "label": "Zachovat živé oznámení po klepnutí", + "doc": "Pouze Android. Živé oznámení průběhu nastavte jako trvalé (přilepené), aby jeho klepnutím nedošlo k zavření průběžného vlákna. Vypnuto zachovává výchozí chování, kdy klepnutí oznámení zavře." + }, + "notify_live_click_action": { + "label": "Cíl klepnutí na živé oznámení", + "doc": "Pouze Android. Kam klepnutí na živé oznámení průběhu otevře (např. /lovelace/laundry nebo celá URL) namísto vstupní stránky aplikace. Ponechte prázdné pro výchozí nastavení." + }, + "door_opens_at_end": { + "label": "Dveře se na konci automaticky otevřou", + "doc": "Pro myčky nádobí, které na konci cyklu otevřou dveře za účelem sušení (AirDry a podobné). Při zapnuté funkci otevření dveří za běhu cyklu již nezastaví cyklus natrvalo; pokud dveře zůstanou otevřené po dobu čekání níže, WashData cyklus ukončí. Krátké otevření (přidání předmětu) je ignorováno. Vyžaduje entitu senzoru dveří." + }, + "door_end_dwell_seconds": { + "label": "Čekání na otevření dveří pro ukončení", + "doc": "Jak dlouho musí dveře zůstat otevřené, než WashData ukončí cyklus, pokud je zapnuta funkce \"Dveře se na konci automaticky otevřou\". Dostatečně dlouhé k ignorování rychlého přidání nádobí (výchozí 60 s), dostatečně krátké pro rychlé ukončení po otevření dveří spotřebičem." } }, "setting_group": { @@ -1592,6 +1708,7 @@ "min_active": "Na základě minimálního činného výkonu ({min}W) zaznamenaného v posledním cyklu.", "min_duration_ratio": "Ponecháno co nejnižší, aby byl program rozpoznán brzy v cyklu; prahy jistoty a nejednoznačnosti brání předčasnému potvrzení.", "min_off_gap": "Na základě {gaps} pozorovaných mezer mezi cykly (p05={p05}s). Minimum zařízení: {floor}s.", + "min_off_gap_bridge": "Nastaveno tak, aby překlenulo nejdelší tichý úsek uvnitř cyklu: {span}s + rezerva 60s, z {spans} překlenutých mezer napříč {cycles} čistými cykly (zůstává pod {ceiling}s, nejkratší mezerou, kterou necháváte mezi dvěma dávkami).", "min_power": "40% nejnižšího činného výkonu p05 ({p05}W) napříč {cycles} čistými cykly, aby práh vypnutí zůstal pod skutečným odběrem.{excl}", "ml_auto_label": "Nejnižší jistota, při které model kvality stále hodnotil cyklus jako čistý (p10 z {cycles} čistých cyklů = {p10}).", "ml_end_repeat": "{false}/{total} cyklů ({pct}%) mělo pauzu, kterou detektor konce ohodnotil nad 50%; vyžadovat {val} potvrzení konce.", @@ -1608,7 +1725,7 @@ "thr_batch": "Ponecháno těsně nad nejnižším činným výkonem p05 napříč {cycles} cykly ({p05}W), aby byl start zachycen co nejdříve a práh zastavení zůstal pod nejnižším provozním výkonem stroje.", "tol_per_profile": "p75 rozptylu délky podle profilu napříč {profiles} profily ({cycles} cyklů); konzistentní profily nejsou penalizovány.", "tol_pooled": "Na základě sloučeného rozptylu délky {cycles} nedávných označených cyklů (odchylka p95={dev}).", - "watchdog": "Ponecháno co nejnižší při zachování bezpečnosti (3x interval aktualizace p95 ve výši {p95}s, min. 30s), aby byla zaseknutí rychle odhalena bez falešných zastavení." + "watchdog": "Ponecháno co nejnižší při zachování bezpečnosti (těsně nad intervalem aktualizace p95 ve výši {p95}s, min. 30s), aby byla zaseknutí rychle odhalena bez falešných zastavení." }, "exclusions": { "summary": "Vyloučeno {total} chybně detekovaných cyklů: {parts}.", @@ -1688,6 +1805,10 @@ "name_required": "Jméno je povinné", "no_split_found": "Nebyly nalezeny žádné volné mezery, které by se daly rozdělit", "panel_settings_saved": "Nastavení panelu uloženo", + "pg_preset_loaded": "Přednastavení \"{name}\" načteno", + "pg_preset_saved": "Přednastavení \"{name}\" uloženo", + "pg_sugg_loaded": "Načteno {n} navrhovaných hodnot - spusťte testovací prostředí pro porovnání", + "pg_sugg_ml_loaded": "Načteno {n} hodnot kalibrovaných ML - spusťte testovací prostředí pro porovnání", "phase_name_required": "Název fáze je povinný", "phase_updated": "Fáze aktualizována", "phases_saved": "Fáze uloženy", @@ -1770,6 +1891,7 @@ "other": "Jiné" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Myčka: tiché sekundy po očekávané době trvání, než se uvolní čekání na závěrečné odčerpání vody", "anti_wrinkle_enabled": "Pohltit impulzy bubnu po hlavní fázi místo čtení jako nové cykly", "anti_wrinkle_exit_power": "Výkon musí mezi impulzy klesnout pod tuto hodnotu, aby ochrana před zmačkáním zůstala aktivní", "anti_wrinkle_idle_timeout": "Povolený klid mezi dvěma impulzy bubnu, než ochrana před zmačkáním skončí", diff --git a/custom_components/ha_washdata/translations/panel/da.json b/custom_components/ha_washdata/translations/panel/da.json index 4df35869..47869a4d 100644 --- a/custom_components/ha_washdata/translations/panel/da.json +++ b/custom_components/ha_washdata/translations/panel/da.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entitet ikke fundet", + "running_long": "Kører længere", + "remaining": "tilbage", + "progress": "fremgang", + "show_time_remaining": "Vis resterende tid", + "show_percentage": "Vis procent", + "layout": { + "tile": "Felt (kompakt)", + "detail": "Detalje (detaljeret)", + "glance": "Overblik (flere enheder)" + }, + "btn": { + "pause": "Pause", + "resume": "Genoptag", + "terminate": "Afslut cyklus", + "record_start": "Start optagelse", + "record_stop": "Stop optagelse", + "program": "Program", + "open_panel": "Åbn WashData" + }, + "editor": { + "layout": "Layout", + "entity": "Apparatentitet", + "entities": "Apparater", + "title": "Titel", + "icon": "Ikon", + "show_state": "Vis tilstand", + "show_program": "Vis program", + "show_progress_bar": "Vis fremgangslinje", + "spin_icon": "Roter ikon under kørsel", + "display_mode": "Detaljelinje", + "active_color": "Tilsidesæt aktiv farve", + "show_phase": "Vis fase", + "show_energy": "Vis energi og omkostninger", + "show_anomaly": "Vis advarsel om lang kørsel", + "show_sparkline": "Vis live effektgraf", + "buttons": "Handlingsknapper", + "program_entity": "Programentitet (tilsidesæt)", + "time_entity": "Tidsentitet (tilsidesæt)", + "pct_entity": "Fremgangsentitet (tilsidesæt)", + "power_entity": "Effektentitet (tilsidesæt)", + "tap_action": "Tryk-handling", + "hold_action": "Hold-handling", + "double_tap_action": "Dobbelttryk-handling" + } + }, "badge": { "artifact_tip": "{n} registrerede anomalier (f.eks. dør åbnet midt i cyklus) – åben for at se dem på grafen", "auto": "(auto-detekteret)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Sæt den kørende cyklus på pause – apparatet genoptager, hvor det slap", "pg_apply_device": "Anvend på enhed", "pg_autofill": "Autoudfyld", + "pg_load_calibrated": "Indlæs kalibrerede (ML) ({n})", + "pg_load_calibrated_tip": "Indlæser ML-kalibrerede indstillinger som legeplads-tilsidesættelser", + "pg_load_live": "Indlæs aktive indstillinger", + "pg_load_live_tip": "Genindlæs integrationens aktuelle indstillinger, og kassér alle ændringer i legepladsen", + "pg_load_suggested": "Indlæs forslag ({n})", + "pg_load_suggested_tip": "Indlæser auto-tunerens aktuelle forslag som legeplads-tilsidesættelser", + "pg_preset_delete": "Slet forudindstilling", + "pg_preset_load": "Indlæs forudindstilling", + "pg_preset_load_tip": "Erstat værdierne i legepladsen med denne forudindstilling (de aktive indstillinger røres ikke)", + "pg_preset_save": "Gem som forudindstilling", + "pg_preset_save_tip": "Gem alle værdier nedenfor som en navngiven forudindstilling for denne enhed", + "pg_publish_all": "Gem {n} i integrationen", + "pg_publish_one": "Gem {label} i integrationen", "play": "Afspil", "process": "Behandl", "process_history": "Behandl nu", @@ -178,7 +239,9 @@ "download_export": "Download eksport", "analyze_import": "Analysér fil", "import_selected": "Importér valgte", - "back": "Tilbage" + "back": "Tilbage", + "mute_suggestion": "Stop med at foreslå denne indstilling", + "reset_muted": "Nulstil undertrykte forslag" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +338,7 @@ "no_automations": "Ingen automatiseringer refererer til denne enhed endnu.", "panel_settings": "Panelindstillinger", "param_sweep": "Parametersweep", + "pg_settings_source": "Indstillingernes kilde", "phase_catalog": "Fasekatalog", "playground": "Legeplads", "process_history": "Proceshistorie", @@ -410,6 +474,9 @@ "pg_group_detection": "Registreringsudløsere", "pg_group_timing": "Tidsregler", "pg_idle": "Inaktiv", + "pg_preset": "Forudindstilling til legepladsen", + "pg_preset_name": "Navn på ny forudindstilling", + "pg_preset_none": "Vælg en forudindstilling…", "pg_stress_group": "Test af inaktiv afslutning", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Inaktivt niveau (W)", @@ -609,7 +676,8 @@ "conflict_import_copy": "Importér som kopi", "conflict_keep_mine": "Behold mine", "conflict_overwrite": "Overskriv", - "pg_anti_wrinkle": "Anti-rynke" + "pg_anti_wrinkle": "Anti-rynke", + "font_size": "Panel-skriftstørrelse" }, "log": { "all_levels": "Alle niveauer", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Anvend bedste værdi: {label} = {value}?", "pg_canvas_empty": "Vælg en cyklus ovenfor, og tryk derefter på Indlæs for at se dens effektkurve.", "pg_chart_caption": "Registrerings-/matchrate på tværs af værdier for {param}", + "pg_ctrl_intro": "Værdierne tager udgangspunkt i denne enheds aktive indstillinger i integrationen. Ændringer bliver i legepladsen, indtil du gemmer dem i integrationen.", + "pg_live_unavailable": "Aktive indstillinger er ikke tilgængelige, viser standardværdier.", + "pg_load_live_confirm": "Kassér {n} ændring(er) i legepladsen, og genindlæs integrationens aktuelle indstillinger?", "pg_match_rate": "{pct}% matchrate på {total} cyklusser", + "pg_matches_live": "Svarer til de aktive indstillinger", + "pg_n_changed": "{n} ændret i forhold til de aktive indstillinger", + "pg_sugg_none": "Alle forslag stemmer allerede overens med de aktive indstillinger", + "pg_preset_delete_confirm": "Slet forudindstillingen \"{name}\"?", + "pg_preset_limit": "Grænsen for forudindstillinger er nået ({n})", + "pg_preset_overwrite": "Overskriv forudindstillingen \"{name}\"?", + "pg_publish_one_confirm": "Gem {label} = {value} i denne enheds indstillinger?", "pg_restart_note": "Genstart Home Assistant for at aktivere simuleringsværktøjerne.", "pg_sim_progress": "{done} / {total} cyklusser", "pg_starting": "Starter…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Varighed, der trender kortere ({pct}%/cyklus) – seneste gennemsnit {avg}", "trend_energy_down": "Energi på vej ned ({pct} %/cyklus)", "trend_energy_up": "Energitrends op ({pct} %/cyklus) – seneste gennemsnit {avg}", + "trim_destructive_confirm": "Dermed bevares kun {pct}% af cyklussen. Dette kan ikke fortrydes. Fortsæt?", "trim_intro": "Træk i de røde håndtag, eller indtast værdier. Alt uden for vinduet fjernes.", "tuning_suggestions_available": "{count} indstillingsforslag tilgængeligt fra observerede cyklusser. De vises ved siden af ​​de relevante felter.", "unsure_detected_prefix": "WashData er usikker på, om det er registreret", @@ -922,9 +1001,15 @@ "merge_hint": "Importerede elementer tilføjes; intet lokalt går tabt. Navnekonflikter løses nedenfor.", "replace_warn": "Hver markeret kategori slettes og erstattes fra filen. Ikke-markerede kategorier forbliver uændrede.", "dest_reference_hint": "Importerede cyklusser forbedrer kun programgenkendelse og påvirker aldrig forbrugs-/energistatistik.", - "dest_real_history_hint": "Importerede cyklusser tæller som dette apparats egen historik og indgår i energi-/forbrugsstatistik. Brug dette til at flytte ét apparat til en ny installation." + "dest_real_history_hint": "Importerede cyklusser tæller som dette apparats egen historik og indgår i energi-/forbrugsstatistik. Brug dette til at flytte ét apparat til en ny installation.", + "sug_muted": "Vil ikke foreslå denne indstilling igen", + "sug_mute_failed": "Kunne ikke undertrykke forslaget", + "sug_unmuted_all": "Undertrykte forslag nulstillet", + "n_suggestions_muted": "{count} undertrykt; autotuner vil ikke foreslå disse.", + "font_size_hint": "Gør alt i dette panel større eller mindre. Gælder for din konto på denne enhed." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Opvaskemaskine: stille sekunder efter den forventede varighed, før ventetiden på udpumpning ved cyklusslut frigives", "completion_min_seconds": "Korteste kørsel, der tæller som en rigtig cyklus", "end_repeat_count": "Lave målinger i træk før afslutning", "interrupted_min_seconds": "Korte cyklusser markeres som afbrudt", @@ -998,6 +1083,10 @@ "unusable": "Ubrugelig" }, "section": { + "dishwasher": { + "label": "Opvaskemaskine", + "intro": "Håndtering af cyklusafslutning for opvaskemaskiner, der typisk slutter med en lang, næsten lydløs tørrefase før en kort sidste udpumpning." + }, "anti_wrinkle": { "intro": "Anti-rynke-tilstand registrerer tumble-pulser med lav effekt efter den vigtigste fase og holder dem tilknyttet den afsluttede cyklus.", "label": "Anti-rynke" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Frigivelse efter stille tørrefase", + "doc": "Når cyklussen overskrider sin forventede varighed: hvor længe opvaskemaskinen skal forblive stille (under Stoptærskel), før WashData holder op med at vente på en sidste udpumpning og afslutter cyklussen. Hæv den, hvis din maskine har en lang stille tørrefase før en sen sidste udpumpning, der bliver overset - et bredere vindue lader den indlærte varighed følge sæsonudsving (koldere indløbsvand = længere cyklusser) i stedet for at låse sig til det gamle gennemsnit. Den forkorter kun ventetiden i forhold til den interne grænse på 30 minutter for slutspidsen, aldrig forlænger den." + }, "anti_wrinkle_enabled": { "doc": "Genkend de korte tørretumblerimpulser med lav effekt, som en tørretumbler udsender efter hovedvarmefasen, og hold dem fastgjort til den færdige cyklus i stedet for at læse dem som nye cyklusser.", "label": "Aktivér anti-rynke registrering" @@ -1260,6 +1353,10 @@ "doc": "Minutter efter en cyklus er afsluttet, før du sender den stadig ventende påmindelse om \"aflæs maskinen\". Indstil 0 for at deaktivere påmindelsen.", "label": "Forsinkelse for aflæsningspåmindelse" }, + "notify_unload_repeat": { + "doc": "Bliv ved med at gensende aflæsningspåmindelsen hvert \"Forsinkelse for aflæsningspåmindelse\" minutter, indtil du åbner døren eller trykker på \"Stop påmindelser\" i notifikationen. Kræver en Dørsensorenhed (det gør selve påmindelsen). Knappen til at afvise virker på notifikationer fra Home Assistant companion-appen (mobil).", + "label": "Gentag indtil døren åbnes" + }, "off_delay": { "doc": "Tid til at vente efter strømfald, før cyklussen erklæres afsluttet. Hvis strømmen genoptages inden for dette vindue, fortsætter cyklussen problemfrit - dette slår bro mellem pauser mellem vasketrinene. Opvaskemaskiner har lange tørrefaser (strøm fra i 20-60 min), så slukningsforsinkelsen skal overstige det for at holde hele vask+tør som én cyklus.", "label": "Slukkeforsinkelse" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Energiskarphed", "doc": "Skarphed i Trin 4's straf for energioverensstemmelse. Lavere = strengere: et energiafvigelse skader mere. Standard 0,25 er bevidst mere tillåtende end varighedsskarphed fordi energi varierer med belastning. Par med Energivægt." + }, + "power_profile_interval_min": { + "label": "Effektprofil-interval", + "doc": "Bucket-størrelse for effektprofilsensorens attribut power_profile (det flade array af gennemsnitlige watt-værdier pr. slot, der bruges af eksterne planlæggere som EMHASS og tibber_prices). Mindre buckets holder korte effektspidser skarpe; større buckets glatter kurven. Standard 15 min. Kun til visning; påvirker ikke detektering." + }, + "notify_live_sticky": { + "label": "Behold live-notifikation ved tryk", + "doc": "Kun Android. Gør live-forløbsnotifikationen vedvarende (sticky), så et tryk ikke afviser den. Slukket: standardadfærd, hvor et tryk afviser notifikationen." + }, + "notify_live_click_action": { + "label": "Trykdestination for live-notifikation", + "doc": "Kun Android. Hvor et tryk på live-forløbsnotifikationen åbner (f.eks. /lovelace/laundry eller en fuld URL) i stedet for app-startsiden. Lad stå blank for standard." + }, + "door_opens_at_end": { + "label": "Dør åbner automatisk ved afslutning", + "doc": "Til opvaskemaskiner, der springer døren op ved afslutningen af cyklussen for at tørre (AirDry og lignende). Når dette er aktiveret, sætter en døråbning under en aktiv cyklus den ikke på pause for evigt; hvis døren forbliver åben i den konfigurerede opholdsperiode, betragter WashData cyklussen som afsluttet. En kort åbning (tilføjelse af en tallerken) ignoreres. Kræver en dørsensorenhed." + }, + "door_end_dwell_seconds": { + "label": "Dørens åbningstid ved afslutning", + "doc": "Hvor længe døren skal forblive åben, før WashData afslutter cyklussen, når \"Dør åbner automatisk ved afslutning\" er aktiveret. Lang nok til at ignorere hurtig tilføjelse af en tallerken (standard 60 s), kort nok til at afslutte hurtigt, når maskinen springer døren op." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Baseret på laveste aktive effekt ({min}W) observeret i sidste cyklus.", "min_duration_ratio": "Holdt så lav som muligt, så et program genkendes tidligt i cyklussen; konfidens- og tvetydighedsgrænserne forhindrer forhastede beslutninger.", "min_off_gap": "Baseret på {gaps} observerede mellemrum mellem cyklusser (p05={p05}s). Enhedsgulv: {floor}s.", + "min_off_gap_bridge": "Dimensioneret til at bygge bro over den længste stille periode i en cyklus: {span}s + 60s buffer, fra {spans} dækkede mellemrum på tværs af {cycles} rene cyklusser (holder sig under dit korteste mellemrum på {ceiling}s mellem to kørsler).", "min_power": "40% af den laveste aktive effekt ved p05 ({p05}W) på tværs af {cycles} rene cyklusser, hvilket holder sluk-tærsklen under reelt forbrug.{excl}", "ml_auto_label": "Laveste konfidens, som kvalitetsmodellen stadig vurderede som ren (p10 af {cycles} rene cyklusser = {p10}).", "ml_end_repeat": "{false}/{total} cyklusser ({pct}%) havde en pause, som slutdetektoren vurderede til >50%; kræver {val} slutbekræftelse(r).", @@ -1636,7 +1754,7 @@ "thr_batch": "Holdt lige over den laveste aktive effekt ved p05 på tværs af {cycles} cyklusser ({p05}W), så en start fanges så tidligt som muligt, og stoptærsklen forbliver under maskinens laveste driftseffekt.", "tol_per_profile": "p75 for varighedsvariansen pr. profil på tværs af {profiles} profiler ({cycles} cyklusser); stramme profiler straffes ikke.", "tol_pooled": "Baseret på samlet varighedsvarians for {cycles} seneste mærkede cyklusser (p95 afvigelse={dev}).", - "watchdog": "Holdt så lavt som forsvarligt (3x p95-opdateringsmellemrummet på {p95}s, min 30s), så stilstande fanges hurtigt uden falske stop." + "watchdog": "Holdt så lavt som forsvarligt (lige over p95-opdateringsmellemrummet på {p95}s, min 30s), så stilstande fanges hurtigt uden falske stop." }, "exclusions": { "summary": "{total} fejldetekterede cyklus(ser) udelukket: {parts}.", @@ -1716,6 +1834,10 @@ "name_required": "Navn påkrævet", "no_split_found": "Ingen ledige mellemrum fundet at dele på", "panel_settings_saved": "Panelindstillinger gemt", + "pg_preset_loaded": "Forudindstillingen \"{name}\" er indlæst", + "pg_preset_saved": "Forudindstillingen \"{name}\" er gemt", + "pg_sugg_loaded": "{n} foreslåede(t) værdi(er) indlæst - kør legepladsen for at sammenligne", + "pg_sugg_ml_loaded": "{n} ML-kalibrerede(t) værdi(er) indlæst - kør legepladsen for at sammenligne", "phase_name_required": "Fasenavn er påkrævet", "phase_updated": "Fase opdateret", "phases_saved": "Faser gemt", diff --git a/custom_components/ha_washdata/translations/panel/de.json b/custom_components/ha_washdata/translations/panel/de.json index f788e8b9..bc557a40 100644 --- a/custom_components/ha_washdata/translations/panel/de.json +++ b/custom_components/ha_washdata/translations/panel/de.json @@ -1,4 +1,52 @@ { + "card": { + "min": "Min.", + "entity_not_found": "Entität nicht gefunden", + "running_long": "Läuft länger", + "remaining": "verbleibend", + "progress": "Fortschritt", + "show_time_remaining": "Verbleibende Zeit anzeigen", + "show_percentage": "Prozentsatz anzeigen", + "layout": { + "tile": "Kachel (kompakt)", + "detail": "Detail (ausführlich)", + "glance": "Überblick (mehrere Geräte)" + }, + "btn": { + "pause": "Pausieren", + "resume": "Fortsetzen", + "terminate": "Zyklus beenden", + "record_start": "Aufnahme starten", + "record_stop": "Aufnahme stoppen", + "program": "Programm", + "open_panel": "WashData öffnen" + }, + "editor": { + "layout": "Layout", + "entity": "Geräteentität", + "entities": "Geräte", + "title": "Titel", + "icon": "Symbol", + "show_state": "Status anzeigen", + "show_program": "Programm anzeigen", + "show_progress_bar": "Fortschrittsbalken anzeigen", + "spin_icon": "Symbol während des Betriebs drehen", + "display_mode": "Detailzeile", + "active_color": "Aktivfarbe überschreiben", + "show_phase": "Phase anzeigen", + "show_energy": "Energie und Kosten anzeigen", + "show_anomaly": "Warnung bei Überlänge anzeigen", + "show_sparkline": "Live-Leistungsdiagramm anzeigen", + "buttons": "Aktionsschaltflächen", + "program_entity": "Programmentität (überschreiben)", + "time_entity": "Zeitentität (überschreiben)", + "pct_entity": "Fortschrittsentität (überschreiben)", + "power_entity": "Leistungsentität (überschreiben)", + "tap_action": "Tippen-Aktion", + "hold_action": "Halten-Aktion", + "double_tap_action": "Doppeltippen-Aktion" + } + }, "badge": { "artifact_tip": "{n} Anomalien erkannt (z. B. Tür mitten im Zyklus geöffnet) – öffnen Sie sie, um sie in der Grafik anzuzeigen", "auto": "(automatisch erkannt)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Laufenden Zyklus anhalten – das Gerät setzt dort fort, wo es aufgehört hat", "pg_apply_device": "Auf Gerät anwenden", "pg_autofill": "Automatisch ausfüllen", + "pg_load_calibrated": "Kalibrierte (ML) laden ({n})", + "pg_load_calibrated_tip": "Lädt ML-kalibrierte Einstellungen als Testbereich-Überschreibungen", + "pg_load_live": "Aktive Einstellungen laden", + "pg_load_live_tip": "Die aktuellen Einstellungen der Integration neu einlesen und alle Änderungen im Testbereich verwerfen", + "pg_load_suggested": "Vorschläge laden ({n})", + "pg_load_suggested_tip": "Lädt die aktuellen Vorschläge des Auto-Tuners als Testbereich-Überschreibungen", + "pg_preset_delete": "Voreinstellung löschen", + "pg_preset_load": "Voreinstellung laden", + "pg_preset_load_tip": "Die Werte im Testbereich durch diese Voreinstellung ersetzen (die aktiven Einstellungen bleiben unverändert)", + "pg_preset_save": "Als Voreinstellung speichern", + "pg_preset_save_tip": "Alle Werte unten als benannte Voreinstellung für dieses Gerät speichern", + "pg_publish_all": "{n} in Integration übernehmen", + "pg_publish_one": "{label} in die Integration übernehmen", "play": "Abspielen", "process": "Verarbeiten", "process_history": "Jetzt verarbeiten", @@ -178,7 +239,9 @@ "download_export": "Export herunterladen", "analyze_import": "Datei analysieren", "import_selected": "Auswahl importieren", - "back": "Zurück" + "back": "Zurück", + "mute_suggestion": "Diese Einstellung nicht mehr vorschlagen", + "reset_muted": "Stummschaltungen zurücksetzen" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +338,7 @@ "no_automations": "Noch keine Automatisierungen verweisen auf dieses Gerät.", "panel_settings": "Panel-Einstellungen", "param_sweep": "Parameter-Sweep", + "pg_settings_source": "Herkunft der Einstellungen", "phase_catalog": "Phasenkatalog", "playground": "Testbereich", "process_history": "Prozesshistorie", @@ -410,6 +474,9 @@ "pg_group_detection": "Erkennungsauslöser", "pg_group_timing": "Zeitregeln", "pg_idle": "Leerlauf", + "pg_preset": "Testbereich-Voreinstellung", + "pg_preset_name": "Name der neuen Voreinstellung", + "pg_preset_none": "Voreinstellung auswählen…", "pg_stress_group": "Leerlauferkennungstest", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Leerlaufpegel (W)", @@ -609,7 +676,8 @@ "conflict_import_copy": "Als Kopie importieren", "conflict_keep_mine": "Meine behalten", "conflict_overwrite": "Überschreiben", - "pg_anti_wrinkle": "Knitterschutz" + "pg_anti_wrinkle": "Knitterschutz", + "font_size": "Panel-Schriftgröße" }, "log": { "all_levels": "Alle Ebenen", @@ -711,7 +779,7 @@ "cycles_deleted": "{count} Zyklen gelöscht", "enough_data": "Genügend Daten zum Lernen ({current}/{min} Zyklen).", "export_description": "Wählen Sie genau aus, welche Profile, Zyklen, Einstellungen und mehr nach JSON exportiert werden sollen, oder analysieren Sie eine Datei und importieren Sie nur die gewünschten Teile.", - "feedback_cycles_pending": "{n} Zyklus{s} zur Überprüfung", + "feedback_cycles_pending": "Zu überprüfen: {n}", "feedback_prompt": "Bestätigen Sie, dass es richtig war, korrigieren Sie das Programm oder ignorieren Sie es.", "feedback_relabel_hint": "Das erneute Beschriften dieses Zyklus erledigt die Überprüfung ebenfalls.", "filter_by_profile": "Nach Profil filtern…", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Besten Wert anwenden: {label} = {value}?", "pg_canvas_empty": "Wählen Sie oben einen Zyklus aus und drücken Sie dann auf Laden, um seine Leistungskurve anzuzeigen.", "pg_chart_caption": "Erkennungs-/Zuordnungsrate über die Werte von {param}", + "pg_ctrl_intro": "Die Werte stammen zunächst aus den aktiven Einstellungen dieses Geräts in der Integration. Änderungen bleiben im Testbereich, bis sie in die Integration übernommen werden.", + "pg_live_unavailable": "Aktive Einstellungen nicht verfügbar, es werden Standardwerte angezeigt.", + "pg_load_live_confirm": "{n} Änderung(en) im Testbereich verwerfen und die aktuellen Einstellungen der Integration neu laden?", "pg_match_rate": "{pct}% Zuordnungsrate bei {total} Zyklen", + "pg_matches_live": "Stimmt mit den aktiven Einstellungen überein", + "pg_n_changed": "{n} gegenüber den aktiven Einstellungen geändert", + "pg_sugg_none": "Alle Vorschläge stimmen bereits mit den aktuellen Einstellungen überein", + "pg_preset_delete_confirm": "Die Voreinstellung \"{name}\" löschen?", + "pg_preset_limit": "Maximale Anzahl an Voreinstellungen erreicht ({n})", + "pg_preset_overwrite": "Die Voreinstellung \"{name}\" überschreiben?", + "pg_publish_one_confirm": "{label} = {value} in den Einstellungen dieses Geräts speichern?", "pg_restart_note": "Starten Sie Home Assistant neu, um die Simulationstools zu aktivieren.", "pg_sim_progress": "{done} / {total} Zyklen", "pg_starting": "Wird gestartet…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Dauer tendenziell kürzer ({pct} %/Zyklus) – aktueller Durchschnitt {avg}", "trend_energy_down": "Energie tendiert nach unten ({pct} %/Zyklus)", "trend_energy_up": "Energietrend steigt ({pct} %/Zyklus) – aktueller Durchschnitt {avg}", + "trim_destructive_confirm": "Dadurch werden nur {pct}% des Zyklus behalten. Dies kann nicht rückgängig gemacht werden. Fortfahren?", "trim_intro": "Ziehen Sie die roten Ziehpunkte oder geben Sie Werte ein. Alles außerhalb des Fensters wird entfernt.", "tuning_suggestions_available": "{count} Optimierungsvorschlag aus beobachteten Zyklen verfügbar. Sie erscheinen neben den relevanten Feldern.", "unsure_detected_prefix": "WashData ist sich nicht sicher, ob es erkannt wurde", @@ -922,9 +1001,15 @@ "merge_hint": "Importierte Elemente werden hinzugefügt; nichts Lokales geht verloren. Namenskonflikte werden unten aufgelöst.", "replace_warn": "Jede angekreuzte Kategorie wird gelöscht und aus der Datei ersetzt. Nicht angekreuzte Kategorien bleiben unverändert.", "dest_reference_hint": "Importierte Zyklen verbessern nur die Programmerkennung und beeinflussen niemals die Nutzungs-/Energiestatistik.", - "dest_real_history_hint": "Importierte Zyklen zählen als eigener Verlauf dieses Geräts und fließen in die Energie-/Nutzungsstatistik ein. Verwenden Sie dies, um ein Gerät in eine neue Installation zu übertragen." + "dest_real_history_hint": "Importierte Zyklen zählen als eigener Verlauf dieses Geräts und fließen in die Energie-/Nutzungsstatistik ein. Verwenden Sie dies, um ein Gerät in eine neue Installation zu übertragen.", + "sug_muted": "Diese Einstellung wird nicht mehr vorgeschlagen", + "sug_mute_failed": "Einstellung konnte nicht stummgeschaltet werden", + "sug_unmuted_all": "Stummgeschaltete Vorschläge zurückgesetzt", + "n_suggestions_muted": "{count} stummgeschaltet; der Autotuner schlägt diese nicht mehr vor.", + "font_size_hint": "Alles in diesem Panel vergrößern oder verkleinern. Gilt für Ihr Konto auf diesem Gerät." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Geschirrspüler: Ruhesekunden nach der erwarteten Dauer, bevor die Wartezeit auf das Abpumpen am Zyklusende freigegeben wird", "completion_min_seconds": "Kürzester Lauf, der als echter Zyklus zählt", "end_repeat_count": "Aufeinanderfolgende niedrige Messwerte vor dem Ende", "interrupted_min_seconds": "Kurze Zyklen werden als unterbrochen markiert", @@ -998,6 +1083,10 @@ "unusable": "Unbrauchbar" }, "section": { + "dishwasher": { + "label": "Geschirrspüler", + "intro": "Behandlung des Zyklusendes für Geschirrspüler, die typischerweise mit einer langen, nahezu stillen Trocknungsphase vor einem kurzen letzten Abpumpen enden." + }, "anti_wrinkle": { "intro": "Knitterschutz-Modus erkennt Tumble-Impulse mit geringer Leistung nach der Hauptphase und hält sie dem abgeschlossenen Zyklus zugeordnet.", "label": "Knitterschutz" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Ruhefreigabe nach Passivtrocknung", + "doc": "Sobald der Zyklus seine erwartete Dauer überschreitet: wie lange der Geschirrspüler ruhig bleiben muss (unter dem Stoppschwellenwert), bevor WashData nicht mehr auf ein letztes Abpumpen wartet und den Zyklus beendet. Erhöhen Sie den Wert, wenn Ihre Maschine eine lange, stille Trocknungsphase vor einem späten letzten Abpumpen hat, das übersehen wird - ein größeres Fenster lässt die erlernte Dauer der saisonalen Drift folgen (kälteres Zulaufwasser = längere Zyklen), statt sich auf den alten Mittelwert festzulegen. Er verkürzt die Wartezeit gegenüber der internen 30-minütigen Obergrenze für die Endspitze nur, verlängert sie aber nie." + }, "anti_wrinkle_enabled": { "doc": "Erkennen Sie die kurzen, stromsparenden Wäscheimpulse, die ein Trockner nach der Hauptheizphase abgibt, und behalten Sie im Zusammenhang mit dem abgeschlossenen Zyklus bei, anstatt sie als neue Zyklen zu lesen.", "label": "Knitterschutzerkennung aktivieren" @@ -1256,6 +1349,10 @@ "doc": "Minuten nach dem Ende eines Zyklus, bevor die noch wartende Erinnerung „Maschine entladen“ gesendet wird. Stellen Sie 0 ein, um die Erinnerung zu deaktivieren.", "label": "Verzögerung der Entladeerinnerung" }, + "notify_unload_repeat": { + "doc": "Die Entladeerinnerung wird alle \"Verzögerung der Entladeerinnerung\" Minuten erneut gesendet, bis Sie die Tür öffnen oder in der Benachrichtigung auf \"Nicht mehr erinnern\" tippen. Erfordert eine Türsensor-Entität (die Erinnerung selbst benötigt sie ohnehin). Die Schaltfläche zum Verwerfen funktioniert bei Benachrichtigungen der Home Assistant Companion-App (mobil).", + "label": "Wiederholen, bis die Tür geöffnet wird" + }, "off_delay": { "doc": "Zeit, die nach einem Stromausfall gewartet werden muss, bevor der Zyklus als beendet erklärt wird. Wenn die Stromversorgung innerhalb dieses Fensters wiederhergestellt wird, läuft der Zyklus nahtlos weiter – dies überbrückt Pausen zwischen den Waschphasen. Geschirrspüler haben lange Trocknungsphasen (Ausschalten für 20–60 Minuten), daher muss die Ausschaltverzögerung länger sein, damit der gesamte Spül- und Trockenvorgang als ein Zyklus erfolgt.", "label": "Abschaltverzögerung" @@ -1434,6 +1531,26 @@ "anti_wrinkle_idle_timeout": { "label": "Maximale Impulspause", "doc": "Wie lange das Gerät zwischen zwei Trommelimpulsen still bleiben darf, bevor der Knitterschutz-Modus endet. Höher setzen als die längste Pause, die Ihr Trockner zwischen zwei Impulsen lässt – sonst wird jeder weitere Impuls als Fehlstart gewertet." + }, + "power_profile_interval_min": { + "label": "Leistungsprofil-Intervall", + "doc": "Bucket-Größe für das Attribut power_profile des profilbezogenen Sensors (ein flaches Array der durchschnittlichen Wattzahl pro Slot, das von externen Planern wie EMHASS und tibber_prices verwendet wird). Kleinere Buckets halten kurze Leistungsspitzen scharf; größere Buckets glätten die Kurve. Standard 15 Min. Nur zur Darstellung; hat keinen Einfluss auf die Erkennung." + }, + "notify_live_sticky": { + "label": "Live-Benachrichtigung beim Antippen behalten", + "doc": "Nur Android. Die Live-Fortschrittsbenachrichtigung dauerhaft (sticky) anzeigen, sodass sie beim Antippen nicht ausgeblendet wird. Ausgeschaltet: Standardverhalten, bei dem ein Antippen die Benachrichtigung schließt." + }, + "notify_live_click_action": { + "label": "Ziel beim Antippen der Live-Benachrichtigung", + "doc": "Nur Android. Wohin das Antippen der Live-Fortschrittsbenachrichtigung führt (z. B. /lovelace/laundry oder eine vollständige URL), statt zur Standard-App-Startseite. Leer lassen für Standard." + }, + "door_opens_at_end": { + "label": "Tür öffnet sich am Ende automatisch", + "doc": "Für Geschirrspüler, die die Tür am Ende des Zyklus zum Trocknen aufspringen lassen (AirDry und ähnliche). Wenn aktiviert, unterbricht ein Türöffnen bei einem laufenden Zyklus diesen nicht dauerhaft; wenn die Tür für die eingestellte Verweildauer geöffnet bleibt, wertet WashData den Zyklus als abgeschlossen. Ein kurzes Öffnen (z. B. zum Nachlegen eines Geschirrstücks) wird ignoriert. Erfordert einen Türsensor." + }, + "door_end_dwell_seconds": { + "label": "Türöffnungs-Endverweildauer", + "doc": "Wie lange die Tür geöffnet bleiben muss, bevor WashData den Zyklus beendet, wenn \"Tür öffnet sich am Ende automatisch\" aktiv ist. Lang genug, um ein kurzes Öffnen zum Nachlegen eines Geschirrteils zu ignorieren (Standard 60 s), kurz genug, um den Zyklus zügig zu beenden, sobald die Maschine die Tür aufspringt." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Basierend auf der minimalen aktiven Leistung ({min}W), die im letzten Zyklus beobachtet wurde.", "min_duration_ratio": "So niedrig wie möglich gehalten, damit ein Programm früh im Zyklus erkannt wird; die Konfidenz- und Mehrdeutigkeitsschranken verhindern vorzeitige Festlegungen.", "min_off_gap": "Basierend auf {gaps} beobachteten Pausen zwischen Zyklen (p05={p05}s). Geräte-Untergrenze: {floor}s.", + "min_off_gap_bridge": "So bemessen, dass die längste Ruhephase innerhalb eines Zyklus überbrückt wird: {span}s + 60s Puffer, aus {spans} überbrückten Lücken über {cycles} saubere Zyklen (bleibt unter Ihrem kürzesten Abstand von {ceiling}s zwischen zwei Ladungen).", "min_power": "40% der p05-niedrigsten aktiven Leistung ({p05}W) über {cycles} saubere Zyklen, sodass die Aus-Schwelle unter der tatsächlichen Leistungsaufnahme bleibt.{excl}", "ml_auto_label": "Niedrigste Konfidenz, die das Qualitätsmodell noch als sauber bewertet hat (p10 von {cycles} sauberen Zyklen = {p10}).", "ml_end_repeat": "{false}/{total} Zyklen ({pct}%) hatten eine Pause, die der Endedetektor mit >50% bewertete; {val} Endbestätigung(en) erforderlich.", @@ -1636,7 +1754,7 @@ "thr_batch": "Knapp über der p05-niedrigsten aktiven Leistung über {cycles} Zyklen ({p05}W) gehalten, damit ein Start so früh wie möglich erkannt wird und die Stopp-Schwelle unter der niedrigsten Betriebsleistung der Maschine bleibt.", "tol_per_profile": "p75 der Dauervarianz pro Profil über {profiles} Profile ({cycles} Zyklen); enge Profile werden nicht benachteiligt.", "tol_pooled": "Basierend auf der zusammengefassten Dauervarianz von {cycles} kürzlich gelabelten Zyklen (p95-Abweichung={dev}).", - "watchdog": "So niedrig wie sicher gehalten (3x die p95-Aktualisierungslücke von {p95}s, min 30s), damit Hänger schnell erkannt werden, ohne Fehl-Stopps auszulösen." + "watchdog": "So niedrig wie sicher gehalten (knapp über der p95-Aktualisierungslücke von {p95}s, min 30s), damit Hänger schnell erkannt werden, ohne Fehl-Stopps auszulösen." }, "exclusions": { "summary": "{total} falsch erkannte Zyklen ausgeschlossen: {parts}.", @@ -1716,6 +1834,10 @@ "name_required": "Name erforderlich", "no_split_found": "Es wurden keine Leerlauflücken zum Aufspalten gefunden", "panel_settings_saved": "Panel-Einstellungen gespeichert", + "pg_preset_loaded": "Voreinstellung \"{name}\" geladen", + "pg_preset_saved": "Voreinstellung \"{name}\" gespeichert", + "pg_sugg_loaded": "{n} Vorschlagswert(e) in den Testbereich geladen - Testbereich ausführen, um zu vergleichen", + "pg_sugg_ml_loaded": "{n} ML-kalibrierten Wert(e) in den Testbereich geladen - Testbereich ausführen, um zu vergleichen", "phase_name_required": "Phasenname ist erforderlich", "phase_updated": "Phase aktualisiert", "phases_saved": "Phasen gespeichert", diff --git a/custom_components/ha_washdata/translations/panel/el.json b/custom_components/ha_washdata/translations/panel/el.json index 4cb63371..c576388a 100644 --- a/custom_components/ha_washdata/translations/panel/el.json +++ b/custom_components/ha_washdata/translations/panel/el.json @@ -1,1948 +1,2070 @@ { - "badge": { - "artifact_tip": "Εντοπίστηκαν {n} ανωμαλίες (π.χ. η πόρτα άνοιξε στα μέσα του κύκλου) – ανοίξτε για να τις δείτε στο γράφημα", - "auto": "(αυτόματη ανίχνευση)", - "built_in_tag": "ενσωματωμένο", - "declining": "↘ φθίνουσα", - "energy_low": "Χαμηλότερη κατανάλωση ενέργειας από το συνηθισμένο", - "energy_spike": "Υψηλότερη κατανάλωση ενέργειας από το συνηθισμένο", - "fair_fit": "αποδεκτή ποιότητα", - "fair_fit_tip": "Μέτρια συνέπεια αντιστοίχισης – ορισμένοι κύκλοι που έχουν εκχωρηθεί σε αυτό το προφίλ έχουν χαμηλότερους βαθμούς εμπιστοσύνης. Επισημάνετε περισσότερους κύκλους ή εγγράψτε ξανά το προφίλ για να βελτιώσετε την ακρίβεια.", - "feedback_requested": "Ζητήθηκαν σχόλια", - "golden_cycle": "Καταγεγραμμένος κύκλος αναφοράς", - "improving": "↗ βελτίωση", - "manual": "(επιλεγμένο με μη αυτόματο τρόπο)", - "needs_review": "Χρειάζεται αναθεώρηση", - "overrun": "Έτρεξε περισσότερο από το συνηθισμένο", - "underrun": "Ολοκληρώθηκε γρηγορότερα από το συνηθισμένο", - "poor_fit": "κακή ποιότητα", - "poor_fit_tip": "Ασυνεπές ιστορικό αντιστοίχισης – σκεφτείτε να δημιουργήσετε ξανά αυτό το προφίλ", - "restart_gap_tip": "{n} κενό επανεκκίνησης HA: το ίχνος ισχύος έχει ένα κενό", - "reviewed": "Αξιολογήθηκε", - "steady": "→ σταθερό", - "using_defaults": "Χρήση προεπιλογών αποστολής", - "using_tuned": "Χρησιμοποιώντας συντονισμένα βάρη", - "overrun_ratio": "({x}x του αναμενόμενου)", - "underrun_ratio": "({pct}% του αναμενόμενου)", - "awaiting_tip": "Αναμονή έγκρισης από την κοινότητα", - "awaiting_n": "Αναμονή έγκρισης · {n} επιβεβαιώσεις", - "approved": "Εγκρίθηκε", - "awaiting": "Αναμονή έγκρισης", - "imported_tip": "Εισαγωγή από το κοινοτικό κατάστημα. Χρησιμοποιείται μόνο για αντιστοίχιση, δεν προσμετράται στα στατιστικά.", - "not_importable": "μη διαθέσιμο εδώ", - "exists": "υπάρχει" - }, - "btn": { - "add_device": "+ Προσθήκη συσκευής", - "add_device_tip": "Προσθέστε μια άλλη συσκευή WashData", - "add_maintenance": "Προσθήκη συμβάντος συντήρησης", - "add_phase": "+ Προσθήκη φάσης", - "add_timer": "+ Προσθήκη χρονοδιακόπτη", - "apply_all": "Εφαρμόστε όλα", - "apply_label": "Εφαρμογή ετικέτας", - "apply_set_b": "Εφαρμογή συνόλου B", - "apply_split": "Εφαρμογή Split", - "apply_trim": "Εφαρμόστε το Trim", - "auto_detect_split": "Αυτόματος εντοπισμός", - "auto_label_cycles": "Κύκλοι αυτόματης επισήμανσης", - "auto_label_cycles_tip": "Αυτόματη εκχώρηση ονομάτων προφίλ σε κύκλους χωρίς ετικέτα, των οποίων η εμπιστοσύνη αντιστοίχισης ξεπερνά το κατώφλι", - "cancel": "Ματαίωση", - "clear_debug": "Εκκαθάριση δεδομένων εντοπισμού σφαλμάτων", - "clear_splits": "Σαφής", - "close": "Κλείσιμο", - "compare": "Συγκρίνω", - "confirm": "Επιβεβαιώνω", - "convert_to_automation": "Μετατροπή σε αυτοματισμό", - "correct": "Σωστός…", - "create": "Δημιουργώ", - "create_from_cluster": "Δημιουργία προφίλ από {count} κύκλους", - "create_profile": "+ Δημιουργία προφίλ", - "delete": "Διαγράφω", - "delete_group": "Διαγραφή ομάδας", - "delete_group_tip": "Διαγραφή μόνο αυτής της ομάδας - τα προφίλ μελών διατηρούνται", - "delete_profile": "Διαγραφή προφίλ", - "discard": "Απορρίπτω", - "discard_tip": "Απόρριψη του καταγεγραμμένου ίχνους χωρίς αποθήκευση", - "dismiss": "Απολύω", - "done": "Γινώμενος", - "edit": "Εκδίδω", - "export": "Εξαγωγή", - "export_json": "Εξαγωγή σε JSON", - "force_stop": "Αναγκαστική διακοπή", - "force_stop_tip": "Άμεσος τερματισμός του τρέχοντος κύκλου και χαρακτηρισμός του ως αναγκαστικά τερματισμένου", - "from_template": "Από το πρότυπο ▾", - "ignore": "Αγνοώ", - "import_json": "Εισαγωγή από JSON", - "import_overwrite": "Εισαγωγή (αντικαθιστά δεδομένα)", - "inspect": "Ελέγχω", - "label": "Επισήμανση", - "load": "Φόρτωση", - "load_more": "Φόρτωση περισσότερων", - "manage": "Διαχειρίζομαι", - "merge": "Συγχώνευση", - "new_automation": "+ Νέος Αυτοματισμός", - "new_group": "+ Νέα ομάδα", - "new_group_tip": "Ομαδοποιήστε σχεδόν πανομοιότυπα προφίλ (ίδιο σχήμα/διάρκεια, διαφορετική θερμοκρασία ή στύψιμο) ώστε η αντιστοίχιση να επιλέγει αξιόπιστα μεταξύ τους", - "new_phase": "+ Νέα Φάση", - "new_profile": "+ Νέο προφίλ", - "new_profile_tip": "Δημιουργία νέου προφίλ προγράμματος από έναν υπάρχοντα επισημασμένο κύκλο ή εγγραφή", - "on_cycle_finished": "Ο κύκλος ολοκληρώθηκε", - "on_cycle_started": "Ο κύκλος ξεκίνησε", - "pause_cycle": "Παύση", - "pause_cycle_tip": "Παύση του εν λειτουργία κύκλου – η συσκευή θα συνεχίσει από εκεί που σταμάτησε", - "pg_apply_device": "Εφαρμογή στη συσκευή", - "pg_autofill": "Αυτόματη συμπλήρωση", - "play": "Αναπαραγωγή", - "process": "Διαδικασία", - "process_history": "Επεξεργασία τώρα", - "process_recording": "Αποθήκευση εγγραφής", - "process_tip": "Αποθήκευση του καταγεγραμμένου ίχνους ως νέο ή υπάρχον προφίλ", - "rebuild": "Ανακατασκευή φακέλων", - "rebuild_envelope": "Ανακατασκευή φακέλου", - "rebuild_tip": "Επανυπολογισμός του αναμενόμενου φακέλου ισχύος (ελάχιστο/μέγιστο εύρος) για όλα τα προφίλ από τους επισημασμένους τους κύκλους – εκτελέστε μετά από επισήμανση νέων κύκλων ή διόρθωση παλιών", - "rec_start_tip": "Έναρξη καταγραφής του ίχνους ισχύος της συσκευής – ξεκινήστε λίγο πριν τη λειτουργία του κύκλου", - "rec_stop": "Στάση", - "rec_stop_tip": "Διακοπή εγγραφής και διατήρηση του καταγεγραμμένου ίχνους για αναθεώρηση", - "record": "Ξεκινήστε την εγγραφή", - "refresh": "Φρεσκάρω", - "refresh_diag_tip": "Επαναφόρτωση στατιστικών αποθήκευσης", - "refresh_logs_tip": "Επαναφόρτωση των πιο πρόσφατων εγγραφών καταγραφής", - "refresh_settings_tip": "Επαναφόρτωση ρυθμίσεων από τον διακομιστή", - "relabel": "Επανεπισήμανση ({count})", - "remove": "Αφαιρώ", - "remove_timer": "Αφαιρέστε το χρονόμετρο", - "reset": "Επαναφορά", - "reset_ml_models_tip": "Απορρίψτε τα βελτιωμένα μοντέλα και επιστρέψτε στα ενσωματωμένα. Το WashData μπορεί να τα μάθει ξανά αργότερα.", - "reset_to_builtin": "Επαναφορά σε ενσωματωμένα μοντέλα", - "reset_to_defaults": "Επαναφορά στις προεπιλογές", - "resume_cycle": "Συνέχιση κύκλου", - "resume_cycle_tip": "Συνέχιση του παυσμένου κύκλου", - "revert_settings": "Απόρριψη αλλαγών", - "revert_settings_tip": "Επαναφέρετε τις ρυθμίσεις από πριν την τελευταία αποθήκευσή σας", - "revert_settings_tip_none": "Αποθηκεύστε πρώτα για να ενεργοποιήσετε την αναίρεση", - "revert": "Επαναφορά", - "revert_to_previous": "Επαναφορά αυτής της ρύθμισης στην προηγούμενη τιμή της", - "review": "Αξιολόγηση", - "run": "Εκτέλεση", - "run_analysis": "🔍 Εκτέλεση ανάλυσης προτάσεων", - "run_analysis_tip": "Αναλύστε τους καταγεγραμμένους κύκλους σας τώρα και ανανεώστε τις προτάσεις συντονισμού", - "run_auto_label": "Εκτελέστε Auto-Label", - "run_both": "Εκτέλεση A έναντι B", - "run_simulation": "Εκτέλεση προσομοίωσης", - "save": "Εκτός", - "save_access_control": "Αποθήκευση ελέγχου πρόσβασης", - "save_group": "Αποθήκευση ομάδας", - "save_panel_settings": "Αποθήκευση ρυθμίσεων πίνακα", - "save_phases": "Αποθήκευση φάσεων", - "save_preferences": "Αποθήκευση Προτιμήσεων", - "save_reminders": "Αποθήκευση υπενθυμίσεων", - "save_review": "Αποθήκευση κριτικής", - "save_settings": "Αποθήκευση ρυθμίσεων", - "select": "Επιλέγω", - "select_all": "Επιλογή όλων", - "select_last20": "Τελευταία 20", - "select_none": "Καθαρισμός", - "show_only": "Εμφάνιση μόνο", - "skip_setup": "Παράλειψη ρύθμισης", - "split": "Σπλιτ", - "stop": "Διακοπή", - "submit_correction": "Υποβολή Διόρθωσης", - "train_now": "Προπονηθείτε τώρα", - "trim": "Τακτοποίηση", - "trim_split": "Περικοπή / Σπλιτ", - "undo": "Αναίρεση", - "use": "Χρήση", - "wipe_all": "Σκουπίστε όλα τα δεδομένα", - "delete_selected": "Διαγραφή επιλεγμένων ({n})", - "group_suggest": "Ομάδα {n}: {members}", - "pg_apply_best": "Εφαρμογή καλύτερου", - "pg_apply_to_settings": "Αποθήκευση στις ρυθμίσεις", - "pg_apply_to_settings_tip": "Αντιγραφή των τιμών που επεξεργαστήκατε εδώ στις ενεργές ρυθμίσεις αυτής της συσκευής", - "search": "Αναζήτηση", - "import": "Εισαγωγή", - "disconnect": "Αποσύνδεση", - "connect_github": "Σύνδεση GitHub", - "save_appliance": "Αποθήκευση συσκευής", - "share_to_store": "Κοινοποίηση στο κατάστημα", - "share": "Κοινοποίηση", - "confirm_appliance": "Επιβεβαίωση αυτής της συσκευής", - "confirmed": "Επιβεβαιώθηκε", - "browse_community_setups": "Περιήγηση σε ρυθμίσεις κοινότητας", - "download_device": "Λήψη αυτής της ρύθμισης", - "share_device": "⬆ Κοινοποίηση αυτής της συσκευής", - "share_device_tip": "Κοινοποιήστε αυτή τη συσκευή και τους καταγεγραμμένους κύκλους αναφοράς της στο κοινοτικό κατάστημα, ώστε άλλοι με το ίδιο μηχάνημα να μπορούν να τα υιοθετήσουν", - "share_n": "Κοινοποίηση {n} κύκλου(ων)", - "export_selected": "Εξαγωγή (επιλογή δεδομένων)", - "export_all": "Γρήγορη εξαγωγή όλων", - "import_raw": "Για προχωρημένους: αντικατάσταση όλων από JSON", - "download_export": "Λήψη εξαγωγής", - "analyze_import": "Ανάλυση αρχείου", - "import_selected": "Εισαγωγή επιλεγμένων", - "back": "Πίσω" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "Πρέπει να είναι κάτω από το Κατώφλι Διακοπής ({stop} W)· διαφορετικά η ισχύς εξόδου αντί-τσακίσματος αγνοείται", - "stop": "Πρέπει να είναι πάνω από την Ισχύ Εξόδου Αντί-Τσακίσματος ({exit} W)" + "card": { + "min": "λεπτ.", + "entity_not_found": "Η οντότητα δεν βρέθηκε", + "running_long": "Καθυστερεί", + "remaining": "απομένουν", + "progress": "πρόοδος", + "show_time_remaining": "Εμφάνιση χρόνου που απομένει", + "show_percentage": "Εμφάνιση ποσοστού", + "layout": { + "tile": "Πλακίδιο (συμπαγές)", + "detail": "Λεπτομέρειες (πλήρες)", + "glance": "Ματιά (πολλές συσκευές)" + }, + "btn": { + "pause": "Παύση", + "resume": "Συνέχεια", + "terminate": "Τερματισμός κύκλου", + "record_start": "Έναρξη εγγραφής", + "record_stop": "Διακοπή εγγραφής", + "program": "Πρόγραμμα", + "open_panel": "Άνοιγμα WashData" + }, + "editor": { + "layout": "Διάταξη", + "entity": "Οντότητα συσκευής", + "entities": "Συσκευές", + "title": "Τίτλος", + "icon": "Εικονίδιο", + "show_state": "Εμφάνιση κατάστασης", + "show_program": "Εμφάνιση προγράμματος", + "show_progress_bar": "Εμφάνιση γραμμής προόδου", + "spin_icon": "Περιστροφή εικονιδίου κατά την εκτέλεση", + "display_mode": "Γραμμή λεπτομερειών", + "active_color": "Παράκαμψη ενεργού χρώματος", + "show_phase": "Εμφάνιση φάσης", + "show_energy": "Εμφάνιση ενέργειας και κόστους", + "show_anomaly": "Εμφάνιση προειδοποίησης υπέρβασης", + "show_sparkline": "Εμφάνιση ζωντανού γραφήματος ισχύος", + "buttons": "Κουμπιά ενεργειών", + "program_entity": "Οντότητα προγράμματος (παράκαμψη)", + "time_entity": "Οντότητα χρόνου (παράκαμψη)", + "pct_entity": "Οντότητα προόδου (παράκαμψη)", + "power_entity": "Οντότητα ισχύος (παράκαμψη)", + "tap_action": "Ενέργεια πατήματος", + "hold_action": "Ενέργεια παρατεταμένου πατήματος", + "double_tap_action": "Ενέργεια διπλού πατήματος" + } + }, + "badge": { + "artifact_tip": "Εντοπίστηκαν {n} ανωμαλίες (π.χ. η πόρτα άνοιξε στα μέσα του κύκλου) – ανοίξτε για να τις δείτε στο γράφημα", + "auto": "(αυτόματη ανίχνευση)", + "built_in_tag": "ενσωματωμένο", + "declining": "↘ φθίνουσα", + "energy_low": "Χαμηλότερη κατανάλωση ενέργειας από το συνηθισμένο", + "energy_spike": "Υψηλότερη κατανάλωση ενέργειας από το συνηθισμένο", + "fair_fit": "αποδεκτή ποιότητα", + "fair_fit_tip": "Μέτρια συνέπεια αντιστοίχισης – ορισμένοι κύκλοι που έχουν εκχωρηθεί σε αυτό το προφίλ έχουν χαμηλότερους βαθμούς εμπιστοσύνης. Επισημάνετε περισσότερους κύκλους ή εγγράψτε ξανά το προφίλ για να βελτιώσετε την ακρίβεια.", + "feedback_requested": "Ζητήθηκαν σχόλια", + "golden_cycle": "Καταγεγραμμένος κύκλος αναφοράς", + "improving": "↗ βελτίωση", + "manual": "(επιλεγμένο με μη αυτόματο τρόπο)", + "needs_review": "Χρειάζεται αναθεώρηση", + "overrun": "Λειτούργησε περισσότερο από το συνηθισμένο", + "underrun": "Ολοκληρώθηκε γρηγορότερα από το συνηθισμένο", + "poor_fit": "κακή ποιότητα", + "poor_fit_tip": "Ασυνεπές ιστορικό αντιστοίχισης – σκεφτείτε να δημιουργήσετε ξανά αυτό το προφίλ", + "restart_gap_tip": "{n} κενό επανεκκίνησης HA: το ίχνος ισχύος έχει ένα κενό", + "reviewed": "Αξιολογήθηκε", + "steady": "→ σταθερό", + "using_defaults": "Χρήση των ενσωματωμένων προεπιλογών", + "using_tuned": "Χρησιμοποιώντας συντονισμένα βάρη", + "overrun_ratio": "({x}x του αναμενόμενου)", + "underrun_ratio": "({pct}% του αναμενόμενου)", + "awaiting_tip": "Αναμονή έγκρισης από την κοινότητα", + "awaiting_n": "Αναμονή έγκρισης · {n} επιβεβαιώσεις", + "approved": "Εγκρίθηκε", + "awaiting": "Αναμονή έγκρισης", + "imported_tip": "Εισαγωγή από το κοινοτικό κατάστημα. Χρησιμοποιείται μόνο για αντιστοίχιση, δεν προσμετράται στα στατιστικά.", + "not_importable": "μη διαθέσιμο εδώ", + "exists": "υπάρχει" + }, + "btn": { + "add_device": "+ Προσθήκη συσκευής", + "add_device_tip": "Προσθέστε μια άλλη συσκευή WashData", + "add_maintenance": "Προσθήκη συμβάντος συντήρησης", + "add_phase": "+ Προσθήκη φάσης", + "add_timer": "+ Προσθήκη χρονοδιακόπτη", + "apply_all": "Εφαρμόστε όλα", + "apply_label": "Εφαρμογή ετικέτας", + "apply_set_b": "Εφαρμογή συνόλου B", + "apply_split": "Εφαρμογή διαχωρισμού", + "apply_trim": "Εφαρμογή περικοπής", + "auto_detect_split": "Αυτόματος εντοπισμός", + "auto_label_cycles": "Αυτόματη επισήμανση κύκλων", + "auto_label_cycles_tip": "Αυτόματη εκχώρηση ονομάτων προφίλ σε κύκλους χωρίς ετικέτα, των οποίων η εμπιστοσύνη αντιστοίχισης ξεπερνά το κατώφλι", + "cancel": "Ακύρωση", + "clear_debug": "Εκκαθάριση δεδομένων εντοπισμού σφαλμάτων", + "clear_splits": "Καθαρισμός", + "close": "Κλείσιμο", + "compare": "Σύγκριση", + "confirm": "Επιβεβαίωση", + "convert_to_automation": "Μετατροπή σε αυτοματισμό", + "correct": "Διόρθωση…", + "create": "Δημιουργία", + "create_from_cluster": "Δημιουργία προφίλ από {count} κύκλους", + "create_profile": "+ Δημιουργία προφίλ", + "delete": "Διαγραφή", + "delete_group": "Διαγραφή ομάδας", + "delete_group_tip": "Διαγραφή μόνο αυτής της ομάδας - τα προφίλ μελών διατηρούνται", + "delete_profile": "Διαγραφή προφίλ", + "discard": "Απόρριψη", + "discard_tip": "Απόρριψη του καταγεγραμμένου ίχνους χωρίς αποθήκευση", + "dismiss": "Παράβλεψη", + "done": "Τέλος", + "edit": "Επεξεργασία", + "export": "Εξαγωγή", + "export_json": "Εξαγωγή σε JSON", + "force_stop": "Αναγκαστική διακοπή", + "force_stop_tip": "Άμεσος τερματισμός του τρέχοντος κύκλου και χαρακτηρισμός του ως αναγκαστικά τερματισμένου", + "from_template": "Από το πρότυπο ▾", + "ignore": "Αγνόηση", + "import_json": "Εισαγωγή από JSON", + "import_overwrite": "Εισαγωγή (αντικαθιστά δεδομένα)", + "inspect": "Επιθεώρηση", + "label": "Επισήμανση", + "load": "Φόρτωση", + "load_more": "Φόρτωση περισσότερων", + "manage": "Διαχείριση", + "merge": "Συγχώνευση", + "new_automation": "+ Νέος Αυτοματισμός", + "new_group": "+ Νέα ομάδα", + "new_group_tip": "Ομαδοποιήστε σχεδόν πανομοιότυπα προφίλ (ίδιο σχήμα/διάρκεια, διαφορετική θερμοκρασία ή στύψιμο) ώστε η αντιστοίχιση να επιλέγει αξιόπιστα μεταξύ τους", + "new_phase": "+ Νέα Φάση", + "new_profile": "+ Νέο προφίλ", + "new_profile_tip": "Δημιουργία νέου προφίλ προγράμματος από έναν υπάρχοντα επισημασμένο κύκλο ή εγγραφή", + "on_cycle_finished": "Ο κύκλος ολοκληρώθηκε", + "on_cycle_started": "Ο κύκλος ξεκίνησε", + "pause_cycle": "Παύση", + "pause_cycle_tip": "Παύση του εν λειτουργία κύκλου – η συσκευή θα συνεχίσει από εκεί που σταμάτησε", + "pg_apply_device": "Εφαρμογή στη συσκευή", + "pg_autofill": "Αυτόματη συμπλήρωση", + "pg_load_calibrated": "Φόρτωση βαθμονομημένων (ML) ({n})", + "pg_load_calibrated_tip": "Φορτώνει τις ρυθμίσεις βαθμονόμησης ML ως παρακαμπτήριες ρυθμίσεις στον Χώρο δοκιμών", + "pg_load_live": "Φόρτωση ενεργών ρυθμίσεων", + "pg_load_live_tip": "Επαναφόρτωση των τρεχουσών ρυθμίσεων της ενσωμάτωσης και απόρριψη κάθε αλλαγής στον Χώρο δοκιμών", + "pg_load_suggested": "Φόρτωση προτάσεων ({n})", + "pg_load_suggested_tip": "Φορτώνει τις τρέχουσες προτάσεις του αυτόματου βελτιστοποιητή ως παρακαμπτήριες ρυθμίσεις στον Χώρο δοκιμών", + "pg_preset_delete": "Διαγραφή προρύθμισης", + "pg_preset_load": "Φόρτωση προρύθμισης", + "pg_preset_load_tip": "Αντικατάσταση των τιμών του Χώρου δοκιμών με αυτήν την προρύθμιση (οι ενεργές ρυθμίσεις δεν αλλάζουν)", + "pg_preset_save": "Αποθήκευση ως προρύθμιση", + "pg_preset_save_tip": "Αποθήκευση όλων των παρακάτω τιμών ως επώνυμη προρύθμιση για αυτήν τη συσκευή", + "pg_publish_all": "Εφαρμογή στην ενσωμάτωση ({n})", + "pg_publish_one": "Εφαρμογή {label} στην ενσωμάτωση", + "play": "Αναπαραγωγή", + "process": "Επεξεργασία", + "process_history": "Επεξεργασία τώρα", + "process_recording": "Αποθήκευση εγγραφής", + "process_tip": "Αποθήκευση του καταγεγραμμένου ίχνους ως νέο ή υπάρχον προφίλ", + "rebuild": "Ανακατασκευή περιβαλλουσών", + "rebuild_envelope": "Ανακατασκευή περιβάλλουσας", + "rebuild_tip": "Επανυπολογισμός της αναμενόμενης περιβάλλουσας ισχύος (ελάχιστο/μέγιστο εύρος) για όλα τα προφίλ από τους επισημασμένους τους κύκλους – εκτελέστε μετά από επισήμανση νέων κύκλων ή διόρθωση παλιών", + "rec_start_tip": "Έναρξη καταγραφής του ίχνους ισχύος της συσκευής – ξεκινήστε λίγο πριν τη λειτουργία του κύκλου", + "rec_stop": "Διακοπή", + "rec_stop_tip": "Διακοπή εγγραφής και διατήρηση του καταγεγραμμένου ίχνους για αναθεώρηση", + "record": "Ξεκινήστε την εγγραφή", + "refresh": "Ανανέωση", + "refresh_diag_tip": "Επαναφόρτωση στατιστικών αποθήκευσης", + "refresh_logs_tip": "Επαναφόρτωση των πιο πρόσφατων εγγραφών καταγραφής", + "refresh_settings_tip": "Επαναφόρτωση ρυθμίσεων από τον διακομιστή", + "relabel": "Επανεπισήμανση ({count})", + "remove": "Αφαίρεση", + "remove_timer": "Αφαιρέστε το χρονόμετρο", + "reset": "Επαναφορά", + "reset_ml_models_tip": "Απορρίψτε τα βελτιωμένα μοντέλα και επιστρέψτε στα ενσωματωμένα. Το WashData μπορεί να τα μάθει ξανά αργότερα.", + "reset_to_builtin": "Επαναφορά σε ενσωματωμένα μοντέλα", + "reset_to_defaults": "Επαναφορά στις προεπιλογές", + "resume_cycle": "Συνέχιση κύκλου", + "resume_cycle_tip": "Συνέχιση του παυσμένου κύκλου", + "revert_settings": "Απόρριψη αλλαγών", + "revert_settings_tip": "Επαναφέρετε τις ρυθμίσεις από πριν την τελευταία αποθήκευσή σας", + "revert_settings_tip_none": "Αποθηκεύστε πρώτα για να ενεργοποιήσετε την αναίρεση", + "revert": "Επαναφορά", + "revert_to_previous": "Επαναφορά αυτής της ρύθμισης στην προηγούμενη τιμή της", + "review": "Αξιολόγηση", + "run": "Εκτέλεση", + "run_analysis": "🔍 Εκτέλεση ανάλυσης προτάσεων", + "run_analysis_tip": "Αναλύστε τους καταγεγραμμένους κύκλους σας τώρα και ανανεώστε τις προτάσεις συντονισμού", + "run_auto_label": "Εκτέλεση αυτόματης επισήμανσης", + "run_both": "Εκτέλεση A έναντι B", + "run_simulation": "Εκτέλεση προσομοίωσης", + "save": "Αποθήκευση", + "save_access_control": "Αποθήκευση ελέγχου πρόσβασης", + "save_group": "Αποθήκευση ομάδας", + "save_panel_settings": "Αποθήκευση ρυθμίσεων πίνακα", + "save_phases": "Αποθήκευση φάσεων", + "save_preferences": "Αποθήκευση Προτιμήσεων", + "save_reminders": "Αποθήκευση υπενθυμίσεων", + "save_review": "Αποθήκευση αξιολόγησης", + "save_settings": "Αποθήκευση ρυθμίσεων", + "select": "Επιλογή", + "select_all": "Επιλογή όλων", + "select_last20": "Τελευταία 20", + "select_none": "Καθαρισμός", + "show_only": "Εμφάνιση μόνο", + "skip_setup": "Παράλειψη ρύθμισης", + "split": "Διαχωρισμός", + "stop": "Διακοπή", + "submit_correction": "Υποβολή Διόρθωσης", + "train_now": "Εκπαίδευση τώρα", + "trim": "Περικοπή", + "trim_split": "Περικοπή / Διαχωρισμός", + "undo": "Αναίρεση", + "use": "Χρήση", + "wipe_all": "Διαγραφή όλων των δεδομένων", + "delete_selected": "Διαγραφή επιλεγμένων ({n})", + "group_suggest": "Ομάδα {n}: {members}", + "pg_apply_best": "Εφαρμογή καλύτερου", + "pg_apply_to_settings": "Αποθήκευση στις ρυθμίσεις", + "pg_apply_to_settings_tip": "Αντιγραφή των τιμών που επεξεργαστήκατε εδώ στις ενεργές ρυθμίσεις αυτής της συσκευής", + "search": "Αναζήτηση", + "import": "Εισαγωγή", + "disconnect": "Αποσύνδεση", + "connect_github": "Σύνδεση GitHub", + "save_appliance": "Αποθήκευση συσκευής", + "share_to_store": "Κοινοποίηση στο κατάστημα", + "share": "Κοινοποίηση", + "confirm_appliance": "Επιβεβαίωση αυτής της συσκευής", + "confirmed": "Επιβεβαιώθηκε", + "browse_community_setups": "Περιήγηση σε ρυθμίσεις κοινότητας", + "download_device": "Λήψη αυτής της ρύθμισης", + "share_device": "⬆ Κοινοποίηση αυτής της συσκευής", + "share_device_tip": "Κοινοποιήστε αυτή τη συσκευή και τους καταγεγραμμένους κύκλους αναφοράς της στο κοινοτικό κατάστημα, ώστε άλλοι με το ίδιο μηχάνημα να μπορούν να τα υιοθετήσουν", + "share_n": "Κοινοποίηση {n} κύκλου(ων)", + "export_selected": "Εξαγωγή (επιλογή δεδομένων)", + "export_all": "Γρήγορη εξαγωγή όλων", + "import_raw": "Για προχωρημένους: αντικατάσταση όλων από JSON", + "download_export": "Λήψη εξαγωγής", + "analyze_import": "Ανάλυση αρχείου", + "import_selected": "Εισαγωγή επιλεγμένων", + "back": "Πίσω", + "mute_suggestion": "Διακοπή πρότασης αυτής της ρύθμισης", + "reset_muted": "Επαναφορά αποσιωπημένων" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "Πρέπει να είναι κάτω από το Κατώφλι Διακοπής ({stop} W)· διαφορετικά η ισχύς εξόδου αντί-τσακίσματος αγνοείται", + "stop": "Πρέπει να είναι πάνω από την Ισχύ Εξόδου Αντί-Τσακίσματος ({exit} W)" + }, + "anti_wrinkle_max": { + "max": "Πρέπει να είναι πάνω από το Κατώφλι Εκκίνησης ({start} W)· διαφορετικά το όριο διάρκειας αντί-τσακίσματος παρακάμπτεται", + "start": "Πρέπει να είναι κάτω από τη Μέγιστη Ισχύ Αντί-Τσακίσματος ({max} W)" + }, + "attn_sub": "Διορθώστε τις συγκρούσεις πριν αποθηκεύσετε", + "attn_title": "{n} σύγκρουση{s} ρυθμίσεων", + "settings_banner": "{n} σύγκρουση{s} ρυθμίσεων – ελέγξτε τα επισημασμένα τμήματα και διορθώστε πριν αποθηκεύσετε.", + "settings_banner_btn": "Μετάβαση στο πρώτο", + "confidence": { + "auto": "Πρέπει να είναι μεγαλύτερο ή ίσο με το Κατώφλι Αντιστοίχισης ({match})", + "learning": "Πρέπει να είναι μικρότερο ή ίσο με το Κατώφλι Αντιστοίχισης ({match})", + "match_for_auto": "Πρέπει να είναι μικρότερο ή ίσο με την Εμπιστοσύνη Αυτόματης Ετικέτας ({alc})", + "match_for_learning": "Πρέπει να είναι μεγαλύτερο ή ίσο με την Εμπιστοσύνη Μάθησης ({lc})" + }, + "duration_ratio": { + "max": "Πρέπει να είναι μεγαλύτερο από τον Ελάχιστο Λόγο Διάρκειας ({min})", + "min": "Πρέπει να είναι μικρότερο από τον Μέγιστο Λόγο Διάρκειας ({max})" + }, + "hysteresis": { + "start": "Πρέπει να είναι πάνω από το Κατώφλι Διακοπής ({stop} W)", + "stop": "Πρέπει να είναι κάτω από το Κατώφλι Εκκίνησης ({start} W)" + }, + "min_power": { + "min_power": "Πρέπει να είναι μικρότερο ή ίσο με το Κατώφλι Διακοπής ({stop} W)", + "stop": "Πρέπει να είναι μεγαλύτερο ή ίσο με την Ελάχιστη Ισχύ ({min} W)" + }, + "no_update_timeout": { + "timeout": "Πρέπει να είναι μεγαλύτερο από το Διάστημα Watchdog ({wi} s)", + "watchdog": "Πρέπει να είναι μικρότερο από το Χρονικό Όριο Χωρίς Ενημέρωση ({to} s)" + }, + "off_delay": { + "gap": "Το Ελάχιστο Κενό Διακοπής πρέπει να είναι τουλάχιστον η Καθυστέρηση Διακοπής ({delay} s)", + "off_delay": "Η Καθυστέρηση Διακοπής ({off_delay} s) υπερβαίνει το Ελάχιστο Κενό Διακοπής ({gap} s)· διαδοχικοί κύκλοι ενδέχεται να συγχωνευθούν" + }, + "power_off": { + "stop": "Πρέπει να είναι πάνω από το Κατώφλι Απενεργοποίησης ({pot} W)", + "threshold": "Πρέπει να είναι κάτω από το Κατώφλι Διακοπής ({stop} W) για να τεθεί σε ισχύ" + }, + "pump_stuck": { + "duration": "Πρέπει να είναι μικρότερο από το Χρονικό Όριο Χωρίς Ενημέρωση ({to} s) ώστε ο συναγερμός αγκίστρωσης να ενεργοποιείται πριν το watchdog τερματίσει τον κύκλο", + "timeout": "Πρέπει να υπερβαίνει τη Διάρκεια Αγκίστρωσης Αντλίας ({ps} s) ώστε ο συναγερμός να ενεργοποιείται πριν τον αναγκαστικό τερματισμό του κύκλου" + }, + "start_dur": { + "sampling": "Το Διάστημα Δειγματοληψίας υπερβαίνει τη Διάρκεια Εκκίνησης ({sdt} s)· ακίδες μονού δείγματος μπορούν να ανοίξουν κύκλο", + "threshold": "Πρέπει να είναι τουλάχιστον ένα Διάστημα Δειγματοληψίας ({si} s) για να αποτραπούν ψευδείς εκκινήσεις μονού δείγματος" + }, + "unmatch": { + "match": "Πρέπει να είναι πάνω από το Κατώφλι Αποαντιστοίχισης ({un})", + "unmatch": "Πρέπει να είναι κάτω από το Κατώφλι Αντιστοίχισης ({match})· διαφορετικά μια επιβεβαιωμένη αντιστοίχιση ακυρώνεται αμέσως" + }, + "cascade_toast": "Προσαρμόστηκαν επίσης {n} ρύθμιση{s} για συνέπεια.", + "suggestion_resolves": "Εφαρμόστε την εκκρεμή πρόταση ({val}) παρακάτω για να διορθώσετε αυτό", + "use_fix": "Χρήση {val}", + "watchdog": { + "interval": "Πρέπει να είναι τουλάχιστον 2× το Διάστημα Δειγματοληψίας ({si} s)", + "sampling": "Το Διάστημα Δειγματοληψίας πρέπει να είναι το πολύ το μισό του Διαστήματος Watchdog ({wi} s)" + } }, - "anti_wrinkle_max": { - "max": "Πρέπει να είναι πάνω από το Κατώφλι Εκκίνησης ({start} W)· διαφορετικά το όριο διάρκειας αντί-τσακίσματος παρακάμπτεται", - "start": "Πρέπει να είναι κάτω από τη Μέγιστη Ισχύ Αντί-Τσακίσματος ({max} W)" - }, - "attn_sub": "Διορθώστε τις συγκρούσεις πριν αποθηκεύσετε", - "attn_title": "{n} σύγκρουση{s} ρυθμίσεων", - "settings_banner": "{n} σύγκρουση{s} ρυθμίσεων – ελέγξτε τα επισημασμένα τμήματα και διορθώστε πριν αποθηκεύσετε.", - "settings_banner_btn": "Μετάβαση στο πρώτο", - "confidence": { - "auto": "Πρέπει να είναι μεγαλύτερο ή ίσο με το Κατώφλι Αντιστοίχισης ({match})", - "learning": "Πρέπει να είναι μικρότερο ή ίσο με το Κατώφλι Αντιστοίχισης ({match})", - "match_for_auto": "Πρέπει να είναι μικρότερο ή ίσο με την Εμπιστοσύνη Αυτόματης Ετικέτας ({alc})", - "match_for_learning": "Πρέπει να είναι μεγαλύτερο ή ίσο με την Εμπιστοσύνη Μάθησης ({lc})" - }, - "duration_ratio": { - "max": "Πρέπει να είναι μεγαλύτερο από τον Ελάχιστο Λόγο Διάρκειας ({min})", - "min": "Πρέπει να είναι μικρότερο από τον Μέγιστο Λόγο Διάρκειας ({max})" - }, - "hysteresis": { - "start": "Πρέπει να είναι πάνω από το Κατώφλι Διακοπής ({stop} W)", - "stop": "Πρέπει να είναι κάτω από το Κατώφλι Εκκίνησης ({start} W)" - }, - "min_power": { - "min_power": "Πρέπει να είναι μικρότερο ή ίσο με το Κατώφλι Διακοπής ({stop} W)", - "stop": "Πρέπει να είναι μεγαλύτερο ή ίσο με την Ελάχιστη Ισχύ ({min} W)" - }, - "no_update_timeout": { - "timeout": "Πρέπει να είναι μεγαλύτερο από το Διάστημα Watchdog ({wi} s)", - "watchdog": "Πρέπει να είναι μικρότερο από το Χρονικό Όριο Χωρίς Ενημέρωση ({to} s)" - }, - "off_delay": { - "gap": "Το Ελάχιστο Κενό Διακοπής πρέπει να είναι τουλάχιστον η Καθυστέρηση Διακοπής ({delay} s)", - "off_delay": "Η Καθυστέρηση Διακοπής ({off_delay} s) υπερβαίνει το Ελάχιστο Κενό Διακοπής ({gap} s)· διαδοχικοί κύκλοι ενδέχεται να συγχωνευθούν" - }, - "power_off": { - "stop": "Πρέπει να είναι πάνω από το Κατώφλι Απενεργοποίησης ({pot} W)", - "threshold": "Πρέπει να είναι κάτω από το Κατώφλι Διακοπής ({stop} W) για να τεθεί σε ισχύ" - }, - "pump_stuck": { - "duration": "Πρέπει να είναι μικρότερο από το Χρονικό Όριο Χωρίς Ενημέρωση ({to} s) ώστε ο συναγερμός αγκίστρωσης να ενεργοποιείται πριν το watchdog τερματίσει τον κύκλο", - "timeout": "Πρέπει να υπερβαίνει τη Διάρκεια Αγκίστρωσης Αντλίας ({ps} s) ώστε ο συναγερμός να ενεργοποιείται πριν τον αναγκαστικό τερματισμό του κύκλου" - }, - "start_dur": { - "sampling": "Το Διάστημα Δειγματοληψίας υπερβαίνει τη Διάρκεια Εκκίνησης ({sdt} s)· ακίδες μονού δείγματος μπορούν να ανοίξουν κύκλο", - "threshold": "Πρέπει να είναι τουλάχιστον ένα Διάστημα Δειγματοληψίας ({si} s) για να αποτραπούν ψευδείς εκκινήσεις μονού δείγματος" - }, - "unmatch": { - "match": "Πρέπει να είναι πάνω από το Κατώφλι Αποαντιστοίχισης ({un})", - "unmatch": "Πρέπει να είναι κάτω από το Κατώφλι Αντιστοίχισης ({match})· διαφορετικά μια επιβεβαιωμένη αντιστοίχιση ακυρώνεται αμέσως" - }, - "cascade_toast": "Προσαρμόστηκαν επίσης {n} ρύθμιση{s} για συνέπεια.", - "suggestion_resolves": "Εφαρμόστε την εκκρεμή πρόταση ({val}) παρακάτω για να διορθώσετε αυτό", - "use_fix": "Χρήση {val}", - "watchdog": { - "interval": "Πρέπει να είναι τουλάχιστον 2× το Διάστημα Δειγματοληψίας ({si} s)", - "sampling": "Το Διάστημα Δειγματοληψίας πρέπει να είναι το πολύ το μισό του Διαστήματος Watchdog ({wi} s)" - } - }, - "hdr": { - "ab_comparison": "Σύγκριση ρυθμίσεων A/B", - "access_control": "Έλεγχος πρόσβασης", - "add_maintenance": "Προσθήκη συμβάντος συντήρησης", - "automation_delete": "Διαγράψτε αυτόν τον αυτοματισμό", - "automation_needs_review": "Αυτός ο κύκλος χρειάζεται αναθεώρηση", - "automation_open": "Ανοίξτε στο πρόγραμμα επεξεργασίας αυτοματισμού", - "automation_review_this_cycle": "Ελέγξτε αυτόν τον κύκλο", - "automations": "Αυτοματισμοί", - "clear_debug": "Εκκαθάριση ιχνών εντοπισμού σφαλμάτων", - "cycle_simulator": "Προσομοιωτής κύκλων", - "diagnostics_pref": "Διαγνωστικά", - "display": "Επίδειξη", - "dtw_inspector": "Επιθεωρητής DTW", - "export_import": "Εξαγωγή / Εισαγωγή", - "getting_started": "Ξεκινώντας", - "live_power": "Ζωντανή δύναμη", - "logs": "Αρχεία καταγραφής", - "logs_diagnostics": "Διαγνωστικά", - "maintenance": "Ενέργειες Συντήρησης", - "maintenance_log": "Αρχείο συντήρησης", - "maintenance_reminders": "Υπενθυμίσεις σέρβις", - "manual_recording": "Χειροκίνητη εγγραφή", - "manual_recording_tip": "Εκτελέστε έναν κύκλο σκόπιμα ενώ το WashData καταγράφει το ίχνος ισχύος. Ξεκινήστε αμέσως πριν ανοίξει η συσκευή, σταματήστε όταν τελειώσει, και Επεξεργαστείτε για να το αποθηκεύσετε ως κατονομαζόμενο προφίλ.", - "ml_learned": "Τι έμαθε η WashData", - "ml_matching_tuning": "Βελτιστοποίηση αντιστοίχισης προγράμματος", - "ml_settings_card": "Ρυθμίσεις", - "ml_smart_learning": "Έξυπνη μάθηση", - "my_preferences": "Οι Προτιμήσεις μου", - "no_automations": "Δεν αναφέρονται ακόμη αυτοματισμοί σε αυτήν τη συσκευή.", - "panel_settings": "Ρυθμίσεις πίνακα", - "param_sweep": "Σάρωση παραμέτρων", - "phase_catalog": "Κατάλογος Φάσης", - "playground": "Χώρος δοκιμών", - "process_history": "Ιστορικό Διαδικασιών", - "settings_history": "Ιστορικό ρυθμίσεων", - "status": "Κατάσταση", - "status_graph": "Γράφημα κατάστασης", - "storage_stats": "Στατιστικά αποθήκευσης", - "test_history": "Δοκιμή στο ιστορικό", - "toggle_sidebar": "Εναλλαγή πλευρικής γραμμής Βοηθού σπιτιού", - "tools_and_data": "Εργαλεία & Δεδομένα", - "wipe_history": "Σκουπίστε το ιστορικό", - "recommendations": "Συστάσεις ({n})", - "pg_detection_params": "Ρυθμίσεις ανίχνευσης", - "pg_timeline": "Χρονολόγιο συμβάντων", - "pg_outcome": "Αποτέλεσμα προσομοίωσης", - "pg_across_cycles": "Σε όλους τους κύκλους σας", - "community_store": "Κοινοτικό Κατάστημα", - "online_account": "Κοινοτικό Κατάστημα & διαδικτυακές λειτουργίες" - }, - "health": { - "fair": "Αποδεκτή ποιότητα αντιστοίχισης", - "good": "✓ Καλή ποιότητα αντιστοίχισης", - "poor": "⚠ Κακή ποιότητα αντιστοίχισης" - }, - "lbl": { - "actions": "Δράσεις", - "activity": "Δραστηριότητα", - "administrators": "Διαχειριστές", - "aria_compare_chart": "Γράφημα σύγκρισης κύκλων", - "aria_cycle_chart": "Καμπύλη ισχύος κύκλου", - "aria_envelope_chart": "Γράφημα φακέλου ισχύος προφίλ", - "aria_phase_chart": "Γράφημα επεξεργασίας φάσεων", - "aria_playground_chart": "Καμπύλη ισχύος κύκλου με συρόμενα όρια ανίχνευσης", - "aria_power_chart": "Γράφημα κατανάλωσης ισχύος", - "aria_spaghetti_chart": "Επικαλυπτόμενες καμπύλες ισχύος κύκλων", - "aria_sweep_chart": "Γράφημα αποτελεσμάτων σάρωσης παραμέτρων", - "artifact_anomaly": "Ανωμαλία", - "artifact_high_power": "Υψηλή ισχύς", - "artifact_interruption": "Διακοπή", - "artifact_low_power": "Χαμηλή ισχύς", - "auto_detect": "Αυτόματος εντοπισμός", - "auto_fine_tune_off": "αυτόματη τελική απενεργοποίηση", - "auto_fine_tune_on": "αυτόματη βελτιστοποίηση ενεργή (περίπου {hour}:00)", - "avg_cost": "Μέσο κόστος", - "change": "Αλλαγή", - "clock_time": "Ώρα ρολογιού", - "cohesion_good": "συνοχή {pct}%", - "cohesion_low": "⚠ χαμηλή συνοχή {pct}%", - "compare_profiles": "Σύγκριση με προφίλ", - "concurrency": "Ταυτοχρονισμός", - "confidence": "Εμπιστοσύνη", - "confidence_threshold": "Όριο εμπιστοσύνης", - "correct_duration": "Σωστή διάρκεια (ελάχιστη, προαιρετική)", - "correct_profile": "Σωστό Προφίλ", - "correlation": "Συσχέτιση", - "cost": "Κόστος", - "create_new_profile": "+ Δημιουργία νέου προφίλ…", - "current_phase": "Τρέχουσα φάση", - "curves": "Καμπύλες", - "cycle": "Κύκλος", - "cycle_date_display": "Εμφάνιση ημερομηνίας κύκλου", - "cycle_health": "Υγεία του κύκλου", - "cycle_index": "δείκτης κύκλου →", - "cycles": "Κύκλοι", - "cycles_count": "Κύκλοι", - "cycles_lc": "κύκλοι", - "dashed": "διακεκομμένη", - "date": "Ημερομηνία", - "debug_traces": "Ίχνη εντοπισμού σφαλμάτων", - "default": "Αθέτηση", - "default_access_level": "Προεπιλεγμένο επίπεδο για χρήστες που δεν αναφέρονται παρακάτω", - "default_other": "Προεπιλογή (άλλες συσκευές)", - "default_tab": "Προεπιλεγμένη καρτέλα κατά το άνοιγμα του πίνακα", - "delta": "Δ", - "description": "Περιγραφή", - "dtw_blend_w": "Βάρος ανάμειξης", - "dtw_blended": "Αναμεμειγμένη βαθμολογία", - "dtw_ddtw": "Βαθμολογία DDTW", - "dtw_l1": "Βαθμολογία L1", - "dtw_matched_profile": "(αντιστοιχισμένο προφίλ του κύκλου)", - "duration": "Διάρκεια", - "duration_agreement": "Συμφωνία διάρκειας", - "emphasis": "Εμφαση", - "enable_access_control": "Ενεργοποίηση ελέγχου πρόσβασης ανά χρήστη", - "energy": "Ενέργεια", - "energy_agreement": "Συμφωνία ενέργειας", - "event_timeline": "Χρονολόγιο συμβάντων", - "event_type": "Τύπος συμβάντος", - "expected": "Αναμενόμενο", - "expected_duration": "Αναμενόμενη διάρκεια (λεπτά)", - "file_kb": "Αρχείο (kB)", - "final_score": "Τελική βαθμολογία", - "from": "Από", - "gap_s": "Κενό (α)", - "group_name": "Όνομα ομάδας", - "head_trim": "Περικοπή κεφαλής", - "health": "Υγεία", - "hide_tabs": "Απόκρυψη καρτελών για μη διαχειριστές", - "in_use": "Σε χρήση", - "json_data": "Δεδομένα JSON", - "label": "Αντιστοιχισμένο προφίλ", - "last": "Τελευταία", - "last_checked": "Τελευταίος έλεγχος:", - "load_from_file": "Φόρτωση από αρχείο", - "mae_score": "Βαθμολογία MAE", - "manual_duration": "Μη αυτόματη διάρκεια (ελάχιστη, προαιρετική)", - "match": "Αντιστοίχιση", - "members": "Μέλη", - "metric": "Μετρική", - "mode_existing_profile": "Προσθήκη στο υπάρχον προφίλ", - "mode_new_profile": "Δημιουργία Νέου Προφίλ", - "models_fine_tuned": "({count} μοντέλο{plural} βελτιστοποιημένο)", - "n_classic_suggestions": "{n} κλασικά", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} επιλεγμένα", - "n_tuning_suggestions": "{n} πρόταση συντονισμού", - "na": "n/a", - "new_profile_name": "Νέο όνομα προφίλ", - "notes": "Σημειώσεις", - "of": "από", - "outcome": "Έκβαση", - "panel_default_tab": "Προεπιλεγμένη καρτέλα", - "panel_language": "Γλώσσα πίνακα", - "per_cycle_short": "κύκλος", - "pg_anti_wrinkle": "Κατά τσακίσματος", - "pg_autofill_tip": "Αυτόματη συμπλήρωση εύρους από την τρέχουσα τιμή ({lo}–{hi})", - "pg_best_value": "Καλύτερη τιμή που βρέθηκε", - "pg_current_value": "Τρέχουσα τιμή:", - "pg_drag_hint": "Σύρετε τη γραμμή στο γράφημα", - "pg_dtw": "DTW", - "pg_ev_ending": "Λήγει", - "pg_ev_running": "Εκτελείται", - "pg_group_advanced": "Ακραίες περιπτώσεις", - "pg_group_detection": "Ενεργοποιητές ανίχνευσης", - "pg_group_timing": "Κανόνες χρονισμού", - "pg_idle": "Αεργος", - "pg_last_run": "Τελευταία εκτέλεση: {date}", - "pg_match_score": "Βαθμολογία αντιστοίχισης", - "pg_pct_of": "{p}% των {total}", - "pg_poor_match": "Κακή αντιστοίχιση", - "pg_strong_match": "Ισχυρή αντιστοίχιση", - "pg_tile_ambiguous": "Ασαφείς", - "pg_tile_ambiguous_tip": "Κύκλοι με σχεδόν ισοπαλία μεταξύ δύο προγραμμάτων", - "pg_tile_detected": "Εντοπισμένοι", - "pg_tile_detected_tip": "Κύκλοι όπου η ισχύς ξεπέρασε το κατώφλι εκκίνησης αρκετά ώστε να καταγραφεί ως σε λειτουργία", - "pg_tile_matched": "Αντιστοιχισμένοι", - "pg_tile_matched_tip": "Κύκλοι που αποδόθηκαν σωστά σε γνωστό πρόγραμμα", - "pg_time_left": "Χρόνος που απομένει", - "pg_weak_match": "Ασθενής αντιστοίχιση", - "phase_name": "Ονομα", - "phase_timeline": "Χρονολόγιο φάσεων", - "power": "Ισχύς", - "profile": "Προφίλ", - "profile_index": "δείκτης προφίλ →", - "profile_name": "Όνομα προφίλ", - "program": "Πρόγραμμα", - "program_tip": "Παρακάμψτε ποιο προφίλ αντιστοιχίζεται στον τρέχοντα κύκλο. Η αυτόματη ανίχνευση επιτρέπει στην ενσωμάτωση να επιλέξει αυτόματα την καλύτερη αντιστοίχιση. Καρφιτσώστε ένα συγκεκριμένο πρόγραμμα για αναγκαστική αντιστοίχιση όταν η αυτόματη ανίχνευση είναι λανθασμένη ή γνωρίζετε τι εκτελείται.", - "progress": "Πρόοδος", - "raw_socket": "Ακατέργαστο σήμα πρίζας", - "read_only": "Μόνο για ανάγνωση", - "ref_cycle": "Κύκλος αναφοράς (προαιρετικό)", - "refresh_interval": "Διαστήματα ανανέωσης", - "remaining": "Παραμένων", - "reminder_every": "Υπενθύμιση κάθε (κύκλους)", - "remove_label": "- Αφαιρέστε την ετικέτα -", - "rename_profile": "Μετονομασία προφίλ", - "replay_duration": "Αναπαραγωγή", - "resulting_profile": "Προκύπτον προφίλ", - "save_mode": "Λειτουργία αποθήκευσης", - "score": "Βαθμολογία", - "score_breakdown": "Ανάλυση βαθμολογίας", - "seconds_from_start": "Δευτερόλεπτα από την αρχή", - "select_profile": "Επιλέξτε Προφίλ", - "setting": "Ρύθμιση", - "settings_a": "Ρυθμίσεις A (τρέχουσες)", - "settings_a_short": "A", - "settings_advanced": "Για προχωρημένους", - "settings_b": "Ρυθμίσεις B (δοκιμή)", - "settings_b_short": "B", - "settings_basic": "Βασικά", - "settings_detail_level": "Επίπεδο λεπτομέρειας ρυθμίσεων", - "settings_overrides": "Παρακάμψεις ρυθμίσεων", - "show_debug": "Εμφάνιση της κάρτας εντοπισμού σφαλμάτων ζωντανού αγώνα στη σελίδα Κατάσταση (εμπιστοσύνη, ασάφεια, κορυφαίοι υποψήφιοι)", - "show_expected": "Εμφάνιση αναμενόμενης επικάλυψης καμπύλης (αντιστοιχισμένο προφίλ, πορτοκαλί)", - "show_raw": "Εμφάνιση εναλλακτή ακατέργαστης πρίζας στο γράφημα ζωντανής ισχύος", - "sparkline": "Τάση διάρκειας πρόσφατων κύκλων", - "stage2": "Στάδιο 2 – βασική ομοιότητα", - "stage3": "Στάδιο 3 – DTW", - "stage4": "Στάδιο 4 – συμφωνία", - "status": "Κατάσταση", - "tail_trim": "Περικοπή ουράς", - "timer_auto_pause": "Αυτόματη παύση", - "timer_min": "ελάχ", - "timer_msg_placeholder": "Μήνυμα (προαιρετικό, {device}/{program}/{minutes})", - "to": "Έως", - "ungrouped": "Μη ομαδοποιημένος", - "unlabelled": "Χωρίς ετικέτα", - "unlabelled_paren": "(χωρίς ετικέτα)", - "warp_path": "Διαδρομή warp", - "input": "Είσοδος:", - "start": "Έναρξη", - "end": "Τέλος", - "unit_s": "(s)", - "reviewed_on": "αξιολογήθηκε {date}", - "unknown": "Άγνωστο", - "quality": "Ποιότητα", - "tags": "Ετικέτες", - "at": "στις", - "pct_match_confidence": "{pct}% εμπιστοσύνη αντιστοίχισης", - "ha_restarted": "Επανεκκίνηση HA", - "from_start": "Από την αρχή", - "to_end": "Έως το τέλος", - "click_to_select": "κάντε κλικ για επιλογή", - "envelope": "Φάκελος", - "zoom_hint": "κύλιση για ζουμ · διπλό κλικ για επαναφορά", - "loading_paren": "(φόρτωση…)", - "time_remaining": "~{v} απομένουν", - "no_duration": "χωρίς διάρκεια", - "duration_avg": "~{v}m μ.ό.", - "name_placeholder": "(όνομα)", - "n_shown": ", {n} εμφανίζονται", - "cycles_title": "Κύκλοι ({n})", - "pg_detecting": "Εντοπισμός", - "pg_best_marker": "Βέλτιστο: {v}", - "pg_time_left_model": "Χρόνος που απομένει (μοντέλο)", - "pg_time_left_model_tip": "Εκτιμώμενος από το μοντέλο χρόνος που απομένει (εκτιμητής φάσης + μείγμα ML), όχι στατική αντίστροφη μέτρηση", - "phase": "Φάση", - "pg_mode_simulate": "Προσομοίωση", - "pg_mode_history": "Δοκιμή στο ιστορικό", - "pg_mode_sweep": "Σάρωση", - "pg_ev_detected": "Ανιχνεύθηκε", - "pg_ev_match": "Αντιστοίχιση οριστικοποιήθηκε", - "pg_ev_match_changed": "Αντιστοίχιση άλλαξε", - "pg_ev_ambiguous": "Ασαφής", - "pg_ev_unmatched": "Χωρίς αντιστοίχιση", - "pg_ev_notify_start": "Ειδοποίηση έναρξης", - "pg_ev_notify_pre": "Ειδοποίηση σχεδόν έτοιμο", - "pg_ev_notify_finish": "Ειδοποίηση ολοκλήρωσης", - "pg_ev_notify_milestone": "Ειδοποίηση ορόσημου", - "pg_ev_notify_held": "Η ειδοποίηση κρατήθηκε (ώρες ησυχίας)", - "pg_ev_finished": "Ολοκληρώθηκε", - "pg_ended": "Έληξε", - "pg_proj_energy": "Προβλ. ενέργεια", - "pg_alert_overrun": "Υπέρβαση", - "pg_alert_underrun": "Υστέρηση", - "pg_alert_did_not_finish": "Δεν ολοκληρώθηκε", - "pg_alert_false_end": "Χωρίστηκε σε πολλούς κύκλους", - "pg_alert_unmatched": "Χωρίς αντιστοίχιση", - "pg_alert_ambiguous": "Ασαφής αντιστοίχιση", - "pg_alert_energy": "Ανωμαλία ενέργειας", - "pg_newly_correct": "τώρα σωστό", - "pg_regressed": "επιδεινώθηκε", - "pg_end_timing_changed": "χρόνος λήξης άλλαξε", - "pg_vs_current": "έναντι τρέχοντος", - "pg_fixed": "διορθώθηκε", - "pg_broke": "χάλασε", - "pg_sweep_param": "Παράμετρος", - "pg_objective": "Στόχος", - "pg_steps": "Βήματα", - "pg_stress_group": "Δοκιμή τερματισμού αδράνειας", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "Επίπεδο αδράνειας (W)", - "pg_stress_idle_w_desc": "Παρακάμψτε το αυτόματα ανιχνευθέν κατώφλι κατάστασης αναμονής (αφήστε κενό για αυτόματο).", - "pg_stress_toggle": "Δοκιμή τερματισμού αδράνειας", - "pg_stress_toggle_desc": "Προσομοιώνει τη συσκευή που παραμένει στο επίπεδο κατανάλωσης αναμονής μετά το τέλος της εγγραφής - δείχνει αν και πότε το WashData σταματά τον κύκλο.", - "pg_sweep_2d": "Χάρτης θερμότητας 2D", - "pg_sweep_param_y": "2η παράμετρος", - "pg_obj_match": "Ακρίβεια αντιστοίχισης", - "pg_obj_endtiming": "Ακρίβεια χρόνου λήξης", - "pg_obj_falseend": "Ποσοστό ψευδών λήξεων", - "pg_obj_overrun": "Απόκλιση διάρκειας", - "pg_obj_ambiguity": "Ποσοστό ασάφειας", - "pg_best_combo": "καλύτερος συνδυασμός", - "pg_mode_optimize": "Βελτιστοποίηση", - "pg_group_matching": "Αντιστοίχιση προγράμματος", - "pg_zoom_hint": "διπλό κλικ για επαναφορά ζουμ", - "aria_playground_chart2": "Διαδραστικό γράφημα ισχύος κύκλου: τοποθετήστε τον δείκτη για ανάγνωση χρόνου/ισχύος, κυλήστε για ζουμ, σύρετε για μετακίνηση", - "pg_alert_timeout_end": "Τερματίστηκε λόγω λήξης χρόνου, όχι από πρόβλεψη", - "pg_alert_indefinite": "Θα εκτελούνταν επ' αόριστον", - "pg_alert_stress_cap": "Επιτεύχθηκε το όριο ασφαλείας", - "pg_alert_stress_ok": "Τερματισμός λόγω αδράνειας: ο κύκλος σταμάτησε", - "pg_alert_stress_warn": "Κατανάλωση αδράνειας πάνω από το κατώφλι διακοπής", - "task_pg_history": "Δοκιμή στο ιστορικό", - "task_pg_sweep": "Βελτιστοποίηση", - "task_reprocess": "Επανεπεξεργασία", - "task_ml_training": "Εκμάθηση", - "eta_secs": "απομένουν ~{n} δευτ.", - "eta_mins": "απομένουν ~{n} λεπτά", - "pg_recent_runs": "Πρόσφατες εκτελέσεις", - "pg_load_run": "Επαναφόρτωση αυτής της εκτέλεσης", - "pg_match_confidence": "Βεβαιότητα αντιστοίχισης", - "pg_envelope_fit": "Προσαρμογή στην περιβάλλουσα", - "pg_envelope_fit_tip": "Πόσο καλά ο κύκλος παραμένει μέσα στην αποθηκευμένη περιβάλλουσα ισχύος αυτού του προφίλ, μια διαφορετική οπτική από τη βεβαιότητα αντιστοίχισης.", - "n_imported_note": ", {n} εισηγμένοι", - "enable_online": "Ενεργοποίηση διαδικτυακών λειτουργιών", - "store_brand": "Μάρκα συσκευής", - "store_model": "Μοντέλο συσκευής", - "anonymous": "Ανώνυμος", - "rate_quality": "Βαθμολόγηση ποιότητας", - "rate_n": "{n} αστέρια", - "approved_only": "Μόνο εγκεκριμένα", - "adopt_settings": "Υιοθέτηση ρυθμίσεων επίσης", - "flags": "Σημαίες", - "include_phase_map": "Συμπερίληψη χάρτη φάσεων", - "include_settings": "Συμπερίληψη ρυθμίσεων ανίχνευσης & αντιστοίχισης", - "show_contributor": "Εμφάνιση ονομάτων συνεισφερόντων", - "task_pg_detail": "Προσομοίωση κύκλου", - "task_split": "Διαχωρισμός κύκλου", - "task_trim": "Περικοπή κύκλου", - "task_merge": "Συγχώνευση κύκλων", - "task_rebuild": "Ανακατασκευή φακέλων", - "cat_profiles": "Προφίλ (προγράμματα)", - "cat_real_cycles": "Κύκλοι (ιστορικό εκτελέσεων)", - "cat_reference_cycles": "Κύκλοι αναφοράς (εισαγμένοι)", - "cat_custom_phases": "Προσαρμοσμένες φάσεις", - "cat_profile_groups": "Ομάδες προφίλ", - "cat_settings": "Ρυθμίσεις ανίχνευσης & αναγνώρισης", - "cat_matching_config": "Ρύθμιση αναγνώρισης", - "cat_ml_models": "Μοντέλα ML", - "cat_feedback": "Ετικέτες σχολίων & αξιολόγησης", - "cat_suggestions": "Προτάσεις", - "cat_maintenance_log": "Αρχείο συντήρησης", - "cat_history_logs": "Ιστορικό & αρχεία αλλαγών", - "cat_lifetime_stats": "Συγκεντρωτικά σύνολα", - "cycles_short": "κύκλοι", - "import_mode": "Τρόπος συνδυασμού", - "mode_merge": "Συγχώνευση (διατήρηση δικών μου)", - "mode_replace": "Αντικατάσταση επιλεγμένων", - "cycle_destination": "Πού να πάνε οι εισαγόμενοι κύκλοι;", - "dest_reference": "Αναφορά (μόνο καμπύλη)", - "dest_real_history": "Πραγματικό ιστορικό (μετρά στα στατιστικά)", - "conflict_resolution": "Συγκρούσεις ονομάτων", - "conflict_import_copy": "Εισαγωγή ως αντίγραφο", - "conflict_keep_mine": "Διατήρηση δικών μου", - "conflict_overwrite": "Αντικατάσταση" - }, - "log": { - "all_levels": "Όλα τα επίπεδα", - "all_devices": "Όλες οι συσκευές", - "all_components": "Όλα τα στοιχεία", - "search_ph": "Αναζήτηση στα αρχεία καταγραφής…" - }, - "ml": { - "builtin_models": "● Χρήση ενσωματωμένων μοντέλων", - "fit_fair": "Αποδεκτός", - "fit_good": "Καλός", - "fit_slight": "Μικρός", - "fit_strong": "Ισχυρός", - "fit_weak": "Αδύναμος", - "fit_word": "κατάλληλος", - "personalized": "● Εξατομικευμένο σε αυτό το μηχάνημα", - "better_than_baseline": "{pct}% καλύτερα από τη βασική εκτίμηση ({metric})", - "trend_improving_tip": "Η καταλληλότητα αυτού του μοντέλου έχει βελτιωθεί στους πρόσφατους επανελέγχους.", - "trend_declining_tip": "Η καταλληλότητα αυτού του μοντέλου έχει υποχωρήσει στους πρόσφατους επανελέγχους· η αξιολόγηση περισσότερων κύκλων μπορεί να το βοηθήσει να μάθει ξανά.", - "trend_steady_tip": "Η καταλληλότητα αυτού του μοντέλου έχει παραμείνει σχεδόν σταθερή στους πρόσφατους επανελέγχους.", - "cap_blurb": { - "end": "Να γνωρίζει πότε ένας κύκλος έχει πράγματι ολοκληρωθεί", - "live_match": "Ταχύτερη αναγνώριση του προγράμματος που εκτελείται", - "quality": "Εντοπισμός κύκλων που ανιχνεύτηκαν λανθασμένα ή αλλοιώθηκαν", - "remaining_time": "Πρόβλεψη του χρόνου που απομένει", - "total_energy": "Πρόβλεψη της συνολικής ενέργειας και του κόστους" - }, - "cap_label": { - "end": "Ανίχνευση τέλους κύκλου", - "live_match": "Αναγνώριση προγράμματος", - "quality": "Έλεγχος ποιότητας κύκλου", - "remaining_time": "Εκτίμηση χρόνου που απομένει", - "total_energy": "Εκτίμηση ενέργειας" - }, - "metric_auc": "AUC {auc} σε δεδομένα ελέγχου", - "metric_mae": "σφάλμα: {model} έναντι της βάσης {baseline}" - }, - "modal": { - "auto_label": "Κύκλοι αυτόματης ετικέτας", - "correct_feedback": "Σωστή ανατροφοδότηση", - "create_profile": "Δημιουργία Προφίλ", - "cycle": "Κύκλος", - "edit_group": "Επεξεργασία ομάδας προφίλ", - "edit_phase": "Επεξεργασία Φάσης", - "import_config": "Εισαγωγή διαμόρφωσης", - "label_cycle": "Κύκλος ετικέτας", - "merge_cycles": "Συγχώνευση {n} Κύκλων", - "new_group": "Νέα ομάδα προφίλ", - "new_phase": "Νέα Φάση", - "process_history_msg": "Εκτέλεση αντιστοίχισης, ανανέωση προτάσεων, επανεκπαίδευση ML (αν είναι ενεργοποιημένο) και επανυπολογισμός υγείας κύκλων σε όλους τους αποθηκευμένους κύκλους. Αυτό μπορεί να πάρει λίγη ώρα.", - "process_history_ok": "Επεξεργασία", - "process_history_title": "Επεξεργασία Ιστορικού", - "process_recording": "Διαδικασία Εγγραφής", - "delete_maintenance_msg": "Διαγραφή αυτής της εγγραφής συντήρησης; Αυτό δεν μπορεί να αναιρεθεί.", - "delete_maintenance_title": "Διαγραφή συμβάντος συντήρησης", - "relabel_cycles": "Επανεπισήμανση {count} κύκλων", - "delete_automation_title": "Διαγραφή αυτοματισμού", - "delete_automation_msg": "Διαγραφή του αυτοματισμού \"{name}\" από το Home Assistant; Αυτό δεν μπορεί να αναιρεθεί.", - "remove_legacy_title": "Αφαίρεση ενεργειών παλαιού τύπου", - "remove_legacy_msg": "Αφαίρεση των προσαρμοσμένων ενεργειών παλαιού τύπου; Θα σταματήσουν να ενεργοποιούνται σε συμβάντα κύκλου. Αυτό δεν μπορεί να αναιρεθεί από τον πίνακα.", - "discard_recording_title": "Απόρριψη εγγραφής", - "discard_recording_msg": "Απόρριψη της αποθηκευμένης εγγραφής; Αυτό δεν μπορεί να αναιρεθεί.", - "dismiss_all_title": "Απόρριψη όλων των σχολίων", - "dismiss_all_msg": "Απόρριψη όλων των {count} εκκρεμών αιτημάτων σχολίων;", - "dismiss_all_ok": "Απόρριψη όλων", - "delete_phase_title": "Διαγραφή φάσης", - "delete_phase_msg": "Διαγραφή της φάσης \"{name}\";", - "clear_debug_title": "Εκκαθάριση δεδομένων εντοπισμού σφαλμάτων", - "clear_debug_msg": "Διαγραφή όλων των αποθηκευμένων ιχνών εντοπισμού σφαλμάτων;", - "wipe_all_title": "Διαγραφή όλων των δεδομένων", - "wipe_all_msg": "⚠️ Αυτό διαγράφει οριστικά ΟΛΟΥΣ τους κύκλους και τα προφίλ. Αυτό δεν μπορεί να αναιρεθεί.", - "wipe_all_ok": "Διαγραφή των πάντων", - "force_stop_title": "Αναγκαστική διακοπή κύκλου", - "force_stop_msg": "Αναγκαστική διακοπή του ενεργού κύκλου τώρα; Ο κύκλος θα αποθηκευτεί ως διακεκομμένος.", - "store_import": "Εισαγωγή κύκλου αναφοράς", - "store_share": "Κοινοποίηση στο κοινοτικό κατάστημα", - "store_share_device": "Κοινοποίηση αυτής της συσκευής", - "export_select": "Εξαγωγή - επιλογή δεδομένων", - "import_wizard": "Εισαγωγή - επιλογή δεδομένων" - }, - "msg": { - "appliance_monitor": "Οθόνη συσκευής", - "artifact_dip_detail": "Έπεσε κάτω από το συνηθισμένο εύρος ισχύος για ~{n}s.", - "artifact_footer": "Επισημαίνεται στο παραπάνω γράφημα. Αυτά είναι παροδικά τεχνουργήματα (π.χ. η πόρτα άνοιξε στα μέσα του κύκλου), όχι απαραίτητα προβλήματα.", - "artifact_header": "{n} ανωμαλίες που εντοπίστηκαν κατά τη διάρκεια αυτού του κύκλου", - "artifact_pause_detail": "Η ισχύς έπεσε σχεδόν στο μηδέν για ~{n}s και μετά ανέκαμψε – πιθανώς η πόρτα άνοιξε στα μέσα του κύκλου ή ο κύκλος τέθηκε σε παύση.", - "artifact_spike_detail": "Υπερέβη το συνηθισμένο εύρος ισχύος για ~{n}s.", - "auto_label_intro": "Εκχωρήστε προφίλ σε κύκλους χωρίς ετικέτα, των οποίων η εμπιστοσύνη αντιστοίχισης εξαλείφει το όριο.", - "automations_intro": "Το WashData ενεργοποιεί συμβάντα {start} / {end} και εκθέτει οντότητες, οπότε οι ειδοποιήσεις και οι ενέργειες κατασκευάζονται καλύτερα ως κανονικοί αυτοματισμοί του Home Assistant. Οι αυτοματισμοί που χρησιμοποιούν αυτή τη συσκευή εμφανίζονται παρακάτω.", - "cleanup_intro": "Κάθε κύκλος με ετικέτα επικαλύπτεται. Σημειώστε ακραίες τιμές και διαγράψτε για να καθαρίσετε το προφίλ.", - "clear_debug_hint": "Καταργήστε τα αποθηκευμένα δεδομένα εντοπισμού σφαλμάτων για να ελευθερώσετε χώρο.", - "collecting_data": "Συλλογή δεδομένων: απαιτούνται ακόμη {need} κύκλος{plural} πριν ξεκινήσει η βελτιστοποίηση ({current}/{min}).", - "compare_overlay_profiles": "Προφίλ επικάλυψης (ασθενώς)", - "compare_profiles_tip": "Επικαλύψτε άλλους φακέλους προφίλ στο παραπάνω γράφημα για να δείτε ποιος ταιριάζει καλύτερα σε αυτόν τον κύκλο.", - "compare_selected_cycles": "Επιλεγμένοι κύκλοι (συμπαγής) – εμφάνιση / απόκρυψη", - "consider_new_profile": "Σκεφτείτε να δημιουργήσετε ένα νέο προφίλ.", - "coverage_gap": "οι πρόσφατοι κύκλοι δεν έχουν αντίστοιχο προφίλ ({pct}% των τελευταίων 30).", - "coverage_gap_similar_cycles": "Βρέθηκαν {count} παρόμοιοι κύκλοι χωρίς ετικέτα – δημιουργήστε ένα προφίλ για να αρχίσετε την αντιστοίχισή τους.", - "cycles_deleted": "Διαγράφηκαν {count} κύκλοι", - "enough_data": "Αρκετά δεδομένα για εκμάθηση ({current}/{min} κύκλοι).", - "export_description": "Επιλέξτε ακριβώς ποια προφίλ, κύκλους, ρυθμίσεις και άλλα θα εξαχθούν σε JSON, ή αναλύστε ένα αρχείο και εισάγετε μόνο τα μέρη που θέλετε.", - "feedback_cycles_pending": "{n} κύκλος{s} για αξιολόγηση", - "feedback_prompt": "Επιβεβαιώστε ότι ήταν σωστό, διορθώστε το πρόγραμμα ή αγνοήστε.", - "feedback_relabel_hint": "Η επανεπισήμανση αυτού του κύκλου τον επιλύει επίσης.", - "filter_by_profile": "Φιλτράρισμα κατά προφίλ…", - "group_modal_help": "Ομαδοποιήστε προγράμματα με το ίδιο σχήμα που διαφέρουν σε θερμοκρασία/περιστροφή (οι διάρκειες μπορεί να διαφέρουν). Η αντιστοίχιση βαθμολογεί την ομάδα ως έναν υποψήφιο και, στη συνέχεια, επιλέγει το μέλος που ταιριάζει καλύτερα. Διαλέξτε τουλάχιστον 2. η επικάλυψη δείχνει πόσο μοιάζουν.", - "group_not_cohesive": "Αυτά τα προφίλ δεν είναι αρκετά παρόμοια ώστε να ομαδοποιούνται αξιόπιστα, επομένως η αντιστοίχιση τα αντιμετωπίζει μεμονωμένα μέχρι να αφαιρέσετε το ακραίο στοιχείο ή να χωρίσετε την ομάδα.", - "group_preview_hint": "Επιλέξτε 2+ μέλη για προεπισκόπηση και σύγκριση των καμπυλών ισχύος τους.", - "import_intro": "Φορτώστε ένα εξαγόμενο αρχείο ή επικολλήστε ένα ωφέλιμο φορτίο JSON παρακάτω.", - "legacy_actions_title": "{count} προσαρμοσμένη ενέργεια παλαιού τύπου εξακολουθεί να εκτελείται", - "live_chart_loading": "Το γράφημα ζωντανής ισχύος εμφανίζεται καθώς φτάνουν οι ενδείξεις.", - "loading": "Φόρτωση…", - "loading_curve": "Φόρτωση καμπύλης…", - "loading_settings": "Φόρτωση ρυθμίσεων…", - "log_buffer_hint": "Πρώτα τα νεότερα · αποθηκεύει προσωρινά τις τελευταίες 500 εγγραφές ha_washdata από την επανεκκίνηση · σύρετε το κάτω άκρο για αλλαγή μεγέθους.", - "maintenance_advisory": "Η αύξηση της διάρκειας/ενέργειας μπορεί να υποδηλώνει ότι απαιτείται συντήρηση της συσκευής (π.χ. αφαλάτωση, καθαρισμός φίλτρου).", - "maintenance_due": "Οφειλόμενη συντήρηση: {items}", - "maintenance_intro": "Καταγράψτε το σέρβις που πραγματοποιείτε σε αυτή τη συσκευή και λάβετε υπενθύμιση όταν κάθε εργασία οφείλεται ξανά.", - "maintenance_load_error": "Δεν ήταν δυνατή η φόρτωση των δεδομένων συντήρησης: {error}", - "maintenance_requires_access": "Η συντήρηση και η εξαγωγή/εισαγωγή απαιτούν πλήρη πρόσβαση.", - "manual_duration_hint": "Η μέση/αναμενόμενη διάρκεια κύκλου του προφίλ, που χρησιμοποιείται για εκτιμήσεις του υπολειπόμενου χρόνου. Επεξεργαστείτε για να το ορίσετε. αφήνοντάς το αμετάβλητο διατηρεί την τρέχουσα τιμή.", - "matching_tuning_intro": "Κατά την εκμάθηση, το WashData προσαρμόζει επίσης το βάρος της αντιστοίχισης προγράμματος σε σχέση με τη διάρκεια και την ενέργεια.", - "merge_intro": "Οι επιλεγμένοι κύκλοι συνδυάζονται σε έναν (χρονολογική σειρά, κενά γεμάτα με 0 W). Επιλέξτε το προφίλ που προκύπτει.", - "ml_intro": "Το WashData συνοδεύεται από έξυπνα μοντέλα που λειτουργούν εκτός συσκευασίας.", - "ml_learned_intro": "Μοντέλα προσαρμοσμένα σε αυτό το μηχάνημα.", - "ml_loading": "φόρτωση ML…", - "ml_settings_intro": "Δύο ανεξάρτητοι διακόπτες: ο ένας εφαρμόζει τα μοντέλα ενώ εκτελείται ένας κύκλος, ο άλλος επιτρέπει στην WashData να τα ρυθμίσει με ακρίβεια στο μηχάνημά σας με την πάροδο του χρόνου.", - "name_first_program": "Έχετε αρκετούς κύκλους – ονομάστε το πρώτο σας πρόγραμμα για να ξεκινήσει η αντιστοίχιση.", - "near_duplicate_cluster": "Εντοπίστηκε σχεδόν διπλό σύμπλεγμα προφίλ. Η ομαδοποίηση επιτρέπει την αξιόπιστη επιλογή αντιστοίχισης μεταξύ ομοίων (π.χ. ίδιο πρόγραμμα σε διαφορετική θερμοκρασία/περιστροφή).", - "no_cycles_match": "Κανένας κύκλος δεν ταιριάζει με το τρέχον φίλτρο.", - "no_cycles_profile": "Δεν υπάρχουν κύκλοι για αυτό το προφίλ.", - "no_cycles_selected": "Επιλέξτε πρώτα τουλάχιστον έναν κύκλο.", - "no_cycles_yet": "Δεν έχουν καταγραφεί ακόμη κύκλοι.", - "no_device_selected": "Δεν έχει επιλεγεί συσκευή.", - "no_devices": "Δεν έχουν διαμορφωθεί ακόμη συσκευές WashData.", - "no_envelope": "Δεν υπάρχει ακόμη φάκελος - ανακατασκευή μετά από κύκλους ετικετών.", - "no_envelope_overlay": "Δεν υπάρχει διαθέσιμος φάκελος για επικάλυψη.", - "no_fine_tuned": "Τίποτα δεν έχει βελτιωθεί ακόμα – Η WashData χρησιμοποιεί τα ενσωματωμένα μοντέλα της.", - "no_logs": "Δεν υπάρχουν ακόμα εγγραφές καταγραφής στην προσωρινή μνήμη.", - "no_maintenance": "Δεν έχει καταγραφεί συντήρηση ακόμα.", - "no_match_yet": "Καμία προσπάθεια αγώνα ακόμα - συμπληρώνεται κατά τη διάρκεια ενός κύκλου τρεξίματος.", - "no_other_users": "Δεν βρέθηκαν άλλοι χρήστες του Home Assistant.", - "no_phases": "Δεν έχουν καθοριστεί φάσεις.", - "no_phases_assigned": "Δεν έχουν εκχωρηθεί φάσεις.", - "no_profiles_compare": "Δεν υπάρχουν προφίλ για σύγκριση.", - "no_profiles_overlay": "Δεν υπάρχουν προφίλ για επικάλυψη.", - "no_profiles_yet": "Δεν υπάρχουν ακόμα προφίλ. Δημιουργήστε ένα από έναν κύκλο με ετικέτα.", - "no_profiles_yet_short": "Δεν υπάρχουν ακόμα προφίλ.", - "no_settings_match": "Δεν υπάρχουν ρυθμίσεις που να αντιστοιχούν στο \"{q}\"", - "no_split_points": "Δεν υπάρχουν ακόμη σημεία διαίρεσης.", - "no_suggestions": "Δεν υπάρχουν ενεργές προτάσεις.", - "notify_services_hint": "Χρησιμοποιήστε αναγνωριστικά υπηρεσιών {entity} (χωρισμένα με κόμμα για πολλαπλά). Μεταβλητές προτύπου: {vars}.", - "old_actions_warning": "Διαμορφώθηκε με το παλιό πρόγραμμα επεξεργασίας ενεργειών (τώρα καταργήθηκε). Εξακολουθούν να ενεργοποιούνται σε συμβάντα κύκλου, αλλά δεν είναι πλέον δυνατή η επεξεργασία τους εδώ. Μετατρέψτε τα σε κανονικό αυτοματισμό ή αφαιρέστε τα.", - "onboarding_progress": "{n} / 3 κύκλοι παρατηρήθηκαν", - "onboarding_watching": "Αφήστε τη συσκευή σας να λειτουργεί κανονικά – το WashData παρακολουθεί. Μετά από 3 κύκλους, θα ξεκινήσει η αντιστοίχιση προγραμμάτων.", - "pending_feedback": "Εκκρεμεί σχόλια ανίχνευσης", - "performance_trend": "Τάση απόδοσης ({n} κύκλοι)", - "pg_analysis_empty": "Φορτώστε έναν κύκλο για να δείτε την ανάλυση αντιστοίχισης.", - "pg_apply_confirm": "Εφαρμογή της καλύτερης τιμής: {label} = {value};", - "pg_canvas_empty": "Επιλέξτε έναν κύκλο παραπάνω και, στη συνέχεια, πατήστε Φόρτωση για να δείτε την καμπύλη ισχύος του.", - "pg_chart_caption": "Ποσοστό εντοπισμού/αντιστοίχισης ανά τιμές του {param}", - "pg_match_rate": "{pct}% ποσοστό αντιστοίχισης σε {total} κύκλους", - "pg_restart_note": "Επανεκκινήστε το Home Assistant για να ενεργοποιήσετε τα εργαλεία προσομοίωσης.", - "pg_sim_progress": "{done} / {total} κύκλοι", - "pg_starting": "Εκκίνηση…", - "pg_stress_synthetic": "η προσομοίωση αδράνειας ξεκινά εδώ", - "pg_sweep_intro": "Τι θα γινόταν αν το {param} ήταν διαφορετικό; Δοκιμάστε {steps} τιμές στους τελευταίους {cycles} κύκλους για να βρείτε τη ρύθμιση όπου αντιστοιχίζονται σωστά οι περισσότεροι κύκλοι.", - "pg_sweep_step": "Βήμα {done} / {total}", - "pg_undetected": "{n} μη εντοπισμένος κύκλος{s}", - "pg_verdict_bad": "Χρειάζεται προσοχή: πολλοί κύκλοι δεν εντοπίζονται.", - "pg_verdict_good": "Καλά ρυθμισμένο: οι περισσότεροι κύκλοι αναγνωρίζονται και αντιστοιχίζονται σωστά.", - "pg_verdict_ok": "Αποδεκτό: ορισμένοι κύκλοι χάθηκαν. Δοκιμάστε να μειώσετε το κατώφλι εκκίνησης.", - "phase_catalog_intro": "Ονομασμένα τμήματα ενός κύκλου (Πρόπλυση, Θέρμανση, Στύψιμο…). Αντιστοιχίστε τα σε ένα προφίλ από τον πίνακα ελέγχου του.", - "phase_ranges_intro": "Εύρος φάσεων (λεπτά από την έναρξη του κύκλου) που επικαλύπτονται στη μέση καμπύλη. Επεξεργαστείτε τις τιμές για ζωντανή προεπισκόπηση.", - "playground_intro": "Ένας ασφαλής χώρος δοκιμών για την αναπαραγωγή παλαιότερων κύκλων με διαφορετικές ρυθμίσεις, τη σύγκριση δύο διαμορφώσεων δίπλα δίπλα και την εξέταση του πώς ένας κύκλος ευθυγραμμίζεται με ένα προφίλ. Τίποτα εδώ δεν αλλάζει τα ενεργά σας δεδομένα μέχρι να το εφαρμόσετε ρητά.", - "playground_needs_restart": "Επανεκκινήστε το Home Assistant για να ενεργοποιήσετε τα εργαλεία του Χώρου δοκιμών.", - "preferences_admin": "Προτιμήσεις, πίνακας & έλεγχος πρόσβασης", - "preferences_adv": "Προτιμήσεις", - "prefs_personal": "Αυτά ισχύουν μόνο για τον λογαριασμό σας Home Assistant.", - "process_history_hint": "Εκτέλεση αντιστοίχισης σε όλους τους αποθηκευμένους κύκλους, ανανέωση προτάσεων ρύθμισης, επανεκπαίδευση μοντέλων ML (αν είναι ενεργοποιημένα) και επανυπολογισμός υγείας κύκλων. Εκτελέστε το μετά από μια δέσμη αξιολογήσεων.", - "profile_deleted": "Το προφίλ διαγράφηκε", - "profile_poor_health_detail": "Οι κύκλοι που έχουν εκχωρηθεί σε αυτό το προφίλ έχουν ασυνεπή σχήματα ή χαμηλή εμπιστοσύνη. Εξετάστε το ενδεχόμενο να φτιάξετε ξανά το φάκελο ή να αναθεωρήσετε τους κύκλους με ετικέτα.", - "profiles_intro": "Κάντε κλικ σε ένα προφίλ για στατιστικά στοιχεία, φάσεις και εκκαθάριση. Ομαδοποιήστε σχεδόν πανομοιότυπα προγράμματα (ίδιο σχήμα/διάρκεια, διαφορετική θερμοκρασία ή στύψιμο) ώστε να ταιριάζουν αξιόπιστα οι επιλογές μεταξύ τους.", - "rbac_hint": "Όταν είναι απενεργοποιημένο, κάθε χρήστης του Home Assistant έχει πλήρη πρόσβαση (η προεπιλογή). Οι διαχειριστές έχουν πάντα πλήρη πρόσβαση και μπορούν να διαχειρίζονται όλους.", - "recent_logs": "Πρόσφατες εγγραφές ha_washdata", - "recording_in_progress": "Η εγγραφή σε εξέλιξη", - "reminders_intro": "Εμφάνιση υπενθύμισης στον πίνακα τόσους κύκλους μετά το τελευταίο σέρβις. Αφήστε κενό ή 0 για απενεργοποίηση μιας υπενθύμισης.", - "restart_gap_footer": "Επισημασμένο στο γράφημα. Τα δεδομένα ισχύος λείπουν για αυτά τα διαστήματα· η αντιστοίχιση χρησιμοποίησε μόνο πραγματικές μετρήσεις.", - "restart_gap_header": "{n} κενό επανεκκίνησης HA κατά τη διάρκεια αυτού του κύκλου", - "restart_gap_item": "{dur} κενό", - "review_confirm_help": "Επιβεβαιώστε εάν αυτός ο κύκλος εντοπίστηκε σωστά. Οι κριτικές σας εκπαιδεύουν το μοντέλο στο μηχάνημά σας - όσο περισσότερους κύκλους επιβεβαιώσετε, τόσο καλύτερη αντιστοίχιση και βαθμολογία υγείας. Ένα γρήγορο Καλό/Κακό είναι αρκετό.", - "review_in_settings": "Έλεγχος στις Ρυθμίσεις", - "review_notes_placeholder": "Σημειώσεις (προαιρετικό)", - "review_notes_tip": "Σημειώσεις ελεύθερου κειμένου για δική σας αναφορά. Δεν χρησιμοποιείται με ταίριασμα ή προπόνηση.", - "review_profile_tip": "Το πρόγραμμα αυτού του κύκλου χαρακτηρίζεται ως. Εάν το πρόγραμμα που εντοπίστηκε αυτόματα ήταν λάθος, διορθώστε το εδώ - η επισήμανση διδάσκει αντιστοίχιση για μελλοντικούς κύκλους.", - "review_quality_tip": "Πόσο καθαρός είναι αυτός ο κύκλος. Καλό = παράδειγμα βιβλίου αυτού του προγράμματος. Κακό = ανιχνεύθηκε αλλά θορυβώδες ή άτυπο. Μη χρησιμοποιήσιμο = εσφαλμένα εντοπισμένο (συγχωνευμένο, περικομμένο ή ψευδές). Οδηγεί το δείκτη υγείας και ποιοι κύκλοι επιτρέπονται για την εκπαίδευση του μοντέλου.", - "review_recorded_tip": "Επισημάνετε αυτό ως έναν επιλεγμένο από το χέρι κύκλο αναφοράς για το πρόγραμμά του - τον ίδιο ρόλο με έναν μη αυτόματα εγγεγραμμένο κύκλο. Οι κύκλοι αναφοράς διατηρούνται πάντα, εισάγονται το αντίστοιχο πρότυπο και δεν απορρίπτονται ποτέ με εκκαθάριση. (Αυτή είναι η \"χρυσή\"/ηχογραφημένη σημαία· και τα δύο είναι το ίδιο πράγμα.)", - "review_tags_tip": "Προαιρετικές σημαίες που περιγράφουν τι πήγε στραβά με αυτόν τον κύκλο, οπότε η εκπαίδευση και ο καθαρισμός μπορούν να το εξηγήσουν.", - "review_to_cycles": "Ανοίξτε την ουρά ελέγχου Κύκλων", - "saving_triggers_reload": "Η αποθήκευση ενεργοποιεί μια εκ νέου φόρτωση ενσωμάτωσης. Οι οντότητες HA ενδέχεται να εμφανίζονται για λίγο ως μη διαθέσιμες.", - "search_placeholder": "Ρυθμίσεις αναζήτησης…", - "see_recorder": "Δείτε παρακάτω το γραφικό στοιχείο εγγραφής", - "setting_changed": "Άλλαξε από {old} σε {new} στις {date}", - "settings_basic_note": "Εμφανίζονται οι βασικές ρυθμίσεις. Μεταβείτε στο Για προχωρημένους για την πλήρη λίστα.", - "shape_drift_advisory": "⚠ Απόκλιση σχήματος", - "shape_drift_detail": "Το μοτίβο ισχύος αυτού του προφίλ έχει αλλάξει με την πάροδο του χρόνου – πιθανή φθορά της συσκευής ή απαιτείται συντήρηση (π.χ. αφαλάτωση, καθαρισμός φίλτρου).", - "show_all_settings": "Εμφάνιση όλων των ρυθμίσεων", - "showing_suggestions": "Εμφάνιση ρύθμισης {count} με προτάσεις.", - "split_intro": "Κάντε κλικ στο γράφημα για να προσθέσετε ή να αφαιρέσετε ένα σημείο διαίρεσης ή για αυτόματη ανίχνευση με κενά αδράνειας. Κάθε τμήμα που προκύπτει μπορεί να αποκτήσει το δικό του προφίλ.", - "storage_diagnostics": "Στατιστικά αποθήκευσης, συντήρηση, εξαγωγές/εισαγωγές", - "sug_staged": "Ορίστηκε {key} = {val}. Αποθηκεύστε για εφαρμογή.", - "toast_auto_detect_enabled": "Αυτόματη ανίχνευση ενεργοποιήθηκε", - "toast_auto_label_complete": "Αυτόματη επισήμανση ολοκληρώθηκε", - "toast_auto_label_failed": "Αυτόματη επισήμανση απέτυχε: {error}", - "toast_automation_failed": "Δεν ήταν δυνατή η δημιουργία αυτοματισμού: {error}", - "toast_automation_migrated": "Ενέργειες μεταφέρθηκαν σε αυτοματισμό· άνοιγμα επεξεργαστή", - "toast_convert_failed": "Η μετατροπή απέτυχε: {error}", - "toast_create_failed": "Η δημιουργία απέτυχε: {error}", - "toast_delete_failed": "Η διαγραφή απέτυχε: {error}", - "toast_error": "Σφάλμα: {error}", - "toast_failed": "Αποτυχία: {error}", - "toast_force_stop_failed": "Η αναγκαστική διακοπή απέτυχε: {error}", - "toast_name_required": "Απαιτείται όνομα", - "toast_no_automation": "Δεν είναι δυνατή η δημιουργία αυτοματισμού εδώ", - "toast_profile_name_required": "Απαιτείται όνομα προφίλ", - "toast_program_set": "Πρόγραμμα ορίστηκε: {program}", - "toast_rebuild_failed": "Η ανακατασκευή απέτυχε: {error}", - "toast_resume_failed": "Η επανέναρξη απέτυχε: {error}", - "toast_revert_failed": "Η επαναφορά απέτυχε: {error}", - "toast_reverted": "Έγινε επαναφορά: {key}", - "toast_save_failed": "Η αποθήκευση απέτυχε: {error}", - "trend_duration_longer": "Μεγαλύτερη τάση διάρκειας ({pct}%/κύκλος) – πρόσφατος μέσος όρος {avg}", - "trend_duration_shorter": "Μικρότερη τάση διάρκειας ({pct}%/κύκλος) – πρόσφατος μέσος όρος {avg}", - "trend_energy_down": "Πτωτική τάση ενέργειας ({pct}%/κύκλος)", - "trend_energy_up": "Ανοδικές τάσεις ενέργειας ({pct}%/κύκλος) – πρόσφατος μέσος όρος {avg}", - "trim_intro": "Σύρετε τις κόκκινες λαβές ή εισαγάγετε τιμές. Όλα έξω από το παράθυρο αφαιρούνται.", - "tuning_suggestions_available": "{count} πρόταση συντονισμού διαθέσιμη από παρατηρούμενους κύκλους. Εμφανίζονται δίπλα στα σχετικά πεδία.", - "unsure_detected_prefix": "Το WashData δεν είναι βέβαιο ότι εντόπισε", - "updated": "Ενημερώθηκε", - "warmup_badge": "Συνεχίζει να μαθαίνει ({done}/{needed} κύκλοι)", - "warmup_detail": "Αυτό το προφίλ χρειάζεται {needed} επισημασμένους κύκλους πριν ξεκινήσει η αυτόματη αντιστοίχιση. Κάθε επιβεβαιωμένος κύκλος βοηθά στη μάθηση.", - "wipe_history_warning": "Διαγράψτε οριστικά όλους τους κύκλους και τα προφίλ. Δεν είναι δυνατή η αναίρεση.", - "compare_overlay_tip": "Επικαλύψτε τους εκμαθημένους φακέλους προφίλ για να δείτε με ποιο πρόγραμμα μοιάζει κάθε κύκλος.", - "duration_trend_up_tip": "Αύξηση διάρκειας ({pct}%/κύκλο)", - "duration_trend_down_tip": "Μείωση διάρκειας ({pct}%/κύκλο)", - "energy_trend_up_tip": "Αύξηση ενέργειας ({pct}%/κύκλο)", - "energy_trend_down_tip": "Μείωση ενέργειας ({pct}%/κύκλο)", - "performance_trending": "Τάση απόδοσης", - "pg_select_cycle_hint": "Επιλέξτε έναν κύκλο και κάντε κλικ στο ↺ για φόρτωση", - "pg_sweep_progress": "Βήμα {done} / {total}", - "pg_analysis_hint": "Επιλέξτε έναν κύκλο και κάντε κλικ στο ↺ για φόρτωση της ανάλυσης.", - "diagnostics_load_failed": "Δεν ήταν δυνατή η φόρτωση των διαγνωστικών: {error}", - "manual_duration_ref_hint": "Χρησιμοποιείται μόνο όταν δεν έχει επιλεγεί κύκλος αναφοράς. Ένας κύκλος αναφοράς ορίζει τη διάρκεια από το δικό του μήκος.", - "toast_convert_rolled_back": "Η μετατροπή απέτυχε και αναιρέθηκε (δεν έμεινε κανένας αυτοματισμός): {error}", - "toast_convert_orphan": "Ο αυτοματισμός δημιουργήθηκε, αλλά η εκκαθάριση των παλιών ενεργειών απέτυχε. Μην προσπαθήσετε ξανά· αφαιρέστε τις παλιές ενέργειες χειροκίνητα για να αποφύγετε έναν διπλότυπο αυτοματισμό.", - "advisory_duration_trend_up": "Οι κύκλοι '{name}' διαρκούν όλο και περισσότερο (περίπου +{pct}% ανά κύκλο). Αν άλλαξε η συμπεριφορά της συσκευής, καταγράψτε ξανά ή ανακατασκευάστε αυτό το προφίλ.", - "advisory_energy_trend_up": "Το '{name}' καταναλώνει όλο και περισσότερη ενέργεια (περίπου +{pct}% ανά κύκλο) - αξίζει να ελέγξετε τη συσκευή αν αυτό είναι απροσδόκητο.", - "advisory_poor_health": "Το '{name}' έχει χαμηλή βαθμολογία ταιριάσματος - οι πρόσφατοι κύκλοι του διαφέρουν πολύ ή ταιριάζουν ασθενώς. Ελέγξτε τους κύκλους του ή καταγράψτε ξανά το προφίλ ώστε η αναγνώριση και οι εκτιμήσεις χρόνου να παραμείνουν ακριβείς.", - "advisory_shape_drift": "Το '{name}' έχει αποκλίνει σημαντικά από την αρχική του καμπύλη ισχύος. Η συμπεριφορά της συσκευής μπορεί να έχει αλλάξει με την πάροδο του χρόνου (π.χ. άλατα, φθορά). Εξετάστε το ενδεχόμενο νέας καταγραφής αυτού του προφίλ με πρόσφατους κύκλους.", - "advisory_shape_drift_corr": "Το '{name}' έχει αποκλίνει σημαντικά από την αρχική του καμπύλη ισχύος (συσχέτιση {corr}). Η συμπεριφορά της συσκευής μπορεί να έχει αλλάξει με την πάροδο του χρόνου (π.χ. άλατα, φθορά). Εξετάστε το ενδεχόμενο νέας καταγραφής αυτού του προφίλ με πρόσφατους κύκλους.", - "pg_no_alerts": "Δεν εντοπίστηκαν προβλήματα σε αυτή την εκτέλεση.", - "pg_override_active": "Χρησιμοποιούνται οι επεξεργασμένες ρυθμίσεις σας έναντι των τρεχουσών", - "pg_history_intro": "Αναπαράγετε τους πρόσφατους κύκλους σας μέσω του πραγματικού ανιχνευτή και αντιστοιχιστή. Επεξεργαστείτε πρώτα μια ρύθμιση ανίχνευσης στη λειτουργία Προσομοίωση για να δείτε εδώ μια σύγκριση πριν/μετά.", - "pg_history_empty": "Πατήστε Εκτέλεση για να αναπαράγετε τους κύκλους σας.", - "pg_history_summary": "{detected}/{total} ανιχνεύθηκαν · {correct} αντιστοιχίστηκαν σωστά", - "pg_sweep_no_metric": "Δεν υπάρχουν αρκετά δεδομένα για τη βαθμολόγηση αυτού του στόχου.", - "pg_sweep_intro2": "Βρείτε τη ρύθμιση που ικανοποιεί καλύτερα έναν στόχο στους πρόσφατους κύκλους σας. Τίποτα δεν αλλάζει μέχρι να την εφαρμόσετε.", - "pg_running_history": "Αναπαραγωγή των κύκλων σας…", - "pg_running_sweep": "Δοκιμή τιμών σε όλους τους κύκλους σας…", - "pg_row_load_hint": "Φόρτωση αυτού του κύκλου στο παραπάνω γράφημα", - "pg_history_intro2": "Αναπαραγάγετε τους πρόσφατους κύκλους σας μέσω του πραγματικού ανιχνευτή και μηχανισμού αντιστοίχισης με τις παραπάνω ρυθμίσεις. Κάντε κλικ σε οποιαδήποτε γραμμή για να φορτώσετε αυτόν τον κύκλο στο γράφημα. Επεξεργαστείτε μια ρύθμιση για να δείτε μια σύγκριση πριν/μετά.", - "pg_simulating": "Προσομοίωση κύκλου…", - "pg_canvas_empty2": "Επιλέξτε έναν κύκλο παραπάνω και πατήστε Εκτέλεση για να τον προσομοιώσετε. Στη συνέχεια τοποθετήστε τον δείκτη για ανάγνωση τιμών, κυλήστε για ζουμ και σύρετε για μετακίνηση.", - "pg_apply_settings_confirm": "Αποθήκευση αυτών των {n} ρυθμίσεων σε αυτήν τη συσκευή; {list}", - "pg_stress_terminated_detail": "Σταθεροποιήθηκε σε περίπου {idle} W αδράνειας -- ο κύκλος τερμάτισε {h} ώρ. {m} λεπ. αργότερα μέσω {reason}.", - "pg_stress_above_threshold_detail": "Η κατανάλωση αδράνειας (~{idle} W) είναι ίση ή μεγαλύτερη από το πραγματικό κατώφλι διακοπής ({stop} W) -- ο κύκλος δεν καταγράφηκε ποτέ ως ήσυχος. Για διόρθωση, αυξήστε το stop_threshold_w.", - "pg_stress_hit_cap_detail": "Ο κύκλος έτρεξε {h} ώρ. {m} λεπ. χωρίς να σταματήσει -- διακόπηκε αναγκαστικά από το όριο ασφαλείας. Κατανάλωση αδράνειας {idle} W έναντι κατωφλίου διακοπής {stop} W.", - "no_logs_match": "Καμία εγγραφή καταγραφής δεν ταιριάζει με αυτά τα φίλτρα.", - "pg_analysis_hint2": "Επιλέξτε έναν κύκλο και πατήστε Εκτέλεση για να φορτώσετε την ανάλυση αντιστοίχισης.", - "pg_analysis_empty2": "Πατήστε Εκτέλεση για να δείτε την ανάλυση αντιστοίχισης.", - "imported_readonly": "Εισαγωγή από το κοινοτικό κατάστημα. Εμφανίζεται για αναφορά και αντιστοίχιση. Δεν προσμετράται στα στατιστικά σας και δεν μπορεί να επεξεργαστεί.", - "merge_no_imports": "Οι εισηγμένες καταγραφές δεν μπορούν να συγχωνευθούν σε πραγματικό κύκλο. Αποεπιλέξτε τες για συγχώνευση.", - "store_enable_hint": "Ενεργοποιήστε τις διαδικτυακές λειτουργίες στις Ρυθμίσεις για να περιηγηθείτε και να εισαγάγετε κύκλους αναφοράς της κοινότητας.", - "online_intro": "Κοινοποιήστε και κατεβάστε κύκλους αναφοράς με άλλους χρήστες του WashData. Όλες οι διαδικτυακές λειτουργίες είναι προαιρετικές και ανενεργές από προεπιλογή.", - "store_share_intro": "Ανεβάστε αυτόν τον κύκλο αναφοράς ώστε να μπορούν να τον χρησιμοποιήσουν άλλοι με την ίδια συσκευή. Ελέγχεται πριν εμφανιστεί δημόσια.", - "online_intro_global": "Περιηγηθείτε και κοινοποιήστε καταγραφές αναφοράς με άλλους χρήστες του WashData και επιβεβαιώστε καταχωρίσεις συσκευών. Μία σύνδεση ισχύει για ολόκληρη την ενσωμάτωση WashData· η μάρκα και το μοντέλο της συσκευής ορίζονται ανά συσκευή στην ενότητα Βασικά. Όλες οι διαδικτυακές λειτουργίες είναι προαιρετικές και ανενεργές από προεπιλογή.", - "online_unavailable": "Οι διαδικτυακές λειτουργίες δεν είναι διαθέσιμες σε αυτόν τον διακομιστή.", - "store_picker_offline": "Ενεργοποιήστε τις διαδικτυακές λειτουργίες στο γρανάζι ρυθμίσεων για να επιλέξετε από τον κατάλογο της κοινότητας.", - "pick_brand_first": "Επιλέξτε πρώτα μια μάρκα συσκευής.", - "model_not_found": "Δεν υπάρχει ακόμη στον κατάλογο.", - "connect_to_confirm": "Συνδεθείτε στο γρανάζι ρυθμίσεων για επιβεβαίωση ή βαθμολόγηση.", - "adopt_settings_hint": "Αντικατάσταση των ορίων ανίχνευσης & αντιστοίχισης αυτής της συσκευής με τα κοινοποιημένα. Οι ειδοποιήσεις, οι οντότητες και η τιμή ενέργειάς σας δεν αλλάζουν ποτέ.", - "include_settings_hint": "Κοινοποίηση των ορίων αναγνώρισης και αντιστοίχισης αυτής της συσκευής (όχι ειδοποιήσεων, οντοτήτων ή τιμής ενέργειας). Οι υιοθετούντες επιλέγουν εάν θα τα εφαρμόσουν.", - "onboard_download": "Νέα συσκευή; Υιοθετήστε μια έτοιμη ρύθμιση (προγράμματα, κύκλους αναφοράς και φάσεις) από έναν άλλο χρήστη WashData με την ίδια συσκευή.", - "share_consent": "Επιβεβαιώνω ότι αυτοί οι κύκλοι ολοκληρώθηκαν κανονικά χωρίς διακοπή", - "share_device_none": "Δεν υπάρχουν ακόμα κύκλοι για κοινοποίηση. Επισημάνετε πρώτα έναν καταγεγραμμένο ή χειροκίνητα επιλεγμένο κύκλο ως κύκλο αναφοράς (⭐) στην καρτέλα Κύκλοι.", - "share_guideline_naming": "Ονομάστε κάθε προφίλ ακριβώς όπως εμφανίζεται στον επιλογέα ή την οθόνη της συσκευής (π.χ. 'Cotton 40', 'Eco 60').", - "share_guideline_quality": "Κοινοποιήστε μόνο κύκλους που ολοκληρώθηκαν κανονικά -- χωρίς διακοπές στη μέση του κύκλου, ανοίγματα πόρτας ή διακυμάνσεις ισχύος.", - "share_guideline_review": "Η μεταφόρτωσή σας ξεκινά ως εκκρεμής και εμφανίζεται δημόσια μόλις αρκετά μέλη της κοινότητας την επιβεβαιώσουν.", - "share_guidelines_title": "Πριν κοινοποιήσετε", - "store_download_device_intro": "Υιοθετήστε κάθε κοινοποιημένο πρόγραμμα και τους κύκλους αναφοράς του στη συσκευή σας. Οι δικοί σας καταγεγραμμένοι κύκλοι και στατιστικά δεν επηρεάζονται.", - "store_share_device_intro": "Ανεβάστε {brand} {model} με τους κύκλους αναφοράς που επιλέγετε. Άλλοι με την ίδια συσκευή μπορούν να υιοθετήσουν τα προγράμματά σας. Οι καταχωρίσεις ελέγχονται πριν εμφανιστούν δημόσια.", - "share_profile_no_cycles": "Δεν υπάρχουν κύκλοι αναφοράς -- επισημάνετε έναν κύκλο ως ⭐ στην καρτέλα Κύκλοι για να συμπεριλάβετε αυτό το προφίλ", - "advisory_phase_inconsistent": "Το '{name}' φαίνεται να αναμειγνύει διαφορετικά προγράμματα ή θερμοκρασίες - οι κύκλοι του θερμαίνονται για πολύ διαφορετικά χρονικά διαστήματα. Ο διαχωρισμός του σε ξεχωριστά προφίλ (π.χ. ανά θερμοκρασία) θα βελτιώσει την αντιστοίχιση και τις εκτιμήσεις χρόνου.", - "advisory_phase_inconsistent_title": "⚠ Πιθανώς μεικτά προγράμματα", - "export_select_intro": "Τσεκάρετε ακριβώς τι θα συμπεριληφθεί. Η επιλογή προφίλ χωρίς τους κύκλους τους εξάγει και πάλι ένα αναγνωρίσιμο πρόγραμμα (η μαθημένη του καμπύλη μεταφέρεται μαζί).", - "import_analyze_hint": "Φορτώστε ένα εξαγόμενο αρχείο (ή επικολλήστε το JSON του). Το WashData το αναλύει και δείχνει ακριβώς τι μπορεί να εισαχθεί πριν αλλάξει οτιδήποτε.", - "analyzing": "Ανάλυση…", - "device_type_mismatch_warn": "Αυτή η εξαγωγή προέρχεται από διαφορετικό τύπο συσκευής ({src} έναντι {local}). Τα προγράμματα και οι κύκλοι μπορούν και πάλι να εισαχθούν ως δεδομένα αναφοράς, αλλά οι ρυθμίσεις που αφορούν τη συσκευή και η εισαγωγή πραγματικού ιστορικού είναι απενεργοποιημένες.", - "merge_hint": "Τα εισαγόμενα στοιχεία προστίθενται και τίποτα τοπικό δεν χάνεται. Οι συγκρούσεις ονομάτων επιλύονται παρακάτω.", - "replace_warn": "Κάθε επιλεγμένη κατηγορία διαγράφεται και αντικαθίσταται από το αρχείο. Οι μη επιλεγμένες κατηγορίες παραμένουν ανέπαφες.", - "dest_reference_hint": "Οι εισαγόμενοι κύκλοι βελτιώνουν μόνο την αναγνώριση προγράμματος και δεν επηρεάζουν ποτέ τα στατιστικά χρήσης/ενέργειας.", - "dest_real_history_hint": "Οι εισαγόμενοι κύκλοι υπολογίζονται ως ιστορικό της ίδιας της συσκευής και τροφοδοτούν τα στατιστικά ενέργειας/χρήσης. Χρησιμοποιήστε το για τη μεταφορά μιας συσκευής σε νέα εγκατάσταση." - }, - "phase_desc": { - "anti_crease": "Περιστασιακά σύντομες ανατροπές μετά την ολοκλήρωση για μείωση των ρυτίδων.", - "anti_wrinkle": "Περιοδική αναδίπλωση μετά τον κύκλο για μείωση των ρυτίδων.", - "cool_down": "Ανατροπή χωρίς θερμότητα κοντά στο τέλος του κύκλου.", - "drain_and_switch": "Μεταβατική περίοδος από τη λειτουργία πλύσης στη λειτουργία στεγνώματος.", - "dry": "Στάδιο στεγνώματος με χρήση θερμαντήρα ή/και υπολειπόμενης θερμότητας.", - "drying": "Κύρια θερμαινόμενη περίοδος ανατροπής.", - "heat_up": "Η αρχική προθέρμανση του θερμαντήρα πριν ξεκινήσει το πλήρες στέγνωμα.", - "pre_rinse": "Αρχικό ψεκασμό πριν από την πλύση με απορρυπαντικό.", - "pre_wash": "Αρχικό εμποτισμό ή προεπεξεργασία πριν από την κύρια πλύση.", - "rinse": "Στάδιο έκπλυσης με καθαρό νερό. Αυτή η φάση μπορεί να επαναληφθεί πολλές φορές.", - "sanitize": "Στάδιο καθαρισμού υψηλής θερμοκρασίας για προγράμματα απολύμανσης.", - "sensor_check": "Σύντομη παύση χαμηλής ισχύος ενώ μετράται η ξηρότητα.", - "soak": "Περίοδος εμποτισμού χαμηλής δραστηριότητας μεταξύ των ενεργών σταδίων πλύσης.", - "soak_dw": "Εκτεταμένη περίοδος εμποτισμού για βαρύ χώμα.", - "spin": "Εξαγωγή υψηλής ταχύτητας για αφαίρεση νερού από το φορτίο.", - "spin_wd": "Εκχύλιση υψηλής ταχύτητας μετάβαση πριν από την ξήρανση.", - "wash": "Κύριος κύκλος πλύσης με κίνηση τυμπάνου και προαιρετική θέρμανση.", - "wash_dw": "Κύριο πλύσιμο με απορρυπαντικό με θέρμανση." - }, - "placeholder": { - "add": "προσθήκη…", - "group_name": "π.χ. Βαμβάκι 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "προσθήκη υπηρεσίας ειδοποίησης…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "προσθήκη ατόμου…", - "phase_name": "π.χ. Προπλύσιμο", - "profile_name": "π.χ. Βαμβάκι 40°C", - "maintenance_notes": "π.χ. αντικατάσταση φίλτρου, καθαρισμός λάστιχου πόρτας", - "store_brand": "π.χ. Bosch", - "store_model": "π.χ. WAT28401" - }, - "pref": { - "date_absolute": "Απόλυτο (π.χ. 14:32 στις 2 Ιουλίου)", - "date_relative": "Συγγενής (π.χ. πριν από 2 ώρες)", - "lang_auto": "Προεπιλογή συστήματος ({lang})", - "lang_en": "Αγγλικά", - "use_panel_default": "(προεπιλογή πίνακα)" - }, - "quality": { - "bad": "Κακός", - "good": "Καλός", - "unusable": "Αχρησιμοποίητο" - }, - "section": { - "anti_wrinkle": { - "intro": "Η λειτουργία κατά τσακίσματος εντοπίζει παλμούς χαμηλής ισχύος τύμβου μετά την κύρια φάση και τους διατηρεί συνδεδεμένους με τον ολοκληρωμένο κύκλο.", - "label": "Αντί-τσάκισμα" - }, - "basic": { - "intro": "Βασική ταυτότητα και τα απαραίτητα στοιχεία που χρειάζονται οι περισσότερες διαμορφώσεις.", - "label": "Βασικά" - }, - "delay": { - "intro": "Η ανίχνευση καθυστερημένης εκκίνησης αναγνωρίζει πότε μια συσκευή είναι ενεργοποιημένη αλλά δεν έχει ακόμα ξεκινήσει τον κύκλο της.", - "label": "Καθυστερημένη Εκκίνηση" - }, - "detection": { - "intro": "Πώς εντοπίζεται ένας κύκλος ως έναρξη, λειτουργία και ολοκλήρωση.", - "label": "Ανίχνευση" - }, - "matching": { - "intro": "Πώς οι ολοκληρωμένοι κύκλοι αντιστοιχίζονται σε μαθημένα προφίλ και επισημαίνονται.", - "label": "Αντιστοίχιση" - }, - "ml_training": { - "intro": "Πρόγραμμα επανεκπαίδευσης μηχανικής μάθησης στη συσκευή και ρυθμίσεις δεδομένων.", - "label": "Εκπαίδευση ML" - }, - "notifications": { - "intro": "Πότε και πώς λαμβάνετε ειδοποιήσεις για συμβάντα κύκλου.", - "label": "Ειδοποιήσεις" - }, - "timing": { - "intro": "Ρυθμός παρασκηνίου, το watchdog εκτός σύνδεσης και η συντήρηση.", - "label": "Χρονισμός & Watchdog" - }, - "triggers": { - "intro": "Προαιρετικά εξωτερικά σήματα: ενεργοποιητής τέλους, αισθητήρας πόρτας, διακόπτης παύσης και υπενθύμιση αποφόρτωσης.", - "label": "Ενεργοποιητές & Πόρτες" - }, - "phase_eta": { - "label": "Υπολειπόμενος Χρόνος", - "intro": "Υπολειπόμενος χρόνος με επίγνωση φάσεων, για μηχανές των οποίων η διάρκεια κύκλου εξαρτάται από τη θερμοκρασία ή το στύψιμο." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "Αναγνωρίστε τους σύντομους παλμούς χαμηλής ισχύος που εκπέμπει ένα στεγνωτήριο μετά την κύρια φάση θερμότητας και κρατήστε τους συνδεδεμένους στον τελικό κύκλο αντί να τους διαβάζετε ως νέους κύκλους.", - "label": "Ενεργοποίηση Ανίχνευσης Κατά Τσακίσματος" - }, - "anti_wrinkle_exit_power": { - "doc": "Η ισχύς πρέπει να πέσει κάτω από αυτό μεταξύ των παλμών για να παραμείνει ενεργή η λειτουργία κατά των ρυτίδων.", - "label": "Κατώφλι Ισχύος Εξόδου" - }, - "anti_wrinkle_idle_timeout": { - "label": "Μέγιστο Κενό Παλμών", - "doc": "Πόση ώρα μπορεί να παραμείνει ήσυχη η συσκευή ανάμεσα σε δύο παλμούς ανατροπής προτού λήξει η λειτουργία κατά τσακίσματος. Ορίστε το πάνω από το μεγαλύτερο κενό που αφήνει το στεγνωτήριό σας ανάμεσα στους παλμούς, αλλιώς κάθε επόμενος παλμός διαβάζεται ως εσφαλμένη εκκίνηση." - }, - "anti_wrinkle_max_duration": { - "doc": "Οι παλμοί που είναι μεγαλύτεροι από αυτό αντιμετωπίζονται ως πραγματικός κύκλος και όχι ως αντιρυτιδικό περιτύλιγμα.", - "label": "Μέγιστη Διάρκεια" - }, - "anti_wrinkle_max_power": { - "doc": "Ένας παλμός πάνω από αυτήν την ισχύ αντιμετωπίζεται ως ένας πραγματικός νέος κύκλος, όχι ως αντιρυτιδικό κύμα. Ρυθμίστε ακριβώς πάνω από την ισχύ του παλμού ανατροπής.", - "label": "Μέγιστη Ισχύς Κατά Τσακίσματος" - }, - "auto_label_confidence": { - "doc": "Εάν το σκορ του αγώνα στο τέλος του κύκλου είναι στο ή πάνω από αυτό, το πρόγραμμα επισημαίνεται αυτόματα χωρίς καμία προτροπή επιβεβαίωσης. Αυξήστε το ώστε να απαιτείται υψηλότερη βεβαιότητα πριν από την αυτόματη επισήμανση. χαμηλώστε το για να αυτοματοποιήσετε περισσότερο. Λειτουργεί σε συνδυασμό με το Learning Confidence κάτω από αυτό.", - "label": "Εμπιστοσύνη Αυτόματης Επισήμανσης" - }, - "auto_maintenance": { - "doc": "Εκτελέστε νυχτερινή καθαριότητα: ανακατασκευάστε φακέλους προφίλ, υπολογίστε ξανά την υγεία του κύκλου, κλαδέψτε τα ίχνη εντοπισμού σφαλμάτων και διατηρήστε τους πιο πρόσφατους κύκλους.", - "label": "Αυτόματη Συντήρηση (νυχτερινός καθαρισμός)" - }, - "completion_min_seconds": { - "doc": "Κύκλοι μικρότεροι από αυτό απορρίπτονται ως κύκλοι φάντασμα (δοκιμαστικές διαδρομές, άνοιγμα της πόρτας για προσθήκη κάλτσας).", - "label": "Ελάχιστη Διάρκεια Κύκλου" - }, - "delay_confirm_seconds": { - "doc": "Η τροφοδοσία πρέπει να παραμείνει στη ζώνη αναμονής για τόσο μεγάλο χρονικό διάστημα, προτού η συσκευή αντιμετωπιστεί ως αναμονή για την εκκίνηση αντί να λειτουργεί.", - "label": "Δευτερόλεπτα Επιβεβαίωσης" - }, - "delay_start_detect_enabled": { - "doc": "Ανιχνεύστε πότε η συσκευή είναι ενεργοποιημένη και περιμένει (καθυστερημένη εκκίνηση / αναμονή) αλλά δεν έχει ξεκινήσει τον κύκλο της, επομένως η σχεδίαση αναμονής δεν θεωρείται λανθασμένα με κύκλο λειτουργίας.", - "label": "Ενεργοποίηση Ανίχνευσης Καθυστερημένης Εκκίνησης" - }, - "delay_timeout_hours": { - "doc": "Σταματήστε την αναμονή στη λειτουργία καθυστερημένης εκκίνησης μετά από τόσες ώρες και επιστρέψτε στο ρελαντί, έτσι ώστε ένα μηχάνημα να μένει τροφοδοτημένο αλλά να μην ξεκινά ποτέ, να μην περιμένει για πάντα.", - "label": "Ώρες Λήξης Χρόνου" - }, - "device_type": { - "doc": "Κατηγορία συσκευών. Ορίζει λογικές προεπιλογές ανίχνευσης (οριακά όρια, μη καθυστέρηση, τερματισμός χειρισμού) προσαρμοσμένες για αυτόν τον τύπο συσκευής. αλλάξτε το μόνο εάν η συσκευή είχε ρυθμιστεί αρχικά ως λάθος τύπος.", - "label": "Τύπος Συσκευής" - }, - "door_sensor_entity": { - "doc": "Προαιρετικός δυαδικός αισθητήρας πόρτας. Χρησιμοποιείται για τον εντοπισμό πότε η συσκευή έχει ανοίξει/εκφορτωθεί μετά από έναν κύκλο.", - "label": "Οντότητα Αισθητήρα Πόρτας" - }, - "duration_tolerance": { - "doc": "Ανοχή για εκτιμήσεις που απομένει (ανατροφοδότηση μάθησης, μη αντιστοίχιση). Εάν η πραγματική διάρκεια είναι εντός +/-X% της εκτίμησης, λογίζεται ως καλή αντιστοίχιση.", - "label": "Ανοχή Εκτίμησης" - }, - "enable_ml_models": { - "doc": "Ενώ εκτελείται ένας κύκλος, αφήστε τα μοντέλα να βελτιώσουν τα ζωντανά αποτελέσματα: μια πιο σταθερή εκτίμηση υπολειπόμενου χρόνου και ενέργειας/κόστους και ένα προστατευτικό κατά της πρόωρης διακοπής κατά την ανίχνευση τέλους (μπορεί μόνο να καθυστερήσει ένα φινίρισμα, να μην τελειώσει ποτέ νωρίτερα και να περιοριστεί). Χρησιμοποιεί τα βελτιωμένα μοντέλα σας όταν είναι διαθέσιμα, διαφορετικά τα ενσωματωμένα. Off = μόνο η κλασική λογική που βασίζεται στην εξουσία (ακόμα αξιόπιστη).", - "label": "Εφαρμογή έξυπνων μοντέλων κατά τη διάρκεια κύκλου" - }, - "end_energy_threshold": { - "doc": "Κατά τη διάρκεια της αντίστροφης μέτρησης εκτός καθυστέρησης, η συσσωρευμένη ενέργεια (βατ x χρόνο) συγκρίνεται με αυτό το όριο. Σε περίπτωση υπέρβασης, η αντίστροφη μέτρηση επαναφέρεται - διατηρώντας τα αντιτσαλάκια και τις ουρές στεγνώματος στο πλυντήριο πιάτων συνδεδεμένα στον κύκλο αντί να τα κόβετε σύντομα. Αυξήστε το εάν οι κύκλοι τελειώνουν πολύ νωρίς κατά τη διάρκεια της ψύξης. χαμηλώστε το εάν η ανίχνευση είναι αργή.", - "label": "Ενέργεια Λήξης" - }, - "end_repeat_count": { - "doc": "Αριθμός διαδοχικών μετρήσεων κάτω από το όριο τερματισμού που απαιτούνται πριν από το τέλος του κύκλου. Το 1 είναι καλό για τα περισσότερα βύσματα. Αυξήστε στο 2-3 εάν το έξυπνο βύσμα σας αναφέρει περιστασιακά ένα δείγμα ψευδούς μηδενισμού στο μέσο του κύκλου και οι κύκλοι σας τελειώνουν πρόωρα.", - "label": "Πλήθος Επαναλήψεων Λήξης" - }, - "energy_price_entity": { - "doc": "Αισθητήρας με την τρέχουσα τιμή ηλεκτρικής ενέργειας ανά kWh (π.χ. ένα δυναμικό τιμολόγιο). Προηγείται της στατικής τιμής παρακάτω. Κάθε κύκλος παγώνει την τιμή που ισχύει όταν τελειώσει.", - "label": "Οντότητα Τιμής Ενέργειας" - }, - "energy_price_static": { - "doc": "Σταθερή τιμή ανά kWh που χρησιμοποιείται για τα στοιχεία κόστους όταν δεν έχει οριστεί παραπάνω οντότητα ζωντανής τιμής.", - "label": "Στατική Τιμή Ενέργειας (ανά kWh)" - }, - "energy_sensor": { - "doc": "Προαιρετικός αθροιστικός μετρητής ενέργειας (total_increasing kWh/Wh, π.χ. ο ίδιος ο μετρητής συνολικής κατανάλωσης της πρίζας). Όταν οριστεί, η αναφερόμενη ενέργεια κάθε κύκλου λαμβάνεται από τη διαφορά αυτού του μετρητή από την αρχή έως το τέλος, γεγονός που αποφεύγει την υποκαταμέτρηση που προκύπτει από την ολοκλήρωση ενός αισθητήρα ισχύος που αναφέρει αργά. Επανέρχεται στην ολοκληρωμένη τιμή αν η ένδειξη λείπει, η μονάδα της είναι άγνωστη ή η διαφορά δεν είναι θετική. Αφήστε το κενό για να συνεχιστεί η ολοκλήρωση του αισθητήρα ισχύος.", - "label": "Οντότητα Μετρητή Ενέργειας" - }, - "expose_debug_entities": { - "doc": "Δημοσιεύστε επιπλέον διαγνωστικές οντότητες HA (εμπιστοσύνη αντιστοίχισης, ασάφεια, εσωτερικά στοιχεία κατάστασης). Το Off διατηρεί τη λίστα οντοτήτων καθαρή για κανονική χρήση.", - "label": "Εμφάνιση Οντοτήτων Αποσφαλμάτωσης" - }, - "external_end_trigger": { - "doc": "Δυαδικός αισθητήρας του οποίου η αλλαγή κατάστασης σηματοδοτεί το τέλος του κύκλου (π.χ. μια επαφή \"τελειωμένη\" συσκευής ή μια συνοδευτική ενσωμάτωση).", - "label": "Οντότητα Εξωτερικού Ενεργοποιητή" - }, - "external_end_trigger_enabled": { - "doc": "Αφήστε έναν εξωτερικό δυαδικό αισθητήρα να σηματοδοτήσει το τέλος ενός κύκλου, επιπλέον της ενσωματωμένης ανίχνευσης που βασίζεται σε ενέργεια.", - "label": "Ενεργοποίηση Εξωτερικού Ενεργοποιητή Λήξης" - }, - "external_end_trigger_inverted": { - "doc": "Αντιμετωπίστε το κλείσιμο του αισθητήρα σκανδάλης στο OFF (αντί στο ON) ως σήμα τέλους κύκλου.", - "label": "Αντιστροφή Εξωτερικού Ενεργοποιητή (ενεργοποίηση στο ΑΠΕΝΕΡΓΟ)" - }, - "learning_confidence": { - "doc": "Εάν το σκορ αντιστοίχισης πέσει μεταξύ αυτού και του Auto-Label Confidence, μια ειδοποίηση σχολίων σας ζητά να επαληθεύσετε το αναγνωρισμένο πρόγραμμα. Κάτω από αυτό το σκορ ο αγώνας είναι πολύ αβέβαιος για να βγει στην επιφάνεια. Πρέπει να διατηρείται κάτω από την αυτοπεποίθηση ετικέτας.", - "label": "Εμπιστοσύνη Μάθησης" - }, - "linked_device": { - "doc": "Προαιρετικά, τοποθετήστε αυτή τη συσκευή WashData κάτω από μια άλλη συσκευή (π.χ. το έξυπνο βύσμα) στο μητρώο συσκευών HA, που εμφανίζεται ως \"Σύνδεση μέσω ...\".", - "label": "Ομαδοποίηση κάτω από Συσκευή" - }, - "min_off_gap": { - "doc": "Εάν το μηχάνημα απενεργοποιηθεί για λιγότερο από αυτό το διάστημα, η σειρά ενεργοποίησης/απενεργοποίησης/ενεργοποίησης αντιμετωπίζεται ως ένας συνεχής κύκλος. Αποτρέπει τον διαχωρισμό των προγραμμάτων εμποτισμού (το μηχάνημα απενεργοποιείται για αρκετά λεπτά κατά τη διάρκεια της πλύσης) σε δύο ξεχωριστούς κύκλους. Ρυθμίστε το μικρότερο από το κενό μεταξύ των φορτίων σας πίσω με πλάτη, εάν θέλετε να υπολογίζονται ως ξεχωριστοί κύκλοι. Οι προεπιλογές τύπου συσκευής προστατεύουν την τυπική παύση εντός του κύκλου για κάθε συσκευή.", - "label": "Ελάχιστο Κενό Απενεργοποίησης" - }, - "min_power": { - "doc": "Η απόλυτη ελάχιστη ισχύς θεωρείται ενεργή. Οι ενδείξεις κάτω από αυτό αντιμετωπίζονται ως 0 W (αναμονή), φιλτράροντας το φανταστικό φορτίο των έξυπνων βυσμάτων και των LED αναμονής.", - "label": "Ελάχιστη Ισχύς" - }, - "ml_training_enabled": { - "doc": "Μελετήστε περιοδικά τους κύκλους που έχετε εξετάσει κατά τη διάρκεια της νύχτας και προσαρμόστε τα μοντέλα σε αυτό το συγκεκριμένο μηχάνημα. Μια αλλαγή διατηρείται μόνο όταν έχει πραγματικά καλύτερη βαθμολογία σε κύκλους που δεν μένουν, οπότε αυτό μπορεί μόνο να βοηθήσει ή να παραμείνει το ίδιο - ποτέ μην υποχωρήσει.", - "label": "Μάθηση από αυτή τη συσκευή" - }, - "ml_training_hour": { - "doc": "Τοπική ώρα της ημέρας (0-23) για να κάνετε την ολονύκτια λεπτομέρεια. Επιλέξτε μια ώρα ησυχίας, όπως 2 (02:00).", - "label": "Μάθηση την ώρα" - }, - "ml_training_interval_days": { - "doc": "Ελέγξτε ξανά για βελτιώσεις το πολύ μία φορά ανά τόσες μέρες.", - "label": "Έλεγχος το πολύ κάθε" - }, - "ml_training_min_cycles": { - "doc": "Περιμένετε έως ότου έχουν καταγραφεί τουλάχιστον τόσοι πολλοί κύκλοι πριν από τη λεπτομέρεια, οπότε υπάρχουν αρκετά για να μάθετε από αυτά.", - "label": "Κύκλοι που χρειάζονται πρώτα" - }, - "name": { - "doc": "Εμφανιζόμενο όνομα που εμφανίζεται στη λίστα ενσωματώσεων HA και στο μητρώο συσκευών.", - "label": "Όνομα Συσκευής" - }, - "no_update_active_timeout": { - "doc": "Εάν δεν υπάρχουν ενημερώσεις τροφοδοσίας για τόσο μεγάλο χρονικό διάστημα κατά τη λειτουργία, υποθέστε ότι το βύσμα έπεσε εκτός σύνδεσης και διακόψτε αναγκαστικά για να αποφύγετε έναν κύκλο ζόμπι. Τα προεπιλεγμένα 600 s επιτρέπουν υστέρηση σε σύννεφο ή πλέγμα.", - "label": "Λήξη Χρόνου Χωρίς Ενημέρωση" - }, - "notify_before_end_minutes": { - "doc": "Στείλτε μια ειδοποίηση Σχεδόν τελειωμένο όταν ο εκτιμώμενος χρόνος που απομένει πέσει κάτω από αυτό. 0 το απενεργοποιεί.", - "label": "Προειδοποίηση Πριν το Τέλος" - }, - "notify_channel": { - "doc": "Όνομα καναλιού ειδοποιήσεων Android για έναρξη/ζωντανά μηνύματα (ελέγχει τον ήχο και την προτεραιότητα ανά κανάλι στην εφαρμογή για κινητά). Το Blank χρησιμοποιεί την προεπιλογή της συνοδευτικής εφαρμογής.", - "label": "Κανάλι Android (εκκίνηση/ζωντανά)" - }, - "notify_cycle_timers": { - "doc": "Ειδοποιήσεις σε συγκεκριμένα λεπτά σε έναν κύκλο (π.χ. για προσθήκη μαλακτικού). Το μήνυμα υποστηρίζει {device}, {program}, {minutes}. Ενεργοποιήστε την αυτόματη παύση για παύση σε αυτό το σημείο και λάβετε μια διαδραστική ειδοποίηση με ένα κουμπί Συνέχιση. συνέχιση μέσω του πίνακα, της υπηρεσίας παύσης/συνέχισης ή της ενέργειας ειδοποίησης.", - "label": "Χρονόμετρα Κύκλου" - }, - "notify_finish_channel": { - "doc": "Όνομα καναλιού ειδοποιήσεων Android για το μήνυμα τερματισμού. Το Blank επαναχρησιμοποιεί το κανάλι έναρξης/ζωντανού.", - "label": "Κανάλι Android (λήξη)" - }, - "notify_finish_message": { - "doc": "Κείμενο που αποστέλλεται όταν ολοκληρώνεται ένας κύκλος. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. Τα {time_finished} και {vs_typical} είναι τα πιο χρήσιμα εδώ.", - "label": "Μήνυμα Λήξης" - }, - "notify_finish_services": { - "doc": "ειδοποιήστε.* οι υπηρεσίες καλούνται όταν τελειώσει ένας κύκλος. Προσθέστε ένα ανά στόχο. αφήστε κενό για καμία ειδοποίηση τερματισμού.", - "label": "Υπηρεσίες Λήξης" - }, - "notify_fire_events": { - "doc": "Επίσης ενεργοποιήστε τα γεγονότα ha_washdata_* κατά την έναρξη/τέρμα του κύκλου, ώστε να μπορείτε να δημιουργήσετε τους δικούς σας αυτοματισμούς.", - "label": "Ενεργοποίηση Συμβάντων HA για Ειδοποιήσεις" - }, - "notify_icon": { - "doc": "Προαιρετικό εικονίδιο mdi για την ειδοποίηση (π.χ. mdi:πλυντήριο). Αφήστε κενό για την προεπιλογή της πλατφόρμας.", - "label": "Εικονίδιο Ειδοποίησης" - }, - "notify_live_chronometer": { - "doc": "Εμφάνιση ενός χρονοδιακόπτη αντίστροφης μέτρησης ζωντανής ενημέρωσης στην ειδοποίηση (σε πλατφόρμες που το υποστηρίζουν) αντί για στατική εκτίμηση.", - "label": "Χρήση Ζωντανού Χρονόμετρου" - }, - "notify_live_interval_seconds": { - "doc": "Πόσο συχνά ανανεώνονται οι ειδοποιήσεις ζωντανής προόδου ενώ εκτελείται ένας κύκλος.", - "label": "Διάστημα Ζωντανής Ενημέρωσης" - }, - "notify_live_overrun_percent": { - "doc": "Εάν ένας κύκλος ξεπεράσει την εκτίμησή του κατά περισσότερο από αυτό το ποσοστό, στείλτε μια ειδοποίηση υπέρβασης.", - "label": "% Υπέρβαση Ζωντανά Πριν την Ειδοποίηση" - }, - "notify_live_services": { - "doc": "ειδοποίηση.* οι υπηρεσίες ζητούν ζωντανές ενημερώσεις προόδου ενώ εκτελείται ένας κύκλος. Αφήστε το κενό για να απενεργοποιήσετε τις ειδοποιήσεις ζωντανής προόδου.", - "label": "Υπηρεσίες Ζωντανής Προόδου" - }, - "notify_only_when_home": { - "doc": "Στείλτε ειδοποιήσεις μόνο όταν τουλάχιστον ένα από τα συνδεδεμένα άτομα (παραπάνω) είναι στο σπίτι.", - "label": "Ειδοποίηση Μόνο Όταν Είμαι Σπίτι" - }, - "notify_people": { - "doc": "πρόσωπο.* οντότητες που χρησιμοποιούνται από το \"Notify Only When Home\" για να αποφασίσουν εάν κάποιος είναι στο σπίτι.", - "label": "Άτομα (για Μόνο Όταν Είμαι Σπίτι)" - }, - "notify_pre_complete_message": { - "doc": "Κείμενο της ειδοποίησης πριν το τέλος / σχεδόν έτοιμο. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Μήνυμα Προ-Ολοκλήρωσης" - }, - "notify_reminder_message": { - "doc": "Κείμενο της υπενθύμισης για εκκρεμή εκφόρτωση. Το κενό χρησιμοποιεί την ενσωματωμένη προεπιλογή. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Μήνυμα Υπενθύμισης" - }, - "notify_start_message": { - "doc": "Κείμενο που αποστέλλεται όταν ξεκινά ένας κύκλος. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Μήνυμα Εκκίνησης" - }, - "notify_start_services": { - "doc": "ειδοποιήστε.* οι υπηρεσίες καλούνται όταν ξεκινά ένας κύκλος. Προσθέστε ένα ανά στόχο (τηλέφωνο, πίνακα ελέγχου κ.λπ.). αφήστε κενό για ειδοποίηση μη έναρξης.", - "label": "Υπηρεσίες Εκκίνησης" - }, - "notify_timeout_seconds": { - "doc": "Αυτόματη απόρριψη της ειδοποίησης μετά από τόσα δευτερόλεπτα (σε πλατφόρμες που την υποστηρίζουν). Το 0 το διατηρεί μέχρι να απορριφθεί χειροκίνητα.", - "label": "Αυτόματη Απόρριψη Μετά από" - }, - "notify_title": { - "doc": "Τίτλος ειδοποίησης. Μεταβλητές προτύπου: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "Τίτλος Ειδοποίησης" - }, - "notify_unload_delay_minutes": { - "doc": "Λίγα λεπτά μετά τη λήξη ενός κύκλου προτού στείλετε την υπενθύμιση \"ξεφόρτωση του μηχανήματος\" σε αναμονή. Ορίστε το 0 για να απενεργοποιήσετε την υπενθύμιση.", - "label": "Καθυστέρηση Υπενθύμισης Αποφόρτωσης" - }, - "off_delay": { - "doc": "Χρόνος αναμονής μετά την πτώση του ρεύματος πριν δηλώσετε ότι ο κύκλος έχει ολοκληρωθεί. Εάν επανέλθει η τροφοδοσία σε αυτό το παράθυρο, ο κύκλος συνεχίζεται απρόσκοπτα - αυτό γεφυρώνει τις παύσεις μεταξύ των σταδίων πλύσης. Τα πλυντήρια πιάτων έχουν μεγάλες φάσεις στεγνώματος (απενεργοποίηση για 20-60 λεπτά), επομένως η καθυστέρηση εκτός λειτουργίας πρέπει να υπερβαίνει αυτήν για να διατηρηθεί ολόκληρο το πλύσιμο+στεγνό σε έναν κύκλο.", - "label": "Καθυστέρηση Απενεργοποίησης" - }, - "pause_cuts_power": { - "doc": "Όταν ένας κύκλος τίθεται σε παύση, απενεργοποιήστε επίσης την οντότητα διακόπτη παρακάτω. Μόνο για συσκευές των οποίων το βύσμα μπορεί να κοπεί με ασφάλεια στη μέση του κύκλου.", - "label": "Η Παύση Διακόπτει Επίσης Ρεύμα (μέσω διακόπτη)" - }, - "power_off_delay": { - "doc": "Για πόσο χρόνο πρέπει να παραμείνει η ισχύς κάτω από το Κατώφλι Απενεργοποίησης μετά την ολοκλήρωση ενός κύκλου, προτού η κατάσταση επιστρέψει σε Ανενεργό. Χρησιμοποιείται μόνο όταν το Κατώφλι Απενεργοποίησης είναι πάνω από 0. Ελέγχεται στον ρυθμό του παρασκηνίου, οπότε η πραγματική καθυστέρηση στρογγυλοποιείται προς τα πάνω στον επόμενο κύκλο λήξης κατάστασης.", - "label": "Καθυστέρηση Απενεργοποίησης" - }, - "power_off_threshold_w": { - "doc": "Προαιρετική ανίχνευση κατάστασης Ανενεργό με βάση την ισχύ. Όταν είναι πάνω από 0, μόλις ολοκληρωθεί ένας κύκλος και η ισχύς παραμείνει κάτω από αυτό το επίπεδο για το διάστημα της Καθυστέρησης Απενεργοποίησης, η συσκευή θεωρείται ότι έχει σβήσει και η κατάσταση επιστρέφει σε Ανενεργό. Αφήστε το στο 0 για απενεργοποίηση (προεπιλογή). Ορίστε το πάνω από το πραγματικό κατώτατο όριο σβησμένης συσκευής και κάτω από το Κατώφλι Τερματισμού και την κατανάλωση αναμονής της συσκευής σας όταν είναι ολοκληρωμένη αλλά ακόμη αναμμένη· αν δεν είναι κάτω από το Κατώφλι Τερματισμού, αγνοείται. Όταν είναι ενεργό, αντικαθιστά την Καθυστέρηση Επαναφοράς Προόδου για την επιστροφή σε Ανενεργό, ώστε μια ολοκληρωμένη συσκευή να παραμένει σε Ολοκληρώθηκε/Καθαρός μέχρι να σβήσει πραγματικά.", - "label": "Κατώφλι Απενεργοποίησης" - }, - "power_sensor": { - "doc": "Η οντότητα αισθητήρα που αναφέρει την ενεργή ισχύ σε watt για αυτήν τη συσκευή (π.χ. sensor.washer_power). Η ανίχνευση όλων των κύκλων βασίζεται σε αυτό το σήμα.", - "label": "Αισθητήρας Ισχύος" - }, - "profile_duration_tolerance": { - "doc": "Η ζώνη +/- γύρω από μια μέση διάρκεια προφίλ που χρησιμοποιείται κατά την αντιστοίχιση. 0,25 σημαίνει ότι ένα προφίλ 60 λεπτών ταιριάζει με κύκλους 45-75 λεπτών.", - "label": "Ανοχή Διάρκειας Προφίλ" - }, - "profile_match_interval": { - "doc": "Πόσο συχνά επιχειρείτε αντιστοίχιση προφίλ κατά τη διάρκεια ενός κύκλου τρεξίματος. Τα προεπιλεγμένα 300 δευτερόλεπτα (5 λεπτά) εξισορροπούν την ταχύτητα ανίχνευσης και τη CPU.", - "label": "Διάστημα Αντιστοίχισης" - }, - "profile_match_max_duration_ratio": { - "doc": "Μέγιστο μήκος κύκλου σε σχέση με το προφίλ. 1.3 σημαίνει ότι ένας κύκλος πρέπει να είναι κάτω από το 130% της διάρκειας του προφίλ για να ταιριάζει.", - "label": "Μέγιστη Αναλογία Διάρκειας" - }, - "profile_match_min_duration_ratio": { - "doc": "Ελάχιστη διάρκεια κύκλου σε σχέση με το προφίλ. 0,9 σημαίνει ότι ένας κύκλος πρέπει να είναι τουλάχιστον το 90% της διάρκειας του προφίλ για να ταιριάζει.", - "label": "Ελάχιστη Αναλογία Διάρκειας" - }, - "profile_match_threshold": { - "doc": "Απαιτείται ελάχιστος βαθμός ομοιότητας (0-1) στο τέλος του κύκλου για την αποδοχή μιας αναγνώρισης προγράμματος. Αυξήστε το για να μειώσετε τις λανθασμένες ταυτοποιήσεις. χαμηλώστε το εάν τα προγράμματα του μηχανήματός σας δεν ταιριάζουν. Το προεπιλεγμένο 0,4 είναι ένα συντηρητικό σημείο εκκίνησης.", - "label": "Κατώφλι Αντιστοίχισης" - }, - "profile_unmatch_threshold": { - "doc": "Εάν ένας ζωντανός αγώνας στα μέσα του κύκλου πέσει κάτω από αυτό το σκορ, η δοκιμαστική αναγνώριση διαγράφεται. Διατηρήστε το λίγο κάτω από το όριο αντιστοίχισης, ώστε μια σύντομη πτώση στην ομοιότητα να μην επαναφέρει την οθόνη σε απαράμιλλη.", - "label": "Κατώφλι Μη-Αντιστοίχισης" - }, - "progress_reset_delay": { - "doc": "Μετά την ολοκλήρωση, κρατήστε την πρόοδο στο 100% για τόσο μεγάλο χρονικό διάστημα, ώστε το Ολοκληρώθηκε να είναι ορατό στους πίνακες εργαλείων πριν επαναφέρετε την κατάσταση αδράνειας.", - "label": "Καθυστέρηση Επαναφοράς Προόδου" - }, - "pump_stuck_duration": { - "doc": "Δευτερόλεπτα μια αντλία μπορεί να λειτουργεί συνεχώς πριν επισημανθεί ως πιθανώς κολλημένη (πυρίζει το συμβάν κολλημένης αντλίας).", - "label": "Διάρκεια Κολλημένης Αντλίας" - }, - "running_dead_zone": { - "doc": "Μετά την έναρξη ενός κύκλου, οι μειώσεις ισχύος σε αυτό το παράθυρο αγνοούνται. Τα πλυντήρια γεμίζουν με κρύο νερό (πέφτει κοντά στα 0 W πριν από τη θέρμανση) - χωρίς αυτή την προστασία, η φάση πλήρωσης μοιάζει με ένα τέλος κύκλου. Αυτό ΔΕΝ παρακάμπτει δεδομένα: το πλήρες ίχνος ισχύος καταγράφεται από το T=0. Η μηχανή προτάσεων μετρά το πραγματικό μοτίβο εκκίνησης του μηχανήματός σας και το μετράει αυτόματα.", - "label": "Νεκρή Ζώνη Λειτουργίας" - }, - "sampling_interval": { - "doc": "Αναμενόμενος χρόνος μεταξύ των μετρήσεων του αισθητήρα - χρησιμοποιείται για το μέγεθος του παραθύρου εξομάλυνσης και τη σωστή έναρξη της αναπήδησης. Κάθε ενημέρωση αισθητήρα καταγράφεται ανεξάρτητα από αυτήν την τιμή. βαθμονομεί μόνο τους κατάντη υπολογισμούς. Η μηχανή προτάσεων μετρά τον πραγματικό ρυθμό του αισθητήρα σας από προηγούμενους κύκλους και το ρυθμίζει αυτόματα.", - "label": "Διάστημα Δειγματοληψίας" - }, - "save_debug_traces": { - "doc": "Αποθηκεύστε το πλήρες ίχνος ισχύος και τα αντίστοιχα δεδομένα εντοπισμού σφαλμάτων για κάθε κύκλο. Χρήσιμο για την αντιμετώπιση προβλημάτων, αλλά αυξάνει το μέγεθος του αποθηκευτικού χώρου.", - "label": "Αποθήκευση Ιχνών Αποσφαλμάτωσης" - }, - "smoothing_window": { - "doc": "Πόσο εξομαλύνεται το πρωτογενές σήμα ισχύος. Το Low (2) ανταποκρίνεται αλλά είναι θορυβώδες. υψηλό (5) εξομαλύνει τις αιχμές αλλά προσθέτει υστέρηση.", - "label": "Παράθυρο Εξομάλυνσης" - }, - "start_duration_threshold": { - "doc": "Η ισχύς πρέπει να παραμείνει πάνω από το όριο εκκίνησης για τόσο μεγάλο χρονικό διάστημα για να επιβεβαιωθεί μια πραγματική εκκίνηση, αποτρέποντας τις εναλλαγές ενεργοποίησης/απενεργοποίησης κλασματικού δευτερολέπτου από την έναρξη ενός κύκλου.", - "label": "Διάρκεια Εκκίνησης" - }, - "start_energy_threshold": { - "doc": "Ενέργεια (ισχύς x χρόνος) πρέπει να καταναλώσει η συσκευή πριν τη λειτουργία. Μια σύντομη ακίδα υψηλής ισχύος έχει πολύ χαμηλή ενέργεια και αγνοείται, αποτρέποντας τις λανθασμένες εκκινήσεις.", - "label": "Ενέργεια Εκκίνησης" - }, - "start_threshold_w": { - "doc": "Η ισχύς πρέπει να ανέβει πάνω από αυτό το επίπεδο για να επιβεβαιωθεί ότι ένας κύκλος έχει ξεκινήσει. Η ρύθμιση του σε πολύ χαμηλά επίπεδα προκαλεί λανθασμένες εκκινήσεις από την τροφοδοσία αναμονής. Τα προγράμματα πολύ υψηλά και αργής εκκίνησης (ψυχρή πλήρωση) χάνονται. Ο κινητήρας προτάσεων το θέτει ακριβώς πάνω από τη χαμηλότερη ενεργή ισχύ του μηχανήματος που έχει παρατηρηθεί.", - "label": "Κατώφλι Εκκίνησης" - }, - "stop_threshold_w": { - "doc": "Η ισχύς πρέπει να πέσει κάτω από αυτό το επίπεδο προτού ξεκινήσει η αντίστροφη μέτρηση εκτός καθυστέρησης. Ρυθμίστε το κάτω από το όριο έναρξης - το κενό μεταξύ τους είναι η ζώνη υστέρησης που αποτρέπει το τρεμόπαιγμα. Εάν ρυθμιστεί πολύ ψηλά, οι φάσεις χαμηλής ισχύος (κρατήματα ξεβγάλματος, αντιτσαλάκωση) ενεργοποιούν λανθασμένα την τελική ακολουθία.", - "label": "Κατώφλι Τερματισμού" - }, - "switch_entity": { - "doc": "Ο προαιρετικός διακόπτης απενεργοποιήθηκε κατά την παύση και ενεργοποιήθηκε ξανά κατά τη συνέχιση, που χρησιμοποιείται μαζί με το \"Η παύση διακόπτει επίσης το ρεύμα\".", - "label": "Οντότητα Διακόπτη" - }, - "watchdog_interval": { - "doc": "Πόσο συχνά ελέγχει το παρασκήνιο παρακολούθησης για στάσιμους αισθητήρες και παρελθόντα χρονικά όρια. Προεπιλογή 30 δευτ.", - "label": "Διάστημα Watchdog" - }, - "notify_milestone_message": { - "doc": "Μήνυμα για την ειδοποίηση ορόσημου. Μεταβλητές προτύπου: {device}, {cycle_count}.", - "label": "Μήνυμα ορόσημου" - }, - "notify_milestones": { - "doc": "Αριθμοί κύκλων χωρισμένοι με κόμμα που ενεργοποιούν μια εφάπαξ εορταστική ειδοποίηση όταν επιτευχθούν (π.χ. 50, 100, 500, 1000). Το κενό απενεργοποιεί τις ειδοποιήσεις ορόσημων.", - "label": "Ορόσημα κύκλων" - }, - "notify_quiet_end_hour": { - "doc": "Τέλος του παραθύρου μην ενοχλείτε (0-23). Οι ειδοποιήσεις που κρατήθηκαν παραδίδονται αυτή την ώρα. Αφήστε κενό για απενεργοποίηση.", - "label": "Τέλος ωρών ησυχίας" - }, - "notify_quiet_start_hour": { - "doc": "Έναρξη ενός παραθύρου μην ενοχλείτε (0-23). Οι ειδοποιήσεις ολοκλήρωσης, υπενθύμισης και καθαρών ρούχων που θα ενεργοποιούνταν κατά τις ώρες ησυχίας κρατούνται και παραδίδονται όταν λήξει το παράθυρο. Αφήστε κενό για απενεργοποίηση. Υποστηρίζει παράθυρα που διασχίζουν τα μεσάνυχτα (π.χ. έναρξη 22, τέλος 7).", - "label": "Έναρξη ωρών ησυχίας" - }, - "peak_rate_message": { - "doc": "Προαιρετικό προσαρμοσμένο κείμενο για τη συμβουλή τιμής αιχμής που προσαρτάται στην ειδοποίηση έναρξης. Μεταβλητές προτύπου: {device}, {price}. Το κενό χρησιμοποιεί την ενσωματωμένη προεπιλογή.", - "label": "Μήνυμα τιμής αιχμής" - }, - "peak_rate_threshold": { - "doc": "Όταν ξεκινά ένας κύκλος και η τρέχουσα τιμή ανά kWh είναι στην ή πάνω από αυτή την τιμή, προσαρτά μια συμβουλή τιμής αιχμής στην ειδοποίηση έναρξης. Το 0 ή κενό απενεργοποιεί τη συμβουλή.", - "label": "Κατώφλι τιμής αιχμής (ανά kWh)" - }, - "dtw_bandwidth": { - "label": "Ανοχή αντιστοίχισης σχήματος", - "doc": "Πόσο μπορεί ο μηχανισμός αντιστοίχισης να παραμορφώσει χρονικά έναν κύκλο ώστε να ταιριάξει με το σχήμα ενός αποθηκευμένου προγράμματος. Υψηλότερη τιμή ανέχεται μεγαλύτερη διακύμανση ταχύτητας. Πολύ υψηλή κινδυνεύει να αντιστοιχίσει λάθος πρόγραμμα." - }, - "corr_weight": { - "label": "Βάρος σχήματος έναντι επιπέδου", - "doc": "Ισορροπία μεταξύ του σχήματος της καμπύλης και του απόλυτου επιπέδου ισχύος κατά τη βαθμολόγηση μιας αντιστοίχισης. Υψηλότερη τιμή ευνοεί το σχήμα. Χαμηλότερη ευνοεί την αντιστοίχιση του επιπέδου ισχύος." - }, - "duration_weight": { - "label": "Βάρος διάρκειας", - "doc": "Πόσο ισχυρά προτιμάται ένα πρόγραμμα του οποίου η τυπική διάρκεια ταιριάζει με αυτόν τον κύκλο." - }, - "energy_weight": { - "label": "Βάρος ενέργειας", - "doc": "Πόσο ισχυρά προτιμάται ένα πρόγραμμα του οποίου η τυπική κατανάλωση ενέργειας ταιριάζει με αυτόν τον κύκλο." - }, - "store_brand": { - "label": "Μάρκα Συσκευής", - "doc": "Προαιρετικό. Η μάρκα της συσκευής, επιλεγμένη από τον κατάλογο της κοινότητας. Χρησιμοποιείται για την εύρεση και κοινοποίηση αντίστοιχων καταγραφών αναφοράς. Αφήστε το κενό αν δεν χρησιμοποιείτε διαδικτυακές λειτουργίες." - }, - "store_model": { - "label": "Μοντέλο Συσκευής", - "doc": "Προαιρετικό. Το μοντέλο της συσκευής, επιλεγμένο από τον κατάλογο της κοινότητας μόλις οριστεί μια μάρκα. Αν το μοντέλο σας δεν αναφέρεται, μπορείτε να το προσθέσετε στον κατάλογο." - }, - "show_contributor": { - "doc": "Εμφάνιση της ένδειξης \"από <συνεισφέρων>\" στις κοινοτικές συσκευές και τους κύκλους αναφοράς." - }, - "enable_phase_matching": { - "label": "Υπολειπόμενος χρόνος με επίγνωση φάσεων", - "doc": "Χωρίστε κάθε κύκλο που εκτελείται σε φάσεις (θέρμανση, πλύση, στύψιμο) και κατανείμετε τον υπολειπόμενο χρόνο ανά φάση, συνδυασμένο με την κλασική εκτίμηση - στηριζόμενοι στην κατανομή ανά φάση στην αρχή του κύκλου και στην κλασική εκτίμηση κοντά στο τέλος. Αυτό προσαρμόζει την αντίστροφη μέτρηση στο πόση ώρα πραγματικά θερμαίνεται και λειτουργεί η μηχανή σας, κάτι που είναι πιο εμφανές στο πρώτο μισό ενός κύκλου. Off = μόνο η κλασική εκτίμηση. Επηρεάζεται μόνο η ένδειξη υπολειπόμενου χρόνου· η αντιστοίχιση προγραμμάτων και η ανίχνευση κύκλου παραμένουν αμετάβλητες." - }, - "keep_min_score": { - "label": "Ελάχ. Βαθμός Αντιστοίχισης", - "doc": "Ελάχιστη βαθμολογία ομοιότητας για παραμονή υποψηφίου στον αγώνα αντιστοίχισης. Η προεπιλογή 0.1 είναι εκ προθέσεως επιεικής - επιτρέπει ακόμη και αδύναμους υποψηφίους, αφήνοντας τα επόμενα στάδια να βρουν το καλύτερο ταίριασμα. Αυξήστε για πρώιμο αποκλεισμό απίθανων προφίλ; μειώστε για διεύρυνση της αρχικής ομάδας υποψηφίων." - }, - "dtw_blend": { - "label": "Ανάμειξη DTW", - "doc": "Σε ποιο βαθμό ο βαθμός ευθυγράμμισης DTW αντικαθιστά τον βαθμό πυρήνα Σταδίου 2. 0 = μόνο ο βαθμός Σταδίου 2, 1 = μόνο ο βαθμός DTW, 0.5 (προεπιλογή) = ισόρροπη ανάμειξη. Αυξήστε για μεγαλύτερη εξάρτηση από ευθυγράμμιση παραμόρφωσης όταν τα προγράμματα έχουν παρόμοια επίπεδα ισχύος αλλά διαφορετικά χρονικά πρότυπα." - }, - "dtw_ensemble_w": { - "label": "Σύνολο DTW", - "doc": "Στη λειτουργία συνόλου DTW (η προεπιλογή), το βάρος στο κλιμακωμένο L1 έναντι παραγώγου DTW (DDTW). 1.0 = πλήρως κλιμακωμένο-L1, 0 = πλήρως DDTW, 0.7 = προεπιλογή. Η παραλλαγή κλιμακωμένου-L1 συγκρίνει επίπεδα ισχύος; η παραγώγου παραλλαγή ανταποκρίνεται στο πώς μεταβάλλεται η ισχύς. Το σύνολο συνδυάζει και τα δύο." - }, - "dtw_ddtw_scale": { - "label": "Κλίμακα DDTW", - "doc": "Απόσταση ημίσεος κορεσμού για τη βαθμολόγηση παραγώγου DTW. Η βαθμολογία υποδιπλασιάζεται όταν η απόσταση DDTW ισούται με αυτήν την τιμή. Μικρότερη = μεγαλύτερη ευαισθησία σε διαφορές σχήματος. Η προεπιλογή 30 είναι βαθμονομημένη στα τυπικά ίχνη ισχύος οικιακών συσκευών. Επηρεάζει μόνο τις λειτουργίες DTW συνόλου και ddtw." - }, - "dtw_refine_top_n": { - "label": "Αριθμός Εκλέπτυνσης DTW", - "doc": "Πόσοι κορυφαίοι υποψήφιοι Σταδίου 2 επαναβαθμολογούνται από DTW. Η DTW είναι πιο ακριβή υπολογιστικά, οπότε εφαρμόζεται μόνο στους καλύτερους N υποψηφίους. Προεπιλογή 5. Αυξήστε (σε 7-9) αν το σωστό προφίλ φτάνει μερικές φορές μόνο στη 4η ή 5η θέση μετά το Στάδιο 2 - η DTW μπορεί να το σώσει. Η μείωση επιταχύνει ελαφρώς την αντιστοίχιση." - }, - "duration_scale": { - "label": "Ευαισθησία Διάρκειας", - "doc": "Αυστηρότητα της ποινής συμφωνίας διάρκειας Σταδίου 4. Αυτός είναι ο λόγος λογαρίθμου στον οποίο ο βαθμός συμφωνίας υποδιπλασιάζεται. Μικρότερος = αυστηρότερος: μια ασυμφωνία διάρκειας επηρεάζει περισσότερο. Η προεπιλογή 0.175 αντιστοιχεί σε ανοχή διάρκειας περίπου 18% στο μισό βάρος. Χρησιμοποιήστε μαζί με το Βάρος Διάρκειας." - }, - "energy_scale": { - "label": "Ευαισθησία Ενέργειας", - "doc": "Αυστηρότητα της ποινής συμφωνίας ενέργειας Σταδίου 4. Μικρότερος = αυστηρότερος: μια ασυμφωνία ενέργειας επηρεάζει περισσότερο. Η προεπιλογή 0.25 είναι εκ προθέσεως πιο επιεικής από την Ευαισθησία Διάρκειας επειδή η ενέργεια ποικίλλει με το φορτίο. Χρησιμοποιήστε μαζί με το Βάρος Ενέργειας." - } - }, - "setting_group": { - "auto_labeling": { - "label": "Αυτόματη Επισήμανση" - }, - "cycle_end": { - "label": "Λήξη Κύκλου" - }, - "cycle_start": { - "label": "Έναρξη Κύκλου" - }, - "cycle_timers": { - "label": "Χρονόμετρα Κύκλου" - }, - "data_management": { - "label": "Διαχείριση Δεδομένων" - }, - "debug": { - "label": "Αποσφαλμάτωση" - }, - "dishwasher_end": { - "label": "Λήξη Πλυντηρίου Πιάτων" - }, - "door_pause": { - "label": "Πόρτα & Παύση" - }, - "dtw_refinement": { - "label": "Βελτίωση DTW" - }, - "duration_gates": { - "label": "Πύλες Διάρκειας" - }, - "energy": { - "label": "Ενέργεια" - }, - "external_end_trigger": { - "label": "Εξωτερικός Ενεργοποιητής Λήξης" - }, - "housekeeping": { - "label": "Συντήρηση" - }, - "match_scoring": { - "label": "Βαθμολόγηση Αντιστοίχισης" - }, - "messages": { - "label": "Μηνύματα" - }, - "power_off": { - "label": "Απενεργοποίηση" - }, - "predictive_end": { - "label": "Προβλεπτική Λήξη" - }, - "schedule": { - "label": "Πρόγραμμα" - }, - "services": { - "label": "Υπηρεσίες" - }, - "signal_processing": { - "label": "Επεξεργασία Σήματος" - }, - "thresholds_gap": { - "label": "Κατώφλια & Κενό" - }, - "timing": { - "label": "Χρονισμός" - }, - "unload_reminder": { - "label": "Υπενθύμιση Αποφόρτωσης" - }, - "watchdog": { - "label": "Watchdog" - }, - "quiet_hours_milestones": { - "label": "Ώρες ησυχίας και ορόσημα" - }, - "device_info": { - "label": "Πληροφορίες συσκευής" - }, - "basic_configuration": { - "label": "Βασική διαμόρφωση" - } - }, - "status": { - "active": "Ενεργός", - "all_statuses": "Όλες οι καταστάσεις", - "ambiguous": "Ασαφής", - "auto_detect": "Αυτόματος εντοπισμός", - "clear": "Σαφής", - "completed": "Ολοκληρώθηκε το", - "fine_tuning": "τελειοποίηση τώρα…", - "force_stopped": "Η δύναμη σταμάτησε", - "idle": "Αεργος", - "interrupted": "Διακόπηκε", - "ready": "Έτοιμο για επεξεργασία", - "recording": "Εγγραφή", - "training": "Εκπαίδευση…", - "saving": "Αποθήκευση…", - "rebuilding": "Ανακατασκευή…", - "analyzing": "Ανάλυση…", - "resetting": "Επαναφορά…", - "reverting": "Αναίρεση…", - "trimming": "Περικοπή…", - "splitting": "Διαίρεση…", - "deleting": "Διαγραφή…", - "imported": "Εισηγμένο" - }, - "tab": { - "advanced": "Προχωρημένος", - "diagnostics": "Διαγνωστικά", - "history": "Κύκλοι", - "ml": "Εκπαίδευση ML", - "pp_cleanup": "Καθαρισμός", - "pp_manage": "Διαχειρίζομαι", - "pp_overview": "Επισκόπηση", - "pp_phases": "Φάσεις", - "profiles": "Προφίλ", - "settings": "Ρυθμίσεις", - "status": "Επισκόπηση", - "subtab_phase_catalog": "Κατάλογος Φάσης", - "subtab_profiles": "Προφίλ", - "maintenance": "Συντήρηση", - "playground": "Χώρος δοκιμών", - "store": "Κατάστημα" - }, - "tag": { - "early_end": "Πρόωρο τέλος", - "late_start": "Καθυστερημένη έναρξη", - "merged": "Συγχωνευμένοι κύκλοι", - "noise": "Θόρυβος", - "sensor_gap": "Κενό αισθητήρα", - "split": "Διαχωρισμένος κύκλος", - "wrong_profile": "Λάθος προφίλ" - }, - "toast": { - "access_saved": "Ο έλεγχος πρόσβασης αποθηκεύτηκε", - "all_wiped": "Όλα τα δεδομένα διαγράφηκαν", - "analysis_complete_none": "Η ανάλυση ολοκληρώθηκε: δεν υπάρχουν νέες προτάσεις", - "auto_label_complete": "Η αυτόματη ετικέτα ολοκληρώθηκε", - "automation_deleted": "Ο αυτοματισμός διαγράφηκε", - "correction_submitted": "Υποβλήθηκε διόρθωση", - "cycle_deleted": "Ο κύκλος διαγράφηκε", - "cycle_force_stopped": "Ο κύκλος σταμάτησε με δύναμη", - "cycle_labelled": "Κύκλος με ετικέτα", - "cycle_paused": "Ο κύκλος σταμάτησε", - "cycle_resumed": "Ο κύκλος συνεχίστηκε", - "cycle_trimmed": "Κύκλος κομμένο", - "cycles_merged": "Οι κύκλοι συγχωνεύτηκαν", - "envelope_rebuilt": "Φάκελος ανακατασκευασμένος", - "envelopes_rebuilt": "Φάκελοι ανακατασκευασμένοι", - "export_downloaded": "Έγινε λήψη της εξαγωγής", - "feedback_all_dismissed": "Όλα τα σχόλια απορρίφθηκαν", - "feedback_confirmed": "Τα σχόλια επιβεβαιώθηκαν", - "feedback_dismissed": "Τα σχόλια απορρίφθηκαν", - "group_deleted": "Η ομάδα διαγράφηκε", - "group_name_required": "Απαιτείται όνομα ομάδας", - "group_saved": "Η ομάδα αποθηκεύτηκε", - "import_successful": "Επιτυχής εισαγωγή. επαναφόρτωση ενσωμάτωσης", - "json_required": "Απαιτούνται δεδομένα JSON", - "legacy_removed": "Οι ενέργειες παλαιού τύπου καταργήθηκαν", - "logs_exported": "Εξαγωγή αρχείων καταγραφής", - "matching_reverted": "Τα αντίστοιχα βάρη επανήλθαν στις προεπιλογές", - "min_2_profiles": "Επιλέξτε τουλάχιστον 2 προφίλ για μια ομάδα", - "ml_training_no_improvement": "Η εκπαίδευση ολοκληρώθηκε: διατηρήθηκε η βασική γραμμή (καμία βελτίωση)", - "models_reverted": "Τα μοντέλα στη συσκευή επανήλθαν στη γραμμή βάσης", - "name_required": "Απαιτείται όνομα", - "no_split_found": "Δεν βρέθηκαν κενά σε αδράνεια για διαχωρισμό", - "panel_settings_saved": "Οι ρυθμίσεις του πίνακα αποθηκεύτηκαν", - "phase_name_required": "Απαιτείται όνομα φάσης", - "phase_updated": "Η φάση ενημερώθηκε", - "phases_saved": "Οι φάσεις αποθηκεύτηκαν", - "preferences_saved": "Οι προτιμήσεις αποθηκεύτηκαν", - "profile_name_required": "Απαιτείται όνομα προφίλ", - "profile_renamed": "Το προφίλ μετονομάστηκε", - "recording_discarded": "Η εγγραφή απορρίφθηκε", - "recording_saved": "Η εγγραφή αποθηκεύτηκε στο προφίλ", - "recording_started": "Η ηχογράφηση ξεκίνησε", - "recording_stopped": "Η εγγραφή σταμάτησε", - "review_saved": "Η κριτική αποθηκεύτηκε", - "settings_conflicts": "Επιλύστε τις επισημασμένες συγκρούσεις ρυθμίσεων πριν αποθηκεύσετε.", - "settings_reverted": "Οι ρυθμίσεις επαναφέρθηκαν. επαναφόρτωση ενσωμάτωσης", - "settings_saved": "Οι ρυθμίσεις αποθηκεύτηκαν. επαναφόρτωση ενσωμάτωσης", - "suggestions_applied": "Εφαρμόστηκαν προτάσεις. επαναφόρτωση ενσωμάτωσης", - "suggestions_dismissed": "Οι προτάσεις απορρίφθηκαν", - "apply_failed": "Η εφαρμογή απέτυχε: {error}", - "delete_failed": "Η διαγραφή απέτυχε: {error}", - "load_more_failed": "Δεν ήταν δυνατή η φόρτωση περισσότερων: {error}", - "maint_add_failed": "Δεν ήταν δυνατή η προσθήκη συμβάντος: {error}", - "maint_added": "Το συμβάν συντήρησης προστέθηκε", - "maint_delete_failed": "Δεν ήταν δυνατή η διαγραφή συμβάντος: {error}", - "maint_deleted": "Το συμβάν συντήρησης διαγράφηκε", - "relabel_done": "Επανεπισημάνθηκαν {count} κύκλοι", - "relabel_failed": "Η επανεπισήμανση απέτυχε: {error}", - "reminders_save_failed": "Δεν ήταν δυνατή η αποθήκευση υπενθυμίσεων: {error}", - "reminders_saved": "Οι υπενθυμίσεις σέρβις αποθηκεύτηκαν", - "pause_no_cycle": "Δεν υπάρχει ενεργός κύκλος για παύση", - "resume_no_cycle": "Δεν υπάρχει παυσμένος κύκλος για συνέχιση", - "delete_partial_failed": "Ορισμένα στοιχεία δεν ήταν δυνατό να διαγραφούν και επαναφέρθηκαν", - "pg_run_gone": "Αυτή η εκτέλεση δεν είναι πλέον διαθέσιμη.", - "task_cancelled": "Ακυρώθηκε.", - "processed": "Επεξεργάστηκαν {bits}", - "processed_cycles": "{n} κύκλοι", - "processed_suggestions": "{n} προτάσεις", - "processed_models": "{n} μοντέλα που προήχθησαν", - "store_search_failed": "Η αναζήτηση απέτυχε: {error}", - "store_connect_failed": "Η σύνδεση απέτυχε: {error}", - "store_connected": "Συνδέθηκε στο κοινοτικό κατάστημα", - "store_disconnected": "Αποσυνδέθηκε από το κοινοτικό κατάστημα", - "store_error": "Σφάλμα: {error}", - "store_unavailable": "Το κοινοτικό κατάστημα δεν είναι διαθέσιμο.", - "store_pick_profile": "Επιλέξτε ένα προφίλ για συγχώνευση", - "store_name_required": "Εισαγάγετε ένα όνομα προφίλ", - "store_import_failed": "Η εισαγωγή απέτυχε: {error}", - "store_imported": "Εισήχθη στο {profile}", - "store_program_required": "Εισαγάγετε ένα όνομα προγράμματος", - "store_no_appliance": "Ορίστε πρώτα τη μάρκα και το μοντέλο της συσκευής σας στις Ρυθμίσεις.", - "store_share_failed": "Η κοινοποίηση απέτυχε: {error}", - "store_shared": "Κοινοποιήθηκε στο κοινοτικό κατάστημα, σε αναμονή ελέγχου.", - "appliance_added": "Η συσκευή προστέθηκε, σε αναμονή έγκρισης", - "thanks_confirming": "Ευχαριστούμε για την επιβεβαίωση", - "device_approved": "Εγκρίθηκε από την κοινότητα", - "rating_saved": "Η βαθμολογία ποιότητας αποθηκεύτηκε", - "brand_added": "Η μάρκα προστέθηκε, σε αναμονή έγκρισης", - "profile_added": "Το προφίλ προστέθηκε, σε αναμονή έγκρισης", - "saved_except_conflicts": "Αποθηκεύτηκε. Διορθώστε τις επισημασμένες συγκρούσεις για να αποθηκεύσετε τα υπόλοιπα.", - "share_device_none_sel": "Επιλέξτε τουλάχιστον έναν κύκλο για κοινοποίηση", - "store_device_downloaded": "{p} πρόγραμμα(τα), {c} εγγραφή(ές) προστέθηκαν", - "store_device_downloaded_phases": "{p} πρόγραμμα(τα), {c} εγγραφή(ές), {ph} χάρτης(ες) φάσεων προστέθηκαν", - "store_device_downloaded_settings": "{p} πρόγραμμα(τα), {c} εγγραφή(ές), {ph} χάρτης(ες) φάσεων, {s} ρύθμιση(ες) προστέθηκαν", - "store_device_shared": "Κοινοποιήθηκαν {n} κύκλος(οι) στο κοινοτικό κατάστημα - σε αναμονή ελέγχου.", - "store_device_shared_all_dup": "Όλοι οι {n} κύκλος(οι) υπήρχαν ήδη στο κοινοτικό κατάστημα.", - "store_device_shared_partial": "Κοινοποιήθηκαν {n} κύκλος(οι)· {failed} δεν ήταν δυνατό να ανεβούν.", - "store_device_shared_some_dup": "Κοινοποιήθηκαν {created} κύκλος(οι)· {dup} υπήρχαν ήδη στο κατάστημα.", - "store_download_failed": "Η λήψη απέτυχε: {error}", - "store_download_nothing": "Δεν υπάρχει τίποτα νέο για λήψη - αυτή η ρύθμιση βρίσκεται ήδη στη συσκευή σας.", - "export_selective_done": "Η εξαγωγή λήφθηκε", - "import_selective_done": "Εισήχθησαν {profiles} προφίλ και {cycles} κύκλοι" - }, - "suggestion": { - "both_agree": "Το WashData προτείνει", - "calibrated_label": "Βαθμονομημένο", - "observed_label": "Παρατηρήθηκε", - "impact": { - "auto_label_confidence": { - "higher": "Επισημαίνει αυτόματα λιγότερους κύκλους; περισσότεροι πηγαίνουν σε έλεγχο", - "lower": "Επισημαίνει αυτόματα περισσότερους κύκλους; κάποιοι ενδέχεται να αναγνωριστούν λανθασμένα" - }, - "duration_tolerance": { - "higher": "Αποδέχεται ευρύτερο εύρος διάρκειας – πιο ευέλικτη αντιστοίχιση", - "lower": "Απαιτεί πιο ακριβή αντιστοίχιση διάρκειας – αυστηρότερο, μπορεί να απορρίψει ασυνήθεις κύκλους" - }, - "end_energy_threshold": { - "higher": "Κλείνει μόνο κύκλους που κατανάλωσαν σημαντική ενέργεια", - "lower": "Κλείνει και συντομότερους ή χαμηλής ενέργειας κύκλους" - }, - "end_repeat_count": { - "higher": "Απαιτεί επανάληψη του σήματος λήξης περισσότερες φορές – πιο αξιόπιστο, ελαφρώς πιο αργό", - "lower": "Τερματίζει μετά από λιγότερες επαναλήψεις – ταχύτερη ανίχνευση, μεγαλύτερος κίνδυνος ψευδούς λήξης" - }, - "learning_confidence": { - "higher": "Μαθαίνει μόνο από πολύ σίγουρες αντιστοιχίσεις – πιο αργό αλλά πιο αξιόπιστο", - "lower": "Μαθαίνει από περισσότερους κύκλους; το μοντέλο μπορεί να έχει περισσότερο θόρυβο" - }, - "min_off_gap": { - "higher": "Απαιτείται μεγαλύτερη αδράνεια πριν ξεκινήσει νέος κύκλος", - "lower": "Σύντομη αδράνεια εκκινεί νέο κύκλο – διαδοχικές λειτουργίες μπορεί να διαχωριστούν" - }, - "min_power": { - "higher": "Λιγότερο ευαίσθητο στην κατανάλωση αδράνειας; μπορεί να χάσει ήσυχα προγράμματα", - "lower": "Πιο ευαίσθητο; μπορεί να καταγράφει την κατανάλωση σε αναμονή ως δραστηριότητα" - }, - "no_update_active_timeout": { - "higher": "Περισσότερος χρόνος πριν δηλωθεί κύκλος κολλημένος", - "lower": "Αναγκαστική διακοπή κολλημένου κύκλου νωρίτερα" - }, - "off_delay": { - "higher": "Περισσότερος χρόνος για παύσεις συσκευής – χειρίζεται μακρά εμποτίσματα ή φάσεις στεγνώματος", - "lower": "Ταχύτερη ανίχνευση λήξης – καλό για συσκευές με καθαρό ενεργό/ανενεργό" - }, - "profile_match_threshold": { - "higher": "Επιβεβαιώνει μόνο αντιστοιχίσεις υψηλής εμπιστοσύνης; περισσότεροι κύκλοι παραμένουν χωρίς ετικέτα", - "lower": "Αντιστοιχεί περισσότερους κύκλους; κάποιοι μπορεί να είναι ελαφρώς λανθασμένοι" - }, - "running_dead_zone": { - "higher": "Αγνοεί σύντομες αιχμές ισχύος κατά την αδράνεια – λιγότερο ευαίσθητο σε θόρυβο", - "lower": "Ανταποκρίνεται σε συντομότερες αναλαμπές ισχύος – εντοπίζει γρήγορη παροδική δραστηριότητα" - }, - "start_threshold_w": { - "higher": "Αποφεύγει ψευδείς εκκινήσεις από σύντομες αιχμές ισχύος", - "lower": "Εντοπίζει προγράμματα χαμηλής ισχύος; μπορεί να ενεργοποιηθεί από θόρυβο" - }, - "stop_threshold_w": { - "higher": "Τερματίζει τον κύκλο γρηγορότερα – μπορεί να κλείσει κατά τη διάρκεια παύσης", - "lower": "Αναμένει περισσότερο για τερματισμό – λιγότερες πρόωρες ολοκληρώσεις" - }, - "watchdog_interval": { - "higher": "Επιτρέπονται μακρύτερες ήσυχες φάσεις; λιγότερες ψευδείς αναγκαστικές διακοπές", - "lower": "Εντοπίζει κολλημένους κύκλους πιο επιθετικά" - } - }, - "reason": { - "auto_label_confidence": "Αξιοπιστία 15ου εκατοστημορίου των {cycles} αυτόματων ετικετών που ο χρήστης δεν διόρθωσε ποτέ ({p15}).", - "completion_min_seconds": "Το μισό της διάρκειας p05 των καθαρών κύκλων ({minutes} min) σε {cycles} κύκλους· φιλτράρει τους ψευδείς κύκλους.{excl}", - "dead_zone_batch": "Διατηρείται σύντομο (διάμεσο παράθυρο αστάθειας εκκίνησης σε {cycles} κύκλους = {s}s) ώστε ένα πραγματικό τέλος να ανιχνεύεται άμεσα.", - "dead_zone_from_dip": "Βάσει πρώιμης πτώσης ισχύος που ανιχνεύτηκε στα {s}s.", - "end_energy_default": "Προεπιλεγμένη συνιστώμενη βάση για το κατώφλι θορύβου στο τέλος του κύκλου.", - "end_energy_false": "Ενέργεια ψευδούς τέλους p95 ({p95}Wh) σε {cycles} κύκλους, με κατώτατο όριο το 0.2% της διάμεσης ενέργειας κύκλου ({floor}Wh).", - "end_energy_no_false": "Κανένα ψευδές τέλος σε {cycles} κύκλους· με κατώτατο όριο το 0.2% της διάμεσης ενέργειας κύκλου ({floor}Wh).", - "end_repeat_count": "{false}/{total} καθαροί κύκλοι ({pct}%) είχαν εσωτερική παύση >60s που συνεχίστηκε· απαιτούνται {val} επιβεβαίωση(εις) τέλους.", - "learning_confidence": "Αξιοπιστία p05 των {cycles} κύκλων με ετικέτα χρήστη ({p05})· κάτω από αυτό, ζητείται επαλήθευση.", - "match_interval": "Βάσει του παρατηρούμενου ρυθμού ενημέρωσης (διάμεσος={median}s) * 10.", - "max_duration_ratio": "Βάσει των διαρκειών των κύκλων με ετικέτα (p95={p95}).", - "min_active": "Βάσει της ελάχιστης ενεργού ισχύος ({min}W) που παρατηρήθηκε στον τελευταίο κύκλο.", - "min_duration_ratio": "Διατηρείται όσο το δυνατόν χαμηλότερο ώστε ένα πρόγραμμα να αναγνωρίζεται νωρίς στον κύκλο· τα κατώφλια αξιοπιστίας και ασάφειας αποτρέπουν τις πρόωρες επιβεβαιώσεις.", - "min_off_gap": "Βάσει {gaps} παρατηρούμενων διακυκλικών κενών (p05={p05}s). Κατώτατο όριο συσκευής: {floor}s.", - "min_power": "40% της χαμηλότερης ενεργού ισχύος p05 ({p05}W) σε {cycles} καθαρούς κύκλους, διατηρώντας το κατώφλι απενεργοποίησης κάτω από την πραγματική κατανάλωση.{excl}", - "ml_auto_label": "Η χαμηλότερη αξιοπιστία που το μοντέλο ποιότητας εξακολούθησε να αξιολογεί ως καθαρή (p10 των {cycles} καθαρών κύκλων = {p10}).", - "ml_end_repeat": "{false}/{total} κύκλοι ({pct}%) είχαν παύση που ο ανιχνευτής τέλους βαθμολόγησε >50%· απαιτούνται {val} επιβεβαίωση(εις) τέλους.", - "ml_off_delay": "Παύσεις επιβεβαιωμένες από τον ανιχνευτή τέλους: p95 {p95}s + 60s περιθώριο, από {pauses} παύσεις επαληθευμένες από το μοντέλο σε {cycles} κύκλους (κατώτατο όριο {floor}s).", - "no_update_timeout": "Βάσει του παρατηρούμενου ρυθμού ενημέρωσης (p95={p95}s) * 20 (ελάχ. 60s).", - "off_delay_cadence": "Βάσει του παρατηρούμενου ρυθμού ενημέρωσης (p95={p95}s) * 5", - "off_delay_device_floor": "Χρησιμοποιήθηκε το ασφαλές ελάχιστο ειδικό για τη συσκευή {device} ({floor}s).", - "off_delay_generic_floor": "Χρησιμοποιήθηκε γενικό ασφαλές ελάχιστο ({floor}s).", - "off_delay_pauses": "Διαστασιολογήθηκε ώστε να ξεπερνά τις πραγματικές παύσεις: παύση εντός κύκλου p95 {p95}s + 60s περιθώριο, από {pauses} παύσεις σε {cycles} καθαρούς κύκλους (κατώτατο όριο {floor}s).", - "profile_match_threshold": "Αξιοπιστία p10 των {cycles} σωστών αυτόματων ετικετών ({p10})· ασφαλές κατώτατο όριο άμεσης επιβεβαίωσης.", - "sampling_interval": "Διάμεσο διάστημα ενημέρωσης που παρατηρήθηκε σε {cycles} καθαρούς κύκλους ({si}s).{excl}", - "smoothing_window": "Διαστασιολογήθηκε ώστε να εξομαλύνει ~30s μετρήσεων σε δειγματοληψία {si}s ({samples} δείγματα).", - "start_duration": "Διατηρείται σύντομο (~ένα διάστημα δειγματοληψίας {si}s) ώστε η ανίχνευση να ξεκινά όσο το δυνατόν νωρίτερα, αγνοώντας παράλληλα τις αιχμές ενός μόνο δείγματος.", - "thr_batch": "Διατηρείται λίγο πάνω από τη χαμηλότερη ενεργό ισχύ p05 σε {cycles} κύκλους ({p05}W) ώστε μια έναρξη να εντοπίζεται όσο το δυνατόν νωρίτερα και το κατώφλι διακοπής να παραμένει κάτω από τη χαμηλότερη ισχύ λειτουργίας της μηχανής.", - "tol_per_profile": "p75 της διακύμανσης διάρκειας ανά προφίλ σε {profiles} προφίλ ({cycles} κύκλοι)· τα σταθερά προφίλ δεν επιβαρύνονται.", - "tol_pooled": "Βάσει της συγκεντρωτικής διακύμανσης διάρκειας {cycles} πρόσφατων κύκλων με ετικέτα (απόκλιση p95={dev}).", - "watchdog": "Διατηρείται όσο το δυνατόν χαμηλότερο με ασφάλεια (3x το κενό ενημέρωσης p95 των {p95}s, ελάχ. 30s) ώστε οι διακοπές να εντοπίζονται γρήγορα χωρίς ψευδείς διακοπές." - }, - "exclusions": { - "summary": "Εξαιρέθηκαν {total} εσφαλμένα εντοπισμένοι κύκλοι: {parts}.", - "reason": { - "force_stopped": "αναγκαστικά τερματισμένοι", - "interrupted": "διακομμένοι", - "incomplete": "ημιτελείς", - "noise": "θόρυβος", - "unlabeled": "χωρίς ετικέτα", - "no_trace_short": "πολύ σύντομοι για έλεγχο", - "high_start": "ξεκίνησαν με υψηλή ισχύ", - "abrupt_end": "τελείωσαν απότομα", - "mid_restart": "με επανεκκίνηση στη μέση", - "no_power": "χωρίς ισχύ", - "no_active_power": "χωρίς ενεργή ισχύ" - } - } - }, - "trend": { - "down": "Πτωτικές τάσεις", - "up": "Ανοδική τάση" - }, - "maint": { - "bearing_service": "Σέρβις ρουλεμάν", - "descale": "Αφαλάτωση", - "drum_clean": "Καθαρισμός κάδου", - "filter_clean": "Καθαρισμός φίλτρου", - "other": "Άλλο" - }, - "pg_desc": { - "completion_min_seconds": "Η συντομότερη εκτέλεση που μετρά ως πραγματικός κύκλος", - "end_repeat_count": "Χαμηλές μετρήσεις στη σειρά πριν τη λήξη", - "interrupted_min_seconds": "Οι σύντομοι κύκλοι επισημαίνονται ως διακοπή", - "min_off_gap": "Απαιτούμενο κενό για διαχωρισμό δύο κύκλων", - "off_delay": "Δευτερόλεπτα χαμηλής ισχύος πριν λήξει ο κύκλος", - "start_duration_threshold": "Δευτερόλεπτα πάνω από το κατώφλι για επιβεβαίωση εκκίνησης", - "start_threshold_w": "Ελάχιστα watt για να θεωρηθεί ότι ξεκίνησε", - "stop_threshold_w": "Κάτω από αυτό, το μηχάνημα θεωρείται εκτός λειτουργίας", - "anti_wrinkle_enabled": "Απορροφά τους παλμούς ανατροπής μετά την κύρια φάση αντί να τους διαβάζει ως νέους κύκλους", - "anti_wrinkle_exit_power": "Η ισχύς πρέπει να πέσει κάτω από αυτό μεταξύ των παλμών για να παραμείνει ενεργή η λειτουργία κατά τσακίσματος", - "anti_wrinkle_idle_timeout": "Ο χρόνος ησυχίας που επιτρέπεται ανάμεσα σε δύο παλμούς ανατροπής προτού λήξει η λειτουργία κατά τσακίσματος", - "anti_wrinkle_max_duration": "Ένας παλμός μεγαλύτερος από αυτό τερματίζει τη λειτουργία κατά τσακίσματος και ανοίγει νέο κύκλο", - "anti_wrinkle_max_power": "Ένας παλμός πάνω από αυτό τερματίζει τη λειτουργία κατά τσακίσματος και ανοίγει νέο κύκλο", - "dtw_bandwidth": "Στάδιο 3: ζώνη παραμόρφωσης Sakoe-Chiba (0 = DTW ανενεργό; προεπιλογή 0.2 = 20% μήκους κύκλου)", - "corr_weight": "Στάδιο 2: ισορροπία μεταξύ σχήματος καμπύλης (συσχέτιση) και επιπέδου ισχύος (MAE); προεπιλογή 0.45", - "duration_weight": "Στάδιο 4: πόσο επηρεάζει η συμφωνία διάρκειας τον τελικό βαθμό (προεπιλογή 0.22)", - "energy_weight": "Στάδιο 4: πόσο επηρεάζει η συμφωνία ενέργειας τον τελικό βαθμό (προεπιλογή 0.22)", - "profile_match_min_duration_ratio": "Στάδιο 1: ελάχιστο μήκος κύκλου ως κλάσμα της διάρκειας προφίλ; προεπιλογή 0.1 (10%)", - "profile_match_max_duration_ratio": "Στάδιο 1: μέγιστο μήκος κύκλου ως κλάσμα της διάρκειας προφίλ; προεπιλογή 1.5 (150%)", - "keep_min_score": "Στάδιο 2: κατώτατο όριο βαθμολογίας για παραμονή στον αγώνα; προεπιλογή 0.1 επιτρέπει αδύναμα ταιριάσματα, τα επόμενα στάδια επιλέγουν το καλύτερο", - "dtw_blend": "Στάδιο 3: 0 = μόνο βαθμός πυρήνα, 1 = μόνο βαθμός DTW, 0.5 = ισόρροπη ανάμειξη (προεπιλογή)", - "dtw_ensemble_w": "Στάδιο 3 (λειτουργία συνόλου): βάρος στο κλιμακωμένο-L1 έναντι παραγώγου DTW; προεπιλογή 0.7 ευνοεί το επίπεδο ισχύος", - "dtw_ddtw_scale": "Στάδιο 3: απόσταση ημίσεος κορεσμού DDTW; μικρότερη = μεγαλύτερη ευαισθησία σχήματος (προεπιλογή 30)", - "dtw_refine_top_n": "Στάδιο 3: υποψήφιοι που επαναβαθμολογεί η DTW; αυξήστε σε 7-9 αν το σωστό προφίλ βρίσκεται στη 4η-5η θέση (προεπιλογή 5)", - "duration_scale": "Στάδιο 4: λόγος λογαρίθμου όπου η συμφωνία διάρκειας υποδιπλασιάζεται; μικρότερος = αυστηρότερη ποινή (προεπιλογή 0.175)", - "energy_scale": "Στάδιο 4: λόγος λογαρίθμου όπου η συμφωνία ενέργειας υποδιπλασιάζεται; μικρότερος = αυστηρότερη ποινή (προεπιλογή 0.25)" - }, - "col": { - "profile_tip": "Όνομα αντιστοιχισμένου προγράμματος. Χωρίς ετικέτα σημαίνει ότι κανένα προφίλ δεν αντιστοιχίστηκε στο τέλος του κύκλου.", - "status_tip": "Έκβαση κύκλου: Ολοκληρώθηκε (φυσικό τέλος), Διακόπηκε (απότομη πτώση ισχύος), Αναγκαστική διακοπή (μη αυτόματη) ή Χρειάζεται αναθεώρηση (εκκρεμούν σχόλια).", - "date_tip": "Ημερομηνία και ώρα έναρξης του κύκλου.", - "duration_tip": "Συνολικός χρόνος λειτουργίας του κύκλου από την αρχή έως το τέλος.", - "energy_tip": "Συνολική ενέργεια που καταναλώθηκε (kWh). Υπολογίζεται με ολοκλήρωση της ισχύος στον χρόνο.", - "cost_tip": "Κόστος ενέργειας για αυτόν τον κύκλο, παγιωμένο κατά την ολοκλήρωση με βάση την ισχύουσα τότε τιμή (ενέργεια x τιμή ανά kWh). Ορίστε μια τιμή στις Ρυθμίσεις για να συμπληρωθεί.", - "confidence_tip": "Εμπιστοσύνη αντιστοίχισης προφίλ (0-100%). Πόσο στενά η καμπύλη ισχύος του κύκλου ταίριαξε με το αναγνωρισμένο πρόγραμμα.", - "health_tip": "Υγεία κύκλου ML (υψηλότερο = καλύτερο). Κάντε κλικ σε έναν κύκλο για να τον ελέγξετε και να τον αξιολογήσετε.", - "flags_tip": "Σημαίες αναθεώρησης, ανωμαλίας και πηγής για τον κύκλο. Τοποθετήστε τον δείκτη πάνω σε ένα εικονίδιο για λεπτομέρειες." - }, - "stat": { - "avg": "μ.ό.", - "min": "ελάχ {v}", - "max": "μέγ {v}", - "consistency": "συνέπεια ±{v}", - "total": "σύνολο {v}", - "last_run": "τελευταία εκτέλεση {v}", - "score": "βαθμολογία {pct}%", - "duration_cv": "CV διάρκειας {pct}%", - "avg_confidence": "μ.ό. εμπιστοσύνης {pct}%" - }, - "pg_evd": { - "detected": "Ο ανιχνευτής αναγνώρισε ότι είχε ξεκινήσει ένας κύκλος.", - "match_commit": "Ο μηχανισμός αντιστοίχισης επέλεξε ένα πρόγραμμα με αρκετή βεβαιότητα.", - "match_changed": "Το επικρατέστερο πρόγραμμα άλλαξε καθώς έγινε ορατό μεγαλύτερο μέρος του κύκλου.", - "match_ambiguous": "Δύο προγράμματα συγκέντρωσαν παρόμοια βαθμολογία, οπότε η αντιστοίχιση ήταν αβέβαιη.", - "unmatched": "Κανένα αποθηκευμένο πρόγραμμα δεν ταίριαξε σε αυτόν τον κύκλο.", - "notify_start": "Θα στελνόταν μια ειδοποίηση έναρξης.", - "notify_pre_complete": "Θα στελνόταν μια ειδοποίηση «σχεδόν έτοιμο».", - "notify_finish": "Θα στελνόταν μια ειδοποίηση ολοκλήρωσης.", - "notify_milestone": "Θα στελνόταν μια ειδοποίηση ορόσημου.", - "notify_held": "Μια ειδοποίηση κρατήθηκε λόγω των ωρών ησυχίας.", - "finished": "Ο κύκλος έφτασε σε τελική κατάσταση και ολοκληρώθηκε." - }, - "store": { - "browse": "Περιήγηση", - "device": "Συσκευή", - "favorites": "Αγαπημένα", - "search_ph": "Αναζήτηση κατά μάρκα ή μοντέλο…", - "no_results": "Δεν βρέθηκαν αντίστοιχες συσκευές. Δοκιμάστε διαφορετική αναζήτηση.", - "n_programs": "{n} προγράμματα", - "n_cycles": "{n} κύκλοι", - "no_programs": "Δεν υπάρχουν ακόμη κοινοποιημένα προγράμματα για αυτή τη συσκευή.", - "no_cycles": "Δεν έχουν κοινοποιηθεί ακόμη κύκλοι αναφοράς για αυτό το πρόγραμμα.", - "anon": "ανώνυμος", - "uploaded_by": "Κοινοποιήθηκε από {name}", - "connected_as": "Συνδεδεμένος ως {name}", - "not_connected": "Δεν έχει γίνει σύνδεση. Συνδέστε έναν λογαριασμό GitHub για να κοινοποιήσετε τους δικούς σας κύκλους.", - "import_new": "Νέο προφίλ", - "import_merge": "Συγχώνευση σε υπάρχον", - "merge_target": "Συγχώνευση σε προφίλ", - "description": "Περιγραφή (προαιρετικό)", - "contributed_by": "από {name}", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "Δεν υπάρχουν ακόμη βαθμολογίες", - "website": "Ιστότοπος καταστήματος ↗", - "website_tip": "Άνοιγμα ιστότοπου κοινοτικού καταστήματος" - }, - "settings": { - "gear": { - "title": "Ρυθμίσεις" - } - }, - "link": { - "manual": "Εγχειρίδιο ↗", - "add_appliance": "Προσθέστε τη συσκευή σας" - }, - "tip": { - "add_brand": "Η μάρκα δεν αναφέρεται; Προσθέστε την στον κατάλογο της κοινότητας", - "add_appliance": "Το μοντέλο δεν αναφέρεται; Προσθέστε τη συσκευή σας στον κατάλογο της κοινότητας", - "add_profile": "Προσθέστε ένα προφίλ για αυτή τη συσκευή στον ιστότοπο της κοινότητας" - }, - "task": { - "reprocess": { - "matching": "Επανεπεξεργασία: αντιστοίχιση κύκλων", - "golden": "Επανεπεξεργασία: επισήμανση κύκλων αναφοράς", - "suggestions": "Επανεπεξεργασία: προτάσεις", - "ml_training": "Επανεπεξεργασία: εκπαίδευση ML", - "health": "Επανεπεξεργασία: υγεία κύκλων" - }, - "pg_sweep": { - "optimize": "Βελτιστοποίηση: {param}" - }, - "pg_detail": { - "simulate": "Προσομοίωση κύκλου" - }, - "split": { - "apply": "Διαχωρισμός κύκλου" - }, - "trim": { - "apply": "Περικοπή κύκλου" - }, - "merge": { - "apply": "Συγχώνευση κύκλων" - }, - "rebuild": { - "envelopes": "Ανακατασκευή φακέλων" - }, - "cancelling": "Ακύρωση..." - }, - "setup": { "hdr": { - "card": "Ρύθμιση συσκευής", - "healthy_chip": "Ρύθμιση ολοκληρώθηκε" + "ab_comparison": "Σύγκριση ρυθμίσεων A/B", + "access_control": "Έλεγχος πρόσβασης", + "add_maintenance": "Προσθήκη συμβάντος συντήρησης", + "automation_delete": "Διαγράψτε αυτόν τον αυτοματισμό", + "automation_needs_review": "Αυτός ο κύκλος χρειάζεται αναθεώρηση", + "automation_open": "Ανοίξτε στο πρόγραμμα επεξεργασίας αυτοματισμού", + "automation_review_this_cycle": "Ελέγξτε αυτόν τον κύκλο", + "automations": "Αυτοματισμοί", + "clear_debug": "Εκκαθάριση ιχνών εντοπισμού σφαλμάτων", + "cycle_simulator": "Προσομοιωτής κύκλων", + "diagnostics_pref": "Διαγνωστικά", + "display": "Εμφάνιση", + "dtw_inspector": "Επιθεωρητής DTW", + "export_import": "Εξαγωγή / Εισαγωγή", + "getting_started": "Ξεκινώντας", + "live_power": "Ζωντανή ισχύς", + "logs": "Αρχεία καταγραφής", + "logs_diagnostics": "Διαγνωστικά", + "maintenance": "Ενέργειες Συντήρησης", + "maintenance_log": "Αρχείο συντήρησης", + "maintenance_reminders": "Υπενθυμίσεις σέρβις", + "manual_recording": "Χειροκίνητη εγγραφή", + "manual_recording_tip": "Εκτελέστε έναν κύκλο σκόπιμα ενώ το WashData καταγράφει το ίχνος ισχύος. Ξεκινήστε αμέσως πριν ανοίξει η συσκευή, σταματήστε όταν τελειώσει, και Επεξεργαστείτε για να το αποθηκεύσετε ως κατονομαζόμενο προφίλ.", + "ml_learned": "Τι έμαθε η WashData", + "ml_matching_tuning": "Βελτιστοποίηση αντιστοίχισης προγράμματος", + "ml_settings_card": "Ρυθμίσεις", + "ml_smart_learning": "Έξυπνη μάθηση", + "my_preferences": "Οι Προτιμήσεις μου", + "no_automations": "Δεν αναφέρονται ακόμη αυτοματισμοί σε αυτήν τη συσκευή.", + "panel_settings": "Ρυθμίσεις πίνακα", + "param_sweep": "Σάρωση παραμέτρων", + "pg_settings_source": "Προέλευση ρυθμίσεων", + "phase_catalog": "Κατάλογος Φάσης", + "playground": "Χώρος δοκιμών", + "process_history": "Επεξεργασία ιστορικού", + "settings_history": "Ιστορικό ρυθμίσεων", + "status": "Κατάσταση", + "status_graph": "Γράφημα κατάστασης", + "storage_stats": "Στατιστικά αποθήκευσης", + "test_history": "Δοκιμή στο ιστορικό", + "toggle_sidebar": "Εναλλαγή πλευρικής γραμμής Home Assistant", + "tools_and_data": "Εργαλεία & Δεδομένα", + "wipe_history": "Διαγραφή ιστορικού", + "recommendations": "Συστάσεις ({n})", + "pg_detection_params": "Ρυθμίσεις ανίχνευσης", + "pg_timeline": "Χρονολόγιο συμβάντων", + "pg_outcome": "Αποτέλεσμα προσομοίωσης", + "pg_across_cycles": "Σε όλους τους κύκλους σας", + "community_store": "Κοινοτικό Κατάστημα", + "online_account": "Κοινοτικό Κατάστημα & διαδικτυακές λειτουργίες" }, - "phase0": { - "washer": "Το WashData ανιχνεύει ήδη τους κύκλους σας. Εγγράψτε τον πρώτο κύκλο για να ενεργοποιήσετε ονόματα προγραμμάτων και εκτιμήσεις χρόνου.", - "dishwasher": "Το WashData παρακολουθεί. Τα πλυντήρια πιάτων έχουν σύνθετους κύκλους – συνιστάται ανεπιφύλακτα η εγγραφή του πρώτου κύκλου. Αν ένας ανιχνευθείς κύκλος διαρκεί πολύ, χρησιμοποιήστε το πρόγραμμα επεξεργασίας κύκλων για να τον περικόψετε πριν αποθηκευτεί ως προφίλ.", - "generic": "Το WashData παρακολουθεί. Εγγράψτε ή επισημάνετε έναν ανιχνευθέντα κύκλο για να ξεκινήσετε να δημιουργείτε προφίλ." + "health": { + "fair": "Αποδεκτή ποιότητα αντιστοίχισης", + "good": "✓ Καλή ποιότητα αντιστοίχισης", + "poor": "⚠ Κακή ποιότητα αντιστοίχισης" }, - "phase1a": { - "labelled": "Καλή αρχή – το πρώτο πρόγραμμά σας αποθηκεύτηκε. Για τα πιο καθαρά δεδομένα, σκεφτείτε να εγγράψετε τον επόμενο κύκλο με το widget εγγραφής." + "lbl": { + "actions": "Ενέργειες", + "activity": "Δραστηριότητα", + "administrators": "Διαχειριστές", + "aria_compare_chart": "Γράφημα σύγκρισης κύκλων", + "aria_cycle_chart": "Καμπύλη ισχύος κύκλου", + "aria_envelope_chart": "Γράφημα περιβάλλουσας ισχύος προφίλ", + "aria_phase_chart": "Γράφημα επεξεργασίας φάσεων", + "aria_playground_chart": "Καμπύλη ισχύος κύκλου με συρόμενα όρια ανίχνευσης", + "aria_power_chart": "Γράφημα κατανάλωσης ισχύος", + "aria_spaghetti_chart": "Επικαλυπτόμενες καμπύλες ισχύος κύκλων", + "aria_sweep_chart": "Γράφημα αποτελεσμάτων σάρωσης παραμέτρων", + "artifact_anomaly": "Ανωμαλία", + "artifact_high_power": "Υψηλή ισχύς", + "artifact_interruption": "Διακοπή", + "artifact_low_power": "Χαμηλή ισχύς", + "auto_detect": "Αυτόματος εντοπισμός", + "auto_fine_tune_off": "αυτόματη βελτιστοποίηση ανενεργή", + "auto_fine_tune_on": "αυτόματη βελτιστοποίηση ενεργή (περίπου {hour}:00)", + "avg_cost": "Μέσο κόστος", + "change": "Αλλαγή", + "clock_time": "Ώρα ρολογιού", + "cohesion_good": "συνοχή {pct}%", + "cohesion_low": "⚠ χαμηλή συνοχή {pct}%", + "compare_profiles": "Σύγκριση με προφίλ", + "concurrency": "Ταυτοχρονισμός", + "confidence": "Εμπιστοσύνη", + "confidence_threshold": "Όριο εμπιστοσύνης", + "correct_duration": "Σωστή διάρκεια (λεπτά, προαιρετικό)", + "correct_profile": "Σωστό Προφίλ", + "correlation": "Συσχέτιση", + "cost": "Κόστος", + "create_new_profile": "+ Δημιουργία νέου προφίλ…", + "current_phase": "Τρέχουσα φάση", + "curves": "Καμπύλες", + "cycle": "Κύκλος", + "cycle_date_display": "Εμφάνιση ημερομηνίας κύκλου", + "cycle_health": "Υγεία του κύκλου", + "cycle_index": "δείκτης κύκλου →", + "cycles": "Κύκλοι", + "cycles_count": "Κύκλοι", + "cycles_lc": "κύκλοι", + "dashed": "διακεκομμένη", + "date": "Ημερομηνία", + "debug_traces": "Ίχνη εντοπισμού σφαλμάτων", + "default": "Προεπιλογή", + "default_access_level": "Προεπιλεγμένο επίπεδο για χρήστες που δεν αναφέρονται παρακάτω", + "default_other": "Προεπιλογή (άλλες συσκευές)", + "default_tab": "Προεπιλεγμένη καρτέλα κατά το άνοιγμα του πίνακα", + "delta": "Δ", + "description": "Περιγραφή", + "dtw_blend_w": "Βάρος ανάμειξης", + "dtw_blended": "Αναμεμειγμένη βαθμολογία", + "dtw_ddtw": "Βαθμολογία DDTW", + "dtw_l1": "Βαθμολογία L1", + "dtw_matched_profile": "(αντιστοιχισμένο προφίλ του κύκλου)", + "duration": "Διάρκεια", + "duration_agreement": "Συμφωνία διάρκειας", + "emphasis": "Εμφαση", + "enable_access_control": "Ενεργοποίηση ελέγχου πρόσβασης ανά χρήστη", + "energy": "Ενέργεια", + "energy_agreement": "Συμφωνία ενέργειας", + "event_timeline": "Χρονολόγιο συμβάντων", + "event_type": "Τύπος συμβάντος", + "expected": "Αναμενόμενο", + "expected_duration": "Αναμενόμενη διάρκεια (λεπτά)", + "file_kb": "Αρχείο (kB)", + "final_score": "Τελική βαθμολογία", + "from": "Από", + "gap_s": "Κενό (δευτ.)", + "group_name": "Όνομα ομάδας", + "head_trim": "Περικοπή κεφαλής (δευτ.)", + "health": "Υγεία", + "hide_tabs": "Απόκρυψη καρτελών για μη διαχειριστές", + "in_use": "Σε χρήση", + "json_data": "Δεδομένα JSON", + "label": "Αντιστοιχισμένο πρόγραμμα", + "last": "Τελευταία", + "last_checked": "Τελευταίος έλεγχος:", + "load_from_file": "Φόρτωση από αρχείο", + "mae_score": "Βαθμολογία MAE", + "manual_duration": "Μη αυτόματη διάρκεια (λεπτά, προαιρετικό)", + "match": "Αντιστοίχιση", + "members": "Μέλη", + "metric": "Μετρική", + "mode_existing_profile": "Προσθήκη στο υπάρχον προφίλ", + "mode_new_profile": "Δημιουργία Νέου Προφίλ", + "models_fine_tuned": "({count} μοντέλο{plural} βελτιστοποιημένο)", + "n_classic_suggestions": "{n} κλασικά", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} επιλεγμένα", + "n_tuning_suggestions": "{n} πρόταση συντονισμού", + "na": "n/a", + "new_profile_name": "Νέο όνομα προφίλ", + "notes": "Σημειώσεις", + "of": "από", + "outcome": "Έκβαση", + "panel_default_tab": "Προεπιλεγμένη καρτέλα", + "panel_language": "Γλώσσα πίνακα", + "per_cycle_short": "κύκλος", + "pg_anti_wrinkle": "Κατά τσακίσματος", + "pg_autofill_tip": "Αυτόματη συμπλήρωση εύρους από την τρέχουσα τιμή ({lo}–{hi})", + "pg_best_value": "Καλύτερη τιμή που βρέθηκε", + "pg_current_value": "Τρέχουσα τιμή:", + "pg_drag_hint": "Σύρετε τη γραμμή στο γράφημα", + "pg_dtw": "DTW", + "pg_ev_ending": "Λήγει", + "pg_ev_running": "Εκτελείται", + "pg_group_advanced": "Ακραίες περιπτώσεις", + "pg_group_detection": "Ενεργοποιητές ανίχνευσης", + "pg_group_timing": "Κανόνες χρονισμού", + "pg_idle": "Αδρανής", + "pg_last_run": "Τελευταία εκτέλεση: {date}", + "pg_match_score": "Βαθμολογία αντιστοίχισης", + "pg_pct_of": "{p}% των {total}", + "pg_poor_match": "Κακή αντιστοίχιση", + "pg_preset": "Προρύθμιση Χώρου δοκιμών", + "pg_preset_name": "Όνομα νέας προρύθμισης", + "pg_preset_none": "Επιλέξτε προρύθμιση…", + "pg_strong_match": "Ισχυρή αντιστοίχιση", + "pg_tile_ambiguous": "Ασαφείς", + "pg_tile_ambiguous_tip": "Κύκλοι με σχεδόν ισοπαλία μεταξύ δύο προγραμμάτων", + "pg_tile_detected": "Εντοπισμένοι", + "pg_tile_detected_tip": "Κύκλοι όπου η ισχύς ξεπέρασε το κατώφλι εκκίνησης αρκετά ώστε να καταγραφεί ως σε λειτουργία", + "pg_tile_matched": "Αντιστοιχισμένοι", + "pg_tile_matched_tip": "Κύκλοι που αποδόθηκαν σωστά σε γνωστό πρόγραμμα", + "pg_time_left": "Χρόνος που απομένει", + "pg_weak_match": "Ασθενής αντιστοίχιση", + "phase_name": "Ονομα", + "phase_timeline": "Χρονολόγιο φάσεων", + "power": "Ισχύς", + "profile": "Προφίλ", + "profile_index": "δείκτης προφίλ →", + "profile_name": "Όνομα προφίλ", + "program": "Πρόγραμμα", + "program_tip": "Παρακάμψτε ποιο προφίλ αντιστοιχίζεται στον τρέχοντα κύκλο. Η αυτόματη ανίχνευση επιτρέπει στην ενσωμάτωση να επιλέξει αυτόματα την καλύτερη αντιστοίχιση. Καρφιτσώστε ένα συγκεκριμένο πρόγραμμα για αναγκαστική αντιστοίχιση όταν η αυτόματη ανίχνευση είναι λανθασμένη ή γνωρίζετε τι εκτελείται.", + "progress": "Πρόοδος", + "raw_socket": "Ακατέργαστο σήμα πρίζας", + "read_only": "Μόνο για ανάγνωση", + "ref_cycle": "Κύκλος αναφοράς (προαιρετικό)", + "refresh_interval": "Διάστημα ανανέωσης (δευτ.)", + "remaining": "Απομένει", + "reminder_every": "Υπενθύμιση κάθε (κύκλους)", + "remove_label": "- Αφαιρέστε την ετικέτα -", + "rename_profile": "Μετονομασία προφίλ", + "replay_duration": "Αναπαραγωγή", + "resulting_profile": "Προκύπτον προφίλ", + "save_mode": "Λειτουργία αποθήκευσης", + "score": "Βαθμολογία", + "score_breakdown": "Ανάλυση βαθμολογίας", + "seconds_from_start": "Δευτερόλεπτα από την αρχή", + "select_profile": "Επιλέξτε Προφίλ", + "setting": "Ρύθμιση", + "settings_a": "Ρυθμίσεις A (τρέχουσες)", + "settings_a_short": "A", + "settings_advanced": "Για προχωρημένους", + "settings_b": "Ρυθμίσεις B (δοκιμή)", + "settings_b_short": "B", + "settings_basic": "Βασικά", + "settings_detail_level": "Επίπεδο λεπτομέρειας ρυθμίσεων", + "settings_overrides": "Παρακάμψεις ρυθμίσεων", + "show_debug": "Εμφάνιση της κάρτας εντοπισμού σφαλμάτων ζωντανής αντιστοίχισης στη σελίδα Κατάσταση (εμπιστοσύνη, ασάφεια, κορυφαίοι υποψήφιοι)", + "show_expected": "Εμφάνιση αναμενόμενης επικάλυψης καμπύλης (αντιστοιχισμένο προφίλ, πορτοκαλί)", + "show_raw": "Εμφάνιση εναλλακτή ακατέργαστης πρίζας στο γράφημα ζωντανής ισχύος", + "sparkline": "Τάση διάρκειας πρόσφατων κύκλων", + "stage2": "Στάδιο 2 – βασική ομοιότητα", + "stage3": "Στάδιο 3 – DTW", + "stage4": "Στάδιο 4 – συμφωνία", + "status": "Κατάσταση", + "tail_trim": "Περικοπή ουράς (δευτ.)", + "timer_auto_pause": "Αυτόματη παύση", + "timer_min": "λεπτά", + "timer_msg_placeholder": "Μήνυμα (προαιρετικό, {device}/{program}/{minutes})", + "to": "Έως", + "ungrouped": "Μη ομαδοποιημένος", + "unlabelled": "Χωρίς ετικέτα", + "unlabelled_paren": "(χωρίς ετικέτα)", + "warp_path": "Διαδρομή warp", + "input": "Είσοδος:", + "start": "Έναρξη", + "end": "Τέλος", + "unit_s": "(s)", + "reviewed_on": "αξιολογήθηκε {date}", + "unknown": "Άγνωστο", + "quality": "Ποιότητα", + "tags": "Ετικέτες", + "at": "στις", + "pct_match_confidence": "{pct}% εμπιστοσύνη αντιστοίχισης", + "ha_restarted": "Επανεκκίνηση HA", + "from_start": "Από την αρχή", + "to_end": "Έως το τέλος", + "click_to_select": "κάντε κλικ για επιλογή", + "envelope": "Περιβάλλουσα", + "zoom_hint": "κύλιση για ζουμ · διπλό κλικ για επαναφορά", + "loading_paren": "(φόρτωση…)", + "time_remaining": "~{v} απομένουν", + "no_duration": "χωρίς διάρκεια", + "duration_avg": "~{v}m μ.ό.", + "name_placeholder": "(όνομα)", + "n_shown": ", {n} εμφανίζονται", + "cycles_title": "Κύκλοι ({n})", + "pg_detecting": "Εντοπισμός", + "pg_best_marker": "Βέλτιστο: {v}", + "pg_time_left_model": "Χρόνος που απομένει (μοντέλο)", + "pg_time_left_model_tip": "Εκτιμώμενος από το μοντέλο χρόνος που απομένει (εκτιμητής φάσης + μείγμα ML), όχι στατική αντίστροφη μέτρηση", + "phase": "Φάση", + "pg_mode_simulate": "Προσομοίωση", + "pg_mode_history": "Δοκιμή στο ιστορικό", + "pg_mode_sweep": "Σάρωση", + "pg_ev_detected": "Ανιχνεύθηκε", + "pg_ev_match": "Αντιστοίχιση οριστικοποιήθηκε", + "pg_ev_match_changed": "Αντιστοίχιση άλλαξε", + "pg_ev_ambiguous": "Ασαφής", + "pg_ev_unmatched": "Χωρίς αντιστοίχιση", + "pg_ev_notify_start": "Ειδοποίηση έναρξης", + "pg_ev_notify_pre": "Ειδοποίηση σχεδόν έτοιμο", + "pg_ev_notify_finish": "Ειδοποίηση ολοκλήρωσης", + "pg_ev_notify_milestone": "Ειδοποίηση ορόσημου", + "pg_ev_notify_held": "Η ειδοποίηση κρατήθηκε (ώρες ησυχίας)", + "pg_ev_finished": "Ολοκληρώθηκε", + "pg_ended": "Έληξε", + "pg_proj_energy": "Προβλ. ενέργεια", + "pg_alert_overrun": "Υπέρβαση", + "pg_alert_underrun": "Υστέρηση", + "pg_alert_did_not_finish": "Δεν ολοκληρώθηκε", + "pg_alert_false_end": "Χωρίστηκε σε πολλούς κύκλους", + "pg_alert_unmatched": "Χωρίς αντιστοίχιση", + "pg_alert_ambiguous": "Ασαφής αντιστοίχιση", + "pg_alert_energy": "Ανωμαλία ενέργειας", + "pg_newly_correct": "τώρα σωστό", + "pg_regressed": "επιδεινώθηκε", + "pg_end_timing_changed": "χρόνος λήξης άλλαξε", + "pg_vs_current": "έναντι τρέχοντος", + "pg_fixed": "διορθώθηκε", + "pg_broke": "χάλασε", + "pg_sweep_param": "Παράμετρος", + "pg_objective": "Στόχος", + "pg_steps": "Βήματα", + "pg_stress_group": "Δοκιμή τερματισμού αδράνειας", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "Επίπεδο αδράνειας (W)", + "pg_stress_idle_w_desc": "Παρακάμψτε το αυτόματα ανιχνευθέν κατώφλι κατάστασης αναμονής (αφήστε κενό για αυτόματο).", + "pg_stress_toggle": "Δοκιμή τερματισμού αδράνειας", + "pg_stress_toggle_desc": "Προσομοιώνει τη συσκευή που παραμένει στο επίπεδο κατανάλωσης αναμονής μετά το τέλος της εγγραφής - δείχνει αν και πότε το WashData σταματά τον κύκλο.", + "pg_sweep_2d": "Χάρτης θερμότητας 2D", + "pg_sweep_param_y": "2η παράμετρος", + "pg_obj_match": "Ακρίβεια αντιστοίχισης", + "pg_obj_endtiming": "Ακρίβεια χρόνου λήξης", + "pg_obj_falseend": "Ποσοστό ψευδών λήξεων", + "pg_obj_overrun": "Απόκλιση διάρκειας", + "pg_obj_ambiguity": "Ποσοστό ασάφειας", + "pg_best_combo": "καλύτερος συνδυασμός", + "pg_mode_optimize": "Βελτιστοποίηση", + "pg_group_matching": "Αντιστοίχιση προγράμματος", + "pg_zoom_hint": "διπλό κλικ για επαναφορά ζουμ", + "aria_playground_chart2": "Διαδραστικό γράφημα ισχύος κύκλου: τοποθετήστε τον δείκτη για ανάγνωση χρόνου/ισχύος, κυλήστε για ζουμ, σύρετε για μετακίνηση", + "pg_alert_timeout_end": "Τερματίστηκε λόγω λήξης χρόνου, όχι από πρόβλεψη", + "pg_alert_indefinite": "Θα εκτελούνταν επ' αόριστον", + "pg_alert_stress_cap": "Επιτεύχθηκε το όριο ασφαλείας", + "pg_alert_stress_ok": "Τερματισμός λόγω αδράνειας: ο κύκλος σταμάτησε", + "pg_alert_stress_warn": "Κατανάλωση αδράνειας πάνω από το κατώφλι διακοπής", + "task_pg_history": "Δοκιμή στο ιστορικό", + "task_pg_sweep": "Βελτιστοποίηση", + "task_reprocess": "Επανεπεξεργασία", + "task_ml_training": "Εκμάθηση", + "eta_secs": "απομένουν ~{n} δευτ.", + "eta_mins": "απομένουν ~{n} λεπτά", + "pg_recent_runs": "Πρόσφατες εκτελέσεις", + "pg_load_run": "Επαναφόρτωση αυτής της εκτέλεσης", + "pg_match_confidence": "Βεβαιότητα αντιστοίχισης", + "pg_envelope_fit": "Προσαρμογή στην περιβάλλουσα", + "pg_envelope_fit_tip": "Πόσο καλά ο κύκλος παραμένει μέσα στην αποθηκευμένη περιβάλλουσα ισχύος αυτού του προφίλ, μια διαφορετική οπτική από τη βεβαιότητα αντιστοίχισης.", + "n_imported_note": ", {n} εισηγμένοι", + "enable_online": "Ενεργοποίηση διαδικτυακών λειτουργιών", + "store_brand": "Μάρκα συσκευής", + "store_model": "Μοντέλο συσκευής", + "anonymous": "Ανώνυμος", + "rate_quality": "Βαθμολόγηση ποιότητας", + "rate_n": "{n} αστέρια", + "approved_only": "Μόνο εγκεκριμένα", + "adopt_settings": "Υιοθέτηση ρυθμίσεων επίσης", + "flags": "Σημαίες", + "include_phase_map": "Συμπερίληψη χάρτη φάσεων", + "include_settings": "Συμπερίληψη ρυθμίσεων ανίχνευσης & αντιστοίχισης", + "show_contributor": "Εμφάνιση ονομάτων συνεισφερόντων", + "task_pg_detail": "Προσομοίωση κύκλου", + "task_split": "Διαχωρισμός κύκλου", + "task_trim": "Περικοπή κύκλου", + "task_merge": "Συγχώνευση κύκλων", + "task_rebuild": "Ανακατασκευή περιβαλλουσών", + "cat_profiles": "Προφίλ (προγράμματα)", + "cat_real_cycles": "Κύκλοι (ιστορικό εκτελέσεων)", + "cat_reference_cycles": "Κύκλοι αναφοράς (εισαγμένοι)", + "cat_custom_phases": "Προσαρμοσμένες φάσεις", + "cat_profile_groups": "Ομάδες προφίλ", + "cat_settings": "Ρυθμίσεις ανίχνευσης & αναγνώρισης", + "cat_matching_config": "Ρύθμιση αναγνώρισης", + "cat_ml_models": "Μοντέλα ML", + "cat_feedback": "Ετικέτες σχολίων & αξιολόγησης", + "cat_suggestions": "Προτάσεις", + "cat_maintenance_log": "Αρχείο συντήρησης", + "cat_history_logs": "Ιστορικό & αρχεία αλλαγών", + "cat_lifetime_stats": "Συγκεντρωτικά σύνολα", + "cycles_short": "κύκλοι", + "import_mode": "Τρόπος συνδυασμού", + "mode_merge": "Συγχώνευση (διατήρηση δικών μου)", + "mode_replace": "Αντικατάσταση επιλεγμένων", + "cycle_destination": "Πού να πάνε οι εισαγόμενοι κύκλοι;", + "dest_reference": "Αναφορά (μόνο καμπύλη)", + "dest_real_history": "Πραγματικό ιστορικό (μετρά στα στατιστικά)", + "conflict_resolution": "Συγκρούσεις ονομάτων", + "conflict_import_copy": "Εισαγωγή ως αντίγραφο", + "conflict_keep_mine": "Διατήρηση δικών μου", + "conflict_overwrite": "Αντικατάσταση", + "font_size": "Μέγεθος γραμματοσειράς πίνακα" }, - "phase1b": { - "recorded": "Η εγγραφή σας αποθηκεύτηκε ως {profile_name}. Τώρα εγγράψτε ή επισημάνετε τα άλλα συνηθισμένα προγράμματά σας για να διευρύνετε την κάλυψη." + "log": { + "all_levels": "Όλα τα επίπεδα", + "all_devices": "Όλες οι συσκευές", + "all_components": "Όλα τα στοιχεία", + "search_ph": "Αναζήτηση στα αρχεία καταγραφής…" }, - "phase1c": { - "verify": "Έχετε {count} προγράμματα από την κοινότητα. Εκτελέστε έναν κύκλο για να επαληθεύσετε ότι το WashData τα αναγνωρίζει σωστά – η αντιστοίχιση θα βελτιώνεται καθώς η συσκευή σας δημιουργεί το δικό της ιστορικό." + "ml": { + "builtin_models": "● Χρήση ενσωματωμένων μοντέλων", + "fit_fair": "Αποδεκτός", + "fit_good": "Καλός", + "fit_slight": "Μικρός", + "fit_strong": "Ισχυρός", + "fit_weak": "Αδύναμος", + "fit_word": "κατάλληλος", + "personalized": "● Εξατομικευμένο σε αυτό το μηχάνημα", + "better_than_baseline": "{pct}% καλύτερα από τη βασική εκτίμηση ({metric})", + "trend_improving_tip": "Η καταλληλότητα αυτού του μοντέλου έχει βελτιωθεί στους πρόσφατους επανελέγχους.", + "trend_declining_tip": "Η καταλληλότητα αυτού του μοντέλου έχει υποχωρήσει στους πρόσφατους επανελέγχους· η αξιολόγηση περισσότερων κύκλων μπορεί να το βοηθήσει να μάθει ξανά.", + "trend_steady_tip": "Η καταλληλότητα αυτού του μοντέλου έχει παραμείνει σχεδόν σταθερή στους πρόσφατους επανελέγχους.", + "cap_blurb": { + "end": "Να γνωρίζει πότε ένας κύκλος έχει πράγματι ολοκληρωθεί", + "live_match": "Ταχύτερη αναγνώριση του προγράμματος που εκτελείται", + "quality": "Εντοπισμός κύκλων που ανιχνεύτηκαν λανθασμένα ή αλλοιώθηκαν", + "remaining_time": "Πρόβλεψη του χρόνου που απομένει", + "total_energy": "Πρόβλεψη της συνολικής ενέργειας και του κόστους" + }, + "cap_label": { + "end": "Ανίχνευση τέλους κύκλου", + "live_match": "Αναγνώριση προγράμματος", + "quality": "Έλεγχος ποιότητας κύκλου", + "remaining_time": "Εκτίμηση χρόνου που απομένει", + "total_energy": "Εκτίμηση ενέργειας" + }, + "metric_auc": "AUC {auc} σε δεδομένα ελέγχου", + "metric_mae": "σφάλμα: {model} έναντι της βάσης {baseline}" }, - "phase2": { - "cluster": "Το WashData έχει δει {count} κύκλους που δεν αντιστοιχούν σε κανένα αποθηκευμένο πρόγραμμα – μοιάζουν μεταξύ τους. Θέλετε να δημιουργήσετε ένα νέο προφίλ για αυτούς;", - "unmatched": "Ο τελευταίος κύκλος δεν αντιστοιχεί σε κανένα αποθηκευμένο πρόγραμμα. Είναι νέο πρόγραμμα;" + "modal": { + "auto_label": "Κύκλοι αυτόματης ετικέτας", + "correct_feedback": "Σωστή ανατροφοδότηση", + "create_profile": "Δημιουργία Προφίλ", + "cycle": "Κύκλος", + "edit_group": "Επεξεργασία ομάδας προφίλ", + "edit_phase": "Επεξεργασία Φάσης", + "import_config": "Εισαγωγή διαμόρφωσης", + "label_cycle": "Κύκλος ετικέτας", + "merge_cycles": "Συγχώνευση {n} Κύκλων", + "new_group": "Νέα ομάδα προφίλ", + "new_phase": "Νέα Φάση", + "process_history_msg": "Εκτέλεση αντιστοίχισης, ανανέωση προτάσεων, επανεκπαίδευση ML (αν είναι ενεργοποιημένο) και επανυπολογισμός υγείας κύκλων σε όλους τους αποθηκευμένους κύκλους. Αυτό μπορεί να πάρει λίγη ώρα.", + "process_history_ok": "Επεξεργασία", + "process_history_title": "Επεξεργασία Ιστορικού", + "process_recording": "Διαδικασία Εγγραφής", + "delete_maintenance_msg": "Διαγραφή αυτής της εγγραφής συντήρησης; Αυτό δεν μπορεί να αναιρεθεί.", + "delete_maintenance_title": "Διαγραφή συμβάντος συντήρησης", + "relabel_cycles": "Επανεπισήμανση {count} κύκλων", + "delete_automation_title": "Διαγραφή αυτοματισμού", + "delete_automation_msg": "Διαγραφή του αυτοματισμού \"{name}\" από το Home Assistant; Αυτό δεν μπορεί να αναιρεθεί.", + "remove_legacy_title": "Αφαίρεση ενεργειών παλαιού τύπου", + "remove_legacy_msg": "Αφαίρεση των προσαρμοσμένων ενεργειών παλαιού τύπου; Θα σταματήσουν να ενεργοποιούνται σε συμβάντα κύκλου. Αυτό δεν μπορεί να αναιρεθεί από τον πίνακα.", + "discard_recording_title": "Απόρριψη εγγραφής", + "discard_recording_msg": "Απόρριψη της αποθηκευμένης εγγραφής; Αυτό δεν μπορεί να αναιρεθεί.", + "dismiss_all_title": "Απόρριψη όλων των σχολίων", + "dismiss_all_msg": "Απόρριψη όλων των {count} εκκρεμών αιτημάτων σχολίων;", + "dismiss_all_ok": "Απόρριψη όλων", + "delete_phase_title": "Διαγραφή φάσης", + "delete_phase_msg": "Διαγραφή της φάσης \"{name}\";", + "clear_debug_title": "Εκκαθάριση δεδομένων εντοπισμού σφαλμάτων", + "clear_debug_msg": "Διαγραφή όλων των αποθηκευμένων ιχνών εντοπισμού σφαλμάτων;", + "wipe_all_title": "Διαγραφή όλων των δεδομένων", + "wipe_all_msg": "⚠️ Αυτό διαγράφει οριστικά ΟΛΟΥΣ τους κύκλους και τα προφίλ. Αυτό δεν μπορεί να αναιρεθεί.", + "wipe_all_ok": "Διαγραφή των πάντων", + "force_stop_title": "Αναγκαστική διακοπή κύκλου", + "force_stop_msg": "Αναγκαστική διακοπή του ενεργού κύκλου τώρα; Ο κύκλος θα αποθηκευτεί ως διακεκομμένος.", + "store_import": "Εισαγωγή κύκλου αναφοράς", + "store_share": "Κοινοποίηση στο κοινοτικό κατάστημα", + "store_share_device": "Κοινοποίηση αυτής της συσκευής", + "export_select": "Εξαγωγή - επιλογή δεδομένων", + "import_wizard": "Εισαγωγή - επιλογή δεδομένων" }, - "phase3": { - "suggestions": "Το WashData έχει προτάσεις ρυθμίσεων βάσει του ιστορικού κύκλων σας – ελέγξτε τις για βελτίωση της ακρίβειας ανίχνευσης.", - "groups": "Μερικά από τα προφίλ σας μοιάζουν με το ίδιο πρόγραμμα σε διαφορετικές θερμοκρασίες. Οργανώστε τα σε μια ομάδα για καλύτερη αντιστοίχιση.", - "phases": "Προσθέστε φάσεις προγράμματος στο {profile_name} για πιο ακριβείς εκτιμήσεις χρόνου που απομένει." + "msg": { + "appliance_monitor": "Οθόνη συσκευής", + "artifact_dip_detail": "Έπεσε κάτω από το συνηθισμένο εύρος ισχύος για ~{n}s.", + "artifact_footer": "Επισημαίνεται στο παραπάνω γράφημα. Αυτά είναι παροδικά τεχνουργήματα (π.χ. η πόρτα άνοιξε στα μέσα του κύκλου), όχι απαραίτητα προβλήματα.", + "artifact_header": "{n} ανωμαλίες που εντοπίστηκαν κατά τη διάρκεια αυτού του κύκλου", + "artifact_pause_detail": "Η ισχύς έπεσε σχεδόν στο μηδέν για ~{n}s και μετά ανέκαμψε – πιθανώς η πόρτα άνοιξε στα μέσα του κύκλου ή ο κύκλος τέθηκε σε παύση.", + "artifact_spike_detail": "Υπερέβη το συνηθισμένο εύρος ισχύος για ~{n}s.", + "auto_label_intro": "Εκχωρήστε προφίλ σε κύκλους χωρίς ετικέτα, των οποίων η εμπιστοσύνη αντιστοίχισης εξαλείφει το όριο.", + "automations_intro": "Το WashData ενεργοποιεί συμβάντα {start} / {end} και εκθέτει οντότητες, οπότε οι ειδοποιήσεις και οι ενέργειες κατασκευάζονται καλύτερα ως κανονικοί αυτοματισμοί του Home Assistant. Οι αυτοματισμοί που χρησιμοποιούν αυτή τη συσκευή εμφανίζονται παρακάτω.", + "cleanup_intro": "Κάθε κύκλος με ετικέτα επικαλύπτεται. Σημειώστε ακραίες τιμές και διαγράψτε για να καθαρίσετε το προφίλ.", + "clear_debug_hint": "Καταργήστε τα αποθηκευμένα δεδομένα εντοπισμού σφαλμάτων για να ελευθερώσετε χώρο.", + "collecting_data": "Συλλογή δεδομένων: απαιτούνται ακόμη {need} κύκλος{plural} πριν ξεκινήσει η βελτιστοποίηση ({current}/{min}).", + "compare_overlay_profiles": "Προφίλ επικάλυψης (ασθενώς)", + "compare_profiles_tip": "Επικαλύψτε άλλους φακέλους προφίλ στο παραπάνω γράφημα για να δείτε ποιος ταιριάζει καλύτερα σε αυτόν τον κύκλο.", + "compare_selected_cycles": "Επιλεγμένοι κύκλοι (συμπαγής) – εμφάνιση / απόκρυψη", + "consider_new_profile": "Σκεφτείτε να δημιουργήσετε ένα νέο προφίλ.", + "coverage_gap": "οι πρόσφατοι κύκλοι δεν έχουν αντίστοιχο προφίλ ({pct}% των τελευταίων 30).", + "coverage_gap_similar_cycles": "Βρέθηκαν {count} παρόμοιοι κύκλοι χωρίς ετικέτα – δημιουργήστε ένα προφίλ για να αρχίσετε την αντιστοίχισή τους.", + "cycles_deleted": "Διαγράφηκαν {count} κύκλοι", + "enough_data": "Αρκετά δεδομένα για εκμάθηση ({current}/{min} κύκλοι).", + "export_description": "Επιλέξτε ακριβώς ποια προφίλ, κύκλους, ρυθμίσεις και άλλα θα εξαχθούν σε JSON, ή αναλύστε ένα αρχείο και εισάγετε μόνο τα μέρη που θέλετε.", + "feedback_cycles_pending": "{n} κύκλος{s} για αξιολόγηση", + "feedback_prompt": "Επιβεβαιώστε ότι ήταν σωστό, διορθώστε το πρόγραμμα ή αγνοήστε.", + "feedback_relabel_hint": "Η επανεπισήμανση αυτού του κύκλου τον επιλύει επίσης.", + "filter_by_profile": "Φιλτράρισμα κατά προφίλ…", + "group_modal_help": "Ομαδοποιήστε προγράμματα με το ίδιο σχήμα που διαφέρουν σε θερμοκρασία/περιστροφή (οι διάρκειες μπορεί να διαφέρουν). Η αντιστοίχιση βαθμολογεί την ομάδα ως έναν υποψήφιο και, στη συνέχεια, επιλέγει το μέλος που ταιριάζει καλύτερα. Διαλέξτε τουλάχιστον 2. η επικάλυψη δείχνει πόσο μοιάζουν.", + "group_not_cohesive": "Αυτά τα προφίλ δεν είναι αρκετά παρόμοια ώστε να ομαδοποιούνται αξιόπιστα, επομένως η αντιστοίχιση τα αντιμετωπίζει μεμονωμένα μέχρι να αφαιρέσετε το ακραίο στοιχείο ή να χωρίσετε την ομάδα.", + "group_preview_hint": "Επιλέξτε 2+ μέλη για προεπισκόπηση και σύγκριση των καμπυλών ισχύος τους.", + "import_intro": "Φορτώστε ένα εξαγόμενο αρχείο ή επικολλήστε ένα ωφέλιμο φορτίο JSON παρακάτω.", + "legacy_actions_title": "{count} προσαρμοσμένη ενέργεια παλαιού τύπου εξακολουθεί να εκτελείται", + "live_chart_loading": "Το γράφημα ζωντανής ισχύος εμφανίζεται καθώς φτάνουν οι ενδείξεις.", + "loading": "Φόρτωση…", + "loading_curve": "Φόρτωση καμπύλης…", + "loading_settings": "Φόρτωση ρυθμίσεων…", + "log_buffer_hint": "Πρώτα τα νεότερα · αποθηκεύει προσωρινά τις τελευταίες 500 εγγραφές ha_washdata από την επανεκκίνηση · σύρετε το κάτω άκρο για αλλαγή μεγέθους.", + "maintenance_advisory": "Η αύξηση της διάρκειας/ενέργειας μπορεί να υποδηλώνει ότι απαιτείται συντήρηση της συσκευής (π.χ. αφαλάτωση, καθαρισμός φίλτρου).", + "maintenance_due": "Οφειλόμενη συντήρηση: {items}", + "maintenance_intro": "Καταγράψτε το σέρβις που πραγματοποιείτε σε αυτή τη συσκευή και λάβετε υπενθύμιση όταν κάθε εργασία οφείλεται ξανά.", + "maintenance_load_error": "Δεν ήταν δυνατή η φόρτωση των δεδομένων συντήρησης: {error}", + "maintenance_requires_access": "Η συντήρηση και η εξαγωγή/εισαγωγή απαιτούν πλήρη πρόσβαση.", + "manual_duration_hint": "Η μέση/αναμενόμενη διάρκεια κύκλου του προφίλ, που χρησιμοποιείται για εκτιμήσεις του υπολειπόμενου χρόνου. Επεξεργαστείτε για να το ορίσετε. αφήνοντάς το αμετάβλητο διατηρεί την τρέχουσα τιμή.", + "matching_tuning_intro": "Κατά την εκμάθηση, το WashData προσαρμόζει επίσης το βάρος της αντιστοίχισης προγράμματος σε σχέση με τη διάρκεια και την ενέργεια.", + "merge_intro": "Οι επιλεγμένοι κύκλοι συνδυάζονται σε έναν (χρονολογική σειρά, κενά γεμάτα με 0 W). Επιλέξτε το προφίλ που προκύπτει.", + "ml_intro": "Το WashData συνοδεύεται από έξυπνα μοντέλα που λειτουργούν εκτός συσκευασίας.", + "ml_learned_intro": "Μοντέλα προσαρμοσμένα σε αυτό το μηχάνημα.", + "ml_loading": "φόρτωση ML…", + "ml_settings_intro": "Δύο ανεξάρτητοι διακόπτες: ο ένας εφαρμόζει τα μοντέλα ενώ εκτελείται ένας κύκλος, ο άλλος επιτρέπει στην WashData να τα ρυθμίσει με ακρίβεια στο μηχάνημά σας με την πάροδο του χρόνου.", + "name_first_program": "Έχετε αρκετούς κύκλους – ονομάστε το πρώτο σας πρόγραμμα για να ξεκινήσει η αντιστοίχιση.", + "near_duplicate_cluster": "Εντοπίστηκε σχεδόν διπλό σύμπλεγμα προφίλ. Η ομαδοποίηση επιτρέπει την αξιόπιστη επιλογή αντιστοίχισης μεταξύ ομοίων (π.χ. ίδιο πρόγραμμα σε διαφορετική θερμοκρασία/περιστροφή).", + "no_cycles_match": "Κανένας κύκλος δεν ταιριάζει με το τρέχον φίλτρο.", + "no_cycles_profile": "Δεν υπάρχουν κύκλοι για αυτό το προφίλ.", + "no_cycles_selected": "Επιλέξτε πρώτα τουλάχιστον έναν κύκλο.", + "no_cycles_yet": "Δεν έχουν καταγραφεί ακόμη κύκλοι.", + "no_device_selected": "Δεν έχει επιλεγεί συσκευή.", + "no_devices": "Δεν έχουν διαμορφωθεί ακόμη συσκευές WashData.", + "no_envelope": "Δεν υπάρχει ακόμη φάκελος - ανακατασκευή μετά από κύκλους ετικετών.", + "no_envelope_overlay": "Δεν υπάρχει διαθέσιμος φάκελος για επικάλυψη.", + "no_fine_tuned": "Τίποτα δεν έχει βελτιωθεί ακόμα – Η WashData χρησιμοποιεί τα ενσωματωμένα μοντέλα της.", + "no_logs": "Δεν υπάρχουν ακόμα εγγραφές καταγραφής στην προσωρινή μνήμη.", + "no_maintenance": "Δεν έχει καταγραφεί συντήρηση ακόμα.", + "no_match_yet": "Καμία προσπάθεια αγώνα ακόμα - συμπληρώνεται κατά τη διάρκεια ενός κύκλου τρεξίματος.", + "no_other_users": "Δεν βρέθηκαν άλλοι χρήστες του Home Assistant.", + "no_phases": "Δεν έχουν καθοριστεί φάσεις.", + "no_phases_assigned": "Δεν έχουν εκχωρηθεί φάσεις.", + "no_profiles_compare": "Δεν υπάρχουν προφίλ για σύγκριση.", + "no_profiles_overlay": "Δεν υπάρχουν προφίλ για επικάλυψη.", + "no_profiles_yet": "Δεν υπάρχουν ακόμα προφίλ. Δημιουργήστε ένα από έναν κύκλο με ετικέτα.", + "no_profiles_yet_short": "Δεν υπάρχουν ακόμα προφίλ.", + "no_settings_match": "Δεν υπάρχουν ρυθμίσεις που να αντιστοιχούν στο \"{q}\"", + "no_split_points": "Δεν υπάρχουν ακόμη σημεία διαίρεσης.", + "no_suggestions": "Δεν υπάρχουν ενεργές προτάσεις.", + "notify_services_hint": "Χρησιμοποιήστε αναγνωριστικά υπηρεσιών {entity} (χωρισμένα με κόμμα για πολλαπλά). Μεταβλητές προτύπου: {vars}.", + "old_actions_warning": "Διαμορφώθηκε με το παλιό πρόγραμμα επεξεργασίας ενεργειών (τώρα καταργήθηκε). Εξακολουθούν να ενεργοποιούνται σε συμβάντα κύκλου, αλλά δεν είναι πλέον δυνατή η επεξεργασία τους εδώ. Μετατρέψτε τα σε κανονικό αυτοματισμό ή αφαιρέστε τα.", + "onboarding_progress": "{n} / 3 κύκλοι παρατηρήθηκαν", + "onboarding_watching": "Αφήστε τη συσκευή σας να λειτουργεί κανονικά – το WashData παρακολουθεί. Μετά από 3 κύκλους, θα ξεκινήσει η αντιστοίχιση προγραμμάτων.", + "pending_feedback": "Εκκρεμεί σχόλια ανίχνευσης", + "performance_trend": "Τάση απόδοσης ({n} κύκλοι)", + "pg_analysis_empty": "Φορτώστε έναν κύκλο για να δείτε την ανάλυση αντιστοίχισης.", + "pg_apply_confirm": "Εφαρμογή της καλύτερης τιμής: {label} = {value};", + "pg_canvas_empty": "Επιλέξτε έναν κύκλο παραπάνω και, στη συνέχεια, πατήστε Φόρτωση για να δείτε την καμπύλη ισχύος του.", + "pg_chart_caption": "Ποσοστό εντοπισμού/αντιστοίχισης ανά τιμές του {param}", + "pg_ctrl_intro": "Οι τιμές ξεκινούν από τις ενεργές ρυθμίσεις ενσωμάτωσης αυτής της συσκευής. Οι αλλαγές παραμένουν στον Χώρο δοκιμών μέχρι να τις εφαρμόσετε.", + "pg_live_unavailable": "Οι ενεργές ρυθμίσεις δεν είναι διαθέσιμες, εμφανίζονται οι προεπιλογές.", + "pg_load_live_confirm": "Να απορριφθούν οι αλλαγές του Χώρου δοκιμών ({n}) και να επαναφορτωθούν οι τρέχουσες ρυθμίσεις της ενσωμάτωσης;", + "pg_match_rate": "{pct}% ποσοστό αντιστοίχισης σε {total} κύκλους", + "pg_matches_live": "Ταυτίζεται με τις ενεργές ρυθμίσεις", + "pg_n_changed": "Διαφορές από τις ενεργές ρυθμίσεις: {n}", + "pg_sugg_none": "Όλες οι προτάσεις αντιστοιχούν ήδη στις τρέχουσες ρυθμίσεις", + "pg_preset_delete_confirm": "Διαγραφή της προρύθμισης \"{name}\";", + "pg_preset_limit": "Συμπληρώθηκε το όριο προρυθμίσεων ({n})", + "pg_preset_overwrite": "Αντικατάσταση της προρύθμισης \"{name}\";", + "pg_publish_one_confirm": "Αποθήκευση {label} = {value} στις ρυθμίσεις αυτής της συσκευής;", + "pg_restart_note": "Επανεκκινήστε το Home Assistant για να ενεργοποιήσετε τα εργαλεία προσομοίωσης.", + "pg_sim_progress": "{done} / {total} κύκλοι", + "pg_starting": "Εκκίνηση…", + "pg_stress_synthetic": "η προσομοίωση αδράνειας ξεκινά εδώ", + "pg_sweep_intro": "Τι θα γινόταν αν το {param} ήταν διαφορετικό; Δοκιμάστε {steps} τιμές στους τελευταίους {cycles} κύκλους για να βρείτε τη ρύθμιση όπου αντιστοιχίζονται σωστά οι περισσότεροι κύκλοι.", + "pg_sweep_step": "Βήμα {done} / {total}", + "pg_undetected": "{n} μη εντοπισμένος κύκλος{s}", + "pg_verdict_bad": "Χρειάζεται προσοχή: πολλοί κύκλοι δεν εντοπίζονται.", + "pg_verdict_good": "Καλά ρυθμισμένο: οι περισσότεροι κύκλοι αναγνωρίζονται και αντιστοιχίζονται σωστά.", + "pg_verdict_ok": "Αποδεκτό: ορισμένοι κύκλοι χάθηκαν. Δοκιμάστε να μειώσετε το κατώφλι εκκίνησης.", + "phase_catalog_intro": "Ονομασμένα τμήματα ενός κύκλου (Πρόπλυση, Θέρμανση, Στύψιμο…). Αντιστοιχίστε τα σε ένα προφίλ από τον πίνακα ελέγχου του.", + "phase_ranges_intro": "Εύρος φάσεων (λεπτά από την έναρξη του κύκλου) που επικαλύπτονται στη μέση καμπύλη. Επεξεργαστείτε τις τιμές για ζωντανή προεπισκόπηση.", + "playground_intro": "Ένας ασφαλής χώρος δοκιμών για την αναπαραγωγή παλαιότερων κύκλων με διαφορετικές ρυθμίσεις, τη σύγκριση δύο διαμορφώσεων δίπλα δίπλα και την εξέταση του πώς ένας κύκλος ευθυγραμμίζεται με ένα προφίλ. Τίποτα εδώ δεν αλλάζει τα ενεργά σας δεδομένα μέχρι να το εφαρμόσετε ρητά.", + "playground_needs_restart": "Επανεκκινήστε το Home Assistant για να ενεργοποιήσετε τα εργαλεία του Χώρου δοκιμών.", + "preferences_admin": "Προτιμήσεις, πίνακας & έλεγχος πρόσβασης", + "preferences_adv": "Προτιμήσεις", + "prefs_personal": "Αυτά ισχύουν μόνο για τον λογαριασμό σας Home Assistant.", + "process_history_hint": "Εκτέλεση αντιστοίχισης σε όλους τους αποθηκευμένους κύκλους, ανανέωση προτάσεων ρύθμισης, επανεκπαίδευση μοντέλων ML (αν είναι ενεργοποιημένα) και επανυπολογισμός υγείας κύκλων. Εκτελέστε το μετά από μια δέσμη αξιολογήσεων.", + "profile_deleted": "Το προφίλ διαγράφηκε", + "profile_poor_health_detail": "Οι κύκλοι που έχουν εκχωρηθεί σε αυτό το προφίλ έχουν ασυνεπή σχήματα ή χαμηλή εμπιστοσύνη. Εξετάστε το ενδεχόμενο να φτιάξετε ξανά το φάκελο ή να αναθεωρήσετε τους κύκλους με ετικέτα.", + "profiles_intro": "Κάντε κλικ σε ένα προφίλ για στατιστικά στοιχεία, φάσεις και εκκαθάριση. Ομαδοποιήστε σχεδόν πανομοιότυπα προγράμματα (ίδιο σχήμα/διάρκεια, διαφορετική θερμοκρασία ή στύψιμο) ώστε να ταιριάζουν αξιόπιστα οι επιλογές μεταξύ τους.", + "rbac_hint": "Όταν είναι απενεργοποιημένο, κάθε χρήστης του Home Assistant έχει πλήρη πρόσβαση (η προεπιλογή). Οι διαχειριστές έχουν πάντα πλήρη πρόσβαση και μπορούν να διαχειρίζονται όλους.", + "recent_logs": "Πρόσφατες εγγραφές ha_washdata", + "recording_in_progress": "Η εγγραφή σε εξέλιξη", + "reminders_intro": "Εμφάνιση υπενθύμισης στον πίνακα τόσους κύκλους μετά το τελευταίο σέρβις. Αφήστε κενό ή 0 για απενεργοποίηση μιας υπενθύμισης.", + "restart_gap_footer": "Επισημασμένο στο γράφημα. Τα δεδομένα ισχύος λείπουν για αυτά τα διαστήματα· η αντιστοίχιση χρησιμοποίησε μόνο πραγματικές μετρήσεις.", + "restart_gap_header": "{n} κενό επανεκκίνησης HA κατά τη διάρκεια αυτού του κύκλου", + "restart_gap_item": "{dur} κενό", + "review_confirm_help": "Επιβεβαιώστε εάν αυτός ο κύκλος εντοπίστηκε σωστά. Οι κριτικές σας εκπαιδεύουν το μοντέλο στο μηχάνημά σας - όσο περισσότερους κύκλους επιβεβαιώσετε, τόσο καλύτερη αντιστοίχιση και βαθμολογία υγείας. Ένα γρήγορο Καλό/Κακό είναι αρκετό.", + "review_in_settings": "Έλεγχος στις Ρυθμίσεις", + "review_notes_placeholder": "Σημειώσεις (προαιρετικό)", + "review_notes_tip": "Σημειώσεις ελεύθερου κειμένου για δική σας αναφορά. Δεν χρησιμοποιείται με ταίριασμα ή προπόνηση.", + "review_profile_tip": "Το πρόγραμμα αυτού του κύκλου χαρακτηρίζεται ως. Εάν το πρόγραμμα που εντοπίστηκε αυτόματα ήταν λάθος, διορθώστε το εδώ - η επισήμανση διδάσκει αντιστοίχιση για μελλοντικούς κύκλους.", + "review_quality_tip": "Πόσο καθαρός είναι αυτός ο κύκλος. Καλό = παράδειγμα βιβλίου αυτού του προγράμματος. Κακό = ανιχνεύθηκε αλλά θορυβώδες ή άτυπο. Μη χρησιμοποιήσιμο = εσφαλμένα εντοπισμένο (συγχωνευμένο, περικομμένο ή ψευδές). Οδηγεί το δείκτη υγείας και ποιοι κύκλοι επιτρέπονται για την εκπαίδευση του μοντέλου.", + "review_recorded_tip": "Επισημάνετε αυτό ως έναν επιλεγμένο από το χέρι κύκλο αναφοράς για το πρόγραμμά του - τον ίδιο ρόλο με έναν μη αυτόματα εγγεγραμμένο κύκλο. Οι κύκλοι αναφοράς διατηρούνται πάντα, εισάγονται το αντίστοιχο πρότυπο και δεν απορρίπτονται ποτέ με εκκαθάριση. (Αυτή είναι η \"χρυσή\"/ηχογραφημένη σημαία· και τα δύο είναι το ίδιο πράγμα.)", + "review_tags_tip": "Προαιρετικές σημαίες που περιγράφουν τι πήγε στραβά με αυτόν τον κύκλο, οπότε η εκπαίδευση και ο καθαρισμός μπορούν να το εξηγήσουν.", + "review_to_cycles": "Ανοίξτε την ουρά ελέγχου Κύκλων", + "saving_triggers_reload": "Η αποθήκευση ενεργοποιεί μια εκ νέου φόρτωση ενσωμάτωσης. Οι οντότητες HA ενδέχεται να εμφανίζονται για λίγο ως μη διαθέσιμες.", + "search_placeholder": "Ρυθμίσεις αναζήτησης…", + "see_recorder": "Δείτε παρακάτω το γραφικό στοιχείο εγγραφής", + "setting_changed": "Άλλαξε από {old} σε {new} στις {date}", + "settings_basic_note": "Εμφανίζονται οι βασικές ρυθμίσεις. Μεταβείτε στο Για προχωρημένους για την πλήρη λίστα.", + "shape_drift_advisory": "⚠ Απόκλιση σχήματος", + "shape_drift_detail": "Το μοτίβο ισχύος αυτού του προφίλ έχει αλλάξει με την πάροδο του χρόνου – πιθανή φθορά της συσκευής ή απαιτείται συντήρηση (π.χ. αφαλάτωση, καθαρισμός φίλτρου).", + "show_all_settings": "Εμφάνιση όλων των ρυθμίσεων", + "showing_suggestions": "Εμφάνιση ρύθμισης {count} με προτάσεις.", + "split_intro": "Κάντε κλικ στο γράφημα για να προσθέσετε ή να αφαιρέσετε ένα σημείο διαίρεσης ή για αυτόματη ανίχνευση με κενά αδράνειας. Κάθε τμήμα που προκύπτει μπορεί να αποκτήσει το δικό του προφίλ.", + "storage_diagnostics": "Στατιστικά αποθήκευσης, συντήρηση, εξαγωγές/εισαγωγές", + "sug_staged": "Ορίστηκε {key} = {val}. Αποθηκεύστε για εφαρμογή.", + "toast_auto_detect_enabled": "Αυτόματη ανίχνευση ενεργοποιήθηκε", + "toast_auto_label_complete": "Αυτόματη επισήμανση ολοκληρώθηκε", + "toast_auto_label_failed": "Αυτόματη επισήμανση απέτυχε: {error}", + "toast_automation_failed": "Δεν ήταν δυνατή η δημιουργία αυτοματισμού: {error}", + "toast_automation_migrated": "Ενέργειες μεταφέρθηκαν σε αυτοματισμό· άνοιγμα επεξεργαστή", + "toast_convert_failed": "Η μετατροπή απέτυχε: {error}", + "toast_create_failed": "Η δημιουργία απέτυχε: {error}", + "toast_delete_failed": "Η διαγραφή απέτυχε: {error}", + "toast_error": "Σφάλμα: {error}", + "toast_failed": "Αποτυχία: {error}", + "toast_force_stop_failed": "Η αναγκαστική διακοπή απέτυχε: {error}", + "toast_name_required": "Απαιτείται όνομα", + "toast_no_automation": "Δεν είναι δυνατή η δημιουργία αυτοματισμού εδώ", + "toast_profile_name_required": "Απαιτείται όνομα προφίλ", + "toast_program_set": "Πρόγραμμα ορίστηκε: {program}", + "toast_rebuild_failed": "Η ανακατασκευή απέτυχε: {error}", + "toast_resume_failed": "Η επανέναρξη απέτυχε: {error}", + "toast_revert_failed": "Η επαναφορά απέτυχε: {error}", + "toast_reverted": "Έγινε επαναφορά: {key}", + "toast_save_failed": "Η αποθήκευση απέτυχε: {error}", + "trend_duration_longer": "Μεγαλύτερη τάση διάρκειας ({pct}%/κύκλος) – πρόσφατος μέσος όρος {avg}", + "trend_duration_shorter": "Μικρότερη τάση διάρκειας ({pct}%/κύκλος) – πρόσφατος μέσος όρος {avg}", + "trend_energy_down": "Πτωτική τάση ενέργειας ({pct}%/κύκλος)", + "trend_energy_up": "Ανοδικές τάσεις ενέργειας ({pct}%/κύκλος) – πρόσφατος μέσος όρος {avg}", + "trim_destructive_confirm": "Αυτό διατηρεί μόνο το {pct}% του κύκλου και δεν μπορεί να αναιρεθεί. Συνέχεια;", + "trim_intro": "Σύρετε τις κόκκινες λαβές ή εισαγάγετε τιμές. Όλα έξω από το παράθυρο αφαιρούνται.", + "tuning_suggestions_available": "{count} πρόταση συντονισμού διαθέσιμη από παρατηρούμενους κύκλους. Εμφανίζονται δίπλα στα σχετικά πεδία.", + "unsure_detected_prefix": "Το WashData δεν είναι βέβαιο ότι εντόπισε", + "updated": "Ενημερώθηκε", + "warmup_badge": "Συνεχίζει να μαθαίνει ({done}/{needed} κύκλοι)", + "warmup_detail": "Αυτό το προφίλ χρειάζεται {needed} επισημασμένους κύκλους πριν ξεκινήσει η αυτόματη αντιστοίχιση. Κάθε επιβεβαιωμένος κύκλος βοηθά στη μάθηση.", + "wipe_history_warning": "Διαγράψτε οριστικά όλους τους κύκλους και τα προφίλ. Δεν είναι δυνατή η αναίρεση.", + "compare_overlay_tip": "Επικαλύψτε τους εκμαθημένους φακέλους προφίλ για να δείτε με ποιο πρόγραμμα μοιάζει κάθε κύκλος.", + "duration_trend_up_tip": "Αύξηση διάρκειας ({pct}%/κύκλο)", + "duration_trend_down_tip": "Μείωση διάρκειας ({pct}%/κύκλο)", + "energy_trend_up_tip": "Αύξηση ενέργειας ({pct}%/κύκλο)", + "energy_trend_down_tip": "Μείωση ενέργειας ({pct}%/κύκλο)", + "performance_trending": "Τάση απόδοσης", + "pg_select_cycle_hint": "Επιλέξτε έναν κύκλο και κάντε κλικ στο ↺ για φόρτωση", + "pg_sweep_progress": "Βήμα {done} / {total}", + "pg_analysis_hint": "Επιλέξτε έναν κύκλο και κάντε κλικ στο ↺ για φόρτωση της ανάλυσης.", + "diagnostics_load_failed": "Δεν ήταν δυνατή η φόρτωση των διαγνωστικών: {error}", + "manual_duration_ref_hint": "Χρησιμοποιείται μόνο όταν δεν έχει επιλεγεί κύκλος αναφοράς. Ένας κύκλος αναφοράς ορίζει τη διάρκεια από το δικό του μήκος.", + "toast_convert_rolled_back": "Η μετατροπή απέτυχε και αναιρέθηκε (δεν έμεινε κανένας αυτοματισμός): {error}", + "toast_convert_orphan": "Ο αυτοματισμός δημιουργήθηκε, αλλά η εκκαθάριση των παλιών ενεργειών απέτυχε. Μην προσπαθήσετε ξανά· αφαιρέστε τις παλιές ενέργειες χειροκίνητα για να αποφύγετε έναν διπλότυπο αυτοματισμό.", + "advisory_duration_trend_up": "Οι κύκλοι '{name}' διαρκούν όλο και περισσότερο (περίπου +{pct}% ανά κύκλο). Αν άλλαξε η συμπεριφορά της συσκευής, καταγράψτε ξανά ή ανακατασκευάστε αυτό το προφίλ.", + "advisory_energy_trend_up": "Το '{name}' καταναλώνει όλο και περισσότερη ενέργεια (περίπου +{pct}% ανά κύκλο) - αξίζει να ελέγξετε τη συσκευή αν αυτό είναι απροσδόκητο.", + "advisory_poor_health": "Το '{name}' έχει χαμηλή βαθμολογία ταιριάσματος - οι πρόσφατοι κύκλοι του διαφέρουν πολύ ή ταιριάζουν ασθενώς. Ελέγξτε τους κύκλους του ή καταγράψτε ξανά το προφίλ ώστε η αναγνώριση και οι εκτιμήσεις χρόνου να παραμείνουν ακριβείς.", + "advisory_shape_drift": "Το '{name}' έχει αποκλίνει σημαντικά από την αρχική του καμπύλη ισχύος. Η συμπεριφορά της συσκευής μπορεί να έχει αλλάξει με την πάροδο του χρόνου (π.χ. άλατα, φθορά). Εξετάστε το ενδεχόμενο νέας καταγραφής αυτού του προφίλ με πρόσφατους κύκλους.", + "advisory_shape_drift_corr": "Το '{name}' έχει αποκλίνει σημαντικά από την αρχική του καμπύλη ισχύος (συσχέτιση {corr}). Η συμπεριφορά της συσκευής μπορεί να έχει αλλάξει με την πάροδο του χρόνου (π.χ. άλατα, φθορά). Εξετάστε το ενδεχόμενο νέας καταγραφής αυτού του προφίλ με πρόσφατους κύκλους.", + "pg_no_alerts": "Δεν εντοπίστηκαν προβλήματα σε αυτή την εκτέλεση.", + "pg_override_active": "Χρησιμοποιούνται οι επεξεργασμένες ρυθμίσεις σας έναντι των τρεχουσών", + "pg_history_intro": "Αναπαράγετε τους πρόσφατους κύκλους σας μέσω του πραγματικού ανιχνευτή και αντιστοιχιστή. Επεξεργαστείτε πρώτα μια ρύθμιση ανίχνευσης στη λειτουργία Προσομοίωση για να δείτε εδώ μια σύγκριση πριν/μετά.", + "pg_history_empty": "Πατήστε Εκτέλεση για να αναπαράγετε τους κύκλους σας.", + "pg_history_summary": "{detected}/{total} ανιχνεύθηκαν · {correct} αντιστοιχίστηκαν σωστά", + "pg_sweep_no_metric": "Δεν υπάρχουν αρκετά δεδομένα για τη βαθμολόγηση αυτού του στόχου.", + "pg_sweep_intro2": "Βρείτε τη ρύθμιση που ικανοποιεί καλύτερα έναν στόχο στους πρόσφατους κύκλους σας. Τίποτα δεν αλλάζει μέχρι να την εφαρμόσετε.", + "pg_running_history": "Αναπαραγωγή των κύκλων σας…", + "pg_running_sweep": "Δοκιμή τιμών σε όλους τους κύκλους σας…", + "pg_row_load_hint": "Φόρτωση αυτού του κύκλου στο παραπάνω γράφημα", + "pg_history_intro2": "Αναπαραγάγετε τους πρόσφατους κύκλους σας μέσω του πραγματικού ανιχνευτή και μηχανισμού αντιστοίχισης με τις παραπάνω ρυθμίσεις. Κάντε κλικ σε οποιαδήποτε γραμμή για να φορτώσετε αυτόν τον κύκλο στο γράφημα. Επεξεργαστείτε μια ρύθμιση για να δείτε μια σύγκριση πριν/μετά.", + "pg_simulating": "Προσομοίωση κύκλου…", + "pg_canvas_empty2": "Επιλέξτε έναν κύκλο παραπάνω και πατήστε Εκτέλεση για να τον προσομοιώσετε. Στη συνέχεια τοποθετήστε τον δείκτη για ανάγνωση τιμών, κυλήστε για ζουμ και σύρετε για μετακίνηση.", + "pg_apply_settings_confirm": "Αποθήκευση αυτών των {n} ρυθμίσεων σε αυτήν τη συσκευή; {list}", + "pg_stress_terminated_detail": "Σταθεροποιήθηκε σε περίπου {idle} W αδράνειας -- ο κύκλος τερμάτισε {h} ώρ. {m} λεπ. αργότερα μέσω {reason}.", + "pg_stress_above_threshold_detail": "Η κατανάλωση αδράνειας (~{idle} W) είναι ίση ή μεγαλύτερη από το πραγματικό κατώφλι διακοπής ({stop} W) -- ο κύκλος δεν καταγράφηκε ποτέ ως ήσυχος. Για διόρθωση, αυξήστε το stop_threshold_w.", + "pg_stress_hit_cap_detail": "Ο κύκλος έτρεξε {h} ώρ. {m} λεπ. χωρίς να σταματήσει -- διακόπηκε αναγκαστικά από το όριο ασφαλείας. Κατανάλωση αδράνειας {idle} W έναντι κατωφλίου διακοπής {stop} W.", + "no_logs_match": "Καμία εγγραφή καταγραφής δεν ταιριάζει με αυτά τα φίλτρα.", + "pg_analysis_hint2": "Επιλέξτε έναν κύκλο και πατήστε Εκτέλεση για να φορτώσετε την ανάλυση αντιστοίχισης.", + "pg_analysis_empty2": "Πατήστε Εκτέλεση για να δείτε την ανάλυση αντιστοίχισης.", + "imported_readonly": "Εισαγωγή από το κοινοτικό κατάστημα. Εμφανίζεται για αναφορά και αντιστοίχιση. Δεν προσμετράται στα στατιστικά σας και δεν μπορεί να επεξεργαστεί.", + "merge_no_imports": "Οι εισηγμένες καταγραφές δεν μπορούν να συγχωνευθούν σε πραγματικό κύκλο. Αποεπιλέξτε τες για συγχώνευση.", + "store_enable_hint": "Ενεργοποιήστε τις διαδικτυακές λειτουργίες στις Ρυθμίσεις για να περιηγηθείτε και να εισαγάγετε κύκλους αναφοράς της κοινότητας.", + "online_intro": "Κοινοποιήστε και κατεβάστε κύκλους αναφοράς με άλλους χρήστες του WashData. Όλες οι διαδικτυακές λειτουργίες είναι προαιρετικές και ανενεργές από προεπιλογή.", + "store_share_intro": "Ανεβάστε αυτόν τον κύκλο αναφοράς ώστε να μπορούν να τον χρησιμοποιήσουν άλλοι με την ίδια συσκευή. Ελέγχεται πριν εμφανιστεί δημόσια.", + "online_intro_global": "Περιηγηθείτε και κοινοποιήστε καταγραφές αναφοράς με άλλους χρήστες του WashData και επιβεβαιώστε καταχωρίσεις συσκευών. Μία σύνδεση ισχύει για ολόκληρη την ενσωμάτωση WashData· η μάρκα και το μοντέλο της συσκευής ορίζονται ανά συσκευή στην ενότητα Βασικά. Όλες οι διαδικτυακές λειτουργίες είναι προαιρετικές και ανενεργές από προεπιλογή.", + "online_unavailable": "Οι διαδικτυακές λειτουργίες δεν είναι διαθέσιμες σε αυτόν τον διακομιστή.", + "store_picker_offline": "Ενεργοποιήστε τις διαδικτυακές λειτουργίες στο γρανάζι ρυθμίσεων για να επιλέξετε από τον κατάλογο της κοινότητας.", + "pick_brand_first": "Επιλέξτε πρώτα μια μάρκα συσκευής.", + "model_not_found": "Δεν υπάρχει ακόμη στον κατάλογο.", + "connect_to_confirm": "Συνδεθείτε στο γρανάζι ρυθμίσεων για επιβεβαίωση ή βαθμολόγηση.", + "adopt_settings_hint": "Αντικατάσταση των ορίων ανίχνευσης & αντιστοίχισης αυτής της συσκευής με τα κοινοποιημένα. Οι ειδοποιήσεις, οι οντότητες και η τιμή ενέργειάς σας δεν αλλάζουν ποτέ.", + "include_settings_hint": "Κοινοποίηση των ορίων αναγνώρισης και αντιστοίχισης αυτής της συσκευής (όχι ειδοποιήσεων, οντοτήτων ή τιμής ενέργειας). Οι υιοθετούντες επιλέγουν εάν θα τα εφαρμόσουν.", + "onboard_download": "Νέα συσκευή; Υιοθετήστε μια έτοιμη ρύθμιση (προγράμματα, κύκλους αναφοράς και φάσεις) από έναν άλλο χρήστη WashData με την ίδια συσκευή.", + "share_consent": "Επιβεβαιώνω ότι αυτοί οι κύκλοι ολοκληρώθηκαν κανονικά χωρίς διακοπή", + "share_device_none": "Δεν υπάρχουν ακόμα κύκλοι για κοινοποίηση. Επισημάνετε πρώτα έναν καταγεγραμμένο ή χειροκίνητα επιλεγμένο κύκλο ως κύκλο αναφοράς (⭐) στην καρτέλα Κύκλοι.", + "share_guideline_naming": "Ονομάστε κάθε προφίλ ακριβώς όπως εμφανίζεται στον επιλογέα ή την οθόνη της συσκευής (π.χ. 'Cotton 40', 'Eco 60').", + "share_guideline_quality": "Κοινοποιήστε μόνο κύκλους που ολοκληρώθηκαν κανονικά -- χωρίς διακοπές στη μέση του κύκλου, ανοίγματα πόρτας ή διακυμάνσεις ισχύος.", + "share_guideline_review": "Η μεταφόρτωσή σας ξεκινά ως εκκρεμής και εμφανίζεται δημόσια μόλις αρκετά μέλη της κοινότητας την επιβεβαιώσουν.", + "share_guidelines_title": "Πριν κοινοποιήσετε", + "store_download_device_intro": "Υιοθετήστε κάθε κοινοποιημένο πρόγραμμα και τους κύκλους αναφοράς του στη συσκευή σας. Οι δικοί σας καταγεγραμμένοι κύκλοι και στατιστικά δεν επηρεάζονται.", + "store_share_device_intro": "Ανεβάστε {brand} {model} με τους κύκλους αναφοράς που επιλέγετε. Άλλοι με την ίδια συσκευή μπορούν να υιοθετήσουν τα προγράμματά σας. Οι καταχωρίσεις ελέγχονται πριν εμφανιστούν δημόσια.", + "share_profile_no_cycles": "Δεν υπάρχουν κύκλοι αναφοράς -- επισημάνετε έναν κύκλο ως ⭐ στην καρτέλα Κύκλοι για να συμπεριλάβετε αυτό το προφίλ", + "advisory_phase_inconsistent": "Το '{name}' φαίνεται να αναμειγνύει διαφορετικά προγράμματα ή θερμοκρασίες - οι κύκλοι του θερμαίνονται για πολύ διαφορετικά χρονικά διαστήματα. Ο διαχωρισμός του σε ξεχωριστά προφίλ (π.χ. ανά θερμοκρασία) θα βελτιώσει την αντιστοίχιση και τις εκτιμήσεις χρόνου.", + "advisory_phase_inconsistent_title": "⚠ Πιθανώς μεικτά προγράμματα", + "export_select_intro": "Τσεκάρετε ακριβώς τι θα συμπεριληφθεί. Η επιλογή προφίλ χωρίς τους κύκλους τους εξάγει και πάλι ένα αναγνωρίσιμο πρόγραμμα (η μαθημένη του καμπύλη μεταφέρεται μαζί).", + "import_analyze_hint": "Φορτώστε ένα εξαγόμενο αρχείο (ή επικολλήστε το JSON του). Το WashData το αναλύει και δείχνει ακριβώς τι μπορεί να εισαχθεί πριν αλλάξει οτιδήποτε.", + "analyzing": "Ανάλυση…", + "device_type_mismatch_warn": "Αυτή η εξαγωγή προέρχεται από διαφορετικό τύπο συσκευής ({src} έναντι {local}). Τα προγράμματα και οι κύκλοι μπορούν και πάλι να εισαχθούν ως δεδομένα αναφοράς, αλλά οι ρυθμίσεις που αφορούν τη συσκευή και η εισαγωγή πραγματικού ιστορικού είναι απενεργοποιημένες.", + "merge_hint": "Τα εισαγόμενα στοιχεία προστίθενται και τίποτα τοπικό δεν χάνεται. Οι συγκρούσεις ονομάτων επιλύονται παρακάτω.", + "replace_warn": "Κάθε επιλεγμένη κατηγορία διαγράφεται και αντικαθίσταται από το αρχείο. Οι μη επιλεγμένες κατηγορίες παραμένουν ανέπαφες.", + "dest_reference_hint": "Οι εισαγόμενοι κύκλοι βελτιώνουν μόνο την αναγνώριση προγράμματος και δεν επηρεάζουν ποτέ τα στατιστικά χρήσης/ενέργειας.", + "dest_real_history_hint": "Οι εισαγόμενοι κύκλοι υπολογίζονται ως ιστορικό της ίδιας της συσκευής και τροφοδοτούν τα στατιστικά ενέργειας/χρήσης. Χρησιμοποιήστε το για τη μεταφορά μιας συσκευής σε νέα εγκατάσταση.", + "sug_muted": "Δεν θα προτείνεται ξανά αυτή η ρύθμιση", + "sug_mute_failed": "Αποτυχία σίγασης πρότασης", + "sug_unmuted_all": "Οι αποσιωπημένες προτάσεις επαναφέρθηκαν", + "n_suggestions_muted": "{count} αποσιωπημένες· ο αυτόματος ρυθμιστής δεν θα τις προτείνει.", + "font_size_hint": "Κάντε τα πάντα σε αυτόν τον πίνακα μεγαλύτερα ή μικρότερα. Ισχύει για τον λογαριασμό σας σε αυτήν τη συσκευή." }, - "phase4": { - "healthy": "Αυτή η συσκευή έχει ρυθμιστεί πλήρως ({profile_count} προφίλ)." + "phase_desc": { + "anti_crease": "Περιστασιακά σύντομες ανατροπές μετά την ολοκλήρωση για μείωση των ρυτίδων.", + "anti_wrinkle": "Περιοδική αναδίπλωση μετά τον κύκλο για μείωση των ρυτίδων.", + "cool_down": "Ανατροπή χωρίς θερμότητα κοντά στο τέλος του κύκλου.", + "drain_and_switch": "Μεταβατική περίοδος από τη λειτουργία πλύσης στη λειτουργία στεγνώματος.", + "dry": "Στάδιο στεγνώματος με χρήση θερμαντήρα ή/και υπολειπόμενης θερμότητας.", + "drying": "Κύρια θερμαινόμενη περίοδος ανατροπής.", + "heat_up": "Η αρχική προθέρμανση του θερμαντήρα πριν ξεκινήσει το πλήρες στέγνωμα.", + "pre_rinse": "Αρχικό ψεκασμό πριν από την πλύση με απορρυπαντικό.", + "pre_wash": "Αρχικό εμποτισμό ή προεπεξεργασία πριν από την κύρια πλύση.", + "rinse": "Στάδιο έκπλυσης με καθαρό νερό. Αυτή η φάση μπορεί να επαναληφθεί πολλές φορές.", + "sanitize": "Στάδιο καθαρισμού υψηλής θερμοκρασίας για προγράμματα απολύμανσης.", + "sensor_check": "Σύντομη παύση χαμηλής ισχύος ενώ μετράται η ξηρότητα.", + "soak": "Περίοδος εμποτισμού χαμηλής δραστηριότητας μεταξύ των ενεργών σταδίων πλύσης.", + "soak_dw": "Εκτεταμένη περίοδος εμποτισμού για βαρύ χώμα.", + "spin": "Εξαγωγή υψηλής ταχύτητας για αφαίρεση νερού από το φορτίο.", + "spin_wd": "Εκχύλιση υψηλής ταχύτητας μετάβαση πριν από την ξήρανση.", + "wash": "Κύριος κύκλος πλύσης με κίνηση τυμπάνου και προαιρετική θέρμανση.", + "wash_dw": "Κύριο πλύσιμο με απορρυπαντικό με θέρμανση." }, - "cta": { - "start_recording": "Έναρξη εγγραφής", - "label_detected_cycle": "Έχω ήδη ανιχνευθέντα κύκλο – επισήμανσή του", - "browse_cycles": "Αναζήτηση κύκλων για επισήμανση άλλου", - "view_profiles": "Προβολή προφίλ", - "create_from_cluster": "Δημιουργία προφίλ από αυτούς τους κύκλους", - "create_profile": "Δημιουργία προφίλ για αυτόν", - "review_suggestions": "Έλεγχος προτάσεων", - "organise_profiles": "Οργάνωση προφίλ", - "configure_phases": "Διαμόρφωση φάσεων", - "skip_step": "Παράλειψη βήματος", - "skip_forever": "Να μην εμφανιστεί ξανά", - "hide_guidance": "Απόκρυψη οδηγιών", - "show_guidance": "Εμφάνιση οδηγιών" + "placeholder": { + "add": "προσθήκη…", + "group_name": "π.χ. Βαμβάκι 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "προσθήκη υπηρεσίας ειδοποίησης…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "προσθήκη ατόμου…", + "phase_name": "π.χ. Προπλύσιμο", + "profile_name": "π.χ. Βαμβάκι 40°C", + "maintenance_notes": "π.χ. αντικατάσταση φίλτρου, καθαρισμός λάστιχου πόρτας", + "store_brand": "π.χ. Bosch", + "store_model": "π.χ. WAT28401" + }, + "pref": { + "date_absolute": "Απόλυτο (π.χ. 14:32 στις 2 Ιουλίου)", + "date_relative": "Συγγενής (π.χ. πριν από 2 ώρες)", + "lang_auto": "Προεπιλογή συστήματος ({lang})", + "lang_en": "Αγγλικά", + "use_panel_default": "(προεπιλογή πίνακα)" + }, + "quality": { + "bad": "Κακός", + "good": "Καλός", + "unusable": "Αχρησιμοποίητο" + }, + "section": { + "anti_wrinkle": { + "intro": "Η λειτουργία κατά τσακίσματος εντοπίζει παλμούς χαμηλής ισχύος τύμβου μετά την κύρια φάση και τους διατηρεί συνδεδεμένους με τον ολοκληρωμένο κύκλο.", + "label": "Αντί-τσάκισμα" + }, + "basic": { + "intro": "Βασική ταυτότητα και τα απαραίτητα στοιχεία που χρειάζονται οι περισσότερες διαμορφώσεις.", + "label": "Βασικά" + }, + "delay": { + "intro": "Η ανίχνευση καθυστερημένης εκκίνησης αναγνωρίζει πότε μια συσκευή είναι ενεργοποιημένη αλλά δεν έχει ακόμα ξεκινήσει τον κύκλο της.", + "label": "Καθυστερημένη Εκκίνηση" + }, + "detection": { + "intro": "Πώς εντοπίζεται ένας κύκλος ως έναρξη, λειτουργία και ολοκλήρωση.", + "label": "Ανίχνευση" + }, + "matching": { + "intro": "Πώς οι ολοκληρωμένοι κύκλοι αντιστοιχίζονται σε μαθημένα προφίλ και επισημαίνονται.", + "label": "Αντιστοίχιση" + }, + "ml_training": { + "intro": "Πρόγραμμα επανεκπαίδευσης μηχανικής μάθησης στη συσκευή και ρυθμίσεις δεδομένων.", + "label": "Εκπαίδευση ML" + }, + "notifications": { + "intro": "Πότε και πώς λαμβάνετε ειδοποιήσεις για συμβάντα κύκλου.", + "label": "Ειδοποιήσεις" + }, + "timing": { + "intro": "Ρυθμός παρασκηνίου, το watchdog εκτός σύνδεσης και η συντήρηση.", + "label": "Χρονισμός & Watchdog" + }, + "triggers": { + "intro": "Προαιρετικά εξωτερικά σήματα: ενεργοποιητής τέλους, αισθητήρας πόρτας, διακόπτης παύσης και υπενθύμιση αποφόρτωσης.", + "label": "Ενεργοποιητές & Πόρτες" + }, + "phase_eta": { + "label": "Υπολειπόμενος Χρόνος", + "intro": "Υπολειπόμενος χρόνος με επίγνωση φάσεων, για μηχανές των οποίων η διάρκεια κύκλου εξαρτάται από τη θερμοκρασία ή το στύψιμο." + }, + "dishwasher": { + "label": "Πλυντήριο πιάτων", + "intro": "Διαχείριση τέλους κύκλου για πλυντήρια πιάτων, τα οποία συνήθως ολοκληρώνονται με μια μακρά φάση στεγνώματος σχεδόν μηδενικής κατανάλωσης πριν από μια σύντομη τελική αποστράγγιση." + } + }, + "setting": { + "anti_wrinkle_enabled": { + "doc": "Αναγνωρίστε τους σύντομους παλμούς χαμηλής ισχύος που εκπέμπει ένα στεγνωτήριο μετά την κύρια φάση θερμότητας και κρατήστε τους συνδεδεμένους στον τελικό κύκλο αντί να τους διαβάζετε ως νέους κύκλους.", + "label": "Ενεργοποίηση Ανίχνευσης Κατά Τσακίσματος" + }, + "anti_wrinkle_exit_power": { + "doc": "Η ισχύς πρέπει να πέσει κάτω από αυτό μεταξύ των παλμών για να παραμείνει ενεργή η λειτουργία κατά των ρυτίδων.", + "label": "Κατώφλι Ισχύος Εξόδου" + }, + "anti_wrinkle_idle_timeout": { + "label": "Μέγιστο Κενό Παλμών", + "doc": "Πόση ώρα μπορεί να παραμείνει ήσυχη η συσκευή ανάμεσα σε δύο παλμούς ανατροπής προτού λήξει η λειτουργία κατά τσακίσματος. Ορίστε το πάνω από το μεγαλύτερο κενό που αφήνει το στεγνωτήριό σας ανάμεσα στους παλμούς, αλλιώς κάθε επόμενος παλμός διαβάζεται ως εσφαλμένη εκκίνηση." + }, + "anti_wrinkle_max_duration": { + "doc": "Οι παλμοί που είναι μεγαλύτεροι από αυτό αντιμετωπίζονται ως πραγματικός κύκλος και όχι ως αντιρυτιδικό περιτύλιγμα.", + "label": "Μέγιστη Διάρκεια" + }, + "anti_wrinkle_max_power": { + "doc": "Ένας παλμός πάνω από αυτήν την ισχύ αντιμετωπίζεται ως ένας πραγματικός νέος κύκλος, όχι ως αντιρυτιδικό κύμα. Ρυθμίστε ακριβώς πάνω από την ισχύ του παλμού ανατροπής.", + "label": "Μέγιστη Ισχύς Κατά Τσακίσματος" + }, + "auto_label_confidence": { + "doc": "Εάν το σκορ του αγώνα στο τέλος του κύκλου είναι στο ή πάνω από αυτό, το πρόγραμμα επισημαίνεται αυτόματα χωρίς καμία προτροπή επιβεβαίωσης. Αυξήστε το ώστε να απαιτείται υψηλότερη βεβαιότητα πριν από την αυτόματη επισήμανση. χαμηλώστε το για να αυτοματοποιήσετε περισσότερο. Λειτουργεί σε συνδυασμό με το Learning Confidence κάτω από αυτό.", + "label": "Εμπιστοσύνη Αυτόματης Επισήμανσης" + }, + "auto_maintenance": { + "doc": "Εκτελέστε νυχτερινή καθαριότητα: ανακατασκευάστε φακέλους προφίλ, υπολογίστε ξανά την υγεία του κύκλου, κλαδέψτε τα ίχνη εντοπισμού σφαλμάτων και διατηρήστε τους πιο πρόσφατους κύκλους.", + "label": "Αυτόματη Συντήρηση (νυχτερινός καθαρισμός)" + }, + "completion_min_seconds": { + "doc": "Κύκλοι μικρότεροι από αυτό απορρίπτονται ως κύκλοι φάντασμα (δοκιμαστικές διαδρομές, άνοιγμα της πόρτας για προσθήκη κάλτσας).", + "label": "Ελάχιστη Διάρκεια Κύκλου" + }, + "delay_confirm_seconds": { + "doc": "Η τροφοδοσία πρέπει να παραμείνει στη ζώνη αναμονής για τόσο μεγάλο χρονικό διάστημα, προτού η συσκευή αντιμετωπιστεί ως αναμονή για την εκκίνηση αντί να λειτουργεί.", + "label": "Δευτερόλεπτα Επιβεβαίωσης" + }, + "delay_start_detect_enabled": { + "doc": "Ανιχνεύστε πότε η συσκευή είναι ενεργοποιημένη και περιμένει (καθυστερημένη εκκίνηση / αναμονή) αλλά δεν έχει ξεκινήσει τον κύκλο της, επομένως η σχεδίαση αναμονής δεν θεωρείται λανθασμένα με κύκλο λειτουργίας.", + "label": "Ενεργοποίηση Ανίχνευσης Καθυστερημένης Εκκίνησης" + }, + "delay_timeout_hours": { + "doc": "Σταματήστε την αναμονή στη λειτουργία καθυστερημένης εκκίνησης μετά από τόσες ώρες και επιστρέψτε στο ρελαντί, έτσι ώστε ένα μηχάνημα να μένει τροφοδοτημένο αλλά να μην ξεκινά ποτέ, να μην περιμένει για πάντα.", + "label": "Ώρες Λήξης Χρόνου" + }, + "device_type": { + "doc": "Κατηγορία συσκευών. Ορίζει λογικές προεπιλογές ανίχνευσης (οριακά όρια, μη καθυστέρηση, τερματισμός χειρισμού) προσαρμοσμένες για αυτόν τον τύπο συσκευής. αλλάξτε το μόνο εάν η συσκευή είχε ρυθμιστεί αρχικά ως λάθος τύπος.", + "label": "Τύπος Συσκευής" + }, + "door_sensor_entity": { + "doc": "Προαιρετικός δυαδικός αισθητήρας πόρτας. Χρησιμοποιείται για τον εντοπισμό πότε η συσκευή έχει ανοίξει/εκφορτωθεί μετά από έναν κύκλο.", + "label": "Οντότητα Αισθητήρα Πόρτας" + }, + "duration_tolerance": { + "doc": "Ανοχή για εκτιμήσεις που απομένει (ανατροφοδότηση μάθησης, μη αντιστοίχιση). Εάν η πραγματική διάρκεια είναι εντός +/-X% της εκτίμησης, λογίζεται ως καλή αντιστοίχιση.", + "label": "Ανοχή Εκτίμησης" + }, + "enable_ml_models": { + "doc": "Ενώ εκτελείται ένας κύκλος, αφήστε τα μοντέλα να βελτιώσουν τα ζωντανά αποτελέσματα: μια πιο σταθερή εκτίμηση υπολειπόμενου χρόνου και ενέργειας/κόστους και ένα προστατευτικό κατά της πρόωρης διακοπής κατά την ανίχνευση τέλους (μπορεί μόνο να καθυστερήσει ένα φινίρισμα, να μην τελειώσει ποτέ νωρίτερα και να περιοριστεί). Χρησιμοποιεί τα βελτιωμένα μοντέλα σας όταν είναι διαθέσιμα, διαφορετικά τα ενσωματωμένα. Off = μόνο η κλασική λογική που βασίζεται στην εξουσία (ακόμα αξιόπιστη).", + "label": "Εφαρμογή έξυπνων μοντέλων κατά τη διάρκεια κύκλου" + }, + "end_energy_threshold": { + "doc": "Κατά τη διάρκεια της αντίστροφης μέτρησης εκτός καθυστέρησης, η συσσωρευμένη ενέργεια (βατ x χρόνο) συγκρίνεται με αυτό το όριο. Σε περίπτωση υπέρβασης, η αντίστροφη μέτρηση επαναφέρεται - διατηρώντας τα αντιτσαλάκια και τις ουρές στεγνώματος στο πλυντήριο πιάτων συνδεδεμένα στον κύκλο αντί να τα κόβετε σύντομα. Αυξήστε το εάν οι κύκλοι τελειώνουν πολύ νωρίς κατά τη διάρκεια της ψύξης. χαμηλώστε το εάν η ανίχνευση είναι αργή.", + "label": "Ενέργεια Λήξης" + }, + "end_repeat_count": { + "doc": "Αριθμός διαδοχικών μετρήσεων κάτω από το όριο τερματισμού που απαιτούνται πριν από το τέλος του κύκλου. Το 1 είναι καλό για τα περισσότερα βύσματα. Αυξήστε στο 2-3 εάν το έξυπνο βύσμα σας αναφέρει περιστασιακά ένα δείγμα ψευδούς μηδενισμού στο μέσο του κύκλου και οι κύκλοι σας τελειώνουν πρόωρα.", + "label": "Πλήθος Επαναλήψεων Λήξης" + }, + "energy_price_entity": { + "doc": "Αισθητήρας με την τρέχουσα τιμή ηλεκτρικής ενέργειας ανά kWh (π.χ. ένα δυναμικό τιμολόγιο). Προηγείται της στατικής τιμής παρακάτω. Κάθε κύκλος παγώνει την τιμή που ισχύει όταν τελειώσει.", + "label": "Οντότητα Τιμής Ενέργειας" + }, + "energy_price_static": { + "doc": "Σταθερή τιμή ανά kWh που χρησιμοποιείται για τα στοιχεία κόστους όταν δεν έχει οριστεί παραπάνω οντότητα ζωντανής τιμής.", + "label": "Στατική Τιμή Ενέργειας (ανά kWh)" + }, + "energy_sensor": { + "doc": "Προαιρετικός αθροιστικός μετρητής ενέργειας (total_increasing kWh/Wh, π.χ. ο ίδιος ο μετρητής συνολικής κατανάλωσης της πρίζας). Όταν οριστεί, η αναφερόμενη ενέργεια κάθε κύκλου λαμβάνεται από τη διαφορά αυτού του μετρητή από την αρχή έως το τέλος, γεγονός που αποφεύγει την υποκαταμέτρηση που προκύπτει από την ολοκλήρωση ενός αισθητήρα ισχύος που αναφέρει αργά. Επανέρχεται στην ολοκληρωμένη τιμή αν η ένδειξη λείπει, η μονάδα της είναι άγνωστη ή η διαφορά δεν είναι θετική. Αφήστε το κενό για να συνεχιστεί η ολοκλήρωση του αισθητήρα ισχύος.", + "label": "Οντότητα Μετρητή Ενέργειας" + }, + "expose_debug_entities": { + "doc": "Δημοσιεύστε επιπλέον διαγνωστικές οντότητες HA (εμπιστοσύνη αντιστοίχισης, ασάφεια, εσωτερικά στοιχεία κατάστασης). Το Off διατηρεί τη λίστα οντοτήτων καθαρή για κανονική χρήση.", + "label": "Εμφάνιση Οντοτήτων Αποσφαλμάτωσης" + }, + "external_end_trigger": { + "doc": "Δυαδικός αισθητήρας του οποίου η αλλαγή κατάστασης σηματοδοτεί το τέλος του κύκλου (π.χ. μια επαφή \"τελειωμένη\" συσκευής ή μια συνοδευτική ενσωμάτωση).", + "label": "Οντότητα Εξωτερικού Ενεργοποιητή" + }, + "external_end_trigger_enabled": { + "doc": "Αφήστε έναν εξωτερικό δυαδικό αισθητήρα να σηματοδοτήσει το τέλος ενός κύκλου, επιπλέον της ενσωματωμένης ανίχνευσης που βασίζεται σε ενέργεια.", + "label": "Ενεργοποίηση Εξωτερικού Ενεργοποιητή Λήξης" + }, + "external_end_trigger_inverted": { + "doc": "Αντιμετωπίστε το κλείσιμο του αισθητήρα σκανδάλης στο OFF (αντί στο ON) ως σήμα τέλους κύκλου.", + "label": "Αντιστροφή Εξωτερικού Ενεργοποιητή (ενεργοποίηση στο ΑΠΕΝΕΡΓΟ)" + }, + "learning_confidence": { + "doc": "Εάν το σκορ αντιστοίχισης πέσει μεταξύ αυτού και του Auto-Label Confidence, μια ειδοποίηση σχολίων σας ζητά να επαληθεύσετε το αναγνωρισμένο πρόγραμμα. Κάτω από αυτό το σκορ ο αγώνας είναι πολύ αβέβαιος για να βγει στην επιφάνεια. Πρέπει να διατηρείται κάτω από την αυτοπεποίθηση ετικέτας.", + "label": "Εμπιστοσύνη Μάθησης" + }, + "linked_device": { + "doc": "Προαιρετικά, τοποθετήστε αυτή τη συσκευή WashData κάτω από μια άλλη συσκευή (π.χ. το έξυπνο βύσμα) στο μητρώο συσκευών HA, που εμφανίζεται ως \"Σύνδεση μέσω ...\".", + "label": "Ομαδοποίηση κάτω από Συσκευή" + }, + "min_off_gap": { + "doc": "Εάν το μηχάνημα απενεργοποιηθεί για λιγότερο από αυτό το διάστημα, η σειρά ενεργοποίησης/απενεργοποίησης/ενεργοποίησης αντιμετωπίζεται ως ένας συνεχής κύκλος. Αποτρέπει τον διαχωρισμό των προγραμμάτων εμποτισμού (το μηχάνημα απενεργοποιείται για αρκετά λεπτά κατά τη διάρκεια της πλύσης) σε δύο ξεχωριστούς κύκλους. Ρυθμίστε το μικρότερο από το κενό μεταξύ των φορτίων σας πίσω με πλάτη, εάν θέλετε να υπολογίζονται ως ξεχωριστοί κύκλοι. Οι προεπιλογές τύπου συσκευής προστατεύουν την τυπική παύση εντός του κύκλου για κάθε συσκευή.", + "label": "Ελάχιστο Κενό Απενεργοποίησης" + }, + "min_power": { + "doc": "Η απόλυτη ελάχιστη ισχύς θεωρείται ενεργή. Οι ενδείξεις κάτω από αυτό αντιμετωπίζονται ως 0 W (αναμονή), φιλτράροντας το φανταστικό φορτίο των έξυπνων βυσμάτων και των LED αναμονής.", + "label": "Ελάχιστη Ισχύς" + }, + "ml_training_enabled": { + "doc": "Μελετήστε περιοδικά τους κύκλους που έχετε εξετάσει κατά τη διάρκεια της νύχτας και προσαρμόστε τα μοντέλα σε αυτό το συγκεκριμένο μηχάνημα. Μια αλλαγή διατηρείται μόνο όταν έχει πραγματικά καλύτερη βαθμολογία σε κύκλους που δεν μένουν, οπότε αυτό μπορεί μόνο να βοηθήσει ή να παραμείνει το ίδιο - ποτέ μην υποχωρήσει.", + "label": "Μάθηση από αυτή τη συσκευή" + }, + "ml_training_hour": { + "doc": "Τοπική ώρα της ημέρας (0-23) για να κάνετε την ολονύκτια λεπτομέρεια. Επιλέξτε μια ώρα ησυχίας, όπως 2 (02:00).", + "label": "Μάθηση την ώρα" + }, + "ml_training_interval_days": { + "doc": "Ελέγξτε ξανά για βελτιώσεις το πολύ μία φορά ανά τόσες μέρες.", + "label": "Έλεγχος το πολύ κάθε" + }, + "ml_training_min_cycles": { + "doc": "Περιμένετε έως ότου έχουν καταγραφεί τουλάχιστον τόσοι πολλοί κύκλοι πριν από τη λεπτομέρεια, οπότε υπάρχουν αρκετά για να μάθετε από αυτά.", + "label": "Κύκλοι που χρειάζονται πρώτα" + }, + "name": { + "doc": "Εμφανιζόμενο όνομα που εμφανίζεται στη λίστα ενσωματώσεων HA και στο μητρώο συσκευών.", + "label": "Όνομα Συσκευής" + }, + "no_update_active_timeout": { + "doc": "Εάν δεν υπάρχουν ενημερώσεις τροφοδοσίας για τόσο μεγάλο χρονικό διάστημα κατά τη λειτουργία, υποθέστε ότι το βύσμα έπεσε εκτός σύνδεσης και διακόψτε αναγκαστικά για να αποφύγετε έναν κύκλο ζόμπι. Τα προεπιλεγμένα 600 s επιτρέπουν υστέρηση σε σύννεφο ή πλέγμα.", + "label": "Λήξη Χρόνου Χωρίς Ενημέρωση" + }, + "notify_before_end_minutes": { + "doc": "Στείλτε μια ειδοποίηση Σχεδόν τελειωμένο όταν ο εκτιμώμενος χρόνος που απομένει πέσει κάτω από αυτό. 0 το απενεργοποιεί.", + "label": "Προειδοποίηση Πριν το Τέλος" + }, + "notify_channel": { + "doc": "Όνομα καναλιού ειδοποιήσεων Android για έναρξη/ζωντανά μηνύματα (ελέγχει τον ήχο και την προτεραιότητα ανά κανάλι στην εφαρμογή για κινητά). Το Blank χρησιμοποιεί την προεπιλογή της συνοδευτικής εφαρμογής.", + "label": "Κανάλι Android (εκκίνηση/ζωντανά)" + }, + "notify_cycle_timers": { + "doc": "Ειδοποιήσεις σε συγκεκριμένα λεπτά σε έναν κύκλο (π.χ. για προσθήκη μαλακτικού). Το μήνυμα υποστηρίζει {device}, {program}, {minutes}. Ενεργοποιήστε την αυτόματη παύση για παύση σε αυτό το σημείο και λάβετε μια διαδραστική ειδοποίηση με ένα κουμπί Συνέχιση. συνέχιση μέσω του πίνακα, της υπηρεσίας παύσης/συνέχισης ή της ενέργειας ειδοποίησης.", + "label": "Χρονόμετρα Κύκλου" + }, + "notify_finish_channel": { + "doc": "Όνομα καναλιού ειδοποιήσεων Android για το μήνυμα τερματισμού. Το Blank επαναχρησιμοποιεί το κανάλι έναρξης/ζωντανού.", + "label": "Κανάλι Android (λήξη)" + }, + "notify_finish_message": { + "doc": "Κείμενο που αποστέλλεται όταν ολοκληρώνεται ένας κύκλος. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. Τα {time_finished} και {vs_typical} είναι τα πιο χρήσιμα εδώ.", + "label": "Μήνυμα Λήξης" + }, + "notify_finish_services": { + "doc": "ειδοποιήστε.* οι υπηρεσίες καλούνται όταν τελειώσει ένας κύκλος. Προσθέστε ένα ανά στόχο. αφήστε κενό για καμία ειδοποίηση τερματισμού.", + "label": "Υπηρεσίες Λήξης" + }, + "notify_fire_events": { + "doc": "Επίσης ενεργοποιήστε τα γεγονότα ha_washdata_* κατά την έναρξη/τέρμα του κύκλου, ώστε να μπορείτε να δημιουργήσετε τους δικούς σας αυτοματισμούς.", + "label": "Ενεργοποίηση Συμβάντων HA για Ειδοποιήσεις" + }, + "notify_icon": { + "doc": "Προαιρετικό εικονίδιο mdi για την ειδοποίηση (π.χ. mdi:πλυντήριο). Αφήστε κενό για την προεπιλογή της πλατφόρμας.", + "label": "Εικονίδιο Ειδοποίησης" + }, + "notify_live_chronometer": { + "doc": "Εμφάνιση ενός χρονοδιακόπτη αντίστροφης μέτρησης ζωντανής ενημέρωσης στην ειδοποίηση (σε πλατφόρμες που το υποστηρίζουν) αντί για στατική εκτίμηση.", + "label": "Χρήση Ζωντανού Χρονόμετρου" + }, + "notify_live_interval_seconds": { + "doc": "Πόσο συχνά ανανεώνονται οι ειδοποιήσεις ζωντανής προόδου ενώ εκτελείται ένας κύκλος.", + "label": "Διάστημα Ζωντανής Ενημέρωσης" + }, + "notify_live_overrun_percent": { + "doc": "Εάν ένας κύκλος ξεπεράσει την εκτίμησή του κατά περισσότερο από αυτό το ποσοστό, στείλτε μια ειδοποίηση υπέρβασης.", + "label": "% Υπέρβαση Ζωντανά Πριν την Ειδοποίηση" + }, + "notify_live_services": { + "doc": "ειδοποίηση.* οι υπηρεσίες ζητούν ζωντανές ενημερώσεις προόδου ενώ εκτελείται ένας κύκλος. Αφήστε το κενό για να απενεργοποιήσετε τις ειδοποιήσεις ζωντανής προόδου.", + "label": "Υπηρεσίες Ζωντανής Προόδου" + }, + "notify_only_when_home": { + "doc": "Στείλτε ειδοποιήσεις μόνο όταν τουλάχιστον ένα από τα συνδεδεμένα άτομα (παραπάνω) είναι στο σπίτι.", + "label": "Ειδοποίηση Μόνο Όταν Είμαι Σπίτι" + }, + "notify_people": { + "doc": "πρόσωπο.* οντότητες που χρησιμοποιούνται από το \"Notify Only When Home\" για να αποφασίσουν εάν κάποιος είναι στο σπίτι.", + "label": "Άτομα (για Μόνο Όταν Είμαι Σπίτι)" + }, + "notify_pre_complete_message": { + "doc": "Κείμενο της ειδοποίησης πριν το τέλος / σχεδόν έτοιμο. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Μήνυμα Προ-Ολοκλήρωσης" + }, + "notify_reminder_message": { + "doc": "Κείμενο της υπενθύμισης για εκκρεμή εκφόρτωση. Το κενό χρησιμοποιεί την ενσωματωμένη προεπιλογή. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Μήνυμα Υπενθύμισης" + }, + "notify_start_message": { + "doc": "Κείμενο που αποστέλλεται όταν ξεκινά ένας κύκλος. Μεταβλητές προτύπου: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Μήνυμα Εκκίνησης" + }, + "notify_start_services": { + "doc": "ειδοποιήστε.* οι υπηρεσίες καλούνται όταν ξεκινά ένας κύκλος. Προσθέστε ένα ανά στόχο (τηλέφωνο, πίνακα ελέγχου κ.λπ.). αφήστε κενό για ειδοποίηση μη έναρξης.", + "label": "Υπηρεσίες Εκκίνησης" + }, + "notify_timeout_seconds": { + "doc": "Αυτόματη απόρριψη της ειδοποίησης μετά από τόσα δευτερόλεπτα (σε πλατφόρμες που την υποστηρίζουν). Το 0 το διατηρεί μέχρι να απορριφθεί χειροκίνητα.", + "label": "Αυτόματη Απόρριψη Μετά από" + }, + "notify_title": { + "doc": "Τίτλος ειδοποίησης. Μεταβλητές προτύπου: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "Τίτλος Ειδοποίησης" + }, + "notify_unload_delay_minutes": { + "doc": "Λίγα λεπτά μετά τη λήξη ενός κύκλου προτού στείλετε την υπενθύμιση \"ξεφόρτωση του μηχανήματος\" σε αναμονή. Ορίστε το 0 για να απενεργοποιήσετε την υπενθύμιση.", + "label": "Καθυστέρηση Υπενθύμισης Αποφόρτωσης" + }, + "notify_unload_repeat": { + "doc": "Στέλνει ξανά την υπενθύμιση αποφόρτωσης κάθε \"Καθυστέρηση Υπενθύμισης Αποφόρτωσης\" λεπτά, μέχρι να ανοίξετε την πόρτα ή να πατήσετε \"Διακοπή υπενθυμίσεων\" στην ειδοποίηση. Απαιτεί Οντότητα Αισθητήρα Πόρτας (όπως και η ίδια η υπενθύμιση). Το κουμπί απόρριψης λειτουργεί σε ειδοποιήσεις της εφαρμογής-συντρόφου (κινητό) του Home Assistant.", + "label": "Επανάληψη μέχρι να ανοίξει η πόρτα" + }, + "off_delay": { + "doc": "Χρόνος αναμονής μετά την πτώση του ρεύματος πριν δηλώσετε ότι ο κύκλος έχει ολοκληρωθεί. Εάν επανέλθει η τροφοδοσία σε αυτό το παράθυρο, ο κύκλος συνεχίζεται απρόσκοπτα - αυτό γεφυρώνει τις παύσεις μεταξύ των σταδίων πλύσης. Τα πλυντήρια πιάτων έχουν μεγάλες φάσεις στεγνώματος (απενεργοποίηση για 20-60 λεπτά), επομένως η καθυστέρηση εκτός λειτουργίας πρέπει να υπερβαίνει αυτήν για να διατηρηθεί ολόκληρο το πλύσιμο+στεγνό σε έναν κύκλο.", + "label": "Καθυστέρηση Απενεργοποίησης" + }, + "pause_cuts_power": { + "doc": "Όταν ένας κύκλος τίθεται σε παύση, απενεργοποιήστε επίσης την οντότητα διακόπτη παρακάτω. Μόνο για συσκευές των οποίων το βύσμα μπορεί να κοπεί με ασφάλεια στη μέση του κύκλου.", + "label": "Η Παύση Διακόπτει Επίσης Ρεύμα (μέσω διακόπτη)" + }, + "power_off_delay": { + "doc": "Για πόσο χρόνο πρέπει να παραμείνει η ισχύς κάτω από το Κατώφλι Απενεργοποίησης μετά την ολοκλήρωση ενός κύκλου, προτού η κατάσταση επιστρέψει σε Ανενεργό. Χρησιμοποιείται μόνο όταν το Κατώφλι Απενεργοποίησης είναι πάνω από 0. Ελέγχεται στον ρυθμό του παρασκηνίου, οπότε η πραγματική καθυστέρηση στρογγυλοποιείται προς τα πάνω στον επόμενο κύκλο λήξης κατάστασης.", + "label": "Καθυστέρηση Απενεργοποίησης" + }, + "power_off_threshold_w": { + "doc": "Προαιρετική ανίχνευση κατάστασης Ανενεργό με βάση την ισχύ. Όταν είναι πάνω από 0, μόλις ολοκληρωθεί ένας κύκλος και η ισχύς παραμείνει κάτω από αυτό το επίπεδο για το διάστημα της Καθυστέρησης Απενεργοποίησης, η συσκευή θεωρείται ότι έχει σβήσει και η κατάσταση επιστρέφει σε Ανενεργό. Αφήστε το στο 0 για απενεργοποίηση (προεπιλογή). Ορίστε το πάνω από το πραγματικό κατώτατο όριο σβησμένης συσκευής και κάτω από το Κατώφλι Τερματισμού και την κατανάλωση αναμονής της συσκευής σας όταν είναι ολοκληρωμένη αλλά ακόμη αναμμένη· αν δεν είναι κάτω από το Κατώφλι Τερματισμού, αγνοείται. Όταν είναι ενεργό, αντικαθιστά την Καθυστέρηση Επαναφοράς Προόδου για την επιστροφή σε Ανενεργό, ώστε μια ολοκληρωμένη συσκευή να παραμένει σε Ολοκληρώθηκε/Καθαρός μέχρι να σβήσει πραγματικά.", + "label": "Κατώφλι Απενεργοποίησης" + }, + "power_sensor": { + "doc": "Η οντότητα αισθητήρα που αναφέρει την ενεργή ισχύ σε watt για αυτήν τη συσκευή (π.χ. sensor.washer_power). Η ανίχνευση όλων των κύκλων βασίζεται σε αυτό το σήμα.", + "label": "Αισθητήρας Ισχύος" + }, + "profile_duration_tolerance": { + "doc": "Η ζώνη +/- γύρω από μια μέση διάρκεια προφίλ που χρησιμοποιείται κατά την αντιστοίχιση. 0,25 σημαίνει ότι ένα προφίλ 60 λεπτών ταιριάζει με κύκλους 45-75 λεπτών.", + "label": "Ανοχή Διάρκειας Προφίλ" + }, + "profile_match_interval": { + "doc": "Πόσο συχνά επιχειρείτε αντιστοίχιση προφίλ κατά τη διάρκεια ενός κύκλου τρεξίματος. Τα προεπιλεγμένα 300 δευτερόλεπτα (5 λεπτά) εξισορροπούν την ταχύτητα ανίχνευσης και τη CPU.", + "label": "Διάστημα Αντιστοίχισης" + }, + "profile_match_max_duration_ratio": { + "doc": "Μέγιστο μήκος κύκλου σε σχέση με το προφίλ. 1.3 σημαίνει ότι ένας κύκλος πρέπει να είναι κάτω από το 130% της διάρκειας του προφίλ για να ταιριάζει.", + "label": "Μέγιστη Αναλογία Διάρκειας" + }, + "profile_match_min_duration_ratio": { + "doc": "Ελάχιστη διάρκεια κύκλου σε σχέση με το προφίλ. 0,9 σημαίνει ότι ένας κύκλος πρέπει να είναι τουλάχιστον το 90% της διάρκειας του προφίλ για να ταιριάζει.", + "label": "Ελάχιστη Αναλογία Διάρκειας" + }, + "profile_match_threshold": { + "doc": "Απαιτείται ελάχιστος βαθμός ομοιότητας (0-1) στο τέλος του κύκλου για την αποδοχή μιας αναγνώρισης προγράμματος. Αυξήστε το για να μειώσετε τις λανθασμένες ταυτοποιήσεις. χαμηλώστε το εάν τα προγράμματα του μηχανήματός σας δεν ταιριάζουν. Το προεπιλεγμένο 0,4 είναι ένα συντηρητικό σημείο εκκίνησης.", + "label": "Κατώφλι Αντιστοίχισης" + }, + "profile_unmatch_threshold": { + "doc": "Εάν ένας ζωντανός αγώνας στα μέσα του κύκλου πέσει κάτω από αυτό το σκορ, η δοκιμαστική αναγνώριση διαγράφεται. Διατηρήστε το λίγο κάτω από το όριο αντιστοίχισης, ώστε μια σύντομη πτώση στην ομοιότητα να μην επαναφέρει την οθόνη σε απαράμιλλη.", + "label": "Κατώφλι Μη-Αντιστοίχισης" + }, + "progress_reset_delay": { + "doc": "Μετά την ολοκλήρωση, κρατήστε την πρόοδο στο 100% για τόσο μεγάλο χρονικό διάστημα, ώστε το Ολοκληρώθηκε να είναι ορατό στους πίνακες εργαλείων πριν επαναφέρετε την κατάσταση αδράνειας.", + "label": "Καθυστέρηση Επαναφοράς Προόδου" + }, + "pump_stuck_duration": { + "doc": "Δευτερόλεπτα μια αντλία μπορεί να λειτουργεί συνεχώς πριν επισημανθεί ως πιθανώς κολλημένη (πυρίζει το συμβάν κολλημένης αντλίας).", + "label": "Διάρκεια Κολλημένης Αντλίας" + }, + "running_dead_zone": { + "doc": "Μετά την έναρξη ενός κύκλου, οι μειώσεις ισχύος σε αυτό το παράθυρο αγνοούνται. Τα πλυντήρια γεμίζουν με κρύο νερό (πέφτει κοντά στα 0 W πριν από τη θέρμανση) - χωρίς αυτή την προστασία, η φάση πλήρωσης μοιάζει με ένα τέλος κύκλου. Αυτό ΔΕΝ παρακάμπτει δεδομένα: το πλήρες ίχνος ισχύος καταγράφεται από το T=0. Η μηχανή προτάσεων μετρά το πραγματικό μοτίβο εκκίνησης του μηχανήματός σας και το μετράει αυτόματα.", + "label": "Νεκρή Ζώνη Λειτουργίας" + }, + "sampling_interval": { + "doc": "Αναμενόμενος χρόνος μεταξύ των μετρήσεων του αισθητήρα - χρησιμοποιείται για το μέγεθος του παραθύρου εξομάλυνσης και τη σωστή έναρξη της αναπήδησης. Κάθε ενημέρωση αισθητήρα καταγράφεται ανεξάρτητα από αυτήν την τιμή. βαθμονομεί μόνο τους κατάντη υπολογισμούς. Η μηχανή προτάσεων μετρά τον πραγματικό ρυθμό του αισθητήρα σας από προηγούμενους κύκλους και το ρυθμίζει αυτόματα.", + "label": "Διάστημα Δειγματοληψίας" + }, + "save_debug_traces": { + "doc": "Αποθηκεύστε το πλήρες ίχνος ισχύος και τα αντίστοιχα δεδομένα εντοπισμού σφαλμάτων για κάθε κύκλο. Χρήσιμο για την αντιμετώπιση προβλημάτων, αλλά αυξάνει το μέγεθος του αποθηκευτικού χώρου.", + "label": "Αποθήκευση Ιχνών Αποσφαλμάτωσης" + }, + "smoothing_window": { + "doc": "Πόσο εξομαλύνεται το πρωτογενές σήμα ισχύος. Το Low (2) ανταποκρίνεται αλλά είναι θορυβώδες. υψηλό (5) εξομαλύνει τις αιχμές αλλά προσθέτει υστέρηση.", + "label": "Παράθυρο Εξομάλυνσης" + }, + "start_duration_threshold": { + "doc": "Η ισχύς πρέπει να παραμείνει πάνω από το όριο εκκίνησης για τόσο μεγάλο χρονικό διάστημα για να επιβεβαιωθεί μια πραγματική εκκίνηση, αποτρέποντας τις εναλλαγές ενεργοποίησης/απενεργοποίησης κλασματικού δευτερολέπτου από την έναρξη ενός κύκλου.", + "label": "Διάρκεια Εκκίνησης" + }, + "start_energy_threshold": { + "doc": "Ενέργεια (ισχύς x χρόνος) πρέπει να καταναλώσει η συσκευή πριν τη λειτουργία. Μια σύντομη ακίδα υψηλής ισχύος έχει πολύ χαμηλή ενέργεια και αγνοείται, αποτρέποντας τις λανθασμένες εκκινήσεις.", + "label": "Ενέργεια Εκκίνησης" + }, + "start_threshold_w": { + "doc": "Η ισχύς πρέπει να ανέβει πάνω από αυτό το επίπεδο για να επιβεβαιωθεί ότι ένας κύκλος έχει ξεκινήσει. Η ρύθμιση του σε πολύ χαμηλά επίπεδα προκαλεί λανθασμένες εκκινήσεις από την τροφοδοσία αναμονής. Τα προγράμματα πολύ υψηλά και αργής εκκίνησης (ψυχρή πλήρωση) χάνονται. Ο κινητήρας προτάσεων το θέτει ακριβώς πάνω από τη χαμηλότερη ενεργή ισχύ του μηχανήματος που έχει παρατηρηθεί.", + "label": "Κατώφλι Εκκίνησης" + }, + "stop_threshold_w": { + "doc": "Η ισχύς πρέπει να πέσει κάτω από αυτό το επίπεδο προτού ξεκινήσει η αντίστροφη μέτρηση εκτός καθυστέρησης. Ρυθμίστε το κάτω από το όριο έναρξης - το κενό μεταξύ τους είναι η ζώνη υστέρησης που αποτρέπει το τρεμόπαιγμα. Εάν ρυθμιστεί πολύ ψηλά, οι φάσεις χαμηλής ισχύος (κρατήματα ξεβγάλματος, αντιτσαλάκωση) ενεργοποιούν λανθασμένα την τελική ακολουθία.", + "label": "Κατώφλι Τερματισμού" + }, + "switch_entity": { + "doc": "Ο προαιρετικός διακόπτης απενεργοποιήθηκε κατά την παύση και ενεργοποιήθηκε ξανά κατά τη συνέχιση, που χρησιμοποιείται μαζί με το \"Η παύση διακόπτει επίσης το ρεύμα\".", + "label": "Οντότητα Διακόπτη" + }, + "watchdog_interval": { + "doc": "Πόσο συχνά ελέγχει το παρασκήνιο παρακολούθησης για στάσιμους αισθητήρες και παρελθόντα χρονικά όρια. Προεπιλογή 30 δευτ.", + "label": "Διάστημα Watchdog" + }, + "notify_milestone_message": { + "doc": "Μήνυμα για την ειδοποίηση ορόσημου. Μεταβλητές προτύπου: {device}, {cycle_count}.", + "label": "Μήνυμα ορόσημου" + }, + "notify_milestones": { + "doc": "Αριθμοί κύκλων χωρισμένοι με κόμμα που ενεργοποιούν μια εφάπαξ εορταστική ειδοποίηση όταν επιτευχθούν (π.χ. 50, 100, 500, 1000). Το κενό απενεργοποιεί τις ειδοποιήσεις ορόσημων.", + "label": "Ορόσημα κύκλων" + }, + "notify_quiet_end_hour": { + "doc": "Τέλος του παραθύρου μην ενοχλείτε (0-23). Οι ειδοποιήσεις που κρατήθηκαν παραδίδονται αυτή την ώρα. Αφήστε κενό για απενεργοποίηση.", + "label": "Τέλος ωρών ησυχίας" + }, + "notify_quiet_start_hour": { + "doc": "Έναρξη ενός παραθύρου μην ενοχλείτε (0-23). Οι ειδοποιήσεις ολοκλήρωσης, υπενθύμισης και καθαρών ρούχων που θα ενεργοποιούνταν κατά τις ώρες ησυχίας κρατούνται και παραδίδονται όταν λήξει το παράθυρο. Αφήστε κενό για απενεργοποίηση. Υποστηρίζει παράθυρα που διασχίζουν τα μεσάνυχτα (π.χ. έναρξη 22, τέλος 7).", + "label": "Έναρξη ωρών ησυχίας" + }, + "peak_rate_message": { + "doc": "Προαιρετικό προσαρμοσμένο κείμενο για τη συμβουλή τιμής αιχμής που προσαρτάται στην ειδοποίηση έναρξης. Μεταβλητές προτύπου: {device}, {price}. Το κενό χρησιμοποιεί την ενσωματωμένη προεπιλογή.", + "label": "Μήνυμα τιμής αιχμής" + }, + "peak_rate_threshold": { + "doc": "Όταν ξεκινά ένας κύκλος και η τρέχουσα τιμή ανά kWh είναι στην ή πάνω από αυτή την τιμή, προσαρτά μια συμβουλή τιμής αιχμής στην ειδοποίηση έναρξης. Το 0 ή κενό απενεργοποιεί τη συμβουλή.", + "label": "Κατώφλι τιμής αιχμής (ανά kWh)" + }, + "dtw_bandwidth": { + "label": "Ανοχή αντιστοίχισης σχήματος", + "doc": "Πόσο μπορεί ο μηχανισμός αντιστοίχισης να παραμορφώσει χρονικά έναν κύκλο ώστε να ταιριάξει με το σχήμα ενός αποθηκευμένου προγράμματος. Υψηλότερη τιμή ανέχεται μεγαλύτερη διακύμανση ταχύτητας. Πολύ υψηλή κινδυνεύει να αντιστοιχίσει λάθος πρόγραμμα." + }, + "corr_weight": { + "label": "Βάρος σχήματος έναντι επιπέδου", + "doc": "Ισορροπία μεταξύ του σχήματος της καμπύλης και του απόλυτου επιπέδου ισχύος κατά τη βαθμολόγηση μιας αντιστοίχισης. Υψηλότερη τιμή ευνοεί το σχήμα. Χαμηλότερη ευνοεί την αντιστοίχιση του επιπέδου ισχύος." + }, + "duration_weight": { + "label": "Βάρος διάρκειας", + "doc": "Πόσο ισχυρά προτιμάται ένα πρόγραμμα του οποίου η τυπική διάρκεια ταιριάζει με αυτόν τον κύκλο." + }, + "energy_weight": { + "label": "Βάρος ενέργειας", + "doc": "Πόσο ισχυρά προτιμάται ένα πρόγραμμα του οποίου η τυπική κατανάλωση ενέργειας ταιριάζει με αυτόν τον κύκλο." + }, + "store_brand": { + "label": "Μάρκα Συσκευής", + "doc": "Προαιρετικό. Η μάρκα της συσκευής, επιλεγμένη από τον κατάλογο της κοινότητας. Χρησιμοποιείται για την εύρεση και κοινοποίηση αντίστοιχων καταγραφών αναφοράς. Αφήστε το κενό αν δεν χρησιμοποιείτε διαδικτυακές λειτουργίες." + }, + "store_model": { + "label": "Μοντέλο Συσκευής", + "doc": "Προαιρετικό. Το μοντέλο της συσκευής, επιλεγμένο από τον κατάλογο της κοινότητας μόλις οριστεί μια μάρκα. Αν το μοντέλο σας δεν αναφέρεται, μπορείτε να το προσθέσετε στον κατάλογο." + }, + "show_contributor": { + "doc": "Εμφάνιση της ένδειξης \"από <συνεισφέρων>\" στις κοινοτικές συσκευές και τους κύκλους αναφοράς." + }, + "enable_phase_matching": { + "label": "Υπολειπόμενος χρόνος με επίγνωση φάσεων", + "doc": "Χωρίστε κάθε κύκλο που εκτελείται σε φάσεις (θέρμανση, πλύση, στύψιμο) και κατανείμετε τον υπολειπόμενο χρόνο ανά φάση, συνδυασμένο με την κλασική εκτίμηση - στηριζόμενοι στην κατανομή ανά φάση στην αρχή του κύκλου και στην κλασική εκτίμηση κοντά στο τέλος. Αυτό προσαρμόζει την αντίστροφη μέτρηση στο πόση ώρα πραγματικά θερμαίνεται και λειτουργεί η μηχανή σας, κάτι που είναι πιο εμφανές στο πρώτο μισό ενός κύκλου. Off = μόνο η κλασική εκτίμηση. Επηρεάζεται μόνο η ένδειξη υπολειπόμενου χρόνου· η αντιστοίχιση προγραμμάτων και η ανίχνευση κύκλου παραμένουν αμετάβλητες." + }, + "keep_min_score": { + "label": "Ελάχ. Βαθμός Αντιστοίχισης", + "doc": "Ελάχιστη βαθμολογία ομοιότητας για παραμονή υποψηφίου στον αγώνα αντιστοίχισης. Η προεπιλογή 0.1 είναι εκ προθέσεως επιεικής - επιτρέπει ακόμη και αδύναμους υποψηφίους, αφήνοντας τα επόμενα στάδια να βρουν το καλύτερο ταίριασμα. Αυξήστε για πρώιμο αποκλεισμό απίθανων προφίλ; μειώστε για διεύρυνση της αρχικής ομάδας υποψηφίων." + }, + "dtw_blend": { + "label": "Ανάμειξη DTW", + "doc": "Σε ποιο βαθμό ο βαθμός ευθυγράμμισης DTW αντικαθιστά τον βαθμό πυρήνα Σταδίου 2. 0 = μόνο ο βαθμός Σταδίου 2, 1 = μόνο ο βαθμός DTW, 0.5 (προεπιλογή) = ισόρροπη ανάμειξη. Αυξήστε για μεγαλύτερη εξάρτηση από ευθυγράμμιση παραμόρφωσης όταν τα προγράμματα έχουν παρόμοια επίπεδα ισχύος αλλά διαφορετικά χρονικά πρότυπα." + }, + "dtw_ensemble_w": { + "label": "Σύνολο DTW", + "doc": "Στη λειτουργία συνόλου DTW (η προεπιλογή), το βάρος στο κλιμακωμένο L1 έναντι παραγώγου DTW (DDTW). 1.0 = πλήρως κλιμακωμένο-L1, 0 = πλήρως DDTW, 0.7 = προεπιλογή. Η παραλλαγή κλιμακωμένου-L1 συγκρίνει επίπεδα ισχύος; η παραγώγου παραλλαγή ανταποκρίνεται στο πώς μεταβάλλεται η ισχύς. Το σύνολο συνδυάζει και τα δύο." + }, + "dtw_ddtw_scale": { + "label": "Κλίμακα DDTW", + "doc": "Απόσταση ημίσεος κορεσμού για τη βαθμολόγηση παραγώγου DTW. Η βαθμολογία υποδιπλασιάζεται όταν η απόσταση DDTW ισούται με αυτήν την τιμή. Μικρότερη = μεγαλύτερη ευαισθησία σε διαφορές σχήματος. Η προεπιλογή 30 είναι βαθμονομημένη στα τυπικά ίχνη ισχύος οικιακών συσκευών. Επηρεάζει μόνο τις λειτουργίες DTW συνόλου και ddtw." + }, + "dtw_refine_top_n": { + "label": "Αριθμός Εκλέπτυνσης DTW", + "doc": "Πόσοι κορυφαίοι υποψήφιοι Σταδίου 2 επαναβαθμολογούνται από DTW. Η DTW είναι πιο ακριβή υπολογιστικά, οπότε εφαρμόζεται μόνο στους καλύτερους N υποψηφίους. Προεπιλογή 5. Αυξήστε (σε 7-9) αν το σωστό προφίλ φτάνει μερικές φορές μόνο στη 4η ή 5η θέση μετά το Στάδιο 2 - η DTW μπορεί να το σώσει. Η μείωση επιταχύνει ελαφρώς την αντιστοίχιση." + }, + "duration_scale": { + "label": "Ευαισθησία Διάρκειας", + "doc": "Αυστηρότητα της ποινής συμφωνίας διάρκειας Σταδίου 4. Αυτός είναι ο λόγος λογαρίθμου στον οποίο ο βαθμός συμφωνίας υποδιπλασιάζεται. Μικρότερος = αυστηρότερος: μια ασυμφωνία διάρκειας επηρεάζει περισσότερο. Η προεπιλογή 0.175 αντιστοιχεί σε ανοχή διάρκειας περίπου 18% στο μισό βάρος. Χρησιμοποιήστε μαζί με το Βάρος Διάρκειας." + }, + "energy_scale": { + "label": "Ευαισθησία Ενέργειας", + "doc": "Αυστηρότητα της ποινής συμφωνίας ενέργειας Σταδίου 4. Μικρότερος = αυστηρότερος: μια ασυμφωνία ενέργειας επηρεάζει περισσότερο. Η προεπιλογή 0.25 είναι εκ προθέσεως πιο επιεικής από την Ευαισθησία Διάρκειας επειδή η ενέργεια ποικίλλει με το φορτίο. Χρησιμοποιήστε μαζί με το Βάρος Ενέργειας." + }, + "power_profile_interval_min": { + "label": "Διάστημα προφίλ ισχύος", + "doc": "Το μέγεθος κουβά για το χαρακτηριστικό αισθητήρα power_profile ανά προφίλ (ο επίπεδος πίνακας μέσων βατ ανά θέση που καταναλώνουν εξωτερικοί σχεδιαστές όπως το EMHASS και το tibber_prices). Μικρότεροι κουβάδες διατηρούν τις σύντομες κορυφές ισχύος έντονες· μεγαλύτεροι κουβάδες εξομαλύνουν το σχήμα. Προεπιλογή 15 λεπτά. Μόνο κατά την ανάγνωση· δεν επηρεάζει την ανίχνευση." + }, + "notify_live_sticky": { + "label": "Διατήρηση ζωντανής ειδοποίησης μετά το πάτημα", + "doc": "Μόνο Android. Κάντε την ειδοποίηση ζωντανής προόδου μόνιμη (sticky) ώστε το πάτημά της να μη σβήνει το ενεργό νήμα. Απενεργοποιημένο διατηρεί την προεπιλεγμένη συμπεριφορά όπου το πάτημα σβήνει την ειδοποίηση." + }, + "notify_live_click_action": { + "label": "Στόχος πατήματος ζωντανής ειδοποίησης", + "doc": "Μόνο Android. Πού ανοίγει το πάτημα της ειδοποίησης ζωντανής προόδου (π.χ. /lovelace/laundry ή πλήρες URL) αντί για την αρχική σελίδα της εφαρμογής. Αφήστε κενό για την προεπιλογή." + }, + "door_opens_at_end": { + "label": "Η πόρτα ανοίγει αυτόματα στο τέλος", + "doc": "Για πλυντήρια πιάτων που ανοίγουν την πόρτα στο τέλος του κύκλου για στέγνωμα (AirDry και παρόμοια). Με αυτό ενεργό, το άνοιγμα της πόρτας κατά τη διάρκεια ενεργού κύκλου δεν τον παγώνει πλέον για πάντα· αντίθετα, εάν η πόρτα παραμείνει ανοιχτή για τη διάρκεια αναμονής παρακάτω, το WashData θεωρεί τον κύκλο ολοκληρωμένο. Μια σύντομη άνοιξη (προσθήκη σκεύους) αγνοείται. Απαιτείται οντότητα αισθητήρα πόρτας." + }, + "door_end_dwell_seconds": { + "label": "Διάρκεια αναμονής τέλους ανοίγματος πόρτας", + "doc": "Πόσο ώρα πρέπει να παραμείνει ανοιχτή η πόρτα πριν το WashData τερματίσει τον κύκλο, όταν είναι ενεργό το \"Η πόρτα ανοίγει αυτόματα στο τέλος\". Αρκετά μεγάλη ώστε να αγνοεί την γρήγορη προσθήκη πιάτου (προεπιλογή 60 s), αρκετά μικρή ώστε να τερματίζει γρήγορα μόλις ανοίξει η πόρτα." + }, + "dishwasher_end_spike_quiet_release": { + "label": "Απελευθέρωση σε ήσυχο παθητικό στέγνωμα", + "doc": "Μόλις ο κύκλος ξεπεράσει την αναμενόμενη διάρκειά του, για πόσο χρόνο πρέπει το πλυντήριο πιάτων να παραμείνει ήσυχο (κάτω από το Κατώφλι Τερματισμού) πριν το WashData σταματήσει να περιμένει μια τελική αποστράγγιση και τερματίσει τον κύκλο. Αυξήστε το αν το μηχάνημά σας έχει μια μακρά, αθόρυβη φάση στεγνώματος πριν από μια καθυστερημένη τελική αποστράγγιση που δεν εντοπίζεται - ένα ευρύτερο παράθυρο επιτρέπει στη μαθημένη διάρκεια να ακολουθεί την εποχική μεταβολή (πιο κρύο νερό παροχής = μεγαλύτεροι κύκλοι) αντί να κλειδώνει στον παλιό μέσο όρο. Μπορεί μόνο να μειώσει την αναμονή σε σχέση με το εσωτερικό όριο των 30 λεπτών για την τελική αιχμή, ποτέ να την επεκτείνει." + } + }, + "setting_group": { + "auto_labeling": { + "label": "Αυτόματη Επισήμανση" + }, + "cycle_end": { + "label": "Λήξη Κύκλου" + }, + "cycle_start": { + "label": "Έναρξη Κύκλου" + }, + "cycle_timers": { + "label": "Χρονόμετρα Κύκλου" + }, + "data_management": { + "label": "Διαχείριση Δεδομένων" + }, + "debug": { + "label": "Αποσφαλμάτωση" + }, + "dishwasher_end": { + "label": "Λήξη Πλυντηρίου Πιάτων" + }, + "door_pause": { + "label": "Πόρτα & Παύση" + }, + "dtw_refinement": { + "label": "Βελτίωση DTW" + }, + "duration_gates": { + "label": "Πύλες Διάρκειας" + }, + "energy": { + "label": "Ενέργεια" + }, + "external_end_trigger": { + "label": "Εξωτερικός Ενεργοποιητής Λήξης" + }, + "housekeeping": { + "label": "Συντήρηση" + }, + "match_scoring": { + "label": "Βαθμολόγηση Αντιστοίχισης" + }, + "messages": { + "label": "Μηνύματα" + }, + "power_off": { + "label": "Απενεργοποίηση" + }, + "predictive_end": { + "label": "Προβλεπτική Λήξη" + }, + "schedule": { + "label": "Πρόγραμμα" + }, + "services": { + "label": "Υπηρεσίες" + }, + "signal_processing": { + "label": "Επεξεργασία Σήματος" + }, + "thresholds_gap": { + "label": "Κατώφλια & Κενό" + }, + "timing": { + "label": "Χρονισμός" + }, + "unload_reminder": { + "label": "Υπενθύμιση Αποφόρτωσης" + }, + "watchdog": { + "label": "Watchdog" + }, + "quiet_hours_milestones": { + "label": "Ώρες ησυχίας και ορόσημα" + }, + "device_info": { + "label": "Πληροφορίες συσκευής" + }, + "basic_configuration": { + "label": "Βασική διαμόρφωση" + } + }, + "status": { + "active": "Ενεργός", + "all_statuses": "Όλες οι καταστάσεις", + "ambiguous": "Ασαφής", + "auto_detect": "Αυτόματος εντοπισμός", + "clear": "Καθαρισμός", + "completed": "Ολοκληρώθηκε", + "fine_tuning": "τελειοποίηση τώρα…", + "force_stopped": "Αναγκαστική διακοπή", + "idle": "Αδρανής", + "interrupted": "Διακόπηκε", + "ready": "Έτοιμο για επεξεργασία", + "recording": "Εγγραφή", + "training": "Εκπαίδευση…", + "saving": "Αποθήκευση…", + "rebuilding": "Ανακατασκευή…", + "analyzing": "Ανάλυση…", + "resetting": "Επαναφορά…", + "reverting": "Αναίρεση…", + "trimming": "Περικοπή…", + "splitting": "Διαίρεση…", + "deleting": "Διαγραφή…", + "imported": "Εισηγμένο" + }, + "tab": { + "advanced": "Για προχωρημένους", + "diagnostics": "Διαγνωστικά", + "history": "Κύκλοι", + "ml": "Εκπαίδευση ML", + "pp_cleanup": "Καθαρισμός", + "pp_manage": "Διαχείριση", + "pp_overview": "Επισκόπηση", + "pp_phases": "Φάσεις", + "profiles": "Προφίλ", + "settings": "Ρυθμίσεις", + "status": "Επισκόπηση", + "subtab_phase_catalog": "Κατάλογος Φάσης", + "subtab_profiles": "Προφίλ", + "maintenance": "Συντήρηση", + "playground": "Χώρος δοκιμών", + "store": "Κατάστημα" + }, + "tag": { + "early_end": "Πρόωρο τέλος", + "late_start": "Καθυστερημένη έναρξη", + "merged": "Συγχωνευμένοι κύκλοι", + "noise": "Θόρυβος", + "sensor_gap": "Κενό αισθητήρα", + "split": "Διαχωρισμένος κύκλος", + "wrong_profile": "Λάθος προφίλ" + }, + "toast": { + "access_saved": "Ο έλεγχος πρόσβασης αποθηκεύτηκε", + "all_wiped": "Όλα τα δεδομένα διαγράφηκαν", + "analysis_complete_none": "Η ανάλυση ολοκληρώθηκε: δεν υπάρχουν νέες προτάσεις", + "auto_label_complete": "Η αυτόματη ετικέτα ολοκληρώθηκε", + "automation_deleted": "Ο αυτοματισμός διαγράφηκε", + "correction_submitted": "Υποβλήθηκε διόρθωση", + "cycle_deleted": "Ο κύκλος διαγράφηκε", + "cycle_force_stopped": "Ο κύκλος σταμάτησε με δύναμη", + "cycle_labelled": "Κύκλος με ετικέτα", + "cycle_paused": "Ο κύκλος σταμάτησε", + "cycle_resumed": "Ο κύκλος συνεχίστηκε", + "cycle_trimmed": "Κύκλος κομμένο", + "cycles_merged": "Οι κύκλοι συγχωνεύτηκαν", + "envelope_rebuilt": "Φάκελος ανακατασκευασμένος", + "envelopes_rebuilt": "Φάκελοι ανακατασκευασμένοι", + "export_downloaded": "Έγινε λήψη της εξαγωγής", + "feedback_all_dismissed": "Όλα τα σχόλια απορρίφθηκαν", + "feedback_confirmed": "Τα σχόλια επιβεβαιώθηκαν", + "feedback_dismissed": "Τα σχόλια απορρίφθηκαν", + "group_deleted": "Η ομάδα διαγράφηκε", + "group_name_required": "Απαιτείται όνομα ομάδας", + "group_saved": "Η ομάδα αποθηκεύτηκε", + "import_successful": "Επιτυχής εισαγωγή. επαναφόρτωση ενσωμάτωσης", + "json_required": "Απαιτούνται δεδομένα JSON", + "legacy_removed": "Οι ενέργειες παλαιού τύπου καταργήθηκαν", + "logs_exported": "Εξαγωγή αρχείων καταγραφής", + "matching_reverted": "Τα αντίστοιχα βάρη επανήλθαν στις προεπιλογές", + "min_2_profiles": "Επιλέξτε τουλάχιστον 2 προφίλ για μια ομάδα", + "ml_training_no_improvement": "Η εκπαίδευση ολοκληρώθηκε: διατηρήθηκε η βασική γραμμή (καμία βελτίωση)", + "models_reverted": "Τα μοντέλα στη συσκευή επανήλθαν στη γραμμή βάσης", + "name_required": "Απαιτείται όνομα", + "no_split_found": "Δεν βρέθηκαν κενά σε αδράνεια για διαχωρισμό", + "panel_settings_saved": "Οι ρυθμίσεις του πίνακα αποθηκεύτηκαν", + "pg_preset_loaded": "Η προρύθμιση \"{name}\" φορτώθηκε", + "pg_preset_saved": "Η προρύθμιση \"{name}\" αποθηκεύτηκε", + "pg_sugg_loaded": "Φορτώθηκαν {n} προτεινόμενες τιμές - εκτελέστε τον Χώρο δοκιμών για σύγκριση", + "pg_sugg_ml_loaded": "Φορτώθηκαν {n} τιμές βαθμονόμησης ML - εκτελέστε τον Χώρο δοκιμών για σύγκριση", + "phase_name_required": "Απαιτείται όνομα φάσης", + "phase_updated": "Η φάση ενημερώθηκε", + "phases_saved": "Οι φάσεις αποθηκεύτηκαν", + "preferences_saved": "Οι προτιμήσεις αποθηκεύτηκαν", + "profile_name_required": "Απαιτείται όνομα προφίλ", + "profile_renamed": "Το προφίλ μετονομάστηκε", + "recording_discarded": "Η εγγραφή απορρίφθηκε", + "recording_saved": "Η εγγραφή αποθηκεύτηκε στο προφίλ", + "recording_started": "Η ηχογράφηση ξεκίνησε", + "recording_stopped": "Η εγγραφή σταμάτησε", + "review_saved": "Η κριτική αποθηκεύτηκε", + "settings_conflicts": "Επιλύστε τις επισημασμένες συγκρούσεις ρυθμίσεων πριν αποθηκεύσετε.", + "settings_reverted": "Οι ρυθμίσεις επαναφέρθηκαν. επαναφόρτωση ενσωμάτωσης", + "settings_saved": "Οι ρυθμίσεις αποθηκεύτηκαν. επαναφόρτωση ενσωμάτωσης", + "suggestions_applied": "Εφαρμόστηκαν προτάσεις. επαναφόρτωση ενσωμάτωσης", + "suggestions_dismissed": "Οι προτάσεις απορρίφθηκαν", + "apply_failed": "Η εφαρμογή απέτυχε: {error}", + "delete_failed": "Η διαγραφή απέτυχε: {error}", + "load_more_failed": "Δεν ήταν δυνατή η φόρτωση περισσότερων: {error}", + "maint_add_failed": "Δεν ήταν δυνατή η προσθήκη συμβάντος: {error}", + "maint_added": "Το συμβάν συντήρησης προστέθηκε", + "maint_delete_failed": "Δεν ήταν δυνατή η διαγραφή συμβάντος: {error}", + "maint_deleted": "Το συμβάν συντήρησης διαγράφηκε", + "relabel_done": "Επανεπισημάνθηκαν {count} κύκλοι", + "relabel_failed": "Η επανεπισήμανση απέτυχε: {error}", + "reminders_save_failed": "Δεν ήταν δυνατή η αποθήκευση υπενθυμίσεων: {error}", + "reminders_saved": "Οι υπενθυμίσεις σέρβις αποθηκεύτηκαν", + "pause_no_cycle": "Δεν υπάρχει ενεργός κύκλος για παύση", + "resume_no_cycle": "Δεν υπάρχει παυσμένος κύκλος για συνέχιση", + "delete_partial_failed": "Ορισμένα στοιχεία δεν ήταν δυνατό να διαγραφούν και επαναφέρθηκαν", + "pg_run_gone": "Αυτή η εκτέλεση δεν είναι πλέον διαθέσιμη.", + "task_cancelled": "Ακυρώθηκε.", + "processed": "Επεξεργάστηκαν {bits}", + "processed_cycles": "{n} κύκλοι", + "processed_suggestions": "{n} προτάσεις", + "processed_models": "{n} μοντέλα που προήχθησαν", + "store_search_failed": "Η αναζήτηση απέτυχε: {error}", + "store_connect_failed": "Η σύνδεση απέτυχε: {error}", + "store_connected": "Συνδέθηκε στο κοινοτικό κατάστημα", + "store_disconnected": "Αποσυνδέθηκε από το κοινοτικό κατάστημα", + "store_error": "Σφάλμα: {error}", + "store_unavailable": "Το κοινοτικό κατάστημα δεν είναι διαθέσιμο.", + "store_pick_profile": "Επιλέξτε ένα προφίλ για συγχώνευση", + "store_name_required": "Εισαγάγετε ένα όνομα προφίλ", + "store_import_failed": "Η εισαγωγή απέτυχε: {error}", + "store_imported": "Εισήχθη στο {profile}", + "store_program_required": "Εισαγάγετε ένα όνομα προγράμματος", + "store_no_appliance": "Ορίστε πρώτα τη μάρκα και το μοντέλο της συσκευής σας στις Ρυθμίσεις.", + "store_share_failed": "Η κοινοποίηση απέτυχε: {error}", + "store_shared": "Κοινοποιήθηκε στο κοινοτικό κατάστημα, σε αναμονή ελέγχου.", + "appliance_added": "Η συσκευή προστέθηκε, σε αναμονή έγκρισης", + "thanks_confirming": "Ευχαριστούμε για την επιβεβαίωση", + "device_approved": "Εγκρίθηκε από την κοινότητα", + "rating_saved": "Η βαθμολογία ποιότητας αποθηκεύτηκε", + "brand_added": "Η μάρκα προστέθηκε, σε αναμονή έγκρισης", + "profile_added": "Το προφίλ προστέθηκε, σε αναμονή έγκρισης", + "saved_except_conflicts": "Αποθηκεύτηκε. Διορθώστε τις επισημασμένες συγκρούσεις για να αποθηκεύσετε τα υπόλοιπα.", + "share_device_none_sel": "Επιλέξτε τουλάχιστον έναν κύκλο για κοινοποίηση", + "store_device_downloaded": "{p} πρόγραμμα(τα), {c} εγγραφή(ές) προστέθηκαν", + "store_device_downloaded_phases": "{p} πρόγραμμα(τα), {c} εγγραφή(ές), {ph} χάρτης(ες) φάσεων προστέθηκαν", + "store_device_downloaded_settings": "{p} πρόγραμμα(τα), {c} εγγραφή(ές), {ph} χάρτης(ες) φάσεων, {s} ρύθμιση(ες) προστέθηκαν", + "store_device_shared": "Κοινοποιήθηκαν {n} κύκλος(οι) στο κοινοτικό κατάστημα - σε αναμονή ελέγχου.", + "store_device_shared_all_dup": "Όλοι οι {n} κύκλος(οι) υπήρχαν ήδη στο κοινοτικό κατάστημα.", + "store_device_shared_partial": "Κοινοποιήθηκαν {n} κύκλος(οι)· {failed} δεν ήταν δυνατό να ανεβούν.", + "store_device_shared_some_dup": "Κοινοποιήθηκαν {created} κύκλος(οι)· {dup} υπήρχαν ήδη στο κατάστημα.", + "store_download_failed": "Η λήψη απέτυχε: {error}", + "store_download_nothing": "Δεν υπάρχει τίποτα νέο για λήψη - αυτή η ρύθμιση βρίσκεται ήδη στη συσκευή σας.", + "export_selective_done": "Η εξαγωγή λήφθηκε", + "import_selective_done": "Εισήχθησαν {profiles} προφίλ και {cycles} κύκλοι" + }, + "suggestion": { + "both_agree": "Το WashData προτείνει", + "calibrated_label": "Βαθμονομημένο", + "observed_label": "Παρατηρήθηκε", + "impact": { + "auto_label_confidence": { + "higher": "Επισημαίνει αυτόματα λιγότερους κύκλους; περισσότεροι πηγαίνουν σε έλεγχο", + "lower": "Επισημαίνει αυτόματα περισσότερους κύκλους; κάποιοι ενδέχεται να αναγνωριστούν λανθασμένα" + }, + "duration_tolerance": { + "higher": "Αποδέχεται ευρύτερο εύρος διάρκειας – πιο ευέλικτη αντιστοίχιση", + "lower": "Απαιτεί πιο ακριβή αντιστοίχιση διάρκειας – αυστηρότερο, μπορεί να απορρίψει ασυνήθεις κύκλους" + }, + "end_energy_threshold": { + "higher": "Κλείνει μόνο κύκλους που κατανάλωσαν σημαντική ενέργεια", + "lower": "Κλείνει και συντομότερους ή χαμηλής ενέργειας κύκλους" + }, + "end_repeat_count": { + "higher": "Απαιτεί επανάληψη του σήματος λήξης περισσότερες φορές – πιο αξιόπιστο, ελαφρώς πιο αργό", + "lower": "Τερματίζει μετά από λιγότερες επαναλήψεις – ταχύτερη ανίχνευση, μεγαλύτερος κίνδυνος ψευδούς λήξης" + }, + "learning_confidence": { + "higher": "Μαθαίνει μόνο από πολύ σίγουρες αντιστοιχίσεις – πιο αργό αλλά πιο αξιόπιστο", + "lower": "Μαθαίνει από περισσότερους κύκλους; το μοντέλο μπορεί να έχει περισσότερο θόρυβο" + }, + "min_off_gap": { + "higher": "Απαιτείται μεγαλύτερη αδράνεια πριν ξεκινήσει νέος κύκλος", + "lower": "Σύντομη αδράνεια εκκινεί νέο κύκλο – διαδοχικές λειτουργίες μπορεί να διαχωριστούν" + }, + "min_power": { + "higher": "Λιγότερο ευαίσθητο στην κατανάλωση αδράνειας; μπορεί να χάσει ήσυχα προγράμματα", + "lower": "Πιο ευαίσθητο; μπορεί να καταγράφει την κατανάλωση σε αναμονή ως δραστηριότητα" + }, + "no_update_active_timeout": { + "higher": "Περισσότερος χρόνος πριν δηλωθεί κύκλος κολλημένος", + "lower": "Αναγκαστική διακοπή κολλημένου κύκλου νωρίτερα" + }, + "off_delay": { + "higher": "Περισσότερος χρόνος για παύσεις συσκευής – χειρίζεται μακρά εμποτίσματα ή φάσεις στεγνώματος", + "lower": "Ταχύτερη ανίχνευση λήξης – καλό για συσκευές με καθαρό ενεργό/ανενεργό" + }, + "profile_match_threshold": { + "higher": "Επιβεβαιώνει μόνο αντιστοιχίσεις υψηλής εμπιστοσύνης; περισσότεροι κύκλοι παραμένουν χωρίς ετικέτα", + "lower": "Αντιστοιχεί περισσότερους κύκλους; κάποιοι μπορεί να είναι ελαφρώς λανθασμένοι" + }, + "running_dead_zone": { + "higher": "Αγνοεί σύντομες αιχμές ισχύος κατά την αδράνεια – λιγότερο ευαίσθητο σε θόρυβο", + "lower": "Ανταποκρίνεται σε συντομότερες αναλαμπές ισχύος – εντοπίζει γρήγορη παροδική δραστηριότητα" + }, + "start_threshold_w": { + "higher": "Αποφεύγει ψευδείς εκκινήσεις από σύντομες αιχμές ισχύος", + "lower": "Εντοπίζει προγράμματα χαμηλής ισχύος; μπορεί να ενεργοποιηθεί από θόρυβο" + }, + "stop_threshold_w": { + "higher": "Τερματίζει τον κύκλο γρηγορότερα – μπορεί να κλείσει κατά τη διάρκεια παύσης", + "lower": "Αναμένει περισσότερο για τερματισμό – λιγότερες πρόωρες ολοκληρώσεις" + }, + "watchdog_interval": { + "higher": "Επιτρέπονται μακρύτερες ήσυχες φάσεις; λιγότερες ψευδείς αναγκαστικές διακοπές", + "lower": "Εντοπίζει κολλημένους κύκλους πιο επιθετικά" + } + }, + "reason": { + "auto_label_confidence": "Αξιοπιστία 15ου εκατοστημορίου των {cycles} αυτόματων ετικετών που ο χρήστης δεν διόρθωσε ποτέ ({p15}).", + "completion_min_seconds": "Το μισό της διάρκειας p05 των καθαρών κύκλων ({minutes} min) σε {cycles} κύκλους· φιλτράρει τους ψευδείς κύκλους.{excl}", + "dead_zone_batch": "Διατηρείται σύντομο (διάμεσο παράθυρο αστάθειας εκκίνησης σε {cycles} κύκλους = {s}s) ώστε ένα πραγματικό τέλος να ανιχνεύεται άμεσα.", + "dead_zone_from_dip": "Βάσει πρώιμης πτώσης ισχύος που ανιχνεύτηκε στα {s}s.", + "end_energy_default": "Προεπιλεγμένη συνιστώμενη βάση για το κατώφλι θορύβου στο τέλος του κύκλου.", + "end_energy_false": "Ενέργεια ψευδούς τέλους p95 ({p95}Wh) σε {cycles} κύκλους, με κατώτατο όριο το 0.2% της διάμεσης ενέργειας κύκλου ({floor}Wh).", + "end_energy_no_false": "Κανένα ψευδές τέλος σε {cycles} κύκλους· με κατώτατο όριο το 0.2% της διάμεσης ενέργειας κύκλου ({floor}Wh).", + "end_repeat_count": "{false}/{total} καθαροί κύκλοι ({pct}%) είχαν εσωτερική παύση >60s που συνεχίστηκε· απαιτούνται {val} επιβεβαίωση(εις) τέλους.", + "learning_confidence": "Αξιοπιστία p05 των {cycles} κύκλων με ετικέτα χρήστη ({p05})· κάτω από αυτό, ζητείται επαλήθευση.", + "match_interval": "Βάσει του παρατηρούμενου ρυθμού ενημέρωσης (διάμεσος={median}s) * 10.", + "max_duration_ratio": "Βάσει των διαρκειών των κύκλων με ετικέτα (p95={p95}).", + "min_active": "Βάσει της ελάχιστης ενεργού ισχύος ({min}W) που παρατηρήθηκε στον τελευταίο κύκλο.", + "min_duration_ratio": "Διατηρείται όσο το δυνατόν χαμηλότερο ώστε ένα πρόγραμμα να αναγνωρίζεται νωρίς στον κύκλο· τα κατώφλια αξιοπιστίας και ασάφειας αποτρέπουν τις πρόωρες επιβεβαιώσεις.", + "min_off_gap": "Βάσει {gaps} παρατηρούμενων διακυκλικών κενών (p05={p05}s). Κατώτατο όριο συσκευής: {floor}s.", + "min_off_gap_bridge": "Διαστασιολογήθηκε ώστε να γεφυρώνει το μεγαλύτερο διάστημα ησυχίας μέσα στον κύκλο: {span}s + 60s περιθώριο, από {spans} γεφυρωμένα κενά σε {cycles} καθαρούς κύκλους (παραμένει κάτω από τα {ceiling}s, το συντομότερο διάλειμμα που αφήνετε ανάμεσα σε δύο διαδοχικές εκκινήσεις).", + "min_power": "40% της χαμηλότερης ενεργού ισχύος p05 ({p05}W) σε {cycles} καθαρούς κύκλους, διατηρώντας το κατώφλι απενεργοποίησης κάτω από την πραγματική κατανάλωση.{excl}", + "ml_auto_label": "Η χαμηλότερη αξιοπιστία που το μοντέλο ποιότητας εξακολούθησε να αξιολογεί ως καθαρή (p10 των {cycles} καθαρών κύκλων = {p10}).", + "ml_end_repeat": "{false}/{total} κύκλοι ({pct}%) είχαν παύση που ο ανιχνευτής τέλους βαθμολόγησε >50%· απαιτούνται {val} επιβεβαίωση(εις) τέλους.", + "ml_off_delay": "Παύσεις επιβεβαιωμένες από τον ανιχνευτή τέλους: p95 {p95}s + 60s περιθώριο, από {pauses} παύσεις επαληθευμένες από το μοντέλο σε {cycles} κύκλους (κατώτατο όριο {floor}s).", + "no_update_timeout": "Βάσει του παρατηρούμενου ρυθμού ενημέρωσης (p95={p95}s) * 20 (ελάχ. 60s).", + "off_delay_cadence": "Βάσει του παρατηρούμενου ρυθμού ενημέρωσης (p95={p95}s) * 5", + "off_delay_device_floor": "Χρησιμοποιήθηκε το ασφαλές ελάχιστο ειδικό για τη συσκευή {device} ({floor}s).", + "off_delay_generic_floor": "Χρησιμοποιήθηκε γενικό ασφαλές ελάχιστο ({floor}s).", + "off_delay_pauses": "Διαστασιολογήθηκε ώστε να ξεπερνά τις πραγματικές παύσεις: παύση εντός κύκλου p95 {p95}s + 60s περιθώριο, από {pauses} παύσεις σε {cycles} καθαρούς κύκλους (κατώτατο όριο {floor}s).", + "profile_match_threshold": "Αξιοπιστία p10 των {cycles} σωστών αυτόματων ετικετών ({p10})· ασφαλές κατώτατο όριο άμεσης επιβεβαίωσης.", + "sampling_interval": "Διάμεσο διάστημα ενημέρωσης που παρατηρήθηκε σε {cycles} καθαρούς κύκλους ({si}s).{excl}", + "smoothing_window": "Διαστασιολογήθηκε ώστε να εξομαλύνει ~30s μετρήσεων σε δειγματοληψία {si}s ({samples} δείγματα).", + "start_duration": "Διατηρείται σύντομο (~ένα διάστημα δειγματοληψίας {si}s) ώστε η ανίχνευση να ξεκινά όσο το δυνατόν νωρίτερα, αγνοώντας παράλληλα τις αιχμές ενός μόνο δείγματος.", + "thr_batch": "Διατηρείται λίγο πάνω από τη χαμηλότερη ενεργό ισχύ p05 σε {cycles} κύκλους ({p05}W) ώστε μια έναρξη να εντοπίζεται όσο το δυνατόν νωρίτερα και το κατώφλι διακοπής να παραμένει κάτω από τη χαμηλότερη ισχύ λειτουργίας της μηχανής.", + "tol_per_profile": "p75 της διακύμανσης διάρκειας ανά προφίλ σε {profiles} προφίλ ({cycles} κύκλοι)· τα σταθερά προφίλ δεν επιβαρύνονται.", + "tol_pooled": "Βάσει της συγκεντρωτικής διακύμανσης διάρκειας {cycles} πρόσφατων κύκλων με ετικέτα (απόκλιση p95={dev}).", + "watchdog": "Διατηρείται όσο το δυνατόν χαμηλότερο με ασφάλεια (λίγο πάνω από το κενό ενημέρωσης p95 των {p95}s, ελάχ. 30s) ώστε οι διακοπές να εντοπίζονται γρήγορα χωρίς ψευδείς διακοπές." + }, + "exclusions": { + "summary": "Εξαιρέθηκαν {total} εσφαλμένα εντοπισμένοι κύκλοι: {parts}.", + "reason": { + "force_stopped": "αναγκαστικά τερματισμένοι", + "interrupted": "διακομμένοι", + "incomplete": "ημιτελείς", + "noise": "θόρυβος", + "unlabeled": "χωρίς ετικέτα", + "no_trace_short": "πολύ σύντομοι για έλεγχο", + "high_start": "ξεκίνησαν με υψηλή ισχύ", + "abrupt_end": "τελείωσαν απότομα", + "mid_restart": "με επανεκκίνηση στη μέση", + "no_power": "χωρίς ισχύ", + "no_active_power": "χωρίς ενεργή ισχύ" + } + } + }, + "trend": { + "down": "Πτωτικές τάσεις", + "up": "Ανοδική τάση" + }, + "maint": { + "bearing_service": "Σέρβις ρουλεμάν", + "descale": "Αφαλάτωση", + "drum_clean": "Καθαρισμός κάδου", + "filter_clean": "Καθαρισμός φίλτρου", + "other": "Άλλο" + }, + "pg_desc": { + "completion_min_seconds": "Η συντομότερη εκτέλεση που μετρά ως πραγματικός κύκλος", + "end_repeat_count": "Χαμηλές μετρήσεις στη σειρά πριν τη λήξη", + "interrupted_min_seconds": "Οι σύντομοι κύκλοι επισημαίνονται ως διακοπή", + "min_off_gap": "Απαιτούμενο κενό για διαχωρισμό δύο κύκλων", + "off_delay": "Δευτερόλεπτα χαμηλής ισχύος πριν λήξει ο κύκλος", + "start_duration_threshold": "Δευτερόλεπτα πάνω από το κατώφλι για επιβεβαίωση εκκίνησης", + "start_threshold_w": "Ελάχιστα watt για να θεωρηθεί ότι ξεκίνησε", + "stop_threshold_w": "Κάτω από αυτό, το μηχάνημα θεωρείται εκτός λειτουργίας", + "anti_wrinkle_enabled": "Απορροφά τους παλμούς ανατροπής μετά την κύρια φάση αντί να τους διαβάζει ως νέους κύκλους", + "anti_wrinkle_exit_power": "Η ισχύς πρέπει να πέσει κάτω από αυτό μεταξύ των παλμών για να παραμείνει ενεργή η λειτουργία κατά τσακίσματος", + "anti_wrinkle_idle_timeout": "Ο χρόνος ησυχίας που επιτρέπεται ανάμεσα σε δύο παλμούς ανατροπής προτού λήξει η λειτουργία κατά τσακίσματος", + "anti_wrinkle_max_duration": "Ένας παλμός μεγαλύτερος από αυτό τερματίζει τη λειτουργία κατά τσακίσματος και ανοίγει νέο κύκλο", + "anti_wrinkle_max_power": "Ένας παλμός πάνω από αυτό τερματίζει τη λειτουργία κατά τσακίσματος και ανοίγει νέο κύκλο", + "dtw_bandwidth": "Στάδιο 3: ζώνη παραμόρφωσης Sakoe-Chiba (0 = DTW ανενεργό; προεπιλογή 0.2 = 20% μήκους κύκλου)", + "corr_weight": "Στάδιο 2: ισορροπία μεταξύ σχήματος καμπύλης (συσχέτιση) και επιπέδου ισχύος (MAE); προεπιλογή 0.45", + "duration_weight": "Στάδιο 4: πόσο επηρεάζει η συμφωνία διάρκειας τον τελικό βαθμό (προεπιλογή 0.22)", + "energy_weight": "Στάδιο 4: πόσο επηρεάζει η συμφωνία ενέργειας τον τελικό βαθμό (προεπιλογή 0.22)", + "profile_match_min_duration_ratio": "Στάδιο 1: ελάχιστο μήκος κύκλου ως κλάσμα της διάρκειας προφίλ; προεπιλογή 0.1 (10%)", + "profile_match_max_duration_ratio": "Στάδιο 1: μέγιστο μήκος κύκλου ως κλάσμα της διάρκειας προφίλ; προεπιλογή 1.5 (150%)", + "keep_min_score": "Στάδιο 2: κατώτατο όριο βαθμολογίας για παραμονή στον αγώνα; προεπιλογή 0.1 επιτρέπει αδύναμα ταιριάσματα, τα επόμενα στάδια επιλέγουν το καλύτερο", + "dtw_blend": "Στάδιο 3: 0 = μόνο βαθμός πυρήνα, 1 = μόνο βαθμός DTW, 0.5 = ισόρροπη ανάμειξη (προεπιλογή)", + "dtw_ensemble_w": "Στάδιο 3 (λειτουργία συνόλου): βάρος στο κλιμακωμένο-L1 έναντι παραγώγου DTW; προεπιλογή 0.7 ευνοεί το επίπεδο ισχύος", + "dtw_ddtw_scale": "Στάδιο 3: απόσταση ημίσεος κορεσμού DDTW; μικρότερη = μεγαλύτερη ευαισθησία σχήματος (προεπιλογή 30)", + "dtw_refine_top_n": "Στάδιο 3: υποψήφιοι που επαναβαθμολογεί η DTW; αυξήστε σε 7-9 αν το σωστό προφίλ βρίσκεται στη 4η-5η θέση (προεπιλογή 5)", + "duration_scale": "Στάδιο 4: λόγος λογαρίθμου όπου η συμφωνία διάρκειας υποδιπλασιάζεται; μικρότερος = αυστηρότερη ποινή (προεπιλογή 0.175)", + "energy_scale": "Στάδιο 4: λόγος λογαρίθμου όπου η συμφωνία ενέργειας υποδιπλασιάζεται; μικρότερος = αυστηρότερη ποινή (προεπιλογή 0.25)", + "dishwasher_end_spike_quiet_release": "Πλυντήριο πιάτων: δευτερόλεπτα ησυχίας μετά την αναμενόμενη διάρκεια πριν απελευθερωθεί η αναμονή αποστράγγισης τέλους κύκλου" + }, + "col": { + "profile_tip": "Όνομα αντιστοιχισμένου προγράμματος. Χωρίς ετικέτα σημαίνει ότι κανένα προφίλ δεν αντιστοιχίστηκε στο τέλος του κύκλου.", + "status_tip": "Έκβαση κύκλου: Ολοκληρώθηκε (φυσικό τέλος), Διακόπηκε (απότομη πτώση ισχύος), Αναγκαστική διακοπή (μη αυτόματη) ή Χρειάζεται αναθεώρηση (εκκρεμούν σχόλια).", + "date_tip": "Ημερομηνία και ώρα έναρξης του κύκλου.", + "duration_tip": "Συνολικός χρόνος λειτουργίας του κύκλου από την αρχή έως το τέλος.", + "energy_tip": "Συνολική ενέργεια που καταναλώθηκε (kWh). Υπολογίζεται με ολοκλήρωση της ισχύος στον χρόνο.", + "cost_tip": "Κόστος ενέργειας για αυτόν τον κύκλο, παγιωμένο κατά την ολοκλήρωση με βάση την ισχύουσα τότε τιμή (ενέργεια x τιμή ανά kWh). Ορίστε μια τιμή στις Ρυθμίσεις για να συμπληρωθεί.", + "confidence_tip": "Εμπιστοσύνη αντιστοίχισης προφίλ (0-100%). Πόσο στενά η καμπύλη ισχύος του κύκλου ταίριαξε με το αναγνωρισμένο πρόγραμμα.", + "health_tip": "Υγεία κύκλου ML (υψηλότερο = καλύτερο). Κάντε κλικ σε έναν κύκλο για να τον ελέγξετε και να τον αξιολογήσετε.", + "flags_tip": "Σημαίες αναθεώρησης, ανωμαλίας και πηγής για τον κύκλο. Τοποθετήστε τον δείκτη πάνω σε ένα εικονίδιο για λεπτομέρειες." + }, + "stat": { + "avg": "μ.ό.", + "min": "ελάχ {v}", + "max": "μέγ {v}", + "consistency": "συνέπεια ±{v}", + "total": "σύνολο {v}", + "last_run": "τελευταία εκτέλεση {v}", + "score": "βαθμολογία {pct}%", + "duration_cv": "CV διάρκειας {pct}%", + "avg_confidence": "μ.ό. εμπιστοσύνης {pct}%" + }, + "pg_evd": { + "detected": "Ο ανιχνευτής αναγνώρισε ότι είχε ξεκινήσει ένας κύκλος.", + "match_commit": "Ο μηχανισμός αντιστοίχισης επέλεξε ένα πρόγραμμα με αρκετή βεβαιότητα.", + "match_changed": "Το επικρατέστερο πρόγραμμα άλλαξε καθώς έγινε ορατό μεγαλύτερο μέρος του κύκλου.", + "match_ambiguous": "Δύο προγράμματα συγκέντρωσαν παρόμοια βαθμολογία, οπότε η αντιστοίχιση ήταν αβέβαιη.", + "unmatched": "Κανένα αποθηκευμένο πρόγραμμα δεν ταίριαξε σε αυτόν τον κύκλο.", + "notify_start": "Θα στελνόταν μια ειδοποίηση έναρξης.", + "notify_pre_complete": "Θα στελνόταν μια ειδοποίηση «σχεδόν έτοιμο».", + "notify_finish": "Θα στελνόταν μια ειδοποίηση ολοκλήρωσης.", + "notify_milestone": "Θα στελνόταν μια ειδοποίηση ορόσημου.", + "notify_held": "Μια ειδοποίηση κρατήθηκε λόγω των ωρών ησυχίας.", + "finished": "Ο κύκλος έφτασε σε τελική κατάσταση και ολοκληρώθηκε." + }, + "store": { + "browse": "Περιήγηση", + "device": "Συσκευή", + "favorites": "Αγαπημένα", + "search_ph": "Αναζήτηση κατά μάρκα ή μοντέλο…", + "no_results": "Δεν βρέθηκαν αντίστοιχες συσκευές. Δοκιμάστε διαφορετική αναζήτηση.", + "n_programs": "{n} προγράμματα", + "n_cycles": "{n} κύκλοι", + "no_programs": "Δεν υπάρχουν ακόμη κοινοποιημένα προγράμματα για αυτή τη συσκευή.", + "no_cycles": "Δεν έχουν κοινοποιηθεί ακόμη κύκλοι αναφοράς για αυτό το πρόγραμμα.", + "anon": "ανώνυμος", + "uploaded_by": "Κοινοποιήθηκε από {name}", + "connected_as": "Συνδεδεμένος ως {name}", + "not_connected": "Δεν έχει γίνει σύνδεση. Συνδέστε έναν λογαριασμό GitHub για να κοινοποιήσετε τους δικούς σας κύκλους.", + "import_new": "Νέο προφίλ", + "import_merge": "Συγχώνευση σε υπάρχον", + "merge_target": "Συγχώνευση σε προφίλ", + "description": "Περιγραφή (προαιρετικό)", + "contributed_by": "από {name}", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "Δεν υπάρχουν ακόμη βαθμολογίες", + "website": "Ιστότοπος καταστήματος ↗", + "website_tip": "Άνοιγμα ιστότοπου κοινοτικού καταστήματος" + }, + "settings": { + "gear": { + "title": "Ρυθμίσεις" + } + }, + "link": { + "manual": "Εγχειρίδιο ↗", + "add_appliance": "Προσθέστε τη συσκευή σας" + }, + "tip": { + "add_brand": "Η μάρκα δεν αναφέρεται; Προσθέστε την στον κατάλογο της κοινότητας", + "add_appliance": "Το μοντέλο δεν αναφέρεται; Προσθέστε τη συσκευή σας στον κατάλογο της κοινότητας", + "add_profile": "Προσθέστε ένα προφίλ για αυτή τη συσκευή στον ιστότοπο της κοινότητας" + }, + "task": { + "reprocess": { + "matching": "Επανεπεξεργασία: αντιστοίχιση κύκλων", + "golden": "Επανεπεξεργασία: επισήμανση κύκλων αναφοράς", + "suggestions": "Επανεπεξεργασία: προτάσεις", + "ml_training": "Επανεπεξεργασία: εκπαίδευση ML", + "health": "Επανεπεξεργασία: υγεία κύκλων" + }, + "pg_sweep": { + "optimize": "Βελτιστοποίηση: {param}" + }, + "pg_detail": { + "simulate": "Προσομοίωση κύκλου" + }, + "split": { + "apply": "Διαχωρισμός κύκλου" + }, + "trim": { + "apply": "Περικοπή κύκλου" + }, + "merge": { + "apply": "Συγχώνευση κύκλων" + }, + "rebuild": { + "envelopes": "Ανακατασκευή φακέλων" + }, + "cancelling": "Ακύρωση..." + }, + "setup": { + "hdr": { + "card": "Ρύθμιση συσκευής", + "healthy_chip": "Ρύθμιση ολοκληρώθηκε" + }, + "phase0": { + "washer": "Το WashData ανιχνεύει ήδη τους κύκλους σας. Εγγράψτε τον πρώτο κύκλο για να ενεργοποιήσετε ονόματα προγραμμάτων και εκτιμήσεις χρόνου.", + "dishwasher": "Το WashData παρακολουθεί. Τα πλυντήρια πιάτων έχουν σύνθετους κύκλους – συνιστάται ανεπιφύλακτα η εγγραφή του πρώτου κύκλου. Αν ένας ανιχνευθείς κύκλος διαρκεί πολύ, χρησιμοποιήστε το πρόγραμμα επεξεργασίας κύκλων για να τον περικόψετε πριν αποθηκευτεί ως προφίλ.", + "generic": "Το WashData παρακολουθεί. Εγγράψτε ή επισημάνετε έναν ανιχνευθέντα κύκλο για να ξεκινήσετε να δημιουργείτε προφίλ." + }, + "phase1a": { + "labelled": "Καλή αρχή – το πρώτο πρόγραμμά σας αποθηκεύτηκε. Για τα πιο καθαρά δεδομένα, σκεφτείτε να εγγράψετε τον επόμενο κύκλο με το widget εγγραφής." + }, + "phase1b": { + "recorded": "Η εγγραφή σας αποθηκεύτηκε ως {profile_name}. Τώρα εγγράψτε ή επισημάνετε τα άλλα συνηθισμένα προγράμματά σας για να διευρύνετε την κάλυψη." + }, + "phase1c": { + "verify": "Έχετε {count} προγράμματα από την κοινότητα. Εκτελέστε έναν κύκλο για να επαληθεύσετε ότι το WashData τα αναγνωρίζει σωστά – η αντιστοίχιση θα βελτιώνεται καθώς η συσκευή σας δημιουργεί το δικό της ιστορικό." + }, + "phase2": { + "cluster": "Το WashData έχει δει {count} κύκλους που δεν αντιστοιχούν σε κανένα αποθηκευμένο πρόγραμμα – μοιάζουν μεταξύ τους. Θέλετε να δημιουργήσετε ένα νέο προφίλ για αυτούς;", + "unmatched": "Ο τελευταίος κύκλος δεν αντιστοιχεί σε κανένα αποθηκευμένο πρόγραμμα. Είναι νέο πρόγραμμα;" + }, + "phase3": { + "suggestions": "Το WashData έχει προτάσεις ρυθμίσεων βάσει του ιστορικού κύκλων σας – ελέγξτε τις για βελτίωση της ακρίβειας ανίχνευσης.", + "groups": "Μερικά από τα προφίλ σας μοιάζουν με το ίδιο πρόγραμμα σε διαφορετικές θερμοκρασίες. Οργανώστε τα σε μια ομάδα για καλύτερη αντιστοίχιση.", + "phases": "Προσθέστε φάσεις προγράμματος στο {profile_name} για πιο ακριβείς εκτιμήσεις χρόνου που απομένει." + }, + "phase4": { + "healthy": "Αυτή η συσκευή έχει ρυθμιστεί πλήρως ({profile_count} προφίλ)." + }, + "cta": { + "start_recording": "Έναρξη εγγραφής", + "label_detected_cycle": "Έχω ήδη ανιχνευθέντα κύκλο – επισήμανσή του", + "browse_cycles": "Αναζήτηση κύκλων για επισήμανση άλλου", + "view_profiles": "Προβολή προφίλ", + "create_from_cluster": "Δημιουργία προφίλ από αυτούς τους κύκλους", + "create_profile": "Δημιουργία προφίλ για αυτόν", + "review_suggestions": "Έλεγχος προτάσεων", + "organise_profiles": "Οργάνωση προφίλ", + "configure_phases": "Διαμόρφωση φάσεων", + "skip_step": "Παράλειψη βήματος", + "skip_forever": "Να μην εμφανιστεί ξανά", + "hide_guidance": "Απόκρυψη οδηγιών", + "show_guidance": "Εμφάνιση οδηγιών" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/en.json b/custom_components/ha_washdata/translations/panel/en.json index 9ffd4960..98168144 100644 --- a/custom_components/ha_washdata/translations/panel/en.json +++ b/custom_components/ha_washdata/translations/panel/en.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entity not found", + "running_long": "Running long", + "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": { "approved": "Approved", "artifact_tip": "{n} anomalies detected (e.g. door opened mid-cycle) – open to see them on the graph", @@ -72,6 +120,21 @@ "discard_tip": "Discard the recorded trace without saving", "disconnect": "Disconnect", "dismiss": "Dismiss", + "mute_suggestion": "Stop suggesting this setting", + "pg_load_calibrated": "Load Calibrated (ML) ({n})", + "pg_load_calibrated_tip": "Stage ML-calibrated settings as Playground overrides", + "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", + "reset_muted": "Reset muted", "done": "Done", "download_device": "Download this setup", "download_export": "Download export", @@ -274,6 +337,7 @@ "no_automations": "No automations reference this device yet.", "panel_settings": "Panel Settings", "param_sweep": "Parameter sweep", + "pg_settings_source": "Settings source", "phase_catalog": "Phase Catalog", "playground": "Playground", "process_history": "Process History", @@ -370,6 +434,7 @@ "default_access_level": "Default level for users not listed below", "default_other": "Default (other devices)", "default_tab": "Default tab when opening the panel", + "font_size": "Panel font size", "delta": "Δ", "description": "Description", "dest_real_history": "Real history (counts in stats)", @@ -466,6 +531,9 @@ "pg_group_matching": "Program matching", "pg_group_timing": "Timing rules", "pg_idle": "Idle", + "pg_preset": "Playground preset", + "pg_preset_name": "New preset name", + "pg_preset_none": "Select a preset…", "pg_stress_group": "Idle termination test", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Idle level (W)", @@ -768,6 +836,16 @@ "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_ctrl_intro": "Values start from this device's live integration settings. Edits stay in the Playground until you publish them.", + "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_sugg_none": "All suggestions already match the current settings", + "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_stress_terminated_detail": "Settled to ~{idle}W idle -- cycle ended {h}h {m}m later via {reason}.", "pg_stress_above_threshold_detail": "Idle draw ~{idle}W is at or above the effective stop threshold ({stop}W) -- the cycle never registered as quiet. Raise stop_threshold_w to fix.", "pg_stress_hit_cap_detail": "Cycle ran {h}h {m}m without stopping -- force-stopped by the safety cap. Idle draw {idle}W vs stop threshold {stop}W.", @@ -800,6 +878,7 @@ "preferences_admin": "Preferences, panel & access control", "preferences_adv": "Preferences", "prefs_personal": "These apply to your Home Assistant account only.", + "font_size_hint": "Make everything in this panel larger or smaller. Applies to your account on this device.", "process_history_hint": "Re-run matching on all stored cycles, refresh tuning suggestions, retrain the ML models (if enabled), and recompute cycle health. Run this after a batch of reviews.", "profile_deleted": "Profile deleted", "profile_poor_health_detail": "Cycles assigned to this profile have inconsistent shapes or low confidence. Consider rebuilding the envelope or reviewing labelled cycles.", @@ -845,6 +924,10 @@ "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.", "sug_staged": "Set {key} = {val}. Save to apply.", + "sug_muted": "Won't suggest this setting again", + "sug_mute_failed": "Could not mute suggestion", + "sug_unmuted_all": "Muted suggestions reset", + "n_suggestions_muted": "{count} muted; the auto-tuner will not propose these.", "tail_trim_hint": "Remove this many seconds from the end", "toast_auto_detect_enabled": "Auto-detect enabled", "toast_auto_label_complete": "Auto-label complete", @@ -872,6 +955,7 @@ "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.", "unsure_detected_prefix": "WashData is unsure it detected", @@ -903,6 +987,7 @@ "duration_scale": "Stage 4: log-ratio where duration agreement halves; smaller = stricter penalty (default 0.175)", "energy_scale": "Stage 4: log-ratio where energy agreement halves; smaller = stricter penalty (default 0.25)", "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", "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", @@ -970,6 +1055,10 @@ "intro": "How a cycle is detected as starting, running and finishing.", "label": "Detection" }, + "dishwasher": { + "intro": "End-of-cycle handling for dishwashers, which typically finish with a long near-silent drying phase before a short final drain.", + "label": "Dishwasher" + }, "matching": { "intro": "How finished cycles are matched to learned profiles and labelled.", "label": "Matching" @@ -1040,6 +1129,10 @@ "doc": "Appliance class. Sets sensible detection defaults (thresholds, off-delay, end handling) tuned for that appliance type; change it only if the device was originally set up as the wrong type.", "label": "Device Type" }, + "dishwasher_end_spike_quiet_release": { + "doc": "Once the cycle passes its expected duration, how long the dishwasher must stay quiet (below the Stop Threshold) before WashData stops waiting for a final drain and ends the cycle. Raise it if your machine has a long silent drying phase before a late final drain that is being missed - a wider window lets the learned duration follow seasonal drift (colder inlet water = longer cycles) instead of locking to the old average. It only ever shortens the wait relative to the internal 30-minute end-spike cap, never extends it.", + "label": "Passive-Dry Quiet Release" + }, "door_sensor_entity": { "doc": "Optional door binary sensor. Used to detect when the appliance has been opened/unloaded after a cycle.", "label": "Door Sensor Entity" @@ -1228,6 +1321,10 @@ "doc": "Minutes after a cycle ends before sending the still-waiting \"unload the machine\" reminder. Set 0 to disable the reminder.", "label": "Unload Nag Delay" }, + "notify_unload_repeat": { + "doc": "Keep re-sending the unload reminder every \"Unload Nag Delay\" minutes until you open the door or tap \"Stop reminding\" on the notification. Requires a Door Sensor Entity (the reminder itself does). The dismiss button works on Home Assistant companion-app (mobile) notifications.", + "label": "Repeat Until Door Opens" + }, "off_delay": { "doc": "Time to wait after power drops before declaring the cycle finished. If power resumes within this window the cycle continues seamlessly - this bridges pauses between wash stages. Dishwashers have long drying phases (power off for 20-60 min) so the off-delay must exceed that to keep the whole wash+dry as one cycle.", "label": "Off Delay" @@ -1386,6 +1483,26 @@ "anti_wrinkle_idle_timeout": { "label": "Max Pulse Gap", "doc": "How long the machine may stay quiet between two tumble pulses before anti-wrinkle mode ends. Set it above the longest gap your dryer leaves between pulses, otherwise every later pulse is read as a false start." + }, + "power_profile_interval_min": { + "label": "Power Profile Interval", + "doc": "Bucket size for the per-profile power_profile sensor attribute (the flat per-slot average-watts array consumed by external planners such as EMHASS and tibber_prices). Smaller buckets keep short power spikes sharp; larger buckets smooth the shape. Default 15 min. Read-time only; does not affect detection." + }, + "notify_live_sticky": { + "label": "Keep Live Notification On Tap", + "doc": "Android only. Make the live-progress notification persistent (sticky) so tapping it does not dismiss the ongoing thread. Off keeps the default behaviour where a tap dismisses it." + }, + "notify_live_click_action": { + "label": "Live Notification Tap Target", + "doc": "Android only. Where a tap on the live-progress notification opens (e.g. /lovelace/laundry, or a full URL) instead of the app landing page. Leave blank for the default." + }, + "door_opens_at_end": { + "label": "Door Opens Automatically At End", + "doc": "For dishwashers that pop the door open at the end of the cycle to dry (AirDry and similar). With this on, a door-open on a running cycle no longer pauses it forever; instead, if the door stays open for the dwell below, WashData treats the cycle as finished. A brief open (adding an item) is ignored. Requires a Door Sensor Entity." + }, + "door_end_dwell_seconds": { + "label": "Door-Open End Dwell", + "doc": "How long the door must stay open before WashData ends the cycle, when \"Door Opens Automatically At End\" is on. Long enough to ignore quickly adding a dish (default 60 s), short enough to end promptly once the machine pops the door." } }, "setting_group": { @@ -1554,7 +1671,7 @@ } }, "reason": { - "watchdog": "Kept as low as safe (3x the p95 update gap of {p95}s, min 30s) so stalls are caught quickly without false stops.", + "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).", @@ -1575,6 +1692,7 @@ "profile_match_threshold": "p10 confidence of {cycles} correct auto-labels ({p10}); safe live-commit floor.", "end_repeat_count": "{false}/{total} clean cycles ({pct}%) had a >60s internal pause that resumed; require {val} end confirmation(s).", "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).", "min_active": "Based on minimum active power ({min}W) observed in last cycle.", "end_energy_default": "Default recommended baseline for end-of-cycle noise gate.", "dead_zone_from_dip": "Based on early power dip detected at {s}s.", @@ -1678,6 +1796,10 @@ "no_split_found": "No idle gaps found to split on", "panel_settings_saved": "Panel settings saved", "pause_no_cycle": "No active cycle to pause", + "pg_preset_loaded": "Preset \"{name}\" loaded", + "pg_preset_saved": "Preset \"{name}\" saved", + "pg_sugg_loaded": "Staged {n} suggested value(s) - run the Playground to compare", + "pg_sugg_ml_loaded": "Staged {n} ML-calibrated value(s) - run the Playground to compare", "pg_run_gone": "That run is no longer available.", "phase_name_required": "Phase name is required", "phase_updated": "Phase updated", diff --git a/custom_components/ha_washdata/translations/panel/es.json b/custom_components/ha_washdata/translations/panel/es.json index 3bdf7a9e..ba9c7f8f 100644 --- a/custom_components/ha_washdata/translations/panel/es.json +++ b/custom_components/ha_washdata/translations/panel/es.json @@ -92,6 +92,19 @@ "pause_cycle_tip": "Pausar el ciclo en curso – el electrodoméstico reanudará donde lo dejó", "pg_apply_device": "Aplicar al dispositivo", "pg_autofill": "Autocompletar", + "pg_load_calibrated": "Cargar Calibrado (ML) ({n})", + "pg_load_calibrated_tip": "Cargar los ajustes calibrados por ML como anulaciones en la Zona de pruebas", + "pg_load_live": "Cargar los ajustes activos", + "pg_load_live_tip": "Volver a leer los ajustes actuales de la integración y descartar todas las ediciones de la Zona de pruebas", + "pg_load_suggested": "Cargar sugerencias ({n})", + "pg_load_suggested_tip": "Cargar las sugerencias actuales del ajustador automático como anulaciones en la Zona de pruebas", + "pg_preset_delete": "Eliminar preajuste", + "pg_preset_load": "Cargar preajuste", + "pg_preset_load_tip": "Sustituir los valores de la Zona de pruebas por este preajuste (los ajustes activos no se modifican)", + "pg_preset_save": "Guardar como preajuste", + "pg_preset_save_tip": "Guardar todos los valores de abajo como un preajuste con nombre para este dispositivo", + "pg_publish_all": "Guardar {n} ajuste(s) en la integración", + "pg_publish_one": "Guardar {label} en la integración", "play": "Reproducir", "process": "Proceso", "process_history": "Procesar ahora", @@ -178,7 +191,9 @@ "download_export": "Descargar exportación", "analyze_import": "Analizar archivo", "import_selected": "Importar lo seleccionado", - "back": "Atrás" + "back": "Atrás", + "mute_suggestion": "Dejar de sugerir este ajuste", + "reset_muted": "Restablecer silenciados" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +290,7 @@ "no_automations": "Ninguna automatización hace referencia a este dispositivo todavía.", "panel_settings": "Configuración del panel", "param_sweep": "Barrido de parámetros", + "pg_settings_source": "Origen de los ajustes", "phase_catalog": "Catálogo de fases", "playground": "Zona de pruebas", "process_history": "Historia del proceso", @@ -415,6 +431,9 @@ "pg_match_score": "Puntuación de coincidencia", "pg_pct_of": "{p}% de {total}", "pg_poor_match": "Coincidencia deficiente", + "pg_preset": "Preajuste de la Zona de pruebas", + "pg_preset_name": "Nombre del nuevo preajuste", + "pg_preset_none": "Seleccione un preajuste…", "pg_strong_match": "Coincidencia fuerte", "pg_tile_ambiguous": "Ambiguo", "pg_tile_ambiguous_tip": "Ciclos con un empate ajustado entre dos programas", @@ -609,7 +628,8 @@ "conflict_resolution": "Conflictos de nombres", "conflict_import_copy": "Importar como copia", "conflict_keep_mine": "Conservar el mío", - "conflict_overwrite": "Sobrescribir" + "conflict_overwrite": "Sobrescribir", + "font_size": "Tamaño de fuente del panel" }, "log": { "all_levels": "Todos los niveles", @@ -771,7 +791,17 @@ "pg_apply_confirm": "¿Aplicar el mejor valor: {label} = {value}?", "pg_canvas_empty": "Seleccione un ciclo arriba y luego pulse Cargar para ver su curva de potencia.", "pg_chart_caption": "Tasa de detección/coincidencia según los valores de {param}", + "pg_ctrl_intro": "Los valores parten de los ajustes activos de este dispositivo en la integración. Las ediciones permanecen en la Zona de pruebas hasta que las guarde en la integración.", + "pg_live_unavailable": "Ajustes activos no disponibles, se muestran los valores predeterminados.", + "pg_load_live_confirm": "¿Descartar {n} edición(es) de la Zona de pruebas y volver a cargar los ajustes actuales de la integración?", "pg_match_rate": "{pct}% de tasa de coincidencia en {total} ciclos", + "pg_matches_live": "Coincide con los ajustes activos", + "pg_n_changed": "{n} valor(es) distinto(s) de los ajustes activos", + "pg_sugg_none": "Todas las sugerencias ya coinciden con los ajustes actuales", + "pg_preset_delete_confirm": "¿Eliminar el preajuste \"{name}\"?", + "pg_preset_limit": "Límite de preajustes alcanzado ({n})", + "pg_preset_overwrite": "¿Sobrescribir el preajuste \"{name}\"?", + "pg_publish_one_confirm": "¿Guardar {label} = {value} en los ajustes de este dispositivo?", "pg_restart_note": "Reinicie Home Assistant para habilitar las herramientas de simulación.", "pg_sim_progress": "{done} / {total} ciclos", "pg_starting": "Iniciando…", @@ -845,6 +875,7 @@ "trend_duration_shorter": "Tendencia de duración más corta ({pct} %/ciclo): promedio reciente {avg}", "trend_energy_down": "Energía con tendencia a la baja ({pct}%/ciclo)", "trend_energy_up": "Tendencia de energía al alza ({pct}%/ciclo): promedio reciente {avg}", + "trim_destructive_confirm": "Esto conserva solo el {pct}% del ciclo y no se puede deshacer. ¿Continuar?", "trim_intro": "Arrastre los controles rojos o ingrese valores. Se elimina todo lo que está fuera de la ventana.", "tuning_suggestions_available": "{count} sugerencia de ajuste disponible de los ciclos observados. Aparecen al lado de los campos relevantes.", "unsure_detected_prefix": "WashData no está seguro de haber detectado", @@ -922,9 +953,15 @@ "merge_hint": "Los elementos importados se añaden; no se pierde nada local. Los conflictos de nombres se resuelven abajo.", "replace_warn": "Cada categoría marcada se borra y se reemplaza con el contenido del archivo. Las categorías sin marcar quedan intactas.", "dest_reference_hint": "Los ciclos importados solo mejoran el reconocimiento de programas y nunca afectan a las estadísticas de uso/energía.", - "dest_real_history_hint": "Los ciclos importados cuentan como el historial propio de este dispositivo y alimentan las estadísticas de energía/uso. Úsalo para mover un electrodoméstico a una instalación nueva." + "dest_real_history_hint": "Los ciclos importados cuentan como el historial propio de este dispositivo y alimentan las estadísticas de energía/uso. Úsalo para mover un electrodoméstico a una instalación nueva.", + "sug_muted": "Este ajuste no volverá a sugerirse", + "sug_mute_failed": "No se pudo silenciar la sugerencia", + "sug_unmuted_all": "Sugerencias silenciadas restablecidas", + "n_suggestions_muted": "{count} silenciadas; el ajustador automático no propondrá estas.", + "font_size_hint": "Aumenta o reduce el tamaño de todo en este panel. Se aplica a tu cuenta en este dispositivo." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Lavavajillas: segundos de silencio tras la duración esperada antes de liberar la espera del vaciado de fin de ciclo", "anti_wrinkle_enabled": "Absorber los pulsos de volteo tras la fase principal en lugar de leerlos como nuevos ciclos", "anti_wrinkle_exit_power": "La potencia debe caer por debajo de este valor entre pulsos para que el modo antiarrugas siga activo", "anti_wrinkle_idle_timeout": "Tiempo de silencio permitido entre dos pulsos de volteo antes de que finalice el modo antiarrugas", @@ -998,6 +1035,10 @@ "unusable": "Inutilizable" }, "section": { + "dishwasher": { + "label": "Lavavajillas", + "intro": "Gestión del final del ciclo para lavavajillas, que suelen terminar con una larga fase de secado casi silenciosa antes de un breve vaciado final." + }, "anti_wrinkle": { "intro": "El modo antiarrugas/antipliegues detecta pulsos de volteo de baja potencia después de la fase principal y los mantiene unidos al ciclo terminado.", "label": "Antiarrugas" @@ -1040,6 +1081,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Liberación en silencio del secado pasivo", + "doc": "Una vez que el ciclo supera su duración esperada, cuánto tiempo debe permanecer en silencio el lavavajillas (por debajo del Umbral de parada) antes de que WashData deje de esperar un vaciado final y finalice el ciclo. Auméntelo si su máquina tiene una larga fase de secado silenciosa antes de un vaciado final tardío que no se detecta - una ventana más amplia permite que la duración aprendida siga la deriva estacional (agua de entrada más fría = ciclos más largos) en lugar de fijarse en la media anterior. Solo acorta la espera respecto al tope interno de 30 minutos para el pico de fin, nunca la prolonga." + }, "anti_wrinkle_enabled": { "doc": "Reconozca los impulsos cortos de baja potencia que emite una secadora después de la fase de calentamiento principal y manténgalos adjuntos al ciclo finalizado en lugar de leerlos como ciclos nuevos.", "label": "Habilitar detección antiarrugas" @@ -1260,6 +1305,10 @@ "doc": "Minutos después de que finaliza un ciclo antes de enviar el recordatorio de \"descargar la máquina\" que aún está en espera. Establezca 0 para desactivar el recordatorio.", "label": "Retardo del recordatorio de descarga" }, + "notify_unload_repeat": { + "doc": "Sigue reenviando el recordatorio de descarga cada \"Retardo del recordatorio de descarga\" minutos hasta que abras la puerta o toques \"Dejar de recordar\" en la notificación. Requiere una Entidad de sensor de puerta (el propio recordatorio la necesita). El botón de descarte funciona en las notificaciones de la aplicación complementaria (móvil) de Home Assistant.", + "label": "Repetir hasta que se abra la puerta" + }, "off_delay": { "doc": "Es tiempo de esperar después de que se corte la energía antes de declarar finalizado el ciclo. Si la energía se reanuda dentro de esta ventana, el ciclo continúa sin problemas; esto salva las pausas entre las etapas de lavado. Los lavavajillas tienen fases de secado largas (apagado durante 20 a 60 minutos), por lo que el retraso de apagado debe exceder eso para mantener todo el lavado y secado como un solo ciclo.", "label": "Retardo de apagado" @@ -1434,6 +1483,26 @@ "energy_scale": { "label": "Nitidez de energía", "doc": "Precisión de la penalización por concordancia de energía. Menor = más estricto: una discordancia de energía penaliza más. El predeterminado 0,25 es intencionalmente más indulgente que la Precisión de duración, porque la energía varía con la carga. Combinar con Peso de energía." + }, + "power_profile_interval_min": { + "label": "Intervalo del perfil de potencia", + "doc": "Tamaño del intervalo para el atributo del sensor power_profile por perfil (la matriz plana de vatios medios por franja, consumida por planificadores externos como EMHASS y tibber_prices). Intervalos más pequeños mantienen nítidos los picos de potencia breves; intervalos más grandes suavizan la forma. Predeterminado 15 min. Solo de lectura; no afecta a la detección." + }, + "notify_live_sticky": { + "label": "Mantener la notificación activa al pulsar", + "doc": "Solo Android. Hace que la notificación de progreso en vivo sea persistente (fija), de modo que pulsarla no la cierre. Desactivado mantiene el comportamiento predeterminado en el que un toque la cierra." + }, + "notify_live_click_action": { + "label": "Destino al pulsar la notificación en vivo", + "doc": "Solo Android. Destino que se abre al pulsar la notificación de progreso en vivo (por ejemplo, /lovelace/lavandería, o una URL completa), en lugar de la página de inicio de la aplicación. Dejar en blanco para el valor predeterminado." + }, + "door_opens_at_end": { + "label": "La puerta se abre automáticamente al final", + "doc": "Para lavavajillas que abren la puerta al final del ciclo para secar (AirDry y similares). Con esta opción activada, abrir la puerta durante un ciclo en marcha ya no lo pausa indefinidamente; en cambio, si la puerta permanece abierta el tiempo mínimo indicado abajo, WashData considera el ciclo finalizado. Una apertura breve (para añadir un elemento) se ignora. Requiere una entidad de sensor de puerta." + }, + "door_end_dwell_seconds": { + "label": "Tiempo mínimo de puerta abierta para finalizar", + "doc": "Cuánto tiempo debe permanecer abierta la puerta antes de que WashData finalice el ciclo, cuando «La puerta se abre automáticamente al final» está activada. Lo suficientemente largo como para ignorar añadir un elemento rápidamente (predeterminado 60 s), y lo suficientemente corto como para terminar pronto una vez que la máquina abra la puerta." } }, "setting_group": { @@ -1604,6 +1673,10 @@ "name_required": "Nombre requerido", "no_split_found": "No se encontraron espacios inactivos para dividir", "panel_settings_saved": "Configuración del panel guardada", + "pg_preset_loaded": "Preajuste \"{name}\" cargado", + "pg_preset_saved": "Preajuste \"{name}\" guardado", + "pg_sugg_loaded": "{n} valor(es) sugerido(s) cargado(s) - ejecute la Zona de pruebas para comparar", + "pg_sugg_ml_loaded": "{n} valor(es) calibrado(s) por ML cargado(s) - ejecute la Zona de pruebas para comparar", "phase_name_required": "Se requiere el nombre de la fase", "phase_updated": "Fase actualizada", "phases_saved": "Fases guardadas", @@ -1751,6 +1824,7 @@ "min_active": "Según la potencia activa mínima ({min}W) observada en el último ciclo.", "min_duration_ratio": "Se mantiene lo más bajo posible para que un programa se reconozca pronto en el ciclo; los umbrales de confianza y ambigüedad evitan decisiones prematuras.", "min_off_gap": "Según {gaps} intervalos entre ciclos observados (p05={p05}s). Mínimo del dispositivo: {floor}s.", + "min_off_gap_bridge": "Dimensionado para cubrir el periodo de silencio más largo dentro de un ciclo: {span}s + 60s de margen, a partir de {spans} intervalos cubiertos en {cycles} ciclos limpios (se mantiene por debajo de su intervalo mínimo de {ceiling}s entre cargas consecutivas).", "min_power": "40% de la potencia activa más baja en el p05 ({p05}W) en {cycles} ciclos limpios, manteniendo el umbral de apagado por debajo del consumo real.{excl}", "ml_auto_label": "Confianza más baja que el modelo de calidad aún consideró limpia (p10 de {cycles} ciclos limpios = {p10}).", "ml_end_repeat": "{false}/{total} ciclos ({pct}%) tuvieron una pausa que el detector de fin puntuó >50%; se requieren {val} confirmación(es) de fin.", @@ -1767,7 +1841,7 @@ "thr_batch": "Se mantiene justo por encima de la potencia activa más baja en el p05 en {cycles} ciclos ({p05}W) para captar un arranque lo antes posible y que el umbral de parada quede por debajo de la potencia de funcionamiento más baja de la máquina.", "tol_per_profile": "p75 de la varianza de duración por perfil en {profiles} perfiles ({cycles} ciclos); los perfiles ajustados no se penalizan.", "tol_pooled": "Según la varianza de duración agrupada de {cycles} ciclos etiquetados recientes (desviación p95={dev}).", - "watchdog": "Se mantiene lo más bajo que resulta seguro (3x el intervalo de actualización p95 de {p95}s, mín. 30s) para detectar rápido los bloqueos sin paradas falsas." + "watchdog": "Se mantiene lo más bajo que resulta seguro (justo por encima del intervalo de actualización p95 de {p95}s, mín. 30s) para detectar rápido los bloqueos sin paradas falsas." }, "exclusions": { "summary": "Excluido(s) {total} ciclo(s) mal detectado(s): {parts}.", @@ -1944,5 +2018,53 @@ "hide_guidance": "Ocultar guía", "show_guidance": "Mostrar guía" } + }, + "card": { + "min": "min", + "entity_not_found": "Entidad no encontrada", + "running_long": "Con retraso", + "remaining": "restante", + "progress": "progreso", + "show_time_remaining": "Mostrar tiempo restante", + "show_percentage": "Mostrar porcentaje", + "layout": { + "tile": "Mosaico (compacto)", + "detail": "Detalle (completo)", + "glance": "Vistazo (varios dispositivos)" + }, + "btn": { + "pause": "Pausa", + "resume": "Reanudar", + "terminate": "Finalizar ciclo", + "record_start": "Iniciar grabación", + "record_stop": "Detener grabación", + "program": "Programa", + "open_panel": "Abrir WashData" + }, + "editor": { + "layout": "Diseño", + "entity": "Entidad del electrodoméstico", + "entities": "Electrodomésticos", + "title": "Título", + "icon": "Icono", + "show_state": "Mostrar estado", + "show_program": "Mostrar programa", + "show_progress_bar": "Mostrar barra de progreso", + "spin_icon": "Girar el icono mientras funciona", + "display_mode": "Línea de detalle", + "active_color": "Color activo personalizado", + "show_phase": "Mostrar fase", + "show_energy": "Mostrar energía y costo", + "show_anomaly": "Mostrar aviso de retraso", + "show_sparkline": "Mostrar gráfico de potencia en directo", + "buttons": "Botones de acción", + "program_entity": "Entidad de programa (personalizada)", + "time_entity": "Entidad de tiempo (personalizada)", + "pct_entity": "Entidad de progreso (personalizada)", + "power_entity": "Entidad de potencia (personalizada)", + "tap_action": "Acción al tocar", + "hold_action": "Acción al mantener pulsado", + "double_tap_action": "Acción al tocar dos veces" + } } } diff --git a/custom_components/ha_washdata/translations/panel/et.json b/custom_components/ha_washdata/translations/panel/et.json index 650d366f..d2d88819 100644 --- a/custom_components/ha_washdata/translations/panel/et.json +++ b/custom_components/ha_washdata/translations/panel/et.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Olemit ei leitud", + "running_long": "Töötab kaua", + "remaining": "jäänud", + "progress": "edenemine", + "show_time_remaining": "Näita järelejäänud aega", + "show_percentage": "Näita protsenti", + "layout": { + "tile": "Paan (kompaktne)", + "detail": "Detailne (rikkalik)", + "glance": "Pilguheit (mitu seadet)" + }, + "btn": { + "pause": "Peata", + "resume": "Jätka", + "terminate": "Lõpeta tsükkel", + "record_start": "Alusta salvestamist", + "record_stop": "Lõpeta salvestamine", + "program": "Programm", + "open_panel": "Ava WashData" + }, + "editor": { + "layout": "Paigutus", + "entity": "Seadme olem", + "entities": "Seadmed", + "title": "Pealkiri", + "icon": "Ikoon", + "show_state": "Näita olekut", + "show_program": "Näita programmi", + "show_progress_bar": "Näita edenemisriba", + "spin_icon": "Pööra ikooni töötamise ajal", + "display_mode": "Detailirida", + "active_color": "Aktiivse värvi alistamine", + "show_phase": "Näita faasi", + "show_energy": "Näita energiat ja maksumust", + "show_anomaly": "Näita ületusaja hoiatust", + "show_sparkline": "Näita reaalajas võimsuse graafikut", + "buttons": "Tegevusnupud", + "program_entity": "Programmi olem (alistamine)", + "time_entity": "Aja olem (alistamine)", + "pct_entity": "Edenemise olem (alistamine)", + "power_entity": "Võimsuse olem (alistamine)", + "tap_action": "Puudutuse tegevus", + "hold_action": "Hoidmise tegevus", + "double_tap_action": "Topeltpuudutuse tegevus" + } + }, "badge": { "artifact_tip": "Tuvastati {n} anomaaliat (nt uks avati tsükli keskel) – avage, et näha neid graafikul", "auto": "(tuvastatud automaatselt)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Peata käimasolev tsükkel – seade jätkab sealt, kus pooleli jäi", "pg_apply_device": "Rakenda seadmele", "pg_autofill": "Täida automaatselt", + "pg_load_calibrated": "Laadi kalibreeritud (ML) ({n})", + "pg_load_calibrated_tip": "Laeb ML-kalibreeritud seaded katseala alistustena", + "pg_load_live": "Laadi aktiivsed seaded", + "pg_load_live_tip": "Loe integratsiooni praegused seaded uuesti ja tühista kõik katseala muudatused", + "pg_load_suggested": "Laadi soovitused ({n})", + "pg_load_suggested_tip": "Laeb automaatse häälestaja praegused soovitused katseala alistustena", + "pg_preset_delete": "Kustuta eelseadistus", + "pg_preset_load": "Laadi eelseadistus", + "pg_preset_load_tip": "Asenda katseala väärtused selle eelseadistusega (aktiivseid seadeid ei muudeta)", + "pg_preset_save": "Salvesta eelseadistusena", + "pg_preset_save_tip": "Salvesta kõik allolevad väärtused selle seadme nimelise eelseadistusena", + "pg_publish_all": "Salvesta seadetesse ({n})", + "pg_publish_one": "Salvesta \"{label}\" integratsiooni seadetesse", "play": "Esita", "process": "Töötle", "process_history": "Töötle kohe", @@ -178,7 +239,9 @@ "download_export": "Laadi eksport alla", "analyze_import": "Analüüsi faili", "import_selected": "Impordi valitud", - "back": "Tagasi" + "back": "Tagasi", + "mute_suggestion": "Lõpeta selle seade soovitamine", + "reset_muted": "Lähtesta vaigistatud" }, "conflict": { "anti_wrinkle_exit": { @@ -275,8 +338,9 @@ "no_automations": "Sellele seadmele ei viita veel ükski automaatika.", "panel_settings": "Paneeli sätted", "param_sweep": "Parameetri pühkimine", + "pg_settings_source": "Seadete allikas", "phase_catalog": "Faaside kataloog", - "playground": "Mänguväljak", + "playground": "Katseala", "process_history": "Protsessi ajalugu", "settings_history": "Seadete ajalugu", "status": "Olek", @@ -415,6 +479,9 @@ "pg_match_score": "Vaste skoor", "pg_pct_of": "{p}% {total}-st", "pg_poor_match": "Halb vaste", + "pg_preset": "Katseala eelseadistus", + "pg_preset_name": "Uue eelseadistuse nimi", + "pg_preset_none": "Vali eelseadistus…", "pg_strong_match": "Tugev vaste", "pg_tile_ambiguous": "Ebaselge", "pg_tile_ambiguous_tip": "Tsüklid, kus kaks programmi on peaaegu võrdsed", @@ -609,7 +676,8 @@ "conflict_resolution": "Nimekonfliktid", "conflict_import_copy": "Impordi koopiana", "conflict_keep_mine": "Säilita minu omad", - "conflict_overwrite": "Kirjuta üle" + "conflict_overwrite": "Kirjuta üle", + "font_size": "Paneeli fondi suurus" }, "log": { "all_levels": "Kõik tasemed", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Kas rakendada parim väärtus: {label} = {value}?", "pg_canvas_empty": "Vali ülalt tsükkel ja vajuta seejärel Laadi, et näha selle võimsuskõverat.", "pg_chart_caption": "Tuvastus-/vastemäär {param} väärtuste lõikes", + "pg_ctrl_intro": "Väärtused lähtuvad selle seadme aktiivsetest integratsiooni seadetest. Muudatused jäävad katsealale, kuni salvestad need seadetesse.", + "pg_live_unavailable": "Aktiivsed seaded pole saadaval, kuvatakse vaikeväärtused.", + "pg_load_live_confirm": "Kas tühistada katseala muudatused ({n}) ja laadida integratsiooni praegused seaded uuesti?", "pg_match_rate": "{pct}% vastemäär {total} tsükli puhul", + "pg_matches_live": "Vastab aktiivsetele seadetele", + "pg_n_changed": "Erineb aktiivsetest seadetest: {n}", + "pg_sugg_none": "Kõik soovitused vastavad juba praegustele seadetele", + "pg_preset_delete_confirm": "Kas kustutada eelseadistus \"{name}\"?", + "pg_preset_limit": "Eelseadistuste piir on täis ({n})", + "pg_preset_overwrite": "Kas kirjutada eelseadistus \"{name}\" üle?", + "pg_publish_one_confirm": "Kas salvestada {label} = {value} selle seadme seadetesse?", "pg_restart_note": "Simulatsioonitööriistade lubamiseks taaskäivita Home Assistant.", "pg_sim_progress": "{done} / {total} tsüklit", "pg_starting": "Alustamine…", @@ -784,7 +862,7 @@ "pg_verdict_ok": "Vastuvõetav: mõned tsüklid jäid vahele. Proovi käivitusläve alandada.", "phase_catalog_intro": "Nimetatud tsükli segmendid (eelpesu, kuumutamine, tsentrifuugimine…). Määrake need juhtpaneelilt profiilile.", "phase_ranges_intro": "Faasivahemikud (minutid alates tsükli algusest) kattuvad keskmise kõveraga. Reaalajas eelvaate kuvamiseks muutke väärtusi.", - "playground_intro": "Turvaline katsekeskkond varasemate tsüklite uuesti esitamiseks erinevate seadetega, kahe seadistuse kõrvuti võrdlemiseks ja selle uurimiseks, kuidas tsükkel profiiliga joondub. Miski siin ei muuda su otseandmeid enne, kui sa selle sõnaselgelt rakendad.", + "playground_intro": "Turvaline katseala varasemate tsüklite uuesti esitamiseks erinevate seadetega, kahe seadistuse kõrvuti võrdlemiseks ja selle uurimiseks, kuidas tsükkel profiiliga joondub. Miski siin ei muuda su otseandmeid enne, kui sa selle sõnaselgelt rakendad.", "playground_needs_restart": "Katseala tööriistade lubamiseks taaskäivita Home Assistant.", "preferences_admin": "Eelistused, paneel ja juurdepääsu kontroll", "preferences_adv": "Eelistused", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Kestus on lühem ({pct}%/tsükkel) – hiljutine keskmine {avg}", "trend_energy_down": "Energiatrend langeb ({pct}% tsükli kohta)", "trend_energy_up": "Energiatrend tõuseb ({pct}%/tsükkel) – hiljutine keskmine {avg}", + "trim_destructive_confirm": "See säilitab tsüklist ainult {pct}% ja seda ei saa tagasi võtta. Kas jätkata?", "trim_intro": "Lohistage punaseid käepidemeid või sisestage väärtused. Kõik väljaspool akent eemaldatakse.", "tuning_suggestions_available": "Vaadeldud tsüklitest on saadaval {count} häälestamise soovitus. Need kuvatakse asjakohaste väljade kõrval.", "unsure_detected_prefix": "WashData pole kindel, et see tuvastas", @@ -922,9 +1001,15 @@ "merge_hint": "Imporditud üksused lisatakse; kohalikest andmetest ei lähe midagi kaotsi. Nimekonfliktid lahendatakse allpool.", "replace_warn": "Iga märgitud kategooria kustutatakse ja asendatakse failist. Märkimata kategooriaid ei puudutata.", "dest_reference_hint": "Imporditud tsüklid ainult parandavad programmide tuvastamist ega mõjuta kunagi kasutus- ega energiastatistikat.", - "dest_real_history_hint": "Imporditud tsüklid arvestatakse selle seadme enda ajalooks ja need toidavad energia- ja kasutusstatistikat. Kasuta ühe seadme uude paigaldusse teisaldamiseks." + "dest_real_history_hint": "Imporditud tsüklid arvestatakse selle seadme enda ajalooks ja need toidavad energia- ja kasutusstatistikat. Kasuta ühe seadme uude paigaldusse teisaldamiseks.", + "sug_muted": "Seda seadet enam ei soovitata", + "sug_mute_failed": "Soovituse vaigistamine ebaõnnestus", + "sug_unmuted_all": "Vaigistatud soovitused lähtestatud", + "n_suggestions_muted": "{count} vaigistatud; automaatne häälestaja ei paku neid enam.", + "font_size_hint": "Muuda kõik selles paneelil suuremaks või väiksemaks. Kehtib sinu kontole sellel seadmel." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Nõudepesumasin: vaiksed sekundid pärast eeldatavat kestust, enne kui tsükli lõpu tühjenduse ootamine vabastatakse", "anti_wrinkle_enabled": "Neelab pärast põhifaasi trummelimpulsid, selle asemel et lugeda neid uute tsüklitena", "anti_wrinkle_exit_power": "Kortsudevastase režiimi aktiivsena püsimiseks peab võimsus impulsside vahel sellest allapoole langema", "anti_wrinkle_idle_timeout": "Kahe trummelimpulsi vahel lubatud vaikuseaeg enne kortsudevastase režiimi lõppu", @@ -998,6 +1083,10 @@ "unusable": "Kasutuskõlbmatu" }, "section": { + "dishwasher": { + "label": "Nõudepesumasin", + "intro": "Tsükli lõpu käsitlemine nõudepesumasinate jaoks, mis tavaliselt lõpevad pika, peaaegu hääletu kuivatusfaasiga enne lühikest lõplikku tühjendust." + }, "anti_wrinkle": { "intro": "Kortsudevastane/kroomievastane režiim tuvastab madalvõimsusega trummelpulsid pärast põhifaasi ja hoiab need lõppenud tsükliga seotud.", "label": "Kortsudevastane" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Passiivkuivatuse vaikne vabastamine", + "doc": "Kui tsükkel ületab oma eeldatava kestuse, siis kui kaua peab nõudepesumasin püsima vaikne (allpool Peatumise Lävi), enne kui WashData lõpetab lõpliku tühjenduse ootamise ja lõpetab tsükli. Suurendage seda, kui teie masinal on pikk vaikne kuivatusfaas enne hilist lõplikku tühjendust, mis jääb märkamata - laiem aken laseb õpitud kestusel järgida hooajalist triivi (külmem sissevoolav vesi = pikemad tsüklid), selle asemel et lukustuda vana keskmise külge. See saab ooteaega üksnes lühendada võrreldes sisemise 30-minutilise lõpupiigi ülempiiriga, mitte kunagi seda pikendada." + }, "anti_wrinkle_enabled": { "doc": "Tuvastage lühikesed väikese võimsusega trummelimpulsid, mida kuivati ​​pärast peamist kuumutusfaasi kiirgab, ja hoidke need valmis tsükliga ühendatud, selle asemel, et lugeda neid uute tsüklitena.", "label": "Luba Kortsudevastane Tuvastamine" @@ -1260,6 +1353,10 @@ "doc": "Minutid pärast tsükli lõppu enne veel ootava \"masina mahalaadimise\" meeldetuletuse saatmist. Meeldetuletuse keelamiseks määrake 0.", "label": "Mahalaadimise Meeldetuletuse Viivitus" }, + "notify_unload_repeat": { + "doc": "Saadab mahalaadimise meeldetuletuse iga \"Mahalaadimise Meeldetuletuse Viivitus\" minuti järel uuesti, kuni avate ukse või puudutate teavituses nuppu \"Lõpeta meeldetuletused\". Nõuab ukse anduri olemit (nagu ka meeldetuletus ise). Loobumisnupp toimib Home Assistant kaaslasrakenduse (mobiili) teavitustes.", + "label": "Korda, kuni uks avaneb" + }, "off_delay": { "doc": "Aeg oodata pärast võimsuse langemist, enne kui tsükkel lõppenuks kuulutatakse. Kui toide taastub selles aknas, jätkub tsükkel sujuvalt – see sillutab pause pesuetappide vahel. Nõudepesumasinal on pikad kuivatusfaasid (väljalülitamine 20-60 min), seega peab väljalülitamise viivitus ületama seda, et hoida kogu pesu+kuiv ühe tsüklina.", "label": "Väljalülitumise Viivitus" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Energia teravus", "doc": "4. etapi energia vastavuse karistuse teravus. Väiksem = rangem: energia mittevastavus teeb rohkem kahju. Vaikimisi 0,25 on tahtlikult andelikum kui kestuse teravus, kuna energia varieerub koormuse järgi. Kasutage koos Energia kaaluga." + }, + "power_profile_interval_min": { + "label": "Võimsusprofiilivahemik", + "doc": "Ämbri suurus profiili power_profile sensori atribuudile (tasane pesa kohta keskmiste vattide massiiv, mida kasutavad välised planeerijad nagu EMHASS ja tibber_prices). Väiksemad ämbrid hoiavad lühikesi võimsushüppeid teravana; suuremad ämbrid siluvad kuju. Vaikimisi 15 min. Ainult lugemisaeg; ei mõjuta tuvastust." + }, + "notify_live_sticky": { + "label": "Hoia reaalajas teavitus puudutuse järel", + "doc": "Ainult Android. Tee reaalajas edenemise teavitus püsivaks (kleepuvaks), nii et selle puudutamine ei sulge käimasolevat lõime. Väljas hoiab vaikekäitumist, kus puudutamine teavituse sulgeb." + }, + "notify_live_click_action": { + "label": "Reaalajas teavituse puudutamise sihtkoht", + "doc": "Ainult Android. Kuhu reaalajas edenemise teavituse puudutamine avab (nt /lovelace/laundry või täielik URL) rakenduse avalehe asemel. Vaikimisi jaoks jätke tühjaks." + }, + "door_opens_at_end": { + "label": "Uks avaneb automaatselt lõpus", + "doc": "Nõudepesumasinatele, mis avavad tsükli lõpus ukse kuivatamiseks (AirDry ja sarnased). Selle sisselülitamisel ei peata ukse avamine käimasoleva tsükli ajal enam seda igaveseks; selle asemel, kui uks jääb alla sätestatud viibimisaja jooksul avatuks, loeb WashData tsükli lõppenuks. Lühike avamine (eseme lisamine) ignoreeritakse. Nõuab ukse anduri olendit." + }, + "door_end_dwell_seconds": { + "label": "Ukse avamise lõppviibimisaeg", + "doc": "Kui kaua uks peab jääma avatuks, enne kui WashData tsükli lõpetab, kui \"Uks avaneb automaatselt lõpus\" on sisse lülitatud. Piisavalt pikk, et kiire taldrikute lisamine ignoreeritaks (vaikimisi 60 s), piisavalt lühike, et lõpetada kiiresti, kui masin ukse avab." } }, "setting_group": { @@ -1604,6 +1721,10 @@ "name_required": "Nimi nõutav", "no_split_found": "Tühikäigulünki ei leitud, mille pealt poolitada", "panel_settings_saved": "Paneeli sätted salvestatud", + "pg_preset_loaded": "Eelseadistus \"{name}\" laaditud", + "pg_preset_saved": "Eelseadistus \"{name}\" salvestatud", + "pg_sugg_loaded": "{n} soovitatud väärtus laaditud - võrdlemiseks käivita katseala", + "pg_sugg_ml_loaded": "{n} ML-kalibreeritud väärtus laaditud - võrdlemiseks käivita katseala", "phase_name_required": "Etapi nimi on nõutav", "phase_updated": "Faas värskendatud", "phases_saved": "Faasid salvestatud", @@ -1751,6 +1872,7 @@ "min_active": "Põhineb viimases tsüklis täheldatud madalaimal aktiivvõimsusel ({min}W).", "min_duration_ratio": "Hoitakse võimalikult madal, et programm tuvastataks tsükli alguses varakult; usaldus- ja mitmetimõistetavuse lävid hoiavad ära enneaegsed otsused.", "min_off_gap": "Põhineb {gaps} täheldatud tsüklitevahelisel pausil (p05={p05}s). Seadme alampiir: {floor}s.", + "min_off_gap_bridge": "Mõõdetud nii, et katab tsükli pikima vaikse lõigu: {span}s + 60s puhver, {spans} sillatud vahest {cycles} puhta tsükli lõikes (jääb alla teie lühima järjestikuste käivituste vahelise pausi, mis on {ceiling}s).", "min_power": "40% madalaimast aktiivvõimsusest p05 juures ({p05}W) {cycles} puhta tsükli lõikes, hoides väljalülituse läve alla tegeliku tarbimise.{excl}", "ml_auto_label": "Madalaim usaldusväärsus, mida kvaliteedimudel hindas veel puhtaks (p10 {cycles} puhtast tsüklist = {p10}).", "ml_end_repeat": "{false}/{total} tsüklist ({pct}%) sisaldas pausi, millele lõputuvastaja andis >50%; nõuab {val} lõpukinnitust.", @@ -1767,7 +1889,7 @@ "thr_batch": "Hoitakse veidi üle madalaima aktiivvõimsuse p05 juures {cycles} tsükli lõikes ({p05}W), et käivitus tuvastataks võimalikult vara ja seiskamislävi jääks alla masina madalaima töövõimsuse.", "tol_per_profile": "p75 profiilipõhisest kestuse dispersioonist {profiles} profiili lõikes ({cycles} tsüklit); kitsaid profiile ei karistata.", "tol_pooled": "Põhineb {cycles} viimase märgistatud tsükli koondkestuse dispersioonil (p95 hälve={dev}).", - "watchdog": "Hoitakse nii madal kui ohutu (3x p95 uuendusintervall {p95}s, min 30s), et seiskumised tuvastataks kiiresti ilma valeseisakuteta." + "watchdog": "Hoitakse nii madal kui ohutu (veidi üle p95 uuendusintervalli {p95}s, min 30s), et seiskumised tuvastataks kiiresti ilma valeseisakuteta." }, "exclusions": { "summary": "Välja jäetud {total} valesti tuvastatud tsüklit: {parts}.", diff --git a/custom_components/ha_washdata/translations/panel/fi.json b/custom_components/ha_washdata/translations/panel/fi.json index 0cb4e8d3..3029539c 100644 --- a/custom_components/ha_washdata/translations/panel/fi.json +++ b/custom_components/ha_washdata/translations/panel/fi.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entiteettiä ei löytynyt", + "running_long": "Käy pitkään", + "remaining": "jäljellä", + "progress": "edistyminen", + "show_time_remaining": "Näytä jäljellä oleva aika", + "show_percentage": "Näytä prosentti", + "layout": { + "tile": "Ruutu (kompakti)", + "detail": "Yksityiskohtainen (rikas)", + "glance": "Silmäys (useita laitteita)" + }, + "btn": { + "pause": "Keskeytä", + "resume": "Jatka", + "terminate": "Lopeta jakso", + "record_start": "Aloita tallennus", + "record_stop": "Lopeta tallennus", + "program": "Ohjelma", + "open_panel": "Avaa WashData" + }, + "editor": { + "layout": "Asettelu", + "entity": "Laitteen entiteetti", + "entities": "Laitteet", + "title": "Otsikko", + "icon": "Kuvake", + "show_state": "Näytä tila", + "show_program": "Näytä ohjelma", + "show_progress_bar": "Näytä edistymispalkki", + "spin_icon": "Pyöritä kuvaketta käynnissä ollessa", + "display_mode": "Yksityiskohtarivi", + "active_color": "Aktiivisen värin ohitus", + "show_phase": "Näytä vaihe", + "show_energy": "Näytä energia ja kustannukset", + "show_anomaly": "Näytä ylityksen varoitus", + "show_sparkline": "Näytä reaaliaikainen tehokaavio", + "buttons": "Toimintopainikkeet", + "program_entity": "Ohjelmaentiteetti (ohitus)", + "time_entity": "Aikaentiteetti (ohitus)", + "pct_entity": "Edistymisentiteetti (ohitus)", + "power_entity": "Tehoentiteetti (ohitus)", + "tap_action": "Napautustoiminto", + "hold_action": "Pitotoiminto", + "double_tap_action": "Kaksoisnapautustoiminto" + } + }, "badge": { "artifact_tip": "{n} poikkeavaa havaittu (esim. oven avautuminen kesken syklin) – avaa nähdäksesi ne kaaviossa", "auto": "(tunnistettu automaattisesti)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Keskeytä käynnissä oleva sykli – laite jatkaa siitä, mihin se jäi", "pg_apply_device": "Käytä laitteeseen", "pg_autofill": "Autotäyttö", + "pg_load_calibrated": "Lataa kalibroidut (ML) ({n})", + "pg_load_calibrated_tip": "Lataa ML-kalibroidut asetukset testialueen ohituksina", + "pg_load_live": "Lataa aktiiviset asetukset", + "pg_load_live_tip": "Lue integraation nykyiset asetukset uudelleen ja hylkää kaikki testialueen muokkaukset", + "pg_load_suggested": "Lataa ehdotetut ({n})", + "pg_load_suggested_tip": "Lataa autovirittimen nykyiset ehdotukset testialueen ohituksina", + "pg_preset_delete": "Poista esiasetus", + "pg_preset_load": "Lataa esiasetus", + "pg_preset_load_tip": "Korvaa testialueen arvot tällä esiasetuksella (aktiivisiin asetuksiin ei kosketa)", + "pg_preset_save": "Tallenna esiasetuksena", + "pg_preset_save_tip": "Tallenna kaikki alla olevat arvot nimettynä esiasetuksena tälle laitteelle", + "pg_publish_all": "Tallenna asetuksiin ({n})", + "pg_publish_one": "Tallenna \"{label}\" integraation asetuksiin", "play": "Toista", "process": "Käsittele", "process_history": "Käsittele nyt", @@ -178,7 +239,9 @@ "download_export": "Lataa vienti", "analyze_import": "Analysoi tiedosto", "import_selected": "Tuo valitut", - "back": "Takaisin" + "back": "Takaisin", + "mute_suggestion": "Lopeta tämän asetuksen ehdottaminen", + "reset_muted": "Palauta vaiennetut" }, "conflict": { "anti_wrinkle_exit": { @@ -275,8 +338,9 @@ "no_automations": "Mikään automaatio ei viittaa tähän laitteeseen vielä.", "panel_settings": "Paneelin asetukset", "param_sweep": "Parametripyyhkäisy", + "pg_settings_source": "Asetusten lähde", "phase_catalog": "Vaiheen katalogi", - "playground": "Leikkikenttä", + "playground": "Testialue", "process_history": "Prosessihistoria", "settings_history": "Asetusten historia", "status": "Tila", @@ -415,6 +479,9 @@ "pg_match_score": "Osumapisteet", "pg_pct_of": "{p} % / {total}", "pg_poor_match": "Huono osuma", + "pg_preset": "Testialueen esiasetus", + "pg_preset_name": "Uuden esiasetuksen nimi", + "pg_preset_none": "Valitse esiasetus…", "pg_strong_match": "Vahva osuma", "pg_tile_ambiguous": "Epäselvä", "pg_tile_ambiguous_tip": "Syklit, joissa kaksi ohjelmaa ovat lähes tasoissa", @@ -609,7 +676,8 @@ "conflict_resolution": "Nimien törmäykset", "conflict_import_copy": "Tuo kopiona", "conflict_keep_mine": "Säilytä omat", - "conflict_overwrite": "Korvaa" + "conflict_overwrite": "Korvaa", + "font_size": "Paneelin fonttikoko" }, "log": { "all_levels": "Kaikki tasot", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Otetaanko paras arvo käyttöön: {label} = {value}?", "pg_canvas_empty": "Valitse sykli yltä ja paina sitten Lataa nähdäksesi sen tehokäyrän.", "pg_chart_caption": "Tunnistus-/osumaprosentti {param}-arvojen mukaan", + "pg_ctrl_intro": "Arvot pohjautuvat tämän laitteen aktiivisiin integraation asetuksiin. Muokkaukset jäävät testialueelle, kunnes tallennat ne asetuksiin.", + "pg_live_unavailable": "Aktiiviset asetukset eivät ole käytettävissä, näytetään oletusarvot.", + "pg_load_live_confirm": "Hylätäänkö testialueen muokkaukset ({n}) ja ladataanko integraation nykyiset asetukset uudelleen?", "pg_match_rate": "{pct}% osumaprosentti {total} syklillä", + "pg_matches_live": "Vastaa aktiivisia asetuksia", + "pg_n_changed": "Poikkeaa aktiivisista asetuksista: {n}", + "pg_sugg_none": "Kaikki ehdotukset vastaavat jo nykyisiä asetuksia", + "pg_preset_delete_confirm": "Poistetaanko esiasetus \"{name}\"?", + "pg_preset_limit": "Esiasetusten enimmäismäärä täynnä ({n})", + "pg_preset_overwrite": "Korvataanko esiasetus \"{name}\"?", + "pg_publish_one_confirm": "Tallennetaanko {label} = {value} tämän laitteen asetuksiin?", "pg_restart_note": "Käynnistä Home Assistant uudelleen ottaaksesi simulointityökalut käyttöön.", "pg_sim_progress": "{done} / {total} sykliä", "pg_starting": "Aloitetaan…", @@ -784,8 +862,8 @@ "pg_verdict_ok": "Hyväksyttävä: osa sykleistä jäi huomaamatta. Kokeile laskea aloituskynnystä.", "phase_catalog_intro": "Jakson nimetyt osat (esipesu, lämmitys, linkous…). Määritä ne profiiliin sen ohjauspaneelista.", "phase_ranges_intro": "Vaihealueet (minuutit syklin alusta) peittyvät keskiarvokäyrällä. Muokkaa arvoja esikatsellaksesi livenä.", - "playground_intro": "Turvallinen hiekkalaatikko aiempien syklien toistamiseen eri asetuksilla, kahden kokoonpanon vertailuun rinnakkain ja sen tarkasteluun, miten sykli kohdistuu profiiliin. Mikään tässä ei muuta live-tietojasi ennen kuin otat sen nimenomaisesti käyttöön.", - "playground_needs_restart": "Käynnistä Home Assistant uudelleen ottaaksesi Hiekkalaatikko-työkalut käyttöön.", + "playground_intro": "Turvallinen testialue aiempien syklien toistamiseen eri asetuksilla, kahden kokoonpanon vertailuun rinnakkain ja sen tarkasteluun, miten sykli kohdistuu profiiliin. Mikään tässä ei muuta live-tietojasi ennen kuin otat sen nimenomaisesti käyttöön.", + "playground_needs_restart": "Käynnistä Home Assistant uudelleen ottaaksesi Testialueen työkalut käyttöön.", "preferences_admin": "Asetukset, paneeli ja kulunvalvonta", "preferences_adv": "Asetukset", "prefs_personal": "Nämä koskevat vain Home Assistant -tiliäsi.", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Kesto trendi lyhyempi ({pct}%/sykli) – viimeaikainen keskim. {avg}", "trend_energy_down": "Energia laskee ({pct} %/sykli)", "trend_energy_up": "Energiatrendi nousussa ({pct} %/sykli) – viimeaikainen keskiarvo {avg}", + "trim_destructive_confirm": "Tämä säilyttää vain {pct}% syklistä. Tätä ei voi kumota. Jatketaanko?", "trim_intro": "Vedä punaisia ​​kahvoja tai syötä arvot. Kaikki ikkunan ulkopuolella poistetaan.", "tuning_suggestions_available": "{count} viritysehdotus saatavilla havaituista sykleistä. Ne näkyvät asianmukaisten kenttien vieressä.", "unsure_detected_prefix": "WashData ei ole varma, onko se havaittu", @@ -922,9 +1001,15 @@ "merge_hint": "Tuodut kohteet lisätään; mitään paikallista ei menetetä. Nimien törmäykset ratkaistaan alla.", "replace_warn": "Jokainen rastitettu luokka tyhjennetään ja korvataan tiedostosta. Rastittamattomia luokkia ei kosketa.", "dest_reference_hint": "Tuodut jaksot vain parantavat ohjelmien tunnistusta eivätkä koskaan vaikuta käyttö- tai energiatilastoihin.", - "dest_real_history_hint": "Tuodut jaksot lasketaan tämän laitteen omaksi historiaksi ja syöttävät energia- ja käyttötilastoja. Käytä tätä, kun siirrät yhden laitteen uuteen asennukseen." + "dest_real_history_hint": "Tuodut jaksot lasketaan tämän laitteen omaksi historiaksi ja syöttävät energia- ja käyttötilastoja. Käytä tätä, kun siirrät yhden laitteen uuteen asennukseen.", + "sug_muted": "Tätä asetusta ei enää ehdoteta", + "sug_mute_failed": "Ehdotuksen vaimennus epäonnistui", + "sug_unmuted_all": "Vaiennetut ehdotukset palautettu", + "n_suggestions_muted": "{count} vaimennettu; automaattinen virittäjä ei ehdota näitä.", + "font_size_hint": "Suurenna tai pienennä kaikkea tässä paneelissa. Koskee tiliäsi tällä laitteella." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Astianpesukone: hiljaiset sekunnit odotetun keston jälkeen ennen kuin syklin lopun vedenpoiston odotus vapautetaan", "anti_wrinkle_enabled": "Sulauta päävaiheen jälkeiset rumpupulssit sen sijaan, että lukisit ne uusina sykleinä", "anti_wrinkle_exit_power": "Tehon on laskettava tämän alle pulssien välillä, jotta ryppyjenesto pysyy aktiivisena", "anti_wrinkle_idle_timeout": "Kahden rumpupulssin välillä sallittu hiljainen aika ennen kuin ryppyjenesto päättyy", @@ -998,6 +1083,10 @@ "unusable": "Käyttämätön" }, "section": { + "dishwasher": { + "label": "Astianpesukone", + "intro": "Syklin lopun käsittely astianpesukoneille, jotka tyypillisesti päättyvät pitkään, lähes hiljaiseen kuivausvaiheeseen ennen lyhyttä lopullista vedenpoistoa." + }, "anti_wrinkle": { "intro": "Ryppyjenestotila tunnistaa lyhyet pienet pyörimisjaksot päävaiheen jälkeen ja pitää ne kiinnitettynä valmiiseen sykliin.", "label": "Ryppyjenesto" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Passiivikuivauksen hiljainen vapautus", + "doc": "Kun sykli ylittää odotetun kestonsa, kuinka kauan astianpesukoneen on pysyttävä hiljaisena (Pysäytyskynnys-arvon alapuolella) ennen kuin WashData lopettaa lopullisen vedenpoiston odottamisen ja päättää syklin. Nosta arvoa, jos koneessasi on pitkä hiljainen kuivausvaihe ennen myöhäistä lopullista vedenpoistoa, joka jää huomaamatta - laajempi ikkuna antaa opitun keston seurata kausivaihtelua (kylmempi tulovesi = pidemmät syklit) sen sijaan, että se lukittuisi vanhaan keskiarvoon. Se voi vain lyhentää odotusta suhteessa sisäiseen 30 minuutin loppupiikkirajaan, ei koskaan pidentää sitä." + }, "anti_wrinkle_enabled": { "doc": "Tunnista lyhyet vähätehoiset rumpupulssit, joita kuivausrumpu lähettää päälämpövaiheen jälkeen, ja pidä ne kiinni valmiissa jaksossa sen sijaan, että luet ne uusina jaksoina.", "label": "Ota ryppyjenesto käyttöön" @@ -1260,6 +1353,10 @@ "doc": "Minuutit syklin päättymisen jälkeen ennen edelleen odottavan koneen purkamisen muistutuksen lähettämistä. Aseta 0 poistaaksesi muistutuksen käytöstä.", "label": "Purkamismuistutuksen viive" }, + "notify_unload_repeat": { + "doc": "Lähettää purkamismuistutuksen uudelleen \"Purkamismuistutuksen viive\" minuutin välein, kunnes avaat oven tai napautat ilmoituksen \"Lopeta muistuttaminen\" -painiketta. Vaatii ovianturin entiteetin (kuten itse muistutuskin). Hylkäyspainike toimii Home Assistant -kumppanisovelluksen (mobiili) ilmoituksissa.", + "label": "Toista kunnes ovi avautuu" + }, "off_delay": { "doc": "Aika odottaa tehon putoamisen jälkeen ennen kuin sykli julistetaan päättyneeksi. Jos virta palaa tämän ikkunan sisällä, jakso jatkuu saumattomasti - tämä siltaa taukoja pesuvaiheiden välillä. Astianpesukoneissa on pitkät kuivausvaiheet (virta pois päältä 20-60 min), joten sammutusviiveen on oltava tätä suurempi, jotta koko pesu+kuivaus pysyy yhtenä jaksona.", "label": "Sammutusviive" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Energian tarkkuus", "doc": "Vaiheen 4 energian yhdenmukaisuusrangaistuksen tarkkuus. Pienempi = tiukempi: energian poikkeama haittaa enemmän. Oletus 0,25 on tarkoituksellisesti sallivampi kuin kestotarkkuus koska energia vaihtelee kuorman mukaan. Yhdistä Energiapaino-asetukseen." + }, + "power_profile_interval_min": { + "label": "Tehoprofiilin aikaväli", + "doc": "Säilön koko profiilin power_profile-sensorin attribuutille (tasainen kohtakohtainen keskivattimäärän matriisi, jota käyttävät ulkoiset suunnittelijat kuten EMHASS ja tibber_prices). Pienemmät säiliöt pitävät lyhyet tehopiikit terävinä; suuremmat säiliöt tasoittavat muodon. Oletus 15 min. Vain lukuaika; ei vaikuta tunnistukseen." + }, + "notify_live_sticky": { + "label": "Pidä reaaliaikailmoitus napauttamisen jälkeen", + "doc": "Vain Android. Tee reaaliaikaisesta edistymisilmoituksesta pysyvä (sticky), jotta sen napauttaminen ei sulje käynnissä olevaa viestiketjua. Pois päältä säilyttää oletustoiminnan, jossa napautus sulkee ilmoituksen." + }, + "notify_live_click_action": { + "label": "Reaaliaikailmoituksen napauttamiskohde", + "doc": "Vain Android. Mihin reaaliaikaisen edistymisilmoituksen napauttaminen avaa (esim. /lovelace/laundry tai koko URL) sovellusaloitussivun sijaan. Jätä tyhjäksi oletusmääränpäätä varten." + }, + "door_opens_at_end": { + "label": "Ovi avautuu automaattisesti lopussa", + "doc": "Astianpesukoneille, jotka avaavat oven syklin lopussa kuivauksen ajaksi (AirDry ja vastaavat). Tämän ollessa päällä oven avautuminen käynnissä olevan syklin aikana ei enää pysäytä sitä pysyvästi; sen sijaan, jos ovi pysyy auki alla olevan odotusajan verran, WashData pitää syklin valmiina. Lyhyt avaus (tavaran lisääminen) ohitetaan. Vaatii ovisensorientiteetin." + }, + "door_end_dwell_seconds": { + "label": "Oven avauksen loppuviive", + "doc": "Kuinka kauan oven on pysyttävä auki ennen kuin WashData päättää syklin, kun \"Ovi avautuu automaattisesti lopussa\" on käytössä. Tarpeeksi kauan ohittamaan lautasen lisäämisen (oletus 60 s), tarpeeksi lyhyt päättämään nopeasti kun kone avaa oven." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Perustuu pienimpään aktiiviseen tehoon ({min}W), joka havaittiin viime jaksossa.", "min_duration_ratio": "Pidetään mahdollisimman matalana, jotta ohjelma tunnistetaan jakson alkuvaiheessa; luottamus- ja epäselvyysrajat estävät ennenaikaiset päätökset.", "min_off_gap": "Perustuu {gaps} havaittuun jaksojen väliseen taukoon (p05={p05}s). Laitteen alaraja: {floor}s.", + "min_off_gap_bridge": "Mitoitettu siltaamaan jakson pisin hiljainen vaihe: {span}s + 60s puskuri, {spans} sillatusta katkosta {cycles} puhtaan jakson joukossa (pysyy alle {ceiling}s, joka on lyhin peräkkäisten käynnistysten välinen taukosi).", "min_power": "40% pienimmästä aktiivisesta tehosta p05:ssä ({p05}W) {cycles} puhtaan jakson joukossa, mikä pitää sammutuskynnyksen todellisen kulutuksen alapuolella.{excl}", "ml_auto_label": "Pienin luottamus, jonka laatumalli arvioi vielä puhtaaksi (p10 {cycles} puhtaasta jaksosta = {p10}).", "ml_end_repeat": "{false}/{total} jaksosta ({pct}%) sisälsi tauon, jolle loppudetektori antoi >50%; vaatii {val} loppuvahvistusta.", @@ -1636,7 +1754,7 @@ "thr_batch": "Pidetään juuri pienimmän aktiivisen tehon yläpuolella p05:ssä {cycles} jakson joukossa ({p05}W), jotta käynnistys havaitaan mahdollisimman aikaisin ja pysäytyskynnys pysyy koneen pienimmän käyntitehon alapuolella.", "tol_per_profile": "p75 profiilikohtaisesta keston varianssista {profiles} profiilin joukossa ({cycles} jaksoa); tiiviitä profiileja ei rangaista.", "tol_pooled": "Perustuu {cycles} viimeisimmän merkityn jakson yhdistettyyn keston varianssiin (p95 poikkeama={dev}).", - "watchdog": "Pidetään niin matalana kuin on turvallista (3x p95-päivitysväli {p95}s, väh. 30s), jotta pysähdykset havaitaan nopeasti ilman vääriä pysäytyksiä." + "watchdog": "Pidetään niin matalana kuin on turvallista (hieman yli p95-päivitysvälin {p95}s, väh. 30s), jotta pysähdykset havaitaan nopeasti ilman vääriä pysäytyksiä." }, "exclusions": { "summary": "Suljettu pois {total} väärin tunnistettua sykliä: {parts}.", @@ -1670,7 +1788,7 @@ "subtab_phase_catalog": "Vaiheen katalogi", "subtab_profiles": "Profiilit", "maintenance": "Huolto", - "playground": "Hiekkalaatikko", + "playground": "Testialue", "store": "Kauppa" }, "tag": { @@ -1716,6 +1834,10 @@ "name_required": "Nimi vaaditaan", "no_split_found": "Tyhjäkäyntiä ei löytynyt halkeamista varten", "panel_settings_saved": "Paneelin asetukset tallennettu", + "pg_preset_loaded": "Esiasetus \"{name}\" ladattu", + "pg_preset_saved": "Esiasetus \"{name}\" tallennettu", + "pg_sugg_loaded": "{n} ehdotettu arvo ladattu testialueelle - aja testialue vertailua varten", + "pg_sugg_ml_loaded": "{n} ML-kalibroitua arvoa ladattu testialueelle - aja testialue vertailua varten", "phase_name_required": "Vaiheen nimi vaaditaan", "phase_updated": "Vaihe päivitetty", "phases_saved": "Vaiheet tallennettu", diff --git a/custom_components/ha_washdata/translations/panel/fr.json b/custom_components/ha_washdata/translations/panel/fr.json index e2a4b7e5..781cdda7 100644 --- a/custom_components/ha_washdata/translations/panel/fr.json +++ b/custom_components/ha_washdata/translations/panel/fr.json @@ -92,6 +92,19 @@ "pause_cycle_tip": "Mettre en pause le cycle en cours – l'appareil reprendra là où il s'est arrêté", "pg_apply_device": "Appliquer à l'appareil", "pg_autofill": "Remplissage automatique", + "pg_load_calibrated": "Charger Calibré (ML) ({n})", + "pg_load_calibrated_tip": "Charger les paramètres calibrés par ML comme valeurs de remplacement dans le Bac à sable", + "pg_load_live": "Charger les réglages actifs", + "pg_load_live_tip": "Relire les réglages actuels de l'intégration et abandonner toutes les modifications faites dans le Bac à sable", + "pg_load_suggested": "Charger les suggestions ({n})", + "pg_load_suggested_tip": "Charger les suggestions actuelles du réglage automatique comme valeurs de remplacement dans le Bac à sable", + "pg_preset_delete": "Supprimer le préréglage", + "pg_preset_load": "Charger le préréglage", + "pg_preset_load_tip": "Remplacer les valeurs du Bac à sable par ce préréglage (les réglages actifs ne sont pas modifiés)", + "pg_preset_save": "Enregistrer comme préréglage", + "pg_preset_save_tip": "Enregistrer toutes les valeurs ci-dessous comme préréglage nommé pour cet appareil", + "pg_publish_all": "Enregistrer {n} réglage(s) dans l'intégration", + "pg_publish_one": "Enregistrer {label} dans l'intégration", "play": "Lire", "process": "Processus", "process_history": "Traiter maintenant", @@ -178,7 +191,9 @@ "download_export": "Télécharger l'export", "analyze_import": "Analyser le fichier", "import_selected": "Importer la sélection", - "back": "Retour" + "back": "Retour", + "mute_suggestion": "Ne plus suggérer ce paramètre", + "reset_muted": "Réinitialiser les suggestions masquées" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +290,7 @@ "no_automations": "Aucun automatisme ne fait encore référence à cet appareil.", "panel_settings": "Paramètres du panneau", "param_sweep": "Balayage de paramètre", + "pg_settings_source": "Origine des réglages", "phase_catalog": "Catalogue de phases", "playground": "Bac à sable", "process_history": "Historique du processus", @@ -415,6 +431,9 @@ "pg_match_score": "Score de correspondance", "pg_pct_of": "{p}% sur {total}", "pg_poor_match": "Correspondance médiocre", + "pg_preset": "Préréglage du Bac à sable", + "pg_preset_name": "Nom du nouveau préréglage", + "pg_preset_none": "Sélectionner un préréglage…", "pg_strong_match": "Correspondance forte", "pg_tile_ambiguous": "Ambigu", "pg_tile_ambiguous_tip": "Cycles avec une quasi-égalité entre deux programmes", @@ -609,7 +628,8 @@ "conflict_resolution": "Conflits de noms", "conflict_import_copy": "Importer comme copie", "conflict_keep_mine": "Garder le mien", - "conflict_overwrite": "Écraser" + "conflict_overwrite": "Écraser", + "font_size": "Taille de police du panneau" }, "log": { "all_levels": "Tous niveaux", @@ -771,7 +791,17 @@ "pg_apply_confirm": "Appliquer la meilleure valeur : {label} = {value} ?", "pg_canvas_empty": "Sélectionnez un cycle ci-dessus, puis appuyez sur Charger pour voir sa courbe de puissance.", "pg_chart_caption": "Taux de détection/correspondance selon les valeurs de {param}", + "pg_ctrl_intro": "Les valeurs partent des réglages actifs de cet appareil dans l'intégration. Les modifications restent dans le Bac à sable tant que vous ne les enregistrez pas dans l'intégration.", + "pg_live_unavailable": "Réglages actifs indisponibles, affichage des valeurs par défaut.", + "pg_load_live_confirm": "Abandonner {n} modification(s) du Bac à sable et recharger les réglages actuels de l'intégration ?", "pg_match_rate": "{pct}% de taux de correspondance sur {total} cycles", + "pg_matches_live": "Identique aux réglages actifs", + "pg_n_changed": "{n} valeur(s) modifiée(s) par rapport aux réglages actifs", + "pg_sugg_none": "Toutes les suggestions correspondent déjà aux réglages actuels", + "pg_preset_delete_confirm": "Supprimer le préréglage « {name} » ?", + "pg_preset_limit": "Limite de préréglages atteinte ({n})", + "pg_preset_overwrite": "Écraser le préréglage « {name} » ?", + "pg_publish_one_confirm": "Enregistrer {label} = {value} dans les réglages de cet appareil ?", "pg_restart_note": "Redémarrez Home Assistant pour activer les outils de simulation.", "pg_sim_progress": "{done} / {total} cycles", "pg_starting": "Démarrage…", @@ -845,6 +875,7 @@ "trend_duration_shorter": "Tendance de durée plus courte ({pct} %/cycle) – moyenne récente {avg}", "trend_energy_down": "Tendance à la baisse de l'énergie ({pct} %/cycle)", "trend_energy_up": "Tendance énergétique à la hausse ({pct} %/cycle) – moyenne récente {avg}", + "trim_destructive_confirm": "Cela ne conserve que {pct} % du cycle et est irréversible. Continuer ?", "trim_intro": "Faites glisser les poignées rouges ou entrez des valeurs. Tout ce qui se trouve à l'extérieur de la fenêtre est supprimé.", "tuning_suggestions_available": "{count} suggestion de réglage disponible à partir des cycles observés. Ils apparaissent à côté des champs concernés.", "unsure_detected_prefix": "WashData n'est pas sûr d'avoir été détecté", @@ -922,9 +953,15 @@ "merge_hint": "Les éléments importés sont ajoutés ; rien de local n'est perdu. Les conflits de noms sont résolus ci-dessous.", "replace_warn": "Chaque catégorie cochée est effacée et remplacée par le contenu du fichier. Les catégories non cochées restent intactes.", "dest_reference_hint": "Les cycles importés améliorent uniquement la reconnaissance des programmes et n'affectent jamais les statistiques d'utilisation/d'énergie.", - "dest_real_history_hint": "Les cycles importés comptent comme l'historique propre de cet appareil et alimentent les statistiques d'énergie/d'utilisation. À utiliser pour déplacer un appareil vers une nouvelle installation." + "dest_real_history_hint": "Les cycles importés comptent comme l'historique propre de cet appareil et alimentent les statistiques d'énergie/d'utilisation. À utiliser pour déplacer un appareil vers une nouvelle installation.", + "sug_muted": "Ce paramètre ne sera plus suggéré", + "sug_mute_failed": "Impossible de masquer la suggestion", + "sug_unmuted_all": "Les suggestions masquées ont été réinitialisées", + "n_suggestions_muted": "{count} masquée(s) ; le réglage automatique ne proposera plus ces suggestions.", + "font_size_hint": "Agrandir ou réduire tout le contenu de ce panneau. S'applique à votre compte sur cet appareil." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Lave-vaisselle : secondes de silence après la durée prévue avant de libérer l'attente de vidange de fin de cycle", "anti_wrinkle_enabled": "Absorber les impulsions de culbutage après la phase principale au lieu de les lire comme de nouveaux cycles", "anti_wrinkle_exit_power": "La puissance doit tomber sous ce seuil entre les impulsions pour que l'anti-froissement reste actif", "anti_wrinkle_idle_timeout": "Temps de silence autorisé entre deux impulsions de culbutage avant la fin de l'anti-froissement", @@ -998,6 +1035,10 @@ "unusable": "Inutilisable" }, "section": { + "dishwasher": { + "label": "Lave-vaisselle", + "intro": "Gestion de fin de cycle pour les lave-vaisselle, qui se terminent généralement par une longue phase de séchage quasi silencieuse avant une brève vidange finale." + }, "anti_wrinkle": { "intro": "Le mode anti-froissement détecte les courtes impulsions de culbutage à faible puissance après la phase principale et les maintient rattachées au cycle terminé.", "label": "Anti-froissement" @@ -1040,6 +1081,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Libération au silence du séchage passif", + "doc": "Une fois que le cycle dépasse sa durée prévue, combien de temps le lave-vaisselle doit rester silencieux (sous le Seuil d'arrêt) avant que WashData cesse d'attendre une vidange finale et termine le cycle. Augmentez cette valeur si votre machine a une longue phase de séchage silencieuse avant une vidange finale tardive qui n'est pas détectée - une fenêtre plus large permet à la durée apprise de suivre la dérive saisonnière (eau d'arrivée plus froide = cycles plus longs) au lieu de se figer sur l'ancienne moyenne. Elle ne fait que raccourcir l'attente par rapport au plafond interne de 30 minutes pour le pic de fin, jamais la prolonger." + }, "anti_wrinkle_enabled": { "doc": "Reconnaissez les courtes impulsions de culbutage de faible puissance qu'un sèche-linge émet après la phase de chauffage principale et conservez-les attachées au cycle terminé au lieu de les lire comme de nouveaux cycles.", "label": "Activer la détection anti-froissement" @@ -1260,6 +1305,10 @@ "doc": "Quelques minutes après la fin d'un cycle avant d'envoyer le rappel \"décharger la machine\" toujours en attente. Définissez 0 pour désactiver le rappel.", "label": "Délai de rappel de déchargement" }, + "notify_unload_repeat": { + "doc": "Continue de renvoyer le rappel de déchargement toutes les \"Délai de rappel de déchargement\" minutes jusqu'à ce que vous ouvriez la porte ou appuyiez sur \"Arrêter les rappels\" dans la notification. Nécessite une Entité capteur de porte (le rappel lui-même en a besoin). Le bouton de rejet fonctionne sur les notifications de l'application compagnon (mobile) de Home Assistant.", + "label": "Répéter jusqu'à l'ouverture de la porte" + }, "off_delay": { "doc": "Temps d'attente après la coupure de courant avant de déclarer le cycle terminé. Si le courant revient dans cette fenêtre, le cycle continue de manière transparente – cela comble les pauses entre les étapes de lavage. Les lave-vaisselle ont de longues phases de séchage (mise hors tension pendant 20 à 60 minutes), le délai d'arrêt doit donc être supérieur à ce délai pour que l'ensemble du lavage et du séchage se déroule en un seul cycle.", "label": "Délai d'arrêt" @@ -1435,6 +1484,26 @@ "energy_scale": { "label": "Précision énergie", "doc": "Précision de la pénalité de concordance d'énergie. Plus petit = plus strict : un écart d'énergie pénalise davantage. Le défaut 0,25 est intentionnellement plus indulgent que la Précision de durée, car l'énergie varie avec la charge. À combiner avec la Pondération d'énergie." + }, + "power_profile_interval_min": { + "label": "Intervalle du profil de puissance", + "doc": "Taille des créneaux pour l'attribut de capteur power_profile par profil (le tableau plat de watts moyens par créneau consommé par des planificateurs externes tels que EMHASS et tibber_prices). Des créneaux plus petits conservent les pics de puissance courts et nets ; des créneaux plus grands lissent la forme. Par défaut 15 min. Lecture seule ; n'affecte pas la détection." + }, + "notify_live_sticky": { + "label": "Conserver la notification en direct au toucher", + "doc": "Android uniquement. Rend la notification de progression en direct persistante (épinglée) afin que la toucher ne la ferme pas. Désactivé conserve le comportement par défaut où un toucher la ferme." + }, + "notify_live_click_action": { + "label": "Destination au toucher de la notification en direct", + "doc": "Android uniquement. Où s'ouvre un toucher sur la notification de progression en direct (par exemple /lovelace/laundry, ou une URL complète) au lieu de la page d'accueil de l'application. Laissez vide pour la valeur par défaut." + }, + "door_opens_at_end": { + "label": "La porte s'ouvre automatiquement en fin de cycle", + "doc": "Pour les lave-vaisselle qui ouvrent la porte en fin de cycle pour le séchage (AirDry et fonctions similaires). Avec cette option activée, une ouverture de porte sur un cycle en cours ne le met plus en pause indéfiniment ; si la porte reste ouverte pendant la durée d'attente ci-dessous, WashData considère le cycle comme terminé. Une ouverture brève (pour ajouter un article) est ignorée. Nécessite une entité capteur de porte." + }, + "door_end_dwell_seconds": { + "label": "Durée d'attente porte ouverte", + "doc": "Durée pendant laquelle la porte doit rester ouverte avant que WashData ne termine le cycle, lorsque « La porte s'ouvre automatiquement en fin de cycle » est activé. Assez longue pour ignorer l'ajout rapide d'un article (par défaut 60 s), assez courte pour terminer rapidement une fois que la machine ouvre la porte." } }, "setting_group": { @@ -1605,6 +1674,10 @@ "name_required": "Nom requis", "no_split_found": "Aucun espace vide trouvé sur lequel se diviser", "panel_settings_saved": "Paramètres du panneau enregistrés", + "pg_preset_loaded": "Préréglage « {name} » chargé", + "pg_preset_saved": "Préréglage « {name} » enregistré", + "pg_sugg_loaded": "{n} valeur(s) suggérée(s) chargée(s) - lancez le Bac à sable pour comparer", + "pg_sugg_ml_loaded": "{n} valeur(s) calibrée(s) ML chargée(s) - lancez le Bac à sable pour comparer", "phase_name_required": "Le nom de la phase est obligatoire", "phase_updated": "Phase mise à jour", "phases_saved": "Phases enregistrées", @@ -1752,6 +1825,7 @@ "min_active": "D'après la puissance active minimale ({min}W) observée lors du dernier cycle.", "min_duration_ratio": "Maintenu aussi bas que possible pour qu'un programme soit reconnu tôt dans le cycle ; les seuils de confiance et d'ambiguïté empêchent les décisions prématurées.", "min_off_gap": "D'après {gaps} intervalles entre cycles observés (p05={p05}s). Plancher de l'appareil : {floor}s.", + "min_off_gap_bridge": "Dimensionné pour couvrir la plus longue période calme au sein d'un cycle : {span}s + 60s de marge, à partir de {spans} intervalles couverts sur {cycles} cycles propres (reste sous votre intervalle minimal de {ceiling}s entre deux charges consécutives).", "min_power": "40% de la puissance active la plus basse au p05 ({p05}W) sur {cycles} cycles propres, pour garder le seuil d'arrêt sous la consommation réelle.{excl}", "ml_auto_label": "Confiance la plus basse encore jugée propre par le modèle de qualité (p10 de {cycles} cycles propres = {p10}).", "ml_end_repeat": "{false}/{total} cycles ({pct}%) ont eu une pause que le détecteur de fin a notée >50% ; exiger {val} confirmation(s) de fin.", @@ -1768,7 +1842,7 @@ "thr_batch": "Maintenu juste au-dessus de la puissance active la plus basse au p05 sur {cycles} cycles ({p05}W) pour qu'un démarrage soit détecté le plus tôt possible et que le seuil d'arrêt reste sous la puissance de fonctionnement la plus basse de la machine.", "tol_per_profile": "p75 de la variance de durée par profil sur {profiles} profils ({cycles} cycles) ; les profils resserrés ne sont pas pénalisés.", "tol_pooled": "D'après la variance de durée regroupée de {cycles} cycles récemment étiquetés (écart p95={dev}).", - "watchdog": "Maintenu aussi bas que possible en toute sécurité (3x l'écart de mise à jour p95 de {p95}s, min 30s) pour détecter rapidement les blocages sans faux arrêts." + "watchdog": "Maintenu aussi bas que possible en toute sécurité (juste au-dessus de l'écart de mise à jour p95 de {p95}s, min 30s) pour détecter rapidement les blocages sans faux arrêts." }, "exclusions": { "summary": "{total} cycle(s) mal détecté(s) exclu(s) : {parts}.", @@ -1945,5 +2019,53 @@ "hide_guidance": "Masquer le guide", "show_guidance": "Afficher le guide" } + }, + "card": { + "min": "min", + "entity_not_found": "Entité introuvable", + "running_long": "Dépassement", + "remaining": "restant", + "progress": "progression", + "show_time_remaining": "Afficher le temps restant", + "show_percentage": "Afficher le pourcentage", + "layout": { + "tile": "Tuile (compact)", + "detail": "Détail (complet)", + "glance": "Aperçu (plusieurs appareils)" + }, + "btn": { + "pause": "Pause", + "resume": "Reprendre", + "terminate": "Terminer le cycle", + "record_start": "Commencer l'enregistrement", + "record_stop": "Arrêter l'enregistrement", + "program": "Programme", + "open_panel": "Ouvrir WashData" + }, + "editor": { + "layout": "Disposition", + "entity": "Entité de l'appareil", + "entities": "Appareils", + "title": "Titre", + "icon": "Icône", + "show_state": "Afficher l'état", + "show_program": "Afficher le programme", + "show_progress_bar": "Afficher la barre de progression", + "spin_icon": "Faire tourner l'icône pendant le fonctionnement", + "display_mode": "Ligne de détail", + "active_color": "Couleur active personnalisée", + "show_phase": "Afficher la phase", + "show_energy": "Afficher l'énergie et le coût", + "show_anomaly": "Afficher l'avertissement de dépassement", + "show_sparkline": "Afficher le graphique de puissance en direct", + "buttons": "Boutons d'action", + "program_entity": "Entité de programme (personnalisée)", + "time_entity": "Entité de temps (personnalisée)", + "pct_entity": "Entité de progression (personnalisée)", + "power_entity": "Entité de puissance (personnalisée)", + "tap_action": "Action au toucher", + "hold_action": "Action au maintien", + "double_tap_action": "Action au double toucher" + } } } diff --git a/custom_components/ha_washdata/translations/panel/hr.json b/custom_components/ha_washdata/translations/panel/hr.json index be07fede..86e770bf 100644 --- a/custom_components/ha_washdata/translations/panel/hr.json +++ b/custom_components/ha_washdata/translations/panel/hr.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entitet nije pronađen", + "running_long": "Traje predugo", + "remaining": "preostalo", + "progress": "napredak", + "show_time_remaining": "Prikaži preostalo vrijeme", + "show_percentage": "Prikaži postotak", + "layout": { + "tile": "Pločica (kompaktno)", + "detail": "Detaljno (bogato)", + "glance": "Pregled (više uređaja)" + }, + "btn": { + "pause": "Pauziraj", + "resume": "Nastavi", + "terminate": "Završi ciklus", + "record_start": "Započni snimanje", + "record_stop": "Zaustavi snimanje", + "program": "Program", + "open_panel": "Otvori WashData" + }, + "editor": { + "layout": "Izgled", + "entity": "Entitet uređaja", + "entities": "Uređaji", + "title": "Naslov", + "icon": "Ikona", + "show_state": "Prikaži stanje", + "show_program": "Prikaži program", + "show_progress_bar": "Prikaži traku napretka", + "spin_icon": "Vrti ikonu tijekom rada", + "display_mode": "Redak s detaljima", + "active_color": "Zamjena aktivne boje", + "show_phase": "Prikaži fazu", + "show_energy": "Prikaži energiju i trošak", + "show_anomaly": "Prikaži upozorenje o produljenju", + "show_sparkline": "Prikaži grafikon snage uživo", + "buttons": "Gumbi radnji", + "program_entity": "Entitet programa (zamjena)", + "time_entity": "Entitet vremena (zamjena)", + "pct_entity": "Entitet napretka (zamjena)", + "power_entity": "Entitet snage (zamjena)", + "tap_action": "Radnja dodira", + "hold_action": "Radnja držanja", + "double_tap_action": "Radnja dvostrukog dodira" + } + }, "badge": { "artifact_tip": "Otkrivene su {n} anomalije (npr. vrata otvorena usred ciklusa) – otvorite da ih vidite na grafikonu", "auto": "(automatski otkriveno)", @@ -64,6 +112,21 @@ "discard": "Odbaci", "discard_tip": "Odbaci snimljeni trag bez pohrane", "dismiss": "Odbaci", + "mute_suggestion": "Prestani predlagati ovu postavku", + "pg_load_calibrated": "Učitaj kalibrirano (ML) ({n})", + "pg_load_calibrated_tip": "Učitaj ML-kalibrirane postavke kao zamjene u pješčaniku", + "pg_load_live": "Učitaj aktivne postavke", + "pg_load_live_tip": "Ponovno učitaj trenutne postavke integracije i odbaci sve izmjene u pješčaniku", + "pg_load_suggested": "Učitaj predloženo ({n})", + "pg_load_suggested_tip": "Učitaj aktualne prijedloge automatskog podešavanja kao zamjene u pješčaniku", + "pg_preset_delete": "Izbriši preset", + "pg_preset_load": "Učitaj preset", + "pg_preset_load_tip": "Zamijeni vrijednosti u pješčaniku ovim presetom (aktivne postavke ostaju nepromijenjene)", + "pg_preset_save": "Spremi kao preset", + "pg_preset_save_tip": "Spremi sve vrijednosti ispod kao imenovani preset za ovaj uređaj", + "pg_publish_all": "Spremi u integraciju ({n})", + "pg_publish_one": "Spremi {label} u integraciju", + "reset_muted": "Poništi utišane", "done": "Gotovo", "edit": "Uredi", "export": "Izvezi", @@ -275,6 +338,7 @@ "no_automations": "Još nijedna automatizacija ne spominje ovaj uređaj.", "panel_settings": "Postavke ploče", "param_sweep": "Pretraživanje parametra", + "pg_settings_source": "Izvor postavki", "phase_catalog": "Katalog faza", "playground": "Pješčanik", "process_history": "Povijest procesa", @@ -348,6 +412,7 @@ "default_access_level": "Zadana razina za korisnike koji nisu dolje navedeni", "default_other": "Zadano (ostali uređaji)", "default_tab": "Zadana kartica pri otvaranju ploče", + "font_size": "Veličina fonta ploče", "delta": "Δ", "description": "Opis", "dtw_blend_w": "Težina miješanja", @@ -415,6 +480,9 @@ "pg_match_score": "Rezultat podudaranja", "pg_pct_of": "{p}% od {total}", "pg_poor_match": "Loše podudaranje", + "pg_preset": "Preset pješčanika", + "pg_preset_name": "Ime novog preseta", + "pg_preset_none": "Odaberite preset…", "pg_strong_match": "Snažno podudaranje", "pg_tile_ambiguous": "Nejasno", "pg_tile_ambiguous_tip": "Ciklusi s gotovo izjednačenim rezultatom između dva programa", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Primijeniti najbolju vrijednost: {label} = {value}?", "pg_canvas_empty": "Odaberite ciklus iznad, zatim pritisnite Učitaj za prikaz njegovog tijeka snage.", "pg_chart_caption": "Stopa otkrivanja/podudaranja po vrijednostima {param}", + "pg_ctrl_intro": "Vrijednosti polaze od aktivnih postavki integracije za ovaj uređaj. Izmjene ostaju u pješčaniku dok ih ne spremite u integraciju.", + "pg_live_unavailable": "Aktivne postavke nisu dostupne, prikazane su zadane vrijednosti.", + "pg_load_live_confirm": "Odbaciti izmjene u pješčaniku ({n}) i ponovno učitati trenutne postavke integracije?", "pg_match_rate": "{pct}% stopa podudaranja na {total} ciklusa", + "pg_matches_live": "Podudara se s aktivnim postavkama", + "pg_n_changed": "Promijenjeno u odnosu na aktivne postavke: {n}", + "pg_sugg_none": "Svi prijedlozi već odgovaraju trenutnim postavkama", + "pg_preset_delete_confirm": "Izbrisati preset \"{name}\"?", + "pg_preset_limit": "Dosegnut limit preseta ({n})", + "pg_preset_overwrite": "Prepisati preset \"{name}\"?", + "pg_publish_one_confirm": "Spremiti {label} = {value} u postavke ovog uređaja?", "pg_restart_note": "Ponovno pokrenite Home Assistant kako biste omogućili alate za simulaciju.", "pg_sim_progress": "{done} / {total} ciklusa", "pg_starting": "Pokretanje…", @@ -789,6 +867,7 @@ "preferences_admin": "Postavke, panel i kontrola pristupa", "preferences_adv": "Postavke", "prefs_personal": "Ovo se odnosi samo na vaš račun Home Assistant.", + "font_size_hint": "Povećajte ili smanjite sve u ovoj ploči. Primjenjuje se na vaš račun na ovom uređaju.", "process_history_hint": "Ponovo pokrenite uparivanje na svim pohranjenim ciklusima, osvježite prijedloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i preračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.", "profile_deleted": "Profil izbrisan", "profile_poor_health_detail": "Ciklusi dodijeljeni ovom profilu imaju nedosljedne oblike ili nisku pouzdanost. Razmislite o ponovnoj izradi omotnice ili pregledu označenih ciklusa.", @@ -821,6 +900,10 @@ "split_intro": "Pritisnite grafikon da biste dodali ili uklonili točku razdvajanja ili automatsko otkrivanje praznina u mirovanju. Svaki rezultirajući segment može dobiti svoj profil.", "storage_diagnostics": "Statistika pohrane, održavanje, izvoz/uvoz", "sug_staged": "Postavljeno {key} = {val}. Spremi za primjenu.", + "sug_muted": "Ova postavka više neće biti predlagana", + "sug_mute_failed": "Nije moguće utišati prijedlog", + "sug_unmuted_all": "Utišani prijedlozi poništeni", + "n_suggestions_muted": "{count} utišano; automatski podešavač neće predlagati ove postavke.", "toast_auto_detect_enabled": "Automatsko otkrivanje omogućeno", "toast_auto_label_complete": "Automatsko označavanje dovršeno", "toast_auto_label_failed": "Automatsko označavanje neuspješno: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Trajanje je sve kraće ({pct}%/ciklus) – nedavni prosjek {avg}", "trend_energy_down": "Energija opada ({pct}%/ciklus)", "trend_energy_up": "Energija raste ({pct}%/ciklus) – nedavni prosjek {avg}", + "trim_destructive_confirm": "Ovo zadržava samo {pct}% ciklusa i ne može se poništiti. Nastaviti?", "trim_intro": "Povucite crvene ručice ili unesite vrijednosti. Sve izvan prozora je uklonjeno.", "tuning_suggestions_available": "{count} prijedlog podešavanja dostupan iz promatranih ciklusa. Pojavljuju se pored relevantnih polja.", "unsure_detected_prefix": "WashData nije siguran da je otkriven", @@ -970,6 +1054,10 @@ "unusable": "Neupotrebljiv" }, "section": { + "dishwasher": { + "label": "Perilica posuđa", + "intro": "Obrada kraja ciklusa za perilice posuđa, koje obično završavaju dugom, gotovo tihom fazom sušenja prije kratkog završnog ispumpavanja vode." + }, "anti_wrinkle": { "intro": "Način anti-bore/anti-gužve otkriva impulse prevrtanja male snage nakon glavne faze i zadržava ih priključene na završeni ciklus.", "label": "Anti-bore" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Otpuštanje nakon tihe faze sušenja", + "doc": "Kada ciklus prijeđe svoje očekivano trajanje, koliko dugo perilica mora ostati tiha (ispod Praga zaustavljanja) prije nego što WashData prestane čekati na završno ispumpavanje vode i završi ciklus. Povećajte ako vaš uređaj ima dugu tihu fazu sušenja prije kasnog završnog ispumpavanja koje se propušta - šire okno omogućuje da naučeno trajanje prati sezonske promjene (hladnija dovodna voda = dulji ciklusi) umjesto da ostane zaključano na staroj prosječnoj vrijednosti. Čekanje samo skraćuje u odnosu na interno ograničenje završnog ispumpavanja od 30 minuta, nikada ga ne produljuje." + }, "anti_wrinkle_enabled": { "doc": "Prepoznajte kratke impulse male snage koje sušilica emitira nakon glavne faze zagrijavanja i držite ih vezanima uz završeni ciklus umjesto da ih čitate kao nove cikluse.", "label": "Omogući otkrivanje anti-bora" @@ -1232,6 +1324,10 @@ "doc": "Nekoliko minuta nakon završetka ciklusa prije slanja podsjetnika za \"istovar stroja\" koji još uvijek čeka. Postavite 0 da biste onemogućili podsjetnik.", "label": "Odgoda podsjetnika za istovar" }, + "notify_unload_repeat": { + "doc": "Ponovno šalje podsjetnik za istovar svakih \"Odgoda podsjetnika za istovar\" minuta dok ne otvorite vrata ili ne dodirnete \"Prestani podsjećati\" na obavijesti. Zahtijeva Entitet senzora vrata (kao i sam podsjetnik). Gumb za odbacivanje radi na obavijestima mobilne aplikacije Home Assistant (companion app).", + "label": "Ponavljaj dok se vrata ne otvore" + }, "off_delay": { "doc": "Vrijeme čekanja nakon pada struje prije nego što se proglasi da je ciklus završen. Ako se struja nastavi unutar ovog prozora, ciklus se nastavlja neprimjetno - ovo premošćuje pauze između faza pranja. Perilice posuđa imaju duge faze sušenja (isključivanje na 20-60 min) tako da odgoda isključivanja mora biti veća od te kako bi cijeli ciklus pranja+sušenja bio jedan ciklus.", "label": "Odgoda isključivanja" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Oštrina energije", "doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava ocjenu. Zadana vrijednost 0,25 je namjerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije." + }, + "power_profile_interval_min": { + "label": "Interval profila snage", + "doc": "Veličina segmenta za atribut senzora power_profile po profilu (polje prosječnih vata po slotu koje koriste vanjski planeri poput EMHASS i tibber_prices). Manji segmenti zadržavaju kratke skokove snage oštrima; veći segmenti zaglađuju oblik. Zadano 15 min. Samo za čitanje; ne utječe na otkrivanje." + }, + "notify_live_sticky": { + "label": "Zadrži živu obavijest pri dodiru", + "doc": "Samo Android. Živu obavijest o napretku postavite kao trajnu (prikvačenu) kako dodir ne bi odbacio aktivnu nit. Isključeno zadržava zadano ponašanje gdje dodir odbacuje obavijest." + }, + "notify_live_click_action": { + "label": "Odredište dodira na živoj obavijesti", + "doc": "Samo Android. Gdje dodir na živu obavijest o napretku otvara (npr. /lovelace/laundry ili cijeli URL) umjesto početne stranice aplikacije. Ostavite prazno za zadano." + }, + "door_opens_at_end": { + "label": "Vrata se automatski otvaraju na kraju", + "doc": "Za perilice posuđa koje na kraju ciklusa otvaraju vrata radi sušenja (AirDry i slično). Kada je uključeno, otvaranje vrata za vrijeme pokrenuta ciklusa više ne zaustavlja ciklus zauvijek; umjesto toga, ako vrata ostanu otvorena koliko je navedeno ispod, WashData smatra ciklus završenim. Kratko otvaranje (dodavanje predmeta) se zanemaruje. Zahtijeva entitet senzora vrata." + }, + "door_end_dwell_seconds": { + "label": "Zadržavanje otvorenih vrata za završetak", + "doc": "Koliko dugo vrata moraju ostati otvorena prije nego WashData završi ciklus, kada je uključena postavka \"Vrata se automatski otvaraju na kraju\". Dovoljno dugo da se ignorira brzo dodavanje posuđa (zadano 60 s), dovoljno kratko za brz završetak kad perilica otvori vrata." } }, "setting_group": { @@ -1592,6 +1708,7 @@ "min_active": "Na temelju najmanje radne snage ({min}W) uočene u posljednjem ciklusu.", "min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprječavaju prijevremene potvrde.", "min_off_gap": "Na temelju {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.", + "min_off_gap_bridge": "Postavljeno tako da premosti najdulji tihi odsječak unutar ciklusa: {span}s + 60s rezerve, iz {spans} premoštenih razmaka kroz {cycles} čistih ciklusa (ostaje ispod vašeg najkraćeg razmaka između dva uzastopna pokretanja, koji iznosi {ceiling}s).", "min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}", "ml_auto_label": "Najniža pouzdanost koju je model kvalitete još ocijenio čistom (p10 od {cycles} čistih ciklusa = {p10}).", "ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocijenio s >50 %; zatraži {val} potvrdu/potvrde kraja.", @@ -1608,7 +1725,7 @@ "thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage stroja.", "tol_per_profile": "p75 varijance trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosljedni profili nisu kažnjeni.", "tol_pooled": "Na temelju objedinjene varijance trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).", - "watchdog": "Zadržano što nižim uz sigurnost (3x razmak ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." + "watchdog": "Zadržano što nižim uz sigurnost (tik iznad razmaka ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." }, "exclusions": { "summary": "Isključeno {total} pogrešno otkrivenih ciklusa: {parts}.", @@ -1688,6 +1805,10 @@ "name_required": "Ime je potrebno", "no_split_found": "Nisu pronađeni razmaci u praznom hodu za cijepanje", "panel_settings_saved": "Postavke ploče su spremljene", + "pg_preset_loaded": "Preset \"{name}\" učitan", + "pg_preset_saved": "Preset \"{name}\" spremljen", + "pg_sugg_loaded": "Učitano {n} predloženih vrijednosti - pokrenite pješčanik za usporedbu", + "pg_sugg_ml_loaded": "Učitano {n} ML-kalibriranih vrijednosti - pokrenite pješčanik za usporedbu", "phase_name_required": "Potreban je naziv faze", "phase_updated": "Faza ažurirana", "phases_saved": "Faze spremljene", @@ -1770,6 +1891,7 @@ "other": "Ostalo" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Perilica posuđa: sekunde tišine nakon očekivanog trajanja prije nego što se otpusti čekanje na završno ispumpavanje vode", "anti_wrinkle_enabled": "Upij impulse bubnja nakon glavne faze, a ne čitaj ih kao nove cikluse", "anti_wrinkle_exit_power": "Snaga mora pasti ispod ove vrijednosti između impulsa da bi anti-bora ostala aktivna", "anti_wrinkle_idle_timeout": "Dopušteno vrijeme mirovanja između dva impulsa bubnja prije nego što anti-bora završi", diff --git a/custom_components/ha_washdata/translations/panel/hu.json b/custom_components/ha_washdata/translations/panel/hu.json index 0374e76e..5218e679 100644 --- a/custom_components/ha_washdata/translations/panel/hu.json +++ b/custom_components/ha_washdata/translations/panel/hu.json @@ -1,1948 +1,2070 @@ { - "badge": { - "artifact_tip": "{n} rendellenesség észlelve (pl. ajtónyitás a ciklus közepén) – nyissa meg, hogy megtekinthesse őket a grafikonon", - "auto": "(automatikusan észlelve)", - "built_in_tag": "beépített", - "declining": "↘ csökkenő", - "energy_low": "A szokásosnál kevesebb energia", - "energy_spike": "A szokásosnál több energia", - "fair_fit": "elfogadható minőség", - "fair_fit_tip": "Mérsékelt egyezési konzisztencia – néhány ehhez a profilhoz rendelt ciklus alacsonyabb megbízhatósági pontszámmal rendelkezik. Címkézz fel több ciklust, vagy rögzítsd újra a profilt a pontosság javítása érdekében.", - "feedback_requested": "Visszajelzést kértünk", - "golden_cycle": "Rögzített referenciaciklus", - "improving": "↗ javul", - "manual": "(manuálisan kiválasztott)", - "needs_review": "Felülvizsgálatra szorul", - "overrun": "A szokásosnál tovább futott", - "poor_fit": "rossz illeszkedés", - "poor_fit_tip": "Inkonzisztens meccselőzmények – fontolja meg a profil újjáépítését", - "restart_gap_tip": "{n} HA-újraindítás-rés: a teljesítménygörbén van egy lyuk", - "reviewed": "Áttekintve", - "steady": "→ állandó", - "underrun": "A szokásosnál gyorsabban fejeződött be", - "using_defaults": "A szállított alapértelmezett értékek használata", - "using_tuned": "Hangolt súlyok használata", - "overrun_ratio": "(a várt {x}-szerese)", - "underrun_ratio": "(a várt {pct}%-a)", - "awaiting_tip": "Közösségi jóváhagyásra vár", - "awaiting_n": "Jóváhagyásra vár · {n} megerősítés", - "approved": "Jóváhagyva", - "awaiting": "Jóváhagyásra vár", - "imported_tip": "A közösségi boltból importálva. Csak egyeztetéshez használatos, a statisztikába nem számít bele.", - "not_importable": "itt nem elérhető", - "exists": "létezik" - }, - "btn": { - "add_device": "+ Eszköz hozzáadása", - "add_device_tip": "Adjon hozzá egy másik WashData eszközt", - "add_maintenance": "Karbantartási esemény hozzáadása", - "add_phase": "+ Fázis hozzáadása", - "add_timer": "+ Időzítő hozzáadása", - "apply_all": "Alkalmazza az összeset", - "apply_label": "Címke alkalmazása", - "apply_set_b": "B készlet alkalmazása", - "apply_split": "Felosztás alkalmazása", - "apply_trim": "Vágás alkalmazása", - "auto_detect_split": "Automatikus felismerés", - "auto_label_cycles": "Automatikus címkézési ciklusok", - "auto_label_cycles_tip": "Automatikusan rendelje hozzá a profilneveket azokhoz a felcímkézetlen ciklusokhoz, amelyek egyezési megbízhatósága eléri a küszöbértéket", - "cancel": "Mégsem", - "clear_debug": "Törölje a hibakeresési adatokat", - "clear_splits": "Törlés", - "close": "Bezárás", - "compare": "Hasonlítsa össze", - "confirm": "Erősítse meg", - "convert_to_automation": "Átalakítás automatizálásra", - "correct": "Javítás…", - "create": "Létrehozás", - "create_from_cluster": "Profil létrehozása {count} ciklusból", - "create_profile": "+ Profil létrehozása", - "delete": "Törlés", - "delete_group": "Csoport törlése", - "delete_group_tip": "Csak ezt a csoportot törölje – a tagi profilok megmaradnak", - "delete_profile": "Profil törlése", - "discard": "Eldobás", - "discard_tip": "Dobja el a rögzített nyomot mentés nélkül", - "dismiss": "Elvetés", - "done": "Kész", - "edit": "Szerkesztés", - "export": "Exportálás", - "export_json": "Exportálás JSON-ba", - "force_stop": "Kényszer leállítás", - "force_stop_tip": "Azonnal zárja le az aktuális ciklust, és jelölje erőszakosan leállítottnak", - "from_template": "Sablonból ▾", - "ignore": "Mellőzés", - "import_json": "Importálás JSON-ból", - "import_overwrite": "Importálás (adatok felülírása)", - "inspect": "Vizsgálja meg", - "label": "Címkézés", - "load": "Betöltés", - "load_more": "Több betöltése", - "manage": "Kezelése", - "merge": "Egyesítés", - "new_automation": "+ Új automatizálás", - "new_group": "+ Új csoport", - "new_group_tip": "Csoportosítsa a közel azonos profilokat (azonos alak/időtartam, eltérő hőmérséklet vagy centrifugálás), hogy az egyezés megbízhatóan válasszon közöttük", - "new_phase": "+ Új fázis", - "new_profile": "+ Új profil", - "new_profile_tip": "Hozzon létre új programprofilt meglévő felcímkézett ciklusból vagy rögzítésből", - "on_cycle_finished": "A ciklus végén", - "on_cycle_started": "Beindult a ciklus", - "pause_cycle": "Szünet", - "pause_cycle_tip": "Szüneteltesse a futó ciklust – a készülék onnan folytatja, ahol abbahagyta", - "pg_apply_device": "Alkalmazás az eszközre", - "pg_autofill": "Automatikus kitöltés", - "play": "Lejátszás", - "process": "Feldolgozás", - "process_history": "Feldolgozás most", - "process_recording": "Felvétel mentése", - "process_tip": "Mentse el a rögzített nyomot új vagy meglévő profilként", - "rebuild": "Borítékok újjáépítése", - "rebuild_envelope": "Boríték újraépítése", - "rebuild_tip": "Számítsa újra az elvárt energiaburkolót (min/max sáv) az összes profilhoz a felcímkézett ciklusaik alapján – futtassa új ciklusok felcímkézése vagy régiek javítása után", - "rec_start_tip": "Kezdje el rögzíteni a készülék teljesítménynyomát – indítsa közvetlenül a ciklus futtatása előtt", - "rec_stop": "Leállítás", - "rec_stop_tip": "Állítsa le a rögzítést, és tartsa fenn a rögzített nyomot áttekintésre", - "record": "Indítsa el a Felvételt", - "refresh": "Frissítés", - "refresh_diag_tip": "Töltse újra a tárolási statisztikákat", - "refresh_logs_tip": "Töltse újra a legújabb naplórekordokat", - "refresh_settings_tip": "Töltse újra a beállításokat a szerverről", - "relabel": "Átcímkézés ({count})", - "remove": "Távolítsa el", - "remove_timer": "Távolítsa el az időzítőt", - "reset": "Visszaállítás", - "reset_ml_models_tip": "Dobja el a finomhangolt modelleket, és térjen vissza a beépített modellekhez. A WashData később újra megtanulhatja őket.", - "reset_to_builtin": "Állítsa vissza a beépített modellekre", - "reset_to_defaults": "Állítsa vissza az alapértelmezett értékeket", - "resume_cycle": "Ciklus folytatása", - "resume_cycle_tip": "Folytassa a szüneteltetett ciklust", - "revert_settings": "Változtatások elvetése", - "revert_settings_tip": "Állítsa vissza az utolsó mentés előtti beállításokat", - "revert_settings_tip_none": "Először mentsen a visszavonás engedélyezéséhez", - "revert": "Visszaállítás", - "revert_to_previous": "Állítsa vissza ezt a beállítást az előző értékére", - "review": "Értékel", - "run": "Futtatás", - "run_analysis": "🔍 Javaslatelemzés futtatása", - "run_analysis_tip": "Elemezze a rögzített ciklusokat most, és frissítse a hangolási javaslatokat", - "run_auto_label": "Futtassa az Auto-Labelt", - "run_both": "A vs B futtatása", - "run_simulation": "Szimuláció futtatása", - "save": "Mentés", - "save_access_control": "Hozzáférés-vezérlés mentése", - "save_group": "Csoport mentése", - "save_panel_settings": "Mentse el a panelbeállításokat", - "save_phases": "Fázisok mentése", - "save_preferences": "Mentse a Beállításokat", - "save_reminders": "Emlékeztetők mentése", - "save_review": "Vélemény mentése", - "save_settings": "Beállítások mentése", - "select": "Válassza ki", - "select_all": "Összes kijelölése", - "select_last20": "Utolsó 20", - "select_none": "Egyik sem", - "show_only": "Csak megjelenítés", - "skip_setup": "Beállítás kihagyása", - "split": "Felosztás", - "stop": "Leállítás", - "submit_correction": "Javítás benyújtása", - "train_now": "Betanítás most", - "trim": "Vágás", - "trim_split": "Vágás / Felosztás", - "undo": "Visszavonás", - "use": "Használat", - "wipe_all": "Törölje az összes adatot", - "delete_selected": "Kijelöltek törlése ({n})", - "group_suggest": "{n}. csoport: {members}", - "pg_apply_best": "Legjobb alkalmazása", - "pg_apply_to_settings": "Mentés a beállításokba", - "pg_apply_to_settings_tip": "Az itt szerkesztett értékek másolása az eszköz aktív beállításaiba", - "search": "Keresés", - "import": "Importálás", - "disconnect": "Leválasztás", - "connect_github": "GitHub összekapcsolása", - "save_appliance": "Készülék mentése", - "share_to_store": "Megosztás a boltban", - "share": "Megosztás", - "confirm_appliance": "Készülék megerősítése", - "confirmed": "Megerősítve", - "browse_community_setups": "Közösségi beállítások böngészése", - "download_device": "Beállítás letöltése", - "share_device": "⬆ Eszköz megosztása", - "share_device_tip": "Ossza meg ezt a készüléket és a rögzített referenciaciklusait a közösségi boltban, hogy mások ugyanazzal a géppel magukévá tehessék", - "share_n": "{n} ciklus megosztása", - "export_selected": "Exportálás (adatok kiválasztása)", - "export_all": "Gyorsexport: minden", - "import_raw": "Speciális: mindent lecserél a JSON-ból", - "download_export": "Export letöltése", - "analyze_import": "Fájl elemzése", - "import_selected": "Kiválasztottak importálása", - "back": "Vissza" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "A Leállítási küszöb alatt kell lennie ({stop} W); különben a ránctalanítás kilépési teljesítménye figyelmen kívül marad", - "stop": "A Ránctalanítás kilépési teljesítménye felett kell lennie ({exit} W)" + "card": { + "min": "perc", + "entity_not_found": "Entitás nem található", + "running_long": "Sokáig fut", + "remaining": "hátralévő", + "progress": "haladás", + "show_time_remaining": "Hátralévő idő megjelenítése", + "show_percentage": "Százalék megjelenítése", + "layout": { + "tile": "Csempe (kompakt)", + "detail": "Részletes (gazdag)", + "glance": "Pillantás (több eszköz)" + }, + "btn": { + "pause": "Szüneteltetés", + "resume": "Folytatás", + "terminate": "Ciklus befejezése", + "record_start": "Rögzítés indítása", + "record_stop": "Rögzítés leállítása", + "program": "Program", + "open_panel": "WashData megnyitása" + }, + "editor": { + "layout": "Elrendezés", + "entity": "Készülék entitás", + "entities": "Készülékek", + "title": "Cím", + "icon": "Ikon", + "show_state": "Állapot megjelenítése", + "show_program": "Program megjelenítése", + "show_progress_bar": "Folyamatjelző megjelenítése", + "spin_icon": "Ikon forgatása futás közben", + "display_mode": "Részletsor", + "active_color": "Aktív szín felülbírálása", + "show_phase": "Fázis megjelenítése", + "show_energy": "Energia és költség megjelenítése", + "show_anomaly": "Túlfutás figyelmeztetés megjelenítése", + "show_sparkline": "Élő teljesítménygrafikon megjelenítése", + "buttons": "Műveleti gombok", + "program_entity": "Program entitás (felülbírálás)", + "time_entity": "Idő entitás (felülbírálás)", + "pct_entity": "Folyamat entitás (felülbírálás)", + "power_entity": "Teljesítmény entitás (felülbírálás)", + "tap_action": "Koppintás művelet", + "hold_action": "Nyomva tartás művelet", + "double_tap_action": "Dupla koppintás művelet" + } + }, + "badge": { + "artifact_tip": "{n} rendellenesség észlelve (pl. ajtónyitás a ciklus közepén) – nyissa meg, hogy megtekinthesse őket a grafikonon", + "auto": "(automatikusan észlelve)", + "built_in_tag": "beépített", + "declining": "↘ csökkenő", + "energy_low": "A szokásosnál kevesebb energia", + "energy_spike": "A szokásosnál több energia", + "fair_fit": "elfogadható minőség", + "fair_fit_tip": "Mérsékelt egyezési konzisztencia – néhány ehhez a profilhoz rendelt ciklus alacsonyabb megbízhatósági pontszámmal rendelkezik. Címkézz fel több ciklust, vagy rögzítsd újra a profilt a pontosság javítása érdekében.", + "feedback_requested": "Visszajelzést kértünk", + "golden_cycle": "Rögzített referenciaciklus", + "improving": "↗ javul", + "manual": "(manuálisan kiválasztott)", + "needs_review": "Felülvizsgálatra szorul", + "overrun": "A szokásosnál tovább futott", + "poor_fit": "rossz illeszkedés", + "poor_fit_tip": "Inkonzisztens meccselőzmények – fontolja meg a profil újjáépítését", + "restart_gap_tip": "{n} HA-újraindítás-rés: a teljesítménygörbén van egy lyuk", + "reviewed": "Áttekintve", + "steady": "→ állandó", + "underrun": "A szokásosnál gyorsabban fejeződött be", + "using_defaults": "A szállított alapértelmezett értékek használata", + "using_tuned": "Hangolt súlyok használata", + "overrun_ratio": "(a várt {x}-szerese)", + "underrun_ratio": "(a várt {pct}%-a)", + "awaiting_tip": "Közösségi jóváhagyásra vár", + "awaiting_n": "Jóváhagyásra vár · {n} megerősítés", + "approved": "Jóváhagyva", + "awaiting": "Jóváhagyásra vár", + "imported_tip": "A közösségi boltból importálva. Csak egyeztetéshez használatos, a statisztikába nem számít bele.", + "not_importable": "itt nem elérhető", + "exists": "létezik" + }, + "btn": { + "add_device": "+ Eszköz hozzáadása", + "add_device_tip": "Adjon hozzá egy másik WashData eszközt", + "add_maintenance": "Karbantartási esemény hozzáadása", + "add_phase": "+ Fázis hozzáadása", + "add_timer": "+ Időzítő hozzáadása", + "apply_all": "Alkalmazza az összeset", + "apply_label": "Címke alkalmazása", + "apply_set_b": "B készlet alkalmazása", + "apply_split": "Felosztás alkalmazása", + "apply_trim": "Vágás alkalmazása", + "auto_detect_split": "Automatikus felismerés", + "auto_label_cycles": "Automatikus címkézési ciklusok", + "auto_label_cycles_tip": "Automatikusan rendelje hozzá a profilneveket azokhoz a felcímkézetlen ciklusokhoz, amelyek egyezési megbízhatósága eléri a küszöbértéket", + "cancel": "Mégsem", + "clear_debug": "Törölje a hibakeresési adatokat", + "clear_splits": "Törlés", + "close": "Bezárás", + "compare": "Hasonlítsa össze", + "confirm": "Erősítse meg", + "convert_to_automation": "Átalakítás automatizálásra", + "correct": "Javítás…", + "create": "Létrehozás", + "create_from_cluster": "Profil létrehozása {count} ciklusból", + "create_profile": "+ Profil létrehozása", + "delete": "Törlés", + "delete_group": "Csoport törlése", + "delete_group_tip": "Csak ezt a csoportot törölje – a tagi profilok megmaradnak", + "delete_profile": "Profil törlése", + "discard": "Eldobás", + "discard_tip": "Dobja el a rögzített nyomot mentés nélkül", + "dismiss": "Elvetés", + "done": "Kész", + "edit": "Szerkesztés", + "export": "Exportálás", + "export_json": "Exportálás JSON-ba", + "force_stop": "Kényszer leállítás", + "force_stop_tip": "Azonnal zárja le az aktuális ciklust, és jelölje erőszakosan leállítottnak", + "from_template": "Sablonból ▾", + "ignore": "Mellőzés", + "import_json": "Importálás JSON-ból", + "import_overwrite": "Importálás (adatok felülírása)", + "inspect": "Vizsgálja meg", + "label": "Címkézés", + "load": "Betöltés", + "load_more": "Több betöltése", + "manage": "Kezelése", + "merge": "Egyesítés", + "new_automation": "+ Új automatizálás", + "new_group": "+ Új csoport", + "new_group_tip": "Csoportosítsa a közel azonos profilokat (azonos alak/időtartam, eltérő hőmérséklet vagy centrifugálás), hogy az egyezés megbízhatóan válasszon közöttük", + "new_phase": "+ Új fázis", + "new_profile": "+ Új profil", + "new_profile_tip": "Hozzon létre új programprofilt meglévő felcímkézett ciklusból vagy rögzítésből", + "on_cycle_finished": "A ciklus végén", + "on_cycle_started": "Beindult a ciklus", + "pause_cycle": "Szünet", + "pause_cycle_tip": "Szüneteltesse a futó ciklust – a készülék onnan folytatja, ahol abbahagyta", + "pg_apply_device": "Alkalmazás az eszközre", + "pg_autofill": "Automatikus kitöltés", + "pg_load_calibrated": "Kalibrált (ML) betöltése ({n})", + "pg_load_calibrated_tip": "Az ML által kalibrált beállításokat betölti a Homokozó felülírásaiként", + "pg_load_live": "Aktív beállítások betöltése", + "pg_load_live_tip": "Az integráció jelenlegi beállításainak újraolvasása és a Homokozó összes módosításának elvetése", + "pg_load_suggested": "Javaslatok betöltése ({n})", + "pg_load_suggested_tip": "Az automatikus hangolóeszköz aktuális javaslatait betölti a Homokozó felülírásaiként", + "pg_preset_delete": "Előbeállítás törlése", + "pg_preset_load": "Előbeállítás betöltése", + "pg_preset_load_tip": "A Homokozó értékeinek lecserélése erre az előbeállításra (az aktív beállítások változatlanok maradnak)", + "pg_preset_save": "Mentés előbeállításként", + "pg_preset_save_tip": "Az alábbi összes érték mentése névvel ellátott előbeállításként ehhez az eszközhöz", + "pg_publish_all": "Mentés a beállításokba ({n})", + "pg_publish_one": "A(z) \"{label}\" mentése az integráció beállításaiba", + "play": "Lejátszás", + "process": "Feldolgozás", + "process_history": "Feldolgozás most", + "process_recording": "Felvétel mentése", + "process_tip": "Mentse el a rögzített nyomot új vagy meglévő profilként", + "rebuild": "Borítékok újjáépítése", + "rebuild_envelope": "Boríték újraépítése", + "rebuild_tip": "Számítsa újra az elvárt energiaburkolót (min/max sáv) az összes profilhoz a felcímkézett ciklusaik alapján – futtassa új ciklusok felcímkézése vagy régiek javítása után", + "rec_start_tip": "Kezdje el rögzíteni a készülék teljesítménynyomát – indítsa közvetlenül a ciklus futtatása előtt", + "rec_stop": "Leállítás", + "rec_stop_tip": "Állítsa le a rögzítést, és tartsa fenn a rögzített nyomot áttekintésre", + "record": "Indítsa el a Felvételt", + "refresh": "Frissítés", + "refresh_diag_tip": "Töltse újra a tárolási statisztikákat", + "refresh_logs_tip": "Töltse újra a legújabb naplórekordokat", + "refresh_settings_tip": "Töltse újra a beállításokat a szerverről", + "relabel": "Átcímkézés ({count})", + "remove": "Távolítsa el", + "remove_timer": "Távolítsa el az időzítőt", + "reset": "Visszaállítás", + "reset_ml_models_tip": "Dobja el a finomhangolt modelleket, és térjen vissza a beépített modellekhez. A WashData később újra megtanulhatja őket.", + "reset_to_builtin": "Állítsa vissza a beépített modellekre", + "reset_to_defaults": "Állítsa vissza az alapértelmezett értékeket", + "resume_cycle": "Ciklus folytatása", + "resume_cycle_tip": "Folytassa a szüneteltetett ciklust", + "revert_settings": "Változtatások elvetése", + "revert_settings_tip": "Állítsa vissza az utolsó mentés előtti beállításokat", + "revert_settings_tip_none": "Először mentsen a visszavonás engedélyezéséhez", + "revert": "Visszaállítás", + "revert_to_previous": "Állítsa vissza ezt a beállítást az előző értékére", + "review": "Értékel", + "run": "Futtatás", + "run_analysis": "🔍 Javaslatelemzés futtatása", + "run_analysis_tip": "Elemezze a rögzített ciklusokat most, és frissítse a hangolási javaslatokat", + "run_auto_label": "Futtassa az Auto-Labelt", + "run_both": "A vs B futtatása", + "run_simulation": "Szimuláció futtatása", + "save": "Mentés", + "save_access_control": "Hozzáférés-vezérlés mentése", + "save_group": "Csoport mentése", + "save_panel_settings": "Mentse el a panelbeállításokat", + "save_phases": "Fázisok mentése", + "save_preferences": "Mentse a Beállításokat", + "save_reminders": "Emlékeztetők mentése", + "save_review": "Vélemény mentése", + "save_settings": "Beállítások mentése", + "select": "Válassza ki", + "select_all": "Összes kijelölése", + "select_last20": "Utolsó 20", + "select_none": "Egyik sem", + "show_only": "Csak megjelenítés", + "skip_setup": "Beállítás kihagyása", + "split": "Felosztás", + "stop": "Leállítás", + "submit_correction": "Javítás benyújtása", + "train_now": "Betanítás most", + "trim": "Vágás", + "trim_split": "Vágás / Felosztás", + "undo": "Visszavonás", + "use": "Használat", + "wipe_all": "Törölje az összes adatot", + "delete_selected": "Kijelöltek törlése ({n})", + "group_suggest": "{n}. csoport: {members}", + "pg_apply_best": "Legjobb alkalmazása", + "pg_apply_to_settings": "Mentés a beállításokba", + "pg_apply_to_settings_tip": "Az itt szerkesztett értékek másolása az eszköz aktív beállításaiba", + "search": "Keresés", + "import": "Importálás", + "disconnect": "Leválasztás", + "connect_github": "GitHub összekapcsolása", + "save_appliance": "Készülék mentése", + "share_to_store": "Megosztás a boltban", + "share": "Megosztás", + "confirm_appliance": "Készülék megerősítése", + "confirmed": "Megerősítve", + "browse_community_setups": "Közösségi beállítások böngészése", + "download_device": "Beállítás letöltése", + "share_device": "⬆ Eszköz megosztása", + "share_device_tip": "Ossza meg ezt a készüléket és a rögzített referenciaciklusait a közösségi boltban, hogy mások ugyanazzal a géppel magukévá tehessék", + "share_n": "{n} ciklus megosztása", + "export_selected": "Exportálás (adatok kiválasztása)", + "export_all": "Gyorsexport: minden", + "import_raw": "Speciális: mindent lecserél a JSON-ból", + "download_export": "Export letöltése", + "analyze_import": "Fájl elemzése", + "import_selected": "Kiválasztottak importálása", + "back": "Vissza", + "mute_suggestion": "Ne javasolja többé ezt a beállítást", + "reset_muted": "Elhallgatottak visszaállítása" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "A Leállítási küszöb alatt kell lennie ({stop} W); különben a ránctalanítás kilépési teljesítménye figyelmen kívül marad", + "stop": "A Ránctalanítás kilépési teljesítménye felett kell lennie ({exit} W)" + }, + "anti_wrinkle_max": { + "max": "Az Indítási küszöb felett kell lennie ({start} W); különben a ránctalanítás időtartam-korlátja megkerülődik", + "start": "A Ránctalanítás maximális teljesítménye alatt kell lennie ({max} W)" + }, + "attn_sub": "Mentés előtt javítsa az ütközéseket", + "attn_title": "{n} beállítási ütközés{s}", + "settings_banner": "{n} beállítási ütközés{s} – ellenőrizze a kijelölt szakaszokat és javítsa ki mentés előtt.", + "settings_banner_btn": "Ugrás az elsőhöz", + "confidence": { + "auto": "Legalább az Egyezési küszöb értékén kell lennie ({match})", + "learning": "Legfeljebb az Egyezési küszöb értékén lehet ({match})", + "match_for_auto": "Legfeljebb az Automatikus jelölési megbízhatóság értékén lehet ({alc})", + "match_for_learning": "Legalább a Tanulási megbízhatóság értékén kell lennie ({lc})" + }, + "duration_ratio": { + "max": "Nagyobb kell lennie a Min. időtartam aránynál ({min})", + "min": "Kisebb kell lennie a Max. időtartam aránynál ({max})" + }, + "hysteresis": { + "start": "A Leállítási küszöb felett kell lennie ({stop} W)", + "stop": "Az Indítási küszöb alatt kell lennie ({start} W)" + }, + "min_power": { + "min_power": "Legfeljebb a Leállítási küszöb értékén lehet ({stop} W)", + "stop": "Legalább a Minimális teljesítmény értékén kell lennie ({min} W)" + }, + "no_update_timeout": { + "timeout": "Nagyobb kell lennie a Felügyelő intervalluménál ({wi} s)", + "watchdog": "Kisebb kell lennie a Frissítés nélküli időtúllépésnél ({to} s)" + }, + "off_delay": { + "gap": "A Min. kikapcsolási résnek legalább a Kikapcsolási késleltetés értékének kell lennie ({delay} s)", + "off_delay": "A Kikapcsolási késleltetés ({off_delay} s) meghaladja a Min. kikapcsolási rést ({gap} s); egymást követő ciklusok összeolvadhatnak" + }, + "power_off": { + "stop": "A Kikapcsolás teljesítményküszöbe felett kell lennie ({pot} W)", + "threshold": "Hatályba lépéséhez a Leállítási küszöb alatt kell lennie ({stop} W)" + }, + "pump_stuck": { + "duration": "Kisebb kell lennie a Frissítés nélküli időtúllépésnél ({to} s), hogy az elakadás-riasztás a felügyelő előtt aktiválódjon", + "timeout": "Meg kell haladnia az Elakadt szivattyú időtartamát ({ps} s), hogy a riasztás az erőszakos leállítás előtt aktiválódjon" + }, + "start_dur": { + "sampling": "A Mintavételezési intervallum meghaladja az Indítási időtartamot ({sdt} s); egymintás tüskék ciklust nyithatnak", + "threshold": "Legalább egy Mintavételezési intervallumnak kell lennie ({si} s) az egymintás hamis indítások megelőzésére" + }, + "unmatch": { + "match": "A Nem egyező küszöb felett kell lennie ({un})", + "unmatch": "Az Egyezési küszöb alatt kell lennie ({match}); különben egy megerősített egyezés azonnal visszavonódik" + }, + "cascade_toast": "Konzisztencia megőrzése érdekében {n} beállítás is automatikusan módosult.", + "suggestion_resolves": "A javításhoz alkalmazza az alábbi függőben lévő javaslatot ({val})", + "use_fix": "Használja a következőt: {val}", + "watchdog": { + "interval": "Legalább kétszerese kell legyen a Mintavételezési intervallumnak ({si} s)", + "sampling": "A Mintavételezési intervallum legfeljebb a Felügyelő intervallum fele lehet ({wi} s)" + } }, - "anti_wrinkle_max": { - "max": "Az Indítási küszöb felett kell lennie ({start} W); különben a ránctalanítás időtartam-korlátja megkerülődik", - "start": "A Ránctalanítás maximális teljesítménye alatt kell lennie ({max} W)" - }, - "attn_sub": "Mentés előtt javítsa az ütközéseket", - "attn_title": "{n} beállítási ütközés{s}", - "settings_banner": "{n} beállítási ütközés{s} – ellenőrizze a kijelölt szakaszokat és javítsa ki mentés előtt.", - "settings_banner_btn": "Ugrás az elsőhöz", - "confidence": { - "auto": "Legalább az Egyezési küszöb értékén kell lennie ({match})", - "learning": "Legfeljebb az Egyezési küszöb értékén lehet ({match})", - "match_for_auto": "Legfeljebb az Automatikus jelölési megbízhatóság értékén lehet ({alc})", - "match_for_learning": "Legalább a Tanulási megbízhatóság értékén kell lennie ({lc})" - }, - "duration_ratio": { - "max": "Nagyobb kell lennie a Min. időtartam aránynál ({min})", - "min": "Kisebb kell lennie a Max. időtartam aránynál ({max})" - }, - "hysteresis": { - "start": "A Leállítási küszöb felett kell lennie ({stop} W)", - "stop": "Az Indítási küszöb alatt kell lennie ({start} W)" - }, - "min_power": { - "min_power": "Legfeljebb a Leállítási küszöb értékén lehet ({stop} W)", - "stop": "Legalább a Minimális teljesítmény értékén kell lennie ({min} W)" - }, - "no_update_timeout": { - "timeout": "Nagyobb kell lennie a Felügyelő intervalluménál ({wi} s)", - "watchdog": "Kisebb kell lennie a Frissítés nélküli időtúllépésnél ({to} s)" - }, - "off_delay": { - "gap": "A Min. kikapcsolási résnek legalább a Kikapcsolási késleltetés értékének kell lennie ({delay} s)", - "off_delay": "A Kikapcsolási késleltetés ({off_delay} s) meghaladja a Min. kikapcsolási rést ({gap} s); egymást követő ciklusok összeolvadhatnak" - }, - "power_off": { - "stop": "A Kikapcsolás teljesítményküszöbe felett kell lennie ({pot} W)", - "threshold": "Hatályba lépéséhez a Leállítási küszöb alatt kell lennie ({stop} W)" - }, - "pump_stuck": { - "duration": "Kisebb kell lennie a Frissítés nélküli időtúllépésnél ({to} s), hogy az elakadás-riasztás a felügyelő előtt aktiválódjon", - "timeout": "Meg kell haladnia az Elakadt szivattyú időtartamát ({ps} s), hogy a riasztás az erőszakos leállítás előtt aktiválódjon" - }, - "start_dur": { - "sampling": "A Mintavételezési intervallum meghaladja az Indítási időtartamot ({sdt} s); egymintás tüskék ciklust nyithatnak", - "threshold": "Legalább egy Mintavételezési intervallumnak kell lennie ({si} s) az egymintás hamis indítások megelőzésére" - }, - "unmatch": { - "match": "A Nem egyező küszöb felett kell lennie ({un})", - "unmatch": "Az Egyezési küszöb alatt kell lennie ({match}); különben egy megerősített egyezés azonnal visszavonódik" - }, - "cascade_toast": "Konzisztencia megőrzése érdekében {n} beállítás is automatikusan módosult.", - "suggestion_resolves": "A javításhoz alkalmazza az alábbi függőben lévő javaslatot ({val})", - "use_fix": "Használja a következőt: {val}", - "watchdog": { - "interval": "Legalább kétszerese kell legyen a Mintavételezési intervallumnak ({si} s)", - "sampling": "A Mintavételezési intervallum legfeljebb a Felügyelő intervallum fele lehet ({wi} s)" - } - }, - "hdr": { - "ab_comparison": "A/B beállítások összehasonlítása", - "access_control": "Hozzáférés-vezérlés", - "add_maintenance": "Karbantartási esemény hozzáadása", - "automation_delete": "Törölje ezt az automatizálást", - "automation_needs_review": "Ezt a ciklust felül kell vizsgálni", - "automation_open": "Nyissa meg az automatizálási szerkesztőben", - "automation_review_this_cycle": "Tekintse át ezt a ciklust", - "automations": "Automatizálások", - "clear_debug": "Törölje a hibakeresési nyomokat", - "cycle_simulator": "Ciklusszimulátor", - "diagnostics_pref": "Diagnosztika", - "display": "Kijelző", - "dtw_inspector": "DTW-vizsgáló", - "export_import": "Exportálás / Importálás", - "getting_started": "Első lépések", - "live_power": "Élő teljesítmény", - "logs": "Naplók", - "logs_diagnostics": "Diagnosztika", - "maintenance": "Karbantartási műveletek", - "maintenance_log": "Karbantartási napló", - "maintenance_reminders": "Szerviz emlékeztetők", - "manual_recording": "Kézi rögzítés", - "manual_recording_tip": "Szándékosan futtasson egy ciklust, miközben a WashData rögzíti a teljesítménynyomot. Indítsa közvetlenül a készülék elindulása előtt, állítsa le, amikor befejezi, majd kezelje, hogy névvel ellátott profilként mentse.", - "ml_learned": "Amit a WashData megtanult", - "ml_matching_tuning": "Program-illesztő finomhangolás", - "ml_settings_card": "Beállítások elemre", - "ml_smart_learning": "Intelligens tanulás", - "my_preferences": "Saját preferenciáim", - "no_automations": "Egyelőre egyetlen automatika sem utal erre az eszközre.", - "panel_settings": "Panelbeállítások", - "param_sweep": "Paraméterpásztázás", - "phase_catalog": "Fázis katalógus", - "playground": "Homokozó", - "process_history": "Folyamattörténet", - "settings_history": "Beállítások előzményei", - "status": "Állapot", - "status_graph": "Állapotgrafikon", - "storage_stats": "Tárolási statisztikák", - "test_history": "Tesztelés előzményeken", - "toggle_sidebar": "Kapcsolja be a Home Assistant oldalsávot", - "tools_and_data": "Eszközök és adatok", - "wipe_history": "Törölje az előzményeket", - "recommendations": "Javaslatok ({n})", - "pg_detection_params": "Érzékelési beállítások", - "pg_timeline": "Események idővonala", - "pg_outcome": "Szimuláció eredménye", - "pg_across_cycles": "Az összes ciklusban", - "community_store": "Közösségi bolt", - "online_account": "Közösségi bolt és online funkciók" - }, - "health": { - "fair": "Elfogadható profilminőség", - "good": "✓ Jó profilminőség", - "poor": "⚠ Gyenge profilminőség" - }, - "lbl": { - "pg_anti_wrinkle": "Ránctalanítás", - "actions": "Akciók", - "activity": "Tevékenység", - "administrators": "Rendszergazdák", - "aria_compare_chart": "Ciklus-összehasonlító grafikon", - "aria_cycle_chart": "Ciklus teljesítménygörbe", - "aria_envelope_chart": "Profil teljesítményboríték grafikon", - "aria_phase_chart": "Fázisszerkesztő grafikon", - "aria_playground_chart": "Ciklus teljesítménygörbe húzható érzékelési küszöbökkel", - "aria_power_chart": "Teljesítményfelvétel grafikon", - "aria_spaghetti_chart": "Egymásra helyezett ciklus teljesítménygörbék", - "aria_sweep_chart": "Paraméterpásztázás eredményeinek grafikonja", - "artifact_anomaly": "Rendellenesség", - "artifact_high_power": "Magas teljesítmény", - "artifact_interruption": "Megszakítás", - "artifact_low_power": "Alacsony teljesítmény", - "auto_detect": "Automatikus felismerés", - "auto_fine_tune_off": "automatikus finomhangolás kikapcsolása", - "auto_fine_tune_on": "automatikus finomhangolás aktív (kb. {hour}:00 körül)", - "avg_cost": "Átlagos költség", - "change": "Változás", - "clock_time": "Óraidő", - "cohesion_good": "kohézió {pct}%", - "cohesion_low": "⚠ alacsony kohézió {pct}%", - "compare_profiles": "Hasonlítsa össze a profilokkal", - "concurrency": "Egyidejűség", - "confidence": "Bizalom", - "confidence_threshold": "Bizalmi küszöb", - "correct_duration": "Helyes időtartam (perc, opcionális)", - "correct_profile": "Helyes profil", - "correlation": "Korreláció", - "cost": "Költség", - "create_new_profile": "+ Új profil létrehozása…", - "current_phase": "Jelenlegi fázis", - "curves": "Görbék", - "cycle": "Ciklus", - "cycle_date_display": "Ciklusdátum kijelzés", - "cycle_health": "Ciklus egészség", - "cycle_index": "ciklusindex →", - "cycles": "Ciklusok", - "cycles_count": "Ciklusok", - "cycles_lc": "ciklus", - "dashed": "szaggatott", - "date": "Dátum", - "debug_traces": "Hibakeresési nyomok", - "default": "Alapértelmezett", - "default_access_level": "Alapértelmezett szint az alábbiakban nem szereplő felhasználók számára", - "default_other": "Alapértelmezett (más eszközök)", - "default_tab": "Alapértelmezett lap a panel megnyitásakor", - "delta": "Δ", - "description": "Leírás", - "dtw_blend_w": "Keverési súly", - "dtw_blended": "Kombinált pontszám", - "dtw_ddtw": "DDTW pontszám", - "dtw_l1": "L1 pontszám", - "dtw_matched_profile": "(a ciklus egyeztetett profilja)", - "duration": "Időtartam", - "duration_agreement": "Időtartam-egyezés", - "emphasis": "Hangsúly", - "enable_access_control": "Felhasználónkénti hozzáférés-vezérlés engedélyezése", - "energy": "Energia", - "energy_agreement": "Energia-egyezés", - "event_timeline": "Eseményidővonal", - "event_type": "Eseménytípus", - "expected": "Várt", - "expected_duration": "Várható időtartam (perc)", - "file_kb": "Fájl (kB)", - "final_score": "Végső pontszám", - "from": "Ettől", - "gap_s": "rés(ek)", - "group_name": "Csoport neve", - "head_trim": "Fejszegély(ek)", - "health": "Egészség", - "hide_tabs": "Lapok elrejtése nem rendszergazdák számára", - "in_use": "Használatban", - "json_data": "JSON adatok", - "label": "Program", - "last": "Utolsó", - "last_checked": "Utoljára ellenőrizve:", - "load_from_file": "Betöltés fájlból", - "mae_score": "MAE pontszám", - "manual_duration": "Manuális időtartam (perc, opcionális)", - "match": "Egyezés", - "members": "Tagok", - "metric": "Mérőszám", - "mode_existing_profile": "Hozzáadás a meglévő profilhoz", - "mode_new_profile": "Új profil létrehozása", - "models_fine_tuned": "({count} modell finomhangolva)", - "n_classic_suggestions": "{n} klasszikus", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} kijelölve", - "n_tuning_suggestions": "{n} hangolási javaslat", - "na": "nincs", - "new_profile_name": "Új profilnév", - "notes": "Jegyzetek", - "of": "/", - "outcome": "Eredmény", - "panel_default_tab": "Alapértelmezett lap", - "panel_language": "Panel nyelve", - "per_cycle_short": "ciklus", - "pg_autofill_tip": "Tartomány automatikus kitöltése a jelenlegi értékből ({lo}–{hi})", - "pg_best_value": "A talált legjobb érték", - "pg_current_value": "Jelenlegi érték:", - "pg_drag_hint": "Húzza a vonalat a grafikonon", - "pg_dtw": "DTW", - "pg_ev_ending": "Befejezés", - "pg_ev_running": "Fut", - "pg_group_advanced": "Szélsőséges esetek", - "pg_group_detection": "Érzékelési kiváltók", - "pg_group_timing": "Időzítési szabályok", - "pg_idle": "Tétlen", - "pg_last_run": "Utolsó futtatás: {date}", - "pg_match_score": "Egyezési pontszám", - "pg_pct_of": "{total} {p}%-a", - "pg_poor_match": "Rossz egyezés", - "pg_strong_match": "Erős egyezés", - "pg_tile_ambiguous": "Kétértelmű", - "pg_tile_ambiguous_tip": "Ciklusok, ahol két program szinte holtversenyben van", - "pg_tile_detected": "Érzékelt", - "pg_tile_detected_tip": "Ciklusok, ahol a teljesítmény elég sokáig lépte túl az indítási küszöböt ahhoz, hogy futóként regisztrálódjon", - "pg_tile_matched": "Egyezett", - "pg_tile_matched_tip": "Ismert programhoz helyesen hozzárendelt ciklusok", - "pg_time_left": "Hátralévő idő", - "pg_weak_match": "Gyenge egyezés", - "phase_name": "Név", - "phase_timeline": "Fázisidővonal", - "power": "Teljesítmény", - "profile": "Profil", - "profile_index": "profilindex →", - "profile_name": "Profil neve", - "program": "Program", - "program_tip": "Felülbírálja, hogy melyik profil illeszkedik az aktuális ciklushoz. Az automatikus észlelés lehetővé teszi, hogy az integráció automatikusan válassza ki a legjobb egyezést. Rögzítsen egy adott programot a kényszer-egyezéshez, ha az automatikus észlelés téves, vagy tudja, mi fut.", - "progress": "Előrehaladás", - "raw_socket": "Nyers csatlakozó", - "read_only": "Csak olvasható", - "ref_cycle": "Referenciaciklus (opcionális)", - "refresh_interval": "Frissítési időköz (s)", - "remaining": "Többi", - "reminder_every": "Emlékeztetés (ciklusonként)", - "remove_label": "- Távolítsa el a címkét -", - "rename_profile": "Profil átnevezése", - "replay_duration": "Visszajátszás", - "resulting_profile": "Az eredményül kapott profil", - "save_mode": "Mentés mód", - "score": "Pontszám", - "score_breakdown": "Pontszám részletezése", - "seconds_from_start": "Másodpercek az elejétől", - "select_profile": "Válassza a Profil lehetőséget", - "setting": "Beállítás", - "settings_a": "Beállítások A (jelenlegi)", - "settings_a_short": "A", - "settings_advanced": "Fejlett", - "settings_b": "Beállítások B (teszt)", - "settings_b_short": "B", - "settings_basic": "Alap", - "settings_detail_level": "Beállítások részletességi szintje", - "settings_overrides": "Beállítás-felülírások", - "show_debug": "Élő mérkőzés hibakereső kártya megjelenítése az Állapot oldalon (bizalom, kétértelműség, legjobb jelöltek)", - "show_expected": "Várható görbefedvény megjelenítése (egyező profil, narancssárga)", - "show_raw": "Nyers csatlakozó kapcsoló megjelenítése az élő teljesítménygrafikonon", - "sparkline": "Legutóbbi ciklusidőtartam-trend", - "stage2": "2. szakasz – alapvető hasonlóság", - "stage3": "3. szakasz – DTW", - "stage4": "4. szakasz – egyezés", - "status": "Állapot", - "tail_trim": "Farokszegély(ek)", - "timer_auto_pause": "Automatikus szünet", - "timer_min": "min", - "timer_msg_placeholder": "Üzenet (nem kötelező, {device}/{program}/{minutes})", - "to": "Eddig", - "ungrouped": "Csoportosítás nélkül", - "unlabelled": "Címkézetlen", - "unlabelled_paren": "(címkézetlen)", - "warp_path": "Torzítási útvonal", - "input": "Bemenet:", - "start": "Kezdés", - "end": "Vége", - "unit_s": "(s)", - "reviewed_on": "áttekintve: {date}", - "unknown": "Ismeretlen", - "quality": "Minőség", - "tags": "Címkék", - "at": "ekkor:", - "pct_match_confidence": "{pct}% egyezési bizalom", - "ha_restarted": "HA újraindult", - "from_start": "Az elejétől", - "to_end": "A végéig", - "click_to_select": "kattints a kijelöléshez", - "envelope": "Sáv", - "zoom_hint": "görgetés a nagyításhoz · dupla kattintás a visszaállításhoz", - "loading_paren": "(betöltés…)", - "time_remaining": "~{v} van hátra", - "no_duration": "nincs időtartam", - "duration_avg": "~{v} perc átlag", - "name_placeholder": "(név)", - "n_shown": ", {n} látható", - "cycles_title": "Ciklusok ({n})", - "pg_detecting": "Észlelés folyamatban", - "pg_best_marker": "Legjobb: {v}", - "pg_time_left_model": "Hátralévő idő (modell)", - "pg_time_left_model_tip": "A modell által becsült hátralévő idő (fázisbecslő + ML keverék), nem statikus visszaszámláló", - "phase": "Fázis", - "pg_mode_simulate": "Szimuláció", - "pg_mode_history": "Tesztelés előzményeken", - "pg_mode_sweep": "Pásztázás", - "pg_ev_detected": "Észlelve", - "pg_ev_match": "Egyezés véglegesítve", - "pg_ev_match_changed": "Egyezés megváltozott", - "pg_ev_ambiguous": "Bizonytalan", - "pg_ev_unmatched": "Nincs egyezés", - "pg_ev_notify_start": "Indítási értesítés", - "pg_ev_notify_pre": "Majdnem kész értesítés", - "pg_ev_notify_finish": "Befejezési értesítés", - "pg_ev_notify_milestone": "Mérföldkő értesítés", - "pg_ev_notify_held": "Értesítés visszatartva (csendes órák)", - "pg_ev_finished": "Befejezve", - "pg_ended": "Véget ért", - "pg_proj_energy": "Becs. energia", - "pg_alert_overrun": "Túlfutás", - "pg_alert_underrun": "Alulfutás", - "pg_alert_did_not_finish": "Nem fejeződött be", - "pg_alert_false_end": "Több ciklusra bomlott", - "pg_alert_unmatched": "Nincs egyezés", - "pg_alert_ambiguous": "Bizonytalan egyezés", - "pg_alert_energy": "Energiarendellenesség", - "pg_newly_correct": "most már helyes", - "pg_regressed": "romlott", - "pg_end_timing_changed": "befejezési idő megváltozott", - "pg_vs_current": "vs jelenlegi", - "pg_fixed": "javítva", - "pg_broke": "elromlott", - "pg_sweep_param": "Paraméter", - "pg_objective": "Cél", - "pg_steps": "Lépések", - "pg_stress_group": "Üresjárati leállás tesztje", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "Üresjárati szint (W)", - "pg_stress_idle_w_desc": "Felülbírálja az automatikusan észlelt készenléti teljesítmény alsó értékét (hagyja üresen az automatikus beállításhoz).", - "pg_stress_toggle": "Üresjárati leállás tesztelése", - "pg_stress_toggle_desc": "Szimulálja, hogy a készülék a felvétel befejezése után a készenléti fogyasztási szintjén marad - megmutatja, hogy és mikor állítja le a WashData a ciklust.", - "pg_sweep_2d": "2D hőtérkép", - "pg_sweep_param_y": "2. paraméter", - "pg_obj_match": "Egyezés pontossága", - "pg_obj_endtiming": "Befejezési idő pontossága", - "pg_obj_falseend": "Téves befejezések aránya", - "pg_obj_overrun": "Időtartam eltérése", - "pg_obj_ambiguity": "Bizonytalanság aránya", - "pg_best_combo": "legjobb kombináció", - "pg_mode_optimize": "Optimalizálás", - "pg_group_matching": "Programillesztés", - "pg_zoom_hint": "dupla kattintás a nagyítás visszaállításához", - "aria_playground_chart2": "Interaktív ciklusteljesítmény-grafikon: vigye rá a mutatót az idő/teljesítmény leolvasásához, görgessen a nagyításhoz, húzza az eltoláshoz", - "pg_alert_timeout_end": "Időtúllépés miatt ért véget, nem előrejelzés alapján", - "pg_alert_indefinite": "Végtelen ideig futna", - "pg_alert_stress_cap": "Elérte a biztonsági korlátot", - "pg_alert_stress_ok": "Üresjárati leállás: a ciklus megállt", - "pg_alert_stress_warn": "Üresjárati fogyasztás meghaladja a leállási küszöböt", - "task_pg_history": "Tesztelés előzményeken", - "task_pg_sweep": "Optimalizálás", - "task_reprocess": "Újrafeldolgozás", - "task_ml_training": "Tanulás", - "eta_secs": "még ~{n} mp", - "eta_mins": "még ~{n} perc", - "pg_recent_runs": "Legutóbbi futtatások", - "pg_load_run": "Futtatás újratöltése", - "pg_match_confidence": "Egyezés megbízhatósága", - "pg_envelope_fit": "Illeszkedés a burkológörbéhez", - "pg_envelope_fit_tip": "Mennyire pontosan marad a ciklus a profil mentett teljesítmény-burkológörbéjén belül, más nézőpont, mint az egyezés megbízhatósága.", - "n_imported_note": ", {n} importált", - "enable_online": "Online funkciók engedélyezése", - "store_brand": "Készülék márkája", - "store_model": "Készülék modellje", - "anonymous": "Névtelen", - "rate_quality": "Minőség értékelése", - "rate_n": "{n} csillag", - "approved_only": "Csak a jóváhagyottak", - "adopt_settings": "Beállítások átvétele is", - "flags": "Jelzők", - "include_phase_map": "Fázistérkép belefoglalása", - "include_settings": "Érzékelési és párosítási beállítások belefoglalása", - "show_contributor": "Közreműködők nevének megjelenítése", - "task_pg_detail": "Ciklus szimulálása", - "task_split": "Ciklus felosztása", - "task_trim": "Ciklus levágása", - "task_merge": "Ciklusok egyesítése", - "task_rebuild": "Burkológörbék újraépítése", - "cat_profiles": "Profilok (programok)", - "cat_real_cycles": "Ciklusok (használati előzmények)", - "cat_reference_cycles": "Referenciaciklusok (importált)", - "cat_custom_phases": "Egyéni fázisok", - "cat_profile_groups": "Profilcsoportok", - "cat_settings": "Észlelési és illesztési beállítások", - "cat_matching_config": "Illesztés finomhangolása", - "cat_ml_models": "ML-modellek", - "cat_feedback": "Visszajelzési és ellenőrzési címkék", - "cat_suggestions": "Javaslatok", - "cat_maintenance_log": "Karbantartási napló", - "cat_history_logs": "Előzmény- és változásnaplók", - "cat_lifetime_stats": "Élettartam-összesítések", - "cycles_short": "ciklus", - "import_mode": "Hogyan egyesítse", - "mode_merge": "Egyesítés (a sajátom megtartása)", - "mode_replace": "Kiválasztottak cseréje", - "cycle_destination": "Hová kerüljenek az importált ciklusok?", - "dest_reference": "Referencia (csak görbe)", - "dest_real_history": "Valós előzmények (statisztikába számít)", - "conflict_resolution": "Névütközések", - "conflict_import_copy": "Importálás másolatként", - "conflict_keep_mine": "A sajátom megtartása", - "conflict_overwrite": "Felülírás" - }, - "log": { - "all_levels": "Minden szinten", - "all_devices": "Minden eszköz", - "all_components": "Minden komponens", - "search_ph": "Keresés a naplókban…" - }, - "ml": { - "builtin_models": "● Beépített modellek használata", - "fit_fair": "Elfogadható", - "fit_good": "Jó", - "fit_slight": "Enyhe", - "fit_strong": "Erős", - "fit_weak": "Gyenge", - "fit_word": "illeszkedési minőség", - "personalized": "● Személyre szabott ehhez a géphez", - "better_than_baseline": "{pct}%-kal jobb az alap becslésnél ({metric})", - "trend_improving_tip": "Ennek a modellnek az illeszkedése javult a legutóbbi újraellenőrzések során.", - "trend_declining_tip": "Ennek a modellnek az illeszkedése romlott a legutóbbi újraellenőrzések során · több ciklus áttekintése segíthet az újratanulásban.", - "trend_steady_tip": "Ennek a modellnek az illeszkedése nagyjából változatlan maradt a legutóbbi újraellenőrzések során.", - "cap_blurb": { - "end": "Annak felismerése, hogy egy ciklus valóban befejeződött", - "live_match": "A futó program gyorsabb azonosítása", - "quality": "Tévesen észlelt vagy sérült ciklusok felismerése", - "remaining_time": "A hátralévő idő előrejelzése", - "total_energy": "A teljes energia és költség előrejelzése" - }, - "cap_label": { - "end": "Ciklus végének észlelése", - "live_match": "Programfelismerés", - "quality": "Ciklusminőség ellenőrzése", - "remaining_time": "Hátralévő idő becslése", - "total_energy": "Energiabecslés" - }, - "metric_auc": "AUC {auc} a félretett adatokon", - "metric_mae": "hiba: {model} a(z) {baseline} referenciához képest" - }, - "modal": { - "auto_label": "Automatikus címkézési ciklusok", - "correct_feedback": "Helyes visszajelzés", - "create_profile": "Profil létrehozása", - "cycle": "Ciklus", - "edit_group": "Profilcsoport szerkesztése", - "edit_phase": "Fázis szerkesztése", - "import_config": "Konfiguráció importálása", - "label_cycle": "Címkeciklus", - "merge_cycles": "Egyesítsen {n} ciklust", - "new_group": "Új profilcsoport", - "new_phase": "Új fázis", - "process_history_msg": "Futtassa újra az egyeztetést, frissítse a javaslatokat, tanítsa újra az ML-t (ha engedélyezve van) és számolja újra a ciklusok egészségét az összes tárolt cikluson. Ez eltarthat egy ideig.", - "process_history_ok": "Feldolgozás", - "process_history_title": "Előzmények feldolgozása", - "process_recording": "Folyamat rögzítése", - "delete_maintenance_msg": "Törli ezt a karbantartási bejegyzést? Ez nem vonható vissza.", - "delete_maintenance_title": "Karbantartási esemény törlése", - "relabel_cycles": "{count} ciklus átcímkézése", - "delete_automation_title": "Automatizálás törlése", - "delete_automation_msg": "Törlöd a(z) \"{name}\" automatizálást a Home Assistantból? Ez nem vonható vissza.", - "remove_legacy_title": "Régi műveletek eltávolítása", - "remove_legacy_msg": "Eltávolítod a régi egyéni műveleteket? A ciklusesemények során többé nem fognak elsülni. Ez a panelről nem vonható vissza.", - "discard_recording_title": "Felvétel eldobása", - "discard_recording_msg": "Eldobod a mentett felvételt? Ez nem vonható vissza.", - "dismiss_all_title": "Összes visszajelzés elvetése", - "dismiss_all_msg": "Elveted mind a(z) {count} függőben lévő visszajelzési kérést?", - "dismiss_all_ok": "Összes elvetése", - "delete_phase_title": "Fázis törlése", - "delete_phase_msg": "Törlöd a(z) \"{name}\" fázist?", - "clear_debug_title": "Hibakeresési adatok törlése", - "clear_debug_msg": "Törlöd az összes tárolt hibakeresési nyomvonalat?", - "wipe_all_title": "Összes adat törlése", - "wipe_all_msg": "⚠️ Ez véglegesen törli az ÖSSZES ciklust és profilt. Ez nem vonható vissza.", - "wipe_all_ok": "Minden törlése", - "force_stop_title": "Ciklus kényszerített leállítása", - "force_stop_msg": "Kényszerítve leállítod most az aktív ciklust? A ciklus megszakítottként lesz elmentve.", - "store_import": "Referenciaciklus importálása", - "store_share": "Megosztás a közösségi boltban", - "store_share_device": "Eszköz megosztása", - "export_select": "Exportálás - adatok kiválasztása", - "import_wizard": "Importálás - adatok kiválasztása" - }, - "msg": { - "appliance_monitor": "Készülék monitor", - "artifact_dip_detail": "~{n}s-re a szokásos energiasáv alá esett.", - "artifact_footer": "A fenti grafikonon kiemelve. Ezek átmeneti műtermékek (pl. a ciklus közepén kinyílt ajtó), nem feltétlenül problémák.", - "artifact_header": "{n} rendellenesség észlelve ebben a ciklusban", - "artifact_pause_detail": "A teljesítmény ~{n}s-re közel nullára esett, majd visszatért – valószínűleg kinyílt az ajtó a ciklus közben, vagy a ciklus szünetelt.", - "artifact_spike_detail": "~{n}s-re a szokásos energiasáv felett volt.", - "auto_label_intro": "Rendeljen hozzá profilokat címkézetlen ciklusokhoz, amelyek egyezési megbízhatósága törli a küszöböt.", - "automations_intro": "A WashData {start} / {end} eseményeket küld és entitásokat tesz elérhetővé, ezért az értesítések és műveletek legjobban normál Home Assistant automatizálásként építhetők fel. Az ezt az eszközt használó automatizálások alább jelennek meg.", - "cleanup_intro": "Minden címkézett ciklus átfedi. Jelölje be a kiugró értékeket, és törölje a profilt a profil megtisztításához.", - "clear_debug_hint": "Távolítsa el a tárolt hibakeresési adatokat, hogy helyet szabadítson fel.", - "collecting_data": "Adatgyűjtés folyamatban - még {need} ciklus szükséges a finomhangolás megkezdéséhez ({current}/{min}).", - "compare_overlay_profiles": "Fedőprofilok (halvány)", - "compare_profiles_tip": "Fedjen rá más profilborítékokat a fenti diagramra, hogy megtudja, melyik illik legjobban ehhez a ciklushoz.", - "compare_selected_cycles": "Kiválasztott ciklusok (folytonos) – megjelenítés/elrejtés", - "consider_new_profile": "Fontolja meg egy új profil létrehozását.", - "coverage_gap": "a legutóbbi ciklusoknak nincs megfelelő profilja (az utolsó 30 {pct}%-a).", - "coverage_gap_similar_cycles": "{count} hasonló felcímkézetlen ciklus található – hozzon létre egy profilt az egyeztetés megkezdéséhez.", - "cycles_deleted": "{count} ciklus törölve", - "enough_data": "Elegendő adat a tanuláshoz ({current}/{min} ciklus).", - "export_description": "Válaszd ki pontosan, mely profilokat, ciklusokat, beállításokat és egyebeket exportálsz JSON-ba, vagy elemezz egy fájlt, és csak a kívánt részeket importáld.", - "feedback_cycles_pending": "{n} ciklus{s} áttekintésre vár", - "feedback_prompt": "Erősítse meg, hogy helyes volt, javítsa ki a programot, vagy hagyja figyelmen kívül.", - "feedback_relabel_hint": "Ennek a ciklusnak az újracímkézése ezt is megoldja.", - "filter_by_profile": "Szűrés profil szerint…", - "group_modal_help": "Azonos alakú programok, amelyek hőmérséklete/centrifugálása különbözik (az időtartam változhat). Az egyezés pontozza a csoportot, mint egy jelöltet, majd kiválasztja a legmegfelelőbb tagot. Válasszon legalább 2-t; az átfedés megmutatja, mennyire hasonlítanak egymásra.", - "group_not_cohesive": "Ezek a profilok nem eléggé hasonlóak ahhoz, hogy megbízhatóan csoportosítsák, ezért az egyeztetés egyenként kezeli őket, amíg el nem távolítja a kiugró értéket, vagy fel nem osztja a csoportot.", - "group_preview_hint": "Jelöljön ki 2+ tagot, hogy előnézze és összehasonlítsa teljesítménygörbéiket.", - "import_intro": "Töltsön be egy exportált fájlt, vagy illesszen be egy JSON-adatot alább.", - "legacy_actions_title": "{count} örökölt egyéni művelet továbbra is fut", - "live_chart_loading": "Az élő teljesítmény diagram megjelenik a leolvasások megérkezésekor.", - "loading": "Terhelés…", - "loading_curve": "Görbe betöltése…", - "loading_settings": "Beállítások betöltése…", - "log_buffer_hint": "A legújabbak előtt · puffereli az utolsó 500 ha_washdata rekordot az újraindítás óta · húzza az alsó szélét az átméretezéshez.", - "maintenance_advisory": "A növekvő időtartam/energiafogyasztás jelezheti a készülék karbantartását (pl. vízkőmentesítés, szűrőtisztítás).", - "maintenance_due": "Esedékes karbantartás: {items}", - "maintenance_intro": "Rögzítse az ezen a készüléken végzett karbantartást, és emlékeztetőt kap, amikor egy feladat ismét esedékessé válik.", - "maintenance_load_error": "Nem sikerült betölteni a karbantartási adatokat: {error}", - "maintenance_requires_access": "A karbantartás és az export/import teljes hozzáférést igényel.", - "manual_duration_hint": "A profil átlagos/várható ciklushossza, a hátralévő idő becsléseihez használva. Szerkesztés a beállításhoz; változatlanul hagyva az aktuális értéket megtartja.", - "matching_tuning_intro": "Tanuláskor a WashData azt is beállítja, hogy a programillesztés mennyi súlyt jelent a formának az időtartamhoz és az energiához képest.", - "merge_intro": "A kiválasztott ciklusokat egyesítjük (időrendi sorrendben; 0 W-tal kitöltött hézagok). Válassza ki a kapott profilt.", - "ml_intro": "A WashData intelligens modellekkel szállítjuk, amelyek már a dobozból kivehetők.", - "ml_learned_intro": "Ehhez a géphez finomhangolt modellek.", - "ml_loading": "ML betöltése…", - "ml_settings_intro": "Két független kapcsoló: az egyik a ciklus futása közben alkalmazza a modelleket, a másik lehetővé teszi, hogy a WashData idővel finomhangolja őket a gépére.", - "name_first_program": "Elég ciklusa van – nevezze el az első programját az egyeztetés elindításához.", - "near_duplicate_cluster": "majdnem ismétlődő profilfürt észlelve. A csoportosítás lehetővé teszi, hogy a párosítás megbízhatóan válasszon a hasonlók között (pl. ugyanaz a program különböző hőmérsékleten/centrifugáláson).", - "no_cycles_match": "Egyetlen ciklus sem felel meg az aktuális szűrőnek.", - "no_cycles_profile": "Nincs ciklus ehhez a profilhoz.", - "no_cycles_selected": "Először válasszon legalább egy ciklust.", - "no_cycles_yet": "Még nem rögzítettek ciklusokat.", - "no_device_selected": "Nincs kiválasztott eszköz.", - "no_devices": "Még nincs konfigurálva WashData eszköz.", - "no_envelope": "Még nincs boríték – címkézési ciklusok után építse újra.", - "no_envelope_overlay": "Nincs boríték lefedéshez.", - "no_fine_tuned": "Még nincs finomhangolás – a WashData a beépített modelljeit használja.", - "no_logs": "Még nincsenek pufferelt naplórekordok.", - "no_maintenance": "Még nincs rögzített karbantartás.", - "no_match_yet": "Még nincs párosítási kísérlet – ez egy futási ciklus alatt töltődik fel.", - "no_other_users": "Nem található más Home Assistant felhasználó.", - "no_phases": "Nincsenek meghatározott fázisok.", - "no_phases_assigned": "Nincsenek hozzárendelve fázisok.", - "no_profiles_compare": "Nincs összehasonlítható profil.", - "no_profiles_overlay": "Nincsenek fedendő profilok.", - "no_profiles_yet": "Még nincsenek profilok. Hozzon létre egyet egy felcímkézett ciklusból.", - "no_profiles_yet_short": "Még nincsenek profilok.", - "no_settings_match": "Egy beállítás sem felel meg a következőnek: \"{q}\"", - "no_split_points": "Még nincsenek megosztott pontok.", - "no_suggestions": "Nincsenek aktív javaslatok.", - "notify_services_hint": "Használja a(z) {entity} szolgáltatásazonosítókat (több esetén vesszővel elválasztva). Sablonváltozók: {vars}.", - "old_actions_warning": "A régi műveletszerkesztővel konfigurálva (most eltávolítva). Továbbra is aktiválják a cikluseseményeket, de már nem szerkeszthetők itt. Alakítsa át őket normál automatizálássá, vagy távolítsa el őket.", - "onboarding_progress": "{n} / 3 ciklus megfigyelve", - "onboarding_watching": "Használja a készülékét a szokásos módon – a WashData figyel. 3 ciklus után elindul a programegyeztetés.", - "pending_feedback": "Függőben lévő észlelési visszajelzés", - "performance_trend": "Teljesítménytrend ({n} ciklus)", - "pg_analysis_empty": "Töltsön be egy ciklust az egyezéselemzés megtekintéséhez.", - "pg_apply_confirm": "Alkalmazza a legjobb értéket: {label} = {value}?", - "pg_canvas_empty": "Válasszon fent egy ciklust, majd nyomja meg a Betöltés gombot a teljesítménygörbéjének megtekintéséhez.", - "pg_chart_caption": "Érzékelési/egyezési arány a {param} értékei szerint", - "pg_match_rate": "{pct}% egyezési arány {total} cikluson", - "pg_restart_note": "Indítsa újra a Home Assistantot a szimulációs eszközök engedélyezéséhez.", - "pg_sim_progress": "{done} / {total} ciklus", - "pg_starting": "Indítás…", - "pg_stress_synthetic": "az üresjárati szimuláció itt kezdődik", - "pg_sweep_intro": "Mi lenne, ha a {param} más lenne? Teszteljen {steps} értéket az utolsó {cycles} cikluson, hogy megtalálja azt a beállítást, ahol a legtöbb ciklus helyesen egyezik.", - "pg_sweep_step": "{done} / {total}. lépés", - "pg_undetected": "{n} nem észlelt ciklus", - "pg_verdict_bad": "Figyelmet igényel: sok ciklus észrevétlen marad.", - "pg_verdict_good": "Jól hangolva: a legtöbb ciklust helyesen azonosítja és párosítja.", - "pg_verdict_ok": "Elfogadható: néhány ciklus kimaradt. Próbálja meg csökkenteni az indítási küszöböt.", - "phase_catalog_intro": "Egy ciklus elnevezett szegmensei (Előmosás, Fűtés, Centrifugálás…). Rendelje hozzá őket egy profilhoz a vezérlőpultjáról.", - "phase_ranges_intro": "A fázistartományok (a ciklus kezdetétől számított percek) átfedik az átlaggörbét. Szerkessze az értékeket az élő előnézethez.", - "playground_intro": "Biztonságos homokozó a korábbi ciklusok különböző beállításokkal való lejátszásához, két konfiguráció egymás melletti összehasonlításához, és annak vizsgálatához, hogyan illeszkedik egy ciklus egy profilhoz. Itt semmi sem változtatja meg az élő adatait, amíg kifejezetten nem alkalmazza.", - "playground_needs_restart": "Indítsa újra a Home Assistantot a Homokozó eszközök engedélyezéséhez.", - "preferences_admin": "Beállítások, panel és hozzáférés-vezérlés", - "preferences_adv": "Preferenciák", - "prefs_personal": "Ezek csak a Home Assistant-fiókra vonatkoznak.", - "process_history_hint": "Futtassa újra az egyeztetést az összes tárolt cikluson, frissítse a hangolási javaslatokat, tanítsa újra az ML modelleket (ha engedélyezve van) és számolja újra a ciklusok egészségét. Futtassa ezt egy áttekintési köteg után.", - "profile_deleted": "Profil törölve", - "profile_poor_health_detail": "Az ehhez a profilhoz rendelt ciklusok alakja inkonzisztens vagy alacsony a megbízhatóságuk. Fontolja meg a boríték újjáépítését vagy a címkézett ciklusok áttekintését.", - "profiles_intro": "Kattintson egy profilra a statisztikák, fázisok és tisztítás megtekintéséhez. Csoportosítsa a közel azonos programokat (azonos forma/időtartam, eltérő hőmérséklet vagy centrifugálás), így az illesztés megbízhatóan kiválasztja őket.", - "rbac_hint": "Ha ki van kapcsolva, minden Home Assistant felhasználó teljes hozzáféréssel rendelkezik (alapértelmezett). A rendszergazdák mindig teljes hozzáféréssel rendelkeznek, és mindenkit kezelhetnek.", - "recent_logs": "Legutóbbi ha_washdata rekordok", - "recording_in_progress": "Felvétel folyamatban", - "reminders_intro": "Emlékeztető megjelenítése a panelen ennyi ciklussal az utolsó szerviz után. Hagyja üresen vagy 0-ra az emlékeztető kikapcsolásához.", - "restart_gap_footer": "Kiemelve a grafikonon. A teljesítményadatok hiányoznak ezekre az intervallumokra; az egyeztetés csak valós méréseket használt.", - "restart_gap_header": "{n} HA-újraindítás-rés ezen ciklus alatt", - "restart_gap_item": "{dur} rés", - "review_confirm_help": "Ellenőrizze, hogy ezt a ciklust megfelelően észlelték-e. Az Ön véleménye megtanítja a modellt a gépén – minél több ciklust erősít meg, annál jobb lesz az egyezés és az állapotpontozás. Elég egy gyors Jó/Rossz.", - "review_in_settings": "Tekintse át a Beállításokban", - "review_notes_placeholder": "Megjegyzések (opcionális)", - "review_notes_tip": "Szabad szövegű jegyzetek saját referenciaként. Nem használtak párosításhoz vagy edzéshez.", - "review_profile_tip": "A program ezt a ciklust címkével látja el. Ha az automatikusan észlelt program hibás volt, javítsa ki itt – a címkézés megtanítja a jövőbeli ciklusokhoz való illeszkedést.", - "review_quality_tip": "Milyen tiszta ez a ciklus. Jó = a program tankönyvi példája; Rossz = észlelt, de zajos vagy atipikus; Használhatatlan = rosszul észlelt (egyesített, csonkolt vagy hamis). Megadja az állapotpontszámot és azt, hogy mely ciklusok engedélyezettek a modell betanításához.", - "review_recorded_tip": "Jelölje meg ezt a programhoz tartozó, kézzel kiválasztott referenciaciklusként – ugyanaz a szerep, mint egy kézzel rögzített ciklus. A referenciaciklusokat mindig megőrizzük, a megfelelő sablont vetjük be, és soha nem vetik el őket a tisztítás során. (Ez az \"arany\"/rekord zászló; mindkettő ugyanaz.)", - "review_tags_tip": "Opcionális jelzők, amelyek leírják, hogy mi hibázott ebben a ciklusban, így a képzés és a tisztítás megmagyarázhatja.", - "review_to_cycles": "Nyissa meg a Ciklusok áttekintési sort", - "saving_triggers_reload": "A mentés az integráció újratöltését indítja el. A HA entitások rövid időre elérhetetlenként jelenhetnek meg.", - "search_placeholder": "Keresési beállítások…", - "see_recorder": "Lásd alább a felvevő widgetet", - "setting_changed": "Módosítva: {old} → {new} ekkor: {date}", - "settings_basic_note": "Az alapvető beállítások láthatók. Váltson Fejlett nézetre a teljes listához.", - "shape_drift_advisory": "⚠ Alakváltás", - "shape_drift_detail": "Ennek a profilnak a teljesítménymintázata idővel megváltozott – lehetséges készülékhasználat okozta kopás vagy szükséges karbantartás (pl. vízkőmentesítés, szűrőtisztítás).", - "show_all_settings": "Minden beállítás megjelenítése", - "showing_suggestions": "{count} beállítás megjelenítése javaslatokkal.", - "split_intro": "Kattintson a diagramra egy osztási pont hozzáadásához vagy eltávolításához, vagy az üresjárati hézagok automatikus észleléséhez. Minden eredményül kapott szegmens saját profilt kaphat.", - "storage_diagnostics": "Tárolási statisztikák, karbantartás, export/import", - "sug_staged": "{key} = {val} beállítva. Mentse el az alkalmazáshoz.", - "toast_auto_detect_enabled": "Automatikus felismerés engedélyezve", - "toast_auto_label_complete": "Automatikus jelölés kész", - "toast_auto_label_failed": "Automatikus jelölés sikertelen: {error}", - "toast_automation_failed": "Nem sikerült automatizálást létrehozni: {error}", - "toast_automation_migrated": "Műveletek áttelepítve automatizálásba; megnyílik a szerkesztő", - "toast_convert_failed": "Átalakítás sikertelen: {error}", - "toast_create_failed": "Létrehozás sikertelen: {error}", - "toast_delete_failed": "Törlés sikertelen: {error}", - "toast_error": "Hiba: {error}", - "toast_failed": "Sikertelen: {error}", - "toast_force_stop_failed": "Kényszer leállítás sikertelen: {error}", - "toast_name_required": "Név megadása kötelező", - "toast_no_automation": "Itt nem lehet automatizálást létrehozni", - "toast_profile_name_required": "A profil neve kötelező", - "toast_program_set": "Program beállítva: {program}", - "toast_rebuild_failed": "Újraépítés sikertelen: {error}", - "toast_resume_failed": "Folytatás sikertelen: {error}", - "toast_revert_failed": "Visszaállítás sikertelen: {error}", - "toast_reverted": "{key} visszaállítva", - "toast_save_failed": "Mentés sikertelen: {error}", - "trend_duration_longer": "Az időtartam egyre hosszabb ({pct}%/ciklus) – legutóbbi átlag: {avg}", - "trend_duration_shorter": "Az időtartam egyre rövidebb ({pct}%/ciklus) – legutóbbi átlag: {avg}", - "trend_energy_down": "Az energia csökkenő tendenciája ({pct}%/ciklus)", - "trend_energy_up": "Emelkedő energiatrend ({pct}%/ciklus) – legutóbbi átlag {avg}", - "trim_intro": "Húzza el a piros fogantyúkat, vagy írjon be értékeket. Az ablakon kívül mindent eltávolítanak.", - "tuning_suggestions_available": "{count} hangolási javaslat érhető el a megfigyelt ciklusokból. A megfelelő mezők mellett jelennek meg.", - "unsure_detected_prefix": "A WashData nem biztos abban, hogy észlelte", - "updated": "Frissítve", - "warmup_badge": "Még tanul ({done}/{needed} ciklus)", - "warmup_detail": "Ez a profil {needed} felcímkézett ciklust igényel, mielőtt az automatikus egyeztetés megkezdődik. Minden megerősített ciklus segít tanulni.", - "wipe_history_warning": "Véglegesen törölje az összes ciklust és profilt. Nem vonható vissza.", - "compare_overlay_tip": "Rárajzolt tanult profilsávok, hogy lásd, melyik programra hasonlít az egyes ciklusok.", - "duration_trend_up_tip": "Időtartam nő ({pct}%/ciklus)", - "duration_trend_down_tip": "Időtartam csökken ({pct}%/ciklus)", - "energy_trend_up_tip": "Energia nő ({pct}%/ciklus)", - "energy_trend_down_tip": "Energia csökken ({pct}%/ciklus)", - "performance_trending": "Teljesítmény tendenciát mutat", - "pg_select_cycle_hint": "Jelölj ki egy ciklust, majd kattints a ↺ gombra a betöltéshez", - "pg_sweep_progress": "{done}. / {total}. lépés", - "pg_analysis_hint": "Jelölj ki egy ciklust, majd kattints a ↺ gombra az elemzés betöltéséhez.", - "diagnostics_load_failed": "Nem sikerült betölteni a diagnosztikát: {error}", - "manual_duration_ref_hint": "Csak akkor használatos, ha nincs kiválasztva referenciaciklus. A referenciaciklus a saját hossza alapján állítja be az időtartamot.", - "toast_convert_rolled_back": "Az átalakítás sikertelen volt, és visszavonásra került (nem maradt automatizálás): {error}", - "toast_convert_orphan": "Az automatizálás létrejött, de a régi műveletek törlése sikertelen volt. Ne próbálja újra: távolítsa el a régi műveleteket kézzel a duplikált automatizálás elkerülése érdekében.", - "advisory_duration_trend_up": "A(z) '{name}' ciklusai fokozatosan hosszabbak (ciklusonként kb. +{pct}%). Ha a készülék működése megváltozott, rögzítse újra vagy építse újra ezt a profilt.", - "advisory_energy_trend_up": "A(z) '{name}' fokozatosan több energiát fogyaszt (ciklusonként kb. +{pct}%) - érdemes ellenőrizni a készüléket, ha ez váratlan.", - "advisory_poor_health": "A(z) '{name}' illeszkedési pontszáma alacsony - a közelmúltbeli ciklusai erősen ingadoznak vagy gyengén illeszkednek. Nézze át a ciklusait, vagy rögzítse újra a profilt, hogy a felismerés és az időbecslés pontos maradjon.", - "advisory_shape_drift": "A(z) '{name}' jelentősen eltért az eredeti teljesítménygörbéjétől. A készülék működése idővel megváltozhatott (pl. vízkő, kopás). Fontolja meg a profil újrarögzítését a közelmúltbeli ciklusokkal.", - "advisory_shape_drift_corr": "A(z) '{name}' jelentősen eltért az eredeti teljesítménygörbéjétől (korreláció: {corr}). A készülék működése idővel megváltozhatott (pl. vízkő, kopás). Fontolja meg a profil újrarögzítését a közelmúltbeli ciklusokkal.", - "pg_no_alerts": "Ebben a futásban nem észlelt problémát.", - "pg_override_active": "A szerkesztett beállításait használja a jelenlegiekhez képest", - "pg_history_intro": "Játssza le legutóbbi ciklusait a valódi érzékelőn és illesztőn keresztül. Először szerkesszen egy érzékelési beállítást a Szimuláció módban, hogy itt egy előtte/utána összehasonlítást lásson.", - "pg_history_empty": "Nyomja meg a Futtatás gombot a ciklusai lejátszásához.", - "pg_history_summary": "{detected}/{total} észlelve · {correct} helyesen illesztve", - "pg_sweep_no_metric": "Nincs elég adat ennek a célnak az értékeléséhez.", - "pg_sweep_intro2": "Keresse meg azt a beállítást, amely a legjobban teljesíti a célt a legutóbbi ciklusaiban. Semmi sem változik, amíg nem alkalmazza.", - "pg_running_history": "Ciklusaid visszajátszása…", - "pg_running_sweep": "Értékek tesztelése az összes ciklusodon…", - "pg_row_load_hint": "Ciklus betöltése a fenti grafikonba", - "pg_history_intro2": "Játszd vissza a legutóbbi ciklusaidat a valódi érzékelőn és illesztőn keresztül a fenti beállításokkal. Kattints bármely sorra a ciklus grafikonba töltéséhez; módosíts egy beállítást az előtte/utána összehasonlításhoz.", - "pg_simulating": "Ciklus szimulálása…", - "pg_canvas_empty2": "Válassz ki egy ciklust fent, és nyomd meg a Futtatás gombot a szimulációhoz. Ezután vidd rá a mutatót az értékek leolvasásához, görgess a nagyításhoz, és húzd az eltoláshoz.", - "pg_apply_settings_confirm": "Elmenti ezt a(z) {n} beállítást erre az eszközre? {list}", - "pg_stress_terminated_detail": "Körülbelül {idle} W üresjárati szinten állandósult -- a ciklus {h} ó {m} p múlva {reason} révén ért véget.", - "pg_stress_above_threshold_detail": "Az üresjárati fogyasztás (kb. {idle} W) eléri vagy meghaladja a tényleges leállási küszöböt ({stop} W) -- a ciklust soha nem érzékelte csendesnek. A javításhoz növelje a stop_threshold_w értékét.", - "pg_stress_hit_cap_detail": "A ciklus {h} ó {m} p futott leállás nélkül -- a biztonsági korlát kényszerítette leállásra. Üresjárati fogyasztás {idle} W a(z) {stop} W leállási küszöbhöz képest.", - "no_logs_match": "Egyetlen naplóbejegyzés sem felel meg ezeknek a szűrőknek.", - "pg_analysis_hint2": "Válasszon egy ciklust, és nyomja meg a Futtatás gombot az egyezéselemzés betöltéséhez.", - "pg_analysis_empty2": "Nyomja meg a Futtatás gombot az egyezéselemzés megtekintéséhez.", - "imported_readonly": "A közösségi boltból importálva. Referenciaként és egyeztetéshez jelenik meg. Nem számít bele a statisztikákba, és nem szerkeszthető.", - "merge_no_imports": "Az importált felvételek nem egyesíthetők valódi ciklussal. Az egyesítéshez szüntesse meg a kijelölésüket.", - "store_enable_hint": "A közösségi referenciaciklusok böngészéséhez és importálásához engedélyezze az online funkciókat a Beállításokban.", - "online_intro": "Ossza meg és töltsön le referenciaciklusokat más WashData-felhasználókkal. Minden online funkció opcionális és alapértelmezés szerint ki van kapcsolva.", - "store_share_intro": "Töltse fel ezt a referenciaciklust, hogy az azonos készülékkel rendelkezők is használhassák. Nyilvános megjelenés előtt ellenőrzésre kerül.", - "online_intro_global": "Böngésszen és osszon meg referenciafelvételeket más WashData-felhasználókkal, és erősítsen meg készülékbejegyzéseket. Egyetlen kapcsolat a teljes WashData-integrációra vonatkozik; a készülék márkája és modellje eszközönként, az Alapkonfiguráció szakaszban állítható be. Minden online funkció opcionális és alapértelmezés szerint ki van kapcsolva.", - "online_unavailable": "Az online funkciók nem érhetők el ezen a szerveren.", - "store_picker_offline": "A közösségi katalógusból való választáshoz engedélyezze az online funkciókat a beállítások fogaskerekénél.", - "pick_brand_first": "Először válasszon készülékmárkát.", - "model_not_found": "Még nincs a katalógusban.", - "connect_to_confirm": "A megerősítéshez vagy értékeléshez csatlakozzon a beállítások fogaskerekénél.", - "adopt_settings_hint": "Felülírja az eszköz érzékelési és párosítási küszöbeit a megosztottakkal. Az értesítések, entitások és energiaár soha nem változnak.", - "include_settings_hint": "Ossza meg az eszköz felismerési és párosítási küszöbeit (nem az értesítéseit, entitásait vagy energiaárát). Az átvevők döntik el, hogy alkalmazzák-e.", - "onboard_download": "Új eszköz? Vegyen át egy kész beállítást (programok, referenciaciklusok és fázisok) egy másik WashData-felhasználótól, akinek ugyanolyan készüléke van.", - "share_consent": "Megerősítem, hogy ezek a ciklusok normálisan, megszakítás nélkül fejeződtek be", - "share_device_none": "Még nincsenek megosztható ciklusok. Először jelöljön meg egy rögzített vagy kézzel kiválasztott ciklust referenciaciklusként (⭐) a Ciklusok lapon.", - "share_guideline_naming": "Minden profilt pontosan úgy nevezzen el, ahogy a készülék tárcsáján vagy kijelzőjén megjelenik (pl. 'Cotton 40', 'Eco 60').", - "share_guideline_quality": "Csak normálisan befejezett ciklusokat osszon meg -- sem ciklus közbeni megszakítás, sem ajtónyitás, sem teljesítményhiba.", - "share_guideline_review": "A feltöltés függőben indul, és akkor válik nyilvánossá, ha elegendő közösségi tag megerősíti.", - "share_guidelines_title": "Megosztás előtt", - "store_download_device_intro": "Vegyen át minden megosztott programot és annak referenciaciklusait az eszközére. A saját rögzített ciklusait és statisztikáit nem érinti.", - "store_share_device_intro": "Töltse fel a(z) {brand} {model} eszközt a kiválasztott referenciaciklusokkal. Más, ugyanolyan készülékkel rendelkezők átvehetik programjait. A bejegyzések felülvizsgálatra kerülnek nyilvánossá válás előtt.", - "share_profile_no_cycles": "Nincsenek referenciaciklusok -- jelöljön meg egy ciklust ⭐-gal a Ciklusok lapon, hogy belefoglalhassa ezt a profilt", - "advisory_phase_inconsistent": "Úgy tűnik, hogy a(z) '{name}' különböző programokat vagy hőmérsékleteket kever - ciklusai nagyon eltérő ideig fűtenek. Ha külön profilokra bontja (pl. hőmérsékletenként), az javítja a párosítást és az időbecsléseket.", - "advisory_phase_inconsistent_title": "⚠ Esetleg kevert programok", - "export_select_intro": "Jelöld be pontosan, mit szeretnél belefoglalni. Ha a profilokat a ciklusaik nélkül választod ki, akkor is felismerhető program exportálódik (a megtanult görbéje vele utazik).", - "import_analyze_hint": "Tölts be egy exportált fájlt (vagy illeszd be a JSON-ját). A WashData elemzi, és pontosan megmutatja, mi importálható, mielőtt bármi megváltozna.", - "analyzing": "Elemzés…", - "device_type_mismatch_warn": "Ez az export egy másik készüléktípusból származik ({src} vs {local}). A programok és ciklusok továbbra is importálhatók referenciaadatként, de a készülékspecifikus beállítások és a valós előzmények importálása le van tiltva.", - "merge_hint": "Az importált elemek hozzáadódnak; semmi helyi adat nem vész el. A névütközéseket alább oldhatod fel.", - "replace_warn": "Minden bejelölt kategória törlődik, és a fájlból cserélődik le. A be nem jelölt kategóriák érintetlenül maradnak.", - "dest_reference_hint": "Az importált ciklusok csak a programfelismerést javítják, és soha nem befolyásolják a használati/energia-statisztikákat.", - "dest_real_history_hint": "Az importált ciklusok ennek a készüléknek a saját előzményeiként számítanak, és az energia-/használati statisztikákat táplálják. Egy készülék új telepítésre költöztetéséhez használd." - }, - "phase_desc": { - "anti_crease": "Alkalmankénti rövid bukdácsolás a befejezés után a ráncok csökkentése érdekében.", - "anti_wrinkle": "Időszakos ciklus utáni zuhanás a ráncok csökkentése érdekében.", - "cool_down": "Zuhanás hő nélkül a ciklus vége felé.", - "drain_and_switch": "Átmeneti időszak a mosásból a szárítási módba.", - "dry": "Szárítási szakasz fűtőberendezéssel és/vagy maradékhővel.", - "drying": "Fő fűtött bukfencezési időszak.", - "heat_up": "A fűtőelem kezdeti bemelegítése a teljes szárítás megkezdése előtt.", - "pre_rinse": "Első lepermetezés a mosószeres mosás előtt.", - "pre_wash": "Első áztatás vagy előkezelés a főmosás előtt.", - "rinse": "Tiszta vizes öblítési szakasz. Ez a fázis többször is megismétlődhet.", - "sanitize": "Magas hőmérsékletű tisztítási szakasz fertőtlenítési programokhoz.", - "sensor_check": "Rövid kis fogyasztású szünet a szárazság mérése közben.", - "soak": "Alacsony aktivitású áztatási időszak az aktív mosási szakaszok között.", - "soak_dw": "Meghosszabbított áztatási időszak nehéz talajokhoz.", - "spin": "Nagy sebességű elszívás a víz eltávolításához a rakományból.", - "spin_wd": "Nagy sebességű extrakció a szárítási átmenet előtt.", - "wash": "Fő mosási ciklus dobmozgással és opcionális fűtéssel.", - "wash_dw": "Főmosószeres mosás melegítéssel." - }, - "placeholder": { - "add": "hozzáadás…", - "group_name": "pl. Pamut 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "értesítési szolgáltatás hozzáadása…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "személy hozzáadása…", - "phase_name": "pl. Előmosás", - "profile_name": "pl. Pamut 40°C", - "maintenance_notes": "pl. szűrő cserélve, ajtótömítés tisztítva", - "store_brand": "pl. Bosch", - "store_model": "pl. WAT28401" - }, - "pref": { - "date_absolute": "Abszolút (pl. július 2-án 14:32)", - "date_relative": "Rokon (pl. 2 órája)", - "lang_auto": "Rendszer alapértelmezett ({lang})", - "lang_en": "Angol", - "use_panel_default": "(panel alapértelmezett)" - }, - "quality": { - "bad": "Rossz", - "good": "Jó", - "unusable": "Használhatatlan" - }, - "section": { - "anti_wrinkle": { - "intro": "A ránctalanító/gyűrőtlenítő mód alacsony teljesítményű dobpulzusokat érzékel a főfázis után, és a befejezett ciklushoz csatolja őket.", - "label": "Ránctalanítás" - }, - "basic": { - "intro": "Az alap azonosítás és a legtöbb beállítás számára szükséges alapok.", - "label": "Alapok" - }, - "delay": { - "intro": "A késleltetett indítás érzékelése azonosítja, amikor egy eszköz be van kapcsolva, de még nem kezdte el a ciklust.", - "label": "Késleltetett indítás" - }, - "detection": { - "intro": "Hogyan érzékeli a rendszer a ciklust indítottnak, futónak és befejezettnek.", - "label": "Érzékelés" - }, - "matching": { - "intro": "Hogyan párosítják a befejezett ciklusokat a tanult profilokkal és jelölik meg őket.", - "label": "Párosítás" - }, - "ml_training": { - "intro": "Az eszközön végzett gépi tanulás újratanítási ütemezése és adatbeállításai.", - "label": "ML tanítás" - }, - "notifications": { - "intro": "Mikor és hogyan kap értesítést a cikluseseményekről.", - "label": "Értesítések" - }, - "timing": { - "intro": "Háttérkadencia, az offline felügyelet és a karbantartás.", - "label": "Időzítés és felügyelet" - }, - "triggers": { - "intro": "Opcionális külső jelek: záró trigger, ajtóérzékelő, szünetkapcsoló és a kirakodási emlékeztető.", - "label": "Triggerek és ajtók" - }, - "phase_eta": { - "label": "Hátralévő idő", - "intro": "Fázistudatos hátralévő idő olyan gépekhez, amelyek ciklushossza a hőmérséklettől vagy a centrifugálástól függ." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "Ismerje fel a szárítógép által a fő fűtési fázis után kibocsátott rövid, kis teljesítményű szárítópulzusokat, és tartsa őket a kész ciklushoz kapcsolva, ahelyett, hogy új ciklusként olvasná őket.", - "label": "Ránctalanítás érzékelés engedélyezése" - }, - "anti_wrinkle_exit_power": { - "doc": "A teljesítménynek ez alá kell csökkennie az impulzusok között, hogy a ránctalanító üzemmód aktív maradjon.", - "label": "Kilépési teljesítmény küszöb" - }, - "anti_wrinkle_idle_timeout": { - "doc": "Meddig maradhat a gép csendben két szárítópulzus között, mielőtt a ránctalanító üzemmód véget ér. Állítsa hosszabbra, mint a leghosszabb szünet, amit a szárítógép a pulzusok között hagy, különben minden későbbi pulzus téves indításként lesz értelmezve.", - "label": "Max. impulzusszünet" - }, - "anti_wrinkle_max_duration": { - "doc": "Az ennél hosszabb impulzusokat valódi ciklusnak tekintik, nem pedig ránctalanítónak.", - "label": "Max. időtartam" - }, - "anti_wrinkle_max_power": { - "doc": "Az ezen az erőn felüli impulzus valódi új ciklusként kezelendő, nem ránctalanító zuhanásként. Állítsa közvetlenül az impulzusteljesítmény fölé.", - "label": "Max. ránctalanítási teljesítmény" - }, - "auto_label_confidence": { - "doc": "Ha a ciklus végén az egyezési pontszám e felett van, akkor a program automatikusan, minden megerősítés nélkül felcímkézik. Emelje fel, hogy nagyobb biztonságot igényeljen az automatikus címkézés előtt; csökkentse az automatizálás érdekében. Az alatta lévő Learning Confidence funkcióval együtt működik.", - "label": "Automatikus jelölési megbízhatóság" - }, - "auto_maintenance": { - "doc": "Futtasson éjszakai takarítást: újjáépítse a profilborítékokat, újraszámolja a ciklus állapotát, törölje a hibakeresési nyomokat és őrizze meg a legutóbbi ciklusokat.", - "label": "Automatikus karbantartás (éjszakai tisztítás)" - }, - "completion_min_seconds": { - "doc": "Az ennél rövidebb ciklusokat a rendszer szellemciklusként elveti (próbafutások, az ajtó kinyitása zokni hozzáadásához).", - "label": "Min. ciklusidőtartam" - }, - "delay_confirm_seconds": { - "doc": "A tápfeszültségnek ennyi ideig a készenléti sávban kell maradnia, mielőtt a készüléket indításra várónak tekintik, nem pedig működésre.", - "label": "Megerősítési másodpercek" - }, - "delay_start_detect_enabled": { - "doc": "Érzékeli, ha a készülék be van kapcsolva, és vár (késleltetett indítás / készenlét), de még nem kezdte meg a ciklusát, így a készenléti húzást nem tévesztik össze egy futó ciklussal.", - "label": "Késleltetett indítás érzékelés engedélyezése" - }, - "delay_timeout_hours": { - "doc": "Hagyja abba a várakozást a késleltetett indítási módban ennyi óra elteltével, és térjen vissza üresjáratba, így a gép, amelyet áram alatt hagytak, de nem indult el, nem vár örökké.", - "label": "Időtúllépési órák" - }, - "device_type": { - "doc": "Készülék osztály. Beállítja az ésszerű észlelési alapértékeket (küszöbértékek, kikapcsolási késleltetés, végkezelés) az adott készüléktípushoz hangolva; csak akkor módosítsa, ha az eszközt eredetileg rossz típusként állította be.", - "label": "Eszköz típusa" - }, - "door_sensor_entity": { - "doc": "Opcionális ajtó bináris érzékelő. Annak érzékelésére szolgál, ha a készüléket egy ciklus után kinyitották/kirakták.", - "label": "Ajtóérzékelő entitás" - }, - "duration_tolerance": { - "doc": "Tolerancia a hátralévő időre vonatkozó becslésekhez (visszajelzés tanulás, nem egyeztetés). Ha a tényleges időtartam a becsült +/-X%-on belül van, az jó egyezésnek számít.", - "label": "Becslési tolerancia" - }, - "enable_ml_models": { - "doc": "Amíg a ciklus fut, hagyja, hogy a modellek finomítsák az élő eredményeket: egyenletesebb hátralévő idő és energia/költségbecslés, valamint idő előtti leállás elleni védelem a végérzékelésnél (csak késleltetheti a befejezést, soha nem fejezheti be korábban, és korlátos). Az Ön finomhangolt modelljeit használja, ha rendelkezésre állnak, ellenkező esetben a beépített modelleket. Ki = csak a klasszikus teljesítményalapú logika (még mindig megbízható).", - "label": "Intelligens modellek alkalmazása ciklus közben" - }, - "end_energy_threshold": { - "doc": "A kikapcsolási késleltetés visszaszámlálása során a felhalmozott energia (watt x idő) ehhez a küszöbértékhez kerül összehasonlításra. Ha túllépi, a visszaszámlálás újraindul – a gyűrődésgátló szárak és a mosogatógépes szárítószárak a ciklushoz rögzítve maradnak, ahelyett, hogy rövidre vágnák őket. Emelje fel, ha a ciklusok túl korán érnek véget a lehűlés során; csökkentse, ha az észlelés lassú.", - "label": "Záró energia" - }, - "end_repeat_count": { - "doc": "Az egymást követő leállási küszöbérték alatti leolvasások száma a ciklus vége előtt. Az 1 megfelelő a legtöbb csatlakozóhoz. Emelje 2-3-ra, ha az intelligens csatlakozó időnként hamis nullát jelez a ciklus közepén, és a ciklusok idő előtt véget érnek.", - "label": "Záró ismétlések száma" - }, - "energy_price_entity": { - "doc": "Érzékelő az aktuális elektromos áram kWh-nkénti árával (pl. dinamikus tarifa). Elsőbbséget élvez az alábbi statikus árral szemben. Minden ciklus lefagyasztja az árat, amikor befejeződött.", - "label": "Energiaár entitás" - }, - "energy_price_static": { - "doc": "Rögzített kWh-nkénti ár a költségadatokhoz használatos, ha nincs fent beállítva élő ár entitás.", - "label": "Statikus energiaár (kWh-nként)" - }, - "energy_sensor": { - "doc": "Opcionális kumulatív energiaszámláló (total_increasing kWh/Wh, pl. a konnektor saját élettartam-mérője). Ha be van állítva, minden ciklus jelentett energiája ennek a számlálónak a kezdő- és záróértéke közötti különbségéből származik, ami elkerüli azt az alulmérést, amit egy lassan jelentő teljesítményérzékelő integrálásából kapna. Visszavált az integrált értékre, ha a leolvasás hiányzik, mértékegysége ismeretlen, vagy a különbség nem pozitív. Hagyja üresen, hogy továbbra is a teljesítményérzékelőt integrálja.", - "label": "Energiamérő entitás" - }, - "expose_debug_entities": { - "doc": "Extra diagnosztikai HA entitások közzététele (egyezési megbízhatóság, kétértelműség, belső állapot). Az Off (Kikapcsolva) funkció tisztán tartja az entitáslistát normál használathoz.", - "label": "Hibakeresési entitások közzététele" - }, - "external_end_trigger": { - "doc": "Bináris érzékelő, amelynek állapotváltozása jelzi a ciklus végét (pl. egy készülék „kész” érintkezője vagy egy társintegráció).", - "label": "Külső trigger entitás" - }, - "external_end_trigger_enabled": { - "doc": "Hagyja, hogy egy külső bináris érzékelő jelezze a ciklus végét, a beépített energiaalapú érzékelés mellett.", - "label": "Külső záró trigger engedélyezése" - }, - "external_end_trigger_inverted": { - "doc": "A kioldó érzékelő kikapcsolását (nem BE) tekintse a ciklus végének jeleként.", - "label": "Külső trigger invertálása (trigger KI-re)" - }, - "learning_confidence": { - "doc": "Ha a találati pontszám e és az automatikus címke megbízhatósága közé esik, egy visszajelzési értesítés kéri, hogy ellenőrizze az azonosított programot. Ez alatt a pontszám alatt a mérkőzés túl bizonytalan ahhoz, hogy felszínre kerüljön. Az automatikus címke megbízhatósága alatt kell tartani.", - "label": "Tanulási megbízhatóság" - }, - "linked_device": { - "doc": "Opcionálisan beágyazza ezt a WashData-eszközt egy másik eszköz (például az intelligens csatlakozó) alá a HA-eszköz-nyilvántartásban, amely a „Csatlakozva…” jelzéssel jelenik meg.", - "label": "Csoportosítás eszköz alá" - }, - "min_off_gap": { - "doc": "Ha a gép ennél az időnél rövidebb ideig kapcsol ki, a be-/ki/bekapcsolás sorozatot egy folyamatos ciklusnak tekinti. Megakadályozza, hogy az áztatási programok (a mosás közben néhány percre kikapcsol) ne oszlanak fel két külön ciklusra. Állítsa rövidebbre, mint az egymás melletti terhelések közötti hézag, ha azt szeretné, hogy azokat külön ciklusnak számítsa. Az eszköztípus alapértelmezett beállításai védik az egyes készülékek tipikus cikluson belüli szünetét.", - "label": "Min. kikapcsolási rés" - }, - "min_power": { - "doc": "Aktívnak tekintett abszolút minimális teljesítmény. Az ez alatti értékeket a rendszer 0 W-nak (készenléti) tekinti, kiszűrve az intelligens csatlakozók és a készenléti LED-ek fantomterhelését.", - "label": "Minimális teljesítmény" - }, - "ml_training_enabled": { - "doc": "Rendszeresen tanulmányozza az áttekintett ciklusokat egyik napról a másikra, és finomítsa a modelleket ehhez a géphez. A változás csak akkor marad meg, ha valóban jobb eredményt ér el a kitartott ciklusokon, tehát ez csak segíthet, vagy változatlan marad – soha ne regresszió.", - "label": "Tanulás erről a gépről" - }, - "ml_training_hour": { - "doc": "Helyi napszak (0-23) az éjszakai finomhangolás elvégzéséhez. Válasszon egy csendes órát, például 2 (02:00).", - "label": "Tanulás ennyi órakor" - }, - "ml_training_interval_days": { - "doc": "Ennyi napon belül legfeljebb egyszer ellenőrizze a fejlesztéseket.", - "label": "Legfeljebb ennyi naponta ellenőrizve" - }, - "ml_training_min_cycles": { - "doc": "A finomhangolás előtt várja meg, amíg legalább ennyi ciklus rögzítésre kerül, hogy legyen miből tanulni.", - "label": "Előbb ennyi ciklus szükséges" - }, - "name": { - "doc": "A HA integrációs listában és az eszköznyilvántartásban látható megjelenített név.", - "label": "Eszköz neve" - }, - "no_update_active_timeout": { - "doc": "Ha futás közben ilyen sokáig nem érkezik tápellátás-frissítés, tegyük fel, hogy a csatlakozó leesett offline állapotban, és kényszerítse a leállítást, hogy elkerülje a zombi ciklust. Az alapértelmezett 600 s felhő- vagy hálókésést tesz lehetővé.", - "label": "Frissítés nélküli időtúllépés" - }, - "notify_before_end_minutes": { - "doc": "Ha a becsült hátralévő idő e alá esik, küldjön egy majdnem kész figyelmeztetést. 0 letiltja.", - "label": "Befejezés előtti riasztás" - }, - "notify_channel": { - "doc": "Android értesítési csatorna neve kezdő/élő üzenetekhez (csatornánként szabályozza a hangot és a prioritást a mobilalkalmazásban). Az üres a kísérőalkalmazás alapértelmezését használja.", - "label": "Android csatorna (indítás/élő)" - }, - "notify_cycle_timers": { - "doc": "Értesítések a ciklus adott perceiben (például lágyító hozzáadása esetén). Az üzenet támogatja a következőt: {device}, {program}, {minutes}. Engedélyezze az Automatikus szünetet, hogy szüneteljen az adott ponton, és interaktív értesítést kapjon a Folytatás gombbal; folytatás a panelen, a szüneteltetési/folytatási szolgáltatáson vagy az értesítési műveleten keresztül.", - "label": "Ciklus időzítők" - }, - "notify_finish_channel": { - "doc": "Android értesítési csatorna neve a befejező üzenethez. Üres újra felhasználja a kezdő/élő csatornát.", - "label": "Android csatorna (befejezés)" - }, - "notify_finish_message": { - "doc": "A ciklus befejezésekor elküldött üzenettörzs. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. Itt a {time_finished} és a {vs_typical} a leghasznosabbak.", - "label": "Befejezési üzenet" - }, - "notify_finish_services": { - "doc": "notify.* szolgáltatások hívják meg a ciklus végén. Adjon hozzá egyet célonként; hagyja üresen, hogy ne legyen befejezésért értesítés.", - "label": "Befejezési szolgáltatások" - }, - "notify_fire_events": { - "doc": "A ha_washdata_* eseményeket is aktiválja a ciklus indításakor/befejezésekor, így megépítheti saját automatikáját.", - "label": "HA események aktiválása értesítésekhez" - }, - "notify_icon": { - "doc": "Opcionális mdi ikon az értesítéshez (pl. mdi:mosógép). Hagyja üresen a platform alapértelmezett beállításához.", - "label": "Értesítés ikonja" - }, - "notify_live_chronometer": { - "doc": "Statikus becslés helyett élőben frissített visszaszámláló megjelenítése az értesítésben (az ezt támogató platformokon).", - "label": "Élő kronométer használata" - }, - "notify_live_interval_seconds": { - "doc": "Milyen gyakran frissülnek az élő állapotról szóló értesítések a ciklus lefutása közben.", - "label": "Élő frissítési intervallum" - }, - "notify_live_overrun_percent": { - "doc": "Ha egy ciklus ennél a százaléknál nagyobb mértékben haladja meg a becsült értéket, küldjön túlfutási riasztást.", - "label": "Élő túlfutás % riasztás előtt" - }, - "notify_live_services": { - "doc": "notify.* szolgáltatások élő folyamatfrissítést kértek a ciklus lefutása közben. Hagyja üresen az élő folyamatról szóló értesítések letiltásához.", - "label": "Élő folyamat szolgáltatások" - }, - "notify_only_when_home": { - "doc": "Csak akkor küldjön értesítést, ha a linkelt személyek közül legalább egy (fent) otthon van.", - "label": "Csak otthon értesítés" - }, - "notify_people": { - "doc": "személy.* entitások, amelyeket a „Csak otthonról értesítés” használ annak eldöntésére, hogy valaki otthon van-e.", - "label": "Személyek (Csak otthon értesítéshez)" - }, - "notify_pre_complete_message": { - "doc": "A vég előtti / majdnem kész riasztás törzse. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Befejezés előtti üzenet" - }, - "notify_reminder_message": { - "doc": "A még várakozó kirakodási emlékeztető törzse. Az üres a beépített alapértelmezést használja. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Emlékeztető üzenet" - }, - "notify_start_message": { - "doc": "A ciklus indulásakor elküldött üzenettörzs. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Indítási üzenet" - }, - "notify_start_services": { - "doc": "notify.* szolgáltatások hívják meg a ciklus indulásakor. Adjon hozzá egyet célonként (telefon, műszerfal stb.); hagyja üresen, hogy ne induljon értesítés.", - "label": "Indítási szolgáltatások" - }, - "notify_timeout_seconds": { - "doc": "Az értesítés automatikus elvetése ennyi másodperc után (az azt támogató platformokon). A 0 megőrzi, amíg manuálisan el nem távolítja.", - "label": "Automatikus elvetés után" - }, - "notify_title": { - "doc": "Értesítés címe. Sablonváltozók: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "Értesítés címe" - }, - "notify_unload_delay_minutes": { - "doc": "Percekkel a ciklus lejárta után, mielőtt elküldené a még mindig várakozó \"üresd ki a gépet\" emlékeztetőt. Állítsa be a 0-t az emlékeztető letiltásához.", - "label": "Kirakodási emlékeztető késleltetése" - }, - "off_delay": { - "doc": "Várakozási idő a teljesítmény csökkenése után, mielőtt befejezettnek nyilvánítaná a ciklust. Ha az áramellátás ezen az ablakon belül folytatódik, a ciklus zökkenőmentesen folytatódik – ez áthidalja a szüneteket a mosási fázisok között. A mosogatógépek hosszú szárítási fázisokkal rendelkeznek (20-60 percre kikapcsolva), így a kikapcsolási késleltetésnek meg kell haladnia ezt, hogy az egész mosás+szárítás egy ciklusban maradjon.", - "label": "Kikapcsolási késleltetés" - }, - "pause_cuts_power": { - "doc": "Ha egy ciklus szünetel, kapcsolja ki az alábbi Kapcsoló entitást is. Csak olyan készülékekhez, amelyek dugója biztonságosan levágható a ciklus közepén.", - "label": "Szünet megszakítja az áramot (kapcsolón keresztül)" - }, - "power_off_delay": { - "doc": "Mennyi ideig kell a teljesítménynek a Kikapcsolás teljesítményküszöbe alatt maradnia egy ciklus befejezése után, mielőtt az állapot visszatér a Kikapcsolva értékre. Csak akkor használatos, ha a Kikapcsolás teljesítményküszöbe 0 fölött van. A háttérben futó ütem szerint ellenőrzi, így a tényleges késleltetés felfelé kerekít a következő állapotlejárati lépéshez.", - "label": "Kikapcsolás késleltetése" - }, - "power_off_threshold_w": { - "doc": "Opcionális, teljesítményalapú Kikapcsolva állapot érzékelése. Ha az érték 0 fölött van, akkor amint egy ciklus befejeződött és a teljesítmény a Kikapcsolás késleltetése ideig e szint alatt marad, a gépet kikapcsoltnak tekinti, és az állapot visszatér a Kikapcsolva értékre. A letiltáshoz hagyja 0 értéken (alapértelmezett). Állítsa a valódi kikapcsolt szint fölé, de a Leállítási küszöb és a gép befejezett-de-bekapcsolt készenléti fogyasztása alá; ha nincs a Leállítási küszöb alatt, a rendszer figyelmen kívül hagyja. Bekapcsolva a Kikapcsolva állapotba való visszatéréshez a Folyamat visszaállítási késleltetés helyébe lép, így a befejezett gép Befejezett/Tiszta állapotban marad, amíg ténylegesen ki nem kapcsolják.", - "label": "Kikapcsolás teljesítményküszöbe" - }, - "power_sensor": { - "doc": "Az érzékelő entitás, amely a készülék élő teljesítményét jelenti wattban (pl. sensor.washer_power). Minden ciklusérzékelés ezen a jelen alapul.", - "label": "Teljesítmény érzékelő" - }, - "profile_duration_tolerance": { - "doc": "Az egyeztetés során használt profil átlagos időtartama körüli +/- sáv. A 0,25 azt jelenti, hogy a 60 perces profil 45-75 perces ciklusoknak felel meg.", - "label": "Profil időtartam tolerancia" - }, - "profile_match_interval": { - "doc": "Milyen gyakran próbálja meg a profilegyeztetést egy futási ciklus során. Az alapértelmezett 300 s (5 perc) egyensúlyban tartja az észlelési sebességet és a CPU-t.", - "label": "Egyezési intervallum" - }, - "profile_match_max_duration_ratio": { - "doc": "Maximális ciklushossz a profilhoz képest. Az 1.3 azt jelenti, hogy a ciklusnak a profil időtartamának 130%-a alatt kell lennie, hogy megfeleljen.", - "label": "Max. időtartam arány" - }, - "profile_match_min_duration_ratio": { - "doc": "Minimális ciklushossz a profilhoz képest. A 0,9 azt jelenti, hogy egy ciklusnak a profil időtartamának legalább 90%-ának kell lennie, hogy illeszkedjen.", - "label": "Min. időtartam arány" - }, - "profile_match_threshold": { - "doc": "Minimális hasonlósági pontszám (0-1) szükséges a ciklus végén a programazonosító elfogadásához. Emelje fel a hibás azonosítások csökkentése érdekében; csökkentse, ha a gép programjai nem illeszkednek. Az alapértelmezett 0,4 konzervatív kiindulópont.", - "label": "Egyezési küszöb" - }, - "profile_unmatch_threshold": { - "doc": "Ha egy élő ciklus közbeni meccs ez alá csökken, a próbaazonosító törlődik. Tartsa egy kicsit az egyezési küszöb alatt, hogy a hasonlóság rövid csökkenése ne fordítsa vissza páratlanná a kijelzőt.", - "label": "Nem egyező küszöb" - }, - "progress_reset_delay": { - "doc": "A befejezés után tartsa 100%-on az előrehaladást ennyi ideig, hogy a Befejezett felirat látható legyen az irányítópulton, mielőtt visszaállítaná az üresjárati állapotot.", - "label": "Folyamat visszaállítási késleltetés" - }, - "pump_stuck_duration": { - "doc": "Másodpercekkel a szivattyú folyamatosan működhet, mielőtt esetleg elakadtként jelölik meg (kiváltja a beragadt szivattyú eseményt).", - "label": "Elakadt szivattyú időtartama" - }, - "running_dead_zone": { - "doc": "A ciklus elindítása után az ablakon belüli teljesítménycsökkenéseket figyelmen kívül hagyja. A mosógépek hideg vízzel töltik fel (a melegítés előtt közel 0 W csökken) – e védelem nélkül a töltési fázis úgy néz ki, mint a ciklus végén. Ez NEM hagyja ki az adatokat: a teljes teljesítmény nyomvonal T=0-tól kerül rögzítésre. A javaslatmotor méri a gép tényleges indítási mintáját, és automatikusan méretezi azt.", - "label": "Futó holttér" - }, - "sampling_interval": { - "doc": "Várható idő az érzékelő leolvasásai között – a simítóablak méretére és a visszapattanás helyes elindítására szolgál. Ettől az értéktől függetlenül minden érzékelőfrissítés rögzítésre kerül; csak a downstream számításokat kalibrálja. A javaslatmotor méri az érzékelő tényleges ütemét az elmúlt ciklusokból, és automatikusan beállítja ezt.", - "label": "Mintavételezési intervallum" - }, - "save_debug_traces": { - "doc": "Tárolja a teljes teljesítmény nyomkövetést és a megfelelő hibakeresési adatokat minden ciklushoz. Hasznos hibaelhárításhoz, de növeli a tárhely méretét.", - "label": "Hibakeresési nyomok mentése" - }, - "smoothing_window": { - "doc": "Mennyire van simítva a nyers teljesítményjel. Alacsony (2) érzékeny, de zajos; magas (5) kisimítja a tüskéket, de növeli a késést.", - "label": "Simítási ablak" - }, - "start_duration_threshold": { - "doc": "A teljesítménynek ennyi ideig az indítási küszöb felett kell maradnia, hogy megerősítse a valódi indítást, és megakadályozza, hogy a másodperc törtrészes be/ki kapcsolói elindítsák a ciklust.", - "label": "Indítási időtartam" - }, - "start_energy_threshold": { - "doc": "A készüléknek energiát (teljesítmény x idő) kell fogyasztania MŰKÖDÉS ELŐTT. Egy rövid, nagy teljesítményű tüskének nagyon alacsony az energiája, és figyelmen kívül hagyják, megakadályozva a téves indításokat.", - "label": "Indítási energia" - }, - "start_threshold_w": { - "doc": "A teljesítménynek e szint fölé kell emelkednie a ciklus elindításának megerősítéséhez. Túl alacsonyra állítása téves indítást okoz készenléti tápellátásról; túl magas és lassan induló programok (hideg töltés) elmaradnak. A javaslatmotor ezt éppen a gép megfigyelt legalacsonyabb aktív teljesítménye fölé állítja.", - "label": "Indítási küszöb" - }, - "stop_threshold_w": { - "doc": "A teljesítménynek e szint alá kell csökkennie, mielőtt a kikapcsolási késleltetés visszaszámlálása megkezdődik. Állítsa az indítási küszöb alá – a köztük lévő hézag a hiszterézis sáv, amely megakadályozza a villogást. Ha túl magasra van állítva, az alacsony teljesítményű fázisok (öblítőstop, gyűrődésgátló) hamisan elindítják a végsorozatot.", - "label": "Leállítási küszöb" - }, - "switch_entity": { - "doc": "Az opcionális kapcsoló szüneteltetéskor kikapcsolható, majd újraindításkor visszakapcsolható, a „Szünet is leállítja az áramot” funkcióval együtt használható.", - "label": "Kapcsoló entitás" - }, - "watchdog_interval": { - "doc": "Milyen gyakran ellenőrzi a háttérfigyelő az elakadt érzékelőket és az eltelt időtúllépéseket. Alapértelmezett 30 s.", - "label": "Felügyelő intervallum" - }, - "notify_milestone_message": { - "doc": "A mérföldkő értesítés üzenete. Sablonváltozók: {device}, {cycle_count}.", - "label": "Mérföldkő üzenet" - }, - "notify_milestones": { - "doc": "Vesszővel elválasztott ciklusszámok, amelyek elérésekor egyszeri ünneplő értesítést váltanak ki (pl. 50, 100, 500, 1000). Üresen a mérföldkő-értesítések ki vannak kapcsolva.", - "label": "Ciklus mérföldkövek" - }, - "notify_quiet_end_hour": { - "doc": "A ne zavarjanak időszak vége (0-23). A visszatartott értesítéseket ekkor kézbesíti. Hagyja üresen a kikapcsoláshoz.", - "label": "Csendes órák vége" - }, - "notify_quiet_start_hour": { - "doc": "A ne zavarjanak időszak kezdete (0-23). A csendes órák alatt kiváltódó befejezési, emlékeztető és tiszta ruha értesítéseket visszatartja, és az időszak végén kézbesíti. Hagyja üresen a kikapcsoláshoz. Támogatja az éjfélt átlépő időszakokat (pl. kezdet 22, vég 7).", - "label": "Csendes órák kezdete" - }, - "peak_rate_message": { - "doc": "Opcionális egyéni szöveg az indítási értesítéshez fűzött csúcstarifa-tipphez. Sablonváltozók: {device}, {price}. Az üres a beépített alapértelmezést használja.", - "label": "Csúcstarifa üzenet" - }, - "peak_rate_threshold": { - "doc": "Amikor egy ciklus elindul, és az aktuális kWh-ár eléri vagy meghaladja ezt az értéket, csúcstarifa-tippet fűz az indítási értesítéshez. A 0 vagy üres kikapcsolja a tippet.", - "label": "Csúcstarifa-küszöb (kWh-ként)" - }, - "dtw_bandwidth": { - "label": "Alakillesztési tűrés", - "doc": "Mennyire torzíthatja időben az illesztő egy ciklust, hogy illeszkedjen egy mentett program alakjához. A magasabb érték nagyobb sebességingadozást tűr; a túl magas rossz programot illeszthet." - }, - "corr_weight": { - "label": "Alak és szint súlya", - "doc": "Egyensúly a görbe alakja és az abszolút teljesítményszint között az illesztés pontozásakor. A magasabb érték az alakot részesíti előnyben; az alacsonyabb a teljesítményszint illesztését." - }, - "duration_weight": { - "label": "Időtartam súlya", - "doc": "Mennyire részesül előnyben az a program, amelynek tipikus időtartama illeszkedik ehhez a ciklushoz." - }, - "energy_weight": { - "label": "Energia súlya", - "doc": "Mennyire részesül előnyben az a program, amelynek tipikus energiafogyasztása illeszkedik ehhez a ciklushoz." - }, - "store_brand": { - "label": "Készülék márkája", - "doc": "Opcionális. A készülék márkája a közösségi katalógusból kiválasztva. A megfelelő referenciafelvételek megkeresésére és megosztására szolgál. Hagyja üresen, ha nem használja az online funkciókat." - }, - "store_model": { - "label": "Készülék modellje", - "doc": "Opcionális. A készülék modellje a közösségi katalógusból kiválasztva, miután megadta a márkát. Ha a modellje nem szerepel a listában, hozzáadhatja a katalógushoz." - }, - "show_contributor": { - "doc": "Jelenítse meg a \" által\" jelölést a közösségi készülékeken és referenciaciklusokon." - }, - "enable_phase_matching": { - "label": "Fázistudatos hátralévő idő", - "doc": "Bontsa minden futó ciklust fázisokra (fűtés, mosás, centrifugálás), és a hátralévő időt fázisonként ossza be, a klasszikus becsléssel keverve - a ciklus elején a fázisbeosztásra, a vége felé pedig a klasszikus becslésre támaszkodva. Ez a visszaszámlálót ahhoz igazítja, hogy a gépe ténylegesen mennyi ideig fűt és működik, ami leginkább a ciklus első felében figyelhető meg. Ki = csak a klasszikus becslés. Csak a hátralévő idő kijelzését érinti; a program párosítása és a ciklusérzékelés változatlan marad." - }, - "keep_min_score": { - "label": "Min. Egyezési Pontszám", - "doc": "A minimális hasonlósági pontszám, amelyre egy jelöltnek szüksége van az egyezési versenyben való maradáshoz. Az alapértelmezett 0.1 szándékosan megengedő - még a gyenge jelölteket is beengedi, és a következő szakaszokra bízza a legjobb egyezés megtalálását. Növelje a valószínűtlen profilok korábbi kizárásához; csökkentse a kezdeti jelöltállomány bővítéséhez." - }, - "dtw_blend": { - "label": "Torzítás Keverék", - "doc": "Mennyire helyettesíti az időtorzítás (DTW) igazítási pontszám a 2. szakasz alappontszámát. 0 = csak a 2. szakasz pontszáma, 1 = csak a DTW-pontszám, 0.5 (alapértelmezett) = egyenlő keverék. Növelje, hogy jobban támaszkodjon a torzítási igazításra, ha a programoknak hasonló a teljesítményszintjük, de eltérő az időbeli mintájuk." - }, - "dtw_ensemble_w": { - "label": "Torzítás Együttes Mix", - "doc": "Együttes DTW módban (az alapértelmezett), a súly a skálázott L1 és a derivált DTW (DDTW) között. 1.0 = kizárólag skálázott-L1, 0 = kizárólag DDTW, 0.7 = alapértelmezett. A skálázott-L1 változat a teljesítményszinteket hasonlítja össze; a derivált változat arra reagál, ahogyan a teljesítmény változik az idő során. Az együttes mindkettőt kombinálja." - }, - "dtw_ddtw_scale": { - "label": "Derivált Torzítás Skála", - "doc": "Féltelítési távolság a derivált DTW pontozáshoz. A pontszám megfeleződik, ha a DDTW-távolság eléri ezt az értéket. Kisebb = érzékenyebb az alakkülönbségekre. Az alapértelmezett 30 a tipikus háztartási gépek teljesítménynyomaihoz van kalibrálva. Csak az együttes és ddtw DTW-módokat érinti." - }, - "dtw_refine_top_n": { - "label": "Torzítás Finomítás Szám", - "doc": "Hány legjobb 2. szakasz jelöltet pontozza újra a DTW. A DTW számításigényesebb, ezért csak a legjobb N jelöltre alkalmazzák. Alapértelmezett 5. Növelje (7-9-re), ha a helyes profil néha csak a 4. vagy 5. helyen végez a 2. szakasz után - a DTW meg tudja menteni. A csökkentés enyhén felgyorsítja az egyeztetést." - }, - "duration_scale": { - "label": "Időtartam Élesség", - "doc": "A 4. szakasz időtartam-egyezési büntetésének élessége. Ez az a logaritmikus arány, amelynél az egyezési pontszám megfeleződik. Kisebb = szigorúbb: egy időtartam-eltérés jobban büntet. Az alapértelmezett 0.175 nagyjából 18%-os időtartam-toleranciának felel meg a félsúlynál. Párosítsa az Időtartam Súlyával." - }, - "energy_scale": { - "label": "Energia Élesség", - "doc": "A 4. szakasz energia-egyezési büntetésének élessége. Kisebb = szigorúbb: egy energia-eltérés jobban büntet. Az alapértelmezett 0.25 szándékosan megengedőbb az Időtartam Élességénél, mivel az energia változik a terheléssel. Párosítsa az Energia Súlyával." - } - }, - "setting_group": { - "auto_labeling": { - "label": "Automatikus jelölés" - }, - "cycle_end": { - "label": "Ciklus vége" - }, - "cycle_start": { - "label": "Ciklus indítása" - }, - "cycle_timers": { - "label": "Ciklus időzítők" - }, - "data_management": { - "label": "Adatkezelés" - }, - "debug": { - "label": "Hibakeresés" - }, - "dishwasher_end": { - "label": "Mosogatógép befejezése" - }, - "door_pause": { - "label": "Ajtó és szünet" - }, - "dtw_refinement": { - "label": "DTW finomítás" - }, - "duration_gates": { - "label": "Időtartam kapuk" - }, - "energy": { - "label": "Energia" - }, - "external_end_trigger": { - "label": "Külső záró trigger" - }, - "housekeeping": { - "label": "Karbantartás" - }, - "match_scoring": { - "label": "Egyezési pontozás" - }, - "messages": { - "label": "Üzenetek" - }, - "power_off": { - "label": "Készülék kikapcsolása" - }, - "predictive_end": { - "label": "Prediktív befejezés" - }, - "schedule": { - "label": "Ütemezés" - }, - "services": { - "label": "Szolgáltatások" - }, - "signal_processing": { - "label": "Jelkondicionálás" - }, - "thresholds_gap": { - "label": "Küszöbök és rés" - }, - "timing": { - "label": "Időzítés" - }, - "unload_reminder": { - "label": "Kirakodási emlékeztető" - }, - "watchdog": { - "label": "Felügyelő" - }, - "quiet_hours_milestones": { - "label": "Csendes órák és mérföldkövek" - }, - "device_info": { - "label": "Eszközadatok" - }, - "basic_configuration": { - "label": "Alapkonfiguráció" - } - }, - "status": { - "active": "Aktív", - "all_statuses": "Minden állapot", - "ambiguous": "Kétértelmű", - "auto_detect": "Automatikus felismerés", - "clear": "Világos", - "completed": "Befejezve", - "fine_tuning": "finomhangolás most…", - "force_stopped": "Az erő megállt", - "idle": "Tétlen", - "interrupted": "Megszakított", - "ready": "Feldolgozásra kész", - "recording": "Felvétel", - "training": "Tanítás…", - "saving": "Mentés…", - "rebuilding": "Újraépítés…", - "analyzing": "Elemzés…", - "resetting": "Visszaállítás…", - "reverting": "Visszavonás…", - "trimming": "Vágás…", - "splitting": "Felosztás…", - "deleting": "Törlés…", - "imported": "Importált" - }, - "tab": { - "advanced": "Fejlett", - "diagnostics": "Diagnosztika", - "history": "Ciklusok", - "ml": "ML képzés", - "pp_cleanup": "Tisztítás", - "pp_manage": "Kezelése", - "pp_overview": "Áttekintés", - "pp_phases": "Fázisok", - "profiles": "Profilok", - "settings": "Beállítások", - "status": "Áttekintés", - "subtab_phase_catalog": "Fázis katalógus", - "subtab_profiles": "Profilok", - "maintenance": "Karbantartás", - "playground": "Homokozó", - "store": "Bolt" - }, - "tag": { - "early_end": "Korai vége", - "late_start": "Késői kezdés", - "merged": "Összevont ciklusok", - "noise": "Zaj", - "sensor_gap": "Érzékelő rés", - "split": "Osztott ciklus", - "wrong_profile": "Rossz profil" - }, - "toast": { - "access_saved": "A hozzáférés-szabályozás mentve", - "all_wiped": "Minden adat törölve", - "analysis_complete_none": "Az elemzés kész: nincs új javaslat", - "auto_label_complete": "Az automatikus címkézés kész", - "automation_deleted": "Automatizálás törölve", - "correction_submitted": "Helyesbítés benyújtva", - "cycle_deleted": "Ciklus törölve", - "cycle_force_stopped": "Kényszer-leállított ciklus", - "cycle_labelled": "Ciklus feliratozott", - "cycle_paused": "A ciklus szünetel", - "cycle_resumed": "A ciklus folytatódott", - "cycle_trimmed": "Ciklus vágva", - "cycles_merged": "A ciklusok egyesültek", - "envelope_rebuilt": "Boríték átépített", - "envelopes_rebuilt": "A borítékok újjáépítve", - "export_downloaded": "Exportálás letöltve", - "feedback_all_dismissed": "Minden visszajelzés elutasítva", - "feedback_confirmed": "A visszajelzés megerősítve", - "feedback_dismissed": "A visszajelzés elutasítva", - "group_deleted": "Csoport törölve", - "group_name_required": "A csoportnév megadása kötelező", - "group_saved": "Csoport mentve", - "import_successful": "Sikeres importálás; integráció újratöltése", - "json_required": "JSON-adatok szükségesek", - "legacy_removed": "Az örökölt műveletek eltávolítva", - "logs_exported": "A naplók exportálva", - "matching_reverted": "A megfelelő súlyok visszaálltak az alapértelmezett értékekre", - "min_2_profiles": "Válasszon ki legalább 2 profilt egy csoporthoz", - "ml_training_no_improvement": "Az edzés befejeződött: az alapérték megtartva (nincs javulás)", - "models_reverted": "Az eszközön lévő modellek visszaálltak az alapszintre", - "name_required": "Név szükséges", - "no_split_found": "Nem találtunk üresjárati hézagot, amelyen fel lehetne osztani", - "panel_settings_saved": "A panel beállításai mentve", - "phase_name_required": "A fázisnév megadása kötelező", - "phase_updated": "Fázis frissítve", - "phases_saved": "Fázisok mentve", - "preferences_saved": "A beállítások mentve", - "profile_name_required": "A profilnév megadása kötelező", - "profile_renamed": "Profil átnevezve", - "recording_discarded": "A felvétel elvetve", - "recording_saved": "A felvétel mentve a profilba", - "recording_started": "A felvétel elkezdődött", - "recording_stopped": "A felvétel leállt", - "review_saved": "Vélemény mentve", - "settings_conflicts": "Mentés előtt javítsa ki a kijelölt beállítási ütközéseket.", - "settings_reverted": "A beállítások visszaállítva; integráció újratöltése", - "settings_saved": "A beállítások elmentve; integráció újratöltése", - "suggestions_applied": "Javaslatok alkalmazva; integráció újratöltése", - "suggestions_dismissed": "Javaslatok elutasítva", - "apply_failed": "Az alkalmazás sikertelen: {error}", - "delete_failed": "A törlés sikertelen: {error}", - "load_more_failed": "Nem sikerült többet betölteni: {error}", - "maint_add_failed": "Nem sikerült hozzáadni az eseményt: {error}", - "maint_added": "Karbantartási esemény hozzáadva", - "maint_delete_failed": "Nem sikerült törölni az eseményt: {error}", - "maint_deleted": "Karbantartási esemény törölve", - "relabel_done": "{count} ciklus átcímkézve", - "relabel_failed": "Az átcímkézés sikertelen: {error}", - "reminders_save_failed": "Nem sikerült menteni az emlékeztetőket: {error}", - "reminders_saved": "Szerviz emlékeztetők mentve", - "pause_no_cycle": "Nincs szüneteltethető aktív ciklus", - "resume_no_cycle": "Nincs folytatható szüneteltetett ciklus", - "delete_partial_failed": "Egyes elemeket nem sikerült törölni, ezért visszaállításra kerültek", - "pg_run_gone": "Ez a futtatás már nem érhető el.", - "task_cancelled": "Megszakítva.", - "processed": "Feldolgozva: {bits}", - "processed_cycles": "{n} ciklus", - "processed_suggestions": "{n} javaslat", - "processed_models": "{n} modell előléptetve", - "store_search_failed": "A keresés sikertelen: {error}", - "store_connect_failed": "A csatlakozás sikertelen: {error}", - "store_connected": "Csatlakozva a közösségi bolthoz", - "store_disconnected": "Leválasztva a közösségi boltról", - "store_error": "Hiba: {error}", - "store_unavailable": "A közösségi bolt nem érhető el.", - "store_pick_profile": "Válassza ki a profilt, amelybe egyesíti", - "store_name_required": "Adjon meg egy profilnevet", - "store_import_failed": "Az importálás sikertelen: {error}", - "store_imported": "Importálva ide: {profile}", - "store_program_required": "Adjon meg egy programnevet", - "store_no_appliance": "Először adja meg a készülék márkáját és modelljét a Beállításokban.", - "store_share_failed": "A megosztás sikertelen: {error}", - "store_shared": "Megosztva a közösségi boltban - felülvizsgálatra vár.", - "appliance_added": "Készülék hozzáadva - jóváhagyásra vár", - "thanks_confirming": "Köszönjük a megerősítést", - "device_approved": "A közösség jóváhagyta", - "rating_saved": "Minőségértékelés mentve", - "brand_added": "Márka hozzáadva - jóváhagyásra vár", - "profile_added": "Profil hozzáadva - jóváhagyásra vár", - "saved_except_conflicts": "Mentve. Javítsa ki a kijelölt ütközéseket a többi mentéséhez.", - "share_device_none_sel": "Válasszon legalább egy ciklust a megosztáshoz", - "store_device_downloaded": "{p} program, {c} felvétel hozzáadva", - "store_device_downloaded_phases": "{p} program, {c} felvétel, {ph} fázistérkép hozzáadva", - "store_device_downloaded_settings": "{p} program, {c} felvétel, {ph} fázistérkép, {s} beállítás hozzáadva", - "store_device_shared": "{n} ciklus megosztva a közösségi boltba - felülvizsgálatra vár.", - "store_device_shared_all_dup": "Mind a(z) {n} ciklus már a közösségi boltban volt.", - "store_device_shared_partial": "{n} ciklus megosztva; {failed} nem sikerült feltölteni.", - "store_device_shared_some_dup": "{created} ciklus megosztva; {dup} már a boltban volt.", - "store_download_failed": "Letöltés sikertelen: {error}", - "store_download_nothing": "Nincs új letöltendő - ez a beállítás már megvan az eszközön.", - "export_selective_done": "Export letöltve", - "import_selective_done": "{profiles} profil és {cycles} ciklus importálva" - }, - "suggestion": { - "both_agree": "A WashData javasolja", - "calibrated_label": "Kalibrált", - "observed_label": "Megfigyelt", - "impact": { - "auto_label_confidence": { - "higher": "Automatikusan kevesebb ciklust jelöl; több kerül áttekintésre", - "lower": "Automatikusan több ciklust jelöl; néhány félre lehet azonosítva" - }, - "duration_tolerance": { - "higher": "Szélesebb időtartomány elfogadása – rugalmasabb egyeztetés", - "lower": "Pontosabb időtartam-egyezést igényel – szigorúbb, de szokatlan ciklusokat elutasíthat" - }, - "end_energy_threshold": { - "higher": "Csak jelentős energiát felhasználó ciklusokat zár be", - "lower": "Rövidebb vagy alacsony energiájú ciklusokat is bezár" - }, - "end_repeat_count": { - "higher": "A befejezési jelet több ismétlés után fogadja el – megbízhatóbb, kissé lassabb", - "lower": "Kevesebb ismétlés után ér véget – gyorsabb érzékelés, több hamis befejezési kockázat" - }, - "learning_confidence": { - "higher": "Csak nagyon magabiztos egyezésekből tanul – lassabb, de megbízhatóbb", - "lower": "Több ciklusból tanul; a modell zajosabb lehet" - }, - "min_off_gap": { - "higher": "Hosszabb tétlenség szükséges az új ciklus indulása előtt", - "lower": "Rövid tétlenség új ciklust indít – egymást követő futások szétválhatnak" - }, - "min_power": { - "higher": "Kevésbé érzékeny a tétlenségi fogyasztásra; nagyon csendes programokat elszalaszthat", - "lower": "Érzékenyebb; a készenléti fogyasztást aktivitásként naplózhatja" - }, - "no_update_active_timeout": { - "higher": "Több idő a ciklus elakadtnak nyilvánítása előtt", - "lower": "Elakadt ciklust gyorsabban kényszerít leállítani" - }, - "off_delay": { - "higher": "Több idő a készülék szüneteire – hosszú áztatás vagy szárítás kezelése", - "lower": "Gyorsabb vége érzékelés – egyértelmű be/ki készülékekhez jól működik" - }, - "profile_match_threshold": { - "higher": "Csak nagy magabiztosságú egyezéseket erősít meg; több ciklus marad jelöletlen", - "lower": "Több ciklust egyeztet; néhány kissé helytelen lehet" - }, - "running_dead_zone": { - "higher": "Figyelmen kívül hagyja a rövid teljesítménycsúcsokat tétlenség közben – zajra kevésbé érzékeny", - "lower": "Rövidebb teljesítménylökésekre reagál – gyors átmeneti aktivitást észlel" - }, - "start_threshold_w": { - "higher": "Elkerüli a rövid teljesítménycsúcsokból eredő hamis indításokat", - "lower": "Kis teljesítményű programokat is érzékel; zajra is aktiválódhat" - }, - "stop_threshold_w": { - "higher": "Gyorsabban fejezi be a ciklust – szünet közben is zárhat", - "lower": "Hosszabb ideig vár a befejezésre – kevesebb idő előtti befejezés" - }, - "watchdog_interval": { - "higher": "Hosszabb csendes fázisok megengedett; kevesebb hamis kényszeres leállítás", - "lower": "Agresszívabban észleli az elakadt ciklusokat" - } - }, - "reason": { - "auto_label_confidence": "{cycles} olyan automatikus címke 15. percentilis megbízhatósága, amelyet a felhasználó soha nem javított ({p15}).", - "completion_min_seconds": "A p05 tiszta ciklus időtartamának fele ({minutes} perc) {cycles} cikluson át; kiszűri a fantomciklusokat.{excl}", - "dead_zone_batch": "Rövidre hagyva (a médián indítási instabilitási ablak {cycles} cikluson át = {s}s), hogy a valódi vég gyorsan észlelhető legyen.", - "dead_zone_from_dip": "A(z) {s}s-nál észlelt korai teljesítménycsökkenés alapján.", - "end_energy_default": "Alapértelmezett ajánlott referenciaérték a ciklus végi zajküszöbhöz.", - "end_energy_false": "p95 téves végű energia ({p95}Wh) {cycles} cikluson át, alsó korláttal a médián ciklusenergia 0.2%-ánál ({floor}Wh).", - "end_energy_no_false": "Nincs téves vég {cycles} cikluson át; alsó korláttal a médián ciklusenergia 0.2%-ánál ({floor}Wh).", - "end_repeat_count": "{false}/{total} tiszta ciklusban ({pct}%) volt >60s belső szünet, amely folytatódott; {val} végmegerősítés szükséges.", - "learning_confidence": "{cycles} felhasználó által címkézett ciklus p05 megbízhatósága ({p05}); ez alatt ellenőrzés kérése.", - "match_interval": "A megfigyelt frissítési ütem alapján (médián={median}s) * 10.", - "max_duration_ratio": "A címkézett ciklusok időtartama alapján (p95={p95}).", - "min_active": "Az utolsó ciklusban megfigyelt legkisebb aktív teljesítmény ({min}W) alapján.", - "min_duration_ratio": "A lehető legalacsonyabbra állítva, hogy a program a ciklus elején felismerhető legyen; a megbízhatósági és bizonytalansági küszöbök megakadályozzák a korai megerősítést.", - "min_off_gap": "{gaps} megfigyelt ciklusközi szünet alapján (p05={p05}s). Készülék alsó korlátja: {floor}s.", - "min_power": "A(z) {cycles} tiszta ciklus p05 legkisebb aktív teljesítményének ({p05}W) 40%-a, hogy a kikapcsolási küszöb a valós fogyasztás alatt maradjon.{excl}", - "ml_auto_label": "A legalacsonyabb megbízhatóság, amelyet a minőségi modell még tisztának minősített (a(z) {cycles} tiszta ciklus p10 értéke = {p10}).", - "ml_end_repeat": "{false}/{total} ciklusban ({pct}%) volt olyan szünet, amelyet a végérzékelő >50%-ra értékelt; {val} végmegerősítés szükséges.", - "ml_off_delay": "Végérzékelővel megerősített szünetek: p95 {p95}s + 60s ráhagyás, {pauses} modell által ellenőrzött szünetből {cycles} cikluson át (alsó korlát {floor}s).", - "no_update_timeout": "A megfigyelt frissítési ütem alapján (p95={p95}s) * 20 (min. 60s).", - "off_delay_cadence": "A megfigyelt frissítési ütem alapján (p95={p95}s) * 5", - "off_delay_device_floor": "A(z) {device} eszközre jellemző biztonságos minimum használva ({floor}s).", - "off_delay_generic_floor": "Általános biztonságos minimum használva ({floor}s).", - "off_delay_pauses": "Úgy méretezve, hogy túlélje a valódi szüneteket: p95 cikluson belüli szünet {p95}s + 60s ráhagyás, {pauses} szünetből {cycles} tiszta cikluson át (alsó korlát {floor}s).", - "profile_match_threshold": "{cycles} helyes automatikus címke p10 megbízhatósága ({p10}); biztonságos élő megerősítési alsó korlát.", - "sampling_interval": "A(z) {cycles} tiszta cikluson át megfigyelt médián frissítési intervallum ({si}s).{excl}", - "smoothing_window": "Úgy méretezve, hogy ~30s-nyi mérést simítson {si}s mintavételezésnél ({samples} minta).", - "start_duration": "Rövidre hagyva (~egy {si}s mintavételi intervallum), hogy az észlelés a lehető legkorábban induljon, miközben az egyetlen mintás kiugrásokat figyelmen kívül hagyja.", - "thr_batch": "Éppen a p05 legkisebb aktív teljesítmény fölött tartva {cycles} cikluson át ({p05}W), hogy az indítás a lehető legkorábban észlelhető legyen, a leállítási küszöb pedig a gép legkisebb üzemi teljesítménye alatt maradjon.", - "tol_per_profile": "A profilonkénti időtartam-szórás p75 értéke {profiles} profilon át ({cycles} ciklus); a stabil profilok nem kapnak büntetést.", - "tol_pooled": "{cycles} legutóbbi címkézett ciklus összevont időtartam-szórása alapján (p95 szórás={dev}).", - "watchdog": "A biztonságosan lehető legalacsonyabbra állítva (a p95 frissítési szünet 3-szorosa, {p95}s, min. 30s), hogy az elakadások gyorsan észlelhetők legyenek téves leállítások nélkül." - }, - "exclusions": { - "summary": "{total} tévesen észlelt ciklus kizárva: {parts}.", - "reason": { - "force_stopped": "kényszerrel leállított", - "interrupted": "megszakított", - "incomplete": "befejezetlen", - "noise": "zaj", - "unlabeled": "címkézetlen", - "no_trace_short": "vizsgálathoz túl rövid", - "high_start": "magas teljesítménnyel indult", - "abrupt_end": "hirtelen véget ért", - "mid_restart": "ciklus közbeni újraindítás", - "no_power": "nincs teljesítmény", - "no_active_power": "nincs aktív teljesítmény" - } - } - }, - "trend": { - "down": "Lefelé trend", - "up": "Felkapott" - }, - "maint": { - "bearing_service": "Csapágy szerviz", - "descale": "Vízkőmentesítés", - "drum_clean": "Dob tisztítása", - "filter_clean": "Szűrő tisztítása", - "other": "Egyéb" - }, - "pg_desc": { - "anti_wrinkle_enabled": "Nyelje el a fő fázis utáni szárítópulzusokat, ahelyett hogy új ciklusként olvasná őket", - "anti_wrinkle_exit_power": "A ránctalanítás aktívan tartásához a teljesítménynek az impulzusok között ez alá kell csökkennie", - "anti_wrinkle_idle_timeout": "Két szárítópulzus között engedélyezett csendes idő, mielőtt a ránctalanítás véget ér", - "anti_wrinkle_max_duration": "Az ennél hosszabb impulzus befejezi a ránctalanítást és új ciklust nyit", - "anti_wrinkle_max_power": "Az ennél magasabb impulzus befejezi a ránctalanítást és új ciklust nyit", - "completion_min_seconds": "A legrövidebb futás, ami valódi ciklusnak számít", - "end_repeat_count": "Egymást követő alacsony leolvasások a befejezés előtt", - "interrupted_min_seconds": "A rövid ciklusokat megszakítottként jelöli", - "min_off_gap": "Két ciklus elválasztásához szükséges rés", - "off_delay": "Alacsony teljesítmény másodpercei a ciklus vége előtt", - "start_duration_threshold": "A küszöb feletti másodpercek az indulás megerősítéséhez", - "start_threshold_w": "Minimális wattérték az indulás elismeréséhez", - "stop_threshold_w": "Ez alatt a gép kikapcsoltnak számít", - "dtw_bandwidth": "3. szakasz: Sakoe-Chiba torzítási sáv (0 = DTW kikapcsolva; alapértelmezett 0.2 = a ciklushossz 20%-a)", - "corr_weight": "2. szakasz: egyensúly a görbe alakja (korreláció) és a teljesítményszint (MAE) között; alapértelmezett 0.45", - "duration_weight": "4. szakasz: mennyire befolyásolja a futási idő egyezése a végső pontszámot (alapértelmezett 0.22)", - "energy_weight": "4. szakasz: mennyire befolyásolja az energia-egyezés a végső pontszámot (alapértelmezett 0.22)", - "profile_match_min_duration_ratio": "1. szakasz: minimális ciklushossz a profil időtartamának törtjeként; alapértelmezett 0.1 (10%)", - "profile_match_max_duration_ratio": "1. szakasz: maximális ciklushossz a profil időtartamának törtjeként; alapértelmezett 1.5 (150%)", - "keep_min_score": "2. szakasz: minimális pontszám a versenyben maradáshoz; az alapértelmezett 0.1 gyenge egyezéseket is beenged, a következő szakaszok választják ki a legjobbat", - "dtw_blend": "3. szakasz: 0 = csak alappontszám, 1 = csak DTW-pontszám, 0.5 = egyenlő keverék (alapértelmezett)", - "dtw_ensemble_w": "3. szakasz (együttes mód): súly a skálázott-L1 és derivált DTW között; alapértelmezett 0.7 a szintfüggőt részesíti előnyben", - "dtw_ddtw_scale": "3. szakasz: DDTW féltelítési távolság; kisebb = érzékenyebb az alakra (alapértelmezett 30)", - "dtw_refine_top_n": "3. szakasz: DTW által újrapontozandó jelöltek; növelje 7-9-re, ha a helyes profil a 4-5. helyen végez (alapértelmezett 5)", - "duration_scale": "4. szakasz: logaritmikus arány, ahol az időtartam-egyezés megfeleződik; kisebb = szigorúbb büntetés (alapértelmezett 0.175)", - "energy_scale": "4. szakasz: logaritmikus arány, ahol az energia-egyezés megfeleződik; kisebb = szigorúbb büntetés (alapértelmezett 0.25)" - }, - "col": { - "profile_tip": "Az egyezést mutató program neve. A címkézetlen azt jelenti, hogy a ciklus végén egyetlen profil sem egyezett.", - "status_tip": "A ciklus kimenetele: Befejezve (természetes vég), Megszakítva (hirtelen teljesítményesés), Kényszerítve leállítva (kézi) vagy Áttekintendő (függőben lévő visszajelzés).", - "date_tip": "A ciklus indulásának dátuma és időpontja.", - "duration_tip": "A ciklus teljes futásideje kezdéstől végéig.", - "energy_tip": "Az összes elfogyasztott energia (kWh). A teljesítmény idő szerinti integrálásával számítva.", - "cost_tip": "A ciklus energiaköltsége, befejezéskor rögzítve az akkor érvényes árral (energia x kWh-ár). Állíts be egy árat a Beállításokban a kitöltéséhez.", - "confidence_tip": "A profilegyezés bizalma (0-100%). Mennyire pontosan illeszkedett a ciklus teljesítménygörbéje az azonosított programhoz.", - "health_tip": "ML ciklusállapot (magasabb = jobb). Kattints egy ciklusra a vizsgálatához és áttekintéséhez.", - "flags_tip": "Felülvizsgálati, anomália- és forrásjelzők a ciklushoz. Vigye rá a mutatót az ikonra a részletekért." - }, - "stat": { - "avg": "átlag", - "min": "min {v}", - "max": "max {v}", - "consistency": "konzisztencia ±{v}", - "total": "összesen {v}", - "last_run": "utolsó futás {v}", - "score": "pontszám {pct}%", - "duration_cv": "időtartam CV {pct}%", - "avg_confidence": "átlagos bizalom {pct}%" - }, - "pg_evd": { - "detected": "Az érzékelő felismerte, hogy egy ciklus elindult.", - "match_commit": "Az illesztő elegendő magabiztossággal választott egy programot.", - "match_changed": "A vezető program megváltozott, ahogy a ciklus egyre nagyobb része vált láthatóvá.", - "match_ambiguous": "Két program közeli pontszámot ért el, ezért az illesztés bizonytalan volt.", - "unmatched": "Egyetlen mentett program sem illett ehhez a ciklushoz.", - "notify_start": "Egy indítási értesítés kerülne elküldésre.", - "notify_pre_complete": "Egy „majdnem kész” értesítés kerülne elküldésre.", - "notify_finish": "Egy befejezési értesítés kerülne elküldésre.", - "notify_milestone": "Egy mérföldkő-értesítés kerülne elküldésre.", - "notify_held": "Egy értesítés visszatartásra került a csendes órák miatt.", - "finished": "A ciklus elérte a végállapotot és befejeződött." - }, - "store": { - "browse": "Böngészés", - "device": "Készülék", - "favorites": "Kedvencek", - "search_ph": "Keresés márka vagy modell szerint…", - "no_results": "Nem található megfelelő készülék. Próbáljon másképp keresni.", - "n_programs": "{n} program", - "n_cycles": "{n} ciklus", - "no_programs": "Ehhez a készülékhez még nincsenek megosztott programok.", - "no_cycles": "Ehhez a programhoz még nincsenek megosztott referenciaciklusok.", - "anon": "névtelen", - "uploaded_by": "Megosztotta: {name}", - "connected_as": "Csatlakozva {name} néven", - "not_connected": "Nincs csatlakozva. Csatlakoztasson egy GitHub-fiókot a saját ciklusai megosztásához.", - "import_new": "Új profil", - "import_merge": "Egyesítés meglévővel", - "merge_target": "Egyesítés a profilba", - "description": "Leírás (opcionális)", - "contributed_by": "szerző: {name}", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "Még nincsenek értékelések", - "website": "Bolt weboldala ↗", - "website_tip": "A közösségi bolt weboldalának megnyitása" - }, - "settings": { - "gear": { - "title": "Beállítások" - } - }, - "link": { - "manual": "Kézikönyv ↗", - "add_appliance": "Készülék hozzáadása" - }, - "tip": { - "add_brand": "A márka nem szerepel a listában? Adja hozzá a közösségi katalógushoz", - "add_appliance": "A modell nem szerepel a listában? Adja hozzá készülékét a közösségi katalógushoz", - "add_profile": "Adjon hozzá profilt ehhez a készülékhez a közösségi oldalon" - }, - "task": { - "reprocess": { - "matching": "Újrafeldolgozás: ciklusok egyeztetése", - "golden": "Újrafeldolgozás: referenciaciklusok pótlása", - "suggestions": "Újrafeldolgozás: javaslatok", - "ml_training": "Újrafeldolgozás: ML-tanítás", - "health": "Újrafeldolgozás: ciklusok egészsége" - }, - "pg_sweep": { - "optimize": "Optimalizálás: {param}" - }, - "pg_detail": { - "simulate": "Ciklus szimulálása" - }, - "split": { - "apply": "Ciklus felosztása" - }, - "trim": { - "apply": "Ciklus levágása" - }, - "merge": { - "apply": "Ciklusok egyesítése" - }, - "rebuild": { - "envelopes": "Burkológörbék újraépítése" - }, - "cancelling": "Megszakítás..." - }, - "setup": { "hdr": { - "card": "Eszköz beállítása", - "healthy_chip": "Beállítás kész" + "ab_comparison": "A/B beállítások összehasonlítása", + "access_control": "Hozzáférés-vezérlés", + "add_maintenance": "Karbantartási esemény hozzáadása", + "automation_delete": "Törölje ezt az automatizálást", + "automation_needs_review": "Ezt a ciklust felül kell vizsgálni", + "automation_open": "Nyissa meg az automatizálási szerkesztőben", + "automation_review_this_cycle": "Tekintse át ezt a ciklust", + "automations": "Automatizálások", + "clear_debug": "Törölje a hibakeresési nyomokat", + "cycle_simulator": "Ciklusszimulátor", + "diagnostics_pref": "Diagnosztika", + "display": "Kijelző", + "dtw_inspector": "DTW-vizsgáló", + "export_import": "Exportálás / Importálás", + "getting_started": "Első lépések", + "live_power": "Élő teljesítmény", + "logs": "Naplók", + "logs_diagnostics": "Diagnosztika", + "maintenance": "Karbantartási műveletek", + "maintenance_log": "Karbantartási napló", + "maintenance_reminders": "Szerviz emlékeztetők", + "manual_recording": "Kézi rögzítés", + "manual_recording_tip": "Szándékosan futtasson egy ciklust, miközben a WashData rögzíti a teljesítménynyomot. Indítsa közvetlenül a készülék elindulása előtt, állítsa le, amikor befejezi, majd kezelje, hogy névvel ellátott profilként mentse.", + "ml_learned": "Amit a WashData megtanult", + "ml_matching_tuning": "Program-illesztő finomhangolás", + "ml_settings_card": "Beállítások elemre", + "ml_smart_learning": "Intelligens tanulás", + "my_preferences": "Saját preferenciáim", + "no_automations": "Egyelőre egyetlen automatika sem utal erre az eszközre.", + "panel_settings": "Panelbeállítások", + "param_sweep": "Paraméterpásztázás", + "pg_settings_source": "Beállítások forrása", + "phase_catalog": "Fázis katalógus", + "playground": "Homokozó", + "process_history": "Folyamattörténet", + "settings_history": "Beállítások előzményei", + "status": "Állapot", + "status_graph": "Állapotgrafikon", + "storage_stats": "Tárolási statisztikák", + "test_history": "Tesztelés előzményeken", + "toggle_sidebar": "Kapcsolja be a Home Assistant oldalsávot", + "tools_and_data": "Eszközök és adatok", + "wipe_history": "Törölje az előzményeket", + "recommendations": "Javaslatok ({n})", + "pg_detection_params": "Érzékelési beállítások", + "pg_timeline": "Események idővonala", + "pg_outcome": "Szimuláció eredménye", + "pg_across_cycles": "Az összes ciklusban", + "community_store": "Közösségi bolt", + "online_account": "Közösségi bolt és online funkciók" }, - "phase0": { - "washer": "A WashData már észleli a ciklusait. Rögzítse az első ciklust a programnevek és az időbecslések engedélyezéséhez.", - "dishwasher": "A WashData figyel. A mosogatógépek összetett ciklusokkal rendelkeznek – az első ciklus rögzítése erősen ajánlott. Ha egy észlelt ciklus túl hosszú ideig tart, a profilként való mentés előtt a ciklusszerkesztővel kurtítsa le.", - "generic": "A WashData figyel. Rögzítsen vagy jelöljön meg egy észlelt ciklust a profilok létrehozásának megkezdéséhez." + "health": { + "fair": "Elfogadható profilminőség", + "good": "✓ Jó profilminőség", + "poor": "⚠ Gyenge profilminőség" }, - "phase1a": { - "labelled": "Jó kezdés – az első programja el van mentve. A legtisztább adatokhoz érdemes a következő ciklust a rögzítő widgettel felvenni." + "lbl": { + "pg_anti_wrinkle": "Ránctalanítás", + "actions": "Akciók", + "activity": "Tevékenység", + "administrators": "Rendszergazdák", + "aria_compare_chart": "Ciklus-összehasonlító grafikon", + "aria_cycle_chart": "Ciklus teljesítménygörbe", + "aria_envelope_chart": "Profil teljesítményboríték grafikon", + "aria_phase_chart": "Fázisszerkesztő grafikon", + "aria_playground_chart": "Ciklus teljesítménygörbe húzható érzékelési küszöbökkel", + "aria_power_chart": "Teljesítményfelvétel grafikon", + "aria_spaghetti_chart": "Egymásra helyezett ciklus teljesítménygörbék", + "aria_sweep_chart": "Paraméterpásztázás eredményeinek grafikonja", + "artifact_anomaly": "Rendellenesség", + "artifact_high_power": "Magas teljesítmény", + "artifact_interruption": "Megszakítás", + "artifact_low_power": "Alacsony teljesítmény", + "auto_detect": "Automatikus felismerés", + "auto_fine_tune_off": "automatikus finomhangolás kikapcsolása", + "auto_fine_tune_on": "automatikus finomhangolás aktív (kb. {hour}:00 körül)", + "avg_cost": "Átlagos költség", + "change": "Változás", + "clock_time": "Óraidő", + "cohesion_good": "kohézió {pct}%", + "cohesion_low": "⚠ alacsony kohézió {pct}%", + "compare_profiles": "Hasonlítsa össze a profilokkal", + "concurrency": "Egyidejűség", + "confidence": "Bizalom", + "confidence_threshold": "Bizalmi küszöb", + "correct_duration": "Helyes időtartam (perc, opcionális)", + "correct_profile": "Helyes profil", + "correlation": "Korreláció", + "cost": "Költség", + "create_new_profile": "+ Új profil létrehozása…", + "current_phase": "Jelenlegi fázis", + "curves": "Görbék", + "cycle": "Ciklus", + "cycle_date_display": "Ciklusdátum kijelzés", + "cycle_health": "Ciklus egészség", + "cycle_index": "ciklusindex →", + "cycles": "Ciklusok", + "cycles_count": "Ciklusok", + "cycles_lc": "ciklus", + "dashed": "szaggatott", + "date": "Dátum", + "debug_traces": "Hibakeresési nyomok", + "default": "Alapértelmezett", + "default_access_level": "Alapértelmezett szint az alábbiakban nem szereplő felhasználók számára", + "default_other": "Alapértelmezett (más eszközök)", + "default_tab": "Alapértelmezett lap a panel megnyitásakor", + "delta": "Δ", + "description": "Leírás", + "dtw_blend_w": "Keverési súly", + "dtw_blended": "Kombinált pontszám", + "dtw_ddtw": "DDTW pontszám", + "dtw_l1": "L1 pontszám", + "dtw_matched_profile": "(a ciklus egyeztetett profilja)", + "duration": "Időtartam", + "duration_agreement": "Időtartam-egyezés", + "emphasis": "Hangsúly", + "enable_access_control": "Felhasználónkénti hozzáférés-vezérlés engedélyezése", + "energy": "Energia", + "energy_agreement": "Energia-egyezés", + "event_timeline": "Eseményidővonal", + "event_type": "Eseménytípus", + "expected": "Várt", + "expected_duration": "Várható időtartam (perc)", + "file_kb": "Fájl (kB)", + "final_score": "Végső pontszám", + "from": "Ettől", + "gap_s": "rés(ek)", + "group_name": "Csoport neve", + "head_trim": "Fejszegély(ek)", + "health": "Egészség", + "hide_tabs": "Lapok elrejtése nem rendszergazdák számára", + "in_use": "Használatban", + "json_data": "JSON adatok", + "label": "Program", + "last": "Utolsó", + "last_checked": "Utoljára ellenőrizve:", + "load_from_file": "Betöltés fájlból", + "mae_score": "MAE pontszám", + "manual_duration": "Manuális időtartam (perc, opcionális)", + "match": "Egyezés", + "members": "Tagok", + "metric": "Mérőszám", + "mode_existing_profile": "Hozzáadás a meglévő profilhoz", + "mode_new_profile": "Új profil létrehozása", + "models_fine_tuned": "({count} modell finomhangolva)", + "n_classic_suggestions": "{n} klasszikus", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} kijelölve", + "n_tuning_suggestions": "{n} hangolási javaslat", + "na": "nincs", + "new_profile_name": "Új profilnév", + "notes": "Jegyzetek", + "of": "/", + "outcome": "Eredmény", + "panel_default_tab": "Alapértelmezett lap", + "panel_language": "Panel nyelve", + "per_cycle_short": "ciklus", + "pg_autofill_tip": "Tartomány automatikus kitöltése a jelenlegi értékből ({lo}–{hi})", + "pg_best_value": "A talált legjobb érték", + "pg_current_value": "Jelenlegi érték:", + "pg_drag_hint": "Húzza a vonalat a grafikonon", + "pg_dtw": "DTW", + "pg_ev_ending": "Befejezés", + "pg_ev_running": "Fut", + "pg_group_advanced": "Szélsőséges esetek", + "pg_group_detection": "Érzékelési kiváltók", + "pg_group_timing": "Időzítési szabályok", + "pg_idle": "Tétlen", + "pg_last_run": "Utolsó futtatás: {date}", + "pg_match_score": "Egyezési pontszám", + "pg_pct_of": "{total} {p}%-a", + "pg_poor_match": "Rossz egyezés", + "pg_preset": "Homokozó előbeállítás", + "pg_preset_name": "Új előbeállítás neve", + "pg_preset_none": "Válasszon előbeállítást…", + "pg_strong_match": "Erős egyezés", + "pg_tile_ambiguous": "Kétértelmű", + "pg_tile_ambiguous_tip": "Ciklusok, ahol két program szinte holtversenyben van", + "pg_tile_detected": "Érzékelt", + "pg_tile_detected_tip": "Ciklusok, ahol a teljesítmény elég sokáig lépte túl az indítási küszöböt ahhoz, hogy futóként regisztrálódjon", + "pg_tile_matched": "Egyezett", + "pg_tile_matched_tip": "Ismert programhoz helyesen hozzárendelt ciklusok", + "pg_time_left": "Hátralévő idő", + "pg_weak_match": "Gyenge egyezés", + "phase_name": "Név", + "phase_timeline": "Fázisidővonal", + "power": "Teljesítmény", + "profile": "Profil", + "profile_index": "profilindex →", + "profile_name": "Profil neve", + "program": "Program", + "program_tip": "Felülbírálja, hogy melyik profil illeszkedik az aktuális ciklushoz. Az automatikus észlelés lehetővé teszi, hogy az integráció automatikusan válassza ki a legjobb egyezést. Rögzítsen egy adott programot a kényszer-egyezéshez, ha az automatikus észlelés téves, vagy tudja, mi fut.", + "progress": "Előrehaladás", + "raw_socket": "Nyers csatlakozó", + "read_only": "Csak olvasható", + "ref_cycle": "Referenciaciklus (opcionális)", + "refresh_interval": "Frissítési időköz (s)", + "remaining": "Többi", + "reminder_every": "Emlékeztetés (ciklusonként)", + "remove_label": "- Távolítsa el a címkét -", + "rename_profile": "Profil átnevezése", + "replay_duration": "Visszajátszás", + "resulting_profile": "Az eredményül kapott profil", + "save_mode": "Mentés mód", + "score": "Pontszám", + "score_breakdown": "Pontszám részletezése", + "seconds_from_start": "Másodpercek az elejétől", + "select_profile": "Válassza a Profil lehetőséget", + "setting": "Beállítás", + "settings_a": "Beállítások A (jelenlegi)", + "settings_a_short": "A", + "settings_advanced": "Fejlett", + "settings_b": "Beállítások B (teszt)", + "settings_b_short": "B", + "settings_basic": "Alap", + "settings_detail_level": "Beállítások részletességi szintje", + "settings_overrides": "Beállítás-felülírások", + "show_debug": "Élő mérkőzés hibakereső kártya megjelenítése az Állapot oldalon (bizalom, kétértelműség, legjobb jelöltek)", + "show_expected": "Várható görbefedvény megjelenítése (egyező profil, narancssárga)", + "show_raw": "Nyers csatlakozó kapcsoló megjelenítése az élő teljesítménygrafikonon", + "sparkline": "Legutóbbi ciklusidőtartam-trend", + "stage2": "2. szakasz – alapvető hasonlóság", + "stage3": "3. szakasz – DTW", + "stage4": "4. szakasz – egyezés", + "status": "Állapot", + "tail_trim": "Farokszegély(ek)", + "timer_auto_pause": "Automatikus szünet", + "timer_min": "min", + "timer_msg_placeholder": "Üzenet (nem kötelező, {device}/{program}/{minutes})", + "to": "Eddig", + "ungrouped": "Csoportosítás nélkül", + "unlabelled": "Címkézetlen", + "unlabelled_paren": "(címkézetlen)", + "warp_path": "Torzítási útvonal", + "input": "Bemenet:", + "start": "Kezdés", + "end": "Vége", + "unit_s": "(s)", + "reviewed_on": "áttekintve: {date}", + "unknown": "Ismeretlen", + "quality": "Minőség", + "tags": "Címkék", + "at": "ekkor:", + "pct_match_confidence": "{pct}% egyezési bizalom", + "ha_restarted": "HA újraindult", + "from_start": "Az elejétől", + "to_end": "A végéig", + "click_to_select": "kattints a kijelöléshez", + "envelope": "Sáv", + "zoom_hint": "görgetés a nagyításhoz · dupla kattintás a visszaállításhoz", + "loading_paren": "(betöltés…)", + "time_remaining": "~{v} van hátra", + "no_duration": "nincs időtartam", + "duration_avg": "~{v} perc átlag", + "name_placeholder": "(név)", + "n_shown": ", {n} látható", + "cycles_title": "Ciklusok ({n})", + "pg_detecting": "Észlelés folyamatban", + "pg_best_marker": "Legjobb: {v}", + "pg_time_left_model": "Hátralévő idő (modell)", + "pg_time_left_model_tip": "A modell által becsült hátralévő idő (fázisbecslő + ML keverék), nem statikus visszaszámláló", + "phase": "Fázis", + "pg_mode_simulate": "Szimuláció", + "pg_mode_history": "Tesztelés előzményeken", + "pg_mode_sweep": "Pásztázás", + "pg_ev_detected": "Észlelve", + "pg_ev_match": "Egyezés véglegesítve", + "pg_ev_match_changed": "Egyezés megváltozott", + "pg_ev_ambiguous": "Bizonytalan", + "pg_ev_unmatched": "Nincs egyezés", + "pg_ev_notify_start": "Indítási értesítés", + "pg_ev_notify_pre": "Majdnem kész értesítés", + "pg_ev_notify_finish": "Befejezési értesítés", + "pg_ev_notify_milestone": "Mérföldkő értesítés", + "pg_ev_notify_held": "Értesítés visszatartva (csendes órák)", + "pg_ev_finished": "Befejezve", + "pg_ended": "Véget ért", + "pg_proj_energy": "Becs. energia", + "pg_alert_overrun": "Túlfutás", + "pg_alert_underrun": "Alulfutás", + "pg_alert_did_not_finish": "Nem fejeződött be", + "pg_alert_false_end": "Több ciklusra bomlott", + "pg_alert_unmatched": "Nincs egyezés", + "pg_alert_ambiguous": "Bizonytalan egyezés", + "pg_alert_energy": "Energiarendellenesség", + "pg_newly_correct": "most már helyes", + "pg_regressed": "romlott", + "pg_end_timing_changed": "befejezési idő megváltozott", + "pg_vs_current": "vs jelenlegi", + "pg_fixed": "javítva", + "pg_broke": "elromlott", + "pg_sweep_param": "Paraméter", + "pg_objective": "Cél", + "pg_steps": "Lépések", + "pg_stress_group": "Üresjárati leállás tesztje", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "Üresjárati szint (W)", + "pg_stress_idle_w_desc": "Felülbírálja az automatikusan észlelt készenléti teljesítmény alsó értékét (hagyja üresen az automatikus beállításhoz).", + "pg_stress_toggle": "Üresjárati leállás tesztelése", + "pg_stress_toggle_desc": "Szimulálja, hogy a készülék a felvétel befejezése után a készenléti fogyasztási szintjén marad - megmutatja, hogy és mikor állítja le a WashData a ciklust.", + "pg_sweep_2d": "2D hőtérkép", + "pg_sweep_param_y": "2. paraméter", + "pg_obj_match": "Egyezés pontossága", + "pg_obj_endtiming": "Befejezési idő pontossága", + "pg_obj_falseend": "Téves befejezések aránya", + "pg_obj_overrun": "Időtartam eltérése", + "pg_obj_ambiguity": "Bizonytalanság aránya", + "pg_best_combo": "legjobb kombináció", + "pg_mode_optimize": "Optimalizálás", + "pg_group_matching": "Programillesztés", + "pg_zoom_hint": "dupla kattintás a nagyítás visszaállításához", + "aria_playground_chart2": "Interaktív ciklusteljesítmény-grafikon: vigye rá a mutatót az idő/teljesítmény leolvasásához, görgessen a nagyításhoz, húzza az eltoláshoz", + "pg_alert_timeout_end": "Időtúllépés miatt ért véget, nem előrejelzés alapján", + "pg_alert_indefinite": "Végtelen ideig futna", + "pg_alert_stress_cap": "Elérte a biztonsági korlátot", + "pg_alert_stress_ok": "Üresjárati leállás: a ciklus megállt", + "pg_alert_stress_warn": "Üresjárati fogyasztás meghaladja a leállási küszöböt", + "task_pg_history": "Tesztelés előzményeken", + "task_pg_sweep": "Optimalizálás", + "task_reprocess": "Újrafeldolgozás", + "task_ml_training": "Tanulás", + "eta_secs": "még ~{n} mp", + "eta_mins": "még ~{n} perc", + "pg_recent_runs": "Legutóbbi futtatások", + "pg_load_run": "Futtatás újratöltése", + "pg_match_confidence": "Egyezés megbízhatósága", + "pg_envelope_fit": "Illeszkedés a burkológörbéhez", + "pg_envelope_fit_tip": "Mennyire pontosan marad a ciklus a profil mentett teljesítmény-burkológörbéjén belül, más nézőpont, mint az egyezés megbízhatósága.", + "n_imported_note": ", {n} importált", + "enable_online": "Online funkciók engedélyezése", + "store_brand": "Készülék márkája", + "store_model": "Készülék modellje", + "anonymous": "Névtelen", + "rate_quality": "Minőség értékelése", + "rate_n": "{n} csillag", + "approved_only": "Csak a jóváhagyottak", + "adopt_settings": "Beállítások átvétele is", + "flags": "Jelzők", + "include_phase_map": "Fázistérkép belefoglalása", + "include_settings": "Érzékelési és párosítási beállítások belefoglalása", + "show_contributor": "Közreműködők nevének megjelenítése", + "task_pg_detail": "Ciklus szimulálása", + "task_split": "Ciklus felosztása", + "task_trim": "Ciklus levágása", + "task_merge": "Ciklusok egyesítése", + "task_rebuild": "Burkológörbék újraépítése", + "cat_profiles": "Profilok (programok)", + "cat_real_cycles": "Ciklusok (használati előzmények)", + "cat_reference_cycles": "Referenciaciklusok (importált)", + "cat_custom_phases": "Egyéni fázisok", + "cat_profile_groups": "Profilcsoportok", + "cat_settings": "Észlelési és illesztési beállítások", + "cat_matching_config": "Illesztés finomhangolása", + "cat_ml_models": "ML-modellek", + "cat_feedback": "Visszajelzési és ellenőrzési címkék", + "cat_suggestions": "Javaslatok", + "cat_maintenance_log": "Karbantartási napló", + "cat_history_logs": "Előzmény- és változásnaplók", + "cat_lifetime_stats": "Élettartam-összesítések", + "cycles_short": "ciklus", + "import_mode": "Hogyan egyesítse", + "mode_merge": "Egyesítés (a sajátom megtartása)", + "mode_replace": "Kiválasztottak cseréje", + "cycle_destination": "Hová kerüljenek az importált ciklusok?", + "dest_reference": "Referencia (csak görbe)", + "dest_real_history": "Valós előzmények (statisztikába számít)", + "conflict_resolution": "Névütközések", + "conflict_import_copy": "Importálás másolatként", + "conflict_keep_mine": "A sajátom megtartása", + "conflict_overwrite": "Felülírás", + "font_size": "Panel betűmérete" }, - "phase1b": { - "recorded": "A felvétele {profile_name} névvel lett elmentve. Most rögzítse vagy jelölje meg a többi gyakran használt programját a lefedettség növeléséhez." + "log": { + "all_levels": "Minden szinten", + "all_devices": "Minden eszköz", + "all_components": "Minden komponens", + "search_ph": "Keresés a naplókban…" }, - "phase1c": { - "verify": "Önnek {count} program van a közösségtől. Futtasson egy ciklust, hogy ellenőrizze, a WashData helyesen ismeri-e fel – az egyeztetés javul, ahogy az eszköz saját előzményeket gyűjt." + "ml": { + "builtin_models": "● Beépített modellek használata", + "fit_fair": "Elfogadható", + "fit_good": "Jó", + "fit_slight": "Enyhe", + "fit_strong": "Erős", + "fit_weak": "Gyenge", + "fit_word": "illeszkedési minőség", + "personalized": "● Személyre szabott ehhez a géphez", + "better_than_baseline": "{pct}%-kal jobb az alap becslésnél ({metric})", + "trend_improving_tip": "Ennek a modellnek az illeszkedése javult a legutóbbi újraellenőrzések során.", + "trend_declining_tip": "Ennek a modellnek az illeszkedése romlott a legutóbbi újraellenőrzések során · több ciklus áttekintése segíthet az újratanulásban.", + "trend_steady_tip": "Ennek a modellnek az illeszkedése nagyjából változatlan maradt a legutóbbi újraellenőrzések során.", + "cap_blurb": { + "end": "Annak felismerése, hogy egy ciklus valóban befejeződött", + "live_match": "A futó program gyorsabb azonosítása", + "quality": "Tévesen észlelt vagy sérült ciklusok felismerése", + "remaining_time": "A hátralévő idő előrejelzése", + "total_energy": "A teljes energia és költség előrejelzése" + }, + "cap_label": { + "end": "Ciklus végének észlelése", + "live_match": "Programfelismerés", + "quality": "Ciklusminőség ellenőrzése", + "remaining_time": "Hátralévő idő becslése", + "total_energy": "Energiabecslés" + }, + "metric_auc": "AUC {auc} a félretett adatokon", + "metric_mae": "hiba: {model} a(z) {baseline} referenciához képest" }, - "phase2": { - "cluster": "A WashData {count} ciklust látott, amelyek nem felelnek meg egyetlen mentett programnak sem – hasonlítanak egymásra. Szeretne létrehozni nekik egy új profilt?", - "unmatched": "Az utolsó ciklus nem felelt meg egyetlen mentett programnak sem. Ez egy új program?" + "modal": { + "auto_label": "Automatikus címkézési ciklusok", + "correct_feedback": "Helyes visszajelzés", + "create_profile": "Profil létrehozása", + "cycle": "Ciklus", + "edit_group": "Profilcsoport szerkesztése", + "edit_phase": "Fázis szerkesztése", + "import_config": "Konfiguráció importálása", + "label_cycle": "Címkeciklus", + "merge_cycles": "Egyesítsen {n} ciklust", + "new_group": "Új profilcsoport", + "new_phase": "Új fázis", + "process_history_msg": "Futtassa újra az egyeztetést, frissítse a javaslatokat, tanítsa újra az ML-t (ha engedélyezve van) és számolja újra a ciklusok egészségét az összes tárolt cikluson. Ez eltarthat egy ideig.", + "process_history_ok": "Feldolgozás", + "process_history_title": "Előzmények feldolgozása", + "process_recording": "Folyamat rögzítése", + "delete_maintenance_msg": "Törli ezt a karbantartási bejegyzést? Ez nem vonható vissza.", + "delete_maintenance_title": "Karbantartási esemény törlése", + "relabel_cycles": "{count} ciklus átcímkézése", + "delete_automation_title": "Automatizálás törlése", + "delete_automation_msg": "Törlöd a(z) \"{name}\" automatizálást a Home Assistantból? Ez nem vonható vissza.", + "remove_legacy_title": "Régi műveletek eltávolítása", + "remove_legacy_msg": "Eltávolítod a régi egyéni műveleteket? A ciklusesemények során többé nem fognak elsülni. Ez a panelről nem vonható vissza.", + "discard_recording_title": "Felvétel eldobása", + "discard_recording_msg": "Eldobod a mentett felvételt? Ez nem vonható vissza.", + "dismiss_all_title": "Összes visszajelzés elvetése", + "dismiss_all_msg": "Elveted mind a(z) {count} függőben lévő visszajelzési kérést?", + "dismiss_all_ok": "Összes elvetése", + "delete_phase_title": "Fázis törlése", + "delete_phase_msg": "Törlöd a(z) \"{name}\" fázist?", + "clear_debug_title": "Hibakeresési adatok törlése", + "clear_debug_msg": "Törlöd az összes tárolt hibakeresési nyomvonalat?", + "wipe_all_title": "Összes adat törlése", + "wipe_all_msg": "⚠️ Ez véglegesen törli az ÖSSZES ciklust és profilt. Ez nem vonható vissza.", + "wipe_all_ok": "Minden törlése", + "force_stop_title": "Ciklus kényszerített leállítása", + "force_stop_msg": "Kényszerítve leállítod most az aktív ciklust? A ciklus megszakítottként lesz elmentve.", + "store_import": "Referenciaciklus importálása", + "store_share": "Megosztás a közösségi boltban", + "store_share_device": "Eszköz megosztása", + "export_select": "Exportálás - adatok kiválasztása", + "import_wizard": "Importálás - adatok kiválasztása" }, - "phase3": { - "suggestions": "A WashData a ciklustörténete alapján beállítási javaslatokkal rendelkezik – tekintse át ezeket az észlelési pontosság javítása érdekében.", - "groups": "Néhány profilja ugyanolyannak tűnik, mint ugyanaz a program különböző hőmérsékleteken. Rendezze csoportba a jobb egyeztetés érdekében.", - "phases": "Adjon programfázisokat a(z) {profile_name} profilhoz a pontosabb hátralévő idő becslések érdekében." + "msg": { + "appliance_monitor": "Készülék monitor", + "artifact_dip_detail": "~{n}s-re a szokásos energiasáv alá esett.", + "artifact_footer": "A fenti grafikonon kiemelve. Ezek átmeneti műtermékek (pl. a ciklus közepén kinyílt ajtó), nem feltétlenül problémák.", + "artifact_header": "{n} rendellenesség észlelve ebben a ciklusban", + "artifact_pause_detail": "A teljesítmény ~{n}s-re közel nullára esett, majd visszatért – valószínűleg kinyílt az ajtó a ciklus közben, vagy a ciklus szünetelt.", + "artifact_spike_detail": "~{n}s-re a szokásos energiasáv felett volt.", + "auto_label_intro": "Rendeljen hozzá profilokat címkézetlen ciklusokhoz, amelyek egyezési megbízhatósága törli a küszöböt.", + "automations_intro": "A WashData {start} / {end} eseményeket küld és entitásokat tesz elérhetővé, ezért az értesítések és műveletek legjobban normál Home Assistant automatizálásként építhetők fel. Az ezt az eszközt használó automatizálások alább jelennek meg.", + "cleanup_intro": "Minden címkézett ciklus átfedi. Jelölje be a kiugró értékeket, és törölje a profilt a profil megtisztításához.", + "clear_debug_hint": "Távolítsa el a tárolt hibakeresési adatokat, hogy helyet szabadítson fel.", + "collecting_data": "Adatgyűjtés folyamatban - még {need} ciklus szükséges a finomhangolás megkezdéséhez ({current}/{min}).", + "compare_overlay_profiles": "Fedőprofilok (halvány)", + "compare_profiles_tip": "Fedjen rá más profilborítékokat a fenti diagramra, hogy megtudja, melyik illik legjobban ehhez a ciklushoz.", + "compare_selected_cycles": "Kiválasztott ciklusok (folytonos) – megjelenítés/elrejtés", + "consider_new_profile": "Fontolja meg egy új profil létrehozását.", + "coverage_gap": "a legutóbbi ciklusoknak nincs megfelelő profilja (az utolsó 30 {pct}%-a).", + "coverage_gap_similar_cycles": "{count} hasonló felcímkézetlen ciklus található – hozzon létre egy profilt az egyeztetés megkezdéséhez.", + "cycles_deleted": "{count} ciklus törölve", + "enough_data": "Elegendő adat a tanuláshoz ({current}/{min} ciklus).", + "export_description": "Válaszd ki pontosan, mely profilokat, ciklusokat, beállításokat és egyebeket exportálsz JSON-ba, vagy elemezz egy fájlt, és csak a kívánt részeket importáld.", + "feedback_cycles_pending": "{n} ciklus{s} áttekintésre vár", + "feedback_prompt": "Erősítse meg, hogy helyes volt, javítsa ki a programot, vagy hagyja figyelmen kívül.", + "feedback_relabel_hint": "Ennek a ciklusnak az újracímkézése ezt is megoldja.", + "filter_by_profile": "Szűrés profil szerint…", + "group_modal_help": "Azonos alakú programok, amelyek hőmérséklete/centrifugálása különbözik (az időtartam változhat). Az egyezés pontozza a csoportot, mint egy jelöltet, majd kiválasztja a legmegfelelőbb tagot. Válasszon legalább 2-t; az átfedés megmutatja, mennyire hasonlítanak egymásra.", + "group_not_cohesive": "Ezek a profilok nem eléggé hasonlóak ahhoz, hogy megbízhatóan csoportosítsák, ezért az egyeztetés egyenként kezeli őket, amíg el nem távolítja a kiugró értéket, vagy fel nem osztja a csoportot.", + "group_preview_hint": "Jelöljön ki 2+ tagot, hogy előnézze és összehasonlítsa teljesítménygörbéiket.", + "import_intro": "Töltsön be egy exportált fájlt, vagy illesszen be egy JSON-adatot alább.", + "legacy_actions_title": "{count} örökölt egyéni művelet továbbra is fut", + "live_chart_loading": "Az élő teljesítmény diagram megjelenik a leolvasások megérkezésekor.", + "loading": "Terhelés…", + "loading_curve": "Görbe betöltése…", + "loading_settings": "Beállítások betöltése…", + "log_buffer_hint": "A legújabbak előtt · puffereli az utolsó 500 ha_washdata rekordot az újraindítás óta · húzza az alsó szélét az átméretezéshez.", + "maintenance_advisory": "A növekvő időtartam/energiafogyasztás jelezheti a készülék karbantartását (pl. vízkőmentesítés, szűrőtisztítás).", + "maintenance_due": "Esedékes karbantartás: {items}", + "maintenance_intro": "Rögzítse az ezen a készüléken végzett karbantartást, és emlékeztetőt kap, amikor egy feladat ismét esedékessé válik.", + "maintenance_load_error": "Nem sikerült betölteni a karbantartási adatokat: {error}", + "maintenance_requires_access": "A karbantartás és az export/import teljes hozzáférést igényel.", + "manual_duration_hint": "A profil átlagos/várható ciklushossza, a hátralévő idő becsléseihez használva. Szerkesztés a beállításhoz; változatlanul hagyva az aktuális értéket megtartja.", + "matching_tuning_intro": "Tanuláskor a WashData azt is beállítja, hogy a programillesztés mennyi súlyt jelent a formának az időtartamhoz és az energiához képest.", + "merge_intro": "A kiválasztott ciklusokat egyesítjük (időrendi sorrendben; 0 W-tal kitöltött hézagok). Válassza ki a kapott profilt.", + "ml_intro": "A WashData intelligens modellekkel szállítjuk, amelyek már a dobozból kivehetők.", + "ml_learned_intro": "Ehhez a géphez finomhangolt modellek.", + "ml_loading": "ML betöltése…", + "ml_settings_intro": "Két független kapcsoló: az egyik a ciklus futása közben alkalmazza a modelleket, a másik lehetővé teszi, hogy a WashData idővel finomhangolja őket a gépére.", + "name_first_program": "Elég ciklusa van – nevezze el az első programját az egyeztetés elindításához.", + "near_duplicate_cluster": "majdnem ismétlődő profilfürt észlelve. A csoportosítás lehetővé teszi, hogy a párosítás megbízhatóan válasszon a hasonlók között (pl. ugyanaz a program különböző hőmérsékleten/centrifugáláson).", + "no_cycles_match": "Egyetlen ciklus sem felel meg az aktuális szűrőnek.", + "no_cycles_profile": "Nincs ciklus ehhez a profilhoz.", + "no_cycles_selected": "Először válasszon legalább egy ciklust.", + "no_cycles_yet": "Még nem rögzítettek ciklusokat.", + "no_device_selected": "Nincs kiválasztott eszköz.", + "no_devices": "Még nincs konfigurálva WashData eszköz.", + "no_envelope": "Még nincs boríték – címkézési ciklusok után építse újra.", + "no_envelope_overlay": "Nincs boríték lefedéshez.", + "no_fine_tuned": "Még nincs finomhangolás – a WashData a beépített modelljeit használja.", + "no_logs": "Még nincsenek pufferelt naplórekordok.", + "no_maintenance": "Még nincs rögzített karbantartás.", + "no_match_yet": "Még nincs párosítási kísérlet – ez egy futási ciklus alatt töltődik fel.", + "no_other_users": "Nem található más Home Assistant felhasználó.", + "no_phases": "Nincsenek meghatározott fázisok.", + "no_phases_assigned": "Nincsenek hozzárendelve fázisok.", + "no_profiles_compare": "Nincs összehasonlítható profil.", + "no_profiles_overlay": "Nincsenek fedendő profilok.", + "no_profiles_yet": "Még nincsenek profilok. Hozzon létre egyet egy felcímkézett ciklusból.", + "no_profiles_yet_short": "Még nincsenek profilok.", + "no_settings_match": "Egy beállítás sem felel meg a következőnek: \"{q}\"", + "no_split_points": "Még nincsenek megosztott pontok.", + "no_suggestions": "Nincsenek aktív javaslatok.", + "notify_services_hint": "Használja a(z) {entity} szolgáltatásazonosítókat (több esetén vesszővel elválasztva). Sablonváltozók: {vars}.", + "old_actions_warning": "A régi műveletszerkesztővel konfigurálva (most eltávolítva). Továbbra is aktiválják a cikluseseményeket, de már nem szerkeszthetők itt. Alakítsa át őket normál automatizálássá, vagy távolítsa el őket.", + "onboarding_progress": "{n} / 3 ciklus megfigyelve", + "onboarding_watching": "Használja a készülékét a szokásos módon – a WashData figyel. 3 ciklus után elindul a programegyeztetés.", + "pending_feedback": "Függőben lévő észlelési visszajelzés", + "performance_trend": "Teljesítménytrend ({n} ciklus)", + "pg_analysis_empty": "Töltsön be egy ciklust az egyezéselemzés megtekintéséhez.", + "pg_apply_confirm": "Alkalmazza a legjobb értéket: {label} = {value}?", + "pg_canvas_empty": "Válasszon fent egy ciklust, majd nyomja meg a Betöltés gombot a teljesítménygörbéjének megtekintéséhez.", + "pg_chart_caption": "Érzékelési/egyezési arány a {param} értékei szerint", + "pg_ctrl_intro": "Az értékek az eszköz aktív integrációs beállításaiból indulnak. A módosítások a Homokozóban maradnak, amíg el nem menti őket a beállításokba.", + "pg_live_unavailable": "Az aktív beállítások nem érhetők el, az alapértelmezett értékek láthatók.", + "pg_load_live_confirm": "Elveti a Homokozó módosításait ({n}), és újratölti az integráció jelenlegi beállításait?", + "pg_match_rate": "{pct}% egyezési arány {total} cikluson", + "pg_matches_live": "Megegyezik az aktív beállításokkal", + "pg_n_changed": "Eltérés az aktív beállításoktól: {n}", + "pg_sugg_none": "Minden javaslat már megfelel a jelenlegi beállításoknak", + "pg_preset_delete_confirm": "Törli a(z) \"{name}\" előbeállítást?", + "pg_preset_limit": "Elérte az előbeállítások korlátját ({n})", + "pg_preset_overwrite": "Felülírja a(z) \"{name}\" előbeállítást?", + "pg_publish_one_confirm": "Elmenti a(z) {label} = {value} értéket az eszköz beállításaiba?", + "pg_restart_note": "Indítsa újra a Home Assistantot a szimulációs eszközök engedélyezéséhez.", + "pg_sim_progress": "{done} / {total} ciklus", + "pg_starting": "Indítás…", + "pg_stress_synthetic": "az üresjárati szimuláció itt kezdődik", + "pg_sweep_intro": "Mi lenne, ha a {param} más lenne? Teszteljen {steps} értéket az utolsó {cycles} cikluson, hogy megtalálja azt a beállítást, ahol a legtöbb ciklus helyesen egyezik.", + "pg_sweep_step": "{done} / {total}. lépés", + "pg_undetected": "{n} nem észlelt ciklus", + "pg_verdict_bad": "Figyelmet igényel: sok ciklus észrevétlen marad.", + "pg_verdict_good": "Jól hangolva: a legtöbb ciklust helyesen azonosítja és párosítja.", + "pg_verdict_ok": "Elfogadható: néhány ciklus kimaradt. Próbálja meg csökkenteni az indítási küszöböt.", + "phase_catalog_intro": "Egy ciklus elnevezett szegmensei (Előmosás, Fűtés, Centrifugálás…). Rendelje hozzá őket egy profilhoz a vezérlőpultjáról.", + "phase_ranges_intro": "A fázistartományok (a ciklus kezdetétől számított percek) átfedik az átlaggörbét. Szerkessze az értékeket az élő előnézethez.", + "playground_intro": "Biztonságos homokozó a korábbi ciklusok különböző beállításokkal való lejátszásához, két konfiguráció egymás melletti összehasonlításához, és annak vizsgálatához, hogyan illeszkedik egy ciklus egy profilhoz. Itt semmi sem változtatja meg az élő adatait, amíg kifejezetten nem alkalmazza.", + "playground_needs_restart": "Indítsa újra a Home Assistantot a Homokozó eszközök engedélyezéséhez.", + "preferences_admin": "Beállítások, panel és hozzáférés-vezérlés", + "preferences_adv": "Preferenciák", + "prefs_personal": "Ezek csak a Home Assistant-fiókra vonatkoznak.", + "process_history_hint": "Futtassa újra az egyeztetést az összes tárolt cikluson, frissítse a hangolási javaslatokat, tanítsa újra az ML modelleket (ha engedélyezve van) és számolja újra a ciklusok egészségét. Futtassa ezt egy áttekintési köteg után.", + "profile_deleted": "Profil törölve", + "profile_poor_health_detail": "Az ehhez a profilhoz rendelt ciklusok alakja inkonzisztens vagy alacsony a megbízhatóságuk. Fontolja meg a boríték újjáépítését vagy a címkézett ciklusok áttekintését.", + "profiles_intro": "Kattintson egy profilra a statisztikák, fázisok és tisztítás megtekintéséhez. Csoportosítsa a közel azonos programokat (azonos forma/időtartam, eltérő hőmérséklet vagy centrifugálás), így az illesztés megbízhatóan kiválasztja őket.", + "rbac_hint": "Ha ki van kapcsolva, minden Home Assistant felhasználó teljes hozzáféréssel rendelkezik (alapértelmezett). A rendszergazdák mindig teljes hozzáféréssel rendelkeznek, és mindenkit kezelhetnek.", + "recent_logs": "Legutóbbi ha_washdata rekordok", + "recording_in_progress": "Felvétel folyamatban", + "reminders_intro": "Emlékeztető megjelenítése a panelen ennyi ciklussal az utolsó szerviz után. Hagyja üresen vagy 0-ra az emlékeztető kikapcsolásához.", + "restart_gap_footer": "Kiemelve a grafikonon. A teljesítményadatok hiányoznak ezekre az intervallumokra; az egyeztetés csak valós méréseket használt.", + "restart_gap_header": "{n} HA-újraindítás-rés ezen ciklus alatt", + "restart_gap_item": "{dur} rés", + "review_confirm_help": "Ellenőrizze, hogy ezt a ciklust megfelelően észlelték-e. Az Ön véleménye megtanítja a modellt a gépén – minél több ciklust erősít meg, annál jobb lesz az egyezés és az állapotpontozás. Elég egy gyors Jó/Rossz.", + "review_in_settings": "Tekintse át a Beállításokban", + "review_notes_placeholder": "Megjegyzések (opcionális)", + "review_notes_tip": "Szabad szövegű jegyzetek saját referenciaként. Nem használtak párosításhoz vagy edzéshez.", + "review_profile_tip": "A program ezt a ciklust címkével látja el. Ha az automatikusan észlelt program hibás volt, javítsa ki itt – a címkézés megtanítja a jövőbeli ciklusokhoz való illeszkedést.", + "review_quality_tip": "Milyen tiszta ez a ciklus. Jó = a program tankönyvi példája; Rossz = észlelt, de zajos vagy atipikus; Használhatatlan = rosszul észlelt (egyesített, csonkolt vagy hamis). Megadja az állapotpontszámot és azt, hogy mely ciklusok engedélyezettek a modell betanításához.", + "review_recorded_tip": "Jelölje meg ezt a programhoz tartozó, kézzel kiválasztott referenciaciklusként – ugyanaz a szerep, mint egy kézzel rögzített ciklus. A referenciaciklusokat mindig megőrizzük, a megfelelő sablont vetjük be, és soha nem vetik el őket a tisztítás során. (Ez az \"arany\"/rekord zászló; mindkettő ugyanaz.)", + "review_tags_tip": "Opcionális jelzők, amelyek leírják, hogy mi hibázott ebben a ciklusban, így a képzés és a tisztítás megmagyarázhatja.", + "review_to_cycles": "Nyissa meg a Ciklusok áttekintési sort", + "saving_triggers_reload": "A mentés az integráció újratöltését indítja el. A HA entitások rövid időre elérhetetlenként jelenhetnek meg.", + "search_placeholder": "Keresési beállítások…", + "see_recorder": "Lásd alább a felvevő widgetet", + "setting_changed": "Módosítva: {old} → {new} ekkor: {date}", + "settings_basic_note": "Az alapvető beállítások láthatók. Váltson Fejlett nézetre a teljes listához.", + "shape_drift_advisory": "⚠ Alakváltás", + "shape_drift_detail": "Ennek a profilnak a teljesítménymintázata idővel megváltozott – lehetséges készülékhasználat okozta kopás vagy szükséges karbantartás (pl. vízkőmentesítés, szűrőtisztítás).", + "show_all_settings": "Minden beállítás megjelenítése", + "showing_suggestions": "{count} beállítás megjelenítése javaslatokkal.", + "split_intro": "Kattintson a diagramra egy osztási pont hozzáadásához vagy eltávolításához, vagy az üresjárati hézagok automatikus észleléséhez. Minden eredményül kapott szegmens saját profilt kaphat.", + "storage_diagnostics": "Tárolási statisztikák, karbantartás, export/import", + "sug_staged": "{key} = {val} beállítva. Mentse el az alkalmazáshoz.", + "toast_auto_detect_enabled": "Automatikus felismerés engedélyezve", + "toast_auto_label_complete": "Automatikus jelölés kész", + "toast_auto_label_failed": "Automatikus jelölés sikertelen: {error}", + "toast_automation_failed": "Nem sikerült automatizálást létrehozni: {error}", + "toast_automation_migrated": "Műveletek áttelepítve automatizálásba; megnyílik a szerkesztő", + "toast_convert_failed": "Átalakítás sikertelen: {error}", + "toast_create_failed": "Létrehozás sikertelen: {error}", + "toast_delete_failed": "Törlés sikertelen: {error}", + "toast_error": "Hiba: {error}", + "toast_failed": "Sikertelen: {error}", + "toast_force_stop_failed": "Kényszer leállítás sikertelen: {error}", + "toast_name_required": "Név megadása kötelező", + "toast_no_automation": "Itt nem lehet automatizálást létrehozni", + "toast_profile_name_required": "A profil neve kötelező", + "toast_program_set": "Program beállítva: {program}", + "toast_rebuild_failed": "Újraépítés sikertelen: {error}", + "toast_resume_failed": "Folytatás sikertelen: {error}", + "toast_revert_failed": "Visszaállítás sikertelen: {error}", + "toast_reverted": "{key} visszaállítva", + "toast_save_failed": "Mentés sikertelen: {error}", + "trend_duration_longer": "Az időtartam egyre hosszabb ({pct}%/ciklus) – legutóbbi átlag: {avg}", + "trend_duration_shorter": "Az időtartam egyre rövidebb ({pct}%/ciklus) – legutóbbi átlag: {avg}", + "trend_energy_down": "Az energia csökkenő tendenciája ({pct}%/ciklus)", + "trend_energy_up": "Emelkedő energiatrend ({pct}%/ciklus) – legutóbbi átlag {avg}", + "trim_destructive_confirm": "Ez a ciklusnak csak {pct}%-át tartja meg, és nem vonható vissza. Folytatja?", + "trim_intro": "Húzza el a piros fogantyúkat, vagy írjon be értékeket. Az ablakon kívül mindent eltávolítanak.", + "tuning_suggestions_available": "{count} hangolási javaslat érhető el a megfigyelt ciklusokból. A megfelelő mezők mellett jelennek meg.", + "unsure_detected_prefix": "A WashData nem biztos abban, hogy észlelte", + "updated": "Frissítve", + "warmup_badge": "Még tanul ({done}/{needed} ciklus)", + "warmup_detail": "Ez a profil {needed} felcímkézett ciklust igényel, mielőtt az automatikus egyeztetés megkezdődik. Minden megerősített ciklus segít tanulni.", + "wipe_history_warning": "Véglegesen törölje az összes ciklust és profilt. Nem vonható vissza.", + "compare_overlay_tip": "Rárajzolt tanult profilsávok, hogy lásd, melyik programra hasonlít az egyes ciklusok.", + "duration_trend_up_tip": "Időtartam nő ({pct}%/ciklus)", + "duration_trend_down_tip": "Időtartam csökken ({pct}%/ciklus)", + "energy_trend_up_tip": "Energia nő ({pct}%/ciklus)", + "energy_trend_down_tip": "Energia csökken ({pct}%/ciklus)", + "performance_trending": "Teljesítmény tendenciát mutat", + "pg_select_cycle_hint": "Jelölj ki egy ciklust, majd kattints a ↺ gombra a betöltéshez", + "pg_sweep_progress": "{done}. / {total}. lépés", + "pg_analysis_hint": "Jelölj ki egy ciklust, majd kattints a ↺ gombra az elemzés betöltéséhez.", + "diagnostics_load_failed": "Nem sikerült betölteni a diagnosztikát: {error}", + "manual_duration_ref_hint": "Csak akkor használatos, ha nincs kiválasztva referenciaciklus. A referenciaciklus a saját hossza alapján állítja be az időtartamot.", + "toast_convert_rolled_back": "Az átalakítás sikertelen volt, és visszavonásra került (nem maradt automatizálás): {error}", + "toast_convert_orphan": "Az automatizálás létrejött, de a régi műveletek törlése sikertelen volt. Ne próbálja újra: távolítsa el a régi műveleteket kézzel a duplikált automatizálás elkerülése érdekében.", + "advisory_duration_trend_up": "A(z) '{name}' ciklusai fokozatosan hosszabbak (ciklusonként kb. +{pct}%). Ha a készülék működése megváltozott, rögzítse újra vagy építse újra ezt a profilt.", + "advisory_energy_trend_up": "A(z) '{name}' fokozatosan több energiát fogyaszt (ciklusonként kb. +{pct}%) - érdemes ellenőrizni a készüléket, ha ez váratlan.", + "advisory_poor_health": "A(z) '{name}' illeszkedési pontszáma alacsony - a közelmúltbeli ciklusai erősen ingadoznak vagy gyengén illeszkednek. Nézze át a ciklusait, vagy rögzítse újra a profilt, hogy a felismerés és az időbecslés pontos maradjon.", + "advisory_shape_drift": "A(z) '{name}' jelentősen eltért az eredeti teljesítménygörbéjétől. A készülék működése idővel megváltozhatott (pl. vízkő, kopás). Fontolja meg a profil újrarögzítését a közelmúltbeli ciklusokkal.", + "advisory_shape_drift_corr": "A(z) '{name}' jelentősen eltért az eredeti teljesítménygörbéjétől (korreláció: {corr}). A készülék működése idővel megváltozhatott (pl. vízkő, kopás). Fontolja meg a profil újrarögzítését a közelmúltbeli ciklusokkal.", + "pg_no_alerts": "Ebben a futásban nem észlelt problémát.", + "pg_override_active": "A szerkesztett beállításait használja a jelenlegiekhez képest", + "pg_history_intro": "Játssza le legutóbbi ciklusait a valódi érzékelőn és illesztőn keresztül. Először szerkesszen egy érzékelési beállítást a Szimuláció módban, hogy itt egy előtte/utána összehasonlítást lásson.", + "pg_history_empty": "Nyomja meg a Futtatás gombot a ciklusai lejátszásához.", + "pg_history_summary": "{detected}/{total} észlelve · {correct} helyesen illesztve", + "pg_sweep_no_metric": "Nincs elég adat ennek a célnak az értékeléséhez.", + "pg_sweep_intro2": "Keresse meg azt a beállítást, amely a legjobban teljesíti a célt a legutóbbi ciklusaiban. Semmi sem változik, amíg nem alkalmazza.", + "pg_running_history": "Ciklusaid visszajátszása…", + "pg_running_sweep": "Értékek tesztelése az összes ciklusodon…", + "pg_row_load_hint": "Ciklus betöltése a fenti grafikonba", + "pg_history_intro2": "Játszd vissza a legutóbbi ciklusaidat a valódi érzékelőn és illesztőn keresztül a fenti beállításokkal. Kattints bármely sorra a ciklus grafikonba töltéséhez; módosíts egy beállítást az előtte/utána összehasonlításhoz.", + "pg_simulating": "Ciklus szimulálása…", + "pg_canvas_empty2": "Válassz ki egy ciklust fent, és nyomd meg a Futtatás gombot a szimulációhoz. Ezután vidd rá a mutatót az értékek leolvasásához, görgess a nagyításhoz, és húzd az eltoláshoz.", + "pg_apply_settings_confirm": "Elmenti ezt a(z) {n} beállítást erre az eszközre? {list}", + "pg_stress_terminated_detail": "Körülbelül {idle} W üresjárati szinten állandósult -- a ciklus {h} ó {m} p múlva {reason} révén ért véget.", + "pg_stress_above_threshold_detail": "Az üresjárati fogyasztás (kb. {idle} W) eléri vagy meghaladja a tényleges leállási küszöböt ({stop} W) -- a ciklust soha nem érzékelte csendesnek. A javításhoz növelje a stop_threshold_w értékét.", + "pg_stress_hit_cap_detail": "A ciklus {h} ó {m} p futott leállás nélkül -- a biztonsági korlát kényszerítette leállásra. Üresjárati fogyasztás {idle} W a(z) {stop} W leállási küszöbhöz képest.", + "no_logs_match": "Egyetlen naplóbejegyzés sem felel meg ezeknek a szűrőknek.", + "pg_analysis_hint2": "Válasszon egy ciklust, és nyomja meg a Futtatás gombot az egyezéselemzés betöltéséhez.", + "pg_analysis_empty2": "Nyomja meg a Futtatás gombot az egyezéselemzés megtekintéséhez.", + "imported_readonly": "A közösségi boltból importálva. Referenciaként és egyeztetéshez jelenik meg. Nem számít bele a statisztikákba, és nem szerkeszthető.", + "merge_no_imports": "Az importált felvételek nem egyesíthetők valódi ciklussal. Az egyesítéshez szüntesse meg a kijelölésüket.", + "store_enable_hint": "A közösségi referenciaciklusok böngészéséhez és importálásához engedélyezze az online funkciókat a Beállításokban.", + "online_intro": "Ossza meg és töltsön le referenciaciklusokat más WashData-felhasználókkal. Minden online funkció opcionális és alapértelmezés szerint ki van kapcsolva.", + "store_share_intro": "Töltse fel ezt a referenciaciklust, hogy az azonos készülékkel rendelkezők is használhassák. Nyilvános megjelenés előtt ellenőrzésre kerül.", + "online_intro_global": "Böngésszen és osszon meg referenciafelvételeket más WashData-felhasználókkal, és erősítsen meg készülékbejegyzéseket. Egyetlen kapcsolat a teljes WashData-integrációra vonatkozik; a készülék márkája és modellje eszközönként, az Alapkonfiguráció szakaszban állítható be. Minden online funkció opcionális és alapértelmezés szerint ki van kapcsolva.", + "online_unavailable": "Az online funkciók nem érhetők el ezen a szerveren.", + "store_picker_offline": "A közösségi katalógusból való választáshoz engedélyezze az online funkciókat a beállítások fogaskerekénél.", + "pick_brand_first": "Először válasszon készülékmárkát.", + "model_not_found": "Még nincs a katalógusban.", + "connect_to_confirm": "A megerősítéshez vagy értékeléshez csatlakozzon a beállítások fogaskerekénél.", + "adopt_settings_hint": "Felülírja az eszköz érzékelési és párosítási küszöbeit a megosztottakkal. Az értesítések, entitások és energiaár soha nem változnak.", + "include_settings_hint": "Ossza meg az eszköz felismerési és párosítási küszöbeit (nem az értesítéseit, entitásait vagy energiaárát). Az átvevők döntik el, hogy alkalmazzák-e.", + "onboard_download": "Új eszköz? Vegyen át egy kész beállítást (programok, referenciaciklusok és fázisok) egy másik WashData-felhasználótól, akinek ugyanolyan készüléke van.", + "share_consent": "Megerősítem, hogy ezek a ciklusok normálisan, megszakítás nélkül fejeződtek be", + "share_device_none": "Még nincsenek megosztható ciklusok. Először jelöljön meg egy rögzített vagy kézzel kiválasztott ciklust referenciaciklusként (⭐) a Ciklusok lapon.", + "share_guideline_naming": "Minden profilt pontosan úgy nevezzen el, ahogy a készülék tárcsáján vagy kijelzőjén megjelenik (pl. 'Cotton 40', 'Eco 60').", + "share_guideline_quality": "Csak normálisan befejezett ciklusokat osszon meg -- sem ciklus közbeni megszakítás, sem ajtónyitás, sem teljesítményhiba.", + "share_guideline_review": "A feltöltés függőben indul, és akkor válik nyilvánossá, ha elegendő közösségi tag megerősíti.", + "share_guidelines_title": "Megosztás előtt", + "store_download_device_intro": "Vegyen át minden megosztott programot és annak referenciaciklusait az eszközére. A saját rögzített ciklusait és statisztikáit nem érinti.", + "store_share_device_intro": "Töltse fel a(z) {brand} {model} eszközt a kiválasztott referenciaciklusokkal. Más, ugyanolyan készülékkel rendelkezők átvehetik programjait. A bejegyzések felülvizsgálatra kerülnek nyilvánossá válás előtt.", + "share_profile_no_cycles": "Nincsenek referenciaciklusok -- jelöljön meg egy ciklust ⭐-gal a Ciklusok lapon, hogy belefoglalhassa ezt a profilt", + "advisory_phase_inconsistent": "Úgy tűnik, hogy a(z) '{name}' különböző programokat vagy hőmérsékleteket kever - ciklusai nagyon eltérő ideig fűtenek. Ha külön profilokra bontja (pl. hőmérsékletenként), az javítja a párosítást és az időbecsléseket.", + "advisory_phase_inconsistent_title": "⚠ Esetleg kevert programok", + "export_select_intro": "Jelöld be pontosan, mit szeretnél belefoglalni. Ha a profilokat a ciklusaik nélkül választod ki, akkor is felismerhető program exportálódik (a megtanult görbéje vele utazik).", + "import_analyze_hint": "Tölts be egy exportált fájlt (vagy illeszd be a JSON-ját). A WashData elemzi, és pontosan megmutatja, mi importálható, mielőtt bármi megváltozna.", + "analyzing": "Elemzés…", + "device_type_mismatch_warn": "Ez az export egy másik készüléktípusból származik ({src} vs {local}). A programok és ciklusok továbbra is importálhatók referenciaadatként, de a készülékspecifikus beállítások és a valós előzmények importálása le van tiltva.", + "merge_hint": "Az importált elemek hozzáadódnak; semmi helyi adat nem vész el. A névütközéseket alább oldhatod fel.", + "replace_warn": "Minden bejelölt kategória törlődik, és a fájlból cserélődik le. A be nem jelölt kategóriák érintetlenül maradnak.", + "dest_reference_hint": "Az importált ciklusok csak a programfelismerést javítják, és soha nem befolyásolják a használati/energia-statisztikákat.", + "dest_real_history_hint": "Az importált ciklusok ennek a készüléknek a saját előzményeiként számítanak, és az energia-/használati statisztikákat táplálják. Egy készülék új telepítésre költöztetéséhez használd.", + "sug_muted": "Ezt a beállítást nem javasolja többé", + "sug_mute_failed": "Nem sikerült elhallgattatni a javaslatot", + "sug_unmuted_all": "Az elhallgattatott javaslatok visszaállítva", + "n_suggestions_muted": "{count} elhallgattatva; az automatikus finomhangolás nem fogja javasolni ezeket.", + "font_size_hint": "Tegye nagyobbá vagy kisebbé mindent a panelen. Az ezen az eszközön lévő fiókjára vonatkozik." }, - "phase4": { - "healthy": "Ez az eszköz teljesen be van állítva ({profile_count} profil)." + "phase_desc": { + "anti_crease": "Alkalmankénti rövid bukdácsolás a befejezés után a ráncok csökkentése érdekében.", + "anti_wrinkle": "Időszakos ciklus utáni zuhanás a ráncok csökkentése érdekében.", + "cool_down": "Zuhanás hő nélkül a ciklus vége felé.", + "drain_and_switch": "Átmeneti időszak a mosásból a szárítási módba.", + "dry": "Szárítási szakasz fűtőberendezéssel és/vagy maradékhővel.", + "drying": "Fő fűtött bukfencezési időszak.", + "heat_up": "A fűtőelem kezdeti bemelegítése a teljes szárítás megkezdése előtt.", + "pre_rinse": "Első lepermetezés a mosószeres mosás előtt.", + "pre_wash": "Első áztatás vagy előkezelés a főmosás előtt.", + "rinse": "Tiszta vizes öblítési szakasz. Ez a fázis többször is megismétlődhet.", + "sanitize": "Magas hőmérsékletű tisztítási szakasz fertőtlenítési programokhoz.", + "sensor_check": "Rövid kis fogyasztású szünet a szárazság mérése közben.", + "soak": "Alacsony aktivitású áztatási időszak az aktív mosási szakaszok között.", + "soak_dw": "Meghosszabbított áztatási időszak nehéz talajokhoz.", + "spin": "Nagy sebességű elszívás a víz eltávolításához a rakományból.", + "spin_wd": "Nagy sebességű extrakció a szárítási átmenet előtt.", + "wash": "Fő mosási ciklus dobmozgással és opcionális fűtéssel.", + "wash_dw": "Főmosószeres mosás melegítéssel." }, - "cta": { - "start_recording": "Felvétel indítása", - "label_detected_cycle": "Már van egy észlelt ciklusom – inkább jelöljük meg", - "browse_cycles": "Ciklusok böngészése egy másik megjelöléséhez", - "view_profiles": "Profilok megtekintése", - "create_from_cluster": "Profil létrehozása ezekből a ciklusokból", - "create_profile": "Profil létrehozása hozzá", - "review_suggestions": "Javaslatok áttekintése", - "organise_profiles": "Profilok rendezése", - "configure_phases": "Fázisok konfigurálása", - "skip_step": "Lépés kihagyása", - "skip_forever": "Ne mutasd újra", - "hide_guidance": "Útmutatás elrejtése", - "show_guidance": "Útmutatás megjelenítése" + "placeholder": { + "add": "hozzáadás…", + "group_name": "pl. Pamut 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "értesítési szolgáltatás hozzáadása…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "személy hozzáadása…", + "phase_name": "pl. Előmosás", + "profile_name": "pl. Pamut 40°C", + "maintenance_notes": "pl. szűrő cserélve, ajtótömítés tisztítva", + "store_brand": "pl. Bosch", + "store_model": "pl. WAT28401" + }, + "pref": { + "date_absolute": "Abszolút (pl. július 2-án 14:32)", + "date_relative": "Rokon (pl. 2 órája)", + "lang_auto": "Rendszer alapértelmezett ({lang})", + "lang_en": "Angol", + "use_panel_default": "(panel alapértelmezett)" + }, + "quality": { + "bad": "Rossz", + "good": "Jó", + "unusable": "Használhatatlan" + }, + "section": { + "dishwasher": { + "label": "Mosogatógép", + "intro": "A ciklus végének kezelése mosogatógépekhez, amelyek jellemzően egy hosszú, szinte néma szárítási fázissal fejeződnek be egy rövid végső vízleeresztés előtt." + }, + "anti_wrinkle": { + "intro": "A ránctalanító/gyűrőtlenítő mód alacsony teljesítményű dobpulzusokat érzékel a főfázis után, és a befejezett ciklushoz csatolja őket.", + "label": "Ránctalanítás" + }, + "basic": { + "intro": "Az alap azonosítás és a legtöbb beállítás számára szükséges alapok.", + "label": "Alapok" + }, + "delay": { + "intro": "A késleltetett indítás érzékelése azonosítja, amikor egy eszköz be van kapcsolva, de még nem kezdte el a ciklust.", + "label": "Késleltetett indítás" + }, + "detection": { + "intro": "Hogyan érzékeli a rendszer a ciklust indítottnak, futónak és befejezettnek.", + "label": "Érzékelés" + }, + "matching": { + "intro": "Hogyan párosítják a befejezett ciklusokat a tanult profilokkal és jelölik meg őket.", + "label": "Párosítás" + }, + "ml_training": { + "intro": "Az eszközön végzett gépi tanulás újratanítási ütemezése és adatbeállításai.", + "label": "ML tanítás" + }, + "notifications": { + "intro": "Mikor és hogyan kap értesítést a cikluseseményekről.", + "label": "Értesítések" + }, + "timing": { + "intro": "Háttérkadencia, az offline felügyelet és a karbantartás.", + "label": "Időzítés és felügyelet" + }, + "triggers": { + "intro": "Opcionális külső jelek: záró trigger, ajtóérzékelő, szünetkapcsoló és a kirakodási emlékeztető.", + "label": "Triggerek és ajtók" + }, + "phase_eta": { + "label": "Hátralévő idő", + "intro": "Fázistudatos hátralévő idő olyan gépekhez, amelyek ciklushossza a hőmérséklettől vagy a centrifugálástól függ." + } + }, + "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Passzív szárítás csendes feloldása", + "doc": "Miután a ciklus túllépi a várható időtartamát, mennyi ideig kell a mosogatógépnek csendben maradnia (a Leállítási küszöb alatt), mielőtt a WashData abbahagyja a végső vízleeresztésre való várakozást és befejezi a ciklust. Növelje, ha a gépének hosszú, néma szárítási fázisa van egy késői végső vízleeresztés előtt, amely kimarad - a szélesebb ablak lehetővé teszi, hogy a megtanult időtartam kövesse a szezonális eltolódást (hidegebb bevezetett víz = hosszabb ciklusok), ahelyett hogy a régi átlaghoz rögzülne. Csak lerövidítheti a várakozást a belső 30 perces végső-csúcs korláthoz képest, soha nem hosszabbítja meg." + }, + "anti_wrinkle_enabled": { + "doc": "Ismerje fel a szárítógép által a fő fűtési fázis után kibocsátott rövid, kis teljesítményű szárítópulzusokat, és tartsa őket a kész ciklushoz kapcsolva, ahelyett, hogy új ciklusként olvasná őket.", + "label": "Ránctalanítás érzékelés engedélyezése" + }, + "anti_wrinkle_exit_power": { + "doc": "A teljesítménynek ez alá kell csökkennie az impulzusok között, hogy a ránctalanító üzemmód aktív maradjon.", + "label": "Kilépési teljesítmény küszöb" + }, + "anti_wrinkle_idle_timeout": { + "doc": "Meddig maradhat a gép csendben két szárítópulzus között, mielőtt a ránctalanító üzemmód véget ér. Állítsa hosszabbra, mint a leghosszabb szünet, amit a szárítógép a pulzusok között hagy, különben minden későbbi pulzus téves indításként lesz értelmezve.", + "label": "Max. impulzusszünet" + }, + "anti_wrinkle_max_duration": { + "doc": "Az ennél hosszabb impulzusokat valódi ciklusnak tekintik, nem pedig ránctalanítónak.", + "label": "Max. időtartam" + }, + "anti_wrinkle_max_power": { + "doc": "Az ezen az erőn felüli impulzus valódi új ciklusként kezelendő, nem ránctalanító zuhanásként. Állítsa közvetlenül az impulzusteljesítmény fölé.", + "label": "Max. ránctalanítási teljesítmény" + }, + "auto_label_confidence": { + "doc": "Ha a ciklus végén az egyezési pontszám e felett van, akkor a program automatikusan, minden megerősítés nélkül felcímkézik. Emelje fel, hogy nagyobb biztonságot igényeljen az automatikus címkézés előtt; csökkentse az automatizálás érdekében. Az alatta lévő Learning Confidence funkcióval együtt működik.", + "label": "Automatikus jelölési megbízhatóság" + }, + "auto_maintenance": { + "doc": "Futtasson éjszakai takarítást: újjáépítse a profilborítékokat, újraszámolja a ciklus állapotát, törölje a hibakeresési nyomokat és őrizze meg a legutóbbi ciklusokat.", + "label": "Automatikus karbantartás (éjszakai tisztítás)" + }, + "completion_min_seconds": { + "doc": "Az ennél rövidebb ciklusokat a rendszer szellemciklusként elveti (próbafutások, az ajtó kinyitása zokni hozzáadásához).", + "label": "Min. ciklusidőtartam" + }, + "delay_confirm_seconds": { + "doc": "A tápfeszültségnek ennyi ideig a készenléti sávban kell maradnia, mielőtt a készüléket indításra várónak tekintik, nem pedig működésre.", + "label": "Megerősítési másodpercek" + }, + "delay_start_detect_enabled": { + "doc": "Érzékeli, ha a készülék be van kapcsolva, és vár (késleltetett indítás / készenlét), de még nem kezdte meg a ciklusát, így a készenléti húzást nem tévesztik össze egy futó ciklussal.", + "label": "Késleltetett indítás érzékelés engedélyezése" + }, + "delay_timeout_hours": { + "doc": "Hagyja abba a várakozást a késleltetett indítási módban ennyi óra elteltével, és térjen vissza üresjáratba, így a gép, amelyet áram alatt hagytak, de nem indult el, nem vár örökké.", + "label": "Időtúllépési órák" + }, + "device_type": { + "doc": "Készülék osztály. Beállítja az ésszerű észlelési alapértékeket (küszöbértékek, kikapcsolási késleltetés, végkezelés) az adott készüléktípushoz hangolva; csak akkor módosítsa, ha az eszközt eredetileg rossz típusként állította be.", + "label": "Eszköz típusa" + }, + "door_sensor_entity": { + "doc": "Opcionális ajtó bináris érzékelő. Annak érzékelésére szolgál, ha a készüléket egy ciklus után kinyitották/kirakták.", + "label": "Ajtóérzékelő entitás" + }, + "duration_tolerance": { + "doc": "Tolerancia a hátralévő időre vonatkozó becslésekhez (visszajelzés tanulás, nem egyeztetés). Ha a tényleges időtartam a becsült +/-X%-on belül van, az jó egyezésnek számít.", + "label": "Becslési tolerancia" + }, + "enable_ml_models": { + "doc": "Amíg a ciklus fut, hagyja, hogy a modellek finomítsák az élő eredményeket: egyenletesebb hátralévő idő és energia/költségbecslés, valamint idő előtti leállás elleni védelem a végérzékelésnél (csak késleltetheti a befejezést, soha nem fejezheti be korábban, és korlátos). Az Ön finomhangolt modelljeit használja, ha rendelkezésre állnak, ellenkező esetben a beépített modelleket. Ki = csak a klasszikus teljesítményalapú logika (még mindig megbízható).", + "label": "Intelligens modellek alkalmazása ciklus közben" + }, + "end_energy_threshold": { + "doc": "A kikapcsolási késleltetés visszaszámlálása során a felhalmozott energia (watt x idő) ehhez a küszöbértékhez kerül összehasonlításra. Ha túllépi, a visszaszámlálás újraindul – a gyűrődésgátló szárak és a mosogatógépes szárítószárak a ciklushoz rögzítve maradnak, ahelyett, hogy rövidre vágnák őket. Emelje fel, ha a ciklusok túl korán érnek véget a lehűlés során; csökkentse, ha az észlelés lassú.", + "label": "Záró energia" + }, + "end_repeat_count": { + "doc": "Az egymást követő leállási küszöbérték alatti leolvasások száma a ciklus vége előtt. Az 1 megfelelő a legtöbb csatlakozóhoz. Emelje 2-3-ra, ha az intelligens csatlakozó időnként hamis nullát jelez a ciklus közepén, és a ciklusok idő előtt véget érnek.", + "label": "Záró ismétlések száma" + }, + "energy_price_entity": { + "doc": "Érzékelő az aktuális elektromos áram kWh-nkénti árával (pl. dinamikus tarifa). Elsőbbséget élvez az alábbi statikus árral szemben. Minden ciklus lefagyasztja az árat, amikor befejeződött.", + "label": "Energiaár entitás" + }, + "energy_price_static": { + "doc": "Rögzített kWh-nkénti ár a költségadatokhoz használatos, ha nincs fent beállítva élő ár entitás.", + "label": "Statikus energiaár (kWh-nként)" + }, + "energy_sensor": { + "doc": "Opcionális kumulatív energiaszámláló (total_increasing kWh/Wh, pl. a konnektor saját élettartam-mérője). Ha be van állítva, minden ciklus jelentett energiája ennek a számlálónak a kezdő- és záróértéke közötti különbségéből származik, ami elkerüli azt az alulmérést, amit egy lassan jelentő teljesítményérzékelő integrálásából kapna. Visszavált az integrált értékre, ha a leolvasás hiányzik, mértékegysége ismeretlen, vagy a különbség nem pozitív. Hagyja üresen, hogy továbbra is a teljesítményérzékelőt integrálja.", + "label": "Energiamérő entitás" + }, + "expose_debug_entities": { + "doc": "Extra diagnosztikai HA entitások közzététele (egyezési megbízhatóság, kétértelműség, belső állapot). Az Off (Kikapcsolva) funkció tisztán tartja az entitáslistát normál használathoz.", + "label": "Hibakeresési entitások közzététele" + }, + "external_end_trigger": { + "doc": "Bináris érzékelő, amelynek állapotváltozása jelzi a ciklus végét (pl. egy készülék „kész” érintkezője vagy egy társintegráció).", + "label": "Külső trigger entitás" + }, + "external_end_trigger_enabled": { + "doc": "Hagyja, hogy egy külső bináris érzékelő jelezze a ciklus végét, a beépített energiaalapú érzékelés mellett.", + "label": "Külső záró trigger engedélyezése" + }, + "external_end_trigger_inverted": { + "doc": "A kioldó érzékelő kikapcsolását (nem BE) tekintse a ciklus végének jeleként.", + "label": "Külső trigger invertálása (trigger KI-re)" + }, + "learning_confidence": { + "doc": "Ha a találati pontszám e és az automatikus címke megbízhatósága közé esik, egy visszajelzési értesítés kéri, hogy ellenőrizze az azonosított programot. Ez alatt a pontszám alatt a mérkőzés túl bizonytalan ahhoz, hogy felszínre kerüljön. Az automatikus címke megbízhatósága alatt kell tartani.", + "label": "Tanulási megbízhatóság" + }, + "linked_device": { + "doc": "Opcionálisan beágyazza ezt a WashData-eszközt egy másik eszköz (például az intelligens csatlakozó) alá a HA-eszköz-nyilvántartásban, amely a „Csatlakozva…” jelzéssel jelenik meg.", + "label": "Csoportosítás eszköz alá" + }, + "min_off_gap": { + "doc": "Ha a gép ennél az időnél rövidebb ideig kapcsol ki, a be-/ki/bekapcsolás sorozatot egy folyamatos ciklusnak tekinti. Megakadályozza, hogy az áztatási programok (a mosás közben néhány percre kikapcsol) ne oszlanak fel két külön ciklusra. Állítsa rövidebbre, mint az egymás melletti terhelések közötti hézag, ha azt szeretné, hogy azokat külön ciklusnak számítsa. Az eszköztípus alapértelmezett beállításai védik az egyes készülékek tipikus cikluson belüli szünetét.", + "label": "Min. kikapcsolási rés" + }, + "min_power": { + "doc": "Aktívnak tekintett abszolút minimális teljesítmény. Az ez alatti értékeket a rendszer 0 W-nak (készenléti) tekinti, kiszűrve az intelligens csatlakozók és a készenléti LED-ek fantomterhelését.", + "label": "Minimális teljesítmény" + }, + "ml_training_enabled": { + "doc": "Rendszeresen tanulmányozza az áttekintett ciklusokat egyik napról a másikra, és finomítsa a modelleket ehhez a géphez. A változás csak akkor marad meg, ha valóban jobb eredményt ér el a kitartott ciklusokon, tehát ez csak segíthet, vagy változatlan marad – soha ne regresszió.", + "label": "Tanulás erről a gépről" + }, + "ml_training_hour": { + "doc": "Helyi napszak (0-23) az éjszakai finomhangolás elvégzéséhez. Válasszon egy csendes órát, például 2 (02:00).", + "label": "Tanulás ennyi órakor" + }, + "ml_training_interval_days": { + "doc": "Ennyi napon belül legfeljebb egyszer ellenőrizze a fejlesztéseket.", + "label": "Legfeljebb ennyi naponta ellenőrizve" + }, + "ml_training_min_cycles": { + "doc": "A finomhangolás előtt várja meg, amíg legalább ennyi ciklus rögzítésre kerül, hogy legyen miből tanulni.", + "label": "Előbb ennyi ciklus szükséges" + }, + "name": { + "doc": "A HA integrációs listában és az eszköznyilvántartásban látható megjelenített név.", + "label": "Eszköz neve" + }, + "no_update_active_timeout": { + "doc": "Ha futás közben ilyen sokáig nem érkezik tápellátás-frissítés, tegyük fel, hogy a csatlakozó leesett offline állapotban, és kényszerítse a leállítást, hogy elkerülje a zombi ciklust. Az alapértelmezett 600 s felhő- vagy hálókésést tesz lehetővé.", + "label": "Frissítés nélküli időtúllépés" + }, + "notify_before_end_minutes": { + "doc": "Ha a becsült hátralévő idő e alá esik, küldjön egy majdnem kész figyelmeztetést. 0 letiltja.", + "label": "Befejezés előtti riasztás" + }, + "notify_channel": { + "doc": "Android értesítési csatorna neve kezdő/élő üzenetekhez (csatornánként szabályozza a hangot és a prioritást a mobilalkalmazásban). Az üres a kísérőalkalmazás alapértelmezését használja.", + "label": "Android csatorna (indítás/élő)" + }, + "notify_cycle_timers": { + "doc": "Értesítések a ciklus adott perceiben (például lágyító hozzáadása esetén). Az üzenet támogatja a következőt: {device}, {program}, {minutes}. Engedélyezze az Automatikus szünetet, hogy szüneteljen az adott ponton, és interaktív értesítést kapjon a Folytatás gombbal; folytatás a panelen, a szüneteltetési/folytatási szolgáltatáson vagy az értesítési műveleten keresztül.", + "label": "Ciklus időzítők" + }, + "notify_finish_channel": { + "doc": "Android értesítési csatorna neve a befejező üzenethez. Üres újra felhasználja a kezdő/élő csatornát.", + "label": "Android csatorna (befejezés)" + }, + "notify_finish_message": { + "doc": "A ciklus befejezésekor elküldött üzenettörzs. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. Itt a {time_finished} és a {vs_typical} a leghasznosabbak.", + "label": "Befejezési üzenet" + }, + "notify_finish_services": { + "doc": "notify.* szolgáltatások hívják meg a ciklus végén. Adjon hozzá egyet célonként; hagyja üresen, hogy ne legyen befejezésért értesítés.", + "label": "Befejezési szolgáltatások" + }, + "notify_fire_events": { + "doc": "A ha_washdata_* eseményeket is aktiválja a ciklus indításakor/befejezésekor, így megépítheti saját automatikáját.", + "label": "HA események aktiválása értesítésekhez" + }, + "notify_icon": { + "doc": "Opcionális mdi ikon az értesítéshez (pl. mdi:mosógép). Hagyja üresen a platform alapértelmezett beállításához.", + "label": "Értesítés ikonja" + }, + "notify_live_chronometer": { + "doc": "Statikus becslés helyett élőben frissített visszaszámláló megjelenítése az értesítésben (az ezt támogató platformokon).", + "label": "Élő kronométer használata" + }, + "notify_live_interval_seconds": { + "doc": "Milyen gyakran frissülnek az élő állapotról szóló értesítések a ciklus lefutása közben.", + "label": "Élő frissítési intervallum" + }, + "notify_live_overrun_percent": { + "doc": "Ha egy ciklus ennél a százaléknál nagyobb mértékben haladja meg a becsült értéket, küldjön túlfutási riasztást.", + "label": "Élő túlfutás % riasztás előtt" + }, + "notify_live_services": { + "doc": "notify.* szolgáltatások élő folyamatfrissítést kértek a ciklus lefutása közben. Hagyja üresen az élő folyamatról szóló értesítések letiltásához.", + "label": "Élő folyamat szolgáltatások" + }, + "notify_only_when_home": { + "doc": "Csak akkor küldjön értesítést, ha a linkelt személyek közül legalább egy (fent) otthon van.", + "label": "Csak otthon értesítés" + }, + "notify_people": { + "doc": "személy.* entitások, amelyeket a „Csak otthonról értesítés” használ annak eldöntésére, hogy valaki otthon van-e.", + "label": "Személyek (Csak otthon értesítéshez)" + }, + "notify_pre_complete_message": { + "doc": "A vég előtti / majdnem kész riasztás törzse. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Befejezés előtti üzenet" + }, + "notify_reminder_message": { + "doc": "A még várakozó kirakodási emlékeztető törzse. Az üres a beépített alapértelmezést használja. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Emlékeztető üzenet" + }, + "notify_start_message": { + "doc": "A ciklus indulásakor elküldött üzenettörzs. Sablonváltozók: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Indítási üzenet" + }, + "notify_start_services": { + "doc": "notify.* szolgáltatások hívják meg a ciklus indulásakor. Adjon hozzá egyet célonként (telefon, műszerfal stb.); hagyja üresen, hogy ne induljon értesítés.", + "label": "Indítási szolgáltatások" + }, + "notify_timeout_seconds": { + "doc": "Az értesítés automatikus elvetése ennyi másodperc után (az azt támogató platformokon). A 0 megőrzi, amíg manuálisan el nem távolítja.", + "label": "Automatikus elvetés után" + }, + "notify_title": { + "doc": "Értesítés címe. Sablonváltozók: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "Értesítés címe" + }, + "notify_unload_delay_minutes": { + "doc": "Percekkel a ciklus lejárta után, mielőtt elküldené a még mindig várakozó \"üresd ki a gépet\" emlékeztetőt. Állítsa be a 0-t az emlékeztető letiltásához.", + "label": "Kirakodási emlékeztető késleltetése" + }, + "notify_unload_repeat": { + "doc": "Újraküldi a kirakodási emlékeztetőt \"Kirakodási emlékeztető késleltetése\" percenként, amíg ki nem nyitja az ajtót, vagy meg nem érinti az \"Emlékeztetés leállítása\" gombot az értesítésen. Ajtóérzékelő entitást igényel (ahogyan maga az emlékeztető is). Az elvetés gomb a Home Assistant kísérőalkalmazás (mobil) értesítésein működik.", + "label": "Ismétlés az ajtó kinyitásáig" + }, + "off_delay": { + "doc": "Várakozási idő a teljesítmény csökkenése után, mielőtt befejezettnek nyilvánítaná a ciklust. Ha az áramellátás ezen az ablakon belül folytatódik, a ciklus zökkenőmentesen folytatódik – ez áthidalja a szüneteket a mosási fázisok között. A mosogatógépek hosszú szárítási fázisokkal rendelkeznek (20-60 percre kikapcsolva), így a kikapcsolási késleltetésnek meg kell haladnia ezt, hogy az egész mosás+szárítás egy ciklusban maradjon.", + "label": "Kikapcsolási késleltetés" + }, + "pause_cuts_power": { + "doc": "Ha egy ciklus szünetel, kapcsolja ki az alábbi Kapcsoló entitást is. Csak olyan készülékekhez, amelyek dugója biztonságosan levágható a ciklus közepén.", + "label": "Szünet megszakítja az áramot (kapcsolón keresztül)" + }, + "power_off_delay": { + "doc": "Mennyi ideig kell a teljesítménynek a Kikapcsolás teljesítményküszöbe alatt maradnia egy ciklus befejezése után, mielőtt az állapot visszatér a Kikapcsolva értékre. Csak akkor használatos, ha a Kikapcsolás teljesítményküszöbe 0 fölött van. A háttérben futó ütem szerint ellenőrzi, így a tényleges késleltetés felfelé kerekít a következő állapotlejárati lépéshez.", + "label": "Kikapcsolás késleltetése" + }, + "power_off_threshold_w": { + "doc": "Opcionális, teljesítményalapú Kikapcsolva állapot érzékelése. Ha az érték 0 fölött van, akkor amint egy ciklus befejeződött és a teljesítmény a Kikapcsolás késleltetése ideig e szint alatt marad, a gépet kikapcsoltnak tekinti, és az állapot visszatér a Kikapcsolva értékre. A letiltáshoz hagyja 0 értéken (alapértelmezett). Állítsa a valódi kikapcsolt szint fölé, de a Leállítási küszöb és a gép befejezett-de-bekapcsolt készenléti fogyasztása alá; ha nincs a Leállítási küszöb alatt, a rendszer figyelmen kívül hagyja. Bekapcsolva a Kikapcsolva állapotba való visszatéréshez a Folyamat visszaállítási késleltetés helyébe lép, így a befejezett gép Befejezett/Tiszta állapotban marad, amíg ténylegesen ki nem kapcsolják.", + "label": "Kikapcsolás teljesítményküszöbe" + }, + "power_sensor": { + "doc": "Az érzékelő entitás, amely a készülék élő teljesítményét jelenti wattban (pl. sensor.washer_power). Minden ciklusérzékelés ezen a jelen alapul.", + "label": "Teljesítmény érzékelő" + }, + "profile_duration_tolerance": { + "doc": "Az egyeztetés során használt profil átlagos időtartama körüli +/- sáv. A 0,25 azt jelenti, hogy a 60 perces profil 45-75 perces ciklusoknak felel meg.", + "label": "Profil időtartam tolerancia" + }, + "profile_match_interval": { + "doc": "Milyen gyakran próbálja meg a profilegyeztetést egy futási ciklus során. Az alapértelmezett 300 s (5 perc) egyensúlyban tartja az észlelési sebességet és a CPU-t.", + "label": "Egyezési intervallum" + }, + "profile_match_max_duration_ratio": { + "doc": "Maximális ciklushossz a profilhoz képest. Az 1.3 azt jelenti, hogy a ciklusnak a profil időtartamának 130%-a alatt kell lennie, hogy megfeleljen.", + "label": "Max. időtartam arány" + }, + "profile_match_min_duration_ratio": { + "doc": "Minimális ciklushossz a profilhoz képest. A 0,9 azt jelenti, hogy egy ciklusnak a profil időtartamának legalább 90%-ának kell lennie, hogy illeszkedjen.", + "label": "Min. időtartam arány" + }, + "profile_match_threshold": { + "doc": "Minimális hasonlósági pontszám (0-1) szükséges a ciklus végén a programazonosító elfogadásához. Emelje fel a hibás azonosítások csökkentése érdekében; csökkentse, ha a gép programjai nem illeszkednek. Az alapértelmezett 0,4 konzervatív kiindulópont.", + "label": "Egyezési küszöb" + }, + "profile_unmatch_threshold": { + "doc": "Ha egy élő ciklus közbeni meccs ez alá csökken, a próbaazonosító törlődik. Tartsa egy kicsit az egyezési küszöb alatt, hogy a hasonlóság rövid csökkenése ne fordítsa vissza páratlanná a kijelzőt.", + "label": "Nem egyező küszöb" + }, + "progress_reset_delay": { + "doc": "A befejezés után tartsa 100%-on az előrehaladást ennyi ideig, hogy a Befejezett felirat látható legyen az irányítópulton, mielőtt visszaállítaná az üresjárati állapotot.", + "label": "Folyamat visszaállítási késleltetés" + }, + "pump_stuck_duration": { + "doc": "Másodpercekkel a szivattyú folyamatosan működhet, mielőtt esetleg elakadtként jelölik meg (kiváltja a beragadt szivattyú eseményt).", + "label": "Elakadt szivattyú időtartama" + }, + "running_dead_zone": { + "doc": "A ciklus elindítása után az ablakon belüli teljesítménycsökkenéseket figyelmen kívül hagyja. A mosógépek hideg vízzel töltik fel (a melegítés előtt közel 0 W csökken) – e védelem nélkül a töltési fázis úgy néz ki, mint a ciklus végén. Ez NEM hagyja ki az adatokat: a teljes teljesítmény nyomvonal T=0-tól kerül rögzítésre. A javaslatmotor méri a gép tényleges indítási mintáját, és automatikusan méretezi azt.", + "label": "Futó holttér" + }, + "sampling_interval": { + "doc": "Várható idő az érzékelő leolvasásai között – a simítóablak méretére és a visszapattanás helyes elindítására szolgál. Ettől az értéktől függetlenül minden érzékelőfrissítés rögzítésre kerül; csak a downstream számításokat kalibrálja. A javaslatmotor méri az érzékelő tényleges ütemét az elmúlt ciklusokból, és automatikusan beállítja ezt.", + "label": "Mintavételezési intervallum" + }, + "save_debug_traces": { + "doc": "Tárolja a teljes teljesítmény nyomkövetést és a megfelelő hibakeresési adatokat minden ciklushoz. Hasznos hibaelhárításhoz, de növeli a tárhely méretét.", + "label": "Hibakeresési nyomok mentése" + }, + "smoothing_window": { + "doc": "Mennyire van simítva a nyers teljesítményjel. Alacsony (2) érzékeny, de zajos; magas (5) kisimítja a tüskéket, de növeli a késést.", + "label": "Simítási ablak" + }, + "start_duration_threshold": { + "doc": "A teljesítménynek ennyi ideig az indítási küszöb felett kell maradnia, hogy megerősítse a valódi indítást, és megakadályozza, hogy a másodperc törtrészes be/ki kapcsolói elindítsák a ciklust.", + "label": "Indítási időtartam" + }, + "start_energy_threshold": { + "doc": "A készüléknek energiát (teljesítmény x idő) kell fogyasztania MŰKÖDÉS ELŐTT. Egy rövid, nagy teljesítményű tüskének nagyon alacsony az energiája, és figyelmen kívül hagyják, megakadályozva a téves indításokat.", + "label": "Indítási energia" + }, + "start_threshold_w": { + "doc": "A teljesítménynek e szint fölé kell emelkednie a ciklus elindításának megerősítéséhez. Túl alacsonyra állítása téves indítást okoz készenléti tápellátásról; túl magas és lassan induló programok (hideg töltés) elmaradnak. A javaslatmotor ezt éppen a gép megfigyelt legalacsonyabb aktív teljesítménye fölé állítja.", + "label": "Indítási küszöb" + }, + "stop_threshold_w": { + "doc": "A teljesítménynek e szint alá kell csökkennie, mielőtt a kikapcsolási késleltetés visszaszámlálása megkezdődik. Állítsa az indítási küszöb alá – a köztük lévő hézag a hiszterézis sáv, amely megakadályozza a villogást. Ha túl magasra van állítva, az alacsony teljesítményű fázisok (öblítőstop, gyűrődésgátló) hamisan elindítják a végsorozatot.", + "label": "Leállítási küszöb" + }, + "switch_entity": { + "doc": "Az opcionális kapcsoló szüneteltetéskor kikapcsolható, majd újraindításkor visszakapcsolható, a „Szünet is leállítja az áramot” funkcióval együtt használható.", + "label": "Kapcsoló entitás" + }, + "watchdog_interval": { + "doc": "Milyen gyakran ellenőrzi a háttérfigyelő az elakadt érzékelőket és az eltelt időtúllépéseket. Alapértelmezett 30 s.", + "label": "Felügyelő intervallum" + }, + "notify_milestone_message": { + "doc": "A mérföldkő értesítés üzenete. Sablonváltozók: {device}, {cycle_count}.", + "label": "Mérföldkő üzenet" + }, + "notify_milestones": { + "doc": "Vesszővel elválasztott ciklusszámok, amelyek elérésekor egyszeri ünneplő értesítést váltanak ki (pl. 50, 100, 500, 1000). Üresen a mérföldkő-értesítések ki vannak kapcsolva.", + "label": "Ciklus mérföldkövek" + }, + "notify_quiet_end_hour": { + "doc": "A ne zavarjanak időszak vége (0-23). A visszatartott értesítéseket ekkor kézbesíti. Hagyja üresen a kikapcsoláshoz.", + "label": "Csendes órák vége" + }, + "notify_quiet_start_hour": { + "doc": "A ne zavarjanak időszak kezdete (0-23). A csendes órák alatt kiváltódó befejezési, emlékeztető és tiszta ruha értesítéseket visszatartja, és az időszak végén kézbesíti. Hagyja üresen a kikapcsoláshoz. Támogatja az éjfélt átlépő időszakokat (pl. kezdet 22, vég 7).", + "label": "Csendes órák kezdete" + }, + "peak_rate_message": { + "doc": "Opcionális egyéni szöveg az indítási értesítéshez fűzött csúcstarifa-tipphez. Sablonváltozók: {device}, {price}. Az üres a beépített alapértelmezést használja.", + "label": "Csúcstarifa üzenet" + }, + "peak_rate_threshold": { + "doc": "Amikor egy ciklus elindul, és az aktuális kWh-ár eléri vagy meghaladja ezt az értéket, csúcstarifa-tippet fűz az indítási értesítéshez. A 0 vagy üres kikapcsolja a tippet.", + "label": "Csúcstarifa-küszöb (kWh-ként)" + }, + "dtw_bandwidth": { + "label": "Alakillesztési tűrés", + "doc": "Mennyire torzíthatja időben az illesztő egy ciklust, hogy illeszkedjen egy mentett program alakjához. A magasabb érték nagyobb sebességingadozást tűr; a túl magas rossz programot illeszthet." + }, + "corr_weight": { + "label": "Alak és szint súlya", + "doc": "Egyensúly a görbe alakja és az abszolút teljesítményszint között az illesztés pontozásakor. A magasabb érték az alakot részesíti előnyben; az alacsonyabb a teljesítményszint illesztését." + }, + "duration_weight": { + "label": "Időtartam súlya", + "doc": "Mennyire részesül előnyben az a program, amelynek tipikus időtartama illeszkedik ehhez a ciklushoz." + }, + "energy_weight": { + "label": "Energia súlya", + "doc": "Mennyire részesül előnyben az a program, amelynek tipikus energiafogyasztása illeszkedik ehhez a ciklushoz." + }, + "store_brand": { + "label": "Készülék márkája", + "doc": "Opcionális. A készülék márkája a közösségi katalógusból kiválasztva. A megfelelő referenciafelvételek megkeresésére és megosztására szolgál. Hagyja üresen, ha nem használja az online funkciókat." + }, + "store_model": { + "label": "Készülék modellje", + "doc": "Opcionális. A készülék modellje a közösségi katalógusból kiválasztva, miután megadta a márkát. Ha a modellje nem szerepel a listában, hozzáadhatja a katalógushoz." + }, + "show_contributor": { + "doc": "Jelenítse meg a \" által\" jelölést a közösségi készülékeken és referenciaciklusokon." + }, + "enable_phase_matching": { + "label": "Fázistudatos hátralévő idő", + "doc": "Bontsa minden futó ciklust fázisokra (fűtés, mosás, centrifugálás), és a hátralévő időt fázisonként ossza be, a klasszikus becsléssel keverve - a ciklus elején a fázisbeosztásra, a vége felé pedig a klasszikus becslésre támaszkodva. Ez a visszaszámlálót ahhoz igazítja, hogy a gépe ténylegesen mennyi ideig fűt és működik, ami leginkább a ciklus első felében figyelhető meg. Ki = csak a klasszikus becslés. Csak a hátralévő idő kijelzését érinti; a program párosítása és a ciklusérzékelés változatlan marad." + }, + "keep_min_score": { + "label": "Min. Egyezési Pontszám", + "doc": "A minimális hasonlósági pontszám, amelyre egy jelöltnek szüksége van az egyezési versenyben való maradáshoz. Az alapértelmezett 0.1 szándékosan megengedő - még a gyenge jelölteket is beengedi, és a következő szakaszokra bízza a legjobb egyezés megtalálását. Növelje a valószínűtlen profilok korábbi kizárásához; csökkentse a kezdeti jelöltállomány bővítéséhez." + }, + "dtw_blend": { + "label": "Torzítás Keverék", + "doc": "Mennyire helyettesíti az időtorzítás (DTW) igazítási pontszám a 2. szakasz alappontszámát. 0 = csak a 2. szakasz pontszáma, 1 = csak a DTW-pontszám, 0.5 (alapértelmezett) = egyenlő keverék. Növelje, hogy jobban támaszkodjon a torzítási igazításra, ha a programoknak hasonló a teljesítményszintjük, de eltérő az időbeli mintájuk." + }, + "dtw_ensemble_w": { + "label": "Torzítás Együttes Mix", + "doc": "Együttes DTW módban (az alapértelmezett), a súly a skálázott L1 és a derivált DTW (DDTW) között. 1.0 = kizárólag skálázott-L1, 0 = kizárólag DDTW, 0.7 = alapértelmezett. A skálázott-L1 változat a teljesítményszinteket hasonlítja össze; a derivált változat arra reagál, ahogyan a teljesítmény változik az idő során. Az együttes mindkettőt kombinálja." + }, + "dtw_ddtw_scale": { + "label": "Derivált Torzítás Skála", + "doc": "Féltelítési távolság a derivált DTW pontozáshoz. A pontszám megfeleződik, ha a DDTW-távolság eléri ezt az értéket. Kisebb = érzékenyebb az alakkülönbségekre. Az alapértelmezett 30 a tipikus háztartási gépek teljesítménynyomaihoz van kalibrálva. Csak az együttes és ddtw DTW-módokat érinti." + }, + "dtw_refine_top_n": { + "label": "Torzítás Finomítás Szám", + "doc": "Hány legjobb 2. szakasz jelöltet pontozza újra a DTW. A DTW számításigényesebb, ezért csak a legjobb N jelöltre alkalmazzák. Alapértelmezett 5. Növelje (7-9-re), ha a helyes profil néha csak a 4. vagy 5. helyen végez a 2. szakasz után - a DTW meg tudja menteni. A csökkentés enyhén felgyorsítja az egyeztetést." + }, + "duration_scale": { + "label": "Időtartam Élesség", + "doc": "A 4. szakasz időtartam-egyezési büntetésének élessége. Ez az a logaritmikus arány, amelynél az egyezési pontszám megfeleződik. Kisebb = szigorúbb: egy időtartam-eltérés jobban büntet. Az alapértelmezett 0.175 nagyjából 18%-os időtartam-toleranciának felel meg a félsúlynál. Párosítsa az Időtartam Súlyával." + }, + "energy_scale": { + "label": "Energia Élesség", + "doc": "A 4. szakasz energia-egyezési büntetésének élessége. Kisebb = szigorúbb: egy energia-eltérés jobban büntet. Az alapértelmezett 0.25 szándékosan megengedőbb az Időtartam Élességénél, mivel az energia változik a terheléssel. Párosítsa az Energia Súlyával." + }, + "power_profile_interval_min": { + "label": "Teljesítményprofil-intervallum", + "doc": "A profilonkénti power_profile szenzorattribútum vödörmérete (az EMHASS és tibber_prices, illetve egyéb külső tervezők által felhasznált időköz-alapú átlagos vatt-tömb). A kisebb vödrök megőrzik a rövid teljesítménycsúcsokat; a nagyobbak simítják az alakot. Alapértelmezés: 15 perc. Csak olvasáskor; a felismerést nem befolyásolja." + }, + "notify_live_sticky": { + "label": "Élő értesítés megtartása koppintás után", + "doc": "Csak Android esetén. Az élő folyamatértesítést tartóssá teszi (ragadóssá), hogy rákoppintva ne zárja be a folyamatban lévő szálat. Kikapcsolt állapotban az alapértelmezett viselkedés érvényes, ahol a koppintás elveti az értesítést." + }, + "notify_live_click_action": { + "label": "Élő értesítés koppintási célhelye", + "doc": "Csak Android esetén. Az alkalmazás kezdőlapja helyett hová nyílik meg az élő folyamatértesítésre való koppintás (pl. /lovelace/laundry, vagy egy teljes URL). Az alapértelmezetthez hagyja üresen." + }, + "door_opens_at_end": { + "label": "Az ajtó automatikusan kinyílik a végén", + "doc": "Olyan mosogatógépekhez, amelyek a ciklus végén kinyitják az ajtót szárítás céljából (AirDry és hasonlók). Ha ez be van kapcsolva, a futó ciklus közbeni ajtónyitás nem szünetelteti azt véglegesen; ehelyett ha az ajtó az alábbi időtartam erejéig nyitva marad, a WashData a ciklust befejezettnek tekinti. A rövid nyitás (tárgy betöltése) figyelmen kívül marad. Ajtóérzékelő entitás szükséges." + }, + "door_end_dwell_seconds": { + "label": "Ajtó-nyitásvégi várakozási idő", + "doc": "Mennyi ideig kell nyitva maradnia az ajtónak, mielőtt a WashData befejezi a ciklust, amikor az \"Ajtó automatikusan kinyílik a végén\" be van kapcsolva. Elég hosszú ahhoz, hogy figyelmen kívül hagyja a gyors edény betöltését (alapértelmezés: 60 s), elég rövid ahhoz, hogy gyorsan befejezzen, miután a gép kinyitja az ajtót." + } + }, + "setting_group": { + "auto_labeling": { + "label": "Automatikus jelölés" + }, + "cycle_end": { + "label": "Ciklus vége" + }, + "cycle_start": { + "label": "Ciklus indítása" + }, + "cycle_timers": { + "label": "Ciklus időzítők" + }, + "data_management": { + "label": "Adatkezelés" + }, + "debug": { + "label": "Hibakeresés" + }, + "dishwasher_end": { + "label": "Mosogatógép befejezése" + }, + "door_pause": { + "label": "Ajtó és szünet" + }, + "dtw_refinement": { + "label": "DTW finomítás" + }, + "duration_gates": { + "label": "Időtartam kapuk" + }, + "energy": { + "label": "Energia" + }, + "external_end_trigger": { + "label": "Külső záró trigger" + }, + "housekeeping": { + "label": "Karbantartás" + }, + "match_scoring": { + "label": "Egyezési pontozás" + }, + "messages": { + "label": "Üzenetek" + }, + "power_off": { + "label": "Készülék kikapcsolása" + }, + "predictive_end": { + "label": "Prediktív befejezés" + }, + "schedule": { + "label": "Ütemezés" + }, + "services": { + "label": "Szolgáltatások" + }, + "signal_processing": { + "label": "Jelkondicionálás" + }, + "thresholds_gap": { + "label": "Küszöbök és rés" + }, + "timing": { + "label": "Időzítés" + }, + "unload_reminder": { + "label": "Kirakodási emlékeztető" + }, + "watchdog": { + "label": "Felügyelő" + }, + "quiet_hours_milestones": { + "label": "Csendes órák és mérföldkövek" + }, + "device_info": { + "label": "Eszközadatok" + }, + "basic_configuration": { + "label": "Alapkonfiguráció" + } + }, + "status": { + "active": "Aktív", + "all_statuses": "Minden állapot", + "ambiguous": "Kétértelmű", + "auto_detect": "Automatikus felismerés", + "clear": "Világos", + "completed": "Befejezve", + "fine_tuning": "finomhangolás most…", + "force_stopped": "Az erő megállt", + "idle": "Tétlen", + "interrupted": "Megszakított", + "ready": "Feldolgozásra kész", + "recording": "Felvétel", + "training": "Tanítás…", + "saving": "Mentés…", + "rebuilding": "Újraépítés…", + "analyzing": "Elemzés…", + "resetting": "Visszaállítás…", + "reverting": "Visszavonás…", + "trimming": "Vágás…", + "splitting": "Felosztás…", + "deleting": "Törlés…", + "imported": "Importált" + }, + "tab": { + "advanced": "Fejlett", + "diagnostics": "Diagnosztika", + "history": "Ciklusok", + "ml": "ML képzés", + "pp_cleanup": "Tisztítás", + "pp_manage": "Kezelése", + "pp_overview": "Áttekintés", + "pp_phases": "Fázisok", + "profiles": "Profilok", + "settings": "Beállítások", + "status": "Áttekintés", + "subtab_phase_catalog": "Fázis katalógus", + "subtab_profiles": "Profilok", + "maintenance": "Karbantartás", + "playground": "Homokozó", + "store": "Bolt" + }, + "tag": { + "early_end": "Korai vége", + "late_start": "Késői kezdés", + "merged": "Összevont ciklusok", + "noise": "Zaj", + "sensor_gap": "Érzékelő rés", + "split": "Osztott ciklus", + "wrong_profile": "Rossz profil" + }, + "toast": { + "access_saved": "A hozzáférés-szabályozás mentve", + "all_wiped": "Minden adat törölve", + "analysis_complete_none": "Az elemzés kész: nincs új javaslat", + "auto_label_complete": "Az automatikus címkézés kész", + "automation_deleted": "Automatizálás törölve", + "correction_submitted": "Helyesbítés benyújtva", + "cycle_deleted": "Ciklus törölve", + "cycle_force_stopped": "Kényszer-leállított ciklus", + "cycle_labelled": "Ciklus feliratozott", + "cycle_paused": "A ciklus szünetel", + "cycle_resumed": "A ciklus folytatódott", + "cycle_trimmed": "Ciklus vágva", + "cycles_merged": "A ciklusok egyesültek", + "envelope_rebuilt": "Boríték átépített", + "envelopes_rebuilt": "A borítékok újjáépítve", + "export_downloaded": "Exportálás letöltve", + "feedback_all_dismissed": "Minden visszajelzés elutasítva", + "feedback_confirmed": "A visszajelzés megerősítve", + "feedback_dismissed": "A visszajelzés elutasítva", + "group_deleted": "Csoport törölve", + "group_name_required": "A csoportnév megadása kötelező", + "group_saved": "Csoport mentve", + "import_successful": "Sikeres importálás; integráció újratöltése", + "json_required": "JSON-adatok szükségesek", + "legacy_removed": "Az örökölt műveletek eltávolítva", + "logs_exported": "A naplók exportálva", + "matching_reverted": "A megfelelő súlyok visszaálltak az alapértelmezett értékekre", + "min_2_profiles": "Válasszon ki legalább 2 profilt egy csoporthoz", + "ml_training_no_improvement": "Az edzés befejeződött: az alapérték megtartva (nincs javulás)", + "models_reverted": "Az eszközön lévő modellek visszaálltak az alapszintre", + "name_required": "Név szükséges", + "no_split_found": "Nem találtunk üresjárati hézagot, amelyen fel lehetne osztani", + "panel_settings_saved": "A panel beállításai mentve", + "pg_preset_loaded": "A(z) \"{name}\" előbeállítás betöltve", + "pg_preset_saved": "A(z) \"{name}\" előbeállítás elmentve", + "pg_sugg_loaded": "{n} javasolt érték betöltve - futtassa a Homokozót az összehasonlításhoz", + "pg_sugg_ml_loaded": "{n} ML által kalibrált érték betöltve - futtassa a Homokozót az összehasonlításhoz", + "phase_name_required": "A fázisnév megadása kötelező", + "phase_updated": "Fázis frissítve", + "phases_saved": "Fázisok mentve", + "preferences_saved": "A beállítások mentve", + "profile_name_required": "A profilnév megadása kötelező", + "profile_renamed": "Profil átnevezve", + "recording_discarded": "A felvétel elvetve", + "recording_saved": "A felvétel mentve a profilba", + "recording_started": "A felvétel elkezdődött", + "recording_stopped": "A felvétel leállt", + "review_saved": "Vélemény mentve", + "settings_conflicts": "Mentés előtt javítsa ki a kijelölt beállítási ütközéseket.", + "settings_reverted": "A beállítások visszaállítva; integráció újratöltése", + "settings_saved": "A beállítások elmentve; integráció újratöltése", + "suggestions_applied": "Javaslatok alkalmazva; integráció újratöltése", + "suggestions_dismissed": "Javaslatok elutasítva", + "apply_failed": "Az alkalmazás sikertelen: {error}", + "delete_failed": "A törlés sikertelen: {error}", + "load_more_failed": "Nem sikerült többet betölteni: {error}", + "maint_add_failed": "Nem sikerült hozzáadni az eseményt: {error}", + "maint_added": "Karbantartási esemény hozzáadva", + "maint_delete_failed": "Nem sikerült törölni az eseményt: {error}", + "maint_deleted": "Karbantartási esemény törölve", + "relabel_done": "{count} ciklus átcímkézve", + "relabel_failed": "Az átcímkézés sikertelen: {error}", + "reminders_save_failed": "Nem sikerült menteni az emlékeztetőket: {error}", + "reminders_saved": "Szerviz emlékeztetők mentve", + "pause_no_cycle": "Nincs szüneteltethető aktív ciklus", + "resume_no_cycle": "Nincs folytatható szüneteltetett ciklus", + "delete_partial_failed": "Egyes elemeket nem sikerült törölni, ezért visszaállításra kerültek", + "pg_run_gone": "Ez a futtatás már nem érhető el.", + "task_cancelled": "Megszakítva.", + "processed": "Feldolgozva: {bits}", + "processed_cycles": "{n} ciklus", + "processed_suggestions": "{n} javaslat", + "processed_models": "{n} modell előléptetve", + "store_search_failed": "A keresés sikertelen: {error}", + "store_connect_failed": "A csatlakozás sikertelen: {error}", + "store_connected": "Csatlakozva a közösségi bolthoz", + "store_disconnected": "Leválasztva a közösségi boltról", + "store_error": "Hiba: {error}", + "store_unavailable": "A közösségi bolt nem érhető el.", + "store_pick_profile": "Válassza ki a profilt, amelybe egyesíti", + "store_name_required": "Adjon meg egy profilnevet", + "store_import_failed": "Az importálás sikertelen: {error}", + "store_imported": "Importálva ide: {profile}", + "store_program_required": "Adjon meg egy programnevet", + "store_no_appliance": "Először adja meg a készülék márkáját és modelljét a Beállításokban.", + "store_share_failed": "A megosztás sikertelen: {error}", + "store_shared": "Megosztva a közösségi boltban - felülvizsgálatra vár.", + "appliance_added": "Készülék hozzáadva - jóváhagyásra vár", + "thanks_confirming": "Köszönjük a megerősítést", + "device_approved": "A közösség jóváhagyta", + "rating_saved": "Minőségértékelés mentve", + "brand_added": "Márka hozzáadva - jóváhagyásra vár", + "profile_added": "Profil hozzáadva - jóváhagyásra vár", + "saved_except_conflicts": "Mentve. Javítsa ki a kijelölt ütközéseket a többi mentéséhez.", + "share_device_none_sel": "Válasszon legalább egy ciklust a megosztáshoz", + "store_device_downloaded": "{p} program, {c} felvétel hozzáadva", + "store_device_downloaded_phases": "{p} program, {c} felvétel, {ph} fázistérkép hozzáadva", + "store_device_downloaded_settings": "{p} program, {c} felvétel, {ph} fázistérkép, {s} beállítás hozzáadva", + "store_device_shared": "{n} ciklus megosztva a közösségi boltba - felülvizsgálatra vár.", + "store_device_shared_all_dup": "Mind a(z) {n} ciklus már a közösségi boltban volt.", + "store_device_shared_partial": "{n} ciklus megosztva; {failed} nem sikerült feltölteni.", + "store_device_shared_some_dup": "{created} ciklus megosztva; {dup} már a boltban volt.", + "store_download_failed": "Letöltés sikertelen: {error}", + "store_download_nothing": "Nincs új letöltendő - ez a beállítás már megvan az eszközön.", + "export_selective_done": "Export letöltve", + "import_selective_done": "{profiles} profil és {cycles} ciklus importálva" + }, + "suggestion": { + "both_agree": "A WashData javasolja", + "calibrated_label": "Kalibrált", + "observed_label": "Megfigyelt", + "impact": { + "auto_label_confidence": { + "higher": "Automatikusan kevesebb ciklust jelöl; több kerül áttekintésre", + "lower": "Automatikusan több ciklust jelöl; néhány félre lehet azonosítva" + }, + "duration_tolerance": { + "higher": "Szélesebb időtartomány elfogadása – rugalmasabb egyeztetés", + "lower": "Pontosabb időtartam-egyezést igényel – szigorúbb, de szokatlan ciklusokat elutasíthat" + }, + "end_energy_threshold": { + "higher": "Csak jelentős energiát felhasználó ciklusokat zár be", + "lower": "Rövidebb vagy alacsony energiájú ciklusokat is bezár" + }, + "end_repeat_count": { + "higher": "A befejezési jelet több ismétlés után fogadja el – megbízhatóbb, kissé lassabb", + "lower": "Kevesebb ismétlés után ér véget – gyorsabb érzékelés, több hamis befejezési kockázat" + }, + "learning_confidence": { + "higher": "Csak nagyon magabiztos egyezésekből tanul – lassabb, de megbízhatóbb", + "lower": "Több ciklusból tanul; a modell zajosabb lehet" + }, + "min_off_gap": { + "higher": "Hosszabb tétlenség szükséges az új ciklus indulása előtt", + "lower": "Rövid tétlenség új ciklust indít – egymást követő futások szétválhatnak" + }, + "min_power": { + "higher": "Kevésbé érzékeny a tétlenségi fogyasztásra; nagyon csendes programokat elszalaszthat", + "lower": "Érzékenyebb; a készenléti fogyasztást aktivitásként naplózhatja" + }, + "no_update_active_timeout": { + "higher": "Több idő a ciklus elakadtnak nyilvánítása előtt", + "lower": "Elakadt ciklust gyorsabban kényszerít leállítani" + }, + "off_delay": { + "higher": "Több idő a készülék szüneteire – hosszú áztatás vagy szárítás kezelése", + "lower": "Gyorsabb vége érzékelés – egyértelmű be/ki készülékekhez jól működik" + }, + "profile_match_threshold": { + "higher": "Csak nagy magabiztosságú egyezéseket erősít meg; több ciklus marad jelöletlen", + "lower": "Több ciklust egyeztet; néhány kissé helytelen lehet" + }, + "running_dead_zone": { + "higher": "Figyelmen kívül hagyja a rövid teljesítménycsúcsokat tétlenség közben – zajra kevésbé érzékeny", + "lower": "Rövidebb teljesítménylökésekre reagál – gyors átmeneti aktivitást észlel" + }, + "start_threshold_w": { + "higher": "Elkerüli a rövid teljesítménycsúcsokból eredő hamis indításokat", + "lower": "Kis teljesítményű programokat is érzékel; zajra is aktiválódhat" + }, + "stop_threshold_w": { + "higher": "Gyorsabban fejezi be a ciklust – szünet közben is zárhat", + "lower": "Hosszabb ideig vár a befejezésre – kevesebb idő előtti befejezés" + }, + "watchdog_interval": { + "higher": "Hosszabb csendes fázisok megengedett; kevesebb hamis kényszeres leállítás", + "lower": "Agresszívabban észleli az elakadt ciklusokat" + } + }, + "reason": { + "auto_label_confidence": "{cycles} olyan automatikus címke 15. percentilis megbízhatósága, amelyet a felhasználó soha nem javított ({p15}).", + "completion_min_seconds": "A p05 tiszta ciklus időtartamának fele ({minutes} perc) {cycles} cikluson át; kiszűri a fantomciklusokat.{excl}", + "dead_zone_batch": "Rövidre hagyva (a médián indítási instabilitási ablak {cycles} cikluson át = {s}s), hogy a valódi vég gyorsan észlelhető legyen.", + "dead_zone_from_dip": "A(z) {s}s-nál észlelt korai teljesítménycsökkenés alapján.", + "end_energy_default": "Alapértelmezett ajánlott referenciaérték a ciklus végi zajküszöbhöz.", + "end_energy_false": "p95 téves végű energia ({p95}Wh) {cycles} cikluson át, alsó korláttal a médián ciklusenergia 0.2%-ánál ({floor}Wh).", + "end_energy_no_false": "Nincs téves vég {cycles} cikluson át; alsó korláttal a médián ciklusenergia 0.2%-ánál ({floor}Wh).", + "end_repeat_count": "{false}/{total} tiszta ciklusban ({pct}%) volt >60s belső szünet, amely folytatódott; {val} végmegerősítés szükséges.", + "learning_confidence": "{cycles} felhasználó által címkézett ciklus p05 megbízhatósága ({p05}); ez alatt ellenőrzés kérése.", + "match_interval": "A megfigyelt frissítési ütem alapján (médián={median}s) * 10.", + "max_duration_ratio": "A címkézett ciklusok időtartama alapján (p95={p95}).", + "min_active": "Az utolsó ciklusban megfigyelt legkisebb aktív teljesítmény ({min}W) alapján.", + "min_duration_ratio": "A lehető legalacsonyabbra állítva, hogy a program a ciklus elején felismerhető legyen; a megbízhatósági és bizonytalansági küszöbök megakadályozzák a korai megerősítést.", + "min_off_gap": "{gaps} megfigyelt ciklusközi szünet alapján (p05={p05}s). Készülék alsó korlátja: {floor}s.", + "min_off_gap_bridge": "Úgy méretezve, hogy áthidalja a cikluson belüli leghosszabb csendes szakaszt: {span}s + 60s ráhagyás, {spans} áthidalt szünetből {cycles} tiszta cikluson át ({ceiling}s alatt marad, ami a két egymást követő indítás között hagyott legrövidebb szüneted).", + "min_power": "A(z) {cycles} tiszta ciklus p05 legkisebb aktív teljesítményének ({p05}W) 40%-a, hogy a kikapcsolási küszöb a valós fogyasztás alatt maradjon.{excl}", + "ml_auto_label": "A legalacsonyabb megbízhatóság, amelyet a minőségi modell még tisztának minősített (a(z) {cycles} tiszta ciklus p10 értéke = {p10}).", + "ml_end_repeat": "{false}/{total} ciklusban ({pct}%) volt olyan szünet, amelyet a végérzékelő >50%-ra értékelt; {val} végmegerősítés szükséges.", + "ml_off_delay": "Végérzékelővel megerősített szünetek: p95 {p95}s + 60s ráhagyás, {pauses} modell által ellenőrzött szünetből {cycles} cikluson át (alsó korlát {floor}s).", + "no_update_timeout": "A megfigyelt frissítési ütem alapján (p95={p95}s) * 20 (min. 60s).", + "off_delay_cadence": "A megfigyelt frissítési ütem alapján (p95={p95}s) * 5", + "off_delay_device_floor": "A(z) {device} eszközre jellemző biztonságos minimum használva ({floor}s).", + "off_delay_generic_floor": "Általános biztonságos minimum használva ({floor}s).", + "off_delay_pauses": "Úgy méretezve, hogy túlélje a valódi szüneteket: p95 cikluson belüli szünet {p95}s + 60s ráhagyás, {pauses} szünetből {cycles} tiszta cikluson át (alsó korlát {floor}s).", + "profile_match_threshold": "{cycles} helyes automatikus címke p10 megbízhatósága ({p10}); biztonságos élő megerősítési alsó korlát.", + "sampling_interval": "A(z) {cycles} tiszta cikluson át megfigyelt médián frissítési intervallum ({si}s).{excl}", + "smoothing_window": "Úgy méretezve, hogy ~30s-nyi mérést simítson {si}s mintavételezésnél ({samples} minta).", + "start_duration": "Rövidre hagyva (~egy {si}s mintavételi intervallum), hogy az észlelés a lehető legkorábban induljon, miközben az egyetlen mintás kiugrásokat figyelmen kívül hagyja.", + "thr_batch": "Éppen a p05 legkisebb aktív teljesítmény fölött tartva {cycles} cikluson át ({p05}W), hogy az indítás a lehető legkorábban észlelhető legyen, a leállítási küszöb pedig a gép legkisebb üzemi teljesítménye alatt maradjon.", + "tol_per_profile": "A profilonkénti időtartam-szórás p75 értéke {profiles} profilon át ({cycles} ciklus); a stabil profilok nem kapnak büntetést.", + "tol_pooled": "{cycles} legutóbbi címkézett ciklus összevont időtartam-szórása alapján (p95 szórás={dev}).", + "watchdog": "A biztonságosan lehető legalacsonyabbra állítva (épp a p95 frissítési szünet, azaz {p95}s felett, min. 30s), hogy az elakadások gyorsan észlelhetők legyenek téves leállítások nélkül." + }, + "exclusions": { + "summary": "{total} tévesen észlelt ciklus kizárva: {parts}.", + "reason": { + "force_stopped": "kényszerrel leállított", + "interrupted": "megszakított", + "incomplete": "befejezetlen", + "noise": "zaj", + "unlabeled": "címkézetlen", + "no_trace_short": "vizsgálathoz túl rövid", + "high_start": "magas teljesítménnyel indult", + "abrupt_end": "hirtelen véget ért", + "mid_restart": "ciklus közbeni újraindítás", + "no_power": "nincs teljesítmény", + "no_active_power": "nincs aktív teljesítmény" + } + } + }, + "trend": { + "down": "Lefelé trend", + "up": "Felkapott" + }, + "maint": { + "bearing_service": "Csapágy szerviz", + "descale": "Vízkőmentesítés", + "drum_clean": "Dob tisztítása", + "filter_clean": "Szűrő tisztítása", + "other": "Egyéb" + }, + "pg_desc": { + "dishwasher_end_spike_quiet_release": "Mosogatógép: csendes másodpercek a várható időtartam után, mielőtt a ciklus végi leeresztésre való várakozás feloldódik", + "anti_wrinkle_enabled": "Nyelje el a fő fázis utáni szárítópulzusokat, ahelyett hogy új ciklusként olvasná őket", + "anti_wrinkle_exit_power": "A ránctalanítás aktívan tartásához a teljesítménynek az impulzusok között ez alá kell csökkennie", + "anti_wrinkle_idle_timeout": "Két szárítópulzus között engedélyezett csendes idő, mielőtt a ránctalanítás véget ér", + "anti_wrinkle_max_duration": "Az ennél hosszabb impulzus befejezi a ránctalanítást és új ciklust nyit", + "anti_wrinkle_max_power": "Az ennél magasabb impulzus befejezi a ránctalanítást és új ciklust nyit", + "completion_min_seconds": "A legrövidebb futás, ami valódi ciklusnak számít", + "end_repeat_count": "Egymást követő alacsony leolvasások a befejezés előtt", + "interrupted_min_seconds": "A rövid ciklusokat megszakítottként jelöli", + "min_off_gap": "Két ciklus elválasztásához szükséges rés", + "off_delay": "Alacsony teljesítmény másodpercei a ciklus vége előtt", + "start_duration_threshold": "A küszöb feletti másodpercek az indulás megerősítéséhez", + "start_threshold_w": "Minimális wattérték az indulás elismeréséhez", + "stop_threshold_w": "Ez alatt a gép kikapcsoltnak számít", + "dtw_bandwidth": "3. szakasz: Sakoe-Chiba torzítási sáv (0 = DTW kikapcsolva; alapértelmezett 0.2 = a ciklushossz 20%-a)", + "corr_weight": "2. szakasz: egyensúly a görbe alakja (korreláció) és a teljesítményszint (MAE) között; alapértelmezett 0.45", + "duration_weight": "4. szakasz: mennyire befolyásolja a futási idő egyezése a végső pontszámot (alapértelmezett 0.22)", + "energy_weight": "4. szakasz: mennyire befolyásolja az energia-egyezés a végső pontszámot (alapértelmezett 0.22)", + "profile_match_min_duration_ratio": "1. szakasz: minimális ciklushossz a profil időtartamának törtjeként; alapértelmezett 0.1 (10%)", + "profile_match_max_duration_ratio": "1. szakasz: maximális ciklushossz a profil időtartamának törtjeként; alapértelmezett 1.5 (150%)", + "keep_min_score": "2. szakasz: minimális pontszám a versenyben maradáshoz; az alapértelmezett 0.1 gyenge egyezéseket is beenged, a következő szakaszok választják ki a legjobbat", + "dtw_blend": "3. szakasz: 0 = csak alappontszám, 1 = csak DTW-pontszám, 0.5 = egyenlő keverék (alapértelmezett)", + "dtw_ensemble_w": "3. szakasz (együttes mód): súly a skálázott-L1 és derivált DTW között; alapértelmezett 0.7 a szintfüggőt részesíti előnyben", + "dtw_ddtw_scale": "3. szakasz: DDTW féltelítési távolság; kisebb = érzékenyebb az alakra (alapértelmezett 30)", + "dtw_refine_top_n": "3. szakasz: DTW által újrapontozandó jelöltek; növelje 7-9-re, ha a helyes profil a 4-5. helyen végez (alapértelmezett 5)", + "duration_scale": "4. szakasz: logaritmikus arány, ahol az időtartam-egyezés megfeleződik; kisebb = szigorúbb büntetés (alapértelmezett 0.175)", + "energy_scale": "4. szakasz: logaritmikus arány, ahol az energia-egyezés megfeleződik; kisebb = szigorúbb büntetés (alapértelmezett 0.25)" + }, + "col": { + "profile_tip": "Az egyezést mutató program neve. A címkézetlen azt jelenti, hogy a ciklus végén egyetlen profil sem egyezett.", + "status_tip": "A ciklus kimenetele: Befejezve (természetes vég), Megszakítva (hirtelen teljesítményesés), Kényszerítve leállítva (kézi) vagy Áttekintendő (függőben lévő visszajelzés).", + "date_tip": "A ciklus indulásának dátuma és időpontja.", + "duration_tip": "A ciklus teljes futásideje kezdéstől végéig.", + "energy_tip": "Az összes elfogyasztott energia (kWh). A teljesítmény idő szerinti integrálásával számítva.", + "cost_tip": "A ciklus energiaköltsége, befejezéskor rögzítve az akkor érvényes árral (energia x kWh-ár). Állíts be egy árat a Beállításokban a kitöltéséhez.", + "confidence_tip": "A profilegyezés bizalma (0-100%). Mennyire pontosan illeszkedett a ciklus teljesítménygörbéje az azonosított programhoz.", + "health_tip": "ML ciklusállapot (magasabb = jobb). Kattints egy ciklusra a vizsgálatához és áttekintéséhez.", + "flags_tip": "Felülvizsgálati, anomália- és forrásjelzők a ciklushoz. Vigye rá a mutatót az ikonra a részletekért." + }, + "stat": { + "avg": "átlag", + "min": "min {v}", + "max": "max {v}", + "consistency": "konzisztencia ±{v}", + "total": "összesen {v}", + "last_run": "utolsó futás {v}", + "score": "pontszám {pct}%", + "duration_cv": "időtartam CV {pct}%", + "avg_confidence": "átlagos bizalom {pct}%" + }, + "pg_evd": { + "detected": "Az érzékelő felismerte, hogy egy ciklus elindult.", + "match_commit": "Az illesztő elegendő magabiztossággal választott egy programot.", + "match_changed": "A vezető program megváltozott, ahogy a ciklus egyre nagyobb része vált láthatóvá.", + "match_ambiguous": "Két program közeli pontszámot ért el, ezért az illesztés bizonytalan volt.", + "unmatched": "Egyetlen mentett program sem illett ehhez a ciklushoz.", + "notify_start": "Egy indítási értesítés kerülne elküldésre.", + "notify_pre_complete": "Egy „majdnem kész” értesítés kerülne elküldésre.", + "notify_finish": "Egy befejezési értesítés kerülne elküldésre.", + "notify_milestone": "Egy mérföldkő-értesítés kerülne elküldésre.", + "notify_held": "Egy értesítés visszatartásra került a csendes órák miatt.", + "finished": "A ciklus elérte a végállapotot és befejeződött." + }, + "store": { + "browse": "Böngészés", + "device": "Készülék", + "favorites": "Kedvencek", + "search_ph": "Keresés márka vagy modell szerint…", + "no_results": "Nem található megfelelő készülék. Próbáljon másképp keresni.", + "n_programs": "{n} program", + "n_cycles": "{n} ciklus", + "no_programs": "Ehhez a készülékhez még nincsenek megosztott programok.", + "no_cycles": "Ehhez a programhoz még nincsenek megosztott referenciaciklusok.", + "anon": "névtelen", + "uploaded_by": "Megosztotta: {name}", + "connected_as": "Csatlakozva {name} néven", + "not_connected": "Nincs csatlakozva. Csatlakoztasson egy GitHub-fiókot a saját ciklusai megosztásához.", + "import_new": "Új profil", + "import_merge": "Egyesítés meglévővel", + "merge_target": "Egyesítés a profilba", + "description": "Leírás (opcionális)", + "contributed_by": "szerző: {name}", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "Még nincsenek értékelések", + "website": "Bolt weboldala ↗", + "website_tip": "A közösségi bolt weboldalának megnyitása" + }, + "settings": { + "gear": { + "title": "Beállítások" + } + }, + "link": { + "manual": "Kézikönyv ↗", + "add_appliance": "Készülék hozzáadása" + }, + "tip": { + "add_brand": "A márka nem szerepel a listában? Adja hozzá a közösségi katalógushoz", + "add_appliance": "A modell nem szerepel a listában? Adja hozzá készülékét a közösségi katalógushoz", + "add_profile": "Adjon hozzá profilt ehhez a készülékhez a közösségi oldalon" + }, + "task": { + "reprocess": { + "matching": "Újrafeldolgozás: ciklusok egyeztetése", + "golden": "Újrafeldolgozás: referenciaciklusok pótlása", + "suggestions": "Újrafeldolgozás: javaslatok", + "ml_training": "Újrafeldolgozás: ML-tanítás", + "health": "Újrafeldolgozás: ciklusok egészsége" + }, + "pg_sweep": { + "optimize": "Optimalizálás: {param}" + }, + "pg_detail": { + "simulate": "Ciklus szimulálása" + }, + "split": { + "apply": "Ciklus felosztása" + }, + "trim": { + "apply": "Ciklus levágása" + }, + "merge": { + "apply": "Ciklusok egyesítése" + }, + "rebuild": { + "envelopes": "Burkológörbék újraépítése" + }, + "cancelling": "Megszakítás..." + }, + "setup": { + "hdr": { + "card": "Eszköz beállítása", + "healthy_chip": "Beállítás kész" + }, + "phase0": { + "washer": "A WashData már észleli a ciklusait. Rögzítse az első ciklust a programnevek és az időbecslések engedélyezéséhez.", + "dishwasher": "A WashData figyel. A mosogatógépek összetett ciklusokkal rendelkeznek – az első ciklus rögzítése erősen ajánlott. Ha egy észlelt ciklus túl hosszú ideig tart, a profilként való mentés előtt a ciklusszerkesztővel kurtítsa le.", + "generic": "A WashData figyel. Rögzítsen vagy jelöljön meg egy észlelt ciklust a profilok létrehozásának megkezdéséhez." + }, + "phase1a": { + "labelled": "Jó kezdés – az első programja el van mentve. A legtisztább adatokhoz érdemes a következő ciklust a rögzítő widgettel felvenni." + }, + "phase1b": { + "recorded": "A felvétele {profile_name} névvel lett elmentve. Most rögzítse vagy jelölje meg a többi gyakran használt programját a lefedettség növeléséhez." + }, + "phase1c": { + "verify": "Önnek {count} program van a közösségtől. Futtasson egy ciklust, hogy ellenőrizze, a WashData helyesen ismeri-e fel – az egyeztetés javul, ahogy az eszköz saját előzményeket gyűjt." + }, + "phase2": { + "cluster": "A WashData {count} ciklust látott, amelyek nem felelnek meg egyetlen mentett programnak sem – hasonlítanak egymásra. Szeretne létrehozni nekik egy új profilt?", + "unmatched": "Az utolsó ciklus nem felelt meg egyetlen mentett programnak sem. Ez egy új program?" + }, + "phase3": { + "suggestions": "A WashData a ciklustörténete alapján beállítási javaslatokkal rendelkezik – tekintse át ezeket az észlelési pontosság javítása érdekében.", + "groups": "Néhány profilja ugyanolyannak tűnik, mint ugyanaz a program különböző hőmérsékleteken. Rendezze csoportba a jobb egyeztetés érdekében.", + "phases": "Adjon programfázisokat a(z) {profile_name} profilhoz a pontosabb hátralévő idő becslések érdekében." + }, + "phase4": { + "healthy": "Ez az eszköz teljesen be van állítva ({profile_count} profil)." + }, + "cta": { + "start_recording": "Felvétel indítása", + "label_detected_cycle": "Már van egy észlelt ciklusom – inkább jelöljük meg", + "browse_cycles": "Ciklusok böngészése egy másik megjelöléséhez", + "view_profiles": "Profilok megtekintése", + "create_from_cluster": "Profil létrehozása ezekből a ciklusokból", + "create_profile": "Profil létrehozása hozzá", + "review_suggestions": "Javaslatok áttekintése", + "organise_profiles": "Profilok rendezése", + "configure_phases": "Fázisok konfigurálása", + "skip_step": "Lépés kihagyása", + "skip_forever": "Ne mutasd újra", + "hide_guidance": "Útmutatás elrejtése", + "show_guidance": "Útmutatás megjelenítése" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/is.json b/custom_components/ha_washdata/translations/panel/is.json index 46e2e854..ccbe80dc 100644 --- a/custom_components/ha_washdata/translations/panel/is.json +++ b/custom_components/ha_washdata/translations/panel/is.json @@ -1,4 +1,52 @@ { + "card": { + "min": "mín.", + "entity_not_found": "Eining fannst ekki", + "running_long": "Keyrir lengur", + "remaining": "eftir", + "progress": "framvinda", + "show_time_remaining": "Sýna tíma sem eftir er", + "show_percentage": "Sýna prósentu", + "layout": { + "tile": "Reitur (þjappað)", + "detail": "Nánar (ítarlegt)", + "glance": "Yfirlit (mörg tæki)" + }, + "btn": { + "pause": "Gera hlé", + "resume": "Halda áfram", + "terminate": "Ljúka lotu", + "record_start": "Hefja upptöku", + "record_stop": "Stöðva upptöku", + "program": "Prógramm", + "open_panel": "Opna WashData" + }, + "editor": { + "layout": "Útlit", + "entity": "Tækjaeining", + "entities": "Tæki", + "title": "Titill", + "icon": "Tákn", + "show_state": "Sýna stöðu", + "show_program": "Sýna prógramm", + "show_progress_bar": "Sýna framvindustiku", + "spin_icon": "Snúa tákni meðan á keyrslu stendur", + "display_mode": "Upplýsingalína", + "active_color": "Hnekkja virkum lit", + "show_phase": "Sýna fasa", + "show_energy": "Sýna orku og kostnað", + "show_anomaly": "Sýna viðvörun um langa keyrslu", + "show_sparkline": "Sýna rauntíma aflgraf", + "buttons": "Aðgerðahnappar", + "program_entity": "Prógramm-eining (hnekkja)", + "time_entity": "Tímaeining (hnekkja)", + "pct_entity": "Framvindueining (hnekkja)", + "power_entity": "Afleining (hnekkja)", + "tap_action": "Bankaðgerð", + "hold_action": "Haldaðgerð", + "double_tap_action": "Tvíbankaaðgerð" + } + }, "badge": { "artifact_tip": "{n} frávik fundust (t.d. hurð opnuð í miðjum lotu) – opnaðu til að sjá þau á línuritinu", "auto": "(sjálfvirkt greint)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Gerðu hlé á gengandi lotu – tækið mun halda áfram þar sem það stoppaði", "pg_apply_device": "Beita á tæki", "pg_autofill": "Fylla sjálfkrafa", + "pg_load_calibrated": "Hlaða kvarðaðar (ML) ({n})", + "pg_load_calibrated_tip": "Flytur ML-kvarðaðar stillingar sem hnekki á tilraunasvæðið", + "pg_load_live": "Sækja virkar stillingar", + "pg_load_live_tip": "Lesa núverandi stillingar samþættingarinnar aftur og henda öllum breytingum á tilraunasvæðinu", + "pg_load_suggested": "Hlaða tillögur ({n})", + "pg_load_suggested_tip": "Flytur núverandi tillögur sjálfvirkrar stillingar sem hnekki á tilraunasvæðið", + "pg_preset_delete": "Eyða forstillingu", + "pg_preset_load": "Hlaða forstillingu", + "pg_preset_load_tip": "Skipta gildunum á tilraunasvæðinu út fyrir þessa forstillingu (virku stillingarnar haldast óbreyttar)", + "pg_preset_save": "Vista sem forstillingu", + "pg_preset_save_tip": "Vista öll gildin hér að neðan sem nefnda forstillingu fyrir þetta tæki", + "pg_publish_all": "Vista {n} í samþættinguna", + "pg_publish_one": "Vista {label} í samþættinguna", "play": "Spila", "process": "Vinna", "process_history": "Vinnið núna", @@ -178,7 +239,9 @@ "download_export": "Sækja útflutning", "analyze_import": "Greina skrá", "import_selected": "Flytja inn valið", - "back": "Til baka" + "back": "Til baka", + "mute_suggestion": "Hætta að stinga upp á þessari stillingu", + "reset_muted": "Endurstilla þaggaðar tillögur" }, "conflict": { "anti_wrinkle_exit": { @@ -275,8 +338,9 @@ "no_automations": "Engar sjálfvirkni vísar til þessa tækis ennþá.", "panel_settings": "Pallborðsstillingar", "param_sweep": "Færibreytuyfirferð", + "pg_settings_source": "Uppruni stillinga", "phase_catalog": "Áfangaskrá", - "playground": "Leikvöllur", + "playground": "Tilraunasvæði", "process_history": "Ferlissaga", "settings_history": "Stillingasaga", "status": "Staða", @@ -410,6 +474,9 @@ "pg_group_detection": "Skynjunarkveikjur", "pg_group_timing": "Tímasetningarreglur", "pg_idle": "Aðgerðalaus", + "pg_preset": "Forstilling tilraunasvæðis", + "pg_preset_name": "Nafn á nýrri forstillingu", + "pg_preset_none": "Veldu forstillingu…", "pg_stress_group": "Próf á aðgerðalausum lokum", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Aðgerðalaust stig (W)", @@ -609,7 +676,8 @@ "conflict_import_copy": "Flytja inn sem afrit", "conflict_keep_mine": "Halda mínum", "conflict_overwrite": "Skrifa yfir", - "pg_anti_wrinkle": "Hrukkuleysi" + "pg_anti_wrinkle": "Hrukkuleysi", + "font_size": "Leturstærð glugga" }, "log": { "all_levels": "Öll stig", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Beita besta gildi: {label} = {value}?", "pg_canvas_empty": "Veldu lotu að ofan og ýttu svo á Hlaða til að sjá aflferil hennar.", "pg_chart_caption": "Greiningar-/samsvörunarhlutfall eftir gildum {param}", + "pg_ctrl_intro": "Gildin byrja á virkum stillingum þessa tækis í samþættingunni. Breytingar haldast á tilraunasvæðinu þar til þú vistar þær í samþættinguna.", + "pg_live_unavailable": "Virkar stillingar eru ekki tiltækar, sjálfgefin gildi eru sýnd.", + "pg_load_live_confirm": "Henda {n} breytingu(m) á tilraunasvæðinu og hlaða núverandi stillingum samþættingarinnar aftur?", "pg_match_rate": "{pct}% samsvörunarhlutfall á {total} lotum", + "pg_matches_live": "Samsvarar virkum stillingum", + "pg_n_changed": "{n} breytt miðað við virkar stillingar", + "pg_sugg_none": "Allar tillögur stemma nú þegar við virkar stillingar", + "pg_preset_delete_confirm": "Eyða forstillingunni \"{name}\"?", + "pg_preset_limit": "Hámarksfjölda forstillinga náð ({n})", + "pg_preset_overwrite": "Skrifa yfir forstillinguna \"{name}\"?", + "pg_publish_one_confirm": "Vista {label} = {value} í stillingar þessa tækis?", "pg_restart_note": "Endurræstu Home Assistant til að virkja hermitólin.", "pg_sim_progress": "{done} / {total} lotur", "pg_starting": "Ræsir…", @@ -784,8 +862,8 @@ "pg_verdict_ok": "Ásættanlegt: sumar lotur misstust. Prófaðu að lækka upphafsþröskuldinn.", "phase_catalog_intro": "Nafngreindir hlutar hringrásar (Forþvottur, Upphitun, Snúning…). Úthlutaðu þeim á prófíl frá stjórnborði þess.", "phase_ranges_intro": "Áfangasvið (mínútur frá upphafi lotu) lögð yfir meðalferilinn. Breyttu gildum til að forskoða í beinni.", - "playground_intro": "Öruggt leiksvæði til að spila fyrri lotur aftur með mismunandi stillingum, bera saman tvær uppsetningar hlið við hlið og skoða hvernig lota samræmist sniði. Ekkert hér breytir raungögnunum þínum fyrr en þú beitir því sérstaklega.", - "playground_needs_restart": "Endurræstu Home Assistant til að virkja Leiksvæðistólin.", + "playground_intro": "Öruggt tilraunasvæði til að spila fyrri lotur aftur með mismunandi stillingum, bera saman tvær uppsetningar hlið við hlið og skoða hvernig lota samræmist sniði. Ekkert hér breytir raungögnunum þínum fyrr en þú beitir því sérstaklega.", + "playground_needs_restart": "Endurræstu Home Assistant til að virkja tólin á Tilraunasvæðinu.", "preferences_admin": "Óskir, pallborð og aðgangsstýring", "preferences_adv": "Óskir", "prefs_personal": "Þetta á aðeins við um Home Assistant reikninginn þinn.", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Tímalengd styttist ({pct}%/lotu) – nýleg meðaltal {avg}", "trend_energy_down": "Orka á niðurleið ({pct}%/lotu)", "trend_energy_up": "Orka hækkar ({pct}%/lotu) – nýleg meðaltal {avg}", + "trim_destructive_confirm": "Aðeins {pct}% af lotunni verður eftir. Þetta er ekki hægt að afturkalla. Halda áfram?", "trim_intro": "Dragðu rauðu handföngin eða sláðu inn gildi. Allt fyrir utan gluggann er fjarlægt.", "tuning_suggestions_available": "{count} uppástunga að stilla í boði frá athuguðum lotum. Þau birtast við hlið viðkomandi reita.", "unsure_detected_prefix": "WashData er ekki viss um að það hafi fundist", @@ -922,9 +1001,15 @@ "merge_hint": "Innfluttum atriðum er bætt við; ekkert staðbundið tapast. Nafnaárekstrar eru leystir hér að neðan.", "replace_warn": "Hver valinn flokkur er hreinsaður og settur í staðinn úr skránni. Óvaldir flokkar haldast óbreyttir.", "dest_reference_hint": "Innfluttar lotur bæta aðeins forritasamsvörun og hafa aldrei áhrif á notkunar-/orkutölfræði.", - "dest_real_history_hint": "Innfluttar lotur teljast sem eigin saga þessa tækis og fæða orku-/notkunartölfræði. Notaðu þetta til að flytja eitt tæki yfir í nýja uppsetningu." + "dest_real_history_hint": "Innfluttar lotur teljast sem eigin saga þessa tækis og fæða orku-/notkunartölfræði. Notaðu þetta til að flytja eitt tæki yfir í nýja uppsetningu.", + "sug_muted": "Mun ekki stinga upp á þessari stillingu aftur", + "sug_mute_failed": "Gat ekki þaggað tillögu", + "sug_unmuted_all": "Þaggaðar tillögur endurstilltar", + "n_suggestions_muted": "{count} þaggaðar; sjálfvirki stillirinn leggur ekki til þessar.", + "font_size_hint": "Gerðu allt á þessum glugga stærra eða minna. Gildir fyrir reikning þinn á þessum tæki." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Uppþvottavél: hljóðlátar sekúndur eftir áætlaða lengd áður en biðin eftir útdælingu í lok lotu er losuð", "completion_min_seconds": "Stysta keyrsla sem telst raunveruleg lota", "end_repeat_count": "Lágir álestrar í röð áður en lýkur", "interrupted_min_seconds": "Stuttar lotur merktar sem truflaðar", @@ -998,6 +1083,10 @@ "unusable": "Ónothæft" }, "section": { + "dishwasher": { + "label": "Uppþvottavél", + "intro": "Meðhöndlun loka lotu fyrir uppþvottavélar, sem ljúka yfirleitt með löngum, næstum hljóðlátum þurrkfasa á undan stuttri lokaútdælingu." + }, "anti_wrinkle": { "intro": "Hrukkuleysi-/krumpluleys-stilling greinir lágtaktsveltiboð eftir aðalfasann og heldur þeim tengdum við lokinni lotu.", "label": "Hrukkuleysi" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Losun eftir hljóðláta þurrkun", + "doc": "Þegar lotan fer fram úr áætlaðri lengd sinni: hversu lengi uppþvottavélin þarf að vera hljóðlát (undir Stöðvunarþröskuldi) áður en WashData hættir að bíða eftir lokaútdælingu og lýkur lotunni. Hækkaðu gildið ef vélin þín er með langan hljóðlátan þurrkfasa á undan seinni lokaútdælingu sem sleppur fram hjá - breiðari gluggi leyfir lærðu lengdinni að fylgja árstíðabundnum breytingum (kaldara innrennslisvatn = lengri lotur) í stað þess að festast við gamla meðaltalið. Það styttir aðeins biðtímann miðað við innra 30 mínútna hámark fyrir lokatoppinn, lengir hann aldrei." + }, "anti_wrinkle_enabled": { "doc": "Viðurkenndu stuttu lág-afls þurrkarapúlsana sem þurrkari gefur frá sér eftir aðalhitafasann og haltu þeim tengdum við lokið lotu í stað þess að lesa þá sem nýjar lotur.", "label": "Virkja hrukkuleysi-greiningu" @@ -1260,6 +1353,10 @@ "doc": "Mínútum eftir að lotu lýkur áður en þú sendir áminninguna um „afferma vélina“ sem enn bíður. Stilltu 0 til að slökkva á áminningunni.", "label": "Losunarminni-seinkun" }, + "notify_unload_repeat": { + "doc": "Heldur áfram að senda losunaráminninguna aftur á \"Losunarminni-seinkun\" mínútna fresti þar til þú opnar hurðina eða ýtir á \"Hætta að minna\" í tilkynningunni. Krefst Dyraskynjareiningar (áminningin sjálf gerir það). Hunsa-hnappurinn virkar á tilkynningum úr Home Assistant fylgiforritinu (farsíma).", + "label": "Endurtaka þar til hurðin opnast" + }, "off_delay": { "doc": "Tími til að bíða eftir að kraftur minnkar áður en hringrásinni er lokið. Ef straumur fer aftur innan þessa glugga heldur hringrásin óaðfinnanlega áfram - þetta brúar hlé á milli þvottastiga. Uppþvottavélar eru með langa þurrkunarfasa (slökkt á slökkt í 20-60 mín) þannig að slökkvunartöfin verður að fara yfir það til að halda öllum þvotti+þurrkum sem einni lotu.", "label": "Slökkviðráð" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Orkuskerpa", "doc": "Skerpa í viðurlögum Þreps 4 vegna samræmis í orkunotkun. Minna = strangara: frávik í orkunotkun skemmir meira. Sjálfgefið 0,25 er vísvitandi rýmra en keyrslulengdarskerpan vegna þess að orka breytist með álagi. Notaðu með Orkuþyngd." + }, + "power_profile_interval_min": { + "label": "Aflaprófíl-bil", + "doc": "Fötustærð fyrir eigindið power_profile á prófílskynjaraskynjara (flatt fylki meðalwattsgilda á hólf sem notast af ytri skipuleggjendum eins og EMHASS og tibber_prices). Minni fötur halda stuttum aflgöllum skörpum; stærri fötur jafna út ferilinn. Sjálfgefið 15 mín. Eingöngu til birtingar; hefur engin áhrif á greiningu." + }, + "notify_live_sticky": { + "label": "Halda lifandi tilkynningu við snertingu", + "doc": "Eingöngu Android. Gerir lifandi framvindutilkynningu viðvarandi (sticky) þannig að snertingar lokar henni ekki. Slökkt: sjálfgefin hegðun þar sem snertingar lokar tilkynningu." + }, + "notify_live_click_action": { + "label": "Snertimarkmið lifandi tilkynningar", + "doc": "Eingöngu Android. Hvert snertingar á lifandi framvindutilkynningu opnar (t.d. /lovelace/laundry eða fulla vefslóð) í stað sjálfgefinna ræsiglugga forritsins. Skildu eftir autt fyrir sjálfgefið." + }, + "door_opens_at_end": { + "label": "Hurð opnast sjálfkrafa í lok", + "doc": "Fyrir uppþvottavélar sem spretta hurðinni upp í lok hringsins til þurrkunar (AirDry og svipað). Þegar þetta er virkt setur hurðaropnun á yfirstandandi hring hann ekki í bið að eilífu; ef hurðin helst opin í stillt dvaltími meðhöndlar WashData hringinn sem lokinn. Stutt opnun (að bæta við fat) er hundsuð. Krefst hurðarskynjaraeiningar." + }, + "door_end_dwell_seconds": { + "label": "Dvaltími hurðar við lok", + "doc": "Hversu lengi hurðin þarf að vera opin áður en WashData lýkur hringnum, þegar \"Hurð opnast sjálfkrafa í lok\" er virkt. Nógu lengi til að hunsa hraða tilbúningu fats (sjálfgefið 60 s), nógu stutt til að ljúka fljótt þegar vél spretter hurðinni upp." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Byggt á lægsta virka afli ({min}W) sem mældist í síðustu lotu.", "min_duration_ratio": "Haldið eins lágu og hægt er svo að kerfi greinist snemma í lotunni; vissu- og tvíræðnimörkin koma í veg fyrir ótímabærar ákvarðanir.", "min_off_gap": "Byggt á {gaps} mældum millibilum milli lota (p05={p05}s). Lágmark tækis: {floor}s.", + "min_off_gap_bridge": "Stærðin valin til að brúa lengsta kyrrðartímabilið innan lotu: {span}s + 60s biðminni, úr {spans} brúuðum bilum yfir {cycles} hreinar lotur (helst undir stysta bilinu þínu, {ceiling}s, milli tveggja keyrslna).", "min_power": "40% af lægsta virka afli við p05 ({p05}W) yfir {cycles} hreinar lotur, sem heldur slökkviþröskuldinum undir raunverulegri notkun.{excl}", "ml_auto_label": "Lægsta vissa sem gæðalíkanið mat samt sem hreint (p10 af {cycles} hreinum lotum = {p10}).", "ml_end_repeat": "{false}/{total} lotur ({pct}%) höfðu hlé sem lokagreinirinn gaf einkunnina >50%; krefst {val} staðfestinga á lokum.", @@ -1636,7 +1754,7 @@ "thr_batch": "Haldið rétt yfir lægsta virka afli við p05 yfir {cycles} lotur ({p05}W) svo að ræsing náist eins snemma og hægt er og stöðvunarþröskuldurinn haldist undir lægsta gangafli vélarinnar.", "tol_per_profile": "p75 af dreifni lengdar á hvert snið yfir {profiles} snið ({cycles} lotur); þröngum sniðum er ekki refsað.", "tol_pooled": "Byggt á sameinaðri dreifni lengdar {cycles} nýjustu merktu lota (p95 frávik={dev}).", - "watchdog": "Haldið eins lágu og óhætt er (3x p95-uppfærslubilið {p95}s, lágm. 30s) svo að stöðnun greinist fljótt án falskra stöðvana." + "watchdog": "Haldið eins lágu og óhætt er (rétt yfir p95-uppfærslubilinu {p95}s, lágm. 30s) svo að stöðnun greinist fljótt án falskra stöðvana." }, "exclusions": { "summary": "Útilokaði {total} ranggreindar lotur: {parts}.", @@ -1670,7 +1788,7 @@ "subtab_phase_catalog": "Áfangaskrá", "subtab_profiles": "Snið", "maintenance": "Viðhald", - "playground": "Leiksvæði", + "playground": "Tilraunasvæði", "store": "Verslun" }, "tag": { @@ -1716,6 +1834,10 @@ "name_required": "Nafn krafist", "no_split_found": "Engar aðgerðalausar eyður fundust til að skipta á", "panel_settings_saved": "Pallborðsstillingar vistaðar", + "pg_preset_loaded": "Forstillingin \"{name}\" var hlaðin", + "pg_preset_saved": "Forstillingin \"{name}\" var vistuð", + "pg_sugg_loaded": "{n} tillögugildi flutt yfir - keyrðu tilraunasvæðið til að bera saman", + "pg_sugg_ml_loaded": "{n} ML-kvarðað gildi flutt yfir - keyrðu tilraunasvæðið til að bera saman", "phase_name_required": "Fasaheiti er áskilið", "phase_updated": "Áfangi uppfærður", "phases_saved": "Áfangar vistaðir", diff --git a/custom_components/ha_washdata/translations/panel/it.json b/custom_components/ha_washdata/translations/panel/it.json index c7e13d4d..2f701345 100644 --- a/custom_components/ha_washdata/translations/panel/it.json +++ b/custom_components/ha_washdata/translations/panel/it.json @@ -92,6 +92,19 @@ "pause_cycle_tip": "Metti in pausa il ciclo in corso – l'elettrodomestico riprenderà da dove si era fermato", "pg_apply_device": "Applica al dispositivo", "pg_autofill": "Compilazione automatica", + "pg_load_calibrated": "Carica Calibrato (ML) ({n})", + "pg_load_calibrated_tip": "Carica le impostazioni calibrate da ML come sostituzioni nel Playground", + "pg_load_live": "Carica le impostazioni attive", + "pg_load_live_tip": "Rileggi le impostazioni attuali dell'integrazione e scarta tutte le modifiche fatte nel Playground", + "pg_load_suggested": "Carica suggerimenti ({n})", + "pg_load_suggested_tip": "Carica i suggerimenti attuali dell'ottimizzatore automatico come sostituzioni nel Playground", + "pg_preset_delete": "Elimina preimpostazione", + "pg_preset_load": "Carica preimpostazione", + "pg_preset_load_tip": "Sostituisci i valori del Playground con questa preimpostazione (le impostazioni attive non vengono toccate)", + "pg_preset_save": "Salva come preimpostazione", + "pg_preset_save_tip": "Salva tutti i valori qui sotto come preimpostazione con nome per questo dispositivo", + "pg_publish_all": "Salva {n} impostazioni nell'integrazione", + "pg_publish_one": "Salva {label} nell'integrazione", "play": "Riproduci", "process": "Processo", "process_history": "Elabora ora", @@ -178,7 +191,9 @@ "download_export": "Scarica l'esportazione", "analyze_import": "Analizza il file", "import_selected": "Importa la selezione", - "back": "Indietro" + "back": "Indietro", + "mute_suggestion": "Non suggerire più questa impostazione", + "reset_muted": "Ripristina i silenziati" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +290,7 @@ "no_automations": "Nessuna automazione fa ancora riferimento a questo dispositivo.", "panel_settings": "Impostazioni del pannello", "param_sweep": "Scansione parametri", + "pg_settings_source": "Origine delle impostazioni", "phase_catalog": "Catalogo delle fasi", "playground": "Playground", "process_history": "Storia del processo", @@ -415,6 +431,9 @@ "pg_match_score": "Punteggio di abbinamento", "pg_pct_of": "{p}% di {total}", "pg_poor_match": "Abbinamento scarso", + "pg_preset": "Preimpostazione del Playground", + "pg_preset_name": "Nome della nuova preimpostazione", + "pg_preset_none": "Seleziona una preimpostazione…", "pg_strong_match": "Abbinamento forte", "pg_tile_ambiguous": "Ambiguo", "pg_tile_ambiguous_tip": "Cicli con un quasi pareggio tra due programmi", @@ -609,7 +628,8 @@ "conflict_resolution": "Conflitti di nome", "conflict_import_copy": "Importa come copia", "conflict_keep_mine": "Mantieni il mio", - "conflict_overwrite": "Sovrascrivi" + "conflict_overwrite": "Sovrascrivi", + "font_size": "Dimensione testo del pannello" }, "log": { "all_levels": "Tutti i livelli", @@ -771,7 +791,17 @@ "pg_apply_confirm": "Applicare il valore migliore: {label} = {value}?", "pg_canvas_empty": "Seleziona un ciclo qui sopra, quindi premi Carica per vederne la curva di potenza.", "pg_chart_caption": "Tasso di rilevamento/abbinamento sui valori di {param}", + "pg_ctrl_intro": "I valori partono dalle impostazioni attive di questo dispositivo nell'integrazione. Le modifiche restano nel Playground finché non le salvi nell'integrazione.", + "pg_live_unavailable": "Impostazioni attive non disponibili, vengono mostrati i valori predefiniti.", + "pg_load_live_confirm": "Scartare {n} modifiche del Playground e ricaricare le impostazioni attuali dell'integrazione?", "pg_match_rate": "{pct}% di tasso di abbinamento su {total} cicli", + "pg_matches_live": "Corrisponde alle impostazioni attive", + "pg_n_changed": "{n} valori diversi dalle impostazioni attive", + "pg_sugg_none": "Tutti i suggerimenti corrispondono già alle impostazioni attuali", + "pg_preset_delete_confirm": "Eliminare la preimpostazione \"{name}\"?", + "pg_preset_limit": "Limite di preimpostazioni raggiunto ({n})", + "pg_preset_overwrite": "Sovrascrivere la preimpostazione \"{name}\"?", + "pg_publish_one_confirm": "Salvare {label} = {value} nelle impostazioni di questo dispositivo?", "pg_restart_note": "Riavvia Home Assistant per abilitare gli strumenti di simulazione.", "pg_sim_progress": "{done} / {total} cicli", "pg_starting": "Avvio…", @@ -845,6 +875,7 @@ "trend_duration_shorter": "La durata tendenzialmente è più breve ({pct}%/ciclo) – media recente {avg}", "trend_energy_down": "Energia in diminuzione ({pct}%/ciclo)", "trend_energy_up": "Energia in aumento ({pct}%/ciclo) – media recente {avg}", + "trim_destructive_confirm": "Questo mantiene solo il {pct}% del ciclo e l'operazione non può essere annullata. Continuare?", "trim_intro": "Trascina le maniglie rosse o inserisci i valori. Tutto fuori dalla finestra viene rimosso.", "tuning_suggestions_available": "{count} suggerimento di ottimizzazione disponibile dai cicli osservati. Appaiono accanto ai campi pertinenti.", "unsure_detected_prefix": "WashData non è sicuro di averlo rilevato", @@ -922,9 +953,15 @@ "merge_hint": "Gli elementi importati vengono aggiunti; nulla di locale va perso. I conflitti di nome si risolvono qui sotto.", "replace_warn": "Ogni categoria spuntata viene cancellata e sostituita dal contenuto del file. Le categorie non spuntate restano invariate.", "dest_reference_hint": "I cicli importati migliorano solo il riconoscimento dei programmi e non influiscono mai sulle statistiche di utilizzo/energia.", - "dest_real_history_hint": "I cicli importati contano come cronologia propria di questo dispositivo e alimentano le statistiche di energia/utilizzo. Da usare per spostare un elettrodomestico su una nuova installazione." + "dest_real_history_hint": "I cicli importati contano come cronologia propria di questo dispositivo e alimentano le statistiche di energia/utilizzo. Da usare per spostare un elettrodomestico su una nuova installazione.", + "sug_muted": "Non verrà più suggerita questa impostazione", + "sug_mute_failed": "Impossibile silenziare il suggerimento", + "sug_unmuted_all": "Suggerimenti silenziati ripristinati", + "n_suggestions_muted": "{count} silenziati; il sistema di ottimizzazione automatica non proporrà questi.", + "font_size_hint": "Rendi tutto in questo pannello più grande o più piccolo. Si applica al tuo account su questo dispositivo." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Lavastoviglie: secondi di silenzio dopo la durata prevista prima che venga rilasciata l'attesa dello scarico di fine ciclo", "anti_wrinkle_enabled": "Assorbire gli impulsi di rotazione dopo la fase principale invece di leggerli come nuovi cicli", "anti_wrinkle_exit_power": "La potenza deve scendere sotto questo valore tra gli impulsi affinché la modalità antirughe resti attiva", "anti_wrinkle_idle_timeout": "Tempo di silenzio consentito tra due impulsi di rotazione prima che la modalità antirughe termini", @@ -998,6 +1035,10 @@ "unusable": "Inutilizzabile" }, "section": { + "dishwasher": { + "label": "Lavastoviglie", + "intro": "Gestione del fine ciclo per le lavastoviglie, che di solito terminano con una lunga fase di asciugatura quasi silenziosa prima di un breve scarico finale." + }, "anti_wrinkle": { "intro": "La modalità antirughe/antistropicciamento rileva gli impulsi di tumbling a bassa potenza dopo la fase principale e li mantiene collegati al ciclo completato.", "label": "Antirughe" @@ -1040,6 +1081,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Rilascio al silenzio dell'asciugatura passiva", + "doc": "Una volta che il ciclo supera la sua durata prevista, per quanto tempo la lavastoviglie deve restare silenziosa (sotto la Soglia di arresto) prima che WashData smetta di attendere uno scarico finale e termini il ciclo. Aumentalo se la tua macchina ha una lunga fase di asciugatura silenziosa prima di uno scarico finale tardivo che non viene rilevato - una finestra più ampia consente alla durata appresa di seguire la deriva stagionale (acqua in ingresso più fredda = cicli più lunghi) invece di bloccarsi sulla vecchia media. Riduce soltanto l'attesa rispetto al limite interno di 30 minuti per il picco di fine, senza mai prolungarla." + }, "anti_wrinkle_enabled": { "doc": "Riconosci i brevi impulsi di asciugatrice a bassa potenza emessi da un'asciugatrice dopo la fase di riscaldamento principale e mantienili collegati al ciclo finito invece di leggerli come nuovi cicli.", "label": "Abilita rilevamento antirughe" @@ -1260,6 +1305,10 @@ "doc": "Minuti dopo la fine di un ciclo prima dell'invio del promemoria \"scaricare la macchina\" ancora in attesa. Impostare 0 per disabilitare il promemoria.", "label": "Ritardo promemoria scarico" }, + "notify_unload_repeat": { + "doc": "Continua a inviare il promemoria di scarico ogni \"Ritardo promemoria scarico\" minuti finché non apri la porta o tocchi \"Interrompi promemoria\" nella notifica. Richiede un'Entità sensore porta (il promemoria stesso la richiede). Il pulsante di chiusura funziona sulle notifiche dell'app complementare (mobile) di Home Assistant.", + "label": "Ripeti finché la porta non si apre" + }, "off_delay": { "doc": "È tempo di attendere dopo l'interruzione della corrente prima di dichiarare terminato il ciclo. Se l'alimentazione viene ripristinata entro questo intervallo, il ciclo continua senza interruzioni, consentendo di colmare le pause tra le fasi di lavaggio. Le lavastoviglie hanno fasi di asciugatura lunghe (spegnimento per 20-60 minuti), quindi il ritardo di spegnimento deve superare quello per mantenere l'intero ciclo di lavaggio+asciugatura come un ciclo.", "label": "Ritardo spegnimento" @@ -1434,6 +1483,26 @@ "energy_scale": { "label": "Nitidezza energia", "doc": "Precisione della penalità di concordanza di energia. Minore = più severo: una discordanza di energia penalizza di più. Il predefinito 0,25 è intenzionalmente più indulgente della Precisione di durata, perché l'energia varia con il carico. Combinare con Peso energia." + }, + "power_profile_interval_min": { + "label": "Intervallo profilo di potenza", + "doc": "Dimensione del bucket per l'attributo sensore power_profile per profilo (l'array piatto di watt medi per slot consumato dai pianificatori esterni come EMHASS e tibber_prices). Bucket più piccoli mantengono nitidi i picchi di potenza brevi; bucket più grandi smussano la forma. Predefinito 15 min. Solo in lettura; non influisce sul rilevamento." + }, + "notify_live_sticky": { + "label": "Mantieni notifica live al tocco", + "doc": "Solo Android. Rende persistente (sticky) la notifica di avanzamento in tempo reale, in modo che toccandola non venga chiusa. Disattivato mantiene il comportamento predefinito in cui il tocco la chiude." + }, + "notify_live_click_action": { + "label": "Destinazione tocco notifica live", + "doc": "Solo Android. Dove si apre un tocco sulla notifica di avanzamento in tempo reale (ad es. /lovelace/laundry o un URL completo) invece della pagina iniziale dell'app. Lascia vuoto per il valore predefinito." + }, + "door_opens_at_end": { + "label": "Porta si apre automaticamente al termine", + "doc": "Per le lavastoviglie che aprono automaticamente lo sportello al termine del ciclo per asciugare (AirDry e simili). Con questa opzione attiva, un'apertura dello sportello durante un ciclo non lo mette più in pausa per sempre; invece, se lo sportello rimane aperto per il tempo di attesa indicato sotto, WashData considera il ciclo terminato. Un'apertura breve (per aggiungere un oggetto) viene ignorata. Richiede un'entità sensore della porta." + }, + "door_end_dwell_seconds": { + "label": "Attesa apertura porta al termine", + "doc": "Per quanto tempo lo sportello deve restare aperto prima che WashData termini il ciclo, quando \"Porta si apre automaticamente al termine\" è attiva. Abbastanza lungo da ignorare l'aggiunta rapida di un piatto (predefinito 60 s), abbastanza breve da terminare prontamente quando la macchina apre lo sportello." } }, "setting_group": { @@ -1604,6 +1673,10 @@ "name_required": "Nome richiesto", "no_split_found": "Non è stato trovato alcun intervallo inattivo su cui dividere", "panel_settings_saved": "Impostazioni del pannello salvate", + "pg_preset_loaded": "Preimpostazione \"{name}\" caricata", + "pg_preset_saved": "Preimpostazione \"{name}\" salvata", + "pg_sugg_loaded": "{n} valore/i suggerito/i caricato/i - avvia il Playground per confrontare", + "pg_sugg_ml_loaded": "{n} valore/i calibrato/i ML caricato/i - avvia il Playground per confrontare", "phase_name_required": "Il nome della fase è obbligatorio", "phase_updated": "Fase aggiornata", "phases_saved": "Fasi salvate", @@ -1751,6 +1824,7 @@ "min_active": "In base alla potenza attiva minima ({min}W) osservata nell'ultimo ciclo.", "min_duration_ratio": "Mantenuto il più basso possibile affinché un programma venga riconosciuto presto nel ciclo; i limiti di confidenza e ambiguità impediscono decisioni premature.", "min_off_gap": "In base a {gaps} intervalli tra cicli osservati (p05={p05}s). Minimo del dispositivo: {floor}s.", + "min_off_gap_bridge": "Dimensionato per coprire il periodo di silenzio più lungo all'interno di un ciclo: {span}s + 60s di margine, da {spans} intervalli coperti su {cycles} cicli puliti (resta sotto il tuo intervallo minimo di {ceiling}s tra due carichi consecutivi).", "min_power": "40% della potenza attiva più bassa al p05 ({p05}W) su {cycles} cicli puliti, mantenendo la soglia di spegnimento sotto il consumo reale.{excl}", "ml_auto_label": "Confidenza più bassa che il modello di qualità ha comunque valutato come pulita (p10 di {cycles} cicli puliti = {p10}).", "ml_end_repeat": "{false}/{total} cicli ({pct}%) hanno avuto una pausa che il rilevatore di fine ha valutato >50%; richiedere {val} conferma/e di fine.", @@ -1767,7 +1841,7 @@ "thr_batch": "Mantenuto appena sopra la potenza attiva più bassa al p05 su {cycles} cicli ({p05}W) affinché un avvio venga rilevato il prima possibile e la soglia di arresto resti sotto la potenza di funzionamento più bassa della macchina.", "tol_per_profile": "p75 della varianza di durata per profilo su {profiles} profili ({cycles} cicli); i profili stretti non vengono penalizzati.", "tol_pooled": "In base alla varianza di durata aggregata di {cycles} cicli etichettati di recente (deviazione p95={dev}).", - "watchdog": "Mantenuto il più basso possibile in sicurezza (3x l'intervallo di aggiornamento p95 di {p95}s, min 30s) per rilevare rapidamente i blocchi senza arresti falsi." + "watchdog": "Mantenuto il più basso possibile in sicurezza (poco sopra l'intervallo di aggiornamento p95 di {p95}s, min 30s) per rilevare rapidamente i blocchi senza arresti falsi." }, "exclusions": { "summary": "Esclusi {total} cicli rilevati male: {parts}.", @@ -1944,5 +2018,53 @@ "hide_guidance": "Nascondi guida", "show_guidance": "Mostra guida" } + }, + "card": { + "min": "min", + "entity_not_found": "Entità non trovata", + "running_long": "In ritardo", + "remaining": "rimanente", + "progress": "avanzamento", + "show_time_remaining": "Mostra tempo rimanente", + "show_percentage": "Mostra percentuale", + "layout": { + "tile": "Riquadro (compatto)", + "detail": "Dettaglio (completo)", + "glance": "Panoramica (più dispositivi)" + }, + "btn": { + "pause": "Pausa", + "resume": "Riprendi", + "terminate": "Termina ciclo", + "record_start": "Avvia registrazione", + "record_stop": "Interrompi registrazione", + "program": "Programma", + "open_panel": "Apri WashData" + }, + "editor": { + "layout": "Layout", + "entity": "Entità dell'elettrodomestico", + "entities": "Elettrodomestici", + "title": "Titolo", + "icon": "Icona", + "show_state": "Mostra stato", + "show_program": "Mostra programma", + "show_progress_bar": "Mostra barra di avanzamento", + "spin_icon": "Ruota l'icona durante il funzionamento", + "display_mode": "Riga di dettaglio", + "active_color": "Colore attivo personalizzato", + "show_phase": "Mostra fase", + "show_energy": "Mostra energia e costo", + "show_anomaly": "Mostra avviso di ritardo", + "show_sparkline": "Mostra grafico di potenza in tempo reale", + "buttons": "Pulsanti di azione", + "program_entity": "Entità programma (personalizzata)", + "time_entity": "Entità tempo (personalizzata)", + "pct_entity": "Entità avanzamento (personalizzata)", + "power_entity": "Entità potenza (personalizzata)", + "tap_action": "Azione al tocco", + "hold_action": "Azione alla pressione prolungata", + "double_tap_action": "Azione al doppio tocco" + } } } diff --git a/custom_components/ha_washdata/translations/panel/ja.json b/custom_components/ha_washdata/translations/panel/ja.json index 3dd7fd87..bdf3fea4 100644 --- a/custom_components/ha_washdata/translations/panel/ja.json +++ b/custom_components/ha_washdata/translations/panel/ja.json @@ -1,1947 +1,2069 @@ { - "badge": { - "artifact_tip": "{n} 個の異常が検出されました (例: サイクルの途中でドアが開いた) – 開いてグラフ上で確認します", - "auto": "(自動検出)", - "built_in_tag": "内蔵", - "declining": "↘ 減少", - "energy_low": "普段より消費エネルギーが少ない", - "energy_spike": "普段より消費エネルギーが多い", - "fair_fit": "普通", - "fair_fit_tip": "中程度の一致一貫性 - このプロファイルに割り当てられた一部のサイクルの信頼スコアが低くなります。精度を向上させるには、さらに多くのサイクルにラベルを付けるか、プロファイルを再記録します。", - "feedback_requested": "フィードバックが必要です", - "golden_cycle": "記録された基準サイクル", - "improving": "↗ 改善中", - "manual": "(手動で選択)", - "needs_review": "見直しが必要", - "overrun": "いつもより長く走った", - "poor_fit": "フィット感が悪い", - "poor_fit_tip": "一致しない試合履歴 - このプロファイルの再構築を検討してください", - "restart_gap_tip": "{n} HA 再起動ギャップ: 電力トレースに欠損区間があります", - "reviewed": "レビュー済み", - "steady": "→安定", - "underrun": "普段より早く終了した", - "using_defaults": "出荷時のデフォルトを使用する", - "using_tuned": "調整された重みの使用", - "overrun_ratio": "(予想の{x}倍)", - "underrun_ratio": "(予想の{pct}%)", - "awaiting_tip": "コミュニティの承認待ち", - "awaiting_n": "承認待ち · {n} 件確認済み", - "approved": "承認済み", - "awaiting": "承認待ち", - "imported_tip": "コミュニティストアからインポートしました。マッチングにのみ使用され、統計には含まれません。", - "not_importable": "対象外", - "exists": "既存" - }, - "btn": { - "add_device": "+ デバイスを追加", - "add_device_tip": "別の WashData デバイスを追加する", - "add_maintenance": "メンテナンスイベントを追加", - "add_phase": "+ フェーズを追加", - "add_timer": "+ タイマーを追加", - "apply_all": "全て適用", - "apply_label": "ラベルを適用する", - "apply_set_b": "セット B を適用", - "apply_split": "分割を適用する", - "apply_trim": "トリムを適用", - "auto_detect_split": "自動検出", - "auto_label_cycles": "自動ラベル付けサイクル", - "auto_label_cycles_tip": "一致信頼度がしきい値をクリアするラベルなしサイクルにプロファイル名を自動的に割り当てます", - "cancel": "キャンセル", - "clear_debug": "デバッグデータのクリア", - "clear_splits": "クリア", - "close": "閉じる", - "compare": "比較する", - "confirm": "確認する", - "convert_to_automation": "自動化への変換", - "correct": "正しい…", - "create": "作成する", - "create_from_cluster": "{count} サイクルからプロファイルを作成", - "create_profile": "+ プロフィールの作成", - "delete": "消去", - "delete_group": "グループの削除", - "delete_group_tip": "このグループのみを削除します - メンバーのプロフィールは保持されます", - "delete_profile": "プロフィールの削除", - "discard": "破棄", - "discard_tip": "録音されたトレースを保存せずに破棄します", - "dismiss": "却下する", - "done": "終わり", - "edit": "編集", - "export": "輸出", - "export_json": "JSON にエクスポート", - "force_stop": "強制停止", - "force_stop_tip": "現在のサイクルをすぐに終了し、強制停止としてマークします", - "from_template": "テンプレートから▾", - "ignore": "無視する", - "import_json": "JSONからインポート", - "import_overwrite": "インポート(データを上書き)", - "inspect": "検査する", - "label": "ラベル付け", - "load": "読み込み", - "load_more": "さらに読み込む", - "manage": "管理", - "merge": "マージ", - "new_automation": "+ 新しい自動化", - "new_group": "+ 新しいグループ", - "new_group_tip": "ほぼ同一のプロファイルをグループ化(同じ形状/期間、異なる温度またはスピン)して、マッチングが確実にどれかを選択できるようにします", - "new_phase": "+ 新しいフェーズ", - "new_profile": "+ 新しいプロフィール", - "new_profile_tip": "既存のラベル付きサイクルまたは録音から新しいプログラムプロファイルを作成します", - "on_cycle_finished": "サイクルが終了しました", - "on_cycle_started": "サイクル開始時", - "pause_cycle": "一時停止", - "pause_cycle_tip": "実行中のサイクルを一時停止します – 家電は停止した場所から再開します", - "pg_apply_device": "デバイスに適用", - "pg_autofill": "自動入力", - "play": "再生", - "process": "プロセス", - "process_history": "今すぐ処理", - "process_recording": "録音の保存", - "process_tip": "録音されたトレースを新しいまたは既存のプロファイルとして保存します", - "rebuild": "エンベロープを再構築する", - "rebuild_envelope": "エンベロープの再構築", - "rebuild_tip": "ラベル付きサイクルからすべてのプロファイルの予想電力エンベロープ(最小/最大バンド)を再計算します – 新しいサイクルにラベルを付けた後や古いラベルを修正した後に実行します", - "rec_start_tip": "家電の電力トレースの録音を開始します – サイクルを実行する直前に開始します", - "rec_stop": "停止", - "rec_stop_tip": "録音を停止し、キャプチャされたトレースをレビューのために保持します", - "record": "録音を開始する", - "refresh": "リフレッシュ", - "refresh_diag_tip": "ストレージ統計を再読み込みします", - "refresh_logs_tip": "最新のログレコードを再読み込みします", - "refresh_settings_tip": "サーバーから設定を再読み込みします", - "relabel": "再ラベル付け ({count})", - "remove": "取り除く", - "remove_timer": "タイマーを削除する", - "reset": "リセット", - "reset_ml_models_tip": "微調整されたモデルを破棄し、組み込みモデルに戻ります。 WashData は後でそれらを再学習できます。", - "reset_to_builtin": "内蔵モデルにリセット", - "reset_to_defaults": "デフォルトにリセットする", - "resume_cycle": "再開する", - "resume_cycle_tip": "一時停止されたサイクルを再開します", - "revert_settings": "変更を破棄", - "revert_settings_tip": "前回の保存前の設定を復元します", - "revert_settings_tip_none": "元に戻す機能を有効にするには先に保存してください", - "revert": "元に戻す", - "revert_to_previous": "この設定を以前の値に戻す", - "review": "評価する", - "run": "実行", - "run_analysis": "🔍 提案分析を実行する", - "run_analysis_tip": "記録されたサイクルを今すぐ分析し、調整の提案を更新します", - "run_auto_label": "自動ラベルの実行", - "run_both": "A と B を実行", - "run_simulation": "シミュレーションを実行", - "save": "保存", - "save_access_control": "アクセス制御の保存", - "save_group": "グループの保存", - "save_panel_settings": "パネル設定の保存", - "save_phases": "フェーズの保存", - "save_preferences": "設定の保存", - "save_reminders": "リマインダーを保存", - "save_review": "レビューを保存", - "save_settings": "設定の保存", - "select": "選択", - "select_all": "すべて選択", - "select_last20": "直近 20 件", - "select_none": "クリア", - "show_only": "表示のみ", - "skip_setup": "セットアップをスキップ", - "split": "スプリット", - "stop": "停止", - "submit_correction": "修正の送信", - "train_now": "今すぐトレーニングする", - "trim": "トリム", - "trim_split": "トリム/スプリット", - "undo": "元に戻す", - "use": "使用", - "wipe_all": "すべてのデータを消去", - "delete_selected": "選択項目を削除({n})", - "group_suggest": "グループ {n}:{members}", - "pg_apply_best": "最適値を適用", - "pg_apply_to_settings": "設定に保存", - "pg_apply_to_settings_tip": "ここで編集した値をこのデバイスの現在有効な設定にコピーします", - "search": "検索", - "import": "インポート", - "disconnect": "切断", - "connect_github": "GitHub に接続", - "save_appliance": "家電を保存", - "share_to_store": "ストアに共有", - "share": "共有", - "confirm_appliance": "この家電を確認", - "confirmed": "確認済み", - "browse_community_setups": "コミュニティのセットアップを閲覧", - "download_device": "このセットアップをダウンロード", - "share_device": "⬆ このデバイスを共有", - "share_device_tip": "この機器と記録済みリファレンスサイクルをコミュニティストアに共有して、同じ機種を持つ他のユーザーが利用できるようにします", - "share_n": "{n}件のサイクルを共有", - "export_selected": "エクスポート(データを選択)", - "export_all": "すべてをクイックエクスポート", - "import_raw": "詳細設定:JSONからすべて置き換え", - "download_export": "エクスポートをダウンロード", - "analyze_import": "ファイルを解析", - "import_selected": "選択項目をインポート", - "back": "戻る" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "停止しきい値 ({stop} W) を下回る必要があります。そうでないとしわ防止終了電力は無視されます", - "stop": "しわ防止終了電力 ({exit} W) を上回る必要があります" + "card": { + "min": "分", + "entity_not_found": "エンティティが見つかりません", + "running_long": "超過中", + "remaining": "残り", + "progress": "進捗", + "show_time_remaining": "残り時間を表示", + "show_percentage": "パーセンテージを表示", + "layout": { + "tile": "タイル(コンパクト)", + "detail": "詳細(リッチ)", + "glance": "一覧(複数デバイス)" + }, + "btn": { + "pause": "一時停止", + "resume": "再開", + "terminate": "サイクルを終了", + "record_start": "記録を開始", + "record_stop": "記録を停止", + "program": "プログラム", + "open_panel": "WashData を開く" + }, + "editor": { + "layout": "レイアウト", + "entity": "家電エンティティ", + "entities": "家電", + "title": "タイトル", + "icon": "アイコン", + "show_state": "状態を表示", + "show_program": "プログラムを表示", + "show_progress_bar": "進捗バーを表示", + "spin_icon": "実行中にアイコンを回転", + "display_mode": "詳細行", + "active_color": "アクティブカラーの上書き", + "show_phase": "フェーズを表示", + "show_energy": "エネルギーとコストを表示", + "show_anomaly": "超過警告を表示", + "show_sparkline": "ライブ電力グラフを表示", + "buttons": "操作ボタン", + "program_entity": "プログラムエンティティ(上書き)", + "time_entity": "時間エンティティ(上書き)", + "pct_entity": "進捗エンティティ(上書き)", + "power_entity": "電力エンティティ(上書き)", + "tap_action": "タップ操作", + "hold_action": "長押し操作", + "double_tap_action": "ダブルタップ操作" + } + }, + "badge": { + "artifact_tip": "{n} 個の異常が検出されました (例: サイクルの途中でドアが開いた) – 開いてグラフ上で確認します", + "auto": "(自動検出)", + "built_in_tag": "内蔵", + "declining": "↘ 悪化", + "energy_low": "普段より消費エネルギーが少ない", + "energy_spike": "普段より消費エネルギーが多い", + "fair_fit": "普通", + "fair_fit_tip": "中程度の一致一貫性 - このプロファイルに割り当てられた一部のサイクルの信頼スコアが低くなります。精度を向上させるには、さらに多くのサイクルにラベルを付けるか、プロファイルを再記録します。", + "feedback_requested": "フィードバックが必要です", + "golden_cycle": "記録された基準サイクル", + "improving": "↗ 改善中", + "manual": "(手動で選択)", + "needs_review": "見直しが必要", + "overrun": "普段より長く動作した", + "poor_fit": "低品質", + "poor_fit_tip": "マッチ履歴に一貫性がありません - このプロファイルの再構築を検討してください", + "restart_gap_tip": "{n} HA 再起動ギャップ: 電力トレースに欠損区間があります", + "reviewed": "レビュー済み", + "steady": "→安定", + "underrun": "普段より早く終了した", + "using_defaults": "出荷時のデフォルトを使用する", + "using_tuned": "調整された重みの使用", + "overrun_ratio": "(予想の{x}倍)", + "underrun_ratio": "(予想の{pct}%)", + "awaiting_tip": "コミュニティの承認待ち", + "awaiting_n": "承認待ち · {n} 件確認済み", + "approved": "承認済み", + "awaiting": "承認待ち", + "imported_tip": "コミュニティストアからインポートしました。マッチングにのみ使用され、統計には含まれません。", + "not_importable": "対象外", + "exists": "既存" + }, + "btn": { + "add_device": "+ デバイスを追加", + "add_device_tip": "別の WashData デバイスを追加する", + "add_maintenance": "メンテナンスイベントを追加", + "add_phase": "+ フェーズを追加", + "add_timer": "+ タイマーを追加", + "apply_all": "全て適用", + "apply_label": "ラベルを適用する", + "apply_set_b": "セット B を適用", + "apply_split": "分割を適用する", + "apply_trim": "トリムを適用", + "auto_detect_split": "自動検出", + "auto_label_cycles": "サイクルを自動ラベル付け", + "auto_label_cycles_tip": "一致信頼度がしきい値をクリアするラベルなしサイクルにプロファイル名を自動的に割り当てます", + "cancel": "キャンセル", + "clear_debug": "デバッグデータのクリア", + "clear_splits": "クリア", + "close": "閉じる", + "compare": "比較する", + "confirm": "確認する", + "convert_to_automation": "自動化への変換", + "correct": "修正…", + "create": "作成する", + "create_from_cluster": "{count} サイクルからプロファイルを作成", + "create_profile": "+ プロファイルの作成", + "delete": "削除", + "delete_group": "グループの削除", + "delete_group_tip": "このグループのみを削除します - メンバーのプロファイルは保持されます", + "delete_profile": "プロファイルの削除", + "discard": "破棄", + "discard_tip": "記録されたトレースを保存せずに破棄します", + "dismiss": "却下する", + "done": "完了", + "edit": "編集", + "export": "エクスポート", + "export_json": "JSON にエクスポート", + "force_stop": "強制停止", + "force_stop_tip": "現在のサイクルをすぐに終了し、強制停止としてマークします", + "from_template": "テンプレートから▾", + "ignore": "無視する", + "import_json": "JSONからインポート", + "import_overwrite": "インポート(データを上書き)", + "inspect": "検査する", + "label": "ラベル付け", + "load": "読み込み", + "load_more": "さらに読み込む", + "manage": "管理", + "merge": "マージ", + "new_automation": "+ 新しい自動化", + "new_group": "+ 新しいグループ", + "new_group_tip": "ほぼ同一のプロファイルをグループ化(同じ形状/期間、異なる温度または脱水)して、マッチングが確実にどれかを選択できるようにします", + "new_phase": "+ 新しいフェーズ", + "new_profile": "+ 新しいプロファイル", + "new_profile_tip": "既存のラベル付きサイクルまたは記録から新しいプログラムプロファイルを作成します", + "on_cycle_finished": "サイクル終了時", + "on_cycle_started": "サイクル開始時", + "pause_cycle": "一時停止", + "pause_cycle_tip": "実行中のサイクルを一時停止します – 家電は停止した場所から再開します", + "pg_apply_device": "デバイスに適用", + "pg_autofill": "自動入力", + "pg_load_calibrated": "調整済み (ML) を読み込む ({n})", + "pg_load_calibrated_tip": "ML 調整済みの設定をプレイグラウンドの上書き値として適用します", + "pg_load_live": "有効な設定を読み込む", + "pg_load_live_tip": "統合の現在の設定を読み直し、プレイグラウンドでの編集をすべて破棄します", + "pg_load_suggested": "提案を読み込む ({n})", + "pg_load_suggested_tip": "自動調整ツールの現在の提案をプレイグラウンドの上書き値として適用します", + "pg_preset_delete": "プリセットを削除", + "pg_preset_load": "プリセットを読み込む", + "pg_preset_load_tip": "プレイグラウンドの値をこのプリセットで置き換えます(有効な設定は変更されません)", + "pg_preset_save": "プリセットとして保存", + "pg_preset_save_tip": "以下のすべての値に名前を付けて、このデバイスのプリセットとして保存します", + "pg_publish_all": "{n} 件を統合に適用", + "pg_publish_one": "{label} を統合に適用", + "play": "再生", + "process": "処理", + "process_history": "今すぐ処理", + "process_recording": "記録の保存", + "process_tip": "記録されたトレースを新しいまたは既存のプロファイルとして保存します", + "rebuild": "エンベロープを再構築する", + "rebuild_envelope": "エンベロープの再構築", + "rebuild_tip": "ラベル付きサイクルからすべてのプロファイルの予想電力エンベロープ(最小/最大バンド)を再計算します – 新しいサイクルにラベルを付けた後や古いラベルを修正した後に実行します", + "rec_start_tip": "家電の電力トレースの記録を開始します – サイクルを実行する直前に開始します", + "rec_stop": "停止", + "rec_stop_tip": "記録を停止し、キャプチャされたトレースをレビューのために保持します", + "record": "記録を開始する", + "refresh": "リフレッシュ", + "refresh_diag_tip": "ストレージ統計を再読み込みします", + "refresh_logs_tip": "最新のログレコードを再読み込みします", + "refresh_settings_tip": "サーバーから設定を再読み込みします", + "relabel": "再ラベル付け ({count})", + "remove": "取り除く", + "remove_timer": "タイマーを削除する", + "reset": "リセット", + "reset_ml_models_tip": "微調整されたモデルを破棄し、組み込みモデルに戻ります。 WashData は後でそれらを再学習できます。", + "reset_to_builtin": "内蔵モデルにリセット", + "reset_to_defaults": "デフォルトにリセットする", + "resume_cycle": "再開する", + "resume_cycle_tip": "一時停止されたサイクルを再開します", + "revert_settings": "変更を破棄", + "revert_settings_tip": "前回の保存前の設定を復元します", + "revert_settings_tip_none": "元に戻す機能を有効にするには先に保存してください", + "revert": "元に戻す", + "revert_to_previous": "この設定を以前の値に戻す", + "review": "レビュー", + "run": "実行", + "run_analysis": "🔍 提案分析を実行する", + "run_analysis_tip": "記録されたサイクルを今すぐ分析し、調整の提案を更新します", + "run_auto_label": "自動ラベルの実行", + "run_both": "A と B を実行", + "run_simulation": "シミュレーションを実行", + "save": "保存", + "save_access_control": "アクセス制御の保存", + "save_group": "グループの保存", + "save_panel_settings": "パネル設定の保存", + "save_phases": "フェーズの保存", + "save_preferences": "設定の保存", + "save_reminders": "リマインダーを保存", + "save_review": "レビューを保存", + "save_settings": "設定の保存", + "select": "選択", + "select_all": "すべて選択", + "select_last20": "直近 20 件", + "select_none": "クリア", + "show_only": "表示のみ", + "skip_setup": "セットアップをスキップ", + "split": "分割", + "stop": "停止", + "submit_correction": "修正の送信", + "train_now": "今すぐトレーニングする", + "trim": "トリム", + "trim_split": "トリム/分割", + "undo": "元に戻す", + "use": "使用", + "wipe_all": "すべてのデータを消去", + "delete_selected": "選択項目を削除({n})", + "group_suggest": "グループ {n}:{members}", + "pg_apply_best": "最適値を適用", + "pg_apply_to_settings": "設定に保存", + "pg_apply_to_settings_tip": "ここで編集した値をこのデバイスの現在有効な設定にコピーします", + "search": "検索", + "import": "インポート", + "disconnect": "切断", + "connect_github": "GitHub に接続", + "save_appliance": "家電を保存", + "share_to_store": "ストアに共有", + "share": "共有", + "confirm_appliance": "この家電を確認", + "confirmed": "確認済み", + "browse_community_setups": "コミュニティのセットアップを閲覧", + "download_device": "このセットアップをダウンロード", + "share_device": "⬆ このデバイスを共有", + "share_device_tip": "この機器と記録済みリファレンスサイクルをコミュニティストアに共有して、同じ機種を持つ他のユーザーが利用できるようにします", + "share_n": "{n}件のサイクルを共有", + "export_selected": "エクスポート(データを選択)", + "export_all": "すべてをクイックエクスポート", + "import_raw": "詳細設定:JSONからすべて置き換え", + "download_export": "エクスポートをダウンロード", + "analyze_import": "ファイルを解析", + "import_selected": "選択項目をインポート", + "back": "戻る", + "mute_suggestion": "この設定の提案を停止", + "reset_muted": "ミュートをリセット" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "停止しきい値 ({stop} W) を下回る必要があります。そうでないとしわ防止終了電力は無視されます", + "stop": "しわ防止終了電力 ({exit} W) を上回る必要があります" + }, + "anti_wrinkle_max": { + "max": "開始しきい値 ({start} W) を上回る必要があります。そうでないとしわ防止の時間制限がバイパスされます", + "start": "しわ防止最大電力 ({max} W) を下回る必要があります" + }, + "attn_sub": "保存する前に競合を解消してください", + "attn_title": "{n}件の設定競合{s}", + "confidence": { + "auto": "マッチしきい値 ({match}) 以上である必要があります", + "learning": "マッチしきい値 ({match}) 以下である必要があります", + "match_for_auto": "自動ラベル信頼度 ({alc}) 以下である必要があります", + "match_for_learning": "学習信頼度 ({lc}) 以上である必要があります" + }, + "duration_ratio": { + "max": "最小時間比率 ({min}) より大きい必要があります", + "min": "最大時間比率 ({max}) より小さい必要があります" + }, + "hysteresis": { + "start": "停止しきい値 ({stop} W) を上回る必要があります", + "stop": "開始しきい値 ({start} W) を下回る必要があります" + }, + "min_power": { + "min_power": "停止しきい値 ({stop} W) 以下である必要があります", + "stop": "最小電力 ({min} W) 以上である必要があります" + }, + "no_update_timeout": { + "timeout": "ウォッチドッグ間隔 ({wi} 秒) より大きい必要があります", + "watchdog": "更新なしタイムアウト ({to} 秒) より小さい必要があります" + }, + "off_delay": { + "gap": "最小オフギャップはオフ遅延 ({delay} 秒) 以上である必要があります", + "off_delay": "オフ遅延 ({off_delay} 秒) が最小オフギャップ ({gap} 秒) を超えています。連続サイクルが結合する可能性があります" + }, + "power_off": { + "stop": "電源オフしきい値 ({pot} W) を上回る必要があります", + "threshold": "有効にするには停止しきい値 ({stop} W) を下回る必要があります" + }, + "pump_stuck": { + "duration": "ウォッチドッグがサイクルを強制終了する前にスタックアラームが発動するよう、更新なしタイムアウト ({to} 秒) より小さい必要があります", + "timeout": "サイクルが強制停止される前にスタックアラームが発動するよう、ポンプ停止継続時間 ({ps} 秒) を超える必要があります" + }, + "start_dur": { + "sampling": "サンプリング間隔が開始継続時間 ({sdt} 秒) を超えています。単一サンプルのスパイクがサイクルを開始する可能性があります", + "threshold": "単一サンプルの誤起動を防ぐために、少なくとも 1 サンプリング間隔 ({si} 秒) である必要があります" + }, + "unmatch": { + "match": "アンマッチしきい値 ({un}) を上回る必要があります", + "unmatch": "マッチしきい値 ({match}) を下回る必要があります。そうでないと確定した一致が即座に解除されます" + }, + "cascade_toast": "整合性のため、さらに{n}件の設定{s}も自動調整しました。", + "suggestion_resolves": "下の保留中の提案({val})を適用してこれを修正してください", + "use_fix": "{val} を使用", + "watchdog": { + "interval": "サンプリング間隔 ({si} 秒) の少なくとも 2 倍である必要があります", + "sampling": "サンプリング間隔はウォッチドッグ間隔 ({wi} 秒) の半分以下である必要があります" + }, + "settings_banner": "{n} 件の設定競合{s} – 強調表示されたセクションを確認し、保存前に修正してください。", + "settings_banner_btn": "最初へ" }, - "anti_wrinkle_max": { - "max": "開始しきい値 ({start} W) を上回る必要があります。そうでないとしわ防止の時間制限がバイパスされます", - "start": "しわ防止最大電力 ({max} W) を下回る必要があります" - }, - "attn_sub": "保存する前に競合を解消してください", - "attn_title": "{n}件の設定競合{s}", - "confidence": { - "auto": "マッチしきい値 ({match}) 以上である必要があります", - "learning": "マッチしきい値 ({match}) 以下である必要があります", - "match_for_auto": "自動ラベル信頼度 ({alc}) 以下である必要があります", - "match_for_learning": "学習信頼度 ({lc}) 以上である必要があります" - }, - "duration_ratio": { - "max": "最小時間比率 ({min}) より大きい必要があります", - "min": "最大時間比率 ({max}) より小さい必要があります" - }, - "hysteresis": { - "start": "停止しきい値 ({stop} W) を上回る必要があります", - "stop": "開始しきい値 ({start} W) を下回る必要があります" - }, - "min_power": { - "min_power": "停止しきい値 ({stop} W) 以下である必要があります", - "stop": "最小電力 ({min} W) 以上である必要があります" - }, - "no_update_timeout": { - "timeout": "ウォッチドッグ間隔 ({wi} 秒) より大きい必要があります", - "watchdog": "更新なしタイムアウト ({to} 秒) より小さい必要があります" - }, - "off_delay": { - "gap": "最小オフギャップはオフ遅延 ({delay} 秒) 以上である必要があります", - "off_delay": "オフ遅延 ({off_delay} 秒) が最小オフギャップ ({gap} 秒) を超えています。連続サイクルが結合する可能性があります" - }, - "power_off": { - "stop": "電源オフしきい値 ({pot} W) を上回る必要があります", - "threshold": "有効にするには停止しきい値 ({stop} W) を下回る必要があります" - }, - "pump_stuck": { - "duration": "ウォッチドッグがサイクルを強制終了する前にスタックアラームが発動するよう、更新なしタイムアウト ({to} 秒) より小さい必要があります", - "timeout": "サイクルが強制停止される前にスタックアラームが発動するよう、ポンプ停止継続時間 ({ps} 秒) を超える必要があります" - }, - "start_dur": { - "sampling": "サンプリング間隔が開始継続時間 ({sdt} 秒) を超えています。単一サンプルのスパイクがサイクルを開始する可能性があります", - "threshold": "単一サンプルの誤起動を防ぐために、少なくとも 1 サンプリング間隔 ({si} 秒) である必要があります" - }, - "unmatch": { - "match": "アンマッチしきい値 ({un}) を上回る必要があります", - "unmatch": "マッチしきい値 ({match}) を下回る必要があります。そうでないと確定した一致が即座に解除されます" - }, - "cascade_toast": "整合性のため、さらに{n}件の設定{s}も自動調整しました。", - "suggestion_resolves": "下の保留中の提案({val})を適用してこれを修正してください", - "use_fix": "{val} を使用", - "watchdog": { - "interval": "サンプリング間隔 ({si} 秒) の少なくとも 2 倍である必要があります", - "sampling": "サンプリング間隔はウォッチドッグ間隔 ({wi} 秒) の半分以下である必要があります" - }, - "settings_banner": "{n} 件の設定競合{s} – 強調表示されたセクションを確認し、保存前に修正してください。", - "settings_banner_btn": "最初へ" - }, - "hdr": { - "ab_comparison": "A/B 設定の比較", - "access_control": "アクセス制御", - "add_maintenance": "メンテナンスイベントの追加", - "automation_delete": "このオートメーションを削除します", - "automation_needs_review": "このサイクルは見直す必要がある", - "automation_open": "オートメーションエディターで開く", - "automation_review_this_cycle": "このサイクルを見直す", - "automations": "自動化", - "clear_debug": "デバッグトレースをクリアする", - "cycle_simulator": "サイクルシミュレーター", - "diagnostics_pref": "診断", - "display": "画面", - "dtw_inspector": "DTW インスペクター", - "export_import": "エクスポート/インポート", - "getting_started": "はじめに", - "live_power": "ライブパワー", - "logs": "ログ", - "logs_diagnostics": "診断", - "maintenance": "メンテナンスアクション", - "maintenance_log": "メンテナンス履歴", - "maintenance_reminders": "サービスリマインダー", - "manual_recording": "手動録音", - "manual_recording_tip": "WashData が電力トレースを記録する間、意図的にサイクルを実行します。家電が起動する直前に開始し、終了したら停止し、次に処理して名前付きプロファイルとして保存します。", - "ml_learned": "WashData が学んだこと", - "ml_matching_tuning": "プログラムマッチングの微調整", - "ml_settings_card": "設定", - "ml_smart_learning": "スマートラーニング", - "my_preferences": "私の好み", - "no_automations": "このデバイスを参照するオートメーションはまだありません。", - "panel_settings": "パネル設定", - "param_sweep": "パラメータースイープ", - "phase_catalog": "フェーズカタログ", - "playground": "プレイグラウンド", - "process_history": "プロセス履歴", - "settings_history": "設定履歴", - "status": "状態", - "status_graph": "ステータスグラフ", - "storage_stats": "ストレージ統計", - "test_history": "履歴でテスト", - "toggle_sidebar": "ホームアシスタントサイドバーの切り替え", - "tools_and_data": "ツールとデータ", - "wipe_history": "履歴を消去", - "recommendations": "推奨事項({n})", - "pg_detection_params": "検出設定", - "pg_timeline": "イベントタイムライン", - "pg_outcome": "シミュレーション結果", - "pg_across_cycles": "全サイクルにわたって", - "community_store": "コミュニティストア", - "online_account": "コミュニティストアとオンライン機能" - }, - "health": { - "fair": "プロファイル品質: 普通", - "good": "✓ プロファイル品質: 良", - "poor": "⚠ プロファイル品質: 低" - }, - "lbl": { - "actions": "アクション", - "activity": "活動", - "administrators": "管理者", - "aria_compare_chart": "サイクル比較グラフ", - "aria_cycle_chart": "サイクル電力推移", - "aria_envelope_chart": "プロファイルの電力エンベロープグラフ", - "aria_phase_chart": "フェーズエディターグラフ", - "aria_playground_chart": "ドラッグ可能な検出しきい値付きのサイクル電力推移", - "aria_power_chart": "消費電力グラフ", - "aria_spaghetti_chart": "重ね合わせたサイクル電力推移", - "aria_sweep_chart": "パラメータースイープ結果グラフ", - "artifact_anomaly": "異常", - "artifact_high_power": "高出力", - "artifact_interruption": "中断", - "artifact_low_power": "低出力", - "auto_detect": "自動検出", - "auto_fine_tune_off": "自動微調整オフ", - "auto_fine_tune_on": "自動微調整オン({hour}:00 頃)", - "avg_cost": "平均料金", - "change": "変更", - "clock_time": "時計の時間", - "cohesion_good": "凝集度 {pct}%", - "cohesion_low": "⚠ 低凝集度 {pct}%", - "compare_profiles": "プロフィールと比較する", - "concurrency": "並列実行数", - "confidence": "自信", - "confidence_threshold": "信頼閾値", - "correct_duration": "正しい継続時間 (分、オプション)", - "correct_profile": "正しいプロフィール", - "correlation": "相関", - "cost": "料金", - "create_new_profile": "+ 新しいプロフィールを作成…", - "current_phase": "現在のフェーズ", - "curves": "曲線", - "cycle": "サイクル", - "cycle_date_display": "サイクル日付表示", - "cycle_health": "サイクルの健康", - "cycle_index": "サイクル番号 →", - "cycles": "サイクル", - "cycles_count": "サイクル", - "cycles_lc": "サイクル", - "dashed": "破線", - "date": "日付", - "debug_traces": "デバッグトレース", - "default": "デフォルト", - "default_access_level": "以下にリストされていないユーザーのデフォルト レベル", - "default_other": "デフォルト(他のデバイス)", - "default_tab": "パネルを開いたときのデフォルトのタブ", - "delta": "Δ", - "description": "説明", - "dtw_blend_w": "ブレンド重み", - "dtw_blended": "ブレンドスコア", - "dtw_ddtw": "DDTW スコア", - "dtw_l1": "L1 スコア", - "dtw_matched_profile": "(サイクルの一致プロフィール)", - "duration": "間隔", - "duration_agreement": "継続時間の一致度", - "emphasis": "強調", - "enable_access_control": "ユーザーごとのアクセス制御を有効にする", - "energy": "エネルギー", - "energy_agreement": "エネルギーの一致度", - "event_timeline": "イベントタイムライン", - "event_type": "イベントの種類", - "expected": "予想", - "expected_duration": "予想される所要時間 (分)", - "file_kb": "ファイル (kB)", - "final_score": "最終スコア", - "from": "開始", - "gap_s": "ギャップ", - "group_name": "グループ名", - "head_trim": "ヘッドトリム (複数可)", - "health": "健康", - "hide_tabs": "管理者以外のタブを非表示にする", - "in_use": "使用中", - "json_data": "JSONデータ", - "label": "一致したプログラム", - "last": "直近", - "last_checked": "最後にチェックした内容:", - "load_from_file": "ファイルからロード", - "mae_score": "MAE スコア", - "manual_duration": "手動持続時間 (分、オプション)", - "match": "マッチ", - "members": "メンバー", - "metric": "指標", - "mode_existing_profile": "既存のプロファイルに追加", - "mode_new_profile": "新しいプロファイルの作成", - "models_fine_tuned": "({count}モデル{plural}微調整済み)", - "n_classic_suggestions": "{n} クラシック", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} 件選択中", - "n_tuning_suggestions": "{n} 件のチューニング提案", - "na": "該当なし", - "new_profile_name": "新しいプロファイル名", - "notes": "メモ", - "of": "/", - "outcome": "結果", - "panel_default_tab": "デフォルトのタブ", - "panel_language": "パネル言語", - "per_cycle_short": "サイクル", - "pg_anti_wrinkle": "しわ防止", - "pg_autofill_tip": "現在の値から範囲を自動入力({lo}–{hi})", - "pg_best_value": "見つかった最適値", - "pg_current_value": "現在の値:", - "pg_drag_hint": "グラフ上の線をドラッグ", - "pg_dtw": "DTW", - "pg_ev_ending": "終了中", - "pg_ev_running": "実行中", - "pg_group_advanced": "エッジケース", - "pg_group_detection": "検出トリガー", - "pg_group_timing": "タイミングルール", - "pg_idle": "アイドル", - "pg_last_run": "前回の実行: {date}", - "pg_match_score": "マッチスコア", - "pg_pct_of": "{total} 中 {p}%", - "pg_poor_match": "不十分なマッチ", - "pg_strong_match": "強いマッチ", - "pg_tile_ambiguous": "あいまい", - "pg_tile_ambiguous_tip": "2つのプログラムがほぼ同点だったサイクル", - "pg_tile_detected": "検出", - "pg_tile_detected_tip": "電力が開始しきい値を十分な時間超えて、実行中として登録されたサイクル", - "pg_tile_matched": "マッチ", - "pg_tile_matched_tip": "既知のプログラムに正しく割り当てられたサイクル", - "pg_time_left": "残り時間", - "pg_weak_match": "弱いマッチ", - "phase_name": "名前", - "phase_timeline": "フェーズタイムライン", - "power": "電力", - "profile": "プロフィール", - "profile_index": "プロフィール番号 →", - "profile_name": "プロファイル名", - "program": "プログラム", - "program_tip": "現在のサイクルに一致するプロファイルを上書きします。自動検出では、統合が最適な一致を自動的に選択します。自動検出が誤っている場合や実行中のプログラムが分かっている場合は、特定のプログラムを固定して強制的に一致させます。", - "progress": "進捗", - "raw_socket": "生のソケット", - "read_only": "読み取り専用", - "ref_cycle": "基準サイクル (オプション)", - "refresh_interval": "リフレッシュ間隔 (秒)", - "remaining": "残り", - "reminder_every": "リマインド間隔 (サイクル)", - "remove_label": "- ラベルを剥がす -", - "rename_profile": "プロファイル名の変更", - "replay_duration": "再生", - "resulting_profile": "結果として得られるプロファイル", - "save_mode": "セーブモード", - "score": "スコア", - "score_breakdown": "スコアの内訳", - "seconds_from_start": "開始から数秒", - "select_profile": "プロファイルの選択", - "setting": "設定", - "settings_a": "設定 A (現在)", - "settings_a_short": "A", - "settings_advanced": "高度な", - "settings_b": "設定 B (テスト)", - "settings_b_short": "B", - "settings_basic": "基本", - "settings_detail_level": "設定の詳細レベル", - "settings_overrides": "設定の上書き", - "show_debug": "ステータス ページにライブ マッチ デバッグ カードを表示します (信頼性、曖昧さ、上位候補)", - "show_expected": "予想される曲線オーバーレイを表示 (一致したプロファイル、オレンジ色)", - "show_raw": "ライブ電力グラフに生ソケット切替を表示", - "sparkline": "最近のサイクル継続時間の傾向", - "stage2": "ステージ 2 – コア類似度", - "stage3": "ステージ 3 – DTW", - "stage4": "ステージ 4 – 一致度", - "status": "状態", - "tail_trim": "テールトリム (複数可)", - "timer_auto_pause": "自動一時停止", - "timer_min": "分", - "timer_msg_placeholder": "メッセージ (オプション、{device}/{program}/{minutes})", - "to": "終了", - "ungrouped": "グループ化されていない", - "unlabelled": "ラベルなし", - "unlabelled_paren": "(ラベルなし)", - "warp_path": "ワープパス", - "input": "入力:", - "start": "開始", - "end": "終了", - "unit_s": "(秒)", - "reviewed_on": "{date} にレビュー済み", - "unknown": "不明", - "quality": "品質", - "tags": "タグ", - "at": "@", - "pct_match_confidence": "マッチ信頼度 {pct}%", - "ha_restarted": "HA が再起動しました", - "from_start": "開始から", - "to_end": "終了まで", - "click_to_select": "クリックして選択", - "envelope": "エンベロープ", - "zoom_hint": "スクロールでズーム · ダブルクリックでリセット", - "loading_paren": "(読み込み中…)", - "time_remaining": "残り約{v}", - "no_duration": "継続時間なし", - "duration_avg": "平均約{v}分", - "name_placeholder": "(名前)", - "n_shown": "、{n} 件表示", - "cycles_title": "サイクル({n})", - "pg_detecting": "検出中", - "pg_best_marker": "ベスト:{v}", - "pg_time_left_model": "残り時間(モデル)", - "pg_time_left_model_tip": "モデルが推定する残り時間(フェーズ推定+MLブレンド)。固定のカウントダウンではありません。", - "phase": "フェーズ", - "pg_mode_simulate": "シミュレート", - "pg_mode_history": "履歴テスト", - "pg_mode_sweep": "スイープ", - "pg_ev_detected": "検出", - "pg_ev_match": "マッチ確定", - "pg_ev_match_changed": "マッチ変更", - "pg_ev_ambiguous": "あいまい", - "pg_ev_unmatched": "マッチなし", - "pg_ev_notify_start": "開始通知", - "pg_ev_notify_pre": "まもなく完了通知", - "pg_ev_notify_finish": "完了通知", - "pg_ev_notify_milestone": "マイルストーン通知", - "pg_ev_notify_held": "通知保留(サイレント時間)", - "pg_ev_finished": "完了", - "pg_ended": "終了", - "pg_proj_energy": "予測エネルギー", - "pg_alert_overrun": "長すぎ", - "pg_alert_underrun": "短すぎ", - "pg_alert_did_not_finish": "未完了", - "pg_alert_false_end": "複数サイクルに分割", - "pg_alert_unmatched": "マッチなし", - "pg_alert_ambiguous": "あいまいなマッチ", - "pg_alert_energy": "エネルギー異常", - "pg_newly_correct": "新たに正解", - "pg_regressed": "悪化", - "pg_end_timing_changed": "終了タイミング変更", - "pg_vs_current": "現在との比較", - "pg_fixed": "解消", - "pg_broke": "不具合発生", - "pg_sweep_param": "パラメーター", - "pg_objective": "目的", - "pg_steps": "ステップ数", - "pg_stress_group": "待機終了テスト", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "待機レベル (W)", - "pg_stress_idle_w_desc": "自動検出された待機電力下限を上書きします(自動の場合は空欄)。", - "pg_stress_toggle": "待機終了をテスト", - "pg_stress_toggle_desc": "記録終了後に待機電力レベルで稼働し続ける機器をシミュレートします - WashData がサイクルを停止するかどうか、およびいつ停止するかを確認します。", - "pg_sweep_2d": "2Dヒートマップ", - "pg_sweep_param_y": "2番目のパラメーター", - "pg_obj_match": "マッチ精度", - "pg_obj_endtiming": "終了タイミング精度", - "pg_obj_falseend": "誤終了率", - "pg_obj_overrun": "所要時間のずれ", - "pg_obj_ambiguity": "あいまい率", - "pg_best_combo": "最適な組み合わせ", - "pg_mode_optimize": "最適化", - "pg_group_matching": "プログラムマッチング", - "pg_zoom_hint": "ダブルクリックでズームをリセット", - "aria_playground_chart2": "インタラクティブなサイクル電力グラフ: ホバーで時刻/電力を表示、スクロールでズーム、ドラッグで移動", - "pg_alert_timeout_end": "予測ではなくタイムアウトで終了しました", - "pg_alert_indefinite": "いつまでも終了しません", - "pg_alert_stress_cap": "安全制限に達しました", - "pg_alert_stress_ok": "待機終了: サイクルが停止しました", - "pg_alert_stress_warn": "待機電力が停止しきい値を超えています", - "task_pg_history": "履歴でテスト", - "task_pg_sweep": "最適化", - "task_reprocess": "再処理", - "task_ml_training": "学習", - "eta_secs": "~{n}秒残り", - "eta_mins": "~{n}分残り", - "pg_recent_runs": "最近の実行", - "pg_load_run": "この実行を再読み込み", - "pg_match_confidence": "マッチ信頼度", - "pg_envelope_fit": "エンベロープ適合度", - "pg_envelope_fit_tip": "このプロフィールの保存された電力エンベロープ内にサイクルがどれだけ収まっているか。マッチ信頼度とは異なる視点です。", - "n_imported_note": "、{n} 件インポート済み", - "enable_online": "オンライン機能を有効化", - "store_brand": "家電ブランド", - "store_model": "家電モデル", - "anonymous": "匿名", - "rate_quality": "品質を評価", - "rate_n": "星{n}つ", - "approved_only": "承認済みのみ", - "adopt_settings": "設定も引き継ぐ", - "flags": "フラグ", - "include_phase_map": "フェーズマップを含める", - "include_settings": "検出・マッチング設定を含める", - "show_contributor": "投稿者名を表示", - "task_pg_detail": "サイクルをシミュレート", - "task_split": "サイクルを分割中", - "task_trim": "サイクルをトリミング中", - "task_merge": "サイクルを結合中", - "task_rebuild": "エンベロープを再構築中", - "cat_profiles": "プロファイル(プログラム)", - "cat_real_cycles": "サイクル(実行履歴)", - "cat_reference_cycles": "参照サイクル(インポート済み)", - "cat_custom_phases": "カスタムフェーズ", - "cat_profile_groups": "プロファイルグループ", - "cat_settings": "検出と認識の設定", - "cat_matching_config": "認識の調整", - "cat_ml_models": "MLモデル", - "cat_feedback": "フィードバックとレビューラベル", - "cat_suggestions": "提案", - "cat_maintenance_log": "メンテナンスログ", - "cat_history_logs": "履歴と変更ログ", - "cat_lifetime_stats": "累計値", - "cycles_short": "サイクル", - "import_mode": "結合方法", - "mode_merge": "マージ(自分のを保持)", - "mode_replace": "選択項目を置き換え", - "cycle_destination": "インポートしたサイクルの保存先は?", - "dest_reference": "参照(形状のみ)", - "dest_real_history": "実履歴(統計に計上)", - "conflict_resolution": "名前の衝突", - "conflict_import_copy": "コピーとしてインポート", - "conflict_keep_mine": "自分のを保持", - "conflict_overwrite": "上書き" - }, - "log": { - "all_levels": "すべてのレベル", - "all_devices": "すべてのデバイス", - "all_components": "すべてのコンポーネント", - "search_ph": "ログを検索…" - }, - "ml": { - "builtin_models": "● 組み込みモデルの使用", - "fit_fair": "普通", - "fit_good": "良い", - "fit_slight": "わずかに", - "fit_strong": "強い", - "fit_weak": "弱い", - "fit_word": "フィット", - "personalized": "● このマシンに合わせてカスタマイズ可能", - "better_than_baseline": "ベースライン推定より {pct}% 良好({metric})", - "trend_improving_tip": "このモデルのフィットは最近の再チェックで改善しました。", - "trend_declining_tip": "このモデルのフィットは最近の再チェックで低下しました。さらにサイクルをレビューすると再学習に役立つ場合があります。", - "trend_steady_tip": "このモデルのフィットは最近の再チェックでおおむね安定しています。", - "cap_blurb": { - "end": "サイクルが本当に終了したタイミングを把握する", - "live_match": "実行中のプログラムをより早く識別する", - "quality": "誤検出や不完全なサイクルを見つける", - "remaining_time": "残り時間を予測する", - "total_energy": "総消費エネルギーとコストを予測する" - }, - "cap_label": { - "end": "サイクル終了の検出", - "live_match": "プログラム照合", - "quality": "サイクル品質チェック", - "remaining_time": "残り時間の推定", - "total_energy": "エネルギー推定" - }, - "metric_auc": "検証データでの AUC {auc}", - "metric_mae": "誤差 {model} vs ベースライン {baseline}" - }, - "modal": { - "auto_label": "自動ラベル付けサイクル", - "correct_feedback": "正しいフィードバック", - "create_profile": "プロファイルの作成", - "cycle": "サイクル", - "edit_group": "プロファイルグループを編集", - "edit_phase": "編集フェーズ", - "import_config": "設定のインポート", - "label_cycle": "ラベルサイクル", - "merge_cycles": "{n} サイクルを結合", - "new_group": "新しいプロファイルグループ", - "new_phase": "新しいフェーズ", - "process_history_msg": "マッチングを再実行し、提案を更新し、ML を再訓練(有効な場合)し、保存されているすべてのサイクルのサイクル状態を再計算します。これには時間がかかる場合があります。", - "process_history_ok": "処理", - "process_history_title": "履歴の処理", - "process_recording": "プロセスの記録", - "delete_maintenance_msg": "このメンテナンス記録を削除しますか? この操作は元に戻せません。", - "delete_maintenance_title": "メンテナンスイベントを削除", - "relabel_cycles": "{count} 件のサイクルを再ラベル付け", - "delete_automation_title": "オートメーションを削除", - "delete_automation_msg": "オートメーション「{name}」を Home Assistant から削除しますか?この操作は元に戻せません。", - "remove_legacy_title": "従来のアクションを削除", - "remove_legacy_msg": "従来のカスタムアクションを削除しますか?サイクルイベントでの発火が停止します。この操作はパネルから元に戻せません。", - "discard_recording_title": "録音を破棄", - "discard_recording_msg": "保存された録音を破棄しますか?この操作は元に戻せません。", - "dismiss_all_title": "すべてのフィードバックを却下", - "dismiss_all_msg": "保留中の {count} 件のフィードバックリクエストをすべて却下しますか?", - "dismiss_all_ok": "すべて却下", - "delete_phase_title": "フェーズを削除", - "delete_phase_msg": "フェーズ「{name}」を削除しますか?", - "clear_debug_title": "デバッグデータをクリア", - "clear_debug_msg": "保存されているすべてのデバッグトレースを削除しますか?", - "wipe_all_title": "すべてのデータを消去", - "wipe_all_msg": "⚠️ すべてのサイクルとプロファイルを完全に削除します。この操作は元に戻せません。", - "wipe_all_ok": "すべて消去", - "force_stop_title": "サイクルを強制停止", - "force_stop_msg": "アクティブなサイクルを今すぐ強制停止しますか?サイクルは中断として保存されます。", - "store_import": "基準サイクルをインポート", - "store_share": "コミュニティストアに共有", - "store_share_device": "このデバイスを共有", - "export_select": "エクスポート - データを選択", - "import_wizard": "インポート - データを選択" - }, - "msg": { - "appliance_monitor": "アプライアンスモニター", - "artifact_dip_detail": "通常の電力帯の下側に約{n}秒間落ちました。", - "artifact_footer": "上のグラフで強調表示されています。これらは一時的なアーチファクト (サイクルの途中でドアが開いたなど) であり、必ずしも問題があるわけではありません。", - "artifact_header": "このサイクル中に {n} 個の異常が検出されました", - "artifact_pause_detail": "電力が約{n}秒間ほぼゼロに落ちた後、再開されました。サイクルの途中でドアが開かれたか、一時停止された可能性があります。", - "artifact_spike_detail": "通常の電力帯の上側に約{n}秒間現れました。", - "auto_label_intro": "一致信頼度がしきい値をクリアするラベルのないサイクルにプロファイルを割り当てます。", - "automations_intro": "WashData は {start} / {end} イベントを発火しエンティティを公開するため、通知やアクションは通常の Home Assistant オートメーションとして構築するのが最適です。このデバイスを使用するオートメーションは以下に表示されます。", - "cleanup_intro": "すべてのラベル付きサイクルがオーバーレイされます。外れ値にチェックを入れて削除し、プロファイルをクリーンアップします。", - "clear_debug_hint": "保存されているデバッグ データを削除して領域を解放します。", - "collecting_data": "データを収集中です。微調整を開始するにはあと {need} サイクル{plural}必要です({current}/{min})。", - "compare_overlay_profiles": "オーバーレイプロファイル (淡い)", - "compare_profiles_tip": "他のプロファイル エンベロープを上のチャートに重ねて、どれがこのサイクルに最も適合するかを確認します。", - "compare_selected_cycles": "選択されたサイクル (実線) – 表示/非表示", - "consider_new_profile": "新しいプロファイルの作成を検討してください。", - "coverage_gap": "最近のサイクルには一致するプロファイルがありません (過去 30 回の {pct}%)。", - "coverage_gap_similar_cycles": "{count} 件の類似した未ラベルサイクルが見つかりました – プロファイルを作成してマッチングを開始してください。", - "cycles_deleted": "{count} 件のサイクルを削除しました", - "enough_data": "学習に十分なデータがあります({current}/{min} サイクル)。", - "export_description": "JSONにエクスポートするプロファイル、サイクル、設定などを正確に選択するか、ファイルを解析して必要な部分だけをインポートできます。", - "feedback_cycles_pending": "レビューが必要なサイクル: {n}件{s}", - "feedback_prompt": "それが正しかったことを確認し、プログラムを修正するか、無視してください。", - "feedback_relabel_hint": "このサイクルを再ラベル付けすると、これも解決します。", - "filter_by_profile": "プロファイルでフィルター…", - "group_modal_help": "温度/スピンが異なる同じ形状のグループ プログラム (期間は異なる場合があります)。マッチングでは、グループを 1 つの候補としてスコア付けし、最も適合するメンバーを選択します。少なくとも 2 つ選択してください。オーバーレイは、それらがどれだけ似ているかを示します。", - "group_not_cohesive": "これらのプロファイルは、確実にグループ化できるほど類似していないため、外れ値を削除するかグループを分割するまで、マッチングでは個別に扱われます。", - "group_preview_hint": "2つ以上のメンバーを選択してパワーカーブをプレビュー・比較できます。", - "import_intro": "エクスポートされたファイルをロードするか、以下の JSON ペイロードを貼り付けます。", - "legacy_actions_title": "{count} 個の従来のカスタム アクションが引き続き実行中", - "live_chart_loading": "測定値が到着すると、ライブパワーチャートが表示されます。", - "loading": "読み込み中…", - "loading_curve": "荷重曲線…", - "loading_settings": "設定を読み込み中…", - "log_buffer_hint": "新しい順 · 再起動以降の最後の 500 ha_washdata レコードをバッファします · 下端をドラッグしてサイズ変更します。", - "maintenance_advisory": "持続時間/エネルギーの増加は、器具のメンテナンスが必要であることを示している可能性があります (スケール除去、フィルターの掃除など)。", - "maintenance_due": "メンテナンス時期: {items}", - "maintenance_intro": "この家電に対して行ったメンテナンスを記録すると、各作業の次回時期にリマインドされます。", - "maintenance_load_error": "メンテナンスデータを読み込めませんでした: {error}", - "maintenance_requires_access": "メンテナンスとエクスポート/インポートにはフルアクセスが必要です。", - "manual_duration_hint": "プロファイルの平均/予想サイクル長。残り時間の推定に使用されます。編集して設定します。変更しないままにすると、現在の値が維持されます。", - "matching_tuning_intro": "学習時に、WashData はプログラム マッチングによって形状と持続時間およびエネルギーをどの程度重みづけるかも調整します。", - "merge_intro": "選択したサイクルが 1 つに結合されます (時系列順、ギャップは 0 W で埋められます)。結果として得られるプロファイルを選択します。", - "ml_intro": "WashData には、すぐに使えるスマート モデルが同梱されています。", - "ml_learned_intro": "本機に合わせてチューニングされたモデル。", - "ml_loading": "ML を読み込み中…", - "ml_settings_intro": "2 つの独立したスイッチ: 1 つはサイクルの実行中にモデルを適用し、もう 1 つは WashData が時間の経過とともにモデルをマシンに合わせて微調整します。", - "name_first_program": "十分なサイクルがそろいました – 最初のプログラムに名前を付けて一致を開始しましょう。", - "near_duplicate_cluster": "ほぼ重複したプロファイル クラスターが検出されました。グループ化により、類似したもの (例: 異なる温度/スピンの同じプログラム) の間でマッチングを確実に選択できるようになります。", - "no_cycles_match": "現在のフィルターに一致するサイクルはありません。", - "no_cycles_profile": "このプロファイルにはサイクルがありません。", - "no_cycles_selected": "まずサイクルを 1 つ以上選択してください。", - "no_cycles_yet": "まだサイクルが記録されていません。", - "no_device_selected": "デバイスが選択されていません。", - "no_devices": "WashData デバイスはまだ構成されていません。", - "no_envelope": "エンベロープはまだありません - ラベル付けサイクル後に再構築します。", - "no_envelope_overlay": "オーバーレイできる封筒がありません。", - "no_fine_tuned": "まだ何も微調整されていません。WashData は組み込みモデルを使用しています。", - "no_logs": "ログレコードはまだバッファされていません。", - "no_maintenance": "メンテナンスの記録はまだありません。", - "no_match_yet": "まだ一致の試行がありません - これは実行サイクル中に設定されます。", - "no_other_users": "他のホーム アシスタント ユーザーは見つかりませんでした。", - "no_phases": "フェーズは定義されていません。", - "no_phases_assigned": "フェーズが割り当てられていません。", - "no_profiles_compare": "比較するプロファイルがありません。", - "no_profiles_overlay": "オーバーレイするプロファイルがありません。", - "no_profiles_yet": "まだプロフィールはありません。ラベル付きサイクルからサイクルを作成します。", - "no_profiles_yet_short": "まだプロフィールはありません。", - "no_settings_match": "「{q}」に一致する設定はありません", - "no_split_points": "まだ分​​割ポイントはありません。", - "no_suggestions": "積極的な提案はありません。", - "notify_services_hint": "{entity} サービス ID を使用してください(複数はカンマ区切り)。テンプレート変数:{vars}。", - "old_actions_warning": "古いアクション エディター (現在は削除されています) で構成されています。これらは引き続きサイクル イベントで起動されますが、ここでは編集できなくなりました。それらを通常のオートメーションに変換するか、削除します。", - "onboarding_progress": "{n} / 3 サイクルを観測", - "onboarding_watching": "家電をいつも通り使用してください – WashData が監視しています。3 サイクル後にプログラムの一致が始まります。", - "pending_feedback": "保留中の検出フィードバック", - "performance_trend": "パフォーマンスの傾向 ({n} サイクル)", - "pg_analysis_empty": "マッチ分析を見るにはサイクルを読み込んでください。", - "pg_apply_confirm": "最適値を適用: {label} = {value}?", - "pg_canvas_empty": "上でサイクルを選択し、「読み込み」を押すと電力トレースが表示されます。", - "pg_chart_caption": "{param} の値ごとの検出/マッチ率", - "pg_match_rate": "{total} サイクルで {pct}% のマッチ率", - "pg_restart_note": "シミュレーションツールを有効にするには Home Assistant を再起動してください。", - "pg_sim_progress": "{done} / {total} サイクル", - "pg_starting": "開始中…", - "pg_stress_synthetic": "待機シミュレーションはここから開始", - "pg_sweep_intro": "もし {param} が違っていたら? 最も多くのサイクルが正しくマッチする設定を見つけるため、直近 {cycles} サイクルにわたって {steps} 個の値をテストします。", - "pg_sweep_step": "ステップ {done} / {total}", - "pg_undetected": "{n} 件のサイクル{s}が未検出", - "pg_verdict_bad": "要注意: 多くのサイクルが検出されずに終わっています。", - "pg_verdict_good": "よく調整されています: ほとんどのサイクルが正しく識別・マッチされています。", - "pg_verdict_ok": "許容範囲: 一部のサイクルを見逃しています。開始しきい値を下げてみてください。", - "phase_catalog_intro": "サイクルの名前付きセグメント (前洗浄、加熱、脱水など)。コントロール パネルからプロファイルにそれらを割り当てます。", - "phase_ranges_intro": "位相範囲 (サイクル開始からの分) が平均曲線に重ねられます。値を編​​集してライブでプレビューします。", - "playground_intro": "過去のサイクルを異なる設定で再生し、2 つの構成を並べて比較し、サイクルがプロフィールにどう整合するかを確認できる安全なサンドボックスです。明示的に適用するまで、ここでの操作が実データを変更することはありません。", - "playground_needs_restart": "プレイグラウンドツールを有効にするには Home Assistant を再起動してください。", - "preferences_admin": "設定、パネル、アクセス制御", - "preferences_adv": "設定", - "prefs_personal": "これらはホーム アシスタント アカウントにのみ適用されます。", - "process_history_hint": "保存されているすべてのサイクルに対してマッチングを再実行し、チューニング提案を更新し、MLモデルを再訓練し(有効な場合)、サイクルの健全性を再計算します。一括レビュー後に実行してください。", - "profile_deleted": "プロフィールを削除しました", - "profile_poor_health_detail": "このプロファイルに割り当てられたサイクルには、形状が一貫していないか、信頼性が低いです。エンベロープを再構築するか、ラベル付きサイクルを確認することを検討してください。", - "profiles_intro": "プロファイルをクリックすると、統計、フェーズ、クリーンアップが表示されます。ほぼ同一のプログラム (同じ形状/持続時間、異なる温度またはスピン) をグループ化して、それらの間でマッチングを確実に選択します。", - "rbac_hint": "オフの場合、すべてのホーム アシスタント ユーザーはフル アクセス権を持ちます (デフォルト)。管理者は常に完全なアクセス権を持ち、全員を管理できます。", - "recent_logs": "最近の ha_washdata レコード", - "recording_in_progress": "録音中です", - "reminders_intro": "最後のサービスからこのサイクル数が経過した後にパネルにリマインダーを表示します。空欄または 0 でリマインダーをオフにします。", - "restart_gap_footer": "グラフ上でハイライト表示されます。これらの区間では電力データが欠損しています。マッチングには実際の計測値のみを使用しました。", - "restart_gap_header": "{n} HA 再起動ギャップ(このサイクル中)", - "restart_gap_item": "{dur} の欠損", - "review_confirm_help": "このサイクルが正しく検出されたかどうかを確認します。レビューによってマシン上でモデルがトレーニングされます。確認するサイクルが増えるほど、マッチングと健全性のスコアが向上します。簡単な「良い/悪い」で十分です。", - "review_in_settings": "設定で確認する", - "review_notes_placeholder": "注記 (オプション)", - "review_notes_tip": "自分の参照用の自由記述メモ。マッチングやトレーニングでは使用されません。", - "review_profile_tip": "このサイクルにラベルが付けられているプログラム。自動検出されたプログラムが間違っていた場合は、ここで修正します。ラベル付けにより、将来のサイクルのマッチングが教示されます。", - "review_quality_tip": "このサイクルはなんてクリーンなんだろう。良い = このプログラムの教科書的な例。 Bad = 検出されましたが、ノイズが多いか異常です。使用できない = 誤検出 (マージ、切り捨て、または偽)。ヘルススコアと、モデルのトレーニングに許可されるサイクルを決定します。", - "review_recorded_tip": "これをプログラム用に厳選された参照サイクルとしてマークします。これは、手動で記録されたサイクルと同じ役割です。参照サイクルは常に保持され、一致するテンプレートにシードされ、クリーンアップによって削除されることはありません。 (これは「ゴールデン」/記録済みフラグです。両方とも同じものです。)", - "review_tags_tip": "このサイクルで何が問題だったかを説明するオプションのフラグ。トレーニングとクリーンアップで問題を解決できます。", - "review_to_cycles": "Cycles レビューキューを開く", - "saving_triggers_reload": "保存すると統合のリロードがトリガーされます。 HA エンティティが一時的に利用不可として表示される場合があります。", - "search_placeholder": "検索設定…", - "see_recorder": "以下のレコーダー ウィジェットを参照してください", - "setting_changed": "{date} に {old} から {new} に変更", - "settings_basic_note": "必須の設定のみ表示しています。すべての一覧は「高度な」に切り替えてください。", - "shape_drift_advisory": "⚠ 形状がずれています", - "shape_drift_detail": "このプロファイルの電力パターンが時間とともに変化しました – 家電の劣化またはメンテナンスが必要な可能性があります(例:スケール除去、フィルター清掃)。", - "show_all_settings": "すべての設定を表示", - "showing_suggestions": "{count} 設定を候補とともに表示しています。", - "split_intro": "グラフをクリックして分割ポイントを追加または削除するか、アイドル ギャップを自動検出します。結果として得られる各セグメントは、独自のプロファイルを取得できます。", - "storage_diagnostics": "ストレージ統計、メンテナンス、エクスポート/インポート", - "sug_staged": "{key} = {val} を設定しました。保存して適用してください。", - "toast_auto_detect_enabled": "自動検出が有効になりました", - "toast_auto_label_complete": "自動ラベル付けが完了しました", - "toast_auto_label_failed": "自動ラベル付けに失敗しました: {error}", - "toast_automation_failed": "オートメーションを作成できませんでした: {error}", - "toast_automation_migrated": "アクションをオートメーションに移行しました。エディタを開いています", - "toast_convert_failed": "変換に失敗しました: {error}", - "toast_create_failed": "作成に失敗しました: {error}", - "toast_delete_failed": "削除に失敗しました: {error}", - "toast_error": "エラー: {error}", - "toast_failed": "失敗しました: {error}", - "toast_force_stop_failed": "強制停止に失敗しました: {error}", - "toast_name_required": "名前が必要です", - "toast_no_automation": "ここではオートメーションを作成できません", - "toast_profile_name_required": "プロファイル名が必要です", - "toast_program_set": "プログラムを設定しました: {program}", - "toast_rebuild_failed": "再構築に失敗しました: {error}", - "toast_resume_failed": "再開に失敗しました: {error}", - "toast_revert_failed": "元に戻すことに失敗しました: {error}", - "toast_reverted": "{key}を元に戻しました", - "toast_save_failed": "保存に失敗しました: {error}", - "trend_duration_longer": "期間は長くなる傾向にあります ({pct}%/サイクル) - 最近の平均 {avg}", - "trend_duration_shorter": "期間は短くなる傾向にあります ({pct}%/サイクル) - 最近の平均 {avg}", - "trend_energy_down": "エネルギーは減少傾向にあります ({pct}%/サイクル)", - "trend_energy_up": "エネルギーは増加傾向にあります ({pct}%/サイクル) - 最近の平均 {avg}", - "trim_intro": "赤いハンドルをドラッグするか、値を入力します。窓の外側のものはすべて削除されます。", - "tuning_suggestions_available": "{count} 観察されたサイクルから得られる調整提案。これらは関連するフィールドの横に表示されます。", - "unsure_detected_prefix": "WashData が検出したかどうかは不明", - "updated": "更新", - "warmup_badge": "学習中 ({done}/{needed} サイクル)", - "warmup_detail": "このプロファイルは自動マッチングが開始されるまで {needed} 個のラベル付きサイクルが必要です。確認されたサイクルごとに学習が進みます。", - "wipe_history_warning": "すべてのサイクルとプロファイルを完全に削除します。元に戻すことはできません。", - "compare_overlay_tip": "学習済みプロファイルのエンベロープを重ねて、各サイクルがどのプログラムに似ているかを確認します。", - "duration_trend_up_tip": "継続時間の増加({pct}%/サイクル)", - "duration_trend_down_tip": "継続時間の減少({pct}%/サイクル)", - "energy_trend_up_tip": "エネルギーの増加({pct}%/サイクル)", - "energy_trend_down_tip": "エネルギーの減少({pct}%/サイクル)", - "performance_trending": "パフォーマンスの傾向", - "pg_select_cycle_hint": "サイクルを選択し、↺ をクリックして読み込みます", - "pg_sweep_progress": "ステップ {done} / {total}", - "pg_analysis_hint": "サイクルを選択し、↺ をクリックして分析を読み込みます。", - "diagnostics_load_failed": "診断を読み込めませんでした: {error}", - "manual_duration_ref_hint": "基準サイクルが選択されていない場合にのみ使用されます。基準サイクルは、自身の長さから持続時間を設定します。", - "toast_convert_rolled_back": "変換に失敗し、ロールバックされました(オートメーションは残っていません): {error}", - "toast_convert_orphan": "オートメーションは作成されましたが、古いアクションのクリアに失敗しました。再試行しないでください。オートメーションの重複を避けるため、古いアクションを手動で削除してください。", - "advisory_duration_trend_up": "'{name}' のサイクルが次第に長くなっています(1サイクルあたり約 +{pct}%)。機器の動作が変わった場合は、このプロファイルを再記録または再構築してください。", - "advisory_energy_trend_up": "'{name}' の消費エネルギーが次第に増えています(1サイクルあたり約 +{pct}%)。想定外であれば機器を確認することをおすすめします。", - "advisory_poor_health": "'{name}' の適合スコアが低くなっています。最近のサイクルはばらつきが大きい、または照合が弱いようです。照合と時間推定の精度を保つため、サイクルを確認するかプロファイルを再記録してください。", - "advisory_shape_drift": "'{name}' が元の電力波形から大きく変化しています。機器の動作が時間とともに変わった可能性があります(例: 石灰の付着、摩耗)。最近のサイクルでこのプロファイルを再記録することを検討してください。", - "advisory_shape_drift_corr": "'{name}' が元の電力波形から大きく変化しています(相関 {corr})。機器の動作が時間とともに変わった可能性があります(例: 石灰の付着、摩耗)。最近のサイクルでこのプロファイルを再記録することを検討してください。", - "pg_no_alerts": "この実行で問題は検出されませんでした。", - "pg_override_active": "編集した設定を現在の設定と比較して使用中", - "pg_history_intro": "直近のサイクルを実際の検出器とマッチャーで再生します。ビフォー/アフターの比較を見るには、まず「シミュレート」で検出設定を編集してください。", - "pg_history_empty": "「実行」を押してサイクルを再生します。", - "pg_history_summary": "{detected}/{total} 検出 · {correct} 正しくマッチ", - "pg_sweep_no_metric": "この目的を評価するにはデータが不足しています。", - "pg_sweep_intro2": "直近のサイクル全体で目的を最もよく満たす設定を見つけます。適用するまで何も変更されません。", - "pg_running_history": "サイクルを再生しています…", - "pg_running_sweep": "全サイクルで値を検証しています…", - "pg_row_load_hint": "このサイクルを上のグラフに読み込む", - "pg_history_intro2": "上記の設定で、最近のサイクルを実際の検出器とマッチャーで再生します。行をクリックするとそのサイクルをグラフに読み込みます。設定を変更すると、変更前後の比較が表示されます。", - "pg_simulating": "サイクルをシミュレーションしています…", - "pg_canvas_empty2": "上でサイクルを選び、「実行」を押してシミュレーションします。その後、ホバーで値を表示、スクロールでズーム、ドラッグで移動できます。", - "pg_apply_settings_confirm": "これら {n} 件の設定をこのデバイスに保存しますか? {list}", - "pg_stress_terminated_detail": "約 {idle}W の待機状態に落ち着きました -- {h}時間{m}分後に {reason} によってサイクルが終了しました。", - "pg_stress_above_threshold_detail": "待機電力 約 {idle}W が実効停止しきい値 ({stop}W) 以上です -- サイクルが一度も静音状態として認識されませんでした。修正するには stop_threshold_w を上げてください。", - "pg_stress_hit_cap_detail": "サイクルが停止せずに {h}時間{m}分 稼働しました -- 安全制限により強制停止されました。待機電力 {idle}W に対して停止しきい値 {stop}W です。", - "no_logs_match": "これらのフィルターに一致するログレコードはありません。", - "pg_analysis_hint2": "サイクルを選択して「実行」を押すと、マッチ分析が読み込まれます。", - "pg_analysis_empty2": "「実行」を押すとマッチ分析が表示されます。", - "imported_readonly": "コミュニティストアからインポートしました。参照とマッチングのために表示されます。統計には含まれず、編集できません。", - "merge_no_imports": "インポートした録音は実際のサイクルに統合できません。統合するには選択を解除してください。", - "store_enable_hint": "設定でオンライン機能を有効にすると、コミュニティの基準サイクルを閲覧・インポートできます。", - "online_intro": "他の WashData ユーザーと基準サイクルを共有・ダウンロードできます。すべてのオンライン機能はオプトインで、デフォルトではオフです。", - "store_share_intro": "この基準サイクルをアップロードすると、同じ家電を持つ他のユーザーが利用できます。公開前に審査されます。", - "online_intro_global": "他の WashData ユーザーと基準録音を閲覧・共有し、家電エントリを確認できます。1 つの接続が WashData 統合全体に適用されます。家電のブランドとモデルは「基本設定」でデバイスごとに設定します。すべてのオンライン機能はオプトインで、デフォルトではオフです。", - "online_unavailable": "このサーバーではオンライン機能を利用できません。", - "store_picker_offline": "設定(歯車アイコン)でオンライン機能を有効にすると、コミュニティカタログから選択できます。", - "pick_brand_first": "先に家電ブランドを選択してください。", - "model_not_found": "まだカタログにありません。", - "connect_to_confirm": "確認や評価を行うには、設定(歯車アイコン)で接続してください。", - "adopt_settings_hint": "このデバイスの検出・マッチングしきい値を共有されたものに上書きします。通知、エンティティ、電力料金は変更されません。", - "include_settings_hint": "このデバイスの認識・マッチングしきい値を共有します(通知、エンティティ、電力料金は除く)。引き継ぐかどうかは引継ぎ側が選択します。", - "onboard_download": "新しいデバイスですか?同じ機器を持つ他のWashDataユーザーの既成セットアップ(プログラム、リファレンスサイクル、フェーズ)を引き継ぎましょう。", - "share_consent": "これらのサイクルが中断なく正常に完了したことを確認します", - "share_device_none": "まだ共有できるサイクルがありません。サイクルタブで記録または手動選択したサイクルをリファレンスサイクル(⭐)として先にマークしてください。", - "share_guideline_naming": "各プロファイルは機器のダイヤルやディスプレイに表示されている通りに名前を付けてください(例:'Cotton 40'、'Eco 60')。", - "share_guideline_quality": "正常に完了したサイクルのみ共有してください -- サイクル途中の中断、ドア開放、電力の乱れがないものに限ります。", - "share_guideline_review": "アップロードは審査中として開始され、十分なコミュニティメンバーが確認すると公開されます。", - "share_guidelines_title": "共有前に", - "store_download_device_intro": "共有されたすべてのプログラムとそのリファレンスサイクルをデバイスに引き継ぎます。ご自身の記録済みサイクルと統計には影響しません。", - "store_share_device_intro": "選択したリファレンスサイクルとともに{brand} {model}をアップロードします。同じ機器を持つ他のユーザーがあなたのプログラムを引き継ぐことができます。エントリは公開前に審査されます。", - "share_profile_no_cycles": "リファレンスサイクルなし -- サイクルタブでサイクルを⭐としてマークしてこのプロファイルを含めてください", - "advisory_phase_inconsistent": "'{name}' は異なるプログラムや温度が混在しているようです。加熱時間がサイクルごとに大きく異なります。温度ごとなど別々のプロファイルに分割すると、マッチングと時間推定が改善されます。", - "advisory_phase_inconsistent_title": "⚠ プログラム混在の可能性", - "export_select_intro": "含める項目を正確にチェックしてください。サイクルなしでプロファイルを選択しても、認識可能なプログラムはエクスポートされます(学習した形状も一緒に移行します)。", - "import_analyze_hint": "エクスポートしたファイルを読み込む(またはそのJSONを貼り付ける)と、WashDataが解析し、変更前にインポート可能な内容を正確に表示します。", - "analyzing": "解析中…", - "device_type_mismatch_warn": "このエクスポートは異なる機器タイプのものです({src} と {local})。プログラムとサイクルは参照データとしてインポートできますが、機器固有の設定と実履歴のインポートは無効になります。", - "merge_hint": "インポートした項目は追加され、ローカルのデータは失われません。名前の衝突は以下で解決します。", - "replace_warn": "チェックした各カテゴリは消去され、ファイルの内容で置き換えられます。チェックしていないカテゴリはそのまま残ります。", - "dest_reference_hint": "インポートしたサイクルはプログラムの認識精度を向上させるだけで、使用量やエネルギーの統計には影響しません。", - "dest_real_history_hint": "インポートしたサイクルはこの機器自身の履歴として扱われ、エネルギーや使用量の統計に反映されます。1台の機器を新しい環境に移行する際に使用します。" - }, - "pg_desc": { - "completion_min_seconds": "実サイクルとみなす最短の稼働時間", - "end_repeat_count": "終了前に連続する低い測定値の回数", - "interrupted_min_seconds": "短いサイクルは中断としてフラグ付け", - "min_off_gap": "2つのサイクルを分けるのに必要な間隔", - "off_delay": "サイクル終了までの低電力の秒数", - "start_duration_threshold": "開始を確定するしきい値超えの秒数", - "start_threshold_w": "開始とみなす最小ワット数", - "stop_threshold_w": "これを下回ると停止とみなす", - "anti_wrinkle_enabled": "メインフェーズ後のタンブルパルスを新しいサイクルと解釈せず吸収する", - "anti_wrinkle_exit_power": "しわ防止を有効に保つには、パルス間の電力がこの値を下回る必要がある", - "anti_wrinkle_idle_timeout": "しわ防止が終了するまでに2つのタンブルパルスの間に許容される静止時間", - "anti_wrinkle_max_duration": "これより長いパルスはしわ防止を終了し、新しいサイクルを開始する", - "anti_wrinkle_max_power": "これを超えるパルスはしわ防止を終了し、新しいサイクルを開始する", - "dtw_bandwidth": "ステージ 3: Sakoe-Chiba ワープバンド (0 = DTW 無効; デフォルト 0.2 = サイクル長の 20%)", - "corr_weight": "ステージ 2: 曲線形状(相関)と電力レベル(MAE)のバランス; デフォルト 0.45", - "duration_weight": "ステージ 4: 運転時間の一致が最終スコアにどれだけ影響するか(デフォルト 0.22)", - "energy_weight": "ステージ 4: エネルギーの一致が最終スコアにどれだけ影響するか(デフォルト 0.22)", - "profile_match_min_duration_ratio": "ステージ 1: プロファイル所要時間に対するサイクルの最短許容比率; デフォルト 0.1 (10%)", - "profile_match_max_duration_ratio": "ステージ 1: プロファイル所要時間に対するサイクルの最長許容比率; デフォルト 1.5 (150%)", - "keep_min_score": "ステージ 2: 競合に残るための最低スコア; デフォルト 0.1 は弱い候補も許可し、後のステージが最良を選ぶ", - "dtw_blend": "ステージ 3: 0 = コアスコアのみ、1 = DTW スコアのみ、0.5 = 等割合ブレンド(デフォルト)", - "dtw_ensemble_w": "ステージ 3 (アンサンブルモード): スケール付き-L1 と微分 DTW の重み; デフォルト 0.7 はレベル考慮を優先", - "dtw_ddtw_scale": "ステージ 3: DDTW 半飽和距離; 小さいほど形状に敏感(デフォルト 30)", - "dtw_refine_top_n": "ステージ 3: DTW が再スコアリングする候補数; 正しいプロファイルが 4-5 位になる場合は 7-9 に増やす(デフォルト 5)", - "duration_scale": "ステージ 4: 運転時間の一致スコアが半分になる対数比率; 小さいほど厳格なペナルティ(デフォルト 0.175)", - "energy_scale": "ステージ 4: エネルギーの一致スコアが半分になる対数比率; 小さいほど厳格なペナルティ(デフォルト 0.25)" - }, - "phase_desc": { - "anti_crease": "メインサイクル後にドラムが断続的に回転し、衣類のシワを防止します。", - "anti_wrinkle": "メインサイクル後にドラムが断続的に回転し、衣類のシワを防止します。", - "cool_down": "サイクル終了近くで熱を伴わないタンブリング。", - "drain_and_switch": "洗濯モードから乾燥モードへの移行期間。", - "dry": "ヒーターや余熱を使用した乾燥ステージ。", - "drying": "メインの加熱タンブリング期間。", - "heat_up": "完全な乾燥が始まる前に最初のヒーターのウォームアップを行います。", - "pre_rinse": "洗剤で洗う前の最初のスプレーダウン。", - "pre_wash": "本洗浄前の最初の浸漬または前処理。", - "rinse": "浄水すすぎ段階。このフェーズは複数回繰り返される場合があります。", - "sanitize": "消毒プログラム用の高温洗浄ステージ。", - "sensor_check": "乾燥度を測定する間、低電力で短い一時停止を行います。", - "soak": "アクティブな洗浄ステージ間の低アクティビティの浸漬期間。", - "soak_dw": "重い土壌の場合は浸漬期間を延長します。", - "spin": "負荷から水を除去する高速抽出。", - "spin_wd": "乾燥移行前の高速抽出。", - "wash": "ドラムの動きとオプションの加熱を伴うメインの洗濯サイクル。", - "wash_dw": "主な洗剤は加熱しながら洗浄します。" - }, - "placeholder": { - "add": "追加…", - "group_name": "例:綿 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "通知サービスを追加…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "人を追加…", - "phase_name": "例:予洗い", - "profile_name": "例:綿 40°C", - "maintenance_notes": "例: フィルター交換、ドアパッキンの清掃", - "store_brand": "例: Bosch", - "store_model": "例: WAT28401" - }, - "pref": { - "date_absolute": "絶対 (例: 7 月 2 日 14:32)", - "date_relative": "相対的 (例: 2 時間前)", - "lang_auto": "システムデフォルト({lang})", - "lang_en": "英語", - "use_panel_default": "(パネルデフォルト)" - }, - "quality": { - "bad": "悪い", - "good": "良い", - "unusable": "使用不可" - }, - "section": { - "anti_wrinkle": { - "intro": "しわ防止モードは、メインフェーズ後の低電力タンブルパルスを検出し、終了したサイクルに付加します。", - "label": "しわ防止" - }, - "basic": { - "intro": "コアとなる識別情報と、ほとんどの設定に必要な基本事項。", - "label": "基本" - }, - "delay": { - "intro": "遅延スタート検出は、家電製品に電源が入っているがサイクルがまだ開始されていない状態を識別します。", - "label": "遅延スタート" - }, - "detection": { - "intro": "サイクルの開始・実行・終了の検出方法。", - "label": "検出" - }, - "matching": { - "intro": "終了したサイクルを学習済みプロファイルに照合してラベル付けする方法。", - "label": "マッチング" - }, - "ml_training": { - "intro": "デバイス上の機械学習の再トレーニングスケジュールとデータ設定。", - "label": "MLトレーニング" - }, - "notifications": { - "intro": "サイクルイベントの通知タイミングと方法。", - "label": "通知" - }, - "timing": { - "intro": "バックグラウンドの実行間隔、オフライン監視、およびハウスキーピング。", - "label": "タイミングと監視" - }, - "triggers": { - "intro": "オプションの外部信号:終了トリガー、ドアセンサー、一時停止スイッチ、取り出しリマインダー。", - "label": "トリガーとドア" - }, - "phase_eta": { - "label": "残り時間", - "intro": "サイクルの長さが温度や脱水に左右される機器向けの、フェーズを考慮した残り時間。" - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "乾燥機が主加熱フェーズの後に発する短い低電力タンブル パルスを認識し、新しいサイクルとして読み取るのではなく、終了したサイクルに接続したままにします。", - "label": "しわ防止検出を有効化" - }, - "anti_wrinkle_exit_power": { - "doc": "しわ防止モードがアクティブな状態を維持するには、パルス間の電力がこれを下回る必要があります。", - "label": "終了電力しきい値" - }, - "anti_wrinkle_idle_timeout": { - "label": "最大パルス間隔", - "doc": "しわ防止モードが終了するまでに、機器が2つのタンブルパルスの間に静止していられる時間。乾燥機がパルス間に残す最長の間隔より長く設定してください。そうしないと、以降のパルスがすべて誤った開始として読み取られます。" - }, - "anti_wrinkle_max_duration": { - "doc": "これより長いパルスは、しわ防止タンブルではなく実際のサイクルとして扱われます。", - "label": "最大継続時間" - }, - "anti_wrinkle_max_power": { - "doc": "このパワーを超えるパルスは、しわ防止タンブルではなく、実際の新しいサイクルとして扱われます。タンブルパルス出力のすぐ上に設定します。", - "label": "しわ防止最大電力" - }, - "auto_label_confidence": { - "doc": "サイクル終了時の一致スコアがこれ以上の場合、プログラムには確認プロンプトなしで自動的にラベルが付けられます。自動ラベル付けの前に、より高い確実性を要求するには、この値を上げます。さらに自動化するには、値を下げます。その下の Learning Confidence と連動して機能します。", - "label": "自動ラベル信頼度" - }, - "auto_maintenance": { - "doc": "夜間のハウスキーピングを実行します。プロファイル エンベロープを再構築し、サイクルの健全性を再計算し、デバッグ トレースを整理し、最新のサイクルを保持します。", - "label": "自動メンテナンス(夜間クリーンアップ)" - }, - "completion_min_seconds": { - "doc": "これより短いサイクルはゴースト サイクル (テスト実行、靴下を追加するためにドアを開ける) として破棄されます。", - "label": "サイクル最小時間" - }, - "delay_confirm_seconds": { - "doc": "アプライアンスが実行中ではなく起動待機中として扱われる前に、電力はこの時間スタンバイ帯域に留まる必要があります。", - "label": "確認秒数" - }, - "delay_start_detect_enabled": { - "doc": "アプライアンスが電源オンで待機中 (遅延開始/スタンバイ) であるが、サイクルが開始されていないことを検出します。そのため、スタンバイ描画が実行サイクルと誤認されません。", - "label": "遅延スタート検出を有効化" - }, - "delay_timeout_hours": { - "doc": "この時間が経過したら遅延開始モードでの待機を停止し、アイドル状態に戻ります。これにより、電源が入ったままのまま起動されなかったマシンが永遠に待機することがなくなります。", - "label": "タイムアウト時間" - }, - "device_type": { - "doc": "アプライアンスクラス。 Sets sensible detection defaults (thresholds, off-delay, end handling) tuned for that appliance type; change it only if the device was originally set up as the wrong type.", - "label": "デバイスタイプ" - }, - "door_sensor_entity": { - "doc": "オプションのドアバイナリセンサー。サイクル後にアプライアンスが開かれた/アンロードされたことを検出するために使用されます。", - "label": "ドアセンサーエンティティ" - }, - "duration_tolerance": { - "doc": "残り時間の推定値の許容範囲 (学習フィードバック、一致ではない)。実際の継続時間が推定値の +/-X% 以内であれば、良好な一致としてカウントされます。", - "label": "推定許容誤差" - }, - "enable_ml_models": { - "doc": "サイクルの実行中に、モデルにライブ結果を改良させます。つまり、より安定した残り時間とエネルギー/コストの推定、および終了検出時の早期停止防止ガード (終了を遅らせることしかできず、早期に終了することはなく、制限されています)。利用可能な場合は微調整されたモデルを使用し、それ以外の場合は組み込みモデルを使用します。オフ = 従来の電源ベースのロジックのみ (依然として信頼性があります)。", - "label": "サイクル中にスマートモデルを適用" - }, - "end_energy_threshold": { - "doc": "オフディレーのカウントダウン中に、蓄積されたエネルギー (ワット x 時間) がこのしきい値と比較されます。それを超えると、カウントダウンがリセットされ、しわ防止タンブルと食器洗い機乾燥テールを短くするのではなく、サイクルに取り付けたままにします。クールダウン中にサイクルが早すぎる場合は値を上げます。検出が遅い場合は値を下げます。", - "label": "終了エネルギー" - }, - "end_repeat_count": { - "doc": "サイクルが終了するまでに必要な連続停止しきい値未満の読み取り値の数。ほとんどのプラグでは 1 で問題ありません。スマート プラグがサイクル途中で偽ゼロ サンプルを報告することがあり、サイクルが途中で終了する場合は、2 ~ 3 に上げます。", - "label": "終了繰り返し回数" - }, - "energy_price_entity": { - "doc": "現在の kWh あたりの電力料金 (動的料金など) を示すセンサー。以下の静的価格よりも優先されます。各サイクルは、終了時に有効な価格を凍結します。", - "label": "エネルギー価格エンティティ" - }, - "energy_price_static": { - "doc": "上記のライブ価格エンティティが設定されていない場合、コスト数値に使用される kWh あたりの固定価格。", - "label": "静的エネルギー価格(kWhあたり)" - }, - "energy_sensor": { - "doc": "積算エネルギーカウンター(total_increasing の kWh/Wh。例: プラグ自身の積算メーター)を任意で指定します。設定すると、各サイクルの表示エネルギーはこのカウンターの開始時から終了時までの差分から算出され、更新の遅い電力センサーを積分する際に生じる過少計上を回避できます。読み取り値が欠落している場合、単位が不明な場合、または差分が正でない場合は、積分値にフォールバックします。空欄のままにすると、電力センサーの積分を継続します。", - "label": "エネルギーメーターエンティティ" - }, - "expose_debug_entities": { - "doc": "追加の診断 HA エンティティ (一致信頼性、曖昧性、状態内部) を公開します。オフにすると、通常の使用のためにエンティティ リストがクリーンな状態に保たれます。", - "label": "デバッグエンティティを公開" - }, - "external_end_trigger": { - "doc": "状態の変化がサイクルの終了を示すバイナリ センサー (例: アプライアンスの「完了」接触またはコンパニオン統合)​​。", - "label": "外部トリガーエンティティ" - }, - "external_end_trigger_enabled": { - "doc": "内蔵の電力ベースの検出に加えて、外部バイナリ センサーでサイクルの終了を知らせます。", - "label": "外部終了トリガーを有効化" - }, - "external_end_trigger_inverted": { - "doc": "トリガー センサーが (オンではなく) オフになることをサイクル終了信号として扱います。", - "label": "外部トリガーを反転(OFFでトリガー)" - }, - "learning_confidence": { - "doc": "一致スコアがこの値と自動ラベルの信頼度の間にある場合、識別されたプログラムを確認するように求めるフィードバック通知が表示されます。このスコアを下回ると、試合は不確実すぎて表面化できません。自動ラベルの信頼度以下に保つ必要があります。", - "label": "学習信頼度" - }, - "linked_device": { - "doc": "必要に応じて、この WashData デバイスを HA デバイス レジストリ内の別のデバイス (スマート プラグなど) の下にネストします (「接続経由 ...」と表示されます)。", - "label": "デバイス下にグループ化" - }, - "min_off_gap": { - "doc": "マシンの電源がこの時間未満でオフになった場合、オン/オフ/オンのシーケンスは 1 つの連続したサイクルとして扱われます。浸しプログラム (洗濯中に数分間機械の電源がオフになる) が 2 つの別々のサイクルに分割されるのを防ぎます。連続した負荷を別々のサイクルとしてカウントしたい場合は、連続した負荷の間のギャップよりも短く設定します。デバイス タイプのデフォルトは、各アプライアンスの一般的なサイクル内の一時停止を保護します。", - "label": "最小オフギャップ" - }, - "min_power": { - "doc": "アクティブとみなされる絶対最小電力。これを下回る測定値は 0 W (スタンバイ) として扱われ、スマート プラグとスタンバイ LED のファントム負荷が除外されます。", - "label": "最小電力" - }, - "ml_training_enabled": { - "doc": "レビューしたサイクルを一晩かけて定期的に調査し、この特定のマシンに合わせてモデルを微調整します。変更は、保持されたサイクルで本当にスコアが向上した場合にのみ保持されるため、これは役立つか、同じままであり、後退することはありません。", - "label": "この機器から学習" - }, - "ml_training_hour": { - "doc": "夜間の微調整を行うローカル時間 (0 ~ 23)。 2 (02:00) などの静かな時間を選択します。", - "label": "学習時刻" - }, - "ml_training_interval_days": { - "doc": "改善点を再確認するのは、この日数に 1 回だけです。", - "label": "最大確認間隔" - }, - "ml_training_min_cycles": { - "doc": "微調整する前に、少なくともこの数のサイクルが記録されるまで待ってください。これにより、そこから学ぶことが十分になります。", - "label": "必要なサイクル数" - }, - "name": { - "doc": "HA 統合リストおよびデバイス レジストリに表示される表示名。", - "label": "デバイス名" - }, - "no_update_active_timeout": { - "doc": "実行中にこれほど長い時間電源アップデートが届かない場合は、プラグがオフラインになったとみなして強制停止し、ゾンビ サイクルを回避します。デフォルトの 600 秒では、クラウドまたはメッシュのラグが考慮されます。", - "label": "更新なしタイムアウト" - }, - "notify_before_end_minutes": { - "doc": "推定残り時間がこれを下回ると、ほぼ完了アラートを送信します。 0 は無効にします。", - "label": "終了前アラート" - }, - "notify_channel": { - "doc": "開始/ライブ メッセージの Android 通知チャネル名 (チャネルごとのサウンドとモバイル アプリの優先度を制御します)。空白はコンパニオン アプリのデフォルトを使用します。", - "label": "Androidチャンネル(開始/ライブ)" - }, - "notify_cycle_timers": { - "doc": "サイクルの特定の分での通知 (柔軟剤の追加など)。メッセージは {device}、{program}、{minutes} をサポートしています。 [自動一時停止] を有効にすると、その時点で一時停止し、[再開] ボタンでインタラクティブな通知を受け取ります。パネル、一時停止/再開サービス、または通知アクションを介して再開します。", - "label": "サイクルタイマー" - }, - "notify_finish_channel": { - "doc": "終了メッセージの Android 通知チャネル名。空白の場合は、開始/ライブ チャネルを再利用します。", - "label": "Androidチャンネル(終了)" - }, - "notify_finish_message": { - "doc": "サイクル終了時に送信される本文。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。ここでは {time_finished} と {vs_typical} が最も役立ちます。", - "label": "終了メッセージ" - }, - "notify_finish_services": { - "doc": "Notice.* サイクルが終了すると呼び出されるサービス。ターゲットごとに 1 つ追加します。終了通知を行わない場合は空のままにします。", - "label": "終了サービス" - }, - "notify_fire_events": { - "doc": "また、サイクルの開始時と終了時に ha_washdata_* イベントを発生させて、独自の自動化を構築できるようにします。", - "label": "通知用HAイベントを発火" - }, - "notify_icon": { - "doc": "通知のオプションの mdi アイコン (例: mdi:washing-machine)。プラットフォームのデフォルトの場合は空白のままにします。", - "label": "通知アイコン" - }, - "notify_live_chronometer": { - "doc": "静的な推定値の代わりに、ライブ更新カウントダウン タイマーを通知 (サポートするプラットフォーム上) に表示します。", - "label": "ライブクロノメーターを使用" - }, - "notify_live_interval_seconds": { - "doc": "サイクルの実行中にライブ進行状況通知が更新される頻度。", - "label": "ライブ更新間隔" - }, - "notify_live_overrun_percent": { - "doc": "サイクルがこのパーセンテージを超えて推定を超えて実行される場合、オーバーラン アラートが送信されます。", - "label": "ライブ超過%アラート" - }, - "notify_live_services": { - "doc": "Notice.* サービスは、サイクルの実行中にライブ進行状況の更新を要求します。ライブ進行状況通知を無効にするには、空のままにします。", - "label": "ライブ進捗サービス" - }, - "notify_only_when_home": { - "doc": "リンクされたユーザー (上記) の少なくとも 1 人が在宅している場合にのみ通知を送信します。", - "label": "在宅時のみ通知" - }, - "notify_people": { - "doc": "person.* エンティティは、誰かが在宅しているかどうかを判断するために「在宅時のみ通知」によって使用されます。", - "label": "対象ユーザー(在宅時のみ)" - }, - "notify_pre_complete_message": { - "doc": "終了前 / まもなく完了アラートの本文。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", - "label": "完了前メッセージ" - }, - "notify_reminder_message": { - "doc": "取り出し待ちリマインダーの本文。空欄で組み込みの既定値を使用します。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", - "label": "リマインダーメッセージ" - }, - "notify_start_message": { - "doc": "サイクル開始時に送信される本文。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", - "label": "開始メッセージ" - }, - "notify_start_services": { - "doc": "サイクルの開始時に呼び出される、notify.* サービス。ターゲット (電話、ダッシュボードなど) ごとに 1 つ追加します。開始通知を行わない場合は空のままにします。", - "label": "開始サービス" - }, - "notify_timeout_seconds": { - "doc": "この秒数が経過すると、通知が自動的に閉じられます (通知をサポートしているプラ​​ットフォームの場合)。 0 は手動で終了するまで保持します。", - "label": "自動消去まで" - }, - "notify_title": { - "doc": "通知のタイトル。テンプレート変数: {device}、{program}、{duration}、{energy}、{cost}、{date}、{time}、{minutes}。", - "label": "通知タイトル" - }, - "notify_unload_delay_minutes": { - "doc": "サイクルが終了してから、まだ待機中の「マシンをアンロードする」リマインダーを送信するまでの数分。リマインダーを無効にするには、0 を設定します。", - "label": "取り出し通知遅延" - }, - "off_delay": { - "doc": "電力が低下した後、サイクルの終了を宣言するまで待機する時間。このウィンドウ内で電力が再開されると、サイクルはシームレスに継続されます。これにより、洗浄段階の間で一時停止が生じます。食器洗い機には長い乾燥段階 (20 ~ 60 分間電源がオフになる) があるため、洗浄と乾燥全体を 1 サイクルとして維持するには、オフディレーをそれを超える必要があります。", - "label": "オフ遅延" - }, - "pause_cuts_power": { - "doc": "サイクルが一時停止されている場合は、以下のスイッチ エンティティもオフにします。サイクルの途中でプラグを安全に切断できる器具に限ります。", - "label": "一時停止で電力もカット(スイッチ経由)" - }, - "power_off_delay": { - "doc": "サイクル完了後、状態がオフに戻るまでに、電力が電源オフしきい値を下回ったまま維持しなければならない時間です。電源オフしきい値が 0 より大きい場合にのみ使用されます。バックグラウンドの周期でチェックされるため、実際の遅延は次の状態失効タイミングまで切り上げられます。", - "label": "電源オフ遅延" - }, - "power_off_threshold_w": { - "doc": "消費電力に基づくオフ検出(任意)。0 より大きい値に設定すると、サイクルが完了した後、電源オフ遅延の間、電力がこのレベルを下回ったままになると、機器はスイッチが切られたとみなされ、状態がオフに戻ります。無効にするには 0 のままにします(既定値)。実際にスイッチを切ったときの下限より高く、停止しきい値と、機器が完了後もオンのままの待機時消費電力より低い値に設定してください。停止しきい値を下回っていない場合は無視されます。有効にすると、オフに戻す処理で進捗リセット遅延の代わりに使用されるため、完了した機器は実際に電源が切られるまで完了/クリーンのままになります。", - "label": "電源オフしきい値" - }, - "power_sensor": { - "doc": "このアプライアンスのライブ電力をワット単位で報告するセンサー エンティティ (例: sensor.washer_power)。すべてのサイクル検出はこの信号に基づいています。", - "label": "電力センサー" - }, - "profile_duration_tolerance": { - "doc": "マッチング中に使用されるプロファイル平均継続時間の周囲の +/- バンド。 0.25 は、60 分のプロファイルが 45 ~ 75 分のサイクルに一致することを意味します。", - "label": "プロファイル時間許容誤差" - }, - "profile_match_interval": { - "doc": "実行サイクル中にプロファイルの一致を試行する頻度。デフォルトの 300 秒 (5 分) は、検出速度と CPU のバランスをとります。", - "label": "マッチ間隔" - }, - "profile_match_max_duration_ratio": { - "doc": "プロファイルに対する最大サイクル長。 1.3 は、サイクルがプロファイル期間の 130% 未満でなければ一致しないことを意味します。", - "label": "最大時間比率" - }, - "profile_match_min_duration_ratio": { - "doc": "プロファイルに対する最小サイクル長。 0.9 は、サイクルがプロファイル期間の少なくとも 90% でな​​ければ一致しないことを意味します。", - "label": "最小時間比率" - }, - "profile_match_threshold": { - "doc": "プログラム識別を受け入れるためにサイクル終了時に必要な最小類似性スコア (0 ~ 1)。誤った識別を減らすには値を上げます。マシンのプログラムが一致しない場合は、値を下げてください。デフォルトの 0.4 は控えめな開始点です。", - "label": "マッチしきい値" - }, - "profile_unmatch_threshold": { - "doc": "ライブのミッドサイクルマッチがこのスコアを下回った場合、暫定的な識別はクリアされます。類似性が一時的に下がっても表示が不一致に戻らないように、一致しきい値より少し下に保ちます。", - "label": "アンマッチしきい値" - }, - "progress_reset_delay": { - "doc": "終了後、アイドル状態にリセットする前にダッシュボードに「完了」が表示されるように、進行状況を 100% のままにしておきます。", - "label": "進捗リセット遅延" - }, - "pump_stuck_duration": { - "doc": "ポンプがスタックしている可能性があるとフラグが立てられる (スタックポンプ イベントが発生する) までに、ポンプが継続的に実行できる秒数。", - "label": "ポンプ停止継続時間" - }, - "running_dead_zone": { - "doc": "サイクルの開始後、このウィンドウ内の電力低下は無視されます。洗濯機には冷水が充填されます (加熱前に 0 W 近くに低下します)。この保護がなければ、充填段階がサイクル終了のように見えます。これはデータをスキップしません。フルパワートレースは T=0 から記録されます。提案エンジンはマシンの実際の起動パターンを測定し、自動的にサイズを決定します。", - "label": "実行デッドゾーン" - }, - "sampling_interval": { - "doc": "センサー読み取り間の予想時間 - スムージング ウィンドウのサイズを調整し、デバウンスを正しく開始するために使用されます。この値に関係なく、すべてのセンサーの更新がキャプチャされます。下流の計算のみを調整します。提案エンジンは、過去のサイクルからセンサーの実際のケイデンスを測定し、これを自動的に設定します。", - "label": "サンプリング間隔" - }, - "save_debug_traces": { - "doc": "各サイクルの全電力トレースと一致するデバッグ データを保存します。トラブルシューティングには役立ちますが、ストレージ サイズが増加します。", - "label": "デバッグトレースを保存" - }, - "smoothing_window": { - "doc": "生の電力信号がどの程度平滑化されるか。低 (2) は応答性は高くなりますが、ノイズが多くなります。高 (5) はスパイクを滑らかにしますが、ラグが追加されます。", - "label": "スムージングウィンドウ" - }, - "start_duration_threshold": { - "doc": "実際の開始を確認するには、電力が開始しきい値をこの期間上に維持する必要があり、一瞬のオン/オフの切り替えによるサイクルの開始が防止されます。", - "label": "開始継続時間" - }, - "start_energy_threshold": { - "doc": "アプライアンスが実行する前に消費しなければならないエネルギー (電力 x 時間)。短時間の高出力スパイクはエネルギーが非常に低いため無視され、誤った始動が防止されます。", - "label": "開始エネルギー" - }, - "start_threshold_w": { - "doc": "サイクルが開始されたことを確認するには、電力がこのレベルを超える必要があります。設定が低すぎると、スタンバイ電源からの誤った起動が発生します。高すぎると、起動が遅いプログラム (コールドフィル) が失われます。提案エンジンは、これをマシンの観測された最低有効電力のすぐ上に設定します。", - "label": "開始しきい値" - }, - "stop_threshold_w": { - "doc": "オフディレーのカウントダウンが開始される前に、電力はこのレベルを下回る必要があります。開始しきい値よりも低く設定します。それらの間のギャップは、ちらつきを防ぐヒステリシス帯域です。設定が高すぎると、低電力フェーズ (すすぎ保留、しわ防止) が誤って終了シーケンスをトリガーします。", - "label": "停止しきい値" - }, - "switch_entity": { - "doc": "オプションのスイッチは、一時停止時にオフになり、再開時に再びオンに切り替わります。「一時停止すると電源も切断されます」と併用します。", - "label": "スイッチエンティティ" - }, - "watchdog_interval": { - "doc": "バックグラウンド ウォッチドッグがセンサーの停止とタイムアウトの経過をチェックする頻度。デフォルトは 30 秒です。", - "label": "ウォッチドッグ間隔" - }, - "notify_milestone_message": { - "doc": "マイルストーン通知のメッセージ。テンプレート変数: {device}、{cycle_count}。", - "label": "マイルストーンメッセージ" - }, - "notify_milestones": { - "doc": "達成時に一度だけお祝い通知を送るサイクル数をカンマ区切りで指定します (例: 50, 100, 500, 1000)。空欄でマイルストーン通知を無効にします。", - "label": "サイクルマイルストーン" - }, - "notify_quiet_end_hour": { - "doc": "サイレント時間帯の終了 (0-23)。保留中の通知はこの時刻に配信されます。空欄で無効にします。", - "label": "サイレント時間の終了" - }, - "notify_quiet_start_hour": { - "doc": "サイレント時間帯の開始 (0-23)。サイレント時間中に発生する終了・リマインダー・洗濯完了の通知は保留され、時間帯の終了時に配信されます。空欄で無効にします。深夜をまたぐ時間帯にも対応 (例: 開始 22、終了 7)。", - "label": "サイレント時間の開始" - }, - "peak_rate_message": { - "doc": "開始通知に追加するピーク料金のヒント用のカスタムテキスト (任意)。テンプレート変数: {device}、{price}。空欄で組み込みの既定値を使用します。", - "label": "ピーク料金メッセージ" - }, - "peak_rate_threshold": { - "doc": "サイクル開始時に現在の kWh あたりの価格がこの値以上の場合、開始通知にピーク料金のヒントを追加します。0 または空欄でヒントを無効にします。", - "label": "ピーク料金のしきい値 (kWh あたり)" - }, - "dtw_bandwidth": { - "label": "形状マッチングの許容度", - "doc": "保存済みプログラムの形状に合わせるために、マッチャーがサイクルをどれだけ時間ワーピングできるかを決めます。値を大きくすると速度の変動をより許容しますが、大きすぎると誤ったプログラムにマッチするおそれがあります。" - }, - "corr_weight": { - "label": "形状とレベルの重み", - "doc": "マッチのスコアリング時に、曲線の形状と絶対的な電力レベルのどちらを重視するかのバランスです。値を大きくすると形状を、小さくすると電力レベルの一致を重視します。" - }, - "duration_weight": { - "label": "実行時間の重み", - "doc": "一般的な実行時間がこのサイクルと一致するプログラムを、どれだけ優先するかを決めます。" - }, - "energy_weight": { - "label": "エネルギーの重み", - "doc": "一般的な消費電力量がこのサイクルと一致するプログラムを、どれだけ優先するかを決めます。" - }, - "store_brand": { - "label": "家電ブランド", - "doc": "任意。コミュニティカタログから選択した家電ブランドです。一致する基準録音の検索と共有に使用されます。オンライン機能を使用しない場合は空欄のままにしてください。" - }, - "store_model": { - "label": "家電モデル", - "doc": "任意。ブランドを設定すると、コミュニティカタログから選択できる家電モデルです。お使いのモデルが一覧にない場合は、カタログに追加できます。" - }, - "show_contributor": { - "doc": "コミュニティの家電および基準サイクルに「by 」のクレジット表示をします。" - }, - "enable_phase_matching": { - "label": "フェーズを考慮した残り時間", - "doc": "実行中の各サイクルをフェーズ(加熱、洗い、脱水)に分割し、フェーズごとに残り時間を見積もって従来の推定値とブレンドします。サイクルの序盤ではフェーズごとの見積もりを重視し、終盤に近づくにつれて従来の推定値を重視します。これにより、お使いの機器が実際に加熱・運転する時間に合わせてカウントダウンが調整され、サイクルの前半で最も効果が表れます。オフ = 従来の推定値のみ。影響を受けるのは残り時間の表示だけで、プログラムのマッチングとサイクル検出は変わりません。" - }, - "keep_min_score": { - "label": "最低マッチスコア", - "doc": "候補がマッチング競合に残るために必要な最低類似度スコア。デフォルトの 0.1 は意図的に緩やかで、弱い候補も許可し、最良のマッチングを後のステージに委ねます。可能性の低いプロファイルを早期に除外するには値を上げ、候補プールを広げるには値を下げてください。" - }, - "dtw_blend": { - "label": "ワープブレンド", - "doc": "時間ワーピング (DTW) アライメントスコアがステージ 2 コアスコアをどれほど置き換えるか。0 = ステージ 2 スコアのみ使用、1 = DTW スコアのみ使用、0.5 (デフォルト) = 等割合ブレンド。プログラムの電力レベルが似ていても時間パターンが異なる場合、ワープアライメントへの依存度を高めるために値を上げてください。" - }, - "dtw_ensemble_w": { - "label": "ワープアンサンブル混合", - "doc": "アンサンブル DTW モード(デフォルト)において、スケール付き L1 と微分 DTW (DDTW) の重み配分。1.0 = スケール付き-L1 のみ、0 = DDTW のみ、0.7 = デフォルト。スケール付き-L1 変種は電力レベルを比較し、微分変種は電力がどう変化するかに反応します。アンサンブルは両者を組み合わせます。" - }, - "dtw_ddtw_scale": { - "label": "微分ワープスケール", - "doc": "微分 DTW スコアリングの半飽和距離。DDTW 距離がこの値と等しいとき、スコアが半分になります。小さいほど形状の差異に敏感になります。デフォルトの 30 は一般的な家電製品の電力トレースに合わせて調整されています。アンサンブルおよび ddtw DTW モードのみに影響します。" - }, - "dtw_refine_top_n": { - "label": "ワープ精製候補数", - "doc": "DTW によって再スコアリングされるステージ 2 上位候補の数。DTW は計算コストが高いため、上位 N 候補にのみ適用されます。デフォルト 5。ステージ 2 後に正しいプロファイルが 4 位または 5 位にしかならない場合は値を上げてください (7-9 程度) - DTW がそれを救えます。値を下げるとマッチングが若干速くなります。" - }, - "duration_scale": { - "label": "継続時間シャープネス", - "doc": "ステージ 4 の運転時間一致ペナルティの厳格さ。一致スコアが半分になる対数比率を指します。小さいほど厳格で、時間のズレはより大きな影響を与えます。デフォルト 0.175 は半ウェイト時に約 18% の許容誤差に相当します。運転時間の重みと組み合わせて使用してください。" - }, - "energy_scale": { - "label": "エネルギーシャープネス", - "doc": "ステージ 4 のエネルギー一致ペナルティの厳格さ。小さいほど厳格で、エネルギーのズレはより大きな影響を与えます。デフォルト 0.25 はエネルギーが負荷によって変動するため、時間の厳格さよりも意図的に緩やかに設定されています。エネルギーの重みと組み合わせて使用してください。" - } - }, - "setting_group": { - "auto_labeling": { - "label": "自動ラベル付け" - }, - "cycle_end": { - "label": "サイクル終了" - }, - "cycle_start": { - "label": "サイクル開始" - }, - "cycle_timers": { - "label": "サイクルタイマー" - }, - "data_management": { - "label": "データ管理" - }, - "debug": { - "label": "デバッグ" - }, - "dishwasher_end": { - "label": "食器洗い機の終了" - }, - "door_pause": { - "label": "ドアと一時停止" - }, - "dtw_refinement": { - "label": "DTW精度向上" - }, - "duration_gates": { - "label": "時間ゲート" - }, - "energy": { - "label": "エネルギー" - }, - "external_end_trigger": { - "label": "外部終了トリガー" - }, - "housekeeping": { - "label": "ハウスキーピング" - }, - "match_scoring": { - "label": "マッチングスコアリング" - }, - "messages": { - "label": "メッセージ" - }, - "power_off": { - "label": "電源オフ" - }, - "predictive_end": { - "label": "予測終了" - }, - "schedule": { - "label": "スケジュール" - }, - "services": { - "label": "サービス" - }, - "signal_processing": { - "label": "信号処理" - }, - "thresholds_gap": { - "label": "しきい値とギャップ" - }, - "timing": { - "label": "タイミング" - }, - "unload_reminder": { - "label": "取り出しリマインダー" - }, - "watchdog": { - "label": "ウォッチドッグ" - }, - "quiet_hours_milestones": { - "label": "サイレント時間とマイルストーン" - }, - "device_info": { - "label": "デバイス情報" - }, - "basic_configuration": { - "label": "基本設定" - } - }, - "status": { - "active": "アクティブ", - "all_statuses": "すべてのステータス", - "ambiguous": "あいまいな", - "auto_detect": "自動検出", - "clear": "クリア", - "completed": "完了", - "fine_tuning": "今微調整中…", - "force_stopped": "強制停止", - "idle": "アイドル状態", - "interrupted": "中断されました", - "ready": "処理の準備ができました", - "recording": "録音中", - "training": "トレーニング中…", - "saving": "保存中…", - "rebuilding": "再構築中…", - "analyzing": "分析中…", - "resetting": "リセット中…", - "reverting": "元に戻しています…", - "trimming": "トリム中…", - "splitting": "分割中…", - "deleting": "削除中…", - "imported": "インポート済み" - }, - "tab": { - "advanced": "高度な", - "diagnostics": "診断", - "history": "サイクル", - "ml": "機械学習トレーニング", - "pp_cleanup": "掃除", - "pp_manage": "管理", - "pp_overview": "概要", - "pp_phases": "フェーズ", - "profiles": "プロフィール", - "settings": "設定", - "status": "概要", - "subtab_phase_catalog": "フェーズカタログ", - "subtab_profiles": "プロフィール", - "maintenance": "メンテナンス", - "playground": "プレイグラウンド", - "store": "ストア" - }, - "tag": { - "early_end": "早期終了", - "late_start": "遅いスタート", - "merged": "マージされたサイクル", - "noise": "ノイズ", - "sensor_gap": "センサーギャップ", - "split": "スプリットサイクル", - "wrong_profile": "間違ったプロフィール" - }, - "toast": { - "access_saved": "アクセス制御が保存されました", - "all_wiped": "すべてのデータが消去されました", - "analysis_complete_none": "分析が完了しました: 新しい提案はありません", - "auto_label_complete": "自動ラベル付け完了", - "automation_deleted": "オートメーションが削除されました", - "correction_submitted": "修正を提出しました", - "cycle_deleted": "サイクルが削除されました", - "cycle_force_stopped": "サイクル強制停止", - "cycle_labelled": "サイクルラベル付き", - "cycle_paused": "サイクルが一時停止されました", - "cycle_resumed": "サイクルが再開されました", - "cycle_trimmed": "サイクルトリム", - "cycles_merged": "統合されたサイクル", - "envelope_rebuilt": "再構築されたエンベロープ", - "envelopes_rebuilt": "再構築された封筒", - "export_downloaded": "ダウンロードしたエクスポート", - "feedback_all_dismissed": "すべてのフィードバックが却下されました", - "feedback_confirmed": "フィードバックが確認されました", - "feedback_dismissed": "フィードバックは却下されました", - "group_deleted": "グループが削除されました", - "group_name_required": "グループ名は必​​須です", - "group_saved": "グループが保存されました", - "import_successful": "インポートは成功しました。統合のリロード", - "json_required": "JSONデータは必須です", - "legacy_removed": "従来のアクションが削除されました", - "logs_exported": "エクスポートされたログ", - "matching_reverted": "マッチングウェイトがデフォルトに戻った", - "min_2_profiles": "グループに対して少なくとも 2 つのプロファイルを選択してください", - "ml_training_no_improvement": "トレーニング完了: ベースラインは維持 (改善なし)", - "models_reverted": "オンデバイスモデルがベースラインに戻った", - "name_required": "名前は必須です", - "no_split_found": "分割できるアイドル ギャップは見つかりませんでした", - "panel_settings_saved": "パネル設定が保存されました", - "phase_name_required": "フェーズ名は必須です", - "phase_updated": "フェーズが更新されました", - "phases_saved": "保存されたフェーズ", - "preferences_saved": "設定が保存されました", - "profile_name_required": "プロファイル名は必須です", - "profile_renamed": "プロファイルの名前が変更されました", - "recording_discarded": "録音は破棄されました", - "recording_saved": "録音はプロファイルに保存されました", - "recording_started": "録音開始", - "recording_stopped": "録音停止", - "review_saved": "レビューが保存されました", - "settings_conflicts": "保存する前に強調表示されている設定の競合を解消してください。", - "settings_reverted": "設定が復元されました。統合のリロード", - "settings_saved": "設定が保存されました。統合のリロード", - "suggestions_applied": "提案が適用されました。統合のリロード", - "suggestions_dismissed": "提案は却下されました", - "apply_failed": "適用に失敗しました: {error}", - "delete_failed": "削除に失敗しました: {error}", - "load_more_failed": "さらに読み込めませんでした: {error}", - "maint_add_failed": "イベントを追加できませんでした: {error}", - "maint_added": "メンテナンスイベントを追加しました", - "maint_delete_failed": "イベントを削除できませんでした: {error}", - "maint_deleted": "メンテナンスイベントを削除しました", - "relabel_done": "{count} 件のサイクルを再ラベル付けしました", - "relabel_failed": "再ラベル付けに失敗しました: {error}", - "reminders_save_failed": "リマインダーを保存できませんでした: {error}", - "reminders_saved": "サービスリマインダーを保存しました", - "pause_no_cycle": "一時停止できるアクティブなサイクルがありません", - "resume_no_cycle": "再開できる一時停止中のサイクルがありません", - "delete_partial_failed": "一部の項目を削除できなかったため、復元されました", - "pg_run_gone": "その実行は利用できなくなりました。", - "task_cancelled": "キャンセルしました。", - "processed": "{bits} を処理しました", - "processed_cycles": "{n} 件のサイクル", - "processed_suggestions": "{n} 件の提案", - "processed_models": "{n} 件のモデル昇格", - "store_search_failed": "検索に失敗しました: {error}", - "store_connect_failed": "接続に失敗しました: {error}", - "store_connected": "コミュニティストアに接続しました", - "store_disconnected": "コミュニティストアから切断しました", - "store_error": "エラー: {error}", - "store_unavailable": "コミュニティストアは利用できません。", - "store_pick_profile": "統合先のプロファイルを選択してください", - "store_name_required": "プロファイル名を入力してください", - "store_import_failed": "インポートに失敗しました: {error}", - "store_imported": "{profile} にインポートしました", - "store_program_required": "プログラム名を入力してください", - "store_no_appliance": "先に設定で家電のブランドとモデルを設定してください。", - "store_share_failed": "共有に失敗しました: {error}", - "store_shared": "コミュニティストアに共有しました(審査待ち)", - "appliance_added": "家電を追加しました(承認待ち)", - "thanks_confirming": "確認していただきありがとうございます", - "device_approved": "コミュニティによって承認されました", - "rating_saved": "品質評価を保存しました", - "brand_added": "ブランドを追加しました(承認待ち)", - "profile_added": "プロファイルを追加しました(承認待ち)", - "saved_except_conflicts": "保存しました。残りを保存するにはハイライトされた競合を修正してください。", - "share_device_none_sel": "共有するサイクルを少なくとも1つ選択してください", - "store_device_downloaded": "{p}件のプログラム、{c}件の記録を追加しました", - "store_device_downloaded_phases": "{p}件のプログラム、{c}件の記録、{ph}件のフェーズマップを追加しました", - "store_device_downloaded_settings": "{p}件のプログラム、{c}件の記録、{ph}件のフェーズマップ、{s}件の設定を追加しました", - "store_device_shared": "{n}件のサイクルをコミュニティストアに共有しました - 審査中。", - "store_device_shared_all_dup": "{n}件のサイクルはすべて既にコミュニティストアにありました。", - "store_device_shared_partial": "{n}件のサイクルを共有しました。{failed}件はアップロードできませんでした。", - "store_device_shared_some_dup": "{created}件のサイクルを共有しました。{dup}件は既にストアにありました。", - "store_download_failed": "ダウンロードに失敗しました: {error}", - "store_download_nothing": "ダウンロードする新しいものはありません - このセットアップは既にデバイスにあります。", - "export_selective_done": "エクスポートをダウンロードしました", - "import_selective_done": "{profiles} 件のプロファイルと {cycles} 件のサイクルをインポートしました" - }, - "suggestion": { - "both_agree": "WashDataの推奨", - "calibrated_label": "調整済み", - "observed_label": "観測値", - "impact": { - "auto_label_confidence": { - "higher": "自動ラベル付けされるサイクルが少なくなります。より多くがレビューに回されます", - "lower": "より多くのサイクルを自動ラベル付けします。一部は誤識別される可能性があります" - }, - "duration_tolerance": { - "higher": "より広い時間範囲を受け入れます。柔軟なマッチング", - "lower": "より近い時間のマッチングが必要です。厳格ですが、異常なサイクルを拒否する場合があります" - }, - "end_energy_threshold": { - "higher": "相当なエネルギーを使用したサイクルのみを終了します", - "lower": "短いまたは低エネルギーのサイクルも終了します" - }, - "end_repeat_count": { - "higher": "終了信号をより多く繰り返す必要があります。より堅牢ですが、わずかに遅くなります", - "lower": "より少ない繰り返しで終了します。検出が速くなりますが、誤終了のリスクが高まります" - }, - "learning_confidence": { - "higher": "非常に確信度の高いマッチングのみから学習します。遅くなりますが、より信頼性が高くなります", - "lower": "より多くのサイクルから学習します。モデルにノイズが増える可能性があります" - }, - "min_off_gap": { - "higher": "新しいサイクルが始まる前により長いアイドル時間が必要です", - "lower": "短いアイドルで新しいサイクルが開始されます。連続運転が分割される場合があります" - }, - "min_power": { - "higher": "アイドル消費電力への感度が低くなります。非常に静かなプログラムを見逃す場合があります", - "lower": "感度が高くなります。スタンバイ電力をアクティビティとして記録する場合があります" - }, - "no_update_active_timeout": { - "higher": "サイクルが停止していると判断するまでの時間が長くなります", - "lower": "停止したサイクルをより早く強制停止します" - }, - "off_delay": { - "higher": "家電の一時停止のための時間が長くなります。長い浸漬や乾燥フェーズに対応します", - "lower": "終了検出が速くなります。オン/オフが明確な家電に適しています" - }, - "profile_match_threshold": { - "higher": "高い確信度のマッチングのみをコミットします。より多くのサイクルがラベルなしのままになります", - "lower": "より多くのサイクルをマッチングします。一部が若干間違っている場合があります" - }, - "running_dead_zone": { - "higher": "アイドル中の短い電力スパイクを無視します。ノイズへの感度が低くなります", - "lower": "より短い電力バーストに反応します。短時間の一時的なアクティビティを検出します" - }, - "start_threshold_w": { - "higher": "短い電力スパイクによる誤起動を防ぎます", - "lower": "低電力プログラムを検出します。ノイズでトリガーされる場合があります" - }, - "stop_threshold_w": { - "higher": "サイクルをより速く終了します。一時停止中に閉じる場合があります", - "lower": "終了するまで長く待ちます。早期終了が少なくなります" - }, - "watchdog_interval": { - "higher": "より長い静止フェーズが許可されます。誤った強制停止が少なくなります", - "lower": "停止したサイクルをより積極的に検出します" - } - }, - "reason": { - "auto_label_confidence": "ユーザーが一度も修正しなかった {cycles} 件の自動ラベルの15パーセンタイル信頼度({p15})。", - "completion_min_seconds": "{cycles} サイクルにわたる p05 の正常サイクル時間の半分({minutes} min)。誤検出サイクルを除外します。{excl}", - "dead_zone_batch": "短めに設定({cycles} サイクルの起動時の不安定期間の中央値 = {s}s)。これにより本当の終了を速やかに検出します。", - "dead_zone_from_dip": "{s}s で検出された初期の電力低下に基づく。", - "end_energy_default": "サイクル終了時のノイズゲートに推奨される既定値。", - "end_energy_false": "{cycles} サイクルにわたる p95 の誤終了エネルギー({p95}Wh)。サイクルエネルギー中央値の 0.2%({floor}Wh)を下限とします。", - "end_energy_no_false": "{cycles} サイクルで誤終了なし。サイクルエネルギー中央値の 0.2%({floor}Wh)を下限とします。", - "end_repeat_count": "{false}/{total} 件の正常サイクル({pct}%)で、再開を伴う 60s を超える内部の一時停止がありました。{val} 回の終了確認を要求します。", - "learning_confidence": "{cycles} 件のユーザーラベル付きサイクルの p05 信頼度({p05})。これを下回る場合は確認を要求します。", - "match_interval": "観測された更新間隔に基づく(中央値={median}s)* 10。", - "max_duration_ratio": "ラベル付きサイクル時間に基づく(p95={p95})。", - "min_active": "直近のサイクルで観測された最小の稼働電力({min}W)に基づく。", - "min_duration_ratio": "プログラムをサイクルの早い段階で識別できるよう、できるだけ低く設定。信頼度と曖昧さのゲートが早すぎる確定を防ぎます。", - "min_off_gap": "観測された {gaps} 件のサイクル間の間隔に基づく(p05={p05}s)。機器の下限: {floor}s。", - "min_power": "{cycles} 件の正常サイクルにわたる p05 の最低稼働電力({p05}W)の 40%。オフゲートを実際の消費電力より低く保ちます。{excl}", - "ml_auto_label": "品質モデルが正常と判定した最低の信頼度({cycles} 件の正常サイクルの p10 = {p10})。", - "ml_end_repeat": "{false}/{total} サイクル({pct}%)で、終了検出器が 50% を超えるスコアを付けた一時停止がありました。{val} 回の終了確認を要求します。", - "ml_off_delay": "終了検出器が確認した一時停止: p95 {p95}s + 60s のバッファ。{cycles} サイクルにわたるモデル検証済みの一時停止 {pauses} 件から算出(下限 {floor}s)。", - "no_update_timeout": "観測された更新間隔に基づく(p95={p95}s)* 20(最小 60s)。", - "off_delay_cadence": "観測された更新間隔に基づく(p95={p95}s)* 5", - "off_delay_device_floor": "{device} 向けの機器固有の安全な最小値を使用({floor}s)。", - "off_delay_generic_floor": "汎用の安全な最小値を使用({floor}s)。", - "off_delay_pauses": "実際の一時停止を上回るよう設定: p95 のサイクル内一時停止 {p95}s + 60s のバッファ。{cycles} 件の正常サイクルにわたる {pauses} 件の一時停止から算出(下限 {floor}s)。", - "profile_match_threshold": "{cycles} 件の正しい自動ラベルの p10 信頼度({p10})。安全なライブ確定の下限。", - "sampling_interval": "{cycles} 件の正常サイクルにわたって観測された更新間隔の中央値({si}s)。{excl}", - "smoothing_window": "{si}s のサンプリングで約 30s 分の測定値を平滑化するよう設定({samples} サンプル)。", - "start_duration": "短めに設定(約 1 回の {si}s サンプル間隔)。単一サンプルのスパイクを無視しつつ、検出をできるだけ早く開始します。", - "thr_batch": "{cycles} サイクルにわたる p05 の最低稼働電力({p05}W)のすぐ上に設定。これにより開始をできるだけ早く捉え、停止しきい値は機器の最低稼働電力を下回ったままになります。", - "tol_per_profile": "{profiles} 件のプロファイル({cycles} サイクル)にわたるプロファイルごとの時間分散の p75。ばらつきの小さいプロファイルは不利になりません。", - "tol_pooled": "{cycles} 件の直近のラベル付きサイクルの統合時間分散に基づく(p95 偏差={dev})。", - "watchdog": "安全な範囲でできるだけ低く設定(p95 の更新間隔 {p95}s の 3 倍、最小 30s)。誤った停止なしに停滞を素早く検出します。" - }, - "exclusions": { - "summary": "{total} 件の誤検出サイクルを除外しました: {parts}。", - "reason": { - "force_stopped": "強制停止", - "interrupted": "中断", - "incomplete": "未完了", - "noise": "ノイズ", - "unlabeled": "ラベルなし", - "no_trace_short": "短すぎて検査不可", - "high_start": "高電力で開始", - "abrupt_end": "突然終了", - "mid_restart": "サイクル途中で再開", - "no_power": "電力なし", - "no_active_power": "稼働電力なし" - } - } - }, - "trend": { - "down": "下降傾向", - "up": "上昇傾向" - }, - "maint": { - "bearing_service": "ベアリングの整備", - "descale": "スケール除去", - "drum_clean": "ドラムの清掃", - "filter_clean": "フィルターの清掃", - "other": "その他" - }, - "col": { - "profile_tip": "一致したプログラム名。ラベルなしは、サイクル終了時にプロファイルが一致しなかったことを意味します。", - "status_tip": "サイクルの結果: 完了(自然終了)、中断(急激な電力低下)、強制停止(手動)、または要レビュー(フィードバック保留中)。", - "date_tip": "サイクルが開始された日時。", - "duration_tip": "開始から終了までのサイクル全体の実行時間。", - "energy_tip": "消費された総エネルギー(kWh)。電力を時間で積分して計算されます。", - "cost_tip": "このサイクルのエネルギー料金。完了時にその時点で有効な価格(エネルギー x kWh あたりの価格)で確定されます。設定で価格を指定すると入力されます。", - "confidence_tip": "プロファイルのマッチ信頼度(0~100%)。サイクルの電力曲線が識別されたプログラムとどれだけ一致したか。", - "health_tip": "ML サイクルの健康度(高いほど良好)。サイクルをクリックして検査・レビューします。", - "flags_tip": "サイクルのレビュー、異常、ソースフラグ。アイコンにカーソルを合わせると詳細が表示されます。" - }, - "stat": { - "avg": "平均", - "min": "最小 {v}", - "max": "最大 {v}", - "consistency": "一貫性 ±{v}", - "total": "合計 {v}", - "last_run": "前回の実行 {v}", - "score": "スコア {pct}%", - "duration_cv": "継続時間 CV {pct}%", - "avg_confidence": "平均信頼度 {pct}%" - }, - "pg_evd": { - "detected": "検出機能がサイクルの開始を認識しました。", - "match_commit": "照合機能が十分な信頼度でプログラムを確定しました。", - "match_changed": "サイクルの経過が進むにつれて、最有力のプログラムが変わりました。", - "match_ambiguous": "2つのプログラムのスコアが接近していたため、照合結果が不確実でした。", - "unmatched": "このサイクルに合致する保存済みプログラムはありませんでした。", - "notify_start": "開始通知が送信されます。", - "notify_pre_complete": "まもなく完了の通知が送信されます。", - "notify_finish": "完了通知が送信されます。", - "notify_milestone": "マイルストーン通知が送信されます。", - "notify_held": "サイレント時間帯のため、通知が保留されました。", - "finished": "サイクルが終了状態に達して終了しました。" - }, - "store": { - "browse": "閲覧", - "device": "デバイス", - "favorites": "お気に入り", - "search_ph": "ブランドまたはモデルで検索…", - "no_results": "一致する家電が見つかりません。別の検索をお試しください。", - "n_programs": "{n} 個のプログラム", - "n_cycles": "{n} 個のサイクル", - "no_programs": "この家電にはまだ共有されたプログラムがありません。", - "no_cycles": "このプログラムにはまだ共有された基準サイクルがありません。", - "anon": "匿名", - "uploaded_by": "{name} が共有", - "connected_as": "{name} として接続中", - "not_connected": "未接続です。自分のサイクルを共有するには GitHub アカウントを接続してください。", - "import_new": "新しいプロファイル", - "import_merge": "既存に統合", - "merge_target": "統合先プロファイル", - "description": "説明(任意)", - "contributed_by": "提供: {name}", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "まだ評価がありません", - "website": "ストアウェブサイト ↗", - "website_tip": "コミュニティストアのウェブサイトを開く" - }, - "settings": { - "gear": { - "title": "設定" - } - }, - "link": { - "manual": "マニュアル ↗", - "add_appliance": "家電を追加" - }, - "tip": { - "add_brand": "ブランドが一覧にありませんか?コミュニティカタログに追加してください", - "add_appliance": "モデルが一覧にありませんか?お使いの家電をコミュニティカタログに追加してください", - "add_profile": "コミュニティサイトでこの家電のプロファイルを追加してください" - }, - "task": { - "reprocess": { - "matching": "再処理: サイクルのマッチング", - "golden": "再処理: 基準サイクルの補完", - "suggestions": "再処理: 提案", - "ml_training": "再処理: MLトレーニング", - "health": "再処理: サイクルの健康" - }, - "pg_sweep": { - "optimize": "最適化: {param}" - }, - "pg_detail": { - "simulate": "サイクルをシミュレート" - }, - "split": { - "apply": "サイクルを分割中" - }, - "trim": { - "apply": "サイクルをトリミング中" - }, - "merge": { - "apply": "サイクルを結合中" - }, - "rebuild": { - "envelopes": "エンベロープを再構築中" - } - }, - "setup": { "hdr": { - "card": "デバイスのセットアップ", - "healthy_chip": "セットアップ完了" + "ab_comparison": "A/B 設定の比較", + "access_control": "アクセス制御", + "add_maintenance": "メンテナンスイベントの追加", + "automation_delete": "このオートメーションを削除します", + "automation_needs_review": "このサイクルは見直す必要がある", + "automation_open": "オートメーションエディターで開く", + "automation_review_this_cycle": "このサイクルを見直す", + "automations": "自動化", + "clear_debug": "デバッグトレースをクリアする", + "cycle_simulator": "サイクルシミュレーター", + "diagnostics_pref": "診断", + "display": "表示", + "dtw_inspector": "DTW インスペクター", + "export_import": "エクスポート/インポート", + "getting_started": "はじめに", + "live_power": "ライブ電力", + "logs": "ログ", + "logs_diagnostics": "診断", + "maintenance": "メンテナンスアクション", + "maintenance_log": "メンテナンス履歴", + "maintenance_reminders": "サービスリマインダー", + "manual_recording": "手動記録", + "manual_recording_tip": "WashData が電力トレースを記録する間、意図的にサイクルを実行します。家電が起動する直前に開始し、終了したら停止し、次に処理して名前付きプロファイルとして保存します。", + "ml_learned": "WashData が学んだこと", + "ml_matching_tuning": "プログラムマッチングの微調整", + "ml_settings_card": "設定", + "ml_smart_learning": "スマートラーニング", + "my_preferences": "個人設定", + "no_automations": "このデバイスを参照するオートメーションはまだありません。", + "panel_settings": "パネル設定", + "param_sweep": "パラメータースイープ", + "pg_settings_source": "設定の取得元", + "phase_catalog": "フェーズカタログ", + "playground": "プレイグラウンド", + "process_history": "履歴の処理", + "settings_history": "設定履歴", + "status": "状態", + "status_graph": "ステータスグラフ", + "storage_stats": "ストレージ統計", + "test_history": "履歴でテスト", + "toggle_sidebar": "ホームアシスタントサイドバーの切り替え", + "tools_and_data": "ツールとデータ", + "wipe_history": "履歴を消去", + "recommendations": "推奨事項({n})", + "pg_detection_params": "検出設定", + "pg_timeline": "イベントタイムライン", + "pg_outcome": "シミュレーション結果", + "pg_across_cycles": "全サイクルにわたって", + "community_store": "コミュニティストア", + "online_account": "コミュニティストアとオンライン機能" }, - "phase0": { - "washer": "WashData はすでにサイクルを検出しています。プログラム名と残り時間の推定を有効にするには、最初のサイクルを記録してください。", - "dishwasher": "WashData は監視しています。食器洗い機のサイクルは複雑です – 最初のサイクルの記録を強くお勧めします。検出されたサイクルが長すぎる場合は、プロファイルとして保存する前にサイクル編集ツールで切り詰めてください。", - "generic": "WashData は監視しています。プロファイルの構築を始めるには、検出されたサイクルを記録またはラベル付けしてください。" + "health": { + "fair": "プロファイル品質: 普通", + "good": "✓ プロファイル品質: 良", + "poor": "⚠ プロファイル品質: 低" }, - "phase1a": { - "labelled": "良いスタートです – 最初のプログラムが保存されました。より正確なデータを得るには、レコーダーウィジェットで次のサイクルを記録することをご検討ください。" + "lbl": { + "actions": "アクション", + "activity": "活動", + "administrators": "管理者", + "aria_compare_chart": "サイクル比較グラフ", + "aria_cycle_chart": "サイクル電力推移", + "aria_envelope_chart": "プロファイルの電力エンベロープグラフ", + "aria_phase_chart": "フェーズエディターグラフ", + "aria_playground_chart": "ドラッグ可能な検出しきい値付きのサイクル電力推移", + "aria_power_chart": "消費電力グラフ", + "aria_spaghetti_chart": "重ね合わせたサイクル電力推移", + "aria_sweep_chart": "パラメータースイープ結果グラフ", + "artifact_anomaly": "異常", + "artifact_high_power": "高出力", + "artifact_interruption": "中断", + "artifact_low_power": "低出力", + "auto_detect": "自動検出", + "auto_fine_tune_off": "自動微調整オフ", + "auto_fine_tune_on": "自動微調整オン({hour}:00 頃)", + "avg_cost": "平均料金", + "change": "変更", + "clock_time": "時計の時間", + "cohesion_good": "凝集度 {pct}%", + "cohesion_low": "⚠ 低凝集度 {pct}%", + "compare_profiles": "プロファイルと比較する", + "concurrency": "並列実行数", + "confidence": "信頼度", + "confidence_threshold": "信頼閾値", + "correct_duration": "正しい継続時間 (分、オプション)", + "correct_profile": "正しいプロファイル", + "correlation": "相関", + "cost": "料金", + "create_new_profile": "+ 新しいプロファイルを作成…", + "current_phase": "現在のフェーズ", + "curves": "曲線", + "cycle": "サイクル", + "cycle_date_display": "サイクル日付表示", + "cycle_health": "サイクルの健康", + "cycle_index": "サイクル番号 →", + "cycles": "サイクル", + "cycles_count": "サイクル", + "cycles_lc": "サイクル", + "dashed": "破線", + "date": "日付", + "debug_traces": "デバッグトレース", + "default": "デフォルト", + "default_access_level": "以下にリストされていないユーザーのデフォルト レベル", + "default_other": "デフォルト(他のデバイス)", + "default_tab": "パネルを開いたときのデフォルトのタブ", + "delta": "Δ", + "description": "説明", + "dtw_blend_w": "ブレンド重み", + "dtw_blended": "ブレンドスコア", + "dtw_ddtw": "DDTW スコア", + "dtw_l1": "L1 スコア", + "dtw_matched_profile": "(サイクルの一致プロファイル)", + "duration": "継続時間", + "duration_agreement": "継続時間の一致度", + "emphasis": "強調", + "enable_access_control": "ユーザーごとのアクセス制御を有効にする", + "energy": "エネルギー", + "energy_agreement": "エネルギーの一致度", + "event_timeline": "イベントタイムライン", + "event_type": "イベントの種類", + "expected": "予想", + "expected_duration": "予想される所要時間 (分)", + "file_kb": "ファイル (kB)", + "final_score": "最終スコア", + "from": "開始", + "gap_s": "ギャップ (秒)", + "group_name": "グループ名", + "head_trim": "ヘッドトリム (秒)", + "health": "健康", + "hide_tabs": "管理者以外のタブを非表示にする", + "in_use": "使用中", + "json_data": "JSONデータ", + "label": "一致したプログラム", + "last": "直近", + "last_checked": "最終確認:", + "load_from_file": "ファイルからロード", + "mae_score": "MAE スコア", + "manual_duration": "手動持続時間 (分、オプション)", + "match": "マッチ", + "members": "メンバー", + "metric": "指標", + "mode_existing_profile": "既存のプロファイルに追加", + "mode_new_profile": "新しいプロファイルの作成", + "models_fine_tuned": "({count}モデル{plural}微調整済み)", + "n_classic_suggestions": "{n} クラシック", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} 件選択中", + "n_tuning_suggestions": "{n} 件のチューニング提案", + "na": "該当なし", + "new_profile_name": "新しいプロファイル名", + "notes": "メモ", + "of": "/", + "outcome": "結果", + "panel_default_tab": "デフォルトのタブ", + "panel_language": "パネル言語", + "per_cycle_short": "サイクル", + "pg_anti_wrinkle": "しわ防止", + "pg_autofill_tip": "現在の値から範囲を自動入力({lo}–{hi})", + "pg_best_value": "見つかった最適値", + "pg_current_value": "現在の値:", + "pg_drag_hint": "グラフ上の線をドラッグ", + "pg_dtw": "DTW", + "pg_ev_ending": "終了中", + "pg_ev_running": "実行中", + "pg_group_advanced": "エッジケース", + "pg_group_detection": "検出トリガー", + "pg_group_timing": "タイミングルール", + "pg_idle": "アイドル", + "pg_last_run": "前回の実行: {date}", + "pg_match_score": "マッチスコア", + "pg_pct_of": "{total} 中 {p}%", + "pg_poor_match": "不十分なマッチ", + "pg_preset": "プレイグラウンドのプリセット", + "pg_preset_name": "新しいプリセット名", + "pg_preset_none": "プリセットを選択…", + "pg_strong_match": "強いマッチ", + "pg_tile_ambiguous": "あいまい", + "pg_tile_ambiguous_tip": "2つのプログラムがほぼ同点だったサイクル", + "pg_tile_detected": "検出", + "pg_tile_detected_tip": "電力が開始しきい値を十分な時間超えて、実行中として登録されたサイクル", + "pg_tile_matched": "マッチ", + "pg_tile_matched_tip": "既知のプログラムに正しく割り当てられたサイクル", + "pg_time_left": "残り時間", + "pg_weak_match": "弱いマッチ", + "phase_name": "名前", + "phase_timeline": "フェーズタイムライン", + "power": "電力", + "profile": "プロファイル", + "profile_index": "プロファイル番号 →", + "profile_name": "プロファイル名", + "program": "プログラム", + "program_tip": "現在のサイクルに一致するプロファイルを上書きします。自動検出では、統合が最適な一致を自動的に選択します。自動検出が誤っている場合や実行中のプログラムが分かっている場合は、特定のプログラムを固定して強制的に一致させます。", + "progress": "進捗", + "raw_socket": "生のソケット", + "read_only": "読み取り専用", + "ref_cycle": "基準サイクル (オプション)", + "refresh_interval": "リフレッシュ間隔 (秒)", + "remaining": "残り", + "reminder_every": "リマインド間隔 (サイクル)", + "remove_label": "- ラベルを削除 -", + "rename_profile": "プロファイル名の変更", + "replay_duration": "再生", + "resulting_profile": "結果として得られるプロファイル", + "save_mode": "保存モード", + "score": "スコア", + "score_breakdown": "スコアの内訳", + "seconds_from_start": "開始からの秒数", + "select_profile": "プロファイルの選択", + "setting": "設定", + "settings_a": "設定 A (現在)", + "settings_a_short": "A", + "settings_advanced": "高度な", + "settings_b": "設定 B (テスト)", + "settings_b_short": "B", + "settings_basic": "基本", + "settings_detail_level": "設定の詳細レベル", + "settings_overrides": "設定の上書き", + "show_debug": "ステータス ページにライブ マッチ デバッグ カードを表示します (信頼性、曖昧さ、上位候補)", + "show_expected": "予想される曲線オーバーレイを表示 (一致したプロファイル、オレンジ色)", + "show_raw": "ライブ電力グラフに生ソケット切替を表示", + "sparkline": "最近のサイクル継続時間の傾向", + "stage2": "ステージ 2 – コア類似度", + "stage3": "ステージ 3 – DTW", + "stage4": "ステージ 4 – 一致度", + "status": "状態", + "tail_trim": "テールトリム (秒)", + "timer_auto_pause": "自動一時停止", + "timer_min": "分", + "timer_msg_placeholder": "メッセージ (オプション、{device}/{program}/{minutes})", + "to": "終了", + "ungrouped": "グループ化されていない", + "unlabelled": "ラベルなし", + "unlabelled_paren": "(ラベルなし)", + "warp_path": "ワープパス", + "input": "入力:", + "start": "開始", + "end": "終了", + "unit_s": "(秒)", + "reviewed_on": "{date} にレビュー済み", + "unknown": "不明", + "quality": "品質", + "tags": "タグ", + "at": "@", + "pct_match_confidence": "マッチ信頼度 {pct}%", + "ha_restarted": "HA が再起動しました", + "from_start": "開始から", + "to_end": "終了まで", + "click_to_select": "クリックして選択", + "envelope": "エンベロープ", + "zoom_hint": "スクロールでズーム · ダブルクリックでリセット", + "loading_paren": "(読み込み中…)", + "time_remaining": "残り約{v}", + "no_duration": "継続時間なし", + "duration_avg": "平均約{v}分", + "name_placeholder": "(名前)", + "n_shown": "、{n} 件表示", + "cycles_title": "サイクル({n})", + "pg_detecting": "検出中", + "pg_best_marker": "ベスト:{v}", + "pg_time_left_model": "残り時間(モデル)", + "pg_time_left_model_tip": "モデルが推定する残り時間(フェーズ推定+MLブレンド)。固定のカウントダウンではありません。", + "phase": "フェーズ", + "pg_mode_simulate": "シミュレート", + "pg_mode_history": "履歴テスト", + "pg_mode_sweep": "スイープ", + "pg_ev_detected": "検出", + "pg_ev_match": "マッチ確定", + "pg_ev_match_changed": "マッチ変更", + "pg_ev_ambiguous": "あいまい", + "pg_ev_unmatched": "マッチなし", + "pg_ev_notify_start": "開始通知", + "pg_ev_notify_pre": "まもなく完了通知", + "pg_ev_notify_finish": "完了通知", + "pg_ev_notify_milestone": "マイルストーン通知", + "pg_ev_notify_held": "通知保留(サイレント時間)", + "pg_ev_finished": "完了", + "pg_ended": "終了", + "pg_proj_energy": "予測エネルギー", + "pg_alert_overrun": "長すぎ", + "pg_alert_underrun": "短すぎ", + "pg_alert_did_not_finish": "未完了", + "pg_alert_false_end": "複数サイクルに分割", + "pg_alert_unmatched": "マッチなし", + "pg_alert_ambiguous": "あいまいなマッチ", + "pg_alert_energy": "エネルギー異常", + "pg_newly_correct": "新たに正解", + "pg_regressed": "悪化", + "pg_end_timing_changed": "終了タイミング変更", + "pg_vs_current": "現在との比較", + "pg_fixed": "解消", + "pg_broke": "不具合発生", + "pg_sweep_param": "パラメーター", + "pg_objective": "目的", + "pg_steps": "ステップ数", + "pg_stress_group": "待機終了テスト", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "待機レベル (W)", + "pg_stress_idle_w_desc": "自動検出された待機電力下限を上書きします(自動の場合は空欄)。", + "pg_stress_toggle": "待機終了をテスト", + "pg_stress_toggle_desc": "記録終了後に待機電力レベルで稼働し続ける機器をシミュレートします - WashData がサイクルを停止するかどうか、およびいつ停止するかを確認します。", + "pg_sweep_2d": "2Dヒートマップ", + "pg_sweep_param_y": "2番目のパラメーター", + "pg_obj_match": "マッチ精度", + "pg_obj_endtiming": "終了タイミング精度", + "pg_obj_falseend": "誤終了率", + "pg_obj_overrun": "所要時間のずれ", + "pg_obj_ambiguity": "あいまい率", + "pg_best_combo": "最適な組み合わせ", + "pg_mode_optimize": "最適化", + "pg_group_matching": "プログラムマッチング", + "pg_zoom_hint": "ダブルクリックでズームをリセット", + "aria_playground_chart2": "インタラクティブなサイクル電力グラフ: ホバーで時刻/電力を表示、スクロールでズーム、ドラッグで移動", + "pg_alert_timeout_end": "予測ではなくタイムアウトで終了しました", + "pg_alert_indefinite": "いつまでも終了しません", + "pg_alert_stress_cap": "安全制限に達しました", + "pg_alert_stress_ok": "待機終了: サイクルが停止しました", + "pg_alert_stress_warn": "待機電力が停止しきい値を超えています", + "task_pg_history": "履歴でテスト", + "task_pg_sweep": "最適化", + "task_reprocess": "再処理", + "task_ml_training": "学習", + "eta_secs": "~{n}秒残り", + "eta_mins": "~{n}分残り", + "pg_recent_runs": "最近の実行", + "pg_load_run": "この実行を再読み込み", + "pg_match_confidence": "マッチ信頼度", + "pg_envelope_fit": "エンベロープ適合度", + "pg_envelope_fit_tip": "このプロファイルの保存された電力エンベロープ内にサイクルがどれだけ収まっているか。マッチ信頼度とは異なる視点です。", + "n_imported_note": "、{n} 件インポート済み", + "enable_online": "オンライン機能を有効化", + "store_brand": "家電ブランド", + "store_model": "家電モデル", + "anonymous": "匿名", + "rate_quality": "品質を評価", + "rate_n": "星{n}つ", + "approved_only": "承認済みのみ", + "adopt_settings": "設定も引き継ぐ", + "flags": "フラグ", + "include_phase_map": "フェーズマップを含める", + "include_settings": "検出・マッチング設定を含める", + "show_contributor": "投稿者名を表示", + "task_pg_detail": "サイクルをシミュレート", + "task_split": "サイクルを分割中", + "task_trim": "サイクルをトリミング中", + "task_merge": "サイクルを結合中", + "task_rebuild": "エンベロープを再構築中", + "cat_profiles": "プロファイル(プログラム)", + "cat_real_cycles": "サイクル(実行履歴)", + "cat_reference_cycles": "参照サイクル(インポート済み)", + "cat_custom_phases": "カスタムフェーズ", + "cat_profile_groups": "プロファイルグループ", + "cat_settings": "検出と認識の設定", + "cat_matching_config": "認識の調整", + "cat_ml_models": "MLモデル", + "cat_feedback": "フィードバックとレビューラベル", + "cat_suggestions": "提案", + "cat_maintenance_log": "メンテナンスログ", + "cat_history_logs": "履歴と変更ログ", + "cat_lifetime_stats": "累計値", + "cycles_short": "サイクル", + "import_mode": "結合方法", + "mode_merge": "マージ(自分のを保持)", + "mode_replace": "選択項目を置き換え", + "cycle_destination": "インポートしたサイクルの保存先は?", + "dest_reference": "参照(形状のみ)", + "dest_real_history": "実履歴(統計に計上)", + "conflict_resolution": "名前の衝突", + "conflict_import_copy": "コピーとしてインポート", + "conflict_keep_mine": "自分のを保持", + "conflict_overwrite": "上書き", + "font_size": "パネルのフォントサイズ" }, - "phase1b": { - "recorded": "記録が {profile_name} として保存されました。カバレッジを広げるために、他のよく使うプログラムも記録またはラベル付けしてください。" + "log": { + "all_levels": "すべてのレベル", + "all_devices": "すべてのデバイス", + "all_components": "すべてのコンポーネント", + "search_ph": "ログを検索…" }, - "phase1c": { - "verify": "コミュニティから {count} 個のプログラムがあります。WashData が正しく認識するか確認するためにサイクルを実行してください – デバイスが独自の履歴を積み重ねるにつれ、マッチングが向上します。" + "ml": { + "builtin_models": "● 組み込みモデルの使用", + "fit_fair": "普通", + "fit_good": "良い", + "fit_slight": "わずかに", + "fit_strong": "強い", + "fit_weak": "弱い", + "fit_word": "フィット", + "personalized": "● このマシンに合わせてカスタマイズ可能", + "better_than_baseline": "ベースライン推定より {pct}% 良好({metric})", + "trend_improving_tip": "このモデルのフィットは最近の再チェックで改善しました。", + "trend_declining_tip": "このモデルのフィットは最近の再チェックで低下しました。さらにサイクルをレビューすると再学習に役立つ場合があります。", + "trend_steady_tip": "このモデルのフィットは最近の再チェックでおおむね安定しています。", + "cap_blurb": { + "end": "サイクルが本当に終了したタイミングを把握する", + "live_match": "実行中のプログラムをより早く識別する", + "quality": "誤検出や不完全なサイクルを見つける", + "remaining_time": "残り時間を予測する", + "total_energy": "総消費エネルギーとコストを予測する" + }, + "cap_label": { + "end": "サイクル終了の検出", + "live_match": "プログラム照合", + "quality": "サイクル品質チェック", + "remaining_time": "残り時間の推定", + "total_energy": "エネルギー推定" + }, + "metric_auc": "検証データでの AUC {auc}", + "metric_mae": "誤差 {model} vs ベースライン {baseline}" }, - "phase2": { - "cluster": "WashData は、保存されているプログラムに一致しない {count} 件のサイクルを確認しました – それらは互いに似ています。これらのための新しいプロファイルを作成しますか?", - "unmatched": "直前のサイクルはどの保存済みプログラムにも一致しませんでした。新しいプログラムでしょうか?" + "modal": { + "auto_label": "自動ラベル付けサイクル", + "correct_feedback": "正しいフィードバック", + "create_profile": "プロファイルの作成", + "cycle": "サイクル", + "edit_group": "プロファイルグループを編集", + "edit_phase": "編集フェーズ", + "import_config": "設定のインポート", + "label_cycle": "ラベルサイクル", + "merge_cycles": "{n} サイクルを結合", + "new_group": "新しいプロファイルグループ", + "new_phase": "新しいフェーズ", + "process_history_msg": "マッチングを再実行し、提案を更新し、ML を再訓練(有効な場合)し、保存されているすべてのサイクルのサイクル状態を再計算します。これには時間がかかる場合があります。", + "process_history_ok": "処理", + "process_history_title": "履歴の処理", + "process_recording": "プロセスの記録", + "delete_maintenance_msg": "このメンテナンス記録を削除しますか? この操作は元に戻せません。", + "delete_maintenance_title": "メンテナンスイベントを削除", + "relabel_cycles": "{count} 件のサイクルを再ラベル付け", + "delete_automation_title": "オートメーションを削除", + "delete_automation_msg": "オートメーション「{name}」を Home Assistant から削除しますか?この操作は元に戻せません。", + "remove_legacy_title": "従来のアクションを削除", + "remove_legacy_msg": "従来のカスタムアクションを削除しますか?サイクルイベントでの発火が停止します。この操作はパネルから元に戻せません。", + "discard_recording_title": "録音を破棄", + "discard_recording_msg": "保存された録音を破棄しますか?この操作は元に戻せません。", + "dismiss_all_title": "すべてのフィードバックを却下", + "dismiss_all_msg": "保留中の {count} 件のフィードバックリクエストをすべて却下しますか?", + "dismiss_all_ok": "すべて却下", + "delete_phase_title": "フェーズを削除", + "delete_phase_msg": "フェーズ「{name}」を削除しますか?", + "clear_debug_title": "デバッグデータをクリア", + "clear_debug_msg": "保存されているすべてのデバッグトレースを削除しますか?", + "wipe_all_title": "すべてのデータを消去", + "wipe_all_msg": "⚠️ すべてのサイクルとプロファイルを完全に削除します。この操作は元に戻せません。", + "wipe_all_ok": "すべて消去", + "force_stop_title": "サイクルを強制停止", + "force_stop_msg": "アクティブなサイクルを今すぐ強制停止しますか?サイクルは中断として保存されます。", + "store_import": "基準サイクルをインポート", + "store_share": "コミュニティストアに共有", + "store_share_device": "このデバイスを共有", + "export_select": "エクスポート - データを選択", + "import_wizard": "インポート - データを選択" }, - "phase3": { - "suggestions": "WashData はサイクル履歴に基づいた設定の推奨事項があります – 検出精度を向上させるために確認してください。", - "groups": "いくつかのプロファイルが異なる温度の同じプログラムのように見えます。より良いマッチングのためにグループに整理してください。", - "phases": "より正確な残り時間の推定のために {profile_name} にプログラムフェーズを追加してください。" + "msg": { + "appliance_monitor": "アプライアンスモニター", + "artifact_dip_detail": "通常の電力帯の下側に約{n}秒間落ちました。", + "artifact_footer": "上のグラフで強調表示されています。これらは一時的なアーチファクト (サイクルの途中でドアが開いたなど) であり、必ずしも問題があるわけではありません。", + "artifact_header": "このサイクル中に {n} 個の異常が検出されました", + "artifact_pause_detail": "電力が約{n}秒間ほぼゼロに落ちた後、再開されました。サイクルの途中でドアが開かれたか、一時停止された可能性があります。", + "artifact_spike_detail": "通常の電力帯の上側に約{n}秒間現れました。", + "auto_label_intro": "一致信頼度がしきい値をクリアするラベルのないサイクルにプロファイルを割り当てます。", + "automations_intro": "WashData は {start} / {end} イベントを発火しエンティティを公開するため、通知やアクションは通常の Home Assistant オートメーションとして構築するのが最適です。このデバイスを使用するオートメーションは以下に表示されます。", + "cleanup_intro": "すべてのラベル付きサイクルがオーバーレイされます。外れ値にチェックを入れて削除し、プロファイルをクリーンアップします。", + "clear_debug_hint": "保存されているデバッグ データを削除して領域を解放します。", + "collecting_data": "データを収集中です。微調整を開始するにはあと {need} サイクル{plural}必要です({current}/{min})。", + "compare_overlay_profiles": "オーバーレイプロファイル (淡い)", + "compare_profiles_tip": "他のプロファイル エンベロープを上のチャートに重ねて、どれがこのサイクルに最も適合するかを確認します。", + "compare_selected_cycles": "選択されたサイクル (実線) – 表示/非表示", + "consider_new_profile": "新しいプロファイルの作成を検討してください。", + "coverage_gap": "最近のサイクルには一致するプロファイルがありません (過去 30 回の {pct}%)。", + "coverage_gap_similar_cycles": "{count} 件の類似した未ラベルサイクルが見つかりました – プロファイルを作成してマッチングを開始してください。", + "cycles_deleted": "{count} 件のサイクルを削除しました", + "enough_data": "学習に十分なデータがあります({current}/{min} サイクル)。", + "export_description": "JSONにエクスポートするプロファイル、サイクル、設定などを正確に選択するか、ファイルを解析して必要な部分だけをインポートできます。", + "feedback_cycles_pending": "レビューが必要なサイクル: {n}件{s}", + "feedback_prompt": "それが正しかったことを確認し、プログラムを修正するか、無視してください。", + "feedback_relabel_hint": "このサイクルを再ラベル付けすると、これも解決します。", + "filter_by_profile": "プロファイルでフィルター…", + "group_modal_help": "温度/スピンが異なる同じ形状のグループ プログラム (期間は異なる場合があります)。マッチングでは、グループを 1 つの候補としてスコア付けし、最も適合するメンバーを選択します。少なくとも 2 つ選択してください。オーバーレイは、それらがどれだけ似ているかを示します。", + "group_not_cohesive": "これらのプロファイルは、確実にグループ化できるほど類似していないため、外れ値を削除するかグループを分割するまで、マッチングでは個別に扱われます。", + "group_preview_hint": "2つ以上のメンバーを選択してパワーカーブをプレビュー・比較できます。", + "import_intro": "エクスポートされたファイルをロードするか、以下の JSON ペイロードを貼り付けます。", + "legacy_actions_title": "{count} 個の従来のカスタム アクションが引き続き実行中", + "live_chart_loading": "測定値が到着すると、ライブパワーチャートが表示されます。", + "loading": "読み込み中…", + "loading_curve": "荷重曲線…", + "loading_settings": "設定を読み込み中…", + "log_buffer_hint": "新しい順 · 再起動以降の最後の 500 ha_washdata レコードをバッファします · 下端をドラッグしてサイズ変更します。", + "maintenance_advisory": "持続時間/エネルギーの増加は、器具のメンテナンスが必要であることを示している可能性があります (スケール除去、フィルターの掃除など)。", + "maintenance_due": "メンテナンス時期: {items}", + "maintenance_intro": "この家電に対して行ったメンテナンスを記録すると、各作業の次回時期にリマインドされます。", + "maintenance_load_error": "メンテナンスデータを読み込めませんでした: {error}", + "maintenance_requires_access": "メンテナンスとエクスポート/インポートにはフルアクセスが必要です。", + "manual_duration_hint": "プロファイルの平均/予想サイクル長。残り時間の推定に使用されます。編集して設定します。変更しないままにすると、現在の値が維持されます。", + "matching_tuning_intro": "学習時に、WashData はプログラム マッチングによって形状と持続時間およびエネルギーをどの程度重みづけるかも調整します。", + "merge_intro": "選択したサイクルが 1 つに結合されます (時系列順、ギャップは 0 W で埋められます)。結果として得られるプロファイルを選択します。", + "ml_intro": "WashData には、すぐに使えるスマート モデルが同梱されています。", + "ml_learned_intro": "本機に合わせてチューニングされたモデル。", + "ml_loading": "ML を読み込み中…", + "ml_settings_intro": "2 つの独立したスイッチ: 1 つはサイクルの実行中にモデルを適用し、もう 1 つは WashData が時間の経過とともにモデルをマシンに合わせて微調整します。", + "name_first_program": "十分なサイクルがそろいました – 最初のプログラムに名前を付けて一致を開始しましょう。", + "near_duplicate_cluster": "ほぼ重複したプロファイル クラスターが検出されました。グループ化により、類似したもの (例: 異なる温度/スピンの同じプログラム) の間でマッチングを確実に選択できるようになります。", + "no_cycles_match": "現在のフィルターに一致するサイクルはありません。", + "no_cycles_profile": "このプロファイルにはサイクルがありません。", + "no_cycles_selected": "まずサイクルを 1 つ以上選択してください。", + "no_cycles_yet": "まだサイクルが記録されていません。", + "no_device_selected": "デバイスが選択されていません。", + "no_devices": "WashData デバイスはまだ構成されていません。", + "no_envelope": "エンベロープはまだありません - ラベル付けサイクル後に再構築します。", + "no_envelope_overlay": "オーバーレイできる封筒がありません。", + "no_fine_tuned": "まだ何も微調整されていません。WashData は組み込みモデルを使用しています。", + "no_logs": "ログレコードはまだバッファされていません。", + "no_maintenance": "メンテナンスの記録はまだありません。", + "no_match_yet": "まだ一致の試行がありません - これは実行サイクル中に設定されます。", + "no_other_users": "他のホーム アシスタント ユーザーは見つかりませんでした。", + "no_phases": "フェーズは定義されていません。", + "no_phases_assigned": "フェーズが割り当てられていません。", + "no_profiles_compare": "比較するプロファイルがありません。", + "no_profiles_overlay": "オーバーレイするプロファイルがありません。", + "no_profiles_yet": "まだプロフィールはありません。ラベル付きサイクルからサイクルを作成します。", + "no_profiles_yet_short": "まだプロフィールはありません。", + "no_settings_match": "「{q}」に一致する設定はありません", + "no_split_points": "まだ分​​割ポイントはありません。", + "no_suggestions": "積極的な提案はありません。", + "notify_services_hint": "{entity} サービス ID を使用してください(複数はカンマ区切り)。テンプレート変数:{vars}。", + "old_actions_warning": "古いアクション エディター (現在は削除されています) で構成されています。これらは引き続きサイクル イベントで起動されますが、ここでは編集できなくなりました。それらを通常のオートメーションに変換するか、削除します。", + "onboarding_progress": "{n} / 3 サイクルを観測", + "onboarding_watching": "家電をいつも通り使用してください – WashData が監視しています。3 サイクル後にプログラムの一致が始まります。", + "pending_feedback": "保留中の検出フィードバック", + "performance_trend": "パフォーマンスの傾向 ({n} サイクル)", + "pg_analysis_empty": "マッチ分析を見るにはサイクルを読み込んでください。", + "pg_apply_confirm": "最適値を適用: {label} = {value}?", + "pg_canvas_empty": "上でサイクルを選択し、「読み込み」を押すと電力トレースが表示されます。", + "pg_chart_caption": "{param} の値ごとの検出/マッチ率", + "pg_ctrl_intro": "値はこのデバイスの有効な統合設定から始まります。編集内容は、適用するまでプレイグラウンド内にとどまります。", + "pg_live_unavailable": "有効な設定を取得できないため、既定値を表示しています。", + "pg_load_live_confirm": "プレイグラウンドの編集 {n} 件を破棄して、統合の現在の設定を再読み込みしますか?", + "pg_match_rate": "{total} サイクルで {pct}% のマッチ率", + "pg_matches_live": "有効な設定と一致しています", + "pg_n_changed": "有効な設定との差分 {n} 件", + "pg_sugg_none": "すべての提案は現在の設定に一致しています", + "pg_preset_delete_confirm": "プリセット「{name}」を削除しますか?", + "pg_preset_limit": "プリセットの上限に達しました({n})", + "pg_preset_overwrite": "プリセット「{name}」を上書きしますか?", + "pg_publish_one_confirm": "{label} = {value} をこのデバイスの設定に保存しますか?", + "pg_restart_note": "シミュレーションツールを有効にするには Home Assistant を再起動してください。", + "pg_sim_progress": "{done} / {total} サイクル", + "pg_starting": "開始中…", + "pg_stress_synthetic": "待機シミュレーションはここから開始", + "pg_sweep_intro": "もし {param} が違っていたら? 最も多くのサイクルが正しくマッチする設定を見つけるため、直近 {cycles} サイクルにわたって {steps} 個の値をテストします。", + "pg_sweep_step": "ステップ {done} / {total}", + "pg_undetected": "{n} 件のサイクル{s}が未検出", + "pg_verdict_bad": "要注意: 多くのサイクルが検出されずに終わっています。", + "pg_verdict_good": "よく調整されています: ほとんどのサイクルが正しく識別・マッチされています。", + "pg_verdict_ok": "許容範囲: 一部のサイクルを見逃しています。開始しきい値を下げてみてください。", + "phase_catalog_intro": "サイクルの名前付きセグメント (前洗浄、加熱、脱水など)。コントロール パネルからプロファイルにそれらを割り当てます。", + "phase_ranges_intro": "位相範囲 (サイクル開始からの分) が平均曲線に重ねられます。値を編​​集してライブでプレビューします。", + "playground_intro": "過去のサイクルを異なる設定で再生し、2 つの構成を並べて比較し、サイクルがプロフィールにどう整合するかを確認できる安全なサンドボックスです。明示的に適用するまで、ここでの操作が実データを変更することはありません。", + "playground_needs_restart": "プレイグラウンドツールを有効にするには Home Assistant を再起動してください。", + "preferences_admin": "設定、パネル、アクセス制御", + "preferences_adv": "設定", + "prefs_personal": "これらはホーム アシスタント アカウントにのみ適用されます。", + "process_history_hint": "保存されているすべてのサイクルに対してマッチングを再実行し、チューニング提案を更新し、MLモデルを再訓練し(有効な場合)、サイクルの健全性を再計算します。一括レビュー後に実行してください。", + "profile_deleted": "プロフィールを削除しました", + "profile_poor_health_detail": "このプロファイルに割り当てられたサイクルには、形状が一貫していないか、信頼性が低いです。エンベロープを再構築するか、ラベル付きサイクルを確認することを検討してください。", + "profiles_intro": "プロファイルをクリックすると、統計、フェーズ、クリーンアップが表示されます。ほぼ同一のプログラム (同じ形状/持続時間、異なる温度またはスピン) をグループ化して、それらの間でマッチングを確実に選択します。", + "rbac_hint": "オフの場合、すべてのホーム アシスタント ユーザーはフル アクセス権を持ちます (デフォルト)。管理者は常に完全なアクセス権を持ち、全員を管理できます。", + "recent_logs": "最近の ha_washdata レコード", + "recording_in_progress": "録音中です", + "reminders_intro": "最後のサービスからこのサイクル数が経過した後にパネルにリマインダーを表示します。空欄または 0 でリマインダーをオフにします。", + "restart_gap_footer": "グラフ上でハイライト表示されます。これらの区間では電力データが欠損しています。マッチングには実際の計測値のみを使用しました。", + "restart_gap_header": "{n} HA 再起動ギャップ(このサイクル中)", + "restart_gap_item": "{dur} の欠損", + "review_confirm_help": "このサイクルが正しく検出されたかどうかを確認します。レビューによってマシン上でモデルがトレーニングされます。確認するサイクルが増えるほど、マッチングと健全性のスコアが向上します。簡単な「良い/悪い」で十分です。", + "review_in_settings": "設定で確認する", + "review_notes_placeholder": "注記 (オプション)", + "review_notes_tip": "自分の参照用の自由記述メモ。マッチングやトレーニングでは使用されません。", + "review_profile_tip": "このサイクルにラベルが付けられているプログラム。自動検出されたプログラムが間違っていた場合は、ここで修正します。ラベル付けにより、将来のサイクルのマッチングが教示されます。", + "review_quality_tip": "このサイクルはなんてクリーンなんだろう。良い = このプログラムの教科書的な例。 Bad = 検出されましたが、ノイズが多いか異常です。使用できない = 誤検出 (マージ、切り捨て、または偽)。ヘルススコアと、モデルのトレーニングに許可されるサイクルを決定します。", + "review_recorded_tip": "これをプログラム用に厳選された参照サイクルとしてマークします。これは、手動で記録されたサイクルと同じ役割です。参照サイクルは常に保持され、一致するテンプレートにシードされ、クリーンアップによって削除されることはありません。 (これは「ゴールデン」/記録済みフラグです。両方とも同じものです。)", + "review_tags_tip": "このサイクルで何が問題だったかを説明するオプションのフラグ。トレーニングとクリーンアップで問題を解決できます。", + "review_to_cycles": "Cycles レビューキューを開く", + "saving_triggers_reload": "保存すると統合のリロードがトリガーされます。 HA エンティティが一時的に利用不可として表示される場合があります。", + "search_placeholder": "検索設定…", + "see_recorder": "以下のレコーダー ウィジェットを参照してください", + "setting_changed": "{date} に {old} から {new} に変更", + "settings_basic_note": "必須の設定のみ表示しています。すべての一覧は「高度な」に切り替えてください。", + "shape_drift_advisory": "⚠ 形状がずれています", + "shape_drift_detail": "このプロファイルの電力パターンが時間とともに変化しました – 家電の劣化またはメンテナンスが必要な可能性があります(例:スケール除去、フィルター清掃)。", + "show_all_settings": "すべての設定を表示", + "showing_suggestions": "{count} 設定を候補とともに表示しています。", + "split_intro": "グラフをクリックして分割ポイントを追加または削除するか、アイドル ギャップを自動検出します。結果として得られる各セグメントは、独自のプロファイルを取得できます。", + "storage_diagnostics": "ストレージ統計、メンテナンス、エクスポート/インポート", + "sug_staged": "{key} = {val} を設定しました。保存して適用してください。", + "toast_auto_detect_enabled": "自動検出が有効になりました", + "toast_auto_label_complete": "自動ラベル付けが完了しました", + "toast_auto_label_failed": "自動ラベル付けに失敗しました: {error}", + "toast_automation_failed": "オートメーションを作成できませんでした: {error}", + "toast_automation_migrated": "アクションをオートメーションに移行しました。エディタを開いています", + "toast_convert_failed": "変換に失敗しました: {error}", + "toast_create_failed": "作成に失敗しました: {error}", + "toast_delete_failed": "削除に失敗しました: {error}", + "toast_error": "エラー: {error}", + "toast_failed": "失敗しました: {error}", + "toast_force_stop_failed": "強制停止に失敗しました: {error}", + "toast_name_required": "名前が必要です", + "toast_no_automation": "ここではオートメーションを作成できません", + "toast_profile_name_required": "プロファイル名が必要です", + "toast_program_set": "プログラムを設定しました: {program}", + "toast_rebuild_failed": "再構築に失敗しました: {error}", + "toast_resume_failed": "再開に失敗しました: {error}", + "toast_revert_failed": "元に戻すことに失敗しました: {error}", + "toast_reverted": "{key}を元に戻しました", + "toast_save_failed": "保存に失敗しました: {error}", + "trend_duration_longer": "期間は長くなる傾向にあります ({pct}%/サイクル) - 最近の平均 {avg}", + "trend_duration_shorter": "期間は短くなる傾向にあります ({pct}%/サイクル) - 最近の平均 {avg}", + "trend_energy_down": "エネルギーは減少傾向にあります ({pct}%/サイクル)", + "trend_energy_up": "エネルギーは増加傾向にあります ({pct}%/サイクル) - 最近の平均 {avg}", + "trim_destructive_confirm": "サイクルの{pct}%だけが残り、この操作は元に戻せません。続行しますか?", + "trim_intro": "赤いハンドルをドラッグするか、値を入力します。窓の外側のものはすべて削除されます。", + "tuning_suggestions_available": "{count} 観察されたサイクルから得られる調整提案。これらは関連するフィールドの横に表示されます。", + "unsure_detected_prefix": "WashData が検出したかどうかは不明", + "updated": "更新", + "warmup_badge": "学習中 ({done}/{needed} サイクル)", + "warmup_detail": "このプロファイルは自動マッチングが開始されるまで {needed} 個のラベル付きサイクルが必要です。確認されたサイクルごとに学習が進みます。", + "wipe_history_warning": "すべてのサイクルとプロファイルを完全に削除します。元に戻すことはできません。", + "compare_overlay_tip": "学習済みプロファイルのエンベロープを重ねて、各サイクルがどのプログラムに似ているかを確認します。", + "duration_trend_up_tip": "継続時間の増加({pct}%/サイクル)", + "duration_trend_down_tip": "継続時間の減少({pct}%/サイクル)", + "energy_trend_up_tip": "エネルギーの増加({pct}%/サイクル)", + "energy_trend_down_tip": "エネルギーの減少({pct}%/サイクル)", + "performance_trending": "パフォーマンスの傾向", + "pg_select_cycle_hint": "サイクルを選択し、↺ をクリックして読み込みます", + "pg_sweep_progress": "ステップ {done} / {total}", + "pg_analysis_hint": "サイクルを選択し、↺ をクリックして分析を読み込みます。", + "diagnostics_load_failed": "診断を読み込めませんでした: {error}", + "manual_duration_ref_hint": "基準サイクルが選択されていない場合にのみ使用されます。基準サイクルは、自身の長さから持続時間を設定します。", + "toast_convert_rolled_back": "変換に失敗し、ロールバックされました(オートメーションは残っていません): {error}", + "toast_convert_orphan": "オートメーションは作成されましたが、古いアクションのクリアに失敗しました。再試行しないでください。オートメーションの重複を避けるため、古いアクションを手動で削除してください。", + "advisory_duration_trend_up": "'{name}' のサイクルが次第に長くなっています(1サイクルあたり約 +{pct}%)。機器の動作が変わった場合は、このプロファイルを再記録または再構築してください。", + "advisory_energy_trend_up": "'{name}' の消費エネルギーが次第に増えています(1サイクルあたり約 +{pct}%)。想定外であれば機器を確認することをおすすめします。", + "advisory_poor_health": "'{name}' の適合スコアが低くなっています。最近のサイクルはばらつきが大きい、または照合が弱いようです。照合と時間推定の精度を保つため、サイクルを確認するかプロファイルを再記録してください。", + "advisory_shape_drift": "'{name}' が元の電力波形から大きく変化しています。機器の動作が時間とともに変わった可能性があります(例: 石灰の付着、摩耗)。最近のサイクルでこのプロファイルを再記録することを検討してください。", + "advisory_shape_drift_corr": "'{name}' が元の電力波形から大きく変化しています(相関 {corr})。機器の動作が時間とともに変わった可能性があります(例: 石灰の付着、摩耗)。最近のサイクルでこのプロファイルを再記録することを検討してください。", + "pg_no_alerts": "この実行で問題は検出されませんでした。", + "pg_override_active": "編集した設定を現在の設定と比較して使用中", + "pg_history_intro": "直近のサイクルを実際の検出器とマッチャーで再生します。ビフォー/アフターの比較を見るには、まず「シミュレート」で検出設定を編集してください。", + "pg_history_empty": "「実行」を押してサイクルを再生します。", + "pg_history_summary": "{detected}/{total} 検出 · {correct} 正しくマッチ", + "pg_sweep_no_metric": "この目的を評価するにはデータが不足しています。", + "pg_sweep_intro2": "直近のサイクル全体で目的を最もよく満たす設定を見つけます。適用するまで何も変更されません。", + "pg_running_history": "サイクルを再生しています…", + "pg_running_sweep": "全サイクルで値を検証しています…", + "pg_row_load_hint": "このサイクルを上のグラフに読み込む", + "pg_history_intro2": "上記の設定で、最近のサイクルを実際の検出器とマッチャーで再生します。行をクリックするとそのサイクルをグラフに読み込みます。設定を変更すると、変更前後の比較が表示されます。", + "pg_simulating": "サイクルをシミュレーションしています…", + "pg_canvas_empty2": "上でサイクルを選び、「実行」を押してシミュレーションします。その後、ホバーで値を表示、スクロールでズーム、ドラッグで移動できます。", + "pg_apply_settings_confirm": "これら {n} 件の設定をこのデバイスに保存しますか? {list}", + "pg_stress_terminated_detail": "約 {idle}W の待機状態に落ち着きました -- {h}時間{m}分後に {reason} によってサイクルが終了しました。", + "pg_stress_above_threshold_detail": "待機電力 約 {idle}W が実効停止しきい値 ({stop}W) 以上です -- サイクルが一度も静音状態として認識されませんでした。修正するには stop_threshold_w を上げてください。", + "pg_stress_hit_cap_detail": "サイクルが停止せずに {h}時間{m}分 稼働しました -- 安全制限により強制停止されました。待機電力 {idle}W に対して停止しきい値 {stop}W です。", + "no_logs_match": "これらのフィルターに一致するログレコードはありません。", + "pg_analysis_hint2": "サイクルを選択して「実行」を押すと、マッチ分析が読み込まれます。", + "pg_analysis_empty2": "「実行」を押すとマッチ分析が表示されます。", + "imported_readonly": "コミュニティストアからインポートしました。参照とマッチングのために表示されます。統計には含まれず、編集できません。", + "merge_no_imports": "インポートした録音は実際のサイクルに統合できません。統合するには選択を解除してください。", + "store_enable_hint": "設定でオンライン機能を有効にすると、コミュニティの基準サイクルを閲覧・インポートできます。", + "online_intro": "他の WashData ユーザーと基準サイクルを共有・ダウンロードできます。すべてのオンライン機能はオプトインで、デフォルトではオフです。", + "store_share_intro": "この基準サイクルをアップロードすると、同じ家電を持つ他のユーザーが利用できます。公開前に審査されます。", + "online_intro_global": "他の WashData ユーザーと基準録音を閲覧・共有し、家電エントリを確認できます。1 つの接続が WashData 統合全体に適用されます。家電のブランドとモデルは「基本設定」でデバイスごとに設定します。すべてのオンライン機能はオプトインで、デフォルトではオフです。", + "online_unavailable": "このサーバーではオンライン機能を利用できません。", + "store_picker_offline": "設定(歯車アイコン)でオンライン機能を有効にすると、コミュニティカタログから選択できます。", + "pick_brand_first": "先に家電ブランドを選択してください。", + "model_not_found": "まだカタログにありません。", + "connect_to_confirm": "確認や評価を行うには、設定(歯車アイコン)で接続してください。", + "adopt_settings_hint": "このデバイスの検出・マッチングしきい値を共有されたものに上書きします。通知、エンティティ、電力料金は変更されません。", + "include_settings_hint": "このデバイスの認識・マッチングしきい値を共有します(通知、エンティティ、電力料金は除く)。引き継ぐかどうかは引継ぎ側が選択します。", + "onboard_download": "新しいデバイスですか?同じ機器を持つ他のWashDataユーザーの既成セットアップ(プログラム、リファレンスサイクル、フェーズ)を引き継ぎましょう。", + "share_consent": "これらのサイクルが中断なく正常に完了したことを確認します", + "share_device_none": "まだ共有できるサイクルがありません。サイクルタブで記録または手動選択したサイクルをリファレンスサイクル(⭐)として先にマークしてください。", + "share_guideline_naming": "各プロファイルは機器のダイヤルやディスプレイに表示されている通りに名前を付けてください(例:'Cotton 40'、'Eco 60')。", + "share_guideline_quality": "正常に完了したサイクルのみ共有してください -- サイクル途中の中断、ドア開放、電力の乱れがないものに限ります。", + "share_guideline_review": "アップロードは審査中として開始され、十分なコミュニティメンバーが確認すると公開されます。", + "share_guidelines_title": "共有前に", + "store_download_device_intro": "共有されたすべてのプログラムとそのリファレンスサイクルをデバイスに引き継ぎます。ご自身の記録済みサイクルと統計には影響しません。", + "store_share_device_intro": "選択したリファレンスサイクルとともに{brand} {model}をアップロードします。同じ機器を持つ他のユーザーがあなたのプログラムを引き継ぐことができます。エントリは公開前に審査されます。", + "share_profile_no_cycles": "リファレンスサイクルなし -- サイクルタブでサイクルを⭐としてマークしてこのプロファイルを含めてください", + "advisory_phase_inconsistent": "'{name}' は異なるプログラムや温度が混在しているようです。加熱時間がサイクルごとに大きく異なります。温度ごとなど別々のプロファイルに分割すると、マッチングと時間推定が改善されます。", + "advisory_phase_inconsistent_title": "⚠ プログラム混在の可能性", + "export_select_intro": "含める項目を正確にチェックしてください。サイクルなしでプロファイルを選択しても、認識可能なプログラムはエクスポートされます(学習した形状も一緒に移行します)。", + "import_analyze_hint": "エクスポートしたファイルを読み込む(またはそのJSONを貼り付ける)と、WashDataが解析し、変更前にインポート可能な内容を正確に表示します。", + "analyzing": "解析中…", + "device_type_mismatch_warn": "このエクスポートは異なる機器タイプのものです({src} と {local})。プログラムとサイクルは参照データとしてインポートできますが、機器固有の設定と実履歴のインポートは無効になります。", + "merge_hint": "インポートした項目は追加され、ローカルのデータは失われません。名前の衝突は以下で解決します。", + "replace_warn": "チェックした各カテゴリは消去され、ファイルの内容で置き換えられます。チェックしていないカテゴリはそのまま残ります。", + "dest_reference_hint": "インポートしたサイクルはプログラムの認識精度を向上させるだけで、使用量やエネルギーの統計には影響しません。", + "dest_real_history_hint": "インポートしたサイクルはこの機器自身の履歴として扱われ、エネルギーや使用量の統計に反映されます。1台の機器を新しい環境に移行する際に使用します。", + "sug_muted": "この設定は今後提案されません", + "sug_mute_failed": "提案のミュートに失敗しました", + "sug_unmuted_all": "ミュートした提案をリセットしました", + "n_suggestions_muted": "{count} 件がミュート済み。自動チューナーはこれらを提案しません。", + "font_size_hint": "このパネル全体の文字を大きくまたは小さくします。このデバイスのあなたのアカウントに適用されます。" }, - "phase4": { - "healthy": "このデバイスは完全にセットアップされています({profile_count} 個のプロファイル)。" + "pg_desc": { + "completion_min_seconds": "実サイクルとみなす最短の稼働時間", + "end_repeat_count": "終了前に連続する低い測定値の回数", + "interrupted_min_seconds": "短いサイクルは中断としてフラグ付け", + "min_off_gap": "2つのサイクルを分けるのに必要な間隔", + "off_delay": "サイクル終了までの低電力の秒数", + "start_duration_threshold": "開始を確定するしきい値超えの秒数", + "start_threshold_w": "開始とみなす最小ワット数", + "stop_threshold_w": "これを下回ると停止とみなす", + "anti_wrinkle_enabled": "メインフェーズ後のタンブルパルスを新しいサイクルと解釈せず吸収する", + "anti_wrinkle_exit_power": "しわ防止を有効に保つには、パルス間の電力がこの値を下回る必要がある", + "anti_wrinkle_idle_timeout": "しわ防止が終了するまでに2つのタンブルパルスの間に許容される静止時間", + "anti_wrinkle_max_duration": "これより長いパルスはしわ防止を終了し、新しいサイクルを開始する", + "anti_wrinkle_max_power": "これを超えるパルスはしわ防止を終了し、新しいサイクルを開始する", + "dtw_bandwidth": "ステージ 3: Sakoe-Chiba ワープバンド (0 = DTW 無効; デフォルト 0.2 = サイクル長の 20%)", + "corr_weight": "ステージ 2: 曲線形状(相関)と電力レベル(MAE)のバランス; デフォルト 0.45", + "duration_weight": "ステージ 4: 運転時間の一致が最終スコアにどれだけ影響するか(デフォルト 0.22)", + "energy_weight": "ステージ 4: エネルギーの一致が最終スコアにどれだけ影響するか(デフォルト 0.22)", + "profile_match_min_duration_ratio": "ステージ 1: プロファイル所要時間に対するサイクルの最短許容比率; デフォルト 0.1 (10%)", + "profile_match_max_duration_ratio": "ステージ 1: プロファイル所要時間に対するサイクルの最長許容比率; デフォルト 1.5 (150%)", + "keep_min_score": "ステージ 2: 競合に残るための最低スコア; デフォルト 0.1 は弱い候補も許可し、後のステージが最良を選ぶ", + "dtw_blend": "ステージ 3: 0 = コアスコアのみ、1 = DTW スコアのみ、0.5 = 等割合ブレンド(デフォルト)", + "dtw_ensemble_w": "ステージ 3 (アンサンブルモード): スケール付き-L1 と微分 DTW の重み; デフォルト 0.7 はレベル考慮を優先", + "dtw_ddtw_scale": "ステージ 3: DDTW 半飽和距離; 小さいほど形状に敏感(デフォルト 30)", + "dtw_refine_top_n": "ステージ 3: DTW が再スコアリングする候補数; 正しいプロファイルが 4-5 位になる場合は 7-9 に増やす(デフォルト 5)", + "duration_scale": "ステージ 4: 運転時間の一致スコアが半分になる対数比率; 小さいほど厳格なペナルティ(デフォルト 0.175)", + "energy_scale": "ステージ 4: エネルギーの一致スコアが半分になる対数比率; 小さいほど厳格なペナルティ(デフォルト 0.25)", + "dishwasher_end_spike_quiet_release": "食器洗い機: 予想所要時間を過ぎた後、サイクル終了時の排水待機を解除するまでの静音秒数" }, - "cta": { - "start_recording": "記録を開始", - "label_detected_cycle": "すでに検出済みのサイクルがあります – それをラベル付けする", - "browse_cycles": "別のサイクルをラベル付けするために閲覧する", - "view_profiles": "プロファイルを表示", - "create_from_cluster": "これらのサイクルからプロファイルを作成", - "create_profile": "これのプロファイルを作成", - "review_suggestions": "提案を確認", - "organise_profiles": "プロファイルを整理", - "configure_phases": "フェーズを設定", - "skip_step": "このステップをスキップ", - "skip_forever": "今後表示しない", - "hide_guidance": "ガイダンスを非表示", - "show_guidance": "ガイダンスを表示" + "phase_desc": { + "anti_crease": "メインサイクル後にドラムが断続的に回転し、衣類のシワを防止します。", + "anti_wrinkle": "メインサイクル後にドラムが断続的に回転し、衣類のシワを防止します。", + "cool_down": "サイクル終了近くで熱を伴わないタンブリング。", + "drain_and_switch": "洗濯モードから乾燥モードへの移行期間。", + "dry": "ヒーターや余熱を使用した乾燥ステージ。", + "drying": "メインの加熱タンブリング期間。", + "heat_up": "完全な乾燥が始まる前に最初のヒーターのウォームアップを行います。", + "pre_rinse": "洗剤で洗う前の最初のスプレーダウン。", + "pre_wash": "本洗浄前の最初の浸漬または前処理。", + "rinse": "浄水すすぎ段階。このフェーズは複数回繰り返される場合があります。", + "sanitize": "消毒プログラム用の高温洗浄ステージ。", + "sensor_check": "乾燥度を測定する間、低電力で短い一時停止を行います。", + "soak": "アクティブな洗浄ステージ間の低アクティビティの浸漬期間。", + "soak_dw": "重い土壌の場合は浸漬期間を延長します。", + "spin": "負荷から水を除去する高速抽出。", + "spin_wd": "乾燥移行前の高速抽出。", + "wash": "ドラムの動きとオプションの加熱を伴うメインの洗濯サイクル。", + "wash_dw": "主な洗剤は加熱しながら洗浄します。" + }, + "placeholder": { + "add": "追加…", + "group_name": "例:綿 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "通知サービスを追加…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "人を追加…", + "phase_name": "例:予洗い", + "profile_name": "例:綿 40°C", + "maintenance_notes": "例: フィルター交換、ドアパッキンの清掃", + "store_brand": "例: Bosch", + "store_model": "例: WAT28401" + }, + "pref": { + "date_absolute": "絶対 (例: 7 月 2 日 14:32)", + "date_relative": "相対的 (例: 2 時間前)", + "lang_auto": "システムデフォルト({lang})", + "lang_en": "英語", + "use_panel_default": "(パネルデフォルト)" + }, + "quality": { + "bad": "悪い", + "good": "良い", + "unusable": "使用不可" + }, + "section": { + "anti_wrinkle": { + "intro": "しわ防止モードは、メインフェーズ後の低電力タンブルパルスを検出し、終了したサイクルに付加します。", + "label": "しわ防止" + }, + "basic": { + "intro": "コアとなる識別情報と、ほとんどの設定に必要な基本事項。", + "label": "基本" + }, + "delay": { + "intro": "遅延スタート検出は、家電製品に電源が入っているがサイクルがまだ開始されていない状態を識別します。", + "label": "遅延スタート" + }, + "detection": { + "intro": "サイクルの開始・実行・終了の検出方法。", + "label": "検出" + }, + "matching": { + "intro": "終了したサイクルを学習済みプロファイルに照合してラベル付けする方法。", + "label": "マッチング" + }, + "ml_training": { + "intro": "デバイス上の機械学習の再トレーニングスケジュールとデータ設定。", + "label": "MLトレーニング" + }, + "notifications": { + "intro": "サイクルイベントの通知タイミングと方法。", + "label": "通知" + }, + "timing": { + "intro": "バックグラウンドの実行間隔、オフライン監視、およびハウスキーピング。", + "label": "タイミングと監視" + }, + "triggers": { + "intro": "オプションの外部信号:終了トリガー、ドアセンサー、一時停止スイッチ、取り出しリマインダー。", + "label": "トリガーとドア" + }, + "phase_eta": { + "label": "残り時間", + "intro": "サイクルの長さが温度や脱水に左右される機器向けの、フェーズを考慮した残り時間。" + }, + "dishwasher": { + "label": "食器洗い機", + "intro": "食器洗い機のサイクル終了処理。食器洗い機は通常、短い最終排水の前に、ほぼ無電力の長い乾燥フェーズを経て終了します。" + } + }, + "setting": { + "anti_wrinkle_enabled": { + "doc": "乾燥機が主加熱フェーズの後に発する短い低電力タンブル パルスを認識し、新しいサイクルとして読み取るのではなく、終了したサイクルに接続したままにします。", + "label": "しわ防止検出を有効化" + }, + "anti_wrinkle_exit_power": { + "doc": "しわ防止モードがアクティブな状態を維持するには、パルス間の電力がこれを下回る必要があります。", + "label": "終了電力しきい値" + }, + "anti_wrinkle_idle_timeout": { + "label": "最大パルス間隔", + "doc": "しわ防止モードが終了するまでに、機器が2つのタンブルパルスの間に静止していられる時間。乾燥機がパルス間に残す最長の間隔より長く設定してください。そうしないと、以降のパルスがすべて誤った開始として読み取られます。" + }, + "anti_wrinkle_max_duration": { + "doc": "これより長いパルスは、しわ防止タンブルではなく実際のサイクルとして扱われます。", + "label": "最大継続時間" + }, + "anti_wrinkle_max_power": { + "doc": "このパワーを超えるパルスは、しわ防止タンブルではなく、実際の新しいサイクルとして扱われます。タンブルパルス出力のすぐ上に設定します。", + "label": "しわ防止最大電力" + }, + "auto_label_confidence": { + "doc": "サイクル終了時の一致スコアがこれ以上の場合、プログラムには確認プロンプトなしで自動的にラベルが付けられます。自動ラベル付けの前に、より高い確実性を要求するには、この値を上げます。さらに自動化するには、値を下げます。その下の Learning Confidence と連動して機能します。", + "label": "自動ラベル信頼度" + }, + "auto_maintenance": { + "doc": "夜間のハウスキーピングを実行します。プロファイル エンベロープを再構築し、サイクルの健全性を再計算し、デバッグ トレースを整理し、最新のサイクルを保持します。", + "label": "自動メンテナンス(夜間クリーンアップ)" + }, + "completion_min_seconds": { + "doc": "これより短いサイクルはゴースト サイクル (テスト実行、靴下を追加するためにドアを開ける) として破棄されます。", + "label": "サイクル最小時間" + }, + "delay_confirm_seconds": { + "doc": "アプライアンスが実行中ではなく起動待機中として扱われる前に、電力はこの時間スタンバイ帯域に留まる必要があります。", + "label": "確認秒数" + }, + "delay_start_detect_enabled": { + "doc": "アプライアンスが電源オンで待機中 (遅延開始/スタンバイ) であるが、サイクルが開始されていないことを検出します。そのため、スタンバイ描画が実行サイクルと誤認されません。", + "label": "遅延スタート検出を有効化" + }, + "delay_timeout_hours": { + "doc": "この時間が経過したら遅延開始モードでの待機を停止し、アイドル状態に戻ります。これにより、電源が入ったままのまま起動されなかったマシンが永遠に待機することがなくなります。", + "label": "タイムアウト時間" + }, + "device_type": { + "doc": "アプライアンスクラス。 Sets sensible detection defaults (thresholds, off-delay, end handling) tuned for that appliance type; change it only if the device was originally set up as the wrong type.", + "label": "デバイスタイプ" + }, + "door_sensor_entity": { + "doc": "オプションのドアバイナリセンサー。サイクル後にアプライアンスが開かれた/アンロードされたことを検出するために使用されます。", + "label": "ドアセンサーエンティティ" + }, + "duration_tolerance": { + "doc": "残り時間の推定値の許容範囲 (学習フィードバック、一致ではない)。実際の継続時間が推定値の +/-X% 以内であれば、良好な一致としてカウントされます。", + "label": "推定許容誤差" + }, + "enable_ml_models": { + "doc": "サイクルの実行中に、モデルにライブ結果を改良させます。つまり、より安定した残り時間とエネルギー/コストの推定、および終了検出時の早期停止防止ガード (終了を遅らせることしかできず、早期に終了することはなく、制限されています)。利用可能な場合は微調整されたモデルを使用し、それ以外の場合は組み込みモデルを使用します。オフ = 従来の電源ベースのロジックのみ (依然として信頼性があります)。", + "label": "サイクル中にスマートモデルを適用" + }, + "end_energy_threshold": { + "doc": "オフディレーのカウントダウン中に、蓄積されたエネルギー (ワット x 時間) がこのしきい値と比較されます。それを超えると、カウントダウンがリセットされ、しわ防止タンブルと食器洗い機乾燥テールを短くするのではなく、サイクルに取り付けたままにします。クールダウン中にサイクルが早すぎる場合は値を上げます。検出が遅い場合は値を下げます。", + "label": "終了エネルギー" + }, + "end_repeat_count": { + "doc": "サイクルが終了するまでに必要な連続停止しきい値未満の読み取り値の数。ほとんどのプラグでは 1 で問題ありません。スマート プラグがサイクル途中で偽ゼロ サンプルを報告することがあり、サイクルが途中で終了する場合は、2 ~ 3 に上げます。", + "label": "終了繰り返し回数" + }, + "energy_price_entity": { + "doc": "現在の kWh あたりの電力料金 (動的料金など) を示すセンサー。以下の静的価格よりも優先されます。各サイクルは、終了時に有効な価格を凍結します。", + "label": "エネルギー価格エンティティ" + }, + "energy_price_static": { + "doc": "上記のライブ価格エンティティが設定されていない場合、コスト数値に使用される kWh あたりの固定価格。", + "label": "静的エネルギー価格(kWhあたり)" + }, + "energy_sensor": { + "doc": "積算エネルギーカウンター(total_increasing の kWh/Wh。例: プラグ自身の積算メーター)を任意で指定します。設定すると、各サイクルの表示エネルギーはこのカウンターの開始時から終了時までの差分から算出され、更新の遅い電力センサーを積分する際に生じる過少計上を回避できます。読み取り値が欠落している場合、単位が不明な場合、または差分が正でない場合は、積分値にフォールバックします。空欄のままにすると、電力センサーの積分を継続します。", + "label": "エネルギーメーターエンティティ" + }, + "expose_debug_entities": { + "doc": "追加の診断 HA エンティティ (一致信頼性、曖昧性、状態内部) を公開します。オフにすると、通常の使用のためにエンティティ リストがクリーンな状態に保たれます。", + "label": "デバッグエンティティを公開" + }, + "external_end_trigger": { + "doc": "状態の変化がサイクルの終了を示すバイナリ センサー (例: アプライアンスの「完了」接触またはコンパニオン統合)​​。", + "label": "外部トリガーエンティティ" + }, + "external_end_trigger_enabled": { + "doc": "内蔵の電力ベースの検出に加えて、外部バイナリ センサーでサイクルの終了を知らせます。", + "label": "外部終了トリガーを有効化" + }, + "external_end_trigger_inverted": { + "doc": "トリガー センサーが (オンではなく) オフになることをサイクル終了信号として扱います。", + "label": "外部トリガーを反転(OFFでトリガー)" + }, + "learning_confidence": { + "doc": "一致スコアがこの値と自動ラベルの信頼度の間にある場合、識別されたプログラムを確認するように求めるフィードバック通知が表示されます。このスコアを下回ると、試合は不確実すぎて表面化できません。自動ラベルの信頼度以下に保つ必要があります。", + "label": "学習信頼度" + }, + "linked_device": { + "doc": "必要に応じて、この WashData デバイスを HA デバイス レジストリ内の別のデバイス (スマート プラグなど) の下にネストします (「接続経由 ...」と表示されます)。", + "label": "デバイス下にグループ化" + }, + "min_off_gap": { + "doc": "マシンの電源がこの時間未満でオフになった場合、オン/オフ/オンのシーケンスは 1 つの連続したサイクルとして扱われます。浸しプログラム (洗濯中に数分間機械の電源がオフになる) が 2 つの別々のサイクルに分割されるのを防ぎます。連続した負荷を別々のサイクルとしてカウントしたい場合は、連続した負荷の間のギャップよりも短く設定します。デバイス タイプのデフォルトは、各アプライアンスの一般的なサイクル内の一時停止を保護します。", + "label": "最小オフギャップ" + }, + "min_power": { + "doc": "アクティブとみなされる絶対最小電力。これを下回る測定値は 0 W (スタンバイ) として扱われ、スマート プラグとスタンバイ LED のファントム負荷が除外されます。", + "label": "最小電力" + }, + "ml_training_enabled": { + "doc": "レビューしたサイクルを一晩かけて定期的に調査し、この特定のマシンに合わせてモデルを微調整します。変更は、保持されたサイクルで本当にスコアが向上した場合にのみ保持されるため、これは役立つか、同じままであり、後退することはありません。", + "label": "この機器から学習" + }, + "ml_training_hour": { + "doc": "夜間の微調整を行うローカル時間 (0 ~ 23)。 2 (02:00) などの静かな時間を選択します。", + "label": "学習時刻" + }, + "ml_training_interval_days": { + "doc": "改善点を再確認するのは、この日数に 1 回だけです。", + "label": "最大確認間隔" + }, + "ml_training_min_cycles": { + "doc": "微調整する前に、少なくともこの数のサイクルが記録されるまで待ってください。これにより、そこから学ぶことが十分になります。", + "label": "必要なサイクル数" + }, + "name": { + "doc": "HA 統合リストおよびデバイス レジストリに表示される表示名。", + "label": "デバイス名" + }, + "no_update_active_timeout": { + "doc": "実行中にこれほど長い時間電源アップデートが届かない場合は、プラグがオフラインになったとみなして強制停止し、ゾンビ サイクルを回避します。デフォルトの 600 秒では、クラウドまたはメッシュのラグが考慮されます。", + "label": "更新なしタイムアウト" + }, + "notify_before_end_minutes": { + "doc": "推定残り時間がこれを下回ると、ほぼ完了アラートを送信します。 0 は無効にします。", + "label": "終了前アラート" + }, + "notify_channel": { + "doc": "開始/ライブ メッセージの Android 通知チャネル名 (チャネルごとのサウンドとモバイル アプリの優先度を制御します)。空白はコンパニオン アプリのデフォルトを使用します。", + "label": "Androidチャンネル(開始/ライブ)" + }, + "notify_cycle_timers": { + "doc": "サイクルの特定の分での通知 (柔軟剤の追加など)。メッセージは {device}、{program}、{minutes} をサポートしています。 [自動一時停止] を有効にすると、その時点で一時停止し、[再開] ボタンでインタラクティブな通知を受け取ります。パネル、一時停止/再開サービス、または通知アクションを介して再開します。", + "label": "サイクルタイマー" + }, + "notify_finish_channel": { + "doc": "終了メッセージの Android 通知チャネル名。空白の場合は、開始/ライブ チャネルを再利用します。", + "label": "Androidチャンネル(終了)" + }, + "notify_finish_message": { + "doc": "サイクル終了時に送信される本文。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。ここでは {time_finished} と {vs_typical} が最も役立ちます。", + "label": "終了メッセージ" + }, + "notify_finish_services": { + "doc": "Notice.* サイクルが終了すると呼び出されるサービス。ターゲットごとに 1 つ追加します。終了通知を行わない場合は空のままにします。", + "label": "終了サービス" + }, + "notify_fire_events": { + "doc": "また、サイクルの開始時と終了時に ha_washdata_* イベントを発生させて、独自の自動化を構築できるようにします。", + "label": "通知用HAイベントを発火" + }, + "notify_icon": { + "doc": "通知のオプションの mdi アイコン (例: mdi:washing-machine)。プラットフォームのデフォルトの場合は空白のままにします。", + "label": "通知アイコン" + }, + "notify_live_chronometer": { + "doc": "静的な推定値の代わりに、ライブ更新カウントダウン タイマーを通知 (サポートするプラットフォーム上) に表示します。", + "label": "ライブクロノメーターを使用" + }, + "notify_live_interval_seconds": { + "doc": "サイクルの実行中にライブ進行状況通知が更新される頻度。", + "label": "ライブ更新間隔" + }, + "notify_live_overrun_percent": { + "doc": "サイクルがこのパーセンテージを超えて推定を超えて実行される場合、オーバーラン アラートが送信されます。", + "label": "ライブ超過%アラート" + }, + "notify_live_services": { + "doc": "Notice.* サービスは、サイクルの実行中にライブ進行状況の更新を要求します。ライブ進行状況通知を無効にするには、空のままにします。", + "label": "ライブ進捗サービス" + }, + "notify_only_when_home": { + "doc": "リンクされたユーザー (上記) の少なくとも 1 人が在宅している場合にのみ通知を送信します。", + "label": "在宅時のみ通知" + }, + "notify_people": { + "doc": "person.* エンティティは、誰かが在宅しているかどうかを判断するために「在宅時のみ通知」によって使用されます。", + "label": "対象ユーザー(在宅時のみ)" + }, + "notify_pre_complete_message": { + "doc": "終了前 / まもなく完了アラートの本文。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", + "label": "完了前メッセージ" + }, + "notify_reminder_message": { + "doc": "取り出し待ちリマインダーの本文。空欄で組み込みの既定値を使用します。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", + "label": "リマインダーメッセージ" + }, + "notify_start_message": { + "doc": "サイクル開始時に送信される本文。テンプレート変数: {device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", + "label": "開始メッセージ" + }, + "notify_start_services": { + "doc": "サイクルの開始時に呼び出される、notify.* サービス。ターゲット (電話、ダッシュボードなど) ごとに 1 つ追加します。開始通知を行わない場合は空のままにします。", + "label": "開始サービス" + }, + "notify_timeout_seconds": { + "doc": "この秒数が経過すると、通知が自動的に閉じられます (通知をサポートしているプラ​​ットフォームの場合)。 0 は手動で終了するまで保持します。", + "label": "自動消去まで" + }, + "notify_title": { + "doc": "通知のタイトル。テンプレート変数: {device}、{program}、{duration}、{energy}、{cost}、{date}、{time}、{minutes}。", + "label": "通知タイトル" + }, + "notify_unload_delay_minutes": { + "doc": "サイクルが終了してから、まだ待機中の「マシンをアンロードする」リマインダーを送信するまでの数分。リマインダーを無効にするには、0 を設定します。", + "label": "取り出し通知遅延" + }, + "notify_unload_repeat": { + "doc": "ドアを開くか、通知の \"リマインダーを停止\" をタップするまで、\"取り出し通知遅延\" 分ごとに取り出しリマインダーを再送信し続けます。ドアセンサーエンティティが必要です(リマインダー自体が必要とします)。解除ボタンは Home Assistant コンパニオンアプリ(モバイル)の通知で機能します。", + "label": "ドアが開くまで繰り返す" + }, + "off_delay": { + "doc": "電力が低下した後、サイクルの終了を宣言するまで待機する時間。このウィンドウ内で電力が再開されると、サイクルはシームレスに継続されます。これにより、洗浄段階の間で一時停止が生じます。食器洗い機には長い乾燥段階 (20 ~ 60 分間電源がオフになる) があるため、洗浄と乾燥全体を 1 サイクルとして維持するには、オフディレーをそれを超える必要があります。", + "label": "オフ遅延" + }, + "pause_cuts_power": { + "doc": "サイクルが一時停止されている場合は、以下のスイッチ エンティティもオフにします。サイクルの途中でプラグを安全に切断できる器具に限ります。", + "label": "一時停止で電力もカット(スイッチ経由)" + }, + "power_off_delay": { + "doc": "サイクル完了後、状態がオフに戻るまでに、電力が電源オフしきい値を下回ったまま維持しなければならない時間です。電源オフしきい値が 0 より大きい場合にのみ使用されます。バックグラウンドの周期でチェックされるため、実際の遅延は次の状態失効タイミングまで切り上げられます。", + "label": "電源オフ遅延" + }, + "power_off_threshold_w": { + "doc": "消費電力に基づくオフ検出(任意)。0 より大きい値に設定すると、サイクルが完了した後、電源オフ遅延の間、電力がこのレベルを下回ったままになると、機器はスイッチが切られたとみなされ、状態がオフに戻ります。無効にするには 0 のままにします(既定値)。実際にスイッチを切ったときの下限より高く、停止しきい値と、機器が完了後もオンのままの待機時消費電力より低い値に設定してください。停止しきい値を下回っていない場合は無視されます。有効にすると、オフに戻す処理で進捗リセット遅延の代わりに使用されるため、完了した機器は実際に電源が切られるまで完了/クリーンのままになります。", + "label": "電源オフしきい値" + }, + "power_sensor": { + "doc": "このアプライアンスのライブ電力をワット単位で報告するセンサー エンティティ (例: sensor.washer_power)。すべてのサイクル検出はこの信号に基づいています。", + "label": "電力センサー" + }, + "profile_duration_tolerance": { + "doc": "マッチング中に使用されるプロファイル平均継続時間の周囲の +/- バンド。 0.25 は、60 分のプロファイルが 45 ~ 75 分のサイクルに一致することを意味します。", + "label": "プロファイル時間許容誤差" + }, + "profile_match_interval": { + "doc": "実行サイクル中にプロファイルの一致を試行する頻度。デフォルトの 300 秒 (5 分) は、検出速度と CPU のバランスをとります。", + "label": "マッチ間隔" + }, + "profile_match_max_duration_ratio": { + "doc": "プロファイルに対する最大サイクル長。 1.3 は、サイクルがプロファイル期間の 130% 未満でなければ一致しないことを意味します。", + "label": "最大時間比率" + }, + "profile_match_min_duration_ratio": { + "doc": "プロファイルに対する最小サイクル長。 0.9 は、サイクルがプロファイル期間の少なくとも 90% でな​​ければ一致しないことを意味します。", + "label": "最小時間比率" + }, + "profile_match_threshold": { + "doc": "プログラム識別を受け入れるためにサイクル終了時に必要な最小類似性スコア (0 ~ 1)。誤った識別を減らすには値を上げます。マシンのプログラムが一致しない場合は、値を下げてください。デフォルトの 0.4 は控えめな開始点です。", + "label": "マッチしきい値" + }, + "profile_unmatch_threshold": { + "doc": "ライブのミッドサイクルマッチがこのスコアを下回った場合、暫定的な識別はクリアされます。類似性が一時的に下がっても表示が不一致に戻らないように、一致しきい値より少し下に保ちます。", + "label": "アンマッチしきい値" + }, + "progress_reset_delay": { + "doc": "終了後、アイドル状態にリセットする前にダッシュボードに「完了」が表示されるように、進行状況を 100% のままにしておきます。", + "label": "進捗リセット遅延" + }, + "pump_stuck_duration": { + "doc": "ポンプがスタックしている可能性があるとフラグが立てられる (スタックポンプ イベントが発生する) までに、ポンプが継続的に実行できる秒数。", + "label": "ポンプ停止継続時間" + }, + "running_dead_zone": { + "doc": "サイクルの開始後、このウィンドウ内の電力低下は無視されます。洗濯機には冷水が充填されます (加熱前に 0 W 近くに低下します)。この保護がなければ、充填段階がサイクル終了のように見えます。これはデータをスキップしません。フルパワートレースは T=0 から記録されます。提案エンジンはマシンの実際の起動パターンを測定し、自動的にサイズを決定します。", + "label": "実行デッドゾーン" + }, + "sampling_interval": { + "doc": "センサー読み取り間の予想時間 - スムージング ウィンドウのサイズを調整し、デバウンスを正しく開始するために使用されます。この値に関係なく、すべてのセンサーの更新がキャプチャされます。下流の計算のみを調整します。提案エンジンは、過去のサイクルからセンサーの実際のケイデンスを測定し、これを自動的に設定します。", + "label": "サンプリング間隔" + }, + "save_debug_traces": { + "doc": "各サイクルの全電力トレースと一致するデバッグ データを保存します。トラブルシューティングには役立ちますが、ストレージ サイズが増加します。", + "label": "デバッグトレースを保存" + }, + "smoothing_window": { + "doc": "生の電力信号がどの程度平滑化されるか。低 (2) は応答性は高くなりますが、ノイズが多くなります。高 (5) はスパイクを滑らかにしますが、ラグが追加されます。", + "label": "スムージングウィンドウ" + }, + "start_duration_threshold": { + "doc": "実際の開始を確認するには、電力が開始しきい値をこの期間上に維持する必要があり、一瞬のオン/オフの切り替えによるサイクルの開始が防止されます。", + "label": "開始継続時間" + }, + "start_energy_threshold": { + "doc": "アプライアンスが実行する前に消費しなければならないエネルギー (電力 x 時間)。短時間の高出力スパイクはエネルギーが非常に低いため無視され、誤った始動が防止されます。", + "label": "開始エネルギー" + }, + "start_threshold_w": { + "doc": "サイクルが開始されたことを確認するには、電力がこのレベルを超える必要があります。設定が低すぎると、スタンバイ電源からの誤った起動が発生します。高すぎると、起動が遅いプログラム (コールドフィル) が失われます。提案エンジンは、これをマシンの観測された最低有効電力のすぐ上に設定します。", + "label": "開始しきい値" + }, + "stop_threshold_w": { + "doc": "オフディレーのカウントダウンが開始される前に、電力はこのレベルを下回る必要があります。開始しきい値よりも低く設定します。それらの間のギャップは、ちらつきを防ぐヒステリシス帯域です。設定が高すぎると、低電力フェーズ (すすぎ保留、しわ防止) が誤って終了シーケンスをトリガーします。", + "label": "停止しきい値" + }, + "switch_entity": { + "doc": "オプションのスイッチは、一時停止時にオフになり、再開時に再びオンに切り替わります。「一時停止すると電源も切断されます」と併用します。", + "label": "スイッチエンティティ" + }, + "watchdog_interval": { + "doc": "バックグラウンド ウォッチドッグがセンサーの停止とタイムアウトの経過をチェックする頻度。デフォルトは 30 秒です。", + "label": "ウォッチドッグ間隔" + }, + "notify_milestone_message": { + "doc": "マイルストーン通知のメッセージ。テンプレート変数: {device}、{cycle_count}。", + "label": "マイルストーンメッセージ" + }, + "notify_milestones": { + "doc": "達成時に一度だけお祝い通知を送るサイクル数をカンマ区切りで指定します (例: 50, 100, 500, 1000)。空欄でマイルストーン通知を無効にします。", + "label": "サイクルマイルストーン" + }, + "notify_quiet_end_hour": { + "doc": "サイレント時間帯の終了 (0-23)。保留中の通知はこの時刻に配信されます。空欄で無効にします。", + "label": "サイレント時間の終了" + }, + "notify_quiet_start_hour": { + "doc": "サイレント時間帯の開始 (0-23)。サイレント時間中に発生する終了・リマインダー・洗濯完了の通知は保留され、時間帯の終了時に配信されます。空欄で無効にします。深夜をまたぐ時間帯にも対応 (例: 開始 22、終了 7)。", + "label": "サイレント時間の開始" + }, + "peak_rate_message": { + "doc": "開始通知に追加するピーク料金のヒント用のカスタムテキスト (任意)。テンプレート変数: {device}、{price}。空欄で組み込みの既定値を使用します。", + "label": "ピーク料金メッセージ" + }, + "peak_rate_threshold": { + "doc": "サイクル開始時に現在の kWh あたりの価格がこの値以上の場合、開始通知にピーク料金のヒントを追加します。0 または空欄でヒントを無効にします。", + "label": "ピーク料金のしきい値 (kWh あたり)" + }, + "dtw_bandwidth": { + "label": "形状マッチングの許容度", + "doc": "保存済みプログラムの形状に合わせるために、マッチャーがサイクルをどれだけ時間ワーピングできるかを決めます。値を大きくすると速度の変動をより許容しますが、大きすぎると誤ったプログラムにマッチするおそれがあります。" + }, + "corr_weight": { + "label": "形状とレベルの重み", + "doc": "マッチのスコアリング時に、曲線の形状と絶対的な電力レベルのどちらを重視するかのバランスです。値を大きくすると形状を、小さくすると電力レベルの一致を重視します。" + }, + "duration_weight": { + "label": "実行時間の重み", + "doc": "一般的な実行時間がこのサイクルと一致するプログラムを、どれだけ優先するかを決めます。" + }, + "energy_weight": { + "label": "エネルギーの重み", + "doc": "一般的な消費電力量がこのサイクルと一致するプログラムを、どれだけ優先するかを決めます。" + }, + "store_brand": { + "label": "家電ブランド", + "doc": "任意。コミュニティカタログから選択した家電ブランドです。一致する基準録音の検索と共有に使用されます。オンライン機能を使用しない場合は空欄のままにしてください。" + }, + "store_model": { + "label": "家電モデル", + "doc": "任意。ブランドを設定すると、コミュニティカタログから選択できる家電モデルです。お使いのモデルが一覧にない場合は、カタログに追加できます。" + }, + "show_contributor": { + "doc": "コミュニティの家電および基準サイクルに「by 」のクレジット表示をします。" + }, + "enable_phase_matching": { + "label": "フェーズを考慮した残り時間", + "doc": "実行中の各サイクルをフェーズ(加熱、洗い、脱水)に分割し、フェーズごとに残り時間を見積もって従来の推定値とブレンドします。サイクルの序盤ではフェーズごとの見積もりを重視し、終盤に近づくにつれて従来の推定値を重視します。これにより、お使いの機器が実際に加熱・運転する時間に合わせてカウントダウンが調整され、サイクルの前半で最も効果が表れます。オフ = 従来の推定値のみ。影響を受けるのは残り時間の表示だけで、プログラムのマッチングとサイクル検出は変わりません。" + }, + "keep_min_score": { + "label": "最低マッチスコア", + "doc": "候補がマッチング競合に残るために必要な最低類似度スコア。デフォルトの 0.1 は意図的に緩やかで、弱い候補も許可し、最良のマッチングを後のステージに委ねます。可能性の低いプロファイルを早期に除外するには値を上げ、候補プールを広げるには値を下げてください。" + }, + "dtw_blend": { + "label": "ワープブレンド", + "doc": "時間ワーピング (DTW) アライメントスコアがステージ 2 コアスコアをどれほど置き換えるか。0 = ステージ 2 スコアのみ使用、1 = DTW スコアのみ使用、0.5 (デフォルト) = 等割合ブレンド。プログラムの電力レベルが似ていても時間パターンが異なる場合、ワープアライメントへの依存度を高めるために値を上げてください。" + }, + "dtw_ensemble_w": { + "label": "ワープアンサンブル混合", + "doc": "アンサンブル DTW モード(デフォルト)において、スケール付き L1 と微分 DTW (DDTW) の重み配分。1.0 = スケール付き-L1 のみ、0 = DDTW のみ、0.7 = デフォルト。スケール付き-L1 変種は電力レベルを比較し、微分変種は電力がどう変化するかに反応します。アンサンブルは両者を組み合わせます。" + }, + "dtw_ddtw_scale": { + "label": "微分ワープスケール", + "doc": "微分 DTW スコアリングの半飽和距離。DDTW 距離がこの値と等しいとき、スコアが半分になります。小さいほど形状の差異に敏感になります。デフォルトの 30 は一般的な家電製品の電力トレースに合わせて調整されています。アンサンブルおよび ddtw DTW モードのみに影響します。" + }, + "dtw_refine_top_n": { + "label": "ワープ精製候補数", + "doc": "DTW によって再スコアリングされるステージ 2 上位候補の数。DTW は計算コストが高いため、上位 N 候補にのみ適用されます。デフォルト 5。ステージ 2 後に正しいプロファイルが 4 位または 5 位にしかならない場合は値を上げてください (7-9 程度) - DTW がそれを救えます。値を下げるとマッチングが若干速くなります。" + }, + "duration_scale": { + "label": "継続時間シャープネス", + "doc": "ステージ 4 の運転時間一致ペナルティの厳格さ。一致スコアが半分になる対数比率を指します。小さいほど厳格で、時間のズレはより大きな影響を与えます。デフォルト 0.175 は半ウェイト時に約 18% の許容誤差に相当します。運転時間の重みと組み合わせて使用してください。" + }, + "energy_scale": { + "label": "エネルギーシャープネス", + "doc": "ステージ 4 のエネルギー一致ペナルティの厳格さ。小さいほど厳格で、エネルギーのズレはより大きな影響を与えます。デフォルト 0.25 はエネルギーが負荷によって変動するため、時間の厳格さよりも意図的に緩やかに設定されています。エネルギーの重みと組み合わせて使用してください。" + }, + "power_profile_interval_min": { + "label": "電力プロファイル間隔", + "doc": "EMHASS や tibber_prices などの外部プランナーが使用する per-profile の power_profile センサー属性(スロットごとの平均ワット数の配列)のバケットサイズ。小さいバケットは短い電力スパイクを鮮明に保ち、大きいバケットは形状を平滑化します。デフォルト 15 分。読み取り時のみ使用され、検出には影響しません。" + }, + "notify_live_sticky": { + "label": "タップ後もライブ通知を維持", + "doc": "Android のみ。実行中のスレッドをタップしても通知が消えないよう、ライブ進捗通知を固定(スティッキー)にします。オフにすると、タップで通知が消えるデフォルトの動作になります。" + }, + "notify_live_click_action": { + "label": "ライブ通知のタップ先", + "doc": "Android のみ。ライブ進捗通知をタップしたときに開く場所(例:/lovelace/laundry、またはフル URL)をアプリのデフォルトページの代わりに指定します。空白のままにするとデフォルトになります。" + }, + "door_opens_at_end": { + "label": "終了時に自動でドアが開く", + "doc": "サイクル終了後にドアが自動的に開いて乾燥する食器洗い機(AirDry など)向けの設定です。有効にすると、実行中のサイクルでドアが開いてもサイクルが永久に一時停止されなくなります。代わりに、ドアが下の待機時間以上開いた状態が続いた場合、WashData はサイクルが完了したと判断します。一瞬の開け閉め(食器の追加など)は無視されます。ドアセンサーエンティティが必要です。" + }, + "door_end_dwell_seconds": { + "label": "ドア開放の終了待機時間", + "doc": "「終了時に自動でドアが開く」が有効のとき、WashData がサイクルを終了するまでドアが開いた状態を維持する必要がある時間。食器を素早く追加する場合(すぐ閉めるだけ)を無視できるほど長く(デフォルト 60 秒)、機器がドアを開けた後に迅速に終了できるほど短く設定します。" + }, + "dishwasher_end_spike_quiet_release": { + "label": "パッシブ乾燥の静音解除", + "doc": "サイクルが予想所要時間を過ぎた後、WashData が最終排水を待つのをやめてサイクルを終了するまでに、食器洗い機が静音状態(停止しきい値を下回る状態)を維持しなければならない時間です。遅れて発生する最終排水の前に長い無音の乾燥フェーズがあり、その排水が見逃されている場合は、この値を上げてください。ウィンドウを広げると、学習された所要時間が古い平均値に固定されず、季節変動(給水温度が低い=サイクルが長くなる)に追従できます。この設定は、内部の 30 分間の終了スパイク待機上限に対して待機時間を短縮することしかできず、延長することはありません。" + } + }, + "setting_group": { + "auto_labeling": { + "label": "自動ラベル付け" + }, + "cycle_end": { + "label": "サイクル終了" + }, + "cycle_start": { + "label": "サイクル開始" + }, + "cycle_timers": { + "label": "サイクルタイマー" + }, + "data_management": { + "label": "データ管理" + }, + "debug": { + "label": "デバッグ" + }, + "dishwasher_end": { + "label": "食器洗い機の終了" + }, + "door_pause": { + "label": "ドアと一時停止" + }, + "dtw_refinement": { + "label": "DTW精度向上" + }, + "duration_gates": { + "label": "時間ゲート" + }, + "energy": { + "label": "エネルギー" + }, + "external_end_trigger": { + "label": "外部終了トリガー" + }, + "housekeeping": { + "label": "ハウスキーピング" + }, + "match_scoring": { + "label": "マッチングスコアリング" + }, + "messages": { + "label": "メッセージ" + }, + "power_off": { + "label": "電源オフ" + }, + "predictive_end": { + "label": "予測終了" + }, + "schedule": { + "label": "スケジュール" + }, + "services": { + "label": "サービス" + }, + "signal_processing": { + "label": "信号処理" + }, + "thresholds_gap": { + "label": "しきい値とギャップ" + }, + "timing": { + "label": "タイミング" + }, + "unload_reminder": { + "label": "取り出しリマインダー" + }, + "watchdog": { + "label": "ウォッチドッグ" + }, + "quiet_hours_milestones": { + "label": "サイレント時間とマイルストーン" + }, + "device_info": { + "label": "デバイス情報" + }, + "basic_configuration": { + "label": "基本設定" + } + }, + "status": { + "active": "アクティブ", + "all_statuses": "すべてのステータス", + "ambiguous": "あいまい", + "auto_detect": "自動検出", + "clear": "クリア", + "completed": "完了", + "fine_tuning": "今微調整中…", + "force_stopped": "強制停止", + "idle": "アイドル状態", + "interrupted": "中断", + "ready": "処理の準備ができました", + "recording": "記録中", + "training": "トレーニング中…", + "saving": "保存中…", + "rebuilding": "再構築中…", + "analyzing": "分析中…", + "resetting": "リセット中…", + "reverting": "元に戻しています…", + "trimming": "トリム中…", + "splitting": "分割中…", + "deleting": "削除中…", + "imported": "インポート済み" + }, + "tab": { + "advanced": "高度な", + "diagnostics": "診断", + "history": "サイクル", + "ml": "機械学習トレーニング", + "pp_cleanup": "クリーンアップ", + "pp_manage": "管理", + "pp_overview": "概要", + "pp_phases": "フェーズ", + "profiles": "プロファイル", + "settings": "設定", + "status": "概要", + "subtab_phase_catalog": "フェーズカタログ", + "subtab_profiles": "プロファイル", + "maintenance": "メンテナンス", + "playground": "プレイグラウンド", + "store": "ストア" + }, + "tag": { + "early_end": "早期終了", + "late_start": "遅いスタート", + "merged": "マージされたサイクル", + "noise": "ノイズ", + "sensor_gap": "センサーギャップ", + "split": "スプリットサイクル", + "wrong_profile": "間違ったプロフィール" + }, + "toast": { + "access_saved": "アクセス制御が保存されました", + "all_wiped": "すべてのデータが消去されました", + "analysis_complete_none": "分析が完了しました: 新しい提案はありません", + "auto_label_complete": "自動ラベル付け完了", + "automation_deleted": "オートメーションが削除されました", + "correction_submitted": "修正を提出しました", + "cycle_deleted": "サイクルが削除されました", + "cycle_force_stopped": "サイクル強制停止", + "cycle_labelled": "サイクルラベル付き", + "cycle_paused": "サイクルが一時停止されました", + "cycle_resumed": "サイクルが再開されました", + "cycle_trimmed": "サイクルトリム", + "cycles_merged": "統合されたサイクル", + "envelope_rebuilt": "再構築されたエンベロープ", + "envelopes_rebuilt": "再構築された封筒", + "export_downloaded": "ダウンロードしたエクスポート", + "feedback_all_dismissed": "すべてのフィードバックが却下されました", + "feedback_confirmed": "フィードバックが確認されました", + "feedback_dismissed": "フィードバックは却下されました", + "group_deleted": "グループが削除されました", + "group_name_required": "グループ名は必​​須です", + "group_saved": "グループが保存されました", + "import_successful": "インポートは成功しました。統合のリロード", + "json_required": "JSONデータは必須です", + "legacy_removed": "従来のアクションが削除されました", + "logs_exported": "エクスポートされたログ", + "matching_reverted": "マッチングウェイトがデフォルトに戻った", + "min_2_profiles": "グループに対して少なくとも 2 つのプロファイルを選択してください", + "ml_training_no_improvement": "トレーニング完了: ベースラインは維持 (改善なし)", + "models_reverted": "オンデバイスモデルがベースラインに戻った", + "name_required": "名前は必須です", + "no_split_found": "分割できるアイドル ギャップは見つかりませんでした", + "panel_settings_saved": "パネル設定が保存されました", + "pg_preset_loaded": "プリセット「{name}」を読み込みました", + "pg_preset_saved": "プリセット「{name}」を保存しました", + "pg_sugg_loaded": "{n} 件の提案値を適用しました - プレイグラウンドで比較してください", + "pg_sugg_ml_loaded": "{n} 件の ML 調整済み値を適用しました - プレイグラウンドで比較してください", + "phase_name_required": "フェーズ名は必須です", + "phase_updated": "フェーズが更新されました", + "phases_saved": "保存されたフェーズ", + "preferences_saved": "設定が保存されました", + "profile_name_required": "プロファイル名は必須です", + "profile_renamed": "プロファイルの名前が変更されました", + "recording_discarded": "録音は破棄されました", + "recording_saved": "録音はプロファイルに保存されました", + "recording_started": "録音開始", + "recording_stopped": "録音停止", + "review_saved": "レビューが保存されました", + "settings_conflicts": "保存する前に強調表示されている設定の競合を解消してください。", + "settings_reverted": "設定が復元されました。統合のリロード", + "settings_saved": "設定が保存されました。統合のリロード", + "suggestions_applied": "提案が適用されました。統合のリロード", + "suggestions_dismissed": "提案は却下されました", + "apply_failed": "適用に失敗しました: {error}", + "delete_failed": "削除に失敗しました: {error}", + "load_more_failed": "さらに読み込めませんでした: {error}", + "maint_add_failed": "イベントを追加できませんでした: {error}", + "maint_added": "メンテナンスイベントを追加しました", + "maint_delete_failed": "イベントを削除できませんでした: {error}", + "maint_deleted": "メンテナンスイベントを削除しました", + "relabel_done": "{count} 件のサイクルを再ラベル付けしました", + "relabel_failed": "再ラベル付けに失敗しました: {error}", + "reminders_save_failed": "リマインダーを保存できませんでした: {error}", + "reminders_saved": "サービスリマインダーを保存しました", + "pause_no_cycle": "一時停止できるアクティブなサイクルがありません", + "resume_no_cycle": "再開できる一時停止中のサイクルがありません", + "delete_partial_failed": "一部の項目を削除できなかったため、復元されました", + "pg_run_gone": "その実行は利用できなくなりました。", + "task_cancelled": "キャンセルしました。", + "processed": "{bits} を処理しました", + "processed_cycles": "{n} 件のサイクル", + "processed_suggestions": "{n} 件の提案", + "processed_models": "{n} 件のモデル昇格", + "store_search_failed": "検索に失敗しました: {error}", + "store_connect_failed": "接続に失敗しました: {error}", + "store_connected": "コミュニティストアに接続しました", + "store_disconnected": "コミュニティストアから切断しました", + "store_error": "エラー: {error}", + "store_unavailable": "コミュニティストアは利用できません。", + "store_pick_profile": "統合先のプロファイルを選択してください", + "store_name_required": "プロファイル名を入力してください", + "store_import_failed": "インポートに失敗しました: {error}", + "store_imported": "{profile} にインポートしました", + "store_program_required": "プログラム名を入力してください", + "store_no_appliance": "先に設定で家電のブランドとモデルを設定してください。", + "store_share_failed": "共有に失敗しました: {error}", + "store_shared": "コミュニティストアに共有しました(審査待ち)", + "appliance_added": "家電を追加しました(承認待ち)", + "thanks_confirming": "確認していただきありがとうございます", + "device_approved": "コミュニティによって承認されました", + "rating_saved": "品質評価を保存しました", + "brand_added": "ブランドを追加しました(承認待ち)", + "profile_added": "プロファイルを追加しました(承認待ち)", + "saved_except_conflicts": "保存しました。残りを保存するにはハイライトされた競合を修正してください。", + "share_device_none_sel": "共有するサイクルを少なくとも1つ選択してください", + "store_device_downloaded": "{p}件のプログラム、{c}件の記録を追加しました", + "store_device_downloaded_phases": "{p}件のプログラム、{c}件の記録、{ph}件のフェーズマップを追加しました", + "store_device_downloaded_settings": "{p}件のプログラム、{c}件の記録、{ph}件のフェーズマップ、{s}件の設定を追加しました", + "store_device_shared": "{n}件のサイクルをコミュニティストアに共有しました - 審査中。", + "store_device_shared_all_dup": "{n}件のサイクルはすべて既にコミュニティストアにありました。", + "store_device_shared_partial": "{n}件のサイクルを共有しました。{failed}件はアップロードできませんでした。", + "store_device_shared_some_dup": "{created}件のサイクルを共有しました。{dup}件は既にストアにありました。", + "store_download_failed": "ダウンロードに失敗しました: {error}", + "store_download_nothing": "ダウンロードする新しいものはありません - このセットアップは既にデバイスにあります。", + "export_selective_done": "エクスポートをダウンロードしました", + "import_selective_done": "{profiles} 件のプロファイルと {cycles} 件のサイクルをインポートしました" + }, + "suggestion": { + "both_agree": "WashDataの推奨", + "calibrated_label": "調整済み", + "observed_label": "観測値", + "impact": { + "auto_label_confidence": { + "higher": "自動ラベル付けされるサイクルが少なくなります。より多くがレビューに回されます", + "lower": "より多くのサイクルを自動ラベル付けします。一部は誤識別される可能性があります" + }, + "duration_tolerance": { + "higher": "より広い時間範囲を受け入れます。柔軟なマッチング", + "lower": "より近い時間のマッチングが必要です。厳格ですが、異常なサイクルを拒否する場合があります" + }, + "end_energy_threshold": { + "higher": "相当なエネルギーを使用したサイクルのみを終了します", + "lower": "短いまたは低エネルギーのサイクルも終了します" + }, + "end_repeat_count": { + "higher": "終了信号をより多く繰り返す必要があります。より堅牢ですが、わずかに遅くなります", + "lower": "より少ない繰り返しで終了します。検出が速くなりますが、誤終了のリスクが高まります" + }, + "learning_confidence": { + "higher": "非常に確信度の高いマッチングのみから学習します。遅くなりますが、より信頼性が高くなります", + "lower": "より多くのサイクルから学習します。モデルにノイズが増える可能性があります" + }, + "min_off_gap": { + "higher": "新しいサイクルが始まる前により長いアイドル時間が必要です", + "lower": "短いアイドルで新しいサイクルが開始されます。連続運転が分割される場合があります" + }, + "min_power": { + "higher": "アイドル消費電力への感度が低くなります。非常に静かなプログラムを見逃す場合があります", + "lower": "感度が高くなります。スタンバイ電力をアクティビティとして記録する場合があります" + }, + "no_update_active_timeout": { + "higher": "サイクルが停止していると判断するまでの時間が長くなります", + "lower": "停止したサイクルをより早く強制停止します" + }, + "off_delay": { + "higher": "家電の一時停止のための時間が長くなります。長い浸漬や乾燥フェーズに対応します", + "lower": "終了検出が速くなります。オン/オフが明確な家電に適しています" + }, + "profile_match_threshold": { + "higher": "高い確信度のマッチングのみをコミットします。より多くのサイクルがラベルなしのままになります", + "lower": "より多くのサイクルをマッチングします。一部が若干間違っている場合があります" + }, + "running_dead_zone": { + "higher": "アイドル中の短い電力スパイクを無視します。ノイズへの感度が低くなります", + "lower": "より短い電力バーストに反応します。短時間の一時的なアクティビティを検出します" + }, + "start_threshold_w": { + "higher": "短い電力スパイクによる誤起動を防ぎます", + "lower": "低電力プログラムを検出します。ノイズでトリガーされる場合があります" + }, + "stop_threshold_w": { + "higher": "サイクルをより速く終了します。一時停止中に閉じる場合があります", + "lower": "終了するまで長く待ちます。早期終了が少なくなります" + }, + "watchdog_interval": { + "higher": "より長い静止フェーズが許可されます。誤った強制停止が少なくなります", + "lower": "停止したサイクルをより積極的に検出します" + } + }, + "reason": { + "auto_label_confidence": "ユーザーが一度も修正しなかった {cycles} 件の自動ラベルの15パーセンタイル信頼度({p15})。", + "completion_min_seconds": "{cycles} サイクルにわたる p05 の正常サイクル時間の半分({minutes} min)。誤検出サイクルを除外します。{excl}", + "dead_zone_batch": "短めに設定({cycles} サイクルの起動時の不安定期間の中央値 = {s}s)。これにより本当の終了を速やかに検出します。", + "dead_zone_from_dip": "{s}s で検出された初期の電力低下に基づく。", + "end_energy_default": "サイクル終了時のノイズゲートに推奨される既定値。", + "end_energy_false": "{cycles} サイクルにわたる p95 の誤終了エネルギー({p95}Wh)。サイクルエネルギー中央値の 0.2%({floor}Wh)を下限とします。", + "end_energy_no_false": "{cycles} サイクルで誤終了なし。サイクルエネルギー中央値の 0.2%({floor}Wh)を下限とします。", + "end_repeat_count": "{false}/{total} 件の正常サイクル({pct}%)で、再開を伴う 60s を超える内部の一時停止がありました。{val} 回の終了確認を要求します。", + "learning_confidence": "{cycles} 件のユーザーラベル付きサイクルの p05 信頼度({p05})。これを下回る場合は確認を要求します。", + "match_interval": "観測された更新間隔に基づく(中央値={median}s)* 10。", + "max_duration_ratio": "ラベル付きサイクル時間に基づく(p95={p95})。", + "min_active": "直近のサイクルで観測された最小の稼働電力({min}W)に基づく。", + "min_duration_ratio": "プログラムをサイクルの早い段階で識別できるよう、できるだけ低く設定。信頼度と曖昧さのゲートが早すぎる確定を防ぎます。", + "min_off_gap": "観測された {gaps} 件のサイクル間の間隔に基づく(p05={p05}s)。機器の下限: {floor}s。", + "min_off_gap_bridge": "サイクル内で電力がほぼ止まる最長区間をまたげるよう設定: {span}s + 60s のバッファ。{cycles} 件の正常サイクルにわたる {spans} 件のまたいだ間隔から算出(続けて運転する際にあける最短間隔 {ceiling}s を下回ります)。", + "min_power": "{cycles} 件の正常サイクルにわたる p05 の最低稼働電力({p05}W)の 40%。オフゲートを実際の消費電力より低く保ちます。{excl}", + "ml_auto_label": "品質モデルが正常と判定した最低の信頼度({cycles} 件の正常サイクルの p10 = {p10})。", + "ml_end_repeat": "{false}/{total} サイクル({pct}%)で、終了検出器が 50% を超えるスコアを付けた一時停止がありました。{val} 回の終了確認を要求します。", + "ml_off_delay": "終了検出器が確認した一時停止: p95 {p95}s + 60s のバッファ。{cycles} サイクルにわたるモデル検証済みの一時停止 {pauses} 件から算出(下限 {floor}s)。", + "no_update_timeout": "観測された更新間隔に基づく(p95={p95}s)* 20(最小 60s)。", + "off_delay_cadence": "観測された更新間隔に基づく(p95={p95}s)* 5", + "off_delay_device_floor": "{device} 向けの機器固有の安全な最小値を使用({floor}s)。", + "off_delay_generic_floor": "汎用の安全な最小値を使用({floor}s)。", + "off_delay_pauses": "実際の一時停止を上回るよう設定: p95 のサイクル内一時停止 {p95}s + 60s のバッファ。{cycles} 件の正常サイクルにわたる {pauses} 件の一時停止から算出(下限 {floor}s)。", + "profile_match_threshold": "{cycles} 件の正しい自動ラベルの p10 信頼度({p10})。安全なライブ確定の下限。", + "sampling_interval": "{cycles} 件の正常サイクルにわたって観測された更新間隔の中央値({si}s)。{excl}", + "smoothing_window": "{si}s のサンプリングで約 30s 分の測定値を平滑化するよう設定({samples} サンプル)。", + "start_duration": "短めに設定(約 1 回の {si}s サンプル間隔)。単一サンプルのスパイクを無視しつつ、検出をできるだけ早く開始します。", + "thr_batch": "{cycles} サイクルにわたる p05 の最低稼働電力({p05}W)のすぐ上に設定。これにより開始をできるだけ早く捉え、停止しきい値は機器の最低稼働電力を下回ったままになります。", + "tol_per_profile": "{profiles} 件のプロファイル({cycles} サイクル)にわたるプロファイルごとの時間分散の p75。ばらつきの小さいプロファイルは不利になりません。", + "tol_pooled": "{cycles} 件の直近のラベル付きサイクルの統合時間分散に基づく(p95 偏差={dev})。", + "watchdog": "安全な範囲でできるだけ低く設定(p95 の更新間隔 {p95}s をわずかに上回る値、最小 30s)。誤った停止なしに停滞を素早く検出します。" + }, + "exclusions": { + "summary": "{total} 件の誤検出サイクルを除外しました: {parts}。", + "reason": { + "force_stopped": "強制停止", + "interrupted": "中断", + "incomplete": "未完了", + "noise": "ノイズ", + "unlabeled": "ラベルなし", + "no_trace_short": "短すぎて検査不可", + "high_start": "高電力で開始", + "abrupt_end": "突然終了", + "mid_restart": "サイクル途中で再開", + "no_power": "電力なし", + "no_active_power": "稼働電力なし" + } + } + }, + "trend": { + "down": "下降傾向", + "up": "上昇傾向" + }, + "maint": { + "bearing_service": "ベアリングの整備", + "descale": "スケール除去", + "drum_clean": "ドラムの清掃", + "filter_clean": "フィルターの清掃", + "other": "その他" + }, + "col": { + "profile_tip": "一致したプログラム名。ラベルなしは、サイクル終了時にプロファイルが一致しなかったことを意味します。", + "status_tip": "サイクルの結果: 完了(自然終了)、中断(急激な電力低下)、強制停止(手動)、または要レビュー(フィードバック保留中)。", + "date_tip": "サイクルが開始された日時。", + "duration_tip": "開始から終了までのサイクル全体の実行時間。", + "energy_tip": "消費された総エネルギー(kWh)。電力を時間で積分して計算されます。", + "cost_tip": "このサイクルのエネルギー料金。完了時にその時点で有効な価格(エネルギー x kWh あたりの価格)で確定されます。設定で価格を指定すると入力されます。", + "confidence_tip": "プロファイルのマッチ信頼度(0~100%)。サイクルの電力曲線が識別されたプログラムとどれだけ一致したか。", + "health_tip": "ML サイクルの健康度(高いほど良好)。サイクルをクリックして検査・レビューします。", + "flags_tip": "サイクルのレビュー、異常、ソースフラグ。アイコンにカーソルを合わせると詳細が表示されます。" + }, + "stat": { + "avg": "平均", + "min": "最小 {v}", + "max": "最大 {v}", + "consistency": "一貫性 ±{v}", + "total": "合計 {v}", + "last_run": "前回の実行 {v}", + "score": "スコア {pct}%", + "duration_cv": "継続時間 CV {pct}%", + "avg_confidence": "平均信頼度 {pct}%" + }, + "pg_evd": { + "detected": "検出機能がサイクルの開始を認識しました。", + "match_commit": "照合機能が十分な信頼度でプログラムを確定しました。", + "match_changed": "サイクルの経過が進むにつれて、最有力のプログラムが変わりました。", + "match_ambiguous": "2つのプログラムのスコアが接近していたため、照合結果が不確実でした。", + "unmatched": "このサイクルに合致する保存済みプログラムはありませんでした。", + "notify_start": "開始通知が送信されます。", + "notify_pre_complete": "まもなく完了の通知が送信されます。", + "notify_finish": "完了通知が送信されます。", + "notify_milestone": "マイルストーン通知が送信されます。", + "notify_held": "サイレント時間帯のため、通知が保留されました。", + "finished": "サイクルが終了状態に達して終了しました。" + }, + "store": { + "browse": "閲覧", + "device": "デバイス", + "favorites": "お気に入り", + "search_ph": "ブランドまたはモデルで検索…", + "no_results": "一致する家電が見つかりません。別の検索をお試しください。", + "n_programs": "{n} 個のプログラム", + "n_cycles": "{n} 個のサイクル", + "no_programs": "この家電にはまだ共有されたプログラムがありません。", + "no_cycles": "このプログラムにはまだ共有された基準サイクルがありません。", + "anon": "匿名", + "uploaded_by": "{name} が共有", + "connected_as": "{name} として接続中", + "not_connected": "未接続です。自分のサイクルを共有するには GitHub アカウントを接続してください。", + "import_new": "新しいプロファイル", + "import_merge": "既存に統合", + "merge_target": "統合先プロファイル", + "description": "説明(任意)", + "contributed_by": "提供: {name}", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "まだ評価がありません", + "website": "ストアウェブサイト ↗", + "website_tip": "コミュニティストアのウェブサイトを開く" + }, + "settings": { + "gear": { + "title": "設定" + } + }, + "link": { + "manual": "マニュアル ↗", + "add_appliance": "家電を追加" + }, + "tip": { + "add_brand": "ブランドが一覧にありませんか?コミュニティカタログに追加してください", + "add_appliance": "モデルが一覧にありませんか?お使いの家電をコミュニティカタログに追加してください", + "add_profile": "コミュニティサイトでこの家電のプロファイルを追加してください" + }, + "task": { + "reprocess": { + "matching": "再処理: サイクルのマッチング", + "golden": "再処理: 基準サイクルの補完", + "suggestions": "再処理: 提案", + "ml_training": "再処理: MLトレーニング", + "health": "再処理: サイクルの健康" + }, + "pg_sweep": { + "optimize": "最適化: {param}" + }, + "pg_detail": { + "simulate": "サイクルをシミュレート" + }, + "split": { + "apply": "サイクルを分割中" + }, + "trim": { + "apply": "サイクルをトリミング中" + }, + "merge": { + "apply": "サイクルを結合中" + }, + "rebuild": { + "envelopes": "エンベロープを再構築中" + } + }, + "setup": { + "hdr": { + "card": "デバイスのセットアップ", + "healthy_chip": "セットアップ完了" + }, + "phase0": { + "washer": "WashData はすでにサイクルを検出しています。プログラム名と残り時間の推定を有効にするには、最初のサイクルを記録してください。", + "dishwasher": "WashData は監視しています。食器洗い機のサイクルは複雑です – 最初のサイクルの記録を強くお勧めします。検出されたサイクルが長すぎる場合は、プロファイルとして保存する前にサイクル編集ツールで切り詰めてください。", + "generic": "WashData は監視しています。プロファイルの構築を始めるには、検出されたサイクルを記録またはラベル付けしてください。" + }, + "phase1a": { + "labelled": "良いスタートです – 最初のプログラムが保存されました。より正確なデータを得るには、レコーダーウィジェットで次のサイクルを記録することをご検討ください。" + }, + "phase1b": { + "recorded": "記録が {profile_name} として保存されました。カバレッジを広げるために、他のよく使うプログラムも記録またはラベル付けしてください。" + }, + "phase1c": { + "verify": "コミュニティから {count} 個のプログラムがあります。WashData が正しく認識するか確認するためにサイクルを実行してください – デバイスが独自の履歴を積み重ねるにつれ、マッチングが向上します。" + }, + "phase2": { + "cluster": "WashData は、保存されているプログラムに一致しない {count} 件のサイクルを確認しました – それらは互いに似ています。これらのための新しいプロファイルを作成しますか?", + "unmatched": "直前のサイクルはどの保存済みプログラムにも一致しませんでした。新しいプログラムでしょうか?" + }, + "phase3": { + "suggestions": "WashData はサイクル履歴に基づいた設定の推奨事項があります – 検出精度を向上させるために確認してください。", + "groups": "いくつかのプロファイルが異なる温度の同じプログラムのように見えます。より良いマッチングのためにグループに整理してください。", + "phases": "より正確な残り時間の推定のために {profile_name} にプログラムフェーズを追加してください。" + }, + "phase4": { + "healthy": "このデバイスは完全にセットアップされています({profile_count} 個のプロファイル)。" + }, + "cta": { + "start_recording": "記録を開始", + "label_detected_cycle": "すでに検出済みのサイクルがあります – それをラベル付けする", + "browse_cycles": "別のサイクルをラベル付けするために閲覧する", + "view_profiles": "プロファイルを表示", + "create_from_cluster": "これらのサイクルからプロファイルを作成", + "create_profile": "これのプロファイルを作成", + "review_suggestions": "提案を確認", + "organise_profiles": "プロファイルを整理", + "configure_phases": "フェーズを設定", + "skip_step": "このステップをスキップ", + "skip_forever": "今後表示しない", + "hide_guidance": "ガイダンスを非表示", + "show_guidance": "ガイダンスを表示" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/ko.json b/custom_components/ha_washdata/translations/panel/ko.json index 31cd1996..a9e9ae0c 100644 --- a/custom_components/ha_washdata/translations/panel/ko.json +++ b/custom_components/ha_washdata/translations/panel/ko.json @@ -1,1948 +1,2070 @@ { - "badge": { - "artifact_tip": "{n} 이상 현상이 감지되었습니다(예: 사이클 중간에 문이 열림) - 열어서 그래프에서 확인", - "auto": "(자동 감지)", - "built_in_tag": "내장", - "declining": "↘ 감소", - "energy_low": "평소보다 에너지 사용량이 적음", - "energy_spike": "평소보다 에너지 사용량이 많음", - "fair_fit": "적절함", - "fair_fit_tip": "중간 수준의 일치 일관성 - 이 프로필에 할당된 일부 주기의 신뢰도 점수가 낮습니다. 정확성을 높이려면 더 많은 주기에 라벨을 붙이거나 프로필을 다시 기록하십시오.", - "feedback_requested": "피드백 요청됨", - "golden_cycle": "기록된 참조주기", - "improving": "↗ 개선", - "manual": "(수동으로 선택)", - "needs_review": "검토 필요", - "overrun": "평소보다 더 오래 달렸어요", - "poor_fit": "적합하지 않음", - "poor_fit_tip": "일치하지 않는 일치 기록 – 이 프로필을 다시 작성하는 것이 좋습니다.", - "restart_gap_tip": "{n} HA 재시작 공백: 전력 그래프에 빈 구간이 있습니다", - "reviewed": "검토됨", - "steady": "→ 꾸준한", - "underrun": "평소보다 빨리 완료됨", - "using_defaults": "배송된 기본값 사용", - "using_tuned": "조정된 가중치 사용", - "overrun_ratio": "(예상의 {x}배)", - "underrun_ratio": "(예상의 {pct}%)", - "awaiting_tip": "커뮤니티 승인 대기 중", - "awaiting_n": "승인 대기 중 · {n}개 확인됨", - "approved": "승인됨", - "awaiting": "승인 대기 중", - "imported_tip": "커뮤니티 스토어에서 가져왔습니다. 매칭에만 사용되며 통계에는 포함되지 않습니다.", - "not_importable": "해당 없음", - "exists": "존재함" - }, - "btn": { - "add_device": "+ 장치 추가", - "add_device_tip": "다른 WashData 장치 추가", - "add_maintenance": "유지보수 이벤트 추가", - "add_phase": "+ 단계 추가", - "add_timer": "+ 타이머 추가", - "apply_all": "모두 적용", - "apply_label": "라벨 적용", - "apply_set_b": "세트 B 적용", - "apply_split": "분할 적용", - "apply_trim": "트림 적용", - "auto_detect_split": "자동 감지", - "auto_label_cycles": "자동 라벨 주기", - "auto_label_cycles_tip": "일치 신뢰도가 임계값을 초과하는 미라벨 주기에 프로필 이름을 자동으로 할당합니다", - "cancel": "취소", - "clear_debug": "디버그 데이터 지우기", - "clear_splits": "분명한", - "close": "닫기", - "compare": "비교하다", - "confirm": "확인하다", - "convert_to_automation": "자동화로 전환", - "correct": "옳은…", - "create": "만들다", - "create_from_cluster": "{count}개 사이클로 프로필 만들기", - "create_profile": "+ 프로필 만들기", - "delete": "삭제", - "delete_group": "그룹 삭제", - "delete_group_tip": "이 그룹만 삭제 - 회원 프로필은 유지됩니다.", - "delete_profile": "프로필 삭제", - "discard": "버리다", - "discard_tip": "저장하지 않고 기록된 트레이스를 삭제합니다", - "dismiss": "해고하다", - "done": "완료", - "edit": "편집하다", - "export": "내보내다", - "export_json": "JSON으로 내보내기", - "force_stop": "강제 정지", - "force_stop_tip": "현재 사이클을 즉시 종료하고 강제 정지로 표시합니다", - "from_template": "템플릿에서 ▾", - "ignore": "무시하다", - "import_json": "JSON에서 가져오기", - "import_overwrite": "가져오기(데이터 덮어쓰기)", - "inspect": "검사", - "label": "라벨 지정", - "load": "불러오기", - "load_more": "더 불러오기", - "manage": "관리하다", - "merge": "병합", - "new_automation": "+ 새로운 자동화", - "new_group": "+ 새 그룹", - "new_group_tip": "거의 동일한 프로필(같은 형태/시간, 다른 온도 또는 회전)을 그룹화하여 매처가 안정적으로 선택할 수 있도록 합니다", - "new_phase": "+ 새로운 단계", - "new_profile": "+ 새 프로필", - "new_profile_tip": "기존의 라벨이 지정된 주기 또는 녹음에서 새 프로그램 프로필을 만듭니다", - "on_cycle_finished": "사이클 완료됨", - "on_cycle_started": "주기 시작됨", - "pause_cycle": "정지시키다", - "pause_cycle_tip": "실행 중인 사이클을 일시 중지합니다 – 기기가 중단된 지점부터 재개됩니다", - "pg_apply_device": "장치에 적용", - "pg_autofill": "자동 채우기", - "play": "재생", - "process": "프로세스", - "process_history": "지금 처리하세요", - "process_recording": "녹음 저장", - "process_tip": "기록된 트레이스를 새 프로필 또는 기존 프로필로 저장합니다", - "rebuild": "봉투 다시 작성", - "rebuild_envelope": "봉투 재구축", - "rebuild_tip": "라벨이 지정된 주기에서 모든 프로필의 예상 전력 포락선(최소/최대 범위)을 다시 계산합니다 – 새 주기에 라벨을 지정하거나 기존 주기를 수정한 후 실행합니다", - "rec_start_tip": "기기의 전력 트레이스 기록을 시작합니다 – 주기를 실행하기 직전에 시작합니다", - "rec_stop": "멈추다", - "rec_stop_tip": "녹음을 중지하고 캡처된 트레이스를 검토를 위해 보관합니다", - "record": "녹음 시작", - "refresh": "새로 고치다", - "refresh_diag_tip": "저장소 통계를 다시 로드합니다", - "refresh_logs_tip": "최신 로그 기록을 다시 로드합니다", - "refresh_settings_tip": "서버에서 설정을 다시 로드합니다", - "relabel": "다시 라벨 지정 ({count})", - "remove": "제거하다", - "remove_timer": "타이머 삭제", - "reset": "다시 놓기", - "reset_ml_models_tip": "미세 조정된 모델을 폐기하고 내장된 모델로 돌아갑니다. WashData는 나중에 다시 학습할 수 있습니다.", - "reset_to_builtin": "내장 모델로 재설정", - "reset_to_defaults": "기본값으로 재설정", - "resume_cycle": "사이클 재개", - "resume_cycle_tip": "일시 중지된 사이클을 재개합니다", - "revert_settings": "변경 사항 취소", - "revert_settings_tip": "마지막 저장 전 설정을 복원합니다", - "revert_settings_tip_none": "실행 취소를 활성화하려면 먼저 저장하세요", - "revert": "되돌리기", - "revert_to_previous": "이 설정을 이전 값으로 되돌리기", - "review": "검토", - "run": "실행", - "run_analysis": "🔍 제안 분석 실행", - "run_analysis_tip": "지금 기록된 주기를 분석하고 튜닝 제안을 새로 고치세요.", - "run_auto_label": "자동 라벨 실행", - "run_both": "A 대 B 실행", - "run_simulation": "시뮬레이션 실행", - "save": "구하다", - "save_access_control": "액세스 제어 저장", - "save_group": "그룹 저장", - "save_panel_settings": "패널 설정 저장", - "save_phases": "단계 저장", - "save_preferences": "환경설정 저장", - "save_reminders": "알림 저장", - "save_review": "리뷰 저장", - "save_settings": "설정 저장", - "select": "선택하다", - "select_all": "모두 선택", - "select_last20": "최근 20개", - "select_none": "지우기", - "show_only": "표시만", - "skip_setup": "설정 건너뛰기", - "split": "나뉘다", - "stop": "정지", - "submit_correction": "정정사항 제출", - "train_now": "지금 훈련하세요", - "trim": "손질", - "trim_split": "다듬기/분할", - "undo": "실행 취소", - "use": "사용", - "wipe_all": "모든 데이터 지우기", - "delete_selected": "선택 항목 삭제 ({n})", - "group_suggest": "그룹 {n}: {members}", - "pg_apply_best": "최적 값 적용", - "pg_apply_to_settings": "설정에 저장", - "pg_apply_to_settings_tip": "여기서 편집한 값을 이 기기에 현재 적용 중인 설정으로 복사합니다", - "search": "검색", - "import": "가져오기", - "disconnect": "연결 해제", - "connect_github": "GitHub 연결", - "save_appliance": "가전제품 저장", - "share_to_store": "스토어에 공유", - "share": "공유", - "confirm_appliance": "이 가전제품 확인", - "confirmed": "확인됨", - "browse_community_setups": "커뮤니티 설정 둘러보기", - "download_device": "이 설정 다운로드", - "share_device": "⬆ 이 기기 공유", - "share_device_tip": "이 가전제품과 기록된 참조 사이클을 커뮤니티 스토어에 공유하여 같은 기기를 가진 다른 사용자가 채택할 수 있도록 합니다", - "share_n": "{n}개 사이클 공유", - "export_selected": "내보내기 (데이터 선택)", - "export_all": "모두 빠르게 내보내기", - "import_raw": "고급: JSON에서 전체 교체", - "download_export": "내보내기 다운로드", - "analyze_import": "파일 분석", - "import_selected": "선택 항목 가져오기", - "back": "뒤로" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "정지 임계값 ({stop} W) 미만이어야 합니다. 그렇지 않으면 구김 방지 종료 전력이 무시됩니다", - "stop": "구김 방지 종료 전력 ({exit} W) 이상이어야 합니다" + "card": { + "min": "분", + "entity_not_found": "엔티티를 찾을 수 없음", + "running_long": "지연 중", + "remaining": "남음", + "progress": "진행률", + "show_time_remaining": "남은 시간 표시", + "show_percentage": "백분율 표시", + "layout": { + "tile": "타일 (간단히)", + "detail": "상세 (풍부하게)", + "glance": "한눈에 보기 (여러 기기)" + }, + "btn": { + "pause": "일시정지", + "resume": "재개", + "terminate": "주기 종료", + "record_start": "기록 시작", + "record_stop": "기록 중지", + "program": "프로그램", + "open_panel": "WashData 열기" + }, + "editor": { + "layout": "레이아웃", + "entity": "기기 엔티티", + "entities": "기기", + "title": "제목", + "icon": "아이콘", + "show_state": "상태 표시", + "show_program": "프로그램 표시", + "show_progress_bar": "진행 표시줄 표시", + "spin_icon": "실행 중 아이콘 회전", + "display_mode": "상세 줄", + "active_color": "활성 색상 재정의", + "show_phase": "단계 표시", + "show_energy": "에너지 및 비용 표시", + "show_anomaly": "초과 경고 표시", + "show_sparkline": "실시간 전력 그래프 표시", + "buttons": "동작 버튼", + "program_entity": "프로그램 엔티티 (재정의)", + "time_entity": "시간 엔티티 (재정의)", + "pct_entity": "진행률 엔티티 (재정의)", + "power_entity": "전력 엔티티 (재정의)", + "tap_action": "탭 동작", + "hold_action": "길게 누르기 동작", + "double_tap_action": "두 번 탭 동작" + } + }, + "badge": { + "artifact_tip": "{n} 이상 현상이 감지되었습니다(예: 사이클 중간에 문이 열림) - 열어서 그래프에서 확인", + "auto": "(자동 감지)", + "built_in_tag": "내장", + "declining": "↘ 악화", + "energy_low": "평소보다 에너지 사용량이 적음", + "energy_spike": "평소보다 에너지 사용량이 많음", + "fair_fit": "적절함", + "fair_fit_tip": "중간 수준의 일치 일관성 - 이 프로필에 할당된 일부 주기의 신뢰도 점수가 낮습니다. 정확성을 높이려면 더 많은 주기에 라벨을 붙이거나 프로필을 다시 기록하십시오.", + "feedback_requested": "피드백 요청됨", + "golden_cycle": "기록된 참조 사이클", + "improving": "↗ 개선", + "manual": "(수동으로 선택)", + "needs_review": "검토 필요", + "overrun": "평소보다 오래 작동함", + "poor_fit": "품질 낮음", + "poor_fit_tip": "일관성 없는 매칭 기록 – 이 프로필을 다시 작성하는 것이 좋습니다.", + "restart_gap_tip": "{n} HA 재시작 공백: 전력 그래프에 빈 구간이 있습니다", + "reviewed": "검토됨", + "steady": "→ 안정", + "underrun": "평소보다 빨리 완료됨", + "using_defaults": "기본 제공 기본값 사용", + "using_tuned": "조정된 가중치 사용", + "overrun_ratio": "(예상의 {x}배)", + "underrun_ratio": "(예상의 {pct}%)", + "awaiting_tip": "커뮤니티 승인 대기 중", + "awaiting_n": "승인 대기 중 · {n}개 확인됨", + "approved": "승인됨", + "awaiting": "승인 대기 중", + "imported_tip": "커뮤니티 스토어에서 가져왔습니다. 매칭에만 사용되며 통계에는 포함되지 않습니다.", + "not_importable": "해당 없음", + "exists": "존재함" + }, + "btn": { + "add_device": "+ 장치 추가", + "add_device_tip": "다른 WashData 장치 추가", + "add_maintenance": "유지보수 이벤트 추가", + "add_phase": "+ 단계 추가", + "add_timer": "+ 타이머 추가", + "apply_all": "모두 적용", + "apply_label": "라벨 적용", + "apply_set_b": "세트 B 적용", + "apply_split": "분할 적용", + "apply_trim": "트림 적용", + "auto_detect_split": "자동 감지", + "auto_label_cycles": "사이클 자동 라벨 지정", + "auto_label_cycles_tip": "일치 신뢰도가 임계값을 초과하는 미라벨 주기에 프로필 이름을 자동으로 할당합니다", + "cancel": "취소", + "clear_debug": "디버그 데이터 지우기", + "clear_splits": "지우기", + "close": "닫기", + "compare": "비교", + "confirm": "확인", + "convert_to_automation": "자동화로 전환", + "correct": "수정…", + "create": "만들기", + "create_from_cluster": "{count}개 사이클로 프로필 만들기", + "create_profile": "+ 프로필 만들기", + "delete": "삭제", + "delete_group": "그룹 삭제", + "delete_group_tip": "이 그룹만 삭제 - 구성원 프로필은 유지됩니다.", + "delete_profile": "프로필 삭제", + "discard": "버리기", + "discard_tip": "저장하지 않고 기록된 트레이스를 삭제합니다", + "dismiss": "닫기", + "done": "완료", + "edit": "편집", + "export": "내보내기", + "export_json": "JSON으로 내보내기", + "force_stop": "강제 정지", + "force_stop_tip": "현재 사이클을 즉시 종료하고 강제 정지로 표시합니다", + "from_template": "템플릿에서 ▾", + "ignore": "무시", + "import_json": "JSON에서 가져오기", + "import_overwrite": "가져오기(데이터 덮어쓰기)", + "inspect": "검사", + "label": "라벨 지정", + "load": "불러오기", + "load_more": "더 불러오기", + "manage": "관리", + "merge": "병합", + "new_automation": "+ 새로운 자동화", + "new_group": "+ 새 그룹", + "new_group_tip": "거의 동일한 프로필(같은 형태/시간, 다른 온도 또는 탈수)을 그룹화하여 매처가 안정적으로 선택할 수 있도록 합니다", + "new_phase": "+ 새로운 단계", + "new_profile": "+ 새 프로필", + "new_profile_tip": "기존의 라벨이 지정된 주기 또는 기록에서 새 프로그램 프로필을 만듭니다", + "on_cycle_finished": "사이클 완료됨", + "on_cycle_started": "주기 시작됨", + "pause_cycle": "일시 중지", + "pause_cycle_tip": "실행 중인 사이클을 일시 중지합니다 – 기기가 중단된 지점부터 재개됩니다", + "pg_apply_device": "장치에 적용", + "pg_autofill": "자동 채우기", + "pg_load_calibrated": "조정된 (ML) 불러오기 ({n})", + "pg_load_calibrated_tip": "ML 조정된 설정을 플레이그라운드 재정의로 적용합니다", + "pg_load_live": "적용 중인 설정 불러오기", + "pg_load_live_tip": "통합의 현재 설정을 다시 읽고 플레이그라운드의 편집 내용을 모두 버립니다", + "pg_load_suggested": "제안 불러오기 ({n})", + "pg_load_suggested_tip": "자동 조정 도구의 현재 제안을 플레이그라운드 재정의로 적용합니다", + "pg_preset_delete": "프리셋 삭제", + "pg_preset_load": "프리셋 불러오기", + "pg_preset_load_tip": "플레이그라운드 값을 이 프리셋으로 바꿉니다(적용 중인 설정은 그대로 유지됩니다)", + "pg_preset_save": "프리셋으로 저장", + "pg_preset_save_tip": "아래의 모든 값을 이 기기의 이름 있는 프리셋으로 저장합니다", + "pg_publish_all": "{n}개를 통합에 적용", + "pg_publish_one": "{label}을(를) 통합에 적용", + "play": "재생", + "process": "처리", + "process_history": "지금 처리", + "process_recording": "기록 저장", + "process_tip": "기록된 트레이스를 새 프로필 또는 기존 프로필로 저장합니다", + "rebuild": "엔벨로프 다시 작성", + "rebuild_envelope": "엔벨로프 재구축", + "rebuild_tip": "라벨이 지정된 주기에서 모든 프로필의 예상 전력 포락선(최소/최대 범위)을 다시 계산합니다 – 새 주기에 라벨을 지정하거나 기존 주기를 수정한 후 실행합니다", + "rec_start_tip": "기기의 전력 트레이스 기록을 시작합니다 – 주기를 실행하기 직전에 시작합니다", + "rec_stop": "중지", + "rec_stop_tip": "기록을 중지하고 캡처된 트레이스를 검토를 위해 보관합니다", + "record": "기록 시작", + "refresh": "새로 고침", + "refresh_diag_tip": "저장소 통계를 다시 로드합니다", + "refresh_logs_tip": "최신 로그 기록을 다시 로드합니다", + "refresh_settings_tip": "서버에서 설정을 다시 로드합니다", + "relabel": "다시 라벨 지정 ({count})", + "remove": "제거", + "remove_timer": "타이머 삭제", + "reset": "재설정", + "reset_ml_models_tip": "미세 조정된 모델을 폐기하고 내장된 모델로 돌아갑니다. WashData는 나중에 다시 학습할 수 있습니다.", + "reset_to_builtin": "내장 모델로 재설정", + "reset_to_defaults": "기본값으로 재설정", + "resume_cycle": "사이클 재개", + "resume_cycle_tip": "일시 중지된 사이클을 재개합니다", + "revert_settings": "변경 사항 취소", + "revert_settings_tip": "마지막 저장 전 설정을 복원합니다", + "revert_settings_tip_none": "실행 취소를 활성화하려면 먼저 저장하세요", + "revert": "되돌리기", + "revert_to_previous": "이 설정을 이전 값으로 되돌리기", + "review": "검토", + "run": "실행", + "run_analysis": "🔍 제안 분석 실행", + "run_analysis_tip": "지금 기록된 주기를 분석하고 튜닝 제안을 새로 고치세요.", + "run_auto_label": "자동 라벨 실행", + "run_both": "A 대 B 실행", + "run_simulation": "시뮬레이션 실행", + "save": "저장", + "save_access_control": "액세스 제어 저장", + "save_group": "그룹 저장", + "save_panel_settings": "패널 설정 저장", + "save_phases": "단계 저장", + "save_preferences": "환경설정 저장", + "save_reminders": "알림 저장", + "save_review": "리뷰 저장", + "save_settings": "설정 저장", + "select": "선택", + "select_all": "모두 선택", + "select_last20": "최근 20개", + "select_none": "지우기", + "show_only": "표시만", + "skip_setup": "설정 건너뛰기", + "split": "분할", + "stop": "정지", + "submit_correction": "정정사항 제출", + "train_now": "지금 훈련", + "trim": "다듬기", + "trim_split": "다듬기/분할", + "undo": "실행 취소", + "use": "사용", + "wipe_all": "모든 데이터 지우기", + "delete_selected": "선택 항목 삭제 ({n})", + "group_suggest": "그룹 {n}: {members}", + "pg_apply_best": "최적 값 적용", + "pg_apply_to_settings": "설정에 저장", + "pg_apply_to_settings_tip": "여기서 편집한 값을 이 기기에 현재 적용 중인 설정으로 복사합니다", + "search": "검색", + "import": "가져오기", + "disconnect": "연결 해제", + "connect_github": "GitHub 연결", + "save_appliance": "가전제품 저장", + "share_to_store": "스토어에 공유", + "share": "공유", + "confirm_appliance": "이 가전제품 확인", + "confirmed": "확인됨", + "browse_community_setups": "커뮤니티 설정 둘러보기", + "download_device": "이 설정 다운로드", + "share_device": "⬆ 이 기기 공유", + "share_device_tip": "이 가전제품과 기록된 참조 사이클을 커뮤니티 스토어에 공유하여 같은 기기를 가진 다른 사용자가 채택할 수 있도록 합니다", + "share_n": "{n}개 사이클 공유", + "export_selected": "내보내기 (데이터 선택)", + "export_all": "모두 빠르게 내보내기", + "import_raw": "고급: JSON에서 전체 교체", + "download_export": "내보내기 다운로드", + "analyze_import": "파일 분석", + "import_selected": "선택 항목 가져오기", + "back": "뒤로", + "mute_suggestion": "이 설정 제안 중지", + "reset_muted": "뮤트 초기화" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "정지 임계값 ({stop} W) 미만이어야 합니다. 그렇지 않으면 구김 방지 종료 전력이 무시됩니다", + "stop": "구김 방지 종료 전력 ({exit} W) 이상이어야 합니다" + }, + "anti_wrinkle_max": { + "max": "시작 임계값 ({start} W) 이상이어야 합니다. 그렇지 않으면 구김 방지 시간 제한이 무시됩니다", + "start": "구김 방지 최대 전력 ({max} W) 미만이어야 합니다" + }, + "attn_sub": "저장하기 전에 충돌을 해결하세요", + "attn_title": "설정 충돌 {n}건{s}", + "confidence": { + "auto": "매칭 임계값 ({match}) 이상이어야 합니다", + "learning": "매칭 임계값 ({match}) 이하이어야 합니다", + "match_for_auto": "자동 라벨 신뢰도 ({alc}) 이하이어야 합니다", + "match_for_learning": "학습 신뢰도 ({lc}) 이상이어야 합니다" + }, + "duration_ratio": { + "max": "최소 기간 비율 ({min}) 보다 커야 합니다", + "min": "최대 기간 비율 ({max}) 미만이어야 합니다" + }, + "hysteresis": { + "start": "정지 임계값 ({stop} W) 이상이어야 합니다", + "stop": "시작 임계값 ({start} W) 미만이어야 합니다" + }, + "min_power": { + "min_power": "정지 임계값 ({stop} W) 이하이어야 합니다", + "stop": "최소 전력 ({min} W) 이상이어야 합니다" + }, + "no_update_timeout": { + "timeout": "워치독 간격 ({wi} 초) 보다 커야 합니다", + "watchdog": "업데이트 없음 타임아웃 ({to} 초) 보다 작아야 합니다" + }, + "off_delay": { + "gap": "최소 오프 간격은 오프 지연 ({delay} 초) 이상이어야 합니다", + "off_delay": "오프 지연 ({off_delay} 초)이 최소 오프 간격 ({gap} 초)을 초과합니다. 연속 사이클이 병합될 수 있습니다" + }, + "power_off": { + "stop": "전원 꺼짐 임계값 ({pot} W) 이상이어야 합니다", + "threshold": "적용되려면 정지 임계값 ({stop} W) 미만이어야 합니다" + }, + "pump_stuck": { + "duration": "워치독이 사이클을 강제 종료하기 전에 정지 알람이 작동하도록 업데이트 없음 타임아웃 ({to} 초) 미만이어야 합니다", + "timeout": "사이클이 강제 정지되기 전에 정지 알람이 작동하도록 펌프 정지 지속 시간 ({ps} 초)을 초과해야 합니다" + }, + "start_dur": { + "sampling": "샘플링 간격이 시작 지속 시간 ({sdt} 초)을 초과합니다. 단일 샘플 스파이크가 사이클을 시작할 수 있습니다", + "threshold": "단일 샘플 오탐지를 방지하려면 최소 1 샘플링 간격 ({si} 초) 이상이어야 합니다" + }, + "unmatch": { + "match": "언매칭 임계값 ({un}) 이상이어야 합니다", + "unmatch": "매칭 임계값 ({match}) 미만이어야 합니다. 그렇지 않으면 확정된 일치가 즉시 해제됩니다" + }, + "cascade_toast": "일관성을 위해 {n}개 설정{s}을 추가로 자동 조정했습니다.", + "suggestion_resolves": "이 문제를 해결하려면 아래의 보류 중인 제안({val})을 적용하세요", + "use_fix": "{val} 사용", + "watchdog": { + "interval": "샘플링 간격 ({si} 초)의 최소 2배이어야 합니다", + "sampling": "샘플링 간격은 워치독 간격 ({wi} 초)의 절반 이하이어야 합니다" + }, + "settings_banner": "{n}건의 설정 충돌{s} – 강조 표시된 섹션을 확인하고 저장 전에 수정하세요.", + "settings_banner_btn": "첫 번째로" }, - "anti_wrinkle_max": { - "max": "시작 임계값 ({start} W) 이상이어야 합니다. 그렇지 않으면 구김 방지 시간 제한이 무시됩니다", - "start": "구김 방지 최대 전력 ({max} W) 미만이어야 합니다" - }, - "attn_sub": "저장하기 전에 충돌을 해결하세요", - "attn_title": "설정 충돌 {n}건{s}", - "confidence": { - "auto": "매칭 임계값 ({match}) 이상이어야 합니다", - "learning": "매칭 임계값 ({match}) 이하이어야 합니다", - "match_for_auto": "자동 라벨 신뢰도 ({alc}) 이하이어야 합니다", - "match_for_learning": "학습 신뢰도 ({lc}) 이상이어야 합니다" - }, - "duration_ratio": { - "max": "최소 기간 비율 ({min}) 보다 커야 합니다", - "min": "최대 기간 비율 ({max}) 미만이어야 합니다" - }, - "hysteresis": { - "start": "정지 임계값 ({stop} W) 이상이어야 합니다", - "stop": "시작 임계값 ({start} W) 미만이어야 합니다" - }, - "min_power": { - "min_power": "정지 임계값 ({stop} W) 이하이어야 합니다", - "stop": "최소 전력 ({min} W) 이상이어야 합니다" - }, - "no_update_timeout": { - "timeout": "워치독 간격 ({wi} 초) 보다 커야 합니다", - "watchdog": "업데이트 없음 타임아웃 ({to} 초) 보다 작아야 합니다" - }, - "off_delay": { - "gap": "최소 오프 간격은 오프 지연 ({delay} 초) 이상이어야 합니다", - "off_delay": "오프 지연 ({off_delay} 초)이 최소 오프 간격 ({gap} 초)을 초과합니다. 연속 사이클이 병합될 수 있습니다" - }, - "power_off": { - "stop": "전원 꺼짐 임계값 ({pot} W) 이상이어야 합니다", - "threshold": "적용되려면 정지 임계값 ({stop} W) 미만이어야 합니다" - }, - "pump_stuck": { - "duration": "워치독이 사이클을 강제 종료하기 전에 정지 알람이 작동하도록 업데이트 없음 타임아웃 ({to} 초) 미만이어야 합니다", - "timeout": "사이클이 강제 정지되기 전에 정지 알람이 작동하도록 펌프 정지 지속 시간 ({ps} 초)을 초과해야 합니다" - }, - "start_dur": { - "sampling": "샘플링 간격이 시작 지속 시간 ({sdt} 초)을 초과합니다. 단일 샘플 스파이크가 사이클을 시작할 수 있습니다", - "threshold": "단일 샘플 오탐지를 방지하려면 최소 1 샘플링 간격 ({si} 초) 이상이어야 합니다" - }, - "unmatch": { - "match": "언매칭 임계값 ({un}) 이상이어야 합니다", - "unmatch": "매칭 임계값 ({match}) 미만이어야 합니다. 그렇지 않으면 확정된 일치가 즉시 해제됩니다" - }, - "cascade_toast": "일관성을 위해 {n}개 설정{s}을 추가로 자동 조정했습니다.", - "suggestion_resolves": "이 문제를 해결하려면 아래의 보류 중인 제안({val})을 적용하세요", - "use_fix": "{val} 사용", - "watchdog": { - "interval": "샘플링 간격 ({si} 초)의 최소 2배이어야 합니다", - "sampling": "샘플링 간격은 워치독 간격 ({wi} 초)의 절반 이하이어야 합니다" - }, - "settings_banner": "{n}건의 설정 충돌{s} – 강조 표시된 섹션을 확인하고 저장 전에 수정하세요.", - "settings_banner_btn": "첫 번째로" - }, - "hdr": { - "ab_comparison": "A/B 설정 비교", - "access_control": "접근 제어", - "add_maintenance": "유지보수 이벤트 추가", - "automation_delete": "이 자동화 삭제", - "automation_needs_review": "이 주기에는 검토가 필요합니다.", - "automation_open": "자동화 편집기에서 열기", - "automation_review_this_cycle": "이 주기를 검토하세요", - "automations": "자동화", - "clear_debug": "디버그 추적 지우기", - "cycle_simulator": "사이클 시뮬레이터", - "diagnostics_pref": "진단", - "display": "표시하다", - "dtw_inspector": "DTW 검사기", - "export_import": "내보내기/가져오기", - "getting_started": "시작하기", - "live_power": "라이브 파워", - "logs": "로그", - "logs_diagnostics": "진단", - "maintenance": "유지 관리 작업", - "maintenance_log": "유지보수 기록", - "maintenance_reminders": "서비스 알림", - "manual_recording": "수동녹화", - "manual_recording_tip": "WashData가 전력 트레이스를 기록하는 동안 의도적으로 사이클을 실행합니다. 기기가 시작되기 직전에 시작하고, 완료되면 중지한 다음 처리하여 이름이 지정된 프로필로 저장합니다.", - "ml_learned": "WashData가 배운 것", - "ml_matching_tuning": "프로그램 매칭 미세 조정", - "ml_settings_card": "설정", - "ml_smart_learning": "스마트러닝", - "my_preferences": "내 환경설정", - "no_automations": "아직 이 장치를 참조하는 자동화가 없습니다.", - "panel_settings": "패널 설정", - "param_sweep": "매개변수 스윕", - "phase_catalog": "단계 카탈로그", - "playground": "플레이그라운드", - "process_history": "공정 이력", - "settings_history": "설정 기록", - "status": "상태", - "status_graph": "상태 그래프", - "storage_stats": "스토리지 통계", - "test_history": "기록으로 테스트", - "toggle_sidebar": "홈어시스턴트 사이드바 전환", - "tools_and_data": "도구 및 데이터", - "wipe_history": "기록 지우기", - "recommendations": "권장 사항 ({n})", - "pg_detection_params": "감지 설정", - "pg_timeline": "이벤트 타임라인", - "pg_outcome": "시뮬레이션 결과", - "pg_across_cycles": "전체 사이클에 걸쳐", - "community_store": "커뮤니티 스토어", - "online_account": "커뮤니티 스토어 및 온라인 기능" - }, - "health": { - "fair": "프로파일 품질: 보통", - "good": "✓ 프로파일 품질: 양호", - "poor": "⚠ 프로파일 품질: 불량" - }, - "lbl": { - "actions": "행위", - "activity": "활동", - "administrators": "관리자", - "aria_compare_chart": "사이클 비교 그래프", - "aria_cycle_chart": "사이클 전력 곡선", - "aria_envelope_chart": "프로필 전력 봉투 그래프", - "aria_phase_chart": "단계 편집기 그래프", - "aria_playground_chart": "드래그 가능한 감지 임계값이 있는 사이클 전력 곡선", - "aria_power_chart": "전력 소비 그래프", - "aria_spaghetti_chart": "겹쳐진 사이클 전력 곡선", - "aria_sweep_chart": "매개변수 스윕 결과 그래프", - "artifact_anomaly": "이상", - "artifact_high_power": "고전력", - "artifact_interruption": "중단", - "artifact_low_power": "저전력", - "auto_detect": "자동 감지", - "auto_fine_tune_off": "자동 미세 조정 꺼짐", - "auto_fine_tune_on": "자동 미세 조정 켜짐(약 {hour}:00)", - "avg_cost": "평균 비용", - "change": "변경", - "clock_time": "시계 시간", - "cohesion_good": "응집도 {pct}%", - "cohesion_low": "⚠ 낮은 응집도 {pct}%", - "compare_profiles": "프로필과 비교", - "concurrency": "동시 실행 수", - "confidence": "신뢰", - "confidence_threshold": "신뢰도 임계값", - "correct_duration": "올바른 기간(최소, 선택 사항)", - "correct_profile": "올바른 프로필", - "correlation": "상관관계", - "cost": "비용", - "create_new_profile": "+ 새 프로필 만들기…", - "current_phase": "현재 단계", - "curves": "곡선", - "cycle": "사이클", - "cycle_date_display": "주기 날짜 표시", - "cycle_health": "사이클 건강", - "cycle_index": "사이클 번호 →", - "cycles": "사이클", - "cycles_count": "사이클", - "cycles_lc": "사이클", - "dashed": "점선", - "date": "날짜", - "debug_traces": "디버그 추적", - "default": "기본", - "default_access_level": "아래에 나열되지 않은 사용자의 기본 수준", - "default_other": "기본값(기타 장치)", - "default_tab": "패널을 열 때 기본 탭", - "delta": "Δ", - "description": "설명", - "dtw_blend_w": "혼합 가중치", - "dtw_blended": "혼합 점수", - "dtw_ddtw": "DDTW 점수", - "dtw_l1": "L1 점수", - "dtw_matched_profile": "(사이클의 일치 프로필)", - "duration": "지속", - "duration_agreement": "지속 시간 일치도", - "emphasis": "중요성", - "enable_access_control": "사용자별 액세스 제어 활성화", - "energy": "에너지", - "energy_agreement": "에너지 일치도", - "event_timeline": "이벤트 타임라인", - "event_type": "이벤트 유형", - "expected": "예상", - "expected_duration": "예상 기간(분)", - "file_kb": "파일(KB)", - "final_score": "최종 점수", - "from": "시작", - "gap_s": "간격(들)", - "group_name": "그룹 이름", - "head_trim": "헤드 트림(들)", - "health": "건강", - "hide_tabs": "관리자가 아닌 사용자를 위한 탭 숨기기", - "in_use": "사용 중", - "json_data": "JSON 데이터", - "label": "매칭된 프로그램", - "last": "최근", - "last_checked": "마지막 확인:", - "load_from_file": "파일에서 로드", - "mae_score": "MAE 점수", - "manual_duration": "수동 기간(최소, 선택 사항)", - "match": "매칭", - "members": "구성원", - "metric": "지표", - "mode_existing_profile": "기존 프로필에 추가", - "mode_new_profile": "새 프로필 만들기", - "models_fine_tuned": "({count}개 모델{plural} 미세 조정됨)", - "n_classic_suggestions": "{n} 클래식", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n}개 선택됨", - "n_tuning_suggestions": "{n} 조정 제안", - "na": "해당 없음", - "new_profile_name": "새 프로필 이름", - "notes": "메모", - "of": "/", - "outcome": "결과", - "panel_default_tab": "기본 탭", - "panel_language": "패널 언어", - "per_cycle_short": "사이클", - "pg_anti_wrinkle": "구김 방지", - "pg_autofill_tip": "현재 값에서 범위 자동 채우기 ({lo}–{hi})", - "pg_best_value": "찾은 최적 값", - "pg_current_value": "현재 값:", - "pg_drag_hint": "그래프의 선을 드래그하세요", - "pg_dtw": "DTW", - "pg_ev_ending": "종료 중", - "pg_ev_running": "실행 중", - "pg_group_advanced": "예외 상황", - "pg_group_detection": "감지 트리거", - "pg_group_timing": "타이밍 규칙", - "pg_idle": "대기", - "pg_last_run": "마지막 실행: {date}", - "pg_match_score": "매칭 점수", - "pg_pct_of": "{total}개 중 {p}%", - "pg_poor_match": "불량 매칭", - "pg_strong_match": "강한 매칭", - "pg_tile_ambiguous": "모호함", - "pg_tile_ambiguous_tip": "두 프로그램이 거의 동점인 사이클", - "pg_tile_detected": "감지됨", - "pg_tile_detected_tip": "전력이 실행 중으로 등록될 만큼 충분히 오래 시작 임계값을 넘은 사이클", - "pg_tile_matched": "매칭됨", - "pg_tile_matched_tip": "알려진 프로그램에 올바르게 귀속된 사이클", - "pg_time_left": "남은 시간", - "pg_weak_match": "약한 매칭", - "phase_name": "이름", - "phase_timeline": "단계 타임라인", - "power": "전력", - "profile": "윤곽", - "profile_index": "프로필 번호 →", - "profile_name": "프로필 이름", - "program": "프로그램", - "program_tip": "현재 사이클에 매칭되는 프로파일을 재정의합니다. 자동 감지를 통해 통합이 최적의 일치를 자동으로 선택합니다. 자동 감지가 잘못되었거나 실행 중인 프로그램을 알 때 특정 프로그램을 고정하여 강제 일치시킵니다.", - "progress": "진전", - "raw_socket": "원시 소켓", - "read_only": "읽기 전용", - "ref_cycle": "참조 주기(선택 사항)", - "refresh_interval": "새로 고침 간격(초)", - "remaining": "남은", - "reminder_every": "알림 주기 (사이클)", - "remove_label": "- 라벨 제거 -", - "rename_profile": "프로필 이름 바꾸기", - "replay_duration": "재생", - "resulting_profile": "결과 프로필", - "save_mode": "저장 모드", - "score": "점수", - "score_breakdown": "점수 세부 내역", - "seconds_from_start": "시작부터 몇 초", - "select_profile": "프로필 선택", - "setting": "설정", - "settings_a": "설정 A (현재)", - "settings_a_short": "A", - "settings_advanced": "고급", - "settings_b": "설정 B (테스트)", - "settings_b_short": "B", - "settings_basic": "기본", - "settings_detail_level": "설정 상세 수준", - "settings_overrides": "설정 재정의", - "show_debug": "상태 페이지에 실시간 매치 디버그 카드 표시(신뢰도, 모호함, 상위 후보)", - "show_expected": "예상 곡선 오버레이 표시(일치하는 프로필, 주황색)", - "show_raw": "라이브 전력 그래프에 원시 소켓 토글 표시", - "sparkline": "최근 사이클 지속 시간 추세", - "stage2": "2단계 – 핵심 유사도", - "stage3": "3단계 – DTW", - "stage4": "4단계 – 일치도", - "status": "상태", - "tail_trim": "테일 트림(들)", - "timer_auto_pause": "자동 일시중지", - "timer_min": "분", - "timer_msg_placeholder": "메시지(선택사항, {device}/{program}/{minutes})", - "to": "끝", - "ungrouped": "그룹 해제됨", - "unlabelled": "라벨이 지정되지 않음", - "unlabelled_paren": "(라벨 없음)", - "warp_path": "워프 경로", - "input": "입력:", - "start": "시작", - "end": "종료", - "unit_s": "(초)", - "reviewed_on": "{date}에 검토됨", - "unknown": "알 수 없음", - "quality": "품질", - "tags": "태그", - "at": "시각", - "pct_match_confidence": "매칭 신뢰도 {pct}%", - "ha_restarted": "HA 재시작됨", - "from_start": "시작부터", - "to_end": "끝까지", - "click_to_select": "클릭하여 선택", - "envelope": "봉투", - "zoom_hint": "스크롤하여 확대 · 더블클릭하여 초기화", - "loading_paren": "(로드 중…)", - "time_remaining": "~{v} 남음", - "no_duration": "기간 없음", - "duration_avg": "평균 ~{v}분", - "name_placeholder": "(이름)", - "n_shown": ", {n}개 표시됨", - "cycles_title": "사이클 ({n})", - "pg_detecting": "감지 중", - "pg_best_marker": "최적: {v}", - "pg_time_left_model": "남은 시간(모델)", - "pg_time_left_model_tip": "모델이 추정한 남은 시간(단계 추정 + ML 혼합)으로, 고정된 카운트다운이 아닙니다.", - "phase": "단계", - "pg_mode_simulate": "시뮬레이션", - "pg_mode_history": "이력 테스트", - "pg_mode_sweep": "스윕", - "pg_ev_detected": "감지됨", - "pg_ev_match": "매칭 확정", - "pg_ev_match_changed": "매칭 변경", - "pg_ev_ambiguous": "모호함", - "pg_ev_unmatched": "매칭 안 됨", - "pg_ev_notify_start": "시작 알림", - "pg_ev_notify_pre": "거의 완료 알림", - "pg_ev_notify_finish": "완료 알림", - "pg_ev_notify_milestone": "마일스톤 알림", - "pg_ev_notify_held": "알림 보류(방해 금지 시간)", - "pg_ev_finished": "완료", - "pg_ended": "종료됨", - "pg_proj_energy": "예상 에너지", - "pg_alert_overrun": "너무 김", - "pg_alert_underrun": "너무 짧음", - "pg_alert_did_not_finish": "미완료", - "pg_alert_false_end": "여러 사이클로 분할됨", - "pg_alert_unmatched": "매칭 안 됨", - "pg_alert_ambiguous": "모호한 매칭", - "pg_alert_energy": "에너지 이상", - "pg_newly_correct": "새로 정답", - "pg_regressed": "후퇴", - "pg_end_timing_changed": "종료 타이밍 변경", - "pg_vs_current": "현재 대비", - "pg_fixed": "해결됨", - "pg_broke": "문제 발생", - "pg_sweep_param": "매개변수", - "pg_objective": "목표", - "pg_steps": "단계 수", - "pg_stress_group": "대기 상태 종료 테스트", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "대기 레벨 (W)", - "pg_stress_idle_w_desc": "자동 감지된 대기 전력 하한값을 재정의합니다(자동의 경우 빈칸으로 두세요).", - "pg_stress_toggle": "대기 상태 종료 테스트", - "pg_stress_toggle_desc": "녹화 종료 후 기기가 대기 전력 수준에서 계속 작동하는 상황을 시뮬레이션합니다 - WashData가 사이클을 중지하는지, 언제 중지하는지 확인합니다.", - "pg_sweep_2d": "2D 히트맵", - "pg_sweep_param_y": "두 번째 매개변수", - "pg_obj_match": "매칭 정확도", - "pg_obj_endtiming": "종료 타이밍 정확도", - "pg_obj_falseend": "잘못된 종료율", - "pg_obj_overrun": "소요 시간 편차", - "pg_obj_ambiguity": "모호 비율", - "pg_best_combo": "최적 조합", - "pg_mode_optimize": "최적화", - "pg_group_matching": "프로그램 매칭", - "pg_zoom_hint": "더블클릭하여 확대/축소 초기화", - "aria_playground_chart2": "대화형 사이클 전력 그래프: 마우스를 올리면 시간/전력 표시, 스크롤하여 확대/축소, 드래그하여 이동", - "pg_alert_timeout_end": "예측이 아닌 타임아웃으로 종료됨", - "pg_alert_indefinite": "무한정 계속 실행됨", - "pg_alert_stress_cap": "안전 한도에 도달했습니다", - "pg_alert_stress_ok": "대기 상태 종료: 사이클이 중지되었습니다", - "pg_alert_stress_warn": "대기 전력이 정지 임계값을 초과합니다", - "task_pg_history": "기록으로 테스트", - "task_pg_sweep": "최적화", - "task_reprocess": "재처리", - "task_ml_training": "학습", - "eta_secs": "~{n}초 남음", - "eta_mins": "~{n}분 남음", - "pg_recent_runs": "최근 실행", - "pg_load_run": "이 실행 다시 불러오기", - "pg_match_confidence": "매칭 신뢰도", - "pg_envelope_fit": "엔벨로프 적합도", - "pg_envelope_fit_tip": "이 프로필의 저장된 전력 엔벨로프 안에 사이클이 얼마나 잘 들어맞는지 보여줍니다. 매칭 신뢰도와는 다른 관점입니다.", - "n_imported_note": ", {n}개 가져옴", - "enable_online": "온라인 기능 활성화", - "store_brand": "가전제품 브랜드", - "store_model": "가전제품 모델", - "anonymous": "익명", - "rate_quality": "품질 평가", - "rate_n": "별 {n}개", - "approved_only": "승인된 항목만", - "adopt_settings": "설정도 채택", - "flags": "플래그", - "include_phase_map": "페이즈 맵 포함", - "include_settings": "감지 및 매칭 설정 포함", - "show_contributor": "기여자 이름 표시", - "task_pg_detail": "사이클 시뮬레이션", - "task_split": "사이클 분할 중", - "task_trim": "사이클 트리밍 중", - "task_merge": "사이클 병합 중", - "task_rebuild": "엔벨로프 재구성 중", - "cat_profiles": "프로필(프로그램)", - "cat_real_cycles": "사이클(실행 기록)", - "cat_reference_cycles": "참조 사이클(가져옴)", - "cat_custom_phases": "사용자 지정 단계", - "cat_profile_groups": "프로필 그룹", - "cat_settings": "감지 및 인식 설정", - "cat_matching_config": "인식기 조정", - "cat_ml_models": "ML 모델", - "cat_feedback": "피드백 및 검토 라벨", - "cat_suggestions": "제안", - "cat_maintenance_log": "유지관리 로그", - "cat_history_logs": "기록 및 변경 로그", - "cat_lifetime_stats": "누적 합계", - "cycles_short": "사이클", - "import_mode": "결합 방법", - "mode_merge": "병합(내 것 유지)", - "mode_replace": "선택 항목 교체", - "cycle_destination": "가져온 사이클을 어디에 저장할까요?", - "dest_reference": "참조(형태만)", - "dest_real_history": "실제 기록(통계에 집계)", - "conflict_resolution": "이름 충돌", - "conflict_import_copy": "사본으로 가져오기", - "conflict_keep_mine": "내 것 유지", - "conflict_overwrite": "덮어쓰기" - }, - "log": { - "all_levels": "모든 레벨", - "all_devices": "모든 기기", - "all_components": "모든 구성 요소", - "search_ph": "로그 검색…" - }, - "ml": { - "builtin_models": "● 내장 모델 사용", - "fit_fair": "보통", - "fit_good": "좋은", - "fit_slight": "근소한", - "fit_strong": "강한", - "fit_weak": "약한", - "fit_word": "맞다", - "personalized": "● 이 기계에 맞춤화됨", - "better_than_baseline": "기준 추정치보다 {pct}% 향상 ({metric})", - "trend_improving_tip": "이 모델의 적합도가 최근 재확인을 거치며 개선되었습니다.", - "trend_declining_tip": "이 모델의 적합도가 최근 재확인에서 하락했습니다 · 더 많은 사이클을 검토하면 다시 학습하는 데 도움이 될 수 있습니다.", - "trend_steady_tip": "이 모델의 적합도가 최근 재확인에서 거의 꾸준히 유지되었습니다.", - "cap_blurb": { - "end": "사이클이 실제로 완료된 시점 파악", - "live_match": "실행 중인 프로그램을 더 빨리 식별", - "quality": "잘못 감지되었거나 손상된 사이클 찾기", - "remaining_time": "남은 시간 예측", - "total_energy": "총 에너지와 비용 예측" - }, - "cap_label": { - "end": "사이클 종료 감지", - "live_match": "프로그램 매칭", - "quality": "사이클 품질 검사", - "remaining_time": "남은 시간 추정", - "total_energy": "에너지 추정" - }, - "metric_auc": "검증 데이터 기준 AUC {auc}", - "metric_mae": "오차 {model} vs 기준선 {baseline}" - }, - "modal": { - "auto_label": "자동 라벨 주기", - "correct_feedback": "올바른 피드백", - "create_profile": "프로필 만들기", - "cycle": "주기", - "edit_group": "프로필 그룹 편집", - "edit_phase": "단계 편집", - "import_config": "구성 가져오기", - "label_cycle": "라벨주기", - "merge_cycles": "{n} 사이클 병합", - "new_group": "새 프로필 그룹", - "new_phase": "새로운 단계", - "process_history_msg": "매칭을 재실행하고, 제안을 새로 고치고, ML을 재훈련하고(활성화된 경우), 저장된 모든 사이클의 사이클 상태를 재계산합니다. 시간이 걸릴 수 있습니다.", - "process_history_ok": "처리", - "process_history_title": "기록 처리", - "process_recording": "프로세스 기록", - "delete_maintenance_msg": "이 유지보수 기록을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", - "delete_maintenance_title": "유지보수 이벤트 삭제", - "relabel_cycles": "{count}개 사이클 다시 라벨 지정", - "delete_automation_title": "자동화 삭제", - "delete_automation_msg": "Home Assistant에서 자동화 \"{name}\"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", - "remove_legacy_title": "레거시 작업 제거", - "remove_legacy_msg": "레거시 맞춤 작업을 제거하시겠습니까? 사이클 이벤트에서 더 이상 실행되지 않습니다. 이 작업은 패널에서 취소할 수 없습니다.", - "discard_recording_title": "녹음 삭제", - "discard_recording_msg": "저장된 녹음을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", - "dismiss_all_title": "모든 피드백 무시", - "dismiss_all_msg": "보류 중인 피드백 요청 {count}건을 모두 무시하시겠습니까?", - "dismiss_all_ok": "모두 무시", - "delete_phase_title": "단계 삭제", - "delete_phase_msg": "단계 \"{name}\"을(를) 삭제하시겠습니까?", - "clear_debug_title": "디버그 데이터 지우기", - "clear_debug_msg": "저장된 모든 디버그 추적을 삭제하시겠습니까?", - "wipe_all_title": "모든 데이터 지우기", - "wipe_all_msg": "⚠️ 모든 사이클과 프로필이 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.", - "wipe_all_ok": "전부 지우기", - "force_stop_title": "사이클 강제 정지", - "force_stop_msg": "지금 실행 중인 사이클을 강제 정지하시겠습니까? 사이클은 중단됨으로 저장됩니다.", - "store_import": "참조 주기 가져오기", - "store_share": "커뮤니티 스토어에 공유", - "store_share_device": "이 기기 공유", - "export_select": "내보내기 - 데이터 선택", - "import_wizard": "가져오기 - 데이터 선택" - }, - "msg": { - "appliance_monitor": "가전제품 모니터", - "artifact_dip_detail": "일반 전력 범위 아래로 약 {n}초 동안 내려갔습니다.", - "artifact_footer": "위 그래프에 강조표시되어 있습니다. 이는 일시적인 아티팩트(예: 사이클 중간에 문이 열림)이며 반드시 문제가 되는 것은 아닙니다.", - "artifact_header": "이 주기 동안 {n}개의 이상 현상이 감지되었습니다.", - "artifact_pause_detail": "전력이 약 {n}초 동안 거의 0으로 떨어진 후 재개되었습니다. 사이클 도중 문이 열리거나 일시 정지된 것으로 보입니다.", - "artifact_spike_detail": "일반 전력 범위 위로 약 {n}초 동안 나타났습니다.", - "auto_label_intro": "일치 신뢰도가 임계값을 클리어하는 레이블이 없는 주기에 프로필을 할당합니다.", - "automations_intro": "WashData는 {start} / {end} 이벤트를 발생시키고 엔티티를 노출하므로, 알림과 동작은 일반 Home Assistant 자동화로 구축하는 것이 가장 좋습니다. 이 기기를 사용하는 자동화가 아래에 표시됩니다.", - "cleanup_intro": "라벨이 붙은 모든 사이클이 중첩됩니다. 이상값을 선택하고 삭제하여 프로필을 정리하세요.", - "clear_debug_hint": "저장된 디버그 데이터를 제거하여 여유 공간을 확보하세요.", - "collecting_data": "데이터 수집 중입니다. 미세 조정을 시작하려면 {need}번의 사이클{plural}이 더 필요합니다({current}/{min})。", - "compare_overlay_profiles": "오버레이 프로필(희미함)", - "compare_profiles_tip": "위 차트에 다른 프로필 봉투를 겹쳐서 어느 것이 이 주기에 가장 적합한지 확인하세요.", - "compare_selected_cycles": "선택한 주기(단색) – 표시/숨기기", - "consider_new_profile": "새 프로필을 만드는 것을 고려해 보세요.", - "coverage_gap": "최근 주기에 일치하는 프로필이 없습니다(지난 30개 중 {pct}%).", - "coverage_gap_similar_cycles": "유사한 미라벨 사이클 {count}개를 발견했습니다 – 프로필을 만들어 매칭을 시작하세요.", - "cycles_deleted": "{count}개 사이클이 삭제되었습니다", - "enough_data": "학습할 충분한 데이터가 있습니다({current}/{min}사이클)。", - "export_description": "JSON으로 내보낼 프로필, 사이클, 설정 등을 정확히 선택하거나, 파일을 분석하여 원하는 부분만 가져올 수 있습니다.", - "feedback_cycles_pending": "검토가 필요한 사이클 {n}개{s}", - "feedback_prompt": "그것이 옳았는지 확인하고, 프로그램을 수정하거나, 무시하십시오.", - "feedback_relabel_hint": "이 사이클을 다시 라벨 지정하면 이것도 해결됩니다.", - "filter_by_profile": "프로필로 필터링…", - "group_modal_help": "온도/회전이 다른 동일한 모양의 프로그램을 그룹화합니다(기간은 다를 수 있음). 매칭은 그룹을 하나의 후보로 평가한 다음 가장 적합한 멤버를 선택합니다. 최소 2개를 선택하세요. 오버레이는 얼마나 유사한지 보여줍니다.", - "group_not_cohesive": "이러한 프로필은 안정적으로 그룹화할 만큼 유사하지 않으므로 일치는 이상값을 제거하거나 그룹을 분할할 때까지 프로필을 개별적으로 처리합니다.", - "group_preview_hint": "2명 이상의 멤버를 선택하여 전력 곡선을 미리 보고 비교하세요.", - "import_intro": "내보낸 파일을 로드하거나 아래에 JSON 페이로드를 붙여넣으세요.", - "legacy_actions_title": "{count} 레거시 맞춤 작업이 아직 실행 중입니다.", - "live_chart_loading": "판독값이 도착하면 실시간 전력 차트가 나타납니다.", - "loading": "로드 중…", - "loading_curve": "곡선 로드 중…", - "loading_settings": "설정 로드 중…", - "log_buffer_hint": "최신 항목부터 · 다시 시작한 이후 마지막 500개의 ha_washdata 레코드를 버퍼링합니다. · 크기를 조정하려면 아래쪽 가장자리를 드래그합니다.", - "maintenance_advisory": "지속 시간/에너지가 늘어나면 기기 유지 관리(예: 석회질 제거, 필터 청소)가 필요함을 나타낼 수 있습니다.", - "maintenance_due": "유지보수 예정: {items}", - "maintenance_intro": "이 가전에 수행한 정비를 기록하면 각 작업의 다음 예정 시기에 알림을 받습니다.", - "maintenance_load_error": "유지보수 데이터를 불러올 수 없습니다: {error}", - "maintenance_requires_access": "유지 관리 및 내보내기/가져오기에는 전체 액세스 권한이 필요합니다.", - "manual_duration_hint": "남은 시간 추정에 사용되는 프로필의 평균/예상 주기 길이입니다. 설정하려면 편집하세요. 변경하지 않고 그대로 두면 현재 값이 유지됩니다.", - "matching_tuning_intro": "학습할 때 WashData는 프로그램 일치가 모양, 지속 시간 및 에너지에 얼마나 큰 영향을 미치는지 조정합니다.", - "merge_intro": "선택한 사이클이 하나로 결합됩니다(연대순, 간격이 0W로 채워짐). 결과 프로필을 선택합니다.", - "ml_intro": "WashData는 즉시 사용 가능한 스마트 모델과 함께 제공됩니다.", - "ml_learned_intro": "이 기계에 맞게 미세 조정된 모델입니다.", - "ml_loading": "ML 로드 중…", - "ml_settings_intro": "두 개의 독립적인 스위치: 하나는 사이클이 실행되는 동안 모델을 적용하고 다른 하나는 WashData가 시간이 지남에 따라 기계에 맞게 미세 조정할 수 있도록 합니다.", - "name_first_program": "충분한 사이클이 모였습니다 – 첫 프로그램에 이름을 지정하여 일치를 시작하세요.", - "near_duplicate_cluster": "거의 중복된 프로필 클러스터가 감지되었습니다. 그룹화를 통해 일치하는 항목을 유사 항목(예: 서로 다른 온도/회전의 동일한 프로그램) 중에서 안정적으로 선택할 수 있습니다.", - "no_cycles_match": "현재 필터와 일치하는 사이클이 없습니다.", - "no_cycles_profile": "이 프로필에는 사이클이 없습니다.", - "no_cycles_selected": "먼저 사이클을 하나 이상 선택하세요.", - "no_cycles_yet": "아직 기록된 사이클이 없습니다.", - "no_device_selected": "선택한 장치가 없습니다.", - "no_devices": "아직 구성된 WashData 장치가 없습니다.", - "no_envelope": "아직 봉투가 없습니다. 라벨링 주기 후에 재구축하세요.", - "no_envelope_overlay": "오버레이할 수 있는 봉투가 없습니다.", - "no_fine_tuned": "아직 세부 조정된 사항은 없습니다. WashData는 내장 모델을 사용하고 있습니다.", - "no_logs": "아직 버퍼링된 로그 레코드가 없습니다.", - "no_maintenance": "아직 기록된 유지보수가 없습니다.", - "no_match_yet": "아직 일치 시도가 없습니다. 이는 실행 주기 중에 채워집니다.", - "no_other_users": "다른 홈어시스턴트 사용자를 찾을 수 없습니다.", - "no_phases": "정의된 단계가 없습니다.", - "no_phases_assigned": "할당된 단계가 없습니다.", - "no_profiles_compare": "비교할 프로필이 없습니다.", - "no_profiles_overlay": "오버레이할 프로필이 없습니다.", - "no_profiles_yet": "아직 프로필이 없습니다. 레이블이 지정된 주기에서 하나를 만듭니다.", - "no_profiles_yet_short": "아직 프로필이 없습니다.", - "no_settings_match": "\"{q}\"과(와) 일치하는 설정이 없습니다.", - "no_split_points": "아직 분할 지점이 없습니다.", - "no_suggestions": "활성 제안이 없습니다.", - "notify_services_hint": "{entity} 서비스 ID를 사용하세요(여러 개는 쉼표로 구분)。템플릿 변수:{vars}。", - "old_actions_warning": "이전 작업 편집기로 구성되었습니다(현재 제거됨). 사이클 이벤트에서는 여전히 실행되지만 여기에서는 더 이상 편집할 수 없습니다. 일반 자동화로 변환하거나 제거하십시오.", - "onboarding_progress": "{n} / 3개 사이클 관찰됨", - "onboarding_watching": "가전을 평소처럼 사용하세요 – WashData가 관찰하고 있습니다. 3개 사이클 후 프로그램 일치가 시작됩니다.", - "pending_feedback": "보류 중인 감지 피드백", - "performance_trend": "실적 추세({n}주기)", - "pg_analysis_empty": "매칭 분석을 보려면 사이클을 불러오세요.", - "pg_apply_confirm": "최적 값 적용: {label} = {value}?", - "pg_canvas_empty": "위에서 사이클을 선택한 다음 불러오기를 눌러 전력 트레이스를 확인하세요.", - "pg_chart_caption": "{param} 값에 따른 감지/매칭률", - "pg_match_rate": "{total}개 사이클에서 {pct}% 매칭률", - "pg_restart_note": "시뮬레이션 도구를 활성화하려면 Home Assistant를 다시 시작하세요.", - "pg_sim_progress": "{done} / {total} 사이클", - "pg_starting": "시작 중…", - "pg_stress_synthetic": "대기 시뮬레이션이 여기서 시작됩니다", - "pg_sweep_intro": "{param}이(가) 달랐다면 어땠을까요? 가장 많은 사이클이 올바르게 매칭되는 설정을 찾기 위해 최근 {cycles}개 사이클에서 {steps}개 값을 테스트합니다.", - "pg_sweep_step": "단계 {done} / {total}", - "pg_undetected": "{n}개 사이클{s} 미감지", - "pg_verdict_bad": "주의 필요: 많은 사이클이 감지되지 않고 있습니다.", - "pg_verdict_good": "잘 조정됨: 대부분의 사이클이 올바르게 식별되고 매칭됩니다.", - "pg_verdict_ok": "양호: 일부 사이클을 놓쳤습니다. 시작 임계값을 낮춰 보세요.", - "phase_catalog_intro": "주기의 명명된 부분(세탁 전, 가열, 탈수…). 제어판에서 프로필에 할당합니다.", - "phase_ranges_intro": "평균 곡선에 중첩된 단계 범위(사이클 시작 후 분). 실시간으로 미리 보려면 값을 편집하세요.", - "playground_intro": "과거 사이클을 다른 설정으로 재생하고, 두 구성을 나란히 비교하며, 사이클이 프로필에 어떻게 정렬되는지 살펴볼 수 있는 안전한 샌드박스입니다. 명시적으로 적용하기 전까지 여기서의 작업은 실제 데이터를 변경하지 않습니다.", - "playground_needs_restart": "플레이그라운드 도구를 활성화하려면 Home Assistant를 다시 시작하세요.", - "preferences_admin": "환경 설정, 패널 및 액세스 제어", - "preferences_adv": "환경설정", - "prefs_personal": "이는 홈어시스턴트 계정에만 적용됩니다.", - "process_history_hint": "저장된 모든 사이클에 대해 매칭을 재실행하고, 튜닝 제안을 새로 고치고, ML 모델을 재훈련하고(활성화된 경우), 사이클 상태를 재계산합니다. 일괄 검토 후 실행하세요.", - "profile_deleted": "프로필이 삭제되었습니다", - "profile_poor_health_detail": "이 프로필에 할당된 주기의 모양이 일관되지 않거나 신뢰도가 낮습니다. 봉투를 재구성하거나 라벨이 붙은 주기를 검토하는 것을 고려하십시오.", - "profiles_intro": "통계, 단계 및 정리를 보려면 프로필을 클릭하세요. 거의 동일한 프로그램(동일한 모양/기간, 다른 온도 또는 회전)을 그룹화하여 일치하는 프로그램을 안정적으로 선택합니다.", - "rbac_hint": "꺼져 있으면 모든 홈어시스턴트 사용자가 전체 액세스 권한을 갖습니다(기본값). 관리자는 항상 전체 액세스 권한을 가지며 모든 사람을 관리할 수 있습니다.", - "recent_logs": "최근 ha_washdata 기록", - "recording_in_progress": "녹음 진행 중", - "reminders_intro": "마지막 서비스 이후 지정한 사이클 수가 지나면 패널에 알림을 표시합니다. 비워 두거나 0으로 설정하면 알림이 꺼집니다.", - "restart_gap_footer": "그래프에서 강조 표시됩니다. 이 구간에 전력 데이터가 없습니다. 매칭에는 실제 측정값만 사용되었습니다.", - "restart_gap_header": "{n} HA 재시작 공백 (이 사이클 중)", - "restart_gap_item": "{dur} 공백", - "review_confirm_help": "이 주기가 올바르게 감지되었는지 확인하십시오. 귀하의 리뷰는 귀하의 기계에서 모델을 훈련시킵니다. 더 많은 주기를 확인할수록 더 나은 일치 및 상태 점수를 얻을 수 있습니다. 빠른 좋음/나쁨이면 충분합니다.", - "review_in_settings": "설정에서 검토", - "review_notes_placeholder": "메모(선택사항)", - "review_notes_tip": "자신만의 참조를 위한 자유 텍스트 메모입니다. 일치 또는 훈련에서는 사용되지 않습니다.", - "review_profile_tip": "이 주기에 라벨이 붙은 프로그램입니다. 자동 감지된 프로그램이 잘못된 경우 여기에서 수정하십시오. 라벨링은 향후 주기에 대한 일치를 가르칩니다.", - "review_quality_tip": "이주기가 얼마나 깨끗한 지. 좋음 = 이 프로그램의 교과서 예제; 나쁨 = 감지되었지만 잡음이 많거나 비정형적임; 사용할 수 없음 = 잘못 감지됨(병합, 잘림 또는 허위). 상태 점수와 모델 학습에 허용되는 주기를 결정합니다.", - "review_recorded_tip": "이를 프로그램에 대해 직접 선택한 참조 주기로 표시합니다. 이는 수동으로 기록된 주기와 동일한 역할입니다. 참조 순환은 항상 유지되고 일치하는 템플릿을 시드하며 정리로 인해 삭제되지 않습니다. (이것은 \"황금\"/기록된 플래그입니다. 둘 다 동일합니다.)", - "review_tags_tip": "이 주기에 무엇이 잘못되었는지 설명하는 선택적 플래그이므로 훈련과 정리가 이를 설명할 수 있습니다.", - "review_to_cycles": "사이클 검토 대기열 열기", - "saving_triggers_reload": "저장하면 통합 다시 로드가 트리거됩니다. HA 엔터티는 일시적으로 사용할 수 없는 것으로 표시될 수 있습니다.", - "search_placeholder": "검색 설정…", - "see_recorder": "아래의 녹음기 위젯을 참조하세요", - "setting_changed": "{date}에 {old}에서 {new}(으)로 변경됨", - "settings_basic_note": "필수 설정만 표시하고 있습니다. 전체 목록을 보려면 고급으로 전환하세요.", - "shape_drift_advisory": "⚠ 형태 변화 감지됨", - "shape_drift_detail": "이 프로필의 전력 패턴이 시간이 지남에 따라 변화했습니다 – 가전제품 마모 또는 유지보수가 필요할 수 있습니다 (예: 스케일 제거, 필터 청소).", - "show_all_settings": "모든 설정 표시", - "showing_suggestions": "제안사항과 함께 {count} 설정을 표시합니다.", - "split_intro": "그래프를 클릭하여 분할 지점을 추가 또는 제거하거나 유휴 간격으로 자동 감지합니다. 각 결과 세그먼트는 자체 프로필을 얻을 수 있습니다.", - "storage_diagnostics": "스토리지 통계, 유지 관리, 내보내기/가져오기", - "sug_staged": "{key} = {val} 설정됨. 저장하면 적용됩니다.", - "toast_auto_detect_enabled": "자동 감지 활성화됨", - "toast_auto_label_complete": "자동 레이블 지정 완료", - "toast_auto_label_failed": "자동 레이블 지정 실패: {error}", - "toast_automation_failed": "자동화를 생성할 수 없습니다: {error}", - "toast_automation_migrated": "작업이 자동화로 이전됨; 편집기 열기", - "toast_convert_failed": "변환 실패: {error}", - "toast_create_failed": "생성 실패: {error}", - "toast_delete_failed": "삭제 실패: {error}", - "toast_error": "오류: {error}", - "toast_failed": "실패: {error}", - "toast_force_stop_failed": "강제 중지 실패: {error}", - "toast_name_required": "이름이 필요합니다", - "toast_no_automation": "여기서는 자동화를 생성할 수 없습니다", - "toast_profile_name_required": "프로필 이름이 필요합니다", - "toast_program_set": "프로그램이 설정됨: {program}", - "toast_rebuild_failed": "재구성 실패: {error}", - "toast_resume_failed": "재개 실패: {error}", - "toast_revert_failed": "되돌리기 실패: {error}", - "toast_reverted": "{key}을(를) 되돌렸습니다", - "toast_save_failed": "저장 실패: {error}", - "trend_duration_longer": "기간이 길어지는 추세({pct}%/주기) – 최근 평균 {avg}", - "trend_duration_shorter": "기간이 짧아지는 추세({pct}%/주기) – 최근 평균 {avg}", - "trend_energy_down": "에너지 감소 추세({pct}%/주기)", - "trend_energy_up": "에너지 상승 추세({pct}%/주기) – 최근 평균 {avg}", - "trim_intro": "빨간색 핸들을 드래그하거나 값을 입력합니다. 창 밖의 모든 것이 제거됩니다.", - "tuning_suggestions_available": "관찰된 주기에서 사용할 수 있는 {count} 조정 제안입니다. 관련 필드 옆에 표시됩니다.", - "unsure_detected_prefix": "WashData가 감지되었는지 확실하지 않습니다.", - "updated": "업데이트됨", - "warmup_badge": "학습 중 ({done}/{needed} 사이클)", - "warmup_detail": "이 프로필은 자동 매칭이 시작되기 전에 {needed}개의 라벨이 지정된 사이클이 필요합니다. 확인된 사이클마다 학습에 도움이 됩니다.", - "wipe_history_warning": "모든 사이클과 프로필을 영구적으로 삭제합니다. 취소할 수 없습니다.", - "compare_overlay_tip": "학습된 프로필 봉투를 겹쳐서 각 사이클이 어떤 프로그램과 유사한지 확인하세요.", - "duration_trend_up_tip": "지속 시간 증가 ({pct}%/사이클)", - "duration_trend_down_tip": "지속 시간 감소 ({pct}%/사이클)", - "energy_trend_up_tip": "에너지 증가 ({pct}%/사이클)", - "energy_trend_down_tip": "에너지 감소 ({pct}%/사이클)", - "performance_trending": "실적 추세", - "pg_select_cycle_hint": "사이클을 선택하고 ↺를 클릭하여 불러오세요", - "pg_sweep_progress": "단계 {done} / {total}", - "pg_analysis_hint": "사이클을 선택하고 ↺를 클릭하여 분석을 불러오세요.", - "diagnostics_load_failed": "진단을 불러올 수 없습니다: {error}", - "manual_duration_ref_hint": "참조 주기가 선택되지 않았을 때만 사용됩니다. 참조 주기는 자체 길이에 따라 기간을 설정합니다.", - "toast_convert_rolled_back": "변환에 실패하여 롤백되었습니다(남은 자동화 없음): {error}", - "toast_convert_orphan": "자동화는 생성되었지만 이전 작업 삭제에 실패했습니다. 다시 시도하지 마세요. 중복 자동화를 방지하려면 이전 작업을 수동으로 제거하세요.", - "advisory_duration_trend_up": "'{name}' 사이클이 점점 길어지고 있습니다(사이클당 약 +{pct}%). 기기 동작이 바뀌었다면 이 프로필을 다시 기록하거나 재구성하세요.", - "advisory_energy_trend_up": "'{name}'의 에너지 사용량이 점점 늘고 있습니다(사이클당 약 +{pct}%) - 예상 밖이라면 기기를 점검해 보세요.", - "advisory_poor_health": "'{name}'의 적합도 점수가 낮습니다 - 최근 사이클의 편차가 크거나 매칭이 약합니다. 매칭과 시간 추정의 정확도를 유지하려면 사이클을 검토하거나 프로필을 다시 기록하세요.", - "advisory_shape_drift": "'{name}'이(가) 원래 전력 파형에서 크게 벗어났습니다. 시간이 지나며 기기 동작이 변했을 수 있습니다(예: 물때, 마모). 최근 사이클로 이 프로필을 다시 기록하는 것을 고려하세요.", - "advisory_shape_drift_corr": "'{name}'이(가) 원래 전력 파형에서 크게 벗어났습니다(상관관계 {corr}). 시간이 지나며 기기 동작이 변했을 수 있습니다(예: 물때, 마모). 최근 사이클로 이 프로필을 다시 기록하는 것을 고려하세요.", - "pg_no_alerts": "이번 실행에서 문제가 감지되지 않았습니다.", - "pg_override_active": "편집한 설정을 현재 설정과 비교하여 사용 중", - "pg_history_intro": "최근 사이클을 실제 감지기와 매처로 다시 재생합니다. 여기에서 전후 비교를 보려면 먼저 시뮬레이션에서 감지 설정을 편집하세요.", - "pg_history_empty": "실행을 눌러 사이클을 다시 재생하세요.", - "pg_history_summary": "{detected}/{total} 감지됨 · {correct} 올바르게 매칭", - "pg_sweep_no_metric": "이 목표를 평가하기에 데이터가 부족합니다.", - "pg_sweep_intro2": "최근 사이클 전체에서 목표를 가장 잘 충족하는 설정을 찾습니다. 적용하기 전까지는 아무것도 변경되지 않습니다.", - "pg_running_history": "사이클을 다시 재생하는 중…", - "pg_running_sweep": "전체 사이클에서 값을 테스트하는 중…", - "pg_row_load_hint": "이 사이클을 위 그래프에 불러오기", - "pg_history_intro2": "위 설정으로 최근 사이클을 실제 감지기와 매처를 통해 다시 재생합니다. 행을 클릭하면 해당 사이클을 그래프에 불러옵니다. 설정을 변경하면 변경 전후 비교를 확인할 수 있습니다.", - "pg_simulating": "사이클을 시뮬레이션하는 중…", - "pg_canvas_empty2": "위에서 사이클을 선택하고 실행을 눌러 시뮬레이션하세요. 그런 다음 마우스를 올려 값을 확인하고, 스크롤하여 확대/축소하고, 드래그하여 이동할 수 있습니다.", - "pg_apply_settings_confirm": "이 {n}개 설정을 이 기기에 저장하시겠습니까? {list}", - "pg_stress_terminated_detail": "약 {idle}W 대기 상태로 안정되었습니다 -- {h}시간 {m}분 후 {reason}(으)로 인해 사이클이 종료되었습니다.", - "pg_stress_above_threshold_detail": "대기 전력 약 {idle}W가 유효 정지 임계값 ({stop}W) 이상입니다 -- 사이클이 한 번도 조용한 상태로 인식되지 않았습니다. 해결하려면 stop_threshold_w 값을 높이세요.", - "pg_stress_hit_cap_detail": "사이클이 멈추지 않고 {h}시간 {m}분 동안 실행되었습니다 -- 안전 한도에 의해 강제 중지되었습니다. 대기 전력 {idle}W 대 정지 임계값 {stop}W.", - "no_logs_match": "이 필터와 일치하는 로그 기록이 없습니다.", - "pg_analysis_hint2": "사이클을 선택하고 실행을 누르면 매칭 분석이 로드됩니다.", - "pg_analysis_empty2": "실행을 누르면 매칭 분석이 표시됩니다.", - "imported_readonly": "커뮤니티 스토어에서 가져왔습니다. 참조 및 매칭용으로 표시됩니다. 통계에는 포함되지 않으며 편집할 수 없습니다.", - "merge_no_imports": "가져온 녹음은 실제 사이클에 병합할 수 없습니다. 병합하려면 선택을 해제하세요.", - "store_enable_hint": "설정에서 온라인 기능을 활성화하면 커뮤니티 참조 주기를 탐색하고 가져올 수 있습니다.", - "online_intro": "다른 WashData 사용자와 참조 주기를 공유하고 다운로드하세요. 모든 온라인 기능은 선택 사항이며 기본적으로 꺼져 있습니다.", - "store_share_intro": "이 참조 주기를 업로드하면 같은 가전제품을 사용하는 다른 사용자가 이용할 수 있습니다. 공개되기 전에 검토를 거칩니다.", - "online_intro_global": "다른 WashData 사용자와 참조 녹음을 탐색하고 공유하며 가전제품 항목을 확인하세요. 하나의 연결이 전체 WashData 통합에 적용됩니다. 가전제품 브랜드와 모델은 '기본 구성'에서 기기별로 설정합니다. 모든 온라인 기능은 선택 사항이며 기본적으로 꺼져 있습니다.", - "online_unavailable": "이 서버에서는 온라인 기능을 사용할 수 없습니다.", - "store_picker_offline": "설정(톱니바퀴)에서 온라인 기능을 활성화하면 커뮤니티 카탈로그에서 선택할 수 있습니다.", - "pick_brand_first": "먼저 가전제품 브랜드를 선택하세요.", - "model_not_found": "아직 카탈로그에 없습니다.", - "connect_to_confirm": "확인하거나 평가하려면 설정(톱니바퀴)에서 연결하세요.", - "adopt_settings_hint": "이 기기의 감지 및 매칭 임계값을 공유된 것으로 덮어씁니다. 알림, 엔티티, 에너지 가격은 변경되지 않습니다.", - "include_settings_hint": "이 기기의 인식 및 매칭 임계값을 공유합니다(알림, 엔티티 또는 에너지 가격 제외). 채택자가 적용 여부를 선택합니다.", - "onboard_download": "새 기기인가요? 같은 가전제품을 가진 다른 WashData 사용자의 완성된 설정(프로그램, 참조 사이클, 페이즈)을 채택하세요.", - "share_consent": "이 사이클들이 중단 없이 정상적으로 완료되었음을 확인합니다", - "share_device_none": "아직 공유 가능한 사이클이 없습니다. 먼저 사이클 탭에서 기록되거나 수동으로 선택한 사이클을 참조 사이클(⭐)로 표시하세요.", - "share_guideline_naming": "각 프로파일의 이름을 기기의 다이얼이나 디스플레이에 표시된 대로 정확히 지정하세요(예: 'Cotton 40', 'Eco 60').", - "share_guideline_quality": "정상적으로 완료된 사이클만 공유하세요 -- 사이클 중간 중단, 문 열림 이벤트 또는 전력 이상이 없는 것만 공유합니다.", - "share_guideline_review": "업로드는 검토 중으로 시작되며 충분한 커뮤니티 멤버가 확인하면 공개됩니다.", - "share_guidelines_title": "공유하기 전에", - "store_download_device_intro": "공유된 모든 프로그램과 해당 참조 사이클을 기기에 채택합니다. 직접 기록한 사이클과 통계는 영향을 받지 않습니다.", - "store_share_device_intro": "선택한 참조 사이클과 함께 {brand} {model}을 업로드합니다. 같은 가전제품을 가진 다른 사용자가 프로그램을 채택할 수 있습니다. 항목은 공개 전에 검토됩니다.", - "share_profile_no_cycles": "참조 사이클 없음 -- 이 프로파일을 포함하려면 사이클 탭에서 사이클을 ⭐로 표시하세요", - "advisory_phase_inconsistent": "'{name}'은(는) 서로 다른 프로그램이나 온도가 섞여 있는 것 같습니다. 사이클마다 가열 시간이 크게 다릅니다. 온도별 등으로 별도의 프로필로 나누면 매칭과 시간 추정이 개선됩니다.", - "advisory_phase_inconsistent_title": "⚠ 프로그램이 섞였을 수 있음", - "export_select_intro": "포함할 항목을 정확히 선택하세요. 사이클 없이 프로필만 선택해도 인식 가능한 프로그램은 내보내집니다(학습된 형태도 함께 이동합니다).", - "import_analyze_hint": "내보낸 파일을 불러오거나 해당 JSON을 붙여넣으세요. WashData가 이를 분석하여 변경 전에 가져올 수 있는 항목을 정확히 보여줍니다.", - "analyzing": "분석 중…", - "device_type_mismatch_warn": "이 내보내기는 다른 기기 유형에서 생성되었습니다({src} 대 {local}). 프로그램과 사이클은 참조 데이터로 가져올 수 있지만, 기기별 설정과 실제 기록 가져오기는 비활성화됩니다.", - "merge_hint": "가져온 항목이 추가되며 로컬 데이터는 손실되지 않습니다. 이름 충돌은 아래에서 해결합니다.", - "replace_warn": "선택한 각 범주는 삭제되고 파일 내용으로 교체됩니다. 선택하지 않은 범주는 그대로 유지됩니다.", - "dest_reference_hint": "가져온 사이클은 프로그램 인식만 개선하며 사용량/에너지 통계에는 영향을 주지 않습니다.", - "dest_real_history_hint": "가져온 사이클은 이 기기 자체의 기록으로 집계되어 에너지/사용량 통계에 반영됩니다. 기기 하나를 새 설치 환경으로 옮길 때 사용하세요." - }, - "pg_desc": { - "completion_min_seconds": "실제 사이클로 인정되는 최단 실행", - "end_repeat_count": "종료 전 연속되는 낮은 측정값 횟수", - "interrupted_min_seconds": "짧은 사이클은 중단으로 표시", - "min_off_gap": "두 사이클을 구분하는 데 필요한 간격", - "off_delay": "사이클 종료 전 저전력 지속 초", - "start_duration_threshold": "시작 확정을 위한 임계값 초과 초", - "start_threshold_w": "시작으로 간주할 최소 와트", - "stop_threshold_w": "이 값 미만이면 기기가 꺼진 것으로 간주", - "anti_wrinkle_enabled": "메인 단계 이후의 회전 펄스를 새 사이클로 인식하지 않고 흡수", - "anti_wrinkle_exit_power": "구김 방지가 활성 상태를 유지하려면 펄스 사이 전력이 이 값 아래로 떨어져야 함", - "anti_wrinkle_idle_timeout": "구김 방지가 끝나기 전 두 회전 펄스 사이에 허용되는 정지 시간", - "anti_wrinkle_max_duration": "이보다 긴 펄스는 구김 방지를 끝내고 새 사이클을 시작", - "anti_wrinkle_max_power": "이보다 높은 펄스는 구김 방지를 끝내고 새 사이클을 시작", - "dtw_bandwidth": "Stage 3: Sakoe-Chiba 워프 대역폭 (0 = DTW 비활성; 기본값 0.2 = 사이클 길이의 20%)", - "corr_weight": "Stage 2: 곡선 형태(상관관계)와 전력 수준(MAE) 사이의 균형; 기본값 0.45", - "duration_weight": "Stage 4: 실행 시간 일치가 최종 점수에 미치는 영향(기본값 0.22)", - "energy_weight": "Stage 4: 에너지 일치가 최종 점수에 미치는 영향(기본값 0.22)", - "profile_match_min_duration_ratio": "Stage 1: 프로파일 지속 시간의 분수로서 최소 사이클 길이; 기본값 0.1 (10%)", - "profile_match_max_duration_ratio": "Stage 1: 프로파일 지속 시간의 분수로서 최대 사이클 길이; 기본값 1.5 (150%)", - "keep_min_score": "Stage 2: 경쟁에 남기 위한 최소 점수; 기본값 0.1은 약한 후보도 허용하며, 이후 단계에서 최선을 선택", - "dtw_blend": "Stage 3: 0 = 핵심 점수만, 1 = DTW 점수만, 0.5 = 동등 혼합(기본값)", - "dtw_ensemble_w": "Stage 3 (앙상블 모드): 스케일 L1 대 도함수 DTW 가중치; 기본값 0.7은 수준 인식 방식을 선호", - "dtw_ddtw_scale": "Stage 3: DDTW 반포화 거리; 작을수록 형상에 민감(기본값 30)", - "dtw_refine_top_n": "Stage 3: DTW가 재점수화하는 후보 수; 올바른 프로파일이 4-5위면 7-9로 높임(기본값 5)", - "duration_scale": "Stage 4: 지속 시간 일치 점수가 반으로 줄어드는 로그 비율; 작을수록 엄격한 패널티(기본값 0.175)", - "energy_scale": "Stage 4: 에너지 일치 점수가 반으로 줄어드는 로그 비율; 작을수록 엄격한 패널티(기본값 0.25)" - }, - "phase_desc": { - "anti_crease": "메인 사이클 후 드럼이 간헐적으로 회전하여 의류 구김을 방지합니다.", - "anti_wrinkle": "메인 사이클 후 드럼이 간헐적으로 회전하여 의류 구김을 방지합니다.", - "cool_down": "사이클 종료 근처에서 열 없이 회전합니다.", - "drain_and_switch": "세탁 모드에서 건조 모드로 전환되는 기간입니다.", - "dry": "히터 및/또는 여열을 이용한 건조 단계입니다.", - "drying": "주요 가열 텀블링 기간.", - "heat_up": "완전 건조가 시작되기 전 초기 히터 예열.", - "pre_rinse": "세제 세척 전 초기 스프레이다운.", - "pre_wash": "본 세탁 전 초기 담금 또는 전처리.", - "rinse": "깨끗한 물로 헹구는 단계. 이 단계는 여러 번 반복될 수 있습니다.", - "sanitize": "살균 프로그램을 위한 고온 세척 단계.", - "sensor_check": "건조도를 측정하는 동안 짧은 저전력 일시 중지입니다.", - "soak": "활성 세탁 단계 사이의 낮은 활동 담금 기간.", - "soak_dw": "무거운 토양의 경우 담그는 기간이 길어집니다.", - "spin": "부하에서 수분을 제거하기 위한 고속 추출.", - "spin_wd": "건조 전환 전 고속 추출.", - "wash": "드럼 이동과 선택적인 가열을 포함한 주요 세탁 사이클.", - "wash_dw": "주요세제를 가열하여 세탁합니다." - }, - "placeholder": { - "add": "추가…", - "group_name": "예:면 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "알림 서비스 추가…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "사람 추가…", - "phase_name": "예:예비 세탁", - "profile_name": "예:면 40°C", - "maintenance_notes": "예: 필터 교체, 도어 씰 청소", - "store_brand": "예: Bosch", - "store_model": "예: WAT28401" - }, - "pref": { - "date_absolute": "절대값(예: 7월 2일 14:32)", - "date_relative": "상대 항목(예: 2시간 전)", - "lang_auto": "시스템 기본값({lang})", - "lang_en": "영어", - "use_panel_default": "(패널 기본값)" - }, - "quality": { - "bad": "나쁜", - "good": "좋은", - "unusable": "쓸 수 없는" - }, - "section": { - "anti_wrinkle": { - "intro": "구김 방지 모드는 메인 단계 이후 낮은 전력 텀블 펄스를 감지하고 완료된 사이클에 포함합니다.", - "label": "구김 방지" - }, - "basic": { - "intro": "핵심 식별 정보와 대부분의 설정에 필요한 기본 사항.", - "label": "기본" - }, - "delay": { - "intro": "지연 시작 감지는 기기가 켜져 있지만 사이클이 아직 시작되지 않은 상태를 식별합니다.", - "label": "지연 시작" - }, - "detection": { - "intro": "사이클의 시작, 실행 및 종료 감지 방법.", - "label": "감지" - }, - "matching": { - "intro": "완료된 사이클을 학습된 프로필에 매칭하고 라벨을 지정하는 방법.", - "label": "매칭" - }, - "ml_training": { - "intro": "기기에서 직접 하는 머신러닝 재훈련 일정 및 데이터 설정.", - "label": "ML 훈련" - }, - "notifications": { - "intro": "사이클 이벤트에 대한 알림 시기와 방법.", - "label": "알림" - }, - "timing": { - "intro": "백그라운드 실행 주기, 오프라인 감시, 및 하우스키핑.", - "label": "타이밍과 감시" - }, - "triggers": { - "intro": "선택적 외부 신호: 종료 트리거, 문 센서, 일시 정지 스위치, 꺼내기 알림.", - "label": "트리거와 문" - }, - "phase_eta": { - "label": "남은 시간", - "intro": "사이클 길이가 온도나 탈수에 따라 달라지는 기기를 위한, 단계를 고려한 남은 시간." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "건조기가 주요 가열 단계 후에 방출하는 짧은 저전력 텀블 펄스를 인식하고 이를 새 주기로 읽는 대신 완료된 주기에 연결해 두십시오.", - "label": "구김 방지 감지 활성화" - }, - "anti_wrinkle_exit_power": { - "doc": "주름 방지 모드가 활성 상태를 유지하려면 펄스 사이에 전력이 이 값 아래로 낮아져야 합니다.", - "label": "종료 전력 임계값" - }, - "anti_wrinkle_idle_timeout": { - "label": "최대 펄스 간격", - "doc": "구김 방지 모드가 종료되기 전에 기기가 두 회전 펄스 사이에서 정지 상태로 있을 수 있는 시간입니다. 건조기가 펄스 사이에 남기는 가장 긴 간격보다 높게 설정하십시오. 그렇지 않으면 이후의 모든 펄스가 잘못된 시작으로 인식됩니다." - }, - "anti_wrinkle_max_duration": { - "doc": "이보다 긴 펄스는 주름 방지 텀블이 아닌 실제 주기로 간주됩니다.", - "label": "최대 지속 시간" - }, - "anti_wrinkle_max_power": { - "doc": "이 전력 이상의 펄스는 주름 방지 텀블이 아닌 실제 새로운 주기로 간주됩니다. 회전 펄스 전력 바로 위에 설정하십시오.", - "label": "구김 방지 최대 전력" - }, - "auto_label_confidence": { - "doc": "사이클 종료 시 일치 점수가 이 이상인 경우 확인 메시지 없이 프로그램에 자동으로 레이블이 지정됩니다. 자동 라벨링 전에 더 높은 확실성을 요구하려면 이 값을 높이세요. 더 많이 자동화하려면 낮추세요. 아래의 학습 자신감과 함께 작동합니다.", - "label": "자동 라벨 신뢰도" - }, - "auto_maintenance": { - "doc": "야간 관리 실행: 프로필 봉투 재구축, 주기 상태 재계산, 디버그 추적 정리 및 최신 주기 유지.", - "label": "자동 유지 관리 (야간 정리)" - }, - "completion_min_seconds": { - "doc": "이보다 짧은 주기는 고스트 주기(테스트 실행, 양말 추가를 위해 문 열기)로 폐기됩니다.", - "label": "사이클 최소 시간" - }, - "delay_confirm_seconds": { - "doc": "어플라이언스가 실행되지 않고 시작 대기 중인 것으로 처리되기 전에 전원은 오랫동안 대기 대역에 유지되어야 합니다.", - "label": "확인 초" - }, - "delay_start_detect_enabled": { - "doc": "어플라이언스의 전원이 켜져 있고 대기 중(지연된 시작/대기)이지만 주기가 시작되지 않은 경우를 감지하므로 대기 그리기가 실행 중인 주기로 착각되지 않습니다.", - "label": "지연 시작 감지 활성화" - }, - "delay_timeout_hours": { - "doc": "이 많은 시간이 지나면 지연된 시작 모드에서 대기하는 것을 중지하고 유휴 상태로 돌아가므로 전원이 켜져 있지만 시작되지 않은 기계는 영원히 기다리지 않습니다.", - "label": "타임아웃 시간" - }, - "device_type": { - "doc": "가전제품 등급. 해당 기기 유형에 맞게 조정된 합리적인 감지 기본값(임계값, 오프 지연, 종료 처리)을 설정합니다. 장치가 원래 잘못된 유형으로 설정된 경우에만 변경하십시오.", - "label": "기기 유형" - }, - "door_sensor_entity": { - "doc": "옵션 도어 바이너리 센서. 사이클 후 기기가 열리거나 내려지는 시기를 감지하는 데 사용됩니다.", - "label": "문 센서 엔티티" - }, - "duration_tolerance": { - "doc": "남은 추정 시간에 대한 허용 오차(학습 피드백, 일치하지 않음). 실제 기간이 추정치의 +/-X% 내에 있으면 좋은 일치로 간주됩니다.", - "label": "추정 허용 오차" - }, - "enable_ml_models": { - "doc": "사이클이 실행되는 동안 모델이 실시간 결과를 개선하도록 하십시오. 즉, 보다 안정적인 남은 시간 및 에너지/비용 추정, 종료 감지 시 조기 중지 방지 가드(완료를 지연시킬 수만 있고 일찍 끝나지 않으며 제한됨)입니다. 사용 가능한 경우 미세 조정된 모델을 사용하고, 그렇지 않은 경우에는 내장된 모델을 사용합니다. 꺼짐 = 고전적인 전력 기반 논리만(여전히 안정적임)", - "label": "사이클 중 스마트 모델 적용" - }, - "end_energy_threshold": { - "doc": "꺼짐 지연 카운트다운 동안 축적된 에너지(와트 x 시간)가 이 임계값과 비교됩니다. 초과하면 카운트다운이 재설정됩니다. 주름 방지 텀블러와 식기세척기 건조 테일을 짧게 자르는 대신 사이클에 부착해 두세요. 냉각 중에 사이클이 너무 일찍 끝나면 이 값을 올립니다. 감지가 느린 경우에는 낮추십시오.", - "label": "종료 에너지" - }, - "end_repeat_count": { - "doc": "사이클이 끝나기 전에 필요한 연속 정지 임계값 미만 판독 횟수입니다. 대부분의 플러그에는 1이 적합합니다. 스마트 플러그가 주기 중간에 가끔 잘못된 제로 샘플을 보고하고 주기가 조기에 종료되는 경우 2~3으로 올리세요.", - "label": "종료 반복 횟수" - }, - "energy_price_entity": { - "doc": "kWh당 현재 전기 가격이 포함된 센서(예: 동적 요금) 아래의 고정 가격보다 우선 적용됩니다. 각 사이클은 완료 시 가격을 동결시킵니다.", - "label": "에너지 가격 엔티티" - }, - "energy_price_static": { - "doc": "위에 실시간 가격 엔터티가 설정되지 않은 경우 비용 수치에 사용되는 kWh당 고정 가격입니다.", - "label": "고정 에너지 가격 (kWh당)" - }, - "energy_sensor": { - "doc": "선택적 누적 에너지 카운터(total_increasing kWh/Wh, 예: 플러그 자체의 누적 계량기)입니다. 설정하면 각 사이클의 표시 에너지가 이 카운터의 시작부터 종료까지의 차이(delta)에서 계산되므로, 보고 주기가 느린 전력 센서를 적분할 때 발생하는 과소 집계를 방지합니다. 판독값이 없거나 단위를 알 수 없거나 차이가 양수가 아닌 경우 적분된 값으로 대체됩니다. 비워 두면 전력 센서를 계속 적분합니다.", - "label": "에너지 계량기 엔티티" - }, - "expose_debug_entities": { - "doc": "추가 진단 HA 엔터티를 게시합니다(신뢰도, 모호성, 상태 내부 일치). 끄면 일반적인 사용을 위해 엔터티 목록을 깨끗하게 유지합니다.", - "label": "디버그 엔티티 노출" - }, - "external_end_trigger": { - "doc": "상태 변경이 주기 종료를 표시하는 바이너리 센서(예: 기기 \"완료\" 접점 또는 동반 통합)", - "label": "외부 트리거 엔티티" - }, - "external_end_trigger_enabled": { - "doc": "내장된 전력 기반 감지 기능 외에도 외부 바이너리 센서가 사이클 종료 신호를 보내도록 하세요.", - "label": "외부 종료 트리거 활성화" - }, - "external_end_trigger_inverted": { - "doc": "트리거 센서가 꺼진 상태(켜짐이 아닌)를 주기 종료 신호로 처리합니다.", - "label": "외부 트리거 반전 (OFF에서 트리거)" - }, - "learning_confidence": { - "doc": "일치 점수가 이 값과 자동 라벨 신뢰도 사이에 있으면 식별된 프로그램을 확인하라는 피드백 알림이 표시됩니다. 이 점수 이하에서는 경기가 표면화되기에는 너무 불확실합니다. 자동 라벨 신뢰도 미만으로 유지되어야 합니다.", - "label": "학습 신뢰도" - }, - "linked_device": { - "doc": "선택적으로 \"Connected via ...\"로 표시된 HA 장치 레지스트리의 다른 장치(예: 스마트 플러그) 아래에 이 WashData 장치를 중첩합니다.", - "label": "기기 아래 그룹화" - }, - "min_off_gap": { - "doc": "이 시간보다 짧은 시간 동안 기기의 전원이 꺼지면 켜기/끄기/켜기 순서가 하나의 연속 주기로 처리됩니다. 담금 프로그램(세탁 도중 몇 분 동안 기계 전원이 꺼짐)이 두 개의 별도 주기로 분할되는 것을 방지합니다. 별도의 주기로 계산하려면 연속 하중 사이의 간격보다 짧게 설정하십시오. 장치 유형 기본값은 각 어플라이언스에 대한 일반적인 주기 내 일시 중지를 보호합니다.", - "label": "최소 오프 간격" - }, - "min_power": { - "doc": "절대 최소 전력은 활성으로 간주됩니다. 이 아래의 판독값은 0W(대기)로 처리되어 스마트 플러그 및 대기 LED의 팬텀 부하를 필터링합니다.", - "label": "최소 전력" - }, - "ml_training_enabled": { - "doc": "밤새 검토한 사이클을 주기적으로 연구하고 모델을 이 특정 기계에 맞게 미세 조정하세요. 변경 사항은 보류 주기에서 실제로 더 나은 점수를 얻은 경우에만 유지되므로 이는 도움이 되거나 동일하게 유지될 수 있으며 결코 퇴보하지 않습니다.", - "label": "이 기기에서 학습" - }, - "ml_training_hour": { - "doc": "밤새 미세 조정을 수행할 현지 시간(0-23)입니다. 2시(02:00)와 같이 조용한 시간을 선택하세요.", - "label": "학습 시간" - }, - "ml_training_interval_days": { - "doc": "며칠에 한 번만 개선 사항을 다시 확인하세요.", - "label": "최대 확인 간격" - }, - "ml_training_min_cycles": { - "doc": "미세 조정하기 전에 최소한 이만큼의 주기가 기록될 때까지 기다리십시오. 그러면 학습할 내용이 충분합니다.", - "label": "필요한 사이클 수" - }, - "name": { - "doc": "HA 통합 목록 및 장치 레지스트리에 표시되는 표시 이름입니다.", - "label": "기기 이름" - }, - "no_update_active_timeout": { - "doc": "실행 중에 오랫동안 전원 업데이트가 도착하지 않으면 플러그가 오프라인으로 떨어졌다고 가정하고 좀비 사이클을 피하기 위해 강제 중지하십시오. 기본 600초는 클라우드 또는 메시 지연을 허용합니다.", - "label": "업데이트 없음 타임아웃" - }, - "notify_before_end_minutes": { - "doc": "남은 예상 시간이 이 값 아래로 떨어지면 거의 완료 알림을 보냅니다. 0은 비활성화합니다.", - "label": "종료 전 알림" - }, - "notify_channel": { - "doc": "시작/실시간 메시지에 대한 Android 알림 채널 이름(모바일 앱의 채널별 사운드 및 우선순위 제어) Blank는 동반 앱 기본값을 사용합니다.", - "label": "Android 채널 (시작/라이브)" - }, - "notify_cycle_timers": { - "doc": "주기의 특정 분에 알림(예: 연화제 추가) 메시지는 {device}, {program}, {minutes}를 지원합니다. 해당 지점에서 일시 중지하고 재개 버튼을 통해 대화형 알림을 받으려면 자동 일시 중지를 활성화하세요. 패널, 일시 중지/재개 서비스 또는 알림 작업을 통해 재개합니다.", - "label": "사이클 타이머" - }, - "notify_finish_channel": { - "doc": "완료 메시지에 대한 Android 알림 채널 이름입니다. 공백은 시작/라이브 채널을 재사용합니다.", - "label": "Android 채널 (종료)" - }, - "notify_finish_message": { - "doc": "사이클이 끝날 때 전송되는 본문. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. 여기서는 {time_finished}와 {vs_typical}이 가장 유용합니다.", - "label": "종료 메시지" - }, - "notify_finish_services": { - "doc": "inform.* 주기가 완료되면 호출되는 서비스입니다. 대상당 하나씩 추가합니다. 완료 알림을 보내지 않으려면 비워 두세요.", - "label": "종료 서비스" - }, - "notify_fire_events": { - "doc": "또한 주기 시작/종료 시 ha_washdata_* 이벤트를 실행하여 자체 자동화를 구축할 수 있습니다.", - "label": "알림용 HA 이벤트 실행" - }, - "notify_icon": { - "doc": "알림을 위한 선택적 mdi 아이콘(예: mdi:washing-machine) 플랫폼 기본값은 비워 두세요.", - "label": "알림 아이콘" - }, - "notify_live_chronometer": { - "doc": "정적 추정 대신 알림(지원하는 플랫폼의 경우)에 실시간 업데이트 카운트다운 타이머를 표시합니다.", - "label": "라이브 크로노미터 사용" - }, - "notify_live_interval_seconds": { - "doc": "주기가 실행되는 동안 실시간 진행률 알림이 새로 고쳐지는 빈도입니다.", - "label": "라이브 업데이트 간격" - }, - "notify_live_overrun_percent": { - "doc": "주기가 이 백분율보다 더 많이 예상을 초과하는 경우 오버런 경고를 보냅니다.", - "label": "라이브 초과 % 알림" - }, - "notify_live_services": { - "doc": "통지.* 주기가 실행되는 동안 실시간 진행 업데이트를 위해 호출되는 서비스입니다. 실시간 진행 상황 알림을 비활성화하려면 비워 두세요.", - "label": "라이브 진행 서비스" - }, - "notify_only_when_home": { - "doc": "연결된 사람(위) 중 한 명 이상이 집에 있을 때만 알림을 보내세요.", - "label": "집에 있을 때만 알림" - }, - "notify_people": { - "doc": "person.* \"집에 있을 때만 알림\"이 집에 있는지 여부를 결정하는 데 사용되는 엔터티입니다.", - "label": "사람 (집에 있을 때)" - }, - "notify_pre_complete_message": { - "doc": "종료 전 / 거의 완료 알림의 본문. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "완료 전 메시지" - }, - "notify_reminder_message": { - "doc": "아직 대기 중인 꺼내기 알림의 본문. 비워 두면 기본 제공 값이 사용됩니다. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "알림 메시지" - }, - "notify_start_message": { - "doc": "사이클이 시작될 때 전송되는 본문. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "시작 메시지" - }, - "notify_start_services": { - "doc": "inform.* 서비스는 주기가 시작될 때 호출됩니다. 대상(전화, 대시보드 등)당 하나씩 추가합니다. 시작 알림을 보내지 않으려면 비워 두세요.", - "label": "시작 서비스" - }, - "notify_timeout_seconds": { - "doc": "이 시간(초) 후에 알림을 자동으로 해제합니다(지원하는 플랫폼의 경우). 0은 수동으로 해제할 때까지 유지합니다.", - "label": "자동 닫기" - }, - "notify_title": { - "doc": "알림 제목. 템플릿 변수: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "알림 제목" - }, - "notify_unload_delay_minutes": { - "doc": "사이클이 종료된 후 아직 대기 중인 \"머신 언로드\" 알림을 전송하기 몇 분 전입니다. 알림을 비활성화하려면 0을 설정합니다.", - "label": "꺼내기 알림 지연" - }, - "off_delay": { - "doc": "사이클 완료를 선언하기 전에 전원이 꺼진 후 기다리는 시간입니다. 이 창 내에서 전원이 재개되면 주기가 원활하게 계속됩니다. 이로 인해 세탁 단계 사이가 일시 중지됩니다. 식기세척기는 건조 단계가 길기 때문에(20~60분 동안 전원 꺼짐) 전체 세탁+건조를 하나의 주기로 유지하려면 꺼짐 지연이 이를 초과해야 합니다.", - "label": "오프 지연" - }, - "pause_cuts_power": { - "doc": "사이클이 일시 중지되면 아래의 스위치 엔터티도 끄십시오. 사용 중에 플러그를 안전하게 절단할 수 있는 기기에만 해당됩니다.", - "label": "일시 정지로 전력도 차단 (스위치 경유)" - }, - "power_off_delay": { - "doc": "사이클이 완료된 후 상태가 꺼짐으로 돌아가기 전까지 전력이 전원 꺼짐 임계값 미만으로 유지되어야 하는 시간입니다. 전원 꺼짐 임계값이 0보다 클 때만 사용됩니다. 백그라운드 주기로 확인되므로 실제 지연 시간은 다음 상태 만료 시점까지 올림 처리됩니다.", - "label": "전원 꺼짐 지연" - }, - "power_off_threshold_w": { - "doc": "전력 기반 꺼짐 감지(선택 사항)입니다. 0보다 큰 값으로 설정하면 사이클이 완료된 후 전력이 전원 꺼짐 지연 시간 동안 이 값 미만으로 유지될 경우 기기가 꺼진 것으로 간주되어 상태가 꺼짐으로 돌아갑니다. 사용하지 않으려면 0으로 두세요(기본값). 실제로 전원을 끈 상태의 최저값보다 높고, 중지 임계값 및 기기가 완료된 후에도 켜져 있을 때의 대기 전력보다 낮게 설정하세요. 중지 임계값 미만이 아니면 무시됩니다. 활성화하면 꺼짐으로 돌아갈 때 진행 초기화 지연 대신 사용되므로, 완료된 기기는 실제로 전원이 꺼질 때까지 완료됨/깨끗한 상태로 유지됩니다.", - "label": "전원 꺼짐 임계값" - }, - "power_sensor": { - "doc": "이 기기의 실제 전력을 와트 단위로 보고하는 센서 엔터티입니다(예: sensor.washer_power). 모든 사이클 감지는 이 신호를 기반으로 합니다.", - "label": "전력 센서" - }, - "profile_duration_tolerance": { - "doc": "일치하는 동안 사용된 프로필 평균 지속 시간 주변의 +/- 밴드입니다. 0.25는 60분 프로필이 45~75분 주기와 일치함을 의미합니다.", - "label": "프로필 기간 허용 오차" - }, - "profile_match_interval": { - "doc": "실행 주기 동안 프로필 일치를 시도하는 빈도입니다. 기본 300초(5분)는 감지 속도와 CPU의 균형을 유지합니다.", - "label": "매칭 간격" - }, - "profile_match_max_duration_ratio": { - "doc": "프로파일에 따른 최대 사이클 길이. 1.3은 주기가 일치하려면 프로필 기간의 130% 미만이어야 함을 의미합니다.", - "label": "최대 기간 비율" - }, - "profile_match_min_duration_ratio": { - "doc": "프로파일에 따른 최소 사이클 길이. 0.9는 주기가 일치하려면 프로필 기간의 90% 이상이어야 함을 의미합니다.", - "label": "최소 기간 비율" - }, - "profile_match_threshold": { - "doc": "프로그램 식별을 수락하려면 주기 종료 시 최소 유사성 점수(0-1)가 필요합니다. 잘못된 식별을 줄이기 위해 높이십시오. 기계의 프로그램이 일치하지 않으면 값을 낮추십시오. 기본값 0.4는 보수적인 시작점입니다.", - "label": "매칭 임계값" - }, - "profile_unmatch_threshold": { - "doc": "라이브 중간 사이클 경기가 이 점수 아래로 떨어지면 임시 식별이 지워집니다. 일치 임계값보다 약간 낮게 유지하면 유사성이 잠시 떨어지더라도 디스플레이가 일치하지 않는 상태로 되돌아가지 않습니다.", - "label": "언매칭 임계값" - }, - "progress_reset_delay": { - "doc": "완료 후에는 진행 상태를 오랫동안 100%로 유지하여 유휴 상태로 재설정하기 전에 완료됨이 대시보드에 표시되도록 합니다.", - "label": "진행 초기화 지연" - }, - "pump_stuck_duration": { - "doc": "펌프가 고착되었을 가능성이 있는 것으로 표시되기 전에 펌프가 계속 작동할 수 있는 시간(초)입니다(펌프 고착 이벤트 발생).", - "label": "펌프 정지 지속 시간" - }, - "running_dead_zone": { - "doc": "주기가 시작된 후 이 창 내의 전력 강하는 무시됩니다. 세탁기는 찬물로 채워집니다(가열 전 0W 근처로 떨어짐). 이러한 보호 기능이 없으면 채우기 단계가 사이클 종료처럼 보입니다. 이는 데이터를 건너뛰지 않습니다. 전체 전력 추적은 T=0에서 기록됩니다. 제안 엔진은 컴퓨터의 실제 시작 패턴을 측정하고 자동으로 크기를 조정합니다.", - "label": "실행 데드존" - }, - "sampling_interval": { - "doc": "센서 판독 사이의 예상 시간 - 스무딩 창의 크기를 조정하고 디바운싱을 올바르게 시작하는 데 사용됩니다. 모든 센서 업데이트는 이 값에 관계없이 캡처됩니다. 다운스트림 계산만 보정합니다. 제안 엔진은 과거 주기에서 센서의 실제 케이던스를 측정하고 이를 자동으로 설정합니다.", - "label": "샘플링 간격" - }, - "save_debug_traces": { - "doc": "각 사이클에 대해 전체 전력 추적 및 일치하는 디버그 데이터를 저장합니다. 문제 해결에 유용하지만 저장소 크기가 늘어납니다.", - "label": "디버그 추적 저장" - }, - "smoothing_window": { - "doc": "원시 전력 신호가 얼마나 평탄화되는지입니다. 낮음(2)은 반응이 좋지만 소음이 있습니다. 높음(5)은 스파이크를 부드럽게 하지만 지연을 추가합니다.", - "label": "스무딩 윈도우" - }, - "start_duration_threshold": { - "doc": "실제 시작을 확인하려면 전력이 이렇게 오랫동안 시작 임계값 이상으로 유지되어야 하며, 순간적인 켜기/끄기 전환으로 인해 사이클이 시작되는 것을 방지할 수 있습니다.", - "label": "시작 지속 시간" - }, - "start_energy_threshold": { - "doc": "기기가 작동하기 전에 소비해야 하는 에너지(전력 x 시간)입니다. 짧은 고전력 스파이크는 에너지가 매우 낮으므로 무시되어 잘못된 시작을 방지합니다.", - "label": "시작 에너지" - }, - "start_threshold_w": { - "doc": "사이클이 시작되었음을 확인하려면 전력이 이 수준 이상으로 높아져야 합니다. 너무 낮게 설정하면 대기 전원에서 잘못된 시작이 발생합니다. 너무 높거나 느리게 시작되는 프로그램(콜드 필)이 누락됩니다. 제안 엔진은 이를 기계에서 관찰된 최저 유효 전력 바로 위에 설정합니다.", - "label": "시작 임계값" - }, - "stop_threshold_w": { - "doc": "꺼짐 지연 카운트다운이 시작되기 전에 전력이 이 수준 아래로 떨어져야 합니다. 시작 임계값 아래로 설정하십시오. 둘 사이의 간격은 깜박임을 방지하는 히스테리시스 밴드입니다. 너무 높게 설정하면 저전력 단계(헹굼 유지, 주름 방지)가 종료 시퀀스를 잘못 트리거합니다.", - "label": "중지 임계값" - }, - "switch_entity": { - "doc": "일시 중지 시 꺼졌다가 재개 시 다시 켜지는 옵션 스위치는 '일시 중지 시 전원도 차단됨'과 함께 사용됩니다.", - "label": "스위치 엔티티" - }, - "watchdog_interval": { - "doc": "백그라운드 감시 장치가 정지된 센서와 경과된 시간 초과를 확인하는 빈도입니다. 기본값은 30초입니다.", - "label": "워치독 간격" - }, - "notify_milestone_message": { - "doc": "마일스톤 알림 메시지. 템플릿 변수: {device}, {cycle_count}.", - "label": "마일스톤 메시지" - }, - "notify_milestones": { - "doc": "도달 시 한 번만 축하 알림을 보낼 사이클 수를 쉼표로 구분하여 지정합니다(예: 50, 100, 500, 1000). 비워 두면 마일스톤 알림이 비활성화됩니다.", - "label": "사이클 마일스톤" - }, - "notify_quiet_end_hour": { - "doc": "방해 금지 시간대의 종료(0-23). 보류된 알림은 이 시각에 전달됩니다. 비워 두면 비활성화됩니다.", - "label": "방해 금지 시간 종료" - }, - "notify_quiet_start_hour": { - "doc": "방해 금지 시간대의 시작(0-23). 방해 금지 시간 중 발생할 완료, 알림, 세탁 완료 알림은 보류되었다가 시간대가 끝날 때 전달됩니다. 비워 두면 비활성화됩니다. 자정을 넘는 시간대도 지원합니다(예: 시작 22, 종료 7).", - "label": "방해 금지 시간 시작" - }, - "peak_rate_message": { - "doc": "시작 알림에 추가되는 피크 요금 팁의 사용자 지정 텍스트(선택 사항). 템플릿 변수: {device}, {price}. 비워 두면 기본 제공 값이 사용됩니다.", - "label": "피크 요금 메시지" - }, - "peak_rate_threshold": { - "doc": "사이클이 시작될 때 현재 kWh당 가격이 이 값 이상이면 시작 알림에 피크 요금 팁을 추가합니다. 0 또는 비워 두면 팁이 비활성화됩니다.", - "label": "피크 요금 임계값 (kWh당)" - }, - "dtw_bandwidth": { - "label": "형상 매칭 허용치", - "doc": "저장된 프로그램의 형상에 맞추기 위해 매처가 사이클을 얼마나 시간 왜곡할 수 있는지를 결정합니다. 값이 클수록 속도 변화를 더 허용하지만, 너무 크면 잘못된 프로그램에 매칭될 위험이 있습니다." - }, - "corr_weight": { - "label": "형상 대 레벨 가중치", - "doc": "매칭 점수를 계산할 때 곡선 형상과 절대 전력 레벨 사이의 균형입니다. 값이 클수록 형상을, 작을수록 전력 레벨 일치를 우선합니다." - }, - "duration_weight": { - "label": "실행 시간 가중치", - "doc": "일반적인 실행 시간이 이 사이클과 일치하는 프로그램을 얼마나 우선할지 결정합니다." - }, - "energy_weight": { - "label": "에너지 가중치", - "doc": "일반적인 에너지 사용량이 이 사이클과 일치하는 프로그램을 얼마나 우선할지 결정합니다." - }, - "store_brand": { - "label": "가전제품 브랜드", - "doc": "선택 사항입니다. 커뮤니티 카탈로그에서 선택한 가전제품 브랜드입니다. 일치하는 참조 녹음을 찾고 공유하는 데 사용됩니다. 온라인 기능을 사용하지 않는 경우 비워 두세요." - }, - "store_model": { - "label": "가전제품 모델", - "doc": "선택 사항입니다. 브랜드를 설정하면 커뮤니티 카탈로그에서 선택할 수 있는 가전제품 모델입니다. 목록에 모델이 없으면 카탈로그에 추가할 수 있습니다." - }, - "show_contributor": { - "doc": "커뮤니티 가전제품 및 참조 사이클에 \"by \" 기여자 표시를 보여줍니다." - }, - "enable_phase_matching": { - "label": "단계 기반 남은 시간", - "doc": "실행 중인 각 사이클을 단계(가열, 세탁, 탈수)로 나누고 단계별로 남은 시간을 배분하여 기존 추정값과 혼합합니다. 사이클 초반에는 단계별 배분을, 종료에 가까워질수록 기존 추정값을 더 중시합니다. 이렇게 하면 기기가 실제로 가열하고 작동하는 시간에 맞춰 카운트다운이 개인화되며, 사이클 전반부에서 가장 뚜렷하게 나타납니다. 꺼짐 = 기존 추정값만 사용. 남은 시간 표시에만 영향을 미치며, 프로그램 매칭과 사이클 감지는 변경되지 않습니다." - }, - "keep_min_score": { - "label": "최소 매칭 점수", - "doc": "후보가 매칭 경쟁에 남기 위해 필요한 최소 유사도 점수입니다. 기본값 0.1은 의도적으로 허용적입니다. 약한 후보도 허용하고 이후 단계에서 최선을 찾도록 합니다. 가능성이 낮은 프로파일을 더 일찍 제거하려면 높이고, 초기 후보 풀을 넓히려면 낮추세요." - }, - "dtw_blend": { - "label": "워프 블렌드", - "doc": "시간 워프(DTW) 정렬 점수가 Stage 2 핵심 점수를 얼마나 대체하는지 나타냅니다. 0 = Stage 2 점수만 사용, 1 = DTW 점수만 사용, 0.5 (기본값) = 동등 혼합. 프로그램들이 유사한 전력 수준이지만 다른 타이밍 패턴을 가질 때 워프 정렬에 더 의존하려면 높이세요." - }, - "dtw_ensemble_w": { - "label": "워프 앙상블 혼합", - "doc": "앙상블 DTW 모드(기본값)에서 스케일 L1과 도함수 DTW(DDTW)의 가중치 배분입니다. 1.0 = 모두 스케일-L1, 0 = 모두 DDTW, 0.7 = 기본값. 스케일-L1 방식은 전력 수준을 비교하고, 도함수 방식은 전력이 시간에 따라 변하는 방식에 반응합니다. 앙상블은 두 가지를 결합합니다." - }, - "dtw_ddtw_scale": { - "label": "미분 워프 스케일", - "doc": "도함수 DTW 점수화를 위한 반포화 거리입니다. DDTW 거리가 이 값과 같을 때 점수가 반으로 줄어듭니다. 작을수록 형상 차이에 민감합니다. 기본값 30은 일반적인 가전제품 전력 추적에 맞게 보정되어 있습니다. 앙상블 및 ddtw DTW 모드에만 영향을 미칩니다." - }, - "dtw_refine_top_n": { - "label": "워프 정제 개수", - "doc": "DTW가 재점수화하는 Stage 2 상위 후보 수입니다. DTW는 계산 비용이 높아 상위 N개 후보에만 적용됩니다. 기본값 5. 올바른 프로파일이 Stage 2 후 4위나 5위에 그치는 경우 값을 높이세요(7-9) - DTW가 이를 구할 수 있습니다. 낮추면 매칭 속도가 약간 빨라집니다." - }, - "duration_scale": { - "label": "지속 시간 선명도", - "doc": "Stage 4 지속 시간 일치 패널티의 날카로움입니다. 이것은 일치 점수가 반으로 줄어드는 로그 비율입니다. 작을수록 엄격합니다. 지속 시간 불일치가 더 큰 영향을 미칩니다. 기본값 0.175는 반가중치에서 약 18%의 지속 시간 허용 오차에 해당합니다. 지속 시간 가중치와 함께 사용하세요." - }, - "energy_scale": { - "label": "에너지 선명도", - "doc": "Stage 4 에너지 일치 패널티의 날카로움입니다. 작을수록 엄격합니다. 에너지 불일치가 더 큰 영향을 미칩니다. 기본값 0.25는 에너지가 부하에 따라 변하기 때문에 지속 시간 날카로움보다 의도적으로 더 허용적입니다. 에너지 가중치와 함께 사용하세요." - } - }, - "setting_group": { - "auto_labeling": { - "label": "자동 라벨링" - }, - "cycle_end": { - "label": "사이클 종료" - }, - "cycle_start": { - "label": "사이클 시작" - }, - "cycle_timers": { - "label": "사이클 타이머" - }, - "data_management": { - "label": "데이터 관리" - }, - "debug": { - "label": "디버그" - }, - "dishwasher_end": { - "label": "식기세척기 종료" - }, - "door_pause": { - "label": "문과 일시 정지" - }, - "dtw_refinement": { - "label": "DTW 정밀화" - }, - "duration_gates": { - "label": "기간 게이트" - }, - "energy": { - "label": "에너지" - }, - "external_end_trigger": { - "label": "외부 종료 트리거" - }, - "housekeeping": { - "label": "하우스키핑" - }, - "match_scoring": { - "label": "매칭 점수" - }, - "messages": { - "label": "메시지" - }, - "power_off": { - "label": "전원 꺼짐" - }, - "predictive_end": { - "label": "예측 종료" - }, - "schedule": { - "label": "일정" - }, - "services": { - "label": "서비스" - }, - "signal_processing": { - "label": "신호 처리" - }, - "thresholds_gap": { - "label": "임계값과 간격" - }, - "timing": { - "label": "타이밍" - }, - "unload_reminder": { - "label": "꺼내기 알림" - }, - "watchdog": { - "label": "워치독" - }, - "quiet_hours_milestones": { - "label": "방해 금지 시간 및 마일스톤" - }, - "device_info": { - "label": "기기 정보" - }, - "basic_configuration": { - "label": "기본 구성" - } - }, - "status": { - "active": "활동적인", - "all_statuses": "모든 상태", - "ambiguous": "모호한", - "auto_detect": "자동 감지", - "clear": "분명한", - "completed": "완전한", - "fine_tuning": "지금 미세 조정 중…", - "force_stopped": "강제 정지됨", - "idle": "게으른", - "interrupted": "중단된", - "ready": "처리 준비 완료", - "recording": "녹화 중", - "training": "훈련 중…", - "saving": "저장 중…", - "rebuilding": "재구축 중…", - "analyzing": "분석 중…", - "resetting": "재설정 중…", - "reverting": "되돌리는 중…", - "trimming": "다듬는 중…", - "splitting": "분할 중…", - "deleting": "삭제 중…", - "imported": "가져옴" - }, - "tab": { - "advanced": "고급의", - "diagnostics": "진단", - "history": "사이클", - "ml": "ML 훈련", - "pp_cleanup": "대청소", - "pp_manage": "관리하다", - "pp_overview": "개요", - "pp_phases": "단계", - "profiles": "프로필", - "settings": "설정", - "status": "개요", - "subtab_phase_catalog": "단계 카탈로그", - "subtab_profiles": "프로필", - "maintenance": "유지보수", - "playground": "플레이그라운드", - "store": "스토어" - }, - "tag": { - "early_end": "조기 종료", - "late_start": "늦은 시작", - "merged": "병합된 주기", - "noise": "소음", - "sensor_gap": "센서 갭", - "split": "분할주기", - "wrong_profile": "잘못된 프로필" - }, - "toast": { - "access_saved": "액세스 제어가 저장되었습니다.", - "all_wiped": "모든 데이터가 지워졌습니다.", - "analysis_complete_none": "분석 완료: 새로운 제안 없음", - "auto_label_complete": "자동 라벨 완료", - "automation_deleted": "자동화가 삭제되었습니다.", - "correction_submitted": "수정사항이 제출되었습니다.", - "cycle_deleted": "주기가 삭제되었습니다.", - "cycle_force_stopped": "사이클 강제 정지", - "cycle_labelled": "라벨이 붙은 사이클", - "cycle_paused": "주기가 일시중지됨", - "cycle_resumed": "사이클 재개", - "cycle_trimmed": "주기가 잘림", - "cycles_merged": "사이클이 병합되었습니다.", - "envelope_rebuilt": "봉투 재구축", - "envelopes_rebuilt": "봉투 재구축", - "export_downloaded": "내보내기가 다운로드됨", - "feedback_all_dismissed": "모든 피드백이 무시되었습니다.", - "feedback_confirmed": "피드백 확인됨", - "feedback_dismissed": "피드백이 무시되었습니다.", - "group_deleted": "그룹이 삭제되었습니다.", - "group_name_required": "그룹 이름은 필수 항목입니다.", - "group_saved": "그룹이 저장되었습니다", - "import_successful": "가져오기가 성공했습니다. 통합 다시 로드", - "json_required": "JSON 데이터가 필요합니다", - "legacy_removed": "기존 작업이 제거되었습니다.", - "logs_exported": "내보낸 로그", - "matching_reverted": "일치하는 가중치가 기본값으로 되돌아갔습니다.", - "min_2_profiles": "그룹당 프로필을 2개 이상 선택하세요.", - "ml_training_no_improvement": "훈련 완료: 기준선 유지(개선 없음)", - "models_reverted": "온디바이스 모델이 기준으로 되돌아갔습니다.", - "name_required": "이름이 필요합니다", - "no_split_found": "분할할 유휴 간격이 발견되지 않았습니다.", - "panel_settings_saved": "패널 설정이 저장되었습니다.", - "phase_name_required": "단계 이름은 필수 항목입니다.", - "phase_updated": "단계가 업데이트되었습니다.", - "phases_saved": "저장된 단계", - "preferences_saved": "환경설정이 저장되었습니다.", - "profile_name_required": "프로필 이름은 필수 항목입니다.", - "profile_renamed": "프로필 이름이 변경됨", - "recording_discarded": "녹음이 삭제되었습니다.", - "recording_saved": "프로필에 녹음이 저장되었습니다.", - "recording_started": "녹음이 시작되었습니다", - "recording_stopped": "녹음이 중지되었습니다.", - "review_saved": "리뷰가 저장되었습니다.", - "settings_conflicts": "저장하기 전에 강조 표시된 설정 충돌을 해결하세요.", - "settings_reverted": "설정이 복원되었습니다. 통합 리로드 중", - "settings_saved": "설정이 저장되었습니다. 통합 다시 로드", - "suggestions_applied": "제안이 적용되었습니다. 통합 다시 로드", - "suggestions_dismissed": "제안이 무시되었습니다.", - "apply_failed": "적용 실패: {error}", - "delete_failed": "삭제 실패: {error}", - "load_more_failed": "더 불러올 수 없습니다: {error}", - "maint_add_failed": "이벤트를 추가할 수 없습니다: {error}", - "maint_added": "유지보수 이벤트가 추가되었습니다", - "maint_delete_failed": "이벤트를 삭제할 수 없습니다: {error}", - "maint_deleted": "유지보수 이벤트가 삭제되었습니다", - "relabel_done": "{count}개 사이클을 다시 라벨 지정했습니다", - "relabel_failed": "다시 라벨 지정 실패: {error}", - "reminders_save_failed": "알림을 저장할 수 없습니다: {error}", - "reminders_saved": "서비스 알림이 저장되었습니다", - "pause_no_cycle": "일시 정지할 실행 중인 사이클이 없습니다", - "resume_no_cycle": "재개할 일시 정지된 사이클이 없습니다", - "delete_partial_failed": "일부 항목을 삭제할 수 없어 복원되었습니다", - "pg_run_gone": "해당 실행은 더 이상 사용할 수 없습니다.", - "task_cancelled": "취소되었습니다.", - "processed": "{bits} 처리 완료", - "processed_cycles": "{n}개 사이클", - "processed_suggestions": "{n}개 제안", - "processed_models": "{n}개 모델 승격", - "store_search_failed": "검색 실패: {error}", - "store_connect_failed": "연결 실패: {error}", - "store_connected": "커뮤니티 스토어에 연결되었습니다", - "store_disconnected": "커뮤니티 스토어 연결이 해제되었습니다", - "store_error": "오류: {error}", - "store_unavailable": "커뮤니티 스토어를 사용할 수 없습니다.", - "store_pick_profile": "병합할 프로필을 선택하세요", - "store_name_required": "프로필 이름을 입력하세요", - "store_import_failed": "가져오기 실패: {error}", - "store_imported": "{profile}(으)로 가져왔습니다", - "store_program_required": "프로그램 이름을 입력하세요", - "store_no_appliance": "먼저 설정에서 가전제품 브랜드와 모델을 설정하세요.", - "store_share_failed": "공유 실패: {error}", - "store_shared": "커뮤니티 스토어에 공유되었습니다 (검토 대기 중)", - "appliance_added": "가전제품이 추가되었습니다 (승인 대기 중)", - "thanks_confirming": "확인해 주셔서 감사합니다", - "device_approved": "커뮤니티에서 승인되었습니다", - "rating_saved": "품질 평가가 저장되었습니다", - "brand_added": "브랜드가 추가되었습니다 (승인 대기 중)", - "profile_added": "프로필이 추가되었습니다 (승인 대기 중)", - "saved_except_conflicts": "저장되었습니다. 나머지를 저장하려면 강조된 충돌을 수정하세요.", - "share_device_none_sel": "공유할 사이클을 하나 이상 선택하세요", - "store_device_downloaded": "프로그램 {p}개, 녹음 {c}개 추가됨", - "store_device_downloaded_phases": "프로그램 {p}개, 녹음 {c}개, 페이즈 맵 {ph}개 추가됨", - "store_device_downloaded_settings": "프로그램 {p}개, 녹음 {c}개, 페이즈 맵 {ph}개, 설정 {s}개 추가됨", - "store_device_shared": "{n}개 사이클을 커뮤니티 스토어에 공유했습니다 - 검토 중.", - "store_device_shared_all_dup": "{n}개 사이클 모두 이미 커뮤니티 스토어에 있었습니다.", - "store_device_shared_partial": "{n}개 사이클 공유됨; {failed}개는 업로드할 수 없었습니다.", - "store_device_shared_some_dup": "{created}개 사이클 공유됨; {dup}개는 이미 스토어에 있었습니다.", - "store_download_failed": "다운로드 실패: {error}", - "store_download_nothing": "다운로드할 새 항목 없음 - 이 설정은 이미 기기에 있습니다.", - "export_selective_done": "내보내기 다운로드 완료", - "import_selective_done": "{profiles}개 프로필과 {cycles}개 사이클을 가져왔습니다" - }, - "suggestion": { - "both_agree": "WashData 권장", - "calibrated_label": "보정됨", - "observed_label": "관측값", - "impact": { - "auto_label_confidence": { - "higher": "자동 라벨링 사이클이 줄어들고, 더 많이 검토로 넘어갑니다", - "lower": "더 많은 사이클을 자동 라벨링합니다. 일부는 잘못 식별될 수 있습니다" - }, - "duration_tolerance": { - "higher": "더 넓은 시간 범위를 허용합니다. 유연한 매칭", - "lower": "더 정확한 시간 매칭이 필요합니다. 엄격하지만 비정상 사이클을 거부할 수 있습니다" - }, - "end_energy_threshold": { - "higher": "상당한 에너지를 사용한 사이클만 종료합니다", - "lower": "짧거나 저에너지 사이클도 종료합니다" - }, - "end_repeat_count": { - "higher": "종료 신호를 더 많이 반복해야 합니다. 더 안정적이지만 약간 느려집니다", - "lower": "더 적은 반복 후 종료합니다. 빠른 감지이지만 오종료 위험이 있습니다" - }, - "learning_confidence": { - "higher": "매우 신뢰도 높은 매칭에서만 학습합니다. 느리지만 더 신뢰할 수 있습니다", - "lower": "더 많은 사이클에서 학습합니다. 모델에 노이즈가 더 많을 수 있습니다" - }, - "min_off_gap": { - "higher": "새 사이클이 시작되기 전에 더 긴 대기 시간이 필요합니다", - "lower": "짧은 대기 시간으로 새 사이클이 시작됩니다. 연속 실행이 분할될 수 있습니다" - }, - "min_power": { - "higher": "대기 전력 소비에 덜 민감합니다. 매우 조용한 프로그램을 놓칠 수 있습니다", - "lower": "더 민감합니다. 대기 전력을 활동으로 기록할 수 있습니다" - }, - "no_update_active_timeout": { - "higher": "사이클이 멈췄다고 판단하기까지 더 많은 시간이 걸립니다", - "lower": "멈춘 사이클을 더 빨리 강제 종료합니다" - }, - "off_delay": { - "higher": "가전제품 일시 정지를 위한 시간이 늘어납니다. 긴 담금 또는 건조 단계를 처리합니다", - "lower": "종료 감지가 빨라집니다. 깔끔한 온/오프 가전제품에 적합합니다" - }, - "profile_match_threshold": { - "higher": "높은 신뢰도 매칭만 확정합니다. 더 많은 사이클이 라벨 없이 남습니다", - "lower": "더 많은 사이클을 매칭합니다. 일부가 약간 틀릴 수 있습니다" - }, - "running_dead_zone": { - "higher": "대기 중 짧은 전력 스파이크를 무시합니다. 노이즈에 덜 민감합니다", - "lower": "더 짧은 전력 버스트에 반응합니다. 빠른 일시적 활동을 감지합니다" - }, - "start_threshold_w": { - "higher": "짧은 전력 스파이크로 인한 오동작을 방지합니다", - "lower": "저전력 프로그램을 감지합니다. 노이즈에 트리거될 수 있습니다" - }, - "stop_threshold_w": { - "higher": "사이클을 더 빨리 종료합니다. 일시 정지 중에 닫힐 수 있습니다", - "lower": "종료까지 더 오래 기다립니다. 조기 완료가 줄어듭니다" - }, - "watchdog_interval": { - "higher": "더 긴 정지 단계가 허용됩니다. 오탐 강제 종료가 줄어듭니다", - "lower": "멈춘 사이클을 더 적극적으로 감지합니다" - } - }, - "reason": { - "auto_label_confidence": "사용자가 한 번도 수정하지 않은 {cycles}개 자동 라벨의 15백분위 신뢰도({p15}).", - "completion_min_seconds": "{cycles} 사이클의 p05 정상 사이클 시간의 절반({minutes} min). 허위 사이클을 걸러냅니다.{excl}", - "dead_zone_batch": "짧게 유지({cycles} 사이클의 시작 불안정 구간 중앙값 = {s}s). 실제 종료를 신속하게 감지합니다.", - "dead_zone_from_dip": "{s}s에서 감지된 초기 전력 저하를 기반으로 함.", - "end_energy_default": "사이클 종료 노이즈 게이트에 권장되는 기본값.", - "end_energy_false": "{cycles} 사이클의 p95 허위 종료 에너지({p95}Wh). 사이클 에너지 중앙값의 0.2%({floor}Wh)를 하한으로 함.", - "end_energy_no_false": "{cycles} 사이클에서 허위 종료 없음. 사이클 에너지 중앙값의 0.2%({floor}Wh)를 하한으로 함.", - "end_repeat_count": "{false}/{total}개 정상 사이클({pct}%)에서 재개된 60s 초과 내부 일시정지가 있었습니다. {val}회의 종료 확인을 요구합니다.", - "learning_confidence": "{cycles}개 사용자 라벨 사이클의 p05 신뢰도({p05}). 이보다 낮으면 확인을 요청합니다.", - "match_interval": "관측된 업데이트 주기 기반(중앙값={median}s) * 10.", - "max_duration_ratio": "라벨이 지정된 사이클 시간 기반(p95={p95}).", - "min_active": "마지막 사이클에서 관측된 최소 활성 전력({min}W) 기반.", - "min_duration_ratio": "프로그램을 사이클 초반에 식별할 수 있도록 최대한 낮게 유지합니다. 신뢰도와 모호성 게이트가 조기 확정을 방지합니다.", - "min_off_gap": "관측된 {gaps}개 사이클 간 간격 기반(p05={p05}s). 기기 하한: {floor}s.", - "min_power": "{cycles}개 정상 사이클의 p05 최저 활성 전력({p05}W)의 40%. 꺼짐 게이트를 실제 소비 전력보다 낮게 유지합니다.{excl}", - "ml_auto_label": "품질 모델이 여전히 정상으로 평가한 최저 신뢰도({cycles}개 정상 사이클의 p10 = {p10}).", - "ml_end_repeat": "{false}/{total} 사이클({pct}%)에서 종료 검출기가 50% 초과로 평가한 일시정지가 있었습니다. {val}회의 종료 확인을 요구합니다.", - "ml_off_delay": "종료 검출기가 확인한 일시정지: p95 {p95}s + 60s 버퍼. {cycles} 사이클에 걸친 모델 검증 일시정지 {pauses}건에서 산출(하한 {floor}s).", - "no_update_timeout": "관측된 업데이트 주기 기반(p95={p95}s) * 20(최소 60s).", - "off_delay_cadence": "관측된 업데이트 주기 기반(p95={p95}s) * 5", - "off_delay_device_floor": "{device}에 대한 기기별 안전 최소값을 사용({floor}s).", - "off_delay_generic_floor": "일반 안전 최소값을 사용({floor}s).", - "off_delay_pauses": "실제 일시정지보다 길도록 설정: p95 사이클 내 일시정지 {p95}s + 60s 버퍼. {cycles}개 정상 사이클에 걸친 {pauses}건의 일시정지에서 산출(하한 {floor}s).", - "profile_match_threshold": "{cycles}개 올바른 자동 라벨의 p10 신뢰도({p10}). 안전한 실시간 확정 하한.", - "sampling_interval": "{cycles}개 정상 사이클에서 관측된 중앙값 업데이트 간격({si}s).{excl}", - "smoothing_window": "{si}s 샘플링에서 약 30s 분량의 측정값을 평활화하도록 설정({samples} 샘플).", - "start_duration": "짧게 유지(약 1회 {si}s 샘플 간격). 단일 샘플 스파이크는 무시하면서 감지를 최대한 빨리 시작합니다.", - "thr_batch": "{cycles} 사이클의 p05 최저 활성 전력({p05}W) 바로 위로 유지합니다. 그래서 시작을 최대한 빨리 포착하고, 정지 임계값은 기기의 최저 작동 전력보다 낮게 유지됩니다.", - "tol_per_profile": "{profiles}개 프로필({cycles} 사이클)의 프로필별 시간 분산 p75. 편차가 작은 프로필은 불이익을 받지 않습니다.", - "tol_pooled": "{cycles}개 최근 라벨 사이클의 통합 시간 분산 기반(p95 편차={dev}).", - "watchdog": "안전한 범위에서 최대한 낮게 유지(p95 업데이트 간격 {p95}s의 3배, 최소 30s). 잘못된 정지 없이 멈춤을 빠르게 감지합니다." - }, - "exclusions": { - "summary": "잘못 감지된 사이클 {total}개를 제외했습니다: {parts}.", - "reason": { - "force_stopped": "강제 정지", - "interrupted": "중단", - "incomplete": "미완료", - "noise": "노이즈", - "unlabeled": "라벨 없음", - "no_trace_short": "너무 짧아 검사 불가", - "high_start": "고전력에서 시작", - "abrupt_end": "갑작스러운 종료", - "mid_restart": "사이클 중간 재시작", - "no_power": "전력 없음", - "no_active_power": "활성 전력 없음" - } - } - }, - "trend": { - "down": "하락세", - "up": "추세 상승" - }, - "maint": { - "bearing_service": "베어링 정비", - "descale": "석회질 제거", - "drum_clean": "드럼 청소", - "filter_clean": "필터 청소", - "other": "기타" - }, - "col": { - "profile_tip": "매칭된 프로그램 이름입니다. 라벨 없음은 사이클 종료 시 일치하는 프로필이 없음을 의미합니다.", - "status_tip": "사이클 결과: 완료됨(자연 종료), 중단됨(급격한 전력 강하), 강제 정지됨(수동), 또는 검토 필요(피드백 대기 중).", - "date_tip": "사이클이 시작된 날짜와 시간입니다.", - "duration_tip": "시작부터 종료까지의 총 사이클 실행 시간입니다.", - "energy_tip": "소비된 총 에너지(kWh)입니다. 시간에 따라 전력을 적분하여 계산합니다.", - "cost_tip": "이 사이클의 에너지 비용으로, 완료 시점에 적용된 가격(에너지 x kWh당 가격)으로 고정됩니다. 값을 채우려면 설정에서 가격을 지정하세요.", - "confidence_tip": "프로필 매칭 신뢰도(0-100%)입니다. 사이클 전력 곡선이 식별된 프로그램과 얼마나 근접하게 일치했는지를 나타냅니다.", - "health_tip": "ML 사이클 건강(높을수록 좋음)입니다. 검사하고 검토하려면 사이클을 클릭하세요.", - "flags_tip": "사이클의 검토, 이상, 소스 플래그. 아이콘에 마우스를 올리면 세부 정보가 표시됩니다." - }, - "stat": { - "avg": "평균", - "min": "최소 {v}", - "max": "최대 {v}", - "consistency": "일관성 ±{v}", - "total": "총 {v}", - "last_run": "마지막 실행 {v}", - "score": "점수 {pct}%", - "duration_cv": "지속 시간 CV {pct}%", - "avg_confidence": "평균 신뢰도 {pct}%" - }, - "pg_evd": { - "detected": "감지기가 사이클 시작을 인식했습니다.", - "match_commit": "매칭 기능이 충분한 신뢰도로 프로그램을 확정했습니다.", - "match_changed": "사이클이 더 진행되면서 가장 유력한 프로그램이 바뀌었습니다.", - "match_ambiguous": "두 프로그램의 점수가 비슷해서 매칭이 불확실했습니다.", - "unmatched": "이 사이클에 맞는 저장된 프로그램이 없습니다.", - "notify_start": "시작 알림이 전송됩니다.", - "notify_pre_complete": "거의 완료 알림이 전송됩니다.", - "notify_finish": "완료 알림이 전송됩니다.", - "notify_milestone": "마일스톤 알림이 전송됩니다.", - "notify_held": "방해 금지 시간대라서 알림이 보류되었습니다.", - "finished": "사이클이 종료 상태에 도달하여 끝났습니다." - }, - "store": { - "browse": "탐색", - "device": "기기", - "favorites": "즐겨찾기", - "search_ph": "브랜드 또는 모델로 검색…", - "no_results": "일치하는 가전제품을 찾을 수 없습니다. 다른 검색어로 시도하세요.", - "n_programs": "프로그램 {n}개", - "n_cycles": "사이클 {n}개", - "no_programs": "이 가전제품에 대해 아직 공유된 프로그램이 없습니다.", - "no_cycles": "이 프로그램에 대해 아직 공유된 참조 주기가 없습니다.", - "anon": "익명", - "uploaded_by": "{name} 님이 공유함", - "connected_as": "{name}(으)로 연결됨", - "not_connected": "연결되지 않았습니다. 자신의 사이클을 공유하려면 GitHub 계정을 연결하세요.", - "import_new": "새 프로필", - "import_merge": "기존 항목에 병합", - "merge_target": "병합 대상 프로필", - "description": "설명(선택 사항)", - "contributed_by": "{name} 제공", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "아직 평가 없음", - "website": "스토어 웹사이트 ↗", - "website_tip": "커뮤니티 스토어 웹사이트 열기" - }, - "settings": { - "gear": { - "title": "설정" - } - }, - "link": { - "manual": "설명서 ↗", - "add_appliance": "가전제품 추가" - }, - "tip": { - "add_brand": "브랜드가 목록에 없나요? 커뮤니티 카탈로그에 추가하세요", - "add_appliance": "모델이 목록에 없나요? 가전제품을 커뮤니티 카탈로그에 추가하세요", - "add_profile": "커뮤니티 사이트에서 이 가전제품의 프로필을 추가하세요" - }, - "task": { - "reprocess": { - "matching": "재처리: 사이클 매칭", - "golden": "재처리: 참조 사이클 보완", - "suggestions": "재처리: 제안", - "ml_training": "재처리: ML 훈련", - "health": "재처리: 사이클 건강" - }, - "pg_sweep": { - "optimize": "최적화: {param}" - }, - "pg_detail": { - "simulate": "사이클 시뮬레이션" - }, - "split": { - "apply": "사이클 분할 중" - }, - "trim": { - "apply": "사이클 트리밍 중" - }, - "merge": { - "apply": "사이클 병합 중" - }, - "rebuild": { - "envelopes": "엔벨로프 재구성 중" - }, - "cancelling": "취소 중..." - }, - "setup": { "hdr": { - "card": "기기 설정", - "healthy_chip": "설정 완료" + "ab_comparison": "A/B 설정 비교", + "access_control": "접근 제어", + "add_maintenance": "유지보수 이벤트 추가", + "automation_delete": "이 자동화 삭제", + "automation_needs_review": "이 주기에는 검토가 필요합니다.", + "automation_open": "자동화 편집기에서 열기", + "automation_review_this_cycle": "이 주기를 검토하세요", + "automations": "자동화", + "clear_debug": "디버그 추적 지우기", + "cycle_simulator": "사이클 시뮬레이터", + "diagnostics_pref": "진단", + "display": "표시", + "dtw_inspector": "DTW 검사기", + "export_import": "내보내기/가져오기", + "getting_started": "시작하기", + "live_power": "라이브 전력", + "logs": "로그", + "logs_diagnostics": "진단", + "maintenance": "유지 관리 작업", + "maintenance_log": "유지보수 기록", + "maintenance_reminders": "서비스 알림", + "manual_recording": "수동 기록", + "manual_recording_tip": "WashData가 전력 트레이스를 기록하는 동안 의도적으로 사이클을 실행합니다. 기기가 시작되기 직전에 시작하고, 완료되면 중지한 다음 처리하여 이름이 지정된 프로필로 저장합니다.", + "ml_learned": "WashData가 배운 것", + "ml_matching_tuning": "프로그램 매칭 미세 조정", + "ml_settings_card": "설정", + "ml_smart_learning": "스마트러닝", + "my_preferences": "내 환경설정", + "no_automations": "아직 이 장치를 참조하는 자동화가 없습니다.", + "panel_settings": "패널 설정", + "param_sweep": "매개변수 스윕", + "pg_settings_source": "설정 출처", + "phase_catalog": "단계 카탈로그", + "playground": "플레이그라운드", + "process_history": "기록 처리", + "settings_history": "설정 기록", + "status": "상태", + "status_graph": "상태 그래프", + "storage_stats": "스토리지 통계", + "test_history": "기록으로 테스트", + "toggle_sidebar": "홈어시스턴트 사이드바 전환", + "tools_and_data": "도구 및 데이터", + "wipe_history": "기록 지우기", + "recommendations": "권장 사항 ({n})", + "pg_detection_params": "감지 설정", + "pg_timeline": "이벤트 타임라인", + "pg_outcome": "시뮬레이션 결과", + "pg_across_cycles": "전체 사이클에 걸쳐", + "community_store": "커뮤니티 스토어", + "online_account": "커뮤니티 스토어 및 온라인 기능" }, - "phase0": { - "washer": "WashData가 이미 사이클을 감지하고 있습니다. 프로그램 이름과 시간 추정을 활성화하려면 첫 번째 사이클을 기록하세요.", - "dishwasher": "WashData가 관찰 중입니다. 식기세척기 사이클은 복잡합니다 – 첫 번째 사이클을 기록하는 것이 강력히 권장됩니다. 감지된 사이클이 너무 길게 실행되면 프로필로 저장하기 전에 사이클 편집기를 사용하여 다듬으세요.", - "generic": "WashData가 관찰 중입니다. 프로필 구축을 시작하려면 감지된 사이클을 기록하거나 라벨을 지정하세요." + "health": { + "fair": "프로파일 품질: 보통", + "good": "✓ 프로파일 품질: 양호", + "poor": "⚠ 프로파일 품질: 불량" }, - "phase1a": { - "labelled": "좋은 시작입니다 – 첫 번째 프로그램이 저장되었습니다. 가장 정확한 데이터를 위해 녹음기 위젯으로 다음 사이클을 기록하는 것을 고려해 보세요." + "lbl": { + "actions": "작업", + "activity": "활동", + "administrators": "관리자", + "aria_compare_chart": "사이클 비교 그래프", + "aria_cycle_chart": "사이클 전력 곡선", + "aria_envelope_chart": "프로필 전력 엔벨로프 그래프", + "aria_phase_chart": "단계 편집기 그래프", + "aria_playground_chart": "드래그 가능한 감지 임계값이 있는 사이클 전력 곡선", + "aria_power_chart": "전력 소비 그래프", + "aria_spaghetti_chart": "겹쳐진 사이클 전력 곡선", + "aria_sweep_chart": "매개변수 스윕 결과 그래프", + "artifact_anomaly": "이상", + "artifact_high_power": "고전력", + "artifact_interruption": "중단", + "artifact_low_power": "저전력", + "auto_detect": "자동 감지", + "auto_fine_tune_off": "자동 미세 조정 꺼짐", + "auto_fine_tune_on": "자동 미세 조정 켜짐(약 {hour}:00)", + "avg_cost": "평균 비용", + "change": "변경", + "clock_time": "시계 시간", + "cohesion_good": "응집도 {pct}%", + "cohesion_low": "⚠ 낮은 응집도 {pct}%", + "compare_profiles": "프로필과 비교", + "concurrency": "동시 실행 수", + "confidence": "신뢰도", + "confidence_threshold": "신뢰도 임계값", + "correct_duration": "올바른 기간(분, 선택 사항)", + "correct_profile": "올바른 프로필", + "correlation": "상관관계", + "cost": "비용", + "create_new_profile": "+ 새 프로필 만들기…", + "current_phase": "현재 단계", + "curves": "곡선", + "cycle": "사이클", + "cycle_date_display": "주기 날짜 표시", + "cycle_health": "사이클 건강", + "cycle_index": "사이클 번호 →", + "cycles": "사이클", + "cycles_count": "사이클", + "cycles_lc": "사이클", + "dashed": "점선", + "date": "날짜", + "debug_traces": "디버그 추적", + "default": "기본", + "default_access_level": "아래에 나열되지 않은 사용자의 기본 수준", + "default_other": "기본값(기타 장치)", + "default_tab": "패널을 열 때 기본 탭", + "delta": "Δ", + "description": "설명", + "dtw_blend_w": "혼합 가중치", + "dtw_blended": "혼합 점수", + "dtw_ddtw": "DDTW 점수", + "dtw_l1": "L1 점수", + "dtw_matched_profile": "(사이클의 일치 프로필)", + "duration": "지속 시간", + "duration_agreement": "지속 시간 일치도", + "emphasis": "중요성", + "enable_access_control": "사용자별 액세스 제어 활성화", + "energy": "에너지", + "energy_agreement": "에너지 일치도", + "event_timeline": "이벤트 타임라인", + "event_type": "이벤트 유형", + "expected": "예상", + "expected_duration": "예상 기간(분)", + "file_kb": "파일(KB)", + "final_score": "최종 점수", + "from": "시작", + "gap_s": "간격(초)", + "group_name": "그룹 이름", + "head_trim": "헤드 트림(초)", + "health": "건강", + "hide_tabs": "관리자가 아닌 사용자를 위한 탭 숨기기", + "in_use": "사용 중", + "json_data": "JSON 데이터", + "label": "매칭된 프로그램", + "last": "최근", + "last_checked": "마지막 확인:", + "load_from_file": "파일에서 로드", + "mae_score": "MAE 점수", + "manual_duration": "수동 기간(분, 선택 사항)", + "match": "매칭", + "members": "구성원", + "metric": "지표", + "mode_existing_profile": "기존 프로필에 추가", + "mode_new_profile": "새 프로필 만들기", + "models_fine_tuned": "({count}개 모델{plural} 미세 조정됨)", + "n_classic_suggestions": "{n} 클래식", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n}개 선택됨", + "n_tuning_suggestions": "{n} 조정 제안", + "na": "해당 없음", + "new_profile_name": "새 프로필 이름", + "notes": "메모", + "of": "/", + "outcome": "결과", + "panel_default_tab": "기본 탭", + "panel_language": "패널 언어", + "per_cycle_short": "사이클", + "pg_anti_wrinkle": "구김 방지", + "pg_autofill_tip": "현재 값에서 범위 자동 채우기 ({lo}–{hi})", + "pg_best_value": "찾은 최적 값", + "pg_current_value": "현재 값:", + "pg_drag_hint": "그래프의 선을 드래그하세요", + "pg_dtw": "DTW", + "pg_ev_ending": "종료 중", + "pg_ev_running": "실행 중", + "pg_group_advanced": "예외 상황", + "pg_group_detection": "감지 트리거", + "pg_group_timing": "타이밍 규칙", + "pg_idle": "대기", + "pg_last_run": "마지막 실행: {date}", + "pg_match_score": "매칭 점수", + "pg_pct_of": "{total}개 중 {p}%", + "pg_poor_match": "불량 매칭", + "pg_preset": "플레이그라운드 프리셋", + "pg_preset_name": "새 프리셋 이름", + "pg_preset_none": "프리셋 선택…", + "pg_strong_match": "강한 매칭", + "pg_tile_ambiguous": "모호함", + "pg_tile_ambiguous_tip": "두 프로그램이 거의 동점인 사이클", + "pg_tile_detected": "감지됨", + "pg_tile_detected_tip": "전력이 실행 중으로 등록될 만큼 충분히 오래 시작 임계값을 넘은 사이클", + "pg_tile_matched": "매칭됨", + "pg_tile_matched_tip": "알려진 프로그램에 올바르게 귀속된 사이클", + "pg_time_left": "남은 시간", + "pg_weak_match": "약한 매칭", + "phase_name": "이름", + "phase_timeline": "단계 타임라인", + "power": "전력", + "profile": "프로필", + "profile_index": "프로필 번호 →", + "profile_name": "프로필 이름", + "program": "프로그램", + "program_tip": "현재 사이클에 매칭되는 프로파일을 재정의합니다. 자동 감지를 통해 통합이 최적의 일치를 자동으로 선택합니다. 자동 감지가 잘못되었거나 실행 중인 프로그램을 알 때 특정 프로그램을 고정하여 강제 일치시킵니다.", + "progress": "진행률", + "raw_socket": "원시 소켓", + "read_only": "읽기 전용", + "ref_cycle": "참조 주기(선택 사항)", + "refresh_interval": "새로 고침 간격(초)", + "remaining": "남은 시간", + "reminder_every": "알림 주기 (사이클)", + "remove_label": "- 라벨 제거 -", + "rename_profile": "프로필 이름 바꾸기", + "replay_duration": "재생", + "resulting_profile": "결과 프로필", + "save_mode": "저장 모드", + "score": "점수", + "score_breakdown": "점수 세부 내역", + "seconds_from_start": "시작부터 경과 시간(초)", + "select_profile": "프로필 선택", + "setting": "설정", + "settings_a": "설정 A (현재)", + "settings_a_short": "A", + "settings_advanced": "고급", + "settings_b": "설정 B (테스트)", + "settings_b_short": "B", + "settings_basic": "기본", + "settings_detail_level": "설정 상세 수준", + "settings_overrides": "설정 재정의", + "show_debug": "상태 페이지에 실시간 매치 디버그 카드 표시(신뢰도, 모호함, 상위 후보)", + "show_expected": "예상 곡선 오버레이 표시(일치하는 프로필, 주황색)", + "show_raw": "라이브 전력 그래프에 원시 소켓 토글 표시", + "sparkline": "최근 사이클 지속 시간 추세", + "stage2": "2단계 – 핵심 유사도", + "stage3": "3단계 – DTW", + "stage4": "4단계 – 일치도", + "status": "상태", + "tail_trim": "테일 트림(초)", + "timer_auto_pause": "자동 일시중지", + "timer_min": "분", + "timer_msg_placeholder": "메시지(선택사항, {device}/{program}/{minutes})", + "to": "끝", + "ungrouped": "그룹 없음", + "unlabelled": "라벨이 지정되지 않음", + "unlabelled_paren": "(라벨 없음)", + "warp_path": "워프 경로", + "input": "입력:", + "start": "시작", + "end": "종료", + "unit_s": "(초)", + "reviewed_on": "{date}에 검토됨", + "unknown": "알 수 없음", + "quality": "품질", + "tags": "태그", + "at": "시각", + "pct_match_confidence": "매칭 신뢰도 {pct}%", + "ha_restarted": "HA 재시작됨", + "from_start": "시작부터", + "to_end": "끝까지", + "click_to_select": "클릭하여 선택", + "envelope": "엔벨로프", + "zoom_hint": "스크롤하여 확대 · 더블클릭하여 초기화", + "loading_paren": "(로드 중…)", + "time_remaining": "~{v} 남음", + "no_duration": "기간 없음", + "duration_avg": "평균 ~{v}분", + "name_placeholder": "(이름)", + "n_shown": ", {n}개 표시됨", + "cycles_title": "사이클 ({n})", + "pg_detecting": "감지 중", + "pg_best_marker": "최적: {v}", + "pg_time_left_model": "남은 시간(모델)", + "pg_time_left_model_tip": "모델이 추정한 남은 시간(단계 추정 + ML 혼합)으로, 고정된 카운트다운이 아닙니다.", + "phase": "단계", + "pg_mode_simulate": "시뮬레이션", + "pg_mode_history": "이력 테스트", + "pg_mode_sweep": "스윕", + "pg_ev_detected": "감지됨", + "pg_ev_match": "매칭 확정", + "pg_ev_match_changed": "매칭 변경", + "pg_ev_ambiguous": "모호함", + "pg_ev_unmatched": "매칭 안 됨", + "pg_ev_notify_start": "시작 알림", + "pg_ev_notify_pre": "거의 완료 알림", + "pg_ev_notify_finish": "완료 알림", + "pg_ev_notify_milestone": "마일스톤 알림", + "pg_ev_notify_held": "알림 보류(방해 금지 시간)", + "pg_ev_finished": "완료", + "pg_ended": "종료됨", + "pg_proj_energy": "예상 에너지", + "pg_alert_overrun": "너무 김", + "pg_alert_underrun": "너무 짧음", + "pg_alert_did_not_finish": "미완료", + "pg_alert_false_end": "여러 사이클로 분할됨", + "pg_alert_unmatched": "매칭 안 됨", + "pg_alert_ambiguous": "모호한 매칭", + "pg_alert_energy": "에너지 이상", + "pg_newly_correct": "새로 정답", + "pg_regressed": "후퇴", + "pg_end_timing_changed": "종료 타이밍 변경", + "pg_vs_current": "현재 대비", + "pg_fixed": "해결됨", + "pg_broke": "문제 발생", + "pg_sweep_param": "매개변수", + "pg_objective": "목표", + "pg_steps": "단계 수", + "pg_stress_group": "대기 상태 종료 테스트", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "대기 레벨 (W)", + "pg_stress_idle_w_desc": "자동 감지된 대기 전력 하한값을 재정의합니다(자동의 경우 빈칸으로 두세요).", + "pg_stress_toggle": "대기 상태 종료 테스트", + "pg_stress_toggle_desc": "기록 종료 후 기기가 대기 전력 수준에서 계속 작동하는 상황을 시뮬레이션합니다 - WashData가 사이클을 중지하는지, 언제 중지하는지 확인합니다.", + "pg_sweep_2d": "2D 히트맵", + "pg_sweep_param_y": "두 번째 매개변수", + "pg_obj_match": "매칭 정확도", + "pg_obj_endtiming": "종료 타이밍 정확도", + "pg_obj_falseend": "잘못된 종료율", + "pg_obj_overrun": "소요 시간 편차", + "pg_obj_ambiguity": "모호 비율", + "pg_best_combo": "최적 조합", + "pg_mode_optimize": "최적화", + "pg_group_matching": "프로그램 매칭", + "pg_zoom_hint": "더블클릭하여 확대/축소 초기화", + "aria_playground_chart2": "대화형 사이클 전력 그래프: 마우스를 올리면 시간/전력 표시, 스크롤하여 확대/축소, 드래그하여 이동", + "pg_alert_timeout_end": "예측이 아닌 타임아웃으로 종료됨", + "pg_alert_indefinite": "무한정 계속 실행됨", + "pg_alert_stress_cap": "안전 한도에 도달했습니다", + "pg_alert_stress_ok": "대기 상태 종료: 사이클이 중지되었습니다", + "pg_alert_stress_warn": "대기 전력이 정지 임계값을 초과합니다", + "task_pg_history": "기록으로 테스트", + "task_pg_sweep": "최적화", + "task_reprocess": "재처리", + "task_ml_training": "학습", + "eta_secs": "~{n}초 남음", + "eta_mins": "~{n}분 남음", + "pg_recent_runs": "최근 실행", + "pg_load_run": "이 실행 다시 불러오기", + "pg_match_confidence": "매칭 신뢰도", + "pg_envelope_fit": "엔벨로프 적합도", + "pg_envelope_fit_tip": "이 프로필의 저장된 전력 엔벨로프 안에 사이클이 얼마나 잘 들어맞는지 보여줍니다. 매칭 신뢰도와는 다른 관점입니다.", + "n_imported_note": ", {n}개 가져옴", + "enable_online": "온라인 기능 활성화", + "store_brand": "가전제품 브랜드", + "store_model": "가전제품 모델", + "anonymous": "익명", + "rate_quality": "품질 평가", + "rate_n": "별 {n}개", + "approved_only": "승인된 항목만", + "adopt_settings": "설정도 채택", + "flags": "플래그", + "include_phase_map": "페이즈 맵 포함", + "include_settings": "감지 및 매칭 설정 포함", + "show_contributor": "기여자 이름 표시", + "task_pg_detail": "사이클 시뮬레이션", + "task_split": "사이클 분할 중", + "task_trim": "사이클 트리밍 중", + "task_merge": "사이클 병합 중", + "task_rebuild": "엔벨로프 재구성 중", + "cat_profiles": "프로필(프로그램)", + "cat_real_cycles": "사이클(실행 기록)", + "cat_reference_cycles": "참조 사이클(가져옴)", + "cat_custom_phases": "사용자 지정 단계", + "cat_profile_groups": "프로필 그룹", + "cat_settings": "감지 및 인식 설정", + "cat_matching_config": "인식기 조정", + "cat_ml_models": "ML 모델", + "cat_feedback": "피드백 및 검토 라벨", + "cat_suggestions": "제안", + "cat_maintenance_log": "유지관리 로그", + "cat_history_logs": "기록 및 변경 로그", + "cat_lifetime_stats": "누적 합계", + "cycles_short": "사이클", + "import_mode": "결합 방법", + "mode_merge": "병합(내 것 유지)", + "mode_replace": "선택 항목 교체", + "cycle_destination": "가져온 사이클을 어디에 저장할까요?", + "dest_reference": "참조(형태만)", + "dest_real_history": "실제 기록(통계에 집계)", + "conflict_resolution": "이름 충돌", + "conflict_import_copy": "사본으로 가져오기", + "conflict_keep_mine": "내 것 유지", + "conflict_overwrite": "덮어쓰기", + "font_size": "패널 글꼴 크기" }, - "phase1b": { - "recorded": "녹음이 {profile_name}으로 저장되었습니다. 이제 다른 자주 사용하는 프로그램을 기록하거나 라벨을 지정하여 커버리지를 구축하세요." + "log": { + "all_levels": "모든 레벨", + "all_devices": "모든 기기", + "all_components": "모든 구성 요소", + "search_ph": "로그 검색…" }, - "phase1c": { - "verify": "커뮤니티에서 {count}개의 프로그램이 있습니다. WashData가 올바르게 인식하는지 확인하기 위해 사이클을 실행하세요 – 기기가 자체 기록을 쌓으면서 매칭이 개선됩니다." + "ml": { + "builtin_models": "● 내장 모델 사용", + "fit_fair": "보통", + "fit_good": "좋은", + "fit_slight": "근소한", + "fit_strong": "강한", + "fit_weak": "약한", + "fit_word": "맞다", + "personalized": "● 이 기계에 맞춤화됨", + "better_than_baseline": "기준 추정치보다 {pct}% 향상 ({metric})", + "trend_improving_tip": "이 모델의 적합도가 최근 재확인을 거치며 개선되었습니다.", + "trend_declining_tip": "이 모델의 적합도가 최근 재확인에서 하락했습니다 · 더 많은 사이클을 검토하면 다시 학습하는 데 도움이 될 수 있습니다.", + "trend_steady_tip": "이 모델의 적합도가 최근 재확인에서 거의 꾸준히 유지되었습니다.", + "cap_blurb": { + "end": "사이클이 실제로 완료된 시점 파악", + "live_match": "실행 중인 프로그램을 더 빨리 식별", + "quality": "잘못 감지되었거나 손상된 사이클 찾기", + "remaining_time": "남은 시간 예측", + "total_energy": "총 에너지와 비용 예측" + }, + "cap_label": { + "end": "사이클 종료 감지", + "live_match": "프로그램 매칭", + "quality": "사이클 품질 검사", + "remaining_time": "남은 시간 추정", + "total_energy": "에너지 추정" + }, + "metric_auc": "검증 데이터 기준 AUC {auc}", + "metric_mae": "오차 {model} vs 기준선 {baseline}" }, - "phase2": { - "cluster": "WashData가 저장된 프로그램과 일치하지 않는 {count}개의 사이클을 발견했습니다 – 서로 비슷해 보입니다. 이를 위한 새 프로필을 만들고 싶으신가요?", - "unmatched": "마지막 사이클이 저장된 프로그램과 일치하지 않았습니다. 새 프로그램인가요?" + "modal": { + "auto_label": "자동 라벨 주기", + "correct_feedback": "올바른 피드백", + "create_profile": "프로필 만들기", + "cycle": "주기", + "edit_group": "프로필 그룹 편집", + "edit_phase": "단계 편집", + "import_config": "구성 가져오기", + "label_cycle": "라벨주기", + "merge_cycles": "{n} 사이클 병합", + "new_group": "새 프로필 그룹", + "new_phase": "새로운 단계", + "process_history_msg": "매칭을 재실행하고, 제안을 새로 고치고, ML을 재훈련하고(활성화된 경우), 저장된 모든 사이클의 사이클 상태를 재계산합니다. 시간이 걸릴 수 있습니다.", + "process_history_ok": "처리", + "process_history_title": "기록 처리", + "process_recording": "프로세스 기록", + "delete_maintenance_msg": "이 유지보수 기록을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "delete_maintenance_title": "유지보수 이벤트 삭제", + "relabel_cycles": "{count}개 사이클 다시 라벨 지정", + "delete_automation_title": "자동화 삭제", + "delete_automation_msg": "Home Assistant에서 자동화 \"{name}\"을(를) 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "remove_legacy_title": "레거시 작업 제거", + "remove_legacy_msg": "레거시 맞춤 작업을 제거하시겠습니까? 사이클 이벤트에서 더 이상 실행되지 않습니다. 이 작업은 패널에서 취소할 수 없습니다.", + "discard_recording_title": "녹음 삭제", + "discard_recording_msg": "저장된 녹음을 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "dismiss_all_title": "모든 피드백 무시", + "dismiss_all_msg": "보류 중인 피드백 요청 {count}건을 모두 무시하시겠습니까?", + "dismiss_all_ok": "모두 무시", + "delete_phase_title": "단계 삭제", + "delete_phase_msg": "단계 \"{name}\"을(를) 삭제하시겠습니까?", + "clear_debug_title": "디버그 데이터 지우기", + "clear_debug_msg": "저장된 모든 디버그 추적을 삭제하시겠습니까?", + "wipe_all_title": "모든 데이터 지우기", + "wipe_all_msg": "⚠️ 모든 사이클과 프로필이 영구적으로 삭제됩니다. 이 작업은 취소할 수 없습니다.", + "wipe_all_ok": "전부 지우기", + "force_stop_title": "사이클 강제 정지", + "force_stop_msg": "지금 실행 중인 사이클을 강제 정지하시겠습니까? 사이클은 중단됨으로 저장됩니다.", + "store_import": "참조 주기 가져오기", + "store_share": "커뮤니티 스토어에 공유", + "store_share_device": "이 기기 공유", + "export_select": "내보내기 - 데이터 선택", + "import_wizard": "가져오기 - 데이터 선택" }, - "phase3": { - "suggestions": "WashData가 사이클 기록을 기반으로 설정 권장 사항을 제안합니다 – 감지 정확도를 높이기 위해 검토하세요.", - "groups": "일부 프로필이 다른 온도의 동일한 프로그램처럼 보입니다. 더 나은 매칭을 위해 그룹으로 구성하세요.", - "phases": "더 정확한 잔여 시간 추정을 위해 {profile_name}에 프로그램 단계를 추가하세요." + "msg": { + "appliance_monitor": "가전제품 모니터", + "artifact_dip_detail": "일반 전력 범위 아래로 약 {n}초 동안 내려갔습니다.", + "artifact_footer": "위 그래프에 강조표시되어 있습니다. 이는 일시적인 아티팩트(예: 사이클 중간에 문이 열림)이며 반드시 문제가 되는 것은 아닙니다.", + "artifact_header": "이 주기 동안 {n}개의 이상 현상이 감지되었습니다.", + "artifact_pause_detail": "전력이 약 {n}초 동안 거의 0으로 떨어진 후 재개되었습니다. 사이클 도중 문이 열리거나 일시 정지된 것으로 보입니다.", + "artifact_spike_detail": "일반 전력 범위 위로 약 {n}초 동안 나타났습니다.", + "auto_label_intro": "일치 신뢰도가 임계값을 클리어하는 레이블이 없는 주기에 프로필을 할당합니다.", + "automations_intro": "WashData는 {start} / {end} 이벤트를 발생시키고 엔티티를 노출하므로, 알림과 동작은 일반 Home Assistant 자동화로 구축하는 것이 가장 좋습니다. 이 기기를 사용하는 자동화가 아래에 표시됩니다.", + "cleanup_intro": "라벨이 붙은 모든 사이클이 중첩됩니다. 이상값을 선택하고 삭제하여 프로필을 정리하세요.", + "clear_debug_hint": "저장된 디버그 데이터를 제거하여 여유 공간을 확보하세요.", + "collecting_data": "데이터 수집 중입니다. 미세 조정을 시작하려면 {need}번의 사이클{plural}이 더 필요합니다({current}/{min})。", + "compare_overlay_profiles": "오버레이 프로필(희미함)", + "compare_profiles_tip": "위 차트에 다른 프로필 봉투를 겹쳐서 어느 것이 이 주기에 가장 적합한지 확인하세요.", + "compare_selected_cycles": "선택한 주기(단색) – 표시/숨기기", + "consider_new_profile": "새 프로필을 만드는 것을 고려해 보세요.", + "coverage_gap": "최근 주기에 일치하는 프로필이 없습니다(지난 30개 중 {pct}%).", + "coverage_gap_similar_cycles": "유사한 미라벨 사이클 {count}개를 발견했습니다 – 프로필을 만들어 매칭을 시작하세요.", + "cycles_deleted": "{count}개 사이클이 삭제되었습니다", + "enough_data": "학습할 충분한 데이터가 있습니다({current}/{min}사이클)。", + "export_description": "JSON으로 내보낼 프로필, 사이클, 설정 등을 정확히 선택하거나, 파일을 분석하여 원하는 부분만 가져올 수 있습니다.", + "feedback_cycles_pending": "검토가 필요한 사이클 {n}개{s}", + "feedback_prompt": "그것이 옳았는지 확인하고, 프로그램을 수정하거나, 무시하십시오.", + "feedback_relabel_hint": "이 사이클을 다시 라벨 지정하면 이것도 해결됩니다.", + "filter_by_profile": "프로필로 필터링…", + "group_modal_help": "온도/회전이 다른 동일한 모양의 프로그램을 그룹화합니다(기간은 다를 수 있음). 매칭은 그룹을 하나의 후보로 평가한 다음 가장 적합한 멤버를 선택합니다. 최소 2개를 선택하세요. 오버레이는 얼마나 유사한지 보여줍니다.", + "group_not_cohesive": "이러한 프로필은 안정적으로 그룹화할 만큼 유사하지 않으므로 일치는 이상값을 제거하거나 그룹을 분할할 때까지 프로필을 개별적으로 처리합니다.", + "group_preview_hint": "2명 이상의 멤버를 선택하여 전력 곡선을 미리 보고 비교하세요.", + "import_intro": "내보낸 파일을 로드하거나 아래에 JSON 페이로드를 붙여넣으세요.", + "legacy_actions_title": "{count} 레거시 맞춤 작업이 아직 실행 중입니다.", + "live_chart_loading": "판독값이 도착하면 실시간 전력 차트가 나타납니다.", + "loading": "로드 중…", + "loading_curve": "곡선 로드 중…", + "loading_settings": "설정 로드 중…", + "log_buffer_hint": "최신 항목부터 · 다시 시작한 이후 마지막 500개의 ha_washdata 레코드를 버퍼링합니다. · 크기를 조정하려면 아래쪽 가장자리를 드래그합니다.", + "maintenance_advisory": "지속 시간/에너지가 늘어나면 기기 유지 관리(예: 석회질 제거, 필터 청소)가 필요함을 나타낼 수 있습니다.", + "maintenance_due": "유지보수 예정: {items}", + "maintenance_intro": "이 가전에 수행한 정비를 기록하면 각 작업의 다음 예정 시기에 알림을 받습니다.", + "maintenance_load_error": "유지보수 데이터를 불러올 수 없습니다: {error}", + "maintenance_requires_access": "유지 관리 및 내보내기/가져오기에는 전체 액세스 권한이 필요합니다.", + "manual_duration_hint": "남은 시간 추정에 사용되는 프로필의 평균/예상 주기 길이입니다. 설정하려면 편집하세요. 변경하지 않고 그대로 두면 현재 값이 유지됩니다.", + "matching_tuning_intro": "학습할 때 WashData는 프로그램 일치가 모양, 지속 시간 및 에너지에 얼마나 큰 영향을 미치는지 조정합니다.", + "merge_intro": "선택한 사이클이 하나로 결합됩니다(연대순, 간격이 0W로 채워짐). 결과 프로필을 선택합니다.", + "ml_intro": "WashData는 즉시 사용 가능한 스마트 모델과 함께 제공됩니다.", + "ml_learned_intro": "이 기계에 맞게 미세 조정된 모델입니다.", + "ml_loading": "ML 로드 중…", + "ml_settings_intro": "두 개의 독립적인 스위치: 하나는 사이클이 실행되는 동안 모델을 적용하고 다른 하나는 WashData가 시간이 지남에 따라 기계에 맞게 미세 조정할 수 있도록 합니다.", + "name_first_program": "충분한 사이클이 모였습니다 – 첫 프로그램에 이름을 지정하여 일치를 시작하세요.", + "near_duplicate_cluster": "거의 중복된 프로필 클러스터가 감지되었습니다. 그룹화를 통해 일치하는 항목을 유사 항목(예: 서로 다른 온도/회전의 동일한 프로그램) 중에서 안정적으로 선택할 수 있습니다.", + "no_cycles_match": "현재 필터와 일치하는 사이클이 없습니다.", + "no_cycles_profile": "이 프로필에는 사이클이 없습니다.", + "no_cycles_selected": "먼저 사이클을 하나 이상 선택하세요.", + "no_cycles_yet": "아직 기록된 사이클이 없습니다.", + "no_device_selected": "선택한 장치가 없습니다.", + "no_devices": "아직 구성된 WashData 장치가 없습니다.", + "no_envelope": "아직 봉투가 없습니다. 라벨링 주기 후에 재구축하세요.", + "no_envelope_overlay": "오버레이할 수 있는 봉투가 없습니다.", + "no_fine_tuned": "아직 세부 조정된 사항은 없습니다. WashData는 내장 모델을 사용하고 있습니다.", + "no_logs": "아직 버퍼링된 로그 레코드가 없습니다.", + "no_maintenance": "아직 기록된 유지보수가 없습니다.", + "no_match_yet": "아직 일치 시도가 없습니다. 이는 실행 주기 중에 채워집니다.", + "no_other_users": "다른 홈어시스턴트 사용자를 찾을 수 없습니다.", + "no_phases": "정의된 단계가 없습니다.", + "no_phases_assigned": "할당된 단계가 없습니다.", + "no_profiles_compare": "비교할 프로필이 없습니다.", + "no_profiles_overlay": "오버레이할 프로필이 없습니다.", + "no_profiles_yet": "아직 프로필이 없습니다. 레이블이 지정된 주기에서 하나를 만듭니다.", + "no_profiles_yet_short": "아직 프로필이 없습니다.", + "no_settings_match": "\"{q}\"과(와) 일치하는 설정이 없습니다.", + "no_split_points": "아직 분할 지점이 없습니다.", + "no_suggestions": "활성 제안이 없습니다.", + "notify_services_hint": "{entity} 서비스 ID를 사용하세요(여러 개는 쉼표로 구분)。템플릿 변수:{vars}。", + "old_actions_warning": "이전 작업 편집기로 구성되었습니다(현재 제거됨). 사이클 이벤트에서는 여전히 실행되지만 여기에서는 더 이상 편집할 수 없습니다. 일반 자동화로 변환하거나 제거하십시오.", + "onboarding_progress": "{n} / 3개 사이클 관찰됨", + "onboarding_watching": "가전을 평소처럼 사용하세요 – WashData가 관찰하고 있습니다. 3개 사이클 후 프로그램 일치가 시작됩니다.", + "pending_feedback": "보류 중인 감지 피드백", + "performance_trend": "실적 추세({n}주기)", + "pg_analysis_empty": "매칭 분석을 보려면 사이클을 불러오세요.", + "pg_apply_confirm": "최적 값 적용: {label} = {value}?", + "pg_canvas_empty": "위에서 사이클을 선택한 다음 불러오기를 눌러 전력 트레이스를 확인하세요.", + "pg_chart_caption": "{param} 값에 따른 감지/매칭률", + "pg_ctrl_intro": "값은 이 기기에 적용 중인 통합 설정에서 시작합니다. 편집한 내용은 적용하기 전까지 플레이그라운드에만 남습니다.", + "pg_live_unavailable": "적용 중인 설정을 가져올 수 없어 기본값을 표시합니다.", + "pg_load_live_confirm": "플레이그라운드 편집 {n}개를 버리고 통합의 현재 설정을 다시 불러오시겠습니까?", + "pg_match_rate": "{total}개 사이클에서 {pct}% 매칭률", + "pg_matches_live": "적용 중인 설정과 동일", + "pg_n_changed": "적용 중인 설정과 {n}개 다름", + "pg_sugg_none": "모든 제안이 현재 설정과 이미 일치합니다", + "pg_preset_delete_confirm": "프리셋 \"{name}\"을(를) 삭제하시겠습니까?", + "pg_preset_limit": "프리셋 개수 제한에 도달했습니다({n})", + "pg_preset_overwrite": "프리셋 \"{name}\"을(를) 덮어쓰시겠습니까?", + "pg_publish_one_confirm": "{label} = {value}을(를) 이 기기의 설정에 저장하시겠습니까?", + "pg_restart_note": "시뮬레이션 도구를 활성화하려면 Home Assistant를 다시 시작하세요.", + "pg_sim_progress": "{done} / {total} 사이클", + "pg_starting": "시작 중…", + "pg_stress_synthetic": "대기 시뮬레이션이 여기서 시작됩니다", + "pg_sweep_intro": "{param}이(가) 달랐다면 어땠을까요? 가장 많은 사이클이 올바르게 매칭되는 설정을 찾기 위해 최근 {cycles}개 사이클에서 {steps}개 값을 테스트합니다.", + "pg_sweep_step": "단계 {done} / {total}", + "pg_undetected": "{n}개 사이클{s} 미감지", + "pg_verdict_bad": "주의 필요: 많은 사이클이 감지되지 않고 있습니다.", + "pg_verdict_good": "잘 조정됨: 대부분의 사이클이 올바르게 식별되고 매칭됩니다.", + "pg_verdict_ok": "양호: 일부 사이클을 놓쳤습니다. 시작 임계값을 낮춰 보세요.", + "phase_catalog_intro": "주기의 명명된 부분(세탁 전, 가열, 탈수…). 제어판에서 프로필에 할당합니다.", + "phase_ranges_intro": "평균 곡선에 중첩된 단계 범위(사이클 시작 후 분). 실시간으로 미리 보려면 값을 편집하세요.", + "playground_intro": "과거 사이클을 다른 설정으로 재생하고, 두 구성을 나란히 비교하며, 사이클이 프로필에 어떻게 정렬되는지 살펴볼 수 있는 안전한 샌드박스입니다. 명시적으로 적용하기 전까지 여기서의 작업은 실제 데이터를 변경하지 않습니다.", + "playground_needs_restart": "플레이그라운드 도구를 활성화하려면 Home Assistant를 다시 시작하세요.", + "preferences_admin": "환경 설정, 패널 및 액세스 제어", + "preferences_adv": "환경설정", + "prefs_personal": "이는 홈어시스턴트 계정에만 적용됩니다.", + "process_history_hint": "저장된 모든 사이클에 대해 매칭을 재실행하고, 튜닝 제안을 새로 고치고, ML 모델을 재훈련하고(활성화된 경우), 사이클 상태를 재계산합니다. 일괄 검토 후 실행하세요.", + "profile_deleted": "프로필이 삭제되었습니다", + "profile_poor_health_detail": "이 프로필에 할당된 주기의 모양이 일관되지 않거나 신뢰도가 낮습니다. 봉투를 재구성하거나 라벨이 붙은 주기를 검토하는 것을 고려하십시오.", + "profiles_intro": "통계, 단계 및 정리를 보려면 프로필을 클릭하세요. 거의 동일한 프로그램(동일한 모양/기간, 다른 온도 또는 회전)을 그룹화하여 일치하는 프로그램을 안정적으로 선택합니다.", + "rbac_hint": "꺼져 있으면 모든 홈어시스턴트 사용자가 전체 액세스 권한을 갖습니다(기본값). 관리자는 항상 전체 액세스 권한을 가지며 모든 사람을 관리할 수 있습니다.", + "recent_logs": "최근 ha_washdata 기록", + "recording_in_progress": "녹음 진행 중", + "reminders_intro": "마지막 서비스 이후 지정한 사이클 수가 지나면 패널에 알림을 표시합니다. 비워 두거나 0으로 설정하면 알림이 꺼집니다.", + "restart_gap_footer": "그래프에서 강조 표시됩니다. 이 구간에 전력 데이터가 없습니다. 매칭에는 실제 측정값만 사용되었습니다.", + "restart_gap_header": "{n} HA 재시작 공백 (이 사이클 중)", + "restart_gap_item": "{dur} 공백", + "review_confirm_help": "이 주기가 올바르게 감지되었는지 확인하십시오. 귀하의 리뷰는 귀하의 기계에서 모델을 훈련시킵니다. 더 많은 주기를 확인할수록 더 나은 일치 및 상태 점수를 얻을 수 있습니다. 빠른 좋음/나쁨이면 충분합니다.", + "review_in_settings": "설정에서 검토", + "review_notes_placeholder": "메모(선택사항)", + "review_notes_tip": "자신만의 참조를 위한 자유 텍스트 메모입니다. 일치 또는 훈련에서는 사용되지 않습니다.", + "review_profile_tip": "이 주기에 라벨이 붙은 프로그램입니다. 자동 감지된 프로그램이 잘못된 경우 여기에서 수정하십시오. 라벨링은 향후 주기에 대한 일치를 가르칩니다.", + "review_quality_tip": "이주기가 얼마나 깨끗한 지. 좋음 = 이 프로그램의 교과서 예제; 나쁨 = 감지되었지만 잡음이 많거나 비정형적임; 사용할 수 없음 = 잘못 감지됨(병합, 잘림 또는 허위). 상태 점수와 모델 학습에 허용되는 주기를 결정합니다.", + "review_recorded_tip": "이를 프로그램에 대해 직접 선택한 참조 주기로 표시합니다. 이는 수동으로 기록된 주기와 동일한 역할입니다. 참조 순환은 항상 유지되고 일치하는 템플릿을 시드하며 정리로 인해 삭제되지 않습니다. (이것은 \"황금\"/기록된 플래그입니다. 둘 다 동일합니다.)", + "review_tags_tip": "이 주기에 무엇이 잘못되었는지 설명하는 선택적 플래그이므로 훈련과 정리가 이를 설명할 수 있습니다.", + "review_to_cycles": "사이클 검토 대기열 열기", + "saving_triggers_reload": "저장하면 통합 다시 로드가 트리거됩니다. HA 엔터티는 일시적으로 사용할 수 없는 것으로 표시될 수 있습니다.", + "search_placeholder": "검색 설정…", + "see_recorder": "아래의 녹음기 위젯을 참조하세요", + "setting_changed": "{date}에 {old}에서 {new}(으)로 변경됨", + "settings_basic_note": "필수 설정만 표시하고 있습니다. 전체 목록을 보려면 고급으로 전환하세요.", + "shape_drift_advisory": "⚠ 형태 변화 감지됨", + "shape_drift_detail": "이 프로필의 전력 패턴이 시간이 지남에 따라 변화했습니다 – 가전제품 마모 또는 유지보수가 필요할 수 있습니다 (예: 스케일 제거, 필터 청소).", + "show_all_settings": "모든 설정 표시", + "showing_suggestions": "제안사항과 함께 {count} 설정을 표시합니다.", + "split_intro": "그래프를 클릭하여 분할 지점을 추가 또는 제거하거나 유휴 간격으로 자동 감지합니다. 각 결과 세그먼트는 자체 프로필을 얻을 수 있습니다.", + "storage_diagnostics": "스토리지 통계, 유지 관리, 내보내기/가져오기", + "sug_staged": "{key} = {val} 설정됨. 저장하면 적용됩니다.", + "toast_auto_detect_enabled": "자동 감지 활성화됨", + "toast_auto_label_complete": "자동 레이블 지정 완료", + "toast_auto_label_failed": "자동 레이블 지정 실패: {error}", + "toast_automation_failed": "자동화를 생성할 수 없습니다: {error}", + "toast_automation_migrated": "작업이 자동화로 이전됨; 편집기 열기", + "toast_convert_failed": "변환 실패: {error}", + "toast_create_failed": "생성 실패: {error}", + "toast_delete_failed": "삭제 실패: {error}", + "toast_error": "오류: {error}", + "toast_failed": "실패: {error}", + "toast_force_stop_failed": "강제 중지 실패: {error}", + "toast_name_required": "이름이 필요합니다", + "toast_no_automation": "여기서는 자동화를 생성할 수 없습니다", + "toast_profile_name_required": "프로필 이름이 필요합니다", + "toast_program_set": "프로그램이 설정됨: {program}", + "toast_rebuild_failed": "재구성 실패: {error}", + "toast_resume_failed": "재개 실패: {error}", + "toast_revert_failed": "되돌리기 실패: {error}", + "toast_reverted": "{key}을(를) 되돌렸습니다", + "toast_save_failed": "저장 실패: {error}", + "trend_duration_longer": "기간이 길어지는 추세({pct}%/주기) – 최근 평균 {avg}", + "trend_duration_shorter": "기간이 짧아지는 추세({pct}%/주기) – 최근 평균 {avg}", + "trend_energy_down": "에너지 감소 추세({pct}%/주기)", + "trend_energy_up": "에너지 상승 추세({pct}%/주기) – 최근 평균 {avg}", + "trim_destructive_confirm": "사이클의 {pct}%만 남으며 이 작업은 취소할 수 없습니다. 계속하시겠습니까?", + "trim_intro": "빨간색 핸들을 드래그하거나 값을 입력합니다. 창 밖의 모든 것이 제거됩니다.", + "tuning_suggestions_available": "관찰된 주기에서 사용할 수 있는 {count} 조정 제안입니다. 관련 필드 옆에 표시됩니다.", + "unsure_detected_prefix": "WashData가 감지되었는지 확실하지 않습니다.", + "updated": "업데이트됨", + "warmup_badge": "학습 중 ({done}/{needed} 사이클)", + "warmup_detail": "이 프로필은 자동 매칭이 시작되기 전에 {needed}개의 라벨이 지정된 사이클이 필요합니다. 확인된 사이클마다 학습에 도움이 됩니다.", + "wipe_history_warning": "모든 사이클과 프로필을 영구적으로 삭제합니다. 취소할 수 없습니다.", + "compare_overlay_tip": "학습된 프로필 봉투를 겹쳐서 각 사이클이 어떤 프로그램과 유사한지 확인하세요.", + "duration_trend_up_tip": "지속 시간 증가 ({pct}%/사이클)", + "duration_trend_down_tip": "지속 시간 감소 ({pct}%/사이클)", + "energy_trend_up_tip": "에너지 증가 ({pct}%/사이클)", + "energy_trend_down_tip": "에너지 감소 ({pct}%/사이클)", + "performance_trending": "실적 추세", + "pg_select_cycle_hint": "사이클을 선택하고 ↺를 클릭하여 불러오세요", + "pg_sweep_progress": "단계 {done} / {total}", + "pg_analysis_hint": "사이클을 선택하고 ↺를 클릭하여 분석을 불러오세요.", + "diagnostics_load_failed": "진단을 불러올 수 없습니다: {error}", + "manual_duration_ref_hint": "참조 주기가 선택되지 않았을 때만 사용됩니다. 참조 주기는 자체 길이에 따라 기간을 설정합니다.", + "toast_convert_rolled_back": "변환에 실패하여 롤백되었습니다(남은 자동화 없음): {error}", + "toast_convert_orphan": "자동화는 생성되었지만 이전 작업 삭제에 실패했습니다. 다시 시도하지 마세요. 중복 자동화를 방지하려면 이전 작업을 수동으로 제거하세요.", + "advisory_duration_trend_up": "'{name}' 사이클이 점점 길어지고 있습니다(사이클당 약 +{pct}%). 기기 동작이 바뀌었다면 이 프로필을 다시 기록하거나 재구성하세요.", + "advisory_energy_trend_up": "'{name}'의 에너지 사용량이 점점 늘고 있습니다(사이클당 약 +{pct}%) - 예상 밖이라면 기기를 점검해 보세요.", + "advisory_poor_health": "'{name}'의 적합도 점수가 낮습니다 - 최근 사이클의 편차가 크거나 매칭이 약합니다. 매칭과 시간 추정의 정확도를 유지하려면 사이클을 검토하거나 프로필을 다시 기록하세요.", + "advisory_shape_drift": "'{name}'이(가) 원래 전력 파형에서 크게 벗어났습니다. 시간이 지나며 기기 동작이 변했을 수 있습니다(예: 물때, 마모). 최근 사이클로 이 프로필을 다시 기록하는 것을 고려하세요.", + "advisory_shape_drift_corr": "'{name}'이(가) 원래 전력 파형에서 크게 벗어났습니다(상관관계 {corr}). 시간이 지나며 기기 동작이 변했을 수 있습니다(예: 물때, 마모). 최근 사이클로 이 프로필을 다시 기록하는 것을 고려하세요.", + "pg_no_alerts": "이번 실행에서 문제가 감지되지 않았습니다.", + "pg_override_active": "편집한 설정을 현재 설정과 비교하여 사용 중", + "pg_history_intro": "최근 사이클을 실제 감지기와 매처로 다시 재생합니다. 여기에서 전후 비교를 보려면 먼저 시뮬레이션에서 감지 설정을 편집하세요.", + "pg_history_empty": "실행을 눌러 사이클을 다시 재생하세요.", + "pg_history_summary": "{detected}/{total} 감지됨 · {correct} 올바르게 매칭", + "pg_sweep_no_metric": "이 목표를 평가하기에 데이터가 부족합니다.", + "pg_sweep_intro2": "최근 사이클 전체에서 목표를 가장 잘 충족하는 설정을 찾습니다. 적용하기 전까지는 아무것도 변경되지 않습니다.", + "pg_running_history": "사이클을 다시 재생하는 중…", + "pg_running_sweep": "전체 사이클에서 값을 테스트하는 중…", + "pg_row_load_hint": "이 사이클을 위 그래프에 불러오기", + "pg_history_intro2": "위 설정으로 최근 사이클을 실제 감지기와 매처를 통해 다시 재생합니다. 행을 클릭하면 해당 사이클을 그래프에 불러옵니다. 설정을 변경하면 변경 전후 비교를 확인할 수 있습니다.", + "pg_simulating": "사이클을 시뮬레이션하는 중…", + "pg_canvas_empty2": "위에서 사이클을 선택하고 실행을 눌러 시뮬레이션하세요. 그런 다음 마우스를 올려 값을 확인하고, 스크롤하여 확대/축소하고, 드래그하여 이동할 수 있습니다.", + "pg_apply_settings_confirm": "이 {n}개 설정을 이 기기에 저장하시겠습니까? {list}", + "pg_stress_terminated_detail": "약 {idle}W 대기 상태로 안정되었습니다 -- {h}시간 {m}분 후 {reason}(으)로 인해 사이클이 종료되었습니다.", + "pg_stress_above_threshold_detail": "대기 전력 약 {idle}W가 유효 정지 임계값 ({stop}W) 이상입니다 -- 사이클이 한 번도 조용한 상태로 인식되지 않았습니다. 해결하려면 stop_threshold_w 값을 높이세요.", + "pg_stress_hit_cap_detail": "사이클이 멈추지 않고 {h}시간 {m}분 동안 실행되었습니다 -- 안전 한도에 의해 강제 중지되었습니다. 대기 전력 {idle}W 대 정지 임계값 {stop}W.", + "no_logs_match": "이 필터와 일치하는 로그 기록이 없습니다.", + "pg_analysis_hint2": "사이클을 선택하고 실행을 누르면 매칭 분석이 로드됩니다.", + "pg_analysis_empty2": "실행을 누르면 매칭 분석이 표시됩니다.", + "imported_readonly": "커뮤니티 스토어에서 가져왔습니다. 참조 및 매칭용으로 표시됩니다. 통계에는 포함되지 않으며 편집할 수 없습니다.", + "merge_no_imports": "가져온 녹음은 실제 사이클에 병합할 수 없습니다. 병합하려면 선택을 해제하세요.", + "store_enable_hint": "설정에서 온라인 기능을 활성화하면 커뮤니티 참조 주기를 탐색하고 가져올 수 있습니다.", + "online_intro": "다른 WashData 사용자와 참조 주기를 공유하고 다운로드하세요. 모든 온라인 기능은 선택 사항이며 기본적으로 꺼져 있습니다.", + "store_share_intro": "이 참조 주기를 업로드하면 같은 가전제품을 사용하는 다른 사용자가 이용할 수 있습니다. 공개되기 전에 검토를 거칩니다.", + "online_intro_global": "다른 WashData 사용자와 참조 녹음을 탐색하고 공유하며 가전제품 항목을 확인하세요. 하나의 연결이 전체 WashData 통합에 적용됩니다. 가전제품 브랜드와 모델은 '기본 구성'에서 기기별로 설정합니다. 모든 온라인 기능은 선택 사항이며 기본적으로 꺼져 있습니다.", + "online_unavailable": "이 서버에서는 온라인 기능을 사용할 수 없습니다.", + "store_picker_offline": "설정(톱니바퀴)에서 온라인 기능을 활성화하면 커뮤니티 카탈로그에서 선택할 수 있습니다.", + "pick_brand_first": "먼저 가전제품 브랜드를 선택하세요.", + "model_not_found": "아직 카탈로그에 없습니다.", + "connect_to_confirm": "확인하거나 평가하려면 설정(톱니바퀴)에서 연결하세요.", + "adopt_settings_hint": "이 기기의 감지 및 매칭 임계값을 공유된 것으로 덮어씁니다. 알림, 엔티티, 에너지 가격은 변경되지 않습니다.", + "include_settings_hint": "이 기기의 인식 및 매칭 임계값을 공유합니다(알림, 엔티티 또는 에너지 가격 제외). 채택자가 적용 여부를 선택합니다.", + "onboard_download": "새 기기인가요? 같은 가전제품을 가진 다른 WashData 사용자의 완성된 설정(프로그램, 참조 사이클, 페이즈)을 채택하세요.", + "share_consent": "이 사이클들이 중단 없이 정상적으로 완료되었음을 확인합니다", + "share_device_none": "아직 공유 가능한 사이클이 없습니다. 먼저 사이클 탭에서 기록되거나 수동으로 선택한 사이클을 참조 사이클(⭐)로 표시하세요.", + "share_guideline_naming": "각 프로파일의 이름을 기기의 다이얼이나 디스플레이에 표시된 대로 정확히 지정하세요(예: 'Cotton 40', 'Eco 60').", + "share_guideline_quality": "정상적으로 완료된 사이클만 공유하세요 -- 사이클 중간 중단, 문 열림 이벤트 또는 전력 이상이 없는 것만 공유합니다.", + "share_guideline_review": "업로드는 검토 중으로 시작되며 충분한 커뮤니티 멤버가 확인하면 공개됩니다.", + "share_guidelines_title": "공유하기 전에", + "store_download_device_intro": "공유된 모든 프로그램과 해당 참조 사이클을 기기에 채택합니다. 직접 기록한 사이클과 통계는 영향을 받지 않습니다.", + "store_share_device_intro": "선택한 참조 사이클과 함께 {brand} {model}을 업로드합니다. 같은 가전제품을 가진 다른 사용자가 프로그램을 채택할 수 있습니다. 항목은 공개 전에 검토됩니다.", + "share_profile_no_cycles": "참조 사이클 없음 -- 이 프로파일을 포함하려면 사이클 탭에서 사이클을 ⭐로 표시하세요", + "advisory_phase_inconsistent": "'{name}'은(는) 서로 다른 프로그램이나 온도가 섞여 있는 것 같습니다. 사이클마다 가열 시간이 크게 다릅니다. 온도별 등으로 별도의 프로필로 나누면 매칭과 시간 추정이 개선됩니다.", + "advisory_phase_inconsistent_title": "⚠ 프로그램이 섞였을 수 있음", + "export_select_intro": "포함할 항목을 정확히 선택하세요. 사이클 없이 프로필만 선택해도 인식 가능한 프로그램은 내보내집니다(학습된 형태도 함께 이동합니다).", + "import_analyze_hint": "내보낸 파일을 불러오거나 해당 JSON을 붙여넣으세요. WashData가 이를 분석하여 변경 전에 가져올 수 있는 항목을 정확히 보여줍니다.", + "analyzing": "분석 중…", + "device_type_mismatch_warn": "이 내보내기는 다른 기기 유형에서 생성되었습니다({src} 대 {local}). 프로그램과 사이클은 참조 데이터로 가져올 수 있지만, 기기별 설정과 실제 기록 가져오기는 비활성화됩니다.", + "merge_hint": "가져온 항목이 추가되며 로컬 데이터는 손실되지 않습니다. 이름 충돌은 아래에서 해결합니다.", + "replace_warn": "선택한 각 범주는 삭제되고 파일 내용으로 교체됩니다. 선택하지 않은 범주는 그대로 유지됩니다.", + "dest_reference_hint": "가져온 사이클은 프로그램 인식만 개선하며 사용량/에너지 통계에는 영향을 주지 않습니다.", + "dest_real_history_hint": "가져온 사이클은 이 기기 자체의 기록으로 집계되어 에너지/사용량 통계에 반영됩니다. 기기 하나를 새 설치 환경으로 옮길 때 사용하세요.", + "sug_muted": "이 설정은 더 이상 제안되지 않습니다", + "sug_mute_failed": "제안을 음소거할 수 없습니다", + "sug_unmuted_all": "뮤트된 제안을 초기화했습니다", + "n_suggestions_muted": "{count}개 뮤트됨. 자동 튜너가 이 설정들을 제안하지 않습니다.", + "font_size_hint": "이 패널의 모든 내용을 크거나 작게 표시합니다. 이 기기의 내 계정에 적용됩니다." }, - "phase4": { - "healthy": "이 기기는 완전히 설정되었습니다 ({profile_count}개 프로필)." + "pg_desc": { + "completion_min_seconds": "실제 사이클로 인정되는 최단 실행", + "end_repeat_count": "종료 전 연속되는 낮은 측정값 횟수", + "interrupted_min_seconds": "짧은 사이클은 중단으로 표시", + "min_off_gap": "두 사이클을 구분하는 데 필요한 간격", + "off_delay": "사이클 종료 전 저전력 지속 초", + "start_duration_threshold": "시작 확정을 위한 임계값 초과 초", + "start_threshold_w": "시작으로 간주할 최소 와트", + "stop_threshold_w": "이 값 미만이면 기기가 꺼진 것으로 간주", + "anti_wrinkle_enabled": "메인 단계 이후의 회전 펄스를 새 사이클로 인식하지 않고 흡수", + "anti_wrinkle_exit_power": "구김 방지가 활성 상태를 유지하려면 펄스 사이 전력이 이 값 아래로 떨어져야 함", + "anti_wrinkle_idle_timeout": "구김 방지가 끝나기 전 두 회전 펄스 사이에 허용되는 정지 시간", + "anti_wrinkle_max_duration": "이보다 긴 펄스는 구김 방지를 끝내고 새 사이클을 시작", + "anti_wrinkle_max_power": "이보다 높은 펄스는 구김 방지를 끝내고 새 사이클을 시작", + "dtw_bandwidth": "Stage 3: Sakoe-Chiba 워프 대역폭 (0 = DTW 비활성; 기본값 0.2 = 사이클 길이의 20%)", + "corr_weight": "Stage 2: 곡선 형태(상관관계)와 전력 수준(MAE) 사이의 균형; 기본값 0.45", + "duration_weight": "Stage 4: 실행 시간 일치가 최종 점수에 미치는 영향(기본값 0.22)", + "energy_weight": "Stage 4: 에너지 일치가 최종 점수에 미치는 영향(기본값 0.22)", + "profile_match_min_duration_ratio": "Stage 1: 프로파일 지속 시간의 분수로서 최소 사이클 길이; 기본값 0.1 (10%)", + "profile_match_max_duration_ratio": "Stage 1: 프로파일 지속 시간의 분수로서 최대 사이클 길이; 기본값 1.5 (150%)", + "keep_min_score": "Stage 2: 경쟁에 남기 위한 최소 점수; 기본값 0.1은 약한 후보도 허용하며, 이후 단계에서 최선을 선택", + "dtw_blend": "Stage 3: 0 = 핵심 점수만, 1 = DTW 점수만, 0.5 = 동등 혼합(기본값)", + "dtw_ensemble_w": "Stage 3 (앙상블 모드): 스케일 L1 대 도함수 DTW 가중치; 기본값 0.7은 수준 인식 방식을 선호", + "dtw_ddtw_scale": "Stage 3: DDTW 반포화 거리; 작을수록 형상에 민감(기본값 30)", + "dtw_refine_top_n": "Stage 3: DTW가 재점수화하는 후보 수; 올바른 프로파일이 4-5위면 7-9로 높임(기본값 5)", + "duration_scale": "Stage 4: 지속 시간 일치 점수가 반으로 줄어드는 로그 비율; 작을수록 엄격한 패널티(기본값 0.175)", + "energy_scale": "Stage 4: 에너지 일치 점수가 반으로 줄어드는 로그 비율; 작을수록 엄격한 패널티(기본값 0.25)", + "dishwasher_end_spike_quiet_release": "식기세척기: 예상 소요 시간 이후 사이클 종료 배수 대기가 해제되기 전 조용히 유지되는 초" }, - "cta": { - "start_recording": "녹음 시작", - "label_detected_cycle": "이미 감지된 사이클이 있습니다 – 대신 라벨 지정", - "browse_cycles": "다른 사이클에 라벨을 지정하려면 찾아보기", - "view_profiles": "프로필 보기", - "create_from_cluster": "이 사이클들로 프로필 만들기", - "create_profile": "이를 위한 프로필 만들기", - "review_suggestions": "제안 검토", - "organise_profiles": "프로필 구성", - "configure_phases": "단계 구성", - "skip_step": "이 단계 건너뛰기", - "skip_forever": "다시 표시 안 함", - "hide_guidance": "안내 숨기기", - "show_guidance": "안내 표시" + "phase_desc": { + "anti_crease": "메인 사이클 후 드럼이 간헐적으로 회전하여 의류 구김을 방지합니다.", + "anti_wrinkle": "메인 사이클 후 드럼이 간헐적으로 회전하여 의류 구김을 방지합니다.", + "cool_down": "사이클 종료 근처에서 열 없이 회전합니다.", + "drain_and_switch": "세탁 모드에서 건조 모드로 전환되는 기간입니다.", + "dry": "히터 및/또는 여열을 이용한 건조 단계입니다.", + "drying": "주요 가열 텀블링 기간.", + "heat_up": "완전 건조가 시작되기 전 초기 히터 예열.", + "pre_rinse": "세제 세척 전 초기 스프레이다운.", + "pre_wash": "본 세탁 전 초기 담금 또는 전처리.", + "rinse": "깨끗한 물로 헹구는 단계. 이 단계는 여러 번 반복될 수 있습니다.", + "sanitize": "살균 프로그램을 위한 고온 세척 단계.", + "sensor_check": "건조도를 측정하는 동안 짧은 저전력 일시 중지입니다.", + "soak": "활성 세탁 단계 사이의 낮은 활동 담금 기간.", + "soak_dw": "무거운 토양의 경우 담그는 기간이 길어집니다.", + "spin": "부하에서 수분을 제거하기 위한 고속 추출.", + "spin_wd": "건조 전환 전 고속 추출.", + "wash": "드럼 이동과 선택적인 가열을 포함한 주요 세탁 사이클.", + "wash_dw": "주요세제를 가열하여 세탁합니다." + }, + "placeholder": { + "add": "추가…", + "group_name": "예:면 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "알림 서비스 추가…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "사람 추가…", + "phase_name": "예:예비 세탁", + "profile_name": "예:면 40°C", + "maintenance_notes": "예: 필터 교체, 도어 씰 청소", + "store_brand": "예: Bosch", + "store_model": "예: WAT28401" + }, + "pref": { + "date_absolute": "절대값(예: 7월 2일 14:32)", + "date_relative": "상대 항목(예: 2시간 전)", + "lang_auto": "시스템 기본값({lang})", + "lang_en": "영어", + "use_panel_default": "(패널 기본값)" + }, + "quality": { + "bad": "나쁜", + "good": "좋은", + "unusable": "쓸 수 없는" + }, + "section": { + "anti_wrinkle": { + "intro": "구김 방지 모드는 메인 단계 이후 낮은 전력 텀블 펄스를 감지하고 완료된 사이클에 포함합니다.", + "label": "구김 방지" + }, + "basic": { + "intro": "핵심 식별 정보와 대부분의 설정에 필요한 기본 사항.", + "label": "기본" + }, + "delay": { + "intro": "지연 시작 감지는 기기가 켜져 있지만 사이클이 아직 시작되지 않은 상태를 식별합니다.", + "label": "지연 시작" + }, + "detection": { + "intro": "사이클의 시작, 실행 및 종료 감지 방법.", + "label": "감지" + }, + "matching": { + "intro": "완료된 사이클을 학습된 프로필에 매칭하고 라벨을 지정하는 방법.", + "label": "매칭" + }, + "ml_training": { + "intro": "기기에서 직접 하는 머신러닝 재훈련 일정 및 데이터 설정.", + "label": "ML 훈련" + }, + "notifications": { + "intro": "사이클 이벤트에 대한 알림 시기와 방법.", + "label": "알림" + }, + "timing": { + "intro": "백그라운드 실행 주기, 오프라인 감시, 및 하우스키핑.", + "label": "타이밍과 감시" + }, + "triggers": { + "intro": "선택적 외부 신호: 종료 트리거, 문 센서, 일시 정지 스위치, 꺼내기 알림.", + "label": "트리거와 문" + }, + "phase_eta": { + "label": "남은 시간", + "intro": "사이클 길이가 온도나 탈수에 따라 달라지는 기기를 위한, 단계를 고려한 남은 시간." + }, + "dishwasher": { + "label": "식기세척기", + "intro": "식기세척기의 사이클 종료 처리입니다. 식기세척기는 일반적으로 짧은 최종 배수 전에 전력을 거의 소비하지 않는 긴 건조 단계로 끝납니다." + } + }, + "setting": { + "anti_wrinkle_enabled": { + "doc": "건조기가 주요 가열 단계 후에 방출하는 짧은 저전력 텀블 펄스를 인식하고 이를 새 주기로 읽는 대신 완료된 주기에 연결해 두십시오.", + "label": "구김 방지 감지 활성화" + }, + "anti_wrinkle_exit_power": { + "doc": "주름 방지 모드가 활성 상태를 유지하려면 펄스 사이에 전력이 이 값 아래로 낮아져야 합니다.", + "label": "종료 전력 임계값" + }, + "anti_wrinkle_idle_timeout": { + "label": "최대 펄스 간격", + "doc": "구김 방지 모드가 종료되기 전에 기기가 두 회전 펄스 사이에서 정지 상태로 있을 수 있는 시간입니다. 건조기가 펄스 사이에 남기는 가장 긴 간격보다 높게 설정하십시오. 그렇지 않으면 이후의 모든 펄스가 잘못된 시작으로 인식됩니다." + }, + "anti_wrinkle_max_duration": { + "doc": "이보다 긴 펄스는 주름 방지 텀블이 아닌 실제 주기로 간주됩니다.", + "label": "최대 지속 시간" + }, + "anti_wrinkle_max_power": { + "doc": "이 전력 이상의 펄스는 주름 방지 텀블이 아닌 실제 새로운 주기로 간주됩니다. 회전 펄스 전력 바로 위에 설정하십시오.", + "label": "구김 방지 최대 전력" + }, + "auto_label_confidence": { + "doc": "사이클 종료 시 일치 점수가 이 이상인 경우 확인 메시지 없이 프로그램에 자동으로 레이블이 지정됩니다. 자동 라벨링 전에 더 높은 확실성을 요구하려면 이 값을 높이세요. 더 많이 자동화하려면 낮추세요. 아래의 학습 자신감과 함께 작동합니다.", + "label": "자동 라벨 신뢰도" + }, + "auto_maintenance": { + "doc": "야간 관리 실행: 프로필 봉투 재구축, 주기 상태 재계산, 디버그 추적 정리 및 최신 주기 유지.", + "label": "자동 유지 관리 (야간 정리)" + }, + "completion_min_seconds": { + "doc": "이보다 짧은 주기는 고스트 주기(테스트 실행, 양말 추가를 위해 문 열기)로 폐기됩니다.", + "label": "사이클 최소 시간" + }, + "delay_confirm_seconds": { + "doc": "어플라이언스가 실행되지 않고 시작 대기 중인 것으로 처리되기 전에 전원은 오랫동안 대기 대역에 유지되어야 합니다.", + "label": "확인 초" + }, + "delay_start_detect_enabled": { + "doc": "어플라이언스의 전원이 켜져 있고 대기 중(지연된 시작/대기)이지만 주기가 시작되지 않은 경우를 감지하므로 대기 그리기가 실행 중인 주기로 착각되지 않습니다.", + "label": "지연 시작 감지 활성화" + }, + "delay_timeout_hours": { + "doc": "이 많은 시간이 지나면 지연된 시작 모드에서 대기하는 것을 중지하고 유휴 상태로 돌아가므로 전원이 켜져 있지만 시작되지 않은 기계는 영원히 기다리지 않습니다.", + "label": "타임아웃 시간" + }, + "device_type": { + "doc": "가전제품 등급. 해당 기기 유형에 맞게 조정된 합리적인 감지 기본값(임계값, 오프 지연, 종료 처리)을 설정합니다. 장치가 원래 잘못된 유형으로 설정된 경우에만 변경하십시오.", + "label": "기기 유형" + }, + "door_sensor_entity": { + "doc": "옵션 도어 바이너리 센서. 사이클 후 기기가 열리거나 내려지는 시기를 감지하는 데 사용됩니다.", + "label": "문 센서 엔티티" + }, + "duration_tolerance": { + "doc": "남은 추정 시간에 대한 허용 오차(학습 피드백, 일치하지 않음). 실제 기간이 추정치의 +/-X% 내에 있으면 좋은 일치로 간주됩니다.", + "label": "추정 허용 오차" + }, + "enable_ml_models": { + "doc": "사이클이 실행되는 동안 모델이 실시간 결과를 개선하도록 하십시오. 즉, 보다 안정적인 남은 시간 및 에너지/비용 추정, 종료 감지 시 조기 중지 방지 가드(완료를 지연시킬 수만 있고 일찍 끝나지 않으며 제한됨)입니다. 사용 가능한 경우 미세 조정된 모델을 사용하고, 그렇지 않은 경우에는 내장된 모델을 사용합니다. 꺼짐 = 고전적인 전력 기반 논리만(여전히 안정적임)", + "label": "사이클 중 스마트 모델 적용" + }, + "end_energy_threshold": { + "doc": "꺼짐 지연 카운트다운 동안 축적된 에너지(와트 x 시간)가 이 임계값과 비교됩니다. 초과하면 카운트다운이 재설정됩니다. 주름 방지 텀블러와 식기세척기 건조 테일을 짧게 자르는 대신 사이클에 부착해 두세요. 냉각 중에 사이클이 너무 일찍 끝나면 이 값을 올립니다. 감지가 느린 경우에는 낮추십시오.", + "label": "종료 에너지" + }, + "end_repeat_count": { + "doc": "사이클이 끝나기 전에 필요한 연속 정지 임계값 미만 판독 횟수입니다. 대부분의 플러그에는 1이 적합합니다. 스마트 플러그가 주기 중간에 가끔 잘못된 제로 샘플을 보고하고 주기가 조기에 종료되는 경우 2~3으로 올리세요.", + "label": "종료 반복 횟수" + }, + "energy_price_entity": { + "doc": "kWh당 현재 전기 가격이 포함된 센서(예: 동적 요금) 아래의 고정 가격보다 우선 적용됩니다. 각 사이클은 완료 시 가격을 동결시킵니다.", + "label": "에너지 가격 엔티티" + }, + "energy_price_static": { + "doc": "위에 실시간 가격 엔터티가 설정되지 않은 경우 비용 수치에 사용되는 kWh당 고정 가격입니다.", + "label": "고정 에너지 가격 (kWh당)" + }, + "energy_sensor": { + "doc": "선택적 누적 에너지 카운터(total_increasing kWh/Wh, 예: 플러그 자체의 누적 계량기)입니다. 설정하면 각 사이클의 표시 에너지가 이 카운터의 시작부터 종료까지의 차이(delta)에서 계산되므로, 보고 주기가 느린 전력 센서를 적분할 때 발생하는 과소 집계를 방지합니다. 판독값이 없거나 단위를 알 수 없거나 차이가 양수가 아닌 경우 적분된 값으로 대체됩니다. 비워 두면 전력 센서를 계속 적분합니다.", + "label": "에너지 계량기 엔티티" + }, + "expose_debug_entities": { + "doc": "추가 진단 HA 엔터티를 게시합니다(신뢰도, 모호성, 상태 내부 일치). 끄면 일반적인 사용을 위해 엔터티 목록을 깨끗하게 유지합니다.", + "label": "디버그 엔티티 노출" + }, + "external_end_trigger": { + "doc": "상태 변경이 주기 종료를 표시하는 바이너리 센서(예: 기기 \"완료\" 접점 또는 동반 통합)", + "label": "외부 트리거 엔티티" + }, + "external_end_trigger_enabled": { + "doc": "내장된 전력 기반 감지 기능 외에도 외부 바이너리 센서가 사이클 종료 신호를 보내도록 하세요.", + "label": "외부 종료 트리거 활성화" + }, + "external_end_trigger_inverted": { + "doc": "트리거 센서가 꺼진 상태(켜짐이 아닌)를 주기 종료 신호로 처리합니다.", + "label": "외부 트리거 반전 (OFF에서 트리거)" + }, + "learning_confidence": { + "doc": "일치 점수가 이 값과 자동 라벨 신뢰도 사이에 있으면 식별된 프로그램을 확인하라는 피드백 알림이 표시됩니다. 이 점수 이하에서는 경기가 표면화되기에는 너무 불확실합니다. 자동 라벨 신뢰도 미만으로 유지되어야 합니다.", + "label": "학습 신뢰도" + }, + "linked_device": { + "doc": "선택적으로 \"Connected via ...\"로 표시된 HA 장치 레지스트리의 다른 장치(예: 스마트 플러그) 아래에 이 WashData 장치를 중첩합니다.", + "label": "기기 아래 그룹화" + }, + "min_off_gap": { + "doc": "이 시간보다 짧은 시간 동안 기기의 전원이 꺼지면 켜기/끄기/켜기 순서가 하나의 연속 주기로 처리됩니다. 담금 프로그램(세탁 도중 몇 분 동안 기계 전원이 꺼짐)이 두 개의 별도 주기로 분할되는 것을 방지합니다. 별도의 주기로 계산하려면 연속 하중 사이의 간격보다 짧게 설정하십시오. 장치 유형 기본값은 각 어플라이언스에 대한 일반적인 주기 내 일시 중지를 보호합니다.", + "label": "최소 오프 간격" + }, + "min_power": { + "doc": "절대 최소 전력은 활성으로 간주됩니다. 이 아래의 판독값은 0W(대기)로 처리되어 스마트 플러그 및 대기 LED의 팬텀 부하를 필터링합니다.", + "label": "최소 전력" + }, + "ml_training_enabled": { + "doc": "밤새 검토한 사이클을 주기적으로 연구하고 모델을 이 특정 기계에 맞게 미세 조정하세요. 변경 사항은 보류 주기에서 실제로 더 나은 점수를 얻은 경우에만 유지되므로 이는 도움이 되거나 동일하게 유지될 수 있으며 결코 퇴보하지 않습니다.", + "label": "이 기기에서 학습" + }, + "ml_training_hour": { + "doc": "밤새 미세 조정을 수행할 현지 시간(0-23)입니다. 2시(02:00)와 같이 조용한 시간을 선택하세요.", + "label": "학습 시간" + }, + "ml_training_interval_days": { + "doc": "며칠에 한 번만 개선 사항을 다시 확인하세요.", + "label": "최대 확인 간격" + }, + "ml_training_min_cycles": { + "doc": "미세 조정하기 전에 최소한 이만큼의 주기가 기록될 때까지 기다리십시오. 그러면 학습할 내용이 충분합니다.", + "label": "필요한 사이클 수" + }, + "name": { + "doc": "HA 통합 목록 및 장치 레지스트리에 표시되는 표시 이름입니다.", + "label": "기기 이름" + }, + "no_update_active_timeout": { + "doc": "실행 중에 오랫동안 전원 업데이트가 도착하지 않으면 플러그가 오프라인으로 떨어졌다고 가정하고 좀비 사이클을 피하기 위해 강제 중지하십시오. 기본 600초는 클라우드 또는 메시 지연을 허용합니다.", + "label": "업데이트 없음 타임아웃" + }, + "notify_before_end_minutes": { + "doc": "남은 예상 시간이 이 값 아래로 떨어지면 거의 완료 알림을 보냅니다. 0은 비활성화합니다.", + "label": "종료 전 알림" + }, + "notify_channel": { + "doc": "시작/실시간 메시지에 대한 Android 알림 채널 이름(모바일 앱의 채널별 사운드 및 우선순위 제어) Blank는 동반 앱 기본값을 사용합니다.", + "label": "Android 채널 (시작/라이브)" + }, + "notify_cycle_timers": { + "doc": "주기의 특정 분에 알림(예: 연화제 추가) 메시지는 {device}, {program}, {minutes}를 지원합니다. 해당 지점에서 일시 중지하고 재개 버튼을 통해 대화형 알림을 받으려면 자동 일시 중지를 활성화하세요. 패널, 일시 중지/재개 서비스 또는 알림 작업을 통해 재개합니다.", + "label": "사이클 타이머" + }, + "notify_finish_channel": { + "doc": "완료 메시지에 대한 Android 알림 채널 이름입니다. 공백은 시작/라이브 채널을 재사용합니다.", + "label": "Android 채널 (종료)" + }, + "notify_finish_message": { + "doc": "사이클이 끝날 때 전송되는 본문. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. 여기서는 {time_finished}와 {vs_typical}이 가장 유용합니다.", + "label": "종료 메시지" + }, + "notify_finish_services": { + "doc": "inform.* 주기가 완료되면 호출되는 서비스입니다. 대상당 하나씩 추가합니다. 완료 알림을 보내지 않으려면 비워 두세요.", + "label": "종료 서비스" + }, + "notify_fire_events": { + "doc": "또한 주기 시작/종료 시 ha_washdata_* 이벤트를 실행하여 자체 자동화를 구축할 수 있습니다.", + "label": "알림용 HA 이벤트 실행" + }, + "notify_icon": { + "doc": "알림을 위한 선택적 mdi 아이콘(예: mdi:washing-machine) 플랫폼 기본값은 비워 두세요.", + "label": "알림 아이콘" + }, + "notify_live_chronometer": { + "doc": "정적 추정 대신 알림(지원하는 플랫폼의 경우)에 실시간 업데이트 카운트다운 타이머를 표시합니다.", + "label": "라이브 크로노미터 사용" + }, + "notify_live_interval_seconds": { + "doc": "주기가 실행되는 동안 실시간 진행률 알림이 새로 고쳐지는 빈도입니다.", + "label": "라이브 업데이트 간격" + }, + "notify_live_overrun_percent": { + "doc": "주기가 이 백분율보다 더 많이 예상을 초과하는 경우 오버런 경고를 보냅니다.", + "label": "라이브 초과 % 알림" + }, + "notify_live_services": { + "doc": "통지.* 주기가 실행되는 동안 실시간 진행 업데이트를 위해 호출되는 서비스입니다. 실시간 진행 상황 알림을 비활성화하려면 비워 두세요.", + "label": "라이브 진행 서비스" + }, + "notify_only_when_home": { + "doc": "연결된 사람(위) 중 한 명 이상이 집에 있을 때만 알림을 보내세요.", + "label": "집에 있을 때만 알림" + }, + "notify_people": { + "doc": "person.* \"집에 있을 때만 알림\"이 집에 있는지 여부를 결정하는 데 사용되는 엔터티입니다.", + "label": "사람 (집에 있을 때)" + }, + "notify_pre_complete_message": { + "doc": "종료 전 / 거의 완료 알림의 본문. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "완료 전 메시지" + }, + "notify_reminder_message": { + "doc": "아직 대기 중인 꺼내기 알림의 본문. 비워 두면 기본 제공 값이 사용됩니다. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "알림 메시지" + }, + "notify_start_message": { + "doc": "사이클이 시작될 때 전송되는 본문. 템플릿 변수: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "시작 메시지" + }, + "notify_start_services": { + "doc": "inform.* 서비스는 주기가 시작될 때 호출됩니다. 대상(전화, 대시보드 등)당 하나씩 추가합니다. 시작 알림을 보내지 않으려면 비워 두세요.", + "label": "시작 서비스" + }, + "notify_timeout_seconds": { + "doc": "이 시간(초) 후에 알림을 자동으로 해제합니다(지원하는 플랫폼의 경우). 0은 수동으로 해제할 때까지 유지합니다.", + "label": "자동 닫기" + }, + "notify_title": { + "doc": "알림 제목. 템플릿 변수: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "알림 제목" + }, + "notify_unload_delay_minutes": { + "doc": "사이클이 종료된 후 아직 대기 중인 \"머신 언로드\" 알림을 전송하기 몇 분 전입니다. 알림을 비활성화하려면 0을 설정합니다.", + "label": "꺼내기 알림 지연" + }, + "notify_unload_repeat": { + "doc": "문을 열거나 알림에서 \"알림 중지\"를 누를 때까지 \"꺼내기 알림 지연\" 분마다 꺼내기 알림을 계속 다시 보냅니다. 문 센서 엔티티가 필요합니다(알림 자체가 필요로 합니다). 해제 버튼은 Home Assistant 컴패니언 앱(모바일) 알림에서 작동합니다.", + "label": "문이 열릴 때까지 반복" + }, + "off_delay": { + "doc": "사이클 완료를 선언하기 전에 전원이 꺼진 후 기다리는 시간입니다. 이 창 내에서 전원이 재개되면 주기가 원활하게 계속됩니다. 이로 인해 세탁 단계 사이가 일시 중지됩니다. 식기세척기는 건조 단계가 길기 때문에(20~60분 동안 전원 꺼짐) 전체 세탁+건조를 하나의 주기로 유지하려면 꺼짐 지연이 이를 초과해야 합니다.", + "label": "오프 지연" + }, + "pause_cuts_power": { + "doc": "사이클이 일시 중지되면 아래의 스위치 엔터티도 끄십시오. 사용 중에 플러그를 안전하게 절단할 수 있는 기기에만 해당됩니다.", + "label": "일시 정지로 전력도 차단 (스위치 경유)" + }, + "power_off_delay": { + "doc": "사이클이 완료된 후 상태가 꺼짐으로 돌아가기 전까지 전력이 전원 꺼짐 임계값 미만으로 유지되어야 하는 시간입니다. 전원 꺼짐 임계값이 0보다 클 때만 사용됩니다. 백그라운드 주기로 확인되므로 실제 지연 시간은 다음 상태 만료 시점까지 올림 처리됩니다.", + "label": "전원 꺼짐 지연" + }, + "power_off_threshold_w": { + "doc": "전력 기반 꺼짐 감지(선택 사항)입니다. 0보다 큰 값으로 설정하면 사이클이 완료된 후 전력이 전원 꺼짐 지연 시간 동안 이 값 미만으로 유지될 경우 기기가 꺼진 것으로 간주되어 상태가 꺼짐으로 돌아갑니다. 사용하지 않으려면 0으로 두세요(기본값). 실제로 전원을 끈 상태의 최저값보다 높고, 중지 임계값 및 기기가 완료된 후에도 켜져 있을 때의 대기 전력보다 낮게 설정하세요. 중지 임계값 미만이 아니면 무시됩니다. 활성화하면 꺼짐으로 돌아갈 때 진행 초기화 지연 대신 사용되므로, 완료된 기기는 실제로 전원이 꺼질 때까지 완료됨/깨끗한 상태로 유지됩니다.", + "label": "전원 꺼짐 임계값" + }, + "power_sensor": { + "doc": "이 기기의 실제 전력을 와트 단위로 보고하는 센서 엔터티입니다(예: sensor.washer_power). 모든 사이클 감지는 이 신호를 기반으로 합니다.", + "label": "전력 센서" + }, + "profile_duration_tolerance": { + "doc": "일치하는 동안 사용된 프로필 평균 지속 시간 주변의 +/- 밴드입니다. 0.25는 60분 프로필이 45~75분 주기와 일치함을 의미합니다.", + "label": "프로필 기간 허용 오차" + }, + "profile_match_interval": { + "doc": "실행 주기 동안 프로필 일치를 시도하는 빈도입니다. 기본 300초(5분)는 감지 속도와 CPU의 균형을 유지합니다.", + "label": "매칭 간격" + }, + "profile_match_max_duration_ratio": { + "doc": "프로파일에 따른 최대 사이클 길이. 1.3은 주기가 일치하려면 프로필 기간의 130% 미만이어야 함을 의미합니다.", + "label": "최대 기간 비율" + }, + "profile_match_min_duration_ratio": { + "doc": "프로파일에 따른 최소 사이클 길이. 0.9는 주기가 일치하려면 프로필 기간의 90% 이상이어야 함을 의미합니다.", + "label": "최소 기간 비율" + }, + "profile_match_threshold": { + "doc": "프로그램 식별을 수락하려면 주기 종료 시 최소 유사성 점수(0-1)가 필요합니다. 잘못된 식별을 줄이기 위해 높이십시오. 기계의 프로그램이 일치하지 않으면 값을 낮추십시오. 기본값 0.4는 보수적인 시작점입니다.", + "label": "매칭 임계값" + }, + "profile_unmatch_threshold": { + "doc": "라이브 중간 사이클 경기가 이 점수 아래로 떨어지면 임시 식별이 지워집니다. 일치 임계값보다 약간 낮게 유지하면 유사성이 잠시 떨어지더라도 디스플레이가 일치하지 않는 상태로 되돌아가지 않습니다.", + "label": "언매칭 임계값" + }, + "progress_reset_delay": { + "doc": "완료 후에는 진행 상태를 오랫동안 100%로 유지하여 유휴 상태로 재설정하기 전에 완료됨이 대시보드에 표시되도록 합니다.", + "label": "진행 초기화 지연" + }, + "pump_stuck_duration": { + "doc": "펌프가 고착되었을 가능성이 있는 것으로 표시되기 전에 펌프가 계속 작동할 수 있는 시간(초)입니다(펌프 고착 이벤트 발생).", + "label": "펌프 정지 지속 시간" + }, + "running_dead_zone": { + "doc": "주기가 시작된 후 이 창 내의 전력 강하는 무시됩니다. 세탁기는 찬물로 채워집니다(가열 전 0W 근처로 떨어짐). 이러한 보호 기능이 없으면 채우기 단계가 사이클 종료처럼 보입니다. 이는 데이터를 건너뛰지 않습니다. 전체 전력 추적은 T=0에서 기록됩니다. 제안 엔진은 컴퓨터의 실제 시작 패턴을 측정하고 자동으로 크기를 조정합니다.", + "label": "실행 데드존" + }, + "sampling_interval": { + "doc": "센서 판독 사이의 예상 시간 - 스무딩 창의 크기를 조정하고 디바운싱을 올바르게 시작하는 데 사용됩니다. 모든 센서 업데이트는 이 값에 관계없이 캡처됩니다. 다운스트림 계산만 보정합니다. 제안 엔진은 과거 주기에서 센서의 실제 케이던스를 측정하고 이를 자동으로 설정합니다.", + "label": "샘플링 간격" + }, + "save_debug_traces": { + "doc": "각 사이클에 대해 전체 전력 추적 및 일치하는 디버그 데이터를 저장합니다. 문제 해결에 유용하지만 저장소 크기가 늘어납니다.", + "label": "디버그 추적 저장" + }, + "smoothing_window": { + "doc": "원시 전력 신호가 얼마나 평탄화되는지입니다. 낮음(2)은 반응이 좋지만 소음이 있습니다. 높음(5)은 스파이크를 부드럽게 하지만 지연을 추가합니다.", + "label": "스무딩 윈도우" + }, + "start_duration_threshold": { + "doc": "실제 시작을 확인하려면 전력이 이렇게 오랫동안 시작 임계값 이상으로 유지되어야 하며, 순간적인 켜기/끄기 전환으로 인해 사이클이 시작되는 것을 방지할 수 있습니다.", + "label": "시작 지속 시간" + }, + "start_energy_threshold": { + "doc": "기기가 작동하기 전에 소비해야 하는 에너지(전력 x 시간)입니다. 짧은 고전력 스파이크는 에너지가 매우 낮으므로 무시되어 잘못된 시작을 방지합니다.", + "label": "시작 에너지" + }, + "start_threshold_w": { + "doc": "사이클이 시작되었음을 확인하려면 전력이 이 수준 이상으로 높아져야 합니다. 너무 낮게 설정하면 대기 전원에서 잘못된 시작이 발생합니다. 너무 높거나 느리게 시작되는 프로그램(콜드 필)이 누락됩니다. 제안 엔진은 이를 기계에서 관찰된 최저 유효 전력 바로 위에 설정합니다.", + "label": "시작 임계값" + }, + "stop_threshold_w": { + "doc": "꺼짐 지연 카운트다운이 시작되기 전에 전력이 이 수준 아래로 떨어져야 합니다. 시작 임계값 아래로 설정하십시오. 둘 사이의 간격은 깜박임을 방지하는 히스테리시스 밴드입니다. 너무 높게 설정하면 저전력 단계(헹굼 유지, 주름 방지)가 종료 시퀀스를 잘못 트리거합니다.", + "label": "중지 임계값" + }, + "switch_entity": { + "doc": "일시 중지 시 꺼졌다가 재개 시 다시 켜지는 옵션 스위치는 '일시 중지 시 전원도 차단됨'과 함께 사용됩니다.", + "label": "스위치 엔티티" + }, + "watchdog_interval": { + "doc": "백그라운드 감시 장치가 정지된 센서와 경과된 시간 초과를 확인하는 빈도입니다. 기본값은 30초입니다.", + "label": "워치독 간격" + }, + "notify_milestone_message": { + "doc": "마일스톤 알림 메시지. 템플릿 변수: {device}, {cycle_count}.", + "label": "마일스톤 메시지" + }, + "notify_milestones": { + "doc": "도달 시 한 번만 축하 알림을 보낼 사이클 수를 쉼표로 구분하여 지정합니다(예: 50, 100, 500, 1000). 비워 두면 마일스톤 알림이 비활성화됩니다.", + "label": "사이클 마일스톤" + }, + "notify_quiet_end_hour": { + "doc": "방해 금지 시간대의 종료(0-23). 보류된 알림은 이 시각에 전달됩니다. 비워 두면 비활성화됩니다.", + "label": "방해 금지 시간 종료" + }, + "notify_quiet_start_hour": { + "doc": "방해 금지 시간대의 시작(0-23). 방해 금지 시간 중 발생할 완료, 알림, 세탁 완료 알림은 보류되었다가 시간대가 끝날 때 전달됩니다. 비워 두면 비활성화됩니다. 자정을 넘는 시간대도 지원합니다(예: 시작 22, 종료 7).", + "label": "방해 금지 시간 시작" + }, + "peak_rate_message": { + "doc": "시작 알림에 추가되는 피크 요금 팁의 사용자 지정 텍스트(선택 사항). 템플릿 변수: {device}, {price}. 비워 두면 기본 제공 값이 사용됩니다.", + "label": "피크 요금 메시지" + }, + "peak_rate_threshold": { + "doc": "사이클이 시작될 때 현재 kWh당 가격이 이 값 이상이면 시작 알림에 피크 요금 팁을 추가합니다. 0 또는 비워 두면 팁이 비활성화됩니다.", + "label": "피크 요금 임계값 (kWh당)" + }, + "dtw_bandwidth": { + "label": "형상 매칭 허용치", + "doc": "저장된 프로그램의 형상에 맞추기 위해 매처가 사이클을 얼마나 시간 왜곡할 수 있는지를 결정합니다. 값이 클수록 속도 변화를 더 허용하지만, 너무 크면 잘못된 프로그램에 매칭될 위험이 있습니다." + }, + "corr_weight": { + "label": "형상 대 레벨 가중치", + "doc": "매칭 점수를 계산할 때 곡선 형상과 절대 전력 레벨 사이의 균형입니다. 값이 클수록 형상을, 작을수록 전력 레벨 일치를 우선합니다." + }, + "duration_weight": { + "label": "실행 시간 가중치", + "doc": "일반적인 실행 시간이 이 사이클과 일치하는 프로그램을 얼마나 우선할지 결정합니다." + }, + "energy_weight": { + "label": "에너지 가중치", + "doc": "일반적인 에너지 사용량이 이 사이클과 일치하는 프로그램을 얼마나 우선할지 결정합니다." + }, + "store_brand": { + "label": "가전제품 브랜드", + "doc": "선택 사항입니다. 커뮤니티 카탈로그에서 선택한 가전제품 브랜드입니다. 일치하는 참조 녹음을 찾고 공유하는 데 사용됩니다. 온라인 기능을 사용하지 않는 경우 비워 두세요." + }, + "store_model": { + "label": "가전제품 모델", + "doc": "선택 사항입니다. 브랜드를 설정하면 커뮤니티 카탈로그에서 선택할 수 있는 가전제품 모델입니다. 목록에 모델이 없으면 카탈로그에 추가할 수 있습니다." + }, + "show_contributor": { + "doc": "커뮤니티 가전제품 및 참조 사이클에 \"by \" 기여자 표시를 보여줍니다." + }, + "enable_phase_matching": { + "label": "단계 기반 남은 시간", + "doc": "실행 중인 각 사이클을 단계(가열, 세탁, 탈수)로 나누고 단계별로 남은 시간을 배분하여 기존 추정값과 혼합합니다. 사이클 초반에는 단계별 배분을, 종료에 가까워질수록 기존 추정값을 더 중시합니다. 이렇게 하면 기기가 실제로 가열하고 작동하는 시간에 맞춰 카운트다운이 개인화되며, 사이클 전반부에서 가장 뚜렷하게 나타납니다. 꺼짐 = 기존 추정값만 사용. 남은 시간 표시에만 영향을 미치며, 프로그램 매칭과 사이클 감지는 변경되지 않습니다." + }, + "keep_min_score": { + "label": "최소 매칭 점수", + "doc": "후보가 매칭 경쟁에 남기 위해 필요한 최소 유사도 점수입니다. 기본값 0.1은 의도적으로 허용적입니다. 약한 후보도 허용하고 이후 단계에서 최선을 찾도록 합니다. 가능성이 낮은 프로파일을 더 일찍 제거하려면 높이고, 초기 후보 풀을 넓히려면 낮추세요." + }, + "dtw_blend": { + "label": "워프 블렌드", + "doc": "시간 워프(DTW) 정렬 점수가 Stage 2 핵심 점수를 얼마나 대체하는지 나타냅니다. 0 = Stage 2 점수만 사용, 1 = DTW 점수만 사용, 0.5 (기본값) = 동등 혼합. 프로그램들이 유사한 전력 수준이지만 다른 타이밍 패턴을 가질 때 워프 정렬에 더 의존하려면 높이세요." + }, + "dtw_ensemble_w": { + "label": "워프 앙상블 혼합", + "doc": "앙상블 DTW 모드(기본값)에서 스케일 L1과 도함수 DTW(DDTW)의 가중치 배분입니다. 1.0 = 모두 스케일-L1, 0 = 모두 DDTW, 0.7 = 기본값. 스케일-L1 방식은 전력 수준을 비교하고, 도함수 방식은 전력이 시간에 따라 변하는 방식에 반응합니다. 앙상블은 두 가지를 결합합니다." + }, + "dtw_ddtw_scale": { + "label": "미분 워프 스케일", + "doc": "도함수 DTW 점수화를 위한 반포화 거리입니다. DDTW 거리가 이 값과 같을 때 점수가 반으로 줄어듭니다. 작을수록 형상 차이에 민감합니다. 기본값 30은 일반적인 가전제품 전력 추적에 맞게 보정되어 있습니다. 앙상블 및 ddtw DTW 모드에만 영향을 미칩니다." + }, + "dtw_refine_top_n": { + "label": "워프 정제 개수", + "doc": "DTW가 재점수화하는 Stage 2 상위 후보 수입니다. DTW는 계산 비용이 높아 상위 N개 후보에만 적용됩니다. 기본값 5. 올바른 프로파일이 Stage 2 후 4위나 5위에 그치는 경우 값을 높이세요(7-9) - DTW가 이를 구할 수 있습니다. 낮추면 매칭 속도가 약간 빨라집니다." + }, + "duration_scale": { + "label": "지속 시간 선명도", + "doc": "Stage 4 지속 시간 일치 패널티의 날카로움입니다. 이것은 일치 점수가 반으로 줄어드는 로그 비율입니다. 작을수록 엄격합니다. 지속 시간 불일치가 더 큰 영향을 미칩니다. 기본값 0.175는 반가중치에서 약 18%의 지속 시간 허용 오차에 해당합니다. 지속 시간 가중치와 함께 사용하세요." + }, + "energy_scale": { + "label": "에너지 선명도", + "doc": "Stage 4 에너지 일치 패널티의 날카로움입니다. 작을수록 엄격합니다. 에너지 불일치가 더 큰 영향을 미칩니다. 기본값 0.25는 에너지가 부하에 따라 변하기 때문에 지속 시간 날카로움보다 의도적으로 더 허용적입니다. 에너지 가중치와 함께 사용하세요." + }, + "power_profile_interval_min": { + "label": "전력 프로파일 간격", + "doc": "EMHASS, tibber_prices 등 외부 계획 도구가 사용하는 per-profile power_profile 센서 속성(슬롯당 평균 와트 배열)의 버킷 크기입니다. 작은 버킷은 짧은 전력 급등을 선명하게 유지하고, 큰 버킷은 형태를 완만하게 합니다. 기본값 15분. 읽기 시에만 사용되며 검출에는 영향을 주지 않습니다." + }, + "notify_live_sticky": { + "label": "탭 후 실시간 알림 유지", + "doc": "Android 전용. 실시간 진행 알림을 고정(스티키)으로 만들어 탭해도 진행 중인 알림 스레드가 사라지지 않도록 합니다. 꺼져 있으면 탭 시 알림이 사라지는 기본 동작이 유지됩니다." + }, + "notify_live_click_action": { + "label": "실시간 알림 탭 대상", + "doc": "Android 전용. 실시간 진행 알림을 탭했을 때 열리는 위치(예: /lovelace/laundry 또는 전체 URL)를 앱 기본 시작 페이지 대신 지정합니다. 기본값으로 두려면 비워 두세요." + }, + "door_opens_at_end": { + "label": "종료 시 자동으로 문 열림", + "doc": "세척 후 건조를 위해 자동으로 문이 열리는 식기세척기(AirDry 등)용 설정입니다. 이 기능을 켜면 실행 중인 사이클에서 문이 열려도 사이클이 영구적으로 일시 정지되지 않습니다. 대신 문이 아래의 대기 시간 이상 열려 있으면 WashData가 사이클을 완료로 처리합니다. 잠깐 여는 동작(식기 추가 등)은 무시됩니다. 문 센서 엔티티가 필요합니다." + }, + "door_end_dwell_seconds": { + "label": "문 열림 종료 대기 시간", + "doc": "\"종료 시 자동으로 문 열림\"이 켜져 있을 때, WashData가 사이클을 종료하기 전에 문이 열려 있어야 하는 시간입니다. 식기를 빨리 추가하는 경우(바로 닫힘)는 무시하면서도 기기가 문을 열었을 때 신속하게 종료할 수 있을 만큼 짧게 설정합니다(기본값 60초)." + }, + "dishwasher_end_spike_quiet_release": { + "label": "자연 건조 조용 시 해제", + "doc": "사이클이 예상 소요 시간을 지난 후, WashData가 최종 배수를 더 이상 기다리지 않고 사이클을 종료하기까지 식기세척기가 조용한 상태(중지 임계값 미만)를 유지해야 하는 시간입니다. 늦게 발생하는 최종 배수 전에 긴 무음 건조 단계가 있고 그 배수가 감지되지 않고 있다면 값을 높이세요. 창을 넓히면 학습된 소요 시간이 예전 평균값에 고정되지 않고 계절적 변동(급수 온도가 낮을수록 사이클이 길어짐)을 따라갈 수 있습니다. 이 설정은 내부의 30분 종료 스파이크 상한에 비해 대기 시간을 단축할 수만 있고 연장하지는 않습니다." + } + }, + "setting_group": { + "auto_labeling": { + "label": "자동 라벨링" + }, + "cycle_end": { + "label": "사이클 종료" + }, + "cycle_start": { + "label": "사이클 시작" + }, + "cycle_timers": { + "label": "사이클 타이머" + }, + "data_management": { + "label": "데이터 관리" + }, + "debug": { + "label": "디버그" + }, + "dishwasher_end": { + "label": "식기세척기 종료" + }, + "door_pause": { + "label": "문과 일시 정지" + }, + "dtw_refinement": { + "label": "DTW 정밀화" + }, + "duration_gates": { + "label": "기간 게이트" + }, + "energy": { + "label": "에너지" + }, + "external_end_trigger": { + "label": "외부 종료 트리거" + }, + "housekeeping": { + "label": "하우스키핑" + }, + "match_scoring": { + "label": "매칭 점수" + }, + "messages": { + "label": "메시지" + }, + "power_off": { + "label": "전원 꺼짐" + }, + "predictive_end": { + "label": "예측 종료" + }, + "schedule": { + "label": "일정" + }, + "services": { + "label": "서비스" + }, + "signal_processing": { + "label": "신호 처리" + }, + "thresholds_gap": { + "label": "임계값과 간격" + }, + "timing": { + "label": "타이밍" + }, + "unload_reminder": { + "label": "꺼내기 알림" + }, + "watchdog": { + "label": "워치독" + }, + "quiet_hours_milestones": { + "label": "방해 금지 시간 및 마일스톤" + }, + "device_info": { + "label": "기기 정보" + }, + "basic_configuration": { + "label": "기본 구성" + } + }, + "status": { + "active": "활성", + "all_statuses": "모든 상태", + "ambiguous": "모호함", + "auto_detect": "자동 감지", + "clear": "지우기", + "completed": "완료됨", + "fine_tuning": "지금 미세 조정 중…", + "force_stopped": "강제 정지됨", + "idle": "대기", + "interrupted": "중단됨", + "ready": "처리 준비 완료", + "recording": "기록 중", + "training": "훈련 중…", + "saving": "저장 중…", + "rebuilding": "재구축 중…", + "analyzing": "분석 중…", + "resetting": "재설정 중…", + "reverting": "되돌리는 중…", + "trimming": "다듬는 중…", + "splitting": "분할 중…", + "deleting": "삭제 중…", + "imported": "가져옴" + }, + "tab": { + "advanced": "고급", + "diagnostics": "진단", + "history": "사이클", + "ml": "ML 훈련", + "pp_cleanup": "정리", + "pp_manage": "관리", + "pp_overview": "개요", + "pp_phases": "단계", + "profiles": "프로필", + "settings": "설정", + "status": "개요", + "subtab_phase_catalog": "단계 카탈로그", + "subtab_profiles": "프로필", + "maintenance": "유지보수", + "playground": "플레이그라운드", + "store": "스토어" + }, + "tag": { + "early_end": "조기 종료", + "late_start": "늦은 시작", + "merged": "병합된 주기", + "noise": "소음", + "sensor_gap": "센서 갭", + "split": "분할주기", + "wrong_profile": "잘못된 프로필" + }, + "toast": { + "access_saved": "액세스 제어가 저장되었습니다.", + "all_wiped": "모든 데이터가 지워졌습니다.", + "analysis_complete_none": "분석 완료: 새로운 제안 없음", + "auto_label_complete": "자동 라벨 완료", + "automation_deleted": "자동화가 삭제되었습니다.", + "correction_submitted": "수정사항이 제출되었습니다.", + "cycle_deleted": "주기가 삭제되었습니다.", + "cycle_force_stopped": "사이클 강제 정지", + "cycle_labelled": "라벨이 붙은 사이클", + "cycle_paused": "주기가 일시중지됨", + "cycle_resumed": "사이클 재개", + "cycle_trimmed": "주기가 잘림", + "cycles_merged": "사이클이 병합되었습니다.", + "envelope_rebuilt": "봉투 재구축", + "envelopes_rebuilt": "봉투 재구축", + "export_downloaded": "내보내기가 다운로드됨", + "feedback_all_dismissed": "모든 피드백이 무시되었습니다.", + "feedback_confirmed": "피드백 확인됨", + "feedback_dismissed": "피드백이 무시되었습니다.", + "group_deleted": "그룹이 삭제되었습니다.", + "group_name_required": "그룹 이름은 필수 항목입니다.", + "group_saved": "그룹이 저장되었습니다", + "import_successful": "가져오기가 성공했습니다. 통합 다시 로드", + "json_required": "JSON 데이터가 필요합니다", + "legacy_removed": "기존 작업이 제거되었습니다.", + "logs_exported": "내보낸 로그", + "matching_reverted": "일치하는 가중치가 기본값으로 되돌아갔습니다.", + "min_2_profiles": "그룹당 프로필을 2개 이상 선택하세요.", + "ml_training_no_improvement": "훈련 완료: 기준선 유지(개선 없음)", + "models_reverted": "온디바이스 모델이 기준으로 되돌아갔습니다.", + "name_required": "이름이 필요합니다", + "no_split_found": "분할할 유휴 간격이 발견되지 않았습니다.", + "panel_settings_saved": "패널 설정이 저장되었습니다.", + "pg_preset_loaded": "프리셋 \"{name}\"을(를) 불러왔습니다", + "pg_preset_saved": "프리셋 \"{name}\"을(를) 저장했습니다", + "pg_sugg_loaded": "{n}개 제안 값을 적용했습니다 - 플레이그라운드에서 비교해 보세요", + "pg_sugg_ml_loaded": "{n}개 ML 조정 값을 적용했습니다 - 플레이그라운드에서 비교해 보세요", + "phase_name_required": "단계 이름은 필수 항목입니다.", + "phase_updated": "단계가 업데이트되었습니다.", + "phases_saved": "저장된 단계", + "preferences_saved": "환경설정이 저장되었습니다.", + "profile_name_required": "프로필 이름은 필수 항목입니다.", + "profile_renamed": "프로필 이름이 변경됨", + "recording_discarded": "녹음이 삭제되었습니다.", + "recording_saved": "프로필에 녹음이 저장되었습니다.", + "recording_started": "녹음이 시작되었습니다", + "recording_stopped": "녹음이 중지되었습니다.", + "review_saved": "리뷰가 저장되었습니다.", + "settings_conflicts": "저장하기 전에 강조 표시된 설정 충돌을 해결하세요.", + "settings_reverted": "설정이 복원되었습니다. 통합 리로드 중", + "settings_saved": "설정이 저장되었습니다. 통합 다시 로드", + "suggestions_applied": "제안이 적용되었습니다. 통합 다시 로드", + "suggestions_dismissed": "제안이 무시되었습니다.", + "apply_failed": "적용 실패: {error}", + "delete_failed": "삭제 실패: {error}", + "load_more_failed": "더 불러올 수 없습니다: {error}", + "maint_add_failed": "이벤트를 추가할 수 없습니다: {error}", + "maint_added": "유지보수 이벤트가 추가되었습니다", + "maint_delete_failed": "이벤트를 삭제할 수 없습니다: {error}", + "maint_deleted": "유지보수 이벤트가 삭제되었습니다", + "relabel_done": "{count}개 사이클을 다시 라벨 지정했습니다", + "relabel_failed": "다시 라벨 지정 실패: {error}", + "reminders_save_failed": "알림을 저장할 수 없습니다: {error}", + "reminders_saved": "서비스 알림이 저장되었습니다", + "pause_no_cycle": "일시 정지할 실행 중인 사이클이 없습니다", + "resume_no_cycle": "재개할 일시 정지된 사이클이 없습니다", + "delete_partial_failed": "일부 항목을 삭제할 수 없어 복원되었습니다", + "pg_run_gone": "해당 실행은 더 이상 사용할 수 없습니다.", + "task_cancelled": "취소되었습니다.", + "processed": "{bits} 처리 완료", + "processed_cycles": "{n}개 사이클", + "processed_suggestions": "{n}개 제안", + "processed_models": "{n}개 모델 승격", + "store_search_failed": "검색 실패: {error}", + "store_connect_failed": "연결 실패: {error}", + "store_connected": "커뮤니티 스토어에 연결되었습니다", + "store_disconnected": "커뮤니티 스토어 연결이 해제되었습니다", + "store_error": "오류: {error}", + "store_unavailable": "커뮤니티 스토어를 사용할 수 없습니다.", + "store_pick_profile": "병합할 프로필을 선택하세요", + "store_name_required": "프로필 이름을 입력하세요", + "store_import_failed": "가져오기 실패: {error}", + "store_imported": "{profile}(으)로 가져왔습니다", + "store_program_required": "프로그램 이름을 입력하세요", + "store_no_appliance": "먼저 설정에서 가전제품 브랜드와 모델을 설정하세요.", + "store_share_failed": "공유 실패: {error}", + "store_shared": "커뮤니티 스토어에 공유되었습니다 (검토 대기 중)", + "appliance_added": "가전제품이 추가되었습니다 (승인 대기 중)", + "thanks_confirming": "확인해 주셔서 감사합니다", + "device_approved": "커뮤니티에서 승인되었습니다", + "rating_saved": "품질 평가가 저장되었습니다", + "brand_added": "브랜드가 추가되었습니다 (승인 대기 중)", + "profile_added": "프로필이 추가되었습니다 (승인 대기 중)", + "saved_except_conflicts": "저장되었습니다. 나머지를 저장하려면 강조된 충돌을 수정하세요.", + "share_device_none_sel": "공유할 사이클을 하나 이상 선택하세요", + "store_device_downloaded": "프로그램 {p}개, 녹음 {c}개 추가됨", + "store_device_downloaded_phases": "프로그램 {p}개, 녹음 {c}개, 페이즈 맵 {ph}개 추가됨", + "store_device_downloaded_settings": "프로그램 {p}개, 녹음 {c}개, 페이즈 맵 {ph}개, 설정 {s}개 추가됨", + "store_device_shared": "{n}개 사이클을 커뮤니티 스토어에 공유했습니다 - 검토 중.", + "store_device_shared_all_dup": "{n}개 사이클 모두 이미 커뮤니티 스토어에 있었습니다.", + "store_device_shared_partial": "{n}개 사이클 공유됨; {failed}개는 업로드할 수 없었습니다.", + "store_device_shared_some_dup": "{created}개 사이클 공유됨; {dup}개는 이미 스토어에 있었습니다.", + "store_download_failed": "다운로드 실패: {error}", + "store_download_nothing": "다운로드할 새 항목 없음 - 이 설정은 이미 기기에 있습니다.", + "export_selective_done": "내보내기 다운로드 완료", + "import_selective_done": "{profiles}개 프로필과 {cycles}개 사이클을 가져왔습니다" + }, + "suggestion": { + "both_agree": "WashData 권장", + "calibrated_label": "보정됨", + "observed_label": "관측값", + "impact": { + "auto_label_confidence": { + "higher": "자동 라벨링 사이클이 줄어들고, 더 많이 검토로 넘어갑니다", + "lower": "더 많은 사이클을 자동 라벨링합니다. 일부는 잘못 식별될 수 있습니다" + }, + "duration_tolerance": { + "higher": "더 넓은 시간 범위를 허용합니다. 유연한 매칭", + "lower": "더 정확한 시간 매칭이 필요합니다. 엄격하지만 비정상 사이클을 거부할 수 있습니다" + }, + "end_energy_threshold": { + "higher": "상당한 에너지를 사용한 사이클만 종료합니다", + "lower": "짧거나 저에너지 사이클도 종료합니다" + }, + "end_repeat_count": { + "higher": "종료 신호를 더 많이 반복해야 합니다. 더 안정적이지만 약간 느려집니다", + "lower": "더 적은 반복 후 종료합니다. 빠른 감지이지만 오종료 위험이 있습니다" + }, + "learning_confidence": { + "higher": "매우 신뢰도 높은 매칭에서만 학습합니다. 느리지만 더 신뢰할 수 있습니다", + "lower": "더 많은 사이클에서 학습합니다. 모델에 노이즈가 더 많을 수 있습니다" + }, + "min_off_gap": { + "higher": "새 사이클이 시작되기 전에 더 긴 대기 시간이 필요합니다", + "lower": "짧은 대기 시간으로 새 사이클이 시작됩니다. 연속 실행이 분할될 수 있습니다" + }, + "min_power": { + "higher": "대기 전력 소비에 덜 민감합니다. 매우 조용한 프로그램을 놓칠 수 있습니다", + "lower": "더 민감합니다. 대기 전력을 활동으로 기록할 수 있습니다" + }, + "no_update_active_timeout": { + "higher": "사이클이 멈췄다고 판단하기까지 더 많은 시간이 걸립니다", + "lower": "멈춘 사이클을 더 빨리 강제 종료합니다" + }, + "off_delay": { + "higher": "가전제품 일시 정지를 위한 시간이 늘어납니다. 긴 담금 또는 건조 단계를 처리합니다", + "lower": "종료 감지가 빨라집니다. 깔끔한 온/오프 가전제품에 적합합니다" + }, + "profile_match_threshold": { + "higher": "높은 신뢰도 매칭만 확정합니다. 더 많은 사이클이 라벨 없이 남습니다", + "lower": "더 많은 사이클을 매칭합니다. 일부가 약간 틀릴 수 있습니다" + }, + "running_dead_zone": { + "higher": "대기 중 짧은 전력 스파이크를 무시합니다. 노이즈에 덜 민감합니다", + "lower": "더 짧은 전력 버스트에 반응합니다. 빠른 일시적 활동을 감지합니다" + }, + "start_threshold_w": { + "higher": "짧은 전력 스파이크로 인한 오동작을 방지합니다", + "lower": "저전력 프로그램을 감지합니다. 노이즈에 트리거될 수 있습니다" + }, + "stop_threshold_w": { + "higher": "사이클을 더 빨리 종료합니다. 일시 정지 중에 닫힐 수 있습니다", + "lower": "종료까지 더 오래 기다립니다. 조기 완료가 줄어듭니다" + }, + "watchdog_interval": { + "higher": "더 긴 정지 단계가 허용됩니다. 오탐 강제 종료가 줄어듭니다", + "lower": "멈춘 사이클을 더 적극적으로 감지합니다" + } + }, + "reason": { + "auto_label_confidence": "사용자가 한 번도 수정하지 않은 {cycles}개 자동 라벨의 15백분위 신뢰도({p15}).", + "completion_min_seconds": "{cycles} 사이클의 p05 정상 사이클 시간의 절반({minutes} min). 허위 사이클을 걸러냅니다.{excl}", + "dead_zone_batch": "짧게 유지({cycles} 사이클의 시작 불안정 구간 중앙값 = {s}s). 실제 종료를 신속하게 감지합니다.", + "dead_zone_from_dip": "{s}s에서 감지된 초기 전력 저하를 기반으로 함.", + "end_energy_default": "사이클 종료 노이즈 게이트에 권장되는 기본값.", + "end_energy_false": "{cycles} 사이클의 p95 허위 종료 에너지({p95}Wh). 사이클 에너지 중앙값의 0.2%({floor}Wh)를 하한으로 함.", + "end_energy_no_false": "{cycles} 사이클에서 허위 종료 없음. 사이클 에너지 중앙값의 0.2%({floor}Wh)를 하한으로 함.", + "end_repeat_count": "{false}/{total}개 정상 사이클({pct}%)에서 재개된 60s 초과 내부 일시정지가 있었습니다. {val}회의 종료 확인을 요구합니다.", + "learning_confidence": "{cycles}개 사용자 라벨 사이클의 p05 신뢰도({p05}). 이보다 낮으면 확인을 요청합니다.", + "match_interval": "관측된 업데이트 주기 기반(중앙값={median}s) * 10.", + "max_duration_ratio": "라벨이 지정된 사이클 시간 기반(p95={p95}).", + "min_active": "마지막 사이클에서 관측된 최소 활성 전력({min}W) 기반.", + "min_duration_ratio": "프로그램을 사이클 초반에 식별할 수 있도록 최대한 낮게 유지합니다. 신뢰도와 모호성 게이트가 조기 확정을 방지합니다.", + "min_off_gap": "관측된 {gaps}개 사이클 간 간격 기반(p05={p05}s). 기기 하한: {floor}s.", + "min_off_gap_bridge": "사이클 내에서 전력이 거의 없는 가장 긴 구간을 넘기도록 설정: {span}s + 60s 버퍼. {cycles}개 정상 사이클에 걸친 {spans}건의 넘긴 간격에서 산출(연속 실행 사이에 두는 최소 간격 {ceiling}s 미만 유지).", + "min_power": "{cycles}개 정상 사이클의 p05 최저 활성 전력({p05}W)의 40%. 꺼짐 게이트를 실제 소비 전력보다 낮게 유지합니다.{excl}", + "ml_auto_label": "품질 모델이 여전히 정상으로 평가한 최저 신뢰도({cycles}개 정상 사이클의 p10 = {p10}).", + "ml_end_repeat": "{false}/{total} 사이클({pct}%)에서 종료 검출기가 50% 초과로 평가한 일시정지가 있었습니다. {val}회의 종료 확인을 요구합니다.", + "ml_off_delay": "종료 검출기가 확인한 일시정지: p95 {p95}s + 60s 버퍼. {cycles} 사이클에 걸친 모델 검증 일시정지 {pauses}건에서 산출(하한 {floor}s).", + "no_update_timeout": "관측된 업데이트 주기 기반(p95={p95}s) * 20(최소 60s).", + "off_delay_cadence": "관측된 업데이트 주기 기반(p95={p95}s) * 5", + "off_delay_device_floor": "{device}에 대한 기기별 안전 최소값을 사용({floor}s).", + "off_delay_generic_floor": "일반 안전 최소값을 사용({floor}s).", + "off_delay_pauses": "실제 일시정지보다 길도록 설정: p95 사이클 내 일시정지 {p95}s + 60s 버퍼. {cycles}개 정상 사이클에 걸친 {pauses}건의 일시정지에서 산출(하한 {floor}s).", + "profile_match_threshold": "{cycles}개 올바른 자동 라벨의 p10 신뢰도({p10}). 안전한 실시간 확정 하한.", + "sampling_interval": "{cycles}개 정상 사이클에서 관측된 중앙값 업데이트 간격({si}s).{excl}", + "smoothing_window": "{si}s 샘플링에서 약 30s 분량의 측정값을 평활화하도록 설정({samples} 샘플).", + "start_duration": "짧게 유지(약 1회 {si}s 샘플 간격). 단일 샘플 스파이크는 무시하면서 감지를 최대한 빨리 시작합니다.", + "thr_batch": "{cycles} 사이클의 p05 최저 활성 전력({p05}W) 바로 위로 유지합니다. 그래서 시작을 최대한 빨리 포착하고, 정지 임계값은 기기의 최저 작동 전력보다 낮게 유지됩니다.", + "tol_per_profile": "{profiles}개 프로필({cycles} 사이클)의 프로필별 시간 분산 p75. 편차가 작은 프로필은 불이익을 받지 않습니다.", + "tol_pooled": "{cycles}개 최근 라벨 사이클의 통합 시간 분산 기반(p95 편차={dev}).", + "watchdog": "안전한 범위에서 최대한 낮게 유지(p95 업데이트 간격 {p95}s보다 약간 큰 값, 최소 30s). 잘못된 정지 없이 멈춤을 빠르게 감지합니다." + }, + "exclusions": { + "summary": "잘못 감지된 사이클 {total}개를 제외했습니다: {parts}.", + "reason": { + "force_stopped": "강제 정지", + "interrupted": "중단", + "incomplete": "미완료", + "noise": "노이즈", + "unlabeled": "라벨 없음", + "no_trace_short": "너무 짧아 검사 불가", + "high_start": "고전력에서 시작", + "abrupt_end": "갑작스러운 종료", + "mid_restart": "사이클 중간 재시작", + "no_power": "전력 없음", + "no_active_power": "활성 전력 없음" + } + } + }, + "trend": { + "down": "하락세", + "up": "추세 상승" + }, + "maint": { + "bearing_service": "베어링 정비", + "descale": "석회질 제거", + "drum_clean": "드럼 청소", + "filter_clean": "필터 청소", + "other": "기타" + }, + "col": { + "profile_tip": "매칭된 프로그램 이름입니다. 라벨 없음은 사이클 종료 시 일치하는 프로필이 없음을 의미합니다.", + "status_tip": "사이클 결과: 완료됨(자연 종료), 중단됨(급격한 전력 강하), 강제 정지됨(수동), 또는 검토 필요(피드백 대기 중).", + "date_tip": "사이클이 시작된 날짜와 시간입니다.", + "duration_tip": "시작부터 종료까지의 총 사이클 실행 시간입니다.", + "energy_tip": "소비된 총 에너지(kWh)입니다. 시간에 따라 전력을 적분하여 계산합니다.", + "cost_tip": "이 사이클의 에너지 비용으로, 완료 시점에 적용된 가격(에너지 x kWh당 가격)으로 고정됩니다. 값을 채우려면 설정에서 가격을 지정하세요.", + "confidence_tip": "프로필 매칭 신뢰도(0-100%)입니다. 사이클 전력 곡선이 식별된 프로그램과 얼마나 근접하게 일치했는지를 나타냅니다.", + "health_tip": "ML 사이클 건강(높을수록 좋음)입니다. 검사하고 검토하려면 사이클을 클릭하세요.", + "flags_tip": "사이클의 검토, 이상, 소스 플래그. 아이콘에 마우스를 올리면 세부 정보가 표시됩니다." + }, + "stat": { + "avg": "평균", + "min": "최소 {v}", + "max": "최대 {v}", + "consistency": "일관성 ±{v}", + "total": "총 {v}", + "last_run": "마지막 실행 {v}", + "score": "점수 {pct}%", + "duration_cv": "지속 시간 CV {pct}%", + "avg_confidence": "평균 신뢰도 {pct}%" + }, + "pg_evd": { + "detected": "감지기가 사이클 시작을 인식했습니다.", + "match_commit": "매칭 기능이 충분한 신뢰도로 프로그램을 확정했습니다.", + "match_changed": "사이클이 더 진행되면서 가장 유력한 프로그램이 바뀌었습니다.", + "match_ambiguous": "두 프로그램의 점수가 비슷해서 매칭이 불확실했습니다.", + "unmatched": "이 사이클에 맞는 저장된 프로그램이 없습니다.", + "notify_start": "시작 알림이 전송됩니다.", + "notify_pre_complete": "거의 완료 알림이 전송됩니다.", + "notify_finish": "완료 알림이 전송됩니다.", + "notify_milestone": "마일스톤 알림이 전송됩니다.", + "notify_held": "방해 금지 시간대라서 알림이 보류되었습니다.", + "finished": "사이클이 종료 상태에 도달하여 끝났습니다." + }, + "store": { + "browse": "탐색", + "device": "기기", + "favorites": "즐겨찾기", + "search_ph": "브랜드 또는 모델로 검색…", + "no_results": "일치하는 가전제품을 찾을 수 없습니다. 다른 검색어로 시도하세요.", + "n_programs": "프로그램 {n}개", + "n_cycles": "사이클 {n}개", + "no_programs": "이 가전제품에 대해 아직 공유된 프로그램이 없습니다.", + "no_cycles": "이 프로그램에 대해 아직 공유된 참조 주기가 없습니다.", + "anon": "익명", + "uploaded_by": "{name} 님이 공유함", + "connected_as": "{name}(으)로 연결됨", + "not_connected": "연결되지 않았습니다. 자신의 사이클을 공유하려면 GitHub 계정을 연결하세요.", + "import_new": "새 프로필", + "import_merge": "기존 항목에 병합", + "merge_target": "병합 대상 프로필", + "description": "설명(선택 사항)", + "contributed_by": "{name} 제공", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "아직 평가 없음", + "website": "스토어 웹사이트 ↗", + "website_tip": "커뮤니티 스토어 웹사이트 열기" + }, + "settings": { + "gear": { + "title": "설정" + } + }, + "link": { + "manual": "설명서 ↗", + "add_appliance": "가전제품 추가" + }, + "tip": { + "add_brand": "브랜드가 목록에 없나요? 커뮤니티 카탈로그에 추가하세요", + "add_appliance": "모델이 목록에 없나요? 가전제품을 커뮤니티 카탈로그에 추가하세요", + "add_profile": "커뮤니티 사이트에서 이 가전제품의 프로필을 추가하세요" + }, + "task": { + "reprocess": { + "matching": "재처리: 사이클 매칭", + "golden": "재처리: 참조 사이클 보완", + "suggestions": "재처리: 제안", + "ml_training": "재처리: ML 훈련", + "health": "재처리: 사이클 건강" + }, + "pg_sweep": { + "optimize": "최적화: {param}" + }, + "pg_detail": { + "simulate": "사이클 시뮬레이션" + }, + "split": { + "apply": "사이클 분할 중" + }, + "trim": { + "apply": "사이클 트리밍 중" + }, + "merge": { + "apply": "사이클 병합 중" + }, + "rebuild": { + "envelopes": "엔벨로프 재구성 중" + }, + "cancelling": "취소 중..." + }, + "setup": { + "hdr": { + "card": "기기 설정", + "healthy_chip": "설정 완료" + }, + "phase0": { + "washer": "WashData가 이미 사이클을 감지하고 있습니다. 프로그램 이름과 시간 추정을 활성화하려면 첫 번째 사이클을 기록하세요.", + "dishwasher": "WashData가 관찰 중입니다. 식기세척기 사이클은 복잡합니다 – 첫 번째 사이클을 기록하는 것이 강력히 권장됩니다. 감지된 사이클이 너무 길게 실행되면 프로필로 저장하기 전에 사이클 편집기를 사용하여 다듬으세요.", + "generic": "WashData가 관찰 중입니다. 프로필 구축을 시작하려면 감지된 사이클을 기록하거나 라벨을 지정하세요." + }, + "phase1a": { + "labelled": "좋은 시작입니다 – 첫 번째 프로그램이 저장되었습니다. 가장 정확한 데이터를 위해 녹음기 위젯으로 다음 사이클을 기록하는 것을 고려해 보세요." + }, + "phase1b": { + "recorded": "녹음이 {profile_name}으로 저장되었습니다. 이제 다른 자주 사용하는 프로그램을 기록하거나 라벨을 지정하여 커버리지를 구축하세요." + }, + "phase1c": { + "verify": "커뮤니티에서 {count}개의 프로그램이 있습니다. WashData가 올바르게 인식하는지 확인하기 위해 사이클을 실행하세요 – 기기가 자체 기록을 쌓으면서 매칭이 개선됩니다." + }, + "phase2": { + "cluster": "WashData가 저장된 프로그램과 일치하지 않는 {count}개의 사이클을 발견했습니다 – 서로 비슷해 보입니다. 이를 위한 새 프로필을 만들고 싶으신가요?", + "unmatched": "마지막 사이클이 저장된 프로그램과 일치하지 않았습니다. 새 프로그램인가요?" + }, + "phase3": { + "suggestions": "WashData가 사이클 기록을 기반으로 설정 권장 사항을 제안합니다 – 감지 정확도를 높이기 위해 검토하세요.", + "groups": "일부 프로필이 다른 온도의 동일한 프로그램처럼 보입니다. 더 나은 매칭을 위해 그룹으로 구성하세요.", + "phases": "더 정확한 잔여 시간 추정을 위해 {profile_name}에 프로그램 단계를 추가하세요." + }, + "phase4": { + "healthy": "이 기기는 완전히 설정되었습니다 ({profile_count}개 프로필)." + }, + "cta": { + "start_recording": "녹음 시작", + "label_detected_cycle": "이미 감지된 사이클이 있습니다 – 대신 라벨 지정", + "browse_cycles": "다른 사이클에 라벨을 지정하려면 찾아보기", + "view_profiles": "프로필 보기", + "create_from_cluster": "이 사이클들로 프로필 만들기", + "create_profile": "이를 위한 프로필 만들기", + "review_suggestions": "제안 검토", + "organise_profiles": "프로필 구성", + "configure_phases": "단계 구성", + "skip_step": "이 단계 건너뛰기", + "skip_forever": "다시 표시 안 함", + "hide_guidance": "안내 숨기기", + "show_guidance": "안내 표시" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/lt.json b/custom_components/ha_washdata/translations/panel/lt.json index b22404f9..cf4645b3 100644 --- a/custom_components/ha_washdata/translations/panel/lt.json +++ b/custom_components/ha_washdata/translations/panel/lt.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Objektas nerastas", + "running_long": "Veikia ilgai", + "remaining": "liko", + "progress": "eiga", + "show_time_remaining": "Rodyti likusį laiką", + "show_percentage": "Rodyti procentus", + "layout": { + "tile": "Plytelė (kompaktiška)", + "detail": "Detali (išsami)", + "glance": "Apžvalga (keli įrenginiai)" + }, + "btn": { + "pause": "Pristabdyti", + "resume": "Tęsti", + "terminate": "Baigti ciklą", + "record_start": "Pradėti įrašymą", + "record_stop": "Sustabdyti įrašymą", + "program": "Programa", + "open_panel": "Atidaryti WashData" + }, + "editor": { + "layout": "Išdėstymas", + "entity": "Prietaiso objektas", + "entities": "Prietaisai", + "title": "Pavadinimas", + "icon": "Piktograma", + "show_state": "Rodyti būseną", + "show_program": "Rodyti programą", + "show_progress_bar": "Rodyti eigos juostą", + "spin_icon": "Sukti piktogramą veikiant", + "display_mode": "Detalių eilutė", + "active_color": "Aktyvios spalvos pakeitimas", + "show_phase": "Rodyti fazę", + "show_energy": "Rodyti energiją ir kainą", + "show_anomaly": "Rodyti užsitęsimo įspėjimą", + "show_sparkline": "Rodyti tiesioginį galios grafiką", + "buttons": "Veiksmų mygtukai", + "program_entity": "Programos objektas (pakeitimas)", + "time_entity": "Laiko objektas (pakeitimas)", + "pct_entity": "Eigos objektas (pakeitimas)", + "power_entity": "Galios objektas (pakeitimas)", + "tap_action": "Palietimo veiksmas", + "hold_action": "Palaikymo veiksmas", + "double_tap_action": "Dvigubo palietimo veiksmas" + } + }, "badge": { "artifact_tip": "Aptikta {n} anomalijų (pvz., durys atidarytos ciklo viduryje) – atidarykite, kad pamatytumėte juos diagramoje", "auto": "(aptikta automatiškai)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Pristabdyti veikiantį ciklą – prietaisas tęsis nuo tos vietos, kur sustojo", "pg_apply_device": "Taikyti įrenginiui", "pg_autofill": "Automatinis užpildymas", + "pg_load_calibrated": "Įkelti kalibruotus (ML) ({n})", + "pg_load_calibrated_tip": "Įkelti ML kalibruotus nustatymus kaip bandymų aikštelės perrašymus", + "pg_load_live": "Įkelti aktyvius nustatymus", + "pg_load_live_tip": "Iš naujo nuskaityti dabartinius integracijos nustatymus ir atmesti visus bandymų aikštelės pakeitimus", + "pg_load_suggested": "Įkelti siūlomus ({n})", + "pg_load_suggested_tip": "Įkelti dabartines automatinio derintuvo rekomendacijas kaip bandymų aikštelės perrašymus", + "pg_preset_delete": "Ištrinti rinkinį", + "pg_preset_load": "Įkelti rinkinį", + "pg_preset_load_tip": "Pakeisti bandymų aikštelės reikšmes šiuo rinkiniu (aktyvūs nustatymai nekeičiami)", + "pg_preset_save": "Išsaugoti kaip rinkinį", + "pg_preset_save_tip": "Išsaugoti visas toliau esančias reikšmes kaip pavadintą šio įrenginio nustatymų rinkinį", + "pg_publish_all": "Įrašyti į nustatymus ({n})", + "pg_publish_one": "Įrašyti „{label}“ į integracijos nustatymus", "play": "Leisti", "process": "Apdoroti", "process_history": "Apdorokite dabar", @@ -178,7 +239,9 @@ "download_export": "Atsisiųsti eksportą", "analyze_import": "Analizuoti failą", "import_selected": "Importuoti pasirinktus", - "back": "Atgal" + "back": "Atgal", + "mute_suggestion": "Nebesiūlyti šio nustatymo", + "reset_muted": "Atstatyti nutildytus" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +338,7 @@ "no_automations": "Dar jokia automatika nenurodo šio įrenginio.", "panel_settings": "Skydelio nustatymai", "param_sweep": "Parametrų skenavimas", + "pg_settings_source": "Nustatymų šaltinis", "phase_catalog": "Fazių katalogas", "playground": "Bandymų aikštelė", "process_history": "Proceso istorija", @@ -415,6 +479,9 @@ "pg_match_score": "Atitikties balas", "pg_pct_of": "{p}% iš {total}", "pg_poor_match": "Prasta atitiktis", + "pg_preset": "Bandymų aikštelės rinkinys", + "pg_preset_name": "Naujo rinkinio pavadinimas", + "pg_preset_none": "Pasirinkite rinkinį…", "pg_strong_match": "Stipri atitiktis", "pg_tile_ambiguous": "Dviprasmiška", "pg_tile_ambiguous_tip": "Ciklai, kuriuose dvi programos beveik lygios", @@ -609,7 +676,8 @@ "conflict_resolution": "Pavadinimų konfliktai", "conflict_import_copy": "Importuoti kaip kopiją", "conflict_keep_mine": "Išlaikyti manuosius", - "conflict_overwrite": "Perrašyti" + "conflict_overwrite": "Perrašyti", + "font_size": "Skydelio šrifto dydis" }, "log": { "all_levels": "Visi lygiai", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Taikyti geriausią reikšmę: {label} = {value}?", "pg_canvas_empty": "Pasirinkite ciklą aukščiau, tada paspauskite „Įkelti“, kad pamatytumėte jo galios kreivę.", "pg_chart_caption": "Aptikimo / atitikties rodiklis pagal {param} reikšmes", + "pg_ctrl_intro": "Reikšmės imamos iš aktyvių šio įrenginio integracijos nustatymų. Pakeitimai lieka bandymų aikštelėje, kol jų neįrašysite į nustatymus.", + "pg_live_unavailable": "Aktyvūs nustatymai nepasiekiami, rodomos numatytosios reikšmės.", + "pg_load_live_confirm": "Atmesti bandymų aikštelės pakeitimus ({n}) ir iš naujo įkelti dabartinius integracijos nustatymus?", "pg_match_rate": "{pct}% atitikties rodiklis iš {total} ciklų", + "pg_matches_live": "Sutampa su aktyviais nustatymais", + "pg_n_changed": "Skirtumų nuo aktyvių nustatymų: {n}", + "pg_sugg_none": "Visi pasiūlymai jau atitinka dabartinius nustatymus", + "pg_preset_delete_confirm": "Ištrinti rinkinį „{name}“?", + "pg_preset_limit": "Pasiekta rinkinių riba ({n})", + "pg_preset_overwrite": "Perrašyti rinkinį „{name}“?", + "pg_publish_one_confirm": "Įrašyti {label} = {value} į šio įrenginio nustatymus?", "pg_restart_note": "Iš naujo paleiskite „Home Assistant“, kad įjungtumėte simuliavimo įrankius.", "pg_sim_progress": "{done} / {total} ciklai", "pg_starting": "Pradedama…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Trukmė mažėja ({pct} %/ciklas) – pastaruoju metu vid. {avg}", "trend_energy_down": "Energijos mažėjimas ({pct} % per ciklą)", "trend_energy_up": "Energijos augimas ({pct} % per ciklą) – pastaruoju metu vid. {avg}", + "trim_destructive_confirm": "Bus išsaugota tik {pct}% ciklo ir to nebus galima atšaukti. Tęsti?", "trim_intro": "Vilkite raudonas rankenas arba įveskite vertes. Viskas, kas yra už lango, pašalinama.", "tuning_suggestions_available": "Galimas {count} derinimo pasiūlymas iš stebimų ciklų. Jie rodomi šalia atitinkamų laukų.", "unsure_detected_prefix": "„WashData“ nėra tikras, kad aptiko", @@ -922,7 +1001,12 @@ "merge_hint": "Importuoti elementai pridedami; jokie vietiniai duomenys neprarandami. Pavadinimų konfliktai sprendžiami toliau.", "replace_warn": "Kiekviena pažymėta kategorija ištrinama ir pakeičiama iš failo. Nepažymėtos kategorijos lieka nepaliestos.", "dest_reference_hint": "Importuoti ciklai tik pagerina programų atpažinimą ir niekada neveikia naudojimo/energijos statistikos.", - "dest_real_history_hint": "Importuoti ciklai laikomi šio prietaiso paties istorija ir papildo energijos/naudojimo statistiką. Naudokite perkeliant vieną prietaisą į naują įdiegimą." + "dest_real_history_hint": "Importuoti ciklai laikomi šio prietaiso paties istorija ir papildo energijos/naudojimo statistiką. Naudokite perkeliant vieną prietaisą į naują įdiegimą.", + "sug_muted": "Šio nustatymo daugiau nebesiūlys", + "sug_mute_failed": "Nepavyko nutildyti pasiūlymo", + "sug_unmuted_all": "Nutildyti pasiūlymai atstatyti", + "n_suggestions_muted": "{count} nutildyti; automatinis derintuvas jų nebesiūlys.", + "font_size_hint": "Padidinkite arba sumažinkite visą tekstą šiame skydelyje. Galioja jūsų paskyrai šiame įrenginyje." }, "phase_desc": { "anti_crease": "Po pagrindinio ciklo būgnas intermitiškai sukasi, kad išvengtų audinių raukšlių.", @@ -970,6 +1054,10 @@ "unusable": "Netinkamas naudoti" }, "section": { + "dishwasher": { + "label": "Indaplovė", + "intro": "Ciklo pabaigos apdorojimas indaplovėms, kurios paprastai baigiasi ilga, beveik tylia džiovinimo faze prieš trumpą galutinį vandens išleidimą." + }, "anti_wrinkle": { "intro": "Apsaugos nuo raukšlių režimas aptinka mažos galios sukimosi impulsus po pagrindinės fazės ir prideda juos prie baigto ciklo.", "label": "Apsauga nuo raukšlių" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Pasyvaus džiovinimo tylusis atleidimas", + "doc": "Kai ciklas viršija numatytą trukmę, kiek laiko indaplovė turi išlikti tyli (žemiau Sustabdymo slenkstis) prieš tai, kai WashData nustoja laukti galutinio vandens išleidimo ir užbaigia ciklą. Padidinkite, jei jūsų aparatas turi ilgą tylią džiovinimo fazę prieš vėlyvą galutinį vandens išleidimą, kuris praleidžiamas - platesnis langas leidžia išmoktai trukmei sekti sezoninį poslinkį (šaltesnis įleidžiamas vanduo = ilgesni ciklai), užuot užsifiksavus ties senuoju vidurkiu. Jis gali tik sutrumpinti laukimą, palyginti su vidiniu 30 minučių pabaigos smailės ribojimu, bet niekada jo nepailgina." + }, "anti_wrinkle_enabled": { "doc": "Atpažinkite trumpus mažos galios būgninius impulsus, kuriuos džiovyklė skleidžia po pagrindinės šildymo fazės, ir laikykite juos prijungtus prie baigto ciklo, o ne skaitykite juos kaip naujus ciklus.", "label": "Įjungti apsaugą nuo raukšlių" @@ -1232,6 +1324,10 @@ "doc": "Minutės po ciklo pabaigos prieš siunčiant vis dar laukiantį priminimą „iškrauti mašiną“. Norėdami išjungti priminimą, nustatykite 0.", "label": "Iškrovimo priminimo delsimas" }, + "notify_unload_repeat": { + "doc": "Iškrovimo priminimas pakartotinai siunčiamas kas \"Iškrovimo priminimo delsimas\" minučių, kol neatidarysite durų arba pranešime nepaliesite \"Nustoti priminti\". Reikalingas Durų jutiklio objektas (kaip ir pačiam priminimui). Atmetimo mygtukas veikia Home Assistant mobiliosios (companion) programėlės pranešimuose.", + "label": "Kartoti, kol atsidarys durys" + }, "off_delay": { "doc": "Laikas palaukti, kai nukrenta galia, prieš paskelbiant, kad ciklas baigtas. Jei maitinimas atnaujinamas šiame lange, ciklas tęsiasi sklandžiai – tai sujungia pauzes tarp plovimo etapų. Indaplovės turi ilgas džiovinimo fazes (maitinimas išjungiamas 20–60 min.), todėl išjungimo delsa turi būti didesnė už tą, kad visas plovimas+džiovinimas išliktų kaip vienas ciklas.", "label": "Išjungimo delsimas" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Energijos ryškumas", "doc": "4 etapo energijos atitikimo bausmės ryškumas. Mažesnis = griežtesnis: energijos neatitikimas kenkia labiau. Numatytoji 0,25 sąmoningai atlaidesnė nei trukmės ryškumas, nes energija kinta priklausomai nuo apkrovos. Naudokite su Energijos svoriu." + }, + "power_profile_interval_min": { + "label": "Galios profilio intervalas", + "doc": "Kibirio dydis profilio power_profile jutiklio atributui (plokščias per laiko atkarpas vidutinių vatų masyvas, naudojamas išorinių planavimo sistemų, pvz., EMHASS ir tibber_prices). Mažesni kibirai išlaiko trumpus galios šuolius aštresniais; didesni kibirai lygina formą. Numatytasis 15 min. Tik skaitymo metu; neturi įtakos aptikimui." + }, + "notify_live_sticky": { + "label": "Išlaikyti tiesioginį pranešimą po paspaudimo", + "doc": "Tik Android. Padaryti tiesioginį pažangos pranešimą patvariu (klijuojamu), kad paspaudus nebus atsisakyta vykstančios gijos. Išjungus paliekama numatytoji elgsena, kai paspaudus pranešimas atsisakomas." + }, + "notify_live_click_action": { + "label": "Tiesioginio pranešimo paspaudimo tikslas", + "doc": "Tik Android. Kur atidaroma paspaudus tiesioginės pažangos pranešimą (pvz., /lovelace/laundry arba visas URL), o ne programos pradžios puslapis. Palikite tuščią, kad naudotumėte numatytąjį." + }, + "door_opens_at_end": { + "label": "Durys automatiškai atsidaromos pabaigoje", + "doc": "Indaplovėms, kurios ciklo pabaigoje atidaro duris džiovinimui (AirDry ir panašūs). Įjungus, durų atidarymas veikiančio ciklo metu nebepristabdo jo amžinai; vietoj to, jei durys lieka atviros toliau nurodytą laikotarpį, WashData traktuoja ciklą kaip baigtą. Trumpas atidarymas (dedant indą) ignoruojamas. Reikalingas durų jutiklio objektas." + }, + "door_end_dwell_seconds": { + "label": "Durų atidarymo pabaigos laukimas", + "doc": "Kiek laiko durys turi likti atviros, kad WashData užbaigtų ciklą, kai įjungta parinktis \"Durys automatiškai atsidaromos pabaigoje\". Pakankamai ilgai, kad ignoruotų greitai dedamą indą (numatytasis 60 s), pakankamai trumpai, kad greitai užbaigtų, kai prietaisas atidaro duris." } }, "setting_group": { @@ -1576,6 +1692,10 @@ "name_required": "Reikalingas vardas", "no_split_found": "Nerasta tuščiosios eigos spragų, dėl kurių būtų galima suskaidyti", "panel_settings_saved": "Skydelio nustatymai išsaugoti", + "pg_preset_loaded": "Rinkinys „{name}“ įkeltas", + "pg_preset_saved": "Rinkinys „{name}” išsaugotas", + "pg_sugg_loaded": "Įkelta {n} siūlomų reikšmių - paleiskite bandymų aikštelę palyginti", + "pg_sugg_ml_loaded": "Įkelta {n} ML kalibruotų reikšmių - paleiskite bandymų aikštelę palyginti", "phase_name_required": "Būtinas fazės pavadinimas", "phase_updated": "Atnaujintas etapas", "phases_saved": "Fazės išsaugotos", @@ -1723,6 +1843,7 @@ "min_active": "Pagrįsta mažiausia aktyvia galia ({min}W), stebėta paskutiniame cikle.", "min_duration_ratio": "Paliktas kuo mažesnis, kad programa būtų atpažinta ciklo pradžioje; patikimumo ir dviprasmiškumo slenksčiai neleidžia patvirtinti per anksti.", "min_off_gap": "Pagrįsta {gaps} stebimais tarpcikliniais tarpais (p05={p05}s). Prietaiso apatinė riba: {floor}s.", + "min_off_gap_bridge": "Nustatyta taip, kad perdengtų ilgiausią tylos tarpsnį ciklo viduje: {span}s + 60s buferis, iš {spans} perdengtų tarpų per {cycles} švarius ciklus (lieka žemiau trumpiausio jūsų tarpo tarp dviejų paleidimų iš eilės, kuris yra {ceiling}s).", "min_power": "40% p05 mažiausios aktyvios galios ({p05}W) per {cycles} švarius ciklus, išlaikant išjungimo slenkstį žemiau realaus suvartojimo.{excl}", "ml_auto_label": "Mažiausias patikimumas, kurį kokybės modelis vis dar įvertino kaip švarų (p10 iš {cycles} švarių ciklų = {p10}).", "ml_end_repeat": "{false}/{total} ciklų ({pct}%) turėjo pauzę, kurią pabaigos detektorius įvertino >50%; reikalauti {val} pabaigos patvirtinimo(-ų).", @@ -1739,7 +1860,7 @@ "thr_batch": "Paliktas šiek tiek virš p05 mažiausios aktyvios galios per {cycles} ciklus ({p05}W), kad pradžia būtų aptikta kuo anksčiau, o sustabdymo slenkstis liktų žemiau mažiausios veikiančios mašinos galios.", "tol_per_profile": "p75 kiekvieno profilio trukmės dispersijos per {profiles} profilius ({cycles} ciklai); stabilūs profiliai nebaudžiami.", "tol_pooled": "Pagrįsta sujungta {cycles} naujausių pažymėtų ciklų trukmės dispersija (p95 nuokrypis={dev}).", - "watchdog": "Paliktas kuo mažesnis, kiek saugu (3x p95 atnaujinimo tarpas {p95}s, min. 30s), kad strigtys būtų aptiktos greitai be klaidingų sustabdymų." + "watchdog": "Paliktas kuo mažesnis, kiek saugu (vos didesnis nei p95 atnaujinimo tarpas {p95}s, min. 30s), kad strigtys būtų aptiktos greitai be klaidingų sustabdymų." }, "exclusions": { "summary": "Neįtraukta {total} klaidingai aptiktų ciklų: {parts}.", @@ -1770,6 +1891,7 @@ "other": "Kita" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Indaplovė: tylos sekundės po numatytos trukmės, kol atleidžiamas ciklo pabaigos vandens išleidimo laukimas", "anti_wrinkle_enabled": "Sugerkite būgninius impulsus po pagrindinės fazės, o ne skaitykite juos kaip naujus ciklus", "anti_wrinkle_exit_power": "Kad apsauga nuo raukšlių išliktų aktyvi, galia tarp impulsų turi nukristi žemiau šios ribos", "anti_wrinkle_idle_timeout": "Tylos laikas, leidžiamas tarp dviejų būgninių impulsų prieš pasibaigiant apsaugai nuo raukšlių", diff --git a/custom_components/ha_washdata/translations/panel/lv.json b/custom_components/ha_washdata/translations/panel/lv.json index b0dbff0f..dc8a45df 100644 --- a/custom_components/ha_washdata/translations/panel/lv.json +++ b/custom_components/ha_washdata/translations/panel/lv.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entītija nav atrasta", + "running_long": "Darbojas ilgi", + "remaining": "atlicis", + "progress": "progress", + "show_time_remaining": "Rādīt atlikušo laiku", + "show_percentage": "Rādīt procentus", + "layout": { + "tile": "Elements (kompakts)", + "detail": "Detalizēts (bagātīgs)", + "glance": "Pārskats (vairākas ierīces)" + }, + "btn": { + "pause": "Pauzēt", + "resume": "Turpināt", + "terminate": "Beigt ciklu", + "record_start": "Sākt ierakstīšanu", + "record_stop": "Apturēt ierakstīšanu", + "program": "Programma", + "open_panel": "Atvērt WashData" + }, + "editor": { + "layout": "Izkārtojums", + "entity": "Ierīces entītija", + "entities": "Ierīces", + "title": "Nosaukums", + "icon": "Ikona", + "show_state": "Rādīt stāvokli", + "show_program": "Rādīt programmu", + "show_progress_bar": "Rādīt progresa joslu", + "spin_icon": "Griezt ikonu darbības laikā", + "display_mode": "Detaļu rinda", + "active_color": "Aktīvās krāsas aizstāšana", + "show_phase": "Rādīt fāzi", + "show_energy": "Rādīt enerģiju un izmaksas", + "show_anomaly": "Rādīt pārsnieguma brīdinājumu", + "show_sparkline": "Rādīt tiešo jaudas grafiku", + "buttons": "Darbību pogas", + "program_entity": "Programmas entītija (aizstāšana)", + "time_entity": "Laika entītija (aizstāšana)", + "pct_entity": "Progresa entītija (aizstāšana)", + "power_entity": "Jaudas entītija (aizstāšana)", + "tap_action": "Pieskāriena darbība", + "hold_action": "Turēšanas darbība", + "double_tap_action": "Dubultā pieskāriena darbība" + } + }, "badge": { "artifact_tip": "Konstatētas {n} anomālijas (piemēram, durvis atvērtas cikla vidū) – atveriet, lai tās skatītu diagrammā", "auto": "(noteikts automātiski)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Pauzēt pašreizējo ciklu – ierīce turpinās no pārtraukuma vietas", "pg_apply_device": "Lietot ierīcei", "pg_autofill": "Automātiskā aizpilde", + "pg_load_calibrated": "Ielādēt kalibrētos (ML) ({n})", + "pg_load_calibrated_tip": "Ielādēt ML kalibrētos iestatījumus kā izmēģinājumu laukuma aizstājumus", + "pg_load_live": "Ielādēt aktīvos iestatījumus", + "pg_load_live_tip": "No jauna nolasīt pašreizējos integrācijas iestatījumus un atmest visas izmēģinājumu laukuma izmaiņas", + "pg_load_suggested": "Ielādēt ieteiktos ({n})", + "pg_load_suggested_tip": "Ielādēt automātiskā pielāgotāja pašreizējos ieteikumus kā izmēģinājumu laukuma aizstājumus", + "pg_preset_delete": "Dzēst priekšiestatījumu", + "pg_preset_load": "Ielādēt priekšiestatījumu", + "pg_preset_load_tip": "Aizstāt izmēģinājumu laukuma vērtības ar šo priekšiestatījumu (aktīvie iestatījumi netiek mainīti)", + "pg_preset_save": "Saglabāt kā priekšiestatījumu", + "pg_preset_save_tip": "Saglabāt visas tālāk norādītās vērtības kā nosauktu šīs ierīces priekšiestatījumu", + "pg_publish_all": "Saglabāt iestatījumos ({n})", + "pg_publish_one": "Saglabāt \"{label}\" integrācijas iestatījumos", "play": "Atskaņot", "process": "Apstrādāt", "process_history": "Apstrādāt tūlīt", @@ -178,7 +239,9 @@ "download_export": "Lejupielādēt eksportu", "analyze_import": "Analizēt failu", "import_selected": "Importēt atlasītos", - "back": "Atpakaļ" + "back": "Atpakaļ", + "mute_suggestion": "Pārtraukt ieteikt šo iestatījumu", + "reset_muted": "Atiestatīt klusinātos" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +338,7 @@ "no_automations": "Vēl neviena automatizācija neatsaucas uz šo ierīci.", "panel_settings": "Paneļa iestatījumi", "param_sweep": "Parametru skenēšana", + "pg_settings_source": "Iestatījumu avots", "phase_catalog": "Fāzes katalogs", "playground": "Izmēģinājumu laukums", "process_history": "Procesa vēsture", @@ -415,6 +479,9 @@ "pg_match_score": "Atbilstības rezultāts", "pg_pct_of": "{p}% no {total}", "pg_poor_match": "Slikta atbilstība", + "pg_preset": "Izmēģinājumu laukuma priekšiestatījums", + "pg_preset_name": "Jauna priekšiestatījuma nosaukums", + "pg_preset_none": "Atlasiet priekšiestatījumu…", "pg_strong_match": "Spēcīga atbilstība", "pg_tile_ambiguous": "Neviennozīmīgi", "pg_tile_ambiguous_tip": "Cikli, kuros divas programmas ir gandrīz vienādas", @@ -609,7 +676,8 @@ "conflict_resolution": "Nosaukumu konflikti", "conflict_import_copy": "Importēt kā kopiju", "conflict_keep_mine": "Paturēt manējos", - "conflict_overwrite": "Pārrakstīt" + "conflict_overwrite": "Pārrakstīt", + "font_size": "Paneļa fonta lielums" }, "log": { "all_levels": "Visi līmeņi", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Lietot labāko vērtību: {label} = {value}?", "pg_canvas_empty": "Atlasiet ciklu augšpusē, pēc tam nospiediet Ielādēt, lai redzētu tā jaudas līkni.", "pg_chart_caption": "Noteikšanas/atbilstības rādītājs pēc {param} vērtībām", + "pg_ctrl_intro": "Vērtības tiek ņemtas no šīs ierīces aktīvajiem integrācijas iestatījumiem. Izmaiņas paliek izmēģinājumu laukumā, līdz tās saglabājat iestatījumos.", + "pg_live_unavailable": "Aktīvie iestatījumi nav pieejami, tiek rādītas noklusējuma vērtības.", + "pg_load_live_confirm": "Vai atmest izmēģinājumu laukuma izmaiņas ({n}) un no jauna ielādēt pašreizējos integrācijas iestatījumus?", "pg_match_rate": "{pct}% atbilstības rādītājs {total} ciklos", + "pg_matches_live": "Atbilst aktīvajiem iestatījumiem", + "pg_n_changed": "Atšķirību no aktīvajiem iestatījumiem: {n}", + "pg_sugg_none": "Visi ieteikumi jau atbilst pašreizējiem iestatījumiem", + "pg_preset_delete_confirm": "Vai dzēst priekšiestatījumu \"{name}\"?", + "pg_preset_limit": "Sasniegts priekšiestatījumu ierobežojums ({n})", + "pg_preset_overwrite": "Vai pārrakstīt priekšiestatījumu \"{name}\"?", + "pg_publish_one_confirm": "Vai saglabāt {label} = {value} šīs ierīces iestatījumos?", "pg_restart_note": "Restartējiet Home Assistant, lai iespējotu simulācijas rīkus.", "pg_sim_progress": "{done} / {total} cikli", "pg_starting": "Sākas…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Ilguma tendence ir īsāka ({pct}%/cikls) – nesenā vidējā {avg}", "trend_energy_down": "Enerģijas tendence samazinās ({pct}%/cikls)", "trend_energy_up": "Enerģijas tendence pieaug ({pct}%/ciklā) – nesenā vidējā {avg}", + "trim_destructive_confirm": "Tas saglabā tikai {pct}% no cikla, un šo nevar atsaukt. Turpināt?", "trim_intro": "Velciet sarkanos rokturus vai ievadiet vērtības. Viss, kas atrodas ārpus loga, tiek noņemts.", "tuning_suggestions_available": "No novērotajiem cikliem pieejams {count} regulēšanas ieteikums. Tie parādās blakus attiecīgajiem laukiem.", "unsure_detected_prefix": "WashData nav pārliecināts, ka tas ir atklāts", @@ -922,7 +1001,12 @@ "merge_hint": "Importētie vienumi tiek pievienoti; nekas no vietējiem datiem netiek zaudēts. Nosaukumu konflikti tiek risināti tālāk.", "replace_warn": "Katra atzīmētā kategorija tiek dzēsta un aizstāta no faila. Neatzīmētās kategorijas paliek neskartas.", "dest_reference_hint": "Importētie cikli tikai uzlabo programmu atpazīšanu un nekad neietekmē lietojuma/enerģijas statistiku.", - "dest_real_history_hint": "Importētie cikli tiek uzskaitīti kā šīs ierīces pašas vēsture un papildina enerģijas/lietojuma statistiku. Izmantojiet, pārvietojot vienu ierīci uz jaunu instalāciju." + "dest_real_history_hint": "Importētie cikli tiek uzskaitīti kā šīs ierīces pašas vēsture un papildina enerģijas/lietojuma statistiku. Izmantojiet, pārvietojot vienu ierīci uz jaunu instalāciju.", + "sug_muted": "Šis iestatījums vairs netiks ieteikts", + "sug_mute_failed": "Neizdevās klusināt ieteikumu", + "sug_unmuted_all": "Klusināto ieteikumu atiestatīšana pabeigta", + "n_suggestions_muted": "{count} klusināti; automātiskais regulētājs tos vairs nepiedāvās.", + "font_size_hint": "Palieliniet vai samaziniet visu šajā panelī. Attiecas uz jūsu kontu šajā ierīcē." }, "phase_desc": { "anti_crease": "Laiku pa laikam pēc pabeigšanas veiciet īsus gājienus, lai samazinātu grumbiņas.", @@ -970,6 +1054,10 @@ "unusable": "Nelietojama" }, "section": { + "dishwasher": { + "label": "Trauku mazgājamā mašīna", + "intro": "Cikla beigu apstrāde trauku mazgājamām mašīnām, kuras parasti beidzas ar ilgu, gandrīz klusu žāvēšanas fāzi pirms īsas galīgās ūdens izvadīšanas." + }, "anti_wrinkle": { "intro": "Pretgrumbu/pretlocīšanas režīms atpazīst zemas jaudas kratīšanas impulsus pēc galvenās fāzes un pievieno tos pabeigtajam ciklam.", "label": "Pretgrumbu" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Pasīvās žāvēšanas klusā atbrīvošana", + "doc": "Kad cikls pārsniedz paredzēto ilgumu, cik ilgi trauku mazgājamai mašīnai jāpaliek klusai (zem Apstāšanās slieksnis), pirms WashData pārtrauc gaidīt galīgo ūdens izvadīšanu un pabeidz ciklu. Palieliniet to, ja jūsu mašīnai ir ilga klusa žāvēšanas fāze pirms vēlas galīgās ūdens izvadīšanas, kas tiek palaista garām - plašāks logs ļauj apgūtajam ilgumam sekot sezonālajai novirzei (aukstāks ieplūstošais ūdens = garāki cikli), nevis fiksēties pie vecā vidējā. Tas var tikai saīsināt gaidīšanu attiecībā pret iekšējo 30 minūšu beigu smailes ierobežojumu, nekad to nepagarina." + }, "anti_wrinkle_enabled": { "doc": "Atpazīstiet īsos mazjaudas veļas impulsus, ko žāvētājs izstaro pēc galvenās karsēšanas fāzes, un turiet tos pievienotus gatavajam ciklam, nevis nolasiet tos kā jaunus ciklus.", "label": "Iespējot pretgrumbu noteikšanu" @@ -1232,6 +1324,10 @@ "doc": "Dažas minūtes pēc cikla beigām, pirms tiek nosūtīts joprojām gaidošais atgādinājums \"izlādēt iekārtu\". Iestatiet 0, lai atspējotu atgādinājumu.", "label": "Izkraušanas atgādinājuma aizkave" }, + "notify_unload_repeat": { + "doc": "Atkārtoti nosūta izkraušanas atgādinājumu ik pēc \"Izkraušanas atgādinājuma aizkave\" minūtēm, līdz atverat durvis vai paziņojumā pieskaraties \"Pārtraukt atgādināšanu\". Nepieciešama Durvju sensora entītija (tāpat kā pašam atgādinājumam). Atmešanas poga darbojas Home Assistant mobilās (companion) lietotnes paziņojumos.", + "label": "Atkārtot, līdz atveras durvis" + }, "off_delay": { "doc": "Laiks gaidīt, kad jauda samazinās, pirms tiek paziņots, ka cikls ir pabeigts. Ja šajā logā tiek atsākta barošana, cikls turpinās nemanāmi – tas pārslēdz pauzes starp mazgāšanas posmiem. Trauku mazgājamām mašīnām ir garas žāvēšanas fāzes (izslēdziet strāvu uz 20–60 minūtēm), tāpēc izslēgšanas aizkavei ir jābūt lielākai par to, lai visa mazgāšana un žāvēšana būtu viens cikls.", "label": "Izslēgšanas aizkave" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Enerģijas asums", "doc": "4. posma enerģijas atbilstības soda asums. Mazāks = bargāks: enerģijas neatbilstība kaitē vairāk. Noklusējums 0,25 ir apzināti piedodošāks nekā ilguma asums, jo enerģija mainās atkarībā no slodzes. Izmantojiet kopā ar Enerģijas svaru." + }, + "power_profile_interval_min": { + "label": "Jaudas profila intervāls", + "doc": "Spaiņa lielums profilam power_profile sensora atribūtam (vienots vidējo vatu masīvs pa laika nišām, ko izmanto ārējie plānotāji, piemēram, EMHASS un tibber_prices). Mazāki spaini saglabā īsas jaudas pikas asas; lielāki spaini izlīdzina formu. Noklusējums 15 min. Tikai lasīšanas laikā; neietekmē noteikšanu." + }, + "notify_live_sticky": { + "label": "Saglabāt tiešraides paziņojumu pēc pieskāriena", + "doc": "Tikai Android. Padarīt tiešraides progresa paziņojumu pastāvīgu (lipīgu), lai pieskāriens tam neatceltu notiekošo pavedienu. Izslēgts saglabā noklusēto uzvedību, kad pieskāriens paziņojumu noraida." + }, + "notify_live_click_action": { + "label": "Tiešraides paziņojuma pieskāriena mērķis", + "doc": "Tikai Android. Kur atveras tiešraides progresa paziņojuma pieskāriens (piemēram, /lovelace/laundry vai pilns URL), nevis lietotnes sākumlapa. Atstājiet tukšu noklusējumam." + }, + "door_opens_at_end": { + "label": "Durvis automātiski atveras beigās", + "doc": "Trauku mazgājamajām mašīnām, kuras cikla beigās atver durvis žāvēšanai (AirDry un līdzīgas). Ieslēgts, durvju atvēršana darbojošā ciklā vairs nepārtrauc to uz visiem laikiem; tā vietā, ja durvis paliek atvērtas norādīto uzturēšanās laiku zemāk, WashData uzskata ciklu par pabeigtu. Īsa atvēršana (pievienojot trauku) tiek ignorēta. Nepieciešams durvju sensora objekts." + }, + "door_end_dwell_seconds": { + "label": "Durvju atvēršanas beigu uzturēšanās laiks", + "doc": "Cik ilgi durvis jāpaliek atvērtām, lai WashData beigtu ciklu, kad ir ieslēgts iestatījums \"Durvis automātiski atveras beigās\". Pietiekami ilgi, lai ignorētu ātru trauka pievienošanu (noklusējums 60 s), pietiekami īsi, lai ātri beigtu, kad mašīna atver durvis." } }, "setting_group": { @@ -1576,6 +1692,10 @@ "name_required": "Nepieciešams vārds", "no_split_found": "Nav atrastas tukšgaitas spraugas, uz kurām varētu sadalīties", "panel_settings_saved": "Paneļa iestatījumi ir saglabāti", + "pg_preset_loaded": "Priekšiestatījums \"{name}\" ielādēts", + "pg_preset_saved": "Priekšiestatījums \"{name}\" saglabāts", + "pg_sugg_loaded": "Ielādētas {n} ieteiktās vērtības - palaidiet izmēģinājumu laukumu salīdzināšanai", + "pg_sugg_ml_loaded": "Ielādētas {n} ML kalibrētas vērtības - palaidiet izmēģinājumu laukumu salīdzināšanai", "phase_name_required": "Nepieciešams fāzes nosaukums", "phase_updated": "Fāze atjaunināta", "phases_saved": "Fāzes saglabātas", @@ -1723,6 +1843,7 @@ "min_active": "Pamatots ar minimālo aktīvo jaudu ({min}W), kas novērota pēdējā ciklā.", "min_duration_ratio": "Saglabāts pēc iespējas zemāks, lai programma tiktu atpazīta cikla sākumā; ticamības un neskaidrības sliekšņi novērš pāragru apstiprināšanu.", "min_off_gap": "Pamatots ar {gaps} novērotiem starpciklu intervāliem (p05={p05}s). Ierīces apakšējā robeža: {floor}s.", + "min_off_gap_bridge": "Aprēķināts, lai pārsegtu garāko kluso posmu cikla iekšienē: {span}s + 60s buferis, no {spans} pārsegtiem intervāliem {cycles} tīros ciklos (paliek zem jūsu īsākā intervāla starp divām secīgām palaišanas reizēm, kas ir {ceiling}s).", "min_power": "40% no p05 zemākās aktīvās jaudas ({p05}W) {cycles} tīros ciklos, saglabājot izslēgšanas slieksni zem reālā patēriņa.{excl}", "ml_auto_label": "Zemākā ticamība, ko kvalitātes modelis vēl novērtēja kā tīru (p10 no {cycles} tīriem cikliem = {p10}).", "ml_end_repeat": "{false}/{total} ciklu ({pct}%) bija pauze, ko beigu detektors novērtēja >50%; pieprasīt {val} beigu apstiprinājumu(s).", @@ -1739,7 +1860,7 @@ "thr_batch": "Saglabāts nedaudz virs p05 zemākās aktīvās jaudas {cycles} ciklos ({p05}W), lai sākums tiktu uztverts pēc iespējas agrāk un apturēšanas slieksnis paliktu zem mašīnas zemākās darbības jaudas.", "tol_per_profile": "p75 no katra profila ilguma dispersijas {profiles} profilos ({cycles} cikli); stabili profili netiek sodīti.", "tol_pooled": "Pamatots ar apvienoto ilguma dispersiju {cycles} nesen marķētiem cikliem (p95 novirze={dev}).", - "watchdog": "Saglabāts pēc iespējas zemāks, cik droši (3x p95 atjaunināšanas intervāls {p95}s, min. 30s), lai apstāšanās tiktu atklāta ātri bez viltus apturēšanas." + "watchdog": "Saglabāts pēc iespējas zemāks, cik droši (tikai nedaudz virs p95 atjaunināšanas intervāla {p95}s, min. 30s), lai apstāšanās tiktu atklāta ātri bez viltus apturēšanas." }, "exclusions": { "summary": "Izslēgti {total} kļūdaini atpazīti cikli: {parts}.", @@ -1770,6 +1891,7 @@ "other": "Cits" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Trauku mazgājamā mašīna: klusās sekundes pēc paredzētā ilguma, pirms tiek atbrīvota cikla beigu ūdens izvadīšanas gaidīšana", "anti_wrinkle_enabled": "Absorbējiet griešanās impulsus pēc galvenās fāzes, nevis nolasiet tos kā jaunus ciklus", "anti_wrinkle_exit_power": "Lai pretgrumbu režīms paliktu aktīvs, jaudai starp impulsiem jānokrītas zem šīs vērtības", "anti_wrinkle_idle_timeout": "Atļautais klusuma laiks starp diviem griešanās impulsiem, pirms pretgrumbu režīms beidzas", diff --git a/custom_components/ha_washdata/translations/panel/mk.json b/custom_components/ha_washdata/translations/panel/mk.json index 02f0195e..2cdf106e 100644 --- a/custom_components/ha_washdata/translations/panel/mk.json +++ b/custom_components/ha_washdata/translations/panel/mk.json @@ -1,1947 +1,2069 @@ { - "badge": { - "artifact_tip": "Откриени се {n} аномалии (на пр. вратата отворена во средината на циклусот) - отворени за да ги видите на графиконот", - "auto": "(автоматски откриено)", - "built_in_tag": "вграден", - "declining": "↘ опаѓање", - "energy_low": "Пониска енергија од вообичаено", - "energy_spike": "Поголема енергија од вообичаено", - "fair_fit": "фер одговара", - "fair_fit_tip": "Умерена конзистентност на совпаѓање - некои циклуси доделени на овој профил имаат пониски оценки за доверба. Обележете повеќе циклуси или повторно снимајте го профилот за да ја подобрите точноста.", - "feedback_requested": "Се бара повратна информација", - "golden_cycle": "Снимен референтен циклус", - "improving": "↗ подобрување", - "manual": "(рачно избрано)", - "needs_review": "Треба преглед", - "overrun": "Трчаше подолго од вообичаено", - "poor_fit": "лошо вклопување", - "poor_fit_tip": "Неконзистентна историја на совпаѓање - размислете за повторно градење на овој профил", - "restart_gap_tip": "{n} HA пропуст при рестартирање: графиконот на моќност има дупка", - "reviewed": "Прегледано", - "steady": "→ стабилно", - "underrun": "Завршен побрзо од вообичаено", - "using_defaults": "Користење на стандардните испорачани вредности", - "using_tuned": "Користење на подесени тегови", - "overrun_ratio": "({x}× од очекуваното)", - "underrun_ratio": "({pct}% од очекуваното)", - "awaiting_tip": "Чека одобрување од заедницата", - "awaiting_n": "Чека одобрување · {n} потврдени", - "approved": "Одобрено", - "awaiting": "Чека одобрување", - "imported_tip": "Увезено од продавницата на заедницата. Се користи само за совпаѓање, не се брои во статистиката.", - "not_importable": "неприменливо", - "exists": "постои" - }, - "btn": { - "add_device": "+ Додај уред", - "add_device_tip": "Додадете друг уред WashData", - "add_maintenance": "Додади настан за одржување", - "add_phase": "+ Додај фаза", - "add_timer": "+ Додај тајмер", - "apply_all": "Примени ги сите", - "apply_label": "Примени етикета", - "apply_set_b": "Примени сет B", - "apply_split": "Примени Сплит", - "apply_trim": "Нанесете го Trim", - "auto_detect_split": "Автоматско откривање", - "auto_label_cycles": "Циклуси за автоматско обележување", - "auto_label_cycles_tip": "Автоматски доделува имиња на профили на неозначени циклуси чијашто доверба за совпаѓање го надминува прагот", - "cancel": "Откажи", - "clear_debug": "Исчистете ги податоците за отстранување грешки", - "clear_splits": "Исчисти", - "close": "Затвори", - "compare": "Споредете", - "confirm": "Потврди", - "convert_to_automation": "Претворете во автоматизација", - "correct": "Коригирај…", - "create": "Креирај", - "create_from_cluster": "Направи профил од {count} циклуси", - "create_profile": "+ Направете профил", - "delete": "Избриши", - "delete_group": "Избриши група", - "delete_group_tip": "Избришете ја само оваа група - профилите на членовите се чуваат", - "delete_profile": "Избришете го профилот", - "discard": "Отфрли", - "discard_tip": "Отфрли го снимениот траг без зачувување", - "dismiss": "Отфрли", - "done": "Готово", - "edit": "Уреди", - "export": "Извоз", - "export_json": "Извези во JSON", - "force_stop": "Присилно стопирање", - "force_stop_tip": "Веднаш заврши го тековниот циклус и означи го како присилно запрен", - "from_template": "Од шаблонот ▾", - "ignore": "Игнорирај", - "import_json": "Увезете од JSON", - "import_overwrite": "Увези (ги препишува податоците)", - "inspect": "Увид", - "label": "Етикета", - "load": "Вчитај", - "load_more": "Вчитај повеќе", - "manage": "Управувај", - "merge": "Спојување", - "new_automation": "+ Нова автоматизација", - "new_group": "+ Нова група", - "new_group_tip": "Групирајте скоро идентични профили (иста форма/траење, различна температура или центрифугирање) за совпаѓањето сигурно да бира меѓу нив", - "new_phase": "+ Нова фаза", - "new_profile": "+ Нов профил", - "new_profile_tip": "Создадете нов профил на програма од постоечки означен циклус или снимање", - "on_cycle_finished": "На циклус заврши", - "on_cycle_started": "На циклус започна", - "pause_cycle": "Пауза", - "pause_cycle_tip": "Паузирај го тековниот циклус – апаратот ќе продолжи од местото каде застанал", - "pg_apply_device": "Примени на уредот", - "pg_autofill": "Автоматско пополнување", - "play": "Пушти", - "process": "Процес", - "process_history": "Процесирајте сега", - "process_recording": "Зачувај снимање", - "process_tip": "Зачувај го снимениот траг како нов или постоечки профил", - "rebuild": "Обновете ги пликовите", - "rebuild_envelope": "Обновете го пликот", - "rebuild_tip": "Препресметај го очекуваниот плик на моќноста (мин./макс. лента) за сите профили од нивните означени циклуси – извршете после означување на нови циклуси или поправање на стари", - "rec_start_tip": "Почнете снимање на трагот на моќноста на апаратот – стартувајте непосредно пред почеток на циклусот", - "rec_stop": "Стоп", - "rec_stop_tip": "Запрете го снимањето и задржете го снимениот траг за преглед", - "record": "Започнете со снимање", - "refresh": "Освежи", - "refresh_diag_tip": "Повторно вчитајте ги статистиките за складирање", - "refresh_logs_tip": "Повторно вчитајте ги најновите записи на дневникот", - "refresh_settings_tip": "Повторно вчитајте ги поставките од серверот", - "relabel": "Повторно означи ({count})", - "remove": "Отстрани", - "remove_timer": "Отстранете го тајмерот", - "reset": "Ресетирај", - "reset_ml_models_tip": "Отфрлете ги фино подесените модели и вратете се на вградените. WashData може повторно да ги научи подоцна.", - "reset_to_builtin": "Ресетирајте на вградени модели", - "reset_to_defaults": "Ресетирање на стандардните", - "resume_cycle": "Продолжи", - "resume_cycle_tip": "Продолжи го паузираниот циклус", - "revert_settings": "Откажи промени", - "revert_settings_tip": "Вратете ги поставките пред последното зачувување", - "revert_settings_tip_none": "Прво зачувајте за да ја активирате отката", - "revert": "Врати", - "revert_to_previous": "Вратете ја оваа поставка на претходната вредност", - "review": "Преглед", - "run": "Изврши", - "run_analysis": "🔍 Изврши анализа на предлози", - "run_analysis_tip": "Анализирајте ги вашите снимени циклуси сега и освежете ги предлозите за подесување", - "run_auto_label": "Стартувај Auto-Label", - "run_both": "Изврши A наспроти B", - "run_simulation": "Изврши симулација", - "save": "Зачувај", - "save_access_control": "Зачувај контрола на пристап", - "save_group": "Зачувај група", - "save_panel_settings": "Зачувај ги поставките на панелот", - "save_phases": "Зачувај фази", - "save_preferences": "Зачувај параметри", - "save_reminders": "Зачувај потсетници", - "save_review": "Зачувај преглед", - "save_settings": "Зачувај ги поставките", - "select": "Изберете", - "select_all": "Избери сè", - "select_last20": "Последни 20", - "select_none": "Исчисти", - "show_only": "Прикажи само", - "skip_setup": "Прескокни поставување", - "split": "Сплит", - "stop": "Стопирај", - "submit_correction": "Поднесете корекција", - "train_now": "Тренирај сега", - "trim": "Намали", - "trim_split": "Намали / Сплит", - "undo": "Врати", - "use": "Користете", - "wipe_all": "Избришете ги сите податоци", - "delete_selected": "Избриши избрани ({n})", - "group_suggest": "Група {n}: {members}", - "pg_apply_best": "Примени најдобро", - "pg_apply_to_settings": "Зачувај во поставките", - "pg_apply_to_settings_tip": "Копирај ги тука изменетите вредности во активните поставки на овој уред", - "search": "Пребарај", - "import": "Увези", - "disconnect": "Прекини врска", - "connect_github": "Поврзи GitHub", - "save_appliance": "Зачувај уред", - "share_to_store": "Сподели во продавницата", - "share": "Сподели", - "confirm_appliance": "Потврди го овој уред", - "confirmed": "Потврдено", - "browse_community_setups": "Прегледај поставки на заедницата", - "download_device": "Преземи поставки на уредот", - "share_device": "Сподели поставки на уредот", - "share_device_tip": "Споделете ги програмите и поставките на овој уред со заедницата", - "share_n": "Сподели {n} програм{s}", - "export_selected": "Извоз (избор на податоци)", - "export_all": "Брз извоз на сè", - "import_raw": "Напредно: замени сè од JSON", - "download_export": "Преземи извоз", - "analyze_import": "Анализирај датотека", - "import_selected": "Увези избрано", - "back": "Назад" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "Мора да е под Прагот за Стоп ({stop} Вт); инаку моќноста за излез од режимот против брчки се игнорира", - "stop": "Мора да е над Моќноста за Излез од Режимот Против Брчки ({exit} Вт)" + "card": { + "min": "мин", + "entity_not_found": "Ентитетот не е пронајден", + "running_long": "Трае предолго", + "remaining": "преостанато", + "progress": "напредок", + "show_time_remaining": "Прикажи преостанато време", + "show_percentage": "Прикажи процент", + "layout": { + "tile": "Плочка (компактно)", + "detail": "Детално (богато)", + "glance": "Преглед (повеќе уреди)" + }, + "btn": { + "pause": "Паузирај", + "resume": "Продолжи", + "terminate": "Заврши циклус", + "record_start": "Започни снимање", + "record_stop": "Запри снимање", + "program": "Програма", + "open_panel": "Отвори WashData" + }, + "editor": { + "layout": "Распоред", + "entity": "Ентитет на уредот", + "entities": "Уреди", + "title": "Наслов", + "icon": "Икона", + "show_state": "Прикажи состојба", + "show_program": "Прикажи програма", + "show_progress_bar": "Прикажи лента за напредок", + "spin_icon": "Ротирај икона додека работи", + "display_mode": "Линија со детали", + "active_color": "Замена на активна боја", + "show_phase": "Прикажи фаза", + "show_energy": "Прикажи енергија и трошок", + "show_anomaly": "Прикажи предупредување за пречекорување", + "show_sparkline": "Прикажи график на моќност во живо", + "buttons": "Копчиња за дејства", + "program_entity": "Ентитет на програма (замена)", + "time_entity": "Ентитет на време (замена)", + "pct_entity": "Ентитет на напредок (замена)", + "power_entity": "Ентитет на моќност (замена)", + "tap_action": "Дејство при допир", + "hold_action": "Дејство при задржување", + "double_tap_action": "Дејство при двоен допир" + } + }, + "badge": { + "artifact_tip": "Откриени се {n} аномалии (на пр. вратата отворена во средината на циклусот) - отворени за да ги видите на графиконот", + "auto": "(автоматски откриено)", + "built_in_tag": "вграден", + "declining": "↘ опаѓање", + "energy_low": "Пониска енергија од вообичаено", + "energy_spike": "Поголема енергија од вообичаено", + "fair_fit": "фер одговара", + "fair_fit_tip": "Умерена конзистентност на совпаѓање - некои циклуси доделени на овој профил имаат пониски оценки за доверба. Обележете повеќе циклуси или повторно снимајте го профилот за да ја подобрите точноста.", + "feedback_requested": "Се бара повратна информација", + "golden_cycle": "Снимен референтен циклус", + "improving": "↗ подобрување", + "manual": "(рачно избрано)", + "needs_review": "Треба преглед", + "overrun": "Трчаше подолго од вообичаено", + "poor_fit": "лошо вклопување", + "poor_fit_tip": "Неконзистентна историја на совпаѓање - размислете за повторно градење на овој профил", + "restart_gap_tip": "{n} HA пропуст при рестартирање: графиконот на моќност има дупка", + "reviewed": "Прегледано", + "steady": "→ стабилно", + "underrun": "Завршен побрзо од вообичаено", + "using_defaults": "Користење на стандардните испорачани вредности", + "using_tuned": "Користење на подесени тегови", + "overrun_ratio": "({x}× од очекуваното)", + "underrun_ratio": "({pct}% од очекуваното)", + "awaiting_tip": "Чека одобрување од заедницата", + "awaiting_n": "Чека одобрување · {n} потврдени", + "approved": "Одобрено", + "awaiting": "Чека одобрување", + "imported_tip": "Увезено од продавницата на заедницата. Се користи само за совпаѓање, не се брои во статистиката.", + "not_importable": "неприменливо", + "exists": "постои" + }, + "btn": { + "add_device": "+ Додај уред", + "add_device_tip": "Додадете друг уред WashData", + "add_maintenance": "Додади настан за одржување", + "add_phase": "+ Додај фаза", + "add_timer": "+ Додај тајмер", + "apply_all": "Примени ги сите", + "apply_label": "Примени етикета", + "apply_set_b": "Примени сет B", + "apply_split": "Примени Сплит", + "apply_trim": "Нанесете го Trim", + "auto_detect_split": "Автоматско откривање", + "auto_label_cycles": "Циклуси за автоматско обележување", + "auto_label_cycles_tip": "Автоматски доделува имиња на профили на неозначени циклуси чијашто доверба за совпаѓање го надминува прагот", + "cancel": "Откажи", + "clear_debug": "Исчистете ги податоците за отстранување грешки", + "clear_splits": "Исчисти", + "close": "Затвори", + "compare": "Споредете", + "confirm": "Потврди", + "convert_to_automation": "Претворете во автоматизација", + "correct": "Коригирај…", + "create": "Креирај", + "create_from_cluster": "Направи профил од {count} циклуси", + "create_profile": "+ Направете профил", + "delete": "Избриши", + "delete_group": "Избриши група", + "delete_group_tip": "Избришете ја само оваа група - профилите на членовите се чуваат", + "delete_profile": "Избришете го профилот", + "discard": "Отфрли", + "discard_tip": "Отфрли го снимениот траг без зачувување", + "dismiss": "Отфрли", + "mute_suggestion": "Запрете да се предлага оваа поставка", + "pg_load_calibrated": "Вчитај калибрирани (ML) ({n})", + "pg_load_calibrated_tip": "Ги вчитува поставките калибрирани со ML како замени во песочникот", + "pg_load_live": "Вчитај ги активните поставки", + "pg_load_live_tip": "Прочитај ги повторно тековните поставки на интеграцијата и отфрли ги сите измени во песочникот", + "pg_load_suggested": "Вчитај предлози ({n})", + "pg_load_suggested_tip": "Ги вчитува тековните предлози на автоматскиот подесувач како замени во песочникот", + "pg_preset_delete": "Избриши конфигурација", + "pg_preset_load": "Вчитај конфигурација", + "pg_preset_load_tip": "Замени ги вредностите во песочникот со оваа конфигурација (активните поставки остануваат недопрени)", + "pg_preset_save": "Зачувај како конфигурација", + "pg_preset_save_tip": "Зачувај ги сите вредности подолу како именувана конфигурација за овој уред", + "pg_publish_all": "Примени {n} во интеграцијата", + "pg_publish_one": "Примени {label} во интеграцијата", + "reset_muted": "Ресетирање на заглушените", + "done": "Готово", + "edit": "Уреди", + "export": "Извоз", + "export_json": "Извези во JSON", + "force_stop": "Присилно стопирање", + "force_stop_tip": "Веднаш заврши го тековниот циклус и означи го како присилно запрен", + "from_template": "Од шаблонот ▾", + "ignore": "Игнорирај", + "import_json": "Увезете од JSON", + "import_overwrite": "Увези (ги препишува податоците)", + "inspect": "Увид", + "label": "Етикета", + "load": "Вчитај", + "load_more": "Вчитај повеќе", + "manage": "Управувај", + "merge": "Спојување", + "new_automation": "+ Нова автоматизација", + "new_group": "+ Нова група", + "new_group_tip": "Групирајте скоро идентични профили (иста форма/траење, различна температура или центрифугирање) за совпаѓањето сигурно да бира меѓу нив", + "new_phase": "+ Нова фаза", + "new_profile": "+ Нов профил", + "new_profile_tip": "Создадете нов профил на програма од постоечки означен циклус или снимање", + "on_cycle_finished": "На циклус заврши", + "on_cycle_started": "На циклус започна", + "pause_cycle": "Пауза", + "pause_cycle_tip": "Паузирај го тековниот циклус – апаратот ќе продолжи од местото каде застанал", + "pg_apply_device": "Примени на уредот", + "pg_autofill": "Автоматско пополнување", + "play": "Пушти", + "process": "Процес", + "process_history": "Процесирајте сега", + "process_recording": "Зачувај снимање", + "process_tip": "Зачувај го снимениот траг како нов или постоечки профил", + "rebuild": "Обновете ги пликовите", + "rebuild_envelope": "Обновете го пликот", + "rebuild_tip": "Препресметај го очекуваниот плик на моќноста (мин./макс. лента) за сите профили од нивните означени циклуси – извршете после означување на нови циклуси или поправање на стари", + "rec_start_tip": "Почнете снимање на трагот на моќноста на апаратот – стартувајте непосредно пред почеток на циклусот", + "rec_stop": "Стоп", + "rec_stop_tip": "Запрете го снимањето и задржете го снимениот траг за преглед", + "record": "Започнете со снимање", + "refresh": "Освежи", + "refresh_diag_tip": "Повторно вчитајте ги статистиките за складирање", + "refresh_logs_tip": "Повторно вчитајте ги најновите записи на дневникот", + "refresh_settings_tip": "Повторно вчитајте ги поставките од серверот", + "relabel": "Повторно означи ({count})", + "remove": "Отстрани", + "remove_timer": "Отстранете го тајмерот", + "reset": "Ресетирај", + "reset_ml_models_tip": "Отфрлете ги фино подесените модели и вратете се на вградените. WashData може повторно да ги научи подоцна.", + "reset_to_builtin": "Ресетирајте на вградени модели", + "reset_to_defaults": "Ресетирање на стандардните", + "resume_cycle": "Продолжи", + "resume_cycle_tip": "Продолжи го паузираниот циклус", + "revert_settings": "Откажи промени", + "revert_settings_tip": "Вратете ги поставките пред последното зачувување", + "revert_settings_tip_none": "Прво зачувајте за да ја активирате отката", + "revert": "Врати", + "revert_to_previous": "Вратете ја оваа поставка на претходната вредност", + "review": "Преглед", + "run": "Изврши", + "run_analysis": "🔍 Изврши анализа на предлози", + "run_analysis_tip": "Анализирајте ги вашите снимени циклуси сега и освежете ги предлозите за подесување", + "run_auto_label": "Стартувај Auto-Label", + "run_both": "Изврши A наспроти B", + "run_simulation": "Изврши симулација", + "save": "Зачувај", + "save_access_control": "Зачувај контрола на пристап", + "save_group": "Зачувај група", + "save_panel_settings": "Зачувај ги поставките на панелот", + "save_phases": "Зачувај фази", + "save_preferences": "Зачувај параметри", + "save_reminders": "Зачувај потсетници", + "save_review": "Зачувај преглед", + "save_settings": "Зачувај ги поставките", + "select": "Изберете", + "select_all": "Избери сè", + "select_last20": "Последни 20", + "select_none": "Исчисти", + "show_only": "Прикажи само", + "skip_setup": "Прескокни поставување", + "split": "Сплит", + "stop": "Стопирај", + "submit_correction": "Поднесете корекција", + "train_now": "Тренирај сега", + "trim": "Намали", + "trim_split": "Намали / Сплит", + "undo": "Врати", + "use": "Користете", + "wipe_all": "Избришете ги сите податоци", + "delete_selected": "Избриши избрани ({n})", + "group_suggest": "Група {n}: {members}", + "pg_apply_best": "Примени најдобро", + "pg_apply_to_settings": "Зачувај во поставките", + "pg_apply_to_settings_tip": "Копирај ги тука изменетите вредности во активните поставки на овој уред", + "search": "Пребарај", + "import": "Увези", + "disconnect": "Прекини врска", + "connect_github": "Поврзи GitHub", + "save_appliance": "Зачувај уред", + "share_to_store": "Сподели во продавницата", + "share": "Сподели", + "confirm_appliance": "Потврди го овој уред", + "confirmed": "Потврдено", + "browse_community_setups": "Прегледај поставки на заедницата", + "download_device": "Преземи поставки на уредот", + "share_device": "Сподели поставки на уредот", + "share_device_tip": "Споделете ги програмите и поставките на овој уред со заедницата", + "share_n": "Сподели {n} програм{s}", + "export_selected": "Извоз (избор на податоци)", + "export_all": "Брз извоз на сè", + "import_raw": "Напредно: замени сè од JSON", + "download_export": "Преземи извоз", + "analyze_import": "Анализирај датотека", + "import_selected": "Увези избрано", + "back": "Назад" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "Мора да е под Прагот за Стоп ({stop} Вт); инаку моќноста за излез од режимот против брчки се игнорира", + "stop": "Мора да е над Моќноста за Излез од Режимот Против Брчки ({exit} Вт)" + }, + "anti_wrinkle_max": { + "max": "Мора да е над Прагот за Почеток ({start} Вт); инаку ограничувањето на траењето против брчки се заобиколува", + "start": "Мора да е под Макс. Моќноста Против Брчки ({max} Вт)" + }, + "attn_sub": "Поправете ги конфликтите пред зачувување", + "attn_title": "{n} конфликт{s} во поставките", + "settings_banner": "{n} конфликт{s} во поставките – проверете ги означените раздели и поправете пред зачувување.", + "settings_banner_btn": "Оди на прв", + "confidence": { + "auto": "Мора да е на или над Прагот за Совпаѓање ({match})", + "learning": "Мора да е на или под Прагот за Совпаѓање ({match})", + "match_for_auto": "Мора да е на или под Довербата за Автоматско Означување ({alc})", + "match_for_learning": "Мора да е на или над Довербата при Учење ({lc})" + }, + "duration_ratio": { + "max": "Мора да е поголем од Мин. Соодносот на Траење ({min})", + "min": "Мора да е помал од Макс. Соодносот на Траење ({max})" + }, + "hysteresis": { + "start": "Мора да е над Прагот за Стоп ({stop} Вт)", + "stop": "Мора да е под Прагот за Почеток ({start} Вт)" + }, + "min_power": { + "min_power": "Мора да е на или под Прагот за Стоп ({stop} Вт)", + "stop": "Мора да е на или над Минималната Моќност ({min} Вт)" + }, + "no_update_timeout": { + "timeout": "Мора да е поголем од Интервалот на Чувар ({wi} с)", + "watchdog": "Мора да е помал од Паузата Без Ажурирање ({to} с)" + }, + "off_delay": { + "gap": "Мин. Јазот при Исклучување треба да е барем Одложувањето на Исклучување ({delay} с)", + "off_delay": "Одложувањето на Исклучување ({off_delay} с) го надминува Мин. Јазот при Исклучување ({gap} с); последователните циклуси може да се споја" + }, + "power_off": { + "stop": "Мора да е над Прагот за Исклучување на Напојувањето ({pot} Вт)", + "threshold": "Мора да е под Прагот за Стоп ({stop} Вт) за да стапи во сила" + }, + "pump_stuck": { + "duration": "Мора да е помал од Паузата Без Ажурирање ({to} с), за да алармот за заглавена пумпа се активира пред чуварот да го запре циклусот", + "timeout": "Мора да го надминува Времетраењето за Заглавена Пумпа ({ps} с), за да алармот се активира пред циклусот да биде присилно запрен" + }, + "start_dur": { + "sampling": "Интервалот на Земање Примероци го надминува Времетраењето на Старт ({sdt} с); единечни скокови може да отворат циклус", + "threshold": "Треба да е барем еден Интервал на Земање Примероци ({si} с) за да се спречат лажни стартови од единечен примерок" + }, + "unmatch": { + "match": "Мора да е над Прагот за Несовпаѓање ({un})", + "unmatch": "Мора да е под Прагот за Совпаѓање ({match}); инаку потврденото совпаѓање веднаш се откажува" + }, + "cascade_toast": "За конзистентност, исто така се прилагодени уште {n} параметар{s}.", + "suggestion_resolves": "Активирајте го чекечкиот предлог ({val}) подолу за да го поправите ова", + "use_fix": "Користи {val}", + "watchdog": { + "interval": "Треба да е барем 2x Интервалот на Земање Примероци ({si} с)", + "sampling": "Интервалот на Земање Примероци треба да е највеќе половина од Интервалот на Чувар ({wi} с)" + } }, - "anti_wrinkle_max": { - "max": "Мора да е над Прагот за Почеток ({start} Вт); инаку ограничувањето на траењето против брчки се заобиколува", - "start": "Мора да е под Макс. Моќноста Против Брчки ({max} Вт)" - }, - "attn_sub": "Поправете ги конфликтите пред зачувување", - "attn_title": "{n} конфликт{s} во поставките", - "settings_banner": "{n} конфликт{s} во поставките – проверете ги означените раздели и поправете пред зачувување.", - "settings_banner_btn": "Оди на прв", - "confidence": { - "auto": "Мора да е на или над Прагот за Совпаѓање ({match})", - "learning": "Мора да е на или под Прагот за Совпаѓање ({match})", - "match_for_auto": "Мора да е на или под Довербата за Автоматско Означување ({alc})", - "match_for_learning": "Мора да е на или над Довербата при Учење ({lc})" - }, - "duration_ratio": { - "max": "Мора да е поголем од Мин. Соодносот на Траење ({min})", - "min": "Мора да е помал од Макс. Соодносот на Траење ({max})" - }, - "hysteresis": { - "start": "Мора да е над Прагот за Стоп ({stop} Вт)", - "stop": "Мора да е под Прагот за Почеток ({start} Вт)" - }, - "min_power": { - "min_power": "Мора да е на или под Прагот за Стоп ({stop} Вт)", - "stop": "Мора да е на или над Минималната Моќност ({min} Вт)" - }, - "no_update_timeout": { - "timeout": "Мора да е поголем од Интервалот на Чувар ({wi} с)", - "watchdog": "Мора да е помал од Паузата Без Ажурирање ({to} с)" - }, - "off_delay": { - "gap": "Мин. Јазот при Исклучување треба да е барем Одложувањето на Исклучување ({delay} с)", - "off_delay": "Одложувањето на Исклучување ({off_delay} с) го надминува Мин. Јазот при Исклучување ({gap} с); последователните циклуси може да се споја" - }, - "power_off": { - "stop": "Мора да е над Прагот за Исклучување на Напојувањето ({pot} Вт)", - "threshold": "Мора да е под Прагот за Стоп ({stop} Вт) за да стапи во сила" - }, - "pump_stuck": { - "duration": "Мора да е помал од Паузата Без Ажурирање ({to} с), за да алармот за заглавена пумпа се активира пред чуварот да го запре циклусот", - "timeout": "Мора да го надминува Времетраењето за Заглавена Пумпа ({ps} с), за да алармот се активира пред циклусот да биде присилно запрен" - }, - "start_dur": { - "sampling": "Интервалот на Земање Примероци го надминува Времетраењето на Старт ({sdt} с); единечни скокови може да отворат циклус", - "threshold": "Треба да е барем еден Интервал на Земање Примероци ({si} с) за да се спречат лажни стартови од единечен примерок" - }, - "unmatch": { - "match": "Мора да е над Прагот за Несовпаѓање ({un})", - "unmatch": "Мора да е под Прагот за Совпаѓање ({match}); инаку потврденото совпаѓање веднаш се откажува" - }, - "cascade_toast": "За конзистентност, исто така се прилагодени уште {n} параметар{s}.", - "suggestion_resolves": "Активирајте го чекечкиот предлог ({val}) подолу за да го поправите ова", - "use_fix": "Користи {val}", - "watchdog": { - "interval": "Треба да е барем 2x Интервалот на Земање Примероци ({si} с)", - "sampling": "Интервалот на Земање Примероци треба да е највеќе половина од Интервалот на Чувар ({wi} с)" - } - }, - "hdr": { - "ab_comparison": "Споредба на поставки A/B", - "access_control": "Контрола на пристап", - "add_maintenance": "Додади настан за одржување", - "automation_delete": "Избришете ја оваа автоматизација", - "automation_needs_review": "Овој циклус бара преглед", - "automation_open": "Отворете во уредникот за автоматизација", - "automation_review_this_cycle": "Прегледајте го овој циклус", - "automations": "Автомати", - "clear_debug": "Исчистете ги трагите за отстранување грешки", - "cycle_simulator": "Симулатор на циклуси", - "diagnostics_pref": "Дијагностика", - "display": "Приказ", - "dtw_inspector": "DTW инспектор", - "export_import": "Извоз / увоз", - "getting_started": "Започнување", - "live_power": "Жива моќ", - "logs": "Дневници", - "logs_diagnostics": "Дијагностика", - "maintenance": "Акции за одржување", - "maintenance_log": "Дневник за одржување", - "maintenance_reminders": "Потсетници за сервис", - "manual_recording": "Рачно снимање", - "manual_recording_tip": "Намерно стартувајте циклус додека WashData ја снима трагата на моќноста. Стартувајте непосредно пред почетокот на апаратот, запрете кога ќе заврши, па Обработете за да го зачувате како именуван профил.", - "ml_learned": "Што научи WashData", - "ml_matching_tuning": "Фино подесување што одговара на програмата", - "ml_settings_card": "Поставки", - "ml_smart_learning": "Паметно учење", - "my_preferences": "Мои преференции", - "no_automations": "Сè уште нема автоматизација на овој уред.", - "panel_settings": "Поставки на панелот", - "param_sweep": "Прочешлување на параметар", - "phase_catalog": "Фазен каталог", - "playground": "Песочник", - "process_history": "Историја на процесот", - "settings_history": "Историја на поставки", - "status": "Статус", - "status_graph": "График на статус", - "storage_stats": "Статистика за складирање", - "test_history": "Проверка врз историјата", - "toggle_sidebar": "Вклучете ја страничната лента на Home Assistant", - "tools_and_data": "Алатки и податоци", - "wipe_history": "Избришете ја историјата", - "recommendations": "Препораки ({n})", - "pg_detection_params": "Поставки за откривање", - "pg_timeline": "Хронологија на настани", - "pg_outcome": "Резултат од симулацијата", - "pg_across_cycles": "Низ сите ваши циклуси", - "community_store": "Продавница на заедницата", - "online_account": "Продавница на заедницата и онлајн функции" - }, - "health": { - "fair": "Прифатлив квалитет на профилот", - "good": "✓ Добар квалитет на профилот", - "poor": "⚠ Лош квалитет на профилот" - }, - "lbl": { - "actions": "Акции", - "activity": "Активност", - "administrators": "Администраторите", - "aria_compare_chart": "Графикон за споредба на циклуси", - "aria_cycle_chart": "Крива на моќта на циклусот", - "aria_envelope_chart": "Графикон на обвивката на моќта на профилот", - "aria_phase_chart": "Графикон на уредувачот на фази", - "aria_playground_chart": "Крива на моќта на циклусот со подвижни прагови на детекција", - "aria_power_chart": "Графикон на потрошувачка на моќ", - "aria_spaghetti_chart": "Преклопени криви на моќта на циклусите", - "aria_sweep_chart": "Графикон со резултати од скенирање на параметри", - "artifact_anomaly": "Аномалија", - "artifact_high_power": "Висока моќ", - "artifact_interruption": "Прекин", - "artifact_low_power": "Ниска моќ", - "auto_detect": "Автоматско откривање", - "auto_fine_tune_off": "автоматско фино исклучување", - "auto_fine_tune_on": "автоматско фино подесување вклучено (околу {hour}:00)", - "avg_cost": "Просечна цена", - "change": "Промена", - "clock_time": "Време на часовникот", - "cohesion_good": "кохезија {pct}%", - "cohesion_low": "⚠ ниска кохезија {pct}%", - "compare_profiles": "Споредете со профили", - "concurrency": "Паралелност", - "confidence": "Доверба", - "confidence_threshold": "Праг на доверба", - "correct_duration": "Точно времетраење (мин., изборно)", - "correct_profile": "Точен профил", - "correlation": "Корелација", - "cost": "Цена", - "create_new_profile": "+ Направете нов профил…", - "current_phase": "Тековна фаза", - "curves": "Криви", - "cycle": "Циклус", - "cycle_date_display": "Приказ на датум на циклус", - "cycle_health": "Здравје на циклусот", - "cycle_index": "индекс на циклус →", - "cycles": "Циклуси", - "cycles_count": "Циклуси", - "cycles_lc": "циклуси", - "dashed": "испрекината", - "date": "Датум", - "debug_traces": "Дебагирање траги", - "default": "Стандардно", - "default_access_level": "Стандардно ниво за корисници кои не се наведени подолу", - "default_other": "Стандардно (други уреди)", - "default_tab": "Стандардна картичка при отворање на панелот", - "delta": "Δ", - "description": "Опис", - "dtw_blend_w": "Тежина на мешање", - "dtw_blended": "Мешана оценка", - "dtw_ddtw": "DDTW оценка", - "dtw_l1": "L1 оценка", - "dtw_matched_profile": "(совпаднат профил на циклусот)", - "duration": "Времетраење", - "duration_agreement": "Согласување на времетраење", - "emphasis": "Нагласување", - "enable_access_control": "Овозможи контрола на пристап по корисник", - "energy": "Енергија", - "energy_agreement": "Согласување на енергија", - "event_timeline": "Временска линија на настани", - "event_type": "Тип на настан", - "expected": "Очекувано", - "expected_duration": "Очекувано времетраење (мин.)", - "file_kb": "Датотека (kB)", - "final_score": "Конечна оценка", - "from": "Од", - "gap_s": "Јаз (и)", - "group_name": "Назив на групата", - "head_trim": "Намалување на главата (и)", - "health": "Здравје", - "hide_tabs": "Скриј јазичиња за не-администратори", - "in_use": "Во употреба", - "json_data": "JSON податоци", - "label": "Совпаден програм", - "last": "Последни", - "last_checked": "Последно проверено:", - "load_from_file": "Вчитај од датотека", - "mae_score": "MAE оценка", - "manual_duration": "Рачно времетраење (мин., изборно)", - "match": "Совпаѓање", - "members": "Членови", - "metric": "Метрика", - "mode_existing_profile": "Додај во постоечкиот профил", - "mode_new_profile": "Креирај нов профил", - "models_fine_tuned": "({count} модел{plural} дотерани)", - "n_classic_suggestions": "{n} класично", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} избрани", - "n_tuning_suggestions": "{n} предлог за подесување", - "na": "н/д", - "new_profile_name": "Ново име на профил", - "notes": "Забелешки", - "of": "од", - "outcome": "Исход", - "panel_default_tab": "Стандардна картичка", - "panel_language": "Јазик на таблата", - "per_cycle_short": "циклус", - "pg_autofill_tip": "Автоматско пополнување на опсегот од тековната вредност ({lo}–{hi})", - "pg_best_value": "Пронајдена најдобра вредност", - "pg_current_value": "Тековна вредност:", - "pg_drag_hint": "Влечете ја линијата на графиконот", - "pg_dtw": "DTW", - "pg_ev_ending": "Завршување", - "pg_ev_running": "Работи", - "pg_group_advanced": "Гранични случаи", - "pg_group_detection": "Тригери за откривање", - "pg_group_timing": "Правила за време", - "pg_idle": "Неактивен", - "pg_anti_wrinkle": "Против брчки", - "pg_last_run": "Последно извршување: {date}", - "pg_match_score": "Оценка на совпаѓање", - "pg_pct_of": "{p}% од {total}", - "pg_poor_match": "Лошо совпаѓање", - "pg_strong_match": "Силно совпаѓање", - "pg_tile_ambiguous": "Двосмислени", - "pg_tile_ambiguous_tip": "Циклуси со речиси изедначено совпаѓање меѓу две програми", - "pg_tile_detected": "Откриени", - "pg_tile_detected_tip": "Циклуси каде што моќноста го надмина прагот за старт доволно долго за да се регистрира како работа", - "pg_tile_matched": "Совпаднати", - "pg_tile_matched_tip": "Циклуси правилно припишани на позната програма", - "pg_time_left": "Преостанато време", - "pg_weak_match": "Слабо совпаѓање", - "phase_name": "Име", - "phase_timeline": "Временска линија на фази", - "power": "Моќ", - "profile": "Профил", - "profile_index": "индекс на профил →", - "profile_name": "Име на профилот", - "program": "Програма", - "program_tip": "Заменете го профилот кој е поврзан со тековниот циклус. Автоматското откривање му овозможува на интеграцијата автоматски да го избере најдоброто совпаѓање. Закачете одреден програм за принудно совпаѓање кога автоматското откривање е погрешно или знаете што работи.", - "progress": "Напредок", - "raw_socket": "Суров приклучок", - "read_only": "Само за читање", - "ref_cycle": "Референтен циклус (опционално)", - "refresh_interval": "Интервал (и) на освежување", - "remaining": "Преостанати", - "reminder_every": "Потсети на секои (циклуси)", - "remove_label": "- Отстрани ја етикетата -", - "rename_profile": "Преименувајте го профилот", - "replay_duration": "Репродукција", - "resulting_profile": "Резултат на профилот", - "save_mode": "Режим за зачувување", - "score": "Оценка", - "score_breakdown": "Разложување на оценката", - "seconds_from_start": "Секунди од почеток", - "select_profile": "Изберете Профил", - "setting": "Поставка", - "settings_a": "Поставки A (тековни)", - "settings_a_short": "A", - "settings_advanced": "Напредно", - "settings_b": "Поставки B (тест)", - "settings_b_short": "B", - "settings_basic": "Основно", - "settings_detail_level": "Ниво на детали на поставките", - "settings_overrides": "Заменети поставки", - "show_debug": "Прикажи картичка за отстранување грешки во живо на натпреварот на страницата Статус (доверба, нејасност, најдобри кандидати)", - "show_expected": "Прикажи очекувано преклопување на кривата (совпаднат профил, портокалова)", - "show_raw": "Прикажи прекинувач за необработени отчитувања на приклучокот во живиот графикон на моќноста", - "sparkline": "Неодамнешен тренд на времетраење на циклусите", - "stage2": "Етапа 2 – основна сличност", - "stage3": "Етапа 3 – DTW", - "stage4": "Етапа 4 – согласување", - "status": "Статус", - "tail_trim": "Намалување на опашката (и)", - "timer_auto_pause": "Автоматска пауза", - "timer_min": "мин", - "timer_msg_placeholder": "Порака (изборно, {device}/{program}/{minutes})", - "to": "До", - "ungrouped": "Негрупирани", - "unlabelled": "Неозначено", - "unlabelled_paren": "(неозначен)", - "warp_path": "Патека на порамнување", - "input": "Влез:", - "start": "Почеток", - "end": "Крај", - "unit_s": "(с)", - "reviewed_on": "прегледано {date}", - "unknown": "Непознато", - "quality": "Квалитет", - "tags": "Ознаки", - "at": "во", - "pct_match_confidence": "{pct}% доверба на совпаѓањето", - "ha_restarted": "HA рестартиран", - "from_start": "Од почеток", - "to_end": "До крај", - "click_to_select": "кликнете за да изберете", - "envelope": "Плико", - "zoom_hint": "скролувајте за зумирање · двоен клик за ресетирање", - "loading_paren": "(вчитување…)", - "time_remaining": "~{v} преостанато", - "no_duration": "нема времетраење", - "duration_avg": "~{v}м просек", - "name_placeholder": "(име)", - "n_shown": ", прикажани {n}", - "cycles_title": "Циклуси ({n})", - "pg_detecting": "Откривање", - "pg_best_marker": "Најдобро: {v}", - "pg_time_left_model": "Преостанато време (модел)", - "pg_time_left_model_tip": "Проценка на преостанатото време од моделот (проценувач на фази + ML), а не статичко одбројување", - "phase": "Фаза", - "pg_mode_simulate": "Симулација", - "pg_mode_history": "Тест врз историја", - "pg_mode_sweep": "Пребарување", - "pg_ev_detected": "Откриено", - "pg_ev_match": "Совпаѓањето е прифатено", - "pg_ev_match_changed": "Совпаѓањето е променето", - "pg_ev_ambiguous": "Двосмислено", - "pg_ev_unmatched": "Без совпаѓање", - "pg_ev_notify_start": "Известување за старт", - "pg_ev_notify_pre": "Известување „речиси готово“", - "pg_ev_notify_finish": "Известување за завршување", - "pg_ev_notify_milestone": "Известување за пресвртница", - "pg_ev_notify_held": "Известувањето е задржано (тивки часови)", - "pg_ev_finished": "Завршено", - "pg_ended": "Заврши", - "pg_proj_energy": "Прогн. енергија", - "pg_alert_overrun": "Подолго од вообичаено", - "pg_alert_underrun": "Пократко од вообичаено", - "pg_alert_did_not_finish": "Не заврши", - "pg_alert_false_end": "Поделен на повеќе циклуси", - "pg_alert_unmatched": "Без совпаѓање", - "pg_alert_ambiguous": "Двосмислено совпаѓање", - "pg_alert_energy": "Аномалија во енергијата", - "pg_newly_correct": "стана точно", - "pg_regressed": "се влоши", - "pg_end_timing_changed": "времето на завршување се промени", - "pg_vs_current": "наспроти тековното", - "pg_fixed": "поправено", - "pg_broke": "се расипа", - "pg_sweep_param": "Параметар", - "pg_objective": "Цел", - "pg_steps": "Чекори", - "pg_sweep_2d": "2D топлинска карта", - "pg_sweep_param_y": "2-ри параметар", - "pg_obj_match": "Точност на совпаѓања", - "pg_obj_endtiming": "Точност на завршување", - "pg_obj_falseend": "Стапка на лажни завршувања", - "pg_obj_overrun": "Отстапување во траење", - "pg_obj_ambiguity": "Стапка на двосмисленост", - "pg_best_combo": "најдобра комбинација", - "pg_mode_optimize": "Оптимизирај", - "pg_group_matching": "Совпаѓање на програми", - "pg_zoom_hint": "двоен клик го ресетира зумот", - "aria_playground_chart2": "Интерактивен график на моќноста на циклусот: посочете за да видите време/моќност, лизгајте за зумирање, влечете за поместување", - "pg_alert_timeout_end": "Завршено поради истек на времето, а не според предвидување", - "pg_alert_indefinite": "Би работел бесконечно", - "pg_alert_stress_cap": "Достигнат заштитен лимит", - "pg_alert_stress_ok": "Откривање на мирување: циклусот е запрен", - "pg_alert_stress_warn": "Потрошувачката во мирување е над прагот за запирање", - "pg_stress_group": "Тест на откривање на мирување", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "Ниво на мирување (W)", - "pg_stress_idle_w_desc": "Замени го автоматски откривениот минимален праг на потрошувачка во режим на мирување (оставете празно за автоматско откривање).", - "pg_stress_toggle": "Тестирај откривање на мирување", - "pg_stress_toggle_desc": "Симулира дека уредот останува при потрошувачката во режим на мирување по завршувањето на снимањето -- прикажува дали и кога WashData ќе го запре циклусот.", - "task_pg_history": "Тест на историја", - "task_pg_sweep": "Оптимизирај", - "task_reprocess": "Повторна обработка", - "task_ml_training": "Учење", - "eta_secs": "уште ~{n} сек", - "eta_mins": "уште ~{n} мин", - "pg_recent_runs": "Неодамнешни извршувања", - "pg_load_run": "Повторно вчитај го ова извршување", - "pg_match_confidence": "Сигурност на совпаѓањето", - "pg_envelope_fit": "Вклопување во обвивката", - "pg_envelope_fit_tip": "Колку добро циклусот се вклопува во зачуваната обвивка на моќноста на овој профил, поинаков поглед од сигурноста на совпаѓањето.", - "n_imported_note": ", {n} увезени", - "enable_online": "Овозможи онлајн функции", - "store_brand": "Бренд на уредот", - "store_model": "Модел на уредот", - "anonymous": "Анонимно", - "rate_quality": "Оцени го квалитетот", - "rate_n": "{n} ѕвезди", - "approved_only": "Само одобрени", - "adopt_settings": "Прифати поставки", - "flags": "Ознаки", - "include_phase_map": "Вклучи карта на фазите", - "include_settings": "Вклучи поставки", - "show_contributor": "Прикажи соработник", - "task_pg_detail": "Симулирај циклус", - "task_split": "Разделување на циклус", - "task_trim": "Отсекување на циклус", - "task_merge": "Спојување на циклуси", - "task_rebuild": "Повторно градење на обвивки", - "cat_profiles": "Профили (програми)", - "cat_real_cycles": "Циклуси (историја на извршување)", - "cat_reference_cycles": "Референтни циклуси (увезени)", - "cat_custom_phases": "Прилагодени фази", - "cat_profile_groups": "Групи профили", - "cat_settings": "Поставки за детекција и препознавање", - "cat_matching_config": "Фино прилагодување на препознавањето", - "cat_ml_models": "ML модели", - "cat_feedback": "Повратни информации и ознаки за преглед", - "cat_suggestions": "Предлози", - "cat_maintenance_log": "Дневник за одржување", - "cat_history_logs": "Дневници за историја и промени", - "cat_lifetime_stats": "Вкупни суми за целиот период", - "cycles_short": "циклуси", - "import_mode": "Како да се комбинира", - "mode_merge": "Спој (задржи ги моите)", - "mode_replace": "Замени избрано", - "cycle_destination": "Каде треба да одат увезените циклуси?", - "dest_reference": "Референтни (само форма)", - "dest_real_history": "Реална историја (се брои во статистиката)", - "conflict_resolution": "Конфликти на имиња", - "conflict_import_copy": "Увези како копија", - "conflict_keep_mine": "Задржи ги моите", - "conflict_overwrite": "Презапиши" - }, - "log": { - "all_levels": "Сите нивоа", - "all_devices": "Сите уреди", - "all_components": "Сите компоненти", - "search_ph": "Пребарај дневници…" - }, - "ml": { - "builtin_models": "● Користење на вградени модели", - "fit_fair": "Прифатливо", - "fit_good": "Добро", - "fit_slight": "Мало", - "fit_strong": "Силен", - "fit_weak": "Слаби", - "fit_word": "одговара", - "personalized": "● Персонализирано за оваа машина", - "better_than_baseline": "{pct}% подобро од основната проценка ({metric})", - "trend_improving_tip": "Одговарањето на овој модел се подобри низ последните повторни проверки.", - "trend_declining_tip": "Одговарањето на овој модел ослабе низ последните повторни проверки; прегледувањето на повеќе циклуси може да му помогне повторно да научи.", - "trend_steady_tip": "Одговарањето на овој модел остана приближно стабилно низ последните повторни проверки.", - "cap_blurb": { - "end": "Препознавање кога циклусот навистина завршил", - "live_match": "Побрзо препознавање на активната програма", - "quality": "Откривање на погрешно препознати или оштетени циклуси", - "remaining_time": "Предвидување на преостанатото време", - "total_energy": "Предвидување на вкупната потрошувачка на енергија и трошокот" - }, - "cap_label": { - "end": "Препознавање на крајот на циклусот", - "live_match": "Препознавање на програмата", - "quality": "Проверка на квалитетот на циклусот", - "remaining_time": "Проценка на преостанатото време", - "total_energy": "Проценка на потрошувачката на енергија" - }, - "metric_auc": "AUC {auc} на издвоени податоци", - "metric_mae": "грешка {model} наспроти основната вредност {baseline}" - }, - "modal": { - "auto_label": "Циклуси за автоматско обележување", - "correct_feedback": "Точни повратни информации", - "create_profile": "Креирај профил", - "cycle": "Циклус", - "edit_group": "Уреди група на профили", - "edit_phase": "Фаза на уредување", - "import_config": "Увезена конфигурација", - "label_cycle": "Циклус на етикети", - "merge_cycles": "Спојување на {n} циклуси", - "new_group": "Нова група на профили", - "new_phase": "Нова фаза", - "process_history_msg": "Повторно стартувајте совпаѓање, освежете предлози, обучете ML (ако е овозможено) и препресметајте го здравјето на циклусите за сите зачувани циклуси. Ова може да потрае.", - "process_history_ok": "Обработи", - "process_history_title": "Обработи историја", - "process_recording": "Процес на снимање", - "delete_maintenance_msg": "Да се избрише овој запис за одржување? Ова не може да се врати.", - "delete_maintenance_title": "Избриши настан за одржување", - "relabel_cycles": "Повторно означи {count} циклуси", - "delete_automation_title": "Избриши автоматизација", - "delete_automation_msg": "Да се избрише автоматизацијата „{name}“ од Home Assistant? Ова не може да се врати.", - "remove_legacy_title": "Отстрани застарени дејства", - "remove_legacy_msg": "Да се отстранат застарените прилагодени дејства? Тие ќе престанат да се активираат при настани на циклусот. Ова не може да се врати од панелот.", - "discard_recording_title": "Отфрли снимка", - "discard_recording_msg": "Да се отфрли зачуваната снимка? Ова не може да се врати.", - "dismiss_all_title": "Отфрли ги сите повратни информации", - "dismiss_all_msg": "Да се отфрлат сите {count} чекани барања за повратна информација?", - "dismiss_all_ok": "Отфрли ги сите", - "delete_phase_title": "Избриши фаза", - "delete_phase_msg": "Да се избрише фазата „{name}“?", - "clear_debug_title": "Исчисти податоци за отстранување грешки", - "clear_debug_msg": "Да се избришат сите зачувани траги за отстранување грешки?", - "wipe_all_title": "Избриши ги сите податоци", - "wipe_all_msg": "⚠️ Ова трајно ги брише СИТЕ циклуси и профили. Ова не може да се врати.", - "wipe_all_ok": "Избриши сè", - "force_stop_title": "Присилно стопирање на циклусот", - "force_stop_msg": "Присилно да се стопира активниот циклус сега? Циклусот ќе се зачува како прекинат.", - "store_import": "Увоз на референтен циклус", - "store_share": "Сподели во продавницата на заедницата", - "store_share_device": "Сподели поставки на уредот", - "export_select": "Извоз - избор на податоци", - "import_wizard": "Увоз - избор на податоци" - }, - "msg": { - "appliance_monitor": "Монитор на апаратот", - "artifact_dip_detail": "Падна под вообичаениот опсег на моќност за ~{n}с.", - "artifact_footer": "Нагласено на графиконот погоре. Ова се минливи артефакти (на пр. вратата отворена во средината на циклусот), а не нужно проблеми.", - "artifact_header": "{n} откриени аномалии за време на овој циклус", - "artifact_pause_detail": "Моќноста падна до скоро нула за ~{n}с потоа продолжи – веројатно вратата беше отворена во средината на циклусот или циклусот беше паузиран.", - "artifact_spike_detail": "Надмина го вообичаениот опсег на моќност за ~{n}с.", - "auto_label_intro": "Доделете профили на неозначени циклуси чијашто доверба за совпаѓање го брише прагот.", - "automations_intro": "WashData активира настани {start} / {end} и изложува ентитети, па известувањата и акциите е најдобро да се градат како нормални автоматизации на Home Assistant. Автоматизациите кои го користат овој уред се прикажани подолу.", - "cleanup_intro": "Секој означен циклус е преклопен. Штиклирајте ги оддалечените и избришете за да го исчистите профилот.", - "clear_debug_hint": "Отстранете ги зачуваните податоци за отстранување грешки за да ослободите простор.", - "collecting_data": "Собирање на податоци – уште {need} циклус{plural} пред почетокот на финото подесување ({current}/{min}).", - "compare_overlay_profiles": "Преклопени профили (бледо)", - "compare_profiles_tip": "Преклопете ги другите пликови на профили на табелата погоре за да видите кој најдобро одговара на овој циклус.", - "compare_selected_cycles": "Избрани циклуси (цврсти) - прикажи / скриј", - "consider_new_profile": "Размислете за создавање нов профил.", - "coverage_gap": "последните циклуси немаат соодветни профили ({pct}% од последните 30).", - "coverage_gap_similar_cycles": "{count} слични необележани циклуси пронајдени – направете профил за да започнете да ги совпаѓате.", - "cycles_deleted": "Избришани се {count} циклуси", - "enough_data": "Доволно податоци за учење ({current}/{min} циклуси).", - "export_description": "Изберете точно кои профили, циклуси, поставки и друго да се извезат во JSON, или анализирајте датотека и увезете само деловите што ги сакате.", - "feedback_cycles_pending": "{n} циклус{s} за преглед", - "feedback_prompt": "Потврдете дека е точно, поправете ја програмата или игнорирајте.", - "feedback_relabel_hint": "Повторното етикетирање на овој циклус исто така го решава.", - "filter_by_profile": "Филтрирај по профил…", - "group_modal_help": "Групирајте програми со иста форма што се разликуваат по температура/вртење (времетраењето може да варира). Со совпаѓање се добиваат бодови на групата како еден кандидат, а потоа се избира членот кој најдобро одговара. Изберете најмалку 2; преклопот покажува колку се слични.", - "group_not_cohesive": "Овие профили не се доволно слични за да се групираат веродостојно, така што совпаѓањето ги третира поединечно додека не го отстраните оддалеченото или не ја поделите групата.", - "group_preview_hint": "Означете 2 или повеќе членови за преглед и споредба на нивните криви на моќност.", - "import_intro": "Вчитајте извезена датотека или залепете JSON носивост подолу.", - "legacy_actions_title": "{count} наследено приспособено дејство сè уште работи", - "live_chart_loading": "Табелата за напојување во живо се појавува кога пристигнуваат читањата.", - "loading": "Се вчитува…", - "loading_curve": "Се вчитува кривата…", - "loading_settings": "Се вчитуваат поставките…", - "log_buffer_hint": "Најновото прво · ги зачува последните 500 записи ha_washdata од рестартирањето · повлечете го долниот раб за да ја промените големината.", - "maintenance_advisory": "Зголеменото времетраење/енергија може да укаже на потребното одржување на апаратот (на пр. бигор, чистење на филтерот).", - "maintenance_due": "Треба одржување: {items}", - "maintenance_intro": "Запишувајте го одржувањето што го вршите на овој апарат и добивајте потсетници кога секоја задача повторно треба да се изврши.", - "maintenance_load_error": "Не може да се вчитаат податоците за одржување: {error}", - "maintenance_requires_access": "Одржувањето и извозот/увозот бараат целосен пристап.", - "manual_duration_hint": "Просечната/очекуваната должина на циклусот на профилот, што се користи за проценки на преостанатото време. Уредете за да го поставите; оставајќи го непроменет ја задржува моменталната вредност.", - "matching_tuning_intro": "Кога учи, WashData приспособува и колку одговарањето на програмата тежи обликот наспроти времетраењето и енергијата.", - "merge_intro": "Избраните циклуси се комбинираат во еден (хронолошки редослед; празнини исполнети со 0 W). Изберете го добиениот профил.", - "ml_intro": "WashData се испорачува со паметни модели кои работат надвор од кутијата.", - "ml_learned_intro": "Модели фино подесени на оваа машина.", - "ml_loading": "се вчитува ML…", - "ml_settings_intro": "Два независни прекинувачи: едниот ги применува моделите додека работи циклусот, другиот дозволува WashData фино да ги прилагоди на вашата машина со текот на времето.", - "name_first_program": "Имате доволно циклуси – именувајте ја вашата прва програма за да започне совпаѓањето.", - "near_duplicate_cluster": "Откриена е скоро дупликат профилна група. Групирањето овозможува совпаѓањето со сигурност да се избере помеѓу сличните (на пр. иста програма на различна температура/вртење).", - "no_cycles_match": "Ниту еден циклус не одговара на тековниот филтер.", - "no_cycles_profile": "Нема циклуси за овој профил.", - "no_cycles_selected": "Прво изберете барем еден циклус.", - "no_cycles_yet": "Сè уште нема снимени циклуси.", - "no_device_selected": "Нема избран уред.", - "no_devices": "Сè уште нема конфигурирани уреди за WashData.", - "no_envelope": "Сè уште нема плико - обновете по циклусите на етикетирање.", - "no_envelope_overlay": "Нема достапен плик за преклопување.", - "no_fine_tuned": "Сè уште ништо не е дотерано - WashData ги користи своите вградени модели.", - "no_logs": "Сè уште нема записи од дневници во бафер.", - "no_maintenance": "Сè уште не е забележано одржување.", - "no_match_yet": "Сè уште нема обид за натпревар - ова се пополнува за време на циклус на трчање.", - "no_other_users": "Не се пронајдени други корисници на Home Assistant.", - "no_phases": "Не се дефинирани фази.", - "no_phases_assigned": "Не се доделени фази.", - "no_profiles_compare": "Нема профили за споредба.", - "no_profiles_overlay": "Нема профили за преклопување.", - "no_profiles_yet": "Сè уште нема профили. Направете еден од означен циклус.", - "no_profiles_yet_short": "Сè уште нема профили.", - "no_settings_match": "Нема поставки кои одговараат на „{q}“", - "no_split_points": "Сè уште нема поделени поени.", - "no_suggestions": "Нема активни предлози.", - "notify_services_hint": "Користете ID-ови на сервисите {entity} (одвоени со запирки за повеќе). Варијабли на шаблонот: {vars}.", - "old_actions_warning": "Конфигуриран со стариот уредувач на дејства (сега отстранет). Сè уште пукаат на настани од циклусот, но веќе не може да се уредуваат овде. Претворете ги во нормална автоматизација или отстранете ги.", - "onboarding_progress": "{n} / 3 набљудувани циклуси", - "onboarding_watching": "Користете го апаратот како вообичаено – WashData набљудува. По 3 циклуси, ќе започне совпаѓањето на програми.", - "pending_feedback": "Во очекување на повратни информации за откривање", - "performance_trend": "Тренд на изведба ({n} циклуси)", - "pg_analysis_empty": "Вчитајте циклус за да видите анализа на совпаѓање.", - "pg_apply_confirm": "Да се примени најдобрата вредност: {label} = {value}?", - "pg_canvas_empty": "Изберете циклус погоре, потоа притиснете „Вчитај“ за да ја видите неговата крива на моќност.", - "pg_chart_caption": "Стапка на откривање/совпаѓање по вредности на {param}", - "pg_match_rate": "{pct}% совпаѓања на {total} циклуси", - "pg_restart_note": "Рестартирајте го Home Assistant за да ги овозможите алатките за симулација.", - "pg_sim_progress": "{done} / {total} циклуси", - "pg_starting": "Започнување…", - "pg_stress_synthetic": "симулацијата на мирување почнува тука", - "pg_sweep_intro": "Што ако {param} беше поинаков? Тестирајте {steps} вредности врз вашите последни {cycles} циклуси за да ја пронајдете поставката каде што најмногу циклуси се совпаѓаат правилно.", - "pg_sweep_step": "Чекор {done} / {total}", - "pg_undetected": "{n} неоткриен циклус{s}", - "pg_verdict_bad": "Бара внимание: многу циклуси остануваат неоткриени.", - "pg_verdict_good": "Добро наместено: повеќето циклуси правилно се откриваат и совпаѓаат.", - "pg_verdict_ok": "Прифатливо: некои циклуси се пропуштени. Обидете се да го намалите прагот за старт.", - "phase_catalog_intro": "Именувани сегменти од циклусот (предмиење, загревање, центрифугирање...). Доделете ги на профил од неговата контролна табла.", - "phase_ranges_intro": "Опсегот на фази (минути од почетокот на циклусот) се преклопени на просечната крива. Уредете ги вредностите за да ги прегледате во живо.", - "playground_intro": "Безбеден песочник за повторно пуштање минати циклуси со различни поставки, споредба на две конфигурации една до друга и увид во тоа како еден циклус се порамнува со профил. Ништо тука не ги менува вашите активни податоци сè додека изрично не го примените.", - "playground_needs_restart": "Рестартирајте го Home Assistant за да ги овозможите алатките на Песочникот.", - "preferences_admin": "Преференци, панел и контрола на пристап", - "preferences_adv": "Преференци", - "prefs_personal": "Овие се однесуваат само на вашата сметка на „Помошник за дома“.", - "process_history_hint": "Повторно стартувајте совпаѓање на сите зачувани циклуси, освежете предлози за подесување, повторно обучете ML модели (ако се овозможени) и препресметајте го здравјето на циклусите. Стартувајте по серија прегледи.", - "profile_deleted": "Профилот е избришан", - "profile_poor_health_detail": "Циклусите доделени на овој профил имаат неконзистентни форми или мала доверба. Размислете за обнова на пликот или прегледување на означените циклуси.", - "profiles_intro": "Кликнете на профил за статистика, фази и чистење. Групирајте скоро идентични програми (иста форма/траење, различна температура или центрифугирање) така што сигурно се совпаѓаат помеѓу нив.", - "rbac_hint": "Кога е исклучен, секој корисник на Home Assistant има целосен пристап (стандардно). Администраторите секогаш имаат целосен пристап и можат да управуваат со секого.", - "recent_logs": "Неодамнешни записи ha_washdata", - "recording_in_progress": "Снимањето е во тек", - "reminders_intro": "Прикажи потсетник во панелот толку циклуси по последниот сервис. Оставете празно или 0 за да го исклучите потсетникот.", - "restart_gap_footer": "Означено на графиконот. Податоците за моќност недостасуваат за овие интервали; совпаѓањето користеше само вистински очитувања.", - "restart_gap_header": "{n} HA пропуст при рестартирање за време на овој циклус", - "restart_gap_item": "{dur} пропуст", - "review_confirm_help": "Потврдете дали овој циклус е правилно откриен. Вашите рецензии го обучуваат моделот на вашата машина - колку повеќе циклуси потврдувате, толку подобро се совпаѓаат и бодовите за здравјето. Доволно е брзо/добро/лошо.", - "review_in_settings": "Преглед во Поставки", - "review_notes_placeholder": "Забелешки (изборно)", - "review_notes_tip": "Белешки со слободен текст за ваша сопствена референца. Не се користи со совпаѓање или обука.", - "review_profile_tip": "Програмата за овој циклус е означена како. Ако програмата за автоматско откривање е погрешна, поправете ја овде - етикетирањето учи совпаѓање за идните циклуси.", - "review_quality_tip": "Колку е чист овој циклус. Добро = пример за учебник за оваа програма; Лошо = откриено, но бучно или нетипично; Неупотреблив = погрешно откриен (споен, скратен или лажен). Вози на здравствениот резултат и кои циклуси се дозволени за обука на моделот.", - "review_recorded_tip": "Означете го ова како рачно избран референтен циклус за неговата програма - иста улога како рачно снимен циклус. Референтните циклуси секогаш се чуваат, се засноваат соодветниот шаблон и никогаш не се испуштаат со чистење. (Ова е „златното“/снимено знаме; и двете се иста работа.)", - "review_tags_tip": "Изборни знаменца што опишуваат што тргнало наопаку со овој циклус, така што обуката и чистењето можат да одговорат за тоа.", - "review_to_cycles": "Отворете го редот за преглед на циклуси", - "saving_triggers_reload": "Зачувувањето активира повторно вчитување на интеграцијата. Ентитетите на HA може накратко да се покажат како недостапни.", - "search_placeholder": "Поставки за пребарување…", - "see_recorder": "Погледнете го додатокот за рекордер подолу", - "setting_changed": "Променето од {old} на {new} на {date}", - "settings_basic_note": "Прикажани се основните поставки. Префрлете се на Напредно за целосната листа.", - "shape_drift_advisory": "⚠ Форма дрифт", - "shape_drift_detail": "Обрасецот на моќноста за овој профил се промени со текот на времето – можно е трошење на апаратот или потребно е одржување (на пр. одкаменување, чистење на филтерот).", - "show_all_settings": "Прикажи ги сите поставки", - "showing_suggestions": "Се прикажува поставката {count} со предлози.", - "split_intro": "Кликнете на графиконот за да додадете или отстраните точка на разделување или автоматско откривање со празнини во мирување. Секој добиен сегмент може да добие свој профил.", - "storage_diagnostics": "Статистика за складирање, одржување, извоз/увоз", - "sug_staged": "Поставено {key} = {val}. Зачувајте за примена.", - "toast_auto_detect_enabled": "Автоматско откривање овозможено", - "toast_auto_label_complete": "Автоматско означување завршено", - "toast_auto_label_failed": "Автоматско означување неуспешно: {error}", - "toast_automation_failed": "Не може да се создаде автоматизација: {error}", - "toast_automation_migrated": "Акциите се мигрирани во автоматизација; се отвора уредувачот", - "toast_convert_failed": "Конверзијата неуспешна: {error}", - "toast_create_failed": "Создавањето неуспешно: {error}", - "toast_delete_failed": "Бришењето неуспешно: {error}", - "toast_error": "Грешка: {error}", - "toast_failed": "Неуспешно: {error}", - "toast_force_stop_failed": "Принудното запирање неуспешно: {error}", - "toast_name_required": "Потребно е ime", - "toast_no_automation": "Тука не може да се создаде автоматизација", - "toast_profile_name_required": "Потребно е ime на профил", - "toast_program_set": "Поставена програма: {program}", - "toast_rebuild_failed": "Реконструкцијата неуспешна: {error}", - "toast_resume_failed": "Продолжувањето неуспешно: {error}", - "toast_revert_failed": "Враќањето неуспешно: {error}", - "toast_reverted": "{key} е вратено", - "toast_save_failed": "Зачувувањето неуспешно: {error}", - "trend_duration_longer": "Времетраењето е во тренд подолго ({pct}%/циклус) - неодамнешниот просек {avg}", - "trend_duration_shorter": "Времетраењето е во тренд пократко ({pct}%/циклус) - неодамнешниот просек {avg}", - "trend_energy_down": "Енергетскиот тренд надолу ({pct}%/циклус)", - "trend_energy_up": "Енергетскиот тренд нагоре ({pct}%/циклус) - неодамнешен просек {avg}", - "trim_intro": "Повлечете ги црвените рачки или внесете вредности. Сè што е надвор од прозорецот е отстрането.", - "tuning_suggestions_available": "{count} предлог за подесување е достапен од набљудуваните циклуси. Тие се појавуваат покрај соодветните полиња.", - "unsure_detected_prefix": "WashData не е сигурен дека е откриен", - "updated": "Ажурирано", - "warmup_badge": "Сè уште учи ({done}/{needed} циклуси)", - "warmup_detail": "На овој профил му требаат {needed} означени циклуси пред да започне автоматското совпаѓање. Секој потврден циклус помага во учењето.", - "wipe_history_warning": "Трајно избришете ги сите циклуси и профили. Не може да се врати.", - "compare_overlay_tip": "Преклопете ги пликовите на научените профили за да видите на која програма личи секој циклус.", - "duration_trend_up_tip": "Времетраењето расте ({pct}%/циклус)", - "duration_trend_down_tip": "Времетраењето опаѓа ({pct}%/циклус)", - "energy_trend_up_tip": "Енергијата расте ({pct}%/циклус)", - "energy_trend_down_tip": "Енергијата опаѓа ({pct}%/циклус)", - "performance_trending": "Тренд на изведба", - "pg_select_cycle_hint": "Изберете циклус и кликнете ↺ за вчитување", - "pg_sweep_progress": "Чекор {done} / {total}", - "pg_analysis_hint": "Изберете циклус и кликнете ↺ за вчитување на анализата.", - "diagnostics_load_failed": "Не успеа да се вчита дијагностиката: {error}", - "manual_duration_ref_hint": "Се користи само кога не е избран референтен циклус. Референтниот циклус го одредува времетраењето според сопствената должина.", - "toast_convert_rolled_back": "Конверзијата не успеа и беше вратена (не остана ниту една автоматизација): {error}", - "toast_convert_orphan": "Автоматизацијата беше создадена, но чистењето на старите акции не успеа. Не обидувајте се повторно: рачно отстранете ги старите акции за да избегнете дуплирана автоматизација.", - "advisory_duration_trend_up": "Циклусите на '{name}' стануваат сè подолги (околу +{pct}% по циклус). Ако однесувањето на уредот се променило, повторно снимете го или обновете го овој профил.", - "advisory_energy_trend_up": "'{name}' троши сè повеќе енергија (околу +{pct}% по циклус) - вреди да го проверите уредот ако тоа е неочекувано.", - "advisory_poor_health": "Профилот '{name}' има ниска оценка на совпаѓање - неговите неодамнешни циклуси значително варираат или слабо се препознаваат. Прегледајте ги неговите циклуси или повторно снимете го профилот за да останат точни препознавањето и проценките на времето.", - "advisory_shape_drift": "Профилот '{name}' значително отстапи од својата првобитна форма на потрошувачка на моќност. Уредот можеби со текот на времето го променил своето однесување (на пр. бигор, абење). Размислете за повторно снимање на овој профил со неодамнешните циклуси.", - "advisory_shape_drift_corr": "Профилот '{name}' значително отстапи од својата првобитна форма на потрошувачка на моќност (корелација {corr}). Уредот можеби со текот на времето го променил своето однесување (на пр. бигор, абење). Размислете за повторно снимање на овој профил со неодамнешните циклуси.", - "pg_no_alerts": "Во ова извршување не се откриени проблеми.", - "pg_override_active": "Се користат вашите изменети поставки наместо тековните", - "pg_history_intro": "Повторно пуштете ги последните циклуси низ вистинскиот детектор и совпаѓач. Прво изменете поставка за откривање во „Симулација“ за да видите тука споредба пред/по.", - "pg_history_empty": "Притиснете „Изврши“ за да ги репродуцирате циклусите.", - "pg_history_summary": "{detected}/{total} откриени · {correct} совпаднати правилно", - "pg_sweep_no_metric": "Нема доволно податоци за оценка на оваа цел.", - "pg_sweep_intro2": "Најдете ја поставката што најдобро ја постигнува целта врз вашите последни циклуси. Ништо не се менува додека не ја примените.", - "pg_running_history": "Повторно изведување на вашите циклуси…", - "pg_running_sweep": "Тестирање на вредности низ сите ваши циклуси…", - "pg_row_load_hint": "Вчитај го овој циклус во графикот погоре", - "pg_history_intro2": "Повторно изведете ги неодамнешните циклуси преку вистинскиот детектор и модулот за совпаѓање со поставките погоре. Кликнете на кој било ред за да го вчитате тој циклус во графикот; изменете поставка за да видите споредба пред и потоа.", - "pg_simulating": "Симулирање на циклус…", - "pg_canvas_empty2": "Изберете циклус погоре и притиснете Стартувај за да го симулирате. Потоа посочете за да ги видите вредностите, лизгајте за зумирање и влечете за поместување.", - "pg_apply_settings_confirm": "Да се зачуваат ли овие {n} поставки на овој уред? {list}", - "pg_stress_terminated_detail": "Се стабилизира на ~{idle}W мирување -- циклусот заврши {h} ч {m} мин подоцна преку {reason}.", - "pg_stress_above_threshold_detail": "Потрошувачката во мирување ~{idle}W е еднаква или над ефективниот праг за запирање ({stop}W) -- циклусот никогаш не беше регистриран како мирен. За да го поправите ова, зголемете го stop_threshold_w.", - "pg_stress_hit_cap_detail": "Циклусот работеше {h} ч {m} мин без да запре -- принудно запрен од заштитниот лимит. Потрошувачка во мирување {idle}W наспроти прагот за запирање {stop}W.", - "no_logs_match": "Ниту еден запис од дневникот не одговара на овие филтри.", - "pg_analysis_hint2": "Изберете циклус и притиснете Изврши за да се вчита анализата на совпаѓање.", - "pg_analysis_empty2": "Притиснете Изврши за да ја видите анализата на совпаѓање.", - "imported_readonly": "Увезено од продавницата на заедницата. Се прикажува за референца и совпаѓање. Не се брои во вашата статистика и не може да се уредува.", - "merge_no_imports": "Увезените снимки не можат да се спојат со вистински циклус. Отштиклирајте ги за да ги споите.", - "store_enable_hint": "Овозможете ги онлајн функциите во поставките за да прелистувате и увезувате референтни циклуси од заедницата.", - "online_intro": "Споделувајте и преземајте референтни циклуси со други корисници на WashData. Сите онлајн функции се по избор и стандардно се исклучени.", - "store_share_intro": "Прикачете го овој референтен циклус за да можат да го користат други со истиот уред. Се прегледува пред да стане јавен.", - "online_intro_global": "Прелистувајте и споделувајте референтни снимки со други корисници на WashData и потврдувајте записи за уреди. Едно поврзување важи за целата ваша интеграција WashData; брендот и моделот на уредот се поставуваат за секој уред во разделот „Основно“. Сите онлајн функции се по избор и стандардно се исклучени.", - "online_unavailable": "Онлајн функциите не се достапни на овој сервер.", - "store_picker_offline": "Овозможете ги онлајн функциите од иконата за поставки (запченик) за да избирате од каталогот на заедницата.", - "pick_brand_first": "Прво изберете бренд на уредот.", - "model_not_found": "Сè уште не е во каталогот.", - "connect_to_confirm": "Поврзете се од иконата за поставки (запченик) за да потврдувате или оценувате.", - "adopt_settings_hint": "Примени ги поставките за откривање и совпаѓање на споделениот уред на овој уред", - "include_settings_hint": "Вклучи прагови за откривање, тежини за совпаѓање и други параметри во споделениот пакет", - "onboard_download": "Преземи готови поставки од продавницата на заедницата", - "share_consent": "Споделувате вистински податоци од вашиот уред. Не споделувајте ако вашите обрасци за користење се приватни.", - "share_device_none": "Сè уште нема поставени уреди. Прво додајте уред.", - "share_guideline_naming": "Користете јасни имиња на програмите (напр. 'Cotton 40', 'Eco 60') за да можат другите да ги препознаат", - "share_guideline_quality": "Споделувајте само профили со ⭐ референтни циклуси или барем {n} потврдени стартувања", - "share_guideline_review": "Прегледајте ги профилите пред споделување -- отстранете ги оние кои изгледаат погрешно", - "share_guidelines_title": "Пред споделување", - "store_download_device_intro": "Преземете поставки на уредот од заедницата и применете ги на нов или постоечки уред", - "store_share_device_intro": "Споделете ги програмите на вашиот уред (профили + референтни циклуси) со заедницата. Поставките се опционални.", - "share_profile_no_cycles": "Профилот '{p}' нема ⭐ референтни циклуси -- ќе биде прескокнат освен ако немате {n}+ потврдени стартувања", - "advisory_phase_inconsistent": "Изгледа дека '{name}' меша различни програми или температури - неговите циклуси се загреваат многу различно долго. Поделбата на посебни профили (на пр. по температура) ќе ги подобри совпаѓањето и проценките на времето.", - "advisory_phase_inconsistent_title": "⚠ Можеби измешани програми", - "export_select_intro": "Означете што точно да се вклучи. Изборот на профили без нивните циклуси сепак извезува препознатлива програма (нејзината научена форма се пренесува заедно со неа).", - "import_analyze_hint": "Вчитајте извезена датотека (или залепете го нејзиниот JSON). WashData ја анализира и покажува што точно може да се увезе пред да се промени нешто.", - "analyzing": "Анализирање…", - "device_type_mismatch_warn": "Овој извоз е од друг тип уред ({src} наместо {local}). Програмите и циклусите сепак можат да се увезат како референтни податоци, но поставките специфични за уредот и увозот на реална историја се оневозможени.", - "merge_hint": "Увезените ставки се додаваат; ништо локално не се губи. Конфликтите на имиња се решаваат подолу.", - "replace_warn": "Секоја означена категорија се брише и се заменува со податоците од датотеката. Неозначените категории остануваат непроменети.", - "dest_reference_hint": "Увезените циклуси само го подобруваат препознавањето на програми и никогаш не влијаат на статистиката за користење/енергија.", - "dest_real_history_hint": "Увезените циклуси се сметаат за сопствена историја на овој уред и ја хранат статистиката за енергија/користење. Користете за преместување на еден уред на нова инсталација." - }, - "phase_desc": { - "anti_crease": "Повремени кратки превртувања по завршувањето за да се намалат брчките.", - "anti_wrinkle": "Периодично вртење после циклус за намалување на брчките.", - "cool_down": "Превртување без топлина блиску до крајот на циклусот.", - "drain_and_switch": "Преоден период од режим на перење во сушење.", - "dry": "Фаза на сушење со помош на грејач и/или преостаната топлина.", - "drying": "Главен загреан период на превртување.", - "heat_up": "Почетното загревање на грејачот пред да започне целосното сушење.", - "pre_rinse": "Почетно прскање пред миење со детергент.", - "pre_wash": "Почетно натопување или предтретман пред главното перење.", - "rinse": "Фаза на плакнење со чиста вода. Оваа фаза може да се повтори повеќе пати.", - "sanitize": "Фаза за чистење со висока температура за програми за дезинфекција.", - "sensor_check": "Кратка пауза со мала моќност додека се мери сувоста.", - "soak": "Период на натопување со мала активност помеѓу активните фази на миење.", - "soak_dw": "Продолжен период на киснење за тешка почва.", - "spin": "Извлекување со голема брзина за отстранување на водата од товарот.", - "spin_wd": "Екстракција со голема брзина пред транзиција на сушење.", - "wash": "Главен циклус на перење со движење на барабанот и опционално загревање.", - "wash_dw": "Главно миење со детергент со загревање." - }, - "placeholder": { - "add": "додај…", - "group_name": "пр. Памук 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "додај сервис за известување…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "додај лице…", - "phase_name": "пр. Претпрање", - "profile_name": "пр. Памук 40°C", - "maintenance_notes": "пр. заменет филтер, исчистена гума на вратата", - "store_brand": "на пр. Bosch", - "store_model": "на пр. WAT28401" - }, - "pref": { - "date_absolute": "Апсолутно (на пр. 14:32 на 2 јули)", - "date_relative": "Роднина (на пр. пред 2 часа)", - "lang_auto": "Системски стандарден ({lang})", - "lang_en": "Англиски", - "use_panel_default": "(стандард на таблата)" - }, - "quality": { - "bad": "Лошо", - "good": "Добро", - "unusable": "Неупотребливи" - }, - "section": { - "anti_wrinkle": { - "intro": "Режимот против брчки/набирање открива импулси со ниска моќност по главната фаза и ги прикачува на завршениот циклус.", - "label": "Против брчки" - }, - "basic": { - "intro": "Основен идентитет и суштинските работи кои ги бараат повеќето поставки.", - "label": "Основно" - }, - "delay": { - "intro": "Откривањето на одложениот старт идентификува кога апаратот е вклучен но сè уште не започнал циклус.", - "label": "Одложен старт" - }, - "detection": { - "intro": "Kako се открива циклусот при започнување, работење и завршување.", - "label": "Откривање" - }, - "matching": { - "intro": "Kako завршените циклуси се совпаѓаат со научените профили и се означуваат.", - "label": "Совпаѓање" - }, - "ml_training": { - "intro": "Распоред и поставки за податоци за повторна обука на машинско учење на уредот.", - "label": "МЛ обука" - }, - "notifications": { - "intro": "Кога и kako се известувате за настаните на циклусот.", - "label": "Известувања" - }, - "timing": { - "intro": "Позадинска каденца, офлајн чувар и одржување.", - "label": "Тајмирање и чувар" - }, - "triggers": { - "intro": "Опционални надворешни сигнали: тригер за крај, сензор за врата, прекинувач за пауза и потсетник за истовар.", - "label": "Тригери и врати" - }, - "phase_eta": { - "label": "Преостанато време", - "intro": "Проценка на преостанатото време, свесна за фазите, за машини чија должина на циклусот зависи од температурата или центрифугирањето." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "Препознајте ги кратките пулсирања со мала моќност што ги испушта машината за сушење по главната топлинска фаза и држете ги прикачени на завршениот циклус наместо да ги читате како нови циклуси.", - "label": "Овозможи откривање против брчки" - }, - "anti_wrinkle_exit_power": { - "doc": "Моќта мора да падне под ова помеѓу импулсите за режимот против брчки да остане активен.", - "label": "Праг на моќност за излез" - }, - "anti_wrinkle_idle_timeout": { - "label": "Макс. пауза меѓу импулси", - "doc": "Колку долго машината смее да остане тивка меѓу два импулса на превртување на барабанот пред режимот против брчки да заврши. Поставете ја над најдолгата пауза што вашата машина за сушење ја остава меѓу импулсите, инаку секој нареден импулс се чита како лажен старт." - }, - "anti_wrinkle_max_duration": { - "doc": "Пулсовите подолги од ова се третираат како вистински циклус, а не како средство против брчки.", - "label": "Макс. траење" - }, - "anti_wrinkle_max_power": { - "doc": "Пулсот над оваа моќност се третира како вистински нов циклус, а не како ролна против брчки. Поставете веднаш над моќноста на пулсот на ролна.", - "label": "Макс. моќност против брчки" - }, - "auto_label_confidence": { - "doc": "Ако резултатот на натпреварот на крајот на циклусот е на или над ова, програмата автоматски се означува без никакво барање за потврда. Подигнете го за да бара поголема сигурност пред автоматско означување; спуштете го за да се автоматизира повеќе. Работи во врска со Довербата за учење под неа.", - "label": "Доверба за автоматско означување" - }, - "auto_maintenance": { - "doc": "Извршете ноќно одржување: обновете ги пликовите на профилот, пресметувајте го здравјето на циклусот, исечете ги трагите од отстранување грешки и задржете ги најновите циклуси.", - "label": "Автоматско одржување (ноќно чистење)" - }, - "completion_min_seconds": { - "doc": "Циклусите пократки од ова се отфрлаат како циклуси на духови (тестни, отворање на вратата за додавање чорап).", - "label": "Мин. траење на циклус" - }, - "delay_confirm_seconds": { - "doc": "Напојувањето мора да остане толку долго во опсегот на подготвеност пред апаратот да се третира како што чека да стартува наместо да работи.", - "label": "Секунди за потврда" - }, - "delay_start_detect_enabled": { - "doc": "Откријте кога апаратот е вклучен и чека (одложен почеток / мирување), но не го започнал својот циклус, така што цртањето во режим на подготвеност не се смета за работен циклус.", - "label": "Овозможи откривање на одложен старт" - }, - "delay_timeout_hours": { - "doc": "Престанете да чекате во режимот за одложено стартување после толку часови и вратете се во мирување, така што машината што останала напојувана, но никогаш не стартувала, не чека вечно.", - "label": "Часови за истекување" - }, - "device_type": { - "doc": "Класа на апарати. Поставува разумни поставки за откривање (прагови, исклучено одложување, крајно ракување) прилагодени за тој тип на апарат; променете го само ако уредот првично бил поставен како погрешен тип.", - "label": "Тип на уред" - }, - "door_sensor_entity": { - "doc": "Изборен бинарен сензор за врата. Се користи за откривање кога апаратот е отворен/растоварен по циклус.", - "label": "Ентитет на сензор за врата" - }, - "duration_tolerance": { - "doc": "Толеранција за проценките на преостанатото време (повратни информации за учење, не совпаѓање). Ако вистинското времетраење е во рамките на +/-X% од проценката, тоа се смета за добро совпаѓање.", - "label": "Толеранција на проценката" - }, - "enable_ml_models": { - "doc": "Додека трае циклусот, дозволете им на моделите да ги усовршат резултатите во живо: постабилна проценка на преостанатото време и енергија/трошок, како и заштита против предвремено запирање при откривање на крајот (може само да го одложи финишот, никогаш да не заврши порано и е ограничен). Ги користи вашите фино подесени модели кога се достапни, инаку вградените. Исклучено = само класична логика базирана на моќност (сеуште сигурна).", - "label": "Примени паметни модели за време на циклус" - }, - "end_energy_threshold": { - "doc": "За време на одбројувањето без одложување, акумулираната енергија (вати x време) се споредува со овој праг. Ако се надмине, одбројувањето се ресетира - држејќи ги опашките против туткање и опашките за сушење во машина за миење садови прикачени на циклусот наместо да ги скратите. Зголемете го ако циклусите завршуваат премногу рано за време на ладењето; спуштете го ако откривањето е бавно.", - "label": "Крајна енергија" - }, - "end_repeat_count": { - "doc": "Број на последователни отчитувања под прагот што се потребни пред да заврши циклусот. 1 е во ред за повеќето приклучоци. Зголемете на 2-3 ако вашиот паметен приклучок повремено пријавува примерок со лажна нула во средината на циклусот и вашите циклуси завршуваат предвреме.", - "label": "Броење на повторување при крај" - }, - "energy_price_entity": { - "doc": "Сензор со моменталната цена на електрична енергија по kWh (на пр. динамична тарифа). Има предност пред статичната цена подолу. Секој циклус ја замрзнува цената што е во сила кога ќе заврши.", - "label": "Ентитет на цена на енергија" - }, - "energy_price_static": { - "doc": "Фиксна цена по kWh што се користи за бројките на трошоците кога не е поставен ентитет на цена во живо погоре.", - "label": "Статична цена на енергија (по kWh)" - }, - "energy_sensor": { - "doc": "Изборен кумулативен бројач на енергија (total_increasing kWh/Wh, на пр. сопствениот бројач за вкупната потрошувачка на приклучокот). Кога е поставен, енергијата пријавена за секој циклус се зема од разликата во отчитувањата на овој бројач меѓу почетокот и крајот, што го избегнува потценувањето што се добива при интегрирање на бавно известувачки сензор за моќност. Се враќа на интегрираната вредност ако отчитувањето недостасува, неговата единица е непозната или разликата не е позитивна. Оставете празно за да продолжите да го интегрирате сензорот за моќност.", - "label": "Ентитет на мерач на енергија" - }, - "expose_debug_entities": { - "doc": "Објавувајте дополнителни дијагностички HA ентитети (доверба на натпреварот, двосмисленост, внатрешни работи). Исклучено го одржува списокот со ентитети чист за нормална употреба.", - "label": "Изложи ентитети за дебагирање" - }, - "external_end_trigger": { - "doc": "Бинарен сензор чија промена на состојбата го означува крајот на циклусот (на пр. контакт „завршен“ на апаратот или придружна интеграција).", - "label": "Ентитет на надворешен тригер" - }, - "external_end_trigger_enabled": { - "doc": "Дозволете надворешен бинарен сензор да го сигнализира крајот на циклусот, покрај вграденото откривање базирано на енергија.", - "label": "Овозможи надворешен тригер за крај" - }, - "external_end_trigger_inverted": { - "doc": "Третирајте го исклучувањето на сензорот за активирање (наместо ВКЛУЧЕНО) како сигнал за крајот на циклусот.", - "label": "Инвертирај надворешен тригер (тригер при ИСКЛУЧУВАЊЕ)" - }, - "learning_confidence": { - "doc": "If the match score falls between this and Auto-Label Confidence, a feedback notification asks you to verify the identified program. Below this score the match is too uncertain to surface. Мора да се чува под Довербата за автоматска етикета.", - "label": "Доверба при учење" - }, - "linked_device": { - "doc": "Изборно вгнездувајте го овој уред WashData под друг уред (на пр. паметниот приклучок) во регистарот на уреди HA, прикажан како „Поврзан преку ...“.", - "label": "Групирај под уред" - }, - "min_off_gap": { - "doc": "Ако машината се исклучува помалку од ова време, секвенцата за вклучување/исклучување/вклучување се третира како еден континуиран циклус. Спречува програмите за натопување (машината се исклучува неколку минути при перење) да се поделат на два одделни циклуси. Поставете го пократко од јазот помеѓу вчитувањата одназад, ако сакате тие да се бројат како посебни циклуси. Стандардните типови на уред ја штитат типичната пауза во циклусот за секој апарат.", - "label": "Мин. јаз при исклучување" - }, - "min_power": { - "doc": "Апсолутна минимална моќност се смета за активна. Читањата под ова се третираат како 0 W (во мирување), филтрирање на фантомското оптоварување на паметните приклучоци и LED диоди во мирување.", - "label": "Минимална моќност" - }, - "ml_training_enabled": { - "doc": "Периодично проучувајте ги прегледуваните циклуси преку ноќ и дотерувајте ги моделите на оваа специфична машина. Промената се задржува само кога навистина постигнува подобри резултати на долготрајните циклуси, така што ова може само да помогне или да остане исто - никогаш да не се уназадувате.", - "label": "Учи од оваа машина" - }, - "ml_training_hour": { - "doc": "Локален час од денот (0-23) за да се изврши фино подесување преку ноќ. Изберете мирен час како 2 (02:00 часот).", - "label": "Учи во час" - }, - "ml_training_interval_days": { - "doc": "Повторно проверете дали има подобрувања најмногу еднаш во овој многу дена.", - "label": "Проверувај најмногу на секои" - }, - "ml_training_min_cycles": { - "doc": "Почекајте барем толкав број циклуси да бидат снимени пред фино подесување, за да има доволно за учење.", - "label": "Прво потребни циклуси" - }, - "name": { - "doc": "Името на прикажување прикажано во списокот со интеграции на HA и во регистарот на уреди.", - "label": "Назив на уред" - }, - "no_update_active_timeout": { - "doc": "Ако не пристигне ажурирање напојување за толку долго додека работи, претпоставете дека приклучокот испаднал офлајн и присилно прекинете за да избегнете циклус на зомби. Стандардните 600 секунди овозможуваат доцнење во облак или мрежа.", - "label": "Пауза без ажурирање" - }, - "notify_before_end_minutes": { - "doc": "Испратете предупредување Речиси готово кога проценетото преостанато време ќе падне под ова. 0 го оневозможува.", - "label": "Предупредување пред крај" - }, - "notify_channel": { - "doc": "Име на каналот за известување на Android за пораки за почеток/во живо (го контролира звукот и приоритетот по канал на мобилната апликација). Blank ја користи стандардната придружна апликација.", - "label": "Android канал (старт/живо)" - }, - "notify_cycle_timers": { - "doc": "Известувања во одредени минути во циклусот (на пр. за додавање омекнувач). Пораката поддржува {device}, {program}, {minutes}. Овозможете автоматско паузирање за да паузирате во тој момент и добивате интерактивно известување со копчето Продолжи; продолжи преку панелот, услугата за пауза/продолжување или дејството за известување.", - "label": "Тајмери за циклус" - }, - "notify_finish_channel": { - "doc": "Името на каналот за известување на Android за завршната порака. Blank повторно го користи каналот за старт/жив.", - "label": "Android канал (крај)" - }, - "notify_finish_message": { - "doc": "Тело што се испраќа кога циклусот ќе заврши. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. {time_finished} и {vs_typical} се најкорисни тука.", - "label": "Порака за крај" - }, - "notify_finish_services": { - "doc": "известувај.* услугите се повикуваат кога ќе заврши циклусот. Додадете по еден по цел; оставете празно известување без завршница.", - "label": "Услуги за крај" - }, - "notify_fire_events": { - "doc": "Исто така, активирајте ha_washdata_* настани на почетокот/завршувањето на циклусот за да можете да изградите свои автоматизации.", - "label": "Активирај HA настани за известувања" - }, - "notify_icon": { - "doc": "Изборна икона mdi за известувањето (на пр. mdi:машина за перење). Оставете празно за стандардната платформа.", - "label": "Икона на известување" - }, - "notify_live_chronometer": { - "doc": "Прикажи тајмер за одбројување што се ажурира во живо во известувањето (на платформите што го поддржуваат) наместо статична проценка.", - "label": "Користи хронометар во живо" - }, - "notify_live_interval_seconds": { - "doc": "Колку често известувањата за напредок во живо се освежуваат додека работи циклусот.", - "label": "Интервал за ажурирање во живо" - }, - "notify_live_overrun_percent": { - "doc": "Ако циклусот ја надмине неговата проценка за повеќе од овој процент, испратете предупредување за пречекорување.", - "label": "% на прекорачување во живо пред предупредување" - }, - "notify_live_services": { - "doc": "известувај.* услугите повикани за ажурирање на напредокот во живо додека трае циклусот. Оставете празно за да ги оневозможите известувањата за напредок во живо.", - "label": "Услуги за напредок во живо" - }, - "notify_only_when_home": { - "doc": "Испраќајте известувања само кога барем едно од поврзаните луѓе (горе) е дома.", - "label": "Известувај само кога сте дома" - }, - "notify_people": { - "doc": "лице.* ентитети што ги користи „Извести само кога дома“ за да одлучи дали некој е дома.", - "label": "Луѓе (за Само дома)" - }, - "notify_pre_complete_message": { - "doc": "Тело на предупредувањето пред-крај / речиси готово. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Порака за скоро крај" - }, - "notify_reminder_message": { - "doc": "Тело на потсетникот за истоварување што сè уште чека. Ако е празно, се користи вградената стандардна вредност. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Порака за потсетник" - }, - "notify_start_message": { - "doc": "Тело што се испраќа кога циклусот ќе започне. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Порака за почеток" - }, - "notify_start_services": { - "doc": "известувај.* услуги се повикуваат кога започнува циклус. Додадете по еден по цел (телефон, контролна табла, итн.); оставете празно известување без почеток.", - "label": "Услуги за почеток" - }, - "notify_timeout_seconds": { - "doc": "Автоматски отфрли го известувањето по овие многу секунди (на платформите што го поддржуваат). 0 го задржува додека не се отфрли рачно.", - "label": "Автоматско отфрлање по" - }, - "notify_title": { - "doc": "Наслов на известување. Шаблонски променливи: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "Наслов на известување" - }, - "notify_unload_delay_minutes": { - "doc": "Неколку минути по завршувањето на циклусот пред да го испратите потсетникот за „растоварување на машината“ што се уште чека. Поставете 0 за да го оневозможите потсетникот.", - "label": "Задоцнување на потсетникот за истовар" - }, - "off_delay": { - "doc": "Време е да се чека откако ќе падне напојувањето пред да се прогласи дека циклусот е завршен. Ако напојувањето се обнови во овој прозорец, циклусот продолжува беспрекорно - ова ги премостува паузите помеѓу фазите на перење. Машините за миење садови имаат долги фази на сушење (исклучување на струја 20-60 мин), така што доцнењето на исклучување мора да го надмине тоа за да се задржи целото перење+сушење како еден циклус.", - "label": "Одложување на исклучување" - }, - "pause_cuts_power": { - "doc": "Кога циклусот е паузиран, исклучете го и Switch Entity подолу. Само за уреди чиј приклучок може безбедно да се исече во средината на циклусот.", - "label": "Паузата исто така ја исклучува моќноста (преку прекинувач)" - }, - "power_off_delay": { - "doc": "Колку долго моќноста мора да остане под Прагот за исклучување на напојувањето откако циклусот ќе заврши пред состојбата да се врати на „Исклучено“. Се користи само кога Прагот за исклучување на напојувањето е над 0. Се проверува на позадинскиот ритам, така што ефективното одложување се заокружува нагоре до следното отчукување за истек на состојбата.", - "label": "Одложување на исклучување на напојувањето" - }, - "power_off_threshold_w": { - "doc": "Опционално откривање на исклучена состојба врз основа на моќноста. Кога е над 0, откако циклусот ќе заврши и моќноста остане под ова ниво во текот на Одложувањето на исклучување на напојувањето, машината се третира како исклучена и состојбата се враќа на „Исклучено“. Оставете на 0 за да го оневозможите (стандардно). Поставете го над вистинското ниво на исклучено напојување, а под Прагот за стоп и под потрошувачката на вашата машина во мирување (завршена, но сè уште вклучена); ако не е под Прагот за стоп, се игнорира. Кога е овозможено, го заменува Одложувањето на ресет на напредок за враќање на „Исклучено“, така што завршената машина останува на „Завршено/Чиста“ додека навистина не се исклучи.", - "label": "Праг за исклучување на напојувањето" - }, - "power_sensor": { - "doc": "Ентитетот на сензорот што известува за електрична енергија во вати за овој апарат (на пр. сензор.моќност за мијалник). Откривањето на целиот циклус се заснова на овој сигнал.", - "label": "Сензор за моќност" - }, - "profile_duration_tolerance": { - "doc": "Опсегот +/- околу просечното времетраење на профилот што се користи за време на совпаѓањето. 0,25 значи дека профилот од 60 минути одговара на циклусите од 45-75 минути.", - "label": "Толеранција на траење на профилот" - }, - "profile_match_interval": { - "doc": "Колку често се обидувате да се совпаднете со профилот за време на циклусот на трчање. Стандардните 300 секунди (5 минути) ги балансираат брзината на откривање и процесорот.", - "label": "Интервал за совпаѓање" - }, - "profile_match_max_duration_ratio": { - "doc": "Максимална должина на циклусот во однос на профилот. 1.3 значи дека циклусот мора да биде под 130% од времетраењето на профилот за да се совпадне.", - "label": "Макс. сооднос на траење" - }, - "profile_match_min_duration_ratio": { - "doc": "Минимална должина на циклусот во однос на профилот. 0,9 значи дека циклусот мора да биде најмалку 90% од времетраењето на профилот за да се совпадне.", - "label": "Мин. сооднос на траење" - }, - "profile_match_threshold": { - "doc": "Потребен е минимален резултат на сличност (0-1) на крајот на циклусот за да се прифати идентификација на програмата. Подигнете го за да ги намалите погрешните идентификации; намалете го ако програмите на вашата машина не се совпаѓаат. Стандардно 0.4 е конзервативна почетна точка.", - "label": "Праг за совпаѓање" - }, - "profile_unmatch_threshold": { - "doc": "Ако натпревар во живо од средината на циклусот падне под овој резултат, пробната идентификација се брише. Чувајте го малку под прагот на совпаѓање за краткото опаѓање во сличноста да не го врати екранот на неспоредлив.", - "label": "Праг за несовпаѓање" - }, - "progress_reset_delay": { - "doc": "По завршувањето, задржете го напредокот на 100% толку долго, така што „Завршено“ е видливо на контролните табли пред да се ресетира на „Неактивен“.", - "label": "Одложување на ресет на напредок" - }, - "pump_stuck_duration": { - "doc": "Секунди пумпата може да работи непрекинато пред да биде означена како евентуално заглавена (го активира настанот на заглавената пумпа).", - "label": "Времетраење за заглавена пумпа" - }, - "running_dead_zone": { - "doc": "Откако ќе започне циклусот, падовите на напојувањето во овој прозорец се игнорираат. Машините за перење се полнат со ладна вода (паѓа близу 0 W пред загревањето) - без оваа заштита, таа фаза на полнење изгледа како крај на циклусот. Ова НЕ ги прескокнува податоците: трагата на целосна моќност е снимена од T=0. Моторот за предлози ја мери вистинската шема за стартување на вашата машина и автоматски ја мери оваа големина.", - "label": "Мртва зона при работење" - }, - "sampling_interval": { - "doc": "Очекувано време помеѓу отчитувањата на сензорот - се користи за правилна големина на прозорецот за измазнување и правилно започнување на отскокнување. Секое ажурирање на сензорот се доловува без оглед на оваа вредност; ги калибрира само пресметките низводно. Моторот за предлози ја мери вистинската каденца на вашиот сензор од минатите циклуси и го поставува тоа автоматски.", - "label": "Интервал на земање примероци" - }, - "save_debug_traces": { - "doc": "Складирајте ја целосната трага на енергија и соодветните податоци за отстранување грешки за секој циклус. Корисно за решавање проблеми, но ја зголемува големината на складирањето.", - "label": "Зачувај траги за дебагирање" - }, - "smoothing_window": { - "doc": "Колку е измазнет сигналот за сирова моќност. Ниско (2) реагира, но бучно; високото (5) ги измазнува шила, но додава заостанување.", - "label": "Прозорец за изглавнување" - }, - "start_duration_threshold": { - "doc": "Напојувањето мора да остане над прагот на стартување толку долго за да се потврди вистинскиот почеток, спречувајќи ги прекинувачите за вклучување/исклучување во дел од секундата да започнат циклус.", - "label": "Времетраење на старт" - }, - "start_energy_threshold": { - "doc": "Енергија (моќност x време) апаратот мора да троши пред да РАБОТИ. Краток скок со висока моќност има многу мала енергија и се игнорира, спречувајќи лажни стартови.", - "label": "Старт енергија" - }, - "start_threshold_w": { - "doc": "Моќта мора да се искачи над ова ниво за да потврди дека циклусот започнал. Премногу ниско поставување предизвикува лажни стартувања од напојувањето во мирување; се пропуштаат премногу високи програми и бавно стартување (ладно полнење). Предлог моторот го поставува ова веднаш над забележаната најниска активна моќност на машината.", - "label": "Праг за почеток" - }, - "stop_threshold_w": { - "doc": "Напојувањето мора да падне под ова ниво пред да започне одбројувањето за исклучување. Поставете го под прагот за почеток - јазот меѓу нив е лентата за хистереза ​​што го спречува треперењето. Ако е поставено премногу високо, фазите со мала моќност (држење на плакнење, против туткање) лажно ја активираат крајната низа.", - "label": "Праг за стоп" - }, - "switch_entity": { - "doc": "Изборниот прекинувач се исклучува при пауза и повторно се вклучува при продолжување, што се користи заедно со „Паузата исто така го намалува напојувањето“.", - "label": "Ентитет на прекинувач" - }, - "watchdog_interval": { - "doc": "Колку често чуварот на заднина проверува дали има застојани сензори и изминати тајмаути. Стандардно 30 секунди.", - "label": "Интервал на чувар" - }, - "notify_milestone_message": { - "doc": "Порака за известувањето за пресвртница. Шаблонски променливи: {device}, {cycle_count}.", - "label": "Порака за пресвртница" - }, - "notify_milestones": { - "doc": "Броеви на циклуси одделени со запирки што активираат еднократно честитачко известување кога ќе се достигнат (пр. 50, 100, 500, 1000). Празно ги оневозможува известувањата за пресвртници.", - "label": "Пресвртници на циклуси" - }, - "notify_quiet_end_hour": { - "doc": "Крај на прозорецот „не вознемирувај“ (0-23). Задржаните известувања се испорачуваат во овој час. Оставете празно за да се оневозможи.", - "label": "Крај на тивки часови" - }, - "notify_quiet_start_hour": { - "doc": "Почеток на прозорецот „не вознемирувај“ (0-23). Известувањата за завршување, потсетниците и известувањата за чиста облека што би се активирале за време на тивките часови се задржуваат и се испорачуваат кога прозорецот ќе заврши. Оставете празно за да се оневозможи. Поддржува прозорци што ја преминуваат полноќ (пр. почеток во 22, крај во 7).", - "label": "Почеток на тивки часови" - }, - "peak_rate_message": { - "doc": "Изборен прилагоден текст за советот за врвна тарифа што се додава на известувањето при старт. Шаблонски променливи: {device}, {price}. Ако е празно, се користи вградената стандардна вредност.", - "label": "Порака за врвна тарифа" - }, - "peak_rate_threshold": { - "doc": "Кога ќе започне циклус и тековната цена по kWh е на или над оваа вредност, додади совет за врвна тарифа на известувањето при старт. 0 или празно го оневозможува советот.", - "label": "Праг за врвна тарифа (по kWh)" - }, - "dtw_bandwidth": { - "label": "Толеранција на совпаѓање по форма", - "doc": "Колку модулот за совпаѓање смее временски да го растегне циклусот за да одговара на формата на зачувана програма. Повисока вредност поднесува повеќе варијации во брзината; премногу висока ризикува да совпадне погрешна програма." - }, - "corr_weight": { - "label": "Тежина форма наспроти ниво", - "doc": "Рамнотежа помеѓу формата на кривата и апсолутното ниво на моќност при оценување на совпаѓањето. Повисока вредност дава предност на формата; пониска дава предност на согласувањето на нивото на моќност." - }, - "duration_weight": { - "label": "Тежина на времетраењето", - "doc": "Колку силно се претпочита програма чиешто типично времетраење се совпаѓа со овој циклус." - }, - "energy_weight": { - "label": "Тежина на енергијата", - "doc": "Колку силно се претпочита програма чијашто типична потрошувачка на енергија се совпаѓа со овој циклус." - }, - "store_brand": { - "label": "Бренд на уредот", - "doc": "Опционално. Брендот на уредот, избран од каталогот на заедницата. Се користи за наоѓање и споделување на соодветни референтни снимки. Оставете празно ако не ги користите онлајн функциите." - }, - "store_model": { - "label": "Модел на уредот", - "doc": "Опционално. Моделот на уредот, избран од каталогот на заедницата откако е поставен бренд. Ако вашиот модел не е на списокот, можете да го додадете во каталогот." - }, - "show_contributor": { - "doc": "Прикажи го името на соработникот на профилите преземени од продавницата на заедницата" - }, - "enable_phase_matching": { - "label": "Преостанато време според фазите", - "doc": "Го дели секој активен циклус на фази (загревање, перење, центрифугирање) и го распределува преостанатото време по фази, во комбинација со класичната проценка - потпирајќи се на распределбата по фази на почетокот на циклусот, а на класичната проценка кон крајот. Ова го прилагодува одбројувањето на тоа колку навистина се загрева и работи вашата машина, што е најзабележливо во првата половина од циклусот. Исклучено = само класичната проценка. Влијае само на приказот на преостанатото време; совпаѓањето на програми и откривањето на циклуси остануваат непроменети." - }, - "keep_min_score": { - "label": "Мин. резултат на совпаѓање", - "doc": "Минимален резултат на сличност потребен на кандидатот за да остане во трката на совпаѓање. Стандардната вредност 0,1 е намерно попустлива - прифаќа дури и слаби кандидати и се потпира на подоцнежните фази за наоѓање на најдоброто совпаѓање. Зголемете за порано отфрлање на малку веројатни профили; намалете за проширување на почетниот сет на кандидати." - }, - "dtw_blend": { - "label": "Мешање на деформација", - "doc": "Колку DTW резултатот на порамнување го заменува основниот резултат на Фаза 2. 0 = користи само резултат на Фаза 2, 1 = користи само DTW резултат, 0,5 (стандардно) = еднакво мешање. Зголемете за поголемо потпирање на warp порамнување кога програмите имаат слични нивоа на моќност но различни временски обрасци." - }, - "dtw_ensemble_w": { - "label": "Микс на комбинација DTW", - "doc": "Во комбинираниот DTW режим (стандардниот), тежина на скалиран L1 наспроти изводен DTW (DDTW). 1,0 = само скалиран L1, 0 = само DDTW, 0,7 = стандардно. Скалираната варијанта L1 ги споредува нивоата на моќност; изводната варијанта реагира на промените на моќноста низ времето. Комбинираниот режим ги спојува двете." - }, - "dtw_ddtw_scale": { - "label": "Скала на изводна деформација", - "doc": "Растојание на пол-заситување за оценување со изводен DTW. Резултатот се преполовува кога растојанието DDTW е еднакво на оваа вредност. Помало = поосетливо на разлики во форма. Стандардната вредност 30 е калибрирана за типични траги на моќност на домашни апарати. Влијае само на комбинираниот и ddtw режим на DTW." - }, - "dtw_refine_top_n": { - "label": "Број на прецизирани кандидати", - "doc": "Колку врвни кандидати на Фаза 2 DTW повторно ги оценува. DTW е поскап па се применува само за N најдобри кандидати. Стандардно 5. Зголемете (на 7-9) ако правилниот профил понекогаш достигнува само 4. или 5. место по Фаза 2 - DTW може да го спаси. Намалувањето малку го забрзува совпаѓањето." - }, - "duration_scale": { - "label": "Острина на траење", - "doc": "Острина на казната за несовпаѓање на траење во Фаза 4. Ова е лог-однос при кој резултатот на согласност се преполовува. Помал = построг: несовпаѓањето на траење повеќе го намалува резултатот. Стандардната вредност 0,175 одговара на толеранција на траење од околу 18% при пол-тежина. Употребувајте заедно со Тежината на траење." - }, - "energy_scale": { - "label": "Острина на енергија", - "doc": "Острина на казната за несовпаѓање на енергија во Фаза 4. Помал = построг: несовпаѓањето на енергија повеќе го намалува резултатот. Стандардната вредност 0,25 е намерно попустлива отколку Острината на траење бидејќи енергијата варира со оптоварувањето. Употребувајте заедно со Тежината на енергија." - } - }, - "setting_group": { - "auto_labeling": { - "label": "Автоматско означување" - }, - "cycle_end": { - "label": "Крај на циклус" - }, - "cycle_start": { - "label": "Почеток на циклус" - }, - "cycle_timers": { - "label": "Тајмери за циклус" - }, - "data_management": { - "label": "Управување со податоци" - }, - "debug": { - "label": "Дебагирање" - }, - "dishwasher_end": { - "label": "Крај на миење садови" - }, - "door_pause": { - "label": "Врата и пауза" - }, - "dtw_refinement": { - "label": "DTW прецизирање" - }, - "duration_gates": { - "label": "Порти за времетраење" - }, - "energy": { - "label": "Енергија" - }, - "external_end_trigger": { - "label": "Надворешен тригер за крај" - }, - "housekeeping": { - "label": "Одржување" - }, - "match_scoring": { - "label": "Бодување за совпаѓање" - }, - "messages": { - "label": "Пораки" - }, - "power_off": { - "label": "Исклучување на напојувањето" - }, - "predictive_end": { - "label": "Предвидливо завршување" - }, - "schedule": { - "label": "Распоред" - }, - "services": { - "label": "Услуги" - }, - "signal_processing": { - "label": "Обработка на сигналот" - }, - "thresholds_gap": { - "label": "Прагови и јаз" - }, - "timing": { - "label": "Тајмирање" - }, - "unload_reminder": { - "label": "Потсетник за истовар" - }, - "watchdog": { - "label": "Чувар" - }, - "quiet_hours_milestones": { - "label": "Тивки часови и пресвртници" - }, - "device_info": { - "label": "Информации за уредот" - }, - "basic_configuration": { - "label": "Основна конфигурација" - } - }, - "status": { - "active": "Активен", - "all_statuses": "Сите статуси", - "ambiguous": "Двосмислена", - "auto_detect": "Автоматско откривање", - "clear": "Јасно", - "completed": "Завршено", - "fine_tuning": "фино подесување сега…", - "force_stopped": "Силата запре", - "idle": "Неактивен", - "interrupted": "Прекинато", - "ready": "Подготвен за обработка", - "recording": "Снимање", - "training": "Обука…", - "saving": "Зачувување…", - "rebuilding": "Обновување…", - "analyzing": "Анализирање…", - "resetting": "Ресетирање…", - "reverting": "Враќање…", - "trimming": "Скратување…", - "splitting": "Разделување…", - "deleting": "Бришење…", - "imported": "Увезено" - }, - "tab": { - "advanced": "Напредно", - "diagnostics": "Дијагностика", - "history": "Циклуси", - "ml": "МЛ обука", - "pp_cleanup": "Чистење", - "pp_manage": "Управувај", - "pp_overview": "Преглед", - "pp_phases": "Фази", - "profiles": "Профили", - "settings": "Поставки", - "status": "Преглед", - "subtab_phase_catalog": "Фазен каталог", - "subtab_profiles": "Профили", - "maintenance": "Одржување", - "playground": "Песочник", - "store": "Продавница" - }, - "tag": { - "early_end": "Ран крај", - "late_start": "Задоцнет почеток", - "merged": "Споени циклуси", - "noise": "Бучава", - "sensor_gap": "Сензорска празнина", - "split": "Сплит циклус", - "wrong_profile": "Погрешен профил" - }, - "toast": { - "access_saved": "Контролата за пристап е зачувана", - "all_wiped": "Сите податоци се избришани", - "analysis_complete_none": "Анализата е завршена: нема нови предлози", - "auto_label_complete": "Автоматската етикета е завршена", - "automation_deleted": "Автоматизацијата е избришана", - "correction_submitted": "Исправката е поднесена", - "cycle_deleted": "Циклусот е избришан", - "cycle_force_stopped": "Циклусот со сила е запрен", - "cycle_labelled": "Циклус означен", - "cycle_paused": "Циклусот е паузиран", - "cycle_resumed": "Циклусот продолжи", - "cycle_trimmed": "Циклус скратен", - "cycles_merged": "Циклусите се споија", - "envelope_rebuilt": "Пликот повторно изграден", - "envelopes_rebuilt": "Пликовите повторно изградени", - "export_downloaded": "Преземено е извоз", - "feedback_all_dismissed": "Сите повратни информации се отфрлени", - "feedback_confirmed": "Повратните информации се потврдени", - "feedback_dismissed": "Повратните информации се отфрлени", - "group_deleted": "Групата е избришана", - "group_name_required": "Името на групата е потребно", - "group_saved": "Групата е зачувана", - "import_successful": "Увозот е успешен; интеграција повторно вчитување", - "json_required": "Потребни се податоци за JSON", - "legacy_removed": "Дејствата за наследство се отстранети", - "logs_exported": "Извезени дневници", - "matching_reverted": "Соодветните тежини се вратија на стандардни", - "min_2_profiles": "Изберете најмалку 2 профили за група", - "ml_training_no_improvement": "Обуката е завршена: основната линија е задржана (без подобрување)", - "models_reverted": "Моделите на уредот се вратија на основната линија", - "name_required": "Потребно е име", - "no_split_found": "Не се пронајдени празни празнини за да се подели", - "panel_settings_saved": "Поставките на панелот се зачувани", - "phase_name_required": "Потребно е име на фаза", - "phase_updated": "Фазата е ажурирана", - "phases_saved": "Фазите се зачувани", - "preferences_saved": "Поставките се зачувани", - "profile_name_required": "Потребно е името на профилот", - "profile_renamed": "Профилот е преименуван", - "recording_discarded": "Снимањето е отфрлено", - "recording_saved": "Снимката е зачувана на профилот", - "recording_started": "Снимањето започна", - "recording_stopped": "Снимањето прекина", - "review_saved": "Прегледот е зачуван", - "settings_conflicts": "Поправете ги означените конфликти во поставките пред зачувување.", - "settings_reverted": "Поставките се вратени; интеграција повторно вчитување", - "settings_saved": "Зачувани се поставките; интеграција повторно вчитување", - "suggestions_applied": "Применети предлози; интеграција повторно вчитување", - "suggestions_dismissed": "Предлозите се отфрлени", - "apply_failed": "Примената не успеа: {error}", - "delete_failed": "Бришењето не успеа: {error}", - "load_more_failed": "Не може да се вчита повеќе: {error}", - "maint_add_failed": "Не може да се додаде настан: {error}", - "maint_added": "Настанот за одржување е додаден", - "maint_delete_failed": "Не може да се избрише настанот: {error}", - "maint_deleted": "Настанот за одржување е избришан", - "relabel_done": "Повторно означени {count} циклуси", - "relabel_failed": "Повторното означување не успеа: {error}", - "reminders_save_failed": "Не може да се зачуваат потсетниците: {error}", - "reminders_saved": "Потсетниците за сервис се зачувани", - "pause_no_cycle": "Нема активен циклус за паузирање", - "resume_no_cycle": "Нема паузиран циклус за продолжување", - "delete_partial_failed": "Некои ставки не можеа да се избришат и беа вратени", - "pg_run_gone": "Тоа извршување повеќе не е достапно.", - "task_cancelled": "Откажано.", - "processed": "Обработено {bits}", - "processed_cycles": "{n} циклуси", - "processed_suggestions": "{n} предлози", - "processed_models": "{n} активирани модели", - "store_search_failed": "Пребарувањето не успеа: {error}", - "store_connect_failed": "Поврзувањето не успеа: {error}", - "store_connected": "Поврзано со продавницата на заедницата", - "store_disconnected": "Прекината врска со продавницата на заедницата", - "store_error": "Грешка: {error}", - "store_unavailable": "Продавницата на заедницата не е достапна.", - "store_pick_profile": "Изберете профил во кој да се спои", - "store_name_required": "Внесете име на профил", - "store_import_failed": "Увозот не успеа: {error}", - "store_imported": "Увезено во {profile}", - "store_program_required": "Внесете име на програма", - "store_no_appliance": "Прво поставете го брендот и моделот на уредот во поставките.", - "store_share_failed": "Споделувањето не успеа: {error}", - "store_shared": "Споделено во продавницата на заедницата, чека преглед.", - "appliance_added": "Уредот е додаден, чека одобрување", - "thanks_confirming": "Благодариме за потврдата", - "device_approved": "Одобрено од заедницата", - "rating_saved": "Оцената за квалитет е зачувана", - "brand_added": "Брендот е додаден, чека одобрување", - "profile_added": "Профилот е додаден, чека одобрување", - "saved_except_conflicts": "Поставките се зачувани -- {n} поставка{s} прескокната поради конфликти", - "share_device_none_sel": "Изберете барем една програма за споделување", - "store_device_downloaded": "Поставките на уредот се преземени: {created} профил{c} создаден, {dup} веќе постоеше", - "store_device_downloaded_phases": "Поставките на уредот се преземени: {created} профил{c} создаден, {dup} веќе постоеше, картата на фазите е применета", - "store_device_downloaded_settings": "Поставките на уредот се преземени: {created} профил{c} создаден, {dup} веќе постоеше, поставките се применети", - "store_device_shared": "Поставките на уредот се споделени: {n} програм{s} прикачена", - "store_device_shared_all_dup": "Нема ништо ново за споделување -- сите програми веќе постојат во продавницата", - "store_device_shared_partial": "Делумно споделување: {n} програм{s} прикачена, {failed} прескокнато", - "store_device_shared_some_dup": "Поставките на уредот се споделени: {n} програм{s} прикачена ({dup} веќе постоеше)", - "store_download_failed": "Неуспешно преземање: {error}", - "store_download_nothing": "Нема ништо за преземање -- сите профили веќе постојат на овој уред", - "export_selective_done": "Извозот е преземен", - "import_selective_done": "Увезени се {profiles} профил(и) и {cycles} циклус(и)" - }, - "suggestion": { - "both_agree": "WashData препорачува", - "calibrated_label": "Калибрирано", - "observed_label": "Набљудувано", - "impact": { - "auto_label_confidence": { - "higher": "Автоматски означува помалку циклуси; повеќе одат на преглед", - "lower": "Автоматски означува повеќе циклуси; некои може да бидат погрешно идентификувани" - }, - "duration_tolerance": { - "higher": "Прифаќа поширок опсег на траење – пофлексибилно поврзување", - "lower": "Бара поточно совпаѓање на траење – построго, но може да ги отфрли невообичаените циклуси" - }, - "end_energy_threshold": { - "higher": "Затвора само циклуси со значителна потрошувачка на енергија", - "lower": "Затвора и пократки или понискоенергетски циклуси" - }, - "end_repeat_count": { - "higher": "Бара сигналот за крај да се повтори повеќе пати – посигурно, малку побавно", - "lower": "Завршува по помалку повторувања – побрзо откривање, поголем ризик од лажен крај" - }, - "learning_confidence": { - "higher": "Учи само од многу сигурни совпаѓања – побавно, но посигурно", - "lower": "Учи од повеќе циклуси; моделот може да биде позашумен" - }, - "min_off_gap": { - "higher": "Потребен е подолг период на неактивност пред нов циклус", - "lower": "Краток период на неактивност стартува нов циклус – последователните работи може да се поделат" - }, - "min_power": { - "higher": "Помалку чувствителен на фонска потрошувачка; може да ги пропушти тивките програми", - "lower": "Почувствителен; може да ја регистрира потрошувачката во режим на мирување како активност" - }, - "no_update_active_timeout": { - "higher": "Повеќе време пред прогласување на заглавен циклус", - "lower": "Принудно запира заглавен циклус побрзо" - }, - "off_delay": { - "higher": "Повеќе време за паузи на уредот – управува со долго натопување или сушење", - "lower": "Побрзо откривање на крај – добро за уреди со јасно вкл./искл." - }, - "profile_match_threshold": { - "higher": "Потврдува само совпаѓања со висока сигурност; повеќе циклуси остануваат без ознака", - "lower": "Поврзува повеќе циклуси; некои може да бидат малку погрешни" - }, - "running_dead_zone": { - "higher": "Ги игнорира кратките скокови на моќност во неактивност – помалку чувствителен на шум", - "lower": "Реагира на пократки наплив на моќност – ги фаќа брзите преодни активности" - }, - "start_threshold_w": { - "higher": "Избегнува лажни стартови од кратковремени скокови на моќност", - "lower": "Ги фаќа програмите со мала моќност; може да се активира на шум" - }, - "stop_threshold_w": { - "higher": "Го завршува циклусот побрзо – може да затвори за време на пауза", - "lower": "Чека подолго за завршување – помалку предвремени завршувања" - }, - "watchdog_interval": { - "higher": "Дозволени подолги тивки фази; помалку лажни принудни запирања", - "lower": "Поагресивно ги фаќа заглавените циклуси" - } - }, - "reason": { - "auto_label_confidence": "Доверба на 15-от перцентил за {cycles} автоматски ознаки што корисникот никогаш не ги коригирал ({p15}).", - "completion_min_seconds": "Половина од траењето на чист циклус p05 ({minutes} min) низ {cycles} циклуси; ги филтрира лажните циклуси.{excl}", - "dead_zone_batch": "Задржано кратко (медијана на прозорецот на нестабилност при стартување низ {cycles} циклуси = {s}s) за вистинскиот крај да се препознае брзо.", - "dead_zone_from_dip": "Врз основа на ран пад на моќноста откриен на {s}s.", - "end_energy_default": "Препорачана појдовна вредност по стандард за прагот на шум на крајот на циклусот.", - "end_energy_false": "Енергија при лажен крај p95 ({p95}Wh) низ {cycles} циклуси, со долна граница од 0,2 % од медијаната на енергијата на циклусот ({floor}Wh).", - "end_energy_no_false": "Нема лажни краеви низ {cycles} циклуси; со долна граница од 0,2 % од медијаната на енергијата на циклусот ({floor}Wh).", - "end_repeat_count": "{false}/{total} чисти циклуси ({pct}%) имале внатрешна пауза подолга од 60s што продолжила; барај {val} потврда(и) за крај.", - "learning_confidence": "Доверба p05 на {cycles} циклуси означени од корисникот ({p05}); под оваа вредност барај проверка.", - "match_interval": "Врз основа на забележаната зачестеност на ажурирање (медијана={median}s) * 10.", - "max_duration_ratio": "Врз основа на траењата на означените циклуси (p95={p95}).", - "min_active": "Врз основа на минималната работна моќност ({min}W) забележана во последниот циклус.", - "min_duration_ratio": "Задржано што е можно пониско за програмата да се препознае рано во циклусот; праговите на доверба и двосмисленост спречуваат прерани потврди.", - "min_off_gap": "Врз основа на {gaps} забележани интервали меѓу циклусите (p05={p05}s). Долна граница на уредот: {floor}s.", - "min_power": "40 % од најниската работна моќност p05 ({p05}W) низ {cycles} чисти циклуси, за прагот на исклучување да остане под реалната потрошувачка.{excl}", - "ml_auto_label": "Најниската доверба што моделот за квалитет сепак ја оценил како чиста (p10 од {cycles} чисти циклуси = {p10}).", - "ml_end_repeat": "{false}/{total} циклуси ({pct}%) имале пауза што детекторот за крај ја оценил над 50 %; барај {val} потврда(и) за крај.", - "ml_off_delay": "Паузи потврдени од детекторот за крај: p95 {p95}s + 60s резерва, од {pauses} паузи проверени од моделот низ {cycles} циклуси (долна граница {floor}s).", - "no_update_timeout": "Врз основа на забележаната зачестеност на ажурирање (p95={p95}s) * 20 (мин. 60s).", - "off_delay_cadence": "Врз основа на забележаната зачестеност на ажурирање (p95={p95}s) * 5", - "off_delay_device_floor": "Употребен е безбеден минимум специфичен за уредот {device} ({floor}s).", - "off_delay_generic_floor": "Употребен е општ безбеден минимум ({floor}s).", - "off_delay_pauses": "Димензионирано да ги надживее вистинските паузи: пауза во рамките на циклусот p95 {p95}s + 60s резерва, од {pauses} паузи низ {cycles} чисти циклуси (долна граница {floor}s).", - "profile_match_threshold": "Доверба p10 на {cycles} точни автоматски ознаки ({p10}); безбедна долна граница за потврда во живо.", - "sampling_interval": "Медијана на интервалот на ажурирање забележана низ {cycles} чисти циклуси ({si}s).{excl}", - "smoothing_window": "Димензионирано да измазни ~30s отчитувања при семплирање од {si}s ({samples} примероци).", - "start_duration": "Задржано кратко (~еден интервал на семплирање од {si}s) за детекцијата да започне што е можно порано, а сепак да ги игнорира поединечните скокови.", - "thr_batch": "Задржано веднаш над најниската работна моќност p05 низ {cycles} циклуси ({p05}W) за стартот да се фати што е можно порано, а прагот на запирање да остане под најниската работна моќност на машината.", - "tol_per_profile": "p75 на варијансата на траењето по профил низ {profiles} профили ({cycles} циклуси); доследните профили не се казнуваат.", - "tol_pooled": "Врз основа на здружената варијанса на траењето на {cycles} неодамнешни означени циклуси (p95 отстапување={dev}).", - "watchdog": "Задржано што е можно пониско додека е безбедно (3x интервалот на ажурирање p95 од {p95}s, мин. 30s) за застоите брзо да се фатат без лажни запирања." - }, - "exclusions": { - "summary": "Исклучени се {total} погрешно откриени циклуси: {parts}.", - "reason": { - "force_stopped": "присилно запрени", - "interrupted": "прекинати", - "incomplete": "нецелосни", - "noise": "бучава", - "unlabeled": "без етикета", - "no_trace_short": "премногу кратки за анализа", - "high_start": "започнати при висока моќност", - "abrupt_end": "нагло завршени", - "mid_restart": "рестарт среде циклус", - "no_power": "без моќност", - "no_active_power": "без активна моќност" - } - } - }, - "trend": { - "down": "Во тренд надолу", - "up": "Во тренд нагоре" - }, - "maint": { - "bearing_service": "Сервис на лежишта", - "descale": "Отстранување на бигор", - "drum_clean": "Исчисти го барабанот", - "filter_clean": "Исчисти го филтерот", - "other": "Друго" - }, - "pg_desc": { - "completion_min_seconds": "Најкратко извршување што се смета за вистински циклус", - "end_repeat_count": "Ниски отчитувања по ред пред завршување", - "interrupted_min_seconds": "Кратки циклуси означени како прекинати", - "min_off_gap": "Празнина потребна за раздвојување на два циклуси", - "off_delay": "Секунди ниска моќност пред крајот на циклусот", - "start_duration_threshold": "Секунди над прагот за потврда на стартот", - "start_threshold_w": "Минимум вати за да се смета за започнато", - "stop_threshold_w": "Под ова, машината се смета за исклучена", - "anti_wrinkle_enabled": "Апсорбирајте ги импулсите на превртување на барабанот по главната фаза, наместо да ги читате како нови циклуси", - "anti_wrinkle_exit_power": "Моќноста меѓу импулсите мора да падне под ова за режимот против брчки да остане активен", - "anti_wrinkle_idle_timeout": "Дозволена тишина меѓу два импулса на превртување на барабанот пред режимот против брчки да заврши", - "anti_wrinkle_max_duration": "Импулс подолг од ова го завршува режимот против брчки и отвора нов циклус", - "anti_wrinkle_max_power": "Импулс над ова го завршува режимот против брчки и отвора нов циклус", - "dtw_bandwidth": "Фаза 3: warp лента на Sakoe-Chiba (0 = DTW исклучен; стандардно 0,2 = 20% од должината на циклусот)", - "corr_weight": "Фаза 2: рамнотежа помеѓу обликот на кривата (корелација) и нивото на моќност (MAE); стандардно 0,45", - "duration_weight": "Фаза 4: колку силно согласноста на траење влијае на конечниот резултат (стандардно 0,22)", - "energy_weight": "Фаза 4: колку силно согласноста на енергија влијае на конечниот резултат (стандардно 0,22)", - "profile_match_min_duration_ratio": "Фаза 1: минимална должина на циклус како дел од траењето на профилот; стандардно 0,1 (10%)", - "profile_match_max_duration_ratio": "Фаза 1: максимална должина на циклус како дел од траењето на профилот; стандардно 1,5 (150%)", - "keep_min_score": "Фаза 2: минимален резултат за останување во трката; стандардно 0,1 прифаќа слаби совпаѓања, подоцнежните фази го избираат најдоброто", - "dtw_blend": "Фаза 3: 0 = само основен резултат, 1 = само DTW резултат, 0,5 = еднакво мешање (стандардно)", - "dtw_ensemble_w": "Фаза 3 (комбиниран режим): тежина на скалиран L1 наспроти изводен DTW; стандардно 0,7 ги фаворизира нивоата", - "dtw_ddtw_scale": "Фаза 3: растојание на пол-заситување на DDTW; помало = поосетливо на форма (стандардно 30)", - "dtw_refine_top_n": "Фаза 3: кандидати кои DTW повторно ги оценува; зголемете на 7-9 ако правилниот профил заземе 4.-5. место (стандардно 5)", - "duration_scale": "Фаза 4: лог-однос каде согласноста на траење се преполовува; помал = построга казна (стандардно 0,175)", - "energy_scale": "Фаза 4: лог-однос каде согласноста на енергија се преполовува; помал = построга казна (стандардно 0,25)" - }, - "col": { - "profile_tip": "Име на совпаднатата програма. „Неозначено“ значи дека на крајот на циклусот не се совпадна ниту еден профил.", - "status_tip": "Исход на циклусот: Завршен (природен крај), Прекинат (нагло паѓање на моќноста), Присилно стопиран (рачно) или Треба преглед (се чека повратна информација).", - "date_tip": "Датум и време кога започна циклусот.", - "duration_tip": "Вкупно време на извршување на циклусот од почеток до крај.", - "energy_tip": "Вкупно потрошена енергија (kWh). Се пресметува со интегрирање на моќноста во текот на времето.", - "cost_tip": "Цена на енергијата за овој циклус, замрзната при завршување со тогаш важечката цена (енергија × цена по kWh). Поставете цена во Поставки за да се пополни.", - "confidence_tip": "Доверба на совпаѓањето на профилот (0–100%). Колку прецизно кривата на моќноста на циклусот се совпадна со идентификуваната програма.", - "health_tip": "ML здравје на циклусот (повисоко = подобро). Кликнете на циклус за да го инспектирате и прегледате.", - "flags_tip": "Ознаки на заедницата и показатели за квалитет на податоците" - }, - "stat": { - "avg": "просек", - "min": "мин {v}", - "max": "макс {v}", - "consistency": "постојаност ±{v}", - "total": "вкупно {v}", - "last_run": "последно извршување {v}", - "score": "оценка {pct}%", - "duration_cv": "CV на времетраењето {pct}%", - "avg_confidence": "просечна доверба {pct}%" - }, - "pg_evd": { - "detected": "Детекторот препозна дека циклусот започнал.", - "match_commit": "Механизмот за совпаѓање избра програма со доволна сигурност.", - "match_changed": "Водечката програма се промени како се гледаше поголем дел од циклусот.", - "match_ambiguous": "Две програми добија блиски резултати, па совпаѓањето беше несигурно.", - "unmatched": "Ниту една зачувана програма не одговараше на овој циклус.", - "notify_start": "Ќе се испратеше известување за стартување.", - "notify_pre_complete": "Ќе се испратеше известување дека циклусот е речиси завршен.", - "notify_finish": "Ќе се испратеше известување за завршување.", - "notify_milestone": "Ќе се испратеше известување за пресвртница.", - "notify_held": "Известувањето беше задржано поради тивките часови.", - "finished": "Циклусот достигна крајна состојба и заврши." - }, - "store": { - "browse": "Прелистување", - "device": "Уред", - "favorites": "Омилени", - "search_ph": "Пребарување по бренд или модел…", - "no_results": "Не се пронајдени соодветни уреди. Обидете се со друго пребарување.", - "n_programs": "{n} програми", - "n_cycles": "{n} циклуси", - "no_programs": "Сè уште нема споделени програми за овој уред.", - "no_cycles": "Сè уште нема споделени референтни циклуси за оваа програма.", - "anon": "анонимен", - "uploaded_by": "Споделено од {name}", - "connected_as": "Поврзан како {name}", - "not_connected": "Не сте поврзани. Поврзете сметка на GitHub за да ги споделувате вашите циклуси.", - "import_new": "Нов профил", - "import_merge": "Спој со постоен", - "merge_target": "Спој во профил", - "description": "Опис (опционално)", - "contributed_by": "од {name}", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "Сè уште нема оцени", - "website": "Веб-страница на продавницата ↗", - "website_tip": "Отвори ја веб-страницата на продавницата на заедницата" - }, - "settings": { - "gear": { - "title": "Поставки" - } - }, - "link": { - "manual": "Прирачник ↗", - "add_appliance": "Додајте го вашиот уред" - }, - "tip": { - "add_brand": "Брендот го нема на списокот? Додајте го во каталогот на заедницата", - "add_appliance": "Моделот го нема на списокот? Додајте го вашиот уред во каталогот на заедницата", - "add_profile": "Додајте профил за овој уред на сајтот на заедницата" - }, - "task": { - "reprocess": { - "matching": "Повторна обработка: совпаѓање на циклуси", - "golden": "Повторна обработка: пополнување референтни", - "suggestions": "Повторна обработка: предлози", - "ml_training": "Повторна обработка: МЛ обука", - "health": "Повторна обработка: здравје на циклусите" - }, - "pg_sweep": { - "optimize": "Оптимизирање: {param}" - }, - "pg_detail": { - "simulate": "Симулирај циклус" - }, - "split": { - "apply": "Разделување на циклус" - }, - "trim": { - "apply": "Отсекување на циклус" - }, - "merge": { - "apply": "Спојување на циклуси" - }, - "rebuild": { - "envelopes": "Повторно градење на обвивки" - } - }, - "setup": { "hdr": { - "card": "Поставување на уред", - "healthy_chip": "Поставувањето е завршено" + "ab_comparison": "Споредба на поставки A/B", + "access_control": "Контрола на пристап", + "add_maintenance": "Додади настан за одржување", + "automation_delete": "Избришете ја оваа автоматизација", + "automation_needs_review": "Овој циклус бара преглед", + "automation_open": "Отворете во уредникот за автоматизација", + "automation_review_this_cycle": "Прегледајте го овој циклус", + "automations": "Автомати", + "clear_debug": "Исчистете ги трагите за отстранување грешки", + "cycle_simulator": "Симулатор на циклуси", + "diagnostics_pref": "Дијагностика", + "display": "Приказ", + "dtw_inspector": "DTW инспектор", + "export_import": "Извоз / увоз", + "getting_started": "Започнување", + "live_power": "Жива моќ", + "logs": "Дневници", + "logs_diagnostics": "Дијагностика", + "maintenance": "Акции за одржување", + "maintenance_log": "Дневник за одржување", + "maintenance_reminders": "Потсетници за сервис", + "manual_recording": "Рачно снимање", + "manual_recording_tip": "Намерно стартувајте циклус додека WashData ја снима трагата на моќноста. Стартувајте непосредно пред почетокот на апаратот, запрете кога ќе заврши, па Обработете за да го зачувате како именуван профил.", + "ml_learned": "Што научи WashData", + "ml_matching_tuning": "Фино подесување што одговара на програмата", + "ml_settings_card": "Поставки", + "ml_smart_learning": "Паметно учење", + "my_preferences": "Мои преференции", + "no_automations": "Сè уште нема автоматизација на овој уред.", + "panel_settings": "Поставки на панелот", + "param_sweep": "Прочешлување на параметар", + "pg_settings_source": "Извор на поставките", + "phase_catalog": "Фазен каталог", + "playground": "Песочник", + "process_history": "Историја на процесот", + "settings_history": "Историја на поставки", + "status": "Статус", + "status_graph": "График на статус", + "storage_stats": "Статистика за складирање", + "test_history": "Проверка врз историјата", + "toggle_sidebar": "Вклучете ја страничната лента на Home Assistant", + "tools_and_data": "Алатки и податоци", + "wipe_history": "Избришете ја историјата", + "recommendations": "Препораки ({n})", + "pg_detection_params": "Поставки за откривање", + "pg_timeline": "Хронологија на настани", + "pg_outcome": "Резултат од симулацијата", + "pg_across_cycles": "Низ сите ваши циклуси", + "community_store": "Продавница на заедницата", + "online_account": "Продавница на заедницата и онлајн функции" }, - "phase0": { - "washer": "WashData веќе ги открива вашите циклуси. Снимете го првиот циклус за да ги овозможите имињата на програмите и проценките на времето.", - "dishwasher": "WashData набљудува. Машините за миење садови имаат сложени циклуси – снимањето на првиот циклус е изразито препорачано. Ако открит циклус трае предолго, користете го уредувачот на циклуси за скратување пред зачувување како профил.", - "generic": "WashData набљудува. Снимете или означете откриен циклус за да започнете со градење профили." + "health": { + "fair": "Прифатлив квалитет на профилот", + "good": "✓ Добар квалитет на профилот", + "poor": "⚠ Лош квалитет на профилот" }, - "phase1a": { - "labelled": "Добар почеток – вашата прва програма е зачувана. За најчисти податоци, размислете за снимање на следниот циклус со додатокот за снимање." + "lbl": { + "actions": "Акции", + "activity": "Активност", + "administrators": "Администраторите", + "aria_compare_chart": "Графикон за споредба на циклуси", + "aria_cycle_chart": "Крива на моќта на циклусот", + "aria_envelope_chart": "Графикон на обвивката на моќта на профилот", + "aria_phase_chart": "Графикон на уредувачот на фази", + "aria_playground_chart": "Крива на моќта на циклусот со подвижни прагови на детекција", + "aria_power_chart": "Графикон на потрошувачка на моќ", + "aria_spaghetti_chart": "Преклопени криви на моќта на циклусите", + "aria_sweep_chart": "Графикон со резултати од скенирање на параметри", + "artifact_anomaly": "Аномалија", + "artifact_high_power": "Висока моќ", + "artifact_interruption": "Прекин", + "artifact_low_power": "Ниска моќ", + "auto_detect": "Автоматско откривање", + "auto_fine_tune_off": "автоматско фино исклучување", + "auto_fine_tune_on": "автоматско фино подесување вклучено (околу {hour}:00)", + "avg_cost": "Просечна цена", + "change": "Промена", + "clock_time": "Време на часовникот", + "cohesion_good": "кохезија {pct}%", + "cohesion_low": "⚠ ниска кохезија {pct}%", + "compare_profiles": "Споредете со профили", + "concurrency": "Паралелност", + "confidence": "Доверба", + "confidence_threshold": "Праг на доверба", + "correct_duration": "Точно времетраење (мин., изборно)", + "correct_profile": "Точен профил", + "correlation": "Корелација", + "cost": "Цена", + "create_new_profile": "+ Направете нов профил…", + "current_phase": "Тековна фаза", + "curves": "Криви", + "cycle": "Циклус", + "cycle_date_display": "Приказ на датум на циклус", + "cycle_health": "Здравје на циклусот", + "cycle_index": "индекс на циклус →", + "cycles": "Циклуси", + "cycles_count": "Циклуси", + "cycles_lc": "циклуси", + "dashed": "испрекината", + "date": "Датум", + "debug_traces": "Дебагирање траги", + "default": "Стандардно", + "default_access_level": "Стандардно ниво за корисници кои не се наведени подолу", + "default_other": "Стандардно (други уреди)", + "default_tab": "Стандардна картичка при отворање на панелот", + "font_size": "Големина на фонт на панелот", + "delta": "Δ", + "description": "Опис", + "dtw_blend_w": "Тежина на мешање", + "dtw_blended": "Мешана оценка", + "dtw_ddtw": "DDTW оценка", + "dtw_l1": "L1 оценка", + "dtw_matched_profile": "(совпаднат профил на циклусот)", + "duration": "Времетраење", + "duration_agreement": "Согласување на времетраење", + "emphasis": "Нагласување", + "enable_access_control": "Овозможи контрола на пристап по корисник", + "energy": "Енергија", + "energy_agreement": "Согласување на енергија", + "event_timeline": "Временска линија на настани", + "event_type": "Тип на настан", + "expected": "Очекувано", + "expected_duration": "Очекувано времетраење (мин.)", + "file_kb": "Датотека (kB)", + "final_score": "Конечна оценка", + "from": "Од", + "gap_s": "Јаз (и)", + "group_name": "Назив на групата", + "head_trim": "Намалување на главата (и)", + "health": "Здравје", + "hide_tabs": "Скриј јазичиња за не-администратори", + "in_use": "Во употреба", + "json_data": "JSON податоци", + "label": "Совпаден програм", + "last": "Последни", + "last_checked": "Последно проверено:", + "load_from_file": "Вчитај од датотека", + "mae_score": "MAE оценка", + "manual_duration": "Рачно времетраење (мин., изборно)", + "match": "Совпаѓање", + "members": "Членови", + "metric": "Метрика", + "mode_existing_profile": "Додај во постоечкиот профил", + "mode_new_profile": "Креирај нов профил", + "models_fine_tuned": "({count} модел{plural} дотерани)", + "n_classic_suggestions": "{n} класично", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} избрани", + "n_tuning_suggestions": "{n} предлог за подесување", + "na": "н/д", + "new_profile_name": "Ново име на профил", + "notes": "Забелешки", + "of": "од", + "outcome": "Исход", + "panel_default_tab": "Стандардна картичка", + "panel_language": "Јазик на таблата", + "per_cycle_short": "циклус", + "pg_autofill_tip": "Автоматско пополнување на опсегот од тековната вредност ({lo}–{hi})", + "pg_best_value": "Пронајдена најдобра вредност", + "pg_current_value": "Тековна вредност:", + "pg_drag_hint": "Влечете ја линијата на графиконот", + "pg_dtw": "DTW", + "pg_ev_ending": "Завршување", + "pg_ev_running": "Работи", + "pg_group_advanced": "Гранични случаи", + "pg_group_detection": "Тригери за откривање", + "pg_group_timing": "Правила за време", + "pg_idle": "Неактивен", + "pg_anti_wrinkle": "Против брчки", + "pg_last_run": "Последно извршување: {date}", + "pg_match_score": "Оценка на совпаѓање", + "pg_pct_of": "{p}% од {total}", + "pg_poor_match": "Лошо совпаѓање", + "pg_preset": "Конфигурација на песочникот", + "pg_preset_name": "Име на новата конфигурација", + "pg_preset_none": "Изберете конфигурација…", + "pg_strong_match": "Силно совпаѓање", + "pg_tile_ambiguous": "Двосмислени", + "pg_tile_ambiguous_tip": "Циклуси со речиси изедначено совпаѓање меѓу две програми", + "pg_tile_detected": "Откриени", + "pg_tile_detected_tip": "Циклуси каде што моќноста го надмина прагот за старт доволно долго за да се регистрира како работа", + "pg_tile_matched": "Совпаднати", + "pg_tile_matched_tip": "Циклуси правилно припишани на позната програма", + "pg_time_left": "Преостанато време", + "pg_weak_match": "Слабо совпаѓање", + "phase_name": "Име", + "phase_timeline": "Временска линија на фази", + "power": "Моќ", + "profile": "Профил", + "profile_index": "индекс на профил →", + "profile_name": "Име на профилот", + "program": "Програма", + "program_tip": "Заменете го профилот кој е поврзан со тековниот циклус. Автоматското откривање му овозможува на интеграцијата автоматски да го избере најдоброто совпаѓање. Закачете одреден програм за принудно совпаѓање кога автоматското откривање е погрешно или знаете што работи.", + "progress": "Напредок", + "raw_socket": "Суров приклучок", + "read_only": "Само за читање", + "ref_cycle": "Референтен циклус (опционално)", + "refresh_interval": "Интервал (и) на освежување", + "remaining": "Преостанати", + "reminder_every": "Потсети на секои (циклуси)", + "remove_label": "- Отстрани ја етикетата -", + "rename_profile": "Преименувајте го профилот", + "replay_duration": "Репродукција", + "resulting_profile": "Резултат на профилот", + "save_mode": "Режим за зачувување", + "score": "Оценка", + "score_breakdown": "Разложување на оценката", + "seconds_from_start": "Секунди од почеток", + "select_profile": "Изберете Профил", + "setting": "Поставка", + "settings_a": "Поставки A (тековни)", + "settings_a_short": "A", + "settings_advanced": "Напредно", + "settings_b": "Поставки B (тест)", + "settings_b_short": "B", + "settings_basic": "Основно", + "settings_detail_level": "Ниво на детали на поставките", + "settings_overrides": "Заменети поставки", + "show_debug": "Прикажи картичка за отстранување грешки во живо на натпреварот на страницата Статус (доверба, нејасност, најдобри кандидати)", + "show_expected": "Прикажи очекувано преклопување на кривата (совпаднат профил, портокалова)", + "show_raw": "Прикажи прекинувач за необработени отчитувања на приклучокот во живиот графикон на моќноста", + "sparkline": "Неодамнешен тренд на времетраење на циклусите", + "stage2": "Етапа 2 – основна сличност", + "stage3": "Етапа 3 – DTW", + "stage4": "Етапа 4 – согласување", + "status": "Статус", + "tail_trim": "Намалување на опашката (и)", + "timer_auto_pause": "Автоматска пауза", + "timer_min": "мин", + "timer_msg_placeholder": "Порака (изборно, {device}/{program}/{minutes})", + "to": "До", + "ungrouped": "Негрупирани", + "unlabelled": "Неозначено", + "unlabelled_paren": "(неозначен)", + "warp_path": "Патека на порамнување", + "input": "Влез:", + "start": "Почеток", + "end": "Крај", + "unit_s": "(с)", + "reviewed_on": "прегледано {date}", + "unknown": "Непознато", + "quality": "Квалитет", + "tags": "Ознаки", + "at": "во", + "pct_match_confidence": "{pct}% доверба на совпаѓањето", + "ha_restarted": "HA рестартиран", + "from_start": "Од почеток", + "to_end": "До крај", + "click_to_select": "кликнете за да изберете", + "envelope": "Плико", + "zoom_hint": "скролувајте за зумирање · двоен клик за ресетирање", + "loading_paren": "(вчитување…)", + "time_remaining": "~{v} преостанато", + "no_duration": "нема времетраење", + "duration_avg": "~{v}м просек", + "name_placeholder": "(име)", + "n_shown": ", прикажани {n}", + "cycles_title": "Циклуси ({n})", + "pg_detecting": "Откривање", + "pg_best_marker": "Најдобро: {v}", + "pg_time_left_model": "Преостанато време (модел)", + "pg_time_left_model_tip": "Проценка на преостанатото време од моделот (проценувач на фази + ML), а не статичко одбројување", + "phase": "Фаза", + "pg_mode_simulate": "Симулација", + "pg_mode_history": "Тест врз историја", + "pg_mode_sweep": "Пребарување", + "pg_ev_detected": "Откриено", + "pg_ev_match": "Совпаѓањето е прифатено", + "pg_ev_match_changed": "Совпаѓањето е променето", + "pg_ev_ambiguous": "Двосмислено", + "pg_ev_unmatched": "Без совпаѓање", + "pg_ev_notify_start": "Известување за старт", + "pg_ev_notify_pre": "Известување „речиси готово“", + "pg_ev_notify_finish": "Известување за завршување", + "pg_ev_notify_milestone": "Известување за пресвртница", + "pg_ev_notify_held": "Известувањето е задржано (тивки часови)", + "pg_ev_finished": "Завршено", + "pg_ended": "Заврши", + "pg_proj_energy": "Прогн. енергија", + "pg_alert_overrun": "Подолго од вообичаено", + "pg_alert_underrun": "Пократко од вообичаено", + "pg_alert_did_not_finish": "Не заврши", + "pg_alert_false_end": "Поделен на повеќе циклуси", + "pg_alert_unmatched": "Без совпаѓање", + "pg_alert_ambiguous": "Двосмислено совпаѓање", + "pg_alert_energy": "Аномалија во енергијата", + "pg_newly_correct": "стана точно", + "pg_regressed": "се влоши", + "pg_end_timing_changed": "времето на завршување се промени", + "pg_vs_current": "наспроти тековното", + "pg_fixed": "поправено", + "pg_broke": "се расипа", + "pg_sweep_param": "Параметар", + "pg_objective": "Цел", + "pg_steps": "Чекори", + "pg_sweep_2d": "2D топлинска карта", + "pg_sweep_param_y": "2-ри параметар", + "pg_obj_match": "Точност на совпаѓања", + "pg_obj_endtiming": "Точност на завршување", + "pg_obj_falseend": "Стапка на лажни завршувања", + "pg_obj_overrun": "Отстапување во траење", + "pg_obj_ambiguity": "Стапка на двосмисленост", + "pg_best_combo": "најдобра комбинација", + "pg_mode_optimize": "Оптимизирај", + "pg_group_matching": "Совпаѓање на програми", + "pg_zoom_hint": "двоен клик го ресетира зумот", + "aria_playground_chart2": "Интерактивен график на моќноста на циклусот: посочете за да видите време/моќност, лизгајте за зумирање, влечете за поместување", + "pg_alert_timeout_end": "Завршено поради истек на времето, а не според предвидување", + "pg_alert_indefinite": "Би работел бесконечно", + "pg_alert_stress_cap": "Достигнат заштитен лимит", + "pg_alert_stress_ok": "Откривање на мирување: циклусот е запрен", + "pg_alert_stress_warn": "Потрошувачката во мирување е над прагот за запирање", + "pg_stress_group": "Тест на откривање на мирување", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "Ниво на мирување (W)", + "pg_stress_idle_w_desc": "Замени го автоматски откривениот минимален праг на потрошувачка во режим на мирување (оставете празно за автоматско откривање).", + "pg_stress_toggle": "Тестирај откривање на мирување", + "pg_stress_toggle_desc": "Симулира дека уредот останува при потрошувачката во режим на мирување по завршувањето на снимањето -- прикажува дали и кога WashData ќе го запре циклусот.", + "task_pg_history": "Тест на историја", + "task_pg_sweep": "Оптимизирај", + "task_reprocess": "Повторна обработка", + "task_ml_training": "Учење", + "eta_secs": "уште ~{n} сек", + "eta_mins": "уште ~{n} мин", + "pg_recent_runs": "Неодамнешни извршувања", + "pg_load_run": "Повторно вчитај го ова извршување", + "pg_match_confidence": "Сигурност на совпаѓањето", + "pg_envelope_fit": "Вклопување во обвивката", + "pg_envelope_fit_tip": "Колку добро циклусот се вклопува во зачуваната обвивка на моќноста на овој профил, поинаков поглед од сигурноста на совпаѓањето.", + "n_imported_note": ", {n} увезени", + "enable_online": "Овозможи онлајн функции", + "store_brand": "Бренд на уредот", + "store_model": "Модел на уредот", + "anonymous": "Анонимно", + "rate_quality": "Оцени го квалитетот", + "rate_n": "{n} ѕвезди", + "approved_only": "Само одобрени", + "adopt_settings": "Прифати поставки", + "flags": "Ознаки", + "include_phase_map": "Вклучи карта на фазите", + "include_settings": "Вклучи поставки", + "show_contributor": "Прикажи соработник", + "task_pg_detail": "Симулирај циклус", + "task_split": "Разделување на циклус", + "task_trim": "Отсекување на циклус", + "task_merge": "Спојување на циклуси", + "task_rebuild": "Повторно градење на обвивки", + "cat_profiles": "Профили (програми)", + "cat_real_cycles": "Циклуси (историја на извршување)", + "cat_reference_cycles": "Референтни циклуси (увезени)", + "cat_custom_phases": "Прилагодени фази", + "cat_profile_groups": "Групи профили", + "cat_settings": "Поставки за детекција и препознавање", + "cat_matching_config": "Фино прилагодување на препознавањето", + "cat_ml_models": "ML модели", + "cat_feedback": "Повратни информации и ознаки за преглед", + "cat_suggestions": "Предлози", + "cat_maintenance_log": "Дневник за одржување", + "cat_history_logs": "Дневници за историја и промени", + "cat_lifetime_stats": "Вкупни суми за целиот период", + "cycles_short": "циклуси", + "import_mode": "Како да се комбинира", + "mode_merge": "Спој (задржи ги моите)", + "mode_replace": "Замени избрано", + "cycle_destination": "Каде треба да одат увезените циклуси?", + "dest_reference": "Референтни (само форма)", + "dest_real_history": "Реална историја (се брои во статистиката)", + "conflict_resolution": "Конфликти на имиња", + "conflict_import_copy": "Увези како копија", + "conflict_keep_mine": "Задржи ги моите", + "conflict_overwrite": "Презапиши" }, - "phase1b": { - "recorded": "Вашата снимка е зачувана како {profile_name}. Сега снимете или означете ги другите чести програми за да ја проширите покриеноста." + "log": { + "all_levels": "Сите нивоа", + "all_devices": "Сите уреди", + "all_components": "Сите компоненти", + "search_ph": "Пребарај дневници…" }, - "phase1c": { - "verify": "Имате {count} програми од заедницата. Стартувајте циклус за да проверите дали WashData ги препознава правилно – совпаѓањето ќе се подобрува додека вашиот уред ја гради сопствената историја." + "ml": { + "builtin_models": "● Користење на вградени модели", + "fit_fair": "Прифатливо", + "fit_good": "Добро", + "fit_slight": "Мало", + "fit_strong": "Силен", + "fit_weak": "Слаби", + "fit_word": "одговара", + "personalized": "● Персонализирано за оваа машина", + "better_than_baseline": "{pct}% подобро од основната проценка ({metric})", + "trend_improving_tip": "Одговарањето на овој модел се подобри низ последните повторни проверки.", + "trend_declining_tip": "Одговарањето на овој модел ослабе низ последните повторни проверки; прегледувањето на повеќе циклуси може да му помогне повторно да научи.", + "trend_steady_tip": "Одговарањето на овој модел остана приближно стабилно низ последните повторни проверки.", + "cap_blurb": { + "end": "Препознавање кога циклусот навистина завршил", + "live_match": "Побрзо препознавање на активната програма", + "quality": "Откривање на погрешно препознати или оштетени циклуси", + "remaining_time": "Предвидување на преостанатото време", + "total_energy": "Предвидување на вкупната потрошувачка на енергија и трошокот" + }, + "cap_label": { + "end": "Препознавање на крајот на циклусот", + "live_match": "Препознавање на програмата", + "quality": "Проверка на квалитетот на циклусот", + "remaining_time": "Проценка на преостанатото време", + "total_energy": "Проценка на потрошувачката на енергија" + }, + "metric_auc": "AUC {auc} на издвоени податоци", + "metric_mae": "грешка {model} наспроти основната вредност {baseline}" }, - "phase2": { - "cluster": "WashData видел {count} циклуси кои не одговараат на ниедна зачувана програма – меѓусебно си наликуваат. Сакате ли за нив да создадете нов профил?", - "unmatched": "Вашиот последен циклус не одговараше на ниедна зачувана програма. Дали е тоа нова програма?" + "modal": { + "auto_label": "Циклуси за автоматско обележување", + "correct_feedback": "Точни повратни информации", + "create_profile": "Креирај профил", + "cycle": "Циклус", + "edit_group": "Уреди група на профили", + "edit_phase": "Фаза на уредување", + "import_config": "Увезена конфигурација", + "label_cycle": "Циклус на етикети", + "merge_cycles": "Спојување на {n} циклуси", + "new_group": "Нова група на профили", + "new_phase": "Нова фаза", + "process_history_msg": "Повторно стартувајте совпаѓање, освежете предлози, обучете ML (ако е овозможено) и препресметајте го здравјето на циклусите за сите зачувани циклуси. Ова може да потрае.", + "process_history_ok": "Обработи", + "process_history_title": "Обработи историја", + "process_recording": "Процес на снимање", + "delete_maintenance_msg": "Да се избрише овој запис за одржување? Ова не може да се врати.", + "delete_maintenance_title": "Избриши настан за одржување", + "relabel_cycles": "Повторно означи {count} циклуси", + "delete_automation_title": "Избриши автоматизација", + "delete_automation_msg": "Да се избрише автоматизацијата „{name}“ од Home Assistant? Ова не може да се врати.", + "remove_legacy_title": "Отстрани застарени дејства", + "remove_legacy_msg": "Да се отстранат застарените прилагодени дејства? Тие ќе престанат да се активираат при настани на циклусот. Ова не може да се врати од панелот.", + "discard_recording_title": "Отфрли снимка", + "discard_recording_msg": "Да се отфрли зачуваната снимка? Ова не може да се врати.", + "dismiss_all_title": "Отфрли ги сите повратни информации", + "dismiss_all_msg": "Да се отфрлат сите {count} чекани барања за повратна информација?", + "dismiss_all_ok": "Отфрли ги сите", + "delete_phase_title": "Избриши фаза", + "delete_phase_msg": "Да се избрише фазата „{name}“?", + "clear_debug_title": "Исчисти податоци за отстранување грешки", + "clear_debug_msg": "Да се избришат сите зачувани траги за отстранување грешки?", + "wipe_all_title": "Избриши ги сите податоци", + "wipe_all_msg": "⚠️ Ова трајно ги брише СИТЕ циклуси и профили. Ова не може да се врати.", + "wipe_all_ok": "Избриши сè", + "force_stop_title": "Присилно стопирање на циклусот", + "force_stop_msg": "Присилно да се стопира активниот циклус сега? Циклусот ќе се зачува како прекинат.", + "store_import": "Увоз на референтен циклус", + "store_share": "Сподели во продавницата на заедницата", + "store_share_device": "Сподели поставки на уредот", + "export_select": "Извоз - избор на податоци", + "import_wizard": "Увоз - избор на податоци" }, - "phase3": { - "suggestions": "WashData има препораки за поставки засновани на историјата на вашите циклуси – прегледајте ги за подобрување на точноста на откривање.", - "groups": "Некои од вашите профили изгледаат како иста програма на различни температури. Организирајте ги во група за подобро совпаѓање.", - "phases": "Додадете фази на програмата кон {profile_name} за попрецизни проценки на преостанатото време." + "msg": { + "appliance_monitor": "Монитор на апаратот", + "artifact_dip_detail": "Падна под вообичаениот опсег на моќност за ~{n}с.", + "artifact_footer": "Нагласено на графиконот погоре. Ова се минливи артефакти (на пр. вратата отворена во средината на циклусот), а не нужно проблеми.", + "artifact_header": "{n} откриени аномалии за време на овој циклус", + "artifact_pause_detail": "Моќноста падна до скоро нула за ~{n}с потоа продолжи – веројатно вратата беше отворена во средината на циклусот или циклусот беше паузиран.", + "artifact_spike_detail": "Надмина го вообичаениот опсег на моќност за ~{n}с.", + "auto_label_intro": "Доделете профили на неозначени циклуси чијашто доверба за совпаѓање го брише прагот.", + "automations_intro": "WashData активира настани {start} / {end} и изложува ентитети, па известувањата и акциите е најдобро да се градат како нормални автоматизации на Home Assistant. Автоматизациите кои го користат овој уред се прикажани подолу.", + "cleanup_intro": "Секој означен циклус е преклопен. Штиклирајте ги оддалечените и избришете за да го исчистите профилот.", + "clear_debug_hint": "Отстранете ги зачуваните податоци за отстранување грешки за да ослободите простор.", + "collecting_data": "Собирање на податоци – уште {need} циклус{plural} пред почетокот на финото подесување ({current}/{min}).", + "compare_overlay_profiles": "Преклопени профили (бледо)", + "compare_profiles_tip": "Преклопете ги другите пликови на профили на табелата погоре за да видите кој најдобро одговара на овој циклус.", + "compare_selected_cycles": "Избрани циклуси (цврсти) - прикажи / скриј", + "consider_new_profile": "Размислете за создавање нов профил.", + "coverage_gap": "последните циклуси немаат соодветни профили ({pct}% од последните 30).", + "coverage_gap_similar_cycles": "{count} слични необележани циклуси пронајдени – направете профил за да започнете да ги совпаѓате.", + "cycles_deleted": "Избришани се {count} циклуси", + "enough_data": "Доволно податоци за учење ({current}/{min} циклуси).", + "export_description": "Изберете точно кои профили, циклуси, поставки и друго да се извезат во JSON, или анализирајте датотека и увезете само деловите што ги сакате.", + "feedback_cycles_pending": "{n} циклус{s} за преглед", + "feedback_prompt": "Потврдете дека е точно, поправете ја програмата или игнорирајте.", + "feedback_relabel_hint": "Повторното етикетирање на овој циклус исто така го решава.", + "filter_by_profile": "Филтрирај по профил…", + "group_modal_help": "Групирајте програми со иста форма што се разликуваат по температура/вртење (времетраењето може да варира). Со совпаѓање се добиваат бодови на групата како еден кандидат, а потоа се избира членот кој најдобро одговара. Изберете најмалку 2; преклопот покажува колку се слични.", + "group_not_cohesive": "Овие профили не се доволно слични за да се групираат веродостојно, така што совпаѓањето ги третира поединечно додека не го отстраните оддалеченото или не ја поделите групата.", + "group_preview_hint": "Означете 2 или повеќе членови за преглед и споредба на нивните криви на моќност.", + "import_intro": "Вчитајте извезена датотека или залепете JSON носивост подолу.", + "legacy_actions_title": "{count} наследено приспособено дејство сè уште работи", + "live_chart_loading": "Табелата за напојување во живо се појавува кога пристигнуваат читањата.", + "loading": "Се вчитува…", + "loading_curve": "Се вчитува кривата…", + "loading_settings": "Се вчитуваат поставките…", + "log_buffer_hint": "Најновото прво · ги зачува последните 500 записи ha_washdata од рестартирањето · повлечете го долниот раб за да ја промените големината.", + "maintenance_advisory": "Зголеменото времетраење/енергија може да укаже на потребното одржување на апаратот (на пр. бигор, чистење на филтерот).", + "maintenance_due": "Треба одржување: {items}", + "maintenance_intro": "Запишувајте го одржувањето што го вршите на овој апарат и добивајте потсетници кога секоја задача повторно треба да се изврши.", + "maintenance_load_error": "Не може да се вчитаат податоците за одржување: {error}", + "maintenance_requires_access": "Одржувањето и извозот/увозот бараат целосен пристап.", + "manual_duration_hint": "Просечната/очекуваната должина на циклусот на профилот, што се користи за проценки на преостанатото време. Уредете за да го поставите; оставајќи го непроменет ја задржува моменталната вредност.", + "matching_tuning_intro": "Кога учи, WashData приспособува и колку одговарањето на програмата тежи обликот наспроти времетраењето и енергијата.", + "merge_intro": "Избраните циклуси се комбинираат во еден (хронолошки редослед; празнини исполнети со 0 W). Изберете го добиениот профил.", + "ml_intro": "WashData се испорачува со паметни модели кои работат надвор од кутијата.", + "ml_learned_intro": "Модели фино подесени на оваа машина.", + "ml_loading": "се вчитува ML…", + "ml_settings_intro": "Два независни прекинувачи: едниот ги применува моделите додека работи циклусот, другиот дозволува WashData фино да ги прилагоди на вашата машина со текот на времето.", + "name_first_program": "Имате доволно циклуси – именувајте ја вашата прва програма за да започне совпаѓањето.", + "near_duplicate_cluster": "Откриена е скоро дупликат профилна група. Групирањето овозможува совпаѓањето со сигурност да се избере помеѓу сличните (на пр. иста програма на различна температура/вртење).", + "no_cycles_match": "Ниту еден циклус не одговара на тековниот филтер.", + "no_cycles_profile": "Нема циклуси за овој профил.", + "no_cycles_selected": "Прво изберете барем еден циклус.", + "no_cycles_yet": "Сè уште нема снимени циклуси.", + "no_device_selected": "Нема избран уред.", + "no_devices": "Сè уште нема конфигурирани уреди за WashData.", + "no_envelope": "Сè уште нема плико - обновете по циклусите на етикетирање.", + "no_envelope_overlay": "Нема достапен плик за преклопување.", + "no_fine_tuned": "Сè уште ништо не е дотерано - WashData ги користи своите вградени модели.", + "no_logs": "Сè уште нема записи од дневници во бафер.", + "no_maintenance": "Сè уште не е забележано одржување.", + "no_match_yet": "Сè уште нема обид за натпревар - ова се пополнува за време на циклус на трчање.", + "no_other_users": "Не се пронајдени други корисници на Home Assistant.", + "no_phases": "Не се дефинирани фази.", + "no_phases_assigned": "Не се доделени фази.", + "no_profiles_compare": "Нема профили за споредба.", + "no_profiles_overlay": "Нема профили за преклопување.", + "no_profiles_yet": "Сè уште нема профили. Направете еден од означен циклус.", + "no_profiles_yet_short": "Сè уште нема профили.", + "no_settings_match": "Нема поставки кои одговараат на „{q}“", + "no_split_points": "Сè уште нема поделени поени.", + "no_suggestions": "Нема активни предлози.", + "notify_services_hint": "Користете ID-ови на сервисите {entity} (одвоени со запирки за повеќе). Варијабли на шаблонот: {vars}.", + "old_actions_warning": "Конфигуриран со стариот уредувач на дејства (сега отстранет). Сè уште пукаат на настани од циклусот, но веќе не може да се уредуваат овде. Претворете ги во нормална автоматизација или отстранете ги.", + "onboarding_progress": "{n} / 3 набљудувани циклуси", + "onboarding_watching": "Користете го апаратот како вообичаено – WashData набљудува. По 3 циклуси, ќе започне совпаѓањето на програми.", + "pending_feedback": "Во очекување на повратни информации за откривање", + "performance_trend": "Тренд на изведба ({n} циклуси)", + "pg_analysis_empty": "Вчитајте циклус за да видите анализа на совпаѓање.", + "pg_apply_confirm": "Да се примени најдобрата вредност: {label} = {value}?", + "pg_canvas_empty": "Изберете циклус погоре, потоа притиснете „Вчитај“ за да ја видите неговата крива на моќност.", + "pg_chart_caption": "Стапка на откривање/совпаѓање по вредности на {param}", + "pg_ctrl_intro": "Вредностите тргнуваат од активните поставки на интеграцијата за овој уред. Измените остануваат во песочникот сè додека не ги примените.", + "pg_live_unavailable": "Активните поставки не се достапни, прикажани се стандардните вредности.", + "pg_load_live_confirm": "Да се отфрлат измените во песочникот ({n}) и повторно да се вчитаат тековните поставки на интеграцијата?", + "pg_match_rate": "{pct}% совпаѓања на {total} циклуси", + "pg_matches_live": "Се совпаѓа со активните поставки", + "pg_n_changed": "Промени наспроти активните поставки: {n}", + "pg_sugg_none": "Сите предлози веќе одговараат на тековните поставки", + "pg_preset_delete_confirm": "Да се избрише конфигурацијата „{name}“?", + "pg_preset_limit": "Достигнат е лимитот на конфигурации ({n})", + "pg_preset_overwrite": "Да се пребрише конфигурацијата „{name}“?", + "pg_publish_one_confirm": "Да се зачува {label} = {value} во поставките на овој уред?", + "pg_restart_note": "Рестартирајте го Home Assistant за да ги овозможите алатките за симулација.", + "pg_sim_progress": "{done} / {total} циклуси", + "pg_starting": "Започнување…", + "pg_stress_synthetic": "симулацијата на мирување почнува тука", + "pg_sweep_intro": "Што ако {param} беше поинаков? Тестирајте {steps} вредности врз вашите последни {cycles} циклуси за да ја пронајдете поставката каде што најмногу циклуси се совпаѓаат правилно.", + "pg_sweep_step": "Чекор {done} / {total}", + "pg_undetected": "{n} неоткриен циклус{s}", + "pg_verdict_bad": "Бара внимание: многу циклуси остануваат неоткриени.", + "pg_verdict_good": "Добро наместено: повеќето циклуси правилно се откриваат и совпаѓаат.", + "pg_verdict_ok": "Прифатливо: некои циклуси се пропуштени. Обидете се да го намалите прагот за старт.", + "phase_catalog_intro": "Именувани сегменти од циклусот (предмиење, загревање, центрифугирање...). Доделете ги на профил од неговата контролна табла.", + "phase_ranges_intro": "Опсегот на фази (минути од почетокот на циклусот) се преклопени на просечната крива. Уредете ги вредностите за да ги прегледате во живо.", + "playground_intro": "Безбеден песочник за повторно пуштање минати циклуси со различни поставки, споредба на две конфигурации една до друга и увид во тоа како еден циклус се порамнува со профил. Ништо тука не ги менува вашите активни податоци сè додека изрично не го примените.", + "playground_needs_restart": "Рестартирајте го Home Assistant за да ги овозможите алатките на Песочникот.", + "preferences_admin": "Преференци, панел и контрола на пристап", + "preferences_adv": "Преференци", + "prefs_personal": "Овие се однесуваат само на вашата сметка на „Помошник за дома“.", + "font_size_hint": "Направете сè во овој панел поголемо или помало. Се применува на вашата сметка на овој уред.", + "process_history_hint": "Повторно стартувајте совпаѓање на сите зачувани циклуси, освежете предлози за подесување, повторно обучете ML модели (ако се овозможени) и препресметајте го здравјето на циклусите. Стартувајте по серија прегледи.", + "profile_deleted": "Профилот е избришан", + "profile_poor_health_detail": "Циклусите доделени на овој профил имаат неконзистентни форми или мала доверба. Размислете за обнова на пликот или прегледување на означените циклуси.", + "profiles_intro": "Кликнете на профил за статистика, фази и чистење. Групирајте скоро идентични програми (иста форма/траење, различна температура или центрифугирање) така што сигурно се совпаѓаат помеѓу нив.", + "rbac_hint": "Кога е исклучен, секој корисник на Home Assistant има целосен пристап (стандардно). Администраторите секогаш имаат целосен пристап и можат да управуваат со секого.", + "recent_logs": "Неодамнешни записи ha_washdata", + "recording_in_progress": "Снимањето е во тек", + "reminders_intro": "Прикажи потсетник во панелот толку циклуси по последниот сервис. Оставете празно или 0 за да го исклучите потсетникот.", + "restart_gap_footer": "Означено на графиконот. Податоците за моќност недостасуваат за овие интервали; совпаѓањето користеше само вистински очитувања.", + "restart_gap_header": "{n} HA пропуст при рестартирање за време на овој циклус", + "restart_gap_item": "{dur} пропуст", + "review_confirm_help": "Потврдете дали овој циклус е правилно откриен. Вашите рецензии го обучуваат моделот на вашата машина - колку повеќе циклуси потврдувате, толку подобро се совпаѓаат и бодовите за здравјето. Доволно е брзо/добро/лошо.", + "review_in_settings": "Преглед во Поставки", + "review_notes_placeholder": "Забелешки (изборно)", + "review_notes_tip": "Белешки со слободен текст за ваша сопствена референца. Не се користи со совпаѓање или обука.", + "review_profile_tip": "Програмата за овој циклус е означена како. Ако програмата за автоматско откривање е погрешна, поправете ја овде - етикетирањето учи совпаѓање за идните циклуси.", + "review_quality_tip": "Колку е чист овој циклус. Добро = пример за учебник за оваа програма; Лошо = откриено, но бучно или нетипично; Неупотреблив = погрешно откриен (споен, скратен или лажен). Вози на здравствениот резултат и кои циклуси се дозволени за обука на моделот.", + "review_recorded_tip": "Означете го ова како рачно избран референтен циклус за неговата програма - иста улога како рачно снимен циклус. Референтните циклуси секогаш се чуваат, се засноваат соодветниот шаблон и никогаш не се испуштаат со чистење. (Ова е „златното“/снимено знаме; и двете се иста работа.)", + "review_tags_tip": "Изборни знаменца што опишуваат што тргнало наопаку со овој циклус, така што обуката и чистењето можат да одговорат за тоа.", + "review_to_cycles": "Отворете го редот за преглед на циклуси", + "saving_triggers_reload": "Зачувувањето активира повторно вчитување на интеграцијата. Ентитетите на HA може накратко да се покажат како недостапни.", + "search_placeholder": "Поставки за пребарување…", + "see_recorder": "Погледнете го додатокот за рекордер подолу", + "setting_changed": "Променето од {old} на {new} на {date}", + "settings_basic_note": "Прикажани се основните поставки. Префрлете се на Напредно за целосната листа.", + "shape_drift_advisory": "⚠ Форма дрифт", + "shape_drift_detail": "Обрасецот на моќноста за овој профил се промени со текот на времето – можно е трошење на апаратот или потребно е одржување (на пр. одкаменување, чистење на филтерот).", + "show_all_settings": "Прикажи ги сите поставки", + "showing_suggestions": "Се прикажува поставката {count} со предлози.", + "split_intro": "Кликнете на графиконот за да додадете или отстраните точка на разделување или автоматско откривање со празнини во мирување. Секој добиен сегмент може да добие свој профил.", + "storage_diagnostics": "Статистика за складирање, одржување, извоз/увоз", + "sug_staged": "Поставено {key} = {val}. Зачувајте за примена.", + "sug_muted": "Оваа поставка нема да се предлага повторно", + "sug_mute_failed": "Не можеше да се заглуши предлогот", + "sug_unmuted_all": "Заглушените предлози се ресетирани", + "n_suggestions_muted": "{count} заглушени; авто-подесувачот нема да ги предлага овие.", + "toast_auto_detect_enabled": "Автоматско откривање овозможено", + "toast_auto_label_complete": "Автоматско означување завршено", + "toast_auto_label_failed": "Автоматско означување неуспешно: {error}", + "toast_automation_failed": "Не може да се создаде автоматизација: {error}", + "toast_automation_migrated": "Акциите се мигрирани во автоматизација; се отвора уредувачот", + "toast_convert_failed": "Конверзијата неуспешна: {error}", + "toast_create_failed": "Создавањето неуспешно: {error}", + "toast_delete_failed": "Бришењето неуспешно: {error}", + "toast_error": "Грешка: {error}", + "toast_failed": "Неуспешно: {error}", + "toast_force_stop_failed": "Принудното запирање неуспешно: {error}", + "toast_name_required": "Потребно е ime", + "toast_no_automation": "Тука не може да се создаде автоматизација", + "toast_profile_name_required": "Потребно е ime на профил", + "toast_program_set": "Поставена програма: {program}", + "toast_rebuild_failed": "Реконструкцијата неуспешна: {error}", + "toast_resume_failed": "Продолжувањето неуспешно: {error}", + "toast_revert_failed": "Враќањето неуспешно: {error}", + "toast_reverted": "{key} е вратено", + "toast_save_failed": "Зачувувањето неуспешно: {error}", + "trend_duration_longer": "Времетраењето е во тренд подолго ({pct}%/циклус) - неодамнешниот просек {avg}", + "trend_duration_shorter": "Времетраењето е во тренд пократко ({pct}%/циклус) - неодамнешниот просек {avg}", + "trend_energy_down": "Енергетскиот тренд надолу ({pct}%/циклус)", + "trend_energy_up": "Енергетскиот тренд нагоре ({pct}%/циклус) - неодамнешен просек {avg}", + "trim_destructive_confirm": "Ова задржува само {pct}% од циклусот и не може да се врати. Да се продолжи?", + "trim_intro": "Повлечете ги црвените рачки или внесете вредности. Сè што е надвор од прозорецот е отстрането.", + "tuning_suggestions_available": "{count} предлог за подесување е достапен од набљудуваните циклуси. Тие се појавуваат покрај соодветните полиња.", + "unsure_detected_prefix": "WashData не е сигурен дека е откриен", + "updated": "Ажурирано", + "warmup_badge": "Сè уште учи ({done}/{needed} циклуси)", + "warmup_detail": "На овој профил му требаат {needed} означени циклуси пред да започне автоматското совпаѓање. Секој потврден циклус помага во учењето.", + "wipe_history_warning": "Трајно избришете ги сите циклуси и профили. Не може да се врати.", + "compare_overlay_tip": "Преклопете ги пликовите на научените профили за да видите на која програма личи секој циклус.", + "duration_trend_up_tip": "Времетраењето расте ({pct}%/циклус)", + "duration_trend_down_tip": "Времетраењето опаѓа ({pct}%/циклус)", + "energy_trend_up_tip": "Енергијата расте ({pct}%/циклус)", + "energy_trend_down_tip": "Енергијата опаѓа ({pct}%/циклус)", + "performance_trending": "Тренд на изведба", + "pg_select_cycle_hint": "Изберете циклус и кликнете ↺ за вчитување", + "pg_sweep_progress": "Чекор {done} / {total}", + "pg_analysis_hint": "Изберете циклус и кликнете ↺ за вчитување на анализата.", + "diagnostics_load_failed": "Не успеа да се вчита дијагностиката: {error}", + "manual_duration_ref_hint": "Се користи само кога не е избран референтен циклус. Референтниот циклус го одредува времетраењето според сопствената должина.", + "toast_convert_rolled_back": "Конверзијата не успеа и беше вратена (не остана ниту една автоматизација): {error}", + "toast_convert_orphan": "Автоматизацијата беше создадена, но чистењето на старите акции не успеа. Не обидувајте се повторно: рачно отстранете ги старите акции за да избегнете дуплирана автоматизација.", + "advisory_duration_trend_up": "Циклусите на '{name}' стануваат сè подолги (околу +{pct}% по циклус). Ако однесувањето на уредот се променило, повторно снимете го или обновете го овој профил.", + "advisory_energy_trend_up": "'{name}' троши сè повеќе енергија (околу +{pct}% по циклус) - вреди да го проверите уредот ако тоа е неочекувано.", + "advisory_poor_health": "Профилот '{name}' има ниска оценка на совпаѓање - неговите неодамнешни циклуси значително варираат или слабо се препознаваат. Прегледајте ги неговите циклуси или повторно снимете го профилот за да останат точни препознавањето и проценките на времето.", + "advisory_shape_drift": "Профилот '{name}' значително отстапи од својата првобитна форма на потрошувачка на моќност. Уредот можеби со текот на времето го променил своето однесување (на пр. бигор, абење). Размислете за повторно снимање на овој профил со неодамнешните циклуси.", + "advisory_shape_drift_corr": "Профилот '{name}' значително отстапи од својата првобитна форма на потрошувачка на моќност (корелација {corr}). Уредот можеби со текот на времето го променил своето однесување (на пр. бигор, абење). Размислете за повторно снимање на овој профил со неодамнешните циклуси.", + "pg_no_alerts": "Во ова извршување не се откриени проблеми.", + "pg_override_active": "Се користат вашите изменети поставки наместо тековните", + "pg_history_intro": "Повторно пуштете ги последните циклуси низ вистинскиот детектор и совпаѓач. Прво изменете поставка за откривање во „Симулација“ за да видите тука споредба пред/по.", + "pg_history_empty": "Притиснете „Изврши“ за да ги репродуцирате циклусите.", + "pg_history_summary": "{detected}/{total} откриени · {correct} совпаднати правилно", + "pg_sweep_no_metric": "Нема доволно податоци за оценка на оваа цел.", + "pg_sweep_intro2": "Најдете ја поставката што најдобро ја постигнува целта врз вашите последни циклуси. Ништо не се менува додека не ја примените.", + "pg_running_history": "Повторно изведување на вашите циклуси…", + "pg_running_sweep": "Тестирање на вредности низ сите ваши циклуси…", + "pg_row_load_hint": "Вчитај го овој циклус во графикот погоре", + "pg_history_intro2": "Повторно изведете ги неодамнешните циклуси преку вистинскиот детектор и модулот за совпаѓање со поставките погоре. Кликнете на кој било ред за да го вчитате тој циклус во графикот; изменете поставка за да видите споредба пред и потоа.", + "pg_simulating": "Симулирање на циклус…", + "pg_canvas_empty2": "Изберете циклус погоре и притиснете Стартувај за да го симулирате. Потоа посочете за да ги видите вредностите, лизгајте за зумирање и влечете за поместување.", + "pg_apply_settings_confirm": "Да се зачуваат ли овие {n} поставки на овој уред? {list}", + "pg_stress_terminated_detail": "Се стабилизира на ~{idle}W мирување -- циклусот заврши {h} ч {m} мин подоцна преку {reason}.", + "pg_stress_above_threshold_detail": "Потрошувачката во мирување ~{idle}W е еднаква или над ефективниот праг за запирање ({stop}W) -- циклусот никогаш не беше регистриран како мирен. За да го поправите ова, зголемете го stop_threshold_w.", + "pg_stress_hit_cap_detail": "Циклусот работеше {h} ч {m} мин без да запре -- принудно запрен од заштитниот лимит. Потрошувачка во мирување {idle}W наспроти прагот за запирање {stop}W.", + "no_logs_match": "Ниту еден запис од дневникот не одговара на овие филтри.", + "pg_analysis_hint2": "Изберете циклус и притиснете Изврши за да се вчита анализата на совпаѓање.", + "pg_analysis_empty2": "Притиснете Изврши за да ја видите анализата на совпаѓање.", + "imported_readonly": "Увезено од продавницата на заедницата. Се прикажува за референца и совпаѓање. Не се брои во вашата статистика и не може да се уредува.", + "merge_no_imports": "Увезените снимки не можат да се спојат со вистински циклус. Отштиклирајте ги за да ги споите.", + "store_enable_hint": "Овозможете ги онлајн функциите во поставките за да прелистувате и увезувате референтни циклуси од заедницата.", + "online_intro": "Споделувајте и преземајте референтни циклуси со други корисници на WashData. Сите онлајн функции се по избор и стандардно се исклучени.", + "store_share_intro": "Прикачете го овој референтен циклус за да можат да го користат други со истиот уред. Се прегледува пред да стане јавен.", + "online_intro_global": "Прелистувајте и споделувајте референтни снимки со други корисници на WashData и потврдувајте записи за уреди. Едно поврзување важи за целата ваша интеграција WashData; брендот и моделот на уредот се поставуваат за секој уред во разделот „Основно“. Сите онлајн функции се по избор и стандардно се исклучени.", + "online_unavailable": "Онлајн функциите не се достапни на овој сервер.", + "store_picker_offline": "Овозможете ги онлајн функциите од иконата за поставки (запченик) за да избирате од каталогот на заедницата.", + "pick_brand_first": "Прво изберете бренд на уредот.", + "model_not_found": "Сè уште не е во каталогот.", + "connect_to_confirm": "Поврзете се од иконата за поставки (запченик) за да потврдувате или оценувате.", + "adopt_settings_hint": "Примени ги поставките за откривање и совпаѓање на споделениот уред на овој уред", + "include_settings_hint": "Вклучи прагови за откривање, тежини за совпаѓање и други параметри во споделениот пакет", + "onboard_download": "Преземи готови поставки од продавницата на заедницата", + "share_consent": "Споделувате вистински податоци од вашиот уред. Не споделувајте ако вашите обрасци за користење се приватни.", + "share_device_none": "Сè уште нема поставени уреди. Прво додајте уред.", + "share_guideline_naming": "Користете јасни имиња на програмите (напр. 'Cotton 40', 'Eco 60') за да можат другите да ги препознаат", + "share_guideline_quality": "Споделувајте само профили со ⭐ референтни циклуси или барем {n} потврдени стартувања", + "share_guideline_review": "Прегледајте ги профилите пред споделување -- отстранете ги оние кои изгледаат погрешно", + "share_guidelines_title": "Пред споделување", + "store_download_device_intro": "Преземете поставки на уредот од заедницата и применете ги на нов или постоечки уред", + "store_share_device_intro": "Споделете ги програмите на вашиот уред (профили + референтни циклуси) со заедницата. Поставките се опционални.", + "share_profile_no_cycles": "Профилот '{p}' нема ⭐ референтни циклуси -- ќе биде прескокнат освен ако немате {n}+ потврдени стартувања", + "advisory_phase_inconsistent": "Изгледа дека '{name}' меша различни програми или температури - неговите циклуси се загреваат многу различно долго. Поделбата на посебни профили (на пр. по температура) ќе ги подобри совпаѓањето и проценките на времето.", + "advisory_phase_inconsistent_title": "⚠ Можеби измешани програми", + "export_select_intro": "Означете што точно да се вклучи. Изборот на профили без нивните циклуси сепак извезува препознатлива програма (нејзината научена форма се пренесува заедно со неа).", + "import_analyze_hint": "Вчитајте извезена датотека (или залепете го нејзиниот JSON). WashData ја анализира и покажува што точно може да се увезе пред да се промени нешто.", + "analyzing": "Анализирање…", + "device_type_mismatch_warn": "Овој извоз е од друг тип уред ({src} наместо {local}). Програмите и циклусите сепак можат да се увезат како референтни податоци, но поставките специфични за уредот и увозот на реална историја се оневозможени.", + "merge_hint": "Увезените ставки се додаваат; ништо локално не се губи. Конфликтите на имиња се решаваат подолу.", + "replace_warn": "Секоја означена категорија се брише и се заменува со податоците од датотеката. Неозначените категории остануваат непроменети.", + "dest_reference_hint": "Увезените циклуси само го подобруваат препознавањето на програми и никогаш не влијаат на статистиката за користење/енергија.", + "dest_real_history_hint": "Увезените циклуси се сметаат за сопствена историја на овој уред и ја хранат статистиката за енергија/користење. Користете за преместување на еден уред на нова инсталација." }, - "phase4": { - "healthy": "Овој уред е целосно поставен ({profile_count} профили)." + "phase_desc": { + "anti_crease": "Повремени кратки превртувања по завршувањето за да се намалат брчките.", + "anti_wrinkle": "Периодично вртење после циклус за намалување на брчките.", + "cool_down": "Превртување без топлина блиску до крајот на циклусот.", + "drain_and_switch": "Преоден период од режим на перење во сушење.", + "dry": "Фаза на сушење со помош на грејач и/или преостаната топлина.", + "drying": "Главен загреан период на превртување.", + "heat_up": "Почетното загревање на грејачот пред да започне целосното сушење.", + "pre_rinse": "Почетно прскање пред миење со детергент.", + "pre_wash": "Почетно натопување или предтретман пред главното перење.", + "rinse": "Фаза на плакнење со чиста вода. Оваа фаза може да се повтори повеќе пати.", + "sanitize": "Фаза за чистење со висока температура за програми за дезинфекција.", + "sensor_check": "Кратка пауза со мала моќност додека се мери сувоста.", + "soak": "Период на натопување со мала активност помеѓу активните фази на миење.", + "soak_dw": "Продолжен период на киснење за тешка почва.", + "spin": "Извлекување со голема брзина за отстранување на водата од товарот.", + "spin_wd": "Екстракција со голема брзина пред транзиција на сушење.", + "wash": "Главен циклус на перење со движење на барабанот и опционално загревање.", + "wash_dw": "Главно миење со детергент со загревање." }, - "cta": { - "start_recording": "Започни снимање", - "label_detected_cycle": "Веќе имам откриен циклус – означи го наместо тоа", - "browse_cycles": "Прелистај циклуси за означување на следниот", - "view_profiles": "Погледни ги вашите профили", - "create_from_cluster": "Создај профил од овие циклуси", - "create_profile": "Создај за него профил", - "review_suggestions": "Прегледај препораки", - "organise_profiles": "Организирај профили", - "configure_phases": "Конфигурирај фази", - "skip_step": "Прескокни го овој чекор", - "skip_forever": "Не прикажувај повеќе", - "hide_guidance": "Скриј насоки", - "show_guidance": "Прикажи насоки" + "placeholder": { + "add": "додај…", + "group_name": "пр. Памук 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "додај сервис за известување…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "додај лице…", + "phase_name": "пр. Претпрање", + "profile_name": "пр. Памук 40°C", + "maintenance_notes": "пр. заменет филтер, исчистена гума на вратата", + "store_brand": "на пр. Bosch", + "store_model": "на пр. WAT28401" + }, + "pref": { + "date_absolute": "Апсолутно (на пр. 14:32 на 2 јули)", + "date_relative": "Роднина (на пр. пред 2 часа)", + "lang_auto": "Системски стандарден ({lang})", + "lang_en": "Англиски", + "use_panel_default": "(стандард на таблата)" + }, + "quality": { + "bad": "Лошо", + "good": "Добро", + "unusable": "Неупотребливи" + }, + "section": { + "dishwasher": { + "intro": "Ракување со крајот на циклусот за машини за миење садови, кои обично завршуваат со долга фаза на сушење речиси без потрошувачка на енергија пред кратко финално испумпување.", + "label": "Машина за миење садови" + }, + "anti_wrinkle": { + "intro": "Режимот против брчки/набирање открива импулси со ниска моќност по главната фаза и ги прикачува на завршениот циклус.", + "label": "Против брчки" + }, + "basic": { + "intro": "Основен идентитет и суштинските работи кои ги бараат повеќето поставки.", + "label": "Основно" + }, + "delay": { + "intro": "Откривањето на одложениот старт идентификува кога апаратот е вклучен но сè уште не започнал циклус.", + "label": "Одложен старт" + }, + "detection": { + "intro": "Kako се открива циклусот при започнување, работење и завршување.", + "label": "Откривање" + }, + "matching": { + "intro": "Kako завршените циклуси се совпаѓаат со научените профили и се означуваат.", + "label": "Совпаѓање" + }, + "ml_training": { + "intro": "Распоред и поставки за податоци за повторна обука на машинско учење на уредот.", + "label": "МЛ обука" + }, + "notifications": { + "intro": "Кога и kako се известувате за настаните на циклусот.", + "label": "Известувања" + }, + "timing": { + "intro": "Позадинска каденца, офлајн чувар и одржување.", + "label": "Тајмирање и чувар" + }, + "triggers": { + "intro": "Опционални надворешни сигнали: тригер за крај, сензор за врата, прекинувач за пауза и потсетник за истовар.", + "label": "Тригери и врати" + }, + "phase_eta": { + "label": "Преостанато време", + "intro": "Проценка на преостанатото време, свесна за фазите, за машини чија должина на циклусот зависи од температурата или центрифугирањето." + } + }, + "setting": { + "dishwasher_end_spike_quiet_release": { + "doc": "Откако циклусот ќе го надмине очекуваното траење, колку долго машината за миење садови мора да остане неактивна (под «Праг за стоп») пред WashData да престане да чека финално испумпување и да го заврши циклусот. Зголемете го ако вашата машина има долга тивка фаза на сушење пред доцно финално испумпување што се пропушта - поширок прозорец овозможува наученото траење да ги следи сезонските промени (постудена влезна вода = подолги циклуси) наместо да се заклучи на старата просечна вредност. Тоа само го скратува чекањето во однос на внатрешниот лимит од 30 минути за чекање на финалниот скок (испумпување на вода), но никогаш не го продолжува.", + "label": "Тивко завршување на пасивното сушење" + }, + "anti_wrinkle_enabled": { + "doc": "Препознајте ги кратките пулсирања со мала моќност што ги испушта машината за сушење по главната топлинска фаза и држете ги прикачени на завршениот циклус наместо да ги читате како нови циклуси.", + "label": "Овозможи откривање против брчки" + }, + "anti_wrinkle_exit_power": { + "doc": "Моќта мора да падне под ова помеѓу импулсите за режимот против брчки да остане активен.", + "label": "Праг на моќност за излез" + }, + "anti_wrinkle_idle_timeout": { + "label": "Макс. пауза меѓу импулси", + "doc": "Колку долго машината смее да остане тивка меѓу два импулса на превртување на барабанот пред режимот против брчки да заврши. Поставете ја над најдолгата пауза што вашата машина за сушење ја остава меѓу импулсите, инаку секој нареден импулс се чита како лажен старт." + }, + "anti_wrinkle_max_duration": { + "doc": "Пулсовите подолги од ова се третираат како вистински циклус, а не како средство против брчки.", + "label": "Макс. траење" + }, + "anti_wrinkle_max_power": { + "doc": "Пулсот над оваа моќност се третира како вистински нов циклус, а не како ролна против брчки. Поставете веднаш над моќноста на пулсот на ролна.", + "label": "Макс. моќност против брчки" + }, + "auto_label_confidence": { + "doc": "Ако резултатот на натпреварот на крајот на циклусот е на или над ова, програмата автоматски се означува без никакво барање за потврда. Подигнете го за да бара поголема сигурност пред автоматско означување; спуштете го за да се автоматизира повеќе. Работи во врска со Довербата за учење под неа.", + "label": "Доверба за автоматско означување" + }, + "auto_maintenance": { + "doc": "Извршете ноќно одржување: обновете ги пликовите на профилот, пресметувајте го здравјето на циклусот, исечете ги трагите од отстранување грешки и задржете ги најновите циклуси.", + "label": "Автоматско одржување (ноќно чистење)" + }, + "completion_min_seconds": { + "doc": "Циклусите пократки од ова се отфрлаат како циклуси на духови (тестни, отворање на вратата за додавање чорап).", + "label": "Мин. траење на циклус" + }, + "delay_confirm_seconds": { + "doc": "Напојувањето мора да остане толку долго во опсегот на подготвеност пред апаратот да се третира како што чека да стартува наместо да работи.", + "label": "Секунди за потврда" + }, + "delay_start_detect_enabled": { + "doc": "Откријте кога апаратот е вклучен и чека (одложен почеток / мирување), но не го започнал својот циклус, така што цртањето во режим на подготвеност не се смета за работен циклус.", + "label": "Овозможи откривање на одложен старт" + }, + "delay_timeout_hours": { + "doc": "Престанете да чекате во режимот за одложено стартување после толку часови и вратете се во мирување, така што машината што останала напојувана, но никогаш не стартувала, не чека вечно.", + "label": "Часови за истекување" + }, + "device_type": { + "doc": "Класа на апарати. Поставува разумни поставки за откривање (прагови, исклучено одложување, крајно ракување) прилагодени за тој тип на апарат; променете го само ако уредот првично бил поставен како погрешен тип.", + "label": "Тип на уред" + }, + "door_sensor_entity": { + "doc": "Изборен бинарен сензор за врата. Се користи за откривање кога апаратот е отворен/растоварен по циклус.", + "label": "Ентитет на сензор за врата" + }, + "duration_tolerance": { + "doc": "Толеранција за проценките на преостанатото време (повратни информации за учење, не совпаѓање). Ако вистинското времетраење е во рамките на +/-X% од проценката, тоа се смета за добро совпаѓање.", + "label": "Толеранција на проценката" + }, + "enable_ml_models": { + "doc": "Додека трае циклусот, дозволете им на моделите да ги усовршат резултатите во живо: постабилна проценка на преостанатото време и енергија/трошок, како и заштита против предвремено запирање при откривање на крајот (може само да го одложи финишот, никогаш да не заврши порано и е ограничен). Ги користи вашите фино подесени модели кога се достапни, инаку вградените. Исклучено = само класична логика базирана на моќност (сеуште сигурна).", + "label": "Примени паметни модели за време на циклус" + }, + "end_energy_threshold": { + "doc": "За време на одбројувањето без одложување, акумулираната енергија (вати x време) се споредува со овој праг. Ако се надмине, одбројувањето се ресетира - држејќи ги опашките против туткање и опашките за сушење во машина за миење садови прикачени на циклусот наместо да ги скратите. Зголемете го ако циклусите завршуваат премногу рано за време на ладењето; спуштете го ако откривањето е бавно.", + "label": "Крајна енергија" + }, + "end_repeat_count": { + "doc": "Број на последователни отчитувања под прагот што се потребни пред да заврши циклусот. 1 е во ред за повеќето приклучоци. Зголемете на 2-3 ако вашиот паметен приклучок повремено пријавува примерок со лажна нула во средината на циклусот и вашите циклуси завршуваат предвреме.", + "label": "Броење на повторување при крај" + }, + "energy_price_entity": { + "doc": "Сензор со моменталната цена на електрична енергија по kWh (на пр. динамична тарифа). Има предност пред статичната цена подолу. Секој циклус ја замрзнува цената што е во сила кога ќе заврши.", + "label": "Ентитет на цена на енергија" + }, + "energy_price_static": { + "doc": "Фиксна цена по kWh што се користи за бројките на трошоците кога не е поставен ентитет на цена во живо погоре.", + "label": "Статична цена на енергија (по kWh)" + }, + "energy_sensor": { + "doc": "Изборен кумулативен бројач на енергија (total_increasing kWh/Wh, на пр. сопствениот бројач за вкупната потрошувачка на приклучокот). Кога е поставен, енергијата пријавена за секој циклус се зема од разликата во отчитувањата на овој бројач меѓу почетокот и крајот, што го избегнува потценувањето што се добива при интегрирање на бавно известувачки сензор за моќност. Се враќа на интегрираната вредност ако отчитувањето недостасува, неговата единица е непозната или разликата не е позитивна. Оставете празно за да продолжите да го интегрирате сензорот за моќност.", + "label": "Ентитет на мерач на енергија" + }, + "expose_debug_entities": { + "doc": "Објавувајте дополнителни дијагностички HA ентитети (доверба на натпреварот, двосмисленост, внатрешни работи). Исклучено го одржува списокот со ентитети чист за нормална употреба.", + "label": "Изложи ентитети за дебагирање" + }, + "external_end_trigger": { + "doc": "Бинарен сензор чија промена на состојбата го означува крајот на циклусот (на пр. контакт „завршен“ на апаратот или придружна интеграција).", + "label": "Ентитет на надворешен тригер" + }, + "external_end_trigger_enabled": { + "doc": "Дозволете надворешен бинарен сензор да го сигнализира крајот на циклусот, покрај вграденото откривање базирано на енергија.", + "label": "Овозможи надворешен тригер за крај" + }, + "external_end_trigger_inverted": { + "doc": "Третирајте го исклучувањето на сензорот за активирање (наместо ВКЛУЧЕНО) како сигнал за крајот на циклусот.", + "label": "Инвертирај надворешен тригер (тригер при ИСКЛУЧУВАЊЕ)" + }, + "learning_confidence": { + "doc": "If the match score falls between this and Auto-Label Confidence, a feedback notification asks you to verify the identified program. Below this score the match is too uncertain to surface. Мора да се чува под Довербата за автоматска етикета.", + "label": "Доверба при учење" + }, + "linked_device": { + "doc": "Изборно вгнездувајте го овој уред WashData под друг уред (на пр. паметниот приклучок) во регистарот на уреди HA, прикажан како „Поврзан преку ...“.", + "label": "Групирај под уред" + }, + "min_off_gap": { + "doc": "Ако машината се исклучува помалку од ова време, секвенцата за вклучување/исклучување/вклучување се третира како еден континуиран циклус. Спречува програмите за натопување (машината се исклучува неколку минути при перење) да се поделат на два одделни циклуси. Поставете го пократко од јазот помеѓу вчитувањата одназад, ако сакате тие да се бројат како посебни циклуси. Стандардните типови на уред ја штитат типичната пауза во циклусот за секој апарат.", + "label": "Мин. јаз при исклучување" + }, + "min_power": { + "doc": "Апсолутна минимална моќност се смета за активна. Читањата под ова се третираат како 0 W (во мирување), филтрирање на фантомското оптоварување на паметните приклучоци и LED диоди во мирување.", + "label": "Минимална моќност" + }, + "ml_training_enabled": { + "doc": "Периодично проучувајте ги прегледуваните циклуси преку ноќ и дотерувајте ги моделите на оваа специфична машина. Промената се задржува само кога навистина постигнува подобри резултати на долготрајните циклуси, така што ова може само да помогне или да остане исто - никогаш да не се уназадувате.", + "label": "Учи од оваа машина" + }, + "ml_training_hour": { + "doc": "Локален час од денот (0-23) за да се изврши фино подесување преку ноќ. Изберете мирен час како 2 (02:00 часот).", + "label": "Учи во час" + }, + "ml_training_interval_days": { + "doc": "Повторно проверете дали има подобрувања најмногу еднаш во овој многу дена.", + "label": "Проверувај најмногу на секои" + }, + "ml_training_min_cycles": { + "doc": "Почекајте барем толкав број циклуси да бидат снимени пред фино подесување, за да има доволно за учење.", + "label": "Прво потребни циклуси" + }, + "name": { + "doc": "Името на прикажување прикажано во списокот со интеграции на HA и во регистарот на уреди.", + "label": "Назив на уред" + }, + "no_update_active_timeout": { + "doc": "Ако не пристигне ажурирање напојување за толку долго додека работи, претпоставете дека приклучокот испаднал офлајн и присилно прекинете за да избегнете циклус на зомби. Стандардните 600 секунди овозможуваат доцнење во облак или мрежа.", + "label": "Пауза без ажурирање" + }, + "notify_before_end_minutes": { + "doc": "Испратете предупредување Речиси готово кога проценетото преостанато време ќе падне под ова. 0 го оневозможува.", + "label": "Предупредување пред крај" + }, + "notify_channel": { + "doc": "Име на каналот за известување на Android за пораки за почеток/во живо (го контролира звукот и приоритетот по канал на мобилната апликација). Blank ја користи стандардната придружна апликација.", + "label": "Android канал (старт/живо)" + }, + "notify_cycle_timers": { + "doc": "Известувања во одредени минути во циклусот (на пр. за додавање омекнувач). Пораката поддржува {device}, {program}, {minutes}. Овозможете автоматско паузирање за да паузирате во тој момент и добивате интерактивно известување со копчето Продолжи; продолжи преку панелот, услугата за пауза/продолжување или дејството за известување.", + "label": "Тајмери за циклус" + }, + "notify_finish_channel": { + "doc": "Името на каналот за известување на Android за завршната порака. Blank повторно го користи каналот за старт/жив.", + "label": "Android канал (крај)" + }, + "notify_finish_message": { + "doc": "Тело што се испраќа кога циклусот ќе заврши. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. {time_finished} и {vs_typical} се најкорисни тука.", + "label": "Порака за крај" + }, + "notify_finish_services": { + "doc": "известувај.* услугите се повикуваат кога ќе заврши циклусот. Додадете по еден по цел; оставете празно известување без завршница.", + "label": "Услуги за крај" + }, + "notify_fire_events": { + "doc": "Исто така, активирајте ha_washdata_* настани на почетокот/завршувањето на циклусот за да можете да изградите свои автоматизации.", + "label": "Активирај HA настани за известувања" + }, + "notify_icon": { + "doc": "Изборна икона mdi за известувањето (на пр. mdi:машина за перење). Оставете празно за стандардната платформа.", + "label": "Икона на известување" + }, + "notify_live_chronometer": { + "doc": "Прикажи тајмер за одбројување што се ажурира во живо во известувањето (на платформите што го поддржуваат) наместо статична проценка.", + "label": "Користи хронометар во живо" + }, + "notify_live_interval_seconds": { + "doc": "Колку често известувањата за напредок во живо се освежуваат додека работи циклусот.", + "label": "Интервал за ажурирање во живо" + }, + "notify_live_overrun_percent": { + "doc": "Ако циклусот ја надмине неговата проценка за повеќе од овој процент, испратете предупредување за пречекорување.", + "label": "% на прекорачување во живо пред предупредување" + }, + "notify_live_services": { + "doc": "известувај.* услугите повикани за ажурирање на напредокот во живо додека трае циклусот. Оставете празно за да ги оневозможите известувањата за напредок во живо.", + "label": "Услуги за напредок во живо" + }, + "notify_only_when_home": { + "doc": "Испраќајте известувања само кога барем едно од поврзаните луѓе (горе) е дома.", + "label": "Известувај само кога сте дома" + }, + "notify_people": { + "doc": "лице.* ентитети што ги користи „Извести само кога дома“ за да одлучи дали некој е дома.", + "label": "Луѓе (за Само дома)" + }, + "notify_pre_complete_message": { + "doc": "Тело на предупредувањето пред-крај / речиси готово. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Порака за скоро крај" + }, + "notify_reminder_message": { + "doc": "Тело на потсетникот за истоварување што сè уште чека. Ако е празно, се користи вградената стандардна вредност. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Порака за потсетник" + }, + "notify_start_message": { + "doc": "Тело што се испраќа кога циклусот ќе започне. Шаблонски променливи: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Порака за почеток" + }, + "notify_start_services": { + "doc": "известувај.* услуги се повикуваат кога започнува циклус. Додадете по еден по цел (телефон, контролна табла, итн.); оставете празно известување без почеток.", + "label": "Услуги за почеток" + }, + "notify_timeout_seconds": { + "doc": "Автоматски отфрли го известувањето по овие многу секунди (на платформите што го поддржуваат). 0 го задржува додека не се отфрли рачно.", + "label": "Автоматско отфрлање по" + }, + "notify_title": { + "doc": "Наслов на известување. Шаблонски променливи: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "Наслов на известување" + }, + "notify_unload_delay_minutes": { + "doc": "Неколку минути по завршувањето на циклусот пред да го испратите потсетникот за „растоварување на машината“ што се уште чека. Поставете 0 за да го оневозможите потсетникот.", + "label": "Задоцнување на потсетникот за истовар" + }, + "notify_unload_repeat": { + "doc": "Продолжува да го испраќа потсетникот за истовар на секои \"Задоцнување на потсетникот за истовар\" минути, додека не ја отворите вратата или не притиснете \"Престани да потсетуваш\" во известувањето. Бара Ентитет на сензор за врата (како и самиот потсетник). Копчето за отфрлање работи на известувањата на мобилната апликација на Home Assistant (companion).", + "label": "Повторувај додека не се отвори вратата" + }, + "off_delay": { + "doc": "Време е да се чека откако ќе падне напојувањето пред да се прогласи дека циклусот е завршен. Ако напојувањето се обнови во овој прозорец, циклусот продолжува беспрекорно - ова ги премостува паузите помеѓу фазите на перење. Машините за миење садови имаат долги фази на сушење (исклучување на струја 20-60 мин), така што доцнењето на исклучување мора да го надмине тоа за да се задржи целото перење+сушење како еден циклус.", + "label": "Одложување на исклучување" + }, + "pause_cuts_power": { + "doc": "Кога циклусот е паузиран, исклучете го и Switch Entity подолу. Само за уреди чиј приклучок може безбедно да се исече во средината на циклусот.", + "label": "Паузата исто така ја исклучува моќноста (преку прекинувач)" + }, + "power_off_delay": { + "doc": "Колку долго моќноста мора да остане под Прагот за исклучување на напојувањето откако циклусот ќе заврши пред состојбата да се врати на „Исклучено“. Се користи само кога Прагот за исклучување на напојувањето е над 0. Се проверува на позадинскиот ритам, така што ефективното одложување се заокружува нагоре до следното отчукување за истек на состојбата.", + "label": "Одложување на исклучување на напојувањето" + }, + "power_off_threshold_w": { + "doc": "Опционално откривање на исклучена состојба врз основа на моќноста. Кога е над 0, откако циклусот ќе заврши и моќноста остане под ова ниво во текот на Одложувањето на исклучување на напојувањето, машината се третира како исклучена и состојбата се враќа на „Исклучено“. Оставете на 0 за да го оневозможите (стандардно). Поставете го над вистинското ниво на исклучено напојување, а под Прагот за стоп и под потрошувачката на вашата машина во мирување (завршена, но сè уште вклучена); ако не е под Прагот за стоп, се игнорира. Кога е овозможено, го заменува Одложувањето на ресет на напредок за враќање на „Исклучено“, така што завршената машина останува на „Завршено/Чиста“ додека навистина не се исклучи.", + "label": "Праг за исклучување на напојувањето" + }, + "power_sensor": { + "doc": "Ентитетот на сензорот што известува за електрична енергија во вати за овој апарат (на пр. сензор.моќност за мијалник). Откривањето на целиот циклус се заснова на овој сигнал.", + "label": "Сензор за моќност" + }, + "profile_duration_tolerance": { + "doc": "Опсегот +/- околу просечното времетраење на профилот што се користи за време на совпаѓањето. 0,25 значи дека профилот од 60 минути одговара на циклусите од 45-75 минути.", + "label": "Толеранција на траење на профилот" + }, + "profile_match_interval": { + "doc": "Колку често се обидувате да се совпаднете со профилот за време на циклусот на трчање. Стандардните 300 секунди (5 минути) ги балансираат брзината на откривање и процесорот.", + "label": "Интервал за совпаѓање" + }, + "profile_match_max_duration_ratio": { + "doc": "Максимална должина на циклусот во однос на профилот. 1.3 значи дека циклусот мора да биде под 130% од времетраењето на профилот за да се совпадне.", + "label": "Макс. сооднос на траење" + }, + "profile_match_min_duration_ratio": { + "doc": "Минимална должина на циклусот во однос на профилот. 0,9 значи дека циклусот мора да биде најмалку 90% од времетраењето на профилот за да се совпадне.", + "label": "Мин. сооднос на траење" + }, + "profile_match_threshold": { + "doc": "Потребен е минимален резултат на сличност (0-1) на крајот на циклусот за да се прифати идентификација на програмата. Подигнете го за да ги намалите погрешните идентификации; намалете го ако програмите на вашата машина не се совпаѓаат. Стандардно 0.4 е конзервативна почетна точка.", + "label": "Праг за совпаѓање" + }, + "profile_unmatch_threshold": { + "doc": "Ако натпревар во живо од средината на циклусот падне под овој резултат, пробната идентификација се брише. Чувајте го малку под прагот на совпаѓање за краткото опаѓање во сличноста да не го врати екранот на неспоредлив.", + "label": "Праг за несовпаѓање" + }, + "progress_reset_delay": { + "doc": "По завршувањето, задржете го напредокот на 100% толку долго, така што „Завршено“ е видливо на контролните табли пред да се ресетира на „Неактивен“.", + "label": "Одложување на ресет на напредок" + }, + "pump_stuck_duration": { + "doc": "Секунди пумпата може да работи непрекинато пред да биде означена како евентуално заглавена (го активира настанот на заглавената пумпа).", + "label": "Времетраење за заглавена пумпа" + }, + "running_dead_zone": { + "doc": "Откако ќе започне циклусот, падовите на напојувањето во овој прозорец се игнорираат. Машините за перење се полнат со ладна вода (паѓа близу 0 W пред загревањето) - без оваа заштита, таа фаза на полнење изгледа како крај на циклусот. Ова НЕ ги прескокнува податоците: трагата на целосна моќност е снимена од T=0. Моторот за предлози ја мери вистинската шема за стартување на вашата машина и автоматски ја мери оваа големина.", + "label": "Мртва зона при работење" + }, + "sampling_interval": { + "doc": "Очекувано време помеѓу отчитувањата на сензорот - се користи за правилна големина на прозорецот за измазнување и правилно започнување на отскокнување. Секое ажурирање на сензорот се доловува без оглед на оваа вредност; ги калибрира само пресметките низводно. Моторот за предлози ја мери вистинската каденца на вашиот сензор од минатите циклуси и го поставува тоа автоматски.", + "label": "Интервал на земање примероци" + }, + "save_debug_traces": { + "doc": "Складирајте ја целосната трага на енергија и соодветните податоци за отстранување грешки за секој циклус. Корисно за решавање проблеми, но ја зголемува големината на складирањето.", + "label": "Зачувај траги за дебагирање" + }, + "smoothing_window": { + "doc": "Колку е измазнет сигналот за сирова моќност. Ниско (2) реагира, но бучно; високото (5) ги измазнува шила, но додава заостанување.", + "label": "Прозорец за изглавнување" + }, + "start_duration_threshold": { + "doc": "Напојувањето мора да остане над прагот на стартување толку долго за да се потврди вистинскиот почеток, спречувајќи ги прекинувачите за вклучување/исклучување во дел од секундата да започнат циклус.", + "label": "Времетраење на старт" + }, + "start_energy_threshold": { + "doc": "Енергија (моќност x време) апаратот мора да троши пред да РАБОТИ. Краток скок со висока моќност има многу мала енергија и се игнорира, спречувајќи лажни стартови.", + "label": "Старт енергија" + }, + "start_threshold_w": { + "doc": "Моќта мора да се искачи над ова ниво за да потврди дека циклусот започнал. Премногу ниско поставување предизвикува лажни стартувања од напојувањето во мирување; се пропуштаат премногу високи програми и бавно стартување (ладно полнење). Предлог моторот го поставува ова веднаш над забележаната најниска активна моќност на машината.", + "label": "Праг за почеток" + }, + "stop_threshold_w": { + "doc": "Напојувањето мора да падне под ова ниво пред да започне одбројувањето за исклучување. Поставете го под прагот за почеток - јазот меѓу нив е лентата за хистереза ​​што го спречува треперењето. Ако е поставено премногу високо, фазите со мала моќност (држење на плакнење, против туткање) лажно ја активираат крајната низа.", + "label": "Праг за стоп" + }, + "switch_entity": { + "doc": "Изборниот прекинувач се исклучува при пауза и повторно се вклучува при продолжување, што се користи заедно со „Паузата исто така го намалува напојувањето“.", + "label": "Ентитет на прекинувач" + }, + "watchdog_interval": { + "doc": "Колку често чуварот на заднина проверува дали има застојани сензори и изминати тајмаути. Стандардно 30 секунди.", + "label": "Интервал на чувар" + }, + "notify_milestone_message": { + "doc": "Порака за известувањето за пресвртница. Шаблонски променливи: {device}, {cycle_count}.", + "label": "Порака за пресвртница" + }, + "notify_milestones": { + "doc": "Броеви на циклуси одделени со запирки што активираат еднократно честитачко известување кога ќе се достигнат (пр. 50, 100, 500, 1000). Празно ги оневозможува известувањата за пресвртници.", + "label": "Пресвртници на циклуси" + }, + "notify_quiet_end_hour": { + "doc": "Крај на прозорецот „не вознемирувај“ (0-23). Задржаните известувања се испорачуваат во овој час. Оставете празно за да се оневозможи.", + "label": "Крај на тивки часови" + }, + "notify_quiet_start_hour": { + "doc": "Почеток на прозорецот „не вознемирувај“ (0-23). Известувањата за завршување, потсетниците и известувањата за чиста облека што би се активирале за време на тивките часови се задржуваат и се испорачуваат кога прозорецот ќе заврши. Оставете празно за да се оневозможи. Поддржува прозорци што ја преминуваат полноќ (пр. почеток во 22, крај во 7).", + "label": "Почеток на тивки часови" + }, + "peak_rate_message": { + "doc": "Изборен прилагоден текст за советот за врвна тарифа што се додава на известувањето при старт. Шаблонски променливи: {device}, {price}. Ако е празно, се користи вградената стандардна вредност.", + "label": "Порака за врвна тарифа" + }, + "peak_rate_threshold": { + "doc": "Кога ќе започне циклус и тековната цена по kWh е на или над оваа вредност, додади совет за врвна тарифа на известувањето при старт. 0 или празно го оневозможува советот.", + "label": "Праг за врвна тарифа (по kWh)" + }, + "dtw_bandwidth": { + "label": "Толеранција на совпаѓање по форма", + "doc": "Колку модулот за совпаѓање смее временски да го растегне циклусот за да одговара на формата на зачувана програма. Повисока вредност поднесува повеќе варијации во брзината; премногу висока ризикува да совпадне погрешна програма." + }, + "corr_weight": { + "label": "Тежина форма наспроти ниво", + "doc": "Рамнотежа помеѓу формата на кривата и апсолутното ниво на моќност при оценување на совпаѓањето. Повисока вредност дава предност на формата; пониска дава предност на согласувањето на нивото на моќност." + }, + "duration_weight": { + "label": "Тежина на времетраењето", + "doc": "Колку силно се претпочита програма чиешто типично времетраење се совпаѓа со овој циклус." + }, + "energy_weight": { + "label": "Тежина на енергијата", + "doc": "Колку силно се претпочита програма чијашто типична потрошувачка на енергија се совпаѓа со овој циклус." + }, + "store_brand": { + "label": "Бренд на уредот", + "doc": "Опционално. Брендот на уредот, избран од каталогот на заедницата. Се користи за наоѓање и споделување на соодветни референтни снимки. Оставете празно ако не ги користите онлајн функциите." + }, + "store_model": { + "label": "Модел на уредот", + "doc": "Опционално. Моделот на уредот, избран од каталогот на заедницата откако е поставен бренд. Ако вашиот модел не е на списокот, можете да го додадете во каталогот." + }, + "show_contributor": { + "doc": "Прикажи го името на соработникот на профилите преземени од продавницата на заедницата" + }, + "enable_phase_matching": { + "label": "Преостанато време според фазите", + "doc": "Го дели секој активен циклус на фази (загревање, перење, центрифугирање) и го распределува преостанатото време по фази, во комбинација со класичната проценка - потпирајќи се на распределбата по фази на почетокот на циклусот, а на класичната проценка кон крајот. Ова го прилагодува одбројувањето на тоа колку навистина се загрева и работи вашата машина, што е најзабележливо во првата половина од циклусот. Исклучено = само класичната проценка. Влијае само на приказот на преостанатото време; совпаѓањето на програми и откривањето на циклуси остануваат непроменети." + }, + "keep_min_score": { + "label": "Мин. резултат на совпаѓање", + "doc": "Минимален резултат на сличност потребен на кандидатот за да остане во трката на совпаѓање. Стандардната вредност 0,1 е намерно попустлива - прифаќа дури и слаби кандидати и се потпира на подоцнежните фази за наоѓање на најдоброто совпаѓање. Зголемете за порано отфрлање на малку веројатни профили; намалете за проширување на почетниот сет на кандидати." + }, + "dtw_blend": { + "label": "Мешање на деформација", + "doc": "Колку DTW резултатот на порамнување го заменува основниот резултат на Фаза 2. 0 = користи само резултат на Фаза 2, 1 = користи само DTW резултат, 0,5 (стандардно) = еднакво мешање. Зголемете за поголемо потпирање на warp порамнување кога програмите имаат слични нивоа на моќност но различни временски обрасци." + }, + "dtw_ensemble_w": { + "label": "Микс на комбинација DTW", + "doc": "Во комбинираниот DTW режим (стандардниот), тежина на скалиран L1 наспроти изводен DTW (DDTW). 1,0 = само скалиран L1, 0 = само DDTW, 0,7 = стандардно. Скалираната варијанта L1 ги споредува нивоата на моќност; изводната варијанта реагира на промените на моќноста низ времето. Комбинираниот режим ги спојува двете." + }, + "dtw_ddtw_scale": { + "label": "Скала на изводна деформација", + "doc": "Растојание на пол-заситување за оценување со изводен DTW. Резултатот се преполовува кога растојанието DDTW е еднакво на оваа вредност. Помало = поосетливо на разлики во форма. Стандардната вредност 30 е калибрирана за типични траги на моќност на домашни апарати. Влијае само на комбинираниот и ddtw режим на DTW." + }, + "dtw_refine_top_n": { + "label": "Број на прецизирани кандидати", + "doc": "Колку врвни кандидати на Фаза 2 DTW повторно ги оценува. DTW е поскап па се применува само за N најдобри кандидати. Стандардно 5. Зголемете (на 7-9) ако правилниот профил понекогаш достигнува само 4. или 5. место по Фаза 2 - DTW може да го спаси. Намалувањето малку го забрзува совпаѓањето." + }, + "duration_scale": { + "label": "Острина на траење", + "doc": "Острина на казната за несовпаѓање на траење во Фаза 4. Ова е лог-однос при кој резултатот на согласност се преполовува. Помал = построг: несовпаѓањето на траење повеќе го намалува резултатот. Стандардната вредност 0,175 одговара на толеранција на траење од околу 18% при пол-тежина. Употребувајте заедно со Тежината на траење." + }, + "energy_scale": { + "label": "Острина на енергија", + "doc": "Острина на казната за несовпаѓање на енергија во Фаза 4. Помал = построг: несовпаѓањето на енергија повеќе го намалува резултатот. Стандардната вредност 0,25 е намерно попустлива отколку Острината на траење бидејќи енергијата варира со оптоварувањето. Употребувајте заедно со Тежината на енергија." + }, + "power_profile_interval_min": { + "label": "Интервал на профилот на моќност", + "doc": "Големина на сегментот за атрибутот на сензорот power_profile по профил (рамна низа просечни вати по слот, користена од надворешни планери како EMHASS и tibber_prices). Помали сегменти ги задржуваат кратките врвови на моќноста остри; поголемите ја израмнуваат формата. Стандардно 15 мин. Само за читање; не влијае на откривањето." + }, + "notify_live_sticky": { + "label": "Задржи живото известување при допир", + "doc": "Само за Android. Нека известувањето за напредокот во живо биде постојано (прикачено) за да не се отфрли со допир. Исклучено го задржува стандарното однесување каде допирот го отфрлува." + }, + "notify_live_click_action": { + "label": "Цел при допир на живото известување", + "doc": "Само за Android. Каде се отвора допирот на известувањето за напредок во живо (на пр. /lovelace/laundry или целосен URL) наместо почетната страна на апликацијата. Оставете празно за стандарното однесување." + }, + "door_opens_at_end": { + "label": "Вратата се отвора автоматски на крај", + "doc": "За машини за миење садови чија врата се отвора на крајот на циклусот за сушење (AirDry и слично). Со вклучено, отворање на вратата за време на тековниот циклус повеќе не го паузира засекогаш; наместо тоа, ако вратата остане отворена за времето на задржување подолу, WashData го третира циклусот како завршен. Кратко отворање (додавање предмет) се игнорира. Потребен е ентитет на сензор за врата." + }, + "door_end_dwell_seconds": { + "label": "Задржување при отворена врата", + "doc": "Колку долго вратата мора да остане отворена пред WashData да го заврши циклусот, кога е вклучено \"Вратата се отвора автоматски на крај\". Доволно долго за да се игнора брзото додавање сад (стандардно 60 с), доволно кратко за брзо завршување откако машината ја отвора вратата." + } + }, + "setting_group": { + "auto_labeling": { + "label": "Автоматско означување" + }, + "cycle_end": { + "label": "Крај на циклус" + }, + "cycle_start": { + "label": "Почеток на циклус" + }, + "cycle_timers": { + "label": "Тајмери за циклус" + }, + "data_management": { + "label": "Управување со податоци" + }, + "debug": { + "label": "Дебагирање" + }, + "dishwasher_end": { + "label": "Крај на миење садови" + }, + "door_pause": { + "label": "Врата и пауза" + }, + "dtw_refinement": { + "label": "DTW прецизирање" + }, + "duration_gates": { + "label": "Порти за времетраење" + }, + "energy": { + "label": "Енергија" + }, + "external_end_trigger": { + "label": "Надворешен тригер за крај" + }, + "housekeeping": { + "label": "Одржување" + }, + "match_scoring": { + "label": "Бодување за совпаѓање" + }, + "messages": { + "label": "Пораки" + }, + "power_off": { + "label": "Исклучување на напојувањето" + }, + "predictive_end": { + "label": "Предвидливо завршување" + }, + "schedule": { + "label": "Распоред" + }, + "services": { + "label": "Услуги" + }, + "signal_processing": { + "label": "Обработка на сигналот" + }, + "thresholds_gap": { + "label": "Прагови и јаз" + }, + "timing": { + "label": "Тајмирање" + }, + "unload_reminder": { + "label": "Потсетник за истовар" + }, + "watchdog": { + "label": "Чувар" + }, + "quiet_hours_milestones": { + "label": "Тивки часови и пресвртници" + }, + "device_info": { + "label": "Информации за уредот" + }, + "basic_configuration": { + "label": "Основна конфигурација" + } + }, + "status": { + "active": "Активен", + "all_statuses": "Сите статуси", + "ambiguous": "Двосмислена", + "auto_detect": "Автоматско откривање", + "clear": "Јасно", + "completed": "Завршено", + "fine_tuning": "фино подесување сега…", + "force_stopped": "Силата запре", + "idle": "Неактивен", + "interrupted": "Прекинато", + "ready": "Подготвен за обработка", + "recording": "Снимање", + "training": "Обука…", + "saving": "Зачувување…", + "rebuilding": "Обновување…", + "analyzing": "Анализирање…", + "resetting": "Ресетирање…", + "reverting": "Враќање…", + "trimming": "Скратување…", + "splitting": "Разделување…", + "deleting": "Бришење…", + "imported": "Увезено" + }, + "tab": { + "advanced": "Напредно", + "diagnostics": "Дијагностика", + "history": "Циклуси", + "ml": "МЛ обука", + "pp_cleanup": "Чистење", + "pp_manage": "Управувај", + "pp_overview": "Преглед", + "pp_phases": "Фази", + "profiles": "Профили", + "settings": "Поставки", + "status": "Преглед", + "subtab_phase_catalog": "Фазен каталог", + "subtab_profiles": "Профили", + "maintenance": "Одржување", + "playground": "Песочник", + "store": "Продавница" + }, + "tag": { + "early_end": "Ран крај", + "late_start": "Задоцнет почеток", + "merged": "Споени циклуси", + "noise": "Бучава", + "sensor_gap": "Сензорска празнина", + "split": "Сплит циклус", + "wrong_profile": "Погрешен профил" + }, + "toast": { + "access_saved": "Контролата за пристап е зачувана", + "all_wiped": "Сите податоци се избришани", + "analysis_complete_none": "Анализата е завршена: нема нови предлози", + "auto_label_complete": "Автоматската етикета е завршена", + "automation_deleted": "Автоматизацијата е избришана", + "correction_submitted": "Исправката е поднесена", + "cycle_deleted": "Циклусот е избришан", + "cycle_force_stopped": "Циклусот со сила е запрен", + "cycle_labelled": "Циклус означен", + "cycle_paused": "Циклусот е паузиран", + "cycle_resumed": "Циклусот продолжи", + "cycle_trimmed": "Циклус скратен", + "cycles_merged": "Циклусите се споија", + "envelope_rebuilt": "Пликот повторно изграден", + "envelopes_rebuilt": "Пликовите повторно изградени", + "export_downloaded": "Преземено е извоз", + "feedback_all_dismissed": "Сите повратни информации се отфрлени", + "feedback_confirmed": "Повратните информации се потврдени", + "feedback_dismissed": "Повратните информации се отфрлени", + "group_deleted": "Групата е избришана", + "group_name_required": "Името на групата е потребно", + "group_saved": "Групата е зачувана", + "import_successful": "Увозот е успешен; интеграција повторно вчитување", + "json_required": "Потребни се податоци за JSON", + "legacy_removed": "Дејствата за наследство се отстранети", + "logs_exported": "Извезени дневници", + "matching_reverted": "Соодветните тежини се вратија на стандардни", + "min_2_profiles": "Изберете најмалку 2 профили за група", + "ml_training_no_improvement": "Обуката е завршена: основната линија е задржана (без подобрување)", + "models_reverted": "Моделите на уредот се вратија на основната линија", + "name_required": "Потребно е име", + "no_split_found": "Не се пронајдени празни празнини за да се подели", + "panel_settings_saved": "Поставките на панелот се зачувани", + "pg_preset_loaded": "Конфигурацијата „{name}“ е вчитана", + "pg_preset_saved": "Конфигурацијата „{name}“ е зачувана", + "pg_sugg_loaded": "Вчитани {n} предложени вредности - стартувај го песочникот за споредба", + "pg_sugg_ml_loaded": "Вчитани {n} ML калибрирани вредности - стартувај го песочникот за споредба", + "phase_name_required": "Потребно е име на фаза", + "phase_updated": "Фазата е ажурирана", + "phases_saved": "Фазите се зачувани", + "preferences_saved": "Поставките се зачувани", + "profile_name_required": "Потребно е името на профилот", + "profile_renamed": "Профилот е преименуван", + "recording_discarded": "Снимањето е отфрлено", + "recording_saved": "Снимката е зачувана на профилот", + "recording_started": "Снимањето започна", + "recording_stopped": "Снимањето прекина", + "review_saved": "Прегледот е зачуван", + "settings_conflicts": "Поправете ги означените конфликти во поставките пред зачувување.", + "settings_reverted": "Поставките се вратени; интеграција повторно вчитување", + "settings_saved": "Зачувани се поставките; интеграција повторно вчитување", + "suggestions_applied": "Применети предлози; интеграција повторно вчитување", + "suggestions_dismissed": "Предлозите се отфрлени", + "apply_failed": "Примената не успеа: {error}", + "delete_failed": "Бришењето не успеа: {error}", + "load_more_failed": "Не може да се вчита повеќе: {error}", + "maint_add_failed": "Не може да се додаде настан: {error}", + "maint_added": "Настанот за одржување е додаден", + "maint_delete_failed": "Не може да се избрише настанот: {error}", + "maint_deleted": "Настанот за одржување е избришан", + "relabel_done": "Повторно означени {count} циклуси", + "relabel_failed": "Повторното означување не успеа: {error}", + "reminders_save_failed": "Не може да се зачуваат потсетниците: {error}", + "reminders_saved": "Потсетниците за сервис се зачувани", + "pause_no_cycle": "Нема активен циклус за паузирање", + "resume_no_cycle": "Нема паузиран циклус за продолжување", + "delete_partial_failed": "Некои ставки не можеа да се избришат и беа вратени", + "pg_run_gone": "Тоа извршување повеќе не е достапно.", + "task_cancelled": "Откажано.", + "processed": "Обработено {bits}", + "processed_cycles": "{n} циклуси", + "processed_suggestions": "{n} предлози", + "processed_models": "{n} активирани модели", + "store_search_failed": "Пребарувањето не успеа: {error}", + "store_connect_failed": "Поврзувањето не успеа: {error}", + "store_connected": "Поврзано со продавницата на заедницата", + "store_disconnected": "Прекината врска со продавницата на заедницата", + "store_error": "Грешка: {error}", + "store_unavailable": "Продавницата на заедницата не е достапна.", + "store_pick_profile": "Изберете профил во кој да се спои", + "store_name_required": "Внесете име на профил", + "store_import_failed": "Увозот не успеа: {error}", + "store_imported": "Увезено во {profile}", + "store_program_required": "Внесете име на програма", + "store_no_appliance": "Прво поставете го брендот и моделот на уредот во поставките.", + "store_share_failed": "Споделувањето не успеа: {error}", + "store_shared": "Споделено во продавницата на заедницата, чека преглед.", + "appliance_added": "Уредот е додаден, чека одобрување", + "thanks_confirming": "Благодариме за потврдата", + "device_approved": "Одобрено од заедницата", + "rating_saved": "Оцената за квалитет е зачувана", + "brand_added": "Брендот е додаден, чека одобрување", + "profile_added": "Профилот е додаден, чека одобрување", + "saved_except_conflicts": "Поставките се зачувани -- {n} поставка{s} прескокната поради конфликти", + "share_device_none_sel": "Изберете барем една програма за споделување", + "store_device_downloaded": "Поставките на уредот се преземени: {created} профил{c} создаден, {dup} веќе постоеше", + "store_device_downloaded_phases": "Поставките на уредот се преземени: {created} профил{c} создаден, {dup} веќе постоеше, картата на фазите е применета", + "store_device_downloaded_settings": "Поставките на уредот се преземени: {created} профил{c} создаден, {dup} веќе постоеше, поставките се применети", + "store_device_shared": "Поставките на уредот се споделени: {n} програм{s} прикачена", + "store_device_shared_all_dup": "Нема ништо ново за споделување -- сите програми веќе постојат во продавницата", + "store_device_shared_partial": "Делумно споделување: {n} програм{s} прикачена, {failed} прескокнато", + "store_device_shared_some_dup": "Поставките на уредот се споделени: {n} програм{s} прикачена ({dup} веќе постоеше)", + "store_download_failed": "Неуспешно преземање: {error}", + "store_download_nothing": "Нема ништо за преземање -- сите профили веќе постојат на овој уред", + "export_selective_done": "Извозот е преземен", + "import_selective_done": "Увезени се {profiles} профил(и) и {cycles} циклус(и)" + }, + "suggestion": { + "both_agree": "WashData препорачува", + "calibrated_label": "Калибрирано", + "observed_label": "Набљудувано", + "impact": { + "auto_label_confidence": { + "higher": "Автоматски означува помалку циклуси; повеќе одат на преглед", + "lower": "Автоматски означува повеќе циклуси; некои може да бидат погрешно идентификувани" + }, + "duration_tolerance": { + "higher": "Прифаќа поширок опсег на траење – пофлексибилно поврзување", + "lower": "Бара поточно совпаѓање на траење – построго, но може да ги отфрли невообичаените циклуси" + }, + "end_energy_threshold": { + "higher": "Затвора само циклуси со значителна потрошувачка на енергија", + "lower": "Затвора и пократки или понискоенергетски циклуси" + }, + "end_repeat_count": { + "higher": "Бара сигналот за крај да се повтори повеќе пати – посигурно, малку побавно", + "lower": "Завршува по помалку повторувања – побрзо откривање, поголем ризик од лажен крај" + }, + "learning_confidence": { + "higher": "Учи само од многу сигурни совпаѓања – побавно, но посигурно", + "lower": "Учи од повеќе циклуси; моделот може да биде позашумен" + }, + "min_off_gap": { + "higher": "Потребен е подолг период на неактивност пред нов циклус", + "lower": "Краток период на неактивност стартува нов циклус – последователните работи може да се поделат" + }, + "min_power": { + "higher": "Помалку чувствителен на фонска потрошувачка; може да ги пропушти тивките програми", + "lower": "Почувствителен; може да ја регистрира потрошувачката во режим на мирување како активност" + }, + "no_update_active_timeout": { + "higher": "Повеќе време пред прогласување на заглавен циклус", + "lower": "Принудно запира заглавен циклус побрзо" + }, + "off_delay": { + "higher": "Повеќе време за паузи на уредот – управува со долго натопување или сушење", + "lower": "Побрзо откривање на крај – добро за уреди со јасно вкл./искл." + }, + "profile_match_threshold": { + "higher": "Потврдува само совпаѓања со висока сигурност; повеќе циклуси остануваат без ознака", + "lower": "Поврзува повеќе циклуси; некои може да бидат малку погрешни" + }, + "running_dead_zone": { + "higher": "Ги игнорира кратките скокови на моќност во неактивност – помалку чувствителен на шум", + "lower": "Реагира на пократки наплив на моќност – ги фаќа брзите преодни активности" + }, + "start_threshold_w": { + "higher": "Избегнува лажни стартови од кратковремени скокови на моќност", + "lower": "Ги фаќа програмите со мала моќност; може да се активира на шум" + }, + "stop_threshold_w": { + "higher": "Го завршува циклусот побрзо – може да затвори за време на пауза", + "lower": "Чека подолго за завршување – помалку предвремени завршувања" + }, + "watchdog_interval": { + "higher": "Дозволени подолги тивки фази; помалку лажни принудни запирања", + "lower": "Поагресивно ги фаќа заглавените циклуси" + } + }, + "reason": { + "auto_label_confidence": "Доверба на 15-от перцентил за {cycles} автоматски ознаки што корисникот никогаш не ги коригирал ({p15}).", + "completion_min_seconds": "Половина од траењето на чист циклус p05 ({minutes} min) низ {cycles} циклуси; ги филтрира лажните циклуси.{excl}", + "dead_zone_batch": "Задржано кратко (медијана на прозорецот на нестабилност при стартување низ {cycles} циклуси = {s}s) за вистинскиот крај да се препознае брзо.", + "dead_zone_from_dip": "Врз основа на ран пад на моќноста откриен на {s}s.", + "end_energy_default": "Препорачана појдовна вредност по стандард за прагот на шум на крајот на циклусот.", + "end_energy_false": "Енергија при лажен крај p95 ({p95}Wh) низ {cycles} циклуси, со долна граница од 0,2 % од медијаната на енергијата на циклусот ({floor}Wh).", + "end_energy_no_false": "Нема лажни краеви низ {cycles} циклуси; со долна граница од 0,2 % од медијаната на енергијата на циклусот ({floor}Wh).", + "end_repeat_count": "{false}/{total} чисти циклуси ({pct}%) имале внатрешна пауза подолга од 60s што продолжила; барај {val} потврда(и) за крај.", + "learning_confidence": "Доверба p05 на {cycles} циклуси означени од корисникот ({p05}); под оваа вредност барај проверка.", + "match_interval": "Врз основа на забележаната зачестеност на ажурирање (медијана={median}s) * 10.", + "max_duration_ratio": "Врз основа на траењата на означените циклуси (p95={p95}).", + "min_active": "Врз основа на минималната работна моќност ({min}W) забележана во последниот циклус.", + "min_duration_ratio": "Задржано што е можно пониско за програмата да се препознае рано во циклусот; праговите на доверба и двосмисленост спречуваат прерани потврди.", + "min_off_gap": "Врз основа на {gaps} забележани интервали меѓу циклусите (p05={p05}s). Долна граница на уредот: {floor}s.", + "min_off_gap_bridge": "Димензионирано да го премости најдолгиот тивок период во рамките на циклусот: {span}s + 60s резерва, од {spans} премостени интервали низ {cycles} чисти циклуси (останува под вашиот најкраток размак меѓу две последователни вклучувања, кој изнесува {ceiling}s).", + "min_power": "40 % од најниската работна моќност p05 ({p05}W) низ {cycles} чисти циклуси, за прагот на исклучување да остане под реалната потрошувачка.{excl}", + "ml_auto_label": "Најниската доверба што моделот за квалитет сепак ја оценил како чиста (p10 од {cycles} чисти циклуси = {p10}).", + "ml_end_repeat": "{false}/{total} циклуси ({pct}%) имале пауза што детекторот за крај ја оценил над 50 %; барај {val} потврда(и) за крај.", + "ml_off_delay": "Паузи потврдени од детекторот за крај: p95 {p95}s + 60s резерва, од {pauses} паузи проверени од моделот низ {cycles} циклуси (долна граница {floor}s).", + "no_update_timeout": "Врз основа на забележаната зачестеност на ажурирање (p95={p95}s) * 20 (мин. 60s).", + "off_delay_cadence": "Врз основа на забележаната зачестеност на ажурирање (p95={p95}s) * 5", + "off_delay_device_floor": "Употребен е безбеден минимум специфичен за уредот {device} ({floor}s).", + "off_delay_generic_floor": "Употребен е општ безбеден минимум ({floor}s).", + "off_delay_pauses": "Димензионирано да ги надживее вистинските паузи: пауза во рамките на циклусот p95 {p95}s + 60s резерва, од {pauses} паузи низ {cycles} чисти циклуси (долна граница {floor}s).", + "profile_match_threshold": "Доверба p10 на {cycles} точни автоматски ознаки ({p10}); безбедна долна граница за потврда во живо.", + "sampling_interval": "Медијана на интервалот на ажурирање забележана низ {cycles} чисти циклуси ({si}s).{excl}", + "smoothing_window": "Димензионирано да измазни ~30s отчитувања при семплирање од {si}s ({samples} примероци).", + "start_duration": "Задржано кратко (~еден интервал на семплирање од {si}s) за детекцијата да започне што е можно порано, а сепак да ги игнорира поединечните скокови.", + "thr_batch": "Задржано веднаш над најниската работна моќност p05 низ {cycles} циклуси ({p05}W) за стартот да се фати што е можно порано, а прагот на запирање да остане под најниската работна моќност на машината.", + "tol_per_profile": "p75 на варијансата на траењето по профил низ {profiles} профили ({cycles} циклуси); доследните профили не се казнуваат.", + "tol_pooled": "Врз основа на здружената варијанса на траењето на {cycles} неодамнешни означени циклуси (p95 отстапување={dev}).", + "watchdog": "Задржано што е можно пониско додека е безбедно (малку над интервалот на ажурирање p95 од {p95}s, мин. 30s) за застоите брзо да се фатат без лажни запирања." + }, + "exclusions": { + "summary": "Исклучени се {total} погрешно откриени циклуси: {parts}.", + "reason": { + "force_stopped": "присилно запрени", + "interrupted": "прекинати", + "incomplete": "нецелосни", + "noise": "бучава", + "unlabeled": "без етикета", + "no_trace_short": "премногу кратки за анализа", + "high_start": "започнати при висока моќност", + "abrupt_end": "нагло завршени", + "mid_restart": "рестарт среде циклус", + "no_power": "без моќност", + "no_active_power": "без активна моќност" + } + } + }, + "trend": { + "down": "Во тренд надолу", + "up": "Во тренд нагоре" + }, + "maint": { + "bearing_service": "Сервис на лежишта", + "descale": "Отстранување на бигор", + "drum_clean": "Исчисти го барабанот", + "filter_clean": "Исчисти го филтерот", + "other": "Друго" + }, + "pg_desc": { + "dishwasher_end_spike_quiet_release": "Машина за миење садови: секунди неактивност по очекуваното траење пред да се ослободи чекањето за испумпување на крајот од циклусот", + "completion_min_seconds": "Најкратко извршување што се смета за вистински циклус", + "end_repeat_count": "Ниски отчитувања по ред пред завршување", + "interrupted_min_seconds": "Кратки циклуси означени како прекинати", + "min_off_gap": "Празнина потребна за раздвојување на два циклуси", + "off_delay": "Секунди ниска моќност пред крајот на циклусот", + "start_duration_threshold": "Секунди над прагот за потврда на стартот", + "start_threshold_w": "Минимум вати за да се смета за започнато", + "stop_threshold_w": "Под ова, машината се смета за исклучена", + "anti_wrinkle_enabled": "Апсорбирајте ги импулсите на превртување на барабанот по главната фаза, наместо да ги читате како нови циклуси", + "anti_wrinkle_exit_power": "Моќноста меѓу импулсите мора да падне под ова за режимот против брчки да остане активен", + "anti_wrinkle_idle_timeout": "Дозволена тишина меѓу два импулса на превртување на барабанот пред режимот против брчки да заврши", + "anti_wrinkle_max_duration": "Импулс подолг од ова го завршува режимот против брчки и отвора нов циклус", + "anti_wrinkle_max_power": "Импулс над ова го завршува режимот против брчки и отвора нов циклус", + "dtw_bandwidth": "Фаза 3: warp лента на Sakoe-Chiba (0 = DTW исклучен; стандардно 0,2 = 20% од должината на циклусот)", + "corr_weight": "Фаза 2: рамнотежа помеѓу обликот на кривата (корелација) и нивото на моќност (MAE); стандардно 0,45", + "duration_weight": "Фаза 4: колку силно согласноста на траење влијае на конечниот резултат (стандардно 0,22)", + "energy_weight": "Фаза 4: колку силно согласноста на енергија влијае на конечниот резултат (стандардно 0,22)", + "profile_match_min_duration_ratio": "Фаза 1: минимална должина на циклус како дел од траењето на профилот; стандардно 0,1 (10%)", + "profile_match_max_duration_ratio": "Фаза 1: максимална должина на циклус како дел од траењето на профилот; стандардно 1,5 (150%)", + "keep_min_score": "Фаза 2: минимален резултат за останување во трката; стандардно 0,1 прифаќа слаби совпаѓања, подоцнежните фази го избираат најдоброто", + "dtw_blend": "Фаза 3: 0 = само основен резултат, 1 = само DTW резултат, 0,5 = еднакво мешање (стандардно)", + "dtw_ensemble_w": "Фаза 3 (комбиниран режим): тежина на скалиран L1 наспроти изводен DTW; стандардно 0,7 ги фаворизира нивоата", + "dtw_ddtw_scale": "Фаза 3: растојание на пол-заситување на DDTW; помало = поосетливо на форма (стандардно 30)", + "dtw_refine_top_n": "Фаза 3: кандидати кои DTW повторно ги оценува; зголемете на 7-9 ако правилниот профил заземе 4.-5. место (стандардно 5)", + "duration_scale": "Фаза 4: лог-однос каде согласноста на траење се преполовува; помал = построга казна (стандардно 0,175)", + "energy_scale": "Фаза 4: лог-однос каде согласноста на енергија се преполовува; помал = построга казна (стандардно 0,25)" + }, + "col": { + "profile_tip": "Име на совпаднатата програма. „Неозначено“ значи дека на крајот на циклусот не се совпадна ниту еден профил.", + "status_tip": "Исход на циклусот: Завршен (природен крај), Прекинат (нагло паѓање на моќноста), Присилно стопиран (рачно) или Треба преглед (се чека повратна информација).", + "date_tip": "Датум и време кога започна циклусот.", + "duration_tip": "Вкупно време на извршување на циклусот од почеток до крај.", + "energy_tip": "Вкупно потрошена енергија (kWh). Се пресметува со интегрирање на моќноста во текот на времето.", + "cost_tip": "Цена на енергијата за овој циклус, замрзната при завршување со тогаш важечката цена (енергија × цена по kWh). Поставете цена во Поставки за да се пополни.", + "confidence_tip": "Доверба на совпаѓањето на профилот (0–100%). Колку прецизно кривата на моќноста на циклусот се совпадна со идентификуваната програма.", + "health_tip": "ML здравје на циклусот (повисоко = подобро). Кликнете на циклус за да го инспектирате и прегледате.", + "flags_tip": "Ознаки на заедницата и показатели за квалитет на податоците" + }, + "stat": { + "avg": "просек", + "min": "мин {v}", + "max": "макс {v}", + "consistency": "постојаност ±{v}", + "total": "вкупно {v}", + "last_run": "последно извршување {v}", + "score": "оценка {pct}%", + "duration_cv": "CV на времетраењето {pct}%", + "avg_confidence": "просечна доверба {pct}%" + }, + "pg_evd": { + "detected": "Детекторот препозна дека циклусот започнал.", + "match_commit": "Механизмот за совпаѓање избра програма со доволна сигурност.", + "match_changed": "Водечката програма се промени како се гледаше поголем дел од циклусот.", + "match_ambiguous": "Две програми добија блиски резултати, па совпаѓањето беше несигурно.", + "unmatched": "Ниту една зачувана програма не одговараше на овој циклус.", + "notify_start": "Ќе се испратеше известување за стартување.", + "notify_pre_complete": "Ќе се испратеше известување дека циклусот е речиси завршен.", + "notify_finish": "Ќе се испратеше известување за завршување.", + "notify_milestone": "Ќе се испратеше известување за пресвртница.", + "notify_held": "Известувањето беше задржано поради тивките часови.", + "finished": "Циклусот достигна крајна состојба и заврши." + }, + "store": { + "browse": "Прелистување", + "device": "Уред", + "favorites": "Омилени", + "search_ph": "Пребарување по бренд или модел…", + "no_results": "Не се пронајдени соодветни уреди. Обидете се со друго пребарување.", + "n_programs": "{n} програми", + "n_cycles": "{n} циклуси", + "no_programs": "Сè уште нема споделени програми за овој уред.", + "no_cycles": "Сè уште нема споделени референтни циклуси за оваа програма.", + "anon": "анонимен", + "uploaded_by": "Споделено од {name}", + "connected_as": "Поврзан како {name}", + "not_connected": "Не сте поврзани. Поврзете сметка на GitHub за да ги споделувате вашите циклуси.", + "import_new": "Нов профил", + "import_merge": "Спој со постоен", + "merge_target": "Спој во профил", + "description": "Опис (опционално)", + "contributed_by": "од {name}", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "Сè уште нема оцени", + "website": "Веб-страница на продавницата ↗", + "website_tip": "Отвори ја веб-страницата на продавницата на заедницата" + }, + "settings": { + "gear": { + "title": "Поставки" + } + }, + "link": { + "manual": "Прирачник ↗", + "add_appliance": "Додајте го вашиот уред" + }, + "tip": { + "add_brand": "Брендот го нема на списокот? Додајте го во каталогот на заедницата", + "add_appliance": "Моделот го нема на списокот? Додајте го вашиот уред во каталогот на заедницата", + "add_profile": "Додајте профил за овој уред на сајтот на заедницата" + }, + "task": { + "reprocess": { + "matching": "Повторна обработка: совпаѓање на циклуси", + "golden": "Повторна обработка: пополнување референтни", + "suggestions": "Повторна обработка: предлози", + "ml_training": "Повторна обработка: МЛ обука", + "health": "Повторна обработка: здравје на циклусите" + }, + "pg_sweep": { + "optimize": "Оптимизирање: {param}" + }, + "pg_detail": { + "simulate": "Симулирај циклус" + }, + "split": { + "apply": "Разделување на циклус" + }, + "trim": { + "apply": "Отсекување на циклус" + }, + "merge": { + "apply": "Спојување на циклуси" + }, + "rebuild": { + "envelopes": "Повторно градење на обвивки" + } + }, + "setup": { + "hdr": { + "card": "Поставување на уред", + "healthy_chip": "Поставувањето е завршено" + }, + "phase0": { + "washer": "WashData веќе ги открива вашите циклуси. Снимете го првиот циклус за да ги овозможите имињата на програмите и проценките на времето.", + "dishwasher": "WashData набљудува. Машините за миење садови имаат сложени циклуси – снимањето на првиот циклус е изразито препорачано. Ако открит циклус трае предолго, користете го уредувачот на циклуси за скратување пред зачувување како профил.", + "generic": "WashData набљудува. Снимете или означете откриен циклус за да започнете со градење профили." + }, + "phase1a": { + "labelled": "Добар почеток – вашата прва програма е зачувана. За најчисти податоци, размислете за снимање на следниот циклус со додатокот за снимање." + }, + "phase1b": { + "recorded": "Вашата снимка е зачувана како {profile_name}. Сега снимете или означете ги другите чести програми за да ја проширите покриеноста." + }, + "phase1c": { + "verify": "Имате {count} програми од заедницата. Стартувајте циклус за да проверите дали WashData ги препознава правилно – совпаѓањето ќе се подобрува додека вашиот уред ја гради сопствената историја." + }, + "phase2": { + "cluster": "WashData видел {count} циклуси кои не одговараат на ниедна зачувана програма – меѓусебно си наликуваат. Сакате ли за нив да создадете нов профил?", + "unmatched": "Вашиот последен циклус не одговараше на ниедна зачувана програма. Дали е тоа нова програма?" + }, + "phase3": { + "suggestions": "WashData има препораки за поставки засновани на историјата на вашите циклуси – прегледајте ги за подобрување на точноста на откривање.", + "groups": "Некои од вашите профили изгледаат како иста програма на различни температури. Организирајте ги во група за подобро совпаѓање.", + "phases": "Додадете фази на програмата кон {profile_name} за попрецизни проценки на преостанатото време." + }, + "phase4": { + "healthy": "Овој уред е целосно поставен ({profile_count} профили)." + }, + "cta": { + "start_recording": "Започни снимање", + "label_detected_cycle": "Веќе имам откриен циклус – означи го наместо тоа", + "browse_cycles": "Прелистај циклуси за означување на следниот", + "view_profiles": "Погледни ги вашите профили", + "create_from_cluster": "Создај профил од овие циклуси", + "create_profile": "Создај за него профил", + "review_suggestions": "Прегледај препораки", + "organise_profiles": "Организирај профили", + "configure_phases": "Конфигурирај фази", + "skip_step": "Прескокни го овој чекор", + "skip_forever": "Не прикажувај повеќе", + "hide_guidance": "Скриј насоки", + "show_guidance": "Прикажи насоки" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/nb.json b/custom_components/ha_washdata/translations/panel/nb.json index b82e800e..ff0769e1 100644 --- a/custom_components/ha_washdata/translations/panel/nb.json +++ b/custom_components/ha_washdata/translations/panel/nb.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entitet ikke funnet", + "running_long": "Kjører lenger", + "remaining": "gjenstår", + "progress": "fremdrift", + "show_time_remaining": "Vis gjenstående tid", + "show_percentage": "Vis prosent", + "layout": { + "tile": "Flis (kompakt)", + "detail": "Detalj (fyldig)", + "glance": "Oversikt (flere enheter)" + }, + "btn": { + "pause": "Pause", + "resume": "Fortsett", + "terminate": "Avslutt syklus", + "record_start": "Start opptak", + "record_stop": "Stopp opptak", + "program": "Program", + "open_panel": "Åpne WashData" + }, + "editor": { + "layout": "Oppsett", + "entity": "Apparatentitet", + "entities": "Apparater", + "title": "Tittel", + "icon": "Ikon", + "show_state": "Vis tilstand", + "show_program": "Vis program", + "show_progress_bar": "Vis fremdriftslinje", + "spin_icon": "Roter ikon under kjøring", + "display_mode": "Detaljlinje", + "active_color": "Overstyr aktiv farge", + "show_phase": "Vis fase", + "show_energy": "Vis energi og kostnad", + "show_anomaly": "Vis varsel om lang kjøring", + "show_sparkline": "Vis sanntids effektgraf", + "buttons": "Handlingsknapper", + "program_entity": "Programentitet (overstyr)", + "time_entity": "Tidsentitet (overstyr)", + "pct_entity": "Fremdriftsentitet (overstyr)", + "power_entity": "Effektentitet (overstyr)", + "tap_action": "Trykkhandling", + "hold_action": "Holdhandling", + "double_tap_action": "Dobbelttrykkhandling" + } + }, "badge": { "artifact_tip": "{n} avvik oppdaget (f.eks. dør åpnet midt i syklusen) – åpne for å se dem på grafen", "auto": "(automatisk oppdaget)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Sett den kjørende syklusen på pause – apparatet fortsetter der det slapp", "pg_apply_device": "Bruk på enhet", "pg_autofill": "Autofyll", + "pg_load_calibrated": "Last inn kalibrerte (ML) ({n})", + "pg_load_calibrated_tip": "Laster inn ML-kalibrerte innstillinger som sandkasse-overstyringer", + "pg_load_live": "Last inn aktive innstillinger", + "pg_load_live_tip": "Les inn integrasjonens gjeldende innstillinger på nytt og forkast alle endringer i sandkassen", + "pg_load_suggested": "Last inn forslag ({n})", + "pg_load_suggested_tip": "Laster inn auto-tunerens gjeldende forslag som sandkasse-overstyringer", + "pg_preset_delete": "Slett forhåndsinnstilling", + "pg_preset_load": "Last inn forhåndsinnstilling", + "pg_preset_load_tip": "Erstatt verdiene i sandkassen med denne forhåndsinnstillingen (de aktive innstillingene berøres ikke)", + "pg_preset_save": "Lagre som forhåndsinnstilling", + "pg_preset_save_tip": "Lagre alle verdiene nedenfor som en navngitt forhåndsinnstilling for denne enheten", + "pg_publish_all": "Lagre {n} i integrasjonen", + "pg_publish_one": "Lagre {label} i integrasjonen", "play": "Spill av", "process": "Behandl", "process_history": "Behandl nå", @@ -178,7 +239,9 @@ "download_export": "Last ned eksport", "analyze_import": "Analyser fil", "import_selected": "Importer valgte", - "back": "Tilbake" + "back": "Tilbake", + "mute_suggestion": "Slutt å foreslå denne innstillingen", + "reset_muted": "Tilbakestill dempede forslag" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +338,7 @@ "no_automations": "Ingen automatiseringer refererer til denne enheten ennå.", "panel_settings": "Panelinnstillinger", "param_sweep": "Parametersveip", + "pg_settings_source": "Kilde for innstillingene", "phase_catalog": "Fasekatalog", "playground": "Sandkasse", "process_history": "Prosesshistorie", @@ -410,6 +474,9 @@ "pg_group_detection": "Deteksjonsutløsere", "pg_group_timing": "Tidsregler", "pg_idle": "Inaktiv", + "pg_preset": "Forhåndsinnstilling for sandkassen", + "pg_preset_name": "Navn på ny forhåndsinnstilling", + "pg_preset_none": "Velg en forhåndsinnstilling…", "pg_stress_group": "Test av inaktiv avslutning", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Inaktivt nivå (W)", @@ -609,7 +676,8 @@ "conflict_import_copy": "Importer som kopi", "conflict_keep_mine": "Behold mine", "conflict_overwrite": "Overskriv", - "pg_anti_wrinkle": "Anti-rynke" + "pg_anti_wrinkle": "Anti-rynke", + "font_size": "Panelets skriftstørrelse" }, "log": { "all_levels": "Alle nivåer", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Bruke beste verdi: {label} = {value}?", "pg_canvas_empty": "Velg en syklus ovenfor, og trykk deretter Last inn for å se effektkurven.", "pg_chart_caption": "Deteksjons-/treffrate på tvers av verdier for {param}", + "pg_ctrl_intro": "Verdiene tar utgangspunkt i denne enhetens aktive innstillinger i integrasjonen. Endringer blir værende i sandkassen til du lagrer dem i integrasjonen.", + "pg_live_unavailable": "Aktive innstillinger er ikke tilgjengelige, viser standardverdier.", + "pg_load_live_confirm": "Forkaste {n} endring(er) i sandkassen og laste inn integrasjonens gjeldende innstillinger på nytt?", "pg_match_rate": "{pct}% treffrate på {total} sykluser", + "pg_matches_live": "Samsvarer med de aktive innstillingene", + "pg_n_changed": "{n} endret sammenlignet med de aktive innstillingene", + "pg_sugg_none": "Alle forslag samsvarer allerede med de aktive innstillingene", + "pg_preset_delete_confirm": "Slette forhåndsinnstillingen \"{name}\"?", + "pg_preset_limit": "Grensen for forhåndsinnstillinger er nådd ({n})", + "pg_preset_overwrite": "Overskrive forhåndsinnstillingen \"{name}\"?", + "pg_publish_one_confirm": "Lagre {label} = {value} i innstillingene for denne enheten?", "pg_restart_note": "Start Home Assistant på nytt for å aktivere simuleringsverktøyene.", "pg_sim_progress": "{done} / {total} sykluser", "pg_starting": "Starter…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Varighet trender kortere ({pct} %/syklus) – nylig snitt {avg}", "trend_energy_down": "Energi på vei ned ({pct} %/syklus)", "trend_energy_up": "Energi på vei opp ({pct} %/syklus) – nylig gjennomsnittlig {avg}", + "trim_destructive_confirm": "Kun {pct}% av syklusen beholdes. Dette kan ikke angres. Fortsette?", "trim_intro": "Dra de røde håndtakene, eller skriv inn verdier. Alt utenfor vinduet fjernes.", "tuning_suggestions_available": "{count} justeringsforslag tilgjengelig fra observerte sykluser. De vises ved siden av de relevante feltene.", "unsure_detected_prefix": "WashData er usikker på om det er oppdaget", @@ -922,9 +1001,15 @@ "merge_hint": "Importerte elementer legges til; ingenting lokalt går tapt. Navnekonflikter løses nedenfor.", "replace_warn": "Hver avkrysset kategori slettes og erstattes fra filen. Ikke-avkryssede kategorier forblir uendret.", "dest_reference_hint": "Importerte sykluser forbedrer bare programgjenkjenning og påvirker aldri bruks-/energistatistikk.", - "dest_real_history_hint": "Importerte sykluser teller som dette apparatets egen historikk og mater energi-/bruksstatistikk. Bruk dette til å flytte ett apparat til en ny installasjon." + "dest_real_history_hint": "Importerte sykluser teller som dette apparatets egen historikk og mater energi-/bruksstatistikk. Bruk dette til å flytte ett apparat til en ny installasjon.", + "sug_muted": "Vil ikke foreslå denne innstillingen igjen", + "sug_mute_failed": "Kunne ikke dempe forslaget", + "sug_unmuted_all": "Dempede forslag tilbakestilt", + "n_suggestions_muted": "{count} dempet; autotuner vil ikke foreslå disse.", + "font_size_hint": "Gjør alt i dette panelet større eller mindre. Gjelder for kontoen din på denne enheten." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Oppvaskmaskin: stille sekunder etter forventet varighet før ventingen på tømming ved slutten av syklusen frigjøres", "completion_min_seconds": "Korteste kjøring som teller som en ekte syklus", "end_repeat_count": "Lave avlesninger på rad før avslutning", "interrupted_min_seconds": "Korte sykluser merkes som avbrutt", @@ -998,6 +1083,10 @@ "unusable": "Ubrukelig" }, "section": { + "dishwasher": { + "label": "Oppvaskmaskin", + "intro": "Håndtering av syklusslutt for oppvaskmaskiner, som vanligvis avsluttes med en lang, nesten lydløs tørkefase før en kort siste tømming." + }, "anti_wrinkle": { "intro": "Anti-rynke-/anti-krøll-modus oppdager lavomsatt tumle-pulser etter hoveddelen og holder dem festet til den ferdige syklusen.", "label": "Anti-rynke" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Frigjøring etter stille tørkefase", + "doc": "Når syklusen passerer forventet varighet: hvor lenge oppvaskmaskinen må holde seg stille (under Stoppterskel) før WashData slutter å vente på en siste tømming og avslutter syklusen. Øk den hvis maskinen din har en lang stille tørkefase før en sen siste tømming som blir oversett - et bredere vindu lar den innlærte varigheten følge sesongvariasjoner (kaldere tilførselsvann = lengre sykluser) i stedet for å låse seg til det gamle gjennomsnittet. Den forkorter bare ventetiden i forhold til den interne grensen på 30 minutter for sluttoppen, aldri forlenger den." + }, "anti_wrinkle_enabled": { "doc": "Gjenkjenn de korte laveffekttrommelpulsene en tørketrommel sender ut etter hovedvarmefasen, og hold dem festet til den ferdige syklusen i stedet for å lese dem som nye sykluser.", "label": "Aktiver anti-rynke-deteksjon" @@ -1260,6 +1353,10 @@ "doc": "Minutter etter at en syklus avsluttes før du sender den fortsatt ventende påminnelsen om \"last av maskinen\". Sett 0 for å deaktivere påminnelsen.", "label": "Utlastingspåminnelsesforsinkelse" }, + "notify_unload_repeat": { + "doc": "Fortsetter å sende utlastingspåminnelsen på nytt hvert \"Utlastingspåminnelsesforsinkelse\" minutt til du åpner døren eller trykker på \"Stopp påminnelser\" i varselet. Krever en Dørensorenhet (det gjør selve påminnelsen). Avvis-knappen fungerer på varsler fra Home Assistant companion-appen (mobil).", + "label": "Gjenta til døren åpnes" + }, "off_delay": { "doc": "På tide å vente etter at strømmen faller før du erklærer at syklusen er fullført. Hvis strømmen gjenopptas innenfor dette vinduet, fortsetter syklusen sømløst - dette slår bro mellom pauser mellom vasketrinn. Oppvaskmaskiner har lange tørkefaser (strøm av i 20-60 min) så avslåingsforsinkelsen må overstige det for å holde hele vask+tørr som én syklus.", "label": "Av-forsinkelse" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Energiskarphet", "doc": "Skarphet i Trinn 4 sitt straff for energioverensstemmelse. Lavere = strengere: et energiavvik straffes mer. Standard 0,25 er bevisst mer tillåtende enn varighetsskarphet fordi energi varierer med last. Par med Energivekt." + }, + "power_profile_interval_min": { + "label": "Effektprofil-intervall", + "doc": "Bucket-størrelse for effektprofilsensorens attributt power_profile (det flate arrayet med gjennomsnittlige wattverdier per slot som brukes av eksterne planleggere som EMHASS og tibber_prices). Mindre buckets holder korte effekttopper skarpe; større buckets glatter kurven. Standard 15 min. Kun for visning; påvirker ikke deteksjon." + }, + "notify_live_sticky": { + "label": "Behold live-varsel ved trykk", + "doc": "Kun Android. Gjør live-fremdriftsvarselet vedvarende (sticky) slik at et trykk ikke avviser det. Av: standardadferd der et trykk avviser varselet." + }, + "notify_live_click_action": { + "label": "Trykkdestinasjon for live-varsel", + "doc": "Kun Android. Hvor et trykk på live-fremdriftsvarselet åpner (f.eks. /lovelace/laundry eller en full URL) i stedet for appens startside. La stå tomt for standard." + }, + "door_opens_at_end": { + "label": "Dør åpnes automatisk ved avslutning", + "doc": "For oppvaskmaskiner som spretter opp døren på slutten av syklusen for tørking (AirDry og lignende). Med dette aktivert vil en døråpning under en aktiv syklus ikke sette den på pause for alltid; hvis døren forblir åpen i den konfigurerte oppholdstiden, behandler WashData syklusen som ferdig. En kort åpning (legge til et element) ignoreres. Krever en dørsensorenhet." + }, + "door_end_dwell_seconds": { + "label": "Dørens åpningstid ved avslutning", + "doc": "Hvor lenge døren må forbli åpen før WashData avslutter syklusen, når \"Dør åpnes automatisk ved avslutning\" er aktivert. Lang nok til å ignorere rask tillegging av et fat (standard 60 s), kort nok til å avslutte raskt når maskinen spretter opp døren." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Basert på laveste aktive effekt ({min}W) observert i siste syklus.", "min_duration_ratio": "Holdt så lav som mulig slik at et program gjenkjennes tidlig i syklusen; konfidens- og tvetydighetsgrensene hindrer forhastede beslutninger.", "min_off_gap": "Basert på {gaps} observerte mellomrom mellom sykluser (p05={p05}s). Enhetsgulv: {floor}s.", + "min_off_gap_bridge": "Dimensjonert for å bygge bro over den lengste stille perioden i en syklus: {span}s + 60s buffer, fra {spans} dekkede mellomrom på tvers av {cycles} rene sykluser (holder seg under ditt korteste mellomrom på {ceiling}s mellom to kjøringer).", "min_power": "40% av den laveste aktive effekten ved p05 ({p05}W) på tvers av {cycles} rene sykluser, noe som holder av-terskelen under reelt forbruk.{excl}", "ml_auto_label": "Laveste konfidens som kvalitetsmodellen fortsatt vurderte som ren (p10 av {cycles} rene sykluser = {p10}).", "ml_end_repeat": "{false}/{total} sykluser ({pct}%) hadde en pause som sluttdetektoren vurderte til >50%; krever {val} sluttbekreftelse(r).", @@ -1636,7 +1754,7 @@ "thr_batch": "Holdt like over den laveste aktive effekten ved p05 på tvers av {cycles} sykluser ({p05}W) slik at en start fanges så tidlig som mulig og stoppterskelen holder seg under maskinens laveste driftseffekt.", "tol_per_profile": "p75 for varighetsvariansen per profil på tvers av {profiles} profiler ({cycles} sykluser); stramme profiler straffes ikke.", "tol_pooled": "Basert på samlet varighetsvarians for {cycles} nyeste merkede sykluser (p95 avvik={dev}).", - "watchdog": "Holdt så lavt som forsvarlig (3x p95-oppdateringsmellomrommet på {p95}s, min 30s) slik at stans fanges raskt uten falske stopp." + "watchdog": "Holdt så lavt som forsvarlig (like over p95-oppdateringsmellomrommet på {p95}s, min 30s) slik at stans fanges raskt uten falske stopp." }, "exclusions": { "summary": "Ekskluderte {total} feildetekterte syklus(er): {parts}.", @@ -1716,6 +1834,10 @@ "name_required": "Navn kreves", "no_split_found": "Ingen ledige mellomrom funnet å dele seg på", "panel_settings_saved": "Panelinnstillinger lagret", + "pg_preset_loaded": "Forhåndsinnstillingen \"{name}\" er lastet inn", + "pg_preset_saved": "Forhåndsinnstillingen \"{name}\" er lagret", + "pg_sugg_loaded": "{n} foreslåtte verdi(er) lest inn - kjør sandkassen for å sammenligne", + "pg_sugg_ml_loaded": "{n} ML-kalibrerte verdi(er) lest inn - kjør sandkassen for å sammenligne", "phase_name_required": "Fasenavn er påkrevd", "phase_updated": "Fase oppdatert", "phases_saved": "Faser lagret", diff --git a/custom_components/ha_washdata/translations/panel/nl.json b/custom_components/ha_washdata/translations/panel/nl.json index d27a6022..b8e74e75 100644 --- a/custom_components/ha_washdata/translations/panel/nl.json +++ b/custom_components/ha_washdata/translations/panel/nl.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entiteit niet gevonden", + "running_long": "Loopt langer", + "remaining": "resterend", + "progress": "voortgang", + "show_time_remaining": "Resterende tijd tonen", + "show_percentage": "Percentage tonen", + "layout": { + "tile": "Tegel (compact)", + "detail": "Detail (uitgebreid)", + "glance": "Overzicht (meerdere apparaten)" + }, + "btn": { + "pause": "Pauzeren", + "resume": "Hervatten", + "terminate": "Cyclus beëindigen", + "record_start": "Opname starten", + "record_stop": "Opname stoppen", + "program": "Programma", + "open_panel": "WashData openen" + }, + "editor": { + "layout": "Lay-out", + "entity": "Apparaatentiteit", + "entities": "Apparaten", + "title": "Titel", + "icon": "Pictogram", + "show_state": "Status tonen", + "show_program": "Programma tonen", + "show_progress_bar": "Voortgangsbalk tonen", + "spin_icon": "Pictogram laten draaien tijdens uitvoering", + "display_mode": "Detailregel", + "active_color": "Actieve kleur overschrijven", + "show_phase": "Fase tonen", + "show_energy": "Energie en kosten tonen", + "show_anomaly": "Waarschuwing voor uitloop tonen", + "show_sparkline": "Live vermogensgrafiek tonen", + "buttons": "Actieknoppen", + "program_entity": "Programma-entiteit (overschrijven)", + "time_entity": "Tijdentiteit (overschrijven)", + "pct_entity": "Voortgangsentiteit (overschrijven)", + "power_entity": "Vermogensentiteit (overschrijven)", + "tap_action": "Tikactie", + "hold_action": "Vasthoudactie", + "double_tap_action": "Dubbeltikactie" + } + }, "badge": { "artifact_tip": "{n} afwijkingen gedetecteerd (bijvoorbeeld de deur werd halverwege de cyclus geopend) – open om ze in de grafiek te zien", "auto": "(automatisch gedetecteerd)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "De actieve cyclus pauzeren – het apparaat hervat waar het was gestopt", "pg_apply_device": "Toepassen op apparaat", "pg_autofill": "Automatisch invullen", + "pg_load_calibrated": "Gekalibreerde (ML) laden ({n})", + "pg_load_calibrated_tip": "Laadt ML-gekalibreerde instellingen als speeltuin-overschrijvingen", + "pg_load_live": "Actieve instellingen laden", + "pg_load_live_tip": "De huidige instellingen van de integratie opnieuw inlezen en alle wijzigingen in de speeltuin weggooien", + "pg_load_suggested": "Suggesties laden ({n})", + "pg_load_suggested_tip": "Laadt de huidige suggesties van de auto-tuner als speeltuin-overschrijvingen", + "pg_preset_delete": "Voorinstelling verwijderen", + "pg_preset_load": "Voorinstelling laden", + "pg_preset_load_tip": "De waarden in de speeltuin vervangen door deze voorinstelling (de actieve instellingen blijven ongewijzigd)", + "pg_preset_save": "Opslaan als voorinstelling", + "pg_preset_save_tip": "Alle onderstaande waarden opslaan als voorinstelling met een naam voor dit apparaat", + "pg_publish_all": "{n} opslaan in integratie", + "pg_publish_one": "{label} opslaan in de integratie", "play": "Afspelen", "process": "Verwerken", "process_history": "Verwerk nu", @@ -178,7 +239,9 @@ "download_export": "Export downloaden", "analyze_import": "Bestand analyseren", "import_selected": "Selectie importeren", - "back": "Terug" + "back": "Terug", + "mute_suggestion": "Deze instelling niet meer voorstellen", + "reset_muted": "Gedempte suggesties herstellen" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +338,7 @@ "no_automations": "Er zijn nog geen automatiseringen die naar dit apparaat verwijzen.", "panel_settings": "Paneelinstellingen", "param_sweep": "Parameterscan", + "pg_settings_source": "Herkomst van de instellingen", "phase_catalog": "Fasecatalogus", "playground": "Speeltuin", "process_history": "Procesgeschiedenis", @@ -410,6 +474,9 @@ "pg_group_detection": "Detectietriggers", "pg_group_timing": "Timingregels", "pg_idle": "Inactief", + "pg_preset": "Speeltuin-voorinstelling", + "pg_preset_name": "Naam van nieuwe voorinstelling", + "pg_preset_none": "Kies een voorinstelling…", "pg_stress_group": "Test voor inactieve beëindiging", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Inactief vermogen (W)", @@ -609,7 +676,8 @@ "conflict_import_copy": "Importeren als kopie", "conflict_keep_mine": "Die van mij behouden", "conflict_overwrite": "Overschrijven", - "pg_anti_wrinkle": "Anti-kreuk" + "pg_anti_wrinkle": "Anti-kreuk", + "font_size": "Paneel lettergrootte" }, "log": { "all_levels": "Alle niveaus", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Beste waarde toepassen: {label} = {value}?", "pg_canvas_empty": "Selecteer hierboven een cyclus en druk vervolgens op Laden om de vermogenscurve te bekijken.", "pg_chart_caption": "Detectie-/matchpercentage over de waarden van {param}", + "pg_ctrl_intro": "De waarden beginnen bij de actieve instellingen van dit apparaat in de integratie. Wijzigingen blijven in de speeltuin totdat je ze opslaat in de integratie.", + "pg_live_unavailable": "Actieve instellingen niet beschikbaar, standaardwaarden worden getoond.", + "pg_load_live_confirm": "{n} wijziging(en) in de speeltuin weggooien en de huidige instellingen van de integratie opnieuw laden?", "pg_match_rate": "{pct}% matchpercentage op {total} cycli", + "pg_matches_live": "Gelijk aan de actieve instellingen", + "pg_n_changed": "{n} gewijzigd t.o.v. de actieve instellingen", + "pg_sugg_none": "Alle suggesties komen al overeen met de huidige instellingen", + "pg_preset_delete_confirm": "De voorinstelling \"{name}\" verwijderen?", + "pg_preset_limit": "Maximum aantal voorinstellingen bereikt ({n})", + "pg_preset_overwrite": "De voorinstelling \"{name}\" overschrijven?", + "pg_publish_one_confirm": "{label} = {value} opslaan in de instellingen van dit apparaat?", "pg_restart_note": "Start Home Assistant opnieuw op om de simulatiehulpmiddelen in te schakelen.", "pg_sim_progress": "{done} / {total} cycli", "pg_starting": "Bezig met starten…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Duur trending korter ({pct}%/cyclus) – recent gemiddelde {avg}", "trend_energy_down": "Energietrend omlaag ({pct}%/cyclus)", "trend_energy_up": "Energie stijgt ({pct}%/cyclus) – recent gemiddelde {avg}", + "trim_destructive_confirm": "Hiermee wordt slechts {pct}% van de cyclus behouden. Dit kan niet ongedaan worden gemaakt. Doorgaan?", "trim_intro": "Versleep de rode grepen of voer waarden in. Alles buiten het raam wordt verwijderd.", "tuning_suggestions_available": "{count} afstemmingssuggestie beschikbaar op basis van waargenomen cycli. Ze verschijnen naast de relevante velden.", "unsure_detected_prefix": "WashData weet niet zeker of het is gedetecteerd", @@ -922,9 +1001,15 @@ "merge_hint": "Geïmporteerde items worden toegevoegd; er gaat lokaal niets verloren. Naamconflicten worden hieronder opgelost.", "replace_warn": "Elke aangevinkte categorie wordt gewist en vervangen vanuit het bestand. Niet-aangevinkte categorieën blijven ongewijzigd.", "dest_reference_hint": "Geïmporteerde cycli verbeteren alleen de programmaherkenning en hebben nooit invloed op de gebruiks-/energiestatistieken.", - "dest_real_history_hint": "Geïmporteerde cycli tellen als de eigen geschiedenis van dit apparaat en voeden de energie-/gebruiksstatistieken. Gebruik dit om één apparaat naar een nieuwe installatie te verplaatsen." + "dest_real_history_hint": "Geïmporteerde cycli tellen als de eigen geschiedenis van dit apparaat en voeden de energie-/gebruiksstatistieken. Gebruik dit om één apparaat naar een nieuwe installatie te verplaatsen.", + "sug_muted": "Deze instelling wordt niet meer voorgesteld", + "sug_mute_failed": "Instelling kon niet worden gedempt", + "sug_unmuted_all": "Gedempte suggesties hersteld", + "n_suggestions_muted": "{count} gedempt; de autotuner stelt deze niet meer voor.", + "font_size_hint": "Maak alles in dit paneel groter of kleiner. Geldt voor uw account op dit apparaat." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Vaatwasser: stille seconden na de verwachte duur voordat de wachttijd op het wegpompen aan het einde van de cyclus wordt vrijgegeven", "completion_min_seconds": "Kortste run die als een echte cyclus telt", "end_repeat_count": "Opeenvolgende lage metingen voor het einde", "interrupted_min_seconds": "Korte cycli gemarkeerd als onderbroken", @@ -998,6 +1083,10 @@ "unusable": "Onbruikbaar" }, "section": { + "dishwasher": { + "label": "Vaatwasser", + "intro": "Afhandeling van het einde van de cyclus voor vaatwassers, die doorgaans eindigen met een lange, vrijwel stille droogfase vóór een kort laatste wegpompen." + }, "anti_wrinkle": { "intro": "De anti-kreuk-/anti-vouw-modus detecteert lage-vermogen trommelimpulsen na de hoofdfase en houdt ze bevestigd aan de voltooide cyclus.", "label": "Anti-kreuk" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Vrijgave na stille droogfase", + "doc": "Zodra de cyclus zijn verwachte duur voorbij is: hoe lang de vaatwasser stil moet blijven (onder de Stopdrempel) voordat WashData niet langer op een laatste wegpompen wacht en de cyclus beëindigt. Verhoog dit als uw machine een lange stille droogfase heeft vóór een laat laatste wegpompen dat wordt gemist - een breder venster laat de geleerde duur de seizoensdrift volgen (kouder toevoerwater = langere cycli) in plaats van vast te houden aan het oude gemiddelde. Het verkort de wachttijd alleen ten opzichte van de interne limiet van 30 minuten voor de eindpiek, en verlengt die nooit." + }, "anti_wrinkle_enabled": { "doc": "Herken de korte tuimelpulsen met laag vermogen die een droger afgeeft na de hoofdverwarmingsfase en houd ze vast aan het voltooide programma in plaats van ze als nieuwe cycli te lezen.", "label": "Anti-kreuk detectie inschakelen" @@ -1260,6 +1353,10 @@ "doc": "Minuten nadat een cyclus is geëindigd voordat de nog wachtende herinnering voor het leegmaken van de machine wordt verzonden. Stel 0 in om de herinnering uit te schakelen.", "label": "Vertraging uitlaadherinnering" }, + "notify_unload_repeat": { + "doc": "Blijft de uitlaadherinnering elke \"Vertraging uitlaadherinnering\" minuten opnieuw verzenden totdat u de deur opent of in de melding op \"Stop met herinneren\" tikt. Vereist een Deursensorentiteit (de herinnering zelf ook). De sluitknop werkt bij meldingen van de Home Assistant companion-app (mobiel).", + "label": "Herhalen tot de deur opengaat" + }, "off_delay": { "doc": "Tijd om te wachten nadat de stroom is uitgevallen voordat de cyclus als voltooid wordt verklaard. Als de stroom binnen dit venster wordt hervat, gaat de cyclus naadloos verder - dit overbrugt pauzes tussen wasfasen. Vaatwassers hebben lange droogfasen (uitschakeling gedurende 20-60 minuten), dus de uitschakelvertraging moet groter zijn dan die om de hele was+droogcyclus als één cyclus te laten verlopen.", "label": "Uitschakelvertraging" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Energie-scherpte", "doc": "Scherpte van de energieovereenkomststraf. Kleiner = strenger: een energiemismatch kost meer punten. Standaard 0,25 is bewust meer vergevingsgezind dan Duurscherpte, omdat energie varieert met de belasting. Combineer met Energiegewicht." + }, + "power_profile_interval_min": { + "label": "Vermogensprofiel-interval", + "doc": "Bucketgrootte voor het attribuut power_profile van de profielsensor (het platte array van gemiddelde wattwaarden per slot dat door externe planners zoals EMHASS en tibber_prices wordt gebruikt). Kleinere buckets houden korte vermogenspieken scherp; grotere buckets gladden de vorm. Standaard 15 min. Alleen voor weergave; heeft geen invloed op de detectie." + }, + "notify_live_sticky": { + "label": "Live-melding bij aanraken behouden", + "doc": "Alleen Android. Maak de live-voortgangsmelding aanhoudend (sticky), zodat deze bij aanraken niet wordt gesloten. Uitgeschakeld: standaardgedrag waarbij een aanraking de melding sluit." + }, + "notify_live_click_action": { + "label": "Aanraakdoel live-melding", + "doc": "Alleen Android. Waarheen een aanraking van de live-voortgangsmelding navigeert (bijv. /lovelace/laundry of een volledige URL) in plaats van de standaard startpagina van de app. Leeg laten voor standaard." + }, + "door_opens_at_end": { + "label": "Deur opent automatisch aan het einde", + "doc": "Voor vaatwassers die aan het einde van de cyclus de deur openen om te drogen (AirDry en vergelijkbaar). Als dit is ingeschakeld, pauzeert een deur openen tijdens een actieve cyclus de cyclus niet permanent; als de deur de ingestelde verwijltijd lang open blijft, beschouwt WashData de cyclus als voltooid. Een korte opening (om een artikel toe te voegen) wordt genegeerd. Vereist een deursensorentiteit." + }, + "door_end_dwell_seconds": { + "label": "Deuropen-eindverwijltijd", + "doc": "Hoe lang de deur open moet blijven voordat WashData de cyclus beëindigt, wanneer \"Deur opent automatisch aan het einde\" is ingeschakeld. Lang genoeg om het snel toevoegen van een bord te negeren (standaard 60 s), kort genoeg om de cyclus snel te beëindigen zodra de machine de deur opent." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Op basis van het minimale actieve vermogen ({min}W) dat in de laatste cyclus is waargenomen.", "min_duration_ratio": "Zo laag mogelijk gehouden zodat een programma vroeg in de cyclus wordt herkend; de betrouwbaarheids- en ambiguïteitsdrempels voorkomen voortijdige beslissingen.", "min_off_gap": "Op basis van {gaps} waargenomen tussenpozen tussen cycli (p05={p05}s). Ondergrens van het apparaat: {floor}s.", + "min_off_gap_bridge": "Zo gedimensioneerd dat de langste stille periode binnen een cyclus wordt overbrugd: {span}s + 60s buffer, uit {spans} overbrugde tussenpozen over {cycles} schone cycli (blijft onder uw kortste tussenpoos van {ceiling}s tussen twee opeenvolgende ladingen).", "min_power": "40% van het laagste actieve vermogen op p05 ({p05}W) over {cycles} schone cycli, zodat de uitschakeldrempel onder het werkelijke verbruik blijft.{excl}", "ml_auto_label": "Laagste betrouwbaarheid die het kwaliteitsmodel nog als schoon beoordeelde (p10 van {cycles} schone cycli = {p10}).", "ml_end_repeat": "{false}/{total} cycli ({pct}%) hadden een pauze die de einddetector >50% scoorde; vereis {val} eindbevestiging(en).", @@ -1636,7 +1754,7 @@ "thr_batch": "Net boven het laagste actieve vermogen op p05 over {cycles} cycli ({p05}W) gehouden zodat een start zo vroeg mogelijk wordt opgemerkt en de stopdrempel onder het laagste draaivermogen van de machine blijft.", "tol_per_profile": "p75 van de duurvariantie per profiel over {profiles} profielen ({cycles} cycli); strakke profielen worden niet benadeeld.", "tol_pooled": "Op basis van de gebundelde duurvariantie van {cycles} recent gelabelde cycli (p95-afwijking={dev}).", - "watchdog": "Zo laag als veilig gehouden (3x de p95-updatekloof van {p95}s, min. 30s) zodat vastlopers snel worden opgemerkt zonder valse stops." + "watchdog": "Zo laag als veilig gehouden (net boven de p95-updatekloof van {p95}s, min. 30s) zodat vastlopers snel worden opgemerkt zonder valse stops." }, "exclusions": { "summary": "{total} verkeerd gedetecteerde cyclus(sen) uitgesloten: {parts}.", @@ -1716,6 +1834,10 @@ "name_required": "Naam vereist", "no_split_found": "Er zijn geen lege gaten gevonden om op te splitsen", "panel_settings_saved": "Paneelinstellingen opgeslagen", + "pg_preset_loaded": "Voorinstelling \"{name}\" geladen", + "pg_preset_saved": "Voorinstelling \"{name}\" opgeslagen", + "pg_sugg_loaded": "{n} gesuggereerde waarde(n) geladen - voer de speeltuin uit om te vergelijken", + "pg_sugg_ml_loaded": "{n} ML-gekalibreerde waarde(n) geladen - voer de speeltuin uit om te vergelijken", "phase_name_required": "Fasenaam is vereist", "phase_updated": "Fase bijgewerkt", "phases_saved": "Fasen opgeslagen", diff --git a/custom_components/ha_washdata/translations/panel/pl.json b/custom_components/ha_washdata/translations/panel/pl.json index 17bf666c..2e1f1efa 100644 --- a/custom_components/ha_washdata/translations/panel/pl.json +++ b/custom_components/ha_washdata/translations/panel/pl.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Nie znaleziono encji", + "running_long": "Działa długo", + "remaining": "pozostało", + "progress": "postęp", + "show_time_remaining": "Pokaż pozostały czas", + "show_percentage": "Pokaż procenty", + "layout": { + "tile": "Kafelek (kompaktowy)", + "detail": "Szczegóły (rozbudowany)", + "glance": "Podgląd (wiele urządzeń)" + }, + "btn": { + "pause": "Wstrzymaj", + "resume": "Wznów", + "terminate": "Zakończ cykl", + "record_start": "Rozpocznij nagrywanie", + "record_stop": "Zatrzymaj nagrywanie", + "program": "Program", + "open_panel": "Otwórz WashData" + }, + "editor": { + "layout": "Układ", + "entity": "Encja urządzenia", + "entities": "Urządzenia", + "title": "Tytuł", + "icon": "Ikona", + "show_state": "Pokaż stan", + "show_program": "Pokaż program", + "show_progress_bar": "Pokaż pasek postępu", + "spin_icon": "Obracaj ikonę podczas działania", + "display_mode": "Wiersz szczegółów", + "active_color": "Zastąpienie koloru aktywnego", + "show_phase": "Pokaż fazę", + "show_energy": "Pokaż energię i koszt", + "show_anomaly": "Pokaż ostrzeżenie o przekroczeniu", + "show_sparkline": "Pokaż wykres mocy na żywo", + "buttons": "Przyciski akcji", + "program_entity": "Encja programu (zastąpienie)", + "time_entity": "Encja czasu (zastąpienie)", + "pct_entity": "Encja postępu (zastąpienie)", + "power_entity": "Encja mocy (zastąpienie)", + "tap_action": "Akcja dotknięcia", + "hold_action": "Akcja przytrzymania", + "double_tap_action": "Akcja podwójnego dotknięcia" + } + }, "badge": { "artifact_tip": "Wykryto {n} anomalii (np. drzwi otwarte w połowie cyklu) – otwórz, aby zobaczyć je na wykresie", "auto": "(automatycznie wykryty)", @@ -64,6 +112,21 @@ "discard": "Odrzuć", "discard_tip": "Odrzuć nagranie bez zapisywania", "dismiss": "Odrzuć", + "mute_suggestion": "Przestań sugerować to ustawienie", + "pg_load_calibrated": "Wczytaj skalibrowane (ML) ({n})", + "pg_load_calibrated_tip": "Załaduj ustawienia skalibrowane przez ML jako nadpisania w piaskownicy", + "pg_load_live": "Wczytaj aktywne ustawienia", + "pg_load_live_tip": "Wczytaj ponownie bieżące ustawienia integracji i odrzuć wszystkie zmiany z piaskownicy", + "pg_load_suggested": "Wczytaj sugerowane ({n})", + "pg_load_suggested_tip": "Załaduj bieżące sugestie automatycznego dostrajania jako nadpisania w piaskownicy", + "pg_preset_delete": "Usuń preset", + "pg_preset_load": "Wczytaj preset", + "pg_preset_load_tip": "Zastąp wartości w piaskownicy tym presetem (aktywne ustawienia pozostają nietknięte)", + "pg_preset_save": "Zapisz jako preset", + "pg_preset_save_tip": "Zapisz wszystkie poniższe wartości jako nazwany preset dla tego urządzenia", + "pg_publish_all": "Zapisz w integracji ({n})", + "pg_publish_one": "Zapisz {label} w integracji", + "reset_muted": "Zresetuj wyciszone", "done": "Zrobione", "edit": "Edytuj", "export": "Eksportuj", @@ -275,6 +338,7 @@ "no_automations": "Żadna automatyzacja nie odwołuje się jeszcze do tego urządzenia.", "panel_settings": "Ustawienia panelu", "param_sweep": "Przemiatanie parametru", + "pg_settings_source": "Źródło ustawień", "phase_catalog": "Katalog faz", "playground": "Piaskownica", "process_history": "Historia procesu", @@ -348,6 +412,7 @@ "default_access_level": "Domyślny poziom dla użytkowników niewymienionych poniżej", "default_other": "Domyślne (inne urządzenia)", "default_tab": "Domyślna zakładka podczas otwierania panelu", + "font_size": "Rozmiar czcionki panelu", "delta": "Δ", "description": "Opis", "dtw_blend_w": "Waga mieszania", @@ -415,6 +480,9 @@ "pg_match_score": "Wynik dopasowania", "pg_pct_of": "{p}% z {total}", "pg_poor_match": "Kiepskie dopasowanie", + "pg_preset": "Preset piaskownicy", + "pg_preset_name": "Nazwa nowego presetu", + "pg_preset_none": "Wybierz preset…", "pg_strong_match": "Silne dopasowanie", "pg_tile_ambiguous": "Niejednoznaczny", "pg_tile_ambiguous_tip": "Cykle z niemal równym dopasowaniem do dwóch programów", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Zastosować najlepszą wartość: {label} = {value}?", "pg_canvas_empty": "Wybierz cykl powyżej, a następnie naciśnij Wczytaj, aby zobaczyć jego przebieg mocy.", "pg_chart_caption": "Współczynnik wykrywania/dopasowania dla wartości {param}", + "pg_ctrl_intro": "Wartości pochodzą z aktywnych ustawień integracji dla tego urządzenia. Zmiany pozostają w piaskownicy, dopóki nie zapiszesz ich w integracji.", + "pg_live_unavailable": "Aktywne ustawienia niedostępne, wyświetlane są wartości domyślne.", + "pg_load_live_confirm": "Odrzucić zmiany w piaskownicy ({n}) i wczytać ponownie bieżące ustawienia integracji?", "pg_match_rate": "{pct}% skuteczności dopasowania na {total} cyklach", + "pg_matches_live": "Zgodne z aktywnymi ustawieniami", + "pg_n_changed": "Zmienione względem aktywnych ustawień: {n}", + "pg_sugg_none": "Wszystkie sugestie już odpowiadają bieżącym ustawieniom", + "pg_preset_delete_confirm": "Usunąć preset \"{name}\"?", + "pg_preset_limit": "Osiągnięto limit presetów ({n})", + "pg_preset_overwrite": "Nadpisać preset \"{name}\"?", + "pg_publish_one_confirm": "Zapisać {label} = {value} w ustawieniach tego urządzenia?", "pg_restart_note": "Uruchom ponownie Home Assistant, aby włączyć narzędzia symulacji.", "pg_sim_progress": "{done} / {total} cykli", "pg_starting": "Rozpoczynanie…", @@ -789,6 +867,7 @@ "preferences_admin": "Preferencje, panel i kontrola dostępu", "preferences_adv": "Preferencje", "prefs_personal": "Dotyczą one wyłącznie Twojego konta Home Assistant.", + "font_size_hint": "Powiększ lub pomniejsz wszystko w tym panelu. Dotyczy Twojego konta na tym urządzeniu.", "process_history_hint": "Ponownie uruchom dopasowywanie na wszystkich zapisanych cyklach, odśwież sugestie dostrajania, ponownie wytrenuj modele ML (jeśli włączone) i przelicz kondycję cykli. Uruchom po serii przeglądów.", "profile_deleted": "Profil usunięty", "profile_poor_health_detail": "Cykle przypisane do tego profilu mają niespójne kształty lub niską pewność. Rozważ przebudowę koperty lub przejrzenie oznakowanych cykli.", @@ -821,6 +900,10 @@ "split_intro": "Kliknij wykres, aby dodać lub usunąć punkt podziału albo automatycznie wykryć na podstawie pustych przerw. Każdy powstały segment może otrzymać swój własny profil.", "storage_diagnostics": "Statystyki przechowywania, konserwacja, eksport/import", "sug_staged": "Ustawiono {key} = {val}. Zapisz, aby zastosować.", + "sug_muted": "To ustawienie nie będzie więcej sugerowane", + "sug_mute_failed": "Nie udało się wyciszyć sugestii", + "sug_unmuted_all": "Wyciszone sugestie przywrócone", + "n_suggestions_muted": "{count} wyciszonych; automatyczny tuner nie będzie proponować tych ustawień.", "toast_auto_detect_enabled": "Automatyczne wykrywanie włączone", "toast_auto_label_complete": "Automatyczne oznaczanie zakończone", "toast_auto_label_failed": "Automatyczne oznaczanie nie powiodło się: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Trwanie w trendzie krótszym ({pct}%/cykl) – ostatnia średnia {avg}", "trend_energy_down": "Energia wykazuje tendencję spadkową ({pct}%/cykl)", "trend_energy_up": "Trend wzrostowy w zakresie energii ({pct}%/cykl) – ostatnia średnia {avg}", + "trim_destructive_confirm": "To zachowa tylko {pct}% cyklu i tej operacji nie można cofnąć. Kontynuować?", "trim_intro": "Przeciągnij czerwone uchwyty lub wprowadź wartości. Wszystko za oknem jest usuwane.", "tuning_suggestions_available": "Sugestia dostrojenia {count} dostępna z obserwowanych cykli. Pojawiają się obok odpowiednich pól.", "unsure_detected_prefix": "WashData nie jest pewien, czy został wykryty", @@ -970,6 +1054,10 @@ "unusable": "Nie nadaje się do użytku" }, "section": { + "dishwasher": { + "label": "Zmywarka", + "intro": "Obsługa końca cyklu w zmywarkach, które zazwyczaj kończą długą, niemal cichą fazą suszenia przed krótkim końcowym odpompowaniem wody." + }, "anti_wrinkle": { "intro": "Tryb antygniotowy wykrywa impulsy bębnowania przy niskiej mocy po fazie głównej i utrzymuje je przyłączone do zakończonego cyklu.", "label": "Antygniotowy" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Zwolnienie po cichej fazie suszenia", + "doc": "Gdy cykl przekroczy oczekiwany czas trwania, jak długo zmywarka musi pozostać cicha (poniżej Progu Zatrzymania), zanim WashData przestanie czekać na końcowe odpompowanie wody i zakończy cykl. Zwiększ tę wartość, jeśli Twoje urządzenie ma długą cichą fazę suszenia przed późnym końcowym odpompowaniem, które jest pomijane - szersze okno pozwala, aby wyuczony czas trwania podążał za sezonowym dryfem (chłodniejsza woda na wlocie = dłuższe cykle), zamiast trzymać się starej średniej. Może jedynie skrócić oczekiwanie względem wewnętrznego 30-minutowego limitu końcowego odpompowania, nigdy go nie wydłuża." + }, "anti_wrinkle_enabled": { "doc": "Rozpoznawaj krótkie impulsy suszenia o małej mocy, które suszarka emituje po głównej fazie nagrzewania, i pamiętaj o ich dołączeniu do zakończonego cyklu, zamiast odczytywać je jako nowe cykle.", "label": "Włącz Wykrywanie Antygniotowe" @@ -1232,6 +1324,10 @@ "doc": "Minuty po zakończeniu cyklu przed wysłaniem wciąż oczekującego przypomnienia o „rozładowaniu maszyny”. Ustaw 0, aby wyłączyć przypomnienie.", "label": "Opóźnienie Przypomnienia o Rozładunku" }, + "notify_unload_repeat": { + "doc": "Ponownie wysyła przypomnienie o rozładunku co \"Opóźnienie Przypomnienia o Rozładunku\" minut, dopóki nie otworzysz drzwi lub nie dotkniesz \"Przestań przypominać\" w powiadomieniu. Wymaga Encji Czujnika Drzwi (tak jak samo przypomnienie). Przycisk odrzucenia działa w powiadomieniach aplikacji mobilnej Home Assistant (companion app).", + "label": "Powtarzaj, aż otworzą się drzwi" + }, "off_delay": { "doc": "Czas oczekiwania po spadku mocy przed ogłoszeniem zakończenia cyklu. Jeżeli w tym oknie zasilanie zostanie przywrócone, cykl będzie przebiegał płynnie – eliminując przerwy pomiędzy etapami prania. Zmywarki mają długie fazy suszenia (wyłączenie zasilania na 20–60 minut), więc opóźnienie wyłączenia musi być dłuższe, aby całe pranie+suszenie trwało w jednym cyklu.", "label": "Opóźnienie Wyłączenia" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Ostrość energii", "doc": "Ostrość kary za niezgodność energii w Etapie 4. Mniejszy = surowszy: niezgodność energii bardziej obniża wynik. Domyślna wartość 0,25 jest celowo bardziej łagodna niż Ostrość Czasu Trwania, ponieważ energia zmienia się z obciążeniem. Używaj razem z Wagą Energii." + }, + "power_profile_interval_min": { + "label": "Interwał profilu mocy", + "doc": "Rozmiar segmentu dla atrybutu senzora power_profile na profil (płaska tablica średnich watów na slot zużywana przez zewnętrzne planerzy jak EMHASS i tibber_prices). Mniejsze segmenty zachowują krótkie skoki mocy ostre; większe segmenty wygładzają kształt. Domyślnie 15 min. Tylko do odczytu; nie wpływa na wykrywanie." + }, + "notify_live_sticky": { + "label": "Zachowaj powiadomienie na żywo po dotknięciu", + "doc": "Tylko Android. Ustaw powiadomienie o postępie na żywo jako trwałe (przypięte), aby dotknięcie nie odrzucało aktywnego wątku. Wyłączone zachowuje domyślne zachowanie, gdzie dotknięcie odrzuca powiadomienie." + }, + "notify_live_click_action": { + "label": "Cel dotknięcia powiadomienia na żywo", + "doc": "Tylko Android. Gdzie dotknięcie powiadomienia o postępie na żywo otwiera (np. /lovelace/laundry lub pełny URL) zamiast strony startowej aplikacji. Pozostaw puste dla wartości domyślnej." + }, + "door_opens_at_end": { + "label": "Drzwi otwierają się automatycznie na końcu", + "doc": "Dla zmywarek, które na końcu cyklu otwierają drzwi w celu suszenia (AirDry i podobne). Po włączeniu otwarcie drzwi podczas działającego cyklu nie zatrzymuje go na zawsze; jeśli drzwi pozostaną otwarte przez czas oczekiwania poniżej, WashData uznaje cykl za zakończony. Krótkie otwarcie (dodawanie naczynia) jest ignorowane. Wymaga encji czujnika drzwi." + }, + "door_end_dwell_seconds": { + "label": "Czas otwarcia drzwi do zakończenia cyklu", + "doc": "Jak długo drzwi muszą pozostać otwarte, zanim WashData zakończy cykl, gdy włączone jest \"Drzwi otwierają się automatycznie na końcu\". Wystarczająco długo, aby zignorować szybkie dodawanie naczyń (domyślnie 60 s), wystarczająco krótko, aby szybko zakończyć, gdy maszyna otworzy drzwi." } }, "setting_group": { @@ -1592,6 +1708,7 @@ "min_active": "Na podstawie minimalnej mocy czynnej ({min}W) zaobserwowanej w ostatnim cyklu.", "min_duration_ratio": "Utrzymane jak najniżej, aby program był rozpoznawany na wczesnym etapie cyklu; progi pewności i niejednoznaczności zapobiegają przedwczesnym decyzjom.", "min_off_gap": "Na podstawie {gaps} zaobserwowanych przerw między cyklami (p05={p05}s). Minimum urządzenia: {floor}s.", + "min_off_gap_bridge": "Dobrane tak, aby pokryć najdłuższy cichy odcinek wewnątrz cyklu: {span}s + zapas 60s, z {spans} pokrytych przerw w {cycles} poprawnych cyklach (pozostaje poniżej {ceiling}s, czyli najkrótszej przerwy, jaką zostawiasz między kolejnymi uruchomieniami).", "min_power": "40% najniższej mocy czynnej p05 ({p05}W) w {cycles} poprawnych cyklach, tak aby próg wyłączenia pozostał poniżej rzeczywistego poboru.{excl}", "ml_auto_label": "Najniższa pewność, przy której model jakości nadal uznawał cykl za poprawny (p10 z {cycles} poprawnych cykli = {p10}).", "ml_end_repeat": "{false}/{total} cykli ({pct}%) miało pauzę, którą detektor końca ocenił powyżej 50%; wymagaj {val} potwierdzeń zakończenia.", @@ -1608,7 +1725,7 @@ "thr_batch": "Utrzymane tuż powyżej najniższej mocy czynnej p05 w {cycles} cyklach ({p05}W), aby start był wykrywany jak najwcześniej, a próg zatrzymania pozostawał poniżej najniższej mocy pracy urządzenia.", "tol_per_profile": "p75 wariancji czasu trwania na profil w {profiles} profilach ({cycles} cykli); spójne profile nie są karane.", "tol_pooled": "Na podstawie łącznej wariancji czasu trwania {cycles} ostatnich oznaczonych cykli (odchylenie p95={dev}).", - "watchdog": "Utrzymane tak nisko, jak to bezpieczne (3x przerwa aktualizacji p95 wynosząca {p95}s, min. 30s), aby zawieszenia były szybko wykrywane bez fałszywych zatrzymań." + "watchdog": "Utrzymane tak nisko, jak to bezpieczne (tuż powyżej przerwy aktualizacji p95 wynoszącej {p95}s, min. 30s), aby zawieszenia były szybko wykrywane bez fałszywych zatrzymań." }, "exclusions": { "summary": "Wykluczono {total} błędnie wykrytych cykli: {parts}.", @@ -1688,6 +1805,10 @@ "name_required": "Wymagane imię i nazwisko", "no_split_found": "Nie znaleziono żadnych wolnych luk, które można by podzielić", "panel_settings_saved": "Ustawienia panelu zostały zapisane", + "pg_preset_loaded": "Preset \"{name}\" wczytany", + "pg_preset_saved": "Preset \"{name}\" zapisany", + "pg_sugg_loaded": "Załadowano {n} sugerowanych wartości - uruchom piaskownicę, aby porównać", + "pg_sugg_ml_loaded": "Załadowano {n} wartości skalibrowanych przez ML - uruchom piaskownicę, aby porównać", "phase_name_required": "Nazwa fazy jest wymagana", "phase_updated": "Faza zaktualizowana", "phases_saved": "Fazy ​​zapisane", @@ -1770,6 +1891,7 @@ "other": "Inne" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Zmywarka: sekundy ciszy po oczekiwanym czasie trwania, zanim zwolnione zostanie oczekiwanie na końcowe odpompowanie wody", "anti_wrinkle_enabled": "Pochłaniaj impulsy bębna po głównej fazie, zamiast odczytywać je jako nowe cykle", "anti_wrinkle_exit_power": "Moc musi spaść poniżej tej wartości pomiędzy impulsami, aby tryb antygniotowy pozostał aktywny", "anti_wrinkle_idle_timeout": "Dozwolony czas ciszy między dwoma impulsami bębna, zanim tryb antygniotowy się zakończy", diff --git a/custom_components/ha_washdata/translations/panel/pt-BR.json b/custom_components/ha_washdata/translations/panel/pt-BR.json index e709fa9f..6a5eff9e 100644 --- a/custom_components/ha_washdata/translations/panel/pt-BR.json +++ b/custom_components/ha_washdata/translations/panel/pt-BR.json @@ -92,6 +92,19 @@ "pause_cycle_tip": "Pausar o ciclo em andamento – o eletrodoméstico retomará onde parou", "pg_apply_device": "Aplicar ao dispositivo", "pg_autofill": "Preencher automaticamente", + "pg_load_calibrated": "Carregar Calibrado (ML) ({n})", + "pg_load_calibrated_tip": "Carregar as configurações calibradas por ML como substituições na Área de testes", + "pg_load_live": "Carregar as configurações ativas", + "pg_load_live_tip": "Reler as configurações atuais da integração e descartar todas as edições feitas na Área de testes", + "pg_load_suggested": "Carregar sugestões ({n})", + "pg_load_suggested_tip": "Carregar as sugestões atuais do ajustador automático como substituições na Área de testes", + "pg_preset_delete": "Excluir predefinição", + "pg_preset_load": "Carregar predefinição", + "pg_preset_load_tip": "Substituir os valores da Área de testes por esta predefinição (as configurações ativas não são alteradas)", + "pg_preset_save": "Salvar como predefinição", + "pg_preset_save_tip": "Salvar todos os valores abaixo como uma predefinição nomeada para este dispositivo", + "pg_publish_all": "Salvar {n} configuração(ões) na integração", + "pg_publish_one": "Salvar {label} na integração", "play": "Reproduzir", "process": "Processar", "process_history": "Processar agora", @@ -178,7 +191,9 @@ "download_export": "Baixar exportação", "analyze_import": "Analisar arquivo", "import_selected": "Importar seleção", - "back": "Voltar" + "back": "Voltar", + "mute_suggestion": "Parar de sugerir esta configuração", + "reset_muted": "Redefinir silenciados" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +290,7 @@ "no_automations": "Ainda não há automações que referenciem este dispositivo.", "panel_settings": "Configurações do painel", "param_sweep": "Varredura de parâmetros", + "pg_settings_source": "Origem das configurações", "phase_catalog": "Catálogo de fases", "playground": "Área de testes", "process_history": "Histórico de processamento", @@ -415,6 +431,9 @@ "pg_match_score": "Pontuação de correspondência", "pg_pct_of": "{p}% de {total}", "pg_poor_match": "Correspondência ruim", + "pg_preset": "Predefinição da Área de testes", + "pg_preset_name": "Nome da nova predefinição", + "pg_preset_none": "Selecione uma predefinição…", "pg_strong_match": "Correspondência forte", "pg_tile_ambiguous": "Ambíguo", "pg_tile_ambiguous_tip": "Ciclos com empate quase perfeito entre dois programas", @@ -609,7 +628,8 @@ "conflict_resolution": "Conflitos de nomes", "conflict_import_copy": "Importar como cópia", "conflict_keep_mine": "Manter o meu", - "conflict_overwrite": "Sobrescrever" + "conflict_overwrite": "Sobrescrever", + "font_size": "Tamanho da fonte do painel" }, "log": { "all_levels": "Todos os níveis", @@ -771,7 +791,17 @@ "pg_apply_confirm": "Aplicar o melhor valor: {label} = {value}?", "pg_canvas_empty": "Selecione um ciclo acima e pressione Carregar para ver o rastro de potência.", "pg_chart_caption": "Taxa de detecção/correspondência ao longo dos valores de {param}", + "pg_ctrl_intro": "Os valores partem das configurações ativas deste dispositivo na integração. As edições ficam na Área de testes até você salvá-las na integração.", + "pg_live_unavailable": "Configurações ativas indisponíveis, exibindo os valores padrão.", + "pg_load_live_confirm": "Descartar {n} edição(ões) da Área de testes e recarregar as configurações atuais da integração?", "pg_match_rate": "{pct}% de taxa de correspondência em {total} ciclos", + "pg_matches_live": "Corresponde às configurações ativas", + "pg_n_changed": "{n} valor(es) diferente(s) das configurações ativas", + "pg_sugg_none": "Todas as sugestões já correspondem às configurações atuais", + "pg_preset_delete_confirm": "Excluir a predefinição \"{name}\"?", + "pg_preset_limit": "Limite de predefinições atingido ({n})", + "pg_preset_overwrite": "Sobrescrever a predefinição \"{name}\"?", + "pg_publish_one_confirm": "Salvar {label} = {value} nas configurações deste dispositivo?", "pg_restart_note": "Reinicie o Home Assistant para ativar as ferramentas de simulação.", "pg_sim_progress": "{done} / {total} ciclos", "pg_starting": "Iniciando…", @@ -845,6 +875,7 @@ "trend_duration_shorter": "Duração com tendência decrescente ({pct}%/ciclo) – média recente {avg}", "trend_energy_down": "Energia com tendência decrescente ({pct}%/ciclo)", "trend_energy_up": "Energia com tendência crescente ({pct}%/ciclo) – média recente {avg}", + "trim_destructive_confirm": "Isso mantém apenas {pct}% do ciclo e esta ação não pode ser desfeita. Continuar?", "trim_intro": "Arraste as alças vermelhas ou insira valores. Tudo fora da janela é removido.", "tuning_suggestions_available": "{count} sugestão de ajuste disponível a partir dos ciclos observados. Aparecem ao lado dos campos relevantes.", "unsure_detected_prefix": "O WashData não tem certeza se detectou", @@ -922,7 +953,12 @@ "merge_hint": "Os itens importados são adicionados; nada local é perdido. Os conflitos de nomes são resolvidos abaixo.", "replace_warn": "Cada categoria marcada é apagada e substituída pelo conteúdo do arquivo. As categorias não marcadas ficam intactas.", "dest_reference_hint": "Os ciclos importados só melhoram o reconhecimento de programas e nunca afetam as estatísticas de uso/energia.", - "dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/uso. Use para mover um eletrodoméstico para uma nova instalação." + "dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/uso. Use para mover um eletrodoméstico para uma nova instalação.", + "sug_muted": "Não vai sugerir esta configuração novamente", + "sug_mute_failed": "Não foi possível silenciar a sugestão", + "sug_unmuted_all": "Sugestões silenciadas redefinidas", + "n_suggestions_muted": "{count} silenciadas; o ajuste automático não irá propô-las.", + "font_size_hint": "Amplie ou reduza o texto neste painel. Aplica-se à sua conta neste dispositivo." }, "phase_desc": { "anti_crease": "Giros curtos ocasionais após a conclusão para reduzir amassados.", @@ -970,6 +1006,10 @@ "unusable": "Inutilizável" }, "section": { + "dishwasher": { + "label": "Lava-louças", + "intro": "Tratamento de fim de ciclo para lava-louças, que normalmente terminam com uma longa fase de secagem quase silenciosa antes de uma breve descarga final." + }, "anti_wrinkle": { "intro": "O modo antiamasso detecta pulsos de giro de baixa potência após a fase principal e os mantém anexados ao ciclo terminado.", "label": "Antiamasso" @@ -1012,6 +1052,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Liberação em silêncio da secagem passiva", + "doc": "Assim que o ciclo ultrapassa a duração esperada, por quanto tempo a lava-louças deve permanecer silenciosa (abaixo do Limite de Parada) antes de o WashData parar de aguardar uma descarga final e encerrar o ciclo. Aumente este valor se a sua máquina tiver uma longa fase de secagem silenciosa antes de uma descarga final tardia que está passando despercebida - uma janela mais ampla permite que a duração aprendida acompanhe a variação sazonal (água de entrada mais fria = ciclos mais longos) em vez de se fixar na média antiga. Ele apenas encurta a espera em relação ao limite interno de 30 minutos para o pico de fim, nunca a prolonga." + }, "anti_wrinkle_enabled": { "doc": "Reconheça os pulsos curtos de baixa potência que uma secadora emite após a fase de aquecimento principal e mantenha-os anexados ao ciclo finalizado, em vez de lê-los como novos ciclos.", "label": "Ativar Detecção Antiamasso" @@ -1232,6 +1276,10 @@ "doc": "Minutos após o término de um ciclo, antes de enviar o lembrete de \"descarregar a máquina\" ainda em espera. Defina 0 para desativar o lembrete.", "label": "Atraso de Lembrete de Descarga" }, + "notify_unload_repeat": { + "doc": "Continua reenviando o lembrete de descarga a cada \"Atraso de Lembrete de Descarga\" minutos até você abrir a porta ou tocar em \"Parar de lembrar\" na notificação. Requer uma Entidade do Sensor de Porta (o próprio lembrete a exige). O botão de dispensar funciona nas notificações do aplicativo complementar (móvel) do Home Assistant.", + "label": "Repetir Até a Porta Abrir" + }, "off_delay": { "doc": "Tempo de espera após a queda de energia antes de declarar o término do ciclo. Se a energia for retomada dentro desta janela, o ciclo continua perfeitamente - isso faz a ponte entre as etapas de lavagem. As máquinas de lavar louça têm longas fases de secagem (desligadas por 20-60 minutos), portanto o atraso no desligamento deve exceder esse valor para manter toda a lavagem + secagem em um único ciclo.", "label": "Atraso de Desligamento" @@ -1406,6 +1454,26 @@ "energy_scale": { "label": "Nitidez de energia", "doc": "Precisão da penalidade de concordância de energia. Menor = mais rigoroso: uma discordância de energia penaliza mais. O padrão 0,25 é intencionalmente mais permissivo do que a Precisão de duração, porque a energia varia com a carga. Use em conjunto com o Peso de energia." + }, + "power_profile_interval_min": { + "label": "Intervalo do Perfil de Potência", + "doc": "Tamanho do intervalo para o atributo de sensor power_profile por perfil (a matriz plana de watts médios por slot consumida por planejadores externos como EMHASS e tibber_prices). Intervalos menores preservam picos curtos de potência com mais nitidez; intervalos maiores suavizam o perfil. Padrão: 15 min. Apenas em tempo de leitura; não afeta a detecção." + }, + "notify_live_sticky": { + "label": "Manter Notificação ao Vivo ao Toque", + "doc": "Apenas Android. Torna a notificação de progresso ao vivo persistente (fixada) para que tocá-la não dispense o encadeamento em andamento. Desativado mantém o comportamento padrão, em que um toque a dispensa." + }, + "notify_live_click_action": { + "label": "Destino de Toque da Notificação ao Vivo", + "doc": "Apenas Android. Para onde um toque na notificação de progresso ao vivo abre (por exemplo, /lovelace/lavanderia, ou uma URL completa) em vez da página inicial do aplicativo. Deixe em branco para o padrão." + }, + "door_opens_at_end": { + "label": "Porta Abre Automaticamente ao Final", + "doc": "Para máquinas de lavar louça que abrem a porta automaticamente ao final do ciclo para secar (AirDry e similares). Com esta opção ativa, a abertura de porta durante um ciclo em execução não o pausa indefinidamente; em vez disso, se a porta permanecer aberta pelo tempo de espera configurado abaixo, o WashData considera o ciclo como concluído. Uma abertura breve (para adicionar um item) é ignorada. Requer uma Entidade de Sensor de Porta." + }, + "door_end_dwell_seconds": { + "label": "Tempo de Espera da Porta Aberta", + "doc": "Por quanto tempo a porta deve permanecer aberta antes de o WashData encerrar o ciclo, quando a opção \"Porta Abre Automaticamente ao Final\" está ativa. Longo o suficiente para ignorar a adição rápida de um prato (padrão 60 s), curto o suficiente para encerrar prontamente assim que a máquina abre a porta." } }, "setting_group": { @@ -1576,6 +1644,10 @@ "name_required": "Nome obrigatório", "no_split_found": "Nenhum intervalo de inatividade encontrado para dividir", "panel_settings_saved": "Configurações do painel salvas", + "pg_preset_loaded": "Predefinição \"{name}\" carregada", + "pg_preset_saved": "Predefinição \"{name}\" salva", + "pg_sugg_loaded": "{n} valor(es) sugerido(s) carregado(s) - execute a Área de testes para comparar", + "pg_sugg_ml_loaded": "{n} valor(es) calibrado(s) por ML carregado(s) - execute a Área de testes para comparar", "phase_name_required": "O nome da fase é obrigatório", "phase_updated": "Fase atualizada", "phases_saved": "Fases salvas", @@ -1723,6 +1795,7 @@ "min_active": "Com base na potência ativa mínima ({min}W) observada no último ciclo.", "min_duration_ratio": "Mantido o mais baixo possível para que um programa seja reconhecido logo no início do ciclo; os limiares de confiança e de ambiguidade evitam confirmações prematuras.", "min_off_gap": "Com base em {gaps} intervalos entre ciclos observados (p05={p05}s). Piso do dispositivo: {floor}s.", + "min_off_gap_bridge": "Dimensionado para cobrir o período de silêncio mais longo dentro de um ciclo: {span}s + margem de 60s, de {spans} intervalos cobertos em {cycles} ciclos limpos (fica abaixo do seu intervalo mínimo de {ceiling}s entre cargas consecutivas).", "min_power": "40% da menor potência ativa p05 ({p05}W) em {cycles} ciclos limpos, mantendo o limiar de desligamento abaixo do consumo real.{excl}", "ml_auto_label": "Menor confiança que o modelo de qualidade ainda classificou como limpa (p10 de {cycles} ciclos limpos = {p10}).", "ml_end_repeat": "{false}/{total} ciclos ({pct}%) tiveram uma pausa que o detector de fim pontuou em >50%; exigir {val} confirmação(ões) de fim.", @@ -1739,7 +1812,7 @@ "thr_batch": "Mantido logo acima da menor potência ativa p05 em {cycles} ciclos ({p05}W) para que um início seja captado o mais cedo possível e o limiar de parada permaneça abaixo da menor potência de funcionamento da máquina.", "tol_per_profile": "p75 da variância de duração por perfil em {profiles} perfis ({cycles} ciclos); perfis consistentes não são penalizados.", "tol_pooled": "Com base na variância de duração agregada de {cycles} ciclos rotulados recentes (desvio p95={dev}).", - "watchdog": "Mantido tão baixo quanto é seguro (3x o intervalo de atualização p95 de {p95}s, mín. 30s) para que travamentos sejam detectados rapidamente sem paradas falsas." + "watchdog": "Mantido tão baixo quanto é seguro (logo acima do intervalo de atualização p95 de {p95}s, mín. 30s) para que travamentos sejam detectados rapidamente sem paradas falsas." }, "exclusions": { "summary": "Excluído(s) {total} ciclo(s) mal detectado(s): {parts}.", @@ -1770,6 +1843,7 @@ "other": "Outro" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Lava-louças: segundos de silêncio após a duração esperada antes de liberar a espera da descarga de fim de ciclo", "anti_wrinkle_enabled": "Absorver os pulsos de giro após a fase principal em vez de lê-los como novos ciclos", "anti_wrinkle_exit_power": "A potência deve cair abaixo deste valor entre os pulsos para que o modo antiamasso permaneça ativo", "anti_wrinkle_idle_timeout": "Tempo de silêncio permitido entre dois pulsos de giro antes de o modo antiamasso terminar", @@ -1944,5 +2018,53 @@ "hide_guidance": "Ocultar guia", "show_guidance": "Exibir guia" } + }, + "card": { + "min": "min", + "entity_not_found": "Entidade não encontrada", + "running_long": "Em atraso", + "remaining": "restante", + "progress": "progresso", + "show_time_remaining": "Mostrar tempo restante", + "show_percentage": "Mostrar porcentagem", + "layout": { + "tile": "Bloco (compacto)", + "detail": "Detalhe (completo)", + "glance": "Visão geral (vários dispositivos)" + }, + "btn": { + "pause": "Pausar", + "resume": "Retomar", + "terminate": "Encerrar ciclo", + "record_start": "Iniciar gravação", + "record_stop": "Parar gravação", + "program": "Programa", + "open_panel": "Abrir WashData" + }, + "editor": { + "layout": "Layout", + "entity": "Entidade do eletrodoméstico", + "entities": "Eletrodomésticos", + "title": "Título", + "icon": "Ícone", + "show_state": "Mostrar estado", + "show_program": "Mostrar programa", + "show_progress_bar": "Mostrar barra de progresso", + "spin_icon": "Girar o ícone durante o funcionamento", + "display_mode": "Linha de detalhe", + "active_color": "Cor ativa personalizada", + "show_phase": "Mostrar fase", + "show_energy": "Mostrar energia e custo", + "show_anomaly": "Mostrar aviso de atraso", + "show_sparkline": "Mostrar gráfico de potência ao vivo", + "buttons": "Botões de ação", + "program_entity": "Entidade de programa (personalizada)", + "time_entity": "Entidade de tempo (personalizada)", + "pct_entity": "Entidade de progresso (personalizada)", + "power_entity": "Entidade de potência (personalizada)", + "tap_action": "Ação ao tocar", + "hold_action": "Ação ao manter pressionado", + "double_tap_action": "Ação ao tocar duas vezes" + } } } diff --git a/custom_components/ha_washdata/translations/panel/pt.json b/custom_components/ha_washdata/translations/panel/pt.json index e8d234b3..c9c51893 100644 --- a/custom_components/ha_washdata/translations/panel/pt.json +++ b/custom_components/ha_washdata/translations/panel/pt.json @@ -92,6 +92,19 @@ "pause_cycle_tip": "Pausar o ciclo em curso – o aparelho retomará onde parou", "pg_apply_device": "Aplicar ao dispositivo", "pg_autofill": "Preenchimento automático", + "pg_load_calibrated": "Carregar Calibrado (ML) ({n})", + "pg_load_calibrated_tip": "Carregar as definições calibradas por ML como substituições na Área de testes", + "pg_load_live": "Carregar as definições ativas", + "pg_load_live_tip": "Voltar a ler as definições atuais da integração e descartar todas as edições feitas na Área de testes", + "pg_load_suggested": "Carregar sugestões ({n})", + "pg_load_suggested_tip": "Carregar as sugestões atuais do ajustador automático como substituições na Área de testes", + "pg_preset_delete": "Eliminar preset", + "pg_preset_load": "Carregar preset", + "pg_preset_load_tip": "Substituir os valores da Área de testes por este preset (as definições ativas não são alteradas)", + "pg_preset_save": "Guardar como preset", + "pg_preset_save_tip": "Guardar todos os valores abaixo como um preset com nome para este dispositivo", + "pg_publish_all": "Guardar {n} definição(ões) na integração", + "pg_publish_one": "Guardar {label} na integração", "play": "Reproduzir", "process": "Processar", "process_history": "Processar agora", @@ -178,7 +191,9 @@ "download_export": "Transferir exportação", "analyze_import": "Analisar ficheiro", "import_selected": "Importar seleção", - "back": "Voltar" + "back": "Voltar", + "mute_suggestion": "Não sugerir mais esta definição", + "reset_muted": "Repor silenciados" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +290,7 @@ "no_automations": "Ainda não há automatizações que referenciem este dispositivo.", "panel_settings": "Definições do painel", "param_sweep": "Varrimento de parâmetro", + "pg_settings_source": "Origem das definições", "phase_catalog": "Catálogo de fases", "playground": "Área de testes", "process_history": "Histórico de processamento", @@ -415,6 +431,9 @@ "pg_match_score": "Pontuação de correspondência", "pg_pct_of": "{p}% de {total}", "pg_poor_match": "Correspondência má", + "pg_preset": "Preset da Área de testes", + "pg_preset_name": "Nome do novo preset", + "pg_preset_none": "Selecione um preset…", "pg_strong_match": "Correspondência forte", "pg_tile_ambiguous": "Ambíguo", "pg_tile_ambiguous_tip": "Ciclos com um quase empate entre dois programas", @@ -609,7 +628,8 @@ "conflict_resolution": "Conflitos de nomes", "conflict_import_copy": "Importar como cópia", "conflict_keep_mine": "Manter o meu", - "conflict_overwrite": "Substituir" + "conflict_overwrite": "Substituir", + "font_size": "Tamanho da letra do painel" }, "log": { "all_levels": "Todos os níveis", @@ -771,7 +791,17 @@ "pg_apply_confirm": "Aplicar o melhor valor: {label} = {value}?", "pg_canvas_empty": "Selecione um ciclo acima e, em seguida, prima Carregar para ver a sua curva de potência.", "pg_chart_caption": "Taxa de deteção/correspondência ao longo dos valores de {param}", + "pg_ctrl_intro": "Os valores partem das definições ativas deste dispositivo na integração. As edições ficam na Área de testes até as guardar na integração.", + "pg_live_unavailable": "Definições ativas indisponíveis, a mostrar os valores predefinidos.", + "pg_load_live_confirm": "Descartar {n} edição(ões) da Área de testes e recarregar as definições atuais da integração?", "pg_match_rate": "{pct}% de taxa de correspondência em {total} ciclos", + "pg_matches_live": "Corresponde às definições ativas", + "pg_n_changed": "{n} valor(es) diferente(s) das definições ativas", + "pg_sugg_none": "Todas as sugestões já correspondem às definições atuais", + "pg_preset_delete_confirm": "Eliminar o preset \"{name}\"?", + "pg_preset_limit": "Limite de presets atingido ({n})", + "pg_preset_overwrite": "Substituir o preset \"{name}\"?", + "pg_publish_one_confirm": "Guardar {label} = {value} nas definições deste dispositivo?", "pg_restart_note": "Reinicie o Home Assistant para ativar as ferramentas de simulação.", "pg_sim_progress": "{done} / {total} ciclos", "pg_starting": "A iniciar…", @@ -845,6 +875,7 @@ "trend_duration_shorter": "Duração com tendência decrescente ({pct}%/ciclo) – média recente {avg}", "trend_energy_down": "Energia com tendência decrescente ({pct}%/ciclo)", "trend_energy_up": "Energia com tendência crescente ({pct}%/ciclo) – média recente {avg}", + "trim_destructive_confirm": "Isto mantém apenas {pct}% do ciclo e esta ação não pode ser anulada. Continuar?", "trim_intro": "Arraste os puxadores vermelhos ou introduza valores. Tudo o que estiver fora da janela é removido.", "tuning_suggestions_available": "{count} sugestão de ajuste disponível a partir dos ciclos observados. Aparecem junto dos campos relevantes.", "unsure_detected_prefix": "O WashData não tem a certeza de que detectou", @@ -922,9 +953,15 @@ "merge_hint": "Os itens importados são adicionados; nada local é perdido. Os conflitos de nomes são resolvidos abaixo.", "replace_warn": "Cada categoria marcada é apagada e substituída pelo conteúdo do ficheiro. As categorias não marcadas ficam intactas.", "dest_reference_hint": "Os ciclos importados só melhoram o reconhecimento de programas e nunca afetam as estatísticas de utilização/energia.", - "dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/utilização. Use para mover um eletrodoméstico para uma nova instalação." + "dest_real_history_hint": "Os ciclos importados contam como histórico próprio deste dispositivo e alimentam as estatísticas de energia/utilização. Use para mover um eletrodoméstico para uma nova instalação.", + "sug_muted": "Esta definição não será sugerida novamente", + "sug_mute_failed": "Não foi possível silenciar a sugestão", + "sug_unmuted_all": "Sugestões silenciadas repostas", + "n_suggestions_muted": "{count} silenciadas; o ajustador automático não proporá estas definições.", + "font_size_hint": "Torna tudo neste painel maior ou menor. Aplica-se à sua conta neste dispositivo." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Máquina de lavar louça: segundos de silêncio após a duração esperada antes de libertar a espera da descarga de fim de ciclo", "anti_wrinkle_enabled": "Absorver os pulsos de rotação após a fase principal em vez de os ler como novos ciclos", "anti_wrinkle_exit_power": "A potência deve descer abaixo deste valor entre pulsos para que o modo anti-vincos permaneça ativo", "anti_wrinkle_idle_timeout": "Tempo de silêncio permitido entre dois pulsos de rotação antes de o modo anti-vincos terminar", @@ -998,6 +1035,10 @@ "unusable": "Inutilizável" }, "section": { + "dishwasher": { + "label": "Máquina de lavar louça", + "intro": "Gestão de fim de ciclo para máquinas de lavar louça, que normalmente terminam com uma longa fase de secagem quase silenciosa antes de uma breve descarga final." + }, "anti_wrinkle": { "intro": "O modo anti-vincos detecta pulsos de rotação a baixa potência após a fase principal e mantém-nos ligados ao ciclo terminado.", "label": "Anti-Vincos" @@ -1040,6 +1081,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Libertação em silêncio da secagem passiva", + "doc": "Assim que o ciclo ultrapassa a sua duração esperada, durante quanto tempo a máquina de lavar louça deve permanecer silenciosa (abaixo do Limiar de Paragem) antes de o WashData deixar de aguardar uma descarga final e terminar o ciclo. Aumente este valor se a sua máquina tiver uma longa fase de secagem silenciosa antes de uma descarga final tardia que está a ser ignorada - uma janela mais ampla permite que a duração aprendida acompanhe a variação sazonal (água de entrada mais fria = ciclos mais longos) em vez de se fixar na média antiga. Apenas encurta a espera face ao limite interno de 30 minutos para o pico de fim, nunca a prolonga." + }, "anti_wrinkle_enabled": { "doc": "Reconheça os pulsos curtos de baixa potência que uma secadora emite após a fase de aquecimento principal e mantenha-os anexados ao ciclo finalizado, em vez de lê-los como novos ciclos.", "label": "Activar Detecção Anti-Vincos" @@ -1260,6 +1305,10 @@ "doc": "Minutos após o término de um ciclo, antes de enviar o lembrete de \"descarregar a máquina\" ainda em espera. Defina 0 para desativar o lembrete.", "label": "Atraso de Lembrete de Descarga" }, + "notify_unload_repeat": { + "doc": "Continua a reenviar o lembrete de descarga a cada \"Atraso de Lembrete de Descarga\" minutos até abrir a porta ou tocar em \"Parar de lembrar\" na notificação. Requer uma Entidade do Sensor de Porta (o próprio lembrete a exige). O botão de dispensar funciona nas notificações do aplicativo complementar (móvel) do Home Assistant.", + "label": "Repetir Até a Porta Abrir" + }, "off_delay": { "doc": "Tempo de espera após a queda de energia antes de declarar o término do ciclo. Se a energia for retomada dentro desta janela, o ciclo continua perfeitamente - isso faz a ponte entre as etapas de lavagem. As máquinas de lavar louça têm longas fases de secagem (desligadas por 20-60 minutos), portanto o atraso no desligamento deve exceder esse valor para manter toda a lavagem + secagem em um único ciclo.", "label": "Atraso de Desligamento" @@ -1434,6 +1483,26 @@ "energy_scale": { "label": "Nitidez de energia", "doc": "Precisão da penalidade de concordância de energia. Menor = mais rigoroso: uma discordância de energia penaliza mais. A predefinição 0,25 é intencionalmente mais permissiva do que a Precisão de duração, porque a energia varia com a carga. Use em conjunto com o Peso de energia." + }, + "power_profile_interval_min": { + "label": "Intervalo do Perfil de Potência", + "doc": "Tamanho do intervalo para o atributo do sensor power_profile por perfil (o array plano de watts médios por slot consumido por planeadores externos como EMHASS e tibber_prices). Intervalos menores mantêm os picos de potência curtos nítidos; intervalos maiores suavizam a forma. Predefinição: 15 min. Apenas de leitura; não afeta a deteção." + }, + "notify_live_sticky": { + "label": "Manter a Notificação em Tempo Real ao Tocar", + "doc": "Apenas Android. Torna a notificação de progresso em tempo real persistente (fixada) para que ao tocar nela não a dispense. Desativado mantém o comportamento padrão em que o toque a dispensa." + }, + "notify_live_click_action": { + "label": "Destino ao Tocar na Notificação em Tempo Real", + "doc": "Apenas Android. Para onde abre o toque na notificação de progresso em tempo real (por exemplo, /lovelace/lavandaria, ou um URL completo) em vez da página inicial da aplicação. Deixe em branco para a predefinição." + }, + "door_opens_at_end": { + "label": "Porta Abre Automaticamente no Fim", + "doc": "Para máquinas de lavar louça que abrem a porta automaticamente no fim do ciclo para secar (AirDry e similares). Com esta opção ativa, a abertura da porta durante um ciclo em execução deixa de o pausar indefinidamente; em vez disso, se a porta permanecer aberta durante o tempo de espera indicado abaixo, o WashData considera o ciclo concluído. Uma abertura breve (ao adicionar um item) é ignorada. Requer uma Entidade do Sensor de Porta." + }, + "door_end_dwell_seconds": { + "label": "Tempo de Espera com Porta Aberta para Fim", + "doc": "Quanto tempo a porta tem de permanecer aberta antes de o WashData terminar o ciclo, quando a opção \"Porta Abre Automaticamente no Fim\" está ativa. Suficientemente longo para ignorar a adição rápida de um prato (predefinição: 60 s), suficientemente curto para terminar prontamente quando a máquina abre a porta." } }, "setting_group": { @@ -1604,6 +1673,10 @@ "name_required": "Nome obrigatório", "no_split_found": "Nenhum intervalo de inactividade encontrado para dividir", "panel_settings_saved": "Definições do painel guardadas", + "pg_preset_loaded": "Preset \"{name}\" carregado", + "pg_preset_saved": "Preset \"{name}\" guardado", + "pg_sugg_loaded": "{n} valor(es) sugerido(s) carregado(s) - execute a Área de testes para comparar", + "pg_sugg_ml_loaded": "{n} valor(es) calibrado(s) por ML carregado(s) - execute a Área de testes para comparar", "phase_name_required": "O nome da fase é obrigatório", "phase_updated": "Fase actualizada", "phases_saved": "Fases guardadas", @@ -1751,6 +1824,7 @@ "min_active": "Com base na potência ativa mínima ({min}W) observada no último ciclo.", "min_duration_ratio": "Mantido o mais baixo possível para que um programa seja reconhecido cedo no ciclo; os limiares de confiança e ambiguidade evitam decisões prematuras.", "min_off_gap": "Com base em {gaps} intervalos entre ciclos observados (p05={p05}s). Mínimo do dispositivo: {floor}s.", + "min_off_gap_bridge": "Dimensionado para cobrir o período de silêncio mais longo dentro de um ciclo: {span}s + 60s de margem, a partir de {spans} intervalos cobertos ao longo de {cycles} ciclos limpos (mantém-se abaixo do seu intervalo mínimo de {ceiling}s entre cargas consecutivas).", "min_power": "40% da potência ativa mais baixa no p05 ({p05}W) ao longo de {cycles} ciclos limpos, mantendo o limiar de desligamento abaixo do consumo real.{excl}", "ml_auto_label": "Confiança mais baixa que o modelo de qualidade ainda classificou como limpa (p10 de {cycles} ciclos limpos = {p10}).", "ml_end_repeat": "{false}/{total} ciclos ({pct}%) tiveram uma pausa que o detetor de fim pontuou >50%; exigir {val} confirmação(ões) de fim.", @@ -1767,7 +1841,7 @@ "thr_batch": "Mantido logo acima da potência ativa mais baixa no p05 ao longo de {cycles} ciclos ({p05}W) para que um arranque seja captado o mais cedo possível e o limiar de paragem se mantenha abaixo da potência de funcionamento mais baixa da máquina.", "tol_per_profile": "p75 da variância de duração por perfil em {profiles} perfis ({cycles} ciclos); os perfis restritos não são penalizados.", "tol_pooled": "Com base na variância de duração agrupada de {cycles} ciclos rotulados recentes (desvio p95={dev}).", - "watchdog": "Mantido o mais baixo que é seguro (3x o intervalo de atualização p95 de {p95}s, mín. 30s) para detetar rapidamente os bloqueios sem paragens falsas." + "watchdog": "Mantido o mais baixo que é seguro (ligeiramente acima do intervalo de atualização p95 de {p95}s, mín. 30s) para detetar rapidamente os bloqueios sem paragens falsas." }, "exclusions": { "summary": "Excluído(s) {total} ciclo(s) mal detetado(s): {parts}.", @@ -1944,5 +2018,53 @@ "hide_guidance": "Ocultar guia", "show_guidance": "Mostrar guia" } + }, + "card": { + "min": "min", + "entity_not_found": "Entidade não encontrada", + "running_long": "Em atraso", + "remaining": "restante", + "progress": "progresso", + "show_time_remaining": "Mostrar tempo restante", + "show_percentage": "Mostrar percentagem", + "layout": { + "tile": "Mosaico (compacto)", + "detail": "Detalhe (completo)", + "glance": "Vista rápida (vários dispositivos)" + }, + "btn": { + "pause": "Pausar", + "resume": "Retomar", + "terminate": "Terminar ciclo", + "record_start": "Iniciar gravação", + "record_stop": "Parar gravação", + "program": "Programa", + "open_panel": "Abrir WashData" + }, + "editor": { + "layout": "Disposição", + "entity": "Entidade do eletrodoméstico", + "entities": "Eletrodomésticos", + "title": "Título", + "icon": "Ícone", + "show_state": "Mostrar estado", + "show_program": "Mostrar programa", + "show_progress_bar": "Mostrar barra de progresso", + "spin_icon": "Rodar o ícone durante o funcionamento", + "display_mode": "Linha de detalhe", + "active_color": "Cor ativa personalizada", + "show_phase": "Mostrar fase", + "show_energy": "Mostrar energia e custo", + "show_anomaly": "Mostrar aviso de atraso", + "show_sparkline": "Mostrar gráfico de potência em direto", + "buttons": "Botões de ação", + "program_entity": "Entidade de programa (personalizada)", + "time_entity": "Entidade de tempo (personalizada)", + "pct_entity": "Entidade de progresso (personalizada)", + "power_entity": "Entidade de potência (personalizada)", + "tap_action": "Ação ao tocar", + "hold_action": "Ação ao manter premido", + "double_tap_action": "Ação ao tocar duas vezes" + } } } diff --git a/custom_components/ha_washdata/translations/panel/ro.json b/custom_components/ha_washdata/translations/panel/ro.json index f665ca4a..41f4fff9 100644 --- a/custom_components/ha_washdata/translations/panel/ro.json +++ b/custom_components/ha_washdata/translations/panel/ro.json @@ -92,6 +92,19 @@ "pause_cycle_tip": "Puneți în pauză ciclul în curs – aparatul va relua de unde a rămas", "pg_apply_device": "Aplicați pe dispozitiv", "pg_autofill": "Completare automată", + "pg_load_calibrated": "Încarcă Calibrat (ML) ({n})", + "pg_load_calibrated_tip": "Încarcă setările calibrate de ML ca substituiri în Zona de test", + "pg_load_live": "Încarcă setările active", + "pg_load_live_tip": "Recitește setările actuale ale integrării și renunță la toate modificările făcute în Zona de test", + "pg_load_suggested": "Încarcă sugestii ({n})", + "pg_load_suggested_tip": "Încarcă sugestiile curente ale optimizatorului automat ca substituiri în Zona de test", + "pg_preset_delete": "Șterge presetarea", + "pg_preset_load": "Încarcă presetarea", + "pg_preset_load_tip": "Înlocuiește valorile din Zona de test cu această presetare (setările active rămân neatinse)", + "pg_preset_save": "Salvează ca presetare", + "pg_preset_save_tip": "Salvează toate valorile de mai jos ca presetare denumită pentru acest dispozitiv", + "pg_publish_all": "Salvează {n} setări în integrare", + "pg_publish_one": "Salvează {label} în integrare", "play": "Redați", "process": "Procesați", "process_history": "Procesați acum", @@ -178,7 +191,9 @@ "download_export": "Descarcă exportul", "analyze_import": "Analizează fișierul", "import_selected": "Importă selecția", - "back": "Înapoi" + "back": "Înapoi", + "mute_suggestion": "Nu mai sugerați această setare", + "reset_muted": "Resetați cele ignorate" }, "conflict": { "anti_wrinkle_exit": { @@ -275,6 +290,7 @@ "no_automations": "Nicio automatizare nu face referire încă la acest dispozitiv.", "panel_settings": "Setări panou", "param_sweep": "Scanare parametri", + "pg_settings_source": "Sursa setărilor", "phase_catalog": "Catalog de faze", "playground": "Zonă de test", "process_history": "Istoricul procesării", @@ -415,6 +431,9 @@ "pg_match_score": "Scor de potrivire", "pg_pct_of": "{p}% din {total}", "pg_poor_match": "Potrivire proastă", + "pg_preset": "Presetare din Zona de test", + "pg_preset_name": "Numele noii presetări", + "pg_preset_none": "Selectează o presetare…", "pg_strong_match": "Potrivire puternică", "pg_tile_ambiguous": "Ambigue", "pg_tile_ambiguous_tip": "Cicluri cu un rezultat aproape egal între două programe", @@ -609,7 +628,8 @@ "conflict_resolution": "Conflicte de nume", "conflict_import_copy": "Importă drept copie", "conflict_keep_mine": "Păstrează-l pe al meu", - "conflict_overwrite": "Suprascrie" + "conflict_overwrite": "Suprascrie", + "font_size": "Dimensiunea fontului panoului" }, "log": { "all_levels": "Toate nivelurile", @@ -771,7 +791,17 @@ "pg_apply_confirm": "Aplicați cea mai bună valoare: {label} = {value}?", "pg_canvas_empty": "Selectați un ciclu de mai sus, apoi apăsați Încărcați pentru a vedea curba sa de putere.", "pg_chart_caption": "Rata de detectare/potrivire în funcție de valorile {param}", + "pg_ctrl_intro": "Valorile pornesc de la setările active ale acestui dispozitiv din integrare. Modificările rămân în Zona de test până când le salvezi în integrare.", + "pg_live_unavailable": "Setările active nu sunt disponibile, se afișează valorile implicite.", + "pg_load_live_confirm": "Renunți la {n} modificări din Zona de test și reîncarci setările actuale ale integrării?", "pg_match_rate": "{pct}% rată de potrivire pe {total} cicluri", + "pg_matches_live": "Identice cu setările active", + "pg_n_changed": "{n} valori diferite față de setările active", + "pg_sugg_none": "Toate sugestiile corespund deja setărilor actuale", + "pg_preset_delete_confirm": "Ștergi presetarea \"{name}\"?", + "pg_preset_limit": "Limita de presetări a fost atinsă ({n})", + "pg_preset_overwrite": "Suprascrii presetarea \"{name}\"?", + "pg_publish_one_confirm": "Salvezi {label} = {value} în setările acestui dispozitiv?", "pg_restart_note": "Reporniți Home Assistant pentru a activa instrumentele de simulare.", "pg_sim_progress": "{done} / {total} cicluri", "pg_starting": "Se pornește…", @@ -845,6 +875,7 @@ "trend_duration_shorter": "Durata este în scădere ({pct}%/ciclu) – medie recentă {avg}", "trend_energy_down": "Energia este în scădere ({pct}%/ciclu)", "trend_energy_up": "Energia este în creștere ({pct}%/ciclu) – medie recentă {avg}", + "trim_destructive_confirm": "Se păstrează doar {pct}% din ciclu, iar această acțiune nu poate fi anulată. Continuați?", "trim_intro": "Trageți mânerele roșii sau introduceți valori. Tot ceea ce este în afara ferestrei este eliminat.", "tuning_suggestions_available": "{count} sugestie de ajustare disponibilă din ciclurile observate. Acestea apar lângă câmpurile relevante.", "unsure_detected_prefix": "WashData nu este sigur că a detectat", @@ -922,7 +953,12 @@ "merge_hint": "Elementele importate sunt adăugate; nimic local nu se pierde. Conflictele de nume se rezolvă mai jos.", "replace_warn": "Fiecare categorie bifată este ștearsă și înlocuită cu conținutul fișierului. Categoriile nebifate rămân neatinse.", "dest_reference_hint": "Ciclurile importate îmbunătățesc doar recunoașterea programelor și nu afectează niciodată statisticile de utilizare/energie.", - "dest_real_history_hint": "Ciclurile importate contează ca istoric propriu al acestui dispozitiv și alimentează statisticile de energie/utilizare. Folosește pentru a muta un electrocasnic pe o instalare nouă." + "dest_real_history_hint": "Ciclurile importate contează ca istoric propriu al acestui dispozitiv și alimentează statisticile de energie/utilizare. Folosește pentru a muta un electrocasnic pe o instalare nouă.", + "sug_muted": "Această setare nu va mai fi sugerată", + "sug_mute_failed": "Nu s-a putut dezactiva sugestia", + "sug_unmuted_all": "Sugestiile dezactivate au fost resetate", + "n_suggestions_muted": "{count} dezactivate; reglajul automat nu le va propune.", + "font_size_hint": "Faceți tot din acest panou mai mare sau mai mic. Se aplică contului dvs. pe acest dispozitiv." }, "phase_desc": { "anti_crease": "Tumblări scurte ocazionale după finalizare pentru a reduce șifonarea.", @@ -970,6 +1006,10 @@ "unusable": "Inutilizabil" }, "section": { + "dishwasher": { + "label": "Mașină de spălat vase", + "intro": "Gestionarea sfârșitului de ciclu pentru mașinile de spălat vase, care de obicei se termină cu o fază lungă de uscare aproape silențioasă înainte de o scurtă evacuare finală." + }, "anti_wrinkle": { "intro": "Modul anti-șifonare detectează pulsuri de tumblare la putere redusă după faza principală și le menține atașate ciclului terminat.", "label": "Anti-Șifonare" @@ -1012,6 +1052,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Eliberare la liniște în uscarea pasivă", + "doc": "După ce ciclul depășește durata așteptată, cât timp trebuie să rămână silențioasă mașina de spălat vase (sub Prag de Oprire) înainte ca WashData să nu mai aștepte o evacuare finală și să încheie ciclul. Măriți-l dacă mașina are o fază lungă de uscare silențioasă înainte de o evacuare finală întârziată care nu este detectată - o fereastră mai largă permite duratei învățate să urmeze variația sezonieră (apă de alimentare mai rece = cicluri mai lungi) în loc să se fixeze pe media veche. Doar scurtează așteptarea față de plafonul intern de 30 de minute pentru vârful de final, fără a o prelungi vreodată." + }, "anti_wrinkle_enabled": { "doc": "Recunoașteți impulsurile scurte de rufe de putere redusă pe care le emite un uscător după faza principală de căldură și mențineți-le atașate la ciclul terminat în loc să le citiți ca cicluri noi.", "label": "Activați Detectarea Anti-Șifonare" @@ -1232,6 +1276,10 @@ "doc": "La câteva minute după încheierea unui ciclu, înainte de a trimite mementoul încă în așteptare „descărcați mașina”. Setați 0 pentru a dezactiva mementoul.", "label": "Întârziere Reamintire Descărcare" }, + "notify_unload_repeat": { + "doc": "Continuă să retrimită mementoul de descărcare la fiecare \"Întârziere Reamintire Descărcare\" minute până când deschizi ușa sau atingi \"Oprește mementourile\" în notificare. Necesită o Entitate Senzor Ușă (mementoul în sine o necesită). Butonul de respingere funcționează pe notificările aplicației complementare (mobile) Home Assistant.", + "label": "Repetă Până la Deschiderea Ușii" + }, "off_delay": { "doc": "Timp de așteptat după căderea energiei înainte de a declara ciclul încheiat. Dacă alimentarea se reia în această fereastră, ciclul continuă fără întreruperi - acest lucru face legătura între etapele de spălare. Mașinile de spălat vase au faze lungi de uscare (oprire pentru 20-60 de minute), așa că întârzierea de oprire trebuie să depășească aceasta pentru a menține întreaga spălare+uscare ca un singur ciclu.", "label": "Întârziere la Oprire" @@ -1406,6 +1454,26 @@ "energy_scale": { "label": "Precizie Energie", "doc": "Rigoarea penalizării acordului de energie a Etapei 4. Mai mic = mai strict: o nepotrivire de energie afectează mai mult. Implicit 0.25 este intenționat mai permisiv decât Rigoarea Duratei deoarece energia variază în funcție de sarcină. Utilizați împreună cu Ponderea Energiei." + }, + "power_profile_interval_min": { + "label": "Interval Profil Putere", + "doc": "Dimensiunea intervalului pentru atributul senzorului power_profile per profil (tabloul plat de wați medii per slot consumat de planificatoare externe precum EMHASS și tibber_prices). Intervalele mai mici păstrează vârfurile scurte de putere clare; intervalele mai mari netezesc forma. Implicit 15 min. Doar la citire; nu afectează detectarea." + }, + "notify_live_sticky": { + "label": "Păstrați notificarea în timp real la atingere", + "doc": "Numai Android. Faceți notificarea de progres în timp real persistentă (fixată) astfel încât atingerea ei să nu o respingă. Dezactivat păstrează comportamentul implicit în care o atingere o respinge." + }, + "notify_live_click_action": { + "label": "Destinație la atingerea notificării în timp real", + "doc": "Numai Android. Unde deschide o atingere pe notificarea de progres în timp real (de ex. /lovelace/laundry, sau un URL complet) în loc de pagina principală a aplicației. Lăsați necompletat pentru valoarea implicită." + }, + "door_opens_at_end": { + "label": "Ușa se deschide automat la final", + "doc": "Pentru mașinile de spălat vase care deschid ușa la sfârșitul ciclului pentru uscare (AirDry și similare). Cu această opțiune activată, deschiderea ușii în timpul unui ciclu activ nu îl mai pune în pauză indefinit; în schimb, dacă ușa rămâne deschisă pentru durata de așteptare de mai jos, WashData consideră ciclul terminat. O deschidere scurtă (pentru a adăuga un obiect) este ignorată. Necesită o entitate senzor de ușă." + }, + "door_end_dwell_seconds": { + "label": "Durată de așteptare la deschiderea ușii", + "doc": "Cât timp trebuie să rămână ușa deschisă înainte ca WashData să termine ciclul, când opțiunea \"Ușa se deschide automat la final\" este activată. Destul de lungă pentru a ignora adăugarea rapidă a unui vas (implicit 60 s), destul de scurtă pentru a termina prompt odată ce mașina deschide ușa." } }, "setting_group": { @@ -1576,6 +1644,10 @@ "name_required": "Numele este obligatoriu", "no_split_found": "Nu au fost găsite pauze de inactivitate pentru divizare", "panel_settings_saved": "Setările panoului au fost salvate", + "pg_preset_loaded": "Presetarea \"{name}\" a fost încărcată", + "pg_preset_saved": "Presetarea \"{name}\" a fost salvată", + "pg_sugg_loaded": "{n} valoare/valori sugerate incarcate - rulați Zona de test pentru comparație", + "pg_sugg_ml_loaded": "{n} valoare/valori calibrate ML incarcate - rulați Zona de test pentru comparație", "phase_name_required": "Numele fazei este obligatoriu", "phase_updated": "Fază actualizată", "phases_saved": "Faze salvate", @@ -1723,6 +1795,7 @@ "min_active": "Pe baza puterii active minime ({min}W) observate în ultimul ciclu.", "min_duration_ratio": "Păstrat cât mai mic posibil, astfel încât un program să fie recunoscut devreme în ciclu; pragurile de încredere și de ambiguitate previn confirmările premature.", "min_off_gap": "Pe baza a {gaps} intervale între cicluri observate (p05={p05}s). Limita inferioară a dispozitivului: {floor}s.", + "min_off_gap_bridge": "Dimensionat pentru a acoperi cea mai lungă perioadă de liniște din interiorul unui ciclu: {span}s + 60s marjă, din {spans} intervale acoperite pe {cycles} cicluri curate (rămâne sub intervalul dvs. minim de {ceiling}s dintre două încărcături consecutive).", "min_power": "40% din cea mai mică putere activă p05 ({p05}W) pe {cycles} cicluri curate, menținând pragul de oprire sub consumul real.{excl}", "ml_auto_label": "Cea mai mică încredere pe care modelul de calitate a considerat-o încă drept curată (p10 din {cycles} cicluri curate = {p10}).", "ml_end_repeat": "{false}/{total} cicluri ({pct}%) au avut o pauză pe care detectorul de sfârșit a evaluat-o la >50%; necesită {val} confirmare(i) de sfârșit.", @@ -1739,7 +1812,7 @@ "thr_batch": "Păstrat chiar deasupra celei mai mici puteri active p05 pe {cycles} cicluri ({p05}W), astfel încât o pornire să fie surprinsă cât mai devreme posibil, iar pragul de oprire să rămână sub cea mai mică putere de funcționare a mașinii.", "tol_per_profile": "p75 al varianței duratei per profil pe {profiles} profiluri ({cycles} cicluri); profilurile stabile nu sunt penalizate.", "tol_pooled": "Pe baza varianței combinate a duratei a {cycles} cicluri recente etichetate (deviație p95={dev}).", - "watchdog": "Păstrat cât mai mic în siguranță (de 3x intervalul de actualizare p95 de {p95}s, min. 30s), astfel încât blocajele să fie surprinse rapid fără opriri false." + "watchdog": "Păstrat cât mai mic în siguranță (puțin peste intervalul de actualizare p95 de {p95}s, min. 30s), astfel încât blocajele să fie surprinse rapid fără opriri false." }, "exclusions": { "summary": "Excluse {total} cicluri detectate greșit: {parts}.", @@ -1770,6 +1843,7 @@ "other": "Altele" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Mașină de spălat vase: secunde de liniște după durata așteptată înainte de a elibera așteptarea evacuării de la sfârșitul ciclului", "anti_wrinkle_enabled": "Absoarbe impulsurile de rotire de după faza principală în loc să le trateze drept cicluri noi", "anti_wrinkle_exit_power": "Puterea trebuie să scadă sub această valoare între impulsuri pentru ca modul anti-șifonare să rămână activ", "anti_wrinkle_idle_timeout": "Timp de liniște permis între două impulsuri de rotire înainte ca modul anti-șifonare să se încheie", @@ -1944,5 +2018,53 @@ "hide_guidance": "Ascundeți ghidul", "show_guidance": "Afișați ghidul" } + }, + "card": { + "min": "min", + "entity_not_found": "Entitate negăsită", + "running_long": "Întârziere", + "remaining": "rămas", + "progress": "progres", + "show_time_remaining": "Afișează timpul rămas", + "show_percentage": "Afișează procentajul", + "layout": { + "tile": "Dală (compact)", + "detail": "Detaliat (complet)", + "glance": "Sumar (mai multe dispozitive)" + }, + "btn": { + "pause": "Pauză", + "resume": "Reluare", + "terminate": "Încheie ciclul", + "record_start": "Porniți înregistrarea", + "record_stop": "Opriți înregistrarea", + "program": "Program", + "open_panel": "Deschide WashData" + }, + "editor": { + "layout": "Aspect", + "entity": "Entitatea aparatului", + "entities": "Aparate", + "title": "Titlu", + "icon": "Pictogramă", + "show_state": "Afișează starea", + "show_program": "Afișează programul", + "show_progress_bar": "Afișează bara de progres", + "spin_icon": "Rotește pictograma în timpul funcționării", + "display_mode": "Linie de detaliu", + "active_color": "Culoare activă personalizată", + "show_phase": "Afișează faza", + "show_energy": "Afișează energia și costul", + "show_anomaly": "Afișează avertismentul de întârziere", + "show_sparkline": "Afișează graficul de putere în timp real", + "buttons": "Butoane de acțiune", + "program_entity": "Entitate de program (personalizată)", + "time_entity": "Entitate de timp (personalizată)", + "pct_entity": "Entitate de progres (personalizată)", + "power_entity": "Entitate de putere (personalizată)", + "tap_action": "Acțiune la atingere", + "hold_action": "Acțiune la apăsare lungă", + "double_tap_action": "Acțiune la atingere dublă" + } } } diff --git a/custom_components/ha_washdata/translations/panel/ru.json b/custom_components/ha_washdata/translations/panel/ru.json index c14450a3..f419bc7f 100644 --- a/custom_components/ha_washdata/translations/panel/ru.json +++ b/custom_components/ha_washdata/translations/panel/ru.json @@ -1,4 +1,52 @@ { + "card": { + "min": "мин", + "entity_not_found": "Объект не найден", + "running_long": "Работает долго", + "remaining": "осталось", + "progress": "прогресс", + "show_time_remaining": "Показывать оставшееся время", + "show_percentage": "Показывать проценты", + "layout": { + "tile": "Плитка (компактно)", + "detail": "Подробно (расширенный)", + "glance": "Обзор (несколько устройств)" + }, + "btn": { + "pause": "Пауза", + "resume": "Продолжить", + "terminate": "Завершить цикл", + "record_start": "Начать запись", + "record_stop": "Остановить запись", + "program": "Программа", + "open_panel": "Открыть WashData" + }, + "editor": { + "layout": "Макет", + "entity": "Объект прибора", + "entities": "Приборы", + "title": "Заголовок", + "icon": "Значок", + "show_state": "Показывать состояние", + "show_program": "Показывать программу", + "show_progress_bar": "Показывать индикатор прогресса", + "spin_icon": "Вращать значок во время работы", + "display_mode": "Строка деталей", + "active_color": "Переопределение активного цвета", + "show_phase": "Показывать фазу", + "show_energy": "Показывать энергию и стоимость", + "show_anomaly": "Показывать предупреждение о превышении", + "show_sparkline": "Показывать график мощности в реальном времени", + "buttons": "Кнопки действий", + "program_entity": "Объект программы (переопределение)", + "time_entity": "Объект времени (переопределение)", + "pct_entity": "Объект прогресса (переопределение)", + "power_entity": "Объект мощности (переопределение)", + "tap_action": "Действие по нажатию", + "hold_action": "Действие по удержанию", + "double_tap_action": "Действие по двойному нажатию" + } + }, "badge": { "artifact_tip": "Обнаружено {n} аномалий (например, дверь открылась в середине цикла) – откройте, чтобы увидеть их на графике", "auto": "(авто-определение)", @@ -64,6 +112,21 @@ "discard": "Отменить", "discard_tip": "Отменить запись без сохранения", "dismiss": "Закрыть", + "mute_suggestion": "Не предлагать эту настройку", + "pg_load_calibrated": "Загрузить откалиброванные (ML) ({n})", + "pg_load_calibrated_tip": "Загрузить откалиброванные ML настройки как переопределения в песочнице", + "pg_load_live": "Загрузить активные настройки", + "pg_load_live_tip": "Перечитать текущие настройки интеграции и отменить все изменения в песочнице", + "pg_load_suggested": "Загрузить рекомендуемые ({n})", + "pg_load_suggested_tip": "Загрузить текущие рекомендации автонастройщика как переопределения в песочнице", + "pg_preset_delete": "Удалить пресет", + "pg_preset_load": "Загрузить пресет", + "pg_preset_load_tip": "Заменить значения в песочнице этим пресетом (активные настройки не изменятся)", + "pg_preset_save": "Сохранить как пресет", + "pg_preset_save_tip": "Сохранить все значения ниже как именованный пресет для этого устройства", + "pg_publish_all": "Сохранить в настройки ({n})", + "pg_publish_one": "Сохранить «{label}» в настройки интеграции", + "reset_muted": "Сбросить заглушённые", "done": "Готово", "edit": "Редактировать", "export": "Экспортировать", @@ -275,6 +338,7 @@ "no_automations": "Пока нет автоматизаций, ссылающихся на это устройство.", "panel_settings": "Настройки панели", "param_sweep": "Перебор параметра", + "pg_settings_source": "Источник настроек", "phase_catalog": "Каталог фаз", "playground": "Песочница", "process_history": "История процессов", @@ -348,6 +412,7 @@ "default_access_level": "Уровень доступа по умолчанию для пользователей, не указанных ниже", "default_other": "По умолчанию (другие устройства)", "default_tab": "Вкладка по умолчанию при открытии панели", + "font_size": "Размер шрифта панели", "delta": "Δ", "description": "Описание", "dtw_blend_w": "Вес смешивания", @@ -415,6 +480,9 @@ "pg_match_score": "Оценка совпадения", "pg_pct_of": "{p}% из {total}", "pg_poor_match": "Плохое совпадение", + "pg_preset": "Пресет песочницы", + "pg_preset_name": "Имя нового пресета", + "pg_preset_none": "Выберите пресет…", "pg_strong_match": "Сильное совпадение", "pg_tile_ambiguous": "Неоднозначно", "pg_tile_ambiguous_tip": "Циклы с почти равным совпадением двух программ", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Применить лучшее значение: {label} = {value}?", "pg_canvas_empty": "Выберите цикл выше, затем нажмите «Загрузить», чтобы увидеть его график мощности.", "pg_chart_caption": "Доля обнаружения/совпадения по значениям {param}", + "pg_ctrl_intro": "Значения берутся из активных настроек интеграции для этого устройства. Изменения остаются в песочнице, пока вы не сохраните их в настройки.", + "pg_live_unavailable": "Активные настройки недоступны, показаны значения по умолчанию.", + "pg_load_live_confirm": "Отменить изменения в песочнице ({n}) и загрузить текущие настройки интеграции?", "pg_match_rate": "{pct}% совпадений на {total} циклах", + "pg_matches_live": "Совпадает с активными настройками", + "pg_n_changed": "Отличий от активных настроек: {n}", + "pg_sugg_none": "Все рекомендации уже соответствуют текущим настройкам", + "pg_preset_delete_confirm": "Удалить пресет «{name}»?", + "pg_preset_limit": "Достигнут предел числа пресетов ({n})", + "pg_preset_overwrite": "Перезаписать пресет «{name}»?", + "pg_publish_one_confirm": "Сохранить {label} = {value} в настройки этого устройства?", "pg_restart_note": "Перезапустите Home Assistant, чтобы включить инструменты симуляции.", "pg_sim_progress": "{done} / {total} циклов", "pg_starting": "Запуск…", @@ -789,6 +867,7 @@ "preferences_admin": "Настройки, панель и управление доступом", "preferences_adv": "Настройки", "prefs_personal": "Применяются только к вашей учётной записи Home Assistant.", + "font_size_hint": "Сделайте всё на этой панели крупнее или мельче. Применяется к вашей учётной записи на этом устройстве.", "process_history_hint": "Повторно запустите сопоставление для всех сохранённых циклов, обновите предложения по настройке, переобучите модели ML (если включено) и пересчитайте качество циклов. Запускайте после пакетного просмотра.", "profile_deleted": "Профиль удалён", "profile_poor_health_detail": "Циклы, назначенные этому профилю, имеют непоследовательную форму или низкую достоверность. Рассмотрите возможность восстановления конверта или пересмотра помеченных циклов.", @@ -821,6 +900,10 @@ "split_intro": "Нажмите на график, чтобы добавить или удалить точку разбивки, или авто-определите по паузам. Каждый результирующий сегмент может получить свой профиль.", "storage_diagnostics": "Статистика хранилища, обслуживание, экспорт/импорт", "sug_staged": "Установлено {key} = {val}. Сохраните для применения.", + "sug_muted": "Эта настройка больше не будет предлагаться", + "sug_mute_failed": "Не удалось заглушить предложение", + "sug_unmuted_all": "Заглушённые предложения сброшены", + "n_suggestions_muted": "{count} заглушено; авто-настройщик не будет предлагать их.", "toast_auto_detect_enabled": "Автоопределение включено", "toast_auto_label_complete": "Автоматическая маркировка завершена", "toast_auto_label_failed": "Автоматическая маркировка не выполнена: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Тенденция к сокращению продолжительности ({pct}%/цикл) – среднее значение за последнее время {avg}", "trend_energy_down": "Тенденция к снижению энергопотребления ({pct}%/цикл)", "trend_energy_up": "Тенденция роста энергопотребления ({pct}%/цикл) – последнее среднее значение {avg}", + "trim_destructive_confirm": "Останется только {pct}% цикла, и это действие нельзя отменить. Продолжить?", "trim_intro": "Перетащите красные маркеры или введите значения. Всё за пределами окна удаляется.", "tuning_suggestions_available": "{count} предложение по настройке, доступное из наблюдаемых циклов. Они появляются рядом с соответствующими полями.", "unsure_detected_prefix": "WashData не уверен, что обнаружил", @@ -970,6 +1054,10 @@ "unusable": "Непригодный" }, "section": { + "dishwasher": { + "intro": "Обработка завершения цикла для посудомоечных машин, которые обычно заканчиваются длительной фазой сушки почти без потребления энергии перед коротким финальным сливом.", + "label": "Посудомоечная машина" + }, "anti_wrinkle": { "intro": "Режим защиты от морщин определяет короткие импульсы вращения барабана на малой мощности после основной фазы и сохраняет их привязанными к завершённому циклу.", "label": "Защита от морщин" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "doc": "После того как цикл превышает ожидаемую продолжительность, сколько времени посудомоечная машина должна оставаться неактивной (ниже «Порог Остановки»), прежде чем WashData прекратит ждать финальный слив и завершит цикл. Увеличьте значение, если у вашей машины длительная тихая фаза сушки перед поздним финальным сливом, который пропускается - более широкое окно позволяет изученной продолжительности следовать за сезонными изменениями (более холодная входящая вода = более длинные циклы), а не фиксироваться на старом среднем значении. Оно только сокращает ожидание относительно внутреннего 30-минутного лимита ожидания завершающего всплеска (откачки воды), но никогда не увеличивает его.", + "label": "Тихое завершение пассивной сушки" + }, "anti_wrinkle_enabled": { "doc": "Распознавайте короткие импульсы низкой мощности, которые сушильная машина излучает после основной фазы нагрева, и сохраняйте их привязанными к завершенному циклу, а не воспринимайте их как новые циклы.", "label": "Включить Защиту от Морщин" @@ -1232,6 +1324,10 @@ "doc": "Через несколько минут после окончания цикла перед отправкой все еще ожидающего напоминания «разгрузить машину». Установите 0, чтобы отключить напоминание.", "label": "Задержка Напоминания о Выгрузке" }, + "notify_unload_repeat": { + "doc": "Продолжает отправлять напоминание о выгрузке каждые \"Задержка Напоминания о Выгрузке\" минут, пока вы не откроете дверцу или не нажмёте \"Не напоминать\" в уведомлении. Требуется Объект Датчика Дверцы (как и для самого напоминания). Кнопка отклонения работает в уведомлениях мобильного приложения Home Assistant (companion).", + "label": "Повторять, пока не откроется дверца" + }, "off_delay": { "doc": "Время ожидания после отключения питания, прежде чем объявить цикл завершенным. Если подача электроэнергии возобновится в пределах этого окна, цикл продолжится плавно – это устраняет паузы между этапами стирки. Посудомоечные машины имеют длительные фазы сушки (отключение питания на 20–60 минут), поэтому задержка выключения должна превышать это значение, чтобы вся стирка+сушка выполнялась как один цикл.", "label": "Задержка Выключения" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Резкость энергии", "doc": "Резкость штрафа за несоответствие энергии на Этапе 4. Меньше = строже: несоответствие энергии сильнее снижает балл. Значение по умолчанию 0,25 намеренно мягче, чем Резкость длительности, поскольку энергия варьируется с нагрузкой. Используйте вместе с Весом энергии." + }, + "power_profile_interval_min": { + "label": "Интервал профиля мощности", + "doc": "Размер ячейки для атрибута датчика power_profile на профиль (плоский массив средних ватт по слотам), используемого внешними планировщиками, такими как EMHASS и tibber_prices. Меньшие ячейки сохраняют чёткость коротких пиков мощности; большие ячейки сглаживают форму. По умолчанию 15 мин. Только при считывании; не влияет на обнаружение." + }, + "notify_live_sticky": { + "label": "Сохранять живое уведомление при нажатии", + "doc": "Только для Android. Сделать уведомление о ходе выполнения постоянным (закреплённым), чтобы нажатие не скрывало его. Выключено сохраняет поведение по умолчанию, при котором нажатие скрывает уведомление." + }, + "notify_live_click_action": { + "label": "Цель нажатия живого уведомления", + "doc": "Только для Android. Куда открывается нажатие на уведомление о ходе выполнения (например, /lovelace/laundry или полный URL) вместо стартовой страницы приложения. Оставьте пустым для поведения по умолчанию." + }, + "door_opens_at_end": { + "label": "Дверца открывается автоматически в конце", + "doc": "Для посудомоечных машин, которые открывают дверцу в конце цикла для сушки (AirDry и аналогичные). При включении открытие дверцы во время работающего цикла больше не ставит его на паузу навсегда; вместо этого, если дверца остаётся открытой в течение времени выдержки ниже, WashData считает цикл завершённым. Кратковременное открытие (для загрузки посуды) игнорируется. Требуется объект датчика двери." + }, + "door_end_dwell_seconds": { + "label": "Выдержка при открытой дверце", + "doc": "Как долго дверца должна оставаться открытой до завершения цикла, когда включено \"Дверца открывается автоматически в конце\". Достаточно долго, чтобы игнорировать быструю загрузку посуды (по умолчанию 60 с), достаточно коротко для быстрого завершения после открытия дверцы машиной." } }, "setting_group": { @@ -1576,6 +1692,10 @@ "name_required": "Требуется имя", "no_split_found": "Пауз для разбивки не найдено", "panel_settings_saved": "Настройки панели сохранены", + "pg_preset_loaded": "Пресет «{name}» загружен", + "pg_preset_saved": "Пресет «{name}» сохранён", + "pg_sugg_loaded": "Загружено {n} рекомендуемых значений - запустите песочницу для сравнения", + "pg_sugg_ml_loaded": "Загружено {n} откалиброванных ML значений - запустите песочницу для сравнения", "phase_name_required": "Требуется имя фазы", "phase_updated": "Фаза обновлена", "phases_saved": "Фазы сохранены", @@ -1723,6 +1843,7 @@ "min_active": "На основе минимальной активной мощности ({min}W), зафиксированной в последнем цикле.", "min_duration_ratio": "Оставлено как можно ниже, чтобы программа распознавалась в начале цикла; пороги уверенности и неоднозначности предотвращают преждевременные подтверждения.", "min_off_gap": "На основе {gaps} наблюдаемых промежутков между циклами (p05={p05}s). Минимум устройства: {floor}s.", + "min_off_gap_bridge": "Рассчитано так, чтобы перекрыть самый длинный тихий участок внутри цикла: {span}s + запас 60s, по {spans} перекрытым промежуткам за {cycles} корректных циклов (остаётся ниже вашего наименьшего промежутка между двумя запусками подряд, который составляет {ceiling}s).", "min_power": "40% от наименьшей активной мощности p05 ({p05}W) по {cycles} корректным циклам, чтобы порог отключения оставался ниже реального потребления.{excl}", "ml_auto_label": "Наименьшая уверенность, при которой модель качества всё ещё считала цикл корректным (p10 по {cycles} корректным циклам = {p10}).", "ml_end_repeat": "{false}/{total} циклов ({pct}%) имели паузу, которую детектор завершения оценил выше 50%; требуется {val} подтверждение(й) завершения.", @@ -1739,7 +1860,7 @@ "thr_batch": "Оставлено чуть выше наименьшей активной мощности p05 по {cycles} циклам ({p05}W), чтобы запуск фиксировался как можно раньше, а порог остановки оставался ниже минимальной рабочей мощности машины.", "tol_per_profile": "p75 разброса длительности по профилям среди {profiles} профилей ({cycles} циклов); стабильные профили не штрафуются.", "tol_pooled": "На основе объединённого разброса длительности {cycles} недавних размеченных циклов (отклонение p95={dev}).", - "watchdog": "Оставлено настолько низким, насколько это безопасно (3x интервал обновления p95, равный {p95}s, мин. 30s), чтобы зависания выявлялись быстро без ложных остановок." + "watchdog": "Оставлено настолько низким, насколько это безопасно (чуть выше интервала обновления p95, равного {p95}s, мин. 30s), чтобы зависания выявлялись быстро без ложных остановок." }, "exclusions": { "summary": "Исключено {total} ошибочно определённых циклов: {parts}.", @@ -1770,6 +1891,7 @@ "other": "Другое" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Посудомоечная машина: секунды неактивности после ожидаемой длительности перед снятием ожидания финального слива в конце цикла", "completion_min_seconds": "Кратчайший запуск, считающийся настоящим циклом", "end_repeat_count": "Сколько низких показаний подряд до завершения", "interrupted_min_seconds": "Короткие циклы помечаются как прерванные", diff --git a/custom_components/ha_washdata/translations/panel/sk.json b/custom_components/ha_washdata/translations/panel/sk.json index 05eb5fd0..7e51cb87 100644 --- a/custom_components/ha_washdata/translations/panel/sk.json +++ b/custom_components/ha_washdata/translations/panel/sk.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entita sa nenašla", + "running_long": "Beží dlho", + "remaining": "zostáva", + "progress": "postup", + "show_time_remaining": "Zobraziť zostávajúci čas", + "show_percentage": "Zobraziť percentá", + "layout": { + "tile": "Dlaždica (kompaktná)", + "detail": "Detail (podrobný)", + "glance": "Prehľad (viac zariadení)" + }, + "btn": { + "pause": "Pozastaviť", + "resume": "Pokračovať", + "terminate": "Ukončiť cyklus", + "record_start": "Spustiť záznam", + "record_stop": "Zastaviť záznam", + "program": "Program", + "open_panel": "Otvoriť WashData" + }, + "editor": { + "layout": "Rozloženie", + "entity": "Entita spotrebiča", + "entities": "Spotrebiče", + "title": "Názov", + "icon": "Ikona", + "show_state": "Zobraziť stav", + "show_program": "Zobraziť program", + "show_progress_bar": "Zobraziť ukazovateľ postupu", + "spin_icon": "Otáčať ikonu počas behu", + "display_mode": "Riadok s detailmi", + "active_color": "Prepísanie aktívnej farby", + "show_phase": "Zobraziť fázu", + "show_energy": "Zobraziť energiu a náklady", + "show_anomaly": "Zobraziť varovanie o prekročení", + "show_sparkline": "Zobraziť živý graf výkonu", + "buttons": "Akčné tlačidlá", + "program_entity": "Entita programu (prepísanie)", + "time_entity": "Entita času (prepísanie)", + "pct_entity": "Entita postupu (prepísanie)", + "power_entity": "Entita výkonu (prepísanie)", + "tap_action": "Akcia ťuknutia", + "hold_action": "Akcia podržania", + "double_tap_action": "Akcia dvojitého ťuknutia" + } + }, "badge": { "artifact_tip": "Zistilo sa {n} anomálií (napr. dvere otvorené uprostred cyklu) – otvorte ich, aby ste ich videli na grafe", "auto": "(automaticky zistené)", @@ -64,6 +112,21 @@ "discard": "Zahodiť", "discard_tip": "Zahodiť zaznamenaný priebeh bez uloženia", "dismiss": "Zamietnuť", + "mute_suggestion": "Prestať navrhovať toto nastavenie", + "pg_load_calibrated": "Načítať kalibrované (ML) ({n})", + "pg_load_calibrated_tip": "Načítať nastavenia kalibrované ML ako prepísania v testovacom prostredí", + "pg_load_live": "Načítať aktívne nastavenia", + "pg_load_live_tip": "Znovu načítať aktuálne nastavenia integrácie a zahodiť všetky úpravy v testovacom prostredí", + "pg_load_suggested": "Načítať navrhované ({n})", + "pg_load_suggested_tip": "Načítať aktuálne návrhy automatického ladenia ako prepísania v testovacom prostredí", + "pg_preset_delete": "Odstrániť prednastavenie", + "pg_preset_load": "Načítať prednastavenie", + "pg_preset_load_tip": "Nahradiť hodnoty v testovacom prostredí týmto prednastavením (aktívne nastavenia zostanú bez zmeny)", + "pg_preset_save": "Uložiť ako prednastavenie", + "pg_preset_save_tip": "Uložiť všetky hodnoty nižšie ako pomenované prednastavenie pre toto zariadenie", + "pg_publish_all": "Uložiť do integrácie ({n})", + "pg_publish_one": "Uložiť {label} do integrácie", + "reset_muted": "Obnoviť stíšené", "done": "Hotovo", "edit": "Upraviť", "export": "Exportovať", @@ -275,6 +338,7 @@ "no_automations": "Žiadne automatizácie zatiaľ neodkazujú na toto zariadenie.", "panel_settings": "Nastavenia panela", "param_sweep": "Prehľadávanie parametra", + "pg_settings_source": "Zdroj nastavení", "phase_catalog": "Katalóg fáz", "playground": "Testovacie prostredie", "process_history": "História procesov", @@ -348,6 +412,7 @@ "default_access_level": "Predvolená úroveň pre používateľov, ktorí nie sú uvedení nižšie", "default_other": "Predvolené (iné zariadenia)", "default_tab": "Predvolená karta pri otváraní panela", + "font_size": "Veľkosť písma panela", "delta": "Δ", "description": "Popis", "dtw_blend_w": "Váha zmiešania", @@ -415,6 +480,9 @@ "pg_match_score": "Skóre zhody", "pg_pct_of": "{p}% z {total}", "pg_poor_match": "Zlá zhoda", + "pg_preset": "Prednastavenie testovacieho prostredia", + "pg_preset_name": "Názov nového prednastavenia", + "pg_preset_none": "Vyberte prednastavenie…", "pg_strong_match": "Silná zhoda", "pg_tile_ambiguous": "Nejednoznačné", "pg_tile_ambiguous_tip": "Cykly s takmer rovnakým výsledkom medzi dvoma programami", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Použiť najlepšiu hodnotu: {label} = {value}?", "pg_canvas_empty": "Vyberte cyklus vyššie a potom stlačte Načítať na zobrazenie jeho priebehu výkonu.", "pg_chart_caption": "Miera detekcie/zhody v závislosti od hodnôt {param}", + "pg_ctrl_intro": "Hodnoty vychádzajú z aktívnych nastavení integrácie pre toto zariadenie. Úpravy zostávajú v testovacom prostredí, kým ich neuložíte do integrácie.", + "pg_live_unavailable": "Aktívne nastavenia nie sú k dispozícii, zobrazujú sa predvolené hodnoty.", + "pg_load_live_confirm": "Zahodiť úpravy v testovacom prostredí ({n}) a znovu načítať aktuálne nastavenia integrácie?", "pg_match_rate": "{pct}% miera zhody na {total} cykloch", + "pg_matches_live": "Zhoduje sa s aktívnymi nastaveniami", + "pg_n_changed": "Zmenené oproti aktívnym nastaveniam: {n}", + "pg_sugg_none": "Všetky návrhy sa už zhodujú s aktuálnymi nastaveniami", + "pg_preset_delete_confirm": "Odstrániť prednastavenie \"{name}\"?", + "pg_preset_limit": "Dosiahnutý limit prednastavení ({n})", + "pg_preset_overwrite": "Prepísať prednastavenie \"{name}\"?", + "pg_publish_one_confirm": "Uložiť {label} = {value} do nastavení tohto zariadenia?", "pg_restart_note": "Reštartujte Home Assistant, aby ste povolili nástroje simulácie.", "pg_sim_progress": "{done} / {total} cyklov", "pg_starting": "Spúšťanie…", @@ -789,6 +867,7 @@ "preferences_admin": "Predvoľby, panel a kontrola prístupu", "preferences_adv": "Predvoľby", "prefs_personal": "Platí iba pre váš účet Home Assistant.", + "font_size_hint": "Zväčšite alebo zmenšite všetko v tomto paneli. Platí pre váš účet na tomto zariadení.", "process_history_hint": "Znova spustite párovanie pre všetky uložené cykly, obnovte návrhy ladenia, preškolte modely ML (ak sú povolené) a prepočítajte zdravie cyklov. Spustite po sérii recenzií.", "profile_deleted": "Profil odstránený", "profile_poor_health_detail": "Cykly priradené k tomuto profilu majú nekonzistentný tvar alebo nízku spoľahlivosť. Zvážte prestavbu obálky alebo kontrolu cyklov s označením.", @@ -821,6 +900,10 @@ "split_intro": "Kliknite na graf a pridajte alebo odstráňte bod rozdelenia, alebo automaticky zistite nečinné medzery. Každý výsledný segment môže mať vlastný profil.", "storage_diagnostics": "Štatistiky úložiska, údržba, export/import", "sug_staged": "Nastavené {key} = {val}. Uložte pre použitie.", + "sug_muted": "Toto nastavenie sa už nebude navrhovať", + "sug_mute_failed": "Nastavenie sa nepodarilo stíšiť", + "sug_unmuted_all": "Stíšené návrhy obnovené", + "n_suggestions_muted": "{count} stíšených; automatický ladiaci nástroj tieto nastavenia nebude navrhovať.", "toast_auto_detect_enabled": "Automatická detekcia zapnutá", "toast_auto_label_complete": "Automatické označovanie dokončené", "toast_auto_label_failed": "Automatické označovanie zlyhalo: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Trvanie je kratšie ({pct} %/cyklus) – posledný priemer {avg}", "trend_energy_down": "Energetický trend klesá ({pct} %/cyklus)", "trend_energy_up": "Energetický trend stúpa ({pct} %/cyklus) – posledný priemer {avg}", + "trim_destructive_confirm": "Týmto zostane len {pct}% cyklu a túto akciu nie je možné vrátiť späť. Pokračovať?", "trim_intro": "Potiahnite červené rukoväti alebo zadajte hodnoty. Všetko mimo okna sa odstráni.", "tuning_suggestions_available": "{count} návrh ladenia dostupný z pozorovaných cyklov. Zobrazujú sa vedľa príslušných polí.", "unsure_detected_prefix": "WashData si nie je istý, či zistil", @@ -970,6 +1054,10 @@ "unusable": "Nepoužiteľný" }, "section": { + "dishwasher": { + "label": "Umývačka riadu", + "intro": "Spracovanie konca cyklu pre umývačky riadu, ktoré zvyčajne končia dlhou takmer tichou fázou sušenia pred krátkym záverečným odčerpaním vody." + }, "anti_wrinkle": { "intro": "Režim ochrany pred krčením tkaniny deteguje pulzy tumblingu pri nízkej spotrebe po hlavnej fáze a udržuje ich priradené k dokončenému cyklu.", "label": "Ochrana pred krčením" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Uvoľnenie po tichej fáze sušenia", + "doc": "Keď cyklus prekročí svoje očakávané trvanie, ako dlho musí umývačka zostať v pokoji (pod Prahom zastavenia), než WashData prestane čakať na záverečné odčerpanie vody a ukončí cyklus. Zvýšte hodnotu, ak má váš spotrebič dlhú tichú fázu sušenia pred neskorým záverečným odčerpaním, ktoré uniká detekcii - širšie okno umožňuje, aby naučené trvanie sledovalo sezónny posun (studenšia privádzaná voda = dlhšie cykly) namiesto toho, aby zostalo uzamknuté na starom priemere. Čakanie iba skracuje vzhľadom na interný 30-minútový limit čakania na záverečné odčerpanie, nikdy ho nepredlžuje." + }, "anti_wrinkle_enabled": { "doc": "Rozpoznajte krátke pulzy bubna s nízkym výkonom, ktoré sušička vydáva po hlavnej fáze ohrevu, a nechajte ich pripojené k dokončenému cyklu namiesto toho, aby ste ich čítali ako nové cykly.", "label": "Povoliť detekciu ochrany pred krčením" @@ -1232,6 +1324,10 @@ "doc": "Minúty po skončení cyklu pred odoslaním stále čakajúcej pripomienky „vyložiť stroj“. Ak chcete pripomienku deaktivovať, nastavte 0.", "label": "Oneskorenie pripomienky vyloženia" }, + "notify_unload_repeat": { + "doc": "Znova odosiela pripomienku vyloženia každých \"Oneskorenie pripomienky vyloženia\" minút, kým neotvoríte dvere alebo v oznámení neťuknete na \"Prestať pripomínať\". Vyžaduje Entitu senzora dverí (rovnako ako samotná pripomienka). Tlačidlo na zrušenie funguje pri oznámeniach mobilnej aplikácie Home Assistant (companion app).", + "label": "Opakovať, kým sa neotvoria dvere" + }, "off_delay": { "doc": "Čas čakania po poklese napájania pred vyhlásením cyklu za ukončený. Ak sa v rámci tohto okna obnoví napájanie, cyklus plynule pokračuje – premosťuje to prestávky medzi fázami umývania. Umývačky riadu majú dlhé fázy sušenia (vypnutie na 20-60 minút), takže oneskorenie vypnutia musí prekročiť túto hodnotu, aby celé umývanie + suché zostalo ako jeden cyklus.", "label": "Oneskorenie vypnutia" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Ostrost energie", "doc": "Ostrosť penalizácie za nezhodu energie vo Fáze 4. Menší = prísnejší: nezhoda energie viac znižuje skóre. Predvolená hodnota 0,25 je zámerne benevolentnejšia ako Ostrosť dĺžky trvania, pretože energia sa líši podľa záťaže. Kombinujte s Váhou energie." + }, + "power_profile_interval_min": { + "label": "Interval výkonového profilu", + "doc": "Veľkosť segmentu pre atribút senzora power_profile pre daný profil (plochá sada priemerných wattov za slot spotrebovaná externými plánovačmi ako EMHASS a tibber_prices). Menšie segmenty zachovávajú krátke výkonové špičky ostré; väčšie segmenty vyhladzujú tvar. Predvolene 15 min. Iba pri načítaní; neovplyvňuje detekciu." + }, + "notify_live_sticky": { + "label": "Zachovať živé oznámenie po klepnutí", + "doc": "Iba Android. Živé oznámenie priebehu nastavte ako trvalé (prilepené), aby jeho klepnutím nedošlo k zavretiu prebiehajúceho vlákna. Vypnuté zachováva predvolené správanie, kde klepnutie oznámenie zavrie." + }, + "notify_live_click_action": { + "label": "Cieľ klepnutia na živé oznámenie", + "doc": "Iba Android. Kam klepnutie na živé oznámenie priebehu otvorí (napr. /lovelace/laundry alebo celá URL) namiesto vstupnej stránky aplikácie. Ponechajte prázdne pre predvolené nastavenie." + }, + "door_opens_at_end": { + "label": "Dvere sa na konci automaticky otvoria", + "doc": "Pre umývačky riadu, ktoré na konci cyklu otvoria dvere za účelom sušenia (AirDry a podobné). Pri zapnutej funkcii otvorenie dverí počas bežiaceho cyklu už nezastaví cyklus natrvalo; ak dvere zostanú otvorené po dobu čakania nižšie, WashData cyklus ukončí. Krátke otvorenie (pridanie predmetu) sa ignoruje. Vyžaduje entitu senzora dverí." + }, + "door_end_dwell_seconds": { + "label": "Čakanie na otvorenie dverí pre ukončenie", + "doc": "Ako dlho musia dvere zostať otvorené, kým WashData ukončí cyklus, keď je zapnutá funkcia \"Dvere sa na konci automaticky otvoria\". Dostatočne dlho na ignorovanie rýchleho pridania riadu (predvolene 60 s), dostatočne krátko pre rýchle ukončenie po otvorení dverí spotrebičom." } }, "setting_group": { @@ -1592,6 +1708,7 @@ "min_active": "Na základe minimálneho činného výkonu ({min}W) zaznamenaného v poslednom cykle.", "min_duration_ratio": "Ponechané čo najnižšie, aby sa program rozpoznal skoro v cykle; prahy istoty a nejednoznačnosti bránia predčasnému potvrdeniu.", "min_off_gap": "Na základe {gaps} pozorovaných medzier medzi cyklami (p05={p05}s). Minimum zariadenia: {floor}s.", + "min_off_gap_bridge": "Nastavené tak, aby preklenulo najdlhší tichý úsek vnútri cyklu: {span}s + rezerva 60s, z {spans} preklenutých medzier naprieč {cycles} čistými cyklami (zostáva pod {ceiling}s, najkratšou medzerou, ktorú necháte medzi dvoma dávkami).", "min_power": "40% najnižšieho činného výkonu p05 ({p05}W) naprieč {cycles} čistými cyklami, aby prah vypnutia zostal pod skutočným odberom.{excl}", "ml_auto_label": "Najnižšia istota, pri ktorej model kvality stále hodnotil cyklus ako čistý (p10 z {cycles} čistých cyklov = {p10}).", "ml_end_repeat": "{false}/{total} cyklov ({pct}%) malo pauzu, ktorú detektor konca ohodnotil nad 50%; vyžadovať {val} potvrdení konca.", @@ -1608,7 +1725,7 @@ "thr_batch": "Ponechané tesne nad najnižším činným výkonom p05 naprieč {cycles} cyklami ({p05}W), aby sa štart zachytil čo najskôr a prah zastavenia zostal pod najnižším prevádzkovým výkonom stroja.", "tol_per_profile": "p75 rozptylu dĺžky podľa profilu naprieč {profiles} profilmi ({cycles} cyklov); konzistentné profily nie sú penalizované.", "tol_pooled": "Na základe zlúčeného rozptylu dĺžky {cycles} nedávnych označených cyklov (odchýlka p95={dev}).", - "watchdog": "Ponechané čo najnižšie pri zachovaní bezpečnosti (3x interval aktualizácie p95 vo výške {p95}s, min. 30s), aby sa zaseknutia rýchlo odhalili bez falošných zastavení." + "watchdog": "Ponechané čo najnižšie pri zachovaní bezpečnosti (tesne nad intervalom aktualizácie p95 vo výške {p95}s, min. 30s), aby sa zaseknutia rýchlo odhalili bez falošných zastavení." }, "exclusions": { "summary": "Vylúčených {total} chybne zistených cyklov: {parts}.", @@ -1688,6 +1805,10 @@ "name_required": "Názov je povinný", "no_split_found": "Nenašli sa žiadne nečinné medzery na rozdelenie", "panel_settings_saved": "Nastavenia panela uložené", + "pg_preset_loaded": "Prednastavenie \"{name}\" načítané", + "pg_preset_saved": "Prednastavenie \"{name}\" uložené", + "pg_sugg_loaded": "Načítaných {n} navrhovaných hodnôt - spustite testovacie prostredie na porovnanie", + "pg_sugg_ml_loaded": "Načítaných {n} hodnôt kalibrovaných ML - spustite testovacie prostredie na porovnanie", "phase_name_required": "Názov fázy je povinný", "phase_updated": "Fáza aktualizovaná", "phases_saved": "Fázy uložené", @@ -1770,6 +1891,7 @@ "other": "Iné" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Umývačka: tiché sekundy po očakávanom trvaní, než sa uvoľní čakanie na záverečné odčerpanie vody", "anti_wrinkle_enabled": "Pohltiť impulzy bubna po hlavnej fáze namiesto ich čítania ako nové cykly", "anti_wrinkle_exit_power": "Výkon musí medzi impulzmi klesnúť pod túto hodnotu, aby ochrana pred krčením zostala aktívna", "anti_wrinkle_idle_timeout": "Povolený pokoj medzi dvoma impulzmi bubna, než sa ochrana pred krčením skončí", diff --git a/custom_components/ha_washdata/translations/panel/sl.json b/custom_components/ha_washdata/translations/panel/sl.json index e837d463..39b64d7c 100644 --- a/custom_components/ha_washdata/translations/panel/sl.json +++ b/custom_components/ha_washdata/translations/panel/sl.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entiteta ni najdena", + "running_long": "Traja predolgo", + "remaining": "preostalo", + "progress": "napredek", + "show_time_remaining": "Pokaži preostali čas", + "show_percentage": "Pokaži odstotek", + "layout": { + "tile": "Ploščica (kompaktno)", + "detail": "Podrobno (bogato)", + "glance": "Pregled (več naprav)" + }, + "btn": { + "pause": "Premor", + "resume": "Nadaljuj", + "terminate": "Končaj cikel", + "record_start": "Začni snemanje", + "record_stop": "Ustavi snemanje", + "program": "Program", + "open_panel": "Odpri WashData" + }, + "editor": { + "layout": "Postavitev", + "entity": "Entiteta naprave", + "entities": "Naprave", + "title": "Naslov", + "icon": "Ikona", + "show_state": "Pokaži stanje", + "show_program": "Pokaži program", + "show_progress_bar": "Pokaži vrstico napredka", + "spin_icon": "Vrti ikono med delovanjem", + "display_mode": "Vrstica s podrobnostmi", + "active_color": "Preglasitev aktivne barve", + "show_phase": "Pokaži fazo", + "show_energy": "Pokaži energijo in strošek", + "show_anomaly": "Pokaži opozorilo o prekoračitvi", + "show_sparkline": "Pokaži graf moči v živo", + "buttons": "Gumbi za dejanja", + "program_entity": "Entiteta programa (preglasitev)", + "time_entity": "Entiteta časa (preglasitev)", + "pct_entity": "Entiteta napredka (preglasitev)", + "power_entity": "Entiteta moči (preglasitev)", + "tap_action": "Dejanje ob dotiku", + "hold_action": "Dejanje ob zadržanju", + "double_tap_action": "Dejanje ob dvojnem dotiku" + } + }, "badge": { "artifact_tip": "{n} zaznanih nepravilnosti (npr. odprta vrata sredi cikla) – odprite, da jih vidite na grafu", "auto": "(samodejno zaznano)", @@ -64,6 +112,21 @@ "discard": "Zavrzi", "discard_tip": "Zavrzi posneto sled brez shranjevanja", "dismiss": "Zapri", + "mute_suggestion": "Prenehaj predlagati to nastavitev", + "pg_load_calibrated": "Naloži umerjene (ML) ({n})", + "pg_load_calibrated_tip": "Naloži ML-umerjene nastavitve kot nadpisane vrednosti v peskovniku", + "pg_load_live": "Naloži aktivne nastavitve", + "pg_load_live_tip": "Znova preberi trenutne nastavitve integracije in zavrzi vsa urejanja v peskovniku", + "pg_load_suggested": "Naloži predlagane ({n})", + "pg_load_suggested_tip": "Naloži predloge samodejnega uglaševanja kot nadpisane vrednosti v peskovniku", + "pg_preset_delete": "Izbriši prednastavitev", + "pg_preset_load": "Naloži prednastavitev", + "pg_preset_load_tip": "Zamenjaj vrednosti v peskovniku s to prednastavitvijo (aktivne nastavitve ostanejo nespremenjene)", + "pg_preset_save": "Shrani kot prednastavitev", + "pg_preset_save_tip": "Shrani vse spodnje vrednosti kot poimenovano prednastavitev za to napravo", + "pg_publish_all": "Shrani v integracijo ({n})", + "pg_publish_one": "Shrani {label} v integracijo", + "reset_muted": "Ponastavi utišane", "done": "Končano", "edit": "Uredi", "export": "Izvozi", @@ -275,6 +338,7 @@ "no_automations": "Nobena avtomatizacija še ne sklicuje na to napravo.", "panel_settings": "Nastavitve plošče", "param_sweep": "Preizkušanje parametra", + "pg_settings_source": "Vir nastavitev", "phase_catalog": "Katalog faz", "playground": "Peskovnik", "process_history": "Zgodovina procesov", @@ -348,6 +412,7 @@ "default_access_level": "Privzeta raven za uporabnike, ki niso navedeni spodaj", "default_other": "Privzeto (druge naprave)", "default_tab": "Privzeti zavihek pri odpiranju plošče", + "font_size": "Velikost pisave plošče", "delta": "Δ", "description": "Opis", "dtw_blend_w": "Utež mešanja", @@ -415,6 +480,9 @@ "pg_match_score": "Rezultat ujemanja", "pg_pct_of": "{p}% od {total}", "pg_poor_match": "Slabo ujemanje", + "pg_preset": "Prednastavitev peskovnika", + "pg_preset_name": "Ime nove prednastavitve", + "pg_preset_none": "Izberite prednastavitev…", "pg_strong_match": "Močno ujemanje", "pg_tile_ambiguous": "Dvoumno", "pg_tile_ambiguous_tip": "Cikli s skoraj izenačenim rezultatom med dvema programoma", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Uporabim najboljšo vrednost: {label} = {value}?", "pg_canvas_empty": "Zgoraj izberite cikel in nato pritisnite Naloži, da vidite njegov potek moči.", "pg_chart_caption": "Stopnja zaznavanja/ujemanja glede na vrednosti {param}", + "pg_ctrl_intro": "Vrednosti izhajajo iz aktivnih nastavitev integracije za to napravo. Urejanja ostanejo v peskovniku, dokler jih ne shranite v integracijo.", + "pg_live_unavailable": "Aktivne nastavitve niso na voljo, prikazane so privzete vrednosti.", + "pg_load_live_confirm": "Zavržem spremembe v peskovniku ({n}) in znova naložim trenutne nastavitve integracije?", "pg_match_rate": "{pct}% stopnja ujemanja na {total} ciklih", + "pg_matches_live": "Ujema se z aktivnimi nastavitvami", + "pg_n_changed": "Spremenjeno glede na aktivne nastavitve: {n}", + "pg_sugg_none": "Vsi predlogi se že ujemajo s trenutnimi nastavitvami", + "pg_preset_delete_confirm": "Izbrišem prednastavitev \"{name}\"?", + "pg_preset_limit": "Dosežena omejitev prednastavitev ({n})", + "pg_preset_overwrite": "Prepišem prednastavitev \"{name}\"?", + "pg_publish_one_confirm": "Shranim {label} = {value} v nastavitve te naprave?", "pg_restart_note": "Znova zaženite Home Assistant, da omogočite orodja simulacije.", "pg_sim_progress": "{done} / {total} ciklov", "pg_starting": "Zaganjanje…", @@ -789,6 +867,7 @@ "preferences_admin": "Nastavitve, plošča in nadzor dostopa", "preferences_adv": "Nastavitve", "prefs_personal": "Veljajo samo za vaš račun Home Assistant.", + "font_size_hint": "Povečajte ali pomanjšajte vse v tej plošči. Velja za vaš račun na tej napravi.", "process_history_hint": "Znova zaženite ujemanje za vse shranjene cikle, osvežite predloge nastavljanja, znova naučite modele ML (če so omogočeni) in znova izračunajte zdravje ciklov. Zaženite po seriji pregledov.", "profile_deleted": "Profil izbrisan", "profile_poor_health_detail": "Cikli, dodeljeni temu profilu, imajo nedosledne oblike ali nizko stopnjo zaupanja. Razmislite o ponovni izdelavi ovojnice ali pregledu označenih ciklov.", @@ -821,6 +900,10 @@ "split_intro": "Kliknite na graf, da dodate ali odstranite točko razdelitve, ali samodejno zaznajte po nedejavnih vrzelih. Vsak rezultirajoči segment lahko dobi lasten profil.", "storage_diagnostics": "Statistike shrambe, vzdrževanje, izvoz/uvoz", "sug_staged": "Nastavljeno {key} = {val}. Shranite za uveljavitev.", + "sug_muted": "Te nastavitve ne bo več predlagalo", + "sug_mute_failed": "Utišanje predloga ni uspelo", + "sug_unmuted_all": "Utišani predlogi ponastavljeni", + "n_suggestions_muted": "{count} utišanih; samodejni nastavjalnik teh nastavitev ne bo predlagal.", "toast_auto_detect_enabled": "Samodejno zaznavanje omogočeno", "toast_auto_label_complete": "Samodejno označevanje dokončano", "toast_auto_label_failed": "Samodejno označevanje ni uspelo: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Trajanje se skrajšuje ({pct}%/cikel) – zadnje povprečje {avg}", "trend_energy_down": "Energija pada ({pct}%/cikel)", "trend_energy_up": "Energija narašča ({pct}%/cikel) – zadnje povprečje {avg}", + "trim_destructive_confirm": "S tem ostane samo {pct}% cikla in tega dejanja ni mogoče razveljaviti. Nadaljujem?", "trim_intro": "Povlecite rdeče ročke ali vnesite vrednosti. Vse zunaj okna se odstrani.", "tuning_suggestions_available": "{count} predlog za nastavitev je na voljo iz opazovanih ciklov. Pojavijo se poleg ustreznih polj.", "unsure_detected_prefix": "WashData ni prepričan, da je zaznal", @@ -970,6 +1054,10 @@ "unusable": "Neuporabno" }, "section": { + "dishwasher": { + "label": "Pomivalni stroj", + "intro": "Obravnava konca cikla za pomivalne stroje, ki se običajno končajo z dolgo, skoraj tiho fazo sušenja pred kratkim končnim izčrpavanjem vode." + }, "anti_wrinkle": { "intro": "Način zaščite pred gubami na oblačilih zazna kratke pulze pri nizki moči po glavni fazi in jih obdrži pripisane končanemu ciklu.", "label": "Zaščita pred gubami" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Sprostitev po tihi fazi sušenja", + "doc": "Ko cikel preseže svoje pričakovano trajanje, kako dolgo mora pomivalni stroj ostati tih (pod Pragom zaustavitve), preden WashData preneha čakati na končno izčrpavanje vode in zaključi cikel. Povečajte, če ima vaša naprava dolgo tiho fazo sušenja pred poznim končnim izčrpavanjem, ki ga zaznavanje spregleda - širše okno omogoča, da naučeno trajanje sledi sezonskemu premiku (hladnejša dovodna voda = daljši cikli), namesto da ostane zaklenjeno na starem povprečju. Čakanje lahko le skrajša glede na notranjo 30-minutno omejitev čakanja na končno izčrpavanje, nikoli ga ne podaljša." + }, "anti_wrinkle_enabled": { "doc": "Prepoznajte kratke vrtilne impulze nizke moči, ki jih oddaja sušilni stroj po glavni fazi segrevanja, in jih ohranite povezane s končanim ciklom, namesto da jih berete kot nove cikle.", "label": "Omogoči zaznavanje zaščite pred gubami" @@ -1232,6 +1324,10 @@ "doc": "Minute po koncu cikla pred pošiljanjem še vedno čakajočega opomnika \"raztovarjanje stroja\". Nastavite 0, da onemogočite opomnik.", "label": "Zamuda opomnika za raztovarjanje" }, + "notify_unload_repeat": { + "doc": "Znova pošilja opomnik za raztovarjanje vsakih \"Zamuda opomnika za raztovarjanje\" minut, dokler ne odprete vrat ali v obvestilu ne tapnete \"Nehaj opominjati\". Zahteva Entiteto senzorja vrat (tako kot sam opomnik). Gumb za opustitev deluje pri obvestilih mobilne aplikacije Home Assistant (companion app).", + "label": "Ponavljaj, dokler se vrata ne odprejo" + }, "off_delay": { "doc": "Čas za čakanje po padcu moči, preden razglasite, da je cikel končan. Če se napajanje ponovno vzpostavi v tem oknu, se cikel nemoteno nadaljuje - to premosti premore med stopnjami pranja. Pomivalni stroji imajo dolge faze sušenja (izklop za 20–60 min), zato mora biti zakasnitev izklopa daljša od te, da ostane celotno pranje+sušenje kot en cikel.", "label": "Zamuda izklopa" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Ostrina energije", "doc": "Ostrina kazni za neujemanje energije na Stopnji 4. Manjše = strožje: neujemanje energije bolj znižuje oceno. Privzeta vrednost 0,25 je namerno bolj dovoljna od Ostrine trajanja, ker energija niha z obremenitvijo. Kombinirajte z Utežjo energije." + }, + "power_profile_interval_min": { + "label": "Interval profila porabe", + "doc": "Velikost segmenta za atribut senzorja power_profile za posamezni profil (ploska matrika povprečnih vatov na režo, ki jo porabijo zunanji planerji, kot sta EMHASS in tibber_prices). Manjši segmenti ohranijo kratke skoke moči ostre; večji segmenti zgladijo obliko. Privzeto 15 min. Samo za branje; ne vpliva na zaznavanje." + }, + "notify_live_sticky": { + "label": "Ohrani živo obvestilo ob dotiku", + "doc": "Samo Android. Živo obvestilo o napredku nastavite kot trajno (pritrjeno), da ga dotik ne zavrže. Izklopljeno ohranja privzeto vedenje, ko dotik zavrže obvestilo." + }, + "notify_live_click_action": { + "label": "Cilj dotika na živo obvestilo", + "doc": "Samo Android. Kam dotik na živo obvestilo o napredku odpre (npr. /lovelace/laundry ali celoten URL) namesto vstopne strani aplikacije. Pustite prazno za privzeto." + }, + "door_opens_at_end": { + "label": "Vrata se ob koncu samodejno odprejo", + "doc": "Za pomivalne stroje, ki ob koncu cikla odprejo vrata za sušenje (AirDry in podobni). Ko je vklopljeno, odprtje vrat med delujočim ciklom ne zaustavi cikla za vedno; namesto tega, ko vrata ostanejo odprta za čas čakanja spodaj, WashData zaključi cikel. Kratko odprtje (dodajanje predmeta) se prezre. Zahteva entiteto senzorja vrat." + }, + "door_end_dwell_seconds": { + "label": "Čas odprtosti vrat za zaključek", + "doc": "Kako dolgo morajo vrata ostati odprta, preden WashData zaključi cikel, ko je vklopljeno \"Vrata se ob koncu samodejno odprejo\". Dovolj dolgo, da se prezre hitro dodajanje posode (privzeto 60 s), dovolj kratko za hiter zaključek, ko stroj odpre vrata." } }, "setting_group": { @@ -1592,6 +1708,7 @@ "min_active": "Na podlagi najmanjše delovne moči ({min}W), opažene v zadnjem ciklu.", "min_duration_ratio": "Ohranjeno čim nižje, da se program prepozna zgodaj v ciklu; pragova zaupanja in dvoumnosti preprečujeta prezgodnje potrditve.", "min_off_gap": "Na podlagi {gaps} opaženih vrzeli med cikli (p05={p05}s). Spodnja meja naprave: {floor}s.", + "min_off_gap_bridge": "Nastavljeno tako, da premosti najdaljši tihi odsek znotraj cikla: {span}s + 60s rezerve, iz {spans} premoščenih vrzeli čez {cycles} čistih ciklov (ostane pod vašo najkrajšo vrzeljo med zaporednima zagonoma, ki znaša {ceiling}s).", "min_power": "40 % najnižje delovne moči p05 ({p05}W) čez {cycles} čistih ciklov, da prag izklopa ostane pod dejansko porabo.{excl}", "ml_auto_label": "Najnižje zaupanje, ki ga je model kakovosti še ocenil kot čisto (p10 od {cycles} čistih ciklov = {p10}).", "ml_end_repeat": "{false}/{total} ciklov ({pct}%) je imelo premor, ki ga je detektor konca ocenil z >50 %; zahtevaj {val} potrditev konca.", @@ -1608,7 +1725,7 @@ "thr_batch": "Ohranjeno tik nad najnižjo delovno močjo p05 čez {cycles} ciklov ({p05}W), da se začetek zazna čim prej in da prag ustavitve ostane pod najnižjo delovno močjo naprave.", "tol_per_profile": "p75 variance trajanja po posameznih profilih čez {profiles} profilov ({cycles} ciklov); dosledni profili niso kaznovani.", "tol_pooled": "Na podlagi združene variance trajanja {cycles} nedavnih označenih ciklov (p95 odklon={dev}).", - "watchdog": "Ohranjeno tako nizko, kot je varno (3x vrzel posodobitve p95 {p95}s, najmanj 30s), da se zastoji hitro zaznajo brez lažnih ustavitev." + "watchdog": "Ohranjeno tako nizko, kot je varno (tik nad vrzeljo posodobitve p95 {p95}s, najmanj 30s), da se zastoji hitro zaznajo brez lažnih ustavitev." }, "exclusions": { "summary": "Izključeno {total} napačno zaznanih ciklov: {parts}.", @@ -1688,6 +1805,10 @@ "name_required": "Ime je obvezno", "no_split_found": "Ni najdenih nedejavnih vrzeli za razdelitev", "panel_settings_saved": "Nastavitve plošče shranjene", + "pg_preset_loaded": "Prednastavitev \"{name}\" naložena", + "pg_preset_saved": "Prednastavitev \"{name}\" shranjena", + "pg_sugg_loaded": "Naloženo {n} predlaganih vrednosti - zaženite peskovnik za primerjavo", + "pg_sugg_ml_loaded": "Naloženo {n} ML-umerjenih vrednosti - zaženite peskovnik za primerjavo", "phase_name_required": "Ime faze je obvezno", "phase_updated": "Faza posodobljena", "phases_saved": "Faze shranjene", @@ -1770,6 +1891,7 @@ "other": "Drugo" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Pomivalni stroj: sekunde tišine po pričakovanem trajanju, preden se sprosti čakanje na končno izčrpavanje vode", "anti_wrinkle_enabled": "Vsrkaj vrtilne impulze po glavni fazi, namesto da jih obravnavaš kot nove cikle", "anti_wrinkle_exit_power": "Moč mora med impulzi pasti pod to vrednost, da zaščita pred gubami ostane aktivna", "anti_wrinkle_idle_timeout": "Dovoljeni mir med dvema vrtilnima impulzoma, preden se zaščita pred gubami konča", diff --git a/custom_components/ha_washdata/translations/panel/sq.json b/custom_components/ha_washdata/translations/panel/sq.json index f419adc3..404098ee 100644 --- a/custom_components/ha_washdata/translations/panel/sq.json +++ b/custom_components/ha_washdata/translations/panel/sq.json @@ -1,1947 +1,2069 @@ { - "badge": { - "artifact_tip": "U zbuluan {n} anomali (p.sh. dera e hapur në mes të ciklit) – hapeni për t'i parë ato në grafik", - "auto": "(zbuluar automatikisht)", - "built_in_tag": "i integruar", - "declining": "↘ në rënie", - "energy_low": "Energji më e ulët se zakonisht", - "energy_spike": "Energji më e lartë se zakonisht", - "fair_fit": "cilësi e pranueshme", - "fair_fit_tip": "Konsistencë e moderuar e ndeshjes – disa cikle të caktuara për këtë profil kanë rezultate më të ulëta besimi. Etiketoni më shumë cikle ose riregjistroni profilin për të përmirësuar saktësinë.", - "feedback_requested": "Kërkohet koment", - "golden_cycle": "Cikli referues i regjistruar", - "improving": "↗ në rritje", - "manual": "(zgjedhur manualisht)", - "needs_review": "Ka nevojë për rishikim", - "overrun": "Zgjati më shumë se zakonisht", - "poor_fit": "cilësi e keqe", - "poor_fit_tip": "Histori jokonsistente e ndeshjeve – merrni parasysh rindërtimin e këtij profili", - "restart_gap_tip": "{n} boshllëk rinisje të HA: gjurma e energjisë ka një vrimë", - "reviewed": "Shqyrtuar", - "steady": "→ i qëndrueshëm", - "underrun": "Përfundoi më shpejt se zakonisht", - "using_defaults": "Duke përdorur vlerat e parazgjedhura", - "using_tuned": "Duke përdorur peshat e rregulluara", - "overrun_ratio": "({x}x e pritur)", - "underrun_ratio": "({pct}% e pritur)", - "awaiting_tip": "Në pritje të miratimit nga komuniteti", - "awaiting_n": "Në pritje të miratimit · {n} të konfirmuara", - "approved": "Miratuar", - "awaiting": "Në pritje të miratimit", - "imported_tip": "Importuar nga dyqani i komunitetit. Përdoret vetëm për përputhje, nuk llogaritet në statistika.", - "not_importable": "s'aplikohet këtu", - "exists": "ekziston" - }, - "btn": { - "add_device": "+ Shto pajisje", - "add_device_tip": "Shto një pajisje tjetër WashData", - "add_maintenance": "Shto ngjarje mirëmbajtjeje", - "add_phase": "+ Shto fazë", - "add_timer": "+ Shto kohëmatës", - "apply_all": "Apliko të gjitha", - "apply_label": "Apliko etiketën", - "apply_set_b": "Apliko grupin B", - "apply_split": "Apliko ndarjen", - "apply_trim": "Apliko prerjen", - "auto_detect_split": "Zbulo automatikisht", - "auto_label_cycles": "Etiketim automatik i cikleve", - "auto_label_cycles_tip": "Cakto automatikisht emra profilesh cikleve të paetiketuara, besueshmëria e përputhjes e të cilave tejkalon pragun", - "cancel": "Anulo", - "clear_debug": "Pastro të dhënat e korrigjimit", - "clear_splits": "Pastro", - "close": "Mbyll", - "compare": "Krahaso", - "confirm": "Konfirmo", - "convert_to_automation": "Konverto në automatizim", - "correct": "Korrigjo…", - "create": "Krijo", - "create_from_cluster": "Krijo profil nga {count} cikle", - "create_profile": "+ Krijo profil", - "delete": "Fshi", - "delete_group": "Fshi grupin", - "delete_group_tip": "Fshije vetëm këtë grup - profilet e anëtarëve mbahen", - "delete_profile": "Fshi profilin", - "discard": "Hidh poshtë", - "discard_tip": "Hidh poshtë gjurmën e regjistruar pa e ruajtur", - "dismiss": "Injorojë", - "done": "Gatë", - "edit": "Modifiko", - "export": "Eksporto", - "export_json": "Eksporto në JSON", - "force_stop": "Ndalim i detyruar", - "force_stop_tip": "Përfundo menjëherë ciklin aktual dhe shënoje si të ndaluar me forcë", - "from_template": "Nga shablloni ▾", - "ignore": "Injorojë", - "import_json": "Importo nga JSON", - "import_overwrite": "Importo (mbishkruan të dhënat)", - "inspect": "Inspekto", - "label": "Etiketoje", - "load": "Ngarko", - "load_more": "Ngarko më shumë", - "manage": "Menaxho", - "merge": "Bashko", - "new_automation": "+ Automatizim i ri", - "new_group": "+ Grup i ri", - "new_group_tip": "Grupo profilet pothuajse identike (e njëjta formë/kohëzgjatje, temperaturë ose centrifugim i ndryshëm) kështu që përputhja zgjedh me besueshmëri ndërmjet tyre", - "new_phase": "+ Fazë e re", - "new_profile": "+ Profil i ri", - "new_profile_tip": "Krijo një profil të ri programi nga një cikël ekzistues i etiketuar ose regjistrim", - "on_cycle_finished": "Kur cikli përfundon", - "on_cycle_started": "Kur cikli fillon", - "pause_cycle": "Ndalo", - "pause_cycle_tip": "Ndalo ciklin aktiv – pajisja do të vazhdojë nga aty ku kishte mbetur", - "pg_apply_device": "Apliko te pajisja", - "pg_autofill": "Mbushje automatike", - "play": "Luaj", - "process": "Proceso", - "process_history": "Proceso tani", - "process_recording": "Ruaj regjistrimin", - "process_tip": "Ruaj gjurmën e regjistruar si profil të ri ose ekzistues", - "rebuild": "Rindërto zarfet", - "rebuild_envelope": "Rindërto zarfin", - "rebuild_tip": "Rillogaris zarfin e pritshmë të energjisë (brezin min/maks) për të gjitha profilet nga ciklet e tyre të etiketuara – ekzekuto pas etiketimit të cikleve të reja ose korrigjimit të tjerave", - "rec_start_tip": "Fillo regjistrimin e gjurmës së energjisë të pajisjes – fillo pak para ekzekutimit të një cikli", - "rec_stop": "Ndalo", - "rec_stop_tip": "Ndalo regjistrimin dhe mbaj gjurmën e kapur për shqyrtim", - "record": "Fillo regjistrimin", - "refresh": "Rifresko", - "refresh_diag_tip": "Ringarko statistikat e ruajtjes", - "refresh_logs_tip": "Ringarko regjistrimet më të fundit të regjistrit", - "refresh_settings_tip": "Ringarko cilësimet nga serveri", - "relabel": "Rietiketo ({count})", - "remove": "Hiq", - "remove_timer": "Hiq kohëmatësin", - "reset": "Rivendos", - "reset_ml_models_tip": "Hidhni modelet e rregulluara mirë dhe kthehuni te ato të integruara. WashData mund t'i rimësojë ato më vonë.", - "reset_to_builtin": "Rivendos te modelet e integruara", - "reset_to_defaults": "Rivendos vlerat e parazgjedhura", - "resume_cycle": "Vazhdo ciklin", - "resume_cycle_tip": "Vazhdo ciklin e ndërprerë", - "revert_settings": "Hiq ndryshimet", - "revert_settings_tip": "Rivendos cilësimet nga para ruajtjes suaj të fundit", - "revert_settings_tip_none": "Ruani fillimisht për të aktivizuar zhbërjen", - "revert": "Rikthe", - "revert_to_previous": "Rikthe këtë cilësim në vlerën e tij të mëparshme", - "review": "Rishiko", - "run": "Ekzekuto", - "run_analysis": "🔍 Ekzekuto analizën e sugjerimeve", - "run_analysis_tip": "Analizoni ciklet tuaja të regjistruara tani dhe rifresko sugjerimet e akordimit", - "run_auto_label": "Ekzekuto etiketimin automatik", - "run_both": "Ekzekuto A kundër B", - "run_simulation": "Ekzekuto simulimin", - "save": "Ruaj", - "save_access_control": "Ruaj kontrollin e aksesit", - "save_group": "Ruaj grupin", - "save_panel_settings": "Ruaj cilësimet e panelit", - "save_phases": "Ruaj fazat", - "save_preferences": "Ruaj preferencat", - "save_reminders": "Ruaj kujtesat", - "save_review": "Ruaj rishikimin", - "save_settings": "Ruaj cilësimet", - "select": "Zgjidh", - "select_all": "Zgjidh të gjitha", - "select_last20": "20 e fundit", - "select_none": "Pastro", - "show_only": "Shfaq vetëm", - "skip_setup": "Anashkalo konfigurimin", - "split": "Ndaj", - "stop": "Ndalo", - "submit_correction": "Dërgo korrigjimin", - "train_now": "Trajno tani", - "trim": "Priti", - "trim_split": "Priti / Ndaj", - "undo": "Zhbëj", - "use": "Përdor", - "wipe_all": "Fshi të gjitha të dhënat", - "delete_selected": "Fshi të zgjedhurat ({n})", - "group_suggest": "Grupi {n}: {members}", - "pg_apply_best": "Zbato më të mirën", - "pg_apply_to_settings": "Ruaj te cilësimet", - "pg_apply_to_settings_tip": "Kopjo vlerat që redaktove këtu te cilësimet aktive të kësaj pajisjeje", - "search": "Kërko", - "import": "Importo", - "disconnect": "Shkëput", - "connect_github": "Lidh GitHub", - "save_appliance": "Ruaj pajisjen", - "share_to_store": "Ndaj në dyqan", - "share": "Ndaj", - "confirm_appliance": "Konfirmo këtë pajisje", - "confirmed": "Konfirmuar", - "browse_community_setups": "Shfletoni konfigurimet e komunitetit", - "download_device": "Shkarko këtë konfigurim", - "share_device": "⬆ Ndaj këtë pajisje", - "share_device_tip": "Ndani këtë pajisje dhe ciklet e saj të referencës të regjistruara në dyqanin e komunitetit, që të tjerët me të njëjtën makinë t'i adoptojnë", - "share_n": "Ndaj {n} cikël(-ë)", - "export_selected": "Eksporto (zgjidh të dhënat)", - "export_all": "Eksportim i shpejtë i gjithçkaje", - "import_raw": "I avancuar: zëvendëso gjithçka nga JSON", - "download_export": "Shkarko eksportin", - "analyze_import": "Analizo skedarin", - "import_selected": "Importo të zgjedhurat", - "back": "Prapa" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "Duhet të jetë nën Pragun e Ndalimit ({stop} W); përndryshe fuqia e daljes kundër rrudhave injorohet", - "stop": "Duhet të jetë mbi Fuqinë e Daljes Kundër Rrudhave ({exit} W)" + "card": { + "min": "min", + "entity_not_found": "Entiteti nuk u gjet", + "running_long": "Po zgjat", + "remaining": "mbetur", + "progress": "përparimi", + "show_time_remaining": "Shfaq kohën e mbetur", + "show_percentage": "Shfaq përqindjen", + "layout": { + "tile": "Pllakëz (kompakte)", + "detail": "Detaje (i pasur)", + "glance": "Vështrim (pajisje të shumta)" + }, + "btn": { + "pause": "Pauzë", + "resume": "Vazhdo", + "terminate": "Përfundo ciklin", + "record_start": "Fillo regjistrimin", + "record_stop": "Ndalo regjistrimin", + "program": "Programi", + "open_panel": "Hap WashData" + }, + "editor": { + "layout": "Paraqitja", + "entity": "Entiteti i pajisjes", + "entities": "Pajisjet", + "title": "Titulli", + "icon": "Ikona", + "show_state": "Shfaq gjendjen", + "show_program": "Shfaq programin", + "show_progress_bar": "Shfaq shiritin e progresit", + "spin_icon": "Rrotullo ikonën gjatë punës", + "display_mode": "Rreshti i detajeve", + "active_color": "Mbivendosje e ngjyrës aktive", + "show_phase": "Shfaq fazën", + "show_energy": "Shfaq energjinë dhe koston", + "show_anomaly": "Shfaq paralajmërimin e tejkalimit", + "show_sparkline": "Shfaq grafikun e drejtpërdrejtë të fuqisë", + "buttons": "Butonat e veprimeve", + "program_entity": "Entiteti i programit (mbivendosje)", + "time_entity": "Entiteti i kohës (mbivendosje)", + "pct_entity": "Entiteti i progresit (mbivendosje)", + "power_entity": "Entiteti i fuqisë (mbivendosje)", + "tap_action": "Veprimi me prekje", + "hold_action": "Veprimi me mbajtje", + "double_tap_action": "Veprimi me prekje të dyfishtë" + } + }, + "badge": { + "artifact_tip": "U zbuluan {n} anomali (p.sh. dera e hapur në mes të ciklit) – hapeni për t'i parë ato në grafik", + "auto": "(zbuluar automatikisht)", + "built_in_tag": "i integruar", + "declining": "↘ në rënie", + "energy_low": "Energji më e ulët se zakonisht", + "energy_spike": "Energji më e lartë se zakonisht", + "fair_fit": "cilësi e pranueshme", + "fair_fit_tip": "Konsistencë e moderuar e ndeshjes – disa cikle të caktuara për këtë profil kanë rezultate më të ulëta besimi. Etiketoni më shumë cikle ose riregjistroni profilin për të përmirësuar saktësinë.", + "feedback_requested": "Kërkohet koment", + "golden_cycle": "Cikli referues i regjistruar", + "improving": "↗ në rritje", + "manual": "(zgjedhur manualisht)", + "needs_review": "Ka nevojë për rishikim", + "overrun": "Zgjati më shumë se zakonisht", + "poor_fit": "cilësi e keqe", + "poor_fit_tip": "Histori jokonsistente e ndeshjeve – merrni parasysh rindërtimin e këtij profili", + "restart_gap_tip": "{n} boshllëk rinisje të HA: gjurma e energjisë ka një vrimë", + "reviewed": "Shqyrtuar", + "steady": "→ i qëndrueshëm", + "underrun": "Përfundoi më shpejt se zakonisht", + "using_defaults": "Duke përdorur vlerat e parazgjedhura", + "using_tuned": "Duke përdorur peshat e rregulluara", + "overrun_ratio": "({x}x e pritur)", + "underrun_ratio": "({pct}% e pritur)", + "awaiting_tip": "Në pritje të miratimit nga komuniteti", + "awaiting_n": "Në pritje të miratimit · {n} të konfirmuara", + "approved": "Miratuar", + "awaiting": "Në pritje të miratimit", + "imported_tip": "Importuar nga dyqani i komunitetit. Përdoret vetëm për përputhje, nuk llogaritet në statistika.", + "not_importable": "s'aplikohet këtu", + "exists": "ekziston" + }, + "btn": { + "add_device": "+ Shto pajisje", + "add_device_tip": "Shto një pajisje tjetër WashData", + "add_maintenance": "Shto ngjarje mirëmbajtjeje", + "add_phase": "+ Shto fazë", + "add_timer": "+ Shto kohëmatës", + "apply_all": "Apliko të gjitha", + "apply_label": "Apliko etiketën", + "apply_set_b": "Apliko grupin B", + "apply_split": "Apliko ndarjen", + "apply_trim": "Apliko prerjen", + "auto_detect_split": "Zbulo automatikisht", + "auto_label_cycles": "Etiketim automatik i cikleve", + "auto_label_cycles_tip": "Cakto automatikisht emra profilesh cikleve të paetiketuara, besueshmëria e përputhjes e të cilave tejkalon pragun", + "cancel": "Anulo", + "clear_debug": "Pastro të dhënat e korrigjimit", + "clear_splits": "Pastro", + "close": "Mbyll", + "compare": "Krahaso", + "confirm": "Konfirmo", + "convert_to_automation": "Konverto në automatizim", + "correct": "Korrigjo…", + "create": "Krijo", + "create_from_cluster": "Krijo profil nga {count} cikle", + "create_profile": "+ Krijo profil", + "delete": "Fshi", + "delete_group": "Fshi grupin", + "delete_group_tip": "Fshije vetëm këtë grup - profilet e anëtarëve mbahen", + "delete_profile": "Fshi profilin", + "discard": "Hidh poshtë", + "discard_tip": "Hidh poshtë gjurmën e regjistruar pa e ruajtur", + "dismiss": "Injorojë", + "done": "Gatë", + "edit": "Modifiko", + "export": "Eksporto", + "export_json": "Eksporto në JSON", + "force_stop": "Ndalim i detyruar", + "force_stop_tip": "Përfundo menjëherë ciklin aktual dhe shënoje si të ndaluar me forcë", + "from_template": "Nga shablloni ▾", + "ignore": "Injorojë", + "import_json": "Importo nga JSON", + "import_overwrite": "Importo (mbishkruan të dhënat)", + "inspect": "Inspekto", + "label": "Etiketoje", + "load": "Ngarko", + "load_more": "Ngarko më shumë", + "manage": "Menaxho", + "merge": "Bashko", + "new_automation": "+ Automatizim i ri", + "new_group": "+ Grup i ri", + "new_group_tip": "Grupo profilet pothuajse identike (e njëjta formë/kohëzgjatje, temperaturë ose centrifugim i ndryshëm) kështu që përputhja zgjedh me besueshmëri ndërmjet tyre", + "new_phase": "+ Fazë e re", + "new_profile": "+ Profil i ri", + "new_profile_tip": "Krijo një profil të ri programi nga një cikël ekzistues i etiketuar ose regjistrim", + "on_cycle_finished": "Kur cikli përfundon", + "on_cycle_started": "Kur cikli fillon", + "pause_cycle": "Ndalo", + "pause_cycle_tip": "Ndalo ciklin aktiv – pajisja do të vazhdojë nga aty ku kishte mbetur", + "pg_apply_device": "Apliko te pajisja", + "pg_autofill": "Mbushje automatike", + "pg_load_calibrated": "Ngarko të kalibruar (ML) ({n})", + "pg_load_calibrated_tip": "Ngarkon cilësimet e kalibruara nga ML si anashkalime të zonës së provave", + "pg_load_live": "Ngarko cilësimet aktive", + "pg_load_live_tip": "Rilexo cilësimet aktuale të integrimit dhe hidh poshtë çdo ndryshim në zonën e provave", + "pg_load_suggested": "Ngarko sugjerime ({n})", + "pg_load_suggested_tip": "Ngarkon sugjerime aktuale të sintonizuesit automatik si anashkalime të zonës së provave", + "pg_preset_delete": "Fshi konfigurimin", + "pg_preset_load": "Ngarko konfigurimin", + "pg_preset_load_tip": "Zëvendëso vlerat e zonës së provave me këtë konfigurim (cilësimet aktive nuk preken)", + "pg_preset_save": "Ruaj si konfigurim", + "pg_preset_save_tip": "Ruaj të gjitha vlerat më poshtë si një konfigurim me emër për këtë pajisje", + "pg_publish_all": "Apliko {n} te integrimi", + "pg_publish_one": "Apliko {label} te integrimi", + "play": "Luaj", + "process": "Proceso", + "process_history": "Proceso tani", + "process_recording": "Ruaj regjistrimin", + "process_tip": "Ruaj gjurmën e regjistruar si profil të ri ose ekzistues", + "rebuild": "Rindërto zarfet", + "rebuild_envelope": "Rindërto zarfin", + "rebuild_tip": "Rillogaris zarfin e pritshmë të energjisë (brezin min/maks) për të gjitha profilet nga ciklet e tyre të etiketuara – ekzekuto pas etiketimit të cikleve të reja ose korrigjimit të tjerave", + "rec_start_tip": "Fillo regjistrimin e gjurmës së energjisë të pajisjes – fillo pak para ekzekutimit të një cikli", + "rec_stop": "Ndalo", + "rec_stop_tip": "Ndalo regjistrimin dhe mbaj gjurmën e kapur për shqyrtim", + "record": "Fillo regjistrimin", + "refresh": "Rifresko", + "refresh_diag_tip": "Ringarko statistikat e ruajtjes", + "refresh_logs_tip": "Ringarko regjistrimet më të fundit të regjistrit", + "refresh_settings_tip": "Ringarko cilësimet nga serveri", + "relabel": "Rietiketo ({count})", + "remove": "Hiq", + "remove_timer": "Hiq kohëmatësin", + "reset": "Rivendos", + "reset_ml_models_tip": "Hidhni modelet e rregulluara mirë dhe kthehuni te ato të integruara. WashData mund t'i rimësojë ato më vonë.", + "reset_to_builtin": "Rivendos te modelet e integruara", + "reset_to_defaults": "Rivendos vlerat e parazgjedhura", + "resume_cycle": "Vazhdo ciklin", + "resume_cycle_tip": "Vazhdo ciklin e ndërprerë", + "revert_settings": "Hiq ndryshimet", + "revert_settings_tip": "Rivendos cilësimet nga para ruajtjes suaj të fundit", + "revert_settings_tip_none": "Ruani fillimisht për të aktivizuar zhbërjen", + "revert": "Rikthe", + "revert_to_previous": "Rikthe këtë cilësim në vlerën e tij të mëparshme", + "review": "Rishiko", + "run": "Ekzekuto", + "run_analysis": "🔍 Ekzekuto analizën e sugjerimeve", + "run_analysis_tip": "Analizoni ciklet tuaja të regjistruara tani dhe rifresko sugjerimet e akordimit", + "run_auto_label": "Ekzekuto etiketimin automatik", + "run_both": "Ekzekuto A kundër B", + "run_simulation": "Ekzekuto simulimin", + "save": "Ruaj", + "save_access_control": "Ruaj kontrollin e aksesit", + "save_group": "Ruaj grupin", + "save_panel_settings": "Ruaj cilësimet e panelit", + "save_phases": "Ruaj fazat", + "save_preferences": "Ruaj preferencat", + "save_reminders": "Ruaj kujtesat", + "save_review": "Ruaj rishikimin", + "save_settings": "Ruaj cilësimet", + "select": "Zgjidh", + "select_all": "Zgjidh të gjitha", + "select_last20": "20 e fundit", + "select_none": "Pastro", + "show_only": "Shfaq vetëm", + "skip_setup": "Anashkalo konfigurimin", + "split": "Ndaj", + "stop": "Ndalo", + "submit_correction": "Dërgo korrigjimin", + "train_now": "Trajno tani", + "trim": "Priti", + "trim_split": "Priti / Ndaj", + "undo": "Zhbëj", + "use": "Përdor", + "wipe_all": "Fshi të gjitha të dhënat", + "delete_selected": "Fshi të zgjedhurat ({n})", + "group_suggest": "Grupi {n}: {members}", + "pg_apply_best": "Zbato më të mirën", + "pg_apply_to_settings": "Ruaj te cilësimet", + "pg_apply_to_settings_tip": "Kopjo vlerat që redaktove këtu te cilësimet aktive të kësaj pajisjeje", + "search": "Kërko", + "import": "Importo", + "disconnect": "Shkëput", + "connect_github": "Lidh GitHub", + "save_appliance": "Ruaj pajisjen", + "share_to_store": "Ndaj në dyqan", + "share": "Ndaj", + "confirm_appliance": "Konfirmo këtë pajisje", + "confirmed": "Konfirmuar", + "browse_community_setups": "Shfletoni konfigurimet e komunitetit", + "download_device": "Shkarko këtë konfigurim", + "share_device": "⬆ Ndaj këtë pajisje", + "share_device_tip": "Ndani këtë pajisje dhe ciklet e saj të referencës të regjistruara në dyqanin e komunitetit, që të tjerët me të njëjtën makinë t'i adoptojnë", + "share_n": "Ndaj {n} cikël(-ë)", + "export_selected": "Eksporto (zgjidh të dhënat)", + "export_all": "Eksportim i shpejtë i gjithçkaje", + "import_raw": "I avancuar: zëvendëso gjithçka nga JSON", + "download_export": "Shkarko eksportin", + "analyze_import": "Analizo skedarin", + "import_selected": "Importo të zgjedhurat", + "back": "Prapa", + "mute_suggestion": "Mos e sugjeroni këtë cilësim", + "reset_muted": "Rivendos të heshturat" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "Duhet të jetë nën Pragun e Ndalimit ({stop} W); përndryshe fuqia e daljes kundër rrudhave injorohet", + "stop": "Duhet të jetë mbi Fuqinë e Daljes Kundër Rrudhave ({exit} W)" + }, + "anti_wrinkle_max": { + "max": "Duhet të jetë mbi Pragun e Nisjes ({start} W); përndryshe kufiri i kohëzgjatjes kundër rrudhave anashkalohet", + "start": "Duhet të jetë nën Fuqinë Maks. Kundër Rrudhave ({max} W)" + }, + "attn_sub": "Rregulloni konfliktet para se të ruani", + "attn_title": "{n} konflikt{s} cilësimi", + "confidence": { + "auto": "Duhet të jetë në ose mbi Pragun e Përputhjes ({match})", + "learning": "Duhet të jetë në ose nën Pragun e Përputhjes ({match})", + "match_for_auto": "Duhet të jetë në ose nën Besueshmërinë e Etiketimit Automatik ({alc})", + "match_for_learning": "Duhet të jetë në ose mbi Besueshmërinë e të Mësuarit ({lc})" + }, + "duration_ratio": { + "max": "Duhet të jetë më i madh se Raporti Min. i Kohëzgjatjes ({min})", + "min": "Duhet të jetë më i vogël se Raporti Maks. i Kohëzgjatjes ({max})" + }, + "hysteresis": { + "start": "Duhet të jetë mbi Pragun e Ndalimit ({stop} W)", + "stop": "Duhet të jetë nën Pragun e Nisjes ({start} W)" + }, + "min_power": { + "min_power": "Duhet të jetë në ose nën Pragun e Ndalimit ({stop} W)", + "stop": "Duhet të jetë në ose mbi Fuqinë Minimale ({min} W)" + }, + "no_update_timeout": { + "timeout": "Duhet të jetë më i madh se Intervali i Rojtarit ({wi} s)", + "watchdog": "Duhet të jetë më i vogël se Koha e Skadimit pa Përditësim ({to} s)" + }, + "off_delay": { + "gap": "Hendeku Min. i Fikjes duhet të jetë të paktën Vonesa e Fikjes ({delay} s)", + "off_delay": "Vonesa e Fikjes ({off_delay} s) tejkalon Hendekun Min. të Fikjes ({gap} s); ciklet vijuese mund të bashkohen" + }, + "power_off": { + "stop": "Duhet të jetë mbi Pragun e Fikjes së Energjisë ({pot} W)", + "threshold": "Duhet të jetë nën Pragun e Ndalimit ({stop} W) për të hyrë në fuqi" + }, + "pump_stuck": { + "duration": "Duhet të jetë më i vogël se Koha e Skadimit pa Përditësim ({to} s) kështu që alarmi i bllokimit të ndizet para se rojtari të vrasë ciklin", + "timeout": "Duhet të tejkalojë Kohëzgjatjen e Pompës së Bllokuar ({ps} s) kështu që alarmi të ndizet para se cikli të ndalet me forcë" + }, + "start_dur": { + "sampling": "Intervali i Kampionimit tejkalon Kohëzgjatjen e Nisjes ({sdt} s); majat me kampion të vetëm mund të hapin një cikël", + "threshold": "Duhet të jetë të paktën një Interval Kampionimi ({si} s) për të parandaluar fillimet e rreme me kampion të vetëm" + }, + "unmatch": { + "match": "Duhet të jetë mbi Pragun e Mosperputhjeve ({un})", + "unmatch": "Duhet të jetë nën Pragun e Përputhjes ({match}); përndryshe një përputhje e konfirmuar zhbëhet menjëherë" + }, + "cascade_toast": "U rregulluan edhe {n} cilësim{s} për konsistencë.", + "suggestion_resolves": "Zbato sugjerimin e pritshëm ({val}) më poshtë për ta rregulluar këtë", + "use_fix": "Përdor {val}", + "watchdog": { + "interval": "Duhet të jetë të paktën 2× Intervali i Kampionimit ({si} s)", + "sampling": "Intervali i Kampionimit duhet të jetë të paktën gjysma e Intervalit të Rojtarit ({wi} s)" + }, + "settings_banner": "{n} konflikt{s} cilësimi – kontrolloni seksionet e theksuara dhe korrigjojini para ruajtjes.", + "settings_banner_btn": "Shko te i pari" }, - "anti_wrinkle_max": { - "max": "Duhet të jetë mbi Pragun e Nisjes ({start} W); përndryshe kufiri i kohëzgjatjes kundër rrudhave anashkalohet", - "start": "Duhet të jetë nën Fuqinë Maks. Kundër Rrudhave ({max} W)" - }, - "attn_sub": "Rregulloni konfliktet para se të ruani", - "attn_title": "{n} konflikt{s} cilësimi", - "confidence": { - "auto": "Duhet të jetë në ose mbi Pragun e Përputhjes ({match})", - "learning": "Duhet të jetë në ose nën Pragun e Përputhjes ({match})", - "match_for_auto": "Duhet të jetë në ose nën Besueshmërinë e Etiketimit Automatik ({alc})", - "match_for_learning": "Duhet të jetë në ose mbi Besueshmërinë e të Mësuarit ({lc})" - }, - "duration_ratio": { - "max": "Duhet të jetë më i madh se Raporti Min. i Kohëzgjatjes ({min})", - "min": "Duhet të jetë më i vogël se Raporti Maks. i Kohëzgjatjes ({max})" - }, - "hysteresis": { - "start": "Duhet të jetë mbi Pragun e Ndalimit ({stop} W)", - "stop": "Duhet të jetë nën Pragun e Nisjes ({start} W)" - }, - "min_power": { - "min_power": "Duhet të jetë në ose nën Pragun e Ndalimit ({stop} W)", - "stop": "Duhet të jetë në ose mbi Fuqinë Minimale ({min} W)" - }, - "no_update_timeout": { - "timeout": "Duhet të jetë më i madh se Intervali i Rojtarit ({wi} s)", - "watchdog": "Duhet të jetë më i vogël se Koha e Skadimit pa Përditësim ({to} s)" - }, - "off_delay": { - "gap": "Hendeku Min. i Fikjes duhet të jetë të paktën Vonesa e Fikjes ({delay} s)", - "off_delay": "Vonesa e Fikjes ({off_delay} s) tejkalon Hendekun Min. të Fikjes ({gap} s); ciklet vijuese mund të bashkohen" - }, - "power_off": { - "stop": "Duhet të jetë mbi Pragun e Fikjes së Energjisë ({pot} W)", - "threshold": "Duhet të jetë nën Pragun e Ndalimit ({stop} W) për të hyrë në fuqi" - }, - "pump_stuck": { - "duration": "Duhet të jetë më i vogël se Koha e Skadimit pa Përditësim ({to} s) kështu që alarmi i bllokimit të ndizet para se rojtari të vrasë ciklin", - "timeout": "Duhet të tejkalojë Kohëzgjatjen e Pompës së Bllokuar ({ps} s) kështu që alarmi të ndizet para se cikli të ndalet me forcë" - }, - "start_dur": { - "sampling": "Intervali i Kampionimit tejkalon Kohëzgjatjen e Nisjes ({sdt} s); majat me kampion të vetëm mund të hapin një cikël", - "threshold": "Duhet të jetë të paktën një Interval Kampionimi ({si} s) për të parandaluar fillimet e rreme me kampion të vetëm" - }, - "unmatch": { - "match": "Duhet të jetë mbi Pragun e Mosperputhjeve ({un})", - "unmatch": "Duhet të jetë nën Pragun e Përputhjes ({match}); përndryshe një përputhje e konfirmuar zhbëhet menjëherë" - }, - "cascade_toast": "U rregulluan edhe {n} cilësim{s} për konsistencë.", - "suggestion_resolves": "Zbato sugjerimin e pritshëm ({val}) më poshtë për ta rregulluar këtë", - "use_fix": "Përdor {val}", - "watchdog": { - "interval": "Duhet të jetë të paktën 2× Intervali i Kampionimit ({si} s)", - "sampling": "Intervali i Kampionimit duhet të jetë të paktën gjysma e Intervalit të Rojtarit ({wi} s)" - }, - "settings_banner": "{n} konflikt{s} cilësimi – kontrolloni seksionet e theksuara dhe korrigjojini para ruajtjes.", - "settings_banner_btn": "Shko te i pari" - }, - "hdr": { - "ab_comparison": "Krahasimi i cilësimeve A/B", - "access_control": "Kontrolli i aksesit", - "add_maintenance": "Shto ngjarje mirëmbajtjeje", - "automation_delete": "Fshi këtë automatizim", - "automation_needs_review": "Ky cikël ka nevojë për rishikim", - "automation_open": "Hap në redaktuesin e automatizimit", - "automation_review_this_cycle": "Rishiko këtë cikël", - "automations": "Automatizime", - "clear_debug": "Pastro gjurmët e korrigjimit", - "cycle_simulator": "Simulator ciklesh", - "diagnostics_pref": "Diagnostikim", - "display": "Shfaqje", - "dtw_inspector": "Inspektor DTW", - "export_import": "Eksporto / Importo", - "getting_started": "Fillimi", - "live_power": "Fuqia live", - "logs": "Regjistrat", - "logs_diagnostics": "Diagnostikim", - "maintenance": "Veprime mirëmbajtjeje", - "maintenance_log": "Regjistri i mirëmbajtjes", - "maintenance_reminders": "Kujtesa për servisin", - "manual_recording": "Regjistrim manual", - "manual_recording_tip": "Ekzekuto qëllimisht një cikël ndërkohë që WashData regjistron gjurmën e energjisë. Fillo pak para se pajisja të nisë, Ndalo kur të përfundojë, pastaj Proceso për ta ruajtur si profil me emër.", - "ml_learned": "Çfarë ka mësuar WashData", - "ml_matching_tuning": "Rregullim i hollë i përputhjes së programit", - "ml_settings_card": "Cilësimet", - "ml_smart_learning": "Të mësuarit inteligjent", - "my_preferences": "Preferencat e mia", - "no_automations": "Asnjë automatizim nuk i referohet kësaj pajisjeje ende.", - "panel_settings": "Cilësimet e panelit", - "param_sweep": "Skanim parametrash", - "phase_catalog": "Katalog fazash", - "playground": "Zona e provave", - "process_history": "Historiku i procesit", - "settings_history": "Historiku i cilësimeve", - "status": "Statusi", - "status_graph": "Grafiku i statusit", - "storage_stats": "Statistikat e ruajtjes", - "test_history": "Testim mbi historikun", - "toggle_sidebar": "Ndrysho shiritin anësor të Asistentit në Shtëpi", - "tools_and_data": "Mjete dhe të dhëna", - "wipe_history": "Fshi historikun", - "recommendations": "Rekomandime ({n})", - "pg_detection_params": "Cilësimet e zbulimit", - "pg_timeline": "Kronologjia e ngjarjeve", - "pg_outcome": "Rezultati i simulimit", - "pg_across_cycles": "Në të gjithë ciklet tuaja", - "community_store": "Dyqani i Komunitetit", - "online_account": "Dyqani i Komunitetit dhe veçoritë online" - }, - "health": { - "fair": "Cilësi e pranueshme e profilit", - "good": "✓ Cilësi e mirë e profilit", - "poor": "⚠ Cilësi e keqe e profilit" - }, - "lbl": { - "actions": "Veprime", - "activity": "Aktivitet", - "administrators": "Administratorë", - "aria_compare_chart": "Grafiku i krahasimit të cikleve", - "aria_cycle_chart": "Kurba e fuqisë së ciklit", - "aria_envelope_chart": "Grafiku i zarfit të fuqisë së profilit", - "aria_phase_chart": "Grafiku i redaktuesit të fazave", - "aria_playground_chart": "Kurba e fuqisë së ciklit me pragje zbulimi të zvarritshme", - "aria_power_chart": "Grafiku i konsumit të fuqisë", - "aria_spaghetti_chart": "Kurbat e mbivendosura të fuqisë së cikleve", - "aria_sweep_chart": "Grafiku i rezultateve të skanimit të parametrave", - "artifact_anomaly": "Anomali", - "artifact_high_power": "Fuqi e lartë", - "artifact_interruption": "Ndërprerje", - "artifact_low_power": "Fuqi e ulët", - "auto_detect": "Zbulim automatik", - "auto_fine_tune_off": "rregullimi automatik i hollë çaktivizuar", - "auto_fine_tune_on": "sintonizimi i imët automatik aktiv (rreth {hour}:00)", - "avg_cost": "Kosto mesatare", - "change": "Ndryshim", - "clock_time": "Koha e orës", - "cohesion_good": "kohezion {pct}%", - "cohesion_low": "⚠ kohezion i ulët {pct}%", - "compare_profiles": "Krahaso me profilet", - "concurrency": "Njëkohshmëri", - "confidence": "Besueshmëria", - "confidence_threshold": "Pragu i besueshmërisë", - "correct_duration": "Korrigjo kohëzgjatjen (min, opsionale)", - "correct_profile": "Profili i korrigjuar", - "correlation": "Korrelacion", - "cost": "Kosto", - "create_new_profile": "+ Krijo profil të ri…", - "current_phase": "Faza aktuale", - "curves": "Kurbat", - "cycle": "Cikël", - "cycle_date_display": "Shfaqja e datës së ciklit", - "cycle_health": "Shëndeti i ciklit", - "cycle_index": "indeksi i ciklit →", - "cycles": "Ciklet", - "cycles_count": "Cikle", - "cycles_lc": "cikle", - "dashed": "me vija", - "date": "Data", - "debug_traces": "Gjurmë korrigjimi", - "default": "Parazgjedhja", - "default_access_level": "Niveli i parazgjedhur për përdoruesit e palistuara më poshtë", - "default_other": "Parazgjedhja (pajisje të tjera)", - "default_tab": "Skeda e parazgjedhur kur hapet paneli", - "delta": "Δ", - "description": "Përshkrimi", - "dtw_blend_w": "Pesha e përzierjes", - "dtw_blended": "Rezultati i përzier", - "dtw_ddtw": "Rezultati DDTW", - "dtw_l1": "Rezultati L1", - "dtw_matched_profile": "(profili i përputhur i ciklit)", - "duration": "Kohëzgjatja", - "duration_agreement": "Përputhja e kohëzgjatjes", - "emphasis": "Theksimi", - "enable_access_control": "Aktivizo kontrollin e aksesit për çdo përdorues", - "energy": "Energjia", - "energy_agreement": "Përputhja e energjisë", - "event_timeline": "Kronologjia e ngjarjeve", - "event_type": "Lloji i ngjarjes", - "expected": "I pritshëm", - "expected_duration": "Kohëzgjatja e pritshme (min)", - "file_kb": "Skedari (kB)", - "final_score": "Rezultati përfundimtar", - "from": "Nga", - "gap_s": "Ndërrimi (s)", - "group_name": "Emri i grupit", - "head_trim": "Prerja e kreut (s)", - "health": "Shëndeti", - "hide_tabs": "Fshih skedat për jo-administratorët", - "in_use": "Në përdorim", - "json_data": "Të dhëna JSON", - "label": "Program i përputhshëm", - "last": "Të fundit", - "last_checked": "Kontrolluar herën e fundit:", - "load_from_file": "Ngarko nga skedari", - "mae_score": "Rezultati MAE", - "manual_duration": "Kohëzgjatja manuale (min, opsionale)", - "match": "Përputhje", - "members": "Anëtarë", - "metric": "Metrika", - "mode_existing_profile": "Shto te profili ekzistues", - "mode_new_profile": "Krijo profil të ri", - "models_fine_tuned": "({count} model{plural} të sintonizuar)", - "n_classic_suggestions": "{n} klasike", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} të zgjedhura", - "n_tuning_suggestions": "{n} sugjerim rregullimi", - "na": "s'ka", - "new_profile_name": "Emër i ri profili", - "notes": "Shënime", - "of": "nga", - "outcome": "Përfundimi", - "panel_default_tab": "Skeda e parazgjedhur", - "panel_language": "Gjuha e panelit", - "per_cycle_short": "cikël", - "pg_anti_wrinkle": "Kundër rrudhave", - "pg_autofill_tip": "Mbush automatikisht intervalin nga vlera aktuale ({lo}–{hi})", - "pg_best_value": "Vlera më e mirë e gjetur", - "pg_current_value": "Vlera aktuale:", - "pg_drag_hint": "Tërhiqni vijën në grafik", - "pg_dtw": "DTW", - "pg_ev_ending": "Duke përfunduar", - "pg_ev_running": "Në punë", - "pg_group_advanced": "Rastet e veçanta", - "pg_group_detection": "Nxitësit e zbulimit", - "pg_group_timing": "Rregullat e kohës", - "pg_idle": "Joaktiv", - "pg_last_run": "Ekzekutimi i fundit: {date}", - "pg_match_score": "Rezultati i përputhjes", - "pg_pct_of": "{p}% e {total}", - "pg_poor_match": "Përputhje e keqe", - "pg_strong_match": "Përputhje e fortë", - "pg_tile_ambiguous": "Të paqarta", - "pg_tile_ambiguous_tip": "Cikle me barazim të afërt midis dy programeve", - "pg_tile_detected": "Të zbuluara", - "pg_tile_detected_tip": "Cikle ku fuqia e kaloi pragun e fillimit mjaftueshëm gjatë sa të regjistrohej si në punë", - "pg_tile_matched": "Të përputhura", - "pg_tile_matched_tip": "Cikle të atribuara saktë një programi të njohur", - "pg_time_left": "Koha e mbetur", - "pg_weak_match": "Përputhje e dobët", - "phase_name": "Emri", - "phase_timeline": "Kronologjia e fazave", - "power": "Fuqia", - "profile": "Profili", - "profile_index": "indeksi i profilit →", - "profile_name": "Emri i profilit", - "program": "Program", - "program_tip": "Anuloni profilin që përputhet me ciklin aktual. Zbulimi automatik lejon integrimin të zgjedhë automatikisht përputhjen më të mirë. Fiksoni një program specifik për të detyruar përputhjen kur zbulimi automatik është i gabuar ose e dini çfarë po funksionon.", - "progress": "Progresi", - "raw_socket": "Fole e papërpunuar", - "read_only": "Vetëm lexim", - "ref_cycle": "Cikli referues (opsionale)", - "refresh_interval": "Intervali i rifreskimit (s)", - "remaining": "I mbetur", - "reminder_every": "Kujto çdo (cikle)", - "remove_label": "- Hiq etiketën -", - "rename_profile": "Riemërto profilin", - "replay_duration": "Riluajtje", - "resulting_profile": "Profili rezultues", - "save_mode": "Modaliteti i ruajtjes", - "score": "Rezultati", - "score_breakdown": "Zbërthimi i rezultatit", - "seconds_from_start": "Sekonda nga fillimi", - "select_profile": "Zgjidh profilin", - "setting": "Cilësim", - "settings_a": "Cilësimet A (aktuale)", - "settings_a_short": "A", - "settings_advanced": "Të avancuara", - "settings_b": "Cilësimet B (provë)", - "settings_b_short": "B", - "settings_basic": "Bazë", - "settings_detail_level": "Niveli i detajeve të cilësimeve", - "settings_overrides": "Mbivendosjet e cilësimeve", - "show_debug": "Shfaq kartën e korrigjimit live në faqen e Statusit (besueshmëria, paqartësia, kandidatët kryesorë)", - "show_expected": "Shfaq mbivendosjen e kurbës së pritshme (profili i përputhshëm, portokalli)", - "show_raw": "Shfaq çelësin e të dhënave bruto të prizës në grafikun e fuqisë në kohë reale", - "sparkline": "Prirja e fundit e kohëzgjatjes së cikleve", - "stage2": "Etapa 2 – ngjashmëria bazë", - "stage3": "Etapa 3 – DTW", - "stage4": "Etapa 4 – përputhja", - "status": "Statusi", - "tail_trim": "Prerja e fundit (s)", - "timer_auto_pause": "Auto-pauzë", - "timer_min": "min", - "timer_msg_placeholder": "Mesazh (opsionale, {device}/{program}/{minutes})", - "to": "Deri", - "ungrouped": "I pagrupuar", - "unlabelled": "I paetiketuar", - "unlabelled_paren": "(i paetiketuar)", - "warp_path": "Rruga e deformimit", - "input": "Hyrje:", - "start": "Fillimi", - "end": "Fundi", - "unit_s": "(s)", - "reviewed_on": "shqyrtuar më {date}", - "unknown": "E panjohur", - "quality": "Cilësia", - "tags": "Etiketa", - "at": "në", - "pct_match_confidence": "{pct}% besueshmëri përputhjeje", - "ha_restarted": "HA u rinis", - "from_start": "Nga fillimi", - "to_end": "Deri në fund", - "click_to_select": "kliko për të zgjedhur", - "envelope": "Brezi", - "zoom_hint": "rrëshqit për zmadhim · klikim i dyfishtë për rivendosje", - "loading_paren": "(po ngarkohet…)", - "time_remaining": "~{v} të mbetura", - "no_duration": "pa kohëzgjatje", - "duration_avg": "~{v}m mesatare", - "name_placeholder": "(emri)", - "n_shown": ", {n} të shfaqura", - "cycles_title": "Ciklet ({n})", - "pg_detecting": "Po zbulohet", - "pg_best_marker": "Më i miri: {v}", - "pg_time_left_model": "Koha e mbetur (modeli)", - "pg_time_left_model_tip": "Koha e mbetur e vlerësuar nga modeli (vlerësuesi i fazës + përzierje ML), jo një numërim mbrapsht statik", - "phase": "Faza", - "pg_mode_simulate": "Simulo", - "pg_mode_history": "Testo në histori", - "pg_mode_sweep": "Skanim", - "pg_ev_detected": "U zbulua", - "pg_ev_match": "Përputhja u përcaktua", - "pg_ev_match_changed": "Përputhja ndryshoi", - "pg_ev_ambiguous": "E paqartë", - "pg_ev_unmatched": "Pa përputhje", - "pg_ev_notify_start": "Njoftim fillimi", - "pg_ev_notify_pre": "Njoftim afër përfundimit", - "pg_ev_notify_finish": "Njoftim përfundimi", - "pg_ev_notify_milestone": "Njoftim etape", - "pg_ev_notify_held": "Njoftimi u mbajt (orët e qeta)", - "pg_ev_finished": "Përfundoi", - "pg_ended": "Mbaroi", - "pg_proj_energy": "Energ. e parash.", - "pg_alert_overrun": "Zgjati më gjatë", - "pg_alert_underrun": "Zgjati më shkurt", - "pg_alert_did_not_finish": "Nuk përfundoi", - "pg_alert_false_end": "U nda në disa cikle", - "pg_alert_unmatched": "Pa përputhje", - "pg_alert_ambiguous": "Përputhje e paqartë", - "pg_alert_energy": "Anomali energjie", - "pg_newly_correct": "tani i saktë", - "pg_regressed": "u përkeqësua", - "pg_end_timing_changed": "koha e përfundimit ndryshoi", - "pg_vs_current": "vs aktuali", - "pg_fixed": "u rregullua", - "pg_broke": "u prish", - "pg_sweep_param": "Parametër", - "pg_objective": "Objektivi", - "pg_steps": "Hapat", - "pg_stress_group": "Testi i ndërprerjes me gjendje statike", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "Niveli i gjendjes statike (W)", - "pg_stress_idle_w_desc": "Anuloni vlerën minimale të gjendjes statike të zbuluar automatikisht (lini bosh për automatik).", - "pg_stress_toggle": "Testo ndërprerjen me gjendje statike", - "pg_stress_toggle_desc": "Simulon pajisjen që qëndron në nivelin e konsumit të gjendjes statike pas përfundimit të regjistrimit - tregon nëse dhe kur WashData ndalon ciklin.", - "pg_sweep_2d": "Hartë nxehtësie 2D", - "pg_sweep_param_y": "Parametri 2", - "pg_obj_match": "Saktësia e përputhjes", - "pg_obj_endtiming": "Saktësia e kohës së përfundimit", - "pg_obj_falseend": "Shkalla e përfundimeve të rreme", - "pg_obj_overrun": "Devijimi i kohëzgjatjes", - "pg_obj_ambiguity": "Shkalla e paqartësisë", - "pg_best_combo": "kombinimi më i mirë", - "pg_mode_optimize": "Optimizo", - "pg_group_matching": "Përputhja e programeve", - "pg_zoom_hint": "klikoni dy herë për të rivendosur zmadhimin", - "aria_playground_chart2": "Grafik interaktiv i fuqisë së ciklit: kaloni kursorin për të lexuar kohën/fuqinë, rrëshqitni për të zmadhuar, tërhiqni për të lëvizur", - "pg_alert_timeout_end": "Përfundoi nga skadimi i kohës, jo nga parashikimi", - "pg_alert_indefinite": "Do të vazhdonte pafundësisht", - "pg_alert_stress_cap": "U arrit kufiri i sigurisë", - "pg_alert_stress_ok": "Ndërprerja e gjendjes statike: cikli u ndal", - "pg_alert_stress_warn": "Konsumi i gjendjes statike mbi pragun e ndalimit", - "task_pg_history": "Testo në histori", - "task_pg_sweep": "Optimizo", - "task_reprocess": "Ripërpunim", - "task_ml_training": "Mësim", - "eta_secs": "edhe ~{n} s", - "eta_mins": "edhe ~{n} min", - "pg_recent_runs": "Ekzekutimet e fundit", - "pg_load_run": "Ringarko këtë ekzekutim", - "pg_match_confidence": "Besueshmëria e përputhjes", - "pg_envelope_fit": "Përshtatja me zarfin", - "pg_envelope_fit_tip": "Sa mirë cikli qëndron brenda zarfit të ruajtur të fuqisë së këtij profili, një këndvështrim tjetër nga besueshmëria e përputhjes.", - "n_imported_note": ", {n} të importuar", - "enable_online": "Aktivizo veçoritë online", - "store_brand": "Marka e pajisjes", - "store_model": "Modeli i pajisjes", - "anonymous": "Anonim", - "rate_quality": "Vlerëso cilësinë", - "rate_n": "{n} yje", - "approved_only": "Vetëm të miratuara", - "adopt_settings": "Adopto edhe cilësimet", - "flags": "Flamuj", - "include_phase_map": "Përfshi hartën e fazave", - "include_settings": "Përfshi cilësimet e zbulimit dhe përputhjes", - "show_contributor": "Trego emrat e kontribuesve", - "task_pg_detail": "Simulimi i ciklit", - "task_split": "Ndarja e ciklit", - "task_trim": "Prerja e ciklit", - "task_merge": "Bashkimi i cikleve", - "task_rebuild": "Rindërtimi i zarfave", - "cat_profiles": "Profilet (programet)", - "cat_real_cycles": "Ciklet (historiku i punës)", - "cat_reference_cycles": "Ciklet e referencës (të importuara)", - "cat_custom_phases": "Faza të personalizuara", - "cat_profile_groups": "Grupet e profileve", - "cat_settings": "Cilësimet e zbulimit & njohjes", - "cat_matching_config": "Rregullimi i njohësit", - "cat_ml_models": "Modelet ML", - "cat_feedback": "Etiketat e reagimit & rishikimit", - "cat_suggestions": "Sugjerime", - "cat_maintenance_log": "Regjistri i mirëmbajtjes", - "cat_history_logs": "Historiku & regjistrat e ndryshimeve", - "cat_lifetime_stats": "Totalet e përgjithshme", - "cycles_short": "cikle", - "import_mode": "Si të kombinohen", - "mode_merge": "Bashko (mba të miat)", - "mode_replace": "Zëvendëso të zgjedhurat", - "cycle_destination": "Ku duhet të shkojnë ciklet e importuara?", - "dest_reference": "Referencë (vetëm forma)", - "dest_real_history": "Historik real (numërohet në statistika)", - "conflict_resolution": "Përplasjet e emrave", - "conflict_import_copy": "Importo si kopje", - "conflict_keep_mine": "Mba të miat", - "conflict_overwrite": "Mbishkruaj" - }, - "log": { - "all_levels": "Të gjitha nivelet", - "all_devices": "Të gjitha pajisjet", - "all_components": "Të gjithë komponentët", - "search_ph": "Kërko në regjistra…" - }, - "ml": { - "builtin_models": "● Duke përdorur modelet e integruara", - "fit_fair": "I pranueshëm", - "fit_good": "Mirë", - "fit_slight": "I lehtë", - "fit_strong": "I fortë", - "fit_weak": "I dobët", - "fit_word": "përshtatje", - "personalized": "● I personalizuar për këtë makinë", - "better_than_baseline": "{pct}% më mirë se vlerësimi bazë ({metric})", - "trend_improving_tip": "Përshtatja e këtij modeli është përmirësuar gjatë rikontrolleve të fundit.", - "trend_declining_tip": "Përshtatja e këtij modeli ka rënë gjatë rikontrolleve të fundit · shqyrtimi i më shumë cikleve mund ta ndihmojë të rimësojë.", - "trend_steady_tip": "Përshtatja e këtij modeli ka mbetur afërsisht e qëndrueshme gjatë rikontrolleve të fundit.", - "cap_blurb": { - "end": "Të dijë kur një cikël ka përfunduar vërtet", - "live_match": "Identifikimi më i shpejtë i programit në ekzekutim", - "quality": "Zbulimi i cikleve të gabuara ose të dëmtuara", - "remaining_time": "Parashikimi se sa kohë ka mbetur", - "total_energy": "Parashikimi i energjisë totale dhe kostos" - }, - "cap_label": { - "end": "Zbulimi i fundit të ciklit", - "live_match": "Njohja e programit", - "quality": "Kontrolli i cilësisë së ciklit", - "remaining_time": "Vlerësimi i kohës së mbetur", - "total_energy": "Vlerësimi i energjisë" - }, - "metric_auc": "AUC {auc} në të dhënat e vlerësimit", - "metric_mae": "gabimi: {model} kundrejt bazës {baseline}" - }, - "modal": { - "auto_label": "Etiketim automatik i cikleve", - "correct_feedback": "Korrigjo komentin", - "create_profile": "Krijo profilin", - "cycle": "Cikli", - "edit_group": "Modifiko grupin e profilit", - "edit_phase": "Modifiko fazën", - "import_config": "Importo konfigurimin", - "label_cycle": "Etiketoje ciklin", - "merge_cycles": "Bashko {n} cikle", - "new_group": "Grup i ri profilesh", - "new_phase": "Fazë e re", - "process_history_msg": "Riekzekutoni përputhjen, rifreskoni sugjerimet, stërvitni ML (nëse aktivizuara) dhe rillogaritni shëndetin e cikleve në të gjitha ciklet e ruajtura. Kjo mund të marrë pak kohë.", - "process_history_ok": "Proceso", - "process_history_title": "Proceso historinë", - "process_recording": "Proceso regjistrimin", - "delete_maintenance_msg": "Të fshihet ky regjistrim i mirëmbajtjes? Ky veprim nuk mund të zhbëhet.", - "delete_maintenance_title": "Fshi ngjarjen e mirëmbajtjes", - "relabel_cycles": "Rietiketo {count} cikle", - "delete_automation_title": "Fshi Automatizimin", - "delete_automation_msg": "Të fshihet automatizimi \"{name}\" nga Home Assistant? Kjo nuk mund të zhbëhet.", - "remove_legacy_title": "Hiq Veprimet e Vjetra", - "remove_legacy_msg": "Të hiqen veprimet e personalizuara të vjetra? Ato do të ndalojnë së aktivizuari në ngjarjet e cikleve. Kjo nuk mund të zhbëhet nga paneli.", - "discard_recording_title": "Hidh Poshtë Regjistrimin", - "discard_recording_msg": "Të hidhet poshtë regjistrimi i ruajtur? Kjo nuk mund të zhbëhet.", - "dismiss_all_title": "Injoro të Gjitha Reagimet", - "dismiss_all_msg": "Të injorohen të gjitha {count} kërkesat për reagim në pritje?", - "dismiss_all_ok": "Injoro të Gjitha", - "delete_phase_title": "Fshi Fazën", - "delete_phase_msg": "Të fshihet faza \"{name}\"?", - "clear_debug_title": "Pastro të Dhënat e Korrigjimit", - "clear_debug_msg": "Të fshihen të gjitha gjurmët e ruajtura të korrigjimit?", - "wipe_all_title": "Fshi të Gjitha të Dhënat", - "wipe_all_msg": "⚠️ Kjo fshin përgjithmonë TË GJITHA ciklet dhe profilet. Kjo nuk mund të zhbëhet.", - "wipe_all_ok": "Fshi Gjithçka", - "force_stop_title": "Ndalo me Forcë Ciklin", - "force_stop_msg": "Të ndalohet me forcë cikli aktiv tani? Cikli do të ruhet si i ndërprerë.", - "store_import": "Importo ciklin referues", - "store_share": "Ndaj në dyqanin e komunitetit", - "store_share_device": "Ndaj këtë pajisje", - "export_select": "Eksporto - zgjidh të dhënat", - "import_wizard": "Importo - zgjidh të dhënat" - }, - "msg": { - "appliance_monitor": "Monitor i pajisjes", - "artifact_dip_detail": "Ra nën brezin e zakonshëm të fuqisë për ~{n} s.", - "artifact_footer": "E theksuar në grafikun e mësipërm. Këto janë objekte kalimtare (p.sh. dera e hapur në mes të ciklit), jo domosdoshmërisht probleme.", - "artifact_header": "{n} anomali të zbuluara gjatë këtij cikli", - "artifact_pause_detail": "Fuqia ra pothuajse në zero për ~{n} s dhe u rikuperua – ndoshta dera u hap në mes të ciklit ose cikli u ndërpre.", - "artifact_spike_detail": "Shkoi mbi brezin e zakonshëm të fuqisë për ~{n} s.", - "auto_label_intro": "Cakto profile te ciklet e paetiketuara që besueshmëria e tyre e përputhjes tejkalon pragun.", - "automations_intro": "WashData ndez ngjarje {start} / {end} dhe ekspozon entitete, kështu njoftimet dhe veprimet ndërtohen më mirë si automatizime normale të Home Assistant. Automatizimi që përdorin këtë pajisje shfaqen më poshtë.", - "cleanup_intro": "Çdo cikël i etiketuar mbivendosur. Shëno outlier-ët dhe fshi për të pastruar profilin.", - "clear_debug_hint": "Hiqni të dhënat e ruajtura të korrigjimit për të liruar hapësirën.", - "collecting_data": "Duke mbledhur të dhëna: nevojiten edhe {need} cikël{plural} para se të fillojë sintonizimi i imët ({current}/{min}).", - "compare_overlay_profiles": "Mbivendos profilet (të zbetura)", - "compare_profiles_tip": "Mbivendosni zarfat e tjerë të profileve në grafikun e mësipërm për të parë se cili i përshtatet më mirë këtij cikli.", - "compare_selected_cycles": "Ciklet e zgjedhura (solide) – shfaq / fshih", - "consider_new_profile": "Konsideroni krijimin e një profili të ri.", - "coverage_gap": "ciklet e fundit nuk kanë asnjë profil që përputhet ({pct}% e 30 të fundit).", - "coverage_gap_similar_cycles": "U gjetën {count} cikle të ngjashme të paetiketuara – krijo një profil për të filluar përputhjen.", - "cycles_deleted": "{count} cikël(e) u fshinë", - "enough_data": "Të dhëna të mjaftueshme për të mësuar ({current}/{min} cikle).", - "export_description": "Zgjidhni saktësisht cilat profile, cikle, cilësime dhe të tjera do të eksportohen në JSON, ose analizoni një skedar dhe importoni vetëm pjesët që dëshironi.", - "feedback_cycles_pending": "{n} cikël{s} për rishikim", - "feedback_prompt": "Konfirmo nëse ishte i saktë, korrigjo programin ose injorojë.", - "feedback_relabel_hint": "Rietiketimi i këtij cikli e zgjidh atë gjithashtu.", - "filter_by_profile": "Filtro sipas profilit…", - "group_modal_help": "Gruponi programe me të njëjtën formë që ndryshojnë në temperaturë/centrifugim (kohëzgjatja mund të ndryshojë). Përputhja shënon grupin si një kandidat dhe më pas zgjedh anëtarin më të përshtatshëm. Zgjidhni të paktën 2; mbivendosja tregon se sa të ngjashëm janë.", - "group_not_cohesive": "Këto profile nuk janë mjaft të ngjashme për t'u grupuar në mënyrë të besueshme, kështu që përputhja i trajton ato individualisht derisa të hiqni pjesën e jashtme ose të ndani grupin.", - "group_preview_hint": "Shënoni 2+ anëtarë për të parë dhe krahasuar kurbat e tyre të fuqisë.", - "import_intro": "Ngarko një skedar të eksportuar ose ngjit një ngarkesë JSON më poshtë.", - "legacy_actions_title": "Veprimi i personalizuar i trashëguar i {count} është ende duke u ekzekutuar", - "live_chart_loading": "Grafiku i fuqisë live shfaqet ndërsa mbërrijnë leximet.", - "loading": "Duke ngarkuar…", - "loading_curve": "Duke ngarkuar kurbën…", - "loading_settings": "Duke ngarkuar cilësimet…", - "log_buffer_hint": "Më i riu i pari · ruan 500 rekordet e fundit ha_washdata që nga rinisja · zvarrit skajin e poshtëm për të ndryshuar madhësinë.", - "maintenance_advisory": "Rritja e kohëzgjatjes/energjisë mund të tregojë nevojën e mirëmbajtjes së pajisjes (p.sh. heqja e gurëve, pastrimi i filtrit).", - "maintenance_due": "Mirëmbajtja e duhur: {items}", - "maintenance_intro": "Regjistroni servisimin që kryeni në këtë pajisje dhe merrni kujtesë kur çdo detyrë të jetë përsëri e nevojshme.", - "maintenance_load_error": "Nuk u ngarkuan dot të dhënat e mirëmbajtjes: {error}", - "maintenance_requires_access": "Mirëmbajtja dhe eksporti/importi kërkojnë akses të plotë.", - "manual_duration_hint": "Gjatësia mesatare/e pritshme e ciklit të profilit, e përdorur për vlerësimet e kohës së mbetur. Ndrysho për ta vendosur atë; duke e lënë të pandryshuar ruan vlerën aktuale.", - "matching_tuning_intro": "Gjatë të mësuarit, WashData rregullon gjithashtu sa shumë përputhja e programit peshohet sipas formës kundrejt kohëzgjatjes dhe energjisë.", - "merge_intro": "Ciklet e zgjedhura kombinohen në një (rend kronologjik; boshllëqet mbushen me 0 W). Zgjidhni profilin që rezulton.", - "ml_intro": "WashData vjen me modele inteligjente që funksionojnë menjëherë.", - "ml_learned_intro": "Modele të rregulluara mirë për këtë makinë.", - "ml_loading": "duke ngarkuar ML…", - "ml_settings_intro": "Dy çelësa të pavarur: njëri aplikon modelet ndërsa një cikël ekzekutohet, tjetri lejon WashData t'i rregullojë ato me kalimin e kohës.", - "name_first_program": "Keni cikle të mjaftueshme – emërtoni programin tuaj të parë për të nisur përputhjen.", - "near_duplicate_cluster": "u zbulua grupi i profilit pothuajse dublikatë. Grupimi lejon që përputhja të zgjedhë në mënyrë të besueshme midis pamjeve të ngjashme (p.sh. i njëjti program në temperaturë/centrifugim të ndryshëm).", - "no_cycles_match": "Asnjë cikël nuk përputhet me filtrin aktual.", - "no_cycles_profile": "Asnjë cikël për këtë profil.", - "no_cycles_selected": "Zgjidhni së pari të paktën një cikël.", - "no_cycles_yet": "Asnjë cikël i regjistruar ende.", - "no_device_selected": "Asnjë pajisje e zgjedhur.", - "no_devices": "Asnjë pajisje WashData e konfiguruar ende.", - "no_envelope": "Asnjë zarf ende - rindërtoni pas etiketimit të cikleve.", - "no_envelope_overlay": "Asnjë zarf i disponueshëm për mbivendosje.", - "no_fine_tuned": "Asgjë e rregulluar mirë ende – WashData po përdor modelet e integruara.", - "no_logs": "Asnjë regjistrim i mbajtur në bufer ende.", - "no_maintenance": "Ende nuk është regjistruar asnjë mirëmbajtje.", - "no_match_yet": "Asnjë tentativë përputhje ende - kjo plotësohet gjatë një cikli aktiv.", - "no_other_users": "Nuk u gjetën përdorues të tjerë të Asistentit në Shtëpi.", - "no_phases": "Asnjë fazë e përcaktuar.", - "no_phases_assigned": "Asnjë fazë e caktuar.", - "no_profiles_compare": "Asnjë profil për krahasim.", - "no_profiles_overlay": "Asnjë profil për mbivendosje.", - "no_profiles_yet": "Asnjë profil ende. Krijo një nga një cikël i etiketuar.", - "no_profiles_yet_short": "Asnjë profil ende.", - "no_settings_match": "Asnjë cilësim nuk përputhet me \"{q}\"", - "no_split_points": "Asnjë pikë ndarjeje ende.", - "no_suggestions": "Asnjë sugjerim aktiv.", - "notify_services_hint": "Përdorni ID-të e shërbimit {entity} (të ndara me presje për shumë). Variablat e shabllonit: {vars}.", - "old_actions_warning": "Konfiguruar me redaktuesin e vjetër të veprimeve (tani i hequr). Ato ende ndezin në ngjarjet e ciklit, por nuk mund të modifikohen më këtu. Shndërrojini ato në një automatizim normal ose hiqni ato.", - "onboarding_progress": "{n} / 3 cikle të vëzhguara", - "onboarding_watching": "Përdorni pajisjen normalisht – WashData po vëzhgon. Pas 3 cikleve, do të nisë përputhja e programeve.", - "pending_feedback": "Koment në pritje të zbulimit", - "performance_trend": "Tendenca e performancës ({n} cikle)", - "pg_analysis_empty": "Ngarkoni një cikël për të parë analizën e përputhjes.", - "pg_apply_confirm": "Të aplikohet vlera më e mirë: {label} = {value}?", - "pg_canvas_empty": "Zgjidhni një cikël më sipër, pastaj shtypni Ngarko për të parë gjurmën e tij të fuqisë.", - "pg_chart_caption": "Shkalla e zbulimit/përputhjes sipas vlerave të {param}", - "pg_match_rate": "{pct}% shkallë përputhjeje në {total} cikle", - "pg_restart_note": "Rinisni Home Assistant për të aktivizuar mjetet e simulimit.", - "pg_sim_progress": "{done} / {total} cikle", - "pg_starting": "Duke filluar…", - "pg_stress_synthetic": "simulimi i gjendjes statike fillon këtu", - "pg_sweep_intro": "Po sikur {param} të ishte ndryshe? Testoni {steps} vlera në {cycles} ciklet tuaja të fundit për të gjetur cilësimin ku përputhen saktë sa më shumë cikle.", - "pg_sweep_step": "Hapi {done} / {total}", - "pg_undetected": "{n} cikël{s} të pazbuluar", - "pg_verdict_bad": "Kërkon vëmendje: shumë cikle mbeten të pazbuluara.", - "pg_verdict_good": "Rregulluar mirë: shumica e cikleve identifikohen dhe përputhen saktë.", - "pg_verdict_ok": "I pranueshëm: disa cikle munguan. Provoni të ulni pragun e fillimit.", - "phase_catalog_intro": "Segmente të emërtuara të një cikli (Para-larje, Ngrohje, Centrifugim…). Caktojini ato profilit nga paneli i kontrollit.", - "phase_ranges_intro": "Intervalët e fazës (minuta nga fillimi i ciklit) mbivendosur mbi kurbën mesatare. Redakto vlerat për pamje paraprake live.", - "playground_intro": "Një zonë e sigurt provash për të riluajtur ciklet e kaluara me cilësime të ndryshme, për të krahasuar dy konfigurime krah për krah dhe për të inspektuar si përputhet një cikël me një profil. Asgjë këtu nuk i ndryshon të dhënat tuaja aktive derisa ta aplikoni shprehimisht.", - "playground_needs_restart": "Rinisni Home Assistant për të aktivizuar veglat e zonës së provave.", - "preferences_admin": "Preferencat, paneli dhe kontrolli i aksesit", - "preferences_adv": "Preferencat", - "prefs_personal": "Këto vlejnë vetëm për llogarinë tuaj të Asistentit në Shtëpi.", - "process_history_hint": "Riekzekutoni përputhjen në të gjitha ciklet e ruajtura, rifreskoni sugjerimet e sintonizimit, stërvitni modelet ML (nëse janë aktivizuara) dhe rillogaritni shëndetin e cikleve. Ekzekutoni këtë pas një grupi rishikimesh.", - "profile_deleted": "Profili u fshi", - "profile_poor_health_detail": "Ciklet e caktuara për këtë profil kanë forma jokonsistente ose besim të ulët. Merrni parasysh rindërtimin e zarfit ose rishikimin e cikleve të etiketuara.", - "profiles_intro": "Kliko një profil për statistika, faza dhe pastrim. Grupo programe pothuajse identike (të njëjtën formë/kohëzgjatje, temperaturë ose centrifugim të ndryshëm) kështu që përputhja zgjedh me besueshmëri ndërmjet tyre.", - "rbac_hint": "Kur çaktivizohet, çdo përdorues i Asistentit në Shtëpi ka akses të plotë (parazgjedhja). Administratorët kanë gjithmonë akses të plotë dhe mund të menaxhojnë të gjithë.", - "recent_logs": "Regjistrimet e fundit ha_washdata", - "recording_in_progress": "Regjistrimi në progres", - "reminders_intro": "Shfaq një kujtesë në panel pas kaq cikleve nga servisimi i fundit. Lëreni bosh ose 0 për ta çaktivizuar një kujtesë.", - "restart_gap_footer": "Evidentuar në grafik. Të dhënat e energjisë mungojnë për këto intervale; përputhja përdori vetëm lexime reale.", - "restart_gap_header": "{n} boshllëk rinisje të HA gjatë këtij cikli", - "restart_gap_item": "{dur} boshllëk", - "review_confirm_help": "Konfirmoni nëse ky cikël është zbuluar saktë. Komentet tuaja e trajnojnë modelin në kompjuterin tuaj - sa më shumë cikle të konfirmoni, aq më i mirë do të jetë përputhja dhe rezultatet shëndetësore. Mjafton një mirë/e keqe e shpejtë.", - "review_in_settings": "Rishiko në Cilësime", - "review_notes_placeholder": "Shënime (opsionale)", - "review_notes_tip": "Shënime me tekst të lirë për referencën tuaj. Nuk përdoret nga përputhja ose trajnimi.", - "review_profile_tip": "Programi i këtij cikli është etiketuar si. Nëse programi i zbuluar automatikisht ishte i gabuar, korrigjoni atë këtu - etiketimi mëson përputhjen për ciklet e ardhshme.", - "review_quality_tip": "Sa i pastër është ky cikël. Mirë = një shembull teksti i këtij programi; E keqe = e zbuluar por e zhurmshme ose atipike; I papërdorshëm = i zbuluar gabimisht (i bashkuar, i cunguar ose i rremë). Drejton rezultatin e shëndetit dhe cilat cikle lejohen për të trajnuar modelin.", - "review_recorded_tip": "Shënojeni këtë si një cikël referimi të zgjedhur vetë për programin e tij - i njëjti rol si një cikël i regjistruar manualisht. Ciklet e referencës mbahen gjithmonë, vendosin shabllonin që përputhet dhe nuk hiqen kurrë nga pastrimi. (Ky është flamuri \"i artë\"/regjistruar; të dy janë e njëjta gjë.)", - "review_tags_tip": "Flamujt opsionalë që përshkruajnë atë që shkoi keq me këtë cikël, kështu që trajnimi dhe pastrimi mund të jenë përgjegjës për këtë.", - "review_to_cycles": "Hap radhën e rishikimit të Cikleve", - "saving_triggers_reload": "Ruajtja aktivizon ringarkimin e integrimit. Njësitë HA mund të shfaqen shkurtimisht si të padisponueshme.", - "search_placeholder": "Kërko cilësime…", - "see_recorder": "Shiko veglën e regjistruesit më poshtë", - "setting_changed": "Ndryshuar nga {old} në {new} më {date}", - "settings_basic_note": "Po shfaqen cilësimet thelbësore. Kaloni te Të avancuara për listën e plotë.", - "shape_drift_advisory": "⚠ Zhvendosje forme", - "shape_drift_detail": "Modeli i energjisë i këtij profili ka ndryshuar me kalimin e kohës – mundësi të konsumit të pajisjes ose nevojë mirëmbajtjeje (p.sh. heqja e gurëve, pastrimi i filtrit).", - "show_all_settings": "Shfaq të gjitha cilësimet", - "showing_suggestions": "Po shfaq cilësimin e {count} me sugjerime.", - "split_intro": "Kliko grafikun për të shtuar ose hequr një pikë ndarjeje, ose zbulo automatikisht sipas ndërprerjeve. Çdo segment që rezulton mund të ketë profilin e tij.", - "storage_diagnostics": "Statistikat e ruajtjes, mirëmbajtja, eksporti/importi", - "sug_staged": "Vendosur {key} = {val}. Ruani për të aplikuar.", - "toast_auto_detect_enabled": "Zbulimi automatik u aktivizua", - "toast_auto_label_complete": "Etiketimi automatik u përfundua", - "toast_auto_label_failed": "Etiketimi automatik dështoi: {error}", - "toast_automation_failed": "Nuk mund të krijohej automatizimi: {error}", - "toast_automation_migrated": "Veprimet u migruan në një automatizim; hapet redaktori", - "toast_convert_failed": "Konvertimi dështoi: {error}", - "toast_create_failed": "Krijimi dështoi: {error}", - "toast_delete_failed": "Fshirja dështoi: {error}", - "toast_error": "Gabim: {error}", - "toast_failed": "Dështoi: {error}", - "toast_force_stop_failed": "Ndalimi i detyruar dështoi: {error}", - "toast_name_required": "Emri kërkohet", - "toast_no_automation": "Këtu nuk mund të krijohet automatizim", - "toast_profile_name_required": "Emri i profilit kërkohet", - "toast_program_set": "Programi u caktua: {program}", - "toast_rebuild_failed": "Rindërtimi dështoi: {error}", - "toast_resume_failed": "Rifillimi dështoi: {error}", - "toast_revert_failed": "Kthimi prapa dështoi: {error}", - "toast_reverted": "{key} u rikthye", - "toast_save_failed": "Ruajtja dështoi: {error}", - "trend_duration_longer": "Kohëzgjatja në tendencë më e gjatë ({pct}%/cikël) – mesatare e fundit {avg}", - "trend_duration_shorter": "Kohëzgjatja në tendencë më e shkurtër ({pct}%/cikël) - mesatare e fundit {avg}", - "trend_energy_down": "Tendenca e energjisë në rënie ({pct}%/cikël)", - "trend_energy_up": "Tendenca e energjisë në rritje ({pct}%/cikël) - mesatarisht kohët e fundit {avg}", - "trim_intro": "Zvarrit dorëzat e kuqe ose futo vlerat. Gjithçka jashtë dritares hiqet.", - "tuning_suggestions_available": "Ofrohet {count} sugjerim akordimi nga ciklet e vëzhguara. Ato shfaqen pranë fushave përkatëse.", - "unsure_detected_prefix": "WashData nuk është i sigurt se ka zbuluar", - "updated": "Përditësuar", - "warmup_badge": "Akoma duke mësuar ({done}/{needed} cikle)", - "warmup_detail": "Ky profil ka nevojë për {needed} cikle të etiketuara para se të fillojë përputhja automatike. Çdo cikël i konfirmuar e ndihmon të mësojë.", - "wipe_history_warning": "Fshini përgjithmonë të gjitha ciklet dhe profilet. Nuk mund të zhbëhet.", - "compare_overlay_tip": "Mbivendos brezat e profileve të mësuara për të parë se cilin program i ngjason secili cikël.", - "duration_trend_up_tip": "Kohëzgjatja në rritje ({pct}%/cikël)", - "duration_trend_down_tip": "Kohëzgjatja në rënie ({pct}%/cikël)", - "energy_trend_up_tip": "Energjia në rritje ({pct}%/cikël)", - "energy_trend_down_tip": "Energjia në rënie ({pct}%/cikël)", - "performance_trending": "Tendenca e performancës", - "pg_select_cycle_hint": "Zgjidh një cikël dhe kliko ↺ për ta ngarkuar", - "pg_sweep_progress": "Hapi {done} / {total}", - "pg_analysis_hint": "Zgjidh një cikël dhe kliko ↺ për të ngarkuar analizën.", - "diagnostics_load_failed": "Diagnostikat nuk u ngarkuan dot: {error}", - "manual_duration_ref_hint": "Përdoret vetëm kur nuk është zgjedhur asnjë cikël referues. Një cikël referues e cakton kohëzgjatjen sipas gjatësisë së vet.", - "toast_convert_rolled_back": "Konvertimi dështoi dhe u kthye mbrapsht (nuk mbeti asnjë automatizim): {error}", - "toast_convert_orphan": "Automatizimi u krijua, por pastrimi i veprimeve të vjetra dështoi. Mos provoni përsëri: hiqni veprimet e vjetra manualisht për të shmangur një automatizim të dyfishuar.", - "advisory_duration_trend_up": "Ciklet '{name}' po zgjaten gjithnjë e më shumë (rreth +{pct}% për cikël). Nëse sjellja e pajisjes ka ndryshuar, regjistrojeni sërish ose rindërtojeni këtë profil.", - "advisory_energy_trend_up": "'{name}' po konsumon gjithnjë e më shumë energji (rreth +{pct}% për cikël) - ia vlen ta kontrolloni pajisjen nëse kjo është e papritur.", - "advisory_poor_health": "'{name}' ka një rezultat të ulët përputhjeje - ciklet e tij të fundit ndryshojnë shumë ose përputhen dobët. Rishikoni ciklet e tij ose regjistrojeni sërish profilin që njohja dhe vlerësimet e kohës të mbeten të sakta.", - "advisory_shape_drift": "'{name}' ka devijuar ndjeshëm nga forma e tij fillestare e fuqisë. Sjellja e pajisjes mund të ketë ndryshuar me kalimin e kohës (p.sh. gëlqerëzim, konsumim). Merrni në konsideratë regjistrimin sërish të këtij profili me ciklet e fundit.", - "advisory_shape_drift_corr": "'{name}' ka devijuar ndjeshëm nga forma e tij fillestare e fuqisë (korrelacioni {corr}). Sjellja e pajisjes mund të ketë ndryshuar me kalimin e kohës (p.sh. gëlqerëzim, konsumim). Merrni në konsideratë regjistrimin sërish të këtij profili me ciklet e fundit.", - "pg_no_alerts": "Nuk u zbuluan probleme në këtë ekzekutim.", - "pg_override_active": "Po përdoren cilësimet tuaja të redaktuara kundrejt atyre aktuale", - "pg_history_intro": "Riluani ciklet tuaja të fundit përmes zbuluesit dhe përputhësit të vërtetë. Redaktoni fillimisht një cilësim zbulimi te Simulo për të parë këtu një krahasim para/pas.", - "pg_history_empty": "Shtypni Ekzekuto për të riluajtur ciklet tuaja.", - "pg_history_summary": "{detected}/{total} u zbuluan · {correct} u përputhën saktë", - "pg_sweep_no_metric": "Nuk ka mjaftueshëm të dhëna për të vlerësuar këtë objektiv.", - "pg_sweep_intro2": "Gjeni cilësimin që përmbush më mirë një objektiv në ciklet tuaja të fundit. Asgjë nuk ndryshon derisa ta zbatoni.", - "pg_running_history": "Po riluhen ciklet tuaja…", - "pg_running_sweep": "Po testohen vlerat në të gjithë ciklet tuaja…", - "pg_row_load_hint": "Ngarko këtë cikël në grafikun më sipër", - "pg_history_intro2": "Riluajini ciklet tuaja të fundit përmes detektorit dhe përputhësit real me cilësimet e mësipërme. Klikoni çdo rresht për të ngarkuar atë cikël në grafik; ndryshoni një cilësim për të parë një krahasim para/pas.", - "pg_simulating": "Po simulohet cikli…", - "pg_canvas_empty2": "Zgjidhni një cikël më sipër dhe shtypni Ekzekuto për ta simuluar. Pastaj kaloni kursorin për të lexuar vlerat, rrëshqitni për të zmadhuar dhe tërhiqni për të lëvizur.", - "pg_apply_settings_confirm": "Të ruhen këto {n} cilësime në këtë pajisje? {list}", - "pg_stress_terminated_detail": "U stabilizua në rreth {idle} W gjendje statike -- cikli përfundoi {h} orë {m} min më vonë përmes {reason}.", - "pg_stress_above_threshold_detail": "Konsumi i gjendjes statike (~{idle} W) është në ose mbi pragun efektiv të ndalimit ({stop} W) -- cikli nuk u regjistrua kurrë si i qetë. Për ta rregulluar, rrisni stop_threshold_w.", - "pg_stress_hit_cap_detail": "Cikli funksionoi {h} orë {m} min pa u ndalur -- u ndal me forcë nga kufiri i sigurisë. Konsumi i gjendjes statike {idle} W kundrejt pragut të ndalimit {stop} W.", - "no_logs_match": "Asnjë regjistrim nuk përputhet me këta filtra.", - "pg_analysis_hint2": "Zgjidhni një cikël dhe shtypni Ekzekuto për të ngarkuar analizën e përputhjes.", - "pg_analysis_empty2": "Shtypni Ekzekuto për të parë analizën e përputhjes.", - "imported_readonly": "Importuar nga dyqani i komunitetit. Shfaqet për referencë dhe përputhje. Nuk llogaritet në statistikat tuaja dhe nuk mund të redaktohet.", - "merge_no_imports": "Regjistrimet e importuara nuk mund të bashkohen në një cikël real. Çzgjidhni ato për t'i bashkuar.", - "store_enable_hint": "Aktivizoni veçoritë online te Cilësimet për të shfletuar dhe importuar ciklet referuese të komunitetit.", - "online_intro": "Ndani dhe shkarkoni cikle referuese me përdorues të tjerë të WashData. Të gjitha veçoritë online janë me zgjedhje dhe të çaktivizuara si parazgjedhje.", - "store_share_intro": "Ngarkoni këtë cikël referues që të tjerët me të njëjtën pajisje ta përdorin. Ai rishikohet para se të shfaqet publikisht.", - "online_intro_global": "Shfletoni dhe ndani regjistrime referuese me përdorues të tjerë të WashData dhe konfirmoni hyrjet e pajisjeve. Një lidhje vlen për të gjithë integrimin tuaj WashData; marka dhe modeli i pajisjes caktohen për çdo pajisje te seksioni Bazë. Të gjitha veçoritë online janë me zgjedhje dhe të çaktivizuara si parazgjedhje.", - "online_unavailable": "Veçoritë online nuk janë të disponueshme në këtë server.", - "store_picker_offline": "Aktivizoni veçoritë online te ingranazhi i cilësimeve për të zgjedhur nga katalogu i komunitetit.", - "pick_brand_first": "Zgjidhni së pari një markë pajisjeje.", - "model_not_found": "Ende nuk është në katalog.", - "connect_to_confirm": "Lidhuni te ingranazhi i cilësimeve për të konfirmuar ose vlerësuar.", - "adopt_settings_hint": "Mbishkruan pragun e zbulimit dhe përputhjes të kësaj pajisje me të ndarët. Njoftimet, entitetet dhe çmimi i energjisë nuk ndryshohen kurrë.", - "include_settings_hint": "Ndani pragjet e njohjes dhe përputhjes të kësaj pajisje (jo njoftimet, entitetet ose çmimin e energjisë). Adoptuesit zgjedhin nëse do t'i aplikojnë.", - "onboard_download": "Pajisje e re? Adoptoni një konfigurim të gatshëm (programe, cikle referimi dhe faza) nga një tjetër përdorues WashData me të njëjtën pajisje.", - "share_consent": "Konfirmoj se këto cikle u ekzekutuan normalisht deri në fund pa ndërprerje", - "share_device_none": "Nuk ka ende cikle të ndashme. Shënojeni një cikël të regjistruar ose të zgjedhur me dorë si cikël referimi (⭐) tek skeda Ciklet fillimisht.", - "share_guideline_naming": "Emërtoni çdo profil saktësisht siç tregohet në çezmën ose ekranin e pajisjes (p.sh. 'Cotton 40', 'Eco 60').", - "share_guideline_quality": "Ndani vetëm cikle që u kompletuan normalisht -- pa ndërprerje në mes të ciklit, ngjarje hapjeje dere, ose probleme me energji.", - "share_guideline_review": "Ngarkimi juaj fillon si në pritje dhe bëhet publik pasi anëtarë të mjaftueshëm të komunitetit e konfirmojnë.", - "share_guidelines_title": "Para se të ndani", - "store_download_device_intro": "Adoptoni çdo program të ndarë dhe ciklet e tij të referencës në pajisjen tuaj. Ciklet dhe statistikat tuaja të regjistruara nuk preken.", - "store_share_device_intro": "Ngarko {brand} {model} me ciklet e referencës që zgjidhni. Të tjerët me të njëjtën pajisje mund të adoptojnë programet tuaja. Hyrjet shqyrtohen para publikimit.", - "share_profile_no_cycles": "Nuk ka cikle referimi -- shënojeni një cikël si ⭐ tek skeda Ciklet për të përfshirë këtë profil", - "advisory_phase_inconsistent": "'{name}' duket se përzien programe ose temperatura të ndryshme - ciklet e tij ngrohin për periudha shumë të ndryshme kohore. Ndarja e tij në profile të veçanta (p.sh. sipas temperaturës) do të përmirësojë përputhjen dhe vlerësimet e kohës.", - "advisory_phase_inconsistent_title": "⚠ Ndoshta programe të përziera", - "export_select_intro": "Shënoni saktësisht çfarë të përfshihet. Zgjedhja e profileve pa ciklet e tyre gjithsesi eksporton një program të njohshëm (forma e mësuar e tij udhëton bashkë me të).", - "import_analyze_hint": "Ngarkoni një skedar të eksportuar (ose ngjisni JSON-in e tij). WashData e analizon dhe tregon saktësisht çfarë mund të importohet përpara se të ndryshojë çdo gjë.", - "analyzing": "Duke analizuar…", - "device_type_mismatch_warn": "Ky eksport është nga një tip tjetër pajisjeje ({src} ndaj {local}). Programet dhe ciklet mund të importohen gjithsesi si të dhëna reference, por cilësimet specifike të pajisjes dhe importimi i historikut real janë çaktivizuar.", - "merge_hint": "Artikujt e importuar shtohen; asgjë lokale nuk humbet. Përplasjet e emrave zgjidhen më poshtë.", - "replace_warn": "Çdo kategori e shënuar fshihet dhe zëvendësohet nga skedari. Kategoritë e pashënuara mbeten të paprekura.", - "dest_reference_hint": "Ciklet e importuara vetëm përmirësojnë njohjen e programit dhe nuk ndikojnë kurrë në statistikat e përdorimit/energjisë.", - "dest_real_history_hint": "Ciklet e importuara llogariten si historik i vetë kësaj pajisjeje dhe ushqejnë statistikat e energjisë/përdorimit. Përdoreni për të zhvendosur një pajisje në një instalim të ri." - }, - "phase_desc": { - "anti_crease": "Rrotullime të shkurtra të herëpashershme pas përfundimit për të reduktuar rrudhat.", - "anti_wrinkle": "Rrotullimi periodik pas ciklit për të reduktuar rrudhat.", - "cool_down": "Rrotullimi pa ngrohje afër fundit të ciklit.", - "drain_and_switch": "Periudha e tranzicionit nga mënyra e larjes në tharje.", - "dry": "Faza e tharjes duke përdorur ngrohës dhe/ose nxehtësi të mbetur.", - "drying": "Periudha kryesore e tumbullimit me ngrohje.", - "heat_up": "Ngrohja fillestare e ngrohësit përpara se të fillojë tharja e plotë.", - "pre_rinse": "Spërkatja fillestare përpara larjes me detergjent.", - "pre_wash": "Thithja fillestare ose trajtimi paraprak përpara larjes kryesore.", - "rinse": "Faza e shpëlarjes me ujë të pastër. Kjo fazë mund të përsëritet disa herë.", - "sanitize": "Faza e pastrimit me temperaturë të lartë për programet e higjenizimit.", - "sensor_check": "Pauzë e shkurtër me fuqi të ulët ndërsa matet thatësia.", - "soak": "Periudha e njomjes me aktivitet të ulët midis fazave aktive të larjes.", - "soak_dw": "Periudha e zgjatur e njomjes për tokë të rëndë.", - "spin": "Nxjerrja me shpejtësi të lartë për të hequr ujin nga ngarkesa.", - "spin_wd": "Nxjerrja me shpejtësi të lartë përpara kalimit të tharjes.", - "wash": "Cikli kryesor i larjes me lëvizjen e kazanit dhe ngrohje opsionale.", - "wash_dw": "Larja kryesore me detergjent me ngrohje." - }, - "placeholder": { - "add": "shto…", - "group_name": "p.sh. Pambuk 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "shto një shërbim njoftimi…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "shto një person…", - "phase_name": "p.sh. Paralandje", - "profile_name": "p.sh. Pambuk 40°C", - "maintenance_notes": "p.sh. u ndërrua filtri, u pastrua guarnicioni i derës", - "store_brand": "p.sh. Bosch", - "store_model": "p.sh. WAT28401" - }, - "pref": { - "date_absolute": "Absolute (p.sh. 14:32 më 2 Korrik)", - "date_relative": "Relative (p.sh. 2 orë më parë)", - "lang_auto": "Parazgjedhja e sistemit ({lang})", - "lang_en": "Anglisht", - "use_panel_default": "(parazgjedhja e panelit)" - }, - "quality": { - "bad": "E keqe", - "good": "Mirë", - "unusable": "E papërdorshme" - }, - "section": { - "anti_wrinkle": { - "intro": "Mënyra kundër rrudhave të rrobave zbulon pulsimet e tumblimit me fuqi të ulët pas fazës kryesore dhe i mban ato të lidhura me ciklin e përfunduar.", - "label": "Kundër rrudhave" - }, - "basic": { - "intro": "Identiteti kryesor dhe bazat që shumica e konfigurimeve i nevojiten.", - "label": "Bazike" - }, - "delay": { - "intro": "Zbulimi i nisjes së vonuar identifikon kur pajisja është ndezur por nuk ka filluar ende ciklin.", - "label": "Nisje e vonuar" - }, - "detection": { - "intro": "Si zbulohet fillimi, ekzekutimi dhe përfundimi i ciklit.", - "label": "Zbulim" - }, - "matching": { - "intro": "Si përputhen ciklet e përfunduara me profilet e mësuara dhe etiketohen.", - "label": "Përputhje" - }, - "ml_training": { - "intro": "Orari i ritrajnimit të mësimit automatik në pajisje dhe cilësimet e të dhënave.", - "label": "Trajnim ML" - }, - "notifications": { - "intro": "Kur dhe si njoftoheni për ngjarjet e ciklit.", - "label": "Njoftime" - }, - "timing": { - "intro": "Kadenca e sfondit, rojtari offline dhe mirëmbajtja.", - "label": "Kohëzgjatja dhe rojtar" - }, - "triggers": { - "intro": "Sinjalet e jashtme opsionale: aktivizues përfundimi, senzori i derës, çelësi i pauzës dhe kujtues për shkarkim.", - "label": "Aktivizues dhe dera" - }, - "phase_eta": { - "label": "Koha e Mbetur", - "intro": "Kohë e mbetur e ndërgjegjshme për fazat, për makinat gjatësia e ciklit të të cilave varet nga temperatura ose centrifugimi." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "Njihni pulset e shkurtra me fuqi të ulët që lëshon një tharëse pas fazës kryesore të nxehtësisë dhe mbajini të lidhura me ciklin e përfunduar në vend që t'i lexoni si cikle të reja.", - "label": "Aktivizo zbulimin kundër rrudhave" - }, - "anti_wrinkle_exit_power": { - "doc": "Fuqia duhet të bjerë nën këtë mes pulseve që modaliteti kundër rrudhave të qëndrojë aktiv.", - "label": "Pragu i fuqisë së daljes" - }, - "anti_wrinkle_idle_timeout": { - "label": "Hendeku maks. i pulseve", - "doc": "Sa gjatë mund të qëndrojë e qetë makina mes dy pulseve të rrotullimit para se të mbarojë modaliteti kundër rrudhave. Vendoseni mbi hendekun më të gjatë që lë tharësja juaj mes pulseve, përndryshe çdo puls i mëvonshëm lexohet si nisje e gabuar." - }, - "anti_wrinkle_max_duration": { - "doc": "Pulset më të gjata se kjo trajtohen si një cikël i vërtetë dhe jo si një rrëshqitje kundër rrudhave.", - "label": "Kohëzgjatja maks." - }, - "anti_wrinkle_max_power": { - "doc": "Një puls mbi këtë fuqi trajtohet si një cikël i ri i vërtetë, jo një rrëshqitje kundër rrudhave. Vendoseni pak mbi fuqinë e pulsit të rënies.", - "label": "Fuqia maks. kundër rrudhave" - }, - "auto_label_confidence": { - "doc": "Nëse rezultati i ndeshjes në fund të ciklit është në ose mbi këtë, programi etiketohet automatikisht pa ndonjë kërkesë konfirmimi. Rriteni atë për të kërkuar siguri më të lartë përpara etiketimit automatik; uleni atë për të automatizuar më shumë. Funksionon në lidhje me besimin e të mësuarit nën të.", - "label": "Besueshmëria e etiketimit automatik" - }, - "auto_maintenance": { - "doc": "Drejtoni mbajtjen e shtëpisë gjatë natës: rindërtoni zarfet e profilit, rillogaritni shëndetin e ciklit, krasitni gjurmët e korrigjimit dhe ruani ciklet më të fundit.", - "label": "Mirëmbajtje automatike (pastrimi nate)" - }, - "completion_min_seconds": { - "doc": "Ciklet më të shkurtra se kjo hidhen si cikle fantazmë (vrapime testimi, hapja e derës për të shtuar një çorape).", - "label": "Kohëzgjatja min. e ciklit" - }, - "delay_confirm_seconds": { - "doc": "Energjia duhet të qëndrojë në brezin e gatishmërisë për kaq shumë kohë përpara se pajisja të trajtohet si në pritje për të nisur në vend që të funksionojë.", - "label": "Sekonda konfirmimi" - }, - "delay_start_detect_enabled": { - "doc": "Zbuloni kur pajisja është e ndezur dhe është në pritje (fillimi me vonesë / gatishmëria), por nuk e ka filluar ciklin e saj, kështu që tërheqja e gatishmërisë nuk ngatërrohet me një cikël funksionimi.", - "label": "Aktivizo zbulimin e nisjes së vonuar" - }, - "delay_timeout_hours": { - "doc": "Ndaloni së prituri në modalitetin e nisjes me vonesë pas kaq shumë orësh dhe kthehuni në gjendje boshe, kështu që një makinë e lënë e ndezur, por nuk u ndez kurrë, nuk pret përgjithmonë.", - "label": "Orë kohe skadimi" - }, - "device_type": { - "doc": "Klasa e pajisjes. Vendos standardet e paracaktuara të ndjeshme të zbulimit (pragjet, vonesa jashtë vonesës, trajtimi në fund) të akorduara për atë lloj pajisjeje; ndryshoni atë vetëm nëse pajisja fillimisht ishte konfiguruar si lloji i gabuar.", - "label": "Lloji i pajisjes" - }, - "door_sensor_entity": { - "doc": "Sensori binar opsional i derës. Përdoret për të zbuluar kur pajisja është hapur/shkarkuar pas një cikli.", - "label": "Entiteta e sensorit të derës" - }, - "duration_tolerance": { - "doc": "Toleranca për vlerësimet e mbetura të kohës (reagimi i të mësuarit, jo përputhje). Nëse kohëzgjatja aktuale është brenda +/-X% e vlerësimit, ajo llogaritet si një përputhje e mirë.", - "label": "Toleranca e vlerësimit" - }, - "enable_ml_models": { - "doc": "Ndërsa një cikël funksionon, lërini modelet të përsosin rezultatet e drejtpërdrejta: një vlerësim më i qëndrueshëm i kohës së mbetur dhe energjisë/kostos, dhe një mbrojtës kundër ndalimit të parakohshëm në zbulimin e përfundimit (ai mund të vonojë ndonjëherë përfundimin, të mos përfundojë kurrë më herët dhe të jetë i kufizuar). Përdor modelet e tua të akorduara mirë kur janë të disponueshme, përndryshe ato të integruara. Off = vetëm logjika klasike e bazuar në fuqi (ende e besueshme).", - "label": "Apliko modele inteligjente gjatë ciklit" - }, - "end_energy_threshold": { - "doc": "Gjatë numërimit jashtë vonesës, energjia e akumuluar (vat x kohë) krahasohet me këtë prag. Nëse tejkalohet, numërimi mbrapsht rivendoset - duke i mbajtur bishtat kundër rrudhave dhe tharjen e lavastoviljes të lidhura me ciklin në vend që t'i shkurtoni ato. Rriteni nëse ciklet përfundojnë shumë herët gjatë ftohjes; uleni nëse zbulimi është i ngadaltë.", - "label": "Energjia e fundit" - }, - "end_repeat_count": { - "doc": "Numri i leximeve të njëpasnjëshme nën pragun e ndalimit të kërkuar para përfundimit të ciklit. 1 është e mirë për shumicën e prizave. Rriteni në 2-3 nëse spina juaj inteligjente raporton herë pas here një mostër të rreme me zero në mes të ciklit dhe ciklet tuaja mbarojnë para kohe.", - "label": "Numri i përsëritjeve të fundit" - }, - "energy_price_entity": { - "doc": "Sensori me çmimin aktual të energjisë elektrike për kWh (p.sh. një tarifë dinamike). Ka përparësi ndaj çmimit statik më poshtë. Çdo cikël ngrin çmimin në fuqi kur të përfundojë.", - "label": "Entiteta e çmimit të energjisë" - }, - "energy_price_static": { - "doc": "Çmimi fiks për kWh i përdorur për shifrat e kostos kur nuk është vendosur më sipër asnjë subjekt i çmimit të drejtpërdrejtë.", - "label": "Çmimi statik i energjisë (për kWh)" - }, - "energy_sensor": { - "doc": "Numërues kumulativ opsional i energjisë (total_increasing kWh/Wh, p.sh. matësi i vetë prizës për konsumin total). Kur vendoset, energjia e raportuar e çdo cikli merret nga diferenca e këtij numëruesi nga fillimi deri në fund, gjë që shmang nënllogaritjen që merrni nga integrimi i një sensori fuqie që raporton ngadalë. Kthehet te vlera e integruar nëse leximi mungon, njësia e tij është e panjohur, ose diferenca nuk është pozitive. Lëreni bosh për të vazhduar integrimin e sensorit të fuqisë.", - "label": "Entiteti i matësit të energjisë" - }, - "expose_debug_entities": { - "doc": "Publikoni entitete shtesë diagnostikuese HA (besimi i ndeshjes, paqartësia, të brendshmet e gjendjes). Off e mban listën e entiteteve të pastër për përdorim normal.", - "label": "Ekspono entitetet e korrigjimit" - }, - "external_end_trigger": { - "doc": "Sensori binar ndryshimi i gjendjes së të cilit shënon fundin e ciklit (p.sh. një kontakt \"e përfunduar\" i pajisjes ose një integrim shoqërues).", - "label": "Entiteta e aktivizuesit të jashtëm" - }, - "external_end_trigger_enabled": { - "doc": "Lëreni një sensor të jashtëm binar të sinjalizojë fundin e një cikli, përveç zbulimit të integruar të bazuar në fuqi.", - "label": "Aktivizo aktivizuesin e jashtëm të fundit" - }, - "external_end_trigger_inverted": { - "doc": "Trajtojeni fikjen e sensorit të këmbëzës (në vend të ndezjes) si sinjalin e fundit të ciklit.", - "label": "Invertoj aktivizuesin e jashtëm (aktivizoj kur FIKUR)" - }, - "learning_confidence": { - "doc": "Nëse rezultati i ndeshjes bie midis kësaj dhe \"Konfidencës me etiketë automatike\", një njoftim reagimi ju kërkon të verifikoni programin e identifikuar. Poshtë këtij rezultati ndeshja është shumë e pasigurt për t'u shfaqur. Duhet të mbahet nën Besueshmërinë e Etiketës Automatike.", - "label": "Besueshmëria e të mësuarit" - }, - "linked_device": { - "doc": "Futeni opsionalisht këtë pajisje WashData nën një pajisje tjetër (p.sh. spinën inteligjente) në regjistrin e pajisjes HA, e shfaqur si \"Connected via ...\".", - "label": "Grupo nën pajisje" - }, - "min_off_gap": { - "doc": "Nëse makina fiket për më pak se kjo kohë, sekuenca e ndezjes/fikjes/ndezjes trajtohet si një cikël i vazhdueshëm. Parandalon ndarjen e programeve të njomjes (makina fiket për disa minuta në mes të larjes) në dy cikle të veçanta. Vendoseni atë më të shkurtër se hendeku midis ngarkesave tuaja të pasme nëse dëshironi që ato të numërohen si cikle të veçanta. Parazgjedhjet e tipit të pajisjes mbrojnë pauzën tipike brenda ciklit për çdo pajisje.", - "label": "Hendeku min. i fikjes" - }, - "min_power": { - "doc": "Fuqia minimale absolute konsiderohet aktive. Leximet poshtë kësaj trajtohen si 0 W (në gatishmëri), duke filtruar ngarkesën fantazmë të prizave inteligjente dhe LED-ve në gatishmëri.", - "label": "Fuqia minimale" - }, - "ml_training_enabled": { - "doc": "Studioni periodikisht ciklet tuaja të rishikuara gjatë natës dhe rregulloni modelet me këtë makinë specifike. Një ndryshim mbahet vetëm kur me të vërtetë ka rezultate më të mira në ciklet e zgjatura, kështu që kjo mund të ndihmojë ose të mbetet e njëjtë - mos u regresoni kurrë.", - "label": "Mëso nga kjo makinë" - }, - "ml_training_hour": { - "doc": "Ora lokale e ditës (0-23) për të bërë rregullimin e saktë gjatë natës. Zgjidh një orë qetësie si p.sh. 2 (02:00).", - "label": "Mëso në orën" - }, - "ml_training_interval_days": { - "doc": "Ri-kontrolloni për përmirësime maksimumi një herë në kaq ditë.", - "label": "Kontrolloje më shumë çdo" - }, - "ml_training_min_cycles": { - "doc": "Prisni derisa të regjistrohen të paktën kaq shumë cikle përpara akordimit, kështu që ka mjaft për të mësuar.", - "label": "Ciklet e nevojshme fillimisht" - }, - "name": { - "doc": "Emri i shfaqur shfaqet në listën e integrimeve HA dhe regjistrin e pajisjes.", - "label": "Emri i pajisjes" - }, - "no_update_active_timeout": { - "doc": "Nëse nuk vijnë përditësime të energjisë për kaq gjatë funksionimit, supozoni se priza ka rënë jashtë linje dhe ndaloni me forcë për të shmangur një cikël zombie. 600 s i parazgjedhur lejon vonesën në re ose rrjetë.", - "label": "Koha e skadimit pa përditësim" - }, - "notify_before_end_minutes": { - "doc": "Dërgo një sinjalizim \"Pothuajse e përfunduar\" kur koha e mbetur e parashikuar bie nën këtë. 0 e çaktivizon atë.", - "label": "Alarm para fundit" - }, - "notify_channel": { - "doc": "Emri i kanalit të njoftimeve në Android për mesazhet e fillimit/live (kontrollon tingullin për kanal dhe përparësinë në aplikacionin celular). Blank përdor parazgjedhjen e aplikacionit shoqërues.", - "label": "Kanal Android (nisje/live)" - }, - "notify_cycle_timers": { - "doc": "Njoftimet në minuta specifike në një cikël (p.sh. për të shtuar zbutës). Mesazhi mbështet {device}, {program}, {minutes}. Aktivizo pauzën automatike për të ndalur në atë pikë dhe për të marrë një njoftim interaktiv me një buton Resume; rifilloni nëpërmjet panelit, shërbimit të ndalimit/rifillimit ose veprimit të njoftimit.", - "label": "Kohëmatës cikli" - }, - "notify_finish_channel": { - "doc": "Emri i kanalit të njoftimit në Android për mesazhin e përfundimit. Blank ripërdor kanalin start/live.", - "label": "Kanal Android (përfundim)" - }, - "notify_finish_message": { - "doc": "Trupi dërgohet kur përfundon një cikël. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. {time_finished} dhe {vs_typical} janë më të dobishmet këtu.", - "label": "Mesazh përfundimi" - }, - "notify_finish_services": { - "doc": "njofto.* shërbimet thirren kur përfundon një cikël. Shtoni një për objektiv; lëreni bosh për asnjë njoftim përfundimtar.", - "label": "Shërbime përfundimi" - }, - "notify_fire_events": { - "doc": "Gjithashtu aktivizoni ngjarjet ha_washdata_* në fillimin/mbarimin e ciklit në mënyrë që të mund të ndërtoni automatizimet tuaja.", - "label": "Aktivizo ngjarje HA për njoftime" - }, - "notify_icon": { - "doc": "Ikona opsionale mdi për njoftimin (p.sh. mdi: makinë larëse). Lëreni bosh për parazgjedhjen e platformës.", - "label": "Ikona e njoftimit" - }, - "notify_live_chronometer": { - "doc": "Trego një kohëmatës numërimi mbrapsht që përditësohet drejtpërdrejt në njoftim (në platformat që e mbështesin atë) në vend të një vlerësimi statik.", - "label": "Përdor kronometër live" - }, - "notify_live_interval_seconds": { - "doc": "Sa shpesh rifreskohen njoftimet e progresit të drejtpërdrejtë gjatë ekzekutimit të një cikli.", - "label": "Intervali i përditësimeve live" - }, - "notify_live_overrun_percent": { - "doc": "Nëse një cikël e kalon vlerësimin e tij me më shumë se kjo përqindje, dërgoni një alarm mbi tejkalimin.", - "label": "% tejkalimi para alarmit" - }, - "notify_live_services": { - "doc": "njoftime.* shërbimet thirrën për përditësime të drejtpërdrejta të progresit gjatë ekzekutimit të një cikli. Lëreni bosh për të çaktivizuar njoftimet e progresit të drejtpërdrejtë.", - "label": "Shërbime progres live" - }, - "notify_only_when_home": { - "doc": "Dërgoni njoftime vetëm kur të paktën një nga personat e lidhur (sipër) është në shtëpi.", - "label": "Njofto vetëm kur në shtëpi" - }, - "notify_people": { - "doc": "person.* entitete të përdorura nga \"Njofto vetëm kur në shtëpi\" për të vendosur nëse dikush është në shtëpi.", - "label": "Njerëzit (për Vetëm kur në shtëpi)" - }, - "notify_pre_complete_message": { - "doc": "Trupi i alarmit para përfundimit / gati së shpejti. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Mesazh para-përfundimi" - }, - "notify_reminder_message": { - "doc": "Trupi i kujtesës që rrobat ende presin të hiqen. Bosh përdor vlerën e paracaktuar të integruar. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Mesazh kujtues" - }, - "notify_start_message": { - "doc": "Trupi dërgohet kur fillon një cikël. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Mesazh nisje" - }, - "notify_start_services": { - "doc": "njofto.* shërbimet e thirrura kur fillon një cikël. Shto një për objektiv (telefon, panel, etj.); lini bosh pa njoftim për fillim.", - "label": "Shërbime nisje" - }, - "notify_timeout_seconds": { - "doc": "Hiq automatikisht njoftimin pas kaq shumë sekondash (në platformat që e mbështesin atë). 0 e mban atë derisa të hiqet manualisht.", - "label": "Mbylle automatikisht pas" - }, - "notify_title": { - "doc": "Titulli i njoftimit. Variablat shabllon: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "Titulli i njoftimit" - }, - "notify_unload_delay_minutes": { - "doc": "Minuta pasi përfundon një cikël përpara se të dërgoni alarmin rikujtues \"shkarkoni makinën\" ende në pritje. Vendosni 0 për të çaktivizuar kujtesën.", - "label": "Vonesë njoftimi për shkarkim" - }, - "off_delay": { - "doc": "Koha për të pritur pasi të bjerë energjia përpara se të deklaroni ciklin të përfunduar. Nëse rryma rifillon brenda kësaj dritareje, cikli vazhdon pa probleme - kjo lidh pauzat midis fazave të larjes. Enëlarëset kanë faza të gjata tharjeje (fikje për 20-60 min), kështu që vonesa e fikjes duhet ta kalojë atë për të mbajtur të gjithë larjen+tharjen si një cikël.", - "label": "Vonesë fikjeje" - }, - "pause_cuts_power": { - "doc": "Kur një cikël është në pauzë, fikni gjithashtu Entitetin e Ndërprerjes më poshtë. Vetëm për pajisjet, priza e të cilave mund të pritet në mënyrë të sigurt në mes të ciklit.", - "label": "Pauzë gjithashtu pret fuqinë (nëpërmjet çelësit)" - }, - "power_off_delay": { - "doc": "Sa kohë duhet të qëndrojë fuqia nën Pragun e fikjes së energjisë pasi një cikël të përfundojë përpara se gjendja të kthehet në „Fikur“. Përdoret vetëm kur Pragu i fikjes së energjisë është mbi 0. Kontrollohet në ritmin e sfondit, kështu që vonesa efektive rrumbullakoset lart deri te rrahja tjetër e skadimit të gjendjes.", - "label": "Vonesa e fikjes së energjisë" - }, - "power_off_threshold_w": { - "doc": "Zbulim opsional i gjendjes Fikur bazuar në fuqinë. Kur është mbi 0, pasi një cikël të ketë përfunduar dhe fuqia të qëndrojë nën këtë nivel për Vonesën e fikjes së energjisë, makina trajtohet si e fikur dhe gjendja kthehet në „Fikur“. Lëreni në 0 për ta çaktivizuar (parazgjedhja). Vendoseni mbi nivelin real të fikjes dhe nën Pragun e ndalimit dhe nën konsumin në gatishmëri të makinës suaj (e përfunduar, por ende e ndezur); nëse nuk është nën Pragun e ndalimit, ai injorohet. Kur aktivizohet, ai zëvendëson Vonesën e rivendosjes së progresit për kthimin në „Fikur“, kështu që një makinë e përfunduar qëndron në „Përfunduar/I pastër“ derisa të fiket vërtet.", - "label": "Pragu i fikjes së energjisë" - }, - "power_sensor": { - "doc": "Subjekti sensor që raporton fuqinë e drejtpërdrejtë në vat për këtë pajisje (p.sh. sensor.washer_power). I gjithë zbulimi i ciklit bazohet në këtë sinjal.", - "label": "Sensori i fuqisë" - }, - "profile_duration_tolerance": { - "doc": "Brezi +/- rreth një kohëzgjatjeje mesatare të profilit të përdorur gjatë përputhjes. 0.25 do të thotë që një profil 60 min përputhet me ciklet 45-75 min.", - "label": "Toleranca e kohëzgjatjes së profilit" - }, - "profile_match_interval": { - "doc": "Sa shpesh të provoni përputhjen e profilit gjatë një cikli vrapimi. 300 s (5 minuta) e parazgjedhur balancon shpejtësinë e zbulimit dhe CPU.", - "label": "Intervali i përputhjes" - }, - "profile_match_max_duration_ratio": { - "doc": "Gjatësia maksimale e ciklit në lidhje me profilin. 1.3 do të thotë që një cikël duhet të jetë nën 130% të kohëzgjatjes së profilit për t'u përshtatur.", - "label": "Raporti maks. i kohëzgjatjes" - }, - "profile_match_min_duration_ratio": { - "doc": "Gjatësia minimale e ciklit në lidhje me profilin. 0.9 do të thotë që një cikël duhet të jetë të paktën 90% e kohëzgjatjes së profilit për t'u përshtatur.", - "label": "Raporti min. i kohëzgjatjes" - }, - "profile_match_threshold": { - "doc": "Rezultati minimal i ngjashmërisë (0-1) kërkohet në fund të ciklit për të pranuar një identifikim programi. Ngrini atë për të zvogëluar identifikimin e gabuar; uleni nëse programet e makinës suaj nuk përputhen. Default 0.4 është një pikë fillestare konservatore.", - "label": "Pragu i përputhjes" - }, - "profile_unmatch_threshold": { - "doc": "Nëse një ndeshje e drejtpërdrejtë në mes të ciklit bie nën këtë rezultat, identifikimi paraprak pastrohet. Mbajeni atë pak më poshtë Pragut të Përputhjes në mënyrë që një rënie e shkurtër në ngjashmëri të mos e kthejë ekranin përsëri në të pashoq.", - "label": "Pragu i mosperputhjeve" - }, - "progress_reset_delay": { - "doc": "Pas përfundimit, mbajeni progresin në 100% për këtë kohë, në mënyrë që \"Përfunduar\" të jetë i dukshëm në panelet e kontrollit përpara se ta rivendosni në \"Idle\".", - "label": "Vonesë rivendosjeje të progresit" - }, - "pump_stuck_duration": { - "doc": "Sekonda një pompë mund të funksionojë vazhdimisht përpara se të shënohet si e mundshme e mbërthyer (ndiz ngjarjen e pompës së mbërthyer).", - "label": "Kohëzgjatja e pompës së bllokuar" - }, - "running_dead_zone": { - "doc": "Pas fillimit të një cikli, uljet e energjisë brenda kësaj dritareje nuk merren parasysh. Makinat larëse mbushen me ujë të ftohtë (duke rënë afër 0 W para ngrohjes) - pa këtë mbrojtje, faza e mbushjes duket si një fund cikli. Kjo NUK kapërcen të dhënat: gjurma e plotë e fuqisë regjistrohet nga T=0. Motori i sugjerimeve mat modelin aktual të nisjes së makinës suaj dhe e përmason atë automatikisht.", - "label": "Zona e vdekur e ekzekutimit" - }, - "sampling_interval": { - "doc": "Koha e pritshme midis leximeve të sensorit - përdoret për madhësinë e dritares së zbutjes dhe fillimin e debouncimit në mënyrë korrekte. Çdo përditësim i sensorit kapet pavarësisht nga kjo vlerë; ai kalibron vetëm llogaritjet e rrjedhës së poshtme. Motori i sugjerimeve mat kadencën aktuale të sensorit tuaj nga ciklet e kaluara dhe e vendos këtë automatikisht.", - "label": "Intervali i kampionimit" - }, - "save_debug_traces": { - "doc": "Ruani gjurmën e plotë të fuqisë dhe të dhënat e korrigjimit që përputhen për çdo cikël. I dobishëm për zgjidhjen e problemeve, por rrit madhësinë e ruajtjes.", - "label": "Ruaj gjurmët e korrigjimit" - }, - "smoothing_window": { - "doc": "Sa zbutet sinjali i fuqisë së papërpunuar. I ulët (2) është i përgjegjshëm, por i zhurmshëm; i lartë (5) zbut pikat, por shton vonesën.", - "label": "Dritarja e zbutjes" - }, - "start_duration_threshold": { - "doc": "Fuqia duhet të qëndrojë mbi pragun e fillimit për një kohë të gjatë për të konfirmuar një fillim të vërtetë, duke parandaluar kyçet e ndezjes/fikjes së sekondës nga fillimi i një cikli.", - "label": "Kohëzgjatja e nisjes" - }, - "start_energy_threshold": { - "doc": "Energjia (fuqia x koha) që pajisja duhet të konsumojë përpara se të FUNKSIONOJË. Një majë e shkurtër me fuqi të lartë ka energji shumë të ulët dhe injorohet, duke parandaluar fillimet e rreme.", - "label": "Energjia e nisjes" - }, - "start_threshold_w": { - "doc": "Fuqia duhet të rritet mbi këtë nivel për të konfirmuar se një cikël ka filluar. Vendosja e tij shumë e ulët shkakton nisje të rreme nga fuqia e gatishmërisë; programet shumë të larta dhe me fillim të ngadalshëm (mbushje e ftohtë) mungojnë. Motori sugjerues e vendos këtë pak mbi fuqinë aktive më të ulët të vërejtur të makinës.", - "label": "Pragu i nisjes" - }, - "stop_threshold_w": { - "doc": "Fuqia duhet të bjerë nën këtë nivel përpara se të fillojë numërimi mbrapsht i vonesës. Vendoseni atë nën pragun e fillimit - hendeku midis tyre është brezi i histerezës që parandalon dridhjen. Nëse vendoset shumë lart, fazat me fuqi të ulët (mbajtjet e shpëlarjes, kundër rrudhave) shkaktojnë gabimisht sekuencën përfundimtare.", - "label": "Pragu i ndalimit" - }, - "switch_entity": { - "doc": "Çelësi opsional i çaktivizuar në pauzë dhe përsëri ndizet kur rifillon, përdoret së bashku me \"Pauza gjithashtu ndërpret energjinë\".", - "label": "Entiteta e çelësit" - }, - "watchdog_interval": { - "doc": "Sa shpesh mbikëqyrësi i sfondit kontrollon për sensorë të bllokuar dhe afate kohore të kaluara. Parazgjedhja 30 s.", - "label": "Intervali i rojëtarit" - }, - "notify_milestone_message": { - "doc": "Mesazhi për njoftimin e piketës. Variablat shabllon: {device}, {cycle_count}.", - "label": "Mesazhi i piketës" - }, - "notify_milestones": { - "doc": "Numra ciklesh të ndarë me presje që, kur arrihen, aktivizojnë një njoftim festiv një herësh (p.sh. 50, 100, 500, 1000). Bosh çaktivizon njoftimet e piketave.", - "label": "Piketat e cikleve" - }, - "notify_quiet_end_hour": { - "doc": "Fundi i dritares mos shqetëso (0-23). Njoftimet e mbajtura dërgohen në këtë orë. Lëreni bosh për ta çaktivizuar.", - "label": "Fundi i orëve të qeta" - }, - "notify_quiet_start_hour": { - "doc": "Fillimi i një dritareje mos shqetëso (0-23). Njoftimet e përfundimit, kujtesat dhe njoftimet për rroba të pastra që do të aktivizoheshin gjatë orëve të qeta mbahen dhe dërgohen kur mbaron dritarja. Lëreni bosh për ta çaktivizuar. Mbështet dritare që kalojnë mesnatën (p.sh. fillimi 22, fundi 7).", - "label": "Fillimi i orëve të qeta" - }, - "peak_rate_message": { - "doc": "Tekst opsional i personalizuar për këshillën e tarifës së pikut, i shtuar te njoftimi i nisjes. Variablat shabllon: {device}, {price}. Bosh përdor vlerën e paracaktuar të integruar.", - "label": "Mesazhi i tarifës së pikut" - }, - "peak_rate_threshold": { - "doc": "Kur nis një cikël dhe çmimi aktual për kWh është në këtë vlerë ose mbi të, i shtohet një këshillë për tarifën e pikut njoftimit të nisjes. 0 ose bosh e çaktivizon këshillën.", - "label": "Pragu i tarifës së pikut (për kWh)" - }, - "dtw_bandwidth": { - "label": "Toleranca e përputhjes së formës", - "doc": "Sa mund ta shtrembërojë në kohë përputhësi një cikël që të përshtatet me formën e një programi të ruajtur. Vlera më e lartë toleron më shumë ndryshim shpejtësie; shumë e lartë rrezikon të përputhë programin e gabuar." - }, - "corr_weight": { - "label": "Pesha e formës kundrejt nivelit", - "doc": "Ekuilibri midis formës së kurbës dhe nivelit absolut të fuqisë gjatë vlerësimit të një përputhjeje. Vlera më e lartë favorizon formën; më e ulta favorizon përputhjen e nivelit të fuqisë." - }, - "duration_weight": { - "label": "Pesha e kohëzgjatjes", - "doc": "Sa fort preferohet një program, kohëzgjatja tipike e të cilit përputhet me këtë cikël." - }, - "energy_weight": { - "label": "Pesha e energjisë", - "doc": "Sa fort preferohet një program, konsumi tipik i energjisë i të cilit përputhet me këtë cikël." - }, - "store_brand": { - "label": "Marka e Pajisjes", - "doc": "Opsionale. Marka e pajisjes, e zgjedhur nga katalogu i komunitetit. Përdoret për të gjetur dhe ndarë regjistrime referuese përkatëse. Lëreni bosh nëse nuk përdorni veçoritë online." - }, - "store_model": { - "label": "Modeli i Pajisjes", - "doc": "Opsionale. Modeli i pajisjes, i zgjedhur nga katalogu i komunitetit sapo të caktohet një markë. Nëse modeli juaj nuk është në listë, mund ta shtoni në katalog." - }, - "show_contributor": { - "doc": "Shfaq atribuimin \"nga \" në pajisjet dhe ciklet referuese të komunitetit." - }, - "enable_phase_matching": { - "label": "Kohë e mbetur e ndërgjegjshme për fazat", - "doc": "Ndan çdo cikël që po funksionon në faza (ngrohje, larje, centrifugim) dhe shpërndan kohën e mbetur për çdo fazë, e përzier me vlerësimin klasik - duke u mbështetur te shpërndarja sipas fazave në fillim të ciklit dhe te vlerësimi klasik afër fundit. Kjo e personalizon numërimin mbrapsht sipas kohës që makina juaj në të vërtetë ngroh dhe punon, gjë që vihet re më së shumti në gjysmën e parë të një cikli. Off = vetëm vlerësimi klasik. Preket vetëm shfaqja e kohës së mbetur; përputhja e programeve dhe zbulimi i ciklit mbeten të pandryshuara." - }, - "keep_min_score": { - "label": "Rezultat Min. Përputhjeje", - "doc": "Rezultati minimal i ngjashmërisë që i nevojitet një kandidati për të qëndruar në garën e përputhjes. Parazgjedhja 0.1 është me qëllim lejuese - pranon edhe kandidatë të dobët dhe u lë etapave të mëvonshme të gjejnë përputhjen më të mirë. Rriteni për të eliminuar profilet e pamundshme herët; uleni për të zgjeruar grupin fillestar të kandidatëve." - }, - "dtw_blend": { - "label": "Përzierje Deformimi", - "doc": "Sa e zëvendëson rezultati i bashkimit DTW rezultatin bazë të Etapës 2. 0 = përdor vetëm rezultatin e Etapës 2, 1 = përdor vetëm rezultatin DTW, 0.5 (parazgjedhja) = përzierje e barabartë. Rriteni për t'u mbështetur më shumë në bashkimin e deformimit kur programet kanë nivele të ngjashme fuqie por modele të ndryshme kohore." - }, - "dtw_ensemble_w": { - "label": "Mix Ansambël DTW", - "doc": "Në modalitetin ansambël DTW (parazgjedhja), pesë për L1-e shkallëzuar kundrejt DTW derivativ (DDTW). 1.0 = gjithë shkallëzuar-L1, 0 = gjithë DDTW, 0.7 = parazgjedhja. Varianti shkallëzuar-L1 krahason nivelet e fuqisë; varianti derivativ reagon ndaj mënyrës sesi ndryshon fuqia me kalimin e kohës. Ansambëli kombinon të dyja." - }, - "dtw_ddtw_scale": { - "label": "Shkalla e Deformimit Derivativ", - "doc": "Distanca e gjysmë-ngopjes për vlerësimin e DTW derivativ. Rezultati gjysmohet kur distanca DDTW është e barabartë me këtë vlerë. Më i vogël = më i ndjeshëm ndaj ndryshimeve të formës. Parazgjedhja 30 është kalibruar për gjurmët tipike të fuqisë së pajisjeve. Ndikon vetëm mënyrat DTW ansambël dhe ddtw." - }, - "dtw_refine_top_n": { - "label": "Numri i Rafinimit DTW", - "doc": "Sa kandidatë të parë të Etapës 2 ri-vlerësohen nga DTW. DTW është më e shtrenjtë llogaritëse, kështu që aplikohet vetëm tek kandidatët N më të mirë. Parazgjedhja 5. Rriteni (në 7-9) nëse profili i saktë ndonjëherë arrin vetëm në vendin e 4-të ose 5-të pas Etapës 2 - DTW mund ta shpëtojë. Ulja e saj shpejton pak përputhjen." - }, - "duration_scale": { - "label": "Saktësia e Kohëzgjatjes", - "doc": "Ashpërsia e ndëshkimit të marrëveshjes së kohëzgjatjes së Etapës 4. Ky është raporti logaritmik në të cilin rezultati i marrëveshjes gjysmohet. Më i vogël = më i rreptë: një mospërputhje kohëzgjatjeje ndëshkon më shumë. Parazgjedhja 0.175 korrespondon me tolerancën e kohëzgjatjes rreth 18% në gjysmë-peshë. Çiftojeni me Peshën e Kohëzgjatjes." - }, - "energy_scale": { - "label": "Saktësia e Energjisë", - "doc": "Ashpërsia e ndëshkimit të marrëveshjes së energjisë së Etapës 4. Më i vogël = më i rreptë: një mospërputhje energjie ndëshkon më shumë. Parazgjedhja 0.25 është me qëllim më lejuese se Ashpërsia e Kohëzgjatjes sepse energjia ndryshon me ngarkesën. Çiftojeni me Peshën e Energjisë." - } - }, - "setting_group": { - "auto_labeling": { - "label": "Etiketim automatik" - }, - "cycle_end": { - "label": "Fundi i ciklit" - }, - "cycle_start": { - "label": "Fillimi i ciklit" - }, - "cycle_timers": { - "label": "Kohëmatës cikli" - }, - "data_management": { - "label": "Menaxhimi i të dhënave" - }, - "debug": { - "label": "Korrigjim" - }, - "dishwasher_end": { - "label": "Fundi i ciklit të pjatalarëses" - }, - "door_pause": { - "label": "Dera dhe pauzë" - }, - "dtw_refinement": { - "label": "Rafinim DTW" - }, - "duration_gates": { - "label": "Portat e kohëzgjatjes" - }, - "energy": { - "label": "Energji" - }, - "external_end_trigger": { - "label": "Aktivizues i jashtëm i fundit" - }, - "housekeeping": { - "label": "Mirëmbajtje" - }, - "match_scoring": { - "label": "Vlerësimi i përputhjes" - }, - "messages": { - "label": "Mesazhe" - }, - "power_off": { - "label": "Fikja e energjisë" - }, - "predictive_end": { - "label": "Fund parashikues" - }, - "schedule": { - "label": "Orar" - }, - "services": { - "label": "Shërbime" - }, - "signal_processing": { - "label": "Përpunimi i sinjalit" - }, - "thresholds_gap": { - "label": "Pragjet dhe hendeku" - }, - "timing": { - "label": "Kohëzgjatja" - }, - "unload_reminder": { - "label": "Kujtues shkarkimi" - }, - "watchdog": { - "label": "Rojtar" - }, - "quiet_hours_milestones": { - "label": "Orët e qeta dhe piketat" - }, - "device_info": { - "label": "Informacioni i pajisjes" - }, - "basic_configuration": { - "label": "Konfigurimi bazë" - } - }, - "status": { - "active": "Aktiv", - "all_statuses": "Të gjitha statuset", - "ambiguous": "I paqartë", - "auto_detect": "Zbulim automatik", - "clear": "I qartë", - "completed": "Përfunduar", - "fine_tuning": "duke rregulluar mirë…", - "force_stopped": "Ndaluar me forcë", - "idle": "Joaktiv", - "interrupted": "I ndërprerë", - "ready": "Gati për procesim", - "recording": "Regjistrim", - "training": "Duke stërvitut…", - "saving": "Po ruhet…", - "rebuilding": "Po rindërtohet…", - "analyzing": "Po analizohet…", - "resetting": "Po rivendoset…", - "reverting": "Po kthehet…", - "trimming": "Po pritet…", - "splitting": "Po ndahet…", - "deleting": "Po fshihet…", - "imported": "Importuar" - }, - "tab": { - "advanced": "I avancuar", - "diagnostics": "Diagnostikim", - "history": "Cikle", - "ml": "Trajnim ML", - "pp_cleanup": "Pastrim", - "pp_manage": "Menaxho", - "pp_overview": "Pasqyra", - "pp_phases": "Fazat", - "profiles": "Profile", - "settings": "Cilësimet", - "status": "Pasqyra", - "subtab_phase_catalog": "Katalog fazash", - "subtab_profiles": "Profile", - "maintenance": "Mirëmbajtja", - "playground": "Zona e provave", - "store": "Dyqani" - }, - "tag": { - "early_end": "Fund i hershëm", - "late_start": "Fillim i vonshëm", - "merged": "Cikle të bashkuara", - "noise": "Zhurmë", - "sensor_gap": "Ndërrimi i sensorit", - "split": "Cikël i ndarë", - "wrong_profile": "Profil i gabuar" - }, - "toast": { - "access_saved": "Kontrolli i aksesit u ruajt", - "all_wiped": "Të gjitha të dhënat u fshien", - "analysis_complete_none": "Analiza e plotë: asnjë sugjerim i ri", - "auto_label_complete": "Etiketimi automatik i plotë", - "automation_deleted": "Automatizimi u fshi", - "correction_submitted": "Korrigjimi u dërgua", - "cycle_deleted": "Cikli u fshi", - "cycle_force_stopped": "Cikli u ndalua me forcë", - "cycle_labelled": "Cikli u etiketua", - "cycle_paused": "Cikli u ndal", - "cycle_resumed": "Cikli u vazhdua", - "cycle_trimmed": "Cikli u prit", - "cycles_merged": "Ciklet u bashkuan", - "envelope_rebuilt": "Zarfi u rindërtua", - "envelopes_rebuilt": "Zarfet u rindërtuan", - "export_downloaded": "Eksporti u shkarkua", - "feedback_all_dismissed": "Të gjitha komentet u injoruan", - "feedback_confirmed": "Komenti u konfirmua", - "feedback_dismissed": "Komenti u injorua", - "group_deleted": "Grupi u fshi", - "group_name_required": "Kërkohet emri i grupit", - "group_saved": "Grupi u ruajt", - "import_successful": "Importimi u krye; integrimi po ringarkohet", - "json_required": "Kërkohen të dhëna JSON", - "legacy_removed": "Veprimet e trashëgimit u hoqën", - "logs_exported": "Regjistrat u eksportuan", - "matching_reverted": "Peshat e përputhjes u kthyen te parazgjedhjet", - "min_2_profiles": "Zgjidhni të paktën 2 profile për një grup", - "ml_training_no_improvement": "Trajnimi i plotë: baza e mbajtur (pa përmirësim)", - "models_reverted": "Modelet e pajisjes u kthyen te baza", - "name_required": "Kërkohet emri", - "no_split_found": "Nuk u gjetën ndërrimi të papunë për ndarje", - "panel_settings_saved": "Cilësimet e panelit u ruajtën", - "phase_name_required": "Kërkohet emri i fazës", - "phase_updated": "Faza u përditësua", - "phases_saved": "Fazat u ruajtën", - "preferences_saved": "Preferencat u ruajtën", - "profile_name_required": "Kërkohet emri i profilit", - "profile_renamed": "Profili u riemërtua", - "recording_discarded": "Regjistrimi u hodh poshtë", - "recording_saved": "Regjistrimi u ruajt te profili", - "recording_started": "Regjistrimi filloi", - "recording_stopped": "Regjistrimi u ndalua", - "review_saved": "Rishikimi u ruajt", - "settings_conflicts": "Korrigjoni konfliktet e theksuara të cilësimeve para ruajtjes.", - "settings_reverted": "Cilësimet u rivendosën; integrimi po ringarkohet", - "settings_saved": "Cilësimet u ruajtën; integrimi po ringarkohet", - "suggestions_applied": "Sugjerimet u zbatuan; integrimi po ringarkohet", - "suggestions_dismissed": "Sugjerimet u injoruan", - "apply_failed": "Aplikimi dështoi: {error}", - "delete_failed": "Fshirja dështoi: {error}", - "load_more_failed": "Nuk u ngarkuan dot më shumë: {error}", - "maint_add_failed": "Nuk u shtua dot ngjarja: {error}", - "maint_added": "Ngjarja e mirëmbajtjes u shtua", - "maint_delete_failed": "Nuk u fshi dot ngjarja: {error}", - "maint_deleted": "Ngjarja e mirëmbajtjes u fshi", - "relabel_done": "U rietiketuan {count} cikël(e)", - "relabel_failed": "Rietiketimi dështoi: {error}", - "reminders_save_failed": "Nuk u ruajtën dot kujtesat: {error}", - "reminders_saved": "Kujtesat e servisit u ruajtën", - "pause_no_cycle": "Nuk ka cikël aktiv për të ndalur", - "resume_no_cycle": "Nuk ka cikël të ndalur për të vazhduar", - "delete_partial_failed": "Disa artikuj nuk mund të fshiheshin dhe u rikthyen", - "pg_run_gone": "Ai ekzekutim nuk është më i disponueshëm.", - "task_cancelled": "U anulua.", - "processed": "U përpunuan {bits}", - "processed_cycles": "{n} cikël(e)", - "processed_suggestions": "{n} sugjerim(e)", - "processed_models": "{n} model(e) të promovuar", - "store_search_failed": "Kërkimi dështoi: {error}", - "store_connect_failed": "Lidhja dështoi: {error}", - "store_connected": "U lidh me dyqanin e komunitetit", - "store_disconnected": "U shkëput nga dyqani i komunitetit", - "store_error": "Gabim: {error}", - "store_unavailable": "Dyqani i komunitetit nuk është i disponueshëm.", - "store_pick_profile": "Zgjidhni një profil për t'u bashkuar", - "store_name_required": "Shkruani një emër profili", - "store_import_failed": "Importimi dështoi: {error}", - "store_imported": "Importuar në {profile}", - "store_program_required": "Shkruani një emër programi", - "store_no_appliance": "Vendosni së pari markën dhe modelin e pajisjes suaj te Cilësimet.", - "store_share_failed": "Ndarja dështoi: {error}", - "store_shared": "U nda në dyqanin e komunitetit, në pritje të rishikimit.", - "appliance_added": "Pajisja u shtua, në pritje të miratimit", - "thanks_confirming": "Faleminderit që konfirmuat", - "device_approved": "Miratuar nga komuniteti", - "rating_saved": "Vlerësimi i cilësisë u ruajt", - "brand_added": "Marka u shtua, në pritje të miratimit", - "profile_added": "Profili u shtua, në pritje të miratimit", - "saved_except_conflicts": "Ruajtur. Korrigjoni konfliktet e theksuara për të ruajtur pjesën tjetër.", - "share_device_none_sel": "Zgjidhni të paktën një cikël për të ndarë", - "store_device_downloaded": "{p} program(e), {c} regjistrim(e) shtuar", - "store_device_downloaded_phases": "{p} program(e), {c} regjistrim(e), {ph} hartë(a) fazash shtuar", - "store_device_downloaded_settings": "{p} program(e), {c} regjistrim(e), {ph} hartë(a) fazash, {s} cilësim(e) shtuar", - "store_device_shared": "{n} cikël(-ë) ndajur në dyqanin e komunitetit - në pritje të rishikimit.", - "store_device_shared_all_dup": "Të gjitha {n} ciklet ishin tashmë në dyqanin e komunitetit.", - "store_device_shared_partial": "{n} cikle ndajur; {failed} nuk u ngarkuan.", - "store_device_shared_some_dup": "{created} cikle ndajur; {dup} ishin tashmë në dyqan.", - "store_download_failed": "Shkarkimi dështoi: {error}", - "store_download_nothing": "Asgjë e re për të shkarkuar - ky konfigurim është tashmë në pajisjen tuaj.", - "export_selective_done": "Eksporti u shkarkua", - "import_selective_done": "U importuan {profiles} profil(e) dhe {cycles} cikël(cikle)" - }, - "suggestion": { - "both_agree": "WashData rekomandon", - "calibrated_label": "I kalibruar", - "observed_label": "I vëzhguar", - "impact": { - "auto_label_confidence": { - "higher": "Etiketimet automatike zvogëlohen; më shumë cikle shkojnë për rishikim", - "lower": "Etiketimet automatike rriten; disa mund të identifikohen gabim" - }, - "duration_tolerance": { - "higher": "Pranon gamë më të gjerë kohëzgjatjeje – përputhje më fleksibël", - "lower": "Kërkon përputhje më të ngushtë kohëzgjatjeje – më rigoroze por mund të refuzojë cikle të pazakonshme" - }, - "end_energy_threshold": { - "higher": "Mbyll vetëm ciklet që kanë konsumuar energji të konsiderueshme", - "lower": "Mbyll edhe ciklet e shkurtra ose me konsum të ulët energjie" - }, - "end_repeat_count": { - "higher": "Kërkon që sinjali i fundit të përsëritet më shumë herë – më i qëndrueshëm, pak më i ngadaltë", - "lower": "Mbyllet pas përsëritjeve më të pakta – detektim më i shpejtë, rrezik më i lartë mbylljeje false" - }, - "learning_confidence": { - "higher": "Mëson vetëm nga përputhjet me besueshmëri shumë të lartë – më e ngadaltë por më e besueshme", - "lower": "Mëson nga më shumë cikle; modeli mund të jetë më i zhurmshëm" - }, - "min_off_gap": { - "higher": "Nevojitet pushim më i gjatë para se të fillojë një cikël i ri", - "lower": "Pushimi i shkurtër nis ciklin e ri – rrotullimet e njëpasnjëshme mund të ndahen" - }, - "min_power": { - "higher": "Më pak e ndjeshme ndaj konsumit në gjendje pritjeje; mund të humbasë programe shumë të heshtura", - "lower": "Më e ndjeshme; mund të regjistrojë fuqinë e pritjes si aktivitet" - }, - "no_update_active_timeout": { - "higher": "Më shumë kohë para se të deklarohet cikli i bllokuar", - "lower": "Ndërpret ciklin e bllokuar më shpejt" - }, - "off_delay": { - "higher": "Më shumë kohë për pauza të pajisjes – trajton faza të gjata njomjeje ose tharjeje", - "lower": "Detektim më i shpejtë i fundit – i përshtatshëm për pajisje me ndezje/shuarje të qarta" - }, - "profile_match_threshold": { - "higher": "Konfirmon vetëm përputhjet me besueshmëri të lartë; më shumë cikle mbeten pa etiketë", - "lower": "Përputhet me më shumë cikle; disa mund të jenë paksa të gabuara" - }, - "running_dead_zone": { - "higher": "Injoron kumbëzat e shkurtra të fuqisë gjatë pushimit – më pak e ndjeshme ndaj zhurmës", - "lower": "Reagron ndaj shpërthimeve më të shkurtra të fuqisë – kap aktivitetin kalimtar të shpejtë" - }, - "start_threshold_w": { - "higher": "Shmang startet false nga kumbëzat e shkurtra të fuqisë", - "lower": "Kap programet me fuqi të ulët; mund të aktivizohet nga zhurma" - }, - "stop_threshold_w": { - "higher": "Mbyll ciklin më shpejt – mund të mbyllet gjatë një pauze", - "lower": "Pret më gjatë para mbylljes – redukton përfundimet e parakohshme" - }, - "watchdog_interval": { - "higher": "Lejon faza më të gjata të heshtura; më pak ndërprerje false", - "lower": "Kap ciklet e bllokuara më agresivisht" - } - }, - "reason": { - "auto_label_confidence": "Besueshmëria e percentilit të 15-të e {cycles} etiketave automatike që përdoruesi nuk i korrigjoi kurrë ({p15}).", - "completion_min_seconds": "Gjysma e kohëzgjatjes p05 të cikleve të pastra ({minutes} min) në {cycles} cikle; filtron ciklet e rreme.{excl}", - "dead_zone_batch": "Mbahet i shkurtër (dritarja mesatare e paqëndrueshmërisë në nisje në {cycles} cikle = {s}s) që një fund i vërtetë të zbulohet menjëherë.", - "dead_zone_from_dip": "Bazuar në një rënie të hershme të fuqisë të zbuluar në {s}s.", - "end_energy_default": "Baza e rekomanduar e paracaktuar për pragun e zhurmës në fund të ciklit.", - "end_energy_false": "Energjia p95 e fundit të rremë ({p95}Wh) në {cycles} cikle, e kufizuar në minimum në 0.2% të energjisë mesatare të ciklit ({floor}Wh).", - "end_energy_no_false": "Asnjë fund i rremë në {cycles} cikle; e kufizuar në minimum në 0.2% të energjisë mesatare të ciklit ({floor}Wh).", - "end_repeat_count": "{false}/{total} cikle të pastra ({pct}%) patën një pauzë të brendshme >60s që vazhdoi; kërkohen {val} konfirmim(e) fundi.", - "learning_confidence": "Besueshmëria p05 e {cycles} cikleve të etiketuara nga përdoruesi ({p05}); nën këtë vlerë, kërkohet verifikim.", - "match_interval": "Bazuar në ritmin e vëzhguar të përditësimit (mesatarja={median}s) * 10.", - "max_duration_ratio": "Bazuar në kohëzgjatjet e cikleve të etiketuara (p95={p95}).", - "min_active": "Bazuar në fuqinë minimale aktive ({min}W) të vëzhguar në ciklin e fundit.", - "min_duration_ratio": "Mbahet sa më i ulët që një program të njihet herët në cikël; pragjet e besueshmërisë dhe të paqartësisë parandalojnë konfirmimet e parakohshme.", - "min_off_gap": "Bazuar në {gaps} boshllëqe të vëzhguara ndërmjet cikleve (p05={p05}s). Kufiri minimal i pajisjes: {floor}s.", - "min_power": "40% e fuqisë aktive më të ulët p05 ({p05}W) në {cycles} cikle të pastra, duke e mbajtur pragun e fikjes nën konsumin real.{excl}", - "ml_auto_label": "Besueshmëria më e ulët që modeli i cilësisë e vlerësoi ende si të pastër (p10 e {cycles} cikleve të pastra = {p10}).", - "ml_end_repeat": "{false}/{total} cikle ({pct}%) patën një pauzë që zbuluesi i fundit e vlerësoi >50%; kërkohen {val} konfirmim(e) fundi.", - "ml_off_delay": "Pauza të konfirmuara nga zbuluesi i fundit: p95 {p95}s + 60s rezervë, nga {pauses} pauza të verifikuara nga modeli në {cycles} cikle (kufiri minimal {floor}s).", - "no_update_timeout": "Bazuar në ritmin e vëzhguar të përditësimit (p95={p95}s) * 20 (min. 60s).", - "off_delay_cadence": "Bazuar në ritmin e vëzhguar të përditësimit (p95={p95}s) * 5", - "off_delay_device_floor": "U përdor minimumi i sigurt specifik për pajisjen {device} ({floor}s).", - "off_delay_generic_floor": "U përdor minimumi i sigurt i përgjithshëm ({floor}s).", - "off_delay_pauses": "Përcaktuar që të zgjasë më shumë se pauzat e vërteta: pauza brenda ciklit p95 {p95}s + 60s rezervë, nga {pauses} pauza në {cycles} cikle të pastra (kufiri minimal {floor}s).", - "profile_match_threshold": "Besueshmëria p10 e {cycles} etiketave automatike të sakta ({p10}); kufi i sigurt i konfirmimit të drejtpërdrejtë.", - "sampling_interval": "Intervali mesatar i përditësimit i vëzhguar në {cycles} cikle të pastra ({si}s).{excl}", - "smoothing_window": "Përcaktuar që të zbusë ~30s leximesh me kampionim {si}s ({samples} kampione).", - "start_duration": "Mbahet i shkurtër (~një interval kampionimi {si}s) që zbulimi të fillojë sa më herët të jetë e mundur, duke injoruar njëkohësisht majat e një kampioni të vetëm.", - "thr_batch": "Mbahet pak mbi fuqinë aktive më të ulët p05 në {cycles} cikle ({p05}W) që një nisje të kapet sa më herët të jetë e mundur dhe pragu i ndalimit të mbetet nën fuqinë më të ulët të punës së makinës.", - "tol_per_profile": "p75 e variancës së kohëzgjatjes për profil në {profiles} profile ({cycles} cikle); profilet e qëndrueshme nuk penalizohen.", - "tol_pooled": "Bazuar në variancën e bashkuar të kohëzgjatjes së {cycles} cikleve të fundit të etiketuara (devijimi p95={dev}).", - "watchdog": "Mbahet sa më i ulët në mënyrë të sigurt (3x boshllëku i përditësimit p95 prej {p95}s, min. 30s) që bllokimet të kapen shpejt pa ndalime të rreme." - }, - "exclusions": { - "summary": "U përjashtuan {total} cikle të zbuluar gabimisht: {parts}.", - "reason": { - "force_stopped": "të ndalur me forcë", - "interrupted": "të ndërprerë", - "incomplete": "të papërfunduar", - "noise": "zhurmë", - "unlabeled": "pa etiketë", - "no_trace_short": "shumë të shkurtër për t'u inspektuar", - "high_start": "të nisur me fuqi të lartë", - "abrupt_end": "të përfunduar papritur", - "mid_restart": "të rinisur në mes të ciklit", - "no_power": "pa fuqi", - "no_active_power": "pa fuqi aktive" - } - } - }, - "trend": { - "down": "Tendencë rënëse", - "up": "Tendencë rritëse" - }, - "maint": { - "bearing_service": "Servisi i kushinetave", - "descale": "Heqja e gurëve", - "drum_clean": "Pastro tamburin", - "filter_clean": "Pastro filtrin", - "other": "Tjetër" - }, - "pg_desc": { - "completion_min_seconds": "Ekzekutimi më i shkurtër që llogaritet si cikël i vërtetë", - "end_repeat_count": "Lexime të ulëta radhazi para përfundimit", - "interrupted_min_seconds": "Ciklet e shkurtra shënohen si të ndërprera", - "min_off_gap": "Hendeku i nevojshëm për të ndarë dy cikle", - "off_delay": "Sekonda me fuqi të ulët para se të mbarojë cikli", - "start_duration_threshold": "Sekonda mbi prag për të konfirmuar nisjen", - "start_threshold_w": "Watt minimalë për t'u llogaritur si nisur", - "stop_threshold_w": "Nën këtë, makina llogaritet e fikur", - "anti_wrinkle_enabled": "Thith pulset e rrotullimit pas fazës kryesore në vend që t'i lexojë si cikle të reja", - "anti_wrinkle_exit_power": "Fuqia duhet të bjerë nën këtë mes pulseve që modaliteti kundër rrudhave të qëndrojë aktiv", - "anti_wrinkle_idle_timeout": "Koha e qetësisë e lejuar mes dy pulseve të rrotullimit para se të mbarojë modaliteti kundër rrudhave", - "anti_wrinkle_max_duration": "Një puls më i gjatë se ky e mbaron modalitetin kundër rrudhave dhe hap një cikël të ri", - "anti_wrinkle_max_power": "Një puls mbi këtë e mbaron modalitetin kundër rrudhave dhe hap një cikël të ri", - "dtw_bandwidth": "Etapa 3: brez deformimi Sakoe-Chiba (0 = DTW joaktiv; parazgjedhja 0.2 = 20% e gjatësisë së ciklit)", - "corr_weight": "Etapa 2: balancë mes formës së kurbës (korrelacion) dhe nivelit të fuqisë (MAE); parazgjedhja 0.45", - "duration_weight": "Etapa 4: sa fortë ndikon marrëveshja e kohëzgjatjes në rezultatin final (parazgjedhja 0.22)", - "energy_weight": "Etapa 4: sa fortë ndikon marrëveshja e energjisë në rezultatin final (parazgjedhja 0.22)", - "profile_match_min_duration_ratio": "Etapa 1: gjatësia minimale e ciklit si pjesë e kohëzgjatjes së profilit; parazgjedhja 0.1 (10%)", - "profile_match_max_duration_ratio": "Etapa 1: gjatësia maksimale e ciklit si pjesë e kohëzgjatjes së profilit; parazgjedhja 1.5 (150%)", - "keep_min_score": "Etapa 2: rezultati minimal për të qëndruar në garë; parazgjedhja 0.1 pranon përputhje të dobëta, etapat e mëvonshme zgjedhin më të mirën", - "dtw_blend": "Etapa 3: 0 = vetëm rezultati bazë, 1 = vetëm rezultati DTW, 0.5 = përzierje e barabartë (parazgjedhja)", - "dtw_ensemble_w": "Etapa 3 (modaliteti ansambël): pesë për L1-e shkallëzuar kundrejt DTW derivativ; parazgjedhja 0.7 favorizon nivelin e fuqisë", - "dtw_ddtw_scale": "Etapa 3: distanca e gjysmë-ngopjes DDTW; më e vogël = më e ndjeshme ndaj formës (parazgjedhja 30)", - "dtw_refine_top_n": "Etapa 3: kandidatë të rishënuara nga DTW; rriteni në 7-9 nëse profili i saktë renditet i 4-5 (parazgjedhja 5)", - "duration_scale": "Etapa 4: raporti logaritmik ku marrëveshja e kohëzgjatjes gjysmohet; më i vogël = ndëshkim më i rreptë (parazgjedhja 0.175)", - "energy_scale": "Etapa 4: raporti logaritmik ku marrëveshja e energjisë gjysmohet; më i vogël = ndëshkim më i rreptë (parazgjedhja 0.25)" - }, - "col": { - "profile_tip": "Emri i programit të përputhur. I paetiketuar do të thotë se asnjë profil nuk u përputh në fund të ciklit.", - "status_tip": "Përfundimi i ciklit: I përfunduar (fund natyror), I ndërprerë (rënie e menjëhershme e energjisë), I Ndaluar me Forcë (manual), ose Kërkon Shqyrtim (reagim në pritje).", - "date_tip": "Data dhe ora kur filloi cikli.", - "duration_tip": "Koha e plotë e ekzekutimit të ciklit nga fillimi deri në fund.", - "energy_tip": "Energjia e plotë e konsumuar (kWh). Llogaritur duke integruar fuqinë me kalimin e kohës.", - "cost_tip": "Kostoja e energjisë për këtë cikël, e ngrirë në përfundim duke përdorur çmimin në fuqi atëherë (energjia x çmimi për kWh). Vendos një çmim te Cilësimet për ta plotësuar.", - "confidence_tip": "Besueshmëria e përputhjes së profilit (0-100%). Sa afër përputhej kurba e fuqisë së ciklit me programin e identifikuar.", - "health_tip": "Shëndeti ML i ciklit (më lart = më mirë). Kliko një cikël për ta inspektuar dhe shqyrtuar.", - "flags_tip": "Flamujt e rishikimit, anomalive dhe burimit për ciklin. Vendosni miun mbi ikonë për detaje." - }, - "stat": { - "avg": "mesatare", - "min": "min {v}", - "max": "maks {v}", - "consistency": "qëndrueshmëri ±{v}", - "total": "gjithsej {v}", - "last_run": "ekzekutimi i fundit {v}", - "score": "rezultati {pct}%", - "duration_cv": "CV e kohëzgjatjes {pct}%", - "avg_confidence": "besueshmëria mesatare {pct}%" - }, - "pg_evd": { - "detected": "Zbuluesi njohu që kishte filluar një cikël.", - "match_commit": "Përputhësi zgjodhi një program me besueshmëri të mjaftueshme.", - "match_changed": "Programi kryesues ndryshoi ndërsa u pa më shumë nga cikli.", - "match_ambiguous": "Dy programe morën rezultate të afërta, prandaj përputhja ishte e pasigurt.", - "unmatched": "Asnjë program i ruajtur nuk i përshtatej këtij cikli.", - "notify_start": "Do të dërgohej një njoftim fillimi.", - "notify_pre_complete": "Do të dërgohej një njoftim «pothuajse gati».", - "notify_finish": "Do të dërgohej një njoftim përfundimi.", - "notify_milestone": "Do të dërgohej një njoftim për një moment kyç.", - "notify_held": "Një njoftim u mbajt për shkak të orëve të qeta.", - "finished": "Cikli arriti gjendjen përfundimtare dhe përfundoi." - }, - "store": { - "browse": "Shfleto", - "device": "Pajisja", - "favorites": "Të preferuarat", - "search_ph": "Kërko sipas markës ose modelit…", - "no_results": "Nuk u gjetën pajisje përkatëse. Provoni një kërkim tjetër.", - "n_programs": "{n} programe", - "n_cycles": "{n} cikle", - "no_programs": "Ende nuk ka programe të ndara për këtë pajisje.", - "no_cycles": "Ende nuk janë ndarë cikle referuese për këtë program.", - "anon": "anonim", - "uploaded_by": "Ndarë nga {name}", - "connected_as": "Lidhur si {name}", - "not_connected": "I palidhur. Lidhni një llogari GitHub për të ndarë ciklet tuaja.", - "import_new": "Profil i ri", - "import_merge": "Bashko me ekzistuesin", - "merge_target": "Bashko në profil", - "description": "Përshkrimi (opsionale)", - "contributed_by": "nga {name}", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "Ende pa vlerësime", - "website": "Faqja e dyqanit ↗", - "website_tip": "Hapni faqen e dyqanit komunitar" - }, - "settings": { - "gear": { - "title": "Cilësimet" - } - }, - "link": { - "manual": "Manuali ↗", - "add_appliance": "Shtoni pajisjen tuaj" - }, - "tip": { - "add_brand": "Marka nuk është në listë? Shtojeni në katalogun e komunitetit", - "add_appliance": "Modeli nuk është në listë? Shtoni pajisjen tuaj në katalogun e komunitetit", - "add_profile": "Shtoni një profil për këtë pajisje në sitin e komunitetit" - }, - "task": { - "reprocess": { - "matching": "Ripërpunim: përputhja e cikleve", - "golden": "Ripërpunim: shënimi i cikleve referues", - "suggestions": "Ripërpunim: sugjerime", - "ml_training": "Ripërpunim: trajnimi i ML-së", - "health": "Ripërpunim: shëndeti i cikleve" - }, - "pg_sweep": { - "optimize": "Optimizim: {param}" - }, - "pg_detail": { - "simulate": "Simulimi i ciklit" - }, - "split": { - "apply": "Ndarja e ciklit" - }, - "trim": { - "apply": "Prerja e ciklit" - }, - "merge": { - "apply": "Bashkimi i cikleve" - }, - "rebuild": { - "envelopes": "Rindërtimi i zarfave" - } - }, - "setup": { "hdr": { - "card": "Konfigurimi i pajisjes", - "healthy_chip": "Konfigurimi u kompletua" + "ab_comparison": "Krahasimi i cilësimeve A/B", + "access_control": "Kontrolli i aksesit", + "add_maintenance": "Shto ngjarje mirëmbajtjeje", + "automation_delete": "Fshi këtë automatizim", + "automation_needs_review": "Ky cikël ka nevojë për rishikim", + "automation_open": "Hap në redaktuesin e automatizimit", + "automation_review_this_cycle": "Rishiko këtë cikël", + "automations": "Automatizime", + "clear_debug": "Pastro gjurmët e korrigjimit", + "cycle_simulator": "Simulator ciklesh", + "diagnostics_pref": "Diagnostikim", + "display": "Shfaqje", + "dtw_inspector": "Inspektor DTW", + "export_import": "Eksporto / Importo", + "getting_started": "Fillimi", + "live_power": "Fuqia live", + "logs": "Regjistrat", + "logs_diagnostics": "Diagnostikim", + "maintenance": "Veprime mirëmbajtjeje", + "maintenance_log": "Regjistri i mirëmbajtjes", + "maintenance_reminders": "Kujtesa për servisin", + "manual_recording": "Regjistrim manual", + "manual_recording_tip": "Ekzekuto qëllimisht një cikël ndërkohë që WashData regjistron gjurmën e energjisë. Fillo pak para se pajisja të nisë, Ndalo kur të përfundojë, pastaj Proceso për ta ruajtur si profil me emër.", + "ml_learned": "Çfarë ka mësuar WashData", + "ml_matching_tuning": "Rregullim i hollë i përputhjes së programit", + "ml_settings_card": "Cilësimet", + "ml_smart_learning": "Të mësuarit inteligjent", + "my_preferences": "Preferencat e mia", + "no_automations": "Asnjë automatizim nuk i referohet kësaj pajisjeje ende.", + "panel_settings": "Cilësimet e panelit", + "param_sweep": "Skanim parametrash", + "pg_settings_source": "Burimi i cilësimeve", + "phase_catalog": "Katalog fazash", + "playground": "Zona e provave", + "process_history": "Historiku i procesit", + "settings_history": "Historiku i cilësimeve", + "status": "Statusi", + "status_graph": "Grafiku i statusit", + "storage_stats": "Statistikat e ruajtjes", + "test_history": "Testim mbi historikun", + "toggle_sidebar": "Ndrysho shiritin anësor të Asistentit në Shtëpi", + "tools_and_data": "Mjete dhe të dhëna", + "wipe_history": "Fshi historikun", + "recommendations": "Rekomandime ({n})", + "pg_detection_params": "Cilësimet e zbulimit", + "pg_timeline": "Kronologjia e ngjarjeve", + "pg_outcome": "Rezultati i simulimit", + "pg_across_cycles": "Në të gjithë ciklet tuaja", + "community_store": "Dyqani i Komunitetit", + "online_account": "Dyqani i Komunitetit dhe veçoritë online" }, - "phase0": { - "washer": "WashData tashmë po zbulon ciklet tuaja. Regjistroni ciklin tuaj të parë për të aktivizuar emrat e programeve dhe vlerësimet e kohës.", - "dishwasher": "WashData po vëzhgon. Lavatriçet e enëve kanë cikle komplekse – regjistrimi i ciklit tuaj të parë rekomandohet fuqimisht. Nëse një cikël i zbuluar zgjat shumë, përdorni redaktuesin e ciklit për ta prerë para se ta ruani si profil.", - "generic": "WashData po vëzhgon. Regjistroni ose etiketoni një cikël të zbuluar për të filluar ndërtimin e profileve." + "health": { + "fair": "Cilësi e pranueshme e profilit", + "good": "✓ Cilësi e mirë e profilit", + "poor": "⚠ Cilësi e keqe e profilit" }, - "phase1a": { - "labelled": "Fillim i mirë – programi juaj i parë është ruajtur. Për të dhëna sa më të pastra, merrni parasysh regjistrimin e ciklit tuaj të ardhshëm me veglën e regjistruesit." + "lbl": { + "actions": "Veprime", + "activity": "Aktivitet", + "administrators": "Administratorë", + "aria_compare_chart": "Grafiku i krahasimit të cikleve", + "aria_cycle_chart": "Kurba e fuqisë së ciklit", + "aria_envelope_chart": "Grafiku i zarfit të fuqisë së profilit", + "aria_phase_chart": "Grafiku i redaktuesit të fazave", + "aria_playground_chart": "Kurba e fuqisë së ciklit me pragje zbulimi të zvarritshme", + "aria_power_chart": "Grafiku i konsumit të fuqisë", + "aria_spaghetti_chart": "Kurbat e mbivendosura të fuqisë së cikleve", + "aria_sweep_chart": "Grafiku i rezultateve të skanimit të parametrave", + "artifact_anomaly": "Anomali", + "artifact_high_power": "Fuqi e lartë", + "artifact_interruption": "Ndërprerje", + "artifact_low_power": "Fuqi e ulët", + "auto_detect": "Zbulim automatik", + "auto_fine_tune_off": "rregullimi automatik i hollë çaktivizuar", + "auto_fine_tune_on": "sintonizimi i imët automatik aktiv (rreth {hour}:00)", + "avg_cost": "Kosto mesatare", + "change": "Ndryshim", + "clock_time": "Koha e orës", + "cohesion_good": "kohezion {pct}%", + "cohesion_low": "⚠ kohezion i ulët {pct}%", + "compare_profiles": "Krahaso me profilet", + "concurrency": "Njëkohshmëri", + "confidence": "Besueshmëria", + "confidence_threshold": "Pragu i besueshmërisë", + "correct_duration": "Korrigjo kohëzgjatjen (min, opsionale)", + "correct_profile": "Profili i korrigjuar", + "correlation": "Korrelacion", + "cost": "Kosto", + "create_new_profile": "+ Krijo profil të ri…", + "current_phase": "Faza aktuale", + "curves": "Kurbat", + "cycle": "Cikël", + "cycle_date_display": "Shfaqja e datës së ciklit", + "cycle_health": "Shëndeti i ciklit", + "cycle_index": "indeksi i ciklit →", + "cycles": "Ciklet", + "cycles_count": "Cikle", + "cycles_lc": "cikle", + "dashed": "me vija", + "date": "Data", + "debug_traces": "Gjurmë korrigjimi", + "default": "Parazgjedhja", + "default_access_level": "Niveli i parazgjedhur për përdoruesit e palistuara më poshtë", + "default_other": "Parazgjedhja (pajisje të tjera)", + "default_tab": "Skeda e parazgjedhur kur hapet paneli", + "delta": "Δ", + "description": "Përshkrimi", + "dtw_blend_w": "Pesha e përzierjes", + "dtw_blended": "Rezultati i përzier", + "dtw_ddtw": "Rezultati DDTW", + "dtw_l1": "Rezultati L1", + "dtw_matched_profile": "(profili i përputhur i ciklit)", + "duration": "Kohëzgjatja", + "duration_agreement": "Përputhja e kohëzgjatjes", + "emphasis": "Theksimi", + "enable_access_control": "Aktivizo kontrollin e aksesit për çdo përdorues", + "energy": "Energjia", + "energy_agreement": "Përputhja e energjisë", + "event_timeline": "Kronologjia e ngjarjeve", + "event_type": "Lloji i ngjarjes", + "expected": "I pritshëm", + "expected_duration": "Kohëzgjatja e pritshme (min)", + "file_kb": "Skedari (kB)", + "final_score": "Rezultati përfundimtar", + "from": "Nga", + "gap_s": "Ndërrimi (s)", + "group_name": "Emri i grupit", + "head_trim": "Prerja e kreut (s)", + "health": "Shëndeti", + "hide_tabs": "Fshih skedat për jo-administratorët", + "in_use": "Në përdorim", + "json_data": "Të dhëna JSON", + "label": "Program i përputhshëm", + "last": "Të fundit", + "last_checked": "Kontrolluar herën e fundit:", + "load_from_file": "Ngarko nga skedari", + "mae_score": "Rezultati MAE", + "manual_duration": "Kohëzgjatja manuale (min, opsionale)", + "match": "Përputhje", + "members": "Anëtarë", + "metric": "Metrika", + "mode_existing_profile": "Shto te profili ekzistues", + "mode_new_profile": "Krijo profil të ri", + "models_fine_tuned": "({count} model{plural} të sintonizuar)", + "n_classic_suggestions": "{n} klasike", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} të zgjedhura", + "n_tuning_suggestions": "{n} sugjerim rregullimi", + "na": "s'ka", + "new_profile_name": "Emër i ri profili", + "notes": "Shënime", + "of": "nga", + "outcome": "Përfundimi", + "panel_default_tab": "Skeda e parazgjedhur", + "panel_language": "Gjuha e panelit", + "per_cycle_short": "cikël", + "pg_anti_wrinkle": "Kundër rrudhave", + "pg_autofill_tip": "Mbush automatikisht intervalin nga vlera aktuale ({lo}–{hi})", + "pg_best_value": "Vlera më e mirë e gjetur", + "pg_current_value": "Vlera aktuale:", + "pg_drag_hint": "Tërhiqni vijën në grafik", + "pg_dtw": "DTW", + "pg_ev_ending": "Duke përfunduar", + "pg_ev_running": "Në punë", + "pg_group_advanced": "Rastet e veçanta", + "pg_group_detection": "Nxitësit e zbulimit", + "pg_group_timing": "Rregullat e kohës", + "pg_idle": "Joaktiv", + "pg_last_run": "Ekzekutimi i fundit: {date}", + "pg_match_score": "Rezultati i përputhjes", + "pg_pct_of": "{p}% e {total}", + "pg_poor_match": "Përputhje e keqe", + "pg_preset": "Konfigurimi i zonës së provave", + "pg_preset_name": "Emri i konfigurimit të ri", + "pg_preset_none": "Zgjidhni një konfigurim…", + "pg_strong_match": "Përputhje e fortë", + "pg_tile_ambiguous": "Të paqarta", + "pg_tile_ambiguous_tip": "Cikle me barazim të afërt midis dy programeve", + "pg_tile_detected": "Të zbuluara", + "pg_tile_detected_tip": "Cikle ku fuqia e kaloi pragun e fillimit mjaftueshëm gjatë sa të regjistrohej si në punë", + "pg_tile_matched": "Të përputhura", + "pg_tile_matched_tip": "Cikle të atribuara saktë një programi të njohur", + "pg_time_left": "Koha e mbetur", + "pg_weak_match": "Përputhje e dobët", + "phase_name": "Emri", + "phase_timeline": "Kronologjia e fazave", + "power": "Fuqia", + "profile": "Profili", + "profile_index": "indeksi i profilit →", + "profile_name": "Emri i profilit", + "program": "Program", + "program_tip": "Anuloni profilin që përputhet me ciklin aktual. Zbulimi automatik lejon integrimin të zgjedhë automatikisht përputhjen më të mirë. Fiksoni një program specifik për të detyruar përputhjen kur zbulimi automatik është i gabuar ose e dini çfarë po funksionon.", + "progress": "Progresi", + "raw_socket": "Fole e papërpunuar", + "read_only": "Vetëm lexim", + "ref_cycle": "Cikli referues (opsionale)", + "refresh_interval": "Intervali i rifreskimit (s)", + "remaining": "I mbetur", + "reminder_every": "Kujto çdo (cikle)", + "remove_label": "- Hiq etiketën -", + "rename_profile": "Riemërto profilin", + "replay_duration": "Riluajtje", + "resulting_profile": "Profili rezultues", + "save_mode": "Modaliteti i ruajtjes", + "score": "Rezultati", + "score_breakdown": "Zbërthimi i rezultatit", + "seconds_from_start": "Sekonda nga fillimi", + "select_profile": "Zgjidh profilin", + "setting": "Cilësim", + "settings_a": "Cilësimet A (aktuale)", + "settings_a_short": "A", + "settings_advanced": "Të avancuara", + "settings_b": "Cilësimet B (provë)", + "settings_b_short": "B", + "settings_basic": "Bazë", + "settings_detail_level": "Niveli i detajeve të cilësimeve", + "settings_overrides": "Mbivendosjet e cilësimeve", + "show_debug": "Shfaq kartën e korrigjimit live në faqen e Statusit (besueshmëria, paqartësia, kandidatët kryesorë)", + "show_expected": "Shfaq mbivendosjen e kurbës së pritshme (profili i përputhshëm, portokalli)", + "show_raw": "Shfaq çelësin e të dhënave bruto të prizës në grafikun e fuqisë në kohë reale", + "sparkline": "Prirja e fundit e kohëzgjatjes së cikleve", + "stage2": "Etapa 2 – ngjashmëria bazë", + "stage3": "Etapa 3 – DTW", + "stage4": "Etapa 4 – përputhja", + "status": "Statusi", + "tail_trim": "Prerja e fundit (s)", + "timer_auto_pause": "Auto-pauzë", + "timer_min": "min", + "timer_msg_placeholder": "Mesazh (opsionale, {device}/{program}/{minutes})", + "to": "Deri", + "ungrouped": "I pagrupuar", + "unlabelled": "I paetiketuar", + "unlabelled_paren": "(i paetiketuar)", + "warp_path": "Rruga e deformimit", + "input": "Hyrje:", + "start": "Fillimi", + "end": "Fundi", + "unit_s": "(s)", + "reviewed_on": "shqyrtuar më {date}", + "unknown": "E panjohur", + "quality": "Cilësia", + "tags": "Etiketa", + "at": "në", + "pct_match_confidence": "{pct}% besueshmëri përputhjeje", + "ha_restarted": "HA u rinis", + "from_start": "Nga fillimi", + "to_end": "Deri në fund", + "click_to_select": "kliko për të zgjedhur", + "envelope": "Brezi", + "zoom_hint": "rrëshqit për zmadhim · klikim i dyfishtë për rivendosje", + "loading_paren": "(po ngarkohet…)", + "time_remaining": "~{v} të mbetura", + "no_duration": "pa kohëzgjatje", + "duration_avg": "~{v}m mesatare", + "name_placeholder": "(emri)", + "n_shown": ", {n} të shfaqura", + "cycles_title": "Ciklet ({n})", + "pg_detecting": "Po zbulohet", + "pg_best_marker": "Më i miri: {v}", + "pg_time_left_model": "Koha e mbetur (modeli)", + "pg_time_left_model_tip": "Koha e mbetur e vlerësuar nga modeli (vlerësuesi i fazës + përzierje ML), jo një numërim mbrapsht statik", + "phase": "Faza", + "pg_mode_simulate": "Simulo", + "pg_mode_history": "Testo në histori", + "pg_mode_sweep": "Skanim", + "pg_ev_detected": "U zbulua", + "pg_ev_match": "Përputhja u përcaktua", + "pg_ev_match_changed": "Përputhja ndryshoi", + "pg_ev_ambiguous": "E paqartë", + "pg_ev_unmatched": "Pa përputhje", + "pg_ev_notify_start": "Njoftim fillimi", + "pg_ev_notify_pre": "Njoftim afër përfundimit", + "pg_ev_notify_finish": "Njoftim përfundimi", + "pg_ev_notify_milestone": "Njoftim etape", + "pg_ev_notify_held": "Njoftimi u mbajt (orët e qeta)", + "pg_ev_finished": "Përfundoi", + "pg_ended": "Mbaroi", + "pg_proj_energy": "Energ. e parash.", + "pg_alert_overrun": "Zgjati më gjatë", + "pg_alert_underrun": "Zgjati më shkurt", + "pg_alert_did_not_finish": "Nuk përfundoi", + "pg_alert_false_end": "U nda në disa cikle", + "pg_alert_unmatched": "Pa përputhje", + "pg_alert_ambiguous": "Përputhje e paqartë", + "pg_alert_energy": "Anomali energjie", + "pg_newly_correct": "tani i saktë", + "pg_regressed": "u përkeqësua", + "pg_end_timing_changed": "koha e përfundimit ndryshoi", + "pg_vs_current": "vs aktuali", + "pg_fixed": "u rregullua", + "pg_broke": "u prish", + "pg_sweep_param": "Parametër", + "pg_objective": "Objektivi", + "pg_steps": "Hapat", + "pg_stress_group": "Testi i ndërprerjes me gjendje statike", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "Niveli i gjendjes statike (W)", + "pg_stress_idle_w_desc": "Anuloni vlerën minimale të gjendjes statike të zbuluar automatikisht (lini bosh për automatik).", + "pg_stress_toggle": "Testo ndërprerjen me gjendje statike", + "pg_stress_toggle_desc": "Simulon pajisjen që qëndron në nivelin e konsumit të gjendjes statike pas përfundimit të regjistrimit - tregon nëse dhe kur WashData ndalon ciklin.", + "pg_sweep_2d": "Hartë nxehtësie 2D", + "pg_sweep_param_y": "Parametri 2", + "pg_obj_match": "Saktësia e përputhjes", + "pg_obj_endtiming": "Saktësia e kohës së përfundimit", + "pg_obj_falseend": "Shkalla e përfundimeve të rreme", + "pg_obj_overrun": "Devijimi i kohëzgjatjes", + "pg_obj_ambiguity": "Shkalla e paqartësisë", + "pg_best_combo": "kombinimi më i mirë", + "pg_mode_optimize": "Optimizo", + "pg_group_matching": "Përputhja e programeve", + "pg_zoom_hint": "klikoni dy herë për të rivendosur zmadhimin", + "aria_playground_chart2": "Grafik interaktiv i fuqisë së ciklit: kaloni kursorin për të lexuar kohën/fuqinë, rrëshqitni për të zmadhuar, tërhiqni për të lëvizur", + "pg_alert_timeout_end": "Përfundoi nga skadimi i kohës, jo nga parashikimi", + "pg_alert_indefinite": "Do të vazhdonte pafundësisht", + "pg_alert_stress_cap": "U arrit kufiri i sigurisë", + "pg_alert_stress_ok": "Ndërprerja e gjendjes statike: cikli u ndal", + "pg_alert_stress_warn": "Konsumi i gjendjes statike mbi pragun e ndalimit", + "task_pg_history": "Testo në histori", + "task_pg_sweep": "Optimizo", + "task_reprocess": "Ripërpunim", + "task_ml_training": "Mësim", + "eta_secs": "edhe ~{n} s", + "eta_mins": "edhe ~{n} min", + "pg_recent_runs": "Ekzekutimet e fundit", + "pg_load_run": "Ringarko këtë ekzekutim", + "pg_match_confidence": "Besueshmëria e përputhjes", + "pg_envelope_fit": "Përshtatja me zarfin", + "pg_envelope_fit_tip": "Sa mirë cikli qëndron brenda zarfit të ruajtur të fuqisë së këtij profili, një këndvështrim tjetër nga besueshmëria e përputhjes.", + "n_imported_note": ", {n} të importuar", + "enable_online": "Aktivizo veçoritë online", + "store_brand": "Marka e pajisjes", + "store_model": "Modeli i pajisjes", + "anonymous": "Anonim", + "rate_quality": "Vlerëso cilësinë", + "rate_n": "{n} yje", + "approved_only": "Vetëm të miratuara", + "adopt_settings": "Adopto edhe cilësimet", + "flags": "Flamuj", + "include_phase_map": "Përfshi hartën e fazave", + "include_settings": "Përfshi cilësimet e zbulimit dhe përputhjes", + "show_contributor": "Trego emrat e kontribuesve", + "task_pg_detail": "Simulimi i ciklit", + "task_split": "Ndarja e ciklit", + "task_trim": "Prerja e ciklit", + "task_merge": "Bashkimi i cikleve", + "task_rebuild": "Rindërtimi i zarfave", + "cat_profiles": "Profilet (programet)", + "cat_real_cycles": "Ciklet (historiku i punës)", + "cat_reference_cycles": "Ciklet e referencës (të importuara)", + "cat_custom_phases": "Faza të personalizuara", + "cat_profile_groups": "Grupet e profileve", + "cat_settings": "Cilësimet e zbulimit & njohjes", + "cat_matching_config": "Rregullimi i njohësit", + "cat_ml_models": "Modelet ML", + "cat_feedback": "Etiketat e reagimit & rishikimit", + "cat_suggestions": "Sugjerime", + "cat_maintenance_log": "Regjistri i mirëmbajtjes", + "cat_history_logs": "Historiku & regjistrat e ndryshimeve", + "cat_lifetime_stats": "Totalet e përgjithshme", + "cycles_short": "cikle", + "import_mode": "Si të kombinohen", + "mode_merge": "Bashko (mba të miat)", + "mode_replace": "Zëvendëso të zgjedhurat", + "cycle_destination": "Ku duhet të shkojnë ciklet e importuara?", + "dest_reference": "Referencë (vetëm forma)", + "dest_real_history": "Historik real (numërohet në statistika)", + "conflict_resolution": "Përplasjet e emrave", + "conflict_import_copy": "Importo si kopje", + "conflict_keep_mine": "Mba të miat", + "conflict_overwrite": "Mbishkruaj", + "font_size": "Madhësia e shkronjave të panelit" }, - "phase1b": { - "recorded": "Regjistrimi juaj u ruajt si {profile_name}. Tani regjistroni ose etiketoni programet tuaja të tjera të zakonshme për të ndërtuar mbulimin." + "log": { + "all_levels": "Të gjitha nivelet", + "all_devices": "Të gjitha pajisjet", + "all_components": "Të gjithë komponentët", + "search_ph": "Kërko në regjistra…" }, - "phase1c": { - "verify": "Keni {count} programe nga komuniteti. Ekzekutoni një cikël për të verifikuar nëse WashData e njeh saktë – përputhja do të përmirësohet ndërsa pajisja juaj ndërton historinë e vet." + "ml": { + "builtin_models": "● Duke përdorur modelet e integruara", + "fit_fair": "I pranueshëm", + "fit_good": "Mirë", + "fit_slight": "I lehtë", + "fit_strong": "I fortë", + "fit_weak": "I dobët", + "fit_word": "përshtatje", + "personalized": "● I personalizuar për këtë makinë", + "better_than_baseline": "{pct}% më mirë se vlerësimi bazë ({metric})", + "trend_improving_tip": "Përshtatja e këtij modeli është përmirësuar gjatë rikontrolleve të fundit.", + "trend_declining_tip": "Përshtatja e këtij modeli ka rënë gjatë rikontrolleve të fundit · shqyrtimi i më shumë cikleve mund ta ndihmojë të rimësojë.", + "trend_steady_tip": "Përshtatja e këtij modeli ka mbetur afërsisht e qëndrueshme gjatë rikontrolleve të fundit.", + "cap_blurb": { + "end": "Të dijë kur një cikël ka përfunduar vërtet", + "live_match": "Identifikimi më i shpejtë i programit në ekzekutim", + "quality": "Zbulimi i cikleve të gabuara ose të dëmtuara", + "remaining_time": "Parashikimi se sa kohë ka mbetur", + "total_energy": "Parashikimi i energjisë totale dhe kostos" + }, + "cap_label": { + "end": "Zbulimi i fundit të ciklit", + "live_match": "Njohja e programit", + "quality": "Kontrolli i cilësisë së ciklit", + "remaining_time": "Vlerësimi i kohës së mbetur", + "total_energy": "Vlerësimi i energjisë" + }, + "metric_auc": "AUC {auc} në të dhënat e vlerësimit", + "metric_mae": "gabimi: {model} kundrejt bazës {baseline}" }, - "phase2": { - "cluster": "WashData ka parë {count} cikle që nuk përputhen me asnjë program të ruajtur – ato duken të ngjashme me njëra-tjetrën. Dëshironi të krijoni një profil të ri për to?", - "unmatched": "Cikli juaj i fundit nuk u përputh me asnjë program të ruajtur. A është një program i ri?" + "modal": { + "auto_label": "Etiketim automatik i cikleve", + "correct_feedback": "Korrigjo komentin", + "create_profile": "Krijo profilin", + "cycle": "Cikli", + "edit_group": "Modifiko grupin e profilit", + "edit_phase": "Modifiko fazën", + "import_config": "Importo konfigurimin", + "label_cycle": "Etiketoje ciklin", + "merge_cycles": "Bashko {n} cikle", + "new_group": "Grup i ri profilesh", + "new_phase": "Fazë e re", + "process_history_msg": "Riekzekutoni përputhjen, rifreskoni sugjerimet, stërvitni ML (nëse aktivizuara) dhe rillogaritni shëndetin e cikleve në të gjitha ciklet e ruajtura. Kjo mund të marrë pak kohë.", + "process_history_ok": "Proceso", + "process_history_title": "Proceso historinë", + "process_recording": "Proceso regjistrimin", + "delete_maintenance_msg": "Të fshihet ky regjistrim i mirëmbajtjes? Ky veprim nuk mund të zhbëhet.", + "delete_maintenance_title": "Fshi ngjarjen e mirëmbajtjes", + "relabel_cycles": "Rietiketo {count} cikle", + "delete_automation_title": "Fshi Automatizimin", + "delete_automation_msg": "Të fshihet automatizimi \"{name}\" nga Home Assistant? Kjo nuk mund të zhbëhet.", + "remove_legacy_title": "Hiq Veprimet e Vjetra", + "remove_legacy_msg": "Të hiqen veprimet e personalizuara të vjetra? Ato do të ndalojnë së aktivizuari në ngjarjet e cikleve. Kjo nuk mund të zhbëhet nga paneli.", + "discard_recording_title": "Hidh Poshtë Regjistrimin", + "discard_recording_msg": "Të hidhet poshtë regjistrimi i ruajtur? Kjo nuk mund të zhbëhet.", + "dismiss_all_title": "Injoro të Gjitha Reagimet", + "dismiss_all_msg": "Të injorohen të gjitha {count} kërkesat për reagim në pritje?", + "dismiss_all_ok": "Injoro të Gjitha", + "delete_phase_title": "Fshi Fazën", + "delete_phase_msg": "Të fshihet faza \"{name}\"?", + "clear_debug_title": "Pastro të Dhënat e Korrigjimit", + "clear_debug_msg": "Të fshihen të gjitha gjurmët e ruajtura të korrigjimit?", + "wipe_all_title": "Fshi të Gjitha të Dhënat", + "wipe_all_msg": "⚠️ Kjo fshin përgjithmonë TË GJITHA ciklet dhe profilet. Kjo nuk mund të zhbëhet.", + "wipe_all_ok": "Fshi Gjithçka", + "force_stop_title": "Ndalo me Forcë Ciklin", + "force_stop_msg": "Të ndalohet me forcë cikli aktiv tani? Cikli do të ruhet si i ndërprerë.", + "store_import": "Importo ciklin referues", + "store_share": "Ndaj në dyqanin e komunitetit", + "store_share_device": "Ndaj këtë pajisje", + "export_select": "Eksporto - zgjidh të dhënat", + "import_wizard": "Importo - zgjidh të dhënat" }, - "phase3": { - "suggestions": "WashData ka rekomandime për cilësimet bazuar në historikun tuaj të cikleve – shqyrtojini ato për të përmirësuar saktësinë e zbulimit.", - "groups": "Disa nga profilet tuaja duken si i njëjti program në temperatura të ndryshme. Organizojini ato në një grup për përputhje më të mirë.", - "phases": "Shtoni faza programi te {profile_name} për vlerësime më të sakta të kohës së mbetur." + "msg": { + "appliance_monitor": "Monitor i pajisjes", + "artifact_dip_detail": "Ra nën brezin e zakonshëm të fuqisë për ~{n} s.", + "artifact_footer": "E theksuar në grafikun e mësipërm. Këto janë objekte kalimtare (p.sh. dera e hapur në mes të ciklit), jo domosdoshmërisht probleme.", + "artifact_header": "{n} anomali të zbuluara gjatë këtij cikli", + "artifact_pause_detail": "Fuqia ra pothuajse në zero për ~{n} s dhe u rikuperua – ndoshta dera u hap në mes të ciklit ose cikli u ndërpre.", + "artifact_spike_detail": "Shkoi mbi brezin e zakonshëm të fuqisë për ~{n} s.", + "auto_label_intro": "Cakto profile te ciklet e paetiketuara që besueshmëria e tyre e përputhjes tejkalon pragun.", + "automations_intro": "WashData ndez ngjarje {start} / {end} dhe ekspozon entitete, kështu njoftimet dhe veprimet ndërtohen më mirë si automatizime normale të Home Assistant. Automatizimi që përdorin këtë pajisje shfaqen më poshtë.", + "cleanup_intro": "Çdo cikël i etiketuar mbivendosur. Shëno outlier-ët dhe fshi për të pastruar profilin.", + "clear_debug_hint": "Hiqni të dhënat e ruajtura të korrigjimit për të liruar hapësirën.", + "collecting_data": "Duke mbledhur të dhëna: nevojiten edhe {need} cikël{plural} para se të fillojë sintonizimi i imët ({current}/{min}).", + "compare_overlay_profiles": "Mbivendos profilet (të zbetura)", + "compare_profiles_tip": "Mbivendosni zarfat e tjerë të profileve në grafikun e mësipërm për të parë se cili i përshtatet më mirë këtij cikli.", + "compare_selected_cycles": "Ciklet e zgjedhura (solide) – shfaq / fshih", + "consider_new_profile": "Konsideroni krijimin e një profili të ri.", + "coverage_gap": "ciklet e fundit nuk kanë asnjë profil që përputhet ({pct}% e 30 të fundit).", + "coverage_gap_similar_cycles": "U gjetën {count} cikle të ngjashme të paetiketuara – krijo një profil për të filluar përputhjen.", + "cycles_deleted": "{count} cikël(e) u fshinë", + "enough_data": "Të dhëna të mjaftueshme për të mësuar ({current}/{min} cikle).", + "export_description": "Zgjidhni saktësisht cilat profile, cikle, cilësime dhe të tjera do të eksportohen në JSON, ose analizoni një skedar dhe importoni vetëm pjesët që dëshironi.", + "feedback_cycles_pending": "{n} cikël{s} për rishikim", + "feedback_prompt": "Konfirmo nëse ishte i saktë, korrigjo programin ose injorojë.", + "feedback_relabel_hint": "Rietiketimi i këtij cikli e zgjidh atë gjithashtu.", + "filter_by_profile": "Filtro sipas profilit…", + "group_modal_help": "Gruponi programe me të njëjtën formë që ndryshojnë në temperaturë/centrifugim (kohëzgjatja mund të ndryshojë). Përputhja shënon grupin si një kandidat dhe më pas zgjedh anëtarin më të përshtatshëm. Zgjidhni të paktën 2; mbivendosja tregon se sa të ngjashëm janë.", + "group_not_cohesive": "Këto profile nuk janë mjaft të ngjashme për t'u grupuar në mënyrë të besueshme, kështu që përputhja i trajton ato individualisht derisa të hiqni pjesën e jashtme ose të ndani grupin.", + "group_preview_hint": "Shënoni 2+ anëtarë për të parë dhe krahasuar kurbat e tyre të fuqisë.", + "import_intro": "Ngarko një skedar të eksportuar ose ngjit një ngarkesë JSON më poshtë.", + "legacy_actions_title": "Veprimi i personalizuar i trashëguar i {count} është ende duke u ekzekutuar", + "live_chart_loading": "Grafiku i fuqisë live shfaqet ndërsa mbërrijnë leximet.", + "loading": "Duke ngarkuar…", + "loading_curve": "Duke ngarkuar kurbën…", + "loading_settings": "Duke ngarkuar cilësimet…", + "log_buffer_hint": "Më i riu i pari · ruan 500 rekordet e fundit ha_washdata që nga rinisja · zvarrit skajin e poshtëm për të ndryshuar madhësinë.", + "maintenance_advisory": "Rritja e kohëzgjatjes/energjisë mund të tregojë nevojën e mirëmbajtjes së pajisjes (p.sh. heqja e gurëve, pastrimi i filtrit).", + "maintenance_due": "Mirëmbajtja e duhur: {items}", + "maintenance_intro": "Regjistroni servisimin që kryeni në këtë pajisje dhe merrni kujtesë kur çdo detyrë të jetë përsëri e nevojshme.", + "maintenance_load_error": "Nuk u ngarkuan dot të dhënat e mirëmbajtjes: {error}", + "maintenance_requires_access": "Mirëmbajtja dhe eksporti/importi kërkojnë akses të plotë.", + "manual_duration_hint": "Gjatësia mesatare/e pritshme e ciklit të profilit, e përdorur për vlerësimet e kohës së mbetur. Ndrysho për ta vendosur atë; duke e lënë të pandryshuar ruan vlerën aktuale.", + "matching_tuning_intro": "Gjatë të mësuarit, WashData rregullon gjithashtu sa shumë përputhja e programit peshohet sipas formës kundrejt kohëzgjatjes dhe energjisë.", + "merge_intro": "Ciklet e zgjedhura kombinohen në një (rend kronologjik; boshllëqet mbushen me 0 W). Zgjidhni profilin që rezulton.", + "ml_intro": "WashData vjen me modele inteligjente që funksionojnë menjëherë.", + "ml_learned_intro": "Modele të rregulluara mirë për këtë makinë.", + "ml_loading": "duke ngarkuar ML…", + "ml_settings_intro": "Dy çelësa të pavarur: njëri aplikon modelet ndërsa një cikël ekzekutohet, tjetri lejon WashData t'i rregullojë ato me kalimin e kohës.", + "name_first_program": "Keni cikle të mjaftueshme – emërtoni programin tuaj të parë për të nisur përputhjen.", + "near_duplicate_cluster": "u zbulua grupi i profilit pothuajse dublikatë. Grupimi lejon që përputhja të zgjedhë në mënyrë të besueshme midis pamjeve të ngjashme (p.sh. i njëjti program në temperaturë/centrifugim të ndryshëm).", + "no_cycles_match": "Asnjë cikël nuk përputhet me filtrin aktual.", + "no_cycles_profile": "Asnjë cikël për këtë profil.", + "no_cycles_selected": "Zgjidhni së pari të paktën një cikël.", + "no_cycles_yet": "Asnjë cikël i regjistruar ende.", + "no_device_selected": "Asnjë pajisje e zgjedhur.", + "no_devices": "Asnjë pajisje WashData e konfiguruar ende.", + "no_envelope": "Asnjë zarf ende - rindërtoni pas etiketimit të cikleve.", + "no_envelope_overlay": "Asnjë zarf i disponueshëm për mbivendosje.", + "no_fine_tuned": "Asgjë e rregulluar mirë ende – WashData po përdor modelet e integruara.", + "no_logs": "Asnjë regjistrim i mbajtur në bufer ende.", + "no_maintenance": "Ende nuk është regjistruar asnjë mirëmbajtje.", + "no_match_yet": "Asnjë tentativë përputhje ende - kjo plotësohet gjatë një cikli aktiv.", + "no_other_users": "Nuk u gjetën përdorues të tjerë të Asistentit në Shtëpi.", + "no_phases": "Asnjë fazë e përcaktuar.", + "no_phases_assigned": "Asnjë fazë e caktuar.", + "no_profiles_compare": "Asnjë profil për krahasim.", + "no_profiles_overlay": "Asnjë profil për mbivendosje.", + "no_profiles_yet": "Asnjë profil ende. Krijo një nga një cikël i etiketuar.", + "no_profiles_yet_short": "Asnjë profil ende.", + "no_settings_match": "Asnjë cilësim nuk përputhet me \"{q}\"", + "no_split_points": "Asnjë pikë ndarjeje ende.", + "no_suggestions": "Asnjë sugjerim aktiv.", + "notify_services_hint": "Përdorni ID-të e shërbimit {entity} (të ndara me presje për shumë). Variablat e shabllonit: {vars}.", + "old_actions_warning": "Konfiguruar me redaktuesin e vjetër të veprimeve (tani i hequr). Ato ende ndezin në ngjarjet e ciklit, por nuk mund të modifikohen më këtu. Shndërrojini ato në një automatizim normal ose hiqni ato.", + "onboarding_progress": "{n} / 3 cikle të vëzhguara", + "onboarding_watching": "Përdorni pajisjen normalisht – WashData po vëzhgon. Pas 3 cikleve, do të nisë përputhja e programeve.", + "pending_feedback": "Koment në pritje të zbulimit", + "performance_trend": "Tendenca e performancës ({n} cikle)", + "pg_analysis_empty": "Ngarkoni një cikël për të parë analizën e përputhjes.", + "pg_apply_confirm": "Të aplikohet vlera më e mirë: {label} = {value}?", + "pg_canvas_empty": "Zgjidhni një cikël më sipër, pastaj shtypni Ngarko për të parë gjurmën e tij të fuqisë.", + "pg_chart_caption": "Shkalla e zbulimit/përputhjes sipas vlerave të {param}", + "pg_ctrl_intro": "Vlerat nisen nga cilësimet aktive të integrimit për këtë pajisje. Ndryshimet qëndrojnë në zonën e provave derisa t'i aplikoni.", + "pg_live_unavailable": "Cilësimet aktive nuk janë të disponueshme, po shfaqen vlerat e parazgjedhura.", + "pg_load_live_confirm": "Të hidhen poshtë ndryshimet në zonën e provave ({n}) dhe të ringarkohen cilësimet aktuale të integrimit?", + "pg_match_rate": "{pct}% shkallë përputhjeje në {total} cikle", + "pg_matches_live": "Përputhet me cilësimet aktive", + "pg_n_changed": "Ndryshime kundrejt cilësimeve aktive: {n}", + "pg_sugg_none": "Të gjitha sugjerime tashmë përputhen me cilësimet aktuale", + "pg_preset_delete_confirm": "Të fshihet konfigurimi \"{name}\"?", + "pg_preset_limit": "U arrit kufiri i konfigurimeve ({n})", + "pg_preset_overwrite": "Të mbishkruhet konfigurimi \"{name}\"?", + "pg_publish_one_confirm": "Të ruhet {label} = {value} te cilësimet e kësaj pajisjeje?", + "pg_restart_note": "Rinisni Home Assistant për të aktivizuar mjetet e simulimit.", + "pg_sim_progress": "{done} / {total} cikle", + "pg_starting": "Duke filluar…", + "pg_stress_synthetic": "simulimi i gjendjes statike fillon këtu", + "pg_sweep_intro": "Po sikur {param} të ishte ndryshe? Testoni {steps} vlera në {cycles} ciklet tuaja të fundit për të gjetur cilësimin ku përputhen saktë sa më shumë cikle.", + "pg_sweep_step": "Hapi {done} / {total}", + "pg_undetected": "{n} cikël{s} të pazbuluar", + "pg_verdict_bad": "Kërkon vëmendje: shumë cikle mbeten të pazbuluara.", + "pg_verdict_good": "Rregulluar mirë: shumica e cikleve identifikohen dhe përputhen saktë.", + "pg_verdict_ok": "I pranueshëm: disa cikle munguan. Provoni të ulni pragun e fillimit.", + "phase_catalog_intro": "Segmente të emërtuara të një cikli (Para-larje, Ngrohje, Centrifugim…). Caktojini ato profilit nga paneli i kontrollit.", + "phase_ranges_intro": "Intervalët e fazës (minuta nga fillimi i ciklit) mbivendosur mbi kurbën mesatare. Redakto vlerat për pamje paraprake live.", + "playground_intro": "Një zonë e sigurt provash për të riluajtur ciklet e kaluara me cilësime të ndryshme, për të krahasuar dy konfigurime krah për krah dhe për të inspektuar si përputhet një cikël me një profil. Asgjë këtu nuk i ndryshon të dhënat tuaja aktive derisa ta aplikoni shprehimisht.", + "playground_needs_restart": "Rinisni Home Assistant për të aktivizuar veglat e zonës së provave.", + "preferences_admin": "Preferencat, paneli dhe kontrolli i aksesit", + "preferences_adv": "Preferencat", + "prefs_personal": "Këto vlejnë vetëm për llogarinë tuaj të Asistentit në Shtëpi.", + "process_history_hint": "Riekzekutoni përputhjen në të gjitha ciklet e ruajtura, rifreskoni sugjerimet e sintonizimit, stërvitni modelet ML (nëse janë aktivizuara) dhe rillogaritni shëndetin e cikleve. Ekzekutoni këtë pas një grupi rishikimesh.", + "profile_deleted": "Profili u fshi", + "profile_poor_health_detail": "Ciklet e caktuara për këtë profil kanë forma jokonsistente ose besim të ulët. Merrni parasysh rindërtimin e zarfit ose rishikimin e cikleve të etiketuara.", + "profiles_intro": "Kliko një profil për statistika, faza dhe pastrim. Grupo programe pothuajse identike (të njëjtën formë/kohëzgjatje, temperaturë ose centrifugim të ndryshëm) kështu që përputhja zgjedh me besueshmëri ndërmjet tyre.", + "rbac_hint": "Kur çaktivizohet, çdo përdorues i Asistentit në Shtëpi ka akses të plotë (parazgjedhja). Administratorët kanë gjithmonë akses të plotë dhe mund të menaxhojnë të gjithë.", + "recent_logs": "Regjistrimet e fundit ha_washdata", + "recording_in_progress": "Regjistrimi në progres", + "reminders_intro": "Shfaq një kujtesë në panel pas kaq cikleve nga servisimi i fundit. Lëreni bosh ose 0 për ta çaktivizuar një kujtesë.", + "restart_gap_footer": "Evidentuar në grafik. Të dhënat e energjisë mungojnë për këto intervale; përputhja përdori vetëm lexime reale.", + "restart_gap_header": "{n} boshllëk rinisje të HA gjatë këtij cikli", + "restart_gap_item": "{dur} boshllëk", + "review_confirm_help": "Konfirmoni nëse ky cikël është zbuluar saktë. Komentet tuaja e trajnojnë modelin në kompjuterin tuaj - sa më shumë cikle të konfirmoni, aq më i mirë do të jetë përputhja dhe rezultatet shëndetësore. Mjafton një mirë/e keqe e shpejtë.", + "review_in_settings": "Rishiko në Cilësime", + "review_notes_placeholder": "Shënime (opsionale)", + "review_notes_tip": "Shënime me tekst të lirë për referencën tuaj. Nuk përdoret nga përputhja ose trajnimi.", + "review_profile_tip": "Programi i këtij cikli është etiketuar si. Nëse programi i zbuluar automatikisht ishte i gabuar, korrigjoni atë këtu - etiketimi mëson përputhjen për ciklet e ardhshme.", + "review_quality_tip": "Sa i pastër është ky cikël. Mirë = një shembull teksti i këtij programi; E keqe = e zbuluar por e zhurmshme ose atipike; I papërdorshëm = i zbuluar gabimisht (i bashkuar, i cunguar ose i rremë). Drejton rezultatin e shëndetit dhe cilat cikle lejohen për të trajnuar modelin.", + "review_recorded_tip": "Shënojeni këtë si një cikël referimi të zgjedhur vetë për programin e tij - i njëjti rol si një cikël i regjistruar manualisht. Ciklet e referencës mbahen gjithmonë, vendosin shabllonin që përputhet dhe nuk hiqen kurrë nga pastrimi. (Ky është flamuri \"i artë\"/regjistruar; të dy janë e njëjta gjë.)", + "review_tags_tip": "Flamujt opsionalë që përshkruajnë atë që shkoi keq me këtë cikël, kështu që trajnimi dhe pastrimi mund të jenë përgjegjës për këtë.", + "review_to_cycles": "Hap radhën e rishikimit të Cikleve", + "saving_triggers_reload": "Ruajtja aktivizon ringarkimin e integrimit. Njësitë HA mund të shfaqen shkurtimisht si të padisponueshme.", + "search_placeholder": "Kërko cilësime…", + "see_recorder": "Shiko veglën e regjistruesit më poshtë", + "setting_changed": "Ndryshuar nga {old} në {new} më {date}", + "settings_basic_note": "Po shfaqen cilësimet thelbësore. Kaloni te Të avancuara për listën e plotë.", + "shape_drift_advisory": "⚠ Zhvendosje forme", + "shape_drift_detail": "Modeli i energjisë i këtij profili ka ndryshuar me kalimin e kohës – mundësi të konsumit të pajisjes ose nevojë mirëmbajtjeje (p.sh. heqja e gurëve, pastrimi i filtrit).", + "show_all_settings": "Shfaq të gjitha cilësimet", + "showing_suggestions": "Po shfaq cilësimin e {count} me sugjerime.", + "split_intro": "Kliko grafikun për të shtuar ose hequr një pikë ndarjeje, ose zbulo automatikisht sipas ndërprerjeve. Çdo segment që rezulton mund të ketë profilin e tij.", + "storage_diagnostics": "Statistikat e ruajtjes, mirëmbajtja, eksporti/importi", + "sug_staged": "Vendosur {key} = {val}. Ruani për të aplikuar.", + "toast_auto_detect_enabled": "Zbulimi automatik u aktivizua", + "toast_auto_label_complete": "Etiketimi automatik u përfundua", + "toast_auto_label_failed": "Etiketimi automatik dështoi: {error}", + "toast_automation_failed": "Nuk mund të krijohej automatizimi: {error}", + "toast_automation_migrated": "Veprimet u migruan në një automatizim; hapet redaktori", + "toast_convert_failed": "Konvertimi dështoi: {error}", + "toast_create_failed": "Krijimi dështoi: {error}", + "toast_delete_failed": "Fshirja dështoi: {error}", + "toast_error": "Gabim: {error}", + "toast_failed": "Dështoi: {error}", + "toast_force_stop_failed": "Ndalimi i detyruar dështoi: {error}", + "toast_name_required": "Emri kërkohet", + "toast_no_automation": "Këtu nuk mund të krijohet automatizim", + "toast_profile_name_required": "Emri i profilit kërkohet", + "toast_program_set": "Programi u caktua: {program}", + "toast_rebuild_failed": "Rindërtimi dështoi: {error}", + "toast_resume_failed": "Rifillimi dështoi: {error}", + "toast_revert_failed": "Kthimi prapa dështoi: {error}", + "toast_reverted": "{key} u rikthye", + "toast_save_failed": "Ruajtja dështoi: {error}", + "trend_duration_longer": "Kohëzgjatja në tendencë më e gjatë ({pct}%/cikël) – mesatare e fundit {avg}", + "trend_duration_shorter": "Kohëzgjatja në tendencë më e shkurtër ({pct}%/cikël) - mesatare e fundit {avg}", + "trend_energy_down": "Tendenca e energjisë në rënie ({pct}%/cikël)", + "trend_energy_up": "Tendenca e energjisë në rritje ({pct}%/cikël) - mesatarisht kohët e fundit {avg}", + "trim_destructive_confirm": "Kjo ruan vetëm {pct}% të ciklit dhe nuk mund të zhbëhet. Vazhdoni?", + "trim_intro": "Zvarrit dorëzat e kuqe ose futo vlerat. Gjithçka jashtë dritares hiqet.", + "tuning_suggestions_available": "Ofrohet {count} sugjerim akordimi nga ciklet e vëzhguara. Ato shfaqen pranë fushave përkatëse.", + "unsure_detected_prefix": "WashData nuk është i sigurt se ka zbuluar", + "updated": "Përditësuar", + "warmup_badge": "Akoma duke mësuar ({done}/{needed} cikle)", + "warmup_detail": "Ky profil ka nevojë për {needed} cikle të etiketuara para se të fillojë përputhja automatike. Çdo cikël i konfirmuar e ndihmon të mësojë.", + "wipe_history_warning": "Fshini përgjithmonë të gjitha ciklet dhe profilet. Nuk mund të zhbëhet.", + "compare_overlay_tip": "Mbivendos brezat e profileve të mësuara për të parë se cilin program i ngjason secili cikël.", + "duration_trend_up_tip": "Kohëzgjatja në rritje ({pct}%/cikël)", + "duration_trend_down_tip": "Kohëzgjatja në rënie ({pct}%/cikël)", + "energy_trend_up_tip": "Energjia në rritje ({pct}%/cikël)", + "energy_trend_down_tip": "Energjia në rënie ({pct}%/cikël)", + "performance_trending": "Tendenca e performancës", + "pg_select_cycle_hint": "Zgjidh një cikël dhe kliko ↺ për ta ngarkuar", + "pg_sweep_progress": "Hapi {done} / {total}", + "pg_analysis_hint": "Zgjidh një cikël dhe kliko ↺ për të ngarkuar analizën.", + "diagnostics_load_failed": "Diagnostikat nuk u ngarkuan dot: {error}", + "manual_duration_ref_hint": "Përdoret vetëm kur nuk është zgjedhur asnjë cikël referues. Një cikël referues e cakton kohëzgjatjen sipas gjatësisë së vet.", + "toast_convert_rolled_back": "Konvertimi dështoi dhe u kthye mbrapsht (nuk mbeti asnjë automatizim): {error}", + "toast_convert_orphan": "Automatizimi u krijua, por pastrimi i veprimeve të vjetra dështoi. Mos provoni përsëri: hiqni veprimet e vjetra manualisht për të shmangur një automatizim të dyfishuar.", + "advisory_duration_trend_up": "Ciklet '{name}' po zgjaten gjithnjë e më shumë (rreth +{pct}% për cikël). Nëse sjellja e pajisjes ka ndryshuar, regjistrojeni sërish ose rindërtojeni këtë profil.", + "advisory_energy_trend_up": "'{name}' po konsumon gjithnjë e më shumë energji (rreth +{pct}% për cikël) - ia vlen ta kontrolloni pajisjen nëse kjo është e papritur.", + "advisory_poor_health": "'{name}' ka një rezultat të ulët përputhjeje - ciklet e tij të fundit ndryshojnë shumë ose përputhen dobët. Rishikoni ciklet e tij ose regjistrojeni sërish profilin që njohja dhe vlerësimet e kohës të mbeten të sakta.", + "advisory_shape_drift": "'{name}' ka devijuar ndjeshëm nga forma e tij fillestare e fuqisë. Sjellja e pajisjes mund të ketë ndryshuar me kalimin e kohës (p.sh. gëlqerëzim, konsumim). Merrni në konsideratë regjistrimin sërish të këtij profili me ciklet e fundit.", + "advisory_shape_drift_corr": "'{name}' ka devijuar ndjeshëm nga forma e tij fillestare e fuqisë (korrelacioni {corr}). Sjellja e pajisjes mund të ketë ndryshuar me kalimin e kohës (p.sh. gëlqerëzim, konsumim). Merrni në konsideratë regjistrimin sërish të këtij profili me ciklet e fundit.", + "pg_no_alerts": "Nuk u zbuluan probleme në këtë ekzekutim.", + "pg_override_active": "Po përdoren cilësimet tuaja të redaktuara kundrejt atyre aktuale", + "pg_history_intro": "Riluani ciklet tuaja të fundit përmes zbuluesit dhe përputhësit të vërtetë. Redaktoni fillimisht një cilësim zbulimi te Simulo për të parë këtu një krahasim para/pas.", + "pg_history_empty": "Shtypni Ekzekuto për të riluajtur ciklet tuaja.", + "pg_history_summary": "{detected}/{total} u zbuluan · {correct} u përputhën saktë", + "pg_sweep_no_metric": "Nuk ka mjaftueshëm të dhëna për të vlerësuar këtë objektiv.", + "pg_sweep_intro2": "Gjeni cilësimin që përmbush më mirë një objektiv në ciklet tuaja të fundit. Asgjë nuk ndryshon derisa ta zbatoni.", + "pg_running_history": "Po riluhen ciklet tuaja…", + "pg_running_sweep": "Po testohen vlerat në të gjithë ciklet tuaja…", + "pg_row_load_hint": "Ngarko këtë cikël në grafikun më sipër", + "pg_history_intro2": "Riluajini ciklet tuaja të fundit përmes detektorit dhe përputhësit real me cilësimet e mësipërme. Klikoni çdo rresht për të ngarkuar atë cikël në grafik; ndryshoni një cilësim për të parë një krahasim para/pas.", + "pg_simulating": "Po simulohet cikli…", + "pg_canvas_empty2": "Zgjidhni një cikël më sipër dhe shtypni Ekzekuto për ta simuluar. Pastaj kaloni kursorin për të lexuar vlerat, rrëshqitni për të zmadhuar dhe tërhiqni për të lëvizur.", + "pg_apply_settings_confirm": "Të ruhen këto {n} cilësime në këtë pajisje? {list}", + "pg_stress_terminated_detail": "U stabilizua në rreth {idle} W gjendje statike -- cikli përfundoi {h} orë {m} min më vonë përmes {reason}.", + "pg_stress_above_threshold_detail": "Konsumi i gjendjes statike (~{idle} W) është në ose mbi pragun efektiv të ndalimit ({stop} W) -- cikli nuk u regjistrua kurrë si i qetë. Për ta rregulluar, rrisni stop_threshold_w.", + "pg_stress_hit_cap_detail": "Cikli funksionoi {h} orë {m} min pa u ndalur -- u ndal me forcë nga kufiri i sigurisë. Konsumi i gjendjes statike {idle} W kundrejt pragut të ndalimit {stop} W.", + "no_logs_match": "Asnjë regjistrim nuk përputhet me këta filtra.", + "pg_analysis_hint2": "Zgjidhni një cikël dhe shtypni Ekzekuto për të ngarkuar analizën e përputhjes.", + "pg_analysis_empty2": "Shtypni Ekzekuto për të parë analizën e përputhjes.", + "imported_readonly": "Importuar nga dyqani i komunitetit. Shfaqet për referencë dhe përputhje. Nuk llogaritet në statistikat tuaja dhe nuk mund të redaktohet.", + "merge_no_imports": "Regjistrimet e importuara nuk mund të bashkohen në një cikël real. Çzgjidhni ato për t'i bashkuar.", + "store_enable_hint": "Aktivizoni veçoritë online te Cilësimet për të shfletuar dhe importuar ciklet referuese të komunitetit.", + "online_intro": "Ndani dhe shkarkoni cikle referuese me përdorues të tjerë të WashData. Të gjitha veçoritë online janë me zgjedhje dhe të çaktivizuara si parazgjedhje.", + "store_share_intro": "Ngarkoni këtë cikël referues që të tjerët me të njëjtën pajisje ta përdorin. Ai rishikohet para se të shfaqet publikisht.", + "online_intro_global": "Shfletoni dhe ndani regjistrime referuese me përdorues të tjerë të WashData dhe konfirmoni hyrjet e pajisjeve. Një lidhje vlen për të gjithë integrimin tuaj WashData; marka dhe modeli i pajisjes caktohen për çdo pajisje te seksioni Bazë. Të gjitha veçoritë online janë me zgjedhje dhe të çaktivizuara si parazgjedhje.", + "online_unavailable": "Veçoritë online nuk janë të disponueshme në këtë server.", + "store_picker_offline": "Aktivizoni veçoritë online te ingranazhi i cilësimeve për të zgjedhur nga katalogu i komunitetit.", + "pick_brand_first": "Zgjidhni së pari një markë pajisjeje.", + "model_not_found": "Ende nuk është në katalog.", + "connect_to_confirm": "Lidhuni te ingranazhi i cilësimeve për të konfirmuar ose vlerësuar.", + "adopt_settings_hint": "Mbishkruan pragun e zbulimit dhe përputhjes të kësaj pajisje me të ndarët. Njoftimet, entitetet dhe çmimi i energjisë nuk ndryshohen kurrë.", + "include_settings_hint": "Ndani pragjet e njohjes dhe përputhjes të kësaj pajisje (jo njoftimet, entitetet ose çmimin e energjisë). Adoptuesit zgjedhin nëse do t'i aplikojnë.", + "onboard_download": "Pajisje e re? Adoptoni një konfigurim të gatshëm (programe, cikle referimi dhe faza) nga një tjetër përdorues WashData me të njëjtën pajisje.", + "share_consent": "Konfirmoj se këto cikle u ekzekutuan normalisht deri në fund pa ndërprerje", + "share_device_none": "Nuk ka ende cikle të ndashme. Shënojeni një cikël të regjistruar ose të zgjedhur me dorë si cikël referimi (⭐) tek skeda Ciklet fillimisht.", + "share_guideline_naming": "Emërtoni çdo profil saktësisht siç tregohet në çezmën ose ekranin e pajisjes (p.sh. 'Cotton 40', 'Eco 60').", + "share_guideline_quality": "Ndani vetëm cikle që u kompletuan normalisht -- pa ndërprerje në mes të ciklit, ngjarje hapjeje dere, ose probleme me energji.", + "share_guideline_review": "Ngarkimi juaj fillon si në pritje dhe bëhet publik pasi anëtarë të mjaftueshëm të komunitetit e konfirmojnë.", + "share_guidelines_title": "Para se të ndani", + "store_download_device_intro": "Adoptoni çdo program të ndarë dhe ciklet e tij të referencës në pajisjen tuaj. Ciklet dhe statistikat tuaja të regjistruara nuk preken.", + "store_share_device_intro": "Ngarko {brand} {model} me ciklet e referencës që zgjidhni. Të tjerët me të njëjtën pajisje mund të adoptojnë programet tuaja. Hyrjet shqyrtohen para publikimit.", + "share_profile_no_cycles": "Nuk ka cikle referimi -- shënojeni një cikël si ⭐ tek skeda Ciklet për të përfshirë këtë profil", + "advisory_phase_inconsistent": "'{name}' duket se përzien programe ose temperatura të ndryshme - ciklet e tij ngrohin për periudha shumë të ndryshme kohore. Ndarja e tij në profile të veçanta (p.sh. sipas temperaturës) do të përmirësojë përputhjen dhe vlerësimet e kohës.", + "advisory_phase_inconsistent_title": "⚠ Ndoshta programe të përziera", + "export_select_intro": "Shënoni saktësisht çfarë të përfshihet. Zgjedhja e profileve pa ciklet e tyre gjithsesi eksporton një program të njohshëm (forma e mësuar e tij udhëton bashkë me të).", + "import_analyze_hint": "Ngarkoni një skedar të eksportuar (ose ngjisni JSON-in e tij). WashData e analizon dhe tregon saktësisht çfarë mund të importohet përpara se të ndryshojë çdo gjë.", + "analyzing": "Duke analizuar…", + "device_type_mismatch_warn": "Ky eksport është nga një tip tjetër pajisjeje ({src} ndaj {local}). Programet dhe ciklet mund të importohen gjithsesi si të dhëna reference, por cilësimet specifike të pajisjes dhe importimi i historikut real janë çaktivizuar.", + "merge_hint": "Artikujt e importuar shtohen; asgjë lokale nuk humbet. Përplasjet e emrave zgjidhen më poshtë.", + "replace_warn": "Çdo kategori e shënuar fshihet dhe zëvendësohet nga skedari. Kategoritë e pashënuara mbeten të paprekura.", + "dest_reference_hint": "Ciklet e importuara vetëm përmirësojnë njohjen e programit dhe nuk ndikojnë kurrë në statistikat e përdorimit/energjisë.", + "dest_real_history_hint": "Ciklet e importuara llogariten si historik i vetë kësaj pajisjeje dhe ushqejnë statistikat e energjisë/përdorimit. Përdoreni për të zhvendosur një pajisje në një instalim të ri.", + "sug_muted": "Ky cilësim nuk do të sugjerohet më", + "sug_mute_failed": "Nuk mund të heshtte sugjerimi", + "sug_unmuted_all": "Sugjerime të heshtura u rivendosën", + "n_suggestions_muted": "{count} të heshtura; motori i sugjerimeve nuk do t'i propozojë këto.", + "font_size_hint": "Bëni gjithçka në këtë panel më të madhe ose më të vogël. Aplikohet për llogarinë tuaj në këtë pajisje." }, - "phase4": { - "healthy": "Kjo pajisje është konfiguruar plotësisht ({profile_count} profile)." + "phase_desc": { + "anti_crease": "Rrotullime të shkurtra të herëpashershme pas përfundimit për të reduktuar rrudhat.", + "anti_wrinkle": "Rrotullimi periodik pas ciklit për të reduktuar rrudhat.", + "cool_down": "Rrotullimi pa ngrohje afër fundit të ciklit.", + "drain_and_switch": "Periudha e tranzicionit nga mënyra e larjes në tharje.", + "dry": "Faza e tharjes duke përdorur ngrohës dhe/ose nxehtësi të mbetur.", + "drying": "Periudha kryesore e tumbullimit me ngrohje.", + "heat_up": "Ngrohja fillestare e ngrohësit përpara se të fillojë tharja e plotë.", + "pre_rinse": "Spërkatja fillestare përpara larjes me detergjent.", + "pre_wash": "Thithja fillestare ose trajtimi paraprak përpara larjes kryesore.", + "rinse": "Faza e shpëlarjes me ujë të pastër. Kjo fazë mund të përsëritet disa herë.", + "sanitize": "Faza e pastrimit me temperaturë të lartë për programet e higjenizimit.", + "sensor_check": "Pauzë e shkurtër me fuqi të ulët ndërsa matet thatësia.", + "soak": "Periudha e njomjes me aktivitet të ulët midis fazave aktive të larjes.", + "soak_dw": "Periudha e zgjatur e njomjes për tokë të rëndë.", + "spin": "Nxjerrja me shpejtësi të lartë për të hequr ujin nga ngarkesa.", + "spin_wd": "Nxjerrja me shpejtësi të lartë përpara kalimit të tharjes.", + "wash": "Cikli kryesor i larjes me lëvizjen e kazanit dhe ngrohje opsionale.", + "wash_dw": "Larja kryesore me detergjent me ngrohje." }, - "cta": { - "start_recording": "Fillo regjistrimin", - "label_detected_cycle": "Kam tashmë një cikël të zbuluar – etiketoje atë", - "browse_cycles": "Shfleto ciklet për të etiketuar një tjetër", - "view_profiles": "Shiko profilet tuaja", - "create_from_cluster": "Krijo profil nga këto cikle", - "create_profile": "Krijo një profil për të", - "review_suggestions": "Shqyrto sugjerimet", - "organise_profiles": "Organizo profilet", - "configure_phases": "Konfiguro fazat", - "skip_step": "Anashkalo këtë hap", - "skip_forever": "Mos shfaq më", - "hide_guidance": "Fshih udhëzuesin", - "show_guidance": "Shfaq udhëzuesin" + "placeholder": { + "add": "shto…", + "group_name": "p.sh. Pambuk 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "shto një shërbim njoftimi…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "shto një person…", + "phase_name": "p.sh. Paralandje", + "profile_name": "p.sh. Pambuk 40°C", + "maintenance_notes": "p.sh. u ndërrua filtri, u pastrua guarnicioni i derës", + "store_brand": "p.sh. Bosch", + "store_model": "p.sh. WAT28401" + }, + "pref": { + "date_absolute": "Absolute (p.sh. 14:32 më 2 Korrik)", + "date_relative": "Relative (p.sh. 2 orë më parë)", + "lang_auto": "Parazgjedhja e sistemit ({lang})", + "lang_en": "Anglisht", + "use_panel_default": "(parazgjedhja e panelit)" + }, + "quality": { + "bad": "E keqe", + "good": "Mirë", + "unusable": "E papërdorshme" + }, + "section": { + "anti_wrinkle": { + "intro": "Mënyra kundër rrudhave të rrobave zbulon pulsimet e tumblimit me fuqi të ulët pas fazës kryesore dhe i mban ato të lidhura me ciklin e përfunduar.", + "label": "Kundër rrudhave" + }, + "basic": { + "intro": "Identiteti kryesor dhe bazat që shumica e konfigurimeve i nevojiten.", + "label": "Bazike" + }, + "delay": { + "intro": "Zbulimi i nisjes së vonuar identifikon kur pajisja është ndezur por nuk ka filluar ende ciklin.", + "label": "Nisje e vonuar" + }, + "detection": { + "intro": "Si zbulohet fillimi, ekzekutimi dhe përfundimi i ciklit.", + "label": "Zbulim" + }, + "matching": { + "intro": "Si përputhen ciklet e përfunduara me profilet e mësuara dhe etiketohen.", + "label": "Përputhje" + }, + "ml_training": { + "intro": "Orari i ritrajnimit të mësimit automatik në pajisje dhe cilësimet e të dhënave.", + "label": "Trajnim ML" + }, + "notifications": { + "intro": "Kur dhe si njoftoheni për ngjarjet e ciklit.", + "label": "Njoftime" + }, + "timing": { + "intro": "Kadenca e sfondit, rojtari offline dhe mirëmbajtja.", + "label": "Kohëzgjatja dhe rojtar" + }, + "triggers": { + "intro": "Sinjalet e jashtme opsionale: aktivizues përfundimi, senzori i derës, çelësi i pauzës dhe kujtues për shkarkim.", + "label": "Aktivizues dhe dera" + }, + "phase_eta": { + "label": "Koha e Mbetur", + "intro": "Kohë e mbetur e ndërgjegjshme për fazat, për makinat gjatësia e ciklit të të cilave varet nga temperatura ose centrifugimi." + }, + "dishwasher": { + "label": "Pjatalarëse", + "intro": "Trajtimi i fundit të ciklit për pjatalarëset, të cilat zakonisht përfundojnë me një fazë të gjatë tharjeje pothuajse pa konsum energjie përpara një shkarkimi të shkurtër përfundimtar." + } + }, + "setting": { + "anti_wrinkle_enabled": { + "doc": "Njihni pulset e shkurtra me fuqi të ulët që lëshon një tharëse pas fazës kryesore të nxehtësisë dhe mbajini të lidhura me ciklin e përfunduar në vend që t'i lexoni si cikle të reja.", + "label": "Aktivizo zbulimin kundër rrudhave" + }, + "anti_wrinkle_exit_power": { + "doc": "Fuqia duhet të bjerë nën këtë mes pulseve që modaliteti kundër rrudhave të qëndrojë aktiv.", + "label": "Pragu i fuqisë së daljes" + }, + "anti_wrinkle_idle_timeout": { + "label": "Hendeku maks. i pulseve", + "doc": "Sa gjatë mund të qëndrojë e qetë makina mes dy pulseve të rrotullimit para se të mbarojë modaliteti kundër rrudhave. Vendoseni mbi hendekun më të gjatë që lë tharësja juaj mes pulseve, përndryshe çdo puls i mëvonshëm lexohet si nisje e gabuar." + }, + "anti_wrinkle_max_duration": { + "doc": "Pulset më të gjata se kjo trajtohen si një cikël i vërtetë dhe jo si një rrëshqitje kundër rrudhave.", + "label": "Kohëzgjatja maks." + }, + "anti_wrinkle_max_power": { + "doc": "Një puls mbi këtë fuqi trajtohet si një cikël i ri i vërtetë, jo një rrëshqitje kundër rrudhave. Vendoseni pak mbi fuqinë e pulsit të rënies.", + "label": "Fuqia maks. kundër rrudhave" + }, + "auto_label_confidence": { + "doc": "Nëse rezultati i ndeshjes në fund të ciklit është në ose mbi këtë, programi etiketohet automatikisht pa ndonjë kërkesë konfirmimi. Rriteni atë për të kërkuar siguri më të lartë përpara etiketimit automatik; uleni atë për të automatizuar më shumë. Funksionon në lidhje me besimin e të mësuarit nën të.", + "label": "Besueshmëria e etiketimit automatik" + }, + "auto_maintenance": { + "doc": "Drejtoni mbajtjen e shtëpisë gjatë natës: rindërtoni zarfet e profilit, rillogaritni shëndetin e ciklit, krasitni gjurmët e korrigjimit dhe ruani ciklet më të fundit.", + "label": "Mirëmbajtje automatike (pastrimi nate)" + }, + "completion_min_seconds": { + "doc": "Ciklet më të shkurtra se kjo hidhen si cikle fantazmë (vrapime testimi, hapja e derës për të shtuar një çorape).", + "label": "Kohëzgjatja min. e ciklit" + }, + "delay_confirm_seconds": { + "doc": "Energjia duhet të qëndrojë në brezin e gatishmërisë për kaq shumë kohë përpara se pajisja të trajtohet si në pritje për të nisur në vend që të funksionojë.", + "label": "Sekonda konfirmimi" + }, + "delay_start_detect_enabled": { + "doc": "Zbuloni kur pajisja është e ndezur dhe është në pritje (fillimi me vonesë / gatishmëria), por nuk e ka filluar ciklin e saj, kështu që tërheqja e gatishmërisë nuk ngatërrohet me një cikël funksionimi.", + "label": "Aktivizo zbulimin e nisjes së vonuar" + }, + "delay_timeout_hours": { + "doc": "Ndaloni së prituri në modalitetin e nisjes me vonesë pas kaq shumë orësh dhe kthehuni në gjendje boshe, kështu që një makinë e lënë e ndezur, por nuk u ndez kurrë, nuk pret përgjithmonë.", + "label": "Orë kohe skadimi" + }, + "device_type": { + "doc": "Klasa e pajisjes. Vendos standardet e paracaktuara të ndjeshme të zbulimit (pragjet, vonesa jashtë vonesës, trajtimi në fund) të akorduara për atë lloj pajisjeje; ndryshoni atë vetëm nëse pajisja fillimisht ishte konfiguruar si lloji i gabuar.", + "label": "Lloji i pajisjes" + }, + "door_sensor_entity": { + "doc": "Sensori binar opsional i derës. Përdoret për të zbuluar kur pajisja është hapur/shkarkuar pas një cikli.", + "label": "Entiteta e sensorit të derës" + }, + "duration_tolerance": { + "doc": "Toleranca për vlerësimet e mbetura të kohës (reagimi i të mësuarit, jo përputhje). Nëse kohëzgjatja aktuale është brenda +/-X% e vlerësimit, ajo llogaritet si një përputhje e mirë.", + "label": "Toleranca e vlerësimit" + }, + "enable_ml_models": { + "doc": "Ndërsa një cikël funksionon, lërini modelet të përsosin rezultatet e drejtpërdrejta: një vlerësim më i qëndrueshëm i kohës së mbetur dhe energjisë/kostos, dhe një mbrojtës kundër ndalimit të parakohshëm në zbulimin e përfundimit (ai mund të vonojë ndonjëherë përfundimin, të mos përfundojë kurrë më herët dhe të jetë i kufizuar). Përdor modelet e tua të akorduara mirë kur janë të disponueshme, përndryshe ato të integruara. Off = vetëm logjika klasike e bazuar në fuqi (ende e besueshme).", + "label": "Apliko modele inteligjente gjatë ciklit" + }, + "end_energy_threshold": { + "doc": "Gjatë numërimit jashtë vonesës, energjia e akumuluar (vat x kohë) krahasohet me këtë prag. Nëse tejkalohet, numërimi mbrapsht rivendoset - duke i mbajtur bishtat kundër rrudhave dhe tharjen e lavastoviljes të lidhura me ciklin në vend që t'i shkurtoni ato. Rriteni nëse ciklet përfundojnë shumë herët gjatë ftohjes; uleni nëse zbulimi është i ngadaltë.", + "label": "Energjia e fundit" + }, + "end_repeat_count": { + "doc": "Numri i leximeve të njëpasnjëshme nën pragun e ndalimit të kërkuar para përfundimit të ciklit. 1 është e mirë për shumicën e prizave. Rriteni në 2-3 nëse spina juaj inteligjente raporton herë pas here një mostër të rreme me zero në mes të ciklit dhe ciklet tuaja mbarojnë para kohe.", + "label": "Numri i përsëritjeve të fundit" + }, + "energy_price_entity": { + "doc": "Sensori me çmimin aktual të energjisë elektrike për kWh (p.sh. një tarifë dinamike). Ka përparësi ndaj çmimit statik më poshtë. Çdo cikël ngrin çmimin në fuqi kur të përfundojë.", + "label": "Entiteta e çmimit të energjisë" + }, + "energy_price_static": { + "doc": "Çmimi fiks për kWh i përdorur për shifrat e kostos kur nuk është vendosur më sipër asnjë subjekt i çmimit të drejtpërdrejtë.", + "label": "Çmimi statik i energjisë (për kWh)" + }, + "energy_sensor": { + "doc": "Numërues kumulativ opsional i energjisë (total_increasing kWh/Wh, p.sh. matësi i vetë prizës për konsumin total). Kur vendoset, energjia e raportuar e çdo cikli merret nga diferenca e këtij numëruesi nga fillimi deri në fund, gjë që shmang nënllogaritjen që merrni nga integrimi i një sensori fuqie që raporton ngadalë. Kthehet te vlera e integruar nëse leximi mungon, njësia e tij është e panjohur, ose diferenca nuk është pozitive. Lëreni bosh për të vazhduar integrimin e sensorit të fuqisë.", + "label": "Entiteti i matësit të energjisë" + }, + "expose_debug_entities": { + "doc": "Publikoni entitete shtesë diagnostikuese HA (besimi i ndeshjes, paqartësia, të brendshmet e gjendjes). Off e mban listën e entiteteve të pastër për përdorim normal.", + "label": "Ekspono entitetet e korrigjimit" + }, + "external_end_trigger": { + "doc": "Sensori binar ndryshimi i gjendjes së të cilit shënon fundin e ciklit (p.sh. një kontakt \"e përfunduar\" i pajisjes ose një integrim shoqërues).", + "label": "Entiteta e aktivizuesit të jashtëm" + }, + "external_end_trigger_enabled": { + "doc": "Lëreni një sensor të jashtëm binar të sinjalizojë fundin e një cikli, përveç zbulimit të integruar të bazuar në fuqi.", + "label": "Aktivizo aktivizuesin e jashtëm të fundit" + }, + "external_end_trigger_inverted": { + "doc": "Trajtojeni fikjen e sensorit të këmbëzës (në vend të ndezjes) si sinjalin e fundit të ciklit.", + "label": "Invertoj aktivizuesin e jashtëm (aktivizoj kur FIKUR)" + }, + "learning_confidence": { + "doc": "Nëse rezultati i ndeshjes bie midis kësaj dhe \"Konfidencës me etiketë automatike\", një njoftim reagimi ju kërkon të verifikoni programin e identifikuar. Poshtë këtij rezultati ndeshja është shumë e pasigurt për t'u shfaqur. Duhet të mbahet nën Besueshmërinë e Etiketës Automatike.", + "label": "Besueshmëria e të mësuarit" + }, + "linked_device": { + "doc": "Futeni opsionalisht këtë pajisje WashData nën një pajisje tjetër (p.sh. spinën inteligjente) në regjistrin e pajisjes HA, e shfaqur si \"Connected via ...\".", + "label": "Grupo nën pajisje" + }, + "min_off_gap": { + "doc": "Nëse makina fiket për më pak se kjo kohë, sekuenca e ndezjes/fikjes/ndezjes trajtohet si një cikël i vazhdueshëm. Parandalon ndarjen e programeve të njomjes (makina fiket për disa minuta në mes të larjes) në dy cikle të veçanta. Vendoseni atë më të shkurtër se hendeku midis ngarkesave tuaja të pasme nëse dëshironi që ato të numërohen si cikle të veçanta. Parazgjedhjet e tipit të pajisjes mbrojnë pauzën tipike brenda ciklit për çdo pajisje.", + "label": "Hendeku min. i fikjes" + }, + "min_power": { + "doc": "Fuqia minimale absolute konsiderohet aktive. Leximet poshtë kësaj trajtohen si 0 W (në gatishmëri), duke filtruar ngarkesën fantazmë të prizave inteligjente dhe LED-ve në gatishmëri.", + "label": "Fuqia minimale" + }, + "ml_training_enabled": { + "doc": "Studioni periodikisht ciklet tuaja të rishikuara gjatë natës dhe rregulloni modelet me këtë makinë specifike. Një ndryshim mbahet vetëm kur me të vërtetë ka rezultate më të mira në ciklet e zgjatura, kështu që kjo mund të ndihmojë ose të mbetet e njëjtë - mos u regresoni kurrë.", + "label": "Mëso nga kjo makinë" + }, + "ml_training_hour": { + "doc": "Ora lokale e ditës (0-23) për të bërë rregullimin e saktë gjatë natës. Zgjidh një orë qetësie si p.sh. 2 (02:00).", + "label": "Mëso në orën" + }, + "ml_training_interval_days": { + "doc": "Ri-kontrolloni për përmirësime maksimumi një herë në kaq ditë.", + "label": "Kontrolloje më shumë çdo" + }, + "ml_training_min_cycles": { + "doc": "Prisni derisa të regjistrohen të paktën kaq shumë cikle përpara akordimit, kështu që ka mjaft për të mësuar.", + "label": "Ciklet e nevojshme fillimisht" + }, + "name": { + "doc": "Emri i shfaqur shfaqet në listën e integrimeve HA dhe regjistrin e pajisjes.", + "label": "Emri i pajisjes" + }, + "no_update_active_timeout": { + "doc": "Nëse nuk vijnë përditësime të energjisë për kaq gjatë funksionimit, supozoni se priza ka rënë jashtë linje dhe ndaloni me forcë për të shmangur një cikël zombie. 600 s i parazgjedhur lejon vonesën në re ose rrjetë.", + "label": "Koha e skadimit pa përditësim" + }, + "notify_before_end_minutes": { + "doc": "Dërgo një sinjalizim \"Pothuajse e përfunduar\" kur koha e mbetur e parashikuar bie nën këtë. 0 e çaktivizon atë.", + "label": "Alarm para fundit" + }, + "notify_channel": { + "doc": "Emri i kanalit të njoftimeve në Android për mesazhet e fillimit/live (kontrollon tingullin për kanal dhe përparësinë në aplikacionin celular). Blank përdor parazgjedhjen e aplikacionit shoqërues.", + "label": "Kanal Android (nisje/live)" + }, + "notify_cycle_timers": { + "doc": "Njoftimet në minuta specifike në një cikël (p.sh. për të shtuar zbutës). Mesazhi mbështet {device}, {program}, {minutes}. Aktivizo pauzën automatike për të ndalur në atë pikë dhe për të marrë një njoftim interaktiv me një buton Resume; rifilloni nëpërmjet panelit, shërbimit të ndalimit/rifillimit ose veprimit të njoftimit.", + "label": "Kohëmatës cikli" + }, + "notify_finish_channel": { + "doc": "Emri i kanalit të njoftimit në Android për mesazhin e përfundimit. Blank ripërdor kanalin start/live.", + "label": "Kanal Android (përfundim)" + }, + "notify_finish_message": { + "doc": "Trupi dërgohet kur përfundon një cikël. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. {time_finished} dhe {vs_typical} janë më të dobishmet këtu.", + "label": "Mesazh përfundimi" + }, + "notify_finish_services": { + "doc": "njofto.* shërbimet thirren kur përfundon një cikël. Shtoni një për objektiv; lëreni bosh për asnjë njoftim përfundimtar.", + "label": "Shërbime përfundimi" + }, + "notify_fire_events": { + "doc": "Gjithashtu aktivizoni ngjarjet ha_washdata_* në fillimin/mbarimin e ciklit në mënyrë që të mund të ndërtoni automatizimet tuaja.", + "label": "Aktivizo ngjarje HA për njoftime" + }, + "notify_icon": { + "doc": "Ikona opsionale mdi për njoftimin (p.sh. mdi: makinë larëse). Lëreni bosh për parazgjedhjen e platformës.", + "label": "Ikona e njoftimit" + }, + "notify_live_chronometer": { + "doc": "Trego një kohëmatës numërimi mbrapsht që përditësohet drejtpërdrejt në njoftim (në platformat që e mbështesin atë) në vend të një vlerësimi statik.", + "label": "Përdor kronometër live" + }, + "notify_live_interval_seconds": { + "doc": "Sa shpesh rifreskohen njoftimet e progresit të drejtpërdrejtë gjatë ekzekutimit të një cikli.", + "label": "Intervali i përditësimeve live" + }, + "notify_live_overrun_percent": { + "doc": "Nëse një cikël e kalon vlerësimin e tij me më shumë se kjo përqindje, dërgoni një alarm mbi tejkalimin.", + "label": "% tejkalimi para alarmit" + }, + "notify_live_services": { + "doc": "njoftime.* shërbimet thirrën për përditësime të drejtpërdrejta të progresit gjatë ekzekutimit të një cikli. Lëreni bosh për të çaktivizuar njoftimet e progresit të drejtpërdrejtë.", + "label": "Shërbime progres live" + }, + "notify_only_when_home": { + "doc": "Dërgoni njoftime vetëm kur të paktën një nga personat e lidhur (sipër) është në shtëpi.", + "label": "Njofto vetëm kur në shtëpi" + }, + "notify_people": { + "doc": "person.* entitete të përdorura nga \"Njofto vetëm kur në shtëpi\" për të vendosur nëse dikush është në shtëpi.", + "label": "Njerëzit (për Vetëm kur në shtëpi)" + }, + "notify_pre_complete_message": { + "doc": "Trupi i alarmit para përfundimit / gati së shpejti. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Mesazh para-përfundimi" + }, + "notify_reminder_message": { + "doc": "Trupi i kujtesës që rrobat ende presin të hiqen. Bosh përdor vlerën e paracaktuar të integruar. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Mesazh kujtues" + }, + "notify_start_message": { + "doc": "Trupi dërgohet kur fillon një cikël. Variablat shabllon: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Mesazh nisje" + }, + "notify_start_services": { + "doc": "njofto.* shërbimet e thirrura kur fillon një cikël. Shto një për objektiv (telefon, panel, etj.); lini bosh pa njoftim për fillim.", + "label": "Shërbime nisje" + }, + "notify_timeout_seconds": { + "doc": "Hiq automatikisht njoftimin pas kaq shumë sekondash (në platformat që e mbështesin atë). 0 e mban atë derisa të hiqet manualisht.", + "label": "Mbylle automatikisht pas" + }, + "notify_title": { + "doc": "Titulli i njoftimit. Variablat shabllon: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "Titulli i njoftimit" + }, + "notify_unload_delay_minutes": { + "doc": "Minuta pasi përfundon një cikël përpara se të dërgoni alarmin rikujtues \"shkarkoni makinën\" ende në pritje. Vendosni 0 për të çaktivizuar kujtesën.", + "label": "Vonesë njoftimi për shkarkim" + }, + "notify_unload_repeat": { + "doc": "Ridërgon kujtesën për shkarkim çdo \"Vonesë njoftimi për shkarkim\" minuta, derisa të hapni derën ose të prekni \"Ndalo kujtesat\" në njoftim. Kërkon Entitetin e sensorit të derës (ashtu si edhe vetë kujtesa). Butoni i largimit funksionon në njoftimet e aplikacionit-shoqërues (celular) të Home Assistant.", + "label": "Përsërit derisa të hapet dera" + }, + "off_delay": { + "doc": "Koha për të pritur pasi të bjerë energjia përpara se të deklaroni ciklin të përfunduar. Nëse rryma rifillon brenda kësaj dritareje, cikli vazhdon pa probleme - kjo lidh pauzat midis fazave të larjes. Enëlarëset kanë faza të gjata tharjeje (fikje për 20-60 min), kështu që vonesa e fikjes duhet ta kalojë atë për të mbajtur të gjithë larjen+tharjen si një cikël.", + "label": "Vonesë fikjeje" + }, + "pause_cuts_power": { + "doc": "Kur një cikël është në pauzë, fikni gjithashtu Entitetin e Ndërprerjes më poshtë. Vetëm për pajisjet, priza e të cilave mund të pritet në mënyrë të sigurt në mes të ciklit.", + "label": "Pauzë gjithashtu pret fuqinë (nëpërmjet çelësit)" + }, + "power_off_delay": { + "doc": "Sa kohë duhet të qëndrojë fuqia nën Pragun e fikjes së energjisë pasi një cikël të përfundojë përpara se gjendja të kthehet në „Fikur“. Përdoret vetëm kur Pragu i fikjes së energjisë është mbi 0. Kontrollohet në ritmin e sfondit, kështu që vonesa efektive rrumbullakoset lart deri te rrahja tjetër e skadimit të gjendjes.", + "label": "Vonesa e fikjes së energjisë" + }, + "power_off_threshold_w": { + "doc": "Zbulim opsional i gjendjes Fikur bazuar në fuqinë. Kur është mbi 0, pasi një cikël të ketë përfunduar dhe fuqia të qëndrojë nën këtë nivel për Vonesën e fikjes së energjisë, makina trajtohet si e fikur dhe gjendja kthehet në „Fikur“. Lëreni në 0 për ta çaktivizuar (parazgjedhja). Vendoseni mbi nivelin real të fikjes dhe nën Pragun e ndalimit dhe nën konsumin në gatishmëri të makinës suaj (e përfunduar, por ende e ndezur); nëse nuk është nën Pragun e ndalimit, ai injorohet. Kur aktivizohet, ai zëvendëson Vonesën e rivendosjes së progresit për kthimin në „Fikur“, kështu që një makinë e përfunduar qëndron në „Përfunduar/I pastër“ derisa të fiket vërtet.", + "label": "Pragu i fikjes së energjisë" + }, + "power_sensor": { + "doc": "Subjekti sensor që raporton fuqinë e drejtpërdrejtë në vat për këtë pajisje (p.sh. sensor.washer_power). I gjithë zbulimi i ciklit bazohet në këtë sinjal.", + "label": "Sensori i fuqisë" + }, + "profile_duration_tolerance": { + "doc": "Brezi +/- rreth një kohëzgjatjeje mesatare të profilit të përdorur gjatë përputhjes. 0.25 do të thotë që një profil 60 min përputhet me ciklet 45-75 min.", + "label": "Toleranca e kohëzgjatjes së profilit" + }, + "profile_match_interval": { + "doc": "Sa shpesh të provoni përputhjen e profilit gjatë një cikli vrapimi. 300 s (5 minuta) e parazgjedhur balancon shpejtësinë e zbulimit dhe CPU.", + "label": "Intervali i përputhjes" + }, + "profile_match_max_duration_ratio": { + "doc": "Gjatësia maksimale e ciklit në lidhje me profilin. 1.3 do të thotë që një cikël duhet të jetë nën 130% të kohëzgjatjes së profilit për t'u përshtatur.", + "label": "Raporti maks. i kohëzgjatjes" + }, + "profile_match_min_duration_ratio": { + "doc": "Gjatësia minimale e ciklit në lidhje me profilin. 0.9 do të thotë që një cikël duhet të jetë të paktën 90% e kohëzgjatjes së profilit për t'u përshtatur.", + "label": "Raporti min. i kohëzgjatjes" + }, + "profile_match_threshold": { + "doc": "Rezultati minimal i ngjashmërisë (0-1) kërkohet në fund të ciklit për të pranuar një identifikim programi. Ngrini atë për të zvogëluar identifikimin e gabuar; uleni nëse programet e makinës suaj nuk përputhen. Default 0.4 është një pikë fillestare konservatore.", + "label": "Pragu i përputhjes" + }, + "profile_unmatch_threshold": { + "doc": "Nëse një ndeshje e drejtpërdrejtë në mes të ciklit bie nën këtë rezultat, identifikimi paraprak pastrohet. Mbajeni atë pak më poshtë Pragut të Përputhjes në mënyrë që një rënie e shkurtër në ngjashmëri të mos e kthejë ekranin përsëri në të pashoq.", + "label": "Pragu i mosperputhjeve" + }, + "progress_reset_delay": { + "doc": "Pas përfundimit, mbajeni progresin në 100% për këtë kohë, në mënyrë që \"Përfunduar\" të jetë i dukshëm në panelet e kontrollit përpara se ta rivendosni në \"Idle\".", + "label": "Vonesë rivendosjeje të progresit" + }, + "pump_stuck_duration": { + "doc": "Sekonda një pompë mund të funksionojë vazhdimisht përpara se të shënohet si e mundshme e mbërthyer (ndiz ngjarjen e pompës së mbërthyer).", + "label": "Kohëzgjatja e pompës së bllokuar" + }, + "running_dead_zone": { + "doc": "Pas fillimit të një cikli, uljet e energjisë brenda kësaj dritareje nuk merren parasysh. Makinat larëse mbushen me ujë të ftohtë (duke rënë afër 0 W para ngrohjes) - pa këtë mbrojtje, faza e mbushjes duket si një fund cikli. Kjo NUK kapërcen të dhënat: gjurma e plotë e fuqisë regjistrohet nga T=0. Motori i sugjerimeve mat modelin aktual të nisjes së makinës suaj dhe e përmason atë automatikisht.", + "label": "Zona e vdekur e ekzekutimit" + }, + "sampling_interval": { + "doc": "Koha e pritshme midis leximeve të sensorit - përdoret për madhësinë e dritares së zbutjes dhe fillimin e debouncimit në mënyrë korrekte. Çdo përditësim i sensorit kapet pavarësisht nga kjo vlerë; ai kalibron vetëm llogaritjet e rrjedhës së poshtme. Motori i sugjerimeve mat kadencën aktuale të sensorit tuaj nga ciklet e kaluara dhe e vendos këtë automatikisht.", + "label": "Intervali i kampionimit" + }, + "save_debug_traces": { + "doc": "Ruani gjurmën e plotë të fuqisë dhe të dhënat e korrigjimit që përputhen për çdo cikël. I dobishëm për zgjidhjen e problemeve, por rrit madhësinë e ruajtjes.", + "label": "Ruaj gjurmët e korrigjimit" + }, + "smoothing_window": { + "doc": "Sa zbutet sinjali i fuqisë së papërpunuar. I ulët (2) është i përgjegjshëm, por i zhurmshëm; i lartë (5) zbut pikat, por shton vonesën.", + "label": "Dritarja e zbutjes" + }, + "start_duration_threshold": { + "doc": "Fuqia duhet të qëndrojë mbi pragun e fillimit për një kohë të gjatë për të konfirmuar një fillim të vërtetë, duke parandaluar kyçet e ndezjes/fikjes së sekondës nga fillimi i një cikli.", + "label": "Kohëzgjatja e nisjes" + }, + "start_energy_threshold": { + "doc": "Energjia (fuqia x koha) që pajisja duhet të konsumojë përpara se të FUNKSIONOJË. Një majë e shkurtër me fuqi të lartë ka energji shumë të ulët dhe injorohet, duke parandaluar fillimet e rreme.", + "label": "Energjia e nisjes" + }, + "start_threshold_w": { + "doc": "Fuqia duhet të rritet mbi këtë nivel për të konfirmuar se një cikël ka filluar. Vendosja e tij shumë e ulët shkakton nisje të rreme nga fuqia e gatishmërisë; programet shumë të larta dhe me fillim të ngadalshëm (mbushje e ftohtë) mungojnë. Motori sugjerues e vendos këtë pak mbi fuqinë aktive më të ulët të vërejtur të makinës.", + "label": "Pragu i nisjes" + }, + "stop_threshold_w": { + "doc": "Fuqia duhet të bjerë nën këtë nivel përpara se të fillojë numërimi mbrapsht i vonesës. Vendoseni atë nën pragun e fillimit - hendeku midis tyre është brezi i histerezës që parandalon dridhjen. Nëse vendoset shumë lart, fazat me fuqi të ulët (mbajtjet e shpëlarjes, kundër rrudhave) shkaktojnë gabimisht sekuencën përfundimtare.", + "label": "Pragu i ndalimit" + }, + "switch_entity": { + "doc": "Çelësi opsional i çaktivizuar në pauzë dhe përsëri ndizet kur rifillon, përdoret së bashku me \"Pauza gjithashtu ndërpret energjinë\".", + "label": "Entiteta e çelësit" + }, + "watchdog_interval": { + "doc": "Sa shpesh mbikëqyrësi i sfondit kontrollon për sensorë të bllokuar dhe afate kohore të kaluara. Parazgjedhja 30 s.", + "label": "Intervali i rojëtarit" + }, + "notify_milestone_message": { + "doc": "Mesazhi për njoftimin e piketës. Variablat shabllon: {device}, {cycle_count}.", + "label": "Mesazhi i piketës" + }, + "notify_milestones": { + "doc": "Numra ciklesh të ndarë me presje që, kur arrihen, aktivizojnë një njoftim festiv një herësh (p.sh. 50, 100, 500, 1000). Bosh çaktivizon njoftimet e piketave.", + "label": "Piketat e cikleve" + }, + "notify_quiet_end_hour": { + "doc": "Fundi i dritares mos shqetëso (0-23). Njoftimet e mbajtura dërgohen në këtë orë. Lëreni bosh për ta çaktivizuar.", + "label": "Fundi i orëve të qeta" + }, + "notify_quiet_start_hour": { + "doc": "Fillimi i një dritareje mos shqetëso (0-23). Njoftimet e përfundimit, kujtesat dhe njoftimet për rroba të pastra që do të aktivizoheshin gjatë orëve të qeta mbahen dhe dërgohen kur mbaron dritarja. Lëreni bosh për ta çaktivizuar. Mbështet dritare që kalojnë mesnatën (p.sh. fillimi 22, fundi 7).", + "label": "Fillimi i orëve të qeta" + }, + "peak_rate_message": { + "doc": "Tekst opsional i personalizuar për këshillën e tarifës së pikut, i shtuar te njoftimi i nisjes. Variablat shabllon: {device}, {price}. Bosh përdor vlerën e paracaktuar të integruar.", + "label": "Mesazhi i tarifës së pikut" + }, + "peak_rate_threshold": { + "doc": "Kur nis një cikël dhe çmimi aktual për kWh është në këtë vlerë ose mbi të, i shtohet një këshillë për tarifën e pikut njoftimit të nisjes. 0 ose bosh e çaktivizon këshillën.", + "label": "Pragu i tarifës së pikut (për kWh)" + }, + "dtw_bandwidth": { + "label": "Toleranca e përputhjes së formës", + "doc": "Sa mund ta shtrembërojë në kohë përputhësi një cikël që të përshtatet me formën e një programi të ruajtur. Vlera më e lartë toleron më shumë ndryshim shpejtësie; shumë e lartë rrezikon të përputhë programin e gabuar." + }, + "corr_weight": { + "label": "Pesha e formës kundrejt nivelit", + "doc": "Ekuilibri midis formës së kurbës dhe nivelit absolut të fuqisë gjatë vlerësimit të një përputhjeje. Vlera më e lartë favorizon formën; më e ulta favorizon përputhjen e nivelit të fuqisë." + }, + "duration_weight": { + "label": "Pesha e kohëzgjatjes", + "doc": "Sa fort preferohet një program, kohëzgjatja tipike e të cilit përputhet me këtë cikël." + }, + "energy_weight": { + "label": "Pesha e energjisë", + "doc": "Sa fort preferohet një program, konsumi tipik i energjisë i të cilit përputhet me këtë cikël." + }, + "store_brand": { + "label": "Marka e Pajisjes", + "doc": "Opsionale. Marka e pajisjes, e zgjedhur nga katalogu i komunitetit. Përdoret për të gjetur dhe ndarë regjistrime referuese përkatëse. Lëreni bosh nëse nuk përdorni veçoritë online." + }, + "store_model": { + "label": "Modeli i Pajisjes", + "doc": "Opsionale. Modeli i pajisjes, i zgjedhur nga katalogu i komunitetit sapo të caktohet një markë. Nëse modeli juaj nuk është në listë, mund ta shtoni në katalog." + }, + "show_contributor": { + "doc": "Shfaq atribuimin \"nga \" në pajisjet dhe ciklet referuese të komunitetit." + }, + "enable_phase_matching": { + "label": "Kohë e mbetur e ndërgjegjshme për fazat", + "doc": "Ndan çdo cikël që po funksionon në faza (ngrohje, larje, centrifugim) dhe shpërndan kohën e mbetur për çdo fazë, e përzier me vlerësimin klasik - duke u mbështetur te shpërndarja sipas fazave në fillim të ciklit dhe te vlerësimi klasik afër fundit. Kjo e personalizon numërimin mbrapsht sipas kohës që makina juaj në të vërtetë ngroh dhe punon, gjë që vihet re më së shumti në gjysmën e parë të një cikli. Off = vetëm vlerësimi klasik. Preket vetëm shfaqja e kohës së mbetur; përputhja e programeve dhe zbulimi i ciklit mbeten të pandryshuara." + }, + "keep_min_score": { + "label": "Rezultat Min. Përputhjeje", + "doc": "Rezultati minimal i ngjashmërisë që i nevojitet një kandidati për të qëndruar në garën e përputhjes. Parazgjedhja 0.1 është me qëllim lejuese - pranon edhe kandidatë të dobët dhe u lë etapave të mëvonshme të gjejnë përputhjen më të mirë. Rriteni për të eliminuar profilet e pamundshme herët; uleni për të zgjeruar grupin fillestar të kandidatëve." + }, + "dtw_blend": { + "label": "Përzierje Deformimi", + "doc": "Sa e zëvendëson rezultati i bashkimit DTW rezultatin bazë të Etapës 2. 0 = përdor vetëm rezultatin e Etapës 2, 1 = përdor vetëm rezultatin DTW, 0.5 (parazgjedhja) = përzierje e barabartë. Rriteni për t'u mbështetur më shumë në bashkimin e deformimit kur programet kanë nivele të ngjashme fuqie por modele të ndryshme kohore." + }, + "dtw_ensemble_w": { + "label": "Mix Ansambël DTW", + "doc": "Në modalitetin ansambël DTW (parazgjedhja), pesë për L1-e shkallëzuar kundrejt DTW derivativ (DDTW). 1.0 = gjithë shkallëzuar-L1, 0 = gjithë DDTW, 0.7 = parazgjedhja. Varianti shkallëzuar-L1 krahason nivelet e fuqisë; varianti derivativ reagon ndaj mënyrës sesi ndryshon fuqia me kalimin e kohës. Ansambëli kombinon të dyja." + }, + "dtw_ddtw_scale": { + "label": "Shkalla e Deformimit Derivativ", + "doc": "Distanca e gjysmë-ngopjes për vlerësimin e DTW derivativ. Rezultati gjysmohet kur distanca DDTW është e barabartë me këtë vlerë. Më i vogël = më i ndjeshëm ndaj ndryshimeve të formës. Parazgjedhja 30 është kalibruar për gjurmët tipike të fuqisë së pajisjeve. Ndikon vetëm mënyrat DTW ansambël dhe ddtw." + }, + "dtw_refine_top_n": { + "label": "Numri i Rafinimit DTW", + "doc": "Sa kandidatë të parë të Etapës 2 ri-vlerësohen nga DTW. DTW është më e shtrenjtë llogaritëse, kështu që aplikohet vetëm tek kandidatët N më të mirë. Parazgjedhja 5. Rriteni (në 7-9) nëse profili i saktë ndonjëherë arrin vetëm në vendin e 4-të ose 5-të pas Etapës 2 - DTW mund ta shpëtojë. Ulja e saj shpejton pak përputhjen." + }, + "duration_scale": { + "label": "Saktësia e Kohëzgjatjes", + "doc": "Ashpërsia e ndëshkimit të marrëveshjes së kohëzgjatjes së Etapës 4. Ky është raporti logaritmik në të cilin rezultati i marrëveshjes gjysmohet. Më i vogël = më i rreptë: një mospërputhje kohëzgjatjeje ndëshkon më shumë. Parazgjedhja 0.175 korrespondon me tolerancën e kohëzgjatjes rreth 18% në gjysmë-peshë. Çiftojeni me Peshën e Kohëzgjatjes." + }, + "energy_scale": { + "label": "Saktësia e Energjisë", + "doc": "Ashpërsia e ndëshkimit të marrëveshjes së energjisë së Etapës 4. Më i vogël = më i rreptë: një mospërputhje energjie ndëshkon më shumë. Parazgjedhja 0.25 është me qëllim më lejuese se Ashpërsia e Kohëzgjatjes sepse energjia ndryshon me ngarkesën. Çiftojeni me Peshën e Energjisë." + }, + "power_profile_interval_min": { + "label": "Intervali i Profilit të Energjisë", + "doc": "Madhësia e kovës për atributin e sensorit power_profile (vargu i sheshtë me vat mesatare për slot) të konsumuar nga planifikues të jashtëm si EMHASS dhe tibber_prices. Kova më të vogla mbajnë pikat e shkurtra të energjisë të mprehta; kova më të mëdha zbuten forma. Parazgjedhja 15 min. Vetëm për lexim; nuk ndikon zbulimin." + }, + "notify_live_sticky": { + "label": "Mbaj njoftimin live pas trokitjes", + "doc": "Vetëm Android. Bëni njoftimin e progresit live të vazhdueshëm (sticky) kështu që trokitja mbi të nuk e humb fijen e vazhdueshme. Off ruan sjelljen e parazgjedhur ku trokitja e humb atë." + }, + "notify_live_click_action": { + "label": "Destinacioni i trokitjes së njoftimit live", + "doc": "Vetëm Android. Ku hap trokitja mbi njoftimin e progresit live (p.sh. /lovelace/laundry ose një URL e plotë) në vend të faqes kryesore të aplikacionit. Lëreni bosh për parazgjedhjen." + }, + "door_opens_at_end": { + "label": "Dera hapet automatikisht në fund", + "doc": "Për pjatalarëset që hapin derën në fund të ciklit për t'u tharë (AirDry dhe të ngjashme). Kur kjo është aktive, hapja e derës gjatë një cikli nuk e ndal atë përgjithmonë; nëse dera qëndron hapur për kohën e pritjes më poshtë, WashData e trajton ciklin si të përfunduar. Një hapje e shkurtër (shtimi i një gjëje) injorohet. Kërkon një Entitet Sensori Dere." + }, + "door_end_dwell_seconds": { + "label": "Koha e pritjes me derë të hapur", + "doc": "Sa gjatë duhet të qëndrojë dera hapur përpara se WashData të përfundojë ciklin, kur \"Dera hapet automatikisht në fund\" është aktive. E gjatë sa të injorojë shtimin e shpejtë të një pjate (parazgjedhja 60 s), e shkurtër sa të përfundojë shpejt pasi makina hap derën." + }, + "dishwasher_end_spike_quiet_release": { + "label": "Lirim në qetësi gjatë tharjes pasive", + "doc": "Sapo cikli të kalojë kohëzgjatjen e tij të pritur, sa kohë duhet të qëndrojë e qetë pjatalarësja (nën Pragun e ndalimit) përpara se WashData të ndalojë pritjen për një shkarkim përfundimtar dhe ta mbyllë ciklin. Rriteni nëse makina juaj ka një fazë të gjatë tharjeje të heshtur përpara një shkarkimi përfundimtar të vonuar që po humbet - një dritare më e gjerë e lejon kohëzgjatjen e mësuar të ndjekë zhvendosjen sezonale (ujë hyrës më i ftohtë = cikle më të gjata) në vend që të bllokohet në mesataren e vjetër. Ai vetëm sa e shkurton pritjen në raport me kufirin e brendshëm 30-minutësh të kulmit të fundit, kurrë nuk e zgjat." + } + }, + "setting_group": { + "auto_labeling": { + "label": "Etiketim automatik" + }, + "cycle_end": { + "label": "Fundi i ciklit" + }, + "cycle_start": { + "label": "Fillimi i ciklit" + }, + "cycle_timers": { + "label": "Kohëmatës cikli" + }, + "data_management": { + "label": "Menaxhimi i të dhënave" + }, + "debug": { + "label": "Korrigjim" + }, + "dishwasher_end": { + "label": "Fundi i ciklit të pjatalarëses" + }, + "door_pause": { + "label": "Dera dhe pauzë" + }, + "dtw_refinement": { + "label": "Rafinim DTW" + }, + "duration_gates": { + "label": "Portat e kohëzgjatjes" + }, + "energy": { + "label": "Energji" + }, + "external_end_trigger": { + "label": "Aktivizues i jashtëm i fundit" + }, + "housekeeping": { + "label": "Mirëmbajtje" + }, + "match_scoring": { + "label": "Vlerësimi i përputhjes" + }, + "messages": { + "label": "Mesazhe" + }, + "power_off": { + "label": "Fikja e energjisë" + }, + "predictive_end": { + "label": "Fund parashikues" + }, + "schedule": { + "label": "Orar" + }, + "services": { + "label": "Shërbime" + }, + "signal_processing": { + "label": "Përpunimi i sinjalit" + }, + "thresholds_gap": { + "label": "Pragjet dhe hendeku" + }, + "timing": { + "label": "Kohëzgjatja" + }, + "unload_reminder": { + "label": "Kujtues shkarkimi" + }, + "watchdog": { + "label": "Rojtar" + }, + "quiet_hours_milestones": { + "label": "Orët e qeta dhe piketat" + }, + "device_info": { + "label": "Informacioni i pajisjes" + }, + "basic_configuration": { + "label": "Konfigurimi bazë" + } + }, + "status": { + "active": "Aktiv", + "all_statuses": "Të gjitha statuset", + "ambiguous": "I paqartë", + "auto_detect": "Zbulim automatik", + "clear": "I qartë", + "completed": "Përfunduar", + "fine_tuning": "duke rregulluar mirë…", + "force_stopped": "Ndaluar me forcë", + "idle": "Joaktiv", + "interrupted": "I ndërprerë", + "ready": "Gati për procesim", + "recording": "Regjistrim", + "training": "Duke stërvitut…", + "saving": "Po ruhet…", + "rebuilding": "Po rindërtohet…", + "analyzing": "Po analizohet…", + "resetting": "Po rivendoset…", + "reverting": "Po kthehet…", + "trimming": "Po pritet…", + "splitting": "Po ndahet…", + "deleting": "Po fshihet…", + "imported": "Importuar" + }, + "tab": { + "advanced": "I avancuar", + "diagnostics": "Diagnostikim", + "history": "Cikle", + "ml": "Trajnim ML", + "pp_cleanup": "Pastrim", + "pp_manage": "Menaxho", + "pp_overview": "Pasqyra", + "pp_phases": "Fazat", + "profiles": "Profile", + "settings": "Cilësimet", + "status": "Pasqyra", + "subtab_phase_catalog": "Katalog fazash", + "subtab_profiles": "Profile", + "maintenance": "Mirëmbajtja", + "playground": "Zona e provave", + "store": "Dyqani" + }, + "tag": { + "early_end": "Fund i hershëm", + "late_start": "Fillim i vonshëm", + "merged": "Cikle të bashkuara", + "noise": "Zhurmë", + "sensor_gap": "Ndërrimi i sensorit", + "split": "Cikël i ndarë", + "wrong_profile": "Profil i gabuar" + }, + "toast": { + "access_saved": "Kontrolli i aksesit u ruajt", + "all_wiped": "Të gjitha të dhënat u fshien", + "analysis_complete_none": "Analiza e plotë: asnjë sugjerim i ri", + "auto_label_complete": "Etiketimi automatik i plotë", + "automation_deleted": "Automatizimi u fshi", + "correction_submitted": "Korrigjimi u dërgua", + "cycle_deleted": "Cikli u fshi", + "cycle_force_stopped": "Cikli u ndalua me forcë", + "cycle_labelled": "Cikli u etiketua", + "cycle_paused": "Cikli u ndal", + "cycle_resumed": "Cikli u vazhdua", + "cycle_trimmed": "Cikli u prit", + "cycles_merged": "Ciklet u bashkuan", + "envelope_rebuilt": "Zarfi u rindërtua", + "envelopes_rebuilt": "Zarfet u rindërtuan", + "export_downloaded": "Eksporti u shkarkua", + "feedback_all_dismissed": "Të gjitha komentet u injoruan", + "feedback_confirmed": "Komenti u konfirmua", + "feedback_dismissed": "Komenti u injorua", + "group_deleted": "Grupi u fshi", + "group_name_required": "Kërkohet emri i grupit", + "group_saved": "Grupi u ruajt", + "import_successful": "Importimi u krye; integrimi po ringarkohet", + "json_required": "Kërkohen të dhëna JSON", + "legacy_removed": "Veprimet e trashëgimit u hoqën", + "logs_exported": "Regjistrat u eksportuan", + "matching_reverted": "Peshat e përputhjes u kthyen te parazgjedhjet", + "min_2_profiles": "Zgjidhni të paktën 2 profile për një grup", + "ml_training_no_improvement": "Trajnimi i plotë: baza e mbajtur (pa përmirësim)", + "models_reverted": "Modelet e pajisjes u kthyen te baza", + "name_required": "Kërkohet emri", + "no_split_found": "Nuk u gjetën ndërrimi të papunë për ndarje", + "panel_settings_saved": "Cilësimet e panelit u ruajtën", + "pg_preset_loaded": "Konfigurimi \"{name}\" u ngarkua", + "pg_preset_saved": "Konfigurimi \"{name}\" u ruajt", + "pg_sugg_loaded": "{n} vlera të sugjeruara u ngarkuan - ekzekuto zonën e provave për krahasim", + "pg_sugg_ml_loaded": "{n} vlera ML të kalibruara u ngarkuan - ekzekuto zonën e provave për krahasim", + "phase_name_required": "Kërkohet emri i fazës", + "phase_updated": "Faza u përditësua", + "phases_saved": "Fazat u ruajtën", + "preferences_saved": "Preferencat u ruajtën", + "profile_name_required": "Kërkohet emri i profilit", + "profile_renamed": "Profili u riemërtua", + "recording_discarded": "Regjistrimi u hodh poshtë", + "recording_saved": "Regjistrimi u ruajt te profili", + "recording_started": "Regjistrimi filloi", + "recording_stopped": "Regjistrimi u ndalua", + "review_saved": "Rishikimi u ruajt", + "settings_conflicts": "Korrigjoni konfliktet e theksuara të cilësimeve para ruajtjes.", + "settings_reverted": "Cilësimet u rivendosën; integrimi po ringarkohet", + "settings_saved": "Cilësimet u ruajtën; integrimi po ringarkohet", + "suggestions_applied": "Sugjerimet u zbatuan; integrimi po ringarkohet", + "suggestions_dismissed": "Sugjerimet u injoruan", + "apply_failed": "Aplikimi dështoi: {error}", + "delete_failed": "Fshirja dështoi: {error}", + "load_more_failed": "Nuk u ngarkuan dot më shumë: {error}", + "maint_add_failed": "Nuk u shtua dot ngjarja: {error}", + "maint_added": "Ngjarja e mirëmbajtjes u shtua", + "maint_delete_failed": "Nuk u fshi dot ngjarja: {error}", + "maint_deleted": "Ngjarja e mirëmbajtjes u fshi", + "relabel_done": "U rietiketuan {count} cikël(e)", + "relabel_failed": "Rietiketimi dështoi: {error}", + "reminders_save_failed": "Nuk u ruajtën dot kujtesat: {error}", + "reminders_saved": "Kujtesat e servisit u ruajtën", + "pause_no_cycle": "Nuk ka cikël aktiv për të ndalur", + "resume_no_cycle": "Nuk ka cikël të ndalur për të vazhduar", + "delete_partial_failed": "Disa artikuj nuk mund të fshiheshin dhe u rikthyen", + "pg_run_gone": "Ai ekzekutim nuk është më i disponueshëm.", + "task_cancelled": "U anulua.", + "processed": "U përpunuan {bits}", + "processed_cycles": "{n} cikël(e)", + "processed_suggestions": "{n} sugjerim(e)", + "processed_models": "{n} model(e) të promovuar", + "store_search_failed": "Kërkimi dështoi: {error}", + "store_connect_failed": "Lidhja dështoi: {error}", + "store_connected": "U lidh me dyqanin e komunitetit", + "store_disconnected": "U shkëput nga dyqani i komunitetit", + "store_error": "Gabim: {error}", + "store_unavailable": "Dyqani i komunitetit nuk është i disponueshëm.", + "store_pick_profile": "Zgjidhni një profil për t'u bashkuar", + "store_name_required": "Shkruani një emër profili", + "store_import_failed": "Importimi dështoi: {error}", + "store_imported": "Importuar në {profile}", + "store_program_required": "Shkruani një emër programi", + "store_no_appliance": "Vendosni së pari markën dhe modelin e pajisjes suaj te Cilësimet.", + "store_share_failed": "Ndarja dështoi: {error}", + "store_shared": "U nda në dyqanin e komunitetit, në pritje të rishikimit.", + "appliance_added": "Pajisja u shtua, në pritje të miratimit", + "thanks_confirming": "Faleminderit që konfirmuat", + "device_approved": "Miratuar nga komuniteti", + "rating_saved": "Vlerësimi i cilësisë u ruajt", + "brand_added": "Marka u shtua, në pritje të miratimit", + "profile_added": "Profili u shtua, në pritje të miratimit", + "saved_except_conflicts": "Ruajtur. Korrigjoni konfliktet e theksuara për të ruajtur pjesën tjetër.", + "share_device_none_sel": "Zgjidhni të paktën një cikël për të ndarë", + "store_device_downloaded": "{p} program(e), {c} regjistrim(e) shtuar", + "store_device_downloaded_phases": "{p} program(e), {c} regjistrim(e), {ph} hartë(a) fazash shtuar", + "store_device_downloaded_settings": "{p} program(e), {c} regjistrim(e), {ph} hartë(a) fazash, {s} cilësim(e) shtuar", + "store_device_shared": "{n} cikël(-ë) ndajur në dyqanin e komunitetit - në pritje të rishikimit.", + "store_device_shared_all_dup": "Të gjitha {n} ciklet ishin tashmë në dyqanin e komunitetit.", + "store_device_shared_partial": "{n} cikle ndajur; {failed} nuk u ngarkuan.", + "store_device_shared_some_dup": "{created} cikle ndajur; {dup} ishin tashmë në dyqan.", + "store_download_failed": "Shkarkimi dështoi: {error}", + "store_download_nothing": "Asgjë e re për të shkarkuar - ky konfigurim është tashmë në pajisjen tuaj.", + "export_selective_done": "Eksporti u shkarkua", + "import_selective_done": "U importuan {profiles} profil(e) dhe {cycles} cikël(cikle)" + }, + "suggestion": { + "both_agree": "WashData rekomandon", + "calibrated_label": "I kalibruar", + "observed_label": "I vëzhguar", + "impact": { + "auto_label_confidence": { + "higher": "Etiketimet automatike zvogëlohen; më shumë cikle shkojnë për rishikim", + "lower": "Etiketimet automatike rriten; disa mund të identifikohen gabim" + }, + "duration_tolerance": { + "higher": "Pranon gamë më të gjerë kohëzgjatjeje – përputhje më fleksibël", + "lower": "Kërkon përputhje më të ngushtë kohëzgjatjeje – më rigoroze por mund të refuzojë cikle të pazakonshme" + }, + "end_energy_threshold": { + "higher": "Mbyll vetëm ciklet që kanë konsumuar energji të konsiderueshme", + "lower": "Mbyll edhe ciklet e shkurtra ose me konsum të ulët energjie" + }, + "end_repeat_count": { + "higher": "Kërkon që sinjali i fundit të përsëritet më shumë herë – më i qëndrueshëm, pak më i ngadaltë", + "lower": "Mbyllet pas përsëritjeve më të pakta – detektim më i shpejtë, rrezik më i lartë mbylljeje false" + }, + "learning_confidence": { + "higher": "Mëson vetëm nga përputhjet me besueshmëri shumë të lartë – më e ngadaltë por më e besueshme", + "lower": "Mëson nga më shumë cikle; modeli mund të jetë më i zhurmshëm" + }, + "min_off_gap": { + "higher": "Nevojitet pushim më i gjatë para se të fillojë një cikël i ri", + "lower": "Pushimi i shkurtër nis ciklin e ri – rrotullimet e njëpasnjëshme mund të ndahen" + }, + "min_power": { + "higher": "Më pak e ndjeshme ndaj konsumit në gjendje pritjeje; mund të humbasë programe shumë të heshtura", + "lower": "Më e ndjeshme; mund të regjistrojë fuqinë e pritjes si aktivitet" + }, + "no_update_active_timeout": { + "higher": "Më shumë kohë para se të deklarohet cikli i bllokuar", + "lower": "Ndërpret ciklin e bllokuar më shpejt" + }, + "off_delay": { + "higher": "Më shumë kohë për pauza të pajisjes – trajton faza të gjata njomjeje ose tharjeje", + "lower": "Detektim më i shpejtë i fundit – i përshtatshëm për pajisje me ndezje/shuarje të qarta" + }, + "profile_match_threshold": { + "higher": "Konfirmon vetëm përputhjet me besueshmëri të lartë; më shumë cikle mbeten pa etiketë", + "lower": "Përputhet me më shumë cikle; disa mund të jenë paksa të gabuara" + }, + "running_dead_zone": { + "higher": "Injoron kumbëzat e shkurtra të fuqisë gjatë pushimit – më pak e ndjeshme ndaj zhurmës", + "lower": "Reagron ndaj shpërthimeve më të shkurtra të fuqisë – kap aktivitetin kalimtar të shpejtë" + }, + "start_threshold_w": { + "higher": "Shmang startet false nga kumbëzat e shkurtra të fuqisë", + "lower": "Kap programet me fuqi të ulët; mund të aktivizohet nga zhurma" + }, + "stop_threshold_w": { + "higher": "Mbyll ciklin më shpejt – mund të mbyllet gjatë një pauze", + "lower": "Pret më gjatë para mbylljes – redukton përfundimet e parakohshme" + }, + "watchdog_interval": { + "higher": "Lejon faza më të gjata të heshtura; më pak ndërprerje false", + "lower": "Kap ciklet e bllokuara më agresivisht" + } + }, + "reason": { + "auto_label_confidence": "Besueshmëria e percentilit të 15-të e {cycles} etiketave automatike që përdoruesi nuk i korrigjoi kurrë ({p15}).", + "completion_min_seconds": "Gjysma e kohëzgjatjes p05 të cikleve të pastra ({minutes} min) në {cycles} cikle; filtron ciklet e rreme.{excl}", + "dead_zone_batch": "Mbahet i shkurtër (dritarja mesatare e paqëndrueshmërisë në nisje në {cycles} cikle = {s}s) që një fund i vërtetë të zbulohet menjëherë.", + "dead_zone_from_dip": "Bazuar në një rënie të hershme të fuqisë të zbuluar në {s}s.", + "end_energy_default": "Baza e rekomanduar e paracaktuar për pragun e zhurmës në fund të ciklit.", + "end_energy_false": "Energjia p95 e fundit të rremë ({p95}Wh) në {cycles} cikle, e kufizuar në minimum në 0.2% të energjisë mesatare të ciklit ({floor}Wh).", + "end_energy_no_false": "Asnjë fund i rremë në {cycles} cikle; e kufizuar në minimum në 0.2% të energjisë mesatare të ciklit ({floor}Wh).", + "end_repeat_count": "{false}/{total} cikle të pastra ({pct}%) patën një pauzë të brendshme >60s që vazhdoi; kërkohen {val} konfirmim(e) fundi.", + "learning_confidence": "Besueshmëria p05 e {cycles} cikleve të etiketuara nga përdoruesi ({p05}); nën këtë vlerë, kërkohet verifikim.", + "match_interval": "Bazuar në ritmin e vëzhguar të përditësimit (mesatarja={median}s) * 10.", + "max_duration_ratio": "Bazuar në kohëzgjatjet e cikleve të etiketuara (p95={p95}).", + "min_active": "Bazuar në fuqinë minimale aktive ({min}W) të vëzhguar në ciklin e fundit.", + "min_duration_ratio": "Mbahet sa më i ulët që një program të njihet herët në cikël; pragjet e besueshmërisë dhe të paqartësisë parandalojnë konfirmimet e parakohshme.", + "min_off_gap": "Bazuar në {gaps} boshllëqe të vëzhguara ndërmjet cikleve (p05={p05}s). Kufiri minimal i pajisjes: {floor}s.", + "min_off_gap_bridge": "Përcaktuar që të kapërcejë periudhën më të gjatë të qetësisë brenda ciklit: {span}s + 60s rezervë, nga {spans} boshllëqe të kapërcyera në {cycles} cikle të pastra (qëndron nën {ceiling}s, pauza më e shkurtër që lini midis dy nisjeve të njëpasnjëshme).", + "min_power": "40% e fuqisë aktive më të ulët p05 ({p05}W) në {cycles} cikle të pastra, duke e mbajtur pragun e fikjes nën konsumin real.{excl}", + "ml_auto_label": "Besueshmëria më e ulët që modeli i cilësisë e vlerësoi ende si të pastër (p10 e {cycles} cikleve të pastra = {p10}).", + "ml_end_repeat": "{false}/{total} cikle ({pct}%) patën një pauzë që zbuluesi i fundit e vlerësoi >50%; kërkohen {val} konfirmim(e) fundi.", + "ml_off_delay": "Pauza të konfirmuara nga zbuluesi i fundit: p95 {p95}s + 60s rezervë, nga {pauses} pauza të verifikuara nga modeli në {cycles} cikle (kufiri minimal {floor}s).", + "no_update_timeout": "Bazuar në ritmin e vëzhguar të përditësimit (p95={p95}s) * 20 (min. 60s).", + "off_delay_cadence": "Bazuar në ritmin e vëzhguar të përditësimit (p95={p95}s) * 5", + "off_delay_device_floor": "U përdor minimumi i sigurt specifik për pajisjen {device} ({floor}s).", + "off_delay_generic_floor": "U përdor minimumi i sigurt i përgjithshëm ({floor}s).", + "off_delay_pauses": "Përcaktuar që të zgjasë më shumë se pauzat e vërteta: pauza brenda ciklit p95 {p95}s + 60s rezervë, nga {pauses} pauza në {cycles} cikle të pastra (kufiri minimal {floor}s).", + "profile_match_threshold": "Besueshmëria p10 e {cycles} etiketave automatike të sakta ({p10}); kufi i sigurt i konfirmimit të drejtpërdrejtë.", + "sampling_interval": "Intervali mesatar i përditësimit i vëzhguar në {cycles} cikle të pastra ({si}s).{excl}", + "smoothing_window": "Përcaktuar që të zbusë ~30s leximesh me kampionim {si}s ({samples} kampione).", + "start_duration": "Mbahet i shkurtër (~një interval kampionimi {si}s) që zbulimi të fillojë sa më herët të jetë e mundur, duke injoruar njëkohësisht majat e një kampioni të vetëm.", + "thr_batch": "Mbahet pak mbi fuqinë aktive më të ulët p05 në {cycles} cikle ({p05}W) që një nisje të kapet sa më herët të jetë e mundur dhe pragu i ndalimit të mbetet nën fuqinë më të ulët të punës së makinës.", + "tol_per_profile": "p75 e variancës së kohëzgjatjes për profil në {profiles} profile ({cycles} cikle); profilet e qëndrueshme nuk penalizohen.", + "tol_pooled": "Bazuar në variancën e bashkuar të kohëzgjatjes së {cycles} cikleve të fundit të etiketuara (devijimi p95={dev}).", + "watchdog": "Mbahet sa më i ulët në mënyrë të sigurt (pak mbi boshllëkun e përditësimit p95 prej {p95}s, min. 30s) që bllokimet të kapen shpejt pa ndalime të rreme." + }, + "exclusions": { + "summary": "U përjashtuan {total} cikle të zbuluar gabimisht: {parts}.", + "reason": { + "force_stopped": "të ndalur me forcë", + "interrupted": "të ndërprerë", + "incomplete": "të papërfunduar", + "noise": "zhurmë", + "unlabeled": "pa etiketë", + "no_trace_short": "shumë të shkurtër për t'u inspektuar", + "high_start": "të nisur me fuqi të lartë", + "abrupt_end": "të përfunduar papritur", + "mid_restart": "të rinisur në mes të ciklit", + "no_power": "pa fuqi", + "no_active_power": "pa fuqi aktive" + } + } + }, + "trend": { + "down": "Tendencë rënëse", + "up": "Tendencë rritëse" + }, + "maint": { + "bearing_service": "Servisi i kushinetave", + "descale": "Heqja e gurëve", + "drum_clean": "Pastro tamburin", + "filter_clean": "Pastro filtrin", + "other": "Tjetër" + }, + "pg_desc": { + "completion_min_seconds": "Ekzekutimi më i shkurtër që llogaritet si cikël i vërtetë", + "end_repeat_count": "Lexime të ulëta radhazi para përfundimit", + "interrupted_min_seconds": "Ciklet e shkurtra shënohen si të ndërprera", + "min_off_gap": "Hendeku i nevojshëm për të ndarë dy cikle", + "off_delay": "Sekonda me fuqi të ulët para se të mbarojë cikli", + "start_duration_threshold": "Sekonda mbi prag për të konfirmuar nisjen", + "start_threshold_w": "Watt minimalë për t'u llogaritur si nisur", + "stop_threshold_w": "Nën këtë, makina llogaritet e fikur", + "anti_wrinkle_enabled": "Thith pulset e rrotullimit pas fazës kryesore në vend që t'i lexojë si cikle të reja", + "anti_wrinkle_exit_power": "Fuqia duhet të bjerë nën këtë mes pulseve që modaliteti kundër rrudhave të qëndrojë aktiv", + "anti_wrinkle_idle_timeout": "Koha e qetësisë e lejuar mes dy pulseve të rrotullimit para se të mbarojë modaliteti kundër rrudhave", + "anti_wrinkle_max_duration": "Një puls më i gjatë se ky e mbaron modalitetin kundër rrudhave dhe hap një cikël të ri", + "anti_wrinkle_max_power": "Një puls mbi këtë e mbaron modalitetin kundër rrudhave dhe hap një cikël të ri", + "dtw_bandwidth": "Etapa 3: brez deformimi Sakoe-Chiba (0 = DTW joaktiv; parazgjedhja 0.2 = 20% e gjatësisë së ciklit)", + "corr_weight": "Etapa 2: balancë mes formës së kurbës (korrelacion) dhe nivelit të fuqisë (MAE); parazgjedhja 0.45", + "duration_weight": "Etapa 4: sa fortë ndikon marrëveshja e kohëzgjatjes në rezultatin final (parazgjedhja 0.22)", + "energy_weight": "Etapa 4: sa fortë ndikon marrëveshja e energjisë në rezultatin final (parazgjedhja 0.22)", + "profile_match_min_duration_ratio": "Etapa 1: gjatësia minimale e ciklit si pjesë e kohëzgjatjes së profilit; parazgjedhja 0.1 (10%)", + "profile_match_max_duration_ratio": "Etapa 1: gjatësia maksimale e ciklit si pjesë e kohëzgjatjes së profilit; parazgjedhja 1.5 (150%)", + "keep_min_score": "Etapa 2: rezultati minimal për të qëndruar në garë; parazgjedhja 0.1 pranon përputhje të dobëta, etapat e mëvonshme zgjedhin më të mirën", + "dtw_blend": "Etapa 3: 0 = vetëm rezultati bazë, 1 = vetëm rezultati DTW, 0.5 = përzierje e barabartë (parazgjedhja)", + "dtw_ensemble_w": "Etapa 3 (modaliteti ansambël): pesë për L1-e shkallëzuar kundrejt DTW derivativ; parazgjedhja 0.7 favorizon nivelin e fuqisë", + "dtw_ddtw_scale": "Etapa 3: distanca e gjysmë-ngopjes DDTW; më e vogël = më e ndjeshme ndaj formës (parazgjedhja 30)", + "dtw_refine_top_n": "Etapa 3: kandidatë të rishënuara nga DTW; rriteni në 7-9 nëse profili i saktë renditet i 4-5 (parazgjedhja 5)", + "duration_scale": "Etapa 4: raporti logaritmik ku marrëveshja e kohëzgjatjes gjysmohet; më i vogël = ndëshkim më i rreptë (parazgjedhja 0.175)", + "energy_scale": "Etapa 4: raporti logaritmik ku marrëveshja e energjisë gjysmohet; më i vogël = ndëshkim më i rreptë (parazgjedhja 0.25)", + "dishwasher_end_spike_quiet_release": "Pjatalarëse: sekonda qetësie pas kohëzgjatjes së pritur para se të lirohet pritja e shkarkimit në fund të ciklit" + }, + "col": { + "profile_tip": "Emri i programit të përputhur. I paetiketuar do të thotë se asnjë profil nuk u përputh në fund të ciklit.", + "status_tip": "Përfundimi i ciklit: I përfunduar (fund natyror), I ndërprerë (rënie e menjëhershme e energjisë), I Ndaluar me Forcë (manual), ose Kërkon Shqyrtim (reagim në pritje).", + "date_tip": "Data dhe ora kur filloi cikli.", + "duration_tip": "Koha e plotë e ekzekutimit të ciklit nga fillimi deri në fund.", + "energy_tip": "Energjia e plotë e konsumuar (kWh). Llogaritur duke integruar fuqinë me kalimin e kohës.", + "cost_tip": "Kostoja e energjisë për këtë cikël, e ngrirë në përfundim duke përdorur çmimin në fuqi atëherë (energjia x çmimi për kWh). Vendos një çmim te Cilësimet për ta plotësuar.", + "confidence_tip": "Besueshmëria e përputhjes së profilit (0-100%). Sa afër përputhej kurba e fuqisë së ciklit me programin e identifikuar.", + "health_tip": "Shëndeti ML i ciklit (më lart = më mirë). Kliko një cikël për ta inspektuar dhe shqyrtuar.", + "flags_tip": "Flamujt e rishikimit, anomalive dhe burimit për ciklin. Vendosni miun mbi ikonë për detaje." + }, + "stat": { + "avg": "mesatare", + "min": "min {v}", + "max": "maks {v}", + "consistency": "qëndrueshmëri ±{v}", + "total": "gjithsej {v}", + "last_run": "ekzekutimi i fundit {v}", + "score": "rezultati {pct}%", + "duration_cv": "CV e kohëzgjatjes {pct}%", + "avg_confidence": "besueshmëria mesatare {pct}%" + }, + "pg_evd": { + "detected": "Zbuluesi njohu që kishte filluar një cikël.", + "match_commit": "Përputhësi zgjodhi një program me besueshmëri të mjaftueshme.", + "match_changed": "Programi kryesues ndryshoi ndërsa u pa më shumë nga cikli.", + "match_ambiguous": "Dy programe morën rezultate të afërta, prandaj përputhja ishte e pasigurt.", + "unmatched": "Asnjë program i ruajtur nuk i përshtatej këtij cikli.", + "notify_start": "Do të dërgohej një njoftim fillimi.", + "notify_pre_complete": "Do të dërgohej një njoftim «pothuajse gati».", + "notify_finish": "Do të dërgohej një njoftim përfundimi.", + "notify_milestone": "Do të dërgohej një njoftim për një moment kyç.", + "notify_held": "Një njoftim u mbajt për shkak të orëve të qeta.", + "finished": "Cikli arriti gjendjen përfundimtare dhe përfundoi." + }, + "store": { + "browse": "Shfleto", + "device": "Pajisja", + "favorites": "Të preferuarat", + "search_ph": "Kërko sipas markës ose modelit…", + "no_results": "Nuk u gjetën pajisje përkatëse. Provoni një kërkim tjetër.", + "n_programs": "{n} programe", + "n_cycles": "{n} cikle", + "no_programs": "Ende nuk ka programe të ndara për këtë pajisje.", + "no_cycles": "Ende nuk janë ndarë cikle referuese për këtë program.", + "anon": "anonim", + "uploaded_by": "Ndarë nga {name}", + "connected_as": "Lidhur si {name}", + "not_connected": "I palidhur. Lidhni një llogari GitHub për të ndarë ciklet tuaja.", + "import_new": "Profil i ri", + "import_merge": "Bashko me ekzistuesin", + "merge_target": "Bashko në profil", + "description": "Përshkrimi (opsionale)", + "contributed_by": "nga {name}", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "Ende pa vlerësime", + "website": "Faqja e dyqanit ↗", + "website_tip": "Hapni faqen e dyqanit komunitar" + }, + "settings": { + "gear": { + "title": "Cilësimet" + } + }, + "link": { + "manual": "Manuali ↗", + "add_appliance": "Shtoni pajisjen tuaj" + }, + "tip": { + "add_brand": "Marka nuk është në listë? Shtojeni në katalogun e komunitetit", + "add_appliance": "Modeli nuk është në listë? Shtoni pajisjen tuaj në katalogun e komunitetit", + "add_profile": "Shtoni një profil për këtë pajisje në sitin e komunitetit" + }, + "task": { + "reprocess": { + "matching": "Ripërpunim: përputhja e cikleve", + "golden": "Ripërpunim: shënimi i cikleve referues", + "suggestions": "Ripërpunim: sugjerime", + "ml_training": "Ripërpunim: trajnimi i ML-së", + "health": "Ripërpunim: shëndeti i cikleve" + }, + "pg_sweep": { + "optimize": "Optimizim: {param}" + }, + "pg_detail": { + "simulate": "Simulimi i ciklit" + }, + "split": { + "apply": "Ndarja e ciklit" + }, + "trim": { + "apply": "Prerja e ciklit" + }, + "merge": { + "apply": "Bashkimi i cikleve" + }, + "rebuild": { + "envelopes": "Rindërtimi i zarfave" + } + }, + "setup": { + "hdr": { + "card": "Konfigurimi i pajisjes", + "healthy_chip": "Konfigurimi u kompletua" + }, + "phase0": { + "washer": "WashData tashmë po zbulon ciklet tuaja. Regjistroni ciklin tuaj të parë për të aktivizuar emrat e programeve dhe vlerësimet e kohës.", + "dishwasher": "WashData po vëzhgon. Lavatriçet e enëve kanë cikle komplekse – regjistrimi i ciklit tuaj të parë rekomandohet fuqimisht. Nëse një cikël i zbuluar zgjat shumë, përdorni redaktuesin e ciklit për ta prerë para se ta ruani si profil.", + "generic": "WashData po vëzhgon. Regjistroni ose etiketoni një cikël të zbuluar për të filluar ndërtimin e profileve." + }, + "phase1a": { + "labelled": "Fillim i mirë – programi juaj i parë është ruajtur. Për të dhëna sa më të pastra, merrni parasysh regjistrimin e ciklit tuaj të ardhshëm me veglën e regjistruesit." + }, + "phase1b": { + "recorded": "Regjistrimi juaj u ruajt si {profile_name}. Tani regjistroni ose etiketoni programet tuaja të tjera të zakonshme për të ndërtuar mbulimin." + }, + "phase1c": { + "verify": "Keni {count} programe nga komuniteti. Ekzekutoni një cikël për të verifikuar nëse WashData e njeh saktë – përputhja do të përmirësohet ndërsa pajisja juaj ndërton historinë e vet." + }, + "phase2": { + "cluster": "WashData ka parë {count} cikle që nuk përputhen me asnjë program të ruajtur – ato duken të ngjashme me njëra-tjetrën. Dëshironi të krijoni një profil të ri për to?", + "unmatched": "Cikli juaj i fundit nuk u përputh me asnjë program të ruajtur. A është një program i ri?" + }, + "phase3": { + "suggestions": "WashData ka rekomandime për cilësimet bazuar në historikun tuaj të cikleve – shqyrtojini ato për të përmirësuar saktësinë e zbulimit.", + "groups": "Disa nga profilet tuaja duken si i njëjti program në temperatura të ndryshme. Organizojini ato në një grup për përputhje më të mirë.", + "phases": "Shtoni faza programi te {profile_name} për vlerësime më të sakta të kohës së mbetur." + }, + "phase4": { + "healthy": "Kjo pajisje është konfiguruar plotësisht ({profile_count} profile)." + }, + "cta": { + "start_recording": "Fillo regjistrimin", + "label_detected_cycle": "Kam tashmë një cikël të zbuluar – etiketoje atë", + "browse_cycles": "Shfleto ciklet për të etiketuar një tjetër", + "view_profiles": "Shiko profilet tuaja", + "create_from_cluster": "Krijo profil nga këto cikle", + "create_profile": "Krijo një profil për të", + "review_suggestions": "Shqyrto sugjerimet", + "organise_profiles": "Organizo profilet", + "configure_phases": "Konfiguro fazat", + "skip_step": "Anashkalo këtë hap", + "skip_forever": "Mos shfaq më", + "hide_guidance": "Fshih udhëzuesin", + "show_guidance": "Shfaq udhëzuesin" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/sr-Latn.json b/custom_components/ha_washdata/translations/panel/sr-Latn.json index fb1cd471..001becfb 100644 --- a/custom_components/ha_washdata/translations/panel/sr-Latn.json +++ b/custom_components/ha_washdata/translations/panel/sr-Latn.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entitet nije pronađen", + "running_long": "Traje predugo", + "remaining": "preostalo", + "progress": "napredak", + "show_time_remaining": "Prikaži preostalo vreme", + "show_percentage": "Prikaži procenat", + "layout": { + "tile": "Pločica (kompaktno)", + "detail": "Detaljno (bogato)", + "glance": "Pregled (više uređaja)" + }, + "btn": { + "pause": "Pauziraj", + "resume": "Nastavi", + "terminate": "Završi ciklus", + "record_start": "Započni snimanje", + "record_stop": "Zaustavi snimanje", + "program": "Program", + "open_panel": "Otvori WashData" + }, + "editor": { + "layout": "Izgled", + "entity": "Entitet uređaja", + "entities": "Uređaji", + "title": "Naslov", + "icon": "Ikona", + "show_state": "Prikaži stanje", + "show_program": "Prikaži program", + "show_progress_bar": "Prikaži traku napretka", + "spin_icon": "Rotiraj ikonu tokom rada", + "display_mode": "Red sa detaljima", + "active_color": "Zamena aktivne boje", + "show_phase": "Prikaži fazu", + "show_energy": "Prikaži energiju i trošak", + "show_anomaly": "Prikaži upozorenje o produženju", + "show_sparkline": "Prikaži grafikon snage uživo", + "buttons": "Dugmad za radnje", + "program_entity": "Entitet programa (zamena)", + "time_entity": "Entitet vremena (zamena)", + "pct_entity": "Entitet napretka (zamena)", + "power_entity": "Entitet snage (zamena)", + "tap_action": "Radnja dodira", + "hold_action": "Radnja držanja", + "double_tap_action": "Radnja dvostrukog dodira" + } + }, "badge": { "artifact_tip": "Otkriveno je {n} anomalija (npr. vrata otvorena usred ciklusa) – otvorite da ih vidite na grafikonu", "auto": "(automatski otkriveno)", @@ -64,6 +112,21 @@ "discard": "Odbaci", "discard_tip": "Odbaci snimljeni trag bez čuvanja", "dismiss": "Odbij", + "mute_suggestion": "Prestani predlagati ovo podešavanje", + "pg_load_calibrated": "Učitaj kalibrisano (ML) ({n})", + "pg_load_calibrated_tip": "Učitaj ML-kalibrisana podešavanja kao zamene u testnom okruženju", + "pg_load_live": "Učitaj aktivna podešavanja", + "pg_load_live_tip": "Ponovo pročitaj trenutna podešavanja integracije i odbaci sve izmene u testnom okruženju", + "pg_load_suggested": "Učitaj predloženo ({n})", + "pg_load_suggested_tip": "Učitaj trenutne predloge automatskog podešavanja kao zamene u testnom okruženju", + "pg_preset_delete": "Izbriši konfiguraciju", + "pg_preset_load": "Učitaj konfiguraciju", + "pg_preset_load_tip": "Zameni vrednosti u testnom okruženju ovom konfiguracijom (aktivna podešavanja ostaju netaknuta)", + "pg_preset_save": "Sačuvaj kao konfiguraciju", + "pg_preset_save_tip": "Sačuvaj sve vrednosti ispod kao imenovanu konfiguraciju za ovaj uređaj", + "pg_publish_all": "Primeni {n} na integraciju", + "pg_publish_one": "Primeni {label} na integraciju", + "reset_muted": "Resetuj utišane", "done": "Gotovo", "edit": "Uredi", "export": "Izvezi", @@ -275,6 +338,7 @@ "no_automations": "Nijedna automatizacija ne referencira ovaj uređaj još.", "panel_settings": "Podešavanja panela", "param_sweep": "Ispitivanje parametra", + "pg_settings_source": "Izvor podešavanja", "phase_catalog": "Katalog faza", "playground": "Testno okruženje", "process_history": "Istorija procesa", @@ -348,6 +412,7 @@ "default_access_level": "Zadani nivo za korisnike koji nisu navedeni ispod", "default_other": "Podrazumevano (ostali uređaji)", "default_tab": "Podrazumevana kartica pri otvaranju panela", + "font_size": "Veličina fonta panela", "delta": "Δ", "description": "Opis", "dtw_blend_w": "Težina mešanja", @@ -415,6 +480,9 @@ "pg_match_score": "Ocena poklapanja", "pg_pct_of": "{p}% od {total}", "pg_poor_match": "Loše poklapanje", + "pg_preset": "Konfiguracija testnog okruženja", + "pg_preset_name": "Naziv nove konfiguracije", + "pg_preset_none": "Izaberite konfiguraciju…", "pg_strong_match": "Snažno poklapanje", "pg_tile_ambiguous": "Dvosmisleni", "pg_tile_ambiguous_tip": "Ciklusi sa gotovo izjednačenim poklapanjem između dva programa", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Primeniti najbolju vrednost: {label} = {value}?", "pg_canvas_empty": "Izaberite ciklus iznad, zatim pritisnite „Učitaj“ da vidite njegovu krivu snage.", "pg_chart_caption": "Stopa otkrivanja/poklapanja po vrednostima {param}", + "pg_ctrl_intro": "Vrednosti polaze od aktivnih podešavanja integracije za ovaj uređaj. Izmene ostaju u testnom okruženju dok ih ne primenite.", + "pg_live_unavailable": "Aktivna podešavanja nisu dostupna, prikazane su zadane vrednosti.", + "pg_load_live_confirm": "Odbaciti izmene u testnom okruženju ({n}) i ponovo učitati trenutna podešavanja integracije?", "pg_match_rate": "{pct}% poklapanja na {total} ciklusa", + "pg_matches_live": "Odgovara aktivnim podešavanjima", + "pg_n_changed": "Promene u odnosu na aktivna podešavanja: {n}", + "pg_sugg_none": "Svi predlozi već odgovaraju trenutnim podešavanjima", + "pg_preset_delete_confirm": "Izbrisati konfiguraciju \"{name}\"?", + "pg_preset_limit": "Dostignut limit konfiguracija ({n})", + "pg_preset_overwrite": "Prepisati konfiguraciju \"{name}\"?", + "pg_publish_one_confirm": "Sačuvati {label} = {value} u podešavanja ovog uređaja?", "pg_restart_note": "Ponovo pokrenite Home Assistant da biste omogućili alatke za simulaciju.", "pg_sim_progress": "{done} / {total} ciklusa", "pg_starting": "Pokretanje…", @@ -789,6 +867,7 @@ "preferences_admin": "Preference, panel i kontrola pristupa", "preferences_adv": "Preference", "prefs_personal": "Ovo se odnosi samo na vaš Home Assistant nalog.", + "font_size_hint": "Povećajte ili smanjite sve u ovom panelu. Primenjuje se na vaš nalog na ovom uređaju.", "process_history_hint": "Ponovo pokrenite uparivanje na svim sačuvanim ciklusima, osvežite predloge podešavanja, ponovo trenirajte ML modele (ako su omogućeni) i ponovo izračunajte zdravlje ciklusa. Pokrenite nakon niza recenzija.", "profile_deleted": "Profil obrisan", "profile_poor_health_detail": "Ciklusi koji su dodeljeni ovom profilu imaju nedosledne oblike ili nisku pouzdanost. Razmislite o ponovnoj izgradnji omotača ili pregledu označenih ciklusa.", @@ -821,6 +900,10 @@ "split_intro": "Klikni na grafikon za dodavanje ili uklanjanje tačke deljenja, ili automatski otkrij po prazninama. Svaki rezultujući segment može dobiti sopstveni profil.", "storage_diagnostics": "Statistike skladištenja, održavanje, izvoz/uvoz", "sug_staged": "Postavljeno {key} = {val}. Sačuvajte za primenu.", + "sug_muted": "Ovo podešavanje neće biti predlagano ponovo", + "sug_mute_failed": "Predlog nije mogao biti utišan", + "sug_unmuted_all": "Utišani predlozi su resetovani", + "n_suggestions_muted": "{count} utišano; auto-podešivač neće predlagati ova podešavanja.", "toast_auto_detect_enabled": "Automatsko otkrivanje omogućeno", "toast_auto_label_complete": "Automatsko označavanje završeno", "toast_auto_label_failed": "Automatsko označavanje nije uspelo: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Trajanje u trendu kraće ({pct}%/ciklus) – nedavno u proseku {avg}", "trend_energy_down": "Energija opada ({pct}%/ciklus)", "trend_energy_up": "Energetski trend raste ({pct}%/ciklus) – nedavni prosek {avg}", + "trim_destructive_confirm": "Ovo zadržava samo {pct}% ciklusa i ne može se poništiti. Nastaviti?", "trim_intro": "Prevuci crvene ručice ili unesi vrednosti. Sve izvan prozora se uklanja.", "tuning_suggestions_available": "{count} prijedlog podešavanja dostupan je iz posmatranih ciklusa. Pojavljuju se pored relevantnih polja.", "unsure_detected_prefix": "WashData nije siguran da je otkrio", @@ -970,6 +1054,10 @@ "unusable": "Neupotrebljivo" }, "section": { + "dishwasher": { + "label": "Mašina za pranje sudova", + "intro": "Obrada kraja ciklusa za mašine za pranje sudova, koje se obično završavaju dugom, gotovo tihom fazom sušenja pre kratkog završnog ispumpavanja vode." + }, "anti_wrinkle": { "intro": "Režim zaštite od gužvanja tkanine detektuje kratke pulseve tumblovanja pri niskoj snazi nakon glavne faze i drži ih pripisanim završenom ciklusu.", "label": "Zaštita od gužvanja" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Otpuštanje nakon tihe faze sušenja", + "doc": "Kada ciklus pređe svoje očekivano trajanje, koliko dugo mašina mora ostati tiha (ispod Praga zaustavljanja) pre nego što WashData prestane da čeka na završno ispumpavanje vode i završi ciklus. Povećajte ako vaš uređaj ima dugu tihu fazu sušenja pre kasnog završnog ispumpavanja koje se propušta - šire okno omogućava da naučeno trajanje prati sezonske promene (hladnija dovodna voda = duži ciklusi) umesto da ostane zaključano na staroj prosečnoj vrednosti. Čekanje samo skraćuje u odnosu na interno ograničenje završnog ispumpavanja od 30 minuta, nikada ga ne produžava." + }, "anti_wrinkle_enabled": { "doc": "Prepoznajte kratke impulse male snage koje mašina za sušenje emituje nakon glavne faze grejanja i držite ih povezanim sa završenim ciklusom umesto da ih čitate kao nove cikluse.", "label": "Omogući detekciju zaštite od gužvanja" @@ -1232,6 +1324,10 @@ "doc": "Nekoliko minuta nakon završetka ciklusa pre slanja podsetnika „istovarite mašinu“ koji još uvek čeka. Postavite 0 da biste onemogućili podsetnik.", "label": "Kašnjenje podsetnika za istovar" }, + "notify_unload_repeat": { + "doc": "Ponovo šalje podsetnik za istovar svakih \"Kašnjenje podsetnika za istovar\" minuta dok ne otvorite vrata ili ne dodirnete \"Prestani da podsećaš\" na obaveštenju. Zahteva Entitetu senzora vrata (kao i sam podsetnik). Dugme za odbacivanje radi na obaveštenjima mobilne aplikacije Home Assistant (companion app).", + "label": "Ponavljaj dok se vrata ne otvore" + }, "off_delay": { "doc": "Vreme za čekanje nakon pada struje pre nego što proglasimo ciklus završenim. Ako se napajanje nastavi unutar ovog prozora, ciklus se nastavlja bez problema - ovo premošćuje pauze između faza pranja. Mašine za pranje sudova imaju duge faze sušenja (isključenje na 20-60 min) tako da kašnjenje isključenja mora biti veće od toga da bi se celo pranje+suvo održalo kao jedan ciklus.", "label": "Kašnjenje isklopa" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Ostrina energije", "doc": "Oštrina kazne za nepodudaranje energije u Fazi 4. Manje = strože: nepodudaranje energije više snižava rezultat. Podrazumevana vrednost 0,25 je namerno blaža od Oštrine trajanja jer energija varira s opterećenjem. Koristite zajedno s Težinom energije." + }, + "power_profile_interval_min": { + "label": "Interval profila snage", + "doc": "Veličina segmenta za atribut senzora power_profile po profilu (ravni niz prosečnih vata po slotu koji koriste spoljni planeri kao EMHASS i tibber_prices). Manji segmenti čuvaju kratke skokove snage oštrim; veći segmenti izglađuju oblik. Podrazumevano 15 min. Samo za čitanje; ne utiče na detekciju." + }, + "notify_live_sticky": { + "label": "Zadrži živo obaveštenje na dodir", + "doc": "Samo za Android. Neka obaveštenje o napretku u živo bude trajno (zakačeno) kako ga dodir ne bi odbacio. Isključeno zadržava podrazumevano ponašanje gde dodir odbacuje obaveštenje." + }, + "notify_live_click_action": { + "label": "Cilj dodira živog obaveštenja", + "doc": "Samo za Android. Gde se otvara dodir na obaveštenje o napretku u živo (npr. /lovelace/laundry ili puni URL) umesto početne stranice aplikacije. Ostavite praznim za podrazumevano ponašanje." + }, + "door_opens_at_end": { + "label": "Vrata se automatski otvaraju na kraju", + "doc": "Za mašine za suđe čija se vrata otvaraju na kraju ciklusa radi sušenja (AirDry i slično). Kada je uključeno, otvaranje vrata tokom aktivnog ciklusa više ga ne pauzira zauvek; umesto toga, ako vrata ostanu otvorena tokom vremena zadržavanja ispod, WashData smatra ciklus završenim. Kratko otvaranje (dodavanje posuđa) se zanemaruje. Zahteva entitet senzora vrata." + }, + "door_end_dwell_seconds": { + "label": "Zadržavanje pri otvorenim vratima", + "doc": "Koliko dugo vrata moraju ostati otvorena pre nego WashData završi ciklus, kada je uključeno \"Vrata se automatski otvaraju na kraju\". Dovoljno dugo da se ignoriše brzo dodavanje posuđa (podrazumevano 60 s), dovoljno kratko za brzo završavanje kada mašina otvori vrata." } }, "setting_group": { @@ -1592,6 +1708,7 @@ "min_active": "Na osnovu najmanje radne snage ({min}W) uočene u poslednjem ciklusu.", "min_duration_ratio": "Zadržano što nižim kako bi se program prepoznao rano u ciklusu; pragovi pouzdanosti i dvosmislenosti sprečavaju prevremene potvrde.", "min_off_gap": "Na osnovu {gaps} uočenih razmaka između ciklusa (p05={p05}s). Donja granica uređaja: {floor}s.", + "min_off_gap_bridge": "Postavljeno tako da premosti najduži tihi odsečak unutar ciklusa: {span}s + 60s rezerve, iz {spans} premošćenih razmaka kroz {cycles} čistih ciklusa (ostaje ispod vašeg najkraćeg razmaka između dva uzastopna pokretanja, koji iznosi {ceiling}s).", "min_power": "40 % najniže radne snage p05 ({p05}W) kroz {cycles} čistih ciklusa, čime prag isključenja ostaje ispod stvarne potrošnje.{excl}", "ml_auto_label": "Najniža pouzdanost koju je model kvaliteta još ocenio čistom (p10 od {cycles} čistih ciklusa = {p10}).", "ml_end_repeat": "{false}/{total} ciklusa ({pct}%) imalo je pauzu koju je detektor kraja ocenio sa >50 %; zahtevaj {val} potvrdu(e) kraja.", @@ -1608,7 +1725,7 @@ "thr_batch": "Zadržano tik iznad najniže radne snage p05 kroz {cycles} ciklusa ({p05}W) kako bi se početak uhvatio što ranije, a prag zaustavljanja ostao ispod najniže radne snage mašine.", "tol_per_profile": "p75 varijanse trajanja po profilu kroz {profiles} profila ({cycles} ciklusa); dosledni profili nisu kažnjeni.", "tol_pooled": "Na osnovu objedinjene varijanse trajanja {cycles} novijih označenih ciklusa (p95 odstupanje={dev}).", - "watchdog": "Zadržano što nižim uz bezbednost (3x razmak ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." + "watchdog": "Zadržano što nižim uz bezbednost (tik iznad razmaka ažuriranja p95 od {p95}s, najmanje 30s) kako bi se zastoji brzo uhvatili bez lažnih zaustavljanja." }, "exclusions": { "summary": "Isključeno {total} pogrešno detektovanih ciklusa: {parts}.", @@ -1688,6 +1805,10 @@ "name_required": "Naziv je obavezan", "no_split_found": "Nisu pronađene praznine za deljenje", "panel_settings_saved": "Podešavanja panela sačuvana", + "pg_preset_loaded": "Konfiguracija \"{name}\" učitana", + "pg_preset_saved": "Konfiguracija \"{name}\" sačuvana", + "pg_sugg_loaded": "Učitano {n} predloženih vrednosti - pokrenite testno okruženje za poređenje", + "pg_sugg_ml_loaded": "Učitano {n} ML-kalibriranih vrednosti - pokrenite testno okruženje za poređenje", "phase_name_required": "Naziv faze je obavezan", "phase_updated": "Faza ažurirana", "phases_saved": "Faze sačuvane", @@ -1770,6 +1891,7 @@ "other": "Ostalo" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Mašina za pranje sudova: sekunde tišine nakon očekivanog trajanja pre nego što se otpusti čekanje na završno ispumpavanje vode", "completion_min_seconds": "Najkraće pokretanje koje se računa kao pravi ciklus", "end_repeat_count": "Niska očitavanja zaredom pre završetka", "interrupted_min_seconds": "Kratki ciklusi označeni kao prekinuti", diff --git a/custom_components/ha_washdata/translations/panel/sv.json b/custom_components/ha_washdata/translations/panel/sv.json index ab42d743..64a42c58 100644 --- a/custom_components/ha_washdata/translations/panel/sv.json +++ b/custom_components/ha_washdata/translations/panel/sv.json @@ -1,4 +1,52 @@ { + "card": { + "min": "min", + "entity_not_found": "Entitet hittades inte", + "running_long": "Kör längre", + "remaining": "återstår", + "progress": "förlopp", + "show_time_remaining": "Visa återstående tid", + "show_percentage": "Visa procent", + "layout": { + "tile": "Bricka (kompakt)", + "detail": "Detalj (utförlig)", + "glance": "Överblick (flera enheter)" + }, + "btn": { + "pause": "Pausa", + "resume": "Återuppta", + "terminate": "Avsluta cykel", + "record_start": "Starta inspelning", + "record_stop": "Stoppa inspelning", + "program": "Program", + "open_panel": "Öppna WashData" + }, + "editor": { + "layout": "Layout", + "entity": "Apparatentitet", + "entities": "Apparater", + "title": "Titel", + "icon": "Ikon", + "show_state": "Visa status", + "show_program": "Visa program", + "show_progress_bar": "Visa förloppsindikator", + "spin_icon": "Snurra ikon under körning", + "display_mode": "Detaljrad", + "active_color": "Åsidosätt aktiv färg", + "show_phase": "Visa fas", + "show_energy": "Visa energi och kostnad", + "show_anomaly": "Visa varning för lång körtid", + "show_sparkline": "Visa live-effektgraf", + "buttons": "Åtgärdsknappar", + "program_entity": "Programentitet (åsidosätt)", + "time_entity": "Tidsentitet (åsidosätt)", + "pct_entity": "Förloppsentitet (åsidosätt)", + "power_entity": "Effektentitet (åsidosätt)", + "tap_action": "Tryckåtgärd", + "hold_action": "Håll-åtgärd", + "double_tap_action": "Dubbeltryckningsåtgärd" + } + }, "badge": { "artifact_tip": "{n} anomalier upptäckta (t.ex. dörren öppnades mitt i cykeln) – öppna för att se dem i diagrammet", "auto": "(automatiskt identifierat)", @@ -92,6 +140,19 @@ "pause_cycle_tip": "Pausa den pågående cykeln – apparaten återupptar där den slutade", "pg_apply_device": "Tillämpa på enhet", "pg_autofill": "Autofyll", + "pg_load_calibrated": "Ladda kalibrerade (ML) ({n})", + "pg_load_calibrated_tip": "Laddar ML-kalibrerade inställningar som testyteöverskridanden", + "pg_load_live": "Ladda aktiva inställningar", + "pg_load_live_tip": "Läs in integrationens aktuella inställningar på nytt och kasta alla ändringar i testytan", + "pg_load_suggested": "Ladda förslag ({n})", + "pg_load_suggested_tip": "Laddar auto-tunarens aktuella förslag som testyteöverskridanden", + "pg_preset_delete": "Ta bort förinställning", + "pg_preset_load": "Ladda förinställning", + "pg_preset_load_tip": "Ersätt värdena i testytan med den här förinställningen (de aktiva inställningarna påverkas inte)", + "pg_preset_save": "Spara som förinställning", + "pg_preset_save_tip": "Spara alla värden nedan som en namngiven förinställning för den här enheten", + "pg_publish_all": "Spara {n} till integrationen", + "pg_publish_one": "Spara {label} till integrationen", "play": "Spela", "process": "Bearbeta", "process_history": "Bearbeta nu", @@ -178,7 +239,9 @@ "download_export": "Ladda ner export", "analyze_import": "Analysera fil", "import_selected": "Importera valda", - "back": "Tillbaka" + "back": "Tillbaka", + "mute_suggestion": "Sluta föreslå den här inställningen", + "reset_muted": "Återställ tysta förslag" }, "conflict": { "anti_wrinkle_exit": { @@ -275,8 +338,9 @@ "no_automations": "Inga automatiseringar refererar till denna enhet ännu.", "panel_settings": "Panelinställningar", "param_sweep": "Parametersvep", + "pg_settings_source": "Inställningarnas källa", "phase_catalog": "Faskatalog", - "playground": "Lekplats", + "playground": "Testyta", "process_history": "Processhistorik", "settings_history": "Inställningshistorik", "status": "Status", @@ -410,6 +474,9 @@ "pg_group_detection": "Detekteringsutlösare", "pg_group_timing": "Tidsregler", "pg_idle": "Inaktiv", + "pg_preset": "Förinställning för testytan", + "pg_preset_name": "Namn på ny förinställning", + "pg_preset_none": "Välj en förinställning…", "pg_stress_group": "Test av inaktiv avslutning", "pg_stress_idle_auto": "Auto", "pg_stress_idle_w": "Inaktiv nivå (W)", @@ -609,7 +676,8 @@ "conflict_import_copy": "Importera som kopia", "conflict_keep_mine": "Behåll mina", "conflict_overwrite": "Skriv över", - "pg_anti_wrinkle": "Skrynkelskydd" + "pg_anti_wrinkle": "Skrynkelskydd", + "font_size": "Panelens teckenstorlek" }, "log": { "all_levels": "Alla nivåer", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Tillämpa bästa värdet: {label} = {value}?", "pg_canvas_empty": "Välj en cykel ovan och tryck sedan på Ladda för att se dess effektkurva.", "pg_chart_caption": "Detekterings-/matchningsgrad över värden på {param}", + "pg_ctrl_intro": "Värdena utgår från den här enhetens aktiva inställningar i integrationen. Ändringar stannar i testytan tills du sparar dem till integrationen.", + "pg_live_unavailable": "Aktiva inställningar är inte tillgängliga, visar standardvärden.", + "pg_load_live_confirm": "Kasta {n} ändring(ar) i testytan och läsa in integrationens aktuella inställningar på nytt?", "pg_match_rate": "{pct}% matchningsgrad på {total} cykler", + "pg_matches_live": "Stämmer med de aktiva inställningarna", + "pg_n_changed": "{n} ändrade jämfört med de aktiva inställningarna", + "pg_sugg_none": "Alla förslag matchar redan de aktiva inställningarna", + "pg_preset_delete_confirm": "Ta bort förinställningen \"{name}\"?", + "pg_preset_limit": "Gränsen för förinställningar är nådd ({n})", + "pg_preset_overwrite": "Skriva över förinställningen \"{name}\"?", + "pg_publish_one_confirm": "Spara {label} = {value} till den här enhetens inställningar?", "pg_restart_note": "Starta om Home Assistant för att aktivera simuleringsverktygen.", "pg_sim_progress": "{done} / {total} cykler", "pg_starting": "Startar…", @@ -845,6 +923,7 @@ "trend_duration_shorter": "Varaktighet trendar kortare ({pct}%/cykel) – senaste medelvärde {avg}", "trend_energy_down": "Energin går ned ({pct}%/cykel)", "trend_energy_up": "Energitrend uppåt ({pct}%/cykel) – senaste snitt {avg}", + "trim_destructive_confirm": "Endast {pct}% av cykeln behålls. Detta kan inte ångras. Fortsätta?", "trim_intro": "Dra de röda handtagen eller ange värden. Allt utanför fönstret tas bort.", "tuning_suggestions_available": "{count} inställningsförslag tillgängligt från observerade cykler. De visas bredvid de relevanta fälten.", "unsure_detected_prefix": "WashData är osäker på att den identifierade", @@ -922,9 +1001,15 @@ "merge_hint": "Importerade objekt läggs till; inget lokalt går förlorat. Namnkonflikter löses nedan.", "replace_warn": "Varje ikryssad kategori raderas och ersätts från filen. Icke ikryssade kategorier lämnas orörda.", "dest_reference_hint": "Importerade cykler förbättrar bara programmatchning och påverkar aldrig användnings-/energistatistik.", - "dest_real_history_hint": "Importerade cykler räknas som den här apparatens egen historik och matar energi-/användningsstatistik. Använd detta för att flytta en apparat till en ny installation." + "dest_real_history_hint": "Importerade cykler räknas som den här apparatens egen historik och matar energi-/användningsstatistik. Använd detta för att flytta en apparat till en ny installation.", + "sug_muted": "Kommer inte att föreslå den här inställningen igen", + "sug_mute_failed": "Kunde inte tysta förslaget", + "sug_unmuted_all": "Tysta förslag återställda", + "n_suggestions_muted": "{count} tystade; auto-tunern föreslår inte dessa.", + "font_size_hint": "Gör allt i den här panelen större eller mindre. Gäller för ditt konto på den här enheten." }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Diskmaskin: tysta sekunder efter förväntad varaktighet innan väntan på tömning vid cykelslut frisläpps", "completion_min_seconds": "Kortaste körning som räknas som en riktig cykel", "end_repeat_count": "Antal låga avläsningar i rad innan avslut", "interrupted_min_seconds": "Korta cykler markeras som avbrutna", @@ -998,6 +1083,10 @@ "unusable": "Oanvändbar" }, "section": { + "dishwasher": { + "label": "Diskmaskin", + "intro": "Hantering av cykelslut för diskmaskiner, som vanligtvis avslutas med en lång, nästan ljudlös torkfas före en kort sista tömning." + }, "anti_wrinkle": { "intro": "Skrynkelskyddsläget identifierar korta lågeffektstumlingspulser efter huvudfasen och håller dem kopplade till den avslutade cykeln för att förhindra skrynklor i tvätten.", "label": "Skrynkelskydd" @@ -1040,6 +1129,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "label": "Frisläpp efter tyst torkfas", + "doc": "När cykeln passerar sin förväntade varaktighet: hur länge diskmaskinen måste förbli tyst (under Stopptröskel) innan WashData slutar vänta på en sista tömning och avslutar cykeln. Höj värdet om din maskin har en lång tyst torkfas före en sen sista tömning som missas - ett bredare fönster låter den inlärda varaktigheten följa säsongsvariationer (kallare inloppsvatten = längre cykler) istället för att låsa sig vid det gamla medelvärdet. Det förkortar bara väntetiden i förhållande till den interna gränsen på 30 minuter för slutspiken, aldrig förlänger den." + }, "anti_wrinkle_enabled": { "doc": "Känn igen de korta torktumlarpulser med låg effekt en torktumlare avger efter huvuduppvärmningsfasen och håll dem kopplade till den färdiga cykeln istället för att läsa dem som nya cykler.", "label": "Aktivera skrynkelskyddsdetektering" @@ -1260,6 +1353,10 @@ "doc": "Minuter efter att en cykel har avslutats innan den fortfarande väntande påminnelsen om \"lasta av maskinen\" skickas. Ställ in 0 för att inaktivera påminnelsen.", "label": "Lossningspåminnelsefördröjning" }, + "notify_unload_repeat": { + "doc": "Fortsätter att skicka lossningspåminnelsen igen var \"Lossningspåminnelsefördröjning\" minut tills du öppnar dörren eller trycker på \"Sluta påminna\" i aviseringen. Kräver en Dörrsensorentitet (det gör själva påminnelsen). Avfärda-knappen fungerar på aviseringar från Home Assistant companion-appen (mobil).", + "label": "Upprepa tills dörren öppnas" + }, "off_delay": { "doc": "Dags att vänta efter strömavbrott innan man förklarar att cykeln är avslutad. Om strömmen återupptas inom detta fönster fortsätter cykeln sömlöst - detta överbryggar pauser mellan tvättstegen. Diskmaskiner har långa torkningsfaser (ström av i 20-60 min) så avstängningsfördröjningen måste överstiga den för att hålla hela tvätten+torr som en cykel.", "label": "Avfördröjning" @@ -1434,6 +1531,26 @@ "energy_scale": { "label": "Energiskärpa", "doc": "Skärpan i Steg 4:s straff för energiöverensstämmelse. Lägre = striktare: en energiavvikelse straffas mer. Standard 0,25 är avsiktligt mer tillåtande än varaktighetsskärpan eftersom energiförbrukning varierar med last. Para ihop med Energivikt." + }, + "power_profile_interval_min": { + "label": "Effektprofil-intervall", + "doc": "Storlek på bucket för effektprofilsensorns attribut power_profile (det platta arrayen med genomsnittliga wattvärden per slot som används av externa planerare som EMHASS och tibber_prices). Mindre buckets håller korta effekttoppar skarpa; större buckets jämnar ut kurvan. Standard 15 min. Endast för visning; påverkar inte detektering." + }, + "notify_live_sticky": { + "label": "Behåll live-avisering vid tryck", + "doc": "Endast Android. Gör live-förloppsaviseringen kvarstående (sticky) så att ett tryck inte stänger den. Av: standardbeteende där ett tryck stänger aviseringen." + }, + "notify_live_click_action": { + "label": "Tryckmål för live-avisering", + "doc": "Endast Android. Vart ett tryck på live-förloppsaviseringen öppnar (t.ex. /lovelace/laundry eller en fullständig URL) i stället för appens startsida. Lämna tomt för standard." + }, + "door_opens_at_end": { + "label": "Dörren öppnas automatiskt vid avslut", + "doc": "För diskmaskiner som poppar upp dörren vid cykelslutet för torkning (AirDry och liknande). Med detta aktiverat sätter en döröppning under en aktiv cykel inte den på paus för evigt; om dörren förblir öppen under den konfigurerade uppehållstiden behandlar WashData cykeln som avslutad. En kort öppning (lägga till ett föremål) ignoreras. Kräver en dörrsensorenhet." + }, + "door_end_dwell_seconds": { + "label": "Dörröppningens uppehållstid vid avslut", + "doc": "Hur länge dörren måste förbli öppen innan WashData avslutar cykeln, när \"Dörren öppnas automatiskt vid avslut\" är aktiverat. Tillräckligt länge för att ignorera snabb tilläggning av ett fat (standard 60 s), tillräckligt kort för att avsluta snabbt när maskinen poppar upp dörren." } }, "setting_group": { @@ -1620,6 +1737,7 @@ "min_active": "Baserat på lägsta aktiva effekt ({min}W) som observerades i senaste cykeln.", "min_duration_ratio": "Hålls så låg som möjligt så att ett program känns igen tidigt i cykeln; konfidens- och tvetydighetsgränserna förhindrar förhastade beslut.", "min_off_gap": "Baserat på {gaps} observerade mellanrum mellan cykler (p05={p05}s). Enhetsgolv: {floor}s.", + "min_off_gap_bridge": "Dimensionerad för att överbrygga den längsta tysta perioden inom en cykel: {span}s + 60s buffert, från {spans} överbryggade mellanrum över {cycles} rena cykler (håller sig under ditt kortaste mellanrum på {ceiling}s mellan två körningar).", "min_power": "40% av den lägsta aktiva effekten vid p05 ({p05}W) över {cycles} rena cykler, vilket håller av-tröskeln under verklig förbrukning.{excl}", "ml_auto_label": "Lägsta konfidens som kvalitetsmodellen fortfarande bedömde som ren (p10 av {cycles} rena cykler = {p10}).", "ml_end_repeat": "{false}/{total} cykler ({pct}%) hade en paus som slutdetektorn bedömde till >50%; kräver {val} slutbekräftelse(r).", @@ -1636,7 +1754,7 @@ "thr_batch": "Hålls precis över den lägsta aktiva effekten vid p05 över {cycles} cykler ({p05}W) så att en start fångas så tidigt som möjligt och stopptröskeln stannar under maskinens lägsta driftseffekt.", "tol_per_profile": "p75 för varaktighetsvariansen per profil över {profiles} profiler ({cycles} cykler); snäva profiler bestraffas inte.", "tol_pooled": "Baserat på sammanslagen varaktighetsvarians för {cycles} senaste märkta cykler (p95 avvikelse={dev}).", - "watchdog": "Hålls så lågt som är säkert (3x p95-uppdateringsmellanrummet på {p95}s, min 30s) så att stillestånd upptäcks snabbt utan falska stopp." + "watchdog": "Hålls så lågt som är säkert (strax över p95-uppdateringsmellanrummet på {p95}s, min 30s) så att stillestånd upptäcks snabbt utan falska stopp." }, "exclusions": { "summary": "Uteslöt {total} feldetekterade cykler: {parts}.", @@ -1716,6 +1834,10 @@ "name_required": "Namn krävs", "no_split_found": "Inga tomma luckor hittades för delning", "panel_settings_saved": "Panelinställningar sparade", + "pg_preset_loaded": "Förinställningen \"{name}\" har laddats", + "pg_preset_saved": "Förinställningen \"{name}\" har sparats", + "pg_sugg_loaded": "{n} föreslagna värde(n) inlästa - kör testytan för att jämföra", + "pg_sugg_ml_loaded": "{n} ML-kalibrerade värde(n) inlästa - kör testytan för att jämföra", "phase_name_required": "Fasnamn krävs", "phase_updated": "Fas uppdaterad", "phases_saved": "Faser sparade", diff --git a/custom_components/ha_washdata/translations/panel/tr.json b/custom_components/ha_washdata/translations/panel/tr.json index 0525aec1..b72034a1 100644 --- a/custom_components/ha_washdata/translations/panel/tr.json +++ b/custom_components/ha_washdata/translations/panel/tr.json @@ -1,1948 +1,2070 @@ { - "badge": { - "artifact_tip": "{n} anormallik algılandı (ör. döngünün ortasında kapının açılması) – bunları grafikte görmek için açın", - "auto": "(otomatik algılandı)", - "built_in_tag": "yerleşik", - "declining": "↘ düşüyor", - "energy_low": "Normalden düşük enerji", - "energy_spike": "Normalden yüksek enerji", - "fair_fit": "kabul edilebilir kalite", - "fair_fit_tip": "Orta düzeyde eşleşme tutarlılığı – bu profile atanan bazı döngülerin güven puanları daha düşüktür. Doğruluğu artırmak için daha fazla döngü etiketleyin veya profili yeniden kaydedin.", - "feedback_requested": "Geri bildirim istendi", - "golden_cycle": "Kaydedilen referans döngüsü", - "improving": "↗ iyileşiyor", - "manual": "(manuel seçildi)", - "needs_review": "İncelenmesi gerekiyor", - "overrun": "Normalden daha uzun sürdü", - "poor_fit": "düşük kalite", - "poor_fit_tip": "Tutarsız eşleşme geçmişi – bu profili yeniden oluşturmayı düşünün", - "restart_gap_tip": "{n} HA yeniden başlatma boşluğu: güç izinde bir delik var", - "reviewed": "İncelendi", - "steady": "→ sabit", - "underrun": "Normalden daha hızlı bitti", - "using_defaults": "Varsayılan değerler kullanılıyor", - "using_tuned": "Ayarlanmış ağırlıklar kullanılıyor", - "overrun_ratio": "({x}x beklenen)", - "underrun_ratio": "(beklenenin %{pct}'i)", - "awaiting_tip": "Topluluk onayı bekleniyor", - "awaiting_n": "Onay bekleniyor · {n} onaylandı", - "approved": "Onaylandı", - "awaiting": "Onay bekleniyor", - "imported_tip": "Topluluk mağazasından içe aktarıldı. Yalnızca eşleştirme için kullanılır, istatistiklere sayılmaz.", - "not_importable": "burada geçersiz", - "exists": "mevcut" - }, - "btn": { - "add_device": "+ Cihaz ekle", - "add_device_tip": "Başka bir WashData cihazı ekleyin", - "add_maintenance": "Bakım kaydı ekle", - "add_phase": "+ Aşama ekle", - "add_timer": "+ Zamanlayıcı ekle", - "apply_all": "Tümünü uygula", - "apply_label": "Etiket Uygula", - "apply_set_b": "B setini uygula", - "apply_split": "Bölmeyi Uygula", - "apply_trim": "Kırpmayı Uygula", - "auto_detect_split": "Otomatik algıla", - "auto_label_cycles": "Döngüleri otomatik etiketle", - "auto_label_cycles_tip": "Eşleşme güveni eşiği geçen etiketsiz döngülere otomatik olarak profil adları atayın", - "cancel": "İptal", - "clear_debug": "Hata Ayıklama Verilerini Temizle", - "clear_splits": "Temizle", - "close": "Kapat", - "compare": "Karşılaştır", - "confirm": "Onayla", - "convert_to_automation": "Otomasyona dönüştür", - "correct": "Düzelt…", - "create": "Oluştur", - "create_from_cluster": "{count} döngüden profil oluştur", - "create_profile": "+ Profil oluştur", - "delete": "Sil", - "delete_group": "Grubu Sil", - "delete_group_tip": "Yalnızca bu grubu sil - üye profilleri korunur", - "delete_profile": "Profili Sil", - "discard": "Vazgeç", - "discard_tip": "Kaydedilen izi kaydetmeden atın", - "dismiss": "Kapat", - "done": "Tamam", - "edit": "Düzenle", - "export": "Dışa Aktar", - "export_json": "JSON olarak dışa aktar", - "force_stop": "Zorla Durdur", - "force_stop_tip": "Geçerli döngüyü hemen sonlandırın ve zorla durduruldu olarak işaretleyin", - "from_template": "Şablondan ▾", - "ignore": "Yoksay", - "import_json": "JSON'dan içe aktar", - "import_overwrite": "İçe aktar (veriyi üzerine yazar)", - "inspect": "İncele", - "label": "Etiketle", - "load": "Yükle", - "load_more": "Daha fazla yükle", - "manage": "Yönet", - "merge": "Birleştir", - "new_automation": "+ Yeni Otomasyon", - "new_group": "+ Yeni Grup", - "new_group_tip": "Neredeyse aynı profilleri (aynı şekil/süre, farklı sıcaklık veya sıkma) gruplayın; böylece eşleştirici aralarında güvenilir biçimde seçim yapar", - "new_phase": "+ Yeni Aşama", - "new_profile": "+ Yeni Profil", - "new_profile_tip": "Mevcut etiketlenmiş bir döngüden veya kayıttan yeni bir program profili oluşturun", - "on_cycle_finished": "Döngü bittiğinde", - "on_cycle_started": "Döngü başladığında", - "pause_cycle": "Duraklat", - "pause_cycle_tip": "Çalışan döngüyü duraklatın – cihaz kaldığı yerden devam edecek", - "pg_apply_device": "Cihaza uygula", - "pg_autofill": "Otomatik doldur", - "play": "Oynat", - "process": "İşle", - "process_history": "Şimdi İşle", - "process_recording": "Kaydı Kaydet", - "process_tip": "Kaydedilen izi yeni veya mevcut bir profil olarak kaydedin", - "rebuild": "Zarfları Yeniden Oluştur", - "rebuild_envelope": "Zarfı Yeniden Oluştur", - "rebuild_tip": "Tüm profiller için etiketlenmiş döngülerinden beklenen güç zarfını (min/maks bandı) yeniden hesaplayın – yeni döngüler etiketledikten veya eskilerini düzelttikten sonra çalıştırın", - "rec_start_tip": "Cihazın güç izini kaydetmeye başlayın – döngü çalıştırmadan hemen önce başlatın", - "rec_stop": "Durdur", - "rec_stop_tip": "Kaydı durdurun ve yakalanan izi inceleme için saklayın", - "record": "Kayda Başla", - "refresh": "Yenile", - "refresh_diag_tip": "Depolama istatistiklerini yeniden yükleyin", - "refresh_logs_tip": "En son günlük kayıtlarını yeniden yükleyin", - "refresh_settings_tip": "Ayarları sunucudan yeniden yükleyin", - "relabel": "Yeniden etiketle ({count})", - "remove": "Kaldır", - "remove_timer": "Zamanlayıcıyı kaldır", - "reset": "Sıfırla", - "reset_ml_models_tip": "İnce ayarlı modelleri atın ve yerleşik modellere geri dönün. WashData bunları daha sonra yeniden öğrenebilir.", - "reset_to_builtin": "Yerleşik modellere sıfırla", - "reset_to_defaults": "Varsayılanlara sıfırla", - "resume_cycle": "Döngüyü sürdür", - "resume_cycle_tip": "Duraklatılmış döngüyü sürdürün", - "revert_settings": "Değişiklikleri geri al", - "revert_settings_tip": "Son kaydetmeden önceki ayarları geri yükle", - "revert_settings_tip_none": "Geri almayı etkinleştirmek için önce kaydet", - "revert": "Geri al", - "revert_to_previous": "Bu ayarı önceki değerine geri yükle", - "review": "İncele", - "run": "Çalıştır", - "run_analysis": "🔍 Öneri analizi çalıştır", - "run_analysis_tip": "Kaydedilen döngülerinizi şimdi analiz edin ve ayar önerilerini yenileyin", - "run_auto_label": "Otomatik Etiketlemeyi Çalıştır", - "run_both": "A ile B'yi çalıştır", - "run_simulation": "Simülasyonu çalıştır", - "save": "Kaydet", - "save_access_control": "Erişim Denetimini Kaydet", - "save_group": "Grubu Kaydet", - "save_panel_settings": "Panel Ayarlarını Kaydet", - "save_phases": "Aşamaları kaydet", - "save_preferences": "Tercihleri Kaydet", - "save_reminders": "Hatırlatıcıları kaydet", - "save_review": "İncelemeyi Kaydet", - "save_settings": "Ayarları Kaydet", - "select": "Seç", - "select_all": "Tümünü seç", - "select_last20": "Son 20", - "select_none": "Temizle", - "show_only": "Yalnızca göster", - "skip_setup": "Kurulumu atla", - "split": "Böl", - "stop": "Durdur", - "submit_correction": "Düzeltme Gönder", - "train_now": "Şimdi eğit", - "trim": "Kırp", - "trim_split": "Kırp / Böl", - "undo": "Geri al", - "use": "Kullan", - "wipe_all": "Tüm Verileri Sil", - "delete_selected": "Seçilenleri sil ({n})", - "group_suggest": "Grup {n}: {members}", - "pg_apply_best": "En iyisini uygula", - "pg_apply_to_settings": "Ayarlara kaydet", - "pg_apply_to_settings_tip": "Burada düzenlediğiniz değerleri bu cihazın etkin ayarlarına kopyalayın", - "search": "Ara", - "import": "İçe aktar", - "disconnect": "Bağlantıyı kes", - "connect_github": "GitHub'a bağlan", - "save_appliance": "Cihazı kaydet", - "share_to_store": "Mağazada paylaş", - "share": "Paylaş", - "confirm_appliance": "Bu cihazı onayla", - "confirmed": "Onaylandı", - "browse_community_setups": "Topluluk kurulumlarına göz at", - "download_device": "Bu kurulumu indir", - "share_device": "⬆ Bu cihazı paylaş", - "share_device_tip": "Bu cihazı ve kayıtlı referans döngülerini topluluk mağazasına paylaşın; aynı makineye sahip diğer kullanıcılar bunları benimseyebilsin", - "share_n": "{n} döngü paylaş", - "export_selected": "Dışa aktar (veri seç)", - "export_all": "Her şeyi hızlı dışa aktar", - "import_raw": "Gelişmiş: JSON'dan tümünü değiştir", - "download_export": "Dışa aktarmayı indir", - "analyze_import": "Dosyayı analiz et", - "import_selected": "Seçileni içe aktar", - "back": "Geri" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "Durdurma Eşiğinin altında olmalıdır ({stop} W); aksi takdirde kırışıklık önleme çıkış gücü göz ardı edilir", - "stop": "Kırışıklık Önleme Çıkış Gücü'nün üzerinde olmalıdır ({exit} W)" + "card": { + "min": "dk", + "entity_not_found": "Varlık bulunamadı", + "running_long": "Uzun sürüyor", + "remaining": "kalan", + "progress": "ilerleme", + "show_time_remaining": "Kalan süreyi göster", + "show_percentage": "Yüzdeyi göster", + "layout": { + "tile": "Döşeme (kompakt)", + "detail": "Ayrıntı (zengin)", + "glance": "Bakış (birden çok cihaz)" + }, + "btn": { + "pause": "Duraklat", + "resume": "Devam et", + "terminate": "Döngüyü bitir", + "record_start": "Kaydı başlat", + "record_stop": "Kaydı durdur", + "program": "Program", + "open_panel": "WashData'yı aç" + }, + "editor": { + "layout": "Düzen", + "entity": "Cihaz varlığı", + "entities": "Cihazlar", + "title": "Başlık", + "icon": "Simge", + "show_state": "Durumu göster", + "show_program": "Programı göster", + "show_progress_bar": "İlerleme çubuğunu göster", + "spin_icon": "Çalışırken simgeyi döndür", + "display_mode": "Ayrıntı satırı", + "active_color": "Etkin renk geçersiz kılma", + "show_phase": "Aşamayı göster", + "show_energy": "Enerji ve maliyeti göster", + "show_anomaly": "Aşım uyarısını göster", + "show_sparkline": "Canlı güç grafiğini göster", + "buttons": "Eylem düğmeleri", + "program_entity": "Program varlığı (geçersiz kıl)", + "time_entity": "Süre varlığı (geçersiz kıl)", + "pct_entity": "İlerleme varlığı (geçersiz kıl)", + "power_entity": "Güç varlığı (geçersiz kıl)", + "tap_action": "Dokunma eylemi", + "hold_action": "Basılı tutma eylemi", + "double_tap_action": "Çift dokunma eylemi" + } + }, + "badge": { + "artifact_tip": "{n} anormallik algılandı (ör. döngünün ortasında kapının açılması) – bunları grafikte görmek için açın", + "auto": "(otomatik algılandı)", + "built_in_tag": "yerleşik", + "declining": "↘ düşüyor", + "energy_low": "Normalden düşük enerji", + "energy_spike": "Normalden yüksek enerji", + "fair_fit": "kabul edilebilir kalite", + "fair_fit_tip": "Orta düzeyde eşleşme tutarlılığı – bu profile atanan bazı döngülerin güven puanları daha düşüktür. Doğruluğu artırmak için daha fazla döngü etiketleyin veya profili yeniden kaydedin.", + "feedback_requested": "Geri bildirim istendi", + "golden_cycle": "Kaydedilen referans döngüsü", + "improving": "↗ iyileşiyor", + "manual": "(manuel seçildi)", + "needs_review": "İncelenmesi gerekiyor", + "overrun": "Normalden daha uzun sürdü", + "poor_fit": "düşük kalite", + "poor_fit_tip": "Tutarsız eşleşme geçmişi – bu profili yeniden oluşturmayı düşünün", + "restart_gap_tip": "{n} HA yeniden başlatma boşluğu: güç izinde bir delik var", + "reviewed": "İncelendi", + "steady": "→ sabit", + "underrun": "Normalden daha hızlı bitti", + "using_defaults": "Varsayılan değerler kullanılıyor", + "using_tuned": "Ayarlanmış ağırlıklar kullanılıyor", + "overrun_ratio": "({x}x beklenen)", + "underrun_ratio": "(beklenenin %{pct}'i)", + "awaiting_tip": "Topluluk onayı bekleniyor", + "awaiting_n": "Onay bekleniyor · {n} onaylandı", + "approved": "Onaylandı", + "awaiting": "Onay bekleniyor", + "imported_tip": "Topluluk mağazasından içe aktarıldı. Yalnızca eşleştirme için kullanılır, istatistiklere sayılmaz.", + "not_importable": "burada geçersiz", + "exists": "mevcut" + }, + "btn": { + "add_device": "+ Cihaz ekle", + "add_device_tip": "Başka bir WashData cihazı ekleyin", + "add_maintenance": "Bakım kaydı ekle", + "add_phase": "+ Aşama ekle", + "add_timer": "+ Zamanlayıcı ekle", + "apply_all": "Tümünü uygula", + "apply_label": "Etiket Uygula", + "apply_set_b": "B setini uygula", + "apply_split": "Bölmeyi Uygula", + "apply_trim": "Kırpmayı Uygula", + "auto_detect_split": "Otomatik algıla", + "auto_label_cycles": "Döngüleri otomatik etiketle", + "auto_label_cycles_tip": "Eşleşme güveni eşiği geçen etiketsiz döngülere otomatik olarak profil adları atayın", + "cancel": "İptal", + "clear_debug": "Hata Ayıklama Verilerini Temizle", + "clear_splits": "Temizle", + "close": "Kapat", + "compare": "Karşılaştır", + "confirm": "Onayla", + "convert_to_automation": "Otomasyona dönüştür", + "correct": "Düzelt…", + "create": "Oluştur", + "create_from_cluster": "{count} döngüden profil oluştur", + "create_profile": "+ Profil oluştur", + "delete": "Sil", + "delete_group": "Grubu Sil", + "delete_group_tip": "Yalnızca bu grubu sil - üye profilleri korunur", + "delete_profile": "Profili Sil", + "discard": "Vazgeç", + "discard_tip": "Kaydedilen izi kaydetmeden atın", + "dismiss": "Kapat", + "done": "Tamam", + "edit": "Düzenle", + "export": "Dışa Aktar", + "export_json": "JSON olarak dışa aktar", + "force_stop": "Zorla Durdur", + "force_stop_tip": "Geçerli döngüyü hemen sonlandırın ve zorla durduruldu olarak işaretleyin", + "from_template": "Şablondan ▾", + "ignore": "Yoksay", + "import_json": "JSON'dan içe aktar", + "import_overwrite": "İçe aktar (veriyi üzerine yazar)", + "inspect": "İncele", + "label": "Etiketle", + "load": "Yükle", + "load_more": "Daha fazla yükle", + "manage": "Yönet", + "merge": "Birleştir", + "new_automation": "+ Yeni Otomasyon", + "new_group": "+ Yeni Grup", + "new_group_tip": "Neredeyse aynı profilleri (aynı şekil/süre, farklı sıcaklık veya sıkma) gruplayın; böylece eşleştirici aralarında güvenilir biçimde seçim yapar", + "new_phase": "+ Yeni Aşama", + "new_profile": "+ Yeni Profil", + "new_profile_tip": "Mevcut etiketlenmiş bir döngüden veya kayıttan yeni bir program profili oluşturun", + "on_cycle_finished": "Döngü bittiğinde", + "on_cycle_started": "Döngü başladığında", + "pause_cycle": "Duraklat", + "pause_cycle_tip": "Çalışan döngüyü duraklatın – cihaz kaldığı yerden devam edecek", + "pg_apply_device": "Cihaza uygula", + "pg_autofill": "Otomatik doldur", + "pg_load_calibrated": "Kalibre edilmiş (ML) yükle ({n})", + "pg_load_calibrated_tip": "ML ile kalibre edilmiş ayarları Test Alanı geçersiz kılmaları olarak yükler", + "pg_load_live": "Etkin ayarları yükle", + "pg_load_live_tip": "Entegrasyonun geçerli ayarlarını yeniden okur ve Test Alanı'ndaki tüm düzenlemeleri atar", + "pg_load_suggested": "Önerileri yükle ({n})", + "pg_load_suggested_tip": "Otomatik ayarlayıcının geçerli önerilerini Test Alanı geçersiz kılmaları olarak yükler", + "pg_preset_delete": "Ön ayarı sil", + "pg_preset_load": "Ön ayarı yükle", + "pg_preset_load_tip": "Test Alanı değerlerini bu ön ayarla değiştirir (etkin ayarlara dokunulmaz)", + "pg_preset_save": "Ön ayar olarak kaydet", + "pg_preset_save_tip": "Aşağıdaki tüm değerleri bu cihaz için adlandırılmış bir ön ayar olarak kaydeder", + "pg_publish_all": "{n} ayarı entegrasyona uygula", + "pg_publish_one": "{label} ayarını entegrasyona uygula", + "play": "Oynat", + "process": "İşle", + "process_history": "Şimdi İşle", + "process_recording": "Kaydı Kaydet", + "process_tip": "Kaydedilen izi yeni veya mevcut bir profil olarak kaydedin", + "rebuild": "Zarfları Yeniden Oluştur", + "rebuild_envelope": "Zarfı Yeniden Oluştur", + "rebuild_tip": "Tüm profiller için etiketlenmiş döngülerinden beklenen güç zarfını (min/maks bandı) yeniden hesaplayın – yeni döngüler etiketledikten veya eskilerini düzelttikten sonra çalıştırın", + "rec_start_tip": "Cihazın güç izini kaydetmeye başlayın – döngü çalıştırmadan hemen önce başlatın", + "rec_stop": "Durdur", + "rec_stop_tip": "Kaydı durdurun ve yakalanan izi inceleme için saklayın", + "record": "Kayda Başla", + "refresh": "Yenile", + "refresh_diag_tip": "Depolama istatistiklerini yeniden yükleyin", + "refresh_logs_tip": "En son günlük kayıtlarını yeniden yükleyin", + "refresh_settings_tip": "Ayarları sunucudan yeniden yükleyin", + "relabel": "Yeniden etiketle ({count})", + "remove": "Kaldır", + "remove_timer": "Zamanlayıcıyı kaldır", + "reset": "Sıfırla", + "reset_ml_models_tip": "İnce ayarlı modelleri atın ve yerleşik modellere geri dönün. WashData bunları daha sonra yeniden öğrenebilir.", + "reset_to_builtin": "Yerleşik modellere sıfırla", + "reset_to_defaults": "Varsayılanlara sıfırla", + "resume_cycle": "Döngüyü sürdür", + "resume_cycle_tip": "Duraklatılmış döngüyü sürdürün", + "revert_settings": "Değişiklikleri geri al", + "revert_settings_tip": "Son kaydetmeden önceki ayarları geri yükle", + "revert_settings_tip_none": "Geri almayı etkinleştirmek için önce kaydet", + "revert": "Geri al", + "revert_to_previous": "Bu ayarı önceki değerine geri yükle", + "review": "İncele", + "run": "Çalıştır", + "run_analysis": "🔍 Öneri analizi çalıştır", + "run_analysis_tip": "Kaydedilen döngülerinizi şimdi analiz edin ve ayar önerilerini yenileyin", + "run_auto_label": "Otomatik Etiketlemeyi Çalıştır", + "run_both": "A ile B'yi çalıştır", + "run_simulation": "Simülasyonu çalıştır", + "save": "Kaydet", + "save_access_control": "Erişim Denetimini Kaydet", + "save_group": "Grubu Kaydet", + "save_panel_settings": "Panel Ayarlarını Kaydet", + "save_phases": "Aşamaları kaydet", + "save_preferences": "Tercihleri Kaydet", + "save_reminders": "Hatırlatıcıları kaydet", + "save_review": "İncelemeyi Kaydet", + "save_settings": "Ayarları Kaydet", + "select": "Seç", + "select_all": "Tümünü seç", + "select_last20": "Son 20", + "select_none": "Temizle", + "show_only": "Yalnızca göster", + "skip_setup": "Kurulumu atla", + "split": "Böl", + "stop": "Durdur", + "submit_correction": "Düzeltme Gönder", + "train_now": "Şimdi eğit", + "trim": "Kırp", + "trim_split": "Kırp / Böl", + "undo": "Geri al", + "use": "Kullan", + "wipe_all": "Tüm Verileri Sil", + "delete_selected": "Seçilenleri sil ({n})", + "group_suggest": "Grup {n}: {members}", + "pg_apply_best": "En iyisini uygula", + "pg_apply_to_settings": "Ayarlara kaydet", + "pg_apply_to_settings_tip": "Burada düzenlediğiniz değerleri bu cihazın etkin ayarlarına kopyalayın", + "search": "Ara", + "import": "İçe aktar", + "disconnect": "Bağlantıyı kes", + "connect_github": "GitHub'a bağlan", + "save_appliance": "Cihazı kaydet", + "share_to_store": "Mağazada paylaş", + "share": "Paylaş", + "confirm_appliance": "Bu cihazı onayla", + "confirmed": "Onaylandı", + "browse_community_setups": "Topluluk kurulumlarına göz at", + "download_device": "Bu kurulumu indir", + "share_device": "⬆ Bu cihazı paylaş", + "share_device_tip": "Bu cihazı ve kayıtlı referans döngülerini topluluk mağazasına paylaşın; aynı makineye sahip diğer kullanıcılar bunları benimseyebilsin", + "share_n": "{n} döngü paylaş", + "export_selected": "Dışa aktar (veri seç)", + "export_all": "Her şeyi hızlı dışa aktar", + "import_raw": "Gelişmiş: JSON'dan tümünü değiştir", + "download_export": "Dışa aktarmayı indir", + "analyze_import": "Dosyayı analiz et", + "import_selected": "Seçileni içe aktar", + "back": "Geri", + "mute_suggestion": "Bu ayarı önerme", + "reset_muted": "Susturulanları sıfırla" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "Durdurma Eşiğinin altında olmalıdır ({stop} W); aksi takdirde kırışıklık önleme çıkış gücü göz ardı edilir", + "stop": "Kırışıklık Önleme Çıkış Gücü'nün üzerinde olmalıdır ({exit} W)" + }, + "anti_wrinkle_max": { + "max": "Başlangıç Eşiğinin üzerinde olmalıdır ({start} W); aksi takdirde kırışıklık önleme süre sınırı atlanır", + "start": "Kırışıklık Önleme Maks. Gücü'nün altında olmalıdır ({max} W)" + }, + "attn_sub": "Kaydetmeden önce çakışmaları düzeltin", + "attn_title": "{n} ayar çakışması{s}", + "settings_banner": "{n} ayar çakışması{s} – vurgulanan bölümleri kontrol edin ve kaydetmeden önce düzeltin.", + "settings_banner_btn": "İlkine git", + "confidence": { + "auto": "Eşleşme Eşiğinde veya üzerinde olmalıdır ({match})", + "learning": "Eşleşme Eşiğinde veya altında olmalıdır ({match})", + "match_for_auto": "Otomatik Etiket Güveni'nde veya altında olmalıdır ({alc})", + "match_for_learning": "Öğrenme Güveni'nde veya üzerinde olmalıdır ({lc})" + }, + "duration_ratio": { + "max": "Min. Süre Oranından büyük olmalıdır ({min})", + "min": "Maks. Süre Oranından küçük olmalıdır ({max})" + }, + "hysteresis": { + "start": "Durdurma Eşiğinin üzerinde olmalıdır ({stop} W)", + "stop": "Başlangıç Eşiğinin altında olmalıdır ({start} W)" + }, + "min_power": { + "min_power": "Durdurma Eşiğinde veya altında olmalıdır ({stop} W)", + "stop": "Minimum Güç'te veya üzerinde olmalıdır ({min} W)" + }, + "no_update_timeout": { + "timeout": "Bekçi Aralığından büyük olmalıdır ({wi} s)", + "watchdog": "Güncelleme Yok Zaman Aşımından küçük olmalıdır ({to} s)" + }, + "off_delay": { + "gap": "Min. Kapalı Aralık en az Kapatma Gecikmesi kadar olmalıdır ({delay} s)", + "off_delay": "Kapatma Gecikmesi ({off_delay} s), Min. Kapalı Aralığı ({gap} s) aşıyor; arka arkaya döngüler birleşebilir" + }, + "power_off": { + "stop": "Güç Kapatma Eşiğinin üzerinde olmalıdır ({pot} W)", + "threshold": "Etkili olabilmesi için Durdurma Eşiğinin altında olmalıdır ({stop} W)" + }, + "pump_stuck": { + "duration": "Pompa takılma alarmı bekçi döngüyü öldürmeden önce tetiklenecek şekilde Güncelleme Yok Zaman Aşımından ({to} s) küçük olmalıdır", + "timeout": "Pompa takılma alarmı döngü zorla durdurulmadan önce tetiklenecek şekilde Pompa Takılma Süresini ({ps} s) aşmalıdır" + }, + "start_dur": { + "sampling": "Örnekleme Aralığı, Başlangıç Süresini aşıyor ({sdt} s); tek örnekli ani yükselişler bir döngü açabilir", + "threshold": "Tek örnekli yanlış başlatmayı önlemek için en az bir Örnekleme Aralığı olmalıdır ({si} s)" + }, + "unmatch": { + "match": "Eşleşmeme Eşiğinin üzerinde olmalıdır ({un})", + "unmatch": "Eşleşme Eşiğinin altında olmalıdır ({match}); aksi takdirde onaylanan bir eşleşme anında iptal olur" + }, + "cascade_toast": "Tutarlılık için {n} ayar{s} daha otomatik olarak düzenlendi.", + "suggestion_resolves": "Bunu düzeltmek için aşağıdaki bekleyen öneriyi ({val}) etkinleştirin", + "use_fix": "{val} kullan", + "watchdog": { + "interval": "En az 2 kat Örnekleme Aralığı olmalıdır ({si} s)", + "sampling": "Örnekleme Aralığı, Bekçi Aralığının en fazla yarısı olmalıdır ({wi} s)" + } }, - "anti_wrinkle_max": { - "max": "Başlangıç Eşiğinin üzerinde olmalıdır ({start} W); aksi takdirde kırışıklık önleme süre sınırı atlanır", - "start": "Kırışıklık Önleme Maks. Gücü'nün altında olmalıdır ({max} W)" - }, - "attn_sub": "Kaydetmeden önce çakışmaları düzeltin", - "attn_title": "{n} ayar çakışması{s}", - "settings_banner": "{n} ayar çakışması{s} – vurgulanan bölümleri kontrol edin ve kaydetmeden önce düzeltin.", - "settings_banner_btn": "İlkine git", - "confidence": { - "auto": "Eşleşme Eşiğinde veya üzerinde olmalıdır ({match})", - "learning": "Eşleşme Eşiğinde veya altında olmalıdır ({match})", - "match_for_auto": "Otomatik Etiket Güveni'nde veya altında olmalıdır ({alc})", - "match_for_learning": "Öğrenme Güveni'nde veya üzerinde olmalıdır ({lc})" - }, - "duration_ratio": { - "max": "Min. Süre Oranından büyük olmalıdır ({min})", - "min": "Maks. Süre Oranından küçük olmalıdır ({max})" - }, - "hysteresis": { - "start": "Durdurma Eşiğinin üzerinde olmalıdır ({stop} W)", - "stop": "Başlangıç Eşiğinin altında olmalıdır ({start} W)" - }, - "min_power": { - "min_power": "Durdurma Eşiğinde veya altında olmalıdır ({stop} W)", - "stop": "Minimum Güç'te veya üzerinde olmalıdır ({min} W)" - }, - "no_update_timeout": { - "timeout": "Bekçi Aralığından büyük olmalıdır ({wi} s)", - "watchdog": "Güncelleme Yok Zaman Aşımından küçük olmalıdır ({to} s)" - }, - "off_delay": { - "gap": "Min. Kapalı Aralık en az Kapatma Gecikmesi kadar olmalıdır ({delay} s)", - "off_delay": "Kapatma Gecikmesi ({off_delay} s), Min. Kapalı Aralığı ({gap} s) aşıyor; arka arkaya döngüler birleşebilir" - }, - "power_off": { - "stop": "Güç Kapatma Eşiğinin üzerinde olmalıdır ({pot} W)", - "threshold": "Etkili olabilmesi için Durdurma Eşiğinin altında olmalıdır ({stop} W)" - }, - "pump_stuck": { - "duration": "Pompa takılma alarmı bekçi döngüyü öldürmeden önce tetiklenecek şekilde Güncelleme Yok Zaman Aşımından ({to} s) küçük olmalıdır", - "timeout": "Pompa takılma alarmı döngü zorla durdurulmadan önce tetiklenecek şekilde Pompa Takılma Süresini ({ps} s) aşmalıdır" - }, - "start_dur": { - "sampling": "Örnekleme Aralığı, Başlangıç Süresini aşıyor ({sdt} s); tek örnekli ani yükselişler bir döngü açabilir", - "threshold": "Tek örnekli yanlış başlatmayı önlemek için en az bir Örnekleme Aralığı olmalıdır ({si} s)" - }, - "unmatch": { - "match": "Eşleşmeme Eşiğinin üzerinde olmalıdır ({un})", - "unmatch": "Eşleşme Eşiğinin altında olmalıdır ({match}); aksi takdirde onaylanan bir eşleşme anında iptal olur" - }, - "cascade_toast": "Tutarlılık için {n} ayar{s} daha otomatik olarak düzenlendi.", - "suggestion_resolves": "Bunu düzeltmek için aşağıdaki bekleyen öneriyi ({val}) etkinleştirin", - "use_fix": "{val} kullan", - "watchdog": { - "interval": "En az 2 kat Örnekleme Aralığı olmalıdır ({si} s)", - "sampling": "Örnekleme Aralığı, Bekçi Aralığının en fazla yarısı olmalıdır ({wi} s)" - } - }, - "hdr": { - "ab_comparison": "A/B Ayar Karşılaştırması", - "access_control": "Erişim Denetimi", - "add_maintenance": "Bakım Kaydı Ekle", - "automation_delete": "Bu otomasyonu sil", - "automation_needs_review": "Bu döngü inceleme gerektiriyor", - "automation_open": "Otomasyon düzenleyicisinde aç", - "automation_review_this_cycle": "Bu döngüyü incele", - "automations": "Otomasyonlar", - "clear_debug": "Hata Ayıklama İzlerini Temizle", - "cycle_simulator": "Döngü Simülatörü", - "diagnostics_pref": "Tanılamalar", - "display": "Görüntü", - "dtw_inspector": "DTW İnceleyici", - "export_import": "Dışa / İçe Aktar", - "getting_started": "Başlarken", - "live_power": "Canlı Güç", - "logs": "Günlükler", - "logs_diagnostics": "Tanılamalar", - "maintenance": "Bakım Eylemleri", - "maintenance_log": "Bakım Günlüğü", - "maintenance_reminders": "Servis Hatırlatıcıları", - "manual_recording": "Manuel Kayıt", - "manual_recording_tip": "WashData güç izini kaydederken kasıtlı olarak bir döngü çalıştırın. Cihaz başlamadan hemen önce Başlat'a basın, bittiğinde Durdur'a basın, ardından adlandırılmış profil olarak kaydetmek için İşle'ye tıklayın.", - "ml_learned": "WashData'nın öğrendikleri", - "ml_matching_tuning": "Program eşleştirme ince ayarı", - "ml_settings_card": "Ayarlar", - "ml_smart_learning": "Akıllı Öğrenme", - "my_preferences": "Tercihlerim", - "no_automations": "Henüz bu cihaza referans veren otomasyon yok.", - "panel_settings": "Panel Ayarları", - "param_sweep": "Parametre taraması", - "phase_catalog": "Aşama Kataloğu", - "playground": "Deneme Alanı", - "process_history": "İşlem Geçmişi", - "settings_history": "Ayar geçmişi", - "status": "Durum", - "status_graph": "Durum Grafiği", - "storage_stats": "Depolama İstatistikleri", - "test_history": "Geçmiş üzerinde test et", - "toggle_sidebar": "Ev Asistanı kenar çubuğunu aç/kapat", - "tools_and_data": "Araçlar ve Veriler", - "wipe_history": "Geçmişi Sil", - "recommendations": "Öneriler ({n})", - "pg_detection_params": "Algılama ayarları", - "pg_timeline": "Olay zaman çizelgesi", - "pg_outcome": "Simülasyon sonucu", - "pg_across_cycles": "Tüm döngülerinizde", - "community_store": "Topluluk Mağazası", - "online_account": "Topluluk Mağazası ve çevrimiçi özellikler" - }, - "health": { - "fair": "Kabul edilebilir profil kalitesi", - "good": "✓ İyi profil kalitesi", - "poor": "⚠ Düşük profil kalitesi" - }, - "lbl": { - "actions": "Eylemler", - "activity": "Aktivite", - "administrators": "Yöneticiler", - "aria_compare_chart": "Döngü karşılaştırma grafiği", - "aria_cycle_chart": "Döngü güç eğrisi", - "aria_envelope_chart": "Profil güç zarfı grafiği", - "aria_phase_chart": "Aşama düzenleyici grafiği", - "aria_playground_chart": "Sürüklenebilir algılama eşiklerine sahip döngü güç eğrisi", - "aria_power_chart": "Güç tüketimi grafiği", - "aria_spaghetti_chart": "Üst üste bindirilmiş döngü güç eğrileri", - "aria_sweep_chart": "Parametre tarama sonuçları grafiği", - "artifact_anomaly": "Anomali", - "artifact_high_power": "Yüksek güç", - "artifact_interruption": "Kesinti", - "artifact_low_power": "Düşük güç", - "auto_detect": "Otomatik algıla", - "auto_fine_tune_off": "otomatik ince ayar kapalı", - "auto_fine_tune_on": "otomatik ince ayar açık ({hour}:00 civarı)", - "avg_cost": "Ort. maliyet", - "change": "Değişim", - "clock_time": "Saat", - "cohesion_good": "uyum {pct}%", - "cohesion_low": "⚠ düşük uyum {pct}%", - "compare_profiles": "Profillerle karşılaştır", - "concurrency": "Eşzamanlılık", - "confidence": "Güven", - "confidence_threshold": "Güven eşiği", - "correct_duration": "Doğru Süre (dk, isteğe bağlı)", - "correct_profile": "Doğru Profil", - "correlation": "Korelasyon", - "cost": "Maliyet", - "create_new_profile": "+ Yeni profil oluştur…", - "current_phase": "Geçerli aşama", - "curves": "Eğriler", - "cycle": "Döngü", - "cycle_date_display": "Döngü tarihi görünümü", - "cycle_health": "Döngü sağlığı", - "cycle_index": "döngü dizini →", - "cycles": "Döngüler", - "cycles_count": "Döngüler", - "cycles_lc": "döngü", - "dashed": "kesikli", - "date": "Tarih", - "debug_traces": "Hata Ayıklama İzleri", - "default": "Varsayılan", - "default_access_level": "Aşağıda listelenmeyen kullanıcılar için varsayılan düzey", - "default_other": "Varsayılan (diğer cihazlar)", - "default_tab": "Panel açıldığında varsayılan sekme", - "delta": "Δ", - "description": "Açıklama", - "dtw_blend_w": "Karışım ağırlığı", - "dtw_blended": "Karışık puan", - "dtw_ddtw": "DDTW puanı", - "dtw_l1": "L1 puanı", - "dtw_matched_profile": "(döngünün eşleşen profili)", - "duration": "Süre", - "duration_agreement": "Süre uyumu", - "emphasis": "Vurgu", - "enable_access_control": "Kullanıcı bazlı erişim denetimini etkinleştir", - "energy": "Enerji", - "energy_agreement": "Enerji uyumu", - "event_timeline": "Olay zaman çizelgesi", - "event_type": "Olay türü", - "expected": "Beklenen", - "expected_duration": "Beklenen Süre (dk)", - "file_kb": "Dosya (kB)", - "final_score": "Nihai puan", - "from": "Başlangıç", - "gap_s": "Boşluk (s)", - "group_name": "Grup adı", - "head_trim": "Baş Kırpma (s)", - "health": "Sağlık", - "hide_tabs": "Yönetici olmayanlar için sekmeleri gizle", - "in_use": "Kullanımda", - "json_data": "JSON Verisi", - "label": "Eşleşen program", - "last": "Son", - "last_checked": "Son kontrol:", - "load_from_file": "Dosyadan yükle", - "mae_score": "MAE puanı", - "manual_duration": "Manuel Süre (dk, isteğe bağlı)", - "match": "Eşleşme", - "members": "Üyeler", - "metric": "Metrik", - "mode_existing_profile": "Mevcut Profile Ekle", - "mode_new_profile": "Yeni Profil Oluştur", - "models_fine_tuned": "({count} model{plural} ince ayarlı)", - "n_classic_suggestions": "{n} klasik", - "n_ml_suggestions": "{n} ML", - "n_selected": "{n} seçili", - "n_tuning_suggestions": "{n} ayar önerisi", - "na": "yok", - "new_profile_name": "Yeni profil adı", - "notes": "Notlar", - "of": "/", - "outcome": "Sonuç", - "panel_default_tab": "Varsayılan sekme", - "panel_language": "Panel dili", - "per_cycle_short": "döngü", - "pg_anti_wrinkle": "Kırışıklık önleme", - "pg_autofill_tip": "Geçerli değerden aralığı otomatik doldur ({lo}–{hi})", - "pg_best_value": "Bulunan en iyi değer", - "pg_current_value": "Geçerli değer:", - "pg_drag_hint": "Grafikteki çizgiyi sürükleyin", - "pg_dtw": "DTW", - "pg_ev_ending": "Bitiyor", - "pg_ev_running": "Çalışıyor", - "pg_group_advanced": "Uç durumlar", - "pg_group_detection": "Algılama tetikleyicileri", - "pg_group_timing": "Zamanlama kuralları", - "pg_idle": "Boşta", - "pg_last_run": "Son çalıştırma: {date}", - "pg_match_score": "Eşleşme puanı", - "pg_pct_of": "{total} içinde %{p}", - "pg_poor_match": "Kötü eşleşme", - "pg_strong_match": "Güçlü eşleşme", - "pg_tile_ambiguous": "Belirsiz", - "pg_tile_ambiguous_tip": "İki program arasında neredeyse berabere kalan döngüler", - "pg_tile_detected": "Algılandı", - "pg_tile_detected_tip": "Gücün, çalışıyor olarak kaydedilecek kadar uzun süre başlangıç eşiğini aştığı döngüler", - "pg_tile_matched": "Eşleşti", - "pg_tile_matched_tip": "Bilinen bir programa doğru şekilde atfedilen döngüler", - "pg_time_left": "Kalan süre", - "pg_weak_match": "Zayıf eşleşme", - "phase_name": "Ad", - "phase_timeline": "Aşama zaman çizelgesi", - "power": "Güç", - "profile": "Profil", - "profile_index": "profil dizini →", - "profile_name": "Profil Adı", - "program": "Program", - "program_tip": "Geçerli döngüyle eşleştirilen profili geçersiz kılın. Otomatik algılama, entegrasyonun en iyi eşleşmeyi otomatik olarak seçmesine olanak tanır. Otomatik algılama yanlış olduğunda veya neyin çalıştığını bildiğinizde belirli bir programı zorla eşleştirmek için sabitleyin.", - "progress": "İlerleme", - "raw_socket": "Ham soket", - "read_only": "Salt okunur", - "ref_cycle": "Referans Döngü (isteğe bağlı)", - "refresh_interval": "Yenileme aralığı (s)", - "remaining": "Kalan", - "reminder_every": "Hatırlatma sıklığı (döngü)", - "remove_label": "- Etiketi kaldır -", - "rename_profile": "Profili Yeniden Adlandır", - "replay_duration": "Yeniden oynatma", - "resulting_profile": "Sonuçlanan profil", - "save_mode": "Kaydetme Modu", - "score": "Puan", - "score_breakdown": "Puan dökümü", - "seconds_from_start": "Başlangıçtan saniyeler", - "select_profile": "Profil Seç", - "setting": "Ayar", - "settings_a": "Ayarlar A (geçerli)", - "settings_a_short": "A", - "settings_advanced": "Gelişmiş", - "settings_b": "Ayarlar B (test)", - "settings_b_short": "B", - "settings_basic": "Temel", - "settings_detail_level": "Ayar ayrıntı düzeyi", - "settings_overrides": "Ayar geçersiz kılmaları", - "show_debug": "Durum sayfasında canlı eşleşme hata ayıklama kartını göster (güven, belirsizlik, en iyi adaylar)", - "show_expected": "Beklenen eğri bindirmesini göster (eşleşen profil, turuncu)", - "show_raw": "Canlı güç grafiğinde ham soket değiştiriciyi göster", - "sparkline": "Son döngü süresi eğilimi", - "stage2": "Aşama 2 – çekirdek benzerlik", - "stage3": "Aşama 3 – DTW", - "stage4": "Aşama 4 – uyum", - "status": "Durum", - "tail_trim": "Kuyruk Kırpma (s)", - "timer_auto_pause": "Otomatik duraklatma", - "timer_min": "dk.", - "timer_msg_placeholder": "Mesaj (isteğe bağlı, {device}/{program}/{minutes})", - "to": "Bitiş", - "ungrouped": "Grupsuz", - "unlabelled": "Etiketsiz", - "unlabelled_paren": "(etiketsiz)", - "warp_path": "Büküm yolu", - "input": "Girdi:", - "start": "Başlangıç", - "end": "Bitiş", - "unit_s": "(s)", - "reviewed_on": "{date} tarihinde incelendi", - "unknown": "Bilinmiyor", - "quality": "Kalite", - "tags": "Etiketler", - "at": "saat", - "pct_match_confidence": "%{pct} eşleşme güveni", - "ha_restarted": "HA yeniden başlatıldı", - "from_start": "Başlangıçtan", - "to_end": "Bitişe kadar", - "click_to_select": "seçmek için tıklayın", - "envelope": "Zarf", - "zoom_hint": "yakınlaştırmak için kaydırın · sıfırlamak için çift tıklayın", - "loading_paren": "(yükleniyor…)", - "time_remaining": "~{v} kaldı", - "no_duration": "süre yok", - "duration_avg": "~{v}dk ort.", - "name_placeholder": "(ad)", - "n_shown": ", {n} gösteriliyor", - "cycles_title": "Döngüler ({n})", - "pg_detecting": "Algılanıyor", - "pg_best_marker": "En iyi: {v}", - "pg_time_left_model": "Kalan süre (model)", - "pg_time_left_model_tip": "Model tarafından tahmin edilen kalan süre (aşama tahmincisi + ML karışımı), sabit bir geri sayım değil", - "phase": "Aşama", - "pg_mode_simulate": "Simülasyon", - "pg_mode_history": "Geçmişte test et", - "pg_mode_sweep": "Tarama", - "pg_ev_detected": "Algılandı", - "pg_ev_match": "Eşleşme kesinleşti", - "pg_ev_match_changed": "Eşleşme değişti", - "pg_ev_ambiguous": "Belirsiz", - "pg_ev_unmatched": "Eşleşmedi", - "pg_ev_notify_start": "Başlangıç bildirimi", - "pg_ev_notify_pre": "Neredeyse bitti bildirimi", - "pg_ev_notify_finish": "Bitiş bildirimi", - "pg_ev_notify_milestone": "Kilometre taşı bildirimi", - "pg_ev_notify_held": "Bildirim bekletildi (sessiz saatler)", - "pg_ev_finished": "Tamamlandı", - "pg_ended": "Sona erdi", - "pg_proj_energy": "Tahm. enerji", - "pg_alert_overrun": "Uzun sürdü", - "pg_alert_underrun": "Kısa sürdü", - "pg_alert_did_not_finish": "Bitmedi", - "pg_alert_false_end": "Birden fazla döngüye bölündü", - "pg_alert_unmatched": "Eşleşmedi", - "pg_alert_ambiguous": "Belirsiz eşleşme", - "pg_alert_energy": "Enerji anomalisi", - "pg_newly_correct": "artık doğru", - "pg_regressed": "geriledi", - "pg_end_timing_changed": "bitiş zamanı değişti", - "pg_vs_current": "vs mevcut", - "pg_fixed": "düzeltildi", - "pg_broke": "bozuldu", - "pg_sweep_param": "Parametre", - "pg_objective": "Hedef", - "pg_steps": "Adımlar", - "pg_stress_group": "Bekleme sonlandırma testi", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "Bekleme seviyesi (W)", - "pg_stress_idle_w_desc": "Otomatik algılanan bekleme tabanını geçersiz kıl (otomatik için boş bırakın).", - "pg_stress_toggle": "Bekleme sonlandırmasını test et", - "pg_stress_toggle_desc": "Kaydın bitmesinin ardından cihazın bekleme modundaki güç tüketimine devam ettiğini simüle eder - WashData'nın döngüyü durdurup durdurmayacağını ve ne zaman durduracağını gösterir.", - "pg_sweep_2d": "2D ısı haritası", - "pg_sweep_param_y": "2. parametre", - "pg_obj_match": "Eşleşme doğruluğu", - "pg_obj_endtiming": "Bitiş zamanı doğruluğu", - "pg_obj_falseend": "Yanlış bitiş oranı", - "pg_obj_overrun": "Süre sapması", - "pg_obj_ambiguity": "Belirsizlik oranı", - "pg_best_combo": "en iyi kombinasyon", - "pg_mode_optimize": "Optimize et", - "pg_group_matching": "Program eşleştirme", - "pg_zoom_hint": "yakınlaştırmayı sıfırlamak için çift tıklayın", - "aria_playground_chart2": "Etkileşimli döngü güç grafiği: zamanı/gücü okumak için üzerine gelin, yakınlaştırmak için kaydırın, kaydırmak için sürükleyin", - "pg_alert_timeout_end": "Tahminle değil, zaman aşımıyla sona erdi", - "pg_alert_indefinite": "Süresiz olarak çalışırdı", - "pg_alert_stress_cap": "Güvenlik sınırına ulaşıldı", - "pg_alert_stress_ok": "Bekleme sonlandırması: döngü durduruldu", - "pg_alert_stress_warn": "Bekleme tüketimi durdurma eşiğinin üzerinde", - "task_pg_history": "Geçmişte test et", - "task_pg_sweep": "Optimize et", - "task_reprocess": "Yeniden işleme", - "task_ml_training": "Öğrenme", - "eta_secs": "~{n} sn kaldı", - "eta_mins": "~{n} dk kaldı", - "pg_recent_runs": "Son çalıştırmalar", - "pg_load_run": "Bu çalıştırmayı yeniden yükle", - "pg_match_confidence": "Eşleşme güveni", - "pg_envelope_fit": "Zarfa uyum", - "pg_envelope_fit_tip": "Döngünün bu profilin kaydedilmiş güç zarfının içinde ne kadar iyi kaldığı, eşleşme güveninden farklı bir bakış açısı.", - "n_imported_note": ", {n} içe aktarıldı", - "enable_online": "Çevrimiçi özellikleri etkinleştir", - "store_brand": "Cihaz markası", - "store_model": "Cihaz modeli", - "anonymous": "Anonim", - "rate_quality": "Kaliteyi değerlendir", - "rate_n": "{n} yıldız", - "approved_only": "Yalnızca onaylılar", - "adopt_settings": "Ayarları da benimse", - "flags": "İşaretler", - "include_phase_map": "Faz haritasını dahil et", - "include_settings": "Algılama ve eşleştirme ayarlarını dahil et", - "show_contributor": "Katkıda bulunanların adlarını göster", - "task_pg_detail": "Döngü simülasyonu", - "task_split": "Döngü bölünüyor", - "task_trim": "Döngü kırpılıyor", - "task_merge": "Döngüler birleştiriliyor", - "task_rebuild": "Zarflar yeniden oluşturuluyor", - "cat_profiles": "Profiller (programlar)", - "cat_real_cycles": "Döngüler (çalışma geçmişi)", - "cat_reference_cycles": "Referans döngüler (içe aktarılan)", - "cat_custom_phases": "Özel aşamalar", - "cat_profile_groups": "Profil grupları", - "cat_settings": "Algılama ve tanıma ayarları", - "cat_matching_config": "Tanıyıcı ayarı", - "cat_ml_models": "ML modelleri", - "cat_feedback": "Geri bildirim ve inceleme etiketleri", - "cat_suggestions": "Öneriler", - "cat_maintenance_log": "Bakım günlüğü", - "cat_history_logs": "Geçmiş ve değişiklik günlükleri", - "cat_lifetime_stats": "Ömür boyu toplamlar", - "cycles_short": "döngü", - "import_mode": "Nasıl birleştirilsin", - "mode_merge": "Birleştir (benimkini koru)", - "mode_replace": "Seçileni değiştir", - "cycle_destination": "İçe aktarılan döngüler nereye gitsin?", - "dest_reference": "Referans (yalnızca şekil)", - "dest_real_history": "Gerçek geçmiş (istatistiklere sayılır)", - "conflict_resolution": "Ad çakışmaları", - "conflict_import_copy": "Kopya olarak içe aktar", - "conflict_keep_mine": "Benimkini koru", - "conflict_overwrite": "Üzerine yaz" - }, - "log": { - "all_levels": "Tüm seviyeler", - "all_devices": "Tüm cihazlar", - "all_components": "Tüm bileşenler", - "search_ph": "Günlüklerde ara…" - }, - "ml": { - "builtin_models": "● Yerleşik modeller kullanılıyor", - "fit_fair": "Kabul edilebilir", - "fit_good": "İyi", - "fit_slight": "Hafif", - "fit_strong": "Güçlü", - "fit_weak": "Zayıf", - "fit_word": "uyum", - "personalized": "● Bu makineye kişiselleştirilmiş", - "better_than_baseline": "temel tahminden %{pct} daha iyi ({metric})", - "trend_improving_tip": "Bu modelin uyumu son yeniden kontrollerde iyileşti.", - "trend_declining_tip": "Bu modelin uyumu son yeniden kontrollerde geriledi, daha fazla döngü incelemek yeniden öğrenmesine yardımcı olabilir.", - "trend_steady_tip": "Bu modelin uyumu son yeniden kontrollerde yaklaşık olarak sabit kaldı.", - "cap_blurb": { - "end": "Bir çevrimin gerçekten bittiğini anlama", - "live_match": "Çalışan programı daha erken tanıma", - "quality": "Yanlış algılanan veya bozuk çevrimleri fark etme", - "remaining_time": "Ne kadar süre kaldığını tahmin etme", - "total_energy": "Toplam enerji ve maliyeti tahmin etme" - }, - "cap_label": { - "end": "Çevrim sonu algılama", - "live_match": "Program eşleştirme", - "quality": "Çevrim kalite kontrolü", - "remaining_time": "Kalan süre tahmini", - "total_energy": "Enerji tahmini" - }, - "metric_auc": "Ayrılmış doğrulama verisinde AUC {auc}", - "metric_mae": "hata {model} - temel model {baseline}" - }, - "modal": { - "auto_label": "Döngüleri Otomatik Etiketle", - "correct_feedback": "Geri Bildirimi Düzelt", - "create_profile": "Profil Oluştur", - "cycle": "Döngü", - "edit_group": "Profil grubunu düzenle", - "edit_phase": "Aşamayı Düzenle", - "import_config": "Yapılandırmayı İçe Aktar", - "label_cycle": "Döngüyü Etiketle", - "merge_cycles": "{n} Döngüyü Birleştir", - "new_group": "Yeni profil grubu", - "new_phase": "Yeni Aşama", - "process_history_msg": "Tüm saklanan döngülerde eşleştirmeyi yeniden çalıştırın, önerileri yenileyin, ML'yi yeniden eğitin (etkinleştirilmişse) ve döngü sağlığını yeniden hesaplayın. Bu biraz zaman alabilir.", - "process_history_ok": "İşle", - "process_history_title": "Geçmişi İşle", - "process_recording": "Kaydı İşle", - "delete_maintenance_msg": "Bu bakım kaydı silinsin mi? Bu işlem geri alınamaz.", - "delete_maintenance_title": "Bakım Kaydını Sil", - "relabel_cycles": "{count} döngüyü yeniden etiketle", - "delete_automation_title": "Otomasyonu Sil", - "delete_automation_msg": "\"{name}\" otomasyonu Home Assistant'tan silinsin mi? Bu işlem geri alınamaz.", - "remove_legacy_title": "Eski Eylemleri Kaldır", - "remove_legacy_msg": "Eski özel eylemler kaldırılsın mı? Döngü olaylarında tetiklenmeyi durduracaklar. Bu işlem panelden geri alınamaz.", - "discard_recording_title": "Kaydı At", - "discard_recording_msg": "Saklanan kayıt atılsın mı? Bu işlem geri alınamaz.", - "dismiss_all_title": "Tüm Geri Bildirimleri Kapat", - "dismiss_all_msg": "Bekleyen {count} geri bildirim isteğinin tümü kapatılsın mı?", - "dismiss_all_ok": "Tümünü Kapat", - "delete_phase_title": "Aşamayı Sil", - "delete_phase_msg": "\"{name}\" aşaması silinsin mi?", - "clear_debug_title": "Hata Ayıklama Verilerini Temizle", - "clear_debug_msg": "Saklanan tüm hata ayıklama izleri silinsin mi?", - "wipe_all_title": "Tüm Verileri Sil", - "wipe_all_msg": "⚠️ Bu, TÜM döngüleri ve profilleri kalıcı olarak siler. Bu işlem geri alınamaz.", - "wipe_all_ok": "Her Şeyi Sil", - "force_stop_title": "Döngüyü Zorla Durdur", - "force_stop_msg": "Etkin döngü şimdi zorla durdurulsun mu? Döngü, kesintiye uğramış olarak kaydedilecek.", - "store_import": "Referans döngüyü içe aktar", - "store_share": "Topluluk mağazasında paylaş", - "store_share_device": "Bu cihazı paylaş", - "export_select": "Dışa aktarma - veri seçin", - "import_wizard": "İçe aktarma - veri seçin" - }, - "msg": { - "appliance_monitor": "Cihaz monitörü", - "artifact_dip_detail": "Normal güç bandının altında yaklaşık ~{n} saniye sürdü.", - "artifact_footer": "Yukarıdaki grafikte vurgulanmıştır. Bunlar geçici eserlerdir (örn. döngünün ortasında kapının açılması), mutlaka sorun teşkil etmez.", - "artifact_header": "Bu döngü sırasında {n} anormallik algılandı", - "artifact_pause_detail": "Güç yaklaşık ~{n} saniye boyunca sıfıra yakın düştü, sonra devam etti – döngünün ortasında kapı açılmış veya döngü duraklatılmış olabilir.", - "artifact_spike_detail": "Normal güç bandının üzerinde yaklaşık ~{n} saniye sürdü.", - "auto_label_intro": "Eşleşme güveni eşiği geçen etiketsiz döngülere profil atayın.", - "automations_intro": "WashData, {start} / {end} olaylarını tetikler ve varlıkları gösterir; bu nedenle bildirimler ve eylemler en iyi şekilde normal Home Assistant otomasyonları olarak oluşturulur. Bu cihazı kullanan otomasyonlar aşağıda görünür.", - "cleanup_intro": "Tüm etiketli döngüler üst üste bindirilmiş. Aykırı değerleri işaretleyip silerek profili temizleyin.", - "clear_debug_hint": "Saklanan hata ayıklama verilerini kaldırarak boş alan açın.", - "collecting_data": "Veri toplanıyor: ince ayar başlamadan önce {need} döngü{plural} daha gerekiyor ({current}/{min}).", - "compare_overlay_profiles": "Profilleri üst üste bindirin (soluk)", - "compare_profiles_tip": "Hangisinin bu döngüye en uygun olduğunu görmek için diğer profil zarflarını yukarıdaki tabloya yerleştirin.", - "compare_selected_cycles": "Seçili döngüler (katı) – göster / gizle", - "consider_new_profile": "Yeni bir profil oluşturmayı düşünün.", - "coverage_gap": "son döngülerin eşleşen profili yok (son 30 döngünün %{pct}'i).", - "coverage_gap_similar_cycles": "{count} benzer etiketsiz döngü bulundu – bunları eşleştirmeye başlamak için bir profil oluşturun.", - "cycles_deleted": "{count} döngü silindi", - "enough_data": "Öğrenmek için yeterli veri ({current}/{min} döngü).", - "export_description": "JSON'a dışa aktarılacak profilleri, döngüleri, ayarları ve daha fazlasını tam olarak seçin ya da bir dosyayı analiz edip yalnızca istediğiniz kısımları içe aktarın.", - "feedback_cycles_pending": "İncelenecek {n} döngü{s}", - "feedback_prompt": "Doğru olduğunu onaylayın, programı düzeltin veya yoksayın.", - "feedback_relabel_hint": "Bu döngüyü yeniden etiketlemek de bunu çözer.", - "filter_by_profile": "Profile göre filtrele…", - "group_modal_help": "Sıcaklık/dönme açısından farklı olan aynı şekle sahip programları gruplandırın (süreler değişebilir). Eşleştirme, grubu bir aday olarak puanlar ve ardından en uygun üyeyi seçer. En az 2 tanesini seçin; kaplama ne kadar benzer olduklarını gösteriyor.", - "group_not_cohesive": "Bu profiller güvenilir bir şekilde gruplandırılacak kadar benzer değildir; bu nedenle eşleştirme, siz aykırı değeri kaldırana veya grubu bölene kadar bunları ayrı ele alır.", - "group_preview_hint": "Güç eğrilerini önizlemek ve karşılaştırmak için 2 veya daha fazla üyeyi işaretleyin.", - "import_intro": "Dışa aktarılan bir dosyayı yükleyin veya aşağıya bir JSON yükü yapıştırın.", - "legacy_actions_title": "{count} eski özel işlem hâlâ çalışıyor", - "live_chart_loading": "Canlı güç grafiği okumalar gelince görünür.", - "loading": "Yükleniyor…", - "loading_curve": "Eğri yükleniyor…", - "loading_settings": "Ayarlar yükleniyor…", - "log_buffer_hint": "Önce en yeni · yeniden başlatmadan bu yana son 500 ha_washdata kaydını ara belleğe alır · yeniden boyutlandırmak için alt kenarı sürükleyin.", - "maintenance_advisory": "Sürenin/enerjinin artması, cihazın bakımının gerekli olduğunu gösterebilir (örn. kireç çözme, filtre temizliği).", - "maintenance_due": "Zamanı gelen bakım: {items}", - "maintenance_intro": "Bu cihazda yaptığınız bakımları kaydedin ve her görevin zamanı yeniden geldiğinde hatırlatma alın.", - "maintenance_load_error": "Bakım verileri yüklenemedi: {error}", - "maintenance_requires_access": "Bakım ve dışa/içe aktarma tam erişim gerektirir.", - "manual_duration_hint": "Kalan süre tahminleri için kullanılan profilin ortalama/beklenen döngü uzunluğu. Ayarlamak için düzenleyin; değişmeden bırakmak mevcut değeri korur.", - "matching_tuning_intro": "Öğrenirken WashData, program eşleştirmenin şekle, süreye ve enerjiye ne kadar ağırlık verdiğini de ayarlar.", - "merge_intro": "Seçili döngüler tek birinde birleştirilir (kronolojik sıra; boşluklar 0 W ile doldurulur). Sonuçlanan profili seçin.", - "ml_intro": "WashData, kullanıma hazır akıllı modellerle birlikte gelir.", - "ml_learned_intro": "Bu makineye ince ayarlı modeller.", - "ml_loading": "ML yükleniyor…", - "ml_settings_intro": "İki bağımsız anahtar: biri döngü çalışırken modelleri uygular, diğeri WashData'nın zamanla makinenize ince ayar yapmasına izin verir.", - "name_first_program": "Yeterli döngünüz var – eşleştirmeye başlamak için ilk programınıza ad verin.", - "near_duplicate_cluster": "neredeyse yinelenen profil kümesi algılandı. Gruplandırma, eşleştirmenin benzerler arasında güvenilir bir şekilde seçim yapmasına olanak tanır (örneğin, farklı sıcaklıkta/döndürmede aynı program).", - "no_cycles_match": "Mevcut filtreyle eşleşen döngü yok.", - "no_cycles_profile": "Bu profil için döngü yok.", - "no_cycles_selected": "Önce en az bir döngü seçin.", - "no_cycles_yet": "Henüz döngü kaydedilmedi.", - "no_device_selected": "Cihaz seçilmedi.", - "no_devices": "Henüz WashData cihazı yapılandırılmamış.", - "no_envelope": "Henüz zarf yok - döngüleri etiketledikten sonra yeniden oluşturun.", - "no_envelope_overlay": "Üst üste bindirmek için zarf mevcut değil.", - "no_fine_tuned": "Henüz ince ayar yapılmadı – WashData yerleşik modellerini kullanıyor.", - "no_logs": "Henüz günlük kaydı arabelleğe alınmadı.", - "no_maintenance": "Henüz bakım kaydı yok.", - "no_match_yet": "Henüz eşleşme denemesi yok - bu, çalışan bir döngü sırasında doldurulur.", - "no_other_users": "Başka Home Assistant kullanıcısı bulunamadı.", - "no_phases": "Tanımlanmış aşama yok.", - "no_phases_assigned": "Atanmış aşama yok.", - "no_profiles_compare": "Karşılaştırılacak profil yok.", - "no_profiles_overlay": "Üst üste bindirilecek profil yok.", - "no_profiles_yet": "Henüz profil yok. Etiketli döngüden bir tane oluşturun.", - "no_profiles_yet_short": "Henüz profil yok.", - "no_settings_match": "\"{q}\" ile eşleşen ayar yok", - "no_split_points": "Henüz bölme noktası yok.", - "no_suggestions": "Aktif öneri yok.", - "notify_services_hint": "{entity} hizmet kimliklerini kullanın (birden fazlası için virgülle ayrın). Şablon değişkenleri: {vars}.", - "old_actions_warning": "Eski eylem düzenleyiciyle yapılandırılmıştır (artık kaldırılmıştır). Döngü etkinliklerinde hala tetikleniyorlar ancak artık burada düzenlenemezler. Bunları normal bir otomasyona dönüştürün veya kaldırın.", - "onboarding_progress": "{n} / 3 döngü gözlemlendi", - "onboarding_watching": "Cihazınızı normal şekilde kullanın – WashData izliyor. 3 döngüden sonra program eşleştirmesi başlar.", - "pending_feedback": "Bekleyen algılama geri bildirimi", - "performance_trend": "Performans trendi ({n} döngü)", - "pg_analysis_empty": "Eşleşme analizini görmek için bir döngü yükleyin.", - "pg_apply_confirm": "En iyi değeri uygula: {label} = {value}?", - "pg_canvas_empty": "Yukarıdan bir döngü seçin, ardından güç izini görmek için Yükle'ye basın.", - "pg_chart_caption": "{param} değerlerine göre algılama/eşleşme oranı", - "pg_match_rate": "{total} döngüde %{pct} eşleşme oranı", - "pg_restart_note": "Simülasyon araçlarını etkinleştirmek için Home Assistant'ı yeniden başlatın.", - "pg_sim_progress": "{done} / {total} döngü", - "pg_starting": "Başlatılıyor…", - "pg_stress_synthetic": "bekleme simülasyonu burada başlar", - "pg_sweep_intro": "{param} farklı olsaydı ne olurdu? En çok döngünün doğru şekilde eşleştirildiği ayarı bulmak için son {cycles} döngünüzde {steps} değeri test edin.", - "pg_sweep_step": "Adım {done} / {total}", - "pg_undetected": "{n} döngü{s} algılanmadı", - "pg_verdict_bad": "Dikkat gerekiyor: birçok döngü algılanmadan geçiyor.", - "pg_verdict_good": "İyi ayarlanmış: çoğu döngü doğru şekilde tanımlanıp eşleştiriliyor.", - "pg_verdict_ok": "Kabul edilebilir: bazı döngüler kaçırıldı. Başlangıç eşiğini düşürmeyi deneyin.", - "phase_catalog_intro": "Bir döngünün adlandırılmış bölümleri (Ön yıkama, Isınma, Sıkma…). Denetim panelinden bir profile atayın.", - "phase_ranges_intro": "Ortalama eğri üzerinde bindirilen faz aralıkları (döngü başlangıcından dakikalar). Canlı önizleme için değerleri düzenleyin.", - "playground_intro": "Geçmiş döngüleri farklı ayarlarla yeniden oynatmak, iki kurulumu yan yana karşılaştırmak ve bir döngünün bir profile nasıl hizalandığını incelemek için güvenli bir test alanı. Siz açıkça uygulamadıkça buradaki hiçbir şey canlı verilerinizi değiştirmez.", - "playground_needs_restart": "Test Alanı araçlarını etkinleştirmek için Home Assistant'ı yeniden başlatın.", - "preferences_admin": "Tercihler, panel ve erişim denetimi", - "preferences_adv": "Tercihler", - "prefs_personal": "Bunlar yalnızca Home Assistant hesabınıza uygulanır.", - "process_history_hint": "Tüm saklanan döngülerde eşleştirmeyi yeniden çalıştırın, ayar önerilerini yenileyin, ML modellerini yeniden eğitin (etkinleştirilmişse) ve döngü sağlığını yeniden hesaplayın. Bir toplu incelemenin ardından çalıştırın.", - "profile_deleted": "Profil silindi", - "profile_poor_health_detail": "Bu profile atanan döngüler tutarsız şekillere sahip veya güvenirliği düşük. Zarfı yeniden oluşturmayı veya etiketli döngüleri gözden geçirmeyi düşünün.", - "profiles_intro": "İstatistikler, aşamalar ve temizleme için bir profile tıklayın. Güvenilir seçim için neredeyse aynı programları (aynı şekil/süre, farklı sıcaklık veya dönüş) gruplayın.", - "rbac_hint": "Kapalı olduğunda her Home Assistant kullanıcısı tam erişime sahip olur (varsayılan). Yöneticiler her zaman tam erişime sahip olup herkesi yönetebilir.", - "recent_logs": "Son ha_washdata kayıtları", - "recording_in_progress": "Kayıt devam ediyor", - "reminders_intro": "Son servisten bu kadar döngü sonra panelde bir hatırlatma göster. Bir hatırlatmayı kapatmak için boş bırakın veya 0 girin.", - "restart_gap_footer": "Grafikte vurgulandı. Bu aralıklar için güç verisi eksik; eşleştirme yalnızca gerçek okumaları kullandı.", - "restart_gap_header": "{n} HA yeniden başlatma boşluğu bu döngü sırasında", - "restart_gap_item": "{dur} boşluk", - "review_confirm_help": "Bu döngünün doğru şekilde algılanıp algılanmadığını doğrulayın. İncelemeleriniz makinenizdeki modeli eğitir; ne kadar çok döngü onaylarsanız o kadar iyi eşleştirme ve sağlık puanlaması elde edilir. Hızlı bir İyi/Kötü yeterlidir.", - "review_in_settings": "Ayarlarda İncele", - "review_notes_placeholder": "Notlar (isteğe bağlı)", - "review_notes_tip": "Kendi referansınız için serbest metin notları. Eşleştirme veya antrenman yoluyla kullanılmaz.", - "review_profile_tip": "Bu döngünün etiketlendiği program. Otomatik algılanan program yanlışsa burada düzeltin; etiketleme gelecekteki döngüler için eşleştirmeyi öğretir.", - "review_quality_tip": "Bu döngü ne kadar temiz. İyi = bu programın ders kitabı örneği; Kötü = algılandı ancak gürültülü veya atipik; Kullanılamaz = yanlış algılandı (birleştirilmiş, kısaltılmış veya sahte). Sağlık puanını ve modeli eğitmek için hangi döngülere izin verildiğini yönlendirir.", - "review_recorded_tip": "Bunu, programı için özenle seçilmiş bir referans döngüsü olarak işaretleyin; manuel olarak kaydedilen bir döngüyle aynı rol. Referans döngüleri her zaman tutulur, eşleşen şablonun çekirdeği oluşturulur ve hiçbir zaman temizleme işlemi nedeniyle bırakılmaz. (Bu \"altın\"/kaydedilmiş bayraktır; ikisi de aynı şeydir.)", - "review_tags_tip": "Bu döngüde neyin yanlış gittiğini açıklayan isteğe bağlı bayraklar, böylece eğitim ve temizlik bunu açıklayabilir.", - "review_to_cycles": "Döngü inceleme kuyruğunu aç", - "saving_triggers_reload": "Kaydetme bir entegrasyon yeniden yüklemesini tetikler. HA varlıkları kısa süreliğine kullanılamaz olarak görünebilir.", - "search_placeholder": "Ayar ara…", - "see_recorder": "Aşağıdaki kaydedici widget'ına bakın", - "setting_changed": "{date} tarihinde {old} değerinden {new} değerine değiştirildi", - "settings_basic_note": "Temel ayarlar gösteriliyor. Tam liste için Gelişmiş'e geçin.", - "shape_drift_advisory": "⚠ Şekil kayıyor", - "shape_drift_detail": "Bu profil için güç paterni zamanla kaymıştır – olası cihaz aşınması veya bakım gerekebilir (örn. kireç çözme, filtre temizliği).", - "show_all_settings": "Tüm ayarları göster", - "showing_suggestions": "Önerilerle birlikte {count} ayarı gösteriliyor.", - "split_intro": "Bölme noktası eklemek veya kaldırmak için grafiğe tıklayın veya boşta kalma aralıklarına göre otomatik algılayın. Her elde edilen bölüm kendi profilini alabilir.", - "storage_diagnostics": "Depolama istatistikleri, bakım, dışa/içe aktarma", - "sug_staged": "{key} = {val} olarak ayarlandı. Uygulamak için kaydedin.", - "toast_auto_detect_enabled": "Otomatik algılama etkinleştirildi", - "toast_auto_label_complete": "Otomatik etiketleme tamamlandı", - "toast_auto_label_failed": "Otomatik etiketleme başarısız: {error}", - "toast_automation_failed": "Otomasyon oluşturulamadı: {error}", - "toast_automation_migrated": "Eylemler bir otomasyona taşındı; düzenleyici açılıyor", - "toast_convert_failed": "Dönüştürme başarısız: {error}", - "toast_create_failed": "Oluşturma başarısız: {error}", - "toast_delete_failed": "Silme başarısız: {error}", - "toast_error": "Hata: {error}", - "toast_failed": "Başarısız: {error}", - "toast_force_stop_failed": "Zorla durdurma başarısız: {error}", - "toast_name_required": "Ad gerekli", - "toast_no_automation": "Burada otomasyon oluşturulamaz", - "toast_profile_name_required": "Profil adı gereklidir", - "toast_program_set": "Program ayarlandı: {program}", - "toast_rebuild_failed": "Yeniden oluşturma başarısız: {error}", - "toast_resume_failed": "Devam ettirme başarısız: {error}", - "toast_revert_failed": "Geri alma başarısız: {error}", - "toast_reverted": "{key} geri alındı", - "toast_save_failed": "Kaydetme başarısız: {error}", - "trend_duration_longer": "Süre trendi daha uzun (%{pct}/döngü) – son ortalama {avg}", - "trend_duration_shorter": "Süre eğilimi daha kısa (%{pct}/döngü) – son ortalama {avg}", - "trend_energy_down": "Enerji düşüş eğiliminde (%{pct}/döngü)", - "trend_energy_up": "Enerji yükseliş eğiliminde (%{pct}/döngü) – son ortalama {avg}", - "trim_intro": "Kırmızı tutamaçları sürükleyin veya değer girin. Pencerenin dışındaki her şey kaldırılır.", - "tuning_suggestions_available": "Gözlemlenen döngülerden {count} ayarlama önerisi mevcut. İlgili alanların yanında görünürler.", - "unsure_detected_prefix": "WashData algıladığından emin değil", - "updated": "Güncellendi", - "warmup_badge": "Hâlâ öğreniyor ({done}/{needed} döngü)", - "warmup_detail": "Bu profil, otomatik eşleştirme başlamadan önce {needed} etiketli döngüye ihtiyaç duyar. Her onaylanan döngü öğrenmesine yardımcı olur.", - "wipe_history_warning": "Tüm döngüleri ve profilleri kalıcı olarak silin. Geri alınamaz.", - "compare_overlay_tip": "Her döngünün hangi programa benzediğini görmek için öğrenilen profil zarflarını üst üste bindirin.", - "duration_trend_up_tip": "Süre artıyor (%{pct}/döngü)", - "duration_trend_down_tip": "Süre azalıyor (%{pct}/döngü)", - "energy_trend_up_tip": "Enerji artıyor (%{pct}/döngü)", - "energy_trend_down_tip": "Enerji azalıyor (%{pct}/döngü)", - "performance_trending": "Performans eğilimi", - "pg_select_cycle_hint": "Yüklemek için bir döngü seçin ve ↺ düğmesine tıklayın", - "pg_sweep_progress": "Adım {done} / {total}", - "pg_analysis_hint": "Analizi yüklemek için bir döngü seçin ve ↺ düğmesine tıklayın.", - "diagnostics_load_failed": "Tanılamalar yüklenemedi: {error}", - "manual_duration_ref_hint": "Yalnızca hiçbir referans döngü seçilmediğinde kullanılır. Bir referans döngü, süreyi kendi uzunluğuna göre belirler.", - "toast_convert_rolled_back": "Dönüştürme başarısız oldu ve geri alındı (geride otomasyon bırakılmadı): {error}", - "toast_convert_orphan": "Otomasyon oluşturuldu ancak eski eylemler temizlenemedi. Tekrar denemeyin: yinelenen bir otomasyondan kaçınmak için eski eylemleri elle kaldırın.", - "advisory_duration_trend_up": "'{name}' çevrimleri giderek uzuyor (çevrim başına yaklaşık +{pct}%). Cihazın davranışı değiştiyse bu profili yeniden kaydedin veya yeniden oluşturun.", - "advisory_energy_trend_up": "'{name}' giderek daha fazla enerji çekiyor (çevrim başına yaklaşık +{pct}%) - beklenmedikse cihazı kontrol etmekte fayda var.", - "advisory_poor_health": "'{name}' düşük bir uyum puanına sahip - son çevrimleri çok değişkenlik gösteriyor veya zayıf eşleşiyor. Eşleştirme ve süre tahminlerinin doğru kalması için çevrimlerini gözden geçirin ya da profili yeniden kaydedin.", - "advisory_shape_drift": "'{name}' orijinal güç eğrisinden önemli ölçüde uzaklaştı. Cihazın davranışı zamanla değişmiş olabilir (ör. kireçlenme, aşınma). Bu profili son çevrimlerle yeniden kaydetmeyi düşünün.", - "advisory_shape_drift_corr": "'{name}' orijinal güç eğrisinden önemli ölçüde uzaklaştı (korelasyon {corr}). Cihazın davranışı zamanla değişmiş olabilir (ör. kireçlenme, aşınma). Bu profili son çevrimlerle yeniden kaydetmeyi düşünün.", - "pg_no_alerts": "Bu çalıştırmada sorun tespit edilmedi.", - "pg_override_active": "Düzenlediğiniz ayarlar mevcut ayarlara karşı kullanılıyor", - "pg_history_intro": "Son döngülerinizi gerçek algılayıcı ve eşleştirici üzerinden yeniden oynatın. Burada bir önce/sonra karşılaştırması görmek için önce Simülasyon modunda bir algılama ayarını düzenleyin.", - "pg_history_empty": "Döngülerinizi yeniden oynatmak için Çalıştır'a basın.", - "pg_history_summary": "{detected}/{total} algılandı · {correct} doğru eşleşti", - "pg_sweep_no_metric": "Bu hedefi puanlamak için yeterli veri yok.", - "pg_sweep_intro2": "Son döngülerinizde bir hedefi en iyi karşılayan ayarı bulun. Siz uygulayana kadar hiçbir şey değişmez.", - "pg_running_history": "Döngüleriniz yeniden oynatılıyor…", - "pg_running_sweep": "Değerler tüm döngülerinizde test ediliyor…", - "pg_row_load_hint": "Bu döngüyü yukarıdaki grafiğe yükle", - "pg_history_intro2": "Son döngülerinizi yukarıdaki ayarlarla gerçek algılayıcı ve eşleştiriciden geçirerek yeniden oynatın. Bir döngüyü grafiğe yüklemek için herhangi bir satıra tıklayın; öncesi/sonrası karşılaştırması görmek için bir ayarı değiştirin.", - "pg_simulating": "Döngü simüle ediliyor…", - "pg_canvas_empty2": "Yukarıdan bir döngü seçin ve simüle etmek için Çalıştır'a basın. Ardından değerleri okumak için üzerine gelin, yakınlaştırmak için kaydırın ve kaydırmak için sürükleyin.", - "pg_apply_settings_confirm": "Bu {n} ayar bu cihaza kaydedilsin mi? {list}", - "pg_stress_terminated_detail": "Yaklaşık {idle} W bekleme seviyesine oturdu -- döngü {h} sa {m} dk sonra {reason} ile sona erdi.", - "pg_stress_above_threshold_detail": "Bekleme tüketimi (~{idle} W) etkin durdurma eşiğine ({stop} W) eşit veya bu eşiğin üzerinde -- döngü hiçbir zaman sessiz olarak kaydedilmedi. Düzeltmek için stop_threshold_w değerini artırın.", - "pg_stress_hit_cap_detail": "Döngü {h} sa {m} dk boyunca durmadan çalıştı -- güvenlik sınırı tarafından zorla durduruldu. Bekleme tüketimi {idle} W, durdurma eşiği {stop} W.", - "no_logs_match": "Bu filtrelerle eşleşen günlük kaydı yok.", - "pg_analysis_hint2": "Bir döngü seçin ve eşleşme analizini yüklemek için Çalıştır'a basın.", - "pg_analysis_empty2": "Eşleşme analizini görmek için Çalıştır'a basın.", - "imported_readonly": "Topluluk mağazasından içe aktarıldı. Referans ve eşleştirme için gösterilir. İstatistiklerinize sayılmaz ve düzenlenemez.", - "merge_no_imports": "İçe aktarılan kayıtlar gerçek bir döngüye birleştirilemez. Birleştirmek için seçimlerini kaldırın.", - "store_enable_hint": "Topluluk referans döngülerine göz atmak ve içe aktarmak için Ayarlar'da çevrimiçi özellikleri etkinleştirin.", - "online_intro": "Diğer WashData kullanıcılarıyla referans döngüleri paylaşın ve indirin. Tüm çevrimiçi özellikler isteğe bağlıdır ve varsayılan olarak kapalıdır.", - "store_share_intro": "Aynı cihaza sahip diğerlerinin kullanabilmesi için bu referans döngüyü yükleyin. Herkese açık olmadan önce incelenir.", - "online_intro_global": "Diğer WashData kullanıcılarıyla referans kayıtlarına göz atın ve paylaşın, cihaz girişlerini onaylayın. Tek bir bağlantı tüm WashData entegrasyonunuz için geçerlidir; cihaz markası ve modeli her cihaz için Temel bölümünde ayarlanır. Tüm çevrimiçi özellikler isteğe bağlıdır ve varsayılan olarak kapalıdır.", - "online_unavailable": "Çevrimiçi özellikler bu sunucuda kullanılamıyor.", - "store_picker_offline": "Topluluk kataloğundan seçim yapmak için ayarlar dişlisinde çevrimiçi özellikleri etkinleştirin.", - "pick_brand_first": "Önce bir cihaz markası seçin.", - "model_not_found": "Henüz katalogda yok.", - "connect_to_confirm": "Onaylamak veya değerlendirmek için ayarlar dişlisinde bağlanın.", - "adopt_settings_hint": "Bu cihazın algılama ve eşleştirme eşiklerini paylaşılanlarla üzerine yaz. Bildirimleriniz, varlıklarınız ve enerji fiyatınız hiçbir zaman değiştirilmez.", - "include_settings_hint": "Bu cihazın tanıma ve eşleştirme eşiklerini paylaşın (bildirimlerinizi, varlıklarınızı veya enerji fiyatınızı değil). Benimseyenler bunların uygulanıp uygulanmayacağını seçer.", - "onboard_download": "Yeni cihaz mı? Aynı cihaza sahip başka bir WashData kullanıcısından hazır bir kurulum (programlar, referans döngüleri ve fazlar) benimseyin.", - "share_consent": "Bu döngülerin kesintisiz normal şekilde tamamlandığını onaylıyorum", - "share_device_none": "Henüz paylaşılabilir döngü yok. Önce Döngüler sekmesinde kayıtlı veya el ile seçilen bir döngüyü referans döngüsü (⭐) olarak işaretleyin.", - "share_guideline_naming": "Her profili cihazın kadranında veya ekranında tam olarak gösterildiği gibi adlandırın (örn. 'Cotton 40', 'Eco 60').", - "share_guideline_quality": "Yalnızca normal şekilde tamamlanan döngüleri paylaşın -- döngü ortasında kesinti, kapı açma olayları veya güç kesintisi olmadan.", - "share_guideline_review": "Yüklemeniz beklemede olarak başlar ve yeterince topluluk üyesi onayladığında kamuya açılır.", - "share_guidelines_title": "Paylaşmadan önce", - "store_download_device_intro": "Her paylaşılan programı ve referans döngülerini cihazınıza benimseyin. Kendi kayıtlı döngüleriniz ve istatistikleriniz etkilenmez.", - "store_share_device_intro": "Seçtiğiniz referans döngüleriyle {brand} {model} cihazını yükleyin. Aynı cihaza sahip diğer kullanıcılar programlarınızı benimseyebilir. Girişler kamuya açılmadan önce incelenir.", - "share_profile_no_cycles": "Referans döngüsü yok -- bu profili dahil etmek için Döngüler sekmesinde bir döngüyü ⭐ olarak işaretleyin", - "advisory_phase_inconsistent": "'{name}' farklı programları veya sıcaklıkları karıştırıyor gibi görünüyor - çevrimleri çok farklı sürelerde ısıtma yapıyor. Bunu ayrı profillere bölmek (örneğin her sıcaklık için) eşleştirmeyi ve süre tahminlerini iyileştirir.", - "advisory_phase_inconsistent_title": "⚠ Karışık olabilecek programlar", - "export_select_intro": "Nelerin dahil edileceğini tam olarak işaretleyin. Profilleri döngüleri olmadan seçmek yine de tanınabilir bir program dışa aktarır (öğrenilen şekli de birlikte taşınır).", - "import_analyze_hint": "Dışa aktarılmış bir dosya yükleyin (veya JSON'unu yapıştırın). WashData bunu analiz eder ve herhangi bir değişiklik olmadan önce tam olarak neyin içe aktarılabileceğini gösterir.", - "analyzing": "Analiz ediliyor…", - "device_type_mismatch_warn": "Bu dışa aktarma farklı bir cihaz türünden ({src} ile {local}). Programlar ve döngüler yine de referans verisi olarak içe aktarılabilir, ancak cihaza özgü ayarlar ve gerçek geçmiş içe aktarımı devre dışıdır.", - "merge_hint": "İçe aktarılan öğeler eklenir; yerel hiçbir şey kaybolmaz. Ad çakışmaları aşağıda çözülür.", - "replace_warn": "İşaretlenen her kategori silinir ve dosyadan gelenle değiştirilir. İşaretlenmeyen kategorilere dokunulmaz.", - "dest_reference_hint": "İçe aktarılan döngüler yalnızca program tanımayı iyileştirir ve kullanım/enerji istatistiklerini asla etkilemez.", - "dest_real_history_hint": "İçe aktarılan döngüler bu cihazın kendi geçmişi olarak sayılır ve enerji/kullanım istatistiklerini besler. Bir cihazı yeni bir kuruluma taşırken kullanın." - }, - "pg_desc": { - "completion_min_seconds": "Gerçek döngü sayılan en kısa çalışma", - "end_repeat_count": "Bitmeden önce arka arkaya düşük okuma", - "interrupted_min_seconds": "Kısa döngüler kesintiye uğramış olarak işaretlenir", - "min_off_gap": "İki döngüyü ayırmak için gereken boşluk", - "off_delay": "Döngü bitmeden önceki düşük güç saniyesi", - "start_duration_threshold": "Başlangıcı onaylamak için eşik üstünde saniye", - "start_threshold_w": "Başladı sayılması için minimum watt", - "stop_threshold_w": "Bunun altında makine kapalı sayılır", - "anti_wrinkle_enabled": "Ana aşamadan sonraki takla darbelerini yeni döngü olarak okumak yerine emer", - "anti_wrinkle_exit_power": "Kırışıklık önlemenin etkin kalması için gücün darbeler arasında bunun altına düşmesi gerekir", - "anti_wrinkle_idle_timeout": "Kırışıklık önleme sona ermeden önce iki takla darbesi arasında izin verilen sessiz süre", - "anti_wrinkle_max_duration": "Bundan uzun bir darbe kırışıklık önlemeyi bitirir ve yeni bir döngü açar", - "anti_wrinkle_max_power": "Bunun üzerindeki bir darbe kırışıklık önlemeyi bitirir ve yeni bir döngü açar", - "dtw_bandwidth": "Aşama 3: Sakoe-Chiba büküm bandı (0 = DTW kapalı; varsayılan 0.2 = döngü uzunluğunun %20'si)", - "corr_weight": "Aşama 2: eğri şekli (korelasyon) ile güç düzeyi (MAE) arasındaki denge; varsayılan 0.45", - "duration_weight": "Aşama 4: çalışma süresi uyumunun nihai puanı ne kadar etkilediği (varsayılan 0.22)", - "energy_weight": "Aşama 4: enerji uyumunun nihai puanı ne kadar etkilediği (varsayılan 0.22)", - "profile_match_min_duration_ratio": "Aşama 1: profil süresinin bir kesri olarak minimum döngü uzunluğu; varsayılan 0.1 (%10)", - "profile_match_max_duration_ratio": "Aşama 1: profil süresinin bir kesri olarak maksimum döngü uzunluğu; varsayılan 1.5 (%150)", - "keep_min_score": "Aşama 2: yarışta kalmak için taban puan; varsayılan 0.1 zayıf eşleşmelere izin verir, sonraki aşamalar en iyisini seçer", - "dtw_blend": "Aşama 3: 0 = yalnızca çekirdek puan, 1 = yalnızca DTW puanı, 0.5 = eşit karışım (varsayılan)", - "dtw_ensemble_w": "Aşama 3 (topluluk modu): ölçeklendirilmiş-L1 ile türev DTW arasındaki ağırlık; varsayılan 0.7 düzey farkındalığını tercih eder", - "dtw_ddtw_scale": "Aşama 3: DDTW yarı doygunluk mesafesi; küçük = şekle daha duyarlı (varsayılan 30)", - "dtw_refine_top_n": "Aşama 3: DTW'nin yeniden puanladığı aday sayısı; doğru profil 4-5. sıraya düşüyorsa 7-9'a yükseltin (varsayılan 5)", - "duration_scale": "Aşama 4: süre uyumunun yarılandığı logaritmik oran; küçük = daha sert ceza (varsayılan 0.175)", - "energy_scale": "Aşama 4: enerji uyumunun yarılandığı logaritmik oran; küçük = daha sert ceza (varsayılan 0.25)" - }, - "phase_desc": { - "anti_crease": "Kırışıklıkları azaltmak için tamamlandıktan sonra ara sıra kısa yuvarlanmalar.", - "anti_wrinkle": "Kırışıklıkları azaltmak için döngü sonrası periyodik yuvarlanma.", - "cool_down": "Döngü sonuna yaklaşıldığında ısınma olmadan yuvarlanma.", - "drain_and_switch": "Yıkama modundan kurutma moduna geçiş süresi.", - "dry": "Isıtıcı ve/veya artık ısı kullanılarak kurutma aşaması.", - "drying": "Ana ısıtmalı tamburlama dönemi.", - "heat_up": "Tam kurutma başlamadan önce ısıtıcının ilk ısınması.", - "pre_rinse": "Deterjanla yıkamadan önce ilk püskürtme.", - "pre_wash": "Ana yıkamadan önce ilk ıslatma veya ön işlemden geçirin.", - "rinse": "Temiz su durulama aşaması. Bu aşama birden çok kez tekrarlanabilir.", - "sanitize": "Sterilizasyon programları için yüksek sıcaklıkta temizleme aşaması.", - "sensor_check": "Kuruluk ölçülürken kısa düşük güçte duraklama.", - "soak": "Aktif yıkama aşamaları arasında düşük aktiviteli ıslatma süresi.", - "soak_dw": "Ağır topraklar için uzatılmış ıslatma süresi.", - "spin": "Yükteki suyu çıkarmak için yüksek hızlı ekstraksiyon.", - "spin_wd": "Kurutma geçişinden önce yüksek hızlı ekstraksiyon.", - "wash": "Tambur hareketi ve isteğe bağlı ısıtma ile ana yıkama programı.", - "wash_dw": "Ana deterjanla ısıtma ile yıkama." - }, - "placeholder": { - "add": "ekle…", - "group_name": "örn. Pamuk 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "bir bildirim hizmeti ekle…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "bir kişi ekle…", - "phase_name": "örn. Ön yıkama", - "profile_name": "örn. Pamuk 40°C", - "maintenance_notes": "örn. filtre değiştirildi, kapı contası temizlendi", - "store_brand": "örn. Bosch", - "store_model": "örn. WAT28401" - }, - "pref": { - "date_absolute": "Mutlak (ör. 2 Tem 14:32)", - "date_relative": "Göreli (ör. 2 saat önce)", - "lang_auto": "Sistem varsayılanı ({lang})", - "lang_en": "İngilizce", - "use_panel_default": "(panel varsayılanı)" - }, - "quality": { - "bad": "Kötü", - "good": "İyi", - "unusable": "Kullanılamaz" - }, - "section": { - "anti_wrinkle": { - "intro": "Kırışıklık önleme modu, ana aşamadan sonra düşük güçlü tumble darbelerini algılar ve bunları tamamlanan döngüye bağlı tutar.", - "label": "Kırışıklık Önleme" - }, - "basic": { - "intro": "Temel kimlik ve çoğu kurulum için gerekli olan temel öğeler.", - "label": "Temel" - }, - "delay": { - "intro": "Gecikmeli başlatma algılaması, cihazın açık olduğu ancak henüz döngüsüne başlamadığı durumu tespit eder.", - "label": "Gecikmeli Başlatma" - }, - "detection": { - "intro": "Bir döngünün nasıl başladığı, çalıştığı ve bittiği algılanır.", - "label": "Algılama" - }, - "matching": { - "intro": "Tamamlanan döngülerin öğrenilen profillerle nasıl eşleştirilip etiketlendiği.", - "label": "Eşleştirme" - }, - "ml_training": { - "intro": "Cihaz üzerinde makine öğrenmesi yeniden eğitim takvimi ve veri ayarları.", - "label": "ML Eğitimi" - }, - "notifications": { - "intro": "Döngü olayları hakkında ne zaman ve nasıl bildirim alacağınız.", - "label": "Bildirimler" - }, - "timing": { - "intro": "Arka plan ritmi, çevrimdışı bekçi ve bakım işlemleri.", - "label": "Zamanlama & Bekçi" - }, - "triggers": { - "intro": "İsteğe bağlı harici sinyaller: bitiş tetikleyicisi, kapı sensörü, duraklatma anahtarı ve boşaltma hatırlatıcısı.", - "label": "Tetikleyiciler & Kapılar" - }, - "phase_eta": { - "label": "Kalan Süre", - "intro": "Çevrim uzunluğu sıcaklığa veya sıkmaya bağlı olan makineler için aşama farkındalıklı kalan süre." - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "Kurutucunun ana ısıtma aşamasından sonra yaydığı kısa, düşük güçlü tambur darbelerini tanıyın ve bunları yeni döngüler olarak okumak yerine bitmiş döngüye bağlı tutun.", - "label": "Kırışıklık Önleme Algılamayı Etkinleştir" - }, - "anti_wrinkle_exit_power": { - "doc": "Kırışıklık önleme modunun aktif kalması için darbeler arasında gücün bu değerin altına düşmesi gerekir.", - "label": "Çıkış Gücü Eşiği" - }, - "anti_wrinkle_idle_timeout": { - "label": "Maks. Darbe Aralığı", - "doc": "Kırışıklık önleme modu sona ermeden önce makinenin iki takla darbesi arasında ne kadar süre sessiz kalabileceği. Bunu kurutucunuzun darbeler arasında bıraktığı en uzun boşluğun üzerine ayarlayın, aksi halde sonraki her darbe hatalı başlangıç olarak okunur." - }, - "anti_wrinkle_max_duration": { - "doc": "Bundan daha uzun darbeler, kırışıklık önleyici bir takla yerine gerçek bir döngü olarak değerlendirilir.", - "label": "Maks. Süre" - }, - "anti_wrinkle_max_power": { - "doc": "Bu gücün üzerindeki bir nabız, kırışıklık karşıtı bir düşüş değil, gerçek bir yeni döngü olarak değerlendirilir. Takla darbe gücünün hemen üstüne ayarlayın.", - "label": "Maks. Kırışıklık Önleme Gücü" - }, - "auto_label_confidence": { - "doc": "Döngü sonundaki maç skoru bu seviyede veya üzerindeyse program herhangi bir onay istemi olmadan otomatik olarak etiketlenir. Otomatik etiketlemeden önce daha yüksek kesinlik gerektirecek şekilde yükseltin; daha fazlasını otomatikleştirmek için düşürün. Altındaki Learning Confidence ile birlikte çalışır.", - "label": "Otomatik Etiket Güveni" - }, - "auto_maintenance": { - "doc": "Gecelik temizlik yapın: profil zarflarını yeniden oluşturun, döngü sağlığını yeniden hesaplayın, hata ayıklama izlerini budayın ve en son döngüleri koruyun.", - "label": "Otomatik Bakım (gece temizliği)" - }, - "completion_min_seconds": { - "doc": "Bundan daha kısa döngüler hayalet döngüler olarak atılır (test çalıştırmaları, çorap eklemek için kapıyı açma).", - "label": "Min. Döngü Süresi" - }, - "delay_confirm_seconds": { - "doc": "Cihazın çalışmak yerine başlamayı bekliyor olarak değerlendirilmesi için gücün bu süre boyunca bekleme bandında kalması gerekir.", - "label": "Onay Saniyeleri" - }, - "delay_start_detect_enabled": { - "doc": "Cihazın ne zaman açık olduğunu ve beklediğini (gecikmeli başlatma / bekleme) ancak kendi döngüsüne başlamadığını tespit edin, böylece bekleme çekmesi bir çalışma döngüsüyle karıştırılmaz.", - "label": "Gecikmeli Başlatma Algılamayı Etkinleştir" - }, - "delay_timeout_hours": { - "doc": "Bu kadar saatten sonra gecikmeli başlatma modunda beklemeyi bırakın ve boşta çalışmaya dönün; böylece, açık bırakılan ancak hiç başlatılmayan bir makine sonsuza kadar beklemez.", - "label": "Zaman Aşımı Saatleri" - }, - "device_type": { - "doc": "Cihaz sınıfı. Söz konusu cihaz türü için ayarlanmış mantıklı algılama varsayılanlarını (eşikler, düşmede gecikme, son işleme) ayarlar; bunu yalnızca aygıt başlangıçta yanlış türde ayarlanmışsa değiştirin.", - "label": "Cihaz Türü" - }, - "door_sensor_entity": { - "doc": "Opsiyonel kapı ikili sensörü. Bir döngüden sonra cihazın ne zaman açıldığını/boşaltıldığını tespit etmek için kullanılır.", - "label": "Kapı Sensörü Varlığı" - }, - "duration_tolerance": { - "doc": "Kalan zaman tahminlerine yönelik tolerans (öğrenme geri bildirimi, eşleşme değil). Gerçek süre tahminin +/-%X'i dahilindeyse, iyi bir eşleşme olarak sayılır.", - "label": "Tahmin Toleransı" - }, - "enable_ml_models": { - "doc": "Bir döngü çalışırken, modellerin canlı sonuçları iyileştirmesine izin verin: daha istikrarlı bir kalan süre ve enerji/maliyet tahmini ve son tespitte erken durdurma önleme koruması (bir bitişi yalnızca geciktirebilir, hiçbir zaman erken bitiremez ve sınırlıdır). Mümkün olduğunda ince ayarlı modellerinizi, aksi takdirde yerleşik olanları kullanır. Kapalı = yalnızca klasik güç tabanlı mantık (hala güvenilir).", - "label": "Döngü sırasında akıllı modelleri uygula" - }, - "end_energy_threshold": { - "doc": "Düşmede gecikme geri sayımı sırasında biriken enerji (watt x zaman) bu eşikle karşılaştırılır. Aşılması durumunda geri sayım sıfırlanır; kırışık önleyici tamburlar ve bulaşık makinesi kurutma kuyrukları kısa kesilmek yerine döngüye bağlı kalır. Soğutma sırasında döngüler çok erken biterse yükseltin; algılama yavaşsa düşürün.", - "label": "Bitiş Enerjisi" - }, - "end_repeat_count": { - "doc": "Döngü sona ermeden önce gereken ardışık durma eşiği altı okumalarının sayısı. Çoğu fiş için 1 uygundur. Akıllı priziniz ara sıra döngünün ortasında yanlış sıfır örneği bildiriyorsa ve döngüleriniz zamanından önce sona eriyorsa 2-3'e yükseltin.", - "label": "Bitiş Tekrar Sayısı" - }, - "energy_price_entity": { - "doc": "kWh başına güncel elektrik fiyatını gösteren sensör (örn. dinamik tarife). Aşağıdaki statik fiyata göre önceliklidir. Her döngü bittiğinde geçerli olan fiyat dondurulur.", - "label": "Enerji Fiyatı Varlığı" - }, - "energy_price_static": { - "doc": "Yukarıda hiçbir canlı fiyat varlığı belirlenmediğinde maliyet rakamları için kullanılan kWh başına sabit fiyat.", - "label": "Sabit Enerji Fiyatı (kWh başına)" - }, - "energy_sensor": { - "doc": "İsteğe bağlı kümülatif enerji sayacı (total_increasing kWh/Wh, örn. prizin kendi ömür boyu sayacı). Ayarlandığında, her döngünün raporlanan enerjisi bu sayacın baştan sona olan farkından alınır; bu da yavaş raporlayan bir güç sensörünün integralini almaktan kaynaklanan eksik sayımı önler. Okuma eksikse, birimi bilinmiyorsa veya fark pozitif değilse integral alınmış değere geri döner. Güç sensörünün integralini almaya devam etmek için boş bırakın.", - "label": "Enerji Sayacı Varlığı" - }, - "expose_debug_entities": { - "doc": "Ekstra teşhis HA varlıkları yayınlayın (eşleşme güveni, belirsizlik, dahili durum bilgileri). Kapalı, varlık listesini normal kullanım için temiz tutar.", - "label": "Hata Ayıklama Varlıklarını Göster" - }, - "external_end_trigger": { - "doc": "Durum değişikliği döngünün sonunu işaret eden ikili sensör (örneğin, cihazın \"tamamlanmış\" kontağı veya tamamlayıcı entegrasyon).", - "label": "Harici Tetikleyici Varlığı" - }, - "external_end_trigger_enabled": { - "doc": "Yerleşik güç tabanlı algılamaya ek olarak harici bir ikili sensörün döngünün sonunu bildirmesine izin verin.", - "label": "Harici Bitiş Tetikleyicisini Etkinleştir" - }, - "external_end_trigger_inverted": { - "doc": "Tetik sensörünün KAPALI duruma geçmesini (AÇIK yerine) döngü sonu sinyali olarak değerlendirin.", - "label": "Harici Tetikleyiciyi Tersine Çevir (KAPALI'da tetikle)" - }, - "learning_confidence": { - "doc": "Eşleşme puanı bu ile Otomatik Etiket Güveni arasında kalırsa, bir geri bildirim bildirimi tanımlanan programı doğrulamanızı ister. Bu skorun altında maç yüzeye çıkamayacak kadar belirsiz. Otomatik Etiket Güveninin altında tutulmalıdır.", - "label": "Öğrenme Güveni" - }, - "linked_device": { - "doc": "İsteğe bağlı olarak bu WashData cihazını, HA cihaz kaydında \"Bağlandı ...\" olarak gösterilen başka bir cihazın (örn. akıllı priz) altına yerleştirin.", - "label": "Cihaz Altında Grupla" - }, - "min_off_gap": { - "doc": "Makine bu süreden daha kısa bir süre kapanırsa açma/kapama/açma sırası tek bir sürekli döngü olarak değerlendirilir. Islatma programlarının (makine yıkamanın ortasında birkaç dakika süreyle kapanır) iki ayrı programa bölünmesini önler. Bunların ayrı döngüler olarak sayılmasını istiyorsanız, arka arkaya yükleriniz arasındaki boşluktan daha kısa ayarlayın. Cihaz tipi varsayılanları, her cihaz için tipik döngü içi duraklamayı korur.", - "label": "Min. Kapalı Aralık" - }, - "min_power": { - "doc": "Mutlak minimum gücün aktif olduğu kabul edilir. Bunun altındaki okumalar 0 W (bekleme) olarak kabul edilir ve akıllı prizlerin ve bekleme LED'lerinin hayalet yükü filtrelenir.", - "label": "Minimum Güç" - }, - "ml_training_enabled": { - "doc": "İncelenen döngülerinizi gece boyunca periyodik olarak inceleyin ve modellerde bu özel makineye göre ince ayar yapın. Bir değişiklik yalnızca uzayan döngülerde gerçekten daha iyi puan aldığında korunur, bu nedenle bu yalnızca yardımcı olabilir veya aynı kalabilir; asla gerilemez.", - "label": "Bu makineden öğren" - }, - "ml_training_hour": { - "doc": "Gece ince ayarını yapmak için günün yerel saati (0-23). 2 (02:00) gibi sessiz bir saat seçin.", - "label": "Saatte öğren" - }, - "ml_training_interval_days": { - "doc": "Gelişmeleri en fazla bu kadar günde bir kez yeniden kontrol edin.", - "label": "En fazla her seferinde kontrol et" - }, - "ml_training_min_cycles": { - "doc": "İnce ayar yapmadan önce en azından bu sayıda döngü kaydedilene kadar bekleyin, böylece öğrenilecek yeterli şey olur.", - "label": "Önce gereken döngüler" - }, - "name": { - "doc": "HA entegrasyonları listesinde ve cihaz kayıt defterinde gösterilen görünen ad.", - "label": "Cihaz Adı" - }, - "no_update_active_timeout": { - "doc": "Çalışırken bu kadar uzun süre güç güncellemesi gelmezse, fişin çevrimdışı olduğunu varsayalım ve bir zombi döngüsünden kaçınmak için zorla durdurun. Varsayılan 600 sn, bulut veya ağ gecikmesine izin verir.", - "label": "Güncelleme Yok Zaman Aşımı" - }, - "notify_before_end_minutes": { - "doc": "Tahmini kalan süre bunun altına düştüğünde Neredeyse Bitti uyarısı gönderin. 0 bunu devre dışı bırakır.", - "label": "Bitiş Öncesi Uyarı" - }, - "notify_channel": { - "doc": "Başlat/canlı mesajlar için Android bildirim kanalı adı (kanal başına sesi ve mobil uygulamada önceliği kontrol eder). Blank, tamamlayıcı uygulama varsayılanını kullanır.", - "label": "Android Kanalı (başlangıç/canlı)" - }, - "notify_cycle_timers": { - "doc": "Bir döngünün belirli dakikalarında bildirimler (örneğin yumuşatıcı eklemek için). Mesaj {device}, {program}, {minutes}'yi destekliyor. Bu noktada duraklatmak ve Devam Et düğmesiyle etkileşimli bir bildirim almak için Otomatik duraklatmayı etkinleştirin; panel, duraklatma/devam ettirme hizmeti veya bildirim eylemi aracılığıyla devam ettirebilirsiniz.", - "label": "Döngü Zamanlayıcıları" - }, - "notify_finish_channel": { - "doc": "Bitiş mesajı için Android bildirim kanalı adı. Boş, başlangıç/canlı kanalını yeniden kullanır.", - "label": "Android Kanalı (bitiş)" - }, - "notify_finish_message": { - "doc": "Bir döngü bittiğinde gönderilen gövde metni. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. Burada en kullanışlı olanlar {time_finished} ve {vs_typical}.", - "label": "Bitiş Mesajı" - }, - "notify_finish_services": { - "doc": "notify.* Bir döngü bittiğinde çağrılan hizmetler. Hedef başına bir tane ekleyin; bitiş bildirimi yoksa boş bırakın.", - "label": "Bitiş Servisleri" - }, - "notify_fire_events": { - "doc": "Ayrıca döngü başlangıcında/bitişinde ha_washdata_* olaylarını tetikleyin, böylece kendi otomasyonlarınızı oluşturabilirsiniz.", - "label": "Bildirimler için HA Olayları Tetikle" - }, - "notify_icon": { - "doc": "Bildirim için isteğe bağlı mdi simgesi (ör. mdi:çamaşır makinesi). Platform varsayılanı için boş bırakın.", - "label": "Bildirim Simgesi" - }, - "notify_live_chronometer": { - "doc": "Bildirimde statik bir tahmin yerine (bunu destekleyen platformlarda) canlı güncellenen bir geri sayım sayacı gösterin.", - "label": "Canlı Kronometre Kullan" - }, - "notify_live_interval_seconds": { - "doc": "Bir döngü çalışırken canlı ilerleme bildirimlerinin ne sıklıkla yenilendiği.", - "label": "Canlı Güncelleme Aralığı" - }, - "notify_live_overrun_percent": { - "doc": "Bir döngü, tahminini bu yüzdeden daha fazla aşarsa, bir taşma uyarısı gönderin.", - "label": "Uyarı Öncesi Canlı Aşım %" - }, - "notify_live_services": { - "doc": "notify.* hizmetleri, bir döngü çalışırken canlı ilerleme güncellemeleri için çağrıda bulundu. Canlı ilerleme bildirimlerini devre dışı bırakmak için boş bırakın.", - "label": "Canlı İlerleme Servisleri" - }, - "notify_only_when_home": { - "doc": "Yalnızca bağlantılı kişilerden (yukarıdaki) en az biri evde olduğunda bildirim gönderin.", - "label": "Yalnızca Evdeyken Bildir" - }, - "notify_people": { - "doc": "kişi.* \"Yalnızca Evdeyken Bildir\" tarafından evde kimsenin olup olmadığına karar vermek için kullanılan varlıklar.", - "label": "Kişiler (Evde İken için)" - }, - "notify_pre_complete_message": { - "doc": "Bitiş öncesi / neredeyse tamam uyarısının gövde metni. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Bitiş Öncesi Mesaj" - }, - "notify_reminder_message": { - "doc": "Hâlâ bekleyen boşaltma hatırlatıcısının gövde metni. Boş bırakmak yerleşik varsayılanı kullanır. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Hatırlatıcı Mesaj" - }, - "notify_start_message": { - "doc": "Bir döngü başladığında gönderilen gövde metni. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", - "label": "Başlangıç Mesajı" - }, - "notify_start_services": { - "doc": "notify.* Bir döngü başladığında çağrılan hizmetler. Hedef başına bir tane ekleyin (telefon, kontrol paneli vb.); Başlatma bildirimi için boş bırakın.", - "label": "Başlangıç Servisleri" - }, - "notify_timeout_seconds": { - "doc": "Bu kadar saniye sonra bildirimi otomatik olarak kapat (bunu destekleyen platformlarda). 0 manuel olarak kapatılana kadar bunu korur.", - "label": "Sonra Otomatik Kapat" - }, - "notify_title": { - "doc": "Bildirim başlığı. Şablon değişkenleri: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", - "label": "Bildirim Başlığı" - }, - "notify_unload_delay_minutes": { - "doc": "Hala bekleyen \"makineyi boşaltın\" hatırlatıcısı gönderilmeden önce bir döngü bittikten dakikalar sonra. Hatırlatıcıyı devre dışı bırakmak için 0'a ayarlayın.", - "label": "Boşaltma Hatırlatıcısı Gecikmesi" - }, - "off_delay": { - "doc": "Güç kesildikten sonra döngünün bittiğini bildirmeden önce beklenecek süre. Bu pencerede güç yeniden gelirse döngü sorunsuz bir şekilde devam eder; bu, yıkama aşamaları arasındaki duraklamaları köprüler. Bulaşık makinelerinin kurutma aşamaları uzundur (20-60 dakika boyunca güç kapalıdır), bu nedenle, tüm yıkama+kuruluğun tek bir döngüde tutulması için kapatma gecikmesinin bunu aşması gerekir.", - "label": "Kapatma Gecikmesi" - }, - "pause_cuts_power": { - "doc": "Bir döngü duraklatıldığında aşağıdaki Anahtar Varlığını da kapatın. Yalnızca kullanım süresinin ortasında fişi güvenli bir şekilde kesilebilen cihazlar için.", - "label": "Duraklatma Gücü de Keser (anahtar üzerinden)" - }, - "power_off_delay": { - "doc": "Bir döngü bittikten sonra durumun Kapalı'ya dönmesinden önce gücün Güç Kapatma Eşiği'nin altında ne kadar süre kalması gerektiğidir. Yalnızca Güç Kapatma Eşiği 0'ın üzerindeyken kullanılır. Arka plan döngüsünde denetlendiğinden, geçerli gecikme bir sonraki durum sona erme adımına yukarı yuvarlanır.", - "label": "Güç Kapatma Gecikmesi" - }, - "power_off_threshold_w": { - "doc": "Güce dayalı isteğe bağlı Kapalı algılama. 0'ın üzerinde olduğunda, bir döngü bittikten sonra güç, Güç Kapatma Gecikmesi süresince bu seviyenin altında kalırsa makine kapatılmış sayılır ve durum Kapalı'ya döner. Devre dışı bırakmak için 0'da bırakın (varsayılan). Bu değeri, gerçek kapalı taban değerinin üzerinde ve Durdurma Eşiği ile makinenizin bittiği hâlde açık kalan bekleme tüketiminin altında ayarlayın; Durdurma Eşiği'nin altında değilse yok sayılır. Etkinleştirildiğinde, Kapalı'ya dönmek için İlerleme Sıfırlama Gecikmesi'nin yerini alır; böylece biten bir makine, gerçekten kapatılana kadar Bitti/Temiz durumunda kalır.", - "label": "Güç Kapatma Eşiği" - }, - "power_sensor": { - "doc": "Bu cihaz için canlı gücü watt cinsinden bildiren sensör varlığı (ör. sensör.washer_power). Tüm döngü tespiti bu sinyale dayanır.", - "label": "Güç Sensörü" - }, - "profile_duration_tolerance": { - "doc": "Eşleştirme sırasında kullanılan profil ortalama süresi etrafındaki +/- bandı. 0,25, 60 dakikalık bir profilin 45-75 dakikalık döngülerle eşleştiği anlamına gelir.", - "label": "Profil Süre Toleransı" - }, - "profile_match_interval": { - "doc": "Çalışan bir döngü sırasında profil eşleştirmenin ne sıklıkla deneneceği. Varsayılan 300 sn (5 dakika), algılama hızını ve CPU'yu dengeler.", - "label": "Eşleşme Aralığı" - }, - "profile_match_max_duration_ratio": { - "doc": "Profile göre maksimum döngü uzunluğu. 1.3, bir döngünün eşleşmesi için profil süresinin %130'unun altında olması gerektiği anlamına gelir.", - "label": "Maks. Süre Oranı" - }, - "profile_match_min_duration_ratio": { - "doc": "Profile göre minimum döngü uzunluğu. 0,9, bir döngünün eşleşmesi için profil süresinin en az %90'ı olması gerektiği anlamına gelir.", - "label": "Min. Süre Oranı" - }, - "profile_match_threshold": { - "doc": "Bir program tanımlamasını kabul etmek için döngü sonunda gereken minimum benzerlik puanı (0-1). Yanlış tanımlamaları azaltmak için kaldırın; makinenizin programları eşleşmiyorsa düşürün. Varsayılan 0,4 ihtiyatlı bir başlangıç ​​noktasıdır.", - "label": "Eşleşme Eşiği" - }, - "profile_unmatch_threshold": { - "doc": "Canlı bir döngü ortası maçı bu puanın altına düşerse, geçici tanımlama silinir. Eşleşme Eşiğinin biraz altında tutun, böylece benzerlikteki kısa bir düşüş, ekranı tekrar benzersiz hale getirmez.", - "label": "Eşleşmeme Eşiği" - }, - "progress_reset_delay": { - "doc": "Bitirdikten sonra, bu süre boyunca ilerlemeyi %100'de tutun; böylece Tamamlandı, Boşta durumuna sıfırlamadan önce kontrol panellerinde görünür.", - "label": "İlerleme Sıfırlama Gecikmesi" - }, - "pump_stuck_duration": { - "doc": "Bir pompa, muhtemelen sıkışmış olarak işaretlenmeden önce sürekli olarak çalışabilir (sıkışmış pompa olayını tetikler).", - "label": "Pompa Takılma Süresi" - }, - "running_dead_zone": { - "doc": "Bir döngü başladıktan sonra bu penceredeki güç düşüşleri dikkate alınmaz. Çamaşır makineleri soğuk suyla doluyor (ısıtmadan önce neredeyse 0 W'a düşüyor) - bu koruma olmadan dolum aşaması bir döngü sonu gibi görünür. Bu, verileri atlamaz: tam güç takibi T=0'dan itibaren kaydedilir. Öneri motoru, makinenizin gerçek başlatma düzenini ölçer ve bunu otomatik olarak boyutlandırır.", - "label": "Çalışma Ölü Bölgesi" - }, - "sampling_interval": { - "doc": "Sensör okumaları arasında beklenen süre - yumuşatma penceresini boyutlandırmak ve geri dönmeyi doğru şekilde başlatmak için kullanılır. Her sensör güncellemesi bu değere bakılmaksızın yakalanır; yalnızca aşağı yöndeki hesaplamaları kalibre eder. Öneri motoru, sensörünüzün geçmiş döngülerdeki gerçek temposunu ölçer ve bunu otomatik olarak ayarlar.", - "label": "Örnekleme Aralığı" - }, - "save_debug_traces": { - "doc": "Her döngü için tam güç takibini ve eşleşen hata ayıklama verilerini saklayın. Sorun giderme için kullanışlıdır ancak depolama boyutunu artırır.", - "label": "Hata Ayıklama İzlerini Kaydet" - }, - "smoothing_window": { - "doc": "Ham güç sinyalinin ne kadar yumuşatıldığı. Düşük (2) duyarlıdır ancak gürültülüdür; yüksek (5) ani artışları yumuşatır ancak gecikme ekler.", - "label": "Yumuşatma Penceresi" - }, - "start_duration_threshold": { - "doc": "Gerçek bir başlatmayı onaylamak için gücün, başlatma eşiğinin bu kadar uzun süre üzerinde kalması gerekir; böylece anlık açma/kapama geçişlerinin bir döngü başlatması önlenir.", - "label": "Başlangıç Süresi" - }, - "start_energy_threshold": { - "doc": "Cihazın ÇALIŞMADAN önce tüketmesi gereken enerji (güç x süre). Kısa bir yüksek güçlü ani yükselişin enerjisi çok düşüktür ve dikkate alınmaz, böylece hatalı başlatmalar önlenir.", - "label": "Başlangıç Enerjisi" - }, - "start_threshold_w": { - "doc": "Bir döngünün başladığını doğrulamak için gücün bu seviyenin üzerine çıkması gerekir. Çok düşük bir değere ayarlanması, bekleme gücünden hatalı başlatmalara neden olur; çok yüksek ve yavaş başlayan programlar (soğuk dolum) kaçırılır. Öneri motoru bunu makinenin gözlemlenen en düşük aktif gücünün hemen üzerine ayarlar.", - "label": "Başlangıç Eşiği" - }, - "stop_threshold_w": { - "doc": "Düşmede gecikme geri sayımı başlamadan önce güç bu seviyenin altına düşmelidir. Bunu Başlangıç ​​Eşiğinin altına ayarlayın; aralarındaki boşluk, titremeyi önleyen histerezis bandıdır. Çok yükseğe ayarlanırsa, düşük güçlü fazlar (durulamada bekletme, kırışık önleme) hatalı şekilde bitiş sırasını tetikler.", - "label": "Durdurma Eşiği" - }, - "switch_entity": { - "doc": "İsteğe bağlı anahtar, duraklatma durumunda kapatılır ve devam ederken tekrar açılır; \"Duraklatma aynı zamanda gücü de keser\" ile birlikte kullanılır.", - "label": "Anahtar Varlığı" - }, - "watchdog_interval": { - "doc": "Arka plan gözlemcisinin durmuş sensörleri ve geçen zaman aşımlarını ne sıklıkla kontrol ettiği. Varsayılan 30 sn.", - "label": "Bekçi Aralığı" - }, - "notify_milestone_message": { - "doc": "Kilometre taşı bildirimi için mesaj. Şablon değişkenleri: {device}, {cycle_count}.", - "label": "Kilometre Taşı Mesajı" - }, - "notify_milestones": { - "doc": "Ulaşıldığında bir kerelik kutlama bildirimi tetikleyen, virgülle ayrılmış döngü sayıları (örn. 50, 100, 500, 1000). Boş bırakmak kilometre taşı bildirimlerini devre dışı bırakır.", - "label": "Döngü Kilometre Taşları" - }, - "notify_quiet_end_hour": { - "doc": "Rahatsız etmeyin aralığının sonu (0-23). Bekletilen bildirimler bu saatte iletilir. Devre dışı bırakmak için boş bırakın.", - "label": "Sessiz Saatler Sonu" - }, - "notify_quiet_start_hour": { - "doc": "Rahatsız etmeyin aralığının başlangıcı (0-23). Sessiz saatlerde gönderilecek bitiş, hatırlatma ve temiz çamaşır bildirimleri bekletilir ve aralık bittiğinde iletilir. Devre dışı bırakmak için boş bırakın. Gece yarısını geçen aralıkları destekler (örn. başlangıç 22, bitiş 7).", - "label": "Sessiz Saatler Başlangıcı" - }, - "peak_rate_message": { - "doc": "Başlangıç bildirimine eklenen yüksek tarife ipucu için isteğe bağlı özel metin. Şablon değişkenleri: {device}, {price}. Boş bırakmak yerleşik varsayılanı kullanır.", - "label": "Yüksek Tarife Mesajı" - }, - "peak_rate_threshold": { - "doc": "Bir döngü başladığında ve kWh başına geçerli fiyat bu değere eşit veya bu değerin üzerindeyse, başlangıç bildirimine bir yüksek tarife ipucu eklenir. 0 veya boş bırakmak ipucunu devre dışı bırakır.", - "label": "Yüksek Tarife Eşiği (kWh başına)" - }, - "dtw_bandwidth": { - "label": "Şekil eşleştirme toleransı", - "doc": "Eşleştiricinin, kaydedilmiş bir programın şekline uyması için bir döngüyü zaman içinde ne kadar bükebileceği. Daha yüksek değer daha fazla hız değişimini tolere eder; çok yüksek olması yanlış programı eşleştirme riski taşır." - }, - "corr_weight": { - "label": "Şekil ve düzey ağırlığı", - "doc": "Bir eşleşme puanlanırken eğri şekli ile mutlak güç düzeyi arasındaki denge. Daha yüksek değer şekli tercih eder; daha düşük değer güç düzeyinin eşleştirilmesini tercih eder." - }, - "duration_weight": { - "label": "Süre ağırlığı", - "doc": "Tipik çalışma süresi bu döngüyle eşleşen bir programın ne kadar güçlü tercih edileceği." - }, - "energy_weight": { - "label": "Enerji ağırlığı", - "doc": "Tipik enerji tüketimi bu döngüyle eşleşen bir programın ne kadar güçlü tercih edileceği." - }, - "store_brand": { - "label": "Cihaz Markası", - "doc": "İsteğe bağlı. Topluluk kataloğundan seçilen cihaz markası. Eşleşen referans kayıtlarını bulmak ve paylaşmak için kullanılır. Çevrimiçi özellikleri kullanmıyorsanız boş bırakın." - }, - "store_model": { - "label": "Cihaz Modeli", - "doc": "İsteğe bağlı. Bir marka ayarlandığında topluluk kataloğundan seçilen cihaz modeli. Modeliniz listede yoksa kataloğa ekleyebilirsiniz." - }, - "show_contributor": { - "doc": "Topluluk cihazlarında ve referans döngülerinde \"- \" özelliğini göster." - }, - "enable_phase_matching": { - "label": "Aşama farkındalıklı kalan süre", - "doc": "Çalışan her çevrimi aşamalara (ısıtma, yıkama, sıkma) böler ve kalan süreyi aşama başına ayırarak klasik tahminle harmanlar - çevrimin başında aşama bütçesine, sona yaklaşırken klasik tahmine ağırlık verir. Bu, geri sayımı makinenizin gerçekte ne kadar ısıttığına ve çalıştığına göre kişiselleştirir; en çok çevrimin ilk yarısında fark edilir. Kapalı = yalnızca klasik tahmin. Yalnızca kalan süre göstergesi etkilenir; program eşleştirme ve çevrim algılama değişmez." - }, - "keep_min_score": { - "label": "Min. Eşleşme Puanı", - "doc": "Bir adayın eşleşme yarışında kalabilmesi için gereken minimum benzerlik puanı. Varsayılan 0.1 kasıtlı olarak gevşektir - zayıf adayları bile kabul eder ve en iyi eşleşmeyi sonraki aşamalara bırakır. Olası olmayan profilleri daha erken elemek için artırın; başlangıç aday havuzunu genişletmek için azaltın." - }, - "dtw_blend": { - "label": "Büküm Karışımı", - "doc": "Zaman bükme (DTW) hizalama puanının Aşama 2 çekirdek puanını ne ölçüde değiştirdiği. 0 = yalnızca Aşama 2 puanı, 1 = yalnızca DTW puanı, 0.5 (varsayılan) = eşit karışım. Programların güç düzeyleri benzer ancak zamanlama kalıpları farklıysa büküm hizalamasına daha fazla güvenmek için artırın." - }, - "dtw_ensemble_w": { - "label": "Büküm Topluluk Karışımı", - "doc": "Topluluk DTW modunda (varsayılan), ölçeklendirilmiş L1 ile türev DTW (DDTW) arasındaki ağırlık. 1.0 = tamamen ölçeklendirilmiş-L1, 0 = tamamen DDTW, 0.7 = varsayılan. Ölçeklendirilmiş-L1 değişkeni güç düzeylerini karşılaştırır; türev değişkeni gücün zaman içinde nasıl değiştiğine tepki verir. Topluluk her ikisini de birleştirir." - }, - "dtw_ddtw_scale": { - "label": "Türev Büküm Ölçeği", - "doc": "Türev DTW puanlaması için yarı doygunluk mesafesi. DDTW mesafesi bu değere eşit olduğunda puan yarıya düşer. Küçük = şekil farklılıklarına daha duyarlı. Varsayılan 30, tipik ev aletleri güç izleri için kalibre edilmiştir. Yalnızca topluluk ve ddtw DTW modlarını etkiler." - }, - "dtw_refine_top_n": { - "label": "Büküm Yeniden Skor Sayısı", - "doc": "Kaç üst Aşama 2 adayı DTW tarafından yeniden puanlandırılır. DTW daha pahalıdır, bu nedenle yalnızca en iyi N adaya uygulanır. Varsayılan 5. Doğru profil bazen Aşama 2'den sonra yalnızca 4. veya 5. sıraya geliyorsa artırın (7-9'a) - DTW onu kurtarabilir. Azaltmak eşleşmeyi biraz hızlandırır." - }, - "duration_scale": { - "label": "Süre Keskinliği", - "doc": "Aşama 4 süre uyumu cezasının keskinliği. Bu, uyum puanının yarıya düştüğü logaritmik orandır. Küçük = daha sert: bir süre uyumsuzluğu daha fazla zarara yol açar. Varsayılan 0.175, yarı ağırlıkta yaklaşık %18 süre toleransına karşılık gelir. Süre Ağırlığı ile birlikte kullanın." - }, - "energy_scale": { - "label": "Enerji Keskinliği", - "doc": "Aşama 4 enerji uyumu cezasının keskinliği. Küçük = daha sert: bir enerji uyumsuzluğu daha fazla zarara yol açar. Varsayılan 0.25, enerji yükle değiştiğinden Süre Keskinliğinden kasıtlı olarak daha gevşektir. Enerji Ağırlığı ile birlikte kullanın." - } - }, - "setting_group": { - "auto_labeling": { - "label": "Otomatik Etiketleme" - }, - "cycle_end": { - "label": "Döngü Sonu" - }, - "cycle_start": { - "label": "Döngü Başlangıcı" - }, - "cycle_timers": { - "label": "Döngü Zamanlayıcıları" - }, - "data_management": { - "label": "Veri Yönetimi" - }, - "debug": { - "label": "Hata Ayıklama" - }, - "dishwasher_end": { - "label": "Bulaşık Makinesi Sonu" - }, - "door_pause": { - "label": "Kapı & Duraklatma" - }, - "dtw_refinement": { - "label": "DTW İyileştirme" - }, - "duration_gates": { - "label": "Süre Kapıları" - }, - "energy": { - "label": "Enerji" - }, - "external_end_trigger": { - "label": "Harici Bitiş Tetikleyicisi" - }, - "housekeeping": { - "label": "Bakım" - }, - "match_scoring": { - "label": "Eşleşme Puanlaması" - }, - "messages": { - "label": "Mesajlar" - }, - "power_off": { - "label": "Güç Kapatma" - }, - "predictive_end": { - "label": "Tahmine Dayalı Bitiş" - }, - "schedule": { - "label": "Takvim" - }, - "services": { - "label": "Servisler" - }, - "signal_processing": { - "label": "Sinyal İşleme" - }, - "thresholds_gap": { - "label": "Eşikler & Aralık" - }, - "timing": { - "label": "Zamanlama" - }, - "unload_reminder": { - "label": "Boşaltma Hatırlatıcısı" - }, - "watchdog": { - "label": "Bekçi" - }, - "quiet_hours_milestones": { - "label": "Sessiz Saatler ve Kilometre Taşları" - }, - "device_info": { - "label": "Cihaz bilgileri" - }, - "basic_configuration": { - "label": "Temel yapılandırma" - } - }, - "status": { - "active": "Aktif", - "all_statuses": "Tüm durumlar", - "ambiguous": "Belirsiz", - "auto_detect": "Otomatik algıla", - "clear": "Temiz", - "completed": "Tamamlandı", - "fine_tuning": "ince ayar yapılıyor…", - "force_stopped": "Zorla durduruldu", - "idle": "Boşta", - "interrupted": "Kesintiye uğradı", - "ready": "İşlemeye hazır", - "recording": "Kaydediliyor", - "training": "Eğitiliyor…", - "saving": "Kaydediliyor…", - "rebuilding": "Yeniden oluşturuluyor…", - "analyzing": "Analiz ediliyor…", - "resetting": "Sıfırlanıyor…", - "reverting": "Geri alınıyor…", - "trimming": "Kırpılıyor…", - "splitting": "Bölünüyor…", - "deleting": "Siliniyor…", - "imported": "İçe aktarıldı" - }, - "tab": { - "advanced": "Gelişmiş", - "diagnostics": "Tanılamalar", - "history": "Döngüler", - "ml": "ML Eğitimi", - "pp_cleanup": "Temizlik", - "pp_manage": "Yönet", - "pp_overview": "Genel Bakış", - "pp_phases": "Aşamalar", - "profiles": "Profiller", - "settings": "Ayarlar", - "status": "Genel Bakış", - "subtab_phase_catalog": "Aşama Kataloğu", - "subtab_profiles": "Profiller", - "maintenance": "Bakım", - "playground": "Test Alanı", - "store": "Mağaza" - }, - "tag": { - "early_end": "Erken bitiş", - "late_start": "Geç başlangıç", - "merged": "Birleştirilmiş döngüler", - "noise": "Gürültü", - "sensor_gap": "Sensör boşluğu", - "split": "Bölünmüş döngü", - "wrong_profile": "Yanlış profil" - }, - "toast": { - "access_saved": "Erişim denetimi kaydedildi", - "all_wiped": "Tüm veriler silindi", - "analysis_complete_none": "Analiz tamamlandı: yeni öneri yok", - "auto_label_complete": "Otomatik etiketleme tamamlandı", - "automation_deleted": "Otomasyon silindi", - "correction_submitted": "Düzeltme gönderildi", - "cycle_deleted": "Döngü silindi", - "cycle_force_stopped": "Döngü zorla durduruldu", - "cycle_labelled": "Döngü etiketlendi", - "cycle_paused": "Döngü duraklatıldı", - "cycle_resumed": "Döngü devam ettirildi", - "cycle_trimmed": "Döngü kırpıldı", - "cycles_merged": "Döngüler birleştirildi", - "envelope_rebuilt": "Zarf yeniden oluşturuldu", - "envelopes_rebuilt": "Zarflar yeniden oluşturuldu", - "export_downloaded": "Dışa aktarma indirildi", - "feedback_all_dismissed": "Tüm geri bildirimler reddedildi", - "feedback_confirmed": "Geri bildirim onaylandı", - "feedback_dismissed": "Geri bildirim reddedildi", - "group_deleted": "Grup silindi", - "group_name_required": "Grup adı gerekli", - "group_saved": "Grup kaydedildi", - "import_successful": "İçe aktarma başarılı; entegrasyon yeniden yükleniyor", - "json_required": "JSON verisi gerekli", - "legacy_removed": "Eski eylemler kaldırıldı", - "logs_exported": "Günlükler dışa aktarıldı", - "matching_reverted": "Eşleşme ağırlıkları varsayılanlara döndürüldü", - "min_2_profiles": "Grup için en az 2 profil seçin", - "ml_training_no_improvement": "Eğitim tamamlandı: taban çizgisi korundu (iyileşme yok)", - "models_reverted": "Cihazdaki modeller taban çizgisine döndürüldü", - "name_required": "Ad gerekli", - "no_split_found": "Bölmek için boşta kalma aralığı bulunamadı", - "panel_settings_saved": "Panel ayarları kaydedildi", - "phase_name_required": "Aşama adı gerekli", - "phase_updated": "Aşama güncellendi", - "phases_saved": "Aşamalar kaydedildi", - "preferences_saved": "Tercihler kaydedildi", - "profile_name_required": "Profil adı gerekli", - "profile_renamed": "Profil yeniden adlandırıldı", - "recording_discarded": "Kayıt iptal edildi", - "recording_saved": "Kayıt profile kaydedildi", - "recording_started": "Kayıt başladı", - "recording_stopped": "Kayıt durduruldu", - "review_saved": "İnceleme kaydedildi", - "settings_conflicts": "Kaydetmeden önce vurgulanan ayar çakışmalarını düzeltin.", - "settings_reverted": "Ayarlar geri yüklendi; entegrasyon yeniden yükleniyor", - "settings_saved": "Ayarlar kaydedildi; entegrasyon yeniden yükleniyor", - "suggestions_applied": "Öneriler uygulandı; entegrasyon yeniden yükleniyor", - "suggestions_dismissed": "Öneriler reddedildi", - "apply_failed": "Uygulama başarısız: {error}", - "delete_failed": "Silme başarısız: {error}", - "load_more_failed": "Daha fazlası yüklenemedi: {error}", - "maint_add_failed": "Kayıt eklenemedi: {error}", - "maint_added": "Bakım kaydı eklendi", - "maint_delete_failed": "Kayıt silinemedi: {error}", - "maint_deleted": "Bakım kaydı silindi", - "relabel_done": "{count} döngü yeniden etiketlendi", - "relabel_failed": "Yeniden etiketleme başarısız: {error}", - "reminders_save_failed": "Hatırlatıcılar kaydedilemedi: {error}", - "reminders_saved": "Servis hatırlatıcıları kaydedildi", - "pause_no_cycle": "Duraklatılacak etkin döngü yok", - "resume_no_cycle": "Sürdürülecek duraklatılmış döngü yok", - "delete_partial_failed": "Bazı öğeler silinemedi ve geri yüklendi", - "pg_run_gone": "Bu çalıştırma artık mevcut değil.", - "task_cancelled": "İptal edildi.", - "processed": "{bits} işlendi", - "processed_cycles": "{n} döngü", - "processed_suggestions": "{n} öneri", - "processed_models": "{n} yükseltilmiş model", - "store_search_failed": "Arama başarısız: {error}", - "store_connect_failed": "Bağlantı başarısız: {error}", - "store_connected": "Topluluk mağazasına bağlanıldı", - "store_disconnected": "Topluluk mağazasıyla bağlantı kesildi", - "store_error": "Hata: {error}", - "store_unavailable": "Topluluk mağazası kullanılamıyor.", - "store_pick_profile": "Birleştirilecek bir profil seçin", - "store_name_required": "Bir profil adı girin", - "store_import_failed": "İçe aktarma başarısız: {error}", - "store_imported": "{profile} içine aktarıldı", - "store_program_required": "Bir program adı girin", - "store_no_appliance": "Önce cihaz markanızı ve modelinizi Ayarlar'da belirleyin.", - "store_share_failed": "Paylaşım başarısız: {error}", - "store_shared": "Topluluk mağazasında paylaşıldı, inceleme bekliyor.", - "appliance_added": "Cihaz eklendi, onay bekliyor", - "thanks_confirming": "Onayladığınız için teşekkürler", - "device_approved": "Topluluk tarafından onaylandı", - "rating_saved": "Kalite değerlendirmesi kaydedildi", - "brand_added": "Marka eklendi, onay bekliyor", - "profile_added": "Profil eklendi, onay bekliyor", - "saved_except_conflicts": "Kaydedildi. Geri kalanı kaydetmek için vurgulanan çakışmaları düzeltin.", - "share_device_none_sel": "Paylaşmak için en az bir döngü seçin", - "store_device_downloaded": "{p} program, {c} kayıt eklendi", - "store_device_downloaded_phases": "{p} program, {c} kayıt, {ph} faz haritası eklendi", - "store_device_downloaded_settings": "{p} program, {c} kayıt, {ph} faz haritası, {s} ayar eklendi", - "store_device_shared": "{n} döngü topluluk mağazasına paylaşıldı - inceleme bekleniyor.", - "store_device_shared_all_dup": "{n} döngünün tamamı zaten topluluk mağazasındaydı.", - "store_device_shared_partial": "{n} döngü paylaşıldı; {failed} yüklenemedi.", - "store_device_shared_some_dup": "{created} döngü paylaşıldı; {dup} zaten mağazadaydı.", - "store_download_failed": "İndirme başarısız: {error}", - "store_download_nothing": "İndirilecek yeni bir şey yok - bu kurulum zaten cihazınızda.", - "export_selective_done": "Dışa aktarma indirildi", - "import_selective_done": "{profiles} profil ve {cycles} döngü içe aktarıldı" - }, - "suggestion": { - "both_agree": "WashData öneriyor", - "calibrated_label": "Kalibre edilmiş", - "observed_label": "Gözlemlenen", - "impact": { - "auto_label_confidence": { - "higher": "Daha az döngüyü otomatik etiketler; daha fazlası incelemeye gider", - "lower": "Daha fazla döngüyü otomatik etiketler; bazıları yanlış tanımlanabilir" - }, - "duration_tolerance": { - "higher": "Daha geniş süre aralığı kabul eder – daha esnek eşleştirme", - "lower": "Daha yakın süre eşleşmesi gerektirir – daha katı ama alışılmadık döngüleri reddedebilir" - }, - "end_energy_threshold": { - "higher": "Yalnızca önemli enerji kullanan döngüleri kapatır", - "lower": "Daha kısa veya düşük enerjili döngüleri de kapatır" - }, - "end_repeat_count": { - "higher": "Bitiş sinyalinin daha fazla tekrarlanmasını gerektirir – daha güvenilir, biraz daha yavaş", - "lower": "Daha az tekrardan sonra biter – daha hızlı algılama, daha yüksek yanlış bitiş riski" - }, - "learning_confidence": { - "higher": "Yalnızca çok güvenli eşleşmelerden öğrenir – daha yavaş ama daha güvenilir", - "lower": "Daha fazla döngüden öğrenir; model daha gürültülü olabilir" - }, - "min_off_gap": { - "higher": "Yeni döngü başlamadan önce daha uzun boşta kalma süresi gerekir", - "lower": "Kısa boşta kalma yeni döngü başlatır – arka arkaya çalışmalar bölünebilir" - }, - "min_power": { - "higher": "Boşta güç çekimine daha az duyarlı; çok sessiz programları kaçırabilir", - "lower": "Daha duyarlı; bekleme modundaki güç tüketimini etkinlik olarak kaydedebilir" - }, - "no_update_active_timeout": { - "higher": "Döngü takılı sayılmadan önce daha fazla zaman", - "lower": "Takılı döngüyü daha erken zorunlu durdurur" - }, - "off_delay": { - "higher": "Cihaz duraklamaları için daha fazla süre – uzun ıslatma veya kurutma aşamalarını yönetir", - "lower": "Daha hızlı bitiş algılama – net açık/kapalı cihazlar için iyi çalışır" - }, - "profile_match_threshold": { - "higher": "Yalnızca yüksek güvenli eşleşmeleri onaylar; daha fazla döngü etiketsiz kalır", - "lower": "Daha fazla döngüyle eşleşir; bazıları hafif hatalı olabilir" - }, - "running_dead_zone": { - "higher": "Boşta kısa güç artışlarını yoksayar – gürültüye daha az duyarlı", - "lower": "Daha kısa güç patlamalarına yanıt verir – hızlı geçici etkinliği yakalar" - }, - "start_threshold_w": { - "higher": "Kısa güç artışlarından kaynaklanan yanlış başlatmaları önler", - "lower": "Düşük güçlü programları yakalar; gürültüde tetiklenebilir" - }, - "stop_threshold_w": { - "higher": "Döngüyü daha hızlı bitirir – duraklamada kapanabilir", - "lower": "Bitişi daha uzun bekler – daha az erken tamamlanma" - }, - "watchdog_interval": { - "higher": "Daha uzun sessiz aşamalara izin verilir; daha az yanlış zorunlu durdurma", - "lower": "Takılı döngüleri daha agresif şekilde yakalar" - } - }, - "reason": { - "auto_label_confidence": "Kullanıcının hiç düzeltmediği {cycles} otomatik etiketin 15. yüzdelik güven değeri ({p15}).", - "completion_min_seconds": "{cycles} çevrim boyunca p05 temiz çevrim süresinin yarısı ({minutes} min); sahte çevrimleri filtreler.{excl}", - "dead_zone_batch": "Kısa tutuldu ({cycles} çevrim boyunca medyan başlangıç kararsızlık penceresi = {s}s), böylece gerçek bir son hemen algılanır.", - "dead_zone_from_dip": "{s}s'de algılanan erken güç düşüşüne dayalı.", - "end_energy_default": "Çevrim sonu gürültü eşiği için önerilen varsayılan değer.", - "end_energy_false": "{cycles} çevrim boyunca p95 sahte-son enerjisi ({p95}Wh); medyan çevrim enerjisinin %0.2'sinde ({floor}Wh) alt sınırlandı.", - "end_energy_no_false": "{cycles} çevrim boyunca sahte son yok; medyan çevrim enerjisinin %0.2'sinde ({floor}Wh) alt sınırlandı.", - "end_repeat_count": "{false}/{total} temiz çevrimde (%{pct}) devam eden 60s'den uzun bir iç duraklama vardı; {val} son doğrulaması gerektir.", - "learning_confidence": "{cycles} kullanıcı etiketli çevrimin p05 güven değeri ({p05}); bunun altında doğrulama iste.", - "match_interval": "Gözlemlenen güncelleme sıklığına dayalı (medyan={median}s) * 10.", - "max_duration_ratio": "Etiketli çevrim sürelerine dayalı (p95={p95}).", - "min_active": "Son çevrimde gözlemlenen minimum aktif güce ({min}W) dayalı.", - "min_duration_ratio": "Bir programın çevrimin başında tanınabilmesi için olabildiğince düşük tutuldu; güven ve belirsizlik eşikleri erken kesinleşmeyi önler.", - "min_off_gap": "Gözlemlenen {gaps} çevrimler arası boşluğa dayalı (p05={p05}s). Cihaz alt sınırı: {floor}s.", - "min_power": "{cycles} temiz çevrim boyunca p05 en düşük aktif gücün ({p05}W) %40'ı; kapalı eşiğini gerçek çekişin altında tutar.{excl}", - "ml_auto_label": "Kalite modelinin hâlâ temiz olarak değerlendirdiği en düşük güven değeri ({cycles} temiz çevrimin p10'u = {p10}).", - "ml_end_repeat": "{false}/{total} çevrimde (%{pct}) çevrim sonu algılayıcısının 50%'nin üzerinde puanladığı bir duraklama vardı; {val} son doğrulaması gerektir.", - "ml_off_delay": "Çevrim sonu algılayıcısının onayladığı duraklamalar: p95 {p95}s + 60s tampon, {cycles} çevrim boyunca modelce doğrulanmış {pauses} duraklamadan (alt sınır {floor}s).", - "no_update_timeout": "Gözlemlenen güncelleme sıklığına dayalı (p95={p95}s) * 20 (en az 60s).", - "off_delay_cadence": "Gözlemlenen güncelleme sıklığına dayalı (p95={p95}s) * 5", - "off_delay_device_floor": "{device} için cihaza özgü güvenli minimum kullanıldı ({floor}s).", - "off_delay_generic_floor": "Genel güvenli minimum kullanıldı ({floor}s).", - "off_delay_pauses": "Gerçek duraklamalardan uzun sürecek şekilde boyutlandırıldı: p95 çevrim içi duraklama {p95}s + 60s tampon, {cycles} temiz çevrim boyunca {pauses} duraklamadan (alt sınır {floor}s).", - "profile_match_threshold": "{cycles} doğru otomatik etiketin p10 güven değeri ({p10}); güvenli canlı kesinleşme alt sınırı.", - "sampling_interval": "{cycles} temiz çevrim boyunca gözlemlenen medyan güncelleme aralığı ({si}s).{excl}", - "smoothing_window": "{si}s örnekleme ile ~30s'lik okumaları yumuşatacak şekilde boyutlandırıldı ({samples} örnek).", - "start_duration": "Kısa tutuldu (~bir {si}s örnekleme aralığı), böylece tek örneklik ani sıçramalar yok sayılırken algılama olabildiğince erken başlar.", - "thr_batch": "{cycles} çevrim boyunca p05 en düşük aktif gücün ({p05}W) hemen üzerinde tutuldu; böylece başlangıç olabildiğince erken yakalanır ve durdurma eşiği makinenin en düşük çalışma gücünün altında kalır.", - "tol_per_profile": "{profiles} profil boyunca ({cycles} çevrim) profil başına süre varyansının p75'i; tutarlı profiller cezalandırılmaz.", - "tol_pooled": "{cycles} son etiketli çevrimin birleştirilmiş süre varyansına dayalı (p95 sapma={dev}).", - "watchdog": "Güvenli olduğu kadar düşük tutuldu ({p95}s'lik p95 güncelleme boşluğunun 3 katı, en az 30s); böylece takılmalar yanlış durdurmalar olmadan hızlıca yakalanır." - }, - "exclusions": { - "summary": "{total} yanlış algılanan döngü hariç tutuldu: {parts}.", - "reason": { - "force_stopped": "zorla durdurulmuş", - "interrupted": "kesintiye uğramış", - "incomplete": "tamamlanmamış", - "noise": "gürültü", - "unlabeled": "etiketsiz", - "no_trace_short": "incelenemeyecek kadar kısa", - "high_start": "yüksek güçte başlamış", - "abrupt_end": "aniden sona ermiş", - "mid_restart": "döngü ortasında yeniden başlamış", - "no_power": "güç yok", - "no_active_power": "aktif güç yok" - } - } - }, - "trend": { - "down": "Düşen eğilim", - "up": "Yükselen eğilim" - }, - "maint": { - "bearing_service": "Rulman servisi", - "descale": "Kireç çözme", - "drum_clean": "Tamburu temizle", - "filter_clean": "Filtreyi temizle", - "other": "Diğer" - }, - "col": { - "profile_tip": "Eşleşen program adı. Etiketsiz, döngünün sonunda hiçbir profilin eşleşmediği anlamına gelir.", - "status_tip": "Döngü sonucu: Tamamlandı (doğal bitiş), Kesintili (ani güç düşüşü), Zorla Durduruldu (manuel) veya İnceleme Gerekiyor (geri bildirim bekliyor).", - "date_tip": "Döngünün başladığı tarih ve saat.", - "duration_tip": "Baştan sona toplam döngü çalışma süresi.", - "energy_tip": "Tüketilen toplam enerji (kWh). Gücün zamana göre integrali alınarak hesaplanır.", - "cost_tip": "Bu döngünün enerji maliyeti; tamamlandığında o an geçerli olan fiyat kullanılarak sabitlenir (enerji x kWh başına fiyat). Doldurmak için Ayarlar altında bir fiyat belirleyin.", - "confidence_tip": "Profil eşleşme güveni (0-100%). Döngünün güç eğrisinin, tanımlanan programla ne kadar yakından eşleştiği.", - "health_tip": "ML döngü sağlığı (yüksek = daha iyi). İncelemek ve gözden geçirmek için bir döngüye tıklayın.", - "flags_tip": "Döngü için inceleme, anomali ve kaynak işaretleri. Ayrıntı için bir simgenin üzerine gelin." - }, - "stat": { - "avg": "ort.", - "min": "min {v}", - "max": "maks {v}", - "consistency": "tutarlılık ±{v}", - "total": "toplam {v}", - "last_run": "son çalıştırma {v}", - "score": "puan %{pct}", - "duration_cv": "süre CV %{pct}", - "avg_confidence": "ort. güven %{pct}" - }, - "pg_evd": { - "detected": "Algılayıcı, bir döngünün başladığını fark etti.", - "match_commit": "Eşleştirici, yeterli güvenle bir programa karar verdi.", - "match_changed": "Döngünün daha fazlası görüldükçe önde gelen program değişti.", - "match_ambiguous": "İki program birbirine yakın puan aldı, bu yüzden eşleşme belirsizdi.", - "unmatched": "Bu döngüye kaydedilmiş hiçbir program uymadı.", - "notify_start": "Bir başlangıç bildirimi gönderilirdi.", - "notify_pre_complete": "Bir «neredeyse bitti» bildirimi gönderilirdi.", - "notify_finish": "Bir bitiş bildirimi gönderilirdi.", - "notify_milestone": "Bir kilometre taşı bildirimi gönderilirdi.", - "notify_held": "Bir bildirim, sessiz saatler nedeniyle bekletildi.", - "finished": "Döngü, son duruma ulaştı ve sona erdi." - }, - "store": { - "browse": "Göz at", - "device": "Cihaz", - "favorites": "Favoriler", - "search_ph": "Marka veya modele göre ara…", - "no_results": "Eşleşen cihaz bulunamadı. Farklı bir arama deneyin.", - "n_programs": "{n} program", - "n_cycles": "{n} döngü", - "no_programs": "Bu cihaz için henüz paylaşılan program yok.", - "no_cycles": "Bu program için henüz paylaşılan referans döngü yok.", - "anon": "anonim", - "uploaded_by": "{name} tarafından paylaşıldı", - "connected_as": "{name} olarak bağlanıldı", - "not_connected": "Bağlı değil. Kendi döngülerinizi paylaşmak için bir GitHub hesabı bağlayın.", - "import_new": "Yeni profil", - "import_merge": "Mevcut olana birleştir", - "merge_target": "Profile birleştir", - "description": "Açıklama (isteğe bağlı)", - "contributed_by": "{name} tarafından", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "Henüz değerlendirme yok", - "website": "Mağaza web sitesi ↗", - "website_tip": "Topluluk mağazasının web sitesini aç" - }, - "settings": { - "gear": { - "title": "Ayarlar" - } - }, - "link": { - "manual": "Kılavuz ↗", - "add_appliance": "Cihazınızı ekleyin" - }, - "tip": { - "add_brand": "Marka listede yok mu? Topluluk kataloğuna ekleyin", - "add_appliance": "Model listede yok mu? Cihazınızı topluluk kataloğuna ekleyin", - "add_profile": "Bu cihaz için topluluk sitesinde bir profil ekleyin" - }, - "task": { - "reprocess": { - "matching": "Yeniden işleme: döngü eşleştirme", - "golden": "Yeniden işleme: referans döngülerini işaretleme", - "suggestions": "Yeniden işleme: öneriler", - "ml_training": "Yeniden işleme: ML eğitimi", - "health": "Yeniden işleme: döngü sağlığı" - }, - "pg_sweep": { - "optimize": "Optimizasyon: {param}" - }, - "pg_detail": { - "simulate": "Döngü simülasyonu" - }, - "split": { - "apply": "Döngü bölünüyor" - }, - "trim": { - "apply": "Döngü kırpılıyor" - }, - "merge": { - "apply": "Döngüler birleştiriliyor" - }, - "rebuild": { - "envelopes": "Zarflar yeniden oluşturuluyor" - }, - "cancelling": "İptal ediliyor..." - }, - "setup": { "hdr": { - "card": "Cihaz Kurulumu", - "healthy_chip": "Kurulum tamamlandı" + "ab_comparison": "A/B Ayar Karşılaştırması", + "access_control": "Erişim Denetimi", + "add_maintenance": "Bakım Kaydı Ekle", + "automation_delete": "Bu otomasyonu sil", + "automation_needs_review": "Bu döngü inceleme gerektiriyor", + "automation_open": "Otomasyon düzenleyicisinde aç", + "automation_review_this_cycle": "Bu döngüyü incele", + "automations": "Otomasyonlar", + "clear_debug": "Hata Ayıklama İzlerini Temizle", + "cycle_simulator": "Döngü Simülatörü", + "diagnostics_pref": "Tanılamalar", + "display": "Görüntü", + "dtw_inspector": "DTW İnceleyici", + "export_import": "Dışa / İçe Aktar", + "getting_started": "Başlarken", + "live_power": "Canlı Güç", + "logs": "Günlükler", + "logs_diagnostics": "Tanılamalar", + "maintenance": "Bakım Eylemleri", + "maintenance_log": "Bakım Günlüğü", + "maintenance_reminders": "Servis Hatırlatıcıları", + "manual_recording": "Manuel Kayıt", + "manual_recording_tip": "WashData güç izini kaydederken kasıtlı olarak bir döngü çalıştırın. Cihaz başlamadan hemen önce Başlat'a basın, bittiğinde Durdur'a basın, ardından adlandırılmış profil olarak kaydetmek için İşle'ye tıklayın.", + "ml_learned": "WashData'nın öğrendikleri", + "ml_matching_tuning": "Program eşleştirme ince ayarı", + "ml_settings_card": "Ayarlar", + "ml_smart_learning": "Akıllı Öğrenme", + "my_preferences": "Tercihlerim", + "no_automations": "Henüz bu cihaza referans veren otomasyon yok.", + "panel_settings": "Panel Ayarları", + "param_sweep": "Parametre taraması", + "pg_settings_source": "Ayarların kaynağı", + "phase_catalog": "Aşama Kataloğu", + "playground": "Deneme Alanı", + "process_history": "İşlem Geçmişi", + "settings_history": "Ayar geçmişi", + "status": "Durum", + "status_graph": "Durum Grafiği", + "storage_stats": "Depolama İstatistikleri", + "test_history": "Geçmiş üzerinde test et", + "toggle_sidebar": "Ev Asistanı kenar çubuğunu aç/kapat", + "tools_and_data": "Araçlar ve Veriler", + "wipe_history": "Geçmişi Sil", + "recommendations": "Öneriler ({n})", + "pg_detection_params": "Algılama ayarları", + "pg_timeline": "Olay zaman çizelgesi", + "pg_outcome": "Simülasyon sonucu", + "pg_across_cycles": "Tüm döngülerinizde", + "community_store": "Topluluk Mağazası", + "online_account": "Topluluk Mağazası ve çevrimiçi özellikler" }, - "phase0": { - "washer": "WashData döngülerinizi zaten algılıyor. Program adlarını ve süre tahminlerini etkinleştirmek için ilk döngünüzü kaydedin.", - "dishwasher": "WashData izliyor. Bulaşık makinelerinin döngüleri karmaşıktır – ilk döngünüzü kaydetmeniz kesinlikle önerilir. Algılanan bir döngü çok uzun sürerse, profil olarak kaydetmeden önce döngü düzenleyicisini kullanarak kırpın.", - "generic": "WashData izliyor. Profil oluşturmaya başlamak için algılanan bir döngüyü kaydedin veya etiketleyin." + "health": { + "fair": "Kabul edilebilir profil kalitesi", + "good": "✓ İyi profil kalitesi", + "poor": "⚠ Düşük profil kalitesi" }, - "phase1a": { - "labelled": "İyi bir başlangıç – ilk programınız kaydedildi. En temiz veri için bir sonraki döngünüzü kaydedici widget'ı ile kaydetmeyi düşünün." + "lbl": { + "actions": "Eylemler", + "activity": "Aktivite", + "administrators": "Yöneticiler", + "aria_compare_chart": "Döngü karşılaştırma grafiği", + "aria_cycle_chart": "Döngü güç eğrisi", + "aria_envelope_chart": "Profil güç zarfı grafiği", + "aria_phase_chart": "Aşama düzenleyici grafiği", + "aria_playground_chart": "Sürüklenebilir algılama eşiklerine sahip döngü güç eğrisi", + "aria_power_chart": "Güç tüketimi grafiği", + "aria_spaghetti_chart": "Üst üste bindirilmiş döngü güç eğrileri", + "aria_sweep_chart": "Parametre tarama sonuçları grafiği", + "artifact_anomaly": "Anomali", + "artifact_high_power": "Yüksek güç", + "artifact_interruption": "Kesinti", + "artifact_low_power": "Düşük güç", + "auto_detect": "Otomatik algıla", + "auto_fine_tune_off": "otomatik ince ayar kapalı", + "auto_fine_tune_on": "otomatik ince ayar açık ({hour}:00 civarı)", + "avg_cost": "Ort. maliyet", + "change": "Değişim", + "clock_time": "Saat", + "cohesion_good": "uyum {pct}%", + "cohesion_low": "⚠ düşük uyum {pct}%", + "compare_profiles": "Profillerle karşılaştır", + "concurrency": "Eşzamanlılık", + "confidence": "Güven", + "confidence_threshold": "Güven eşiği", + "correct_duration": "Doğru Süre (dk, isteğe bağlı)", + "correct_profile": "Doğru Profil", + "correlation": "Korelasyon", + "cost": "Maliyet", + "create_new_profile": "+ Yeni profil oluştur…", + "current_phase": "Geçerli aşama", + "curves": "Eğriler", + "cycle": "Döngü", + "cycle_date_display": "Döngü tarihi görünümü", + "cycle_health": "Döngü sağlığı", + "cycle_index": "döngü dizini →", + "cycles": "Döngüler", + "cycles_count": "Döngüler", + "cycles_lc": "döngü", + "dashed": "kesikli", + "date": "Tarih", + "debug_traces": "Hata Ayıklama İzleri", + "default": "Varsayılan", + "default_access_level": "Aşağıda listelenmeyen kullanıcılar için varsayılan düzey", + "default_other": "Varsayılan (diğer cihazlar)", + "default_tab": "Panel açıldığında varsayılan sekme", + "delta": "Δ", + "description": "Açıklama", + "dtw_blend_w": "Karışım ağırlığı", + "dtw_blended": "Karışık puan", + "dtw_ddtw": "DDTW puanı", + "dtw_l1": "L1 puanı", + "dtw_matched_profile": "(döngünün eşleşen profili)", + "duration": "Süre", + "duration_agreement": "Süre uyumu", + "emphasis": "Vurgu", + "enable_access_control": "Kullanıcı bazlı erişim denetimini etkinleştir", + "energy": "Enerji", + "energy_agreement": "Enerji uyumu", + "event_timeline": "Olay zaman çizelgesi", + "event_type": "Olay türü", + "expected": "Beklenen", + "expected_duration": "Beklenen Süre (dk)", + "file_kb": "Dosya (kB)", + "final_score": "Nihai puan", + "from": "Başlangıç", + "gap_s": "Boşluk (s)", + "group_name": "Grup adı", + "head_trim": "Baş Kırpma (s)", + "health": "Sağlık", + "hide_tabs": "Yönetici olmayanlar için sekmeleri gizle", + "in_use": "Kullanımda", + "json_data": "JSON Verisi", + "label": "Eşleşen program", + "last": "Son", + "last_checked": "Son kontrol:", + "load_from_file": "Dosyadan yükle", + "mae_score": "MAE puanı", + "manual_duration": "Manuel Süre (dk, isteğe bağlı)", + "match": "Eşleşme", + "members": "Üyeler", + "metric": "Metrik", + "mode_existing_profile": "Mevcut Profile Ekle", + "mode_new_profile": "Yeni Profil Oluştur", + "models_fine_tuned": "({count} model{plural} ince ayarlı)", + "n_classic_suggestions": "{n} klasik", + "n_ml_suggestions": "{n} ML", + "n_selected": "{n} seçili", + "n_tuning_suggestions": "{n} ayar önerisi", + "na": "yok", + "new_profile_name": "Yeni profil adı", + "notes": "Notlar", + "of": "/", + "outcome": "Sonuç", + "panel_default_tab": "Varsayılan sekme", + "panel_language": "Panel dili", + "per_cycle_short": "döngü", + "pg_anti_wrinkle": "Kırışıklık önleme", + "pg_autofill_tip": "Geçerli değerden aralığı otomatik doldur ({lo}–{hi})", + "pg_best_value": "Bulunan en iyi değer", + "pg_current_value": "Geçerli değer:", + "pg_drag_hint": "Grafikteki çizgiyi sürükleyin", + "pg_dtw": "DTW", + "pg_ev_ending": "Bitiyor", + "pg_ev_running": "Çalışıyor", + "pg_group_advanced": "Uç durumlar", + "pg_group_detection": "Algılama tetikleyicileri", + "pg_group_timing": "Zamanlama kuralları", + "pg_idle": "Boşta", + "pg_last_run": "Son çalıştırma: {date}", + "pg_match_score": "Eşleşme puanı", + "pg_pct_of": "{total} içinde %{p}", + "pg_poor_match": "Kötü eşleşme", + "pg_preset": "Test Alanı ön ayarı", + "pg_preset_name": "Yeni ön ayar adı", + "pg_preset_none": "Bir ön ayar seçin…", + "pg_strong_match": "Güçlü eşleşme", + "pg_tile_ambiguous": "Belirsiz", + "pg_tile_ambiguous_tip": "İki program arasında neredeyse berabere kalan döngüler", + "pg_tile_detected": "Algılandı", + "pg_tile_detected_tip": "Gücün, çalışıyor olarak kaydedilecek kadar uzun süre başlangıç eşiğini aştığı döngüler", + "pg_tile_matched": "Eşleşti", + "pg_tile_matched_tip": "Bilinen bir programa doğru şekilde atfedilen döngüler", + "pg_time_left": "Kalan süre", + "pg_weak_match": "Zayıf eşleşme", + "phase_name": "Ad", + "phase_timeline": "Aşama zaman çizelgesi", + "power": "Güç", + "profile": "Profil", + "profile_index": "profil dizini →", + "profile_name": "Profil Adı", + "program": "Program", + "program_tip": "Geçerli döngüyle eşleştirilen profili geçersiz kılın. Otomatik algılama, entegrasyonun en iyi eşleşmeyi otomatik olarak seçmesine olanak tanır. Otomatik algılama yanlış olduğunda veya neyin çalıştığını bildiğinizde belirli bir programı zorla eşleştirmek için sabitleyin.", + "progress": "İlerleme", + "raw_socket": "Ham soket", + "read_only": "Salt okunur", + "ref_cycle": "Referans Döngü (isteğe bağlı)", + "refresh_interval": "Yenileme aralığı (s)", + "remaining": "Kalan", + "reminder_every": "Hatırlatma sıklığı (döngü)", + "remove_label": "- Etiketi kaldır -", + "rename_profile": "Profili Yeniden Adlandır", + "replay_duration": "Yeniden oynatma", + "resulting_profile": "Sonuçlanan profil", + "save_mode": "Kaydetme Modu", + "score": "Puan", + "score_breakdown": "Puan dökümü", + "seconds_from_start": "Başlangıçtan saniyeler", + "select_profile": "Profil Seç", + "setting": "Ayar", + "settings_a": "Ayarlar A (geçerli)", + "settings_a_short": "A", + "settings_advanced": "Gelişmiş", + "settings_b": "Ayarlar B (test)", + "settings_b_short": "B", + "settings_basic": "Temel", + "settings_detail_level": "Ayar ayrıntı düzeyi", + "settings_overrides": "Ayar geçersiz kılmaları", + "show_debug": "Durum sayfasında canlı eşleşme hata ayıklama kartını göster (güven, belirsizlik, en iyi adaylar)", + "show_expected": "Beklenen eğri bindirmesini göster (eşleşen profil, turuncu)", + "show_raw": "Canlı güç grafiğinde ham soket değiştiriciyi göster", + "sparkline": "Son döngü süresi eğilimi", + "stage2": "Aşama 2 – çekirdek benzerlik", + "stage3": "Aşama 3 – DTW", + "stage4": "Aşama 4 – uyum", + "status": "Durum", + "tail_trim": "Kuyruk Kırpma (s)", + "timer_auto_pause": "Otomatik duraklatma", + "timer_min": "dk.", + "timer_msg_placeholder": "Mesaj (isteğe bağlı, {device}/{program}/{minutes})", + "to": "Bitiş", + "ungrouped": "Grupsuz", + "unlabelled": "Etiketsiz", + "unlabelled_paren": "(etiketsiz)", + "warp_path": "Büküm yolu", + "input": "Girdi:", + "start": "Başlangıç", + "end": "Bitiş", + "unit_s": "(s)", + "reviewed_on": "{date} tarihinde incelendi", + "unknown": "Bilinmiyor", + "quality": "Kalite", + "tags": "Etiketler", + "at": "saat", + "pct_match_confidence": "%{pct} eşleşme güveni", + "ha_restarted": "HA yeniden başlatıldı", + "from_start": "Başlangıçtan", + "to_end": "Bitişe kadar", + "click_to_select": "seçmek için tıklayın", + "envelope": "Zarf", + "zoom_hint": "yakınlaştırmak için kaydırın · sıfırlamak için çift tıklayın", + "loading_paren": "(yükleniyor…)", + "time_remaining": "~{v} kaldı", + "no_duration": "süre yok", + "duration_avg": "~{v}dk ort.", + "name_placeholder": "(ad)", + "n_shown": ", {n} gösteriliyor", + "cycles_title": "Döngüler ({n})", + "pg_detecting": "Algılanıyor", + "pg_best_marker": "En iyi: {v}", + "pg_time_left_model": "Kalan süre (model)", + "pg_time_left_model_tip": "Model tarafından tahmin edilen kalan süre (aşama tahmincisi + ML karışımı), sabit bir geri sayım değil", + "phase": "Aşama", + "pg_mode_simulate": "Simülasyon", + "pg_mode_history": "Geçmişte test et", + "pg_mode_sweep": "Tarama", + "pg_ev_detected": "Algılandı", + "pg_ev_match": "Eşleşme kesinleşti", + "pg_ev_match_changed": "Eşleşme değişti", + "pg_ev_ambiguous": "Belirsiz", + "pg_ev_unmatched": "Eşleşmedi", + "pg_ev_notify_start": "Başlangıç bildirimi", + "pg_ev_notify_pre": "Neredeyse bitti bildirimi", + "pg_ev_notify_finish": "Bitiş bildirimi", + "pg_ev_notify_milestone": "Kilometre taşı bildirimi", + "pg_ev_notify_held": "Bildirim bekletildi (sessiz saatler)", + "pg_ev_finished": "Tamamlandı", + "pg_ended": "Sona erdi", + "pg_proj_energy": "Tahm. enerji", + "pg_alert_overrun": "Uzun sürdü", + "pg_alert_underrun": "Kısa sürdü", + "pg_alert_did_not_finish": "Bitmedi", + "pg_alert_false_end": "Birden fazla döngüye bölündü", + "pg_alert_unmatched": "Eşleşmedi", + "pg_alert_ambiguous": "Belirsiz eşleşme", + "pg_alert_energy": "Enerji anomalisi", + "pg_newly_correct": "artık doğru", + "pg_regressed": "geriledi", + "pg_end_timing_changed": "bitiş zamanı değişti", + "pg_vs_current": "vs mevcut", + "pg_fixed": "düzeltildi", + "pg_broke": "bozuldu", + "pg_sweep_param": "Parametre", + "pg_objective": "Hedef", + "pg_steps": "Adımlar", + "pg_stress_group": "Bekleme sonlandırma testi", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "Bekleme seviyesi (W)", + "pg_stress_idle_w_desc": "Otomatik algılanan bekleme tabanını geçersiz kıl (otomatik için boş bırakın).", + "pg_stress_toggle": "Bekleme sonlandırmasını test et", + "pg_stress_toggle_desc": "Kaydın bitmesinin ardından cihazın bekleme modundaki güç tüketimine devam ettiğini simüle eder - WashData'nın döngüyü durdurup durdurmayacağını ve ne zaman durduracağını gösterir.", + "pg_sweep_2d": "2D ısı haritası", + "pg_sweep_param_y": "2. parametre", + "pg_obj_match": "Eşleşme doğruluğu", + "pg_obj_endtiming": "Bitiş zamanı doğruluğu", + "pg_obj_falseend": "Yanlış bitiş oranı", + "pg_obj_overrun": "Süre sapması", + "pg_obj_ambiguity": "Belirsizlik oranı", + "pg_best_combo": "en iyi kombinasyon", + "pg_mode_optimize": "Optimize et", + "pg_group_matching": "Program eşleştirme", + "pg_zoom_hint": "yakınlaştırmayı sıfırlamak için çift tıklayın", + "aria_playground_chart2": "Etkileşimli döngü güç grafiği: zamanı/gücü okumak için üzerine gelin, yakınlaştırmak için kaydırın, kaydırmak için sürükleyin", + "pg_alert_timeout_end": "Tahminle değil, zaman aşımıyla sona erdi", + "pg_alert_indefinite": "Süresiz olarak çalışırdı", + "pg_alert_stress_cap": "Güvenlik sınırına ulaşıldı", + "pg_alert_stress_ok": "Bekleme sonlandırması: döngü durduruldu", + "pg_alert_stress_warn": "Bekleme tüketimi durdurma eşiğinin üzerinde", + "task_pg_history": "Geçmişte test et", + "task_pg_sweep": "Optimize et", + "task_reprocess": "Yeniden işleme", + "task_ml_training": "Öğrenme", + "eta_secs": "~{n} sn kaldı", + "eta_mins": "~{n} dk kaldı", + "pg_recent_runs": "Son çalıştırmalar", + "pg_load_run": "Bu çalıştırmayı yeniden yükle", + "pg_match_confidence": "Eşleşme güveni", + "pg_envelope_fit": "Zarfa uyum", + "pg_envelope_fit_tip": "Döngünün bu profilin kaydedilmiş güç zarfının içinde ne kadar iyi kaldığı, eşleşme güveninden farklı bir bakış açısı.", + "n_imported_note": ", {n} içe aktarıldı", + "enable_online": "Çevrimiçi özellikleri etkinleştir", + "store_brand": "Cihaz markası", + "store_model": "Cihaz modeli", + "anonymous": "Anonim", + "rate_quality": "Kaliteyi değerlendir", + "rate_n": "{n} yıldız", + "approved_only": "Yalnızca onaylılar", + "adopt_settings": "Ayarları da benimse", + "flags": "İşaretler", + "include_phase_map": "Faz haritasını dahil et", + "include_settings": "Algılama ve eşleştirme ayarlarını dahil et", + "show_contributor": "Katkıda bulunanların adlarını göster", + "task_pg_detail": "Döngü simülasyonu", + "task_split": "Döngü bölünüyor", + "task_trim": "Döngü kırpılıyor", + "task_merge": "Döngüler birleştiriliyor", + "task_rebuild": "Zarflar yeniden oluşturuluyor", + "cat_profiles": "Profiller (programlar)", + "cat_real_cycles": "Döngüler (çalışma geçmişi)", + "cat_reference_cycles": "Referans döngüler (içe aktarılan)", + "cat_custom_phases": "Özel aşamalar", + "cat_profile_groups": "Profil grupları", + "cat_settings": "Algılama ve tanıma ayarları", + "cat_matching_config": "Tanıyıcı ayarı", + "cat_ml_models": "ML modelleri", + "cat_feedback": "Geri bildirim ve inceleme etiketleri", + "cat_suggestions": "Öneriler", + "cat_maintenance_log": "Bakım günlüğü", + "cat_history_logs": "Geçmiş ve değişiklik günlükleri", + "cat_lifetime_stats": "Ömür boyu toplamlar", + "cycles_short": "döngü", + "import_mode": "Nasıl birleştirilsin", + "mode_merge": "Birleştir (benimkini koru)", + "mode_replace": "Seçileni değiştir", + "cycle_destination": "İçe aktarılan döngüler nereye gitsin?", + "dest_reference": "Referans (yalnızca şekil)", + "dest_real_history": "Gerçek geçmiş (istatistiklere sayılır)", + "conflict_resolution": "Ad çakışmaları", + "conflict_import_copy": "Kopya olarak içe aktar", + "conflict_keep_mine": "Benimkini koru", + "conflict_overwrite": "Üzerine yaz", + "font_size": "Panel yazı tipi boyutu" }, - "phase1b": { - "recorded": "Kaydınız {profile_name} olarak kaydedildi. Kapsama alanı oluşturmak için diğer yaygın programlarınızı kaydedin veya etiketleyin." + "log": { + "all_levels": "Tüm seviyeler", + "all_devices": "Tüm cihazlar", + "all_components": "Tüm bileşenler", + "search_ph": "Günlüklerde ara…" }, - "phase1c": { - "verify": "Topluluktan {count} programınız var. WashData'nın doğru tanıyıp tanımadığını doğrulamak için bir döngü çalıştırın – cihazınız kendi geçmişini oluşturdukça eşleştirme iyileşecektir." + "ml": { + "builtin_models": "● Yerleşik modeller kullanılıyor", + "fit_fair": "Kabul edilebilir", + "fit_good": "İyi", + "fit_slight": "Hafif", + "fit_strong": "Güçlü", + "fit_weak": "Zayıf", + "fit_word": "uyum", + "personalized": "● Bu makineye kişiselleştirilmiş", + "better_than_baseline": "temel tahminden %{pct} daha iyi ({metric})", + "trend_improving_tip": "Bu modelin uyumu son yeniden kontrollerde iyileşti.", + "trend_declining_tip": "Bu modelin uyumu son yeniden kontrollerde geriledi, daha fazla döngü incelemek yeniden öğrenmesine yardımcı olabilir.", + "trend_steady_tip": "Bu modelin uyumu son yeniden kontrollerde yaklaşık olarak sabit kaldı.", + "cap_blurb": { + "end": "Bir çevrimin gerçekten bittiğini anlama", + "live_match": "Çalışan programı daha erken tanıma", + "quality": "Yanlış algılanan veya bozuk çevrimleri fark etme", + "remaining_time": "Ne kadar süre kaldığını tahmin etme", + "total_energy": "Toplam enerji ve maliyeti tahmin etme" + }, + "cap_label": { + "end": "Çevrim sonu algılama", + "live_match": "Program eşleştirme", + "quality": "Çevrim kalite kontrolü", + "remaining_time": "Kalan süre tahmini", + "total_energy": "Enerji tahmini" + }, + "metric_auc": "Ayrılmış doğrulama verisinde AUC {auc}", + "metric_mae": "hata {model} - temel model {baseline}" }, - "phase2": { - "cluster": "WashData, kayıtlı hiçbir programla eşleşmeyen {count} döngü gördü – bunlar birbirlerine benziyor. Bunlar için yeni bir profil oluşturmak ister misiniz?", - "unmatched": "Son döngünüz kayıtlı hiçbir programla eşleşmedi. Yeni bir program mı?" + "modal": { + "auto_label": "Döngüleri Otomatik Etiketle", + "correct_feedback": "Geri Bildirimi Düzelt", + "create_profile": "Profil Oluştur", + "cycle": "Döngü", + "edit_group": "Profil grubunu düzenle", + "edit_phase": "Aşamayı Düzenle", + "import_config": "Yapılandırmayı İçe Aktar", + "label_cycle": "Döngüyü Etiketle", + "merge_cycles": "{n} Döngüyü Birleştir", + "new_group": "Yeni profil grubu", + "new_phase": "Yeni Aşama", + "process_history_msg": "Tüm saklanan döngülerde eşleştirmeyi yeniden çalıştırın, önerileri yenileyin, ML'yi yeniden eğitin (etkinleştirilmişse) ve döngü sağlığını yeniden hesaplayın. Bu biraz zaman alabilir.", + "process_history_ok": "İşle", + "process_history_title": "Geçmişi İşle", + "process_recording": "Kaydı İşle", + "delete_maintenance_msg": "Bu bakım kaydı silinsin mi? Bu işlem geri alınamaz.", + "delete_maintenance_title": "Bakım Kaydını Sil", + "relabel_cycles": "{count} döngüyü yeniden etiketle", + "delete_automation_title": "Otomasyonu Sil", + "delete_automation_msg": "\"{name}\" otomasyonu Home Assistant'tan silinsin mi? Bu işlem geri alınamaz.", + "remove_legacy_title": "Eski Eylemleri Kaldır", + "remove_legacy_msg": "Eski özel eylemler kaldırılsın mı? Döngü olaylarında tetiklenmeyi durduracaklar. Bu işlem panelden geri alınamaz.", + "discard_recording_title": "Kaydı At", + "discard_recording_msg": "Saklanan kayıt atılsın mı? Bu işlem geri alınamaz.", + "dismiss_all_title": "Tüm Geri Bildirimleri Kapat", + "dismiss_all_msg": "Bekleyen {count} geri bildirim isteğinin tümü kapatılsın mı?", + "dismiss_all_ok": "Tümünü Kapat", + "delete_phase_title": "Aşamayı Sil", + "delete_phase_msg": "\"{name}\" aşaması silinsin mi?", + "clear_debug_title": "Hata Ayıklama Verilerini Temizle", + "clear_debug_msg": "Saklanan tüm hata ayıklama izleri silinsin mi?", + "wipe_all_title": "Tüm Verileri Sil", + "wipe_all_msg": "⚠️ Bu, TÜM döngüleri ve profilleri kalıcı olarak siler. Bu işlem geri alınamaz.", + "wipe_all_ok": "Her Şeyi Sil", + "force_stop_title": "Döngüyü Zorla Durdur", + "force_stop_msg": "Etkin döngü şimdi zorla durdurulsun mu? Döngü, kesintiye uğramış olarak kaydedilecek.", + "store_import": "Referans döngüyü içe aktar", + "store_share": "Topluluk mağazasında paylaş", + "store_share_device": "Bu cihazı paylaş", + "export_select": "Dışa aktarma - veri seçin", + "import_wizard": "İçe aktarma - veri seçin" }, - "phase3": { - "suggestions": "WashData, döngü geçmişinize göre ayar önerileri sunuyor – algılama doğruluğunu artırmak için bunları inceleyin.", - "groups": "Bazı profilleriniz farklı sıcaklıklardaki aynı programa benziyor. Daha iyi eşleştirme için bunları bir grupta düzenleyin.", - "phases": "Daha doğru kalan süre tahminleri için {profile_name} profiline program aşamaları ekleyin." + "msg": { + "appliance_monitor": "Cihaz monitörü", + "artifact_dip_detail": "Normal güç bandının altında yaklaşık ~{n} saniye sürdü.", + "artifact_footer": "Yukarıdaki grafikte vurgulanmıştır. Bunlar geçici eserlerdir (örn. döngünün ortasında kapının açılması), mutlaka sorun teşkil etmez.", + "artifact_header": "Bu döngü sırasında {n} anormallik algılandı", + "artifact_pause_detail": "Güç yaklaşık ~{n} saniye boyunca sıfıra yakın düştü, sonra devam etti – döngünün ortasında kapı açılmış veya döngü duraklatılmış olabilir.", + "artifact_spike_detail": "Normal güç bandının üzerinde yaklaşık ~{n} saniye sürdü.", + "auto_label_intro": "Eşleşme güveni eşiği geçen etiketsiz döngülere profil atayın.", + "automations_intro": "WashData, {start} / {end} olaylarını tetikler ve varlıkları gösterir; bu nedenle bildirimler ve eylemler en iyi şekilde normal Home Assistant otomasyonları olarak oluşturulur. Bu cihazı kullanan otomasyonlar aşağıda görünür.", + "cleanup_intro": "Tüm etiketli döngüler üst üste bindirilmiş. Aykırı değerleri işaretleyip silerek profili temizleyin.", + "clear_debug_hint": "Saklanan hata ayıklama verilerini kaldırarak boş alan açın.", + "collecting_data": "Veri toplanıyor: ince ayar başlamadan önce {need} döngü{plural} daha gerekiyor ({current}/{min}).", + "compare_overlay_profiles": "Profilleri üst üste bindirin (soluk)", + "compare_profiles_tip": "Hangisinin bu döngüye en uygun olduğunu görmek için diğer profil zarflarını yukarıdaki tabloya yerleştirin.", + "compare_selected_cycles": "Seçili döngüler (katı) – göster / gizle", + "consider_new_profile": "Yeni bir profil oluşturmayı düşünün.", + "coverage_gap": "son döngülerin eşleşen profili yok (son 30 döngünün %{pct}'i).", + "coverage_gap_similar_cycles": "{count} benzer etiketsiz döngü bulundu – bunları eşleştirmeye başlamak için bir profil oluşturun.", + "cycles_deleted": "{count} döngü silindi", + "enough_data": "Öğrenmek için yeterli veri ({current}/{min} döngü).", + "export_description": "JSON'a dışa aktarılacak profilleri, döngüleri, ayarları ve daha fazlasını tam olarak seçin ya da bir dosyayı analiz edip yalnızca istediğiniz kısımları içe aktarın.", + "feedback_cycles_pending": "İncelenecek {n} döngü{s}", + "feedback_prompt": "Doğru olduğunu onaylayın, programı düzeltin veya yoksayın.", + "feedback_relabel_hint": "Bu döngüyü yeniden etiketlemek de bunu çözer.", + "filter_by_profile": "Profile göre filtrele…", + "group_modal_help": "Sıcaklık/dönme açısından farklı olan aynı şekle sahip programları gruplandırın (süreler değişebilir). Eşleştirme, grubu bir aday olarak puanlar ve ardından en uygun üyeyi seçer. En az 2 tanesini seçin; kaplama ne kadar benzer olduklarını gösteriyor.", + "group_not_cohesive": "Bu profiller güvenilir bir şekilde gruplandırılacak kadar benzer değildir; bu nedenle eşleştirme, siz aykırı değeri kaldırana veya grubu bölene kadar bunları ayrı ele alır.", + "group_preview_hint": "Güç eğrilerini önizlemek ve karşılaştırmak için 2 veya daha fazla üyeyi işaretleyin.", + "import_intro": "Dışa aktarılan bir dosyayı yükleyin veya aşağıya bir JSON yükü yapıştırın.", + "legacy_actions_title": "{count} eski özel işlem hâlâ çalışıyor", + "live_chart_loading": "Canlı güç grafiği okumalar gelince görünür.", + "loading": "Yükleniyor…", + "loading_curve": "Eğri yükleniyor…", + "loading_settings": "Ayarlar yükleniyor…", + "log_buffer_hint": "Önce en yeni · yeniden başlatmadan bu yana son 500 ha_washdata kaydını ara belleğe alır · yeniden boyutlandırmak için alt kenarı sürükleyin.", + "maintenance_advisory": "Sürenin/enerjinin artması, cihazın bakımının gerekli olduğunu gösterebilir (örn. kireç çözme, filtre temizliği).", + "maintenance_due": "Zamanı gelen bakım: {items}", + "maintenance_intro": "Bu cihazda yaptığınız bakımları kaydedin ve her görevin zamanı yeniden geldiğinde hatırlatma alın.", + "maintenance_load_error": "Bakım verileri yüklenemedi: {error}", + "maintenance_requires_access": "Bakım ve dışa/içe aktarma tam erişim gerektirir.", + "manual_duration_hint": "Kalan süre tahminleri için kullanılan profilin ortalama/beklenen döngü uzunluğu. Ayarlamak için düzenleyin; değişmeden bırakmak mevcut değeri korur.", + "matching_tuning_intro": "Öğrenirken WashData, program eşleştirmenin şekle, süreye ve enerjiye ne kadar ağırlık verdiğini de ayarlar.", + "merge_intro": "Seçili döngüler tek birinde birleştirilir (kronolojik sıra; boşluklar 0 W ile doldurulur). Sonuçlanan profili seçin.", + "ml_intro": "WashData, kullanıma hazır akıllı modellerle birlikte gelir.", + "ml_learned_intro": "Bu makineye ince ayarlı modeller.", + "ml_loading": "ML yükleniyor…", + "ml_settings_intro": "İki bağımsız anahtar: biri döngü çalışırken modelleri uygular, diğeri WashData'nın zamanla makinenize ince ayar yapmasına izin verir.", + "name_first_program": "Yeterli döngünüz var – eşleştirmeye başlamak için ilk programınıza ad verin.", + "near_duplicate_cluster": "neredeyse yinelenen profil kümesi algılandı. Gruplandırma, eşleştirmenin benzerler arasında güvenilir bir şekilde seçim yapmasına olanak tanır (örneğin, farklı sıcaklıkta/döndürmede aynı program).", + "no_cycles_match": "Mevcut filtreyle eşleşen döngü yok.", + "no_cycles_profile": "Bu profil için döngü yok.", + "no_cycles_selected": "Önce en az bir döngü seçin.", + "no_cycles_yet": "Henüz döngü kaydedilmedi.", + "no_device_selected": "Cihaz seçilmedi.", + "no_devices": "Henüz WashData cihazı yapılandırılmamış.", + "no_envelope": "Henüz zarf yok - döngüleri etiketledikten sonra yeniden oluşturun.", + "no_envelope_overlay": "Üst üste bindirmek için zarf mevcut değil.", + "no_fine_tuned": "Henüz ince ayar yapılmadı – WashData yerleşik modellerini kullanıyor.", + "no_logs": "Henüz günlük kaydı arabelleğe alınmadı.", + "no_maintenance": "Henüz bakım kaydı yok.", + "no_match_yet": "Henüz eşleşme denemesi yok - bu, çalışan bir döngü sırasında doldurulur.", + "no_other_users": "Başka Home Assistant kullanıcısı bulunamadı.", + "no_phases": "Tanımlanmış aşama yok.", + "no_phases_assigned": "Atanmış aşama yok.", + "no_profiles_compare": "Karşılaştırılacak profil yok.", + "no_profiles_overlay": "Üst üste bindirilecek profil yok.", + "no_profiles_yet": "Henüz profil yok. Etiketli döngüden bir tane oluşturun.", + "no_profiles_yet_short": "Henüz profil yok.", + "no_settings_match": "\"{q}\" ile eşleşen ayar yok", + "no_split_points": "Henüz bölme noktası yok.", + "no_suggestions": "Aktif öneri yok.", + "notify_services_hint": "{entity} hizmet kimliklerini kullanın (birden fazlası için virgülle ayrın). Şablon değişkenleri: {vars}.", + "old_actions_warning": "Eski eylem düzenleyiciyle yapılandırılmıştır (artık kaldırılmıştır). Döngü etkinliklerinde hala tetikleniyorlar ancak artık burada düzenlenemezler. Bunları normal bir otomasyona dönüştürün veya kaldırın.", + "onboarding_progress": "{n} / 3 döngü gözlemlendi", + "onboarding_watching": "Cihazınızı normal şekilde kullanın – WashData izliyor. 3 döngüden sonra program eşleştirmesi başlar.", + "pending_feedback": "Bekleyen algılama geri bildirimi", + "performance_trend": "Performans trendi ({n} döngü)", + "pg_analysis_empty": "Eşleşme analizini görmek için bir döngü yükleyin.", + "pg_apply_confirm": "En iyi değeri uygula: {label} = {value}?", + "pg_canvas_empty": "Yukarıdan bir döngü seçin, ardından güç izini görmek için Yükle'ye basın.", + "pg_chart_caption": "{param} değerlerine göre algılama/eşleşme oranı", + "pg_ctrl_intro": "Değerler bu cihazın etkin entegrasyon ayarlarından başlar. Düzenlemeler, siz uygulayana kadar Test Alanı'nda kalır.", + "pg_live_unavailable": "Etkin ayarlar kullanılamıyor, varsayılanlar gösteriliyor.", + "pg_load_live_confirm": "{n} Test Alanı düzenlemesi atılıp entegrasyonun geçerli ayarları yeniden yüklensin mi?", + "pg_match_rate": "{total} döngüde %{pct} eşleşme oranı", + "pg_matches_live": "Etkin ayarlarla aynı", + "pg_n_changed": "Etkin ayarlara göre {n} değişiklik", + "pg_sugg_none": "Tüm öneriler zaten geçerli ayarlarla eşleşiyor", + "pg_preset_delete_confirm": "\"{name}\" ön ayarı silinsin mi?", + "pg_preset_limit": "Ön ayar sınırına ulaşıldı ({n})", + "pg_preset_overwrite": "\"{name}\" ön ayarının üzerine yazılsın mı?", + "pg_publish_one_confirm": "{label} = {value} bu cihazın ayarlarına kaydedilsin mi?", + "pg_restart_note": "Simülasyon araçlarını etkinleştirmek için Home Assistant'ı yeniden başlatın.", + "pg_sim_progress": "{done} / {total} döngü", + "pg_starting": "Başlatılıyor…", + "pg_stress_synthetic": "bekleme simülasyonu burada başlar", + "pg_sweep_intro": "{param} farklı olsaydı ne olurdu? En çok döngünün doğru şekilde eşleştirildiği ayarı bulmak için son {cycles} döngünüzde {steps} değeri test edin.", + "pg_sweep_step": "Adım {done} / {total}", + "pg_undetected": "{n} döngü{s} algılanmadı", + "pg_verdict_bad": "Dikkat gerekiyor: birçok döngü algılanmadan geçiyor.", + "pg_verdict_good": "İyi ayarlanmış: çoğu döngü doğru şekilde tanımlanıp eşleştiriliyor.", + "pg_verdict_ok": "Kabul edilebilir: bazı döngüler kaçırıldı. Başlangıç eşiğini düşürmeyi deneyin.", + "phase_catalog_intro": "Bir döngünün adlandırılmış bölümleri (Ön yıkama, Isınma, Sıkma…). Denetim panelinden bir profile atayın.", + "phase_ranges_intro": "Ortalama eğri üzerinde bindirilen faz aralıkları (döngü başlangıcından dakikalar). Canlı önizleme için değerleri düzenleyin.", + "playground_intro": "Geçmiş döngüleri farklı ayarlarla yeniden oynatmak, iki kurulumu yan yana karşılaştırmak ve bir döngünün bir profile nasıl hizalandığını incelemek için güvenli bir test alanı. Siz açıkça uygulamadıkça buradaki hiçbir şey canlı verilerinizi değiştirmez.", + "playground_needs_restart": "Test Alanı araçlarını etkinleştirmek için Home Assistant'ı yeniden başlatın.", + "preferences_admin": "Tercihler, panel ve erişim denetimi", + "preferences_adv": "Tercihler", + "prefs_personal": "Bunlar yalnızca Home Assistant hesabınıza uygulanır.", + "process_history_hint": "Tüm saklanan döngülerde eşleştirmeyi yeniden çalıştırın, ayar önerilerini yenileyin, ML modellerini yeniden eğitin (etkinleştirilmişse) ve döngü sağlığını yeniden hesaplayın. Bir toplu incelemenin ardından çalıştırın.", + "profile_deleted": "Profil silindi", + "profile_poor_health_detail": "Bu profile atanan döngüler tutarsız şekillere sahip veya güvenirliği düşük. Zarfı yeniden oluşturmayı veya etiketli döngüleri gözden geçirmeyi düşünün.", + "profiles_intro": "İstatistikler, aşamalar ve temizleme için bir profile tıklayın. Güvenilir seçim için neredeyse aynı programları (aynı şekil/süre, farklı sıcaklık veya dönüş) gruplayın.", + "rbac_hint": "Kapalı olduğunda her Home Assistant kullanıcısı tam erişime sahip olur (varsayılan). Yöneticiler her zaman tam erişime sahip olup herkesi yönetebilir.", + "recent_logs": "Son ha_washdata kayıtları", + "recording_in_progress": "Kayıt devam ediyor", + "reminders_intro": "Son servisten bu kadar döngü sonra panelde bir hatırlatma göster. Bir hatırlatmayı kapatmak için boş bırakın veya 0 girin.", + "restart_gap_footer": "Grafikte vurgulandı. Bu aralıklar için güç verisi eksik; eşleştirme yalnızca gerçek okumaları kullandı.", + "restart_gap_header": "{n} HA yeniden başlatma boşluğu bu döngü sırasında", + "restart_gap_item": "{dur} boşluk", + "review_confirm_help": "Bu döngünün doğru şekilde algılanıp algılanmadığını doğrulayın. İncelemeleriniz makinenizdeki modeli eğitir; ne kadar çok döngü onaylarsanız o kadar iyi eşleştirme ve sağlık puanlaması elde edilir. Hızlı bir İyi/Kötü yeterlidir.", + "review_in_settings": "Ayarlarda İncele", + "review_notes_placeholder": "Notlar (isteğe bağlı)", + "review_notes_tip": "Kendi referansınız için serbest metin notları. Eşleştirme veya antrenman yoluyla kullanılmaz.", + "review_profile_tip": "Bu döngünün etiketlendiği program. Otomatik algılanan program yanlışsa burada düzeltin; etiketleme gelecekteki döngüler için eşleştirmeyi öğretir.", + "review_quality_tip": "Bu döngü ne kadar temiz. İyi = bu programın ders kitabı örneği; Kötü = algılandı ancak gürültülü veya atipik; Kullanılamaz = yanlış algılandı (birleştirilmiş, kısaltılmış veya sahte). Sağlık puanını ve modeli eğitmek için hangi döngülere izin verildiğini yönlendirir.", + "review_recorded_tip": "Bunu, programı için özenle seçilmiş bir referans döngüsü olarak işaretleyin; manuel olarak kaydedilen bir döngüyle aynı rol. Referans döngüleri her zaman tutulur, eşleşen şablonun çekirdeği oluşturulur ve hiçbir zaman temizleme işlemi nedeniyle bırakılmaz. (Bu \"altın\"/kaydedilmiş bayraktır; ikisi de aynı şeydir.)", + "review_tags_tip": "Bu döngüde neyin yanlış gittiğini açıklayan isteğe bağlı bayraklar, böylece eğitim ve temizlik bunu açıklayabilir.", + "review_to_cycles": "Döngü inceleme kuyruğunu aç", + "saving_triggers_reload": "Kaydetme bir entegrasyon yeniden yüklemesini tetikler. HA varlıkları kısa süreliğine kullanılamaz olarak görünebilir.", + "search_placeholder": "Ayar ara…", + "see_recorder": "Aşağıdaki kaydedici widget'ına bakın", + "setting_changed": "{date} tarihinde {old} değerinden {new} değerine değiştirildi", + "settings_basic_note": "Temel ayarlar gösteriliyor. Tam liste için Gelişmiş'e geçin.", + "shape_drift_advisory": "⚠ Şekil kayıyor", + "shape_drift_detail": "Bu profil için güç paterni zamanla kaymıştır – olası cihaz aşınması veya bakım gerekebilir (örn. kireç çözme, filtre temizliği).", + "show_all_settings": "Tüm ayarları göster", + "showing_suggestions": "Önerilerle birlikte {count} ayarı gösteriliyor.", + "split_intro": "Bölme noktası eklemek veya kaldırmak için grafiğe tıklayın veya boşta kalma aralıklarına göre otomatik algılayın. Her elde edilen bölüm kendi profilini alabilir.", + "storage_diagnostics": "Depolama istatistikleri, bakım, dışa/içe aktarma", + "sug_staged": "{key} = {val} olarak ayarlandı. Uygulamak için kaydedin.", + "toast_auto_detect_enabled": "Otomatik algılama etkinleştirildi", + "toast_auto_label_complete": "Otomatik etiketleme tamamlandı", + "toast_auto_label_failed": "Otomatik etiketleme başarısız: {error}", + "toast_automation_failed": "Otomasyon oluşturulamadı: {error}", + "toast_automation_migrated": "Eylemler bir otomasyona taşındı; düzenleyici açılıyor", + "toast_convert_failed": "Dönüştürme başarısız: {error}", + "toast_create_failed": "Oluşturma başarısız: {error}", + "toast_delete_failed": "Silme başarısız: {error}", + "toast_error": "Hata: {error}", + "toast_failed": "Başarısız: {error}", + "toast_force_stop_failed": "Zorla durdurma başarısız: {error}", + "toast_name_required": "Ad gerekli", + "toast_no_automation": "Burada otomasyon oluşturulamaz", + "toast_profile_name_required": "Profil adı gereklidir", + "toast_program_set": "Program ayarlandı: {program}", + "toast_rebuild_failed": "Yeniden oluşturma başarısız: {error}", + "toast_resume_failed": "Devam ettirme başarısız: {error}", + "toast_revert_failed": "Geri alma başarısız: {error}", + "toast_reverted": "{key} geri alındı", + "toast_save_failed": "Kaydetme başarısız: {error}", + "trend_duration_longer": "Süre trendi daha uzun (%{pct}/döngü) – son ortalama {avg}", + "trend_duration_shorter": "Süre eğilimi daha kısa (%{pct}/döngü) – son ortalama {avg}", + "trend_energy_down": "Enerji düşüş eğiliminde (%{pct}/döngü)", + "trend_energy_up": "Enerji yükseliş eğiliminde (%{pct}/döngü) – son ortalama {avg}", + "trim_destructive_confirm": "Bu, döngünün yalnızca %{pct}'ini korur ve bu işlem geri alınamaz. Devam edilsin mi?", + "trim_intro": "Kırmızı tutamaçları sürükleyin veya değer girin. Pencerenin dışındaki her şey kaldırılır.", + "tuning_suggestions_available": "Gözlemlenen döngülerden {count} ayarlama önerisi mevcut. İlgili alanların yanında görünürler.", + "unsure_detected_prefix": "WashData algıladığından emin değil", + "updated": "Güncellendi", + "warmup_badge": "Hâlâ öğreniyor ({done}/{needed} döngü)", + "warmup_detail": "Bu profil, otomatik eşleştirme başlamadan önce {needed} etiketli döngüye ihtiyaç duyar. Her onaylanan döngü öğrenmesine yardımcı olur.", + "wipe_history_warning": "Tüm döngüleri ve profilleri kalıcı olarak silin. Geri alınamaz.", + "compare_overlay_tip": "Her döngünün hangi programa benzediğini görmek için öğrenilen profil zarflarını üst üste bindirin.", + "duration_trend_up_tip": "Süre artıyor (%{pct}/döngü)", + "duration_trend_down_tip": "Süre azalıyor (%{pct}/döngü)", + "energy_trend_up_tip": "Enerji artıyor (%{pct}/döngü)", + "energy_trend_down_tip": "Enerji azalıyor (%{pct}/döngü)", + "performance_trending": "Performans eğilimi", + "pg_select_cycle_hint": "Yüklemek için bir döngü seçin ve ↺ düğmesine tıklayın", + "pg_sweep_progress": "Adım {done} / {total}", + "pg_analysis_hint": "Analizi yüklemek için bir döngü seçin ve ↺ düğmesine tıklayın.", + "diagnostics_load_failed": "Tanılamalar yüklenemedi: {error}", + "manual_duration_ref_hint": "Yalnızca hiçbir referans döngü seçilmediğinde kullanılır. Bir referans döngü, süreyi kendi uzunluğuna göre belirler.", + "toast_convert_rolled_back": "Dönüştürme başarısız oldu ve geri alındı (geride otomasyon bırakılmadı): {error}", + "toast_convert_orphan": "Otomasyon oluşturuldu ancak eski eylemler temizlenemedi. Tekrar denemeyin: yinelenen bir otomasyondan kaçınmak için eski eylemleri elle kaldırın.", + "advisory_duration_trend_up": "'{name}' çevrimleri giderek uzuyor (çevrim başına yaklaşık +{pct}%). Cihazın davranışı değiştiyse bu profili yeniden kaydedin veya yeniden oluşturun.", + "advisory_energy_trend_up": "'{name}' giderek daha fazla enerji çekiyor (çevrim başına yaklaşık +{pct}%) - beklenmedikse cihazı kontrol etmekte fayda var.", + "advisory_poor_health": "'{name}' düşük bir uyum puanına sahip - son çevrimleri çok değişkenlik gösteriyor veya zayıf eşleşiyor. Eşleştirme ve süre tahminlerinin doğru kalması için çevrimlerini gözden geçirin ya da profili yeniden kaydedin.", + "advisory_shape_drift": "'{name}' orijinal güç eğrisinden önemli ölçüde uzaklaştı. Cihazın davranışı zamanla değişmiş olabilir (ör. kireçlenme, aşınma). Bu profili son çevrimlerle yeniden kaydetmeyi düşünün.", + "advisory_shape_drift_corr": "'{name}' orijinal güç eğrisinden önemli ölçüde uzaklaştı (korelasyon {corr}). Cihazın davranışı zamanla değişmiş olabilir (ör. kireçlenme, aşınma). Bu profili son çevrimlerle yeniden kaydetmeyi düşünün.", + "pg_no_alerts": "Bu çalıştırmada sorun tespit edilmedi.", + "pg_override_active": "Düzenlediğiniz ayarlar mevcut ayarlara karşı kullanılıyor", + "pg_history_intro": "Son döngülerinizi gerçek algılayıcı ve eşleştirici üzerinden yeniden oynatın. Burada bir önce/sonra karşılaştırması görmek için önce Simülasyon modunda bir algılama ayarını düzenleyin.", + "pg_history_empty": "Döngülerinizi yeniden oynatmak için Çalıştır'a basın.", + "pg_history_summary": "{detected}/{total} algılandı · {correct} doğru eşleşti", + "pg_sweep_no_metric": "Bu hedefi puanlamak için yeterli veri yok.", + "pg_sweep_intro2": "Son döngülerinizde bir hedefi en iyi karşılayan ayarı bulun. Siz uygulayana kadar hiçbir şey değişmez.", + "pg_running_history": "Döngüleriniz yeniden oynatılıyor…", + "pg_running_sweep": "Değerler tüm döngülerinizde test ediliyor…", + "pg_row_load_hint": "Bu döngüyü yukarıdaki grafiğe yükle", + "pg_history_intro2": "Son döngülerinizi yukarıdaki ayarlarla gerçek algılayıcı ve eşleştiriciden geçirerek yeniden oynatın. Bir döngüyü grafiğe yüklemek için herhangi bir satıra tıklayın; öncesi/sonrası karşılaştırması görmek için bir ayarı değiştirin.", + "pg_simulating": "Döngü simüle ediliyor…", + "pg_canvas_empty2": "Yukarıdan bir döngü seçin ve simüle etmek için Çalıştır'a basın. Ardından değerleri okumak için üzerine gelin, yakınlaştırmak için kaydırın ve kaydırmak için sürükleyin.", + "pg_apply_settings_confirm": "Bu {n} ayar bu cihaza kaydedilsin mi? {list}", + "pg_stress_terminated_detail": "Yaklaşık {idle} W bekleme seviyesine oturdu -- döngü {h} sa {m} dk sonra {reason} ile sona erdi.", + "pg_stress_above_threshold_detail": "Bekleme tüketimi (~{idle} W) etkin durdurma eşiğine ({stop} W) eşit veya bu eşiğin üzerinde -- döngü hiçbir zaman sessiz olarak kaydedilmedi. Düzeltmek için stop_threshold_w değerini artırın.", + "pg_stress_hit_cap_detail": "Döngü {h} sa {m} dk boyunca durmadan çalıştı -- güvenlik sınırı tarafından zorla durduruldu. Bekleme tüketimi {idle} W, durdurma eşiği {stop} W.", + "no_logs_match": "Bu filtrelerle eşleşen günlük kaydı yok.", + "pg_analysis_hint2": "Bir döngü seçin ve eşleşme analizini yüklemek için Çalıştır'a basın.", + "pg_analysis_empty2": "Eşleşme analizini görmek için Çalıştır'a basın.", + "imported_readonly": "Topluluk mağazasından içe aktarıldı. Referans ve eşleştirme için gösterilir. İstatistiklerinize sayılmaz ve düzenlenemez.", + "merge_no_imports": "İçe aktarılan kayıtlar gerçek bir döngüye birleştirilemez. Birleştirmek için seçimlerini kaldırın.", + "store_enable_hint": "Topluluk referans döngülerine göz atmak ve içe aktarmak için Ayarlar'da çevrimiçi özellikleri etkinleştirin.", + "online_intro": "Diğer WashData kullanıcılarıyla referans döngüleri paylaşın ve indirin. Tüm çevrimiçi özellikler isteğe bağlıdır ve varsayılan olarak kapalıdır.", + "store_share_intro": "Aynı cihaza sahip diğerlerinin kullanabilmesi için bu referans döngüyü yükleyin. Herkese açık olmadan önce incelenir.", + "online_intro_global": "Diğer WashData kullanıcılarıyla referans kayıtlarına göz atın ve paylaşın, cihaz girişlerini onaylayın. Tek bir bağlantı tüm WashData entegrasyonunuz için geçerlidir; cihaz markası ve modeli her cihaz için Temel bölümünde ayarlanır. Tüm çevrimiçi özellikler isteğe bağlıdır ve varsayılan olarak kapalıdır.", + "online_unavailable": "Çevrimiçi özellikler bu sunucuda kullanılamıyor.", + "store_picker_offline": "Topluluk kataloğundan seçim yapmak için ayarlar dişlisinde çevrimiçi özellikleri etkinleştirin.", + "pick_brand_first": "Önce bir cihaz markası seçin.", + "model_not_found": "Henüz katalogda yok.", + "connect_to_confirm": "Onaylamak veya değerlendirmek için ayarlar dişlisinde bağlanın.", + "adopt_settings_hint": "Bu cihazın algılama ve eşleştirme eşiklerini paylaşılanlarla üzerine yaz. Bildirimleriniz, varlıklarınız ve enerji fiyatınız hiçbir zaman değiştirilmez.", + "include_settings_hint": "Bu cihazın tanıma ve eşleştirme eşiklerini paylaşın (bildirimlerinizi, varlıklarınızı veya enerji fiyatınızı değil). Benimseyenler bunların uygulanıp uygulanmayacağını seçer.", + "onboard_download": "Yeni cihaz mı? Aynı cihaza sahip başka bir WashData kullanıcısından hazır bir kurulum (programlar, referans döngüleri ve fazlar) benimseyin.", + "share_consent": "Bu döngülerin kesintisiz normal şekilde tamamlandığını onaylıyorum", + "share_device_none": "Henüz paylaşılabilir döngü yok. Önce Döngüler sekmesinde kayıtlı veya el ile seçilen bir döngüyü referans döngüsü (⭐) olarak işaretleyin.", + "share_guideline_naming": "Her profili cihazın kadranında veya ekranında tam olarak gösterildiği gibi adlandırın (örn. 'Cotton 40', 'Eco 60').", + "share_guideline_quality": "Yalnızca normal şekilde tamamlanan döngüleri paylaşın -- döngü ortasında kesinti, kapı açma olayları veya güç kesintisi olmadan.", + "share_guideline_review": "Yüklemeniz beklemede olarak başlar ve yeterince topluluk üyesi onayladığında kamuya açılır.", + "share_guidelines_title": "Paylaşmadan önce", + "store_download_device_intro": "Her paylaşılan programı ve referans döngülerini cihazınıza benimseyin. Kendi kayıtlı döngüleriniz ve istatistikleriniz etkilenmez.", + "store_share_device_intro": "Seçtiğiniz referans döngüleriyle {brand} {model} cihazını yükleyin. Aynı cihaza sahip diğer kullanıcılar programlarınızı benimseyebilir. Girişler kamuya açılmadan önce incelenir.", + "share_profile_no_cycles": "Referans döngüsü yok -- bu profili dahil etmek için Döngüler sekmesinde bir döngüyü ⭐ olarak işaretleyin", + "advisory_phase_inconsistent": "'{name}' farklı programları veya sıcaklıkları karıştırıyor gibi görünüyor - çevrimleri çok farklı sürelerde ısıtma yapıyor. Bunu ayrı profillere bölmek (örneğin her sıcaklık için) eşleştirmeyi ve süre tahminlerini iyileştirir.", + "advisory_phase_inconsistent_title": "⚠ Karışık olabilecek programlar", + "export_select_intro": "Nelerin dahil edileceğini tam olarak işaretleyin. Profilleri döngüleri olmadan seçmek yine de tanınabilir bir program dışa aktarır (öğrenilen şekli de birlikte taşınır).", + "import_analyze_hint": "Dışa aktarılmış bir dosya yükleyin (veya JSON'unu yapıştırın). WashData bunu analiz eder ve herhangi bir değişiklik olmadan önce tam olarak neyin içe aktarılabileceğini gösterir.", + "analyzing": "Analiz ediliyor…", + "device_type_mismatch_warn": "Bu dışa aktarma farklı bir cihaz türünden ({src} ile {local}). Programlar ve döngüler yine de referans verisi olarak içe aktarılabilir, ancak cihaza özgü ayarlar ve gerçek geçmiş içe aktarımı devre dışıdır.", + "merge_hint": "İçe aktarılan öğeler eklenir; yerel hiçbir şey kaybolmaz. Ad çakışmaları aşağıda çözülür.", + "replace_warn": "İşaretlenen her kategori silinir ve dosyadan gelenle değiştirilir. İşaretlenmeyen kategorilere dokunulmaz.", + "dest_reference_hint": "İçe aktarılan döngüler yalnızca program tanımayı iyileştirir ve kullanım/enerji istatistiklerini asla etkilemez.", + "dest_real_history_hint": "İçe aktarılan döngüler bu cihazın kendi geçmişi olarak sayılır ve enerji/kullanım istatistiklerini besler. Bir cihazı yeni bir kuruluma taşırken kullanın.", + "sug_muted": "Bu ayar bir daha önerilmeyecek", + "sug_mute_failed": "Öneri susturulamadı", + "sug_unmuted_all": "Susturulan öneriler sıfırlandı", + "n_suggestions_muted": "{count} susturuldu; öneri motoru bunları önermeyecek.", + "font_size_hint": "Bu paneldeki her şeyi büyütün veya küçültün. Bu cihazdaki hesabınıza uygulanır." }, - "phase4": { - "healthy": "Bu cihaz tamamen kuruldu ({profile_count} profil)." + "pg_desc": { + "completion_min_seconds": "Gerçek döngü sayılan en kısa çalışma", + "end_repeat_count": "Bitmeden önce arka arkaya düşük okuma", + "interrupted_min_seconds": "Kısa döngüler kesintiye uğramış olarak işaretlenir", + "min_off_gap": "İki döngüyü ayırmak için gereken boşluk", + "off_delay": "Döngü bitmeden önceki düşük güç saniyesi", + "start_duration_threshold": "Başlangıcı onaylamak için eşik üstünde saniye", + "start_threshold_w": "Başladı sayılması için minimum watt", + "stop_threshold_w": "Bunun altında makine kapalı sayılır", + "anti_wrinkle_enabled": "Ana aşamadan sonraki takla darbelerini yeni döngü olarak okumak yerine emer", + "anti_wrinkle_exit_power": "Kırışıklık önlemenin etkin kalması için gücün darbeler arasında bunun altına düşmesi gerekir", + "anti_wrinkle_idle_timeout": "Kırışıklık önleme sona ermeden önce iki takla darbesi arasında izin verilen sessiz süre", + "anti_wrinkle_max_duration": "Bundan uzun bir darbe kırışıklık önlemeyi bitirir ve yeni bir döngü açar", + "anti_wrinkle_max_power": "Bunun üzerindeki bir darbe kırışıklık önlemeyi bitirir ve yeni bir döngü açar", + "dtw_bandwidth": "Aşama 3: Sakoe-Chiba büküm bandı (0 = DTW kapalı; varsayılan 0.2 = döngü uzunluğunun %20'si)", + "corr_weight": "Aşama 2: eğri şekli (korelasyon) ile güç düzeyi (MAE) arasındaki denge; varsayılan 0.45", + "duration_weight": "Aşama 4: çalışma süresi uyumunun nihai puanı ne kadar etkilediği (varsayılan 0.22)", + "energy_weight": "Aşama 4: enerji uyumunun nihai puanı ne kadar etkilediği (varsayılan 0.22)", + "profile_match_min_duration_ratio": "Aşama 1: profil süresinin bir kesri olarak minimum döngü uzunluğu; varsayılan 0.1 (%10)", + "profile_match_max_duration_ratio": "Aşama 1: profil süresinin bir kesri olarak maksimum döngü uzunluğu; varsayılan 1.5 (%150)", + "keep_min_score": "Aşama 2: yarışta kalmak için taban puan; varsayılan 0.1 zayıf eşleşmelere izin verir, sonraki aşamalar en iyisini seçer", + "dtw_blend": "Aşama 3: 0 = yalnızca çekirdek puan, 1 = yalnızca DTW puanı, 0.5 = eşit karışım (varsayılan)", + "dtw_ensemble_w": "Aşama 3 (topluluk modu): ölçeklendirilmiş-L1 ile türev DTW arasındaki ağırlık; varsayılan 0.7 düzey farkındalığını tercih eder", + "dtw_ddtw_scale": "Aşama 3: DDTW yarı doygunluk mesafesi; küçük = şekle daha duyarlı (varsayılan 30)", + "dtw_refine_top_n": "Aşama 3: DTW'nin yeniden puanladığı aday sayısı; doğru profil 4-5. sıraya düşüyorsa 7-9'a yükseltin (varsayılan 5)", + "duration_scale": "Aşama 4: süre uyumunun yarılandığı logaritmik oran; küçük = daha sert ceza (varsayılan 0.175)", + "energy_scale": "Aşama 4: enerji uyumunun yarılandığı logaritmik oran; küçük = daha sert ceza (varsayılan 0.25)", + "dishwasher_end_spike_quiet_release": "Bulaşık makinesi: beklenen süreden sonra döngü sonu tahliye beklemesi bırakılmadan önceki sessiz saniyeler" }, - "cta": { - "start_recording": "Kaydı Başlat", - "label_detected_cycle": "Zaten algılanmış bir döngüm var – bunun yerine etiketle", - "browse_cycles": "Başka birini etiketlemek için döngülere göz at", - "view_profiles": "Profillerinizi görüntüleyin", - "create_from_cluster": "Bu döngülerden profil oluştur", - "create_profile": "Bunun için bir profil oluştur", - "review_suggestions": "Önerileri incele", - "organise_profiles": "Profilleri düzenle", - "configure_phases": "Aşamaları yapılandır", - "skip_step": "Bu adımı atla", - "skip_forever": "Bir daha gösterme", - "hide_guidance": "Rehberi gizle", - "show_guidance": "Rehberi göster" + "phase_desc": { + "anti_crease": "Kırışıklıkları azaltmak için tamamlandıktan sonra ara sıra kısa yuvarlanmalar.", + "anti_wrinkle": "Kırışıklıkları azaltmak için döngü sonrası periyodik yuvarlanma.", + "cool_down": "Döngü sonuna yaklaşıldığında ısınma olmadan yuvarlanma.", + "drain_and_switch": "Yıkama modundan kurutma moduna geçiş süresi.", + "dry": "Isıtıcı ve/veya artık ısı kullanılarak kurutma aşaması.", + "drying": "Ana ısıtmalı tamburlama dönemi.", + "heat_up": "Tam kurutma başlamadan önce ısıtıcının ilk ısınması.", + "pre_rinse": "Deterjanla yıkamadan önce ilk püskürtme.", + "pre_wash": "Ana yıkamadan önce ilk ıslatma veya ön işlemden geçirin.", + "rinse": "Temiz su durulama aşaması. Bu aşama birden çok kez tekrarlanabilir.", + "sanitize": "Sterilizasyon programları için yüksek sıcaklıkta temizleme aşaması.", + "sensor_check": "Kuruluk ölçülürken kısa düşük güçte duraklama.", + "soak": "Aktif yıkama aşamaları arasında düşük aktiviteli ıslatma süresi.", + "soak_dw": "Ağır topraklar için uzatılmış ıslatma süresi.", + "spin": "Yükteki suyu çıkarmak için yüksek hızlı ekstraksiyon.", + "spin_wd": "Kurutma geçişinden önce yüksek hızlı ekstraksiyon.", + "wash": "Tambur hareketi ve isteğe bağlı ısıtma ile ana yıkama programı.", + "wash_dw": "Ana deterjanla ısıtma ile yıkama." + }, + "placeholder": { + "add": "ekle…", + "group_name": "örn. Pamuk 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "bir bildirim hizmeti ekle…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "bir kişi ekle…", + "phase_name": "örn. Ön yıkama", + "profile_name": "örn. Pamuk 40°C", + "maintenance_notes": "örn. filtre değiştirildi, kapı contası temizlendi", + "store_brand": "örn. Bosch", + "store_model": "örn. WAT28401" + }, + "pref": { + "date_absolute": "Mutlak (ör. 2 Tem 14:32)", + "date_relative": "Göreli (ör. 2 saat önce)", + "lang_auto": "Sistem varsayılanı ({lang})", + "lang_en": "İngilizce", + "use_panel_default": "(panel varsayılanı)" + }, + "quality": { + "bad": "Kötü", + "good": "İyi", + "unusable": "Kullanılamaz" + }, + "section": { + "anti_wrinkle": { + "intro": "Kırışıklık önleme modu, ana aşamadan sonra düşük güçlü tumble darbelerini algılar ve bunları tamamlanan döngüye bağlı tutar.", + "label": "Kırışıklık Önleme" + }, + "basic": { + "intro": "Temel kimlik ve çoğu kurulum için gerekli olan temel öğeler.", + "label": "Temel" + }, + "delay": { + "intro": "Gecikmeli başlatma algılaması, cihazın açık olduğu ancak henüz döngüsüne başlamadığı durumu tespit eder.", + "label": "Gecikmeli Başlatma" + }, + "detection": { + "intro": "Bir döngünün nasıl başladığı, çalıştığı ve bittiği algılanır.", + "label": "Algılama" + }, + "matching": { + "intro": "Tamamlanan döngülerin öğrenilen profillerle nasıl eşleştirilip etiketlendiği.", + "label": "Eşleştirme" + }, + "ml_training": { + "intro": "Cihaz üzerinde makine öğrenmesi yeniden eğitim takvimi ve veri ayarları.", + "label": "ML Eğitimi" + }, + "notifications": { + "intro": "Döngü olayları hakkında ne zaman ve nasıl bildirim alacağınız.", + "label": "Bildirimler" + }, + "timing": { + "intro": "Arka plan ritmi, çevrimdışı bekçi ve bakım işlemleri.", + "label": "Zamanlama & Bekçi" + }, + "triggers": { + "intro": "İsteğe bağlı harici sinyaller: bitiş tetikleyicisi, kapı sensörü, duraklatma anahtarı ve boşaltma hatırlatıcısı.", + "label": "Tetikleyiciler & Kapılar" + }, + "phase_eta": { + "label": "Kalan Süre", + "intro": "Çevrim uzunluğu sıcaklığa veya sıkmaya bağlı olan makineler için aşama farkındalıklı kalan süre." + }, + "dishwasher": { + "label": "Bulaşık Makinesi", + "intro": "Bulaşık makineleri için döngü sonu işleme; bu makineler genellikle kısa bir son tahliyeden önce, neredeyse hiç güç çekmeyen uzun bir kurutma aşamasıyla biter." + } + }, + "setting": { + "anti_wrinkle_enabled": { + "doc": "Kurutucunun ana ısıtma aşamasından sonra yaydığı kısa, düşük güçlü tambur darbelerini tanıyın ve bunları yeni döngüler olarak okumak yerine bitmiş döngüye bağlı tutun.", + "label": "Kırışıklık Önleme Algılamayı Etkinleştir" + }, + "anti_wrinkle_exit_power": { + "doc": "Kırışıklık önleme modunun aktif kalması için darbeler arasında gücün bu değerin altına düşmesi gerekir.", + "label": "Çıkış Gücü Eşiği" + }, + "anti_wrinkle_idle_timeout": { + "label": "Maks. Darbe Aralığı", + "doc": "Kırışıklık önleme modu sona ermeden önce makinenin iki takla darbesi arasında ne kadar süre sessiz kalabileceği. Bunu kurutucunuzun darbeler arasında bıraktığı en uzun boşluğun üzerine ayarlayın, aksi halde sonraki her darbe hatalı başlangıç olarak okunur." + }, + "anti_wrinkle_max_duration": { + "doc": "Bundan daha uzun darbeler, kırışıklık önleyici bir takla yerine gerçek bir döngü olarak değerlendirilir.", + "label": "Maks. Süre" + }, + "anti_wrinkle_max_power": { + "doc": "Bu gücün üzerindeki bir nabız, kırışıklık karşıtı bir düşüş değil, gerçek bir yeni döngü olarak değerlendirilir. Takla darbe gücünün hemen üstüne ayarlayın.", + "label": "Maks. Kırışıklık Önleme Gücü" + }, + "auto_label_confidence": { + "doc": "Döngü sonundaki maç skoru bu seviyede veya üzerindeyse program herhangi bir onay istemi olmadan otomatik olarak etiketlenir. Otomatik etiketlemeden önce daha yüksek kesinlik gerektirecek şekilde yükseltin; daha fazlasını otomatikleştirmek için düşürün. Altındaki Learning Confidence ile birlikte çalışır.", + "label": "Otomatik Etiket Güveni" + }, + "auto_maintenance": { + "doc": "Gecelik temizlik yapın: profil zarflarını yeniden oluşturun, döngü sağlığını yeniden hesaplayın, hata ayıklama izlerini budayın ve en son döngüleri koruyun.", + "label": "Otomatik Bakım (gece temizliği)" + }, + "completion_min_seconds": { + "doc": "Bundan daha kısa döngüler hayalet döngüler olarak atılır (test çalıştırmaları, çorap eklemek için kapıyı açma).", + "label": "Min. Döngü Süresi" + }, + "delay_confirm_seconds": { + "doc": "Cihazın çalışmak yerine başlamayı bekliyor olarak değerlendirilmesi için gücün bu süre boyunca bekleme bandında kalması gerekir.", + "label": "Onay Saniyeleri" + }, + "delay_start_detect_enabled": { + "doc": "Cihazın ne zaman açık olduğunu ve beklediğini (gecikmeli başlatma / bekleme) ancak kendi döngüsüne başlamadığını tespit edin, böylece bekleme çekmesi bir çalışma döngüsüyle karıştırılmaz.", + "label": "Gecikmeli Başlatma Algılamayı Etkinleştir" + }, + "delay_timeout_hours": { + "doc": "Bu kadar saatten sonra gecikmeli başlatma modunda beklemeyi bırakın ve boşta çalışmaya dönün; böylece, açık bırakılan ancak hiç başlatılmayan bir makine sonsuza kadar beklemez.", + "label": "Zaman Aşımı Saatleri" + }, + "device_type": { + "doc": "Cihaz sınıfı. Söz konusu cihaz türü için ayarlanmış mantıklı algılama varsayılanlarını (eşikler, düşmede gecikme, son işleme) ayarlar; bunu yalnızca aygıt başlangıçta yanlış türde ayarlanmışsa değiştirin.", + "label": "Cihaz Türü" + }, + "door_sensor_entity": { + "doc": "Opsiyonel kapı ikili sensörü. Bir döngüden sonra cihazın ne zaman açıldığını/boşaltıldığını tespit etmek için kullanılır.", + "label": "Kapı Sensörü Varlığı" + }, + "duration_tolerance": { + "doc": "Kalan zaman tahminlerine yönelik tolerans (öğrenme geri bildirimi, eşleşme değil). Gerçek süre tahminin +/-%X'i dahilindeyse, iyi bir eşleşme olarak sayılır.", + "label": "Tahmin Toleransı" + }, + "enable_ml_models": { + "doc": "Bir döngü çalışırken, modellerin canlı sonuçları iyileştirmesine izin verin: daha istikrarlı bir kalan süre ve enerji/maliyet tahmini ve son tespitte erken durdurma önleme koruması (bir bitişi yalnızca geciktirebilir, hiçbir zaman erken bitiremez ve sınırlıdır). Mümkün olduğunda ince ayarlı modellerinizi, aksi takdirde yerleşik olanları kullanır. Kapalı = yalnızca klasik güç tabanlı mantık (hala güvenilir).", + "label": "Döngü sırasında akıllı modelleri uygula" + }, + "end_energy_threshold": { + "doc": "Düşmede gecikme geri sayımı sırasında biriken enerji (watt x zaman) bu eşikle karşılaştırılır. Aşılması durumunda geri sayım sıfırlanır; kırışık önleyici tamburlar ve bulaşık makinesi kurutma kuyrukları kısa kesilmek yerine döngüye bağlı kalır. Soğutma sırasında döngüler çok erken biterse yükseltin; algılama yavaşsa düşürün.", + "label": "Bitiş Enerjisi" + }, + "end_repeat_count": { + "doc": "Döngü sona ermeden önce gereken ardışık durma eşiği altı okumalarının sayısı. Çoğu fiş için 1 uygundur. Akıllı priziniz ara sıra döngünün ortasında yanlış sıfır örneği bildiriyorsa ve döngüleriniz zamanından önce sona eriyorsa 2-3'e yükseltin.", + "label": "Bitiş Tekrar Sayısı" + }, + "energy_price_entity": { + "doc": "kWh başına güncel elektrik fiyatını gösteren sensör (örn. dinamik tarife). Aşağıdaki statik fiyata göre önceliklidir. Her döngü bittiğinde geçerli olan fiyat dondurulur.", + "label": "Enerji Fiyatı Varlığı" + }, + "energy_price_static": { + "doc": "Yukarıda hiçbir canlı fiyat varlığı belirlenmediğinde maliyet rakamları için kullanılan kWh başına sabit fiyat.", + "label": "Sabit Enerji Fiyatı (kWh başına)" + }, + "energy_sensor": { + "doc": "İsteğe bağlı kümülatif enerji sayacı (total_increasing kWh/Wh, örn. prizin kendi ömür boyu sayacı). Ayarlandığında, her döngünün raporlanan enerjisi bu sayacın baştan sona olan farkından alınır; bu da yavaş raporlayan bir güç sensörünün integralini almaktan kaynaklanan eksik sayımı önler. Okuma eksikse, birimi bilinmiyorsa veya fark pozitif değilse integral alınmış değere geri döner. Güç sensörünün integralini almaya devam etmek için boş bırakın.", + "label": "Enerji Sayacı Varlığı" + }, + "expose_debug_entities": { + "doc": "Ekstra teşhis HA varlıkları yayınlayın (eşleşme güveni, belirsizlik, dahili durum bilgileri). Kapalı, varlık listesini normal kullanım için temiz tutar.", + "label": "Hata Ayıklama Varlıklarını Göster" + }, + "external_end_trigger": { + "doc": "Durum değişikliği döngünün sonunu işaret eden ikili sensör (örneğin, cihazın \"tamamlanmış\" kontağı veya tamamlayıcı entegrasyon).", + "label": "Harici Tetikleyici Varlığı" + }, + "external_end_trigger_enabled": { + "doc": "Yerleşik güç tabanlı algılamaya ek olarak harici bir ikili sensörün döngünün sonunu bildirmesine izin verin.", + "label": "Harici Bitiş Tetikleyicisini Etkinleştir" + }, + "external_end_trigger_inverted": { + "doc": "Tetik sensörünün KAPALI duruma geçmesini (AÇIK yerine) döngü sonu sinyali olarak değerlendirin.", + "label": "Harici Tetikleyiciyi Tersine Çevir (KAPALI'da tetikle)" + }, + "learning_confidence": { + "doc": "Eşleşme puanı bu ile Otomatik Etiket Güveni arasında kalırsa, bir geri bildirim bildirimi tanımlanan programı doğrulamanızı ister. Bu skorun altında maç yüzeye çıkamayacak kadar belirsiz. Otomatik Etiket Güveninin altında tutulmalıdır.", + "label": "Öğrenme Güveni" + }, + "linked_device": { + "doc": "İsteğe bağlı olarak bu WashData cihazını, HA cihaz kaydında \"Bağlandı ...\" olarak gösterilen başka bir cihazın (örn. akıllı priz) altına yerleştirin.", + "label": "Cihaz Altında Grupla" + }, + "min_off_gap": { + "doc": "Makine bu süreden daha kısa bir süre kapanırsa açma/kapama/açma sırası tek bir sürekli döngü olarak değerlendirilir. Islatma programlarının (makine yıkamanın ortasında birkaç dakika süreyle kapanır) iki ayrı programa bölünmesini önler. Bunların ayrı döngüler olarak sayılmasını istiyorsanız, arka arkaya yükleriniz arasındaki boşluktan daha kısa ayarlayın. Cihaz tipi varsayılanları, her cihaz için tipik döngü içi duraklamayı korur.", + "label": "Min. Kapalı Aralık" + }, + "min_power": { + "doc": "Mutlak minimum gücün aktif olduğu kabul edilir. Bunun altındaki okumalar 0 W (bekleme) olarak kabul edilir ve akıllı prizlerin ve bekleme LED'lerinin hayalet yükü filtrelenir.", + "label": "Minimum Güç" + }, + "ml_training_enabled": { + "doc": "İncelenen döngülerinizi gece boyunca periyodik olarak inceleyin ve modellerde bu özel makineye göre ince ayar yapın. Bir değişiklik yalnızca uzayan döngülerde gerçekten daha iyi puan aldığında korunur, bu nedenle bu yalnızca yardımcı olabilir veya aynı kalabilir; asla gerilemez.", + "label": "Bu makineden öğren" + }, + "ml_training_hour": { + "doc": "Gece ince ayarını yapmak için günün yerel saati (0-23). 2 (02:00) gibi sessiz bir saat seçin.", + "label": "Saatte öğren" + }, + "ml_training_interval_days": { + "doc": "Gelişmeleri en fazla bu kadar günde bir kez yeniden kontrol edin.", + "label": "En fazla her seferinde kontrol et" + }, + "ml_training_min_cycles": { + "doc": "İnce ayar yapmadan önce en azından bu sayıda döngü kaydedilene kadar bekleyin, böylece öğrenilecek yeterli şey olur.", + "label": "Önce gereken döngüler" + }, + "name": { + "doc": "HA entegrasyonları listesinde ve cihaz kayıt defterinde gösterilen görünen ad.", + "label": "Cihaz Adı" + }, + "no_update_active_timeout": { + "doc": "Çalışırken bu kadar uzun süre güç güncellemesi gelmezse, fişin çevrimdışı olduğunu varsayalım ve bir zombi döngüsünden kaçınmak için zorla durdurun. Varsayılan 600 sn, bulut veya ağ gecikmesine izin verir.", + "label": "Güncelleme Yok Zaman Aşımı" + }, + "notify_before_end_minutes": { + "doc": "Tahmini kalan süre bunun altına düştüğünde Neredeyse Bitti uyarısı gönderin. 0 bunu devre dışı bırakır.", + "label": "Bitiş Öncesi Uyarı" + }, + "notify_channel": { + "doc": "Başlat/canlı mesajlar için Android bildirim kanalı adı (kanal başına sesi ve mobil uygulamada önceliği kontrol eder). Blank, tamamlayıcı uygulama varsayılanını kullanır.", + "label": "Android Kanalı (başlangıç/canlı)" + }, + "notify_cycle_timers": { + "doc": "Bir döngünün belirli dakikalarında bildirimler (örneğin yumuşatıcı eklemek için). Mesaj {device}, {program}, {minutes}'yi destekliyor. Bu noktada duraklatmak ve Devam Et düğmesiyle etkileşimli bir bildirim almak için Otomatik duraklatmayı etkinleştirin; panel, duraklatma/devam ettirme hizmeti veya bildirim eylemi aracılığıyla devam ettirebilirsiniz.", + "label": "Döngü Zamanlayıcıları" + }, + "notify_finish_channel": { + "doc": "Bitiş mesajı için Android bildirim kanalı adı. Boş, başlangıç/canlı kanalını yeniden kullanır.", + "label": "Android Kanalı (bitiş)" + }, + "notify_finish_message": { + "doc": "Bir döngü bittiğinde gönderilen gövde metni. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}. Burada en kullanışlı olanlar {time_finished} ve {vs_typical}.", + "label": "Bitiş Mesajı" + }, + "notify_finish_services": { + "doc": "notify.* Bir döngü bittiğinde çağrılan hizmetler. Hedef başına bir tane ekleyin; bitiş bildirimi yoksa boş bırakın.", + "label": "Bitiş Servisleri" + }, + "notify_fire_events": { + "doc": "Ayrıca döngü başlangıcında/bitişinde ha_washdata_* olaylarını tetikleyin, böylece kendi otomasyonlarınızı oluşturabilirsiniz.", + "label": "Bildirimler için HA Olayları Tetikle" + }, + "notify_icon": { + "doc": "Bildirim için isteğe bağlı mdi simgesi (ör. mdi:çamaşır makinesi). Platform varsayılanı için boş bırakın.", + "label": "Bildirim Simgesi" + }, + "notify_live_chronometer": { + "doc": "Bildirimde statik bir tahmin yerine (bunu destekleyen platformlarda) canlı güncellenen bir geri sayım sayacı gösterin.", + "label": "Canlı Kronometre Kullan" + }, + "notify_live_interval_seconds": { + "doc": "Bir döngü çalışırken canlı ilerleme bildirimlerinin ne sıklıkla yenilendiği.", + "label": "Canlı Güncelleme Aralığı" + }, + "notify_live_overrun_percent": { + "doc": "Bir döngü, tahminini bu yüzdeden daha fazla aşarsa, bir taşma uyarısı gönderin.", + "label": "Uyarı Öncesi Canlı Aşım %" + }, + "notify_live_services": { + "doc": "notify.* hizmetleri, bir döngü çalışırken canlı ilerleme güncellemeleri için çağrıda bulundu. Canlı ilerleme bildirimlerini devre dışı bırakmak için boş bırakın.", + "label": "Canlı İlerleme Servisleri" + }, + "notify_only_when_home": { + "doc": "Yalnızca bağlantılı kişilerden (yukarıdaki) en az biri evde olduğunda bildirim gönderin.", + "label": "Yalnızca Evdeyken Bildir" + }, + "notify_people": { + "doc": "kişi.* \"Yalnızca Evdeyken Bildir\" tarafından evde kimsenin olup olmadığına karar vermek için kullanılan varlıklar.", + "label": "Kişiler (Evde İken için)" + }, + "notify_pre_complete_message": { + "doc": "Bitiş öncesi / neredeyse tamam uyarısının gövde metni. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Bitiş Öncesi Mesaj" + }, + "notify_reminder_message": { + "doc": "Hâlâ bekleyen boşaltma hatırlatıcısının gövde metni. Boş bırakmak yerleşik varsayılanı kullanır. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Hatırlatıcı Mesaj" + }, + "notify_start_message": { + "doc": "Bir döngü başladığında gönderilen gövde metni. Şablon değişkenleri: {device}, {duration}, {minutes}, {program}, {energy_kwh}, {cost}, {time_finished}, {vs_typical}, {cycle_count}.", + "label": "Başlangıç Mesajı" + }, + "notify_start_services": { + "doc": "notify.* Bir döngü başladığında çağrılan hizmetler. Hedef başına bir tane ekleyin (telefon, kontrol paneli vb.); Başlatma bildirimi için boş bırakın.", + "label": "Başlangıç Servisleri" + }, + "notify_timeout_seconds": { + "doc": "Bu kadar saniye sonra bildirimi otomatik olarak kapat (bunu destekleyen platformlarda). 0 manuel olarak kapatılana kadar bunu korur.", + "label": "Sonra Otomatik Kapat" + }, + "notify_title": { + "doc": "Bildirim başlığı. Şablon değişkenleri: {device}, {program}, {duration}, {energy}, {cost}, {date}, {time}, {minutes}.", + "label": "Bildirim Başlığı" + }, + "notify_unload_delay_minutes": { + "doc": "Hala bekleyen \"makineyi boşaltın\" hatırlatıcısı gönderilmeden önce bir döngü bittikten dakikalar sonra. Hatırlatıcıyı devre dışı bırakmak için 0'a ayarlayın.", + "label": "Boşaltma Hatırlatıcısı Gecikmesi" + }, + "notify_unload_repeat": { + "doc": "Kapıyı açana veya bildirimdeki \"Hatırlatmayı durdur\" düğmesine dokunana kadar boşaltma hatırlatıcısını \"Boşaltma Hatırlatıcısı Gecikmesi\" dakikada bir yeniden gönderir. Bir Kapı Sensörü Varlığı gerektirir (hatırlatıcının kendisi de gerektirir). Kapatma düğmesi Home Assistant refakatçi uygulaması (mobil) bildirimlerinde çalışır.", + "label": "Kapı Açılana Kadar Tekrarla" + }, + "off_delay": { + "doc": "Güç kesildikten sonra döngünün bittiğini bildirmeden önce beklenecek süre. Bu pencerede güç yeniden gelirse döngü sorunsuz bir şekilde devam eder; bu, yıkama aşamaları arasındaki duraklamaları köprüler. Bulaşık makinelerinin kurutma aşamaları uzundur (20-60 dakika boyunca güç kapalıdır), bu nedenle, tüm yıkama+kuruluğun tek bir döngüde tutulması için kapatma gecikmesinin bunu aşması gerekir.", + "label": "Kapatma Gecikmesi" + }, + "pause_cuts_power": { + "doc": "Bir döngü duraklatıldığında aşağıdaki Anahtar Varlığını da kapatın. Yalnızca kullanım süresinin ortasında fişi güvenli bir şekilde kesilebilen cihazlar için.", + "label": "Duraklatma Gücü de Keser (anahtar üzerinden)" + }, + "power_off_delay": { + "doc": "Bir döngü bittikten sonra durumun Kapalı'ya dönmesinden önce gücün Güç Kapatma Eşiği'nin altında ne kadar süre kalması gerektiğidir. Yalnızca Güç Kapatma Eşiği 0'ın üzerindeyken kullanılır. Arka plan döngüsünde denetlendiğinden, geçerli gecikme bir sonraki durum sona erme adımına yukarı yuvarlanır.", + "label": "Güç Kapatma Gecikmesi" + }, + "power_off_threshold_w": { + "doc": "Güce dayalı isteğe bağlı Kapalı algılama. 0'ın üzerinde olduğunda, bir döngü bittikten sonra güç, Güç Kapatma Gecikmesi süresince bu seviyenin altında kalırsa makine kapatılmış sayılır ve durum Kapalı'ya döner. Devre dışı bırakmak için 0'da bırakın (varsayılan). Bu değeri, gerçek kapalı taban değerinin üzerinde ve Durdurma Eşiği ile makinenizin bittiği hâlde açık kalan bekleme tüketiminin altında ayarlayın; Durdurma Eşiği'nin altında değilse yok sayılır. Etkinleştirildiğinde, Kapalı'ya dönmek için İlerleme Sıfırlama Gecikmesi'nin yerini alır; böylece biten bir makine, gerçekten kapatılana kadar Bitti/Temiz durumunda kalır.", + "label": "Güç Kapatma Eşiği" + }, + "power_sensor": { + "doc": "Bu cihaz için canlı gücü watt cinsinden bildiren sensör varlığı (ör. sensör.washer_power). Tüm döngü tespiti bu sinyale dayanır.", + "label": "Güç Sensörü" + }, + "profile_duration_tolerance": { + "doc": "Eşleştirme sırasında kullanılan profil ortalama süresi etrafındaki +/- bandı. 0,25, 60 dakikalık bir profilin 45-75 dakikalık döngülerle eşleştiği anlamına gelir.", + "label": "Profil Süre Toleransı" + }, + "profile_match_interval": { + "doc": "Çalışan bir döngü sırasında profil eşleştirmenin ne sıklıkla deneneceği. Varsayılan 300 sn (5 dakika), algılama hızını ve CPU'yu dengeler.", + "label": "Eşleşme Aralığı" + }, + "profile_match_max_duration_ratio": { + "doc": "Profile göre maksimum döngü uzunluğu. 1.3, bir döngünün eşleşmesi için profil süresinin %130'unun altında olması gerektiği anlamına gelir.", + "label": "Maks. Süre Oranı" + }, + "profile_match_min_duration_ratio": { + "doc": "Profile göre minimum döngü uzunluğu. 0,9, bir döngünün eşleşmesi için profil süresinin en az %90'ı olması gerektiği anlamına gelir.", + "label": "Min. Süre Oranı" + }, + "profile_match_threshold": { + "doc": "Bir program tanımlamasını kabul etmek için döngü sonunda gereken minimum benzerlik puanı (0-1). Yanlış tanımlamaları azaltmak için kaldırın; makinenizin programları eşleşmiyorsa düşürün. Varsayılan 0,4 ihtiyatlı bir başlangıç ​​noktasıdır.", + "label": "Eşleşme Eşiği" + }, + "profile_unmatch_threshold": { + "doc": "Canlı bir döngü ortası maçı bu puanın altına düşerse, geçici tanımlama silinir. Eşleşme Eşiğinin biraz altında tutun, böylece benzerlikteki kısa bir düşüş, ekranı tekrar benzersiz hale getirmez.", + "label": "Eşleşmeme Eşiği" + }, + "progress_reset_delay": { + "doc": "Bitirdikten sonra, bu süre boyunca ilerlemeyi %100'de tutun; böylece Tamamlandı, Boşta durumuna sıfırlamadan önce kontrol panellerinde görünür.", + "label": "İlerleme Sıfırlama Gecikmesi" + }, + "pump_stuck_duration": { + "doc": "Bir pompa, muhtemelen sıkışmış olarak işaretlenmeden önce sürekli olarak çalışabilir (sıkışmış pompa olayını tetikler).", + "label": "Pompa Takılma Süresi" + }, + "running_dead_zone": { + "doc": "Bir döngü başladıktan sonra bu penceredeki güç düşüşleri dikkate alınmaz. Çamaşır makineleri soğuk suyla doluyor (ısıtmadan önce neredeyse 0 W'a düşüyor) - bu koruma olmadan dolum aşaması bir döngü sonu gibi görünür. Bu, verileri atlamaz: tam güç takibi T=0'dan itibaren kaydedilir. Öneri motoru, makinenizin gerçek başlatma düzenini ölçer ve bunu otomatik olarak boyutlandırır.", + "label": "Çalışma Ölü Bölgesi" + }, + "sampling_interval": { + "doc": "Sensör okumaları arasında beklenen süre - yumuşatma penceresini boyutlandırmak ve geri dönmeyi doğru şekilde başlatmak için kullanılır. Her sensör güncellemesi bu değere bakılmaksızın yakalanır; yalnızca aşağı yöndeki hesaplamaları kalibre eder. Öneri motoru, sensörünüzün geçmiş döngülerdeki gerçek temposunu ölçer ve bunu otomatik olarak ayarlar.", + "label": "Örnekleme Aralığı" + }, + "save_debug_traces": { + "doc": "Her döngü için tam güç takibini ve eşleşen hata ayıklama verilerini saklayın. Sorun giderme için kullanışlıdır ancak depolama boyutunu artırır.", + "label": "Hata Ayıklama İzlerini Kaydet" + }, + "smoothing_window": { + "doc": "Ham güç sinyalinin ne kadar yumuşatıldığı. Düşük (2) duyarlıdır ancak gürültülüdür; yüksek (5) ani artışları yumuşatır ancak gecikme ekler.", + "label": "Yumuşatma Penceresi" + }, + "start_duration_threshold": { + "doc": "Gerçek bir başlatmayı onaylamak için gücün, başlatma eşiğinin bu kadar uzun süre üzerinde kalması gerekir; böylece anlık açma/kapama geçişlerinin bir döngü başlatması önlenir.", + "label": "Başlangıç Süresi" + }, + "start_energy_threshold": { + "doc": "Cihazın ÇALIŞMADAN önce tüketmesi gereken enerji (güç x süre). Kısa bir yüksek güçlü ani yükselişin enerjisi çok düşüktür ve dikkate alınmaz, böylece hatalı başlatmalar önlenir.", + "label": "Başlangıç Enerjisi" + }, + "start_threshold_w": { + "doc": "Bir döngünün başladığını doğrulamak için gücün bu seviyenin üzerine çıkması gerekir. Çok düşük bir değere ayarlanması, bekleme gücünden hatalı başlatmalara neden olur; çok yüksek ve yavaş başlayan programlar (soğuk dolum) kaçırılır. Öneri motoru bunu makinenin gözlemlenen en düşük aktif gücünün hemen üzerine ayarlar.", + "label": "Başlangıç Eşiği" + }, + "stop_threshold_w": { + "doc": "Düşmede gecikme geri sayımı başlamadan önce güç bu seviyenin altına düşmelidir. Bunu Başlangıç ​​Eşiğinin altına ayarlayın; aralarındaki boşluk, titremeyi önleyen histerezis bandıdır. Çok yükseğe ayarlanırsa, düşük güçlü fazlar (durulamada bekletme, kırışık önleme) hatalı şekilde bitiş sırasını tetikler.", + "label": "Durdurma Eşiği" + }, + "switch_entity": { + "doc": "İsteğe bağlı anahtar, duraklatma durumunda kapatılır ve devam ederken tekrar açılır; \"Duraklatma aynı zamanda gücü de keser\" ile birlikte kullanılır.", + "label": "Anahtar Varlığı" + }, + "watchdog_interval": { + "doc": "Arka plan gözlemcisinin durmuş sensörleri ve geçen zaman aşımlarını ne sıklıkla kontrol ettiği. Varsayılan 30 sn.", + "label": "Bekçi Aralığı" + }, + "notify_milestone_message": { + "doc": "Kilometre taşı bildirimi için mesaj. Şablon değişkenleri: {device}, {cycle_count}.", + "label": "Kilometre Taşı Mesajı" + }, + "notify_milestones": { + "doc": "Ulaşıldığında bir kerelik kutlama bildirimi tetikleyen, virgülle ayrılmış döngü sayıları (örn. 50, 100, 500, 1000). Boş bırakmak kilometre taşı bildirimlerini devre dışı bırakır.", + "label": "Döngü Kilometre Taşları" + }, + "notify_quiet_end_hour": { + "doc": "Rahatsız etmeyin aralığının sonu (0-23). Bekletilen bildirimler bu saatte iletilir. Devre dışı bırakmak için boş bırakın.", + "label": "Sessiz Saatler Sonu" + }, + "notify_quiet_start_hour": { + "doc": "Rahatsız etmeyin aralığının başlangıcı (0-23). Sessiz saatlerde gönderilecek bitiş, hatırlatma ve temiz çamaşır bildirimleri bekletilir ve aralık bittiğinde iletilir. Devre dışı bırakmak için boş bırakın. Gece yarısını geçen aralıkları destekler (örn. başlangıç 22, bitiş 7).", + "label": "Sessiz Saatler Başlangıcı" + }, + "peak_rate_message": { + "doc": "Başlangıç bildirimine eklenen yüksek tarife ipucu için isteğe bağlı özel metin. Şablon değişkenleri: {device}, {price}. Boş bırakmak yerleşik varsayılanı kullanır.", + "label": "Yüksek Tarife Mesajı" + }, + "peak_rate_threshold": { + "doc": "Bir döngü başladığında ve kWh başına geçerli fiyat bu değere eşit veya bu değerin üzerindeyse, başlangıç bildirimine bir yüksek tarife ipucu eklenir. 0 veya boş bırakmak ipucunu devre dışı bırakır.", + "label": "Yüksek Tarife Eşiği (kWh başına)" + }, + "dtw_bandwidth": { + "label": "Şekil eşleştirme toleransı", + "doc": "Eşleştiricinin, kaydedilmiş bir programın şekline uyması için bir döngüyü zaman içinde ne kadar bükebileceği. Daha yüksek değer daha fazla hız değişimini tolere eder; çok yüksek olması yanlış programı eşleştirme riski taşır." + }, + "corr_weight": { + "label": "Şekil ve düzey ağırlığı", + "doc": "Bir eşleşme puanlanırken eğri şekli ile mutlak güç düzeyi arasındaki denge. Daha yüksek değer şekli tercih eder; daha düşük değer güç düzeyinin eşleştirilmesini tercih eder." + }, + "duration_weight": { + "label": "Süre ağırlığı", + "doc": "Tipik çalışma süresi bu döngüyle eşleşen bir programın ne kadar güçlü tercih edileceği." + }, + "energy_weight": { + "label": "Enerji ağırlığı", + "doc": "Tipik enerji tüketimi bu döngüyle eşleşen bir programın ne kadar güçlü tercih edileceği." + }, + "store_brand": { + "label": "Cihaz Markası", + "doc": "İsteğe bağlı. Topluluk kataloğundan seçilen cihaz markası. Eşleşen referans kayıtlarını bulmak ve paylaşmak için kullanılır. Çevrimiçi özellikleri kullanmıyorsanız boş bırakın." + }, + "store_model": { + "label": "Cihaz Modeli", + "doc": "İsteğe bağlı. Bir marka ayarlandığında topluluk kataloğundan seçilen cihaz modeli. Modeliniz listede yoksa kataloğa ekleyebilirsiniz." + }, + "show_contributor": { + "doc": "Topluluk cihazlarında ve referans döngülerinde \"- \" özelliğini göster." + }, + "enable_phase_matching": { + "label": "Aşama farkındalıklı kalan süre", + "doc": "Çalışan her çevrimi aşamalara (ısıtma, yıkama, sıkma) böler ve kalan süreyi aşama başına ayırarak klasik tahminle harmanlar - çevrimin başında aşama bütçesine, sona yaklaşırken klasik tahmine ağırlık verir. Bu, geri sayımı makinenizin gerçekte ne kadar ısıttığına ve çalıştığına göre kişiselleştirir; en çok çevrimin ilk yarısında fark edilir. Kapalı = yalnızca klasik tahmin. Yalnızca kalan süre göstergesi etkilenir; program eşleştirme ve çevrim algılama değişmez." + }, + "keep_min_score": { + "label": "Min. Eşleşme Puanı", + "doc": "Bir adayın eşleşme yarışında kalabilmesi için gereken minimum benzerlik puanı. Varsayılan 0.1 kasıtlı olarak gevşektir - zayıf adayları bile kabul eder ve en iyi eşleşmeyi sonraki aşamalara bırakır. Olası olmayan profilleri daha erken elemek için artırın; başlangıç aday havuzunu genişletmek için azaltın." + }, + "dtw_blend": { + "label": "Büküm Karışımı", + "doc": "Zaman bükme (DTW) hizalama puanının Aşama 2 çekirdek puanını ne ölçüde değiştirdiği. 0 = yalnızca Aşama 2 puanı, 1 = yalnızca DTW puanı, 0.5 (varsayılan) = eşit karışım. Programların güç düzeyleri benzer ancak zamanlama kalıpları farklıysa büküm hizalamasına daha fazla güvenmek için artırın." + }, + "dtw_ensemble_w": { + "label": "Büküm Topluluk Karışımı", + "doc": "Topluluk DTW modunda (varsayılan), ölçeklendirilmiş L1 ile türev DTW (DDTW) arasındaki ağırlık. 1.0 = tamamen ölçeklendirilmiş-L1, 0 = tamamen DDTW, 0.7 = varsayılan. Ölçeklendirilmiş-L1 değişkeni güç düzeylerini karşılaştırır; türev değişkeni gücün zaman içinde nasıl değiştiğine tepki verir. Topluluk her ikisini de birleştirir." + }, + "dtw_ddtw_scale": { + "label": "Türev Büküm Ölçeği", + "doc": "Türev DTW puanlaması için yarı doygunluk mesafesi. DDTW mesafesi bu değere eşit olduğunda puan yarıya düşer. Küçük = şekil farklılıklarına daha duyarlı. Varsayılan 30, tipik ev aletleri güç izleri için kalibre edilmiştir. Yalnızca topluluk ve ddtw DTW modlarını etkiler." + }, + "dtw_refine_top_n": { + "label": "Büküm Yeniden Skor Sayısı", + "doc": "Kaç üst Aşama 2 adayı DTW tarafından yeniden puanlandırılır. DTW daha pahalıdır, bu nedenle yalnızca en iyi N adaya uygulanır. Varsayılan 5. Doğru profil bazen Aşama 2'den sonra yalnızca 4. veya 5. sıraya geliyorsa artırın (7-9'a) - DTW onu kurtarabilir. Azaltmak eşleşmeyi biraz hızlandırır." + }, + "duration_scale": { + "label": "Süre Keskinliği", + "doc": "Aşama 4 süre uyumu cezasının keskinliği. Bu, uyum puanının yarıya düştüğü logaritmik orandır. Küçük = daha sert: bir süre uyumsuzluğu daha fazla zarara yol açar. Varsayılan 0.175, yarı ağırlıkta yaklaşık %18 süre toleransına karşılık gelir. Süre Ağırlığı ile birlikte kullanın." + }, + "energy_scale": { + "label": "Enerji Keskinliği", + "doc": "Aşama 4 enerji uyumu cezasının keskinliği. Küçük = daha sert: bir enerji uyumsuzluğu daha fazla zarara yol açar. Varsayılan 0.25, enerji yükle değiştiğinden Süre Keskinliğinden kasıtlı olarak daha gevşektir. Enerji Ağırlığı ile birlikte kullanın." + }, + "power_profile_interval_min": { + "label": "Güç Profili Aralığı", + "doc": "EMHASS ve tibber_prices gibi harici planlayıcılar tarafından kullanılan düz slot başına ortalama watt dizisi olan power_profile sensör özelliği için kova boyutu. Küçük kovalar kısa güç ani artışlarını keskin tutar; büyük kovalar şekli düzler. Varsayılan 15 dakika. Yalnızca okuma zamanında kullanılır; algılamayı etkilemez." + }, + "notify_live_sticky": { + "label": "Dokunuşta Canlı Bildirimi Koru", + "doc": "Yalnızca Android. Canlı ilerleme bildirimini kalıcı (yapışkan) hale getirerek üzerine dokunulduğunda devam eden bildirimin kapatılmasını önleyin. Kapalı olduğunda dokunmanın bildirimi kapattığı varsayılan davranış korunur." + }, + "notify_live_click_action": { + "label": "Canlı Bildirim Dokunma Hedefi", + "doc": "Yalnızca Android. Canlı ilerleme bildirimine dokunulduğunda açılan yer (örn. /lovelace/laundry veya tam URL), uygulama açılış sayfası yerine. Varsayılan için boş bırakın." + }, + "door_opens_at_end": { + "label": "Döngü Sonunda Kapı Otomatik Açılır", + "doc": "Döngü sonunda kurutmak için kapıyı açan (AirDry ve benzeri) bulaşık makineleri için. Bu açıkken, çalışan bir döngüde kapının açılması onu sonsuza kadar duraklatmaz; bunun yerine kapı aşağıdaki bekleme süresi kadar açık kalırsa WashData döngüyü tamamlanmış sayar. Kısa bir açılma (nesne ekleme) dikkate alınmaz. Kapı Sensörü Varlığı gerektirir." + }, + "door_end_dwell_seconds": { + "label": "Kapı Açık Bekleme Süresi", + "doc": "\"Döngü Sonunda Kapı Otomatik Açılır\" açık olduğunda WashData'nın döngüyü sonlandırması için kapının ne kadar süre açık kalması gerektiği. Bir tabağı hızla eklemeyi göz ardı edecek kadar uzun (varsayılan 60 sn), makine kapıyı açtıktan sonra zamanında sona erecek kadar kısa." + }, + "dishwasher_end_spike_quiet_release": { + "label": "Pasif Kurutma Sessiz Serbest Bırakma", + "doc": "Döngü beklenen süresini aştıktan sonra, WashData bir son tahliye beklemeyi bırakıp döngüyü sonlandırmadan önce bulaşık makinesinin ne kadar süre sessiz (Durdurma Eşiği'nin altında) kalması gerektiğidir. Makineniz, gecikmeli bir son tahliyeden önce uzun ve sessiz bir kurutma aşamasına sahipse ve bu tahliye kaçırılıyorsa değeri artırın - daha geniş bir pencere, öğrenilen sürenin eski ortalamaya kilitlenmek yerine mevsimsel kaymayı (daha soğuk şebeke suyu = daha uzun döngüler) izlemesini sağlar. Bu ayar, dahili 30 dakikalık son tahliye tepesi sınırına göre beklemeyi yalnızca kısaltabilir, asla uzatamaz." + } + }, + "setting_group": { + "auto_labeling": { + "label": "Otomatik Etiketleme" + }, + "cycle_end": { + "label": "Döngü Sonu" + }, + "cycle_start": { + "label": "Döngü Başlangıcı" + }, + "cycle_timers": { + "label": "Döngü Zamanlayıcıları" + }, + "data_management": { + "label": "Veri Yönetimi" + }, + "debug": { + "label": "Hata Ayıklama" + }, + "dishwasher_end": { + "label": "Bulaşık Makinesi Sonu" + }, + "door_pause": { + "label": "Kapı & Duraklatma" + }, + "dtw_refinement": { + "label": "DTW İyileştirme" + }, + "duration_gates": { + "label": "Süre Kapıları" + }, + "energy": { + "label": "Enerji" + }, + "external_end_trigger": { + "label": "Harici Bitiş Tetikleyicisi" + }, + "housekeeping": { + "label": "Bakım" + }, + "match_scoring": { + "label": "Eşleşme Puanlaması" + }, + "messages": { + "label": "Mesajlar" + }, + "power_off": { + "label": "Güç Kapatma" + }, + "predictive_end": { + "label": "Tahmine Dayalı Bitiş" + }, + "schedule": { + "label": "Takvim" + }, + "services": { + "label": "Servisler" + }, + "signal_processing": { + "label": "Sinyal İşleme" + }, + "thresholds_gap": { + "label": "Eşikler & Aralık" + }, + "timing": { + "label": "Zamanlama" + }, + "unload_reminder": { + "label": "Boşaltma Hatırlatıcısı" + }, + "watchdog": { + "label": "Bekçi" + }, + "quiet_hours_milestones": { + "label": "Sessiz Saatler ve Kilometre Taşları" + }, + "device_info": { + "label": "Cihaz bilgileri" + }, + "basic_configuration": { + "label": "Temel yapılandırma" + } + }, + "status": { + "active": "Aktif", + "all_statuses": "Tüm durumlar", + "ambiguous": "Belirsiz", + "auto_detect": "Otomatik algıla", + "clear": "Temiz", + "completed": "Tamamlandı", + "fine_tuning": "ince ayar yapılıyor…", + "force_stopped": "Zorla durduruldu", + "idle": "Boşta", + "interrupted": "Kesintiye uğradı", + "ready": "İşlemeye hazır", + "recording": "Kaydediliyor", + "training": "Eğitiliyor…", + "saving": "Kaydediliyor…", + "rebuilding": "Yeniden oluşturuluyor…", + "analyzing": "Analiz ediliyor…", + "resetting": "Sıfırlanıyor…", + "reverting": "Geri alınıyor…", + "trimming": "Kırpılıyor…", + "splitting": "Bölünüyor…", + "deleting": "Siliniyor…", + "imported": "İçe aktarıldı" + }, + "tab": { + "advanced": "Gelişmiş", + "diagnostics": "Tanılamalar", + "history": "Döngüler", + "ml": "ML Eğitimi", + "pp_cleanup": "Temizlik", + "pp_manage": "Yönet", + "pp_overview": "Genel Bakış", + "pp_phases": "Aşamalar", + "profiles": "Profiller", + "settings": "Ayarlar", + "status": "Genel Bakış", + "subtab_phase_catalog": "Aşama Kataloğu", + "subtab_profiles": "Profiller", + "maintenance": "Bakım", + "playground": "Test Alanı", + "store": "Mağaza" + }, + "tag": { + "early_end": "Erken bitiş", + "late_start": "Geç başlangıç", + "merged": "Birleştirilmiş döngüler", + "noise": "Gürültü", + "sensor_gap": "Sensör boşluğu", + "split": "Bölünmüş döngü", + "wrong_profile": "Yanlış profil" + }, + "toast": { + "access_saved": "Erişim denetimi kaydedildi", + "all_wiped": "Tüm veriler silindi", + "analysis_complete_none": "Analiz tamamlandı: yeni öneri yok", + "auto_label_complete": "Otomatik etiketleme tamamlandı", + "automation_deleted": "Otomasyon silindi", + "correction_submitted": "Düzeltme gönderildi", + "cycle_deleted": "Döngü silindi", + "cycle_force_stopped": "Döngü zorla durduruldu", + "cycle_labelled": "Döngü etiketlendi", + "cycle_paused": "Döngü duraklatıldı", + "cycle_resumed": "Döngü devam ettirildi", + "cycle_trimmed": "Döngü kırpıldı", + "cycles_merged": "Döngüler birleştirildi", + "envelope_rebuilt": "Zarf yeniden oluşturuldu", + "envelopes_rebuilt": "Zarflar yeniden oluşturuldu", + "export_downloaded": "Dışa aktarma indirildi", + "feedback_all_dismissed": "Tüm geri bildirimler reddedildi", + "feedback_confirmed": "Geri bildirim onaylandı", + "feedback_dismissed": "Geri bildirim reddedildi", + "group_deleted": "Grup silindi", + "group_name_required": "Grup adı gerekli", + "group_saved": "Grup kaydedildi", + "import_successful": "İçe aktarma başarılı; entegrasyon yeniden yükleniyor", + "json_required": "JSON verisi gerekli", + "legacy_removed": "Eski eylemler kaldırıldı", + "logs_exported": "Günlükler dışa aktarıldı", + "matching_reverted": "Eşleşme ağırlıkları varsayılanlara döndürüldü", + "min_2_profiles": "Grup için en az 2 profil seçin", + "ml_training_no_improvement": "Eğitim tamamlandı: taban çizgisi korundu (iyileşme yok)", + "models_reverted": "Cihazdaki modeller taban çizgisine döndürüldü", + "name_required": "Ad gerekli", + "no_split_found": "Bölmek için boşta kalma aralığı bulunamadı", + "panel_settings_saved": "Panel ayarları kaydedildi", + "pg_preset_loaded": "\"{name}\" ön ayarı yüklendi", + "pg_preset_saved": "\"{name}\" ön ayarı kaydedildi", + "pg_sugg_loaded": "{n} önerilen değer yüklendi - karşılaştırmak için Test Alanı'nı çalıştırın", + "pg_sugg_ml_loaded": "{n} ML kalibre değer yüklendi - karşılaştırmak için Test Alanı'nı çalıştırın", + "phase_name_required": "Aşama adı gerekli", + "phase_updated": "Aşama güncellendi", + "phases_saved": "Aşamalar kaydedildi", + "preferences_saved": "Tercihler kaydedildi", + "profile_name_required": "Profil adı gerekli", + "profile_renamed": "Profil yeniden adlandırıldı", + "recording_discarded": "Kayıt iptal edildi", + "recording_saved": "Kayıt profile kaydedildi", + "recording_started": "Kayıt başladı", + "recording_stopped": "Kayıt durduruldu", + "review_saved": "İnceleme kaydedildi", + "settings_conflicts": "Kaydetmeden önce vurgulanan ayar çakışmalarını düzeltin.", + "settings_reverted": "Ayarlar geri yüklendi; entegrasyon yeniden yükleniyor", + "settings_saved": "Ayarlar kaydedildi; entegrasyon yeniden yükleniyor", + "suggestions_applied": "Öneriler uygulandı; entegrasyon yeniden yükleniyor", + "suggestions_dismissed": "Öneriler reddedildi", + "apply_failed": "Uygulama başarısız: {error}", + "delete_failed": "Silme başarısız: {error}", + "load_more_failed": "Daha fazlası yüklenemedi: {error}", + "maint_add_failed": "Kayıt eklenemedi: {error}", + "maint_added": "Bakım kaydı eklendi", + "maint_delete_failed": "Kayıt silinemedi: {error}", + "maint_deleted": "Bakım kaydı silindi", + "relabel_done": "{count} döngü yeniden etiketlendi", + "relabel_failed": "Yeniden etiketleme başarısız: {error}", + "reminders_save_failed": "Hatırlatıcılar kaydedilemedi: {error}", + "reminders_saved": "Servis hatırlatıcıları kaydedildi", + "pause_no_cycle": "Duraklatılacak etkin döngü yok", + "resume_no_cycle": "Sürdürülecek duraklatılmış döngü yok", + "delete_partial_failed": "Bazı öğeler silinemedi ve geri yüklendi", + "pg_run_gone": "Bu çalıştırma artık mevcut değil.", + "task_cancelled": "İptal edildi.", + "processed": "{bits} işlendi", + "processed_cycles": "{n} döngü", + "processed_suggestions": "{n} öneri", + "processed_models": "{n} yükseltilmiş model", + "store_search_failed": "Arama başarısız: {error}", + "store_connect_failed": "Bağlantı başarısız: {error}", + "store_connected": "Topluluk mağazasına bağlanıldı", + "store_disconnected": "Topluluk mağazasıyla bağlantı kesildi", + "store_error": "Hata: {error}", + "store_unavailable": "Topluluk mağazası kullanılamıyor.", + "store_pick_profile": "Birleştirilecek bir profil seçin", + "store_name_required": "Bir profil adı girin", + "store_import_failed": "İçe aktarma başarısız: {error}", + "store_imported": "{profile} içine aktarıldı", + "store_program_required": "Bir program adı girin", + "store_no_appliance": "Önce cihaz markanızı ve modelinizi Ayarlar'da belirleyin.", + "store_share_failed": "Paylaşım başarısız: {error}", + "store_shared": "Topluluk mağazasında paylaşıldı, inceleme bekliyor.", + "appliance_added": "Cihaz eklendi, onay bekliyor", + "thanks_confirming": "Onayladığınız için teşekkürler", + "device_approved": "Topluluk tarafından onaylandı", + "rating_saved": "Kalite değerlendirmesi kaydedildi", + "brand_added": "Marka eklendi, onay bekliyor", + "profile_added": "Profil eklendi, onay bekliyor", + "saved_except_conflicts": "Kaydedildi. Geri kalanı kaydetmek için vurgulanan çakışmaları düzeltin.", + "share_device_none_sel": "Paylaşmak için en az bir döngü seçin", + "store_device_downloaded": "{p} program, {c} kayıt eklendi", + "store_device_downloaded_phases": "{p} program, {c} kayıt, {ph} faz haritası eklendi", + "store_device_downloaded_settings": "{p} program, {c} kayıt, {ph} faz haritası, {s} ayar eklendi", + "store_device_shared": "{n} döngü topluluk mağazasına paylaşıldı - inceleme bekleniyor.", + "store_device_shared_all_dup": "{n} döngünün tamamı zaten topluluk mağazasındaydı.", + "store_device_shared_partial": "{n} döngü paylaşıldı; {failed} yüklenemedi.", + "store_device_shared_some_dup": "{created} döngü paylaşıldı; {dup} zaten mağazadaydı.", + "store_download_failed": "İndirme başarısız: {error}", + "store_download_nothing": "İndirilecek yeni bir şey yok - bu kurulum zaten cihazınızda.", + "export_selective_done": "Dışa aktarma indirildi", + "import_selective_done": "{profiles} profil ve {cycles} döngü içe aktarıldı" + }, + "suggestion": { + "both_agree": "WashData öneriyor", + "calibrated_label": "Kalibre edilmiş", + "observed_label": "Gözlemlenen", + "impact": { + "auto_label_confidence": { + "higher": "Daha az döngüyü otomatik etiketler; daha fazlası incelemeye gider", + "lower": "Daha fazla döngüyü otomatik etiketler; bazıları yanlış tanımlanabilir" + }, + "duration_tolerance": { + "higher": "Daha geniş süre aralığı kabul eder – daha esnek eşleştirme", + "lower": "Daha yakın süre eşleşmesi gerektirir – daha katı ama alışılmadık döngüleri reddedebilir" + }, + "end_energy_threshold": { + "higher": "Yalnızca önemli enerji kullanan döngüleri kapatır", + "lower": "Daha kısa veya düşük enerjili döngüleri de kapatır" + }, + "end_repeat_count": { + "higher": "Bitiş sinyalinin daha fazla tekrarlanmasını gerektirir – daha güvenilir, biraz daha yavaş", + "lower": "Daha az tekrardan sonra biter – daha hızlı algılama, daha yüksek yanlış bitiş riski" + }, + "learning_confidence": { + "higher": "Yalnızca çok güvenli eşleşmelerden öğrenir – daha yavaş ama daha güvenilir", + "lower": "Daha fazla döngüden öğrenir; model daha gürültülü olabilir" + }, + "min_off_gap": { + "higher": "Yeni döngü başlamadan önce daha uzun boşta kalma süresi gerekir", + "lower": "Kısa boşta kalma yeni döngü başlatır – arka arkaya çalışmalar bölünebilir" + }, + "min_power": { + "higher": "Boşta güç çekimine daha az duyarlı; çok sessiz programları kaçırabilir", + "lower": "Daha duyarlı; bekleme modundaki güç tüketimini etkinlik olarak kaydedebilir" + }, + "no_update_active_timeout": { + "higher": "Döngü takılı sayılmadan önce daha fazla zaman", + "lower": "Takılı döngüyü daha erken zorunlu durdurur" + }, + "off_delay": { + "higher": "Cihaz duraklamaları için daha fazla süre – uzun ıslatma veya kurutma aşamalarını yönetir", + "lower": "Daha hızlı bitiş algılama – net açık/kapalı cihazlar için iyi çalışır" + }, + "profile_match_threshold": { + "higher": "Yalnızca yüksek güvenli eşleşmeleri onaylar; daha fazla döngü etiketsiz kalır", + "lower": "Daha fazla döngüyle eşleşir; bazıları hafif hatalı olabilir" + }, + "running_dead_zone": { + "higher": "Boşta kısa güç artışlarını yoksayar – gürültüye daha az duyarlı", + "lower": "Daha kısa güç patlamalarına yanıt verir – hızlı geçici etkinliği yakalar" + }, + "start_threshold_w": { + "higher": "Kısa güç artışlarından kaynaklanan yanlış başlatmaları önler", + "lower": "Düşük güçlü programları yakalar; gürültüde tetiklenebilir" + }, + "stop_threshold_w": { + "higher": "Döngüyü daha hızlı bitirir – duraklamada kapanabilir", + "lower": "Bitişi daha uzun bekler – daha az erken tamamlanma" + }, + "watchdog_interval": { + "higher": "Daha uzun sessiz aşamalara izin verilir; daha az yanlış zorunlu durdurma", + "lower": "Takılı döngüleri daha agresif şekilde yakalar" + } + }, + "reason": { + "auto_label_confidence": "Kullanıcının hiç düzeltmediği {cycles} otomatik etiketin 15. yüzdelik güven değeri ({p15}).", + "completion_min_seconds": "{cycles} çevrim boyunca p05 temiz çevrim süresinin yarısı ({minutes} min); sahte çevrimleri filtreler.{excl}", + "dead_zone_batch": "Kısa tutuldu ({cycles} çevrim boyunca medyan başlangıç kararsızlık penceresi = {s}s), böylece gerçek bir son hemen algılanır.", + "dead_zone_from_dip": "{s}s'de algılanan erken güç düşüşüne dayalı.", + "end_energy_default": "Çevrim sonu gürültü eşiği için önerilen varsayılan değer.", + "end_energy_false": "{cycles} çevrim boyunca p95 sahte-son enerjisi ({p95}Wh); medyan çevrim enerjisinin %0.2'sinde ({floor}Wh) alt sınırlandı.", + "end_energy_no_false": "{cycles} çevrim boyunca sahte son yok; medyan çevrim enerjisinin %0.2'sinde ({floor}Wh) alt sınırlandı.", + "end_repeat_count": "{false}/{total} temiz çevrimde (%{pct}) devam eden 60s'den uzun bir iç duraklama vardı; {val} son doğrulaması gerektir.", + "learning_confidence": "{cycles} kullanıcı etiketli çevrimin p05 güven değeri ({p05}); bunun altında doğrulama iste.", + "match_interval": "Gözlemlenen güncelleme sıklığına dayalı (medyan={median}s) * 10.", + "max_duration_ratio": "Etiketli çevrim sürelerine dayalı (p95={p95}).", + "min_active": "Son çevrimde gözlemlenen minimum aktif güce ({min}W) dayalı.", + "min_duration_ratio": "Bir programın çevrimin başında tanınabilmesi için olabildiğince düşük tutuldu; güven ve belirsizlik eşikleri erken kesinleşmeyi önler.", + "min_off_gap": "Gözlemlenen {gaps} çevrimler arası boşluğa dayalı (p05={p05}s). Cihaz alt sınırı: {floor}s.", + "min_off_gap_bridge": "Çevrim içindeki en uzun sessiz aralığı köprülemek üzere boyutlandırıldı: {span}s + 60s tampon, {cycles} temiz çevrim boyunca köprülenen {spans} boşluktan (iki ardışık çalıştırma arasında bıraktığınız en kısa süre olan {ceiling}s'nin altında kalır).", + "min_power": "{cycles} temiz çevrim boyunca p05 en düşük aktif gücün ({p05}W) %40'ı; kapalı eşiğini gerçek çekişin altında tutar.{excl}", + "ml_auto_label": "Kalite modelinin hâlâ temiz olarak değerlendirdiği en düşük güven değeri ({cycles} temiz çevrimin p10'u = {p10}).", + "ml_end_repeat": "{false}/{total} çevrimde (%{pct}) çevrim sonu algılayıcısının 50%'nin üzerinde puanladığı bir duraklama vardı; {val} son doğrulaması gerektir.", + "ml_off_delay": "Çevrim sonu algılayıcısının onayladığı duraklamalar: p95 {p95}s + 60s tampon, {cycles} çevrim boyunca modelce doğrulanmış {pauses} duraklamadan (alt sınır {floor}s).", + "no_update_timeout": "Gözlemlenen güncelleme sıklığına dayalı (p95={p95}s) * 20 (en az 60s).", + "off_delay_cadence": "Gözlemlenen güncelleme sıklığına dayalı (p95={p95}s) * 5", + "off_delay_device_floor": "{device} için cihaza özgü güvenli minimum kullanıldı ({floor}s).", + "off_delay_generic_floor": "Genel güvenli minimum kullanıldı ({floor}s).", + "off_delay_pauses": "Gerçek duraklamalardan uzun sürecek şekilde boyutlandırıldı: p95 çevrim içi duraklama {p95}s + 60s tampon, {cycles} temiz çevrim boyunca {pauses} duraklamadan (alt sınır {floor}s).", + "profile_match_threshold": "{cycles} doğru otomatik etiketin p10 güven değeri ({p10}); güvenli canlı kesinleşme alt sınırı.", + "sampling_interval": "{cycles} temiz çevrim boyunca gözlemlenen medyan güncelleme aralığı ({si}s).{excl}", + "smoothing_window": "{si}s örnekleme ile ~30s'lik okumaları yumuşatacak şekilde boyutlandırıldı ({samples} örnek).", + "start_duration": "Kısa tutuldu (~bir {si}s örnekleme aralığı), böylece tek örneklik ani sıçramalar yok sayılırken algılama olabildiğince erken başlar.", + "thr_batch": "{cycles} çevrim boyunca p05 en düşük aktif gücün ({p05}W) hemen üzerinde tutuldu; böylece başlangıç olabildiğince erken yakalanır ve durdurma eşiği makinenin en düşük çalışma gücünün altında kalır.", + "tol_per_profile": "{profiles} profil boyunca ({cycles} çevrim) profil başına süre varyansının p75'i; tutarlı profiller cezalandırılmaz.", + "tol_pooled": "{cycles} son etiketli çevrimin birleştirilmiş süre varyansına dayalı (p95 sapma={dev}).", + "watchdog": "Güvenli olduğu kadar düşük tutuldu ({p95}s'lik p95 güncelleme boşluğunun hemen üzerinde, en az 30s); böylece takılmalar yanlış durdurmalar olmadan hızlıca yakalanır." + }, + "exclusions": { + "summary": "{total} yanlış algılanan döngü hariç tutuldu: {parts}.", + "reason": { + "force_stopped": "zorla durdurulmuş", + "interrupted": "kesintiye uğramış", + "incomplete": "tamamlanmamış", + "noise": "gürültü", + "unlabeled": "etiketsiz", + "no_trace_short": "incelenemeyecek kadar kısa", + "high_start": "yüksek güçte başlamış", + "abrupt_end": "aniden sona ermiş", + "mid_restart": "döngü ortasında yeniden başlamış", + "no_power": "güç yok", + "no_active_power": "aktif güç yok" + } + } + }, + "trend": { + "down": "Düşen eğilim", + "up": "Yükselen eğilim" + }, + "maint": { + "bearing_service": "Rulman servisi", + "descale": "Kireç çözme", + "drum_clean": "Tamburu temizle", + "filter_clean": "Filtreyi temizle", + "other": "Diğer" + }, + "col": { + "profile_tip": "Eşleşen program adı. Etiketsiz, döngünün sonunda hiçbir profilin eşleşmediği anlamına gelir.", + "status_tip": "Döngü sonucu: Tamamlandı (doğal bitiş), Kesintili (ani güç düşüşü), Zorla Durduruldu (manuel) veya İnceleme Gerekiyor (geri bildirim bekliyor).", + "date_tip": "Döngünün başladığı tarih ve saat.", + "duration_tip": "Baştan sona toplam döngü çalışma süresi.", + "energy_tip": "Tüketilen toplam enerji (kWh). Gücün zamana göre integrali alınarak hesaplanır.", + "cost_tip": "Bu döngünün enerji maliyeti; tamamlandığında o an geçerli olan fiyat kullanılarak sabitlenir (enerji x kWh başına fiyat). Doldurmak için Ayarlar altında bir fiyat belirleyin.", + "confidence_tip": "Profil eşleşme güveni (0-100%). Döngünün güç eğrisinin, tanımlanan programla ne kadar yakından eşleştiği.", + "health_tip": "ML döngü sağlığı (yüksek = daha iyi). İncelemek ve gözden geçirmek için bir döngüye tıklayın.", + "flags_tip": "Döngü için inceleme, anomali ve kaynak işaretleri. Ayrıntı için bir simgenin üzerine gelin." + }, + "stat": { + "avg": "ort.", + "min": "min {v}", + "max": "maks {v}", + "consistency": "tutarlılık ±{v}", + "total": "toplam {v}", + "last_run": "son çalıştırma {v}", + "score": "puan %{pct}", + "duration_cv": "süre CV %{pct}", + "avg_confidence": "ort. güven %{pct}" + }, + "pg_evd": { + "detected": "Algılayıcı, bir döngünün başladığını fark etti.", + "match_commit": "Eşleştirici, yeterli güvenle bir programa karar verdi.", + "match_changed": "Döngünün daha fazlası görüldükçe önde gelen program değişti.", + "match_ambiguous": "İki program birbirine yakın puan aldı, bu yüzden eşleşme belirsizdi.", + "unmatched": "Bu döngüye kaydedilmiş hiçbir program uymadı.", + "notify_start": "Bir başlangıç bildirimi gönderilirdi.", + "notify_pre_complete": "Bir «neredeyse bitti» bildirimi gönderilirdi.", + "notify_finish": "Bir bitiş bildirimi gönderilirdi.", + "notify_milestone": "Bir kilometre taşı bildirimi gönderilirdi.", + "notify_held": "Bir bildirim, sessiz saatler nedeniyle bekletildi.", + "finished": "Döngü, son duruma ulaştı ve sona erdi." + }, + "store": { + "browse": "Göz at", + "device": "Cihaz", + "favorites": "Favoriler", + "search_ph": "Marka veya modele göre ara…", + "no_results": "Eşleşen cihaz bulunamadı. Farklı bir arama deneyin.", + "n_programs": "{n} program", + "n_cycles": "{n} döngü", + "no_programs": "Bu cihaz için henüz paylaşılan program yok.", + "no_cycles": "Bu program için henüz paylaşılan referans döngü yok.", + "anon": "anonim", + "uploaded_by": "{name} tarafından paylaşıldı", + "connected_as": "{name} olarak bağlanıldı", + "not_connected": "Bağlı değil. Kendi döngülerinizi paylaşmak için bir GitHub hesabı bağlayın.", + "import_new": "Yeni profil", + "import_merge": "Mevcut olana birleştir", + "merge_target": "Profile birleştir", + "description": "Açıklama (isteğe bağlı)", + "contributed_by": "{name} tarafından", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "Henüz değerlendirme yok", + "website": "Mağaza web sitesi ↗", + "website_tip": "Topluluk mağazasının web sitesini aç" + }, + "settings": { + "gear": { + "title": "Ayarlar" + } + }, + "link": { + "manual": "Kılavuz ↗", + "add_appliance": "Cihazınızı ekleyin" + }, + "tip": { + "add_brand": "Marka listede yok mu? Topluluk kataloğuna ekleyin", + "add_appliance": "Model listede yok mu? Cihazınızı topluluk kataloğuna ekleyin", + "add_profile": "Bu cihaz için topluluk sitesinde bir profil ekleyin" + }, + "task": { + "reprocess": { + "matching": "Yeniden işleme: döngü eşleştirme", + "golden": "Yeniden işleme: referans döngülerini işaretleme", + "suggestions": "Yeniden işleme: öneriler", + "ml_training": "Yeniden işleme: ML eğitimi", + "health": "Yeniden işleme: döngü sağlığı" + }, + "pg_sweep": { + "optimize": "Optimizasyon: {param}" + }, + "pg_detail": { + "simulate": "Döngü simülasyonu" + }, + "split": { + "apply": "Döngü bölünüyor" + }, + "trim": { + "apply": "Döngü kırpılıyor" + }, + "merge": { + "apply": "Döngüler birleştiriliyor" + }, + "rebuild": { + "envelopes": "Zarflar yeniden oluşturuluyor" + }, + "cancelling": "İptal ediliyor..." + }, + "setup": { + "hdr": { + "card": "Cihaz Kurulumu", + "healthy_chip": "Kurulum tamamlandı" + }, + "phase0": { + "washer": "WashData döngülerinizi zaten algılıyor. Program adlarını ve süre tahminlerini etkinleştirmek için ilk döngünüzü kaydedin.", + "dishwasher": "WashData izliyor. Bulaşık makinelerinin döngüleri karmaşıktır – ilk döngünüzü kaydetmeniz kesinlikle önerilir. Algılanan bir döngü çok uzun sürerse, profil olarak kaydetmeden önce döngü düzenleyicisini kullanarak kırpın.", + "generic": "WashData izliyor. Profil oluşturmaya başlamak için algılanan bir döngüyü kaydedin veya etiketleyin." + }, + "phase1a": { + "labelled": "İyi bir başlangıç – ilk programınız kaydedildi. En temiz veri için bir sonraki döngünüzü kaydedici widget'ı ile kaydetmeyi düşünün." + }, + "phase1b": { + "recorded": "Kaydınız {profile_name} olarak kaydedildi. Kapsama alanı oluşturmak için diğer yaygın programlarınızı kaydedin veya etiketleyin." + }, + "phase1c": { + "verify": "Topluluktan {count} programınız var. WashData'nın doğru tanıyıp tanımadığını doğrulamak için bir döngü çalıştırın – cihazınız kendi geçmişini oluşturdukça eşleştirme iyileşecektir." + }, + "phase2": { + "cluster": "WashData, kayıtlı hiçbir programla eşleşmeyen {count} döngü gördü – bunlar birbirlerine benziyor. Bunlar için yeni bir profil oluşturmak ister misiniz?", + "unmatched": "Son döngünüz kayıtlı hiçbir programla eşleşmedi. Yeni bir program mı?" + }, + "phase3": { + "suggestions": "WashData, döngü geçmişinize göre ayar önerileri sunuyor – algılama doğruluğunu artırmak için bunları inceleyin.", + "groups": "Bazı profilleriniz farklı sıcaklıklardaki aynı programa benziyor. Daha iyi eşleştirme için bunları bir grupta düzenleyin.", + "phases": "Daha doğru kalan süre tahminleri için {profile_name} profiline program aşamaları ekleyin." + }, + "phase4": { + "healthy": "Bu cihaz tamamen kuruldu ({profile_count} profil)." + }, + "cta": { + "start_recording": "Kaydı Başlat", + "label_detected_cycle": "Zaten algılanmış bir döngüm var – bunun yerine etiketle", + "browse_cycles": "Başka birini etiketlemek için döngülere göz at", + "view_profiles": "Profillerinizi görüntüleyin", + "create_from_cluster": "Bu döngülerden profil oluştur", + "create_profile": "Bunun için bir profil oluştur", + "review_suggestions": "Önerileri incele", + "organise_profiles": "Profilleri düzenle", + "configure_phases": "Aşamaları yapılandır", + "skip_step": "Bu adımı atla", + "skip_forever": "Bir daha gösterme", + "hide_guidance": "Rehberi gizle", + "show_guidance": "Rehberi göster" + } } - } } diff --git a/custom_components/ha_washdata/translations/panel/uk.json b/custom_components/ha_washdata/translations/panel/uk.json index a9e2b657..37a83e69 100644 --- a/custom_components/ha_washdata/translations/panel/uk.json +++ b/custom_components/ha_washdata/translations/panel/uk.json @@ -1,4 +1,52 @@ { + "card": { + "min": "хв", + "entity_not_found": "Сутність не знайдено", + "running_long": "Працює довго", + "remaining": "залишилось", + "progress": "прогрес", + "show_time_remaining": "Показувати час, що залишився", + "show_percentage": "Показувати відсотки", + "layout": { + "tile": "Плитка (компактна)", + "detail": "Детально (розширений)", + "glance": "Огляд (кілька пристроїв)" + }, + "btn": { + "pause": "Пауза", + "resume": "Продовжити", + "terminate": "Завершити цикл", + "record_start": "Почати запис", + "record_stop": "Зупинити запис", + "program": "Програма", + "open_panel": "Відкрити WashData" + }, + "editor": { + "layout": "Макет", + "entity": "Сутність приладу", + "entities": "Прилади", + "title": "Заголовок", + "icon": "Значок", + "show_state": "Показувати стан", + "show_program": "Показувати програму", + "show_progress_bar": "Показувати індикатор прогресу", + "spin_icon": "Обертати значок під час роботи", + "display_mode": "Рядок деталей", + "active_color": "Перевизначення активного кольору", + "show_phase": "Показувати фазу", + "show_energy": "Показувати енергію та вартість", + "show_anomaly": "Показувати попередження про перевищення", + "show_sparkline": "Показувати графік потужності в реальному часі", + "buttons": "Кнопки дій", + "program_entity": "Сутність програми (перевизначення)", + "time_entity": "Сутність часу (перевизначення)", + "pct_entity": "Сутність прогресу (перевизначення)", + "power_entity": "Сутність потужності (перевизначення)", + "tap_action": "Дія за дотиком", + "hold_action": "Дія за утриманням", + "double_tap_action": "Дія за подвійним дотиком" + } + }, "badge": { "artifact_tip": "Виявлено {n} аномалій (наприклад, двері відкриті посеред циклу) – відкрийте, щоб побачити їх на графіку", "auto": "(виявлено автоматично)", @@ -64,6 +112,21 @@ "discard": "Відхилити", "discard_tip": "Відхилити запис без збереження", "dismiss": "Закрити", + "mute_suggestion": "Не пропонувати це налаштування", + "pg_load_calibrated": "Завантажити відкалібровані (ML) ({n})", + "pg_load_calibrated_tip": "Завантажити налаштування, відкалібровані ML, як перевизначення в пісочниці", + "pg_load_live": "Завантажити активні налаштування", + "pg_load_live_tip": "Перечитати поточні налаштування інтеграції та скасувати всі зміни в пісочниці", + "pg_load_suggested": "Завантажити рекомендовані ({n})", + "pg_load_suggested_tip": "Завантажити поточні рекомендації автоматичного налаштування як перевизначення в пісочниці", + "pg_preset_delete": "Видалити пресет", + "pg_preset_load": "Завантажити пресет", + "pg_preset_load_tip": "Замінити значення в пісочниці цим пресетом (активні налаштування не змінюються)", + "pg_preset_save": "Зберегти як пресет", + "pg_preset_save_tip": "Зберегти всі значення нижче як іменований пресет для цього пристрою", + "pg_publish_all": "Зберегти в налаштування ({n})", + "pg_publish_one": "Зберегти «{label}» в налаштування інтеграції", + "reset_muted": "Скинути заглушені", "done": "Готово", "edit": "Редагувати", "export": "Експортувати", @@ -275,6 +338,7 @@ "no_automations": "Жодна автоматизація ще не посилається на цей пристрій.", "panel_settings": "Налаштування панелі", "param_sweep": "Перебір параметра", + "pg_settings_source": "Джерело налаштувань", "phase_catalog": "Каталог фаз", "playground": "Пісочниця", "process_history": "Обробка історії", @@ -348,6 +412,7 @@ "default_access_level": "Стандартний рівень для користувачів, яких немає в списку нижче", "default_other": "Стандартний (інші пристрої)", "default_tab": "Стандартна вкладка при відкритті панелі", + "font_size": "Розмір шрифту панелі", "delta": "Δ", "description": "Опис", "dtw_blend_w": "Вага змішування", @@ -415,6 +480,9 @@ "pg_match_score": "Оцінка збігу", "pg_pct_of": "{p}% з {total}", "pg_poor_match": "Поганий збіг", + "pg_preset": "Пресет пісочниці", + "pg_preset_name": "Назва нового пресета", + "pg_preset_none": "Виберіть пресет…", "pg_strong_match": "Сильний збіг", "pg_tile_ambiguous": "Неоднозначно", "pg_tile_ambiguous_tip": "Цикли з майже однаковим збігом двох програм", @@ -771,7 +839,17 @@ "pg_apply_confirm": "Застосувати найкраще значення: {label} = {value}?", "pg_canvas_empty": "Виберіть цикл вище, потім натисніть «Завантажити», щоб побачити його графік потужності.", "pg_chart_caption": "Частка виявлення/збігу за значеннями {param}", + "pg_ctrl_intro": "Значення беруться з активних налаштувань інтеграції для цього пристрою. Зміни залишаються в пісочниці, доки ви не збережете їх у налаштування.", + "pg_live_unavailable": "Активні налаштування недоступні, показано стандартні значення.", + "pg_load_live_confirm": "Скасувати зміни в пісочниці ({n}) і завантажити поточні налаштування інтеграції?", "pg_match_rate": "{pct}% збігів на {total} циклах", + "pg_matches_live": "Збігається з активними налаштуваннями", + "pg_n_changed": "Відмінностей від активних налаштувань: {n}", + "pg_sugg_none": "Усі рекомендації вже відповідають поточним налаштуванням", + "pg_preset_delete_confirm": "Видалити пресет «{name}»?", + "pg_preset_limit": "Досягнуто ліміт пресетів ({n})", + "pg_preset_overwrite": "Перезаписати пресет «{name}»?", + "pg_publish_one_confirm": "Зберегти {label} = {value} у налаштування цього пристрою?", "pg_restart_note": "Перезапустіть Home Assistant, щоб увімкнути інструменти симуляції.", "pg_sim_progress": "{done} / {total} циклів", "pg_starting": "Запуск…", @@ -789,6 +867,7 @@ "preferences_admin": "Налаштування, панель і контроль доступу", "preferences_adv": "Налаштування", "prefs_personal": "Застосовується лише до вашого облікового запису Home Assistant.", + "font_size_hint": "Зробіть усе на цій панелі більшим або меншим. Застосовується до вашого облікового запису на цьому пристрої.", "process_history_hint": "Повторно запустіть зіставлення для всіх збережених циклів, оновіть пропозиції з налаштування, перенавчіть моделі ML (якщо увімкнено) та перерахуйте якість циклів. Запускайте після пакетного перегляду.", "profile_deleted": "Профіль видалено", "profile_poor_health_detail": "Цикли, призначені цьому профілю, мають суперечливі форми або низьку надійність. Розгляньте можливість перебудови конверта або перегляду позначених циклів.", @@ -821,6 +900,10 @@ "split_intro": "Натисніть на графік, щоб додати або видалити точку поділу, або автовизначення за паузами. Кожен отриманий сегмент може отримати власний профіль.", "storage_diagnostics": "Статистика сховища, обслуговування, експорт/імпорт", "sug_staged": "Встановлено {key} = {val}. Збережіть для застосування.", + "sug_muted": "Це налаштування більше не пропонуватиметься", + "sug_mute_failed": "Не вдалося заглушити пропозицію", + "sug_unmuted_all": "Заглушені пропозиції скинуто", + "n_suggestions_muted": "{count} заглушено; авто-налаштувач не пропонуватиме їх.", "toast_auto_detect_enabled": "Автовизначення увімкнено", "toast_auto_label_complete": "Автоматичне маркування завершено", "toast_auto_label_failed": "Автоматичне маркування не виконано: {error}", @@ -845,6 +928,7 @@ "trend_duration_shorter": "Тривалість скорочується ({pct}%/цикл) – останній середній показник {avg}", "trend_energy_down": "Енергія зменшується ({pct}%/цикл)", "trend_energy_up": "Енергія зростає ({pct}%/цикл) – останній середній показник {avg}", + "trim_destructive_confirm": "Залишиться лише {pct}% циклу, і цю дію не можна скасувати. Продовжити?", "trim_intro": "Перетягніть червоні маркери або введіть значення. Все за межами вікна видаляється.", "tuning_suggestions_available": "Доступна {count} пропозиція налаштування на основі спостережених циклів. Вони з'являються поряд із відповідними полями.", "unsure_detected_prefix": "WashData не впевнений, що виявив", @@ -970,6 +1054,10 @@ "unusable": "Непридатний" }, "section": { + "dishwasher": { + "intro": "Обробка завершення циклу для посудомийних машин, які зазвичай закінчуються тривалою фазою сушіння майже без споживання енергії перед коротким фінальним зливом.", + "label": "Посудомийна машина" + }, "anti_wrinkle": { "intro": "Режим захисту від зминання виявляє короткі імпульси обертання барабана з малою потужністю після основного циклу та зберігає їх як частину завершеного циклу.", "label": "Захист від зминання" @@ -1012,6 +1100,10 @@ } }, "setting": { + "dishwasher_end_spike_quiet_release": { + "doc": "Після того як цикл перевищує очікувану тривалість, скільки часу посудомийна машина має залишатися неактивною (нижче «Поріг зупинки»), перш ніж WashData припинить очікувати фінальний злив і завершить цикл. Збільште значення, якщо ваша машина має тривалу тиху фазу сушіння перед пізнім фінальним зливом, який пропускається - ширше вікно дозволяє вивченій тривалості слідувати за сезонними змінами (холодніша вхідна вода = довші цикли), а не фіксуватися на старому середньому значенні. Воно лише скорочує очікування відносно внутрішнього 30-хвилинного ліміту очікування завершального сплеску (відкачування води), але ніколи не збільшує його.", + "label": "Тихе завершення пасивного сушіння" + }, "anti_wrinkle_enabled": { "doc": "Розпізнавайте короткі малопотужні імпульси обертання, які видає сушильна машина після основної фази нагрівання, і зберігайте їх прив’язаними до завершеного циклу замість того, щоб зчитувати їх як нові цикли.", "label": "Увімкнути виявлення захисту від зминання" @@ -1232,6 +1324,10 @@ "doc": "Через кілька хвилин після завершення циклу перед надсиланням нагадування «розвантажити машину», що все ще очікує. Встановіть 0, щоб вимкнути нагадування.", "label": "Затримка нагадування про вивантаження" }, + "notify_unload_repeat": { + "doc": "Продовжує надсилати нагадування про вивантаження кожні \"Затримка нагадування про вивантаження\" хвилин, доки ви не відкриєте двері або не натиснете \"Не нагадувати\" у сповіщенні. Потрібна Сутність датчика дверей (як і для самого нагадування). Кнопка відхилення працює у сповіщеннях мобільного застосунку Home Assistant (companion).", + "label": "Повторювати, доки не відкриються двері" + }, "off_delay": { "doc": "Час очікування після падіння живлення, перш ніж оголосити цикл завершеним. Якщо живлення відновлюється протягом цього вікна, цикл продовжується безперебійно - це мости призупиняються між етапами прання. Посудомийні машини мають довгі фази сушіння (вимкнення на 20-60 хв), тому затримка вимкнення повинна перевищувати цю, щоб весь цикл миття+сушіння відбувався як один цикл.", "label": "Затримка вимкнення" @@ -1406,6 +1502,26 @@ "energy_scale": { "label": "Гострота енергії", "doc": "Гострота штрафу за невідповідність енергії на Етапі 4. Менше = суворіше: невідповідність енергії більше знижує оцінку. Значення за замовчуванням 0,25 є навмисно більш м'яким, ніж Гострота тривалості, оскільки енергія варіюється з навантаженням. Використовуйте разом із Вагою енергії." + }, + "power_profile_interval_min": { + "label": "Інтервал профілю потужності", + "doc": "Розмір сегмента для атрибута датчика power_profile по профілю (плоский масив середніх ват по слотах), що використовується зовнішніми планувальниками, такими як EMHASS та tibber_prices. Менші сегменти зберігають короткі сплески потужності гострими; більші сегменти згладжують форму. За замовчуванням 15 хв. Лише для читання; не впливає на виявлення." + }, + "notify_live_sticky": { + "label": "Зберігати живе сповіщення при натисканні", + "doc": "Лише для Android. Зробіть сповіщення про хід виконання постійним (закріпленим), щоб натискання не закривало його. Вимкнено зберігає поведінку за замовчуванням, де натискання закриває сповіщення." + }, + "notify_live_click_action": { + "label": "Ціль натискання живого сповіщення", + "doc": "Лише для Android. Куди відкривається натискання на сповіщення про хід виконання (наприклад, /lovelace/laundry або повний URL), замість початкової сторінки застосунку. Залиште порожнім для поведінки за замовчуванням." + }, + "door_opens_at_end": { + "label": "Дверцята відкриваються автоматично наприкінці", + "doc": "Для посудомийних машин, які відкривають дверцята наприкінці циклу для сушіння (AirDry та подібні). При увімкненні відкриття дверцят під час активного циклу більше не призупиняє його назавжди; натомість, якщо дверцята залишаються відкритими протягом часу витримки нижче, WashData вважає цикл завершеним. Коротке відкриття (додавання посуду) ігнорується. Потрібен об'єкт датчика дверей." + }, + "door_end_dwell_seconds": { + "label": "Витримка при відкритих дверцятах", + "doc": "Як довго дверцята повинні залишатися відкритими до завершення циклу, коли увімкнено \"Дверцята відкриваються автоматично наприкінці\". Достатньо довго, щоб ігнорувати швидке додавання посуду (за замовчуванням 60 с), достатньо коротко для швидкого завершення після відкриття дверцят машиною." } }, "setting_group": { @@ -1576,6 +1692,10 @@ "name_required": "Назва обов'язкова", "no_split_found": "Не знайдено пауз для поділу", "panel_settings_saved": "Налаштування панелі збережено", + "pg_preset_loaded": "Пресет «{name}» завантажено", + "pg_preset_saved": "Пресет «{name}» збережено", + "pg_sugg_loaded": "Завантажено {n} рекомендованих значень - запустіть пісочницю для порівняння", + "pg_sugg_ml_loaded": "Завантажено {n} значень, відкаліброваних ML - запустіть пісочницю для порівняння", "phase_name_required": "Назва фази обов'язкова", "phase_updated": "Фазу оновлено", "phases_saved": "Фази збережено", @@ -1723,6 +1843,7 @@ "min_active": "На основі мінімальної активної потужності ({min}W), зафіксованої в останньому циклі.", "min_duration_ratio": "Залишено якомога нижчим, щоб програма розпізнавалася на початку циклу; пороги впевненості та неоднозначності запобігають передчасним підтвердженням.", "min_off_gap": "На основі {gaps} спостережуваних проміжків між циклами (p05={p05}s). Мінімум пристрою: {floor}s.", + "min_off_gap_bridge": "Розраховано так, щоб перекрити найдовшу тиху ділянку всередині циклу: {span}s + запас 60s, за {spans} перекритими проміжками за {cycles} коректних циклів (залишається нижче вашого найкоротшого проміжку між двома запусками поспіль, який становить {ceiling}s).", "min_power": "40% від найменшої активної потужності p05 ({p05}W) за {cycles} коректними циклами, щоб поріг вимкнення залишався нижчим за реальне споживання.{excl}", "ml_auto_label": "Найменша впевненість, за якої модель якості все ще вважала цикл коректним (p10 за {cycles} коректними циклами = {p10}).", "ml_end_repeat": "{false}/{total} циклів ({pct}%) мали паузу, яку детектор завершення оцінив вище 50%; потрібно {val} підтвердження завершення.", @@ -1739,7 +1860,7 @@ "thr_batch": "Залишено трохи вище найменшої активної потужності p05 за {cycles} циклами ({p05}W), щоб запуск фіксувався якомога раніше, а поріг зупинки залишався нижчим за мінімальну робочу потужність машини.", "tol_per_profile": "p75 розкиду тривалості за профілями серед {profiles} профілів ({cycles} циклів); стабільні профілі не штрафуються.", "tol_pooled": "На основі об'єднаного розкиду тривалості {cycles} нещодавніх розмічених циклів (відхилення p95={dev}).", - "watchdog": "Залишено настільки низьким, наскільки це безпечно (3x інтервал оновлення p95, що дорівнює {p95}s, мін. 30s), щоб зависання виявлялися швидко без хибних зупинок." + "watchdog": "Залишено настільки низьким, наскільки це безпечно (трохи вище інтервалу оновлення p95, що дорівнює {p95}s, мін. 30s), щоб зависання виявлялися швидко без хибних зупинок." }, "exclusions": { "summary": "Виключено {total} помилково виявлених циклів: {parts}.", @@ -1770,6 +1891,7 @@ "other": "Інше" }, "pg_desc": { + "dishwasher_end_spike_quiet_release": "Посудомийна машина: секунди неактивності після очікуваної тривалості перед зняттям очікування фінального зливу в кінці циклу", "completion_min_seconds": "Найкоротший запуск, що вважається справжнім циклом", "end_repeat_count": "Скільки низьких показань поспіль до завершення", "interrupted_min_seconds": "Короткі цикли позначаються як перервані", diff --git a/custom_components/ha_washdata/translations/panel/zh-Hans.json b/custom_components/ha_washdata/translations/panel/zh-Hans.json index 0ceb60b8..17b45603 100644 --- a/custom_components/ha_washdata/translations/panel/zh-Hans.json +++ b/custom_components/ha_washdata/translations/panel/zh-Hans.json @@ -1,1948 +1,2070 @@ { - "badge": { - "artifact_tip": "检测到 {n} 个异常(例如,门在周期中打开)– 打开以在图表上查看", - "auto": "(自动检测)", - "built_in_tag": "内置", - "declining": "↘ 下降中", - "energy_low": "能耗低于正常水平", - "energy_spike": "能耗高于正常水平", - "fair_fit": "质量尚可", - "fair_fit_tip": "匹配一致性适中 – 分配给此配置文件的部分周期置信度较低。标记更多周期或重新录制配置文件以提高准确性。", - "feedback_requested": "已请求反馈", - "golden_cycle": "记录参考周期", - "improving": "↗ 提升中", - "manual": "(手动选择)", - "needs_review": "需要审查", - "overrun": "运行时间超出正常", - "poor_fit": "质量差", - "poor_fit_tip": "匹配历史不一致 – 考虑重建此配置文件", - "restart_gap_tip": "{n} HA 重启间隙 - 电源跟踪有漏洞", - "reviewed": "已审核", - "steady": "→ 稳定", - "underrun": "完成比通常更快", - "using_defaults": "使用出厂默认值", - "using_tuned": "使用已调整的权重", - "overrun_ratio": "(预期的 {x} 倍)", - "underrun_ratio": "(预期的 {pct}%)", - "awaiting_tip": "等待社区批准", - "awaiting_n": "等待批准 · 已确认 {n} 个", - "approved": "已批准", - "awaiting": "等待批准", - "imported_tip": "从社区商店导入。仅用于匹配,不计入统计。", - "not_importable": "此处不适用", - "exists": "已存在" - }, - "btn": { - "add_device": "+ 添加设备", - "add_device_tip": "添加另一个 WashData 设备", - "add_maintenance": "添加维护事件", - "add_phase": "+ 添加阶段", - "add_timer": "+ 添加计时器", - "apply_all": "全部应用", - "apply_label": "应用标签", - "apply_set_b": "应用设置 B", - "apply_split": "应用拆分", - "apply_trim": "应用裁剪", - "auto_detect_split": "自动检测", - "auto_label_cycles": "自动标记周期", - "auto_label_cycles_tip": "自动为置信度达到阈值的未标记周期分配配置文件名称", - "cancel": "取消", - "clear_debug": "清除调试数据", - "clear_splits": "清除", - "close": "关闭", - "compare": "比较", - "confirm": "确认", - "convert_to_automation": "转换为自动化", - "correct": "修正…", - "create": "创建", - "create_from_cluster": "从 {count} 个周期创建配置文件", - "create_profile": "+ 创建配置文件", - "delete": "删除", - "delete_group": "删除组", - "delete_group_tip": "仅删除此组 – 保留成员配置文件", - "delete_profile": "删除配置文件", - "discard": "丢弃", - "discard_tip": "丢弃录制的电力记录,不保存", - "dismiss": "关闭", - "done": "完成", - "edit": "编辑", - "export": "导出", - "export_json": "导出为 JSON", - "force_stop": "强制停止", - "force_stop_tip": "立即结束当前周期并将其标记为强制停止", - "from_template": "从模板 ▾", - "ignore": "忽略", - "import_json": "从 JSON 导入", - "import_overwrite": "导入(覆盖数据)", - "inspect": "检查", - "label": "标记", - "load": "加载", - "load_more": "加载更多", - "manage": "管理", - "merge": "合并", - "new_automation": "+ 新建自动化", - "new_group": "+ 新建组", - "new_group_tip": "将形状/时长相近(不同温度或转速)的配置文件分组,使匹配器能可靠地区分它们", - "new_phase": "+ 新建阶段", - "new_profile": "+ 新建配置文件", - "new_profile_tip": "从现有已标记的周期或录制中创建新程序配置文件", - "on_cycle_finished": "周期完成时", - "on_cycle_started": "周期开始时", - "pause_cycle": "暂停", - "pause_cycle_tip": "暂停正在运行的周期 – 设备将从中断处恢复", - "pg_apply_device": "应用到设备", - "pg_autofill": "自动填充", - "play": "播放", - "process": "处理", - "process_history": "立即处理", - "process_recording": "保存录制", - "process_tip": "将录制的电力记录保存为新的或现有的配置文件", - "rebuild": "重建包络", - "rebuild_envelope": "重建包络", - "rebuild_tip": "从已标记周期重新计算所有配置文件的预期功率包络(最小/最大范围)– 在标记新周期或修正旧周期后运行", - "rec_start_tip": "开始录制设备的电力轨迹 – 在运行周期之前立即开始", - "rec_stop": "停止", - "rec_stop_tip": "停止录制并保留已捕获的电力记录以供审核", - "record": "开始录制", - "refresh": "刷新", - "refresh_diag_tip": "重新加载存储统计信息", - "refresh_logs_tip": "重新加载最新日志记录", - "refresh_settings_tip": "从服务器重新加载设置", - "relabel": "重新标记({count})", - "remove": "移除", - "remove_timer": "删除计时器", - "reset": "重置", - "reset_ml_models_tip": "放弃微调模型并恢复内置模型。WashData 可以稍后重新学习。", - "reset_to_builtin": "重置为内置模型", - "reset_to_defaults": "重置为默认值", - "resume_cycle": "继续运行周期", - "resume_cycle_tip": "恢复已暂停的周期", - "revert_settings": "放弃更改", - "revert_settings_tip": "恢复上次保存前的设置", - "revert_settings_tip_none": "请先保存以启用撤销功能", - "revert": "还原", - "revert_to_previous": "将此设置还原为先前的值", - "review": "审查", - "run": "运行", - "run_analysis": "🔍 运行建议分析", - "run_analysis_tip": "立即分析已记录的周期并刷新调整建议", - "run_auto_label": "运行自动标记", - "run_both": "运行 A 对比 B", - "run_simulation": "运行模拟", - "save": "保存", - "save_access_control": "保存访问控制", - "save_group": "保存组", - "save_panel_settings": "保存面板设置", - "save_phases": "保存阶段", - "save_preferences": "保存偏好", - "save_reminders": "保存提醒", - "save_review": "保存审查", - "save_settings": "保存设置", - "select": "选择", - "select_all": "全选", - "select_last20": "最近 20", - "select_none": "清除", - "show_only": "只显示", - "skip_setup": "跳过设置", - "split": "拆分", - "stop": "停止", - "submit_correction": "提交修正", - "train_now": "立即训练", - "trim": "裁剪", - "trim_split": "裁剪 / 拆分", - "undo": "撤销", - "use": "使用", - "wipe_all": "清除所有数据", - "delete_selected": "删除所选({n})", - "group_suggest": "组 {n}:{members}", - "pg_apply_best": "应用最佳值", - "pg_apply_to_settings": "保存到设置", - "pg_apply_to_settings_tip": "将您在此处编辑的值复制到该设备当前生效的设置中", - "search": "搜索", - "import": "导入", - "disconnect": "断开连接", - "connect_github": "连接 GitHub", - "save_appliance": "保存家电", - "share_to_store": "分享到商店", - "share": "分享", - "confirm_appliance": "确认此家电", - "confirmed": "已确认", - "browse_community_setups": "浏览社区配置", - "download_device": "下载此配置", - "share_device": "⬆ 分享此设备", - "share_device_tip": "将此设备及其录制的参考周期分享到社区商店,让拥有相同机器的其他用户可以采用", - "share_n": "分享 {n} 个周期", - "export_selected": "导出(选择数据)", - "export_all": "快速导出全部", - "import_raw": "高级:用 JSON 替换全部", - "download_export": "下载导出文件", - "analyze_import": "分析文件", - "import_selected": "导入所选", - "back": "返回" - }, - "conflict": { - "anti_wrinkle_exit": { - "exit": "必须低于停止阈值 ({stop} W);否则防皱退出功率将被忽略", - "stop": "必须高于防皱退出功率 ({exit} W)" + "card": { + "min": "分钟", + "entity_not_found": "未找到实体", + "running_long": "运行超时", + "remaining": "剩余", + "progress": "进度", + "show_time_remaining": "显示剩余时间", + "show_percentage": "显示百分比", + "layout": { + "tile": "磁贴(紧凑)", + "detail": "详情(丰富)", + "glance": "概览(多个设备)" + }, + "btn": { + "pause": "暂停", + "resume": "继续", + "terminate": "结束周期", + "record_start": "开始录制", + "record_stop": "停止录制", + "program": "程序", + "open_panel": "打开 WashData" + }, + "editor": { + "layout": "布局", + "entity": "电器实体", + "entities": "电器", + "title": "标题", + "icon": "图标", + "show_state": "显示状态", + "show_program": "显示程序", + "show_progress_bar": "显示进度条", + "spin_icon": "运行时旋转图标", + "display_mode": "详情行", + "active_color": "活动颜色覆盖", + "show_phase": "显示阶段", + "show_energy": "显示能耗和费用", + "show_anomaly": "显示超时警告", + "show_sparkline": "显示实时功率图", + "buttons": "操作按钮", + "program_entity": "程序实体(覆盖)", + "time_entity": "时间实体(覆盖)", + "pct_entity": "进度实体(覆盖)", + "power_entity": "功率实体(覆盖)", + "tap_action": "点按操作", + "hold_action": "长按操作", + "double_tap_action": "双击操作" + } + }, + "badge": { + "artifact_tip": "检测到 {n} 个异常(例如,门在周期中打开)– 打开以在图表上查看", + "auto": "(自动检测)", + "built_in_tag": "内置", + "declining": "↘ 下降中", + "energy_low": "能耗低于正常水平", + "energy_spike": "能耗高于正常水平", + "fair_fit": "质量尚可", + "fair_fit_tip": "匹配一致性适中 – 分配给此配置文件的部分周期置信度较低。标记更多周期或重新录制配置文件以提高准确性。", + "feedback_requested": "已请求反馈", + "golden_cycle": "记录参考周期", + "improving": "↗ 提升中", + "manual": "(手动选择)", + "needs_review": "需要审查", + "overrun": "运行时间超出正常", + "poor_fit": "质量差", + "poor_fit_tip": "匹配历史不一致 – 考虑重建此配置文件", + "restart_gap_tip": "{n} HA 重启间隙 - 电源跟踪有漏洞", + "reviewed": "已审核", + "steady": "→ 稳定", + "underrun": "完成比通常更快", + "using_defaults": "使用出厂默认值", + "using_tuned": "使用已调整的权重", + "overrun_ratio": "(预期的 {x} 倍)", + "underrun_ratio": "(预期的 {pct}%)", + "awaiting_tip": "等待社区批准", + "awaiting_n": "等待批准 · 已确认 {n} 个", + "approved": "已批准", + "awaiting": "等待批准", + "imported_tip": "从社区商店导入。仅用于匹配,不计入统计。", + "not_importable": "此处不适用", + "exists": "已存在" + }, + "btn": { + "add_device": "+ 添加设备", + "add_device_tip": "添加另一个 WashData 设备", + "add_maintenance": "添加维护事件", + "add_phase": "+ 添加阶段", + "add_timer": "+ 添加计时器", + "apply_all": "全部应用", + "apply_label": "应用标签", + "apply_set_b": "应用设置 B", + "apply_split": "应用拆分", + "apply_trim": "应用裁剪", + "auto_detect_split": "自动检测", + "auto_label_cycles": "自动标记周期", + "auto_label_cycles_tip": "自动为置信度达到阈值的未标记周期分配配置文件名称", + "cancel": "取消", + "clear_debug": "清除调试数据", + "clear_splits": "清除", + "close": "关闭", + "compare": "比较", + "confirm": "确认", + "convert_to_automation": "转换为自动化", + "correct": "修正…", + "create": "创建", + "create_from_cluster": "从 {count} 个周期创建配置文件", + "create_profile": "+ 创建配置文件", + "delete": "删除", + "delete_group": "删除组", + "delete_group_tip": "仅删除此组 – 保留成员配置文件", + "delete_profile": "删除配置文件", + "discard": "丢弃", + "discard_tip": "丢弃录制的电力记录,不保存", + "dismiss": "关闭", + "done": "完成", + "edit": "编辑", + "export": "导出", + "export_json": "导出为 JSON", + "force_stop": "强制停止", + "force_stop_tip": "立即结束当前周期并将其标记为强制停止", + "from_template": "从模板 ▾", + "ignore": "忽略", + "import_json": "从 JSON 导入", + "import_overwrite": "导入(覆盖数据)", + "inspect": "检查", + "label": "标记", + "load": "加载", + "load_more": "加载更多", + "manage": "管理", + "merge": "合并", + "new_automation": "+ 新建自动化", + "new_group": "+ 新建组", + "new_group_tip": "将形状/时长相近(不同温度或转速)的配置文件分组,使匹配器能可靠地区分它们", + "new_phase": "+ 新建阶段", + "new_profile": "+ 新建配置文件", + "new_profile_tip": "从现有已标记的周期或录制中创建新程序配置文件", + "on_cycle_finished": "周期完成时", + "on_cycle_started": "周期开始时", + "pause_cycle": "暂停", + "pause_cycle_tip": "暂停正在运行的周期 – 设备将从中断处恢复", + "pg_apply_device": "应用到设备", + "pg_autofill": "自动填充", + "pg_load_calibrated": "加载已校准 (ML) ({n})", + "pg_load_calibrated_tip": "将 ML 校准设置作为试验场覆盖值载入", + "pg_load_live": "加载生效设置", + "pg_load_live_tip": "重新读取集成的当前设置,并放弃试验场中的所有修改", + "pg_load_suggested": "加载建议项 ({n})", + "pg_load_suggested_tip": "将自动调谐器的当前建议作为试验场覆盖值载入", + "pg_preset_delete": "删除预设", + "pg_preset_load": "加载预设", + "pg_preset_load_tip": "用该预设替换试验场中的值(当前生效的设置不受影响)", + "pg_preset_save": "另存为预设", + "pg_preset_save_tip": "将下面的所有值保存为该设备的一个命名预设", + "pg_publish_all": "将 {n} 项应用到集成", + "pg_publish_one": "将 {label} 应用到集成", + "play": "播放", + "process": "处理", + "process_history": "立即处理", + "process_recording": "保存录制", + "process_tip": "将录制的电力记录保存为新的或现有的配置文件", + "rebuild": "重建包络", + "rebuild_envelope": "重建包络", + "rebuild_tip": "从已标记周期重新计算所有配置文件的预期功率包络(最小/最大范围)– 在标记新周期或修正旧周期后运行", + "rec_start_tip": "开始录制设备的电力轨迹 – 在运行周期之前立即开始", + "rec_stop": "停止", + "rec_stop_tip": "停止录制并保留已捕获的电力记录以供审核", + "record": "开始录制", + "refresh": "刷新", + "refresh_diag_tip": "重新加载存储统计信息", + "refresh_logs_tip": "重新加载最新日志记录", + "refresh_settings_tip": "从服务器重新加载设置", + "relabel": "重新标记({count})", + "remove": "移除", + "remove_timer": "删除计时器", + "reset": "重置", + "reset_ml_models_tip": "放弃微调模型并恢复内置模型。WashData 可以稍后重新学习。", + "reset_to_builtin": "重置为内置模型", + "reset_to_defaults": "重置为默认值", + "resume_cycle": "继续运行周期", + "resume_cycle_tip": "恢复已暂停的周期", + "revert_settings": "放弃更改", + "revert_settings_tip": "恢复上次保存前的设置", + "revert_settings_tip_none": "请先保存以启用撤销功能", + "revert": "还原", + "revert_to_previous": "将此设置还原为先前的值", + "review": "审查", + "run": "运行", + "run_analysis": "🔍 运行建议分析", + "run_analysis_tip": "立即分析已记录的周期并刷新调整建议", + "run_auto_label": "运行自动标记", + "run_both": "运行 A 对比 B", + "run_simulation": "运行模拟", + "save": "保存", + "save_access_control": "保存访问控制", + "save_group": "保存组", + "save_panel_settings": "保存面板设置", + "save_phases": "保存阶段", + "save_preferences": "保存偏好", + "save_reminders": "保存提醒", + "save_review": "保存审查", + "save_settings": "保存设置", + "select": "选择", + "select_all": "全选", + "select_last20": "最近 20", + "select_none": "清除", + "show_only": "只显示", + "skip_setup": "跳过设置", + "split": "拆分", + "stop": "停止", + "submit_correction": "提交修正", + "train_now": "立即训练", + "trim": "裁剪", + "trim_split": "裁剪 / 拆分", + "undo": "撤销", + "use": "使用", + "wipe_all": "清除所有数据", + "delete_selected": "删除所选({n})", + "group_suggest": "组 {n}:{members}", + "pg_apply_best": "应用最佳值", + "pg_apply_to_settings": "保存到设置", + "pg_apply_to_settings_tip": "将您在此处编辑的值复制到该设备当前生效的设置中", + "search": "搜索", + "import": "导入", + "disconnect": "断开连接", + "connect_github": "连接 GitHub", + "save_appliance": "保存家电", + "share_to_store": "分享到商店", + "share": "分享", + "confirm_appliance": "确认此家电", + "confirmed": "已确认", + "browse_community_setups": "浏览社区配置", + "download_device": "下载此配置", + "share_device": "⬆ 分享此设备", + "share_device_tip": "将此设备及其录制的参考周期分享到社区商店,让拥有相同机器的其他用户可以采用", + "share_n": "分享 {n} 个周期", + "export_selected": "导出(选择数据)", + "export_all": "快速导出全部", + "import_raw": "高级:用 JSON 替换全部", + "download_export": "下载导出文件", + "analyze_import": "分析文件", + "import_selected": "导入所选", + "back": "返回", + "mute_suggestion": "停止建议此设置", + "reset_muted": "重置已屏蔽" + }, + "conflict": { + "anti_wrinkle_exit": { + "exit": "必须低于停止阈值 ({stop} W);否则防皱退出功率将被忽略", + "stop": "必须高于防皱退出功率 ({exit} W)" + }, + "anti_wrinkle_max": { + "max": "必须高于启动阈值 ({start} W);否则防皱时长限制将被绕过", + "start": "必须低于防皱最大功率 ({max} W)" + }, + "attn_sub": "保存前请解决冲突", + "attn_title": "{n} 个设置冲突{s}", + "confidence": { + "auto": "必须不低于匹配阈值 ({match})", + "learning": "必须不超过匹配阈值 ({match})", + "match_for_auto": "必须不超过自动标记置信度 ({alc})", + "match_for_learning": "必须不低于学习置信度 ({lc})" + }, + "duration_ratio": { + "max": "必须大于最小时长比例 ({min})", + "min": "必须小于最大时长比例 ({max})" + }, + "hysteresis": { + "start": "必须高于停止阈值 ({stop} W)", + "stop": "必须低于启动阈值 ({start} W)" + }, + "min_power": { + "min_power": "必须不超过停止阈值 ({stop} W)", + "stop": "必须不低于最小功率 ({min} W)" + }, + "no_update_timeout": { + "timeout": "必须大于看门狗间隔 ({wi} 秒)", + "watchdog": "必须小于无更新超时 ({to} 秒)" + }, + "off_delay": { + "gap": "最小关闭间隔应至少为关闭延迟 ({delay} 秒)", + "off_delay": "关闭延迟 ({off_delay} 秒) 超过最小关闭间隔 ({gap} 秒);连续周期可能会合并" + }, + "power_off": { + "stop": "必须高于电源关闭阈值 ({pot} W)", + "threshold": "必须低于停止阈值 ({stop} W) 才能生效" + }, + "pump_stuck": { + "duration": "必须小于无更新超时 ({to} 秒),以确保卡泵警报在看门狗终止周期前触发", + "timeout": "必须大于泵卡住时长 ({ps} 秒),以确保卡泵警报在周期被强制停止前触发" + }, + "start_dur": { + "sampling": "采样间隔超过启动时长 ({sdt} 秒);单样本尖峰可能触发周期开始", + "threshold": "应至少为一个采样间隔 ({si} 秒) 以防止单样本误启动" + }, + "unmatch": { + "match": "必须高于不匹配阈值 ({un})", + "unmatch": "必须低于匹配阈值 ({match});否则已确认的匹配会立即取消" + }, + "cascade_toast": "为保持一致性,还自动调整了 {n} 项设置{s}。", + "suggestion_resolves": "应用下方的待处理建议({val})以修复此问题", + "use_fix": "使用 {val}", + "watchdog": { + "interval": "应至少为采样间隔 ({si} 秒) 的 2 倍", + "sampling": "采样间隔应最多为看门狗间隔 ({wi} 秒) 的一半" + }, + "settings_banner": "{n} 个设置冲突{s} – 请检查高亮显示的部分,并在保存前修复。", + "settings_banner_btn": "前往第一处" }, - "anti_wrinkle_max": { - "max": "必须高于启动阈值 ({start} W);否则防皱时长限制将被绕过", - "start": "必须低于防皱最大功率 ({max} W)" - }, - "attn_sub": "保存前请解决冲突", - "attn_title": "{n} 个设置冲突{s}", - "confidence": { - "auto": "必须不低于匹配阈值 ({match})", - "learning": "必须不超过匹配阈值 ({match})", - "match_for_auto": "必须不超过自动标记置信度 ({alc})", - "match_for_learning": "必须不低于学习置信度 ({lc})" - }, - "duration_ratio": { - "max": "必须大于最小时长比例 ({min})", - "min": "必须小于最大时长比例 ({max})" - }, - "hysteresis": { - "start": "必须高于停止阈值 ({stop} W)", - "stop": "必须低于启动阈值 ({start} W)" - }, - "min_power": { - "min_power": "必须不超过停止阈值 ({stop} W)", - "stop": "必须不低于最小功率 ({min} W)" - }, - "no_update_timeout": { - "timeout": "必须大于看门狗间隔 ({wi} 秒)", - "watchdog": "必须小于无更新超时 ({to} 秒)" - }, - "off_delay": { - "gap": "最小关闭间隔应至少为关闭延迟 ({delay} 秒)", - "off_delay": "关闭延迟 ({off_delay} 秒) 超过最小关闭间隔 ({gap} 秒);连续周期可能会合并" - }, - "power_off": { - "stop": "必须高于电源关闭阈值 ({pot} W)", - "threshold": "必须低于停止阈值 ({stop} W) 才能生效" - }, - "pump_stuck": { - "duration": "必须小于无更新超时 ({to} 秒),以确保卡泵警报在看门狗终止周期前触发", - "timeout": "必须大于泵卡住时长 ({ps} 秒),以确保卡泵警报在周期被强制停止前触发" - }, - "start_dur": { - "sampling": "采样间隔超过启动时长 ({sdt} 秒);单样本尖峰可能触发周期开始", - "threshold": "应至少为一个采样间隔 ({si} 秒) 以防止单样本误启动" - }, - "unmatch": { - "match": "必须高于不匹配阈值 ({un})", - "unmatch": "必须低于匹配阈值 ({match});否则已确认的匹配会立即取消" - }, - "cascade_toast": "为保持一致性,还自动调整了 {n} 项设置{s}。", - "suggestion_resolves": "应用下方的待处理建议({val})以修复此问题", - "use_fix": "使用 {val}", - "watchdog": { - "interval": "应至少为采样间隔 ({si} 秒) 的 2 倍", - "sampling": "采样间隔应最多为看门狗间隔 ({wi} 秒) 的一半" - }, - "settings_banner": "{n} 个设置冲突{s} – 请检查高亮显示的部分,并在保存前修复。", - "settings_banner_btn": "前往第一处" - }, - "hdr": { - "ab_comparison": "A/B 设置对比", - "access_control": "访问控制", - "add_maintenance": "添加维护事件", - "automation_delete": "删除此自动化", - "automation_needs_review": "此周期需要审查", - "automation_open": "在自动化编辑器中打开", - "automation_review_this_cycle": "审查此周期", - "automations": "自动化", - "clear_debug": "清除调试追踪", - "cycle_simulator": "周期模拟器", - "diagnostics_pref": "诊断", - "display": "显示", - "dtw_inspector": "DTW 检查器", - "export_import": "导出 / 导入", - "getting_started": "快速上手", - "live_power": "实时功率", - "logs": "日志", - "logs_diagnostics": "诊断", - "maintenance": "维护操作", - "maintenance_log": "维护日志", - "maintenance_reminders": "保养提醒", - "manual_recording": "手动录制", - "manual_recording_tip": "在 WashData 记录电力轨迹时有意运行一个周期。在设备启动前立即按开始,完成后按停止,然后按处理将其保存为命名配置文件。", - "ml_learned": "WashData 已学到的内容", - "ml_matching_tuning": "程序匹配微调", - "ml_settings_card": "设置", - "ml_smart_learning": "智能学习", - "my_preferences": "我的偏好", - "no_automations": "尚未有自动化引用此设备。", - "panel_settings": "面板设置", - "param_sweep": "参数扫描", - "phase_catalog": "阶段目录", - "playground": "试验场", - "process_history": "处理历史", - "settings_history": "设置历史", - "status": "状态", - "status_graph": "状态图表", - "storage_stats": "存储统计", - "test_history": "在历史数据上测试", - "toggle_sidebar": "切换家庭助理侧边栏", - "tools_and_data": "工具与数据", - "wipe_history": "清除历史", - "recommendations": "建议({n})", - "pg_detection_params": "检测设置", - "pg_timeline": "事件时间线", - "pg_outcome": "模拟结果", - "pg_across_cycles": "所有周期综合", - "community_store": "社区商店", - "online_account": "社区商店与在线功能" - }, - "health": { - "fair": "配置文件质量尚可", - "good": "✓ 配置文件质量良好", - "poor": "⚠ 配置文件质量差" - }, - "lbl": { - "actions": "操作", - "activity": "活动", - "administrators": "管理员", - "aria_compare_chart": "周期对比图表", - "aria_cycle_chart": "周期功率曲线", - "aria_envelope_chart": "配置文件功率包络图表", - "aria_phase_chart": "阶段编辑器图表", - "aria_playground_chart": "带可拖动检测阈值的周期功率曲线", - "aria_power_chart": "功耗图表", - "aria_spaghetti_chart": "叠加的周期功率曲线", - "aria_sweep_chart": "参数扫描结果图表", - "artifact_anomaly": "异常", - "artifact_high_power": "高功率", - "artifact_interruption": "中断", - "artifact_low_power": "低功率", - "auto_detect": "自动检测", - "auto_fine_tune_off": "自动微调已关闭", - "auto_fine_tune_on": "自动微调已开启(大约 {hour}:00)", - "avg_cost": "平均成本", - "change": "变更", - "clock_time": "时钟时间", - "cohesion_good": "凝聚力 {pct}%", - "cohesion_low": "⚠ 低凝聚力 {pct}%", - "compare_profiles": "与配置文件比较", - "concurrency": "并发", - "confidence": "置信度", - "confidence_threshold": "置信度阈值", - "correct_duration": "修正时长(分钟,可选)", - "correct_profile": "修正配置文件", - "correlation": "相关性", - "cost": "费用", - "create_new_profile": "+ 创建新配置文件…", - "current_phase": "当前阶段", - "curves": "曲线", - "cycle": "周期", - "cycle_date_display": "周期日期显示", - "cycle_health": "周期健康", - "cycle_index": "周期序号 →", - "cycles": "周期", - "cycles_count": "周期数", - "cycles_lc": "个周期", - "dashed": "虚线", - "date": "日期", - "debug_traces": "调试追踪", - "default": "默认", - "default_access_level": "未列出用户的默认级别", - "default_other": "默认(其他设备)", - "default_tab": "打开面板时的默认标签", - "delta": "Δ", - "description": "描述", - "dtw_blend_w": "混合权重", - "dtw_blended": "混合得分", - "dtw_ddtw": "DDTW 得分", - "dtw_l1": "L1 得分", - "dtw_matched_profile": "(该周期匹配的配置文件)", - "duration": "时长", - "duration_agreement": "时长一致度", - "emphasis": "强调", - "enable_access_control": "启用每用户访问控制", - "energy": "能耗", - "energy_agreement": "能耗一致度", - "event_timeline": "事件时间线", - "event_type": "事件类型", - "expected": "预期", - "expected_duration": "预期时长(分钟)", - "file_kb": "文件(kB)", - "final_score": "最终得分", - "from": "起始", - "gap_s": "间隔(秒)", - "group_name": "组名称", - "head_trim": "头部裁剪(秒)", - "health": "健康", - "hide_tabs": "对非管理员隐藏标签", - "in_use": "使用中", - "json_data": "JSON 数据", - "label": "匹配的程序", - "last": "最近", - "last_checked": "上次检查:", - "load_from_file": "从文件加载", - "mae_score": "MAE 得分", - "manual_duration": "手动时长(分钟,可选)", - "match": "匹配", - "members": "成员", - "metric": "指标", - "mode_existing_profile": "添加到现有配置文件", - "mode_new_profile": "创建新配置文件", - "models_fine_tuned": "({count}个模型{plural}已微调)", - "n_classic_suggestions": "{n} 经典", - "n_ml_suggestions": "{n} ML", - "n_selected": "已选 {n} 个", - "n_tuning_suggestions": "{n} 调整建议", - "na": "不适用", - "new_profile_name": "新配置文件名称", - "notes": "备注", - "of": "/", - "outcome": "结果", - "panel_default_tab": "默认标签", - "panel_language": "面板语言", - "per_cycle_short": "周期", - "pg_anti_wrinkle": "防皱", - "pg_autofill_tip": "根据当前值自动填充范围({lo}–{hi})", - "pg_best_value": "找到的最佳值", - "pg_current_value": "当前值:", - "pg_drag_hint": "拖动图表上的线条", - "pg_dtw": "DTW", - "pg_ev_ending": "结束中", - "pg_ev_running": "运行中", - "pg_group_advanced": "边缘情况", - "pg_group_detection": "检测触发条件", - "pg_group_timing": "计时规则", - "pg_idle": "空闲", - "pg_last_run": "上次运行:{date}", - "pg_match_score": "匹配得分", - "pg_pct_of": "{total} 中的 {p}%", - "pg_poor_match": "匹配较差", - "pg_strong_match": "强匹配", - "pg_tile_ambiguous": "不明确", - "pg_tile_ambiguous_tip": "两个程序几乎打平的周期", - "pg_tile_detected": "已检测", - "pg_tile_detected_tip": "功率越过启动阈值足够久、被记录为运行中的周期", - "pg_tile_matched": "已匹配", - "pg_tile_matched_tip": "正确归属到已知程序的周期", - "pg_time_left": "剩余时间", - "pg_weak_match": "弱匹配", - "phase_name": "名称", - "phase_timeline": "阶段时间线", - "power": "功率", - "profile": "配置文件", - "profile_index": "配置文件序号 →", - "profile_name": "配置文件名称", - "program": "程序", - "program_tip": "覆盖与当前周期匹配的配置文件。自动检测让集成自动选择最佳匹配。当自动检测出错或您知道正在运行什么时,固定特定程序以强制匹配。", - "progress": "进度", - "raw_socket": "原始套接字", - "read_only": "只读", - "ref_cycle": "参考周期(可选)", - "refresh_interval": "刷新间隔(秒)", - "remaining": "剩余", - "reminder_every": "提醒间隔(周期)", - "remove_label": "- 删除标签 -", - "rename_profile": "重命名配置文件", - "replay_duration": "回放", - "resulting_profile": "结果配置文件", - "save_mode": "保存模式", - "score": "得分", - "score_breakdown": "得分明细", - "seconds_from_start": "从开始计的秒数", - "select_profile": "选择配置文件", - "setting": "设置", - "settings_a": "设置 A(当前)", - "settings_a_short": "A", - "settings_advanced": "高级", - "settings_b": "设置 B(测试)", - "settings_b_short": "B", - "settings_basic": "基础", - "settings_detail_level": "设置详细程度", - "settings_overrides": "设置覆盖项", - "show_debug": "在状态页面显示实时匹配调试卡(置信度、歧义、最佳候选)", - "show_expected": "显示预期曲线叠加(匹配配置文件,橙色)", - "show_raw": "在实时功率图中显示原始插座切换开关", - "sparkline": "近期周期时长趋势", - "stage2": "阶段 2 – 核心相似度", - "stage3": "阶段 3 – DTW", - "stage4": "阶段 4 – 一致度", - "status": "状态", - "tail_trim": "尾部裁剪(秒)", - "timer_auto_pause": "自动暂停", - "timer_min": "分钟", - "timer_msg_placeholder": "消息(可选,{device}/{program}/{minutes})", - "to": "结束", - "ungrouped": "未分组", - "unlabelled": "未标记", - "unlabelled_paren": "(未标记)", - "warp_path": "规整路径", - "input": "输入:", - "start": "开始", - "end": "结束", - "unit_s": "(秒)", - "reviewed_on": "审核于 {date}", - "unknown": "未知", - "quality": "质量", - "tags": "标签", - "at": "于", - "pct_match_confidence": "{pct}% 匹配置信度", - "ha_restarted": "HA 已重启", - "from_start": "从开始", - "to_end": "到结束", - "click_to_select": "点击选择", - "envelope": "包络", - "zoom_hint": "滚动缩放 · 双击重置", - "loading_paren": "(加载中…)", - "time_remaining": "剩余 ~{v}", - "no_duration": "无时长", - "duration_avg": "平均 ~{v}分钟", - "name_placeholder": "(名称)", - "n_shown": ",显示 {n} 个", - "cycles_title": "周期({n})", - "pg_detecting": "检测中", - "pg_best_marker": "最佳:{v}", - "pg_time_left_model": "剩余时间(模型)", - "pg_time_left_model_tip": "由模型估算的剩余时间(阶段估算 + ML 混合),并非固定倒计时。", - "phase": "阶段", - "pg_mode_simulate": "模拟", - "pg_mode_history": "历史测试", - "pg_mode_sweep": "参数扫描", - "pg_ev_detected": "已检测", - "pg_ev_match": "匹配确定", - "pg_ev_match_changed": "匹配已更改", - "pg_ev_ambiguous": "不明确", - "pg_ev_unmatched": "未匹配", - "pg_ev_notify_start": "开始通知", - "pg_ev_notify_pre": "即将完成通知", - "pg_ev_notify_finish": "完成通知", - "pg_ev_notify_milestone": "里程碑通知", - "pg_ev_notify_held": "通知已暂存(免打扰时段)", - "pg_ev_finished": "已完成", - "pg_ended": "已结束", - "pg_proj_energy": "预计能耗", - "pg_alert_overrun": "运行过长", - "pg_alert_underrun": "运行过短", - "pg_alert_did_not_finish": "未完成", - "pg_alert_false_end": "拆分为多个周期", - "pg_alert_unmatched": "未匹配", - "pg_alert_ambiguous": "匹配不明确", - "pg_alert_energy": "能耗异常", - "pg_newly_correct": "新增正确", - "pg_regressed": "变差", - "pg_end_timing_changed": "结束时机改变", - "pg_vs_current": "对比当前", - "pg_fixed": "已修复", - "pg_broke": "出现问题", - "pg_sweep_param": "参数", - "pg_objective": "目标", - "pg_steps": "步数", - "pg_stress_group": "闲置终止测试", - "pg_stress_idle_auto": "Auto", - "pg_stress_idle_w": "待机功率 (W)", - "pg_stress_idle_w_desc": "覆盖自动检测的待机功率下限(留空则使用自动值)。", - "pg_stress_toggle": "测试闲置终止", - "pg_stress_toggle_desc": "模拟设备在录制结束后维持待机功耗水平,查看 WashData 是否以及何时停止运行周期。", - "pg_sweep_2d": "2D 热图", - "pg_sweep_param_y": "第二个参数", - "pg_obj_match": "匹配准确度", - "pg_obj_endtiming": "结束时机准确度", - "pg_obj_falseend": "误结束率", - "pg_obj_overrun": "时长偏离目标", - "pg_obj_ambiguity": "不明确率", - "pg_best_combo": "最佳组合", - "pg_mode_optimize": "优化", - "pg_group_matching": "程序匹配", - "pg_zoom_hint": "双击可重置缩放", - "aria_playground_chart2": "交互式周期功率图:悬停查看时间/功率,滚动缩放,拖动平移", - "pg_alert_timeout_end": "因超时而结束,并非预测结束", - "pg_alert_indefinite": "将一直运行下去", - "pg_alert_stress_cap": "已达到安全上限", - "pg_alert_stress_ok": "闲置终止: 运行周期已停止", - "pg_alert_stress_warn": "待机功耗超过停止阈值", - "task_pg_history": "用历史测试", - "task_pg_sweep": "优化", - "task_reprocess": "重新处理", - "task_ml_training": "学习", - "eta_secs": "剩~{n}秒", - "eta_mins": "剩~{n}分", - "pg_recent_runs": "最近的运行", - "pg_load_run": "重新加载此运行", - "pg_match_confidence": "匹配置信度", - "pg_envelope_fit": "包络拟合度", - "pg_envelope_fit_tip": "周期与此配置文件已保存的功率包络的贴合程度,与匹配置信度不同的视角。", - "n_imported_note": ",已导入 {n} 个", - "enable_online": "启用在线功能", - "store_brand": "家电品牌", - "store_model": "家电型号", - "anonymous": "匿名", - "rate_quality": "评价质量", - "rate_n": "{n} 星", - "approved_only": "仅已批准", - "adopt_settings": "同时采用设置", - "flags": "标志", - "include_phase_map": "包含阶段图", - "include_settings": "包含检测与匹配设置", - "show_contributor": "显示贡献者名称", - "task_pg_detail": "模拟周期", - "task_split": "正在拆分周期", - "task_trim": "正在裁剪周期", - "task_merge": "正在合并周期", - "task_rebuild": "正在重建包络", - "cat_profiles": "配置文件(程序)", - "cat_real_cycles": "周期(运行历史)", - "cat_reference_cycles": "参考周期(已导入)", - "cat_custom_phases": "自定义阶段", - "cat_profile_groups": "配置文件组", - "cat_settings": "检测与识别设置", - "cat_matching_config": "识别器调优", - "cat_ml_models": "ML 模型", - "cat_feedback": "反馈与审阅标签", - "cat_suggestions": "建议", - "cat_maintenance_log": "维护日志", - "cat_history_logs": "历史与更改日志", - "cat_lifetime_stats": "累计总量", - "cycles_short": "周期", - "import_mode": "合并方式", - "mode_merge": "合并(保留我的)", - "mode_replace": "替换所选", - "cycle_destination": "导入的周期应存放到哪里?", - "dest_reference": "参考(仅形状)", - "dest_real_history": "真实历史(计入统计)", - "conflict_resolution": "名称冲突", - "conflict_import_copy": "作为副本导入", - "conflict_keep_mine": "保留我的", - "conflict_overwrite": "覆盖" - }, - "log": { - "all_levels": "所有级别", - "all_devices": "所有设备", - "all_components": "所有组件", - "search_ph": "搜索日志…" - }, - "ml": { - "builtin_models": "● 使用内置模型", - "fit_fair": "尚可", - "fit_good": "良好", - "fit_slight": "轻微", - "fit_strong": "强", - "fit_weak": "弱", - "fit_word": "拟合", - "personalized": "● 已针对此机器个性化", - "better_than_baseline": "比基线估计好 {pct}%({metric})", - "trend_improving_tip": "该模型的拟合度在最近几次重新检查中有所提升。", - "trend_declining_tip": "该模型的拟合度在最近几次重新检查中有所下降,审查更多周期可能有助于它重新学习。", - "trend_steady_tip": "该模型的拟合度在最近几次重新检查中大致保持稳定。", - "cap_blurb": { - "end": "判断洗涤周期何时真正结束", - "live_match": "更早识别正在运行的程序", - "quality": "发现误检或损坏的周期", - "remaining_time": "预测剩余时间", - "total_energy": "预测总能耗和费用" - }, - "cap_label": { - "end": "周期结束检测", - "live_match": "程序匹配", - "quality": "周期质量检查", - "remaining_time": "剩余时间估算", - "total_energy": "能耗估算" - }, - "metric_auc": "留出验证数据上的 AUC {auc}", - "metric_mae": "误差 {model} vs 基线 {baseline}" - }, - "modal": { - "auto_label": "自动标记周期", - "correct_feedback": "修正反馈", - "create_profile": "创建配置文件", - "cycle": "周期", - "edit_group": "编辑配置文件组", - "edit_phase": "编辑阶段", - "import_config": "导入配置", - "label_cycle": "标记周期", - "merge_cycles": "合并 {n} 个周期", - "new_group": "新建配置文件组", - "new_phase": "新建阶段", - "process_history_msg": "重新运行匹配、刷新建议、重新训练 ML(如果启用)并重新计算所有存储循环的循环健康状态。这可能需要一些时间。", - "process_history_ok": "处理", - "process_history_title": "处理历史记录", - "process_recording": "处理录制", - "delete_maintenance_msg": "删除此维护记录?此操作无法撤销。", - "delete_maintenance_title": "删除维护事件", - "relabel_cycles": "重新标记 {count} 个周期", - "delete_automation_title": "删除自动化", - "delete_automation_msg": "从 Home Assistant 中删除自动化“{name}”吗?此操作无法撤销。", - "remove_legacy_title": "移除旧版操作", - "remove_legacy_msg": "移除旧版自定义操作吗?它们将不再在周期事件上触发。此操作无法从面板撤销。", - "discard_recording_title": "丢弃录制", - "discard_recording_msg": "丢弃已保存的录制吗?此操作无法撤销。", - "dismiss_all_title": "关闭所有反馈", - "dismiss_all_msg": "关闭全部 {count} 个待处理的反馈请求吗?", - "dismiss_all_ok": "全部关闭", - "delete_phase_title": "删除阶段", - "delete_phase_msg": "删除阶段“{name}”吗?", - "clear_debug_title": "清除调试数据", - "clear_debug_msg": "删除所有已存储的调试追踪吗?", - "wipe_all_title": "清除所有数据", - "wipe_all_msg": "⚠️ 这将永久删除所有周期和配置文件。此操作无法撤销。", - "wipe_all_ok": "清除全部", - "force_stop_title": "强制停止周期", - "force_stop_msg": "立即强制停止当前周期吗?该周期将被保存为已中断。", - "store_import": "导入参考周期", - "store_share": "分享到社区商店", - "store_share_device": "分享此设备", - "export_select": "导出 - 选择数据", - "import_wizard": "导入 - 选择数据" - }, - "msg": { - "appliance_monitor": "设备监控", - "artifact_dip_detail": "跌破通常功率范围约 {n} 秒。", - "artifact_footer": "在上图中高亮显示。这些是瞬态异常(例如门在周期中打开),不一定是问题。", - "artifact_header": "此周期中检测到 {n} 个异常", - "artifact_pause_detail": "功率降至接近零约 {n} 秒后恢复 – 可能是周期中途开门或周期被暂停。", - "artifact_spike_detail": "超出通常功率范围约 {n} 秒。", - "auto_label_intro": "为置信度达到阈值的未标记周期分配配置文件。", - "automations_intro": "WashData 触发 {start} / {end} 事件并公开实体,因此通知和操作最好构建为常规 Home Assistant 自动化。使用此设备的自动化显示在下方。", - "cleanup_intro": "显示所有已标记周期的叠加。勾选离群值并删除以清理配置文件。", - "clear_debug_hint": "删除存储的调试数据以释放空间。", - "collecting_data": "正在收集数据,还需要 {need} 个周期{plural}才能开始微调({current}/{min})。", - "compare_overlay_profiles": "叠加配置文件(浅色)", - "compare_profiles_tip": "将其他配置文件包络叠加在上方图表上,看哪个最适合此周期。", - "compare_selected_cycles": "选中的周期(实线)– 显示/隐藏", - "consider_new_profile": "考虑创建新配置文件。", - "coverage_gap": "近期周期没有匹配的配置文件(最近 30 次的 {pct}%)。", - "coverage_gap_similar_cycles": "发现 {count} 个相似未标记周期 – 创建配置文件以开始匹配它们。", - "cycles_deleted": "已删除 {count} 个周期", - "enough_data": "有足够数据可供学习({current}/{min} 个循环)。", - "export_description": "精确选择要导出到 JSON 的配置文件、周期、设置等,或分析文件并仅导入所需的部分。", - "feedback_cycles_pending": "{n} 个周期{s}待审查", - "feedback_prompt": "确认正确、修正程序或忽略。", - "feedback_relabel_hint": "重新标记此周期也会解决它。", - "filter_by_profile": "按配置文件筛选…", - "group_modal_help": "将形状相同但温度/转速不同的程序分组(时长可能不同)。匹配将组作为一个候选项评分,然后选择最合适的成员。至少选 2 个;叠加显示相似程度。", - "group_not_cohesive": "这些配置文件不够相似,无法可靠分组,因此匹配会单独处理它们,直到您移除离群值或拆分组。", - "group_preview_hint": "勾选 2+ 个成员以预览并比较其功率曲线。", - "import_intro": "加载导出文件或在下方粘贴 JSON 内容。", - "legacy_actions_title": "{count} 个旧版自定义操作仍在运行", - "live_chart_loading": "实时功率图表将随读数到达而显示。", - "loading": "加载中…", - "loading_curve": "加载曲线…", - "loading_settings": "加载设置…", - "log_buffer_hint": "最新在前 · 缓冲自重启以来最后 500 条 ha_washdata 记录 · 拖动底边调整大小。", - "maintenance_advisory": "时长/能耗增加可能表明设备需要维护(例如除垢、清洗滤网)。", - "maintenance_due": "待办维护:{items}", - "maintenance_intro": "记录您对此设备执行的保养,并在每项任务再次到期时收到提醒。", - "maintenance_load_error": "无法加载维护数据:{error}", - "maintenance_requires_access": "维护和导出/导入需要完全访问权限。", - "manual_duration_hint": "配置文件的平均/预期周期时长,用于剩余时间估算。编辑以设置;保持不变则保留当前值。", - "matching_tuning_intro": "在学习时,WashData 还会调整程序匹配对形状与时长和能耗的权重比例。", - "merge_intro": "选中的周期将按时间顺序合并(间隙填充为 0 W)。选择结果配置文件。", - "ml_intro": "WashData 配备了开箱即用的智能模型。", - "ml_learned_intro": "针对此机器微调的模型。", - "ml_loading": "加载 ML 中…", - "ml_settings_intro": "两个独立开关:一个在周期运行时应用模型,另一个让 WashData 随时间针对您的机器进行微调。", - "name_first_program": "您已有足够的周期 – 为您的第一个程序命名即可开始匹配。", - "near_duplicate_cluster": "检测到近似重复的配置文件群。分组可让匹配在相似项目间可靠地选择(例如同一程序在不同温度/转速下)。", - "no_cycles_match": "没有与当前筛选条件匹配的周期。", - "no_cycles_profile": "此配置文件没有周期。", - "no_cycles_selected": "请先至少选择一个周期。", - "no_cycles_yet": "尚未记录任何周期。", - "no_device_selected": "未选择设备。", - "no_devices": "尚未配置 WashData 设备。", - "no_envelope": "还没有包络 – 标记周期后重建。", - "no_envelope_overlay": "没有可叠加的包络。", - "no_fine_tuned": "尚未微调 – WashData 正在使用内置模型。", - "no_logs": "尚未缓冲任何日志记录。", - "no_maintenance": "尚未记录任何维护。", - "no_match_yet": "尚未尝试匹配 – 此项在运行周期时填充。", - "no_other_users": "未找到其他 Home Assistant 用户。", - "no_phases": "未定义阶段。", - "no_phases_assigned": "未分配阶段。", - "no_profiles_compare": "没有可比较的配置文件。", - "no_profiles_overlay": "没有可叠加的配置文件。", - "no_profiles_yet": "还没有配置文件。从已标记的周期创建一个。", - "no_profiles_yet_short": "还没有配置文件。", - "no_settings_match": "没有与“{q}”匹配的设置", - "no_split_points": "还没有分割点。", - "no_suggestions": "没有活跃的建议。", - "notify_services_hint": "使用 {entity} 服务 ID(多个请用英文逗号分隔)。模板变量:{vars}。", - "old_actions_warning": "使用旧版操作编辑器配置(现已移除)。它们仍会在周期事件上触发,但无法在此处编辑。将它们转换为普通自动化,或移除它们。", - "onboarding_progress": "已观察 {n} / 3 个周期", - "onboarding_watching": "照常使用您的设备 – WashData 正在观察。3 个周期后将开始程序匹配。", - "pending_feedback": "待处理的检测反馈", - "performance_trend": "性能趋势({n} 个周期)", - "pg_analysis_empty": "加载一个周期以查看匹配分析。", - "pg_apply_confirm": "应用最佳值:{label} = {value}?", - "pg_canvas_empty": "在上方选择一个周期,然后按加载查看其功率轨迹。", - "pg_chart_caption": "不同 {param} 取值下的检测/匹配率", - "pg_match_rate": "在 {total} 个周期上的匹配率为 {pct}%", - "pg_restart_note": "重启 Home Assistant 以启用模拟工具。", - "pg_sim_progress": "{done} / {total} 个周期", - "pg_starting": "正在启动…", - "pg_stress_synthetic": "待机模拟从此处开始", - "pg_sweep_intro": "如果 {param} 不同会怎样?在最近 {cycles} 个周期上测试 {steps} 个值,找到能正确匹配最多周期的设置。", - "pg_sweep_step": "步骤 {done} / {total}", - "pg_undetected": "{n} 个周期{s}未检测到", - "pg_verdict_bad": "需要注意: 许多周期未被检测到。", - "pg_verdict_good": "调校良好: 大多数周期都被正确识别和匹配。", - "pg_verdict_ok": "尚可: 漏掉了一些周期。可尝试降低启动阈值。", - "phase_catalog_intro": "周期的命名片段(预洗、加热、甩干…)。从其控制面板将它们分配给配置文件。", - "phase_ranges_intro": "叠加在平均曲线上的阶段范围(从周期开始的分钟数)。编辑值以实时预览。", - "playground_intro": "一个安全的沙盒,可用不同设置回放过去的周期、并排比较两套配置,并查看周期如何与配置文件对齐。在您明确应用之前,此处的任何操作都不会更改您的实时数据。", - "playground_needs_restart": "重启 Home Assistant 以启用试验场工具。", - "preferences_admin": "偏好、面板和访问控制", - "preferences_adv": "偏好", - "prefs_personal": "这些仅适用于您的 Home Assistant 账户。", - "process_history_hint": "对所有存储的循环重新运行匹配、刷新调优建议、重新训练 ML 模型(如果启用)并重新计算循环健康状态。在批量审查后运行此项。", - "profile_deleted": "配置文件已删除", - "profile_poor_health_detail": "分配给此配置文件的周期形状不一致或置信度较低。考虑重建包络或审查已标记的周期。", - "profiles_intro": "点击配置文件查看统计、阶段和清理。将形状/时长相近(不同温度或转速)的程序分组,以便匹配可靠地区分它们。", - "rbac_hint": "关闭时,每个 Home Assistant 用户都有完全访问权限(默认)。管理员始终有完全访问权限并可管理所有人。", - "recent_logs": "最近的 ha_washdata 记录", - "recording_in_progress": "录制进行中", - "reminders_intro": "在上次保养后经过这么多个周期时在面板中显示提醒。留空或填 0 可关闭提醒。", - "restart_gap_footer": "在图表上突出显示。这些间隔的功率数据缺失––仅使用真实读数进行匹配。", - "restart_gap_header": "{n} 此周期内的 HA 重新启动间隔", - "restart_gap_item": "{dur}间隙", - "review_confirm_help": "确认此周期是否被正确检测。您的审查可在您的机器上训练模型 – 确认的周期越多,匹配和健康评分越好。快速的好/差就足够了。", - "review_in_settings": "在设置中审查", - "review_notes_placeholder": "注释(可选)", - "review_notes_tip": "供个人参考的自由文本注释。不用于匹配或训练。", - "review_profile_tip": "此周期标记的程序。如果自动检测的程序有误,请在此处修正 – 标记可帮助未来周期的匹配学习。", - "review_quality_tip": "此周期的质量。好 = 该程序的标准示例;差 = 已检测但有噪声或不典型;不可用 = 误检测(合并、截断或虚假)。影响健康评分及允许训练模型的周期。", - "review_recorded_tip": "将此标记为其程序的精选参考周期 – 与手动录制周期的作用相同。参考周期始终保留,为匹配模板提供种子,且不会被清理删除。(这是“黄金”/录制标志;两者是同一件事。)", - "review_tags_tip": "描述此周期出现问题的可选标志,以便训练和清理可以考虑这些问题。", - "review_to_cycles": "打开周期审查队列", - "saving_triggers_reload": "保存会触发集成重载。HA 实体可能短暂显示为不可用。", - "search_placeholder": "搜索设置…", - "see_recorder": "查看下方的录制小部件", - "setting_changed": "于 {date} 从 {old} 更改为 {new}", - "settings_basic_note": "正在显示基本设置。切换到高级可查看完整列表。", - "shape_drift_advisory": "⚠ 形状偏移", - "shape_drift_detail": "此配置文件的功率模式随时间发生了变化 – 可能是设备磨损或需要维护(例如除垢、清洁滤网)。", - "show_all_settings": "显示所有设置", - "showing_suggestions": "显示 {count} 个有建议的设置。", - "split_intro": "点击图表添加或删除分割点,或通过空闲间隔自动检测。每个结果片段可获得自己的配置文件。", - "storage_diagnostics": "存储统计、维护、导出/导入", - "sug_staged": "已设置 {key} = {val}。保存以应用。", - "toast_auto_detect_enabled": "自动检测已启用", - "toast_auto_label_complete": "自动标注完成", - "toast_auto_label_failed": "自动标注失败:{error}", - "toast_automation_failed": "无法创建自动化:{error}", - "toast_automation_migrated": "操作已迁移至自动化,正在打开编辑器", - "toast_convert_failed": "转换失败:{error}", - "toast_create_failed": "创建失败:{error}", - "toast_delete_failed": "删除失败:{error}", - "toast_error": "错误:{error}", - "toast_failed": "失败:{error}", - "toast_force_stop_failed": "强制停止失败:{error}", - "toast_name_required": "需要填写名称", - "toast_no_automation": "此处无法创建自动化", - "toast_profile_name_required": "配置文件名称为必填项", - "toast_program_set": "已设置程序:{program}", - "toast_rebuild_failed": "重建失败:{error}", - "toast_resume_failed": "恢复失败:{error}", - "toast_revert_failed": "还原失败:{error}", - "toast_reverted": "已还原 {key}", - "toast_save_failed": "保存失败:{error}", - "trend_duration_longer": "时长趋势增长({pct}%/周期)– 近期平均 {avg}", - "trend_duration_shorter": "时长趋势缩短({pct}%/周期)– 近期平均 {avg}", - "trend_energy_down": "能耗趋势下降({pct}%/周期)", - "trend_energy_up": "能耗趋势上升({pct}%/周期)– 近期平均 {avg}", - "trim_intro": "拖动红色控制柄,或输入值。窗口外的所有内容将被移除。", - "tuning_suggestions_available": "来自观察周期的 {count} 个调整建议可用。它们显示在相关字段旁边。", - "unsure_detected_prefix": "WashData 不确定是否检测到", - "updated": "已更新", - "warmup_badge": "仍在学习中({done}/{needed} 个周期)", - "warmup_detail": "该配置文件需要 {needed} 个已标记的周期后才能开始自动匹配。每个已确认的周期都有助于学习。", - "wipe_history_warning": "永久删除所有周期和配置文件。无法撤销。", - "compare_overlay_tip": "叠加已学习的配置文件包络,查看每个周期与哪个程序相似。", - "duration_trend_up_tip": "时长上升({pct}%/周期)", - "duration_trend_down_tip": "时长下降({pct}%/周期)", - "energy_trend_up_tip": "能耗上升({pct}%/周期)", - "energy_trend_down_tip": "能耗下降({pct}%/周期)", - "performance_trending": "性能趋势变化", - "pg_select_cycle_hint": "选择一个周期并点击 ↺ 加载", - "pg_sweep_progress": "步骤 {done} / {total}", - "pg_analysis_hint": "选择一个周期并点击 ↺ 加载分析。", - "diagnostics_load_failed": "无法加载诊断:{error}", - "manual_duration_ref_hint": "仅在未选择参考周期时使用。参考周期会根据自身长度设置时长。", - "toast_convert_rolled_back": "转换失败并已回滚(未遗留任何自动化):{error}", - "toast_convert_orphan": "自动化已创建,但清除旧操作失败。请勿重试:请手动移除旧操作,以避免自动化重复。", - "advisory_duration_trend_up": "'{name}' 的周期正逐渐变长(每个周期约 +{pct}%)。如果设备行为发生了变化,请重新录制或重建此配置文件。", - "advisory_energy_trend_up": "'{name}' 的能耗正逐渐增加(每个周期约 +{pct}%) - 如果这不符合预期,建议检查一下设备。", - "advisory_poor_health": "'{name}' 的拟合度评分较低 - 其近期周期波动较大或匹配较弱。请检查其周期或重新录制该配置文件,以保持匹配和时间估算的准确性。", - "advisory_shape_drift": "'{name}' 已明显偏离其原始功率曲线。设备行为可能随时间发生了变化(例如水垢、磨损)。建议用近期周期重新录制此配置文件。", - "advisory_shape_drift_corr": "'{name}' 已明显偏离其原始功率曲线(相关系数 {corr})。设备行为可能随时间发生了变化(例如水垢、磨损)。建议用近期周期重新录制此配置文件。", - "pg_no_alerts": "本次运行未检测到问题。", - "pg_override_active": "正在使用您编辑的设置对比当前设置", - "pg_history_intro": "用真实的检测器和匹配器重放您最近的周期。若要在此查看前后对比,请先在模拟中编辑一项检测设置。", - "pg_history_empty": "按运行以重放您的周期。", - "pg_history_summary": "{detected}/{total} 已检测 · {correct} 正确匹配", - "pg_sweep_no_metric": "数据不足,无法为此目标评分。", - "pg_sweep_intro2": "在您最近的周期中找到最能满足某个目标的设置。在您应用之前不会有任何更改。", - "pg_running_history": "正在重放您的周期…", - "pg_running_sweep": "正在所有周期上测试各个值…", - "pg_row_load_hint": "在上方图表中加载此周期", - "pg_history_intro2": "使用上方设置,将您最近的周期通过真实的检测器和匹配器重新运行。点击任意行可在图表中加载该周期;修改设置可查看修改前后的对比。", - "pg_simulating": "正在模拟周期…", - "pg_canvas_empty2": "在上方选择一个周期并按“运行”进行模拟。然后悬停查看数值,滚动缩放,拖动平移。", - "pg_apply_settings_confirm": "将这 {n} 项设置保存到该设备吗? {list}", - "pg_stress_terminated_detail": "稳定在约 {idle}W 的待机功率 -- {h} 小时 {m} 分钟后通过 {reason} 结束了周期。", - "pg_stress_above_threshold_detail": "待机功耗约 {idle}W 达到或超过有效停止阈值 ({stop}W) -- 周期从未被判定为静止状态。请提高 stop_threshold_w 以修复。", - "pg_stress_hit_cap_detail": "周期运行了 {h} 小时 {m} 分钟仍未停止 -- 被安全上限强制停止。待机功耗 {idle}W 对比停止阈值 {stop}W。", - "no_logs_match": "没有日志记录符合这些筛选条件。", - "pg_analysis_hint2": "选择一个周期并点击运行以加载匹配分析。", - "pg_analysis_empty2": "点击运行以查看匹配分析。", - "imported_readonly": "从社区商店导入。用于参考和匹配。不计入您的统计,且无法编辑。", - "merge_no_imports": "导入的录制无法合并到真实周期中。取消选择它们以进行合并。", - "store_enable_hint": "在设置中启用在线功能,以浏览和导入社区参考周期。", - "online_intro": "与其他 WashData 用户分享和下载参考周期。所有在线功能均为自愿加入,默认关闭。", - "store_share_intro": "上传此参考周期,以便拥有相同家电的其他人使用。它会经过审核后才公开显示。", - "online_intro_global": "与其他 WashData 用户浏览和分享参考录制,并确认家电条目。一次连接适用于您的整个 WashData 集成;家电品牌和型号在“基本配置”下按设备设置。所有在线功能均为自愿加入,默认关闭。", - "online_unavailable": "此服务器不支持在线功能。", - "store_picker_offline": "在设置齿轮中启用在线功能,即可从社区目录中选择。", - "pick_brand_first": "请先选择家电品牌。", - "model_not_found": "尚未收录在目录中。", - "connect_to_confirm": "在设置齿轮中连接以确认或评分。", - "adopt_settings_hint": "用共享的设置覆盖此设备的检测和匹配阈值。您的通知、实体和电价永远不会更改。", - "include_settings_hint": "分享此设备的识别和匹配阈值(不含通知、实体或电价)。采用者自行选择是否应用。", - "onboard_download": "新设备?从拥有相同设备的其他 WashData 用户处采用现成配置(程序、参考周期和阶段)。", - "share_consent": "我确认这些周期均正常完成,无中断", - "share_device_none": "暂无可分享的周期。请先在\"周期\"选项卡中将录制或手动选择的周期标记为参考周期(⭐)。", - "share_guideline_naming": "请按设备表盘或显示屏上显示的名称命名每个配置文件(例如:'Cotton 40'、'Eco 60')。", - "share_guideline_quality": "仅分享正常完成的周期 -- 无周期中断、开门事件或电源波动。", - "share_guideline_review": "您的上传从待审核状态开始,待足够多的社区成员确认后将公开显示。", - "share_guidelines_title": "分享前须知", - "store_download_device_intro": "将所有共享程序及其参考周期采用到您的设备。您自己录制的周期和统计数据不受影响。", - "store_share_device_intro": "上传 {brand} {model} 及您选择的参考周期。拥有相同设备的其他用户可以采用您的程序。条目在公开前经过审核。", - "share_profile_no_cycles": "无参考周期 -- 请在\"周期\"选项卡中将周期标记为 ⭐ 以包含此配置文件", - "advisory_phase_inconsistent": "'{name}' 似乎混合了不同的程序或温度,各周期的加热时长差异很大。将其拆分为独立的配置文件(例如按温度区分)可以改善匹配和时间估算。", - "advisory_phase_inconsistent_title": "⚠ 可能混合了不同程序", - "export_select_intro": "精确勾选要包含的内容。即使选择配置文件而不包含其周期,仍会导出可识别的程序(其学习到的形状会一同迁移)。", - "import_analyze_hint": "加载导出的文件(或粘贴其 JSON)。WashData 会对其进行分析,并在任何更改之前准确显示可导入的内容。", - "analyzing": "正在分析…", - "device_type_mismatch_warn": "此导出文件来自不同的设备类型({src} 对 {local})。程序和周期仍可作为参考数据导入,但设备专属设置和真实历史导入将被禁用。", - "merge_hint": "导入的项目会被添加,本地数据不会丢失。名称冲突将在下方解决。", - "replace_warn": "每个勾选的类别都会被清除并用文件中的内容替换。未勾选的类别保持不变。", - "dest_reference_hint": "导入的周期仅用于改进程序识别,绝不影响用量/能耗统计。", - "dest_real_history_hint": "导入的周期计为本设备自身的历史记录,并纳入能耗/用量统计。适用于将一台设备迁移到新的安装环境。" - }, - "pg_desc": { - "completion_min_seconds": "计为真实周期的最短运行时间", - "end_repeat_count": "结束前连续的低读数次数", - "interrupted_min_seconds": "短周期标记为中断", - "min_off_gap": "区分两个周期所需的间隔", - "off_delay": "周期结束前低功率持续的秒数", - "start_duration_threshold": "确认启动所需的超阈值秒数", - "start_threshold_w": "计为启动的最小瓦数", - "stop_threshold_w": "低于此值机器计为关闭", - "anti_wrinkle_enabled": "吸收主阶段之后的翻滚脉冲,而不是将其识别为新周期", - "anti_wrinkle_exit_power": "脉冲之间的功率必须低于此值,防皱才能保持活动", - "anti_wrinkle_idle_timeout": "防皱结束前两次翻滚脉冲之间允许的静止时间", - "anti_wrinkle_max_duration": "长于此值的脉冲将结束防皱并开启新周期", - "anti_wrinkle_max_power": "高于此值的脉冲将结束防皱并开启新周期", - "dtw_bandwidth": "Stage 3: Sakoe-Chiba 规整带宽 (0 = DTW 关闭; 默认 0.2 = 周期长度的 20%)", - "corr_weight": "Stage 2: 曲线形状(相关性)与功率水平(MAE)之间的平衡; 默认 0.45", - "duration_weight": "Stage 4: 运行时长一致性对最终得分的影响程度(默认 0.22)", - "energy_weight": "Stage 4: 能耗一致性对最终得分的影响程度(默认 0.22)", - "profile_match_min_duration_ratio": "Stage 1: 最短允许运行时长占档案时长的比例; 默认 0.1 (10%)", - "profile_match_max_duration_ratio": "Stage 1: 最长允许运行时长占档案时长的比例; 默认 1.5 (150%)", - "keep_min_score": "Stage 2: 保留在竞争中的最低得分; 默认 0.1 接受弱候选,后续阶段选出最佳", - "dtw_blend": "Stage 3: 0 = 仅核心得分,1 = 仅 DTW 得分,0.5 = 等权混合(默认)", - "dtw_ensemble_w": "Stage 3 (集成模式): 缩放 L1 对导数 DTW 的权重; 默认 0.7 偏重水平感知", - "dtw_ddtw_scale": "Stage 3: DDTW 半饱和距离; 越小对形状越敏感(默认 30)", - "dtw_refine_top_n": "Stage 3: DTW 重新评分的候选数量; 若正确档案排在第 4-5 位则调高至 7-9(默认 5)", - "duration_scale": "Stage 4: 时长一致性得分减半时的对数比率; 越小惩罚越严格(默认 0.175)", - "energy_scale": "Stage 4: 能耗一致性得分减半时的对数比率; 越小惩罚越严格(默认 0.25)" - }, - "phase_desc": { - "anti_crease": "完成后偶尔进行短暂的翻滚以减少皱纹。", - "anti_wrinkle": "周期后定期翻滚以减少皱纹。", - "cool_down": "接近循环结束时在没有热量的情况下翻滚。", - "drain_and_switch": "从洗涤模式到干燥模式的过渡期。", - "dry": "使用加热器和/或余热的干燥阶段。", - "drying": "主要加热翻滚期。", - "heat_up": "完全干燥开始之前加热器初始预热。", - "pre_rinse": "洗涤剂清洗前初步喷洒。", - "pre_wash": "主洗前的初步浸泡或预处理。", - "rinse": "清水冲洗阶段。该阶段可能会重复多次。", - "sanitize": "用于消毒程序的高温清洁阶段。", - "sensor_check": "测量干燥度时短暂的低功率暂停。", - "soak": "活性洗涤阶段之间的低活性浸泡期。", - "soak_dw": "对重度污垢进行延长浸泡。", - "spin": "高速提取以去除负载中的水。", - "spin_wd": "干燥过渡前高速萃取。", - "wash": "主洗涤周期带有滚筒运动和可选加热。", - "wash_dw": "主要洗涤剂加热洗涤。" - }, - "placeholder": { - "add": "添加…", - "group_name": "例如 棉布 2:47", - "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", - "notify": "添加通知服务…", - "notify_services_list": "notify.mobile_app_phone, ...", - "person": "添加人员…", - "phase_name": "例如 预洗", - "profile_name": "例如 棉布 40°C", - "maintenance_notes": "例如:更换了过滤器、清洁了门封", - "store_brand": "例如 Bosch", - "store_model": "例如 WAT28401" - }, - "pref": { - "date_absolute": "绝对时间(例如:7月2日 14:32)", - "date_relative": "相对时间(例如:2小时前)", - "lang_auto": "系统默认({lang})", - "lang_en": "英语", - "use_panel_default": "(面板默认)" - }, - "quality": { - "bad": "差", - "good": "好", - "unusable": "不可用" - }, - "section": { - "anti_wrinkle": { - "intro": "防皱模式检测主阶段后的低功率翻滚脉冲,并将其附加到完成的周期。", - "label": "防皱" - }, - "basic": { - "intro": "核心标识和大多数设置所需的基本要素。", - "label": "基本" - }, - "delay": { - "intro": "延迟启动检测识别设备已通电但尚未开始运行的情况。", - "label": "延迟启动" - }, - "detection": { - "intro": "周期的启动、运行和结束是如何被检测的。", - "label": "检测" - }, - "matching": { - "intro": "已完成的周期如何与学习到的运行档案匹配并贴标签。", - "label": "匹配" - }, - "ml_training": { - "intro": "设备端机器学习重训练计划和数据设置。", - "label": "ML 训练" - }, - "notifications": { - "intro": "关于周期事件,您何时以及如何收到通知。", - "label": "通知" - }, - "timing": { - "intro": "后台节奏、离线看门狗和日常维护。", - "label": "计时与看门狗" - }, - "triggers": { - "intro": "可选的外部信号:结束触发器、门传感器、暂停开关和卸载提醒。", - "label": "触发器与门" - }, - "phase_eta": { - "label": "剩余时间", - "intro": "阶段感知的剩余时间,适用于周期长度取决于温度或脱水的机器。" - } - }, - "setting": { - "anti_wrinkle_enabled": { - "doc": "识别烘干机在主要加热阶段后发出的短的低功率翻滚脉冲,并将它们附加到完成的循环,而不是将它们视为新循环。", - "label": "启用防皱检测" - }, - "anti_wrinkle_exit_power": { - "doc": "脉冲之间的功率必须低于此值,抗皱模式才能保持活动状态。", - "label": "退出功率阈值" - }, - "anti_wrinkle_idle_timeout": { - "label": "最大脉冲间隔", - "doc": "防皱模式结束前,机器在两次翻滚脉冲之间可以保持静止的时长。请将其设置为高于烘干机在脉冲之间留出的最长间隔,否则之后的每个脉冲都会被识别为误启动。" - }, - "anti_wrinkle_max_duration": { - "doc": "比这更长的脉冲被视为真正的周期,而不是抗皱滚动。", - "label": "最长时长" - }, - "anti_wrinkle_max_power": { - "doc": "高于此功率的脉冲被视为真正的新周期,而不是抗皱翻滚。设置在翻滚脉冲功率的正上方。", - "label": "最大防皱功率" - }, - "auto_label_confidence": { - "doc": "如果周期结束时的比赛分数等于或高于此分数,则节目将自动标记,无需任何确认提示。在自动标记之前将其提高到需要更高的确定性;降低它以实现更多自动化。与下面的学习信心结合使用。", - "label": "自动标记置信度" - }, - "auto_maintenance": { - "doc": "每晚运行内务管理:重建配置文件包络、重新计算周期运行状况、修剪调试跟踪并保留最新的周期。", - "label": "自动维护(每夜清理)" - }, - "completion_min_seconds": { - "doc": "比这个短的周期将被丢弃为幽灵周期(测试运行,打开门添加袜子)。", - "label": "最短周期时长" - }, - "delay_confirm_seconds": { - "doc": "在设备被视为等待启动而不是运行之前,电源必须保持在待机状态这么长时间。", - "label": "确认秒数" - }, - "delay_start_detect_enabled": { - "doc": "检测设备何时开机并等待(延迟启动/待机)但尚未开始其周期,因此待机绘制不会被误认为是运行周期。", - "label": "启用延迟启动检测" - }, - "delay_timeout_hours": { - "doc": "经过这么多小时后,停止在延迟启动模式下等待并返回空闲状态,因此保持通电但从未启动的机器不会永远等待。", - "label": "超时小时数" - }, - "device_type": { - "doc": "家电类。设置针对该设备类型调整的合理检测默认值(阈值、关闭延迟、结束处理);仅当设备最初设置为错误类型时才更改它。", - "label": "设备类型" - }, - "door_sensor_entity": { - "doc": "可选门二进制传感器。用于检测设备在一个周期后何时打开/卸载。", - "label": "门传感器实体" - }, - "duration_tolerance": { - "doc": "对剩余时间估计的容忍度(学习反馈,而不是匹配)。如果实际持续时间在估计值的 +/-X% 范围内,则视为良好匹配。", - "label": "估算容差" - }, - "enable_ml_models": { - "doc": "当一个循环运行时,让模型完善实时结果:更稳定的剩余时间和能量/成本估计,以及结束检测的防过早停止防护(它只能延迟完成,永远不会提前结束,并且是有限的)。如果可用,则使用您的微调模型,否则使用内置模型。关闭 = 仅经典的基于电源的逻辑(仍然可靠)。", - "label": "在周期中应用智能模型" - }, - "end_energy_threshold": { - "doc": "在关闭延迟倒计时期间,累积能量(瓦特 x 时间)与该阈值进行比较。如果超过,倒计时会重置 - 将防皱翻滚和洗碗机干燥尾部连接到循环上,而不是缩短它们。如果冷却过程中循环结束得太早,则提高它;如果检测缓慢,则降低它。", - "label": "结束能耗" - }, - "end_repeat_count": { - "doc": "周期结束前所需的连续低于停止阈值的读数数。 1 适用于大多数插头。如果您的智能插头偶尔在周期中报告假零样本并且您的周期提前结束,则提高到 2-3。", - "label": "结束重复次数" - }, - "energy_price_entity": { - "doc": "具有当前每千瓦时电价的传感器(例如动态电价)。优先于下面的静态价格。每个周期结束后都会冻结实际价格。", - "label": "电价实体" - }, - "energy_price_static": { - "doc": "当上面未设置实时价格实体时,每千瓦时的固定价格用于成本数据。", - "label": "固定电价(每 kWh)" - }, - "energy_sensor": { - "doc": "可选的累积电能计数器(total_increasing 的 kWh/Wh,例如插座自带的累计电能表)。设置后,每个周期报告的能耗将取自该计数器从开始到结束的差值(delta),从而避免因积分上报缓慢的功率传感器而导致的少计。若读数缺失、单位未知或差值不为正,则回退到积分值。留空则继续对功率传感器进行积分。", - "label": "电能表实体" - }, - "expose_debug_entities": { - "doc": "发布额外的诊断 HA 实体(匹配置信度、模糊性、状态内部)。关闭可保持实体列表干净以供正常使用。", - "label": "暴露调试实体" - }, - "external_end_trigger": { - "doc": "状态变化标志着周期结束的二进制传感器(例如,设备“完成”接触或配套集成)。", - "label": "外部触发器实体" - }, - "external_end_trigger_enabled": { - "doc": "除了内置的基于电源的检测之外,还可以让外部二进制传感器发出周期结束信号。", - "label": "启用外部结束触发器" - }, - "external_end_trigger_inverted": { - "doc": "将触发传感器关闭(而不是打开)视为周期结束信号。", - "label": "反转外部触发器(关闭时触发)" - }, - "learning_confidence": { - "doc": "如果匹配分数介于此分数和自动标签置信度之间,则会出现反馈通知,要求您验证已识别的程序。低于这个分数,比赛就太不确定了,无法浮出水面。必须保持在自动标签置信度以下。", - "label": "学习置信度" - }, - "linked_device": { - "doc": "可以选择将此 WashData 设备嵌套在 HA 设备注册表中的另一个设备(例如智能插头)下,显示为“通过...连接”。", - "label": "归入设备" - }, - "min_off_gap": { - "doc": "如果机器关闭时间少于该时间,则开/关/开序列被视为一个连续周期。防止浸泡程序(机器在洗涤过程中关闭几分钟)被分成两个单独的周期。如果您希望将这些负载算作单独的循环,请将其设置为短于连续负载之间的间隙。设备类型默认值可保护每个设备的典型周期内暂停。", - "label": "最小关闭间隔" - }, - "min_power": { - "doc": "视为活动的绝对最小功率。低于此值的读数被视为 0 W(待机),滤除智能插头和待机 LED 的幻象负载。", - "label": "最小功率" - }, - "ml_training_enabled": { - "doc": "定期隔夜研究您审查的循环,并针对该特定机器微调模型。只有当改变在持续的周期中真正取得更好的成绩时,才会保留改变,因此这只能有所帮助或保持不变––永远不会倒退。", - "label": "从此机器学习" - }, - "ml_training_hour": { - "doc": "一天中的当地时间 (0-23) 进行夜间微调。选择一个安静的时间,例如 2 (02:00)。", - "label": "学习时间(小时)" - }, - "ml_training_interval_days": { - "doc": "每这么多天最多重新检查一次改进。", - "label": "最多每隔几天检查一次" - }, - "ml_training_min_cycles": { - "doc": "等到至少记录了这么多周期后再进行微调,这样就有足够的东西可以学习了。", - "label": "需要的最少周期数" - }, - "name": { - "doc": "HA 集成列表和设备注册表中显示的显示名称。", - "label": "设备名称" - }, - "no_update_active_timeout": { - "doc": "如果运行时这么长时间没有电源更新到达,则假设插头脱机并强制停止以避免僵尸循环。默认 600 秒允许云或网格延迟。", - "label": "无更新超时" - }, - "notify_before_end_minutes": { - "doc": "当预计剩余时间低于此值时,发送“即将完成”警报。 0 禁用它。", - "label": "结束前提醒" - }, - "notify_channel": { - "doc": "开始/实时消息的 Android 通知通道名称(控制移动应用程序上的每个通道声音和优先级)。 Blank 使用配套应用程序默认值。", - "label": "Android 频道(启动/实时)" - }, - "notify_cycle_timers": { - "doc": "在一个周期的特定分钟发出通知(例如添加柔软剂)。消息支持{device}、{program}、{minutes}。启用“自动暂停”以在该点暂停并通过“恢复”按钮接收交互式通知;通过面板、暂停/恢复服务或通知操作恢复。", - "label": "周期计时器" - }, - "notify_finish_channel": { - "doc": "完成消息的 Android 通知通道名称。空白重用开始/直播频道。", - "label": "Android 频道(结束)" - }, - "notify_finish_message": { - "doc": "循环结束时发送的正文。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。此处 {time_finished} 和 {vs_typical} 最为有用。", - "label": "结束消息" - }, - "notify_finish_services": { - "doc": "当一个周期结束时调用notify.*服务。每个目标添加一个;留空表示没有完成通知。", - "label": "结束服务" - }, - "notify_fire_events": { - "doc": "还在循环开始/结束时触发 ha_​​washdata_* 事件,以便您可以构建自己的自动化。", - "label": "为通知触发 HA 事件" - }, - "notify_icon": { - "doc": "通知的可选 mdi 图标(例如 mdi:洗衣机)。将平台默认值留空。", - "label": "通知图标" - }, - "notify_live_chronometer": { - "doc": "在通知中显示实时更新的倒计时器(在支持它的平台上),而不是静态估计。", - "label": "使用实时计时器" - }, - "notify_live_interval_seconds": { - "doc": "周期运行时刷新实时进度通知的频率。", - "label": "实时更新间隔" - }, - "notify_live_overrun_percent": { - "doc": "如果周期超出其估计值超过此百分比,则发送超限警报。", - "label": "实时超时 % 提醒前" - }, - "notify_live_services": { - "doc": "在循环运行时,notify.* 服务需要实时更新进度。留空以禁用实时进度通知。", - "label": "实时进度服务" - }, - "notify_only_when_home": { - "doc": "仅当至少一名关联人员(上图)在家时才发送通知。", - "label": "仅在家时通知" - }, - "notify_people": { - "doc": "person.* “Notify Only When Home”使用的实体来决定是否有人在家。", - "label": "人员(仅在家时通知用)" - }, - "notify_pre_complete_message": { - "doc": "临近结束 / 即将完成提醒的正文。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", - "label": "完成前消息" - }, - "notify_reminder_message": { - "doc": "仍在等待的取出衣物提醒的正文。留空则使用内置默认值。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", - "label": "提醒消息" - }, - "notify_start_message": { - "doc": "循环开始时发送的正文。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", - "label": "启动消息" - }, - "notify_start_services": { - "doc": "循环开始时调用的notify.*服务。每个目标(电话、仪表板等)添加一个;留空表示没有开始通知。", - "label": "启动服务" - }, - "notify_timeout_seconds": { - "doc": "在这么多秒后自动关闭通知(在支持它的平台上)。 0 保留它直到手动关闭。", - "label": "自动关闭延迟" - }, - "notify_title": { - "doc": "通知标题。模板变量:{device}、{program}、{duration}、{energy}、{cost}、{date}、{time}、{minutes}。", - "label": "通知标题" - }, - "notify_unload_delay_minutes": { - "doc": "一个周期结束后几分钟,发送仍在等待的“卸载机器”提醒。设置 0 禁用提醒。", - "label": "卸载提醒延迟" - }, - "off_delay": { - "doc": "断电后宣告周期结束之前等待的时间。如果在此窗口内恢复供电,则循环将无缝继续 - 这会在清洗阶段之间建立暂停的桥梁。洗碗机具有较长的干燥阶段(关闭电源 20-60 分钟),因此关闭延迟必须超过该时间才能保持整个洗涤+干燥为一个循环。", - "label": "关闭延迟" - }, - "pause_cuts_power": { - "doc": "当循环暂停时,还要关闭下面的开关实体。仅适用于插头可以在周期中安全切断的电器。", - "label": "暂停同时断电(通过开关)" - }, - "power_off_delay": { - "doc": "周期完成后,在状态恢复为关闭之前,功率必须持续低于电源关闭阈值的时长。仅在电源关闭阈值大于 0 时使用。此项按后台周期检查,因此实际延迟会向上取整到下一个状态过期时刻。", - "label": "电源关闭延迟" - }, - "power_off_threshold_w": { - "doc": "基于功率的关闭检测(可选)。当设置为大于 0 时,周期完成后,如果功率在电源关闭延迟期间持续低于此值,则机器被视为已关机,状态会恢复为关闭。保持为 0 可禁用此功能(默认值)。请将其设置为高于真正关机时的最低功率,且低于停止阈值以及机器完成后仍开机时的待机功耗;如果它不低于停止阈值,则会被忽略。启用后,它将取代进度重置延迟来恢复为关闭状态,因此已完成的机器会保持在已完成/干净的状态,直到实际断电为止。", - "label": "电源关闭阈值" - }, - "power_sensor": { - "doc": "报告该设备的实时功率(以瓦为单位)的传感器实体(例如sensor.washer_power)。所有周期检测均基于该信号。", - "label": "功率传感器" - }, - "profile_duration_tolerance": { - "doc": "匹配过程中使用的配置文件平均持续时间周围的 +/- 范围。 0.25 表示 60 分钟的配置文件与 45-75 分钟的循环匹配。", - "label": "运行档案时长容差" - }, - "profile_match_interval": { - "doc": "在运行周期中尝试配置文件匹配的频率。默认 300 秒(5 分钟)平衡检测速度和 CPU。", - "label": "匹配间隔" - }, - "profile_match_max_duration_ratio": { - "doc": "相对于轮廓的最大循环长度。 1.3 表示周期必须低于配置文件持续时间的 130% 才能匹配。", - "label": "最大时长比例" - }, - "profile_match_min_duration_ratio": { - "doc": "相对于轮廓的最小周期长度。 0.9 表示一个周期必须至少为配置文件持续时间的 90% 才能匹配。", - "label": "最小时长比例" - }, - "profile_match_threshold": { - "doc": "周期结束时接受程序识别所需的最低相似度分数 (0-1)。提高它可以减少错误识别;如果您的机器的程序不匹配,请降低它。默认值 0.4 是一个保守的起点。", - "label": "匹配阈值" - }, - "profile_unmatch_threshold": { - "doc": "如果实时中期比赛的分数低于此分数,则临时标识将被清除。将其保持在匹配阈值以下一点,这样相似度的短暂下降不会将显示翻转回不匹配的状态。", - "label": "不匹配阈值" - }, - "progress_reset_delay": { - "doc": "完成后,将进度保持在 100% 一段时间,以便在重置为“空闲”之前在仪表板上可以看到“已完成”。", - "label": "进度重置延迟" - }, - "pump_stuck_duration": { - "doc": "泵在被标记为可能卡住之前可以连续运行的秒数(触发泵卡住事件)。", - "label": "泵卡住时长" - }, - "running_dead_zone": { - "doc": "一个周期开始后,该窗口内的功率骤降将被忽略。洗衣机注满冷水(加热前下降到接近 0 W) - 如果没有这种保护,注水阶段看起来就像循环结束。这不会跳过数据:从 T=0 开始记录全功率轨迹。建议引擎会测量机器的实际启动模式并自动调整其大小。", - "label": "运行死区" - }, - "sampling_interval": { - "doc": "传感器读数之间的预期时间 - 用于调整平滑窗口的大小并正确启动去抖。无论该值如何,都会捕获每个传感器更新;它仅校准下游计算。建议引擎会测量传感器过去周期的实际踏频并自动设置。", - "label": "采样间隔" - }, - "save_debug_traces": { - "doc": "存储每个周期的完整功率跟踪和匹配调试数据。对于故障排除很有用,但会增加存储大小。", - "label": "保存调试追踪" - }, - "smoothing_window": { - "doc": "原始功率信号被平滑了多少。低 (2) 响应灵敏,但噪音较大;高 (5) 可平滑尖峰,但会增加滞后。", - "label": "平滑窗口" - }, - "start_duration_threshold": { - "doc": "电源必须保持在启动阈值以上这么长的时间才能确认真正的启动,从而防止瞬间开/关切换启动一个周期。", - "label": "启动时长" - }, - "start_energy_threshold": { - "doc": "设备在运行前必须消耗的能量(功率 x 时间)。短暂的高功率尖峰能量非常低,会被忽略,从而防止误启动。", - "label": "启动能耗" - }, - "start_threshold_w": { - "doc": "功率必须高于此水平才能确认周期已开始。设置太低会导致待机功率误启动;过高且启动缓慢的程序(冷填充)会被错过。建议引擎将其设置为略高于机器观察到的最低有功功率。", - "label": "启动阈值" - }, - "stop_threshold_w": { - "doc": "在关闭延迟倒计时开始之前,功率必须降至此水平以下。将其设置为低于启动阈值 - 它们之间的间隙是防止闪烁的滞后带。如果设置得太高,低功率阶段(漂洗保持、防皱)会错误地触发结束序列。", - "label": "停止阈值" - }, - "switch_entity": { - "doc": "可选开关在暂停时关闭,在恢复时重新打开,与“暂停也会切断电源”一起使用。", - "label": "开关实体" - }, - "watchdog_interval": { - "doc": "后台看门狗检查停滞的传感器和超时的频率。默认 30 秒。", - "label": "看门狗间隔" - }, - "notify_milestone_message": { - "doc": "里程碑通知的消息。模板变量:{device}、{cycle_count}。", - "label": "里程碑消息" - }, - "notify_milestones": { - "doc": "以逗号分隔的周期计数,达到时触发一次性庆祝通知(例如 50、100、500、1000)。留空则禁用里程碑通知。", - "label": "周期里程碑" - }, - "notify_quiet_end_hour": { - "doc": "免打扰时段的结束时间(0-23)。暂存的通知将在此时段发送。留空则禁用。", - "label": "免打扰结束" - }, - "notify_quiet_start_hour": { - "doc": "免打扰时段的开始时间(0-23)。在免打扰时段内本应触发的完成、提醒和衣物已洗好通知将被暂存,并在时段结束时发送。留空则禁用。支持跨越午夜的时段(例如开始 22,结束 7)。", - "label": "免打扰开始" - }, - "peak_rate_message": { - "doc": "附加到启动通知的高峰电价提示的可选自定义文本。模板变量:{device}、{price}。留空则使用内置默认值。", - "label": "高峰电价消息" - }, - "peak_rate_threshold": { - "doc": "当周期开始且当前每千瓦时电价达到或超过此值时,在启动通知中附加高峰电价提示。0 或留空则禁用该提示。", - "label": "高峰电价阈值(每千瓦时)" - }, - "dtw_bandwidth": { - "label": "形状匹配容差", - "doc": "匹配器为了贴合已保存程序的形状,可以对周期进行多大程度的时间扭曲。数值越高越能容忍速度变化;过高则可能匹配到错误的程序。" - }, - "corr_weight": { - "label": "形状与水平权重", - "doc": "在为匹配评分时,曲线形状与绝对功率水平之间的平衡。数值越高越偏重形状;越低越偏重功率水平的吻合。" - }, - "duration_weight": { - "label": "时长权重", - "doc": "典型运行时长与此周期吻合的程序会被优先选择的程度。" - }, - "energy_weight": { - "label": "能耗权重", - "doc": "典型能耗与此周期吻合的程序会被优先选择的程度。" - }, - "store_brand": { - "label": "家电品牌", - "doc": "可选。从社区目录中选择的家电品牌。用于查找和分享匹配的参考录制。如果您不使用在线功能,请留空。" - }, - "store_model": { - "label": "家电型号", - "doc": "可选。设置品牌后,从社区目录中选择的家电型号。如果目录中没有您的型号,您可以将其添加到目录。" - }, - "show_contributor": { - "doc": "在社区家电和参考周期上显示\"by \"的贡献者署名。" - }, - "enable_phase_matching": { - "label": "阶段感知的剩余时间", - "doc": "将每个运行中的周期分解为多个阶段(加热、洗涤、脱水),按阶段分配剩余时间,并与经典估算相融合:周期早期更依赖阶段分配,接近结束时更依赖经典估算。这会根据您的机器实际加热和运行的时长来个性化倒计时,在周期的前半段效果最明显。关闭 = 仅使用经典估算。仅影响剩余时间显示;程序匹配和周期检测保持不变。" - }, - "keep_min_score": { - "label": "最低匹配得分", - "doc": "候选档案留在匹配竞争中所需的最低相似度得分。默认 0.1 有意设置得较宽松,允许弱候选也进入,由后续阶段找出最佳匹配。提高此值可更早淘汰不合适的档案;降低此值可扩大初始候选池。" - }, - "dtw_blend": { - "label": "规整混合", - "doc": "时间规整(DTW)对齐得分替换 Stage 2 核心得分的程度。0 = 仅使用 Stage 2 得分,1 = 仅使用 DTW 得分,0.5(默认)= 等权混合。当程序功率水平相近但时序模式不同时,可提高此值以更多依赖规整对齐。" - }, - "dtw_ensemble_w": { - "label": "规整集成混合", - "doc": "在集成 DTW 模式(默认)下,缩放 L1 与导数 DTW(DDTW)的权重分配。1.0 = 全部缩放-L1,0 = 全部 DDTW,0.7 = 默认。缩放-L1 变体比较功率水平;导数变体对功率如何随时间变化做出响应。集成模式将二者结合。" - }, - "dtw_ddtw_scale": { - "label": "导数规整尺度", - "doc": "导数 DTW 评分的半饱和距离。当 DDTW 距离等于此值时,得分减半。越小对形状差异越敏感。默认 30 针对典型家电功率曲线进行了校准。仅影响集成和 ddtw DTW 模式。" - }, - "dtw_refine_top_n": { - "label": "规整精化数量", - "doc": "DTW 重新评分的 Stage 2 顶部候选数量。由于 DTW 计算代价较高,仅对前 N 个候选应用。默认 5。若正确档案有时在 Stage 2 后只排到第 4 或第 5 位,可调高此值(至 7-9),DTW 能将其拉回。降低此值可略微加速匹配。" - }, - "duration_scale": { - "label": "时长锐度", - "doc": "Stage 4 时长一致性惩罚的锐度。这是一致性得分减半时的对数比率。越小越严格:时长不匹配的惩罚越大。默认 0.175 对应半权重下约 18% 的时长容差。请与时长权重配合使用。" - }, - "energy_scale": { - "label": "能耗锐度", - "doc": "Stage 4 能耗一致性惩罚的锐度。越小越严格:能耗不匹配的惩罚越大。默认 0.25 有意比时长锐度更宽松,因为能耗会随负荷变化。请与能耗权重配合使用。" - } - }, - "setting_group": { - "auto_labeling": { - "label": "自动标记" - }, - "cycle_end": { - "label": "周期结束" - }, - "cycle_start": { - "label": "周期开始" - }, - "cycle_timers": { - "label": "周期计时器" - }, - "data_management": { - "label": "数据管理" - }, - "debug": { - "label": "调试" - }, - "dishwasher_end": { - "label": "洗碗机结束" - }, - "door_pause": { - "label": "门与暂停" - }, - "dtw_refinement": { - "label": "DTW 细化" - }, - "duration_gates": { - "label": "时长门控" - }, - "energy": { - "label": "能耗" - }, - "external_end_trigger": { - "label": "外部结束触发器" - }, - "housekeeping": { - "label": "日常维护" - }, - "match_scoring": { - "label": "匹配评分" - }, - "messages": { - "label": "消息" - }, - "power_off": { - "label": "电源关闭" - }, - "predictive_end": { - "label": "预测结束" - }, - "schedule": { - "label": "计划" - }, - "services": { - "label": "服务" - }, - "signal_processing": { - "label": "信号处理" - }, - "thresholds_gap": { - "label": "阈值与间隔" - }, - "timing": { - "label": "计时" - }, - "unload_reminder": { - "label": "卸载提醒" - }, - "watchdog": { - "label": "看门狗" - }, - "quiet_hours_milestones": { - "label": "免打扰时段与里程碑" - }, - "device_info": { - "label": "设备信息" - }, - "basic_configuration": { - "label": "基本配置" - } - }, - "status": { - "active": "活跃", - "all_statuses": "所有状态", - "ambiguous": "不明确", - "auto_detect": "自动检测", - "clear": "正常", - "completed": "已完成", - "fine_tuning": "正在微调…", - "force_stopped": "强制停止", - "idle": "空闲", - "interrupted": "已中断", - "ready": "准备处理", - "recording": "录制中", - "training": "训练中…", - "saving": "保存中…", - "rebuilding": "重建中…", - "analyzing": "分析中…", - "resetting": "重置中…", - "reverting": "还原中…", - "trimming": "裁剪中…", - "splitting": "拆分中…", - "deleting": "删除中…", - "imported": "已导入" - }, - "tab": { - "advanced": "高级", - "diagnostics": "诊断", - "history": "周期", - "ml": "ML 训练", - "pp_cleanup": "清理", - "pp_manage": "管理", - "pp_overview": "概览", - "pp_phases": "阶段", - "profiles": "配置文件", - "settings": "设置", - "status": "概览", - "subtab_phase_catalog": "阶段目录", - "subtab_profiles": "配置文件", - "maintenance": "维护", - "playground": "试验场", - "store": "商店" - }, - "tag": { - "early_end": "提前结束", - "late_start": "延迟开始", - "merged": "合并周期", - "noise": "噪声", - "sensor_gap": "传感器间隔", - "split": "拆分周期", - "wrong_profile": "错误配置文件" - }, - "toast": { - "access_saved": "已保存访问控制", - "all_wiped": "所有数据已清除", - "analysis_complete_none": "分析完成:没有新建议", - "auto_label_complete": "自动标记完成", - "automation_deleted": "自动化已删除", - "correction_submitted": "修正已提交", - "cycle_deleted": "周期已删除", - "cycle_force_stopped": "周期已强制停止", - "cycle_labelled": "周期已标记", - "cycle_paused": "周期已暂停", - "cycle_resumed": "周期已恢复", - "cycle_trimmed": "周期已裁剪", - "cycles_merged": "周期已合并", - "envelope_rebuilt": "包络已重建", - "envelopes_rebuilt": "所有包络已重建", - "export_downloaded": "导出已下载", - "feedback_all_dismissed": "所有反馈已关闭", - "feedback_confirmed": "反馈已确认", - "feedback_dismissed": "反馈已关闭", - "group_deleted": "组已删除", - "group_name_required": "需要组名", - "group_saved": "组已保存", - "import_successful": "导入成功;集成重载中", - "json_required": "需要 JSON 数据", - "legacy_removed": "旧版操作已移除", - "logs_exported": "日志已导出", - "matching_reverted": "匹配权重已恢复为默认值", - "min_2_profiles": "为组至少选择 2 个配置文件", - "ml_training_no_improvement": "训练完成:保留基准(无改进)", - "models_reverted": "设备上的模型已恢复为基准", - "name_required": "需要名称", - "no_split_found": "未找到可分割的空闲间隔", - "panel_settings_saved": "面板设置已保存", - "phase_name_required": "需要阶段名称", - "phase_updated": "阶段已更新", - "phases_saved": "阶段已保存", - "preferences_saved": "偏好已保存", - "profile_name_required": "需要配置文件名称", - "profile_renamed": "配置文件已重命名", - "recording_discarded": "录制已丢弃", - "recording_saved": "录制已保存到配置文件", - "recording_started": "录制已开始", - "recording_stopped": "录制已停止", - "review_saved": "审查已保存", - "settings_conflicts": "请先解决标红的设置冲突,再保存。", - "settings_reverted": "设置已恢复;集成正在重新加载", - "settings_saved": "设置已保存;集成重载中", - "suggestions_applied": "建议已应用;集成重载中", - "suggestions_dismissed": "建议已关闭", - "apply_failed": "应用失败:{error}", - "delete_failed": "删除失败:{error}", - "load_more_failed": "无法加载更多:{error}", - "maint_add_failed": "无法添加事件:{error}", - "maint_added": "已添加维护事件", - "maint_delete_failed": "无法删除事件:{error}", - "maint_deleted": "已删除维护事件", - "relabel_done": "已重新标记 {count} 个周期", - "relabel_failed": "重新标记失败:{error}", - "reminders_save_failed": "无法保存提醒:{error}", - "reminders_saved": "已保存保养提醒", - "pause_no_cycle": "没有可暂停的运行周期", - "resume_no_cycle": "没有可恢复的已暂停周期", - "delete_partial_failed": "部分项目无法删除,已恢复", - "pg_run_gone": "该运行已不可用。", - "task_cancelled": "已取消。", - "processed": "已处理 {bits}", - "processed_cycles": "{n} 个周期", - "processed_suggestions": "{n} 条建议", - "processed_models": "{n} 个模型升级", - "store_search_failed": "搜索失败:{error}", - "store_connect_failed": "连接失败:{error}", - "store_connected": "已连接到社区商店", - "store_disconnected": "已断开与社区商店的连接", - "store_error": "错误:{error}", - "store_unavailable": "社区商店不可用。", - "store_pick_profile": "请选择要合并到的配置文件", - "store_name_required": "请输入配置文件名称", - "store_import_failed": "导入失败:{error}", - "store_imported": "已导入到 {profile}", - "store_program_required": "请输入程序名称", - "store_no_appliance": "请先在设置中设置您的家电品牌和型号。", - "store_share_failed": "分享失败:{error}", - "store_shared": "已分享到社区商店(等待审核)", - "appliance_added": "已添加家电(等待批准)", - "thanks_confirming": "感谢您的确认", - "device_approved": "已获社区批准", - "rating_saved": "质量评分已保存", - "brand_added": "已添加品牌(等待批准)", - "profile_added": "已添加配置文件(等待批准)", - "saved_except_conflicts": "已保存。请修复突出显示的冲突以保存其余内容。", - "share_device_none_sel": "请至少选择一个周期进行分享", - "store_device_downloaded": "已添加 {p} 个程序、{c} 个录制", - "store_device_downloaded_phases": "已添加 {p} 个程序、{c} 个录制、{ph} 个阶段图", - "store_device_downloaded_settings": "已添加 {p} 个程序、{c} 个录制、{ph} 个阶段图、{s} 个设置", - "store_device_shared": "已将 {n} 个周期分享到社区商店 - 待审核。", - "store_device_shared_all_dup": "{n} 个周期均已在社区商店中。", - "store_device_shared_partial": "已分享 {n} 个周期;{failed} 个无法上传。", - "store_device_shared_some_dup": "已分享 {created} 个周期;{dup} 个已在商店中。", - "store_download_failed": "下载失败:{error}", - "store_download_nothing": "没有新内容可下载 - 此配置已在您的设备上。", - "export_selective_done": "导出已下载", - "import_selective_done": "已导入 {profiles} 个配置文件和 {cycles} 个周期" - }, - "suggestion": { - "both_agree": "WashData建议", - "calibrated_label": "已校准", - "observed_label": "观测值", - "impact": { - "auto_label_confidence": { - "higher": "自动标记的循环减少,更多循环进入审核", - "lower": "自动标记更多循环,部分可能被误识别" - }, - "duration_tolerance": { - "higher": "接受更宽的时长范围––匹配更灵活", - "lower": "要求时长更接近––更严格,但可能拒绝非常规循环" - }, - "end_energy_threshold": { - "higher": "仅关闭消耗大量能量的循环", - "lower": "也关闭较短或低能耗的循环" - }, - "end_repeat_count": { - "higher": "结束信号需重复更多次––更稳健,但略慢", - "lower": "更少重复后结束––检测更快,但误结束风险更高" - }, - "learning_confidence": { - "higher": "仅从高置信度匹配中学习––较慢但更可靠", - "lower": "从更多循环中学习,模型可能更嘈杂" - }, - "min_off_gap": { - "higher": "新循环开始前需要更长的空闲时间", - "lower": "短暂空闲即触发新循环––连续运行可能被拆分" - }, - "min_power": { - "higher": "对待机功耗不那么敏感,可能遗漏非常安静的程序", - "lower": "更灵敏,可能将待机功耗记录为活动" - }, - "no_update_active_timeout": { - "higher": "在判定循环卡住前等待更长时间", - "lower": "更快地强制终止卡住的循环" - }, - "off_delay": { - "higher": "为设备暂停留出更多时间––适合长时间浸泡或烘干阶段", - "lower": "更快检测结束––适合干净的开关设备" - }, - "profile_match_threshold": { - "higher": "仅提交高置信度匹配,更多循环保持未标记", - "lower": "匹配更多循环,部分可能略有偏差" - }, - "running_dead_zone": { - "higher": "忽略待机时的短暂功率尖峰––对噪声不那么敏感", - "lower": "响应更短的功率突发––捕捉快速瞬态活动" - }, - "start_threshold_w": { - "higher": "避免因短暂功率尖峰引起的误启动", - "lower": "捕捉低功率程序,可能对噪声触发" - }, - "stop_threshold_w": { - "higher": "更快结束循环––可能在暂停时关闭", - "lower": "等待更长时间结束––减少提前完成" - }, - "watchdog_interval": { - "higher": "允许更长的静默阶段,减少误强制停止", - "lower": "更积极地捕捉卡住的循环" - } - }, - "reason": { - "auto_label_confidence": "用户从未纠正的 {cycles} 个自动标注的第 15 百分位置信度({p15})。", - "completion_min_seconds": "{cycles} 个周期中 p05 正常周期时长的一半({minutes} min);用于过滤误检周期。{excl}", - "dead_zone_batch": "保持较短({cycles} 个周期中启动不稳定窗口的中位数 = {s}s),以便及时检测到真正的结束。", - "dead_zone_from_dip": "基于在 {s}s 时检测到的早期功率下降。", - "end_energy_default": "周期结束噪声门限的推荐默认值。", - "end_energy_false": "{cycles} 个周期中 p95 的误结束能量({p95}Wh),下限为周期能量中位数的 0.2%({floor}Wh)。", - "end_energy_no_false": "{cycles} 个周期中无误结束;下限为周期能量中位数的 0.2%({floor}Wh)。", - "end_repeat_count": "{false}/{total} 个正常周期({pct}%)出现了超过 60s 且随后恢复的内部暂停;要求进行 {val} 次结束确认。", - "learning_confidence": "{cycles} 个用户标注周期的 p05 置信度({p05});低于此值时请求验证。", - "match_interval": "基于观测到的更新频率(中位数={median}s) * 10。", - "max_duration_ratio": "基于已标注的周期时长(p95={p95})。", - "min_active": "基于上一个周期中观测到的最小工作功率({min}W)。", - "min_duration_ratio": "尽可能保持较低,以便在周期早期识别出程序;置信度和歧义门限可防止过早确定。", - "min_off_gap": "基于观测到的 {gaps} 个周期间间隔(p05={p05}s)。设备下限:{floor}s。", - "min_power": "{cycles} 个正常周期中 p05 最低工作功率({p05}W)的 40%,使关闭门限保持在实际功耗之下。{excl}", - "ml_auto_label": "质量模型仍判定为正常的最低置信度({cycles} 个正常周期的 p10 = {p10})。", - "ml_end_repeat": "{false}/{total} 个周期({pct}%)出现了结束检测器评分超过 50% 的暂停;要求进行 {val} 次结束确认。", - "ml_off_delay": "结束检测器已确认的暂停:p95 {p95}s + 60s 缓冲,来自 {cycles} 个周期中经模型验证的 {pauses} 次暂停(下限 {floor}s)。", - "no_update_timeout": "基于观测到的更新频率(p95={p95}s) * 20(最小 60s)。", - "off_delay_cadence": "基于观测到的更新频率(p95={p95}s) * 5", - "off_delay_device_floor": "对 {device} 使用了特定于设备的安全最小值({floor}s)。", - "off_delay_generic_floor": "使用了通用安全最小值({floor}s)。", - "off_delay_pauses": "设定为足以超过真实暂停:p95 周期内暂停 {p95}s + 60s 缓冲,来自 {cycles} 个正常周期中的 {pauses} 次暂停(下限 {floor}s)。", - "profile_match_threshold": "{cycles} 个正确自动标注的 p10 置信度({p10});安全的实时确定下限。", - "sampling_interval": "{cycles} 个正常周期中观测到的更新间隔中位数({si}s)。{excl}", - "smoothing_window": "设定为在 {si}s 采样下平滑约 30s 的读数({samples} 个样本)。", - "start_duration": "保持较短(约一个 {si}s 采样间隔),以便尽早开始检测,同时忽略单个采样的尖峰。", - "thr_batch": "保持在 {cycles} 个周期中 p05 最低工作功率({p05}W)略上方,以便尽早捕捉到启动,同时使停止阈值保持在设备最低运行功率之下。", - "tol_per_profile": "{profiles} 个配置文件({cycles} 个周期)中每个配置文件时长方差的 p75;波动小的配置文件不受惩罚。", - "tol_pooled": "基于 {cycles} 个近期已标注周期的合并时长方差(p95 偏差={dev})。", - "watchdog": "在安全范围内保持尽可能低(p95 更新间隔 {p95}s 的 3 倍,最小 30s),以便快速捕捉到停滞而不产生误停止。" - }, - "exclusions": { - "summary": "已排除 {total} 个误检测周期:{parts}。", - "reason": { - "force_stopped": "强制停止", - "interrupted": "中断", - "incomplete": "未完成", - "noise": "噪声", - "unlabeled": "未标记", - "no_trace_short": "太短无法检查", - "high_start": "高功率启动", - "abrupt_end": "突然结束", - "mid_restart": "周期中途重启", - "no_power": "无功率", - "no_active_power": "无工作功率" - } - } - }, - "trend": { - "down": "下降趋势", - "up": "上升趋势" - }, - "maint": { - "bearing_service": "轴承保养", - "descale": "除垢", - "drum_clean": "清洁滚筒", - "filter_clean": "清洁过滤器", - "other": "其他" - }, - "col": { - "profile_tip": "匹配的程序名称。未标记表示周期结束时没有配置文件匹配。", - "status_tip": "周期结果:已完成(自然结束)、已中断(功率骤降)、已强制停止(手动)或需要审查(反馈待处理)。", - "date_tip": "周期开始的日期和时间。", - "duration_tip": "从开始到结束的总周期运行时间。", - "energy_tip": "消耗的总能量(kWh)。通过对功率随时间积分计算得出。", - "cost_tip": "此周期的能耗成本,在完成时按当时生效的价格冻结(能量 x 每 kWh 价格)。在设置中设定价格以填充此项。", - "confidence_tip": "配置文件匹配置信度(0-100%)。周期功率曲线与识别出的程序的匹配程度。", - "health_tip": "ML 周期健康(越高越好)。点击周期以检查并审查。", - "flags_tip": "周期的审核、异常和来源标志。将鼠标悬停在图标上可查看详细信息。" - }, - "stat": { - "avg": "平均", - "min": "最小 {v}", - "max": "最大 {v}", - "consistency": "一致性 ±{v}", - "total": "总计 {v}", - "last_run": "上次运行 {v}", - "score": "得分 {pct}%", - "duration_cv": "时长 CV {pct}%", - "avg_confidence": "平均置信度 {pct}%" - }, - "pg_evd": { - "detected": "检测器识别到一个循环已经开始。", - "match_commit": "匹配器以足够的置信度确定了某个程序。", - "match_changed": "随着循环推进,领先的程序发生了变化。", - "match_ambiguous": "两个程序的得分很接近,因此匹配结果不确定。", - "unmatched": "没有已保存的程序与此循环匹配。", - "notify_start": "将发送开始通知。", - "notify_pre_complete": "将发送即将完成通知。", - "notify_finish": "将发送完成通知。", - "notify_milestone": "将发送里程碑通知。", - "notify_held": "由于处于免打扰时段,通知已被暂缓。", - "finished": "循环到达终止状态并已结束。" - }, - "store": { - "browse": "浏览", - "device": "设备", - "favorites": "收藏", - "search_ph": "按品牌或型号搜索…", - "no_results": "未找到匹配的家电。请尝试其他搜索。", - "n_programs": "{n} 个程序", - "n_cycles": "{n} 个周期", - "no_programs": "此家电尚无共享的程序。", - "no_cycles": "此程序尚无共享的参考周期。", - "anon": "匿名", - "uploaded_by": "由 {name} 分享", - "connected_as": "已以 {name} 身份连接", - "not_connected": "未连接。连接 GitHub 账户以分享您自己的周期。", - "import_new": "新建配置文件", - "import_merge": "合并到现有", - "merge_target": "合并到配置文件", - "description": "描述(可选)", - "contributed_by": "由 {name} 提供", - "rating_summary": "★ {avg} ({n})", - "no_ratings": "暂无评分", - "website": "商店网站 ↗", - "website_tip": "打开社区商店网站" - }, - "settings": { - "gear": { - "title": "设置" - } - }, - "link": { - "manual": "手册 ↗", - "add_appliance": "添加您的家电" - }, - "tip": { - "add_brand": "品牌未收录?将其添加到社区目录", - "add_appliance": "型号未收录?将您的家电添加到社区目录", - "add_profile": "在社区网站上为此家电添加配置文件" - }, - "task": { - "reprocess": { - "matching": "重新处理:匹配周期", - "golden": "重新处理:补全参考周期", - "suggestions": "重新处理:建议", - "ml_training": "重新处理:ML 训练", - "health": "重新处理:周期健康" - }, - "pg_sweep": { - "optimize": "优化:{param}" - }, - "pg_detail": { - "simulate": "模拟周期" - }, - "split": { - "apply": "正在拆分周期" - }, - "trim": { - "apply": "正在裁剪周期" - }, - "merge": { - "apply": "正在合并周期" - }, - "rebuild": { - "envelopes": "正在重建包络" - }, - "cancelling": "正在取消..." - }, - "setup": { "hdr": { - "card": "设备设置", - "healthy_chip": "设置完成" + "ab_comparison": "A/B 设置对比", + "access_control": "访问控制", + "add_maintenance": "添加维护事件", + "automation_delete": "删除此自动化", + "automation_needs_review": "此周期需要审查", + "automation_open": "在自动化编辑器中打开", + "automation_review_this_cycle": "审查此周期", + "automations": "自动化", + "clear_debug": "清除调试追踪", + "cycle_simulator": "周期模拟器", + "diagnostics_pref": "诊断", + "display": "显示", + "dtw_inspector": "DTW 检查器", + "export_import": "导出 / 导入", + "getting_started": "快速上手", + "live_power": "实时功率", + "logs": "日志", + "logs_diagnostics": "诊断", + "maintenance": "维护操作", + "maintenance_log": "维护日志", + "maintenance_reminders": "保养提醒", + "manual_recording": "手动录制", + "manual_recording_tip": "在 WashData 记录电力轨迹时有意运行一个周期。在设备启动前立即按开始,完成后按停止,然后按处理将其保存为命名配置文件。", + "ml_learned": "WashData 已学到的内容", + "ml_matching_tuning": "程序匹配微调", + "ml_settings_card": "设置", + "ml_smart_learning": "智能学习", + "my_preferences": "我的偏好", + "no_automations": "尚未有自动化引用此设备。", + "panel_settings": "面板设置", + "param_sweep": "参数扫描", + "pg_settings_source": "设置来源", + "phase_catalog": "阶段目录", + "playground": "试验场", + "process_history": "处理历史", + "settings_history": "设置历史", + "status": "状态", + "status_graph": "状态图表", + "storage_stats": "存储统计", + "test_history": "在历史数据上测试", + "toggle_sidebar": "切换家庭助理侧边栏", + "tools_and_data": "工具与数据", + "wipe_history": "清除历史", + "recommendations": "建议({n})", + "pg_detection_params": "检测设置", + "pg_timeline": "事件时间线", + "pg_outcome": "模拟结果", + "pg_across_cycles": "所有周期综合", + "community_store": "社区商店", + "online_account": "社区商店与在线功能" }, - "phase0": { - "washer": "WashData 已在检测您的周期。录制第一个周期以启用程序名称和时间估算。", - "dishwasher": "WashData 正在监视。洗碗机的周期较为复杂 – 强烈建议录制第一个周期。如果检测到的周期运行过长,请使用周期编辑器在保存为配置文件前进行裁剪。", - "generic": "WashData 正在监视。录制或标记检测到的周期,开始构建配置文件。" + "health": { + "fair": "配置文件质量尚可", + "good": "✓ 配置文件质量良好", + "poor": "⚠ 配置文件质量差" }, - "phase1a": { - "labelled": "良好的开始 – 您的第一个程序已保存。为获得最准确的数据,建议使用录制小部件录制下一个周期。" + "lbl": { + "actions": "操作", + "activity": "活动", + "administrators": "管理员", + "aria_compare_chart": "周期对比图表", + "aria_cycle_chart": "周期功率曲线", + "aria_envelope_chart": "配置文件功率包络图表", + "aria_phase_chart": "阶段编辑器图表", + "aria_playground_chart": "带可拖动检测阈值的周期功率曲线", + "aria_power_chart": "功耗图表", + "aria_spaghetti_chart": "叠加的周期功率曲线", + "aria_sweep_chart": "参数扫描结果图表", + "artifact_anomaly": "异常", + "artifact_high_power": "高功率", + "artifact_interruption": "中断", + "artifact_low_power": "低功率", + "auto_detect": "自动检测", + "auto_fine_tune_off": "自动微调已关闭", + "auto_fine_tune_on": "自动微调已开启(大约 {hour}:00)", + "avg_cost": "平均成本", + "change": "变更", + "clock_time": "时钟时间", + "cohesion_good": "凝聚力 {pct}%", + "cohesion_low": "⚠ 低凝聚力 {pct}%", + "compare_profiles": "与配置文件比较", + "concurrency": "并发", + "confidence": "置信度", + "confidence_threshold": "置信度阈值", + "correct_duration": "修正时长(分钟,可选)", + "correct_profile": "修正配置文件", + "correlation": "相关性", + "cost": "费用", + "create_new_profile": "+ 创建新配置文件…", + "current_phase": "当前阶段", + "curves": "曲线", + "cycle": "周期", + "cycle_date_display": "周期日期显示", + "cycle_health": "周期健康", + "cycle_index": "周期序号 →", + "cycles": "周期", + "cycles_count": "周期数", + "cycles_lc": "个周期", + "dashed": "虚线", + "date": "日期", + "debug_traces": "调试追踪", + "default": "默认", + "default_access_level": "未列出用户的默认级别", + "default_other": "默认(其他设备)", + "default_tab": "打开面板时的默认标签", + "delta": "Δ", + "description": "描述", + "dtw_blend_w": "混合权重", + "dtw_blended": "混合得分", + "dtw_ddtw": "DDTW 得分", + "dtw_l1": "L1 得分", + "dtw_matched_profile": "(该周期匹配的配置文件)", + "duration": "时长", + "duration_agreement": "时长一致度", + "emphasis": "强调", + "enable_access_control": "启用每用户访问控制", + "energy": "能耗", + "energy_agreement": "能耗一致度", + "event_timeline": "事件时间线", + "event_type": "事件类型", + "expected": "预期", + "expected_duration": "预期时长(分钟)", + "file_kb": "文件(kB)", + "final_score": "最终得分", + "from": "起始", + "gap_s": "间隔(秒)", + "group_name": "组名称", + "head_trim": "头部裁剪(秒)", + "health": "健康", + "hide_tabs": "对非管理员隐藏标签", + "in_use": "使用中", + "json_data": "JSON 数据", + "label": "匹配的程序", + "last": "最近", + "last_checked": "上次检查:", + "load_from_file": "从文件加载", + "mae_score": "MAE 得分", + "manual_duration": "手动时长(分钟,可选)", + "match": "匹配", + "members": "成员", + "metric": "指标", + "mode_existing_profile": "添加到现有配置文件", + "mode_new_profile": "创建新配置文件", + "models_fine_tuned": "({count}个模型{plural}已微调)", + "n_classic_suggestions": "{n} 经典", + "n_ml_suggestions": "{n} ML", + "n_selected": "已选 {n} 个", + "n_tuning_suggestions": "{n} 调整建议", + "na": "不适用", + "new_profile_name": "新配置文件名称", + "notes": "备注", + "of": "/", + "outcome": "结果", + "panel_default_tab": "默认标签", + "panel_language": "面板语言", + "per_cycle_short": "周期", + "pg_anti_wrinkle": "防皱", + "pg_autofill_tip": "根据当前值自动填充范围({lo}–{hi})", + "pg_best_value": "找到的最佳值", + "pg_current_value": "当前值:", + "pg_drag_hint": "拖动图表上的线条", + "pg_dtw": "DTW", + "pg_ev_ending": "结束中", + "pg_ev_running": "运行中", + "pg_group_advanced": "边缘情况", + "pg_group_detection": "检测触发条件", + "pg_group_timing": "计时规则", + "pg_idle": "空闲", + "pg_last_run": "上次运行:{date}", + "pg_match_score": "匹配得分", + "pg_pct_of": "{total} 中的 {p}%", + "pg_poor_match": "匹配较差", + "pg_preset": "试验场预设", + "pg_preset_name": "新预设名称", + "pg_preset_none": "选择预设…", + "pg_strong_match": "强匹配", + "pg_tile_ambiguous": "不明确", + "pg_tile_ambiguous_tip": "两个程序几乎打平的周期", + "pg_tile_detected": "已检测", + "pg_tile_detected_tip": "功率越过启动阈值足够久、被记录为运行中的周期", + "pg_tile_matched": "已匹配", + "pg_tile_matched_tip": "正确归属到已知程序的周期", + "pg_time_left": "剩余时间", + "pg_weak_match": "弱匹配", + "phase_name": "名称", + "phase_timeline": "阶段时间线", + "power": "功率", + "profile": "配置文件", + "profile_index": "配置文件序号 →", + "profile_name": "配置文件名称", + "program": "程序", + "program_tip": "覆盖与当前周期匹配的配置文件。自动检测让集成自动选择最佳匹配。当自动检测出错或您知道正在运行什么时,固定特定程序以强制匹配。", + "progress": "进度", + "raw_socket": "原始套接字", + "read_only": "只读", + "ref_cycle": "参考周期(可选)", + "refresh_interval": "刷新间隔(秒)", + "remaining": "剩余", + "reminder_every": "提醒间隔(周期)", + "remove_label": "- 删除标签 -", + "rename_profile": "重命名配置文件", + "replay_duration": "回放", + "resulting_profile": "结果配置文件", + "save_mode": "保存模式", + "score": "得分", + "score_breakdown": "得分明细", + "seconds_from_start": "从开始计的秒数", + "select_profile": "选择配置文件", + "setting": "设置", + "settings_a": "设置 A(当前)", + "settings_a_short": "A", + "settings_advanced": "高级", + "settings_b": "设置 B(测试)", + "settings_b_short": "B", + "settings_basic": "基础", + "settings_detail_level": "设置详细程度", + "settings_overrides": "设置覆盖项", + "show_debug": "在状态页面显示实时匹配调试卡(置信度、歧义、最佳候选)", + "show_expected": "显示预期曲线叠加(匹配配置文件,橙色)", + "show_raw": "在实时功率图中显示原始插座切换开关", + "sparkline": "近期周期时长趋势", + "stage2": "阶段 2 – 核心相似度", + "stage3": "阶段 3 – DTW", + "stage4": "阶段 4 – 一致度", + "status": "状态", + "tail_trim": "尾部裁剪(秒)", + "timer_auto_pause": "自动暂停", + "timer_min": "分钟", + "timer_msg_placeholder": "消息(可选,{device}/{program}/{minutes})", + "to": "结束", + "ungrouped": "未分组", + "unlabelled": "未标记", + "unlabelled_paren": "(未标记)", + "warp_path": "规整路径", + "input": "输入:", + "start": "开始", + "end": "结束", + "unit_s": "(秒)", + "reviewed_on": "审核于 {date}", + "unknown": "未知", + "quality": "质量", + "tags": "标签", + "at": "于", + "pct_match_confidence": "{pct}% 匹配置信度", + "ha_restarted": "HA 已重启", + "from_start": "从开始", + "to_end": "到结束", + "click_to_select": "点击选择", + "envelope": "包络", + "zoom_hint": "滚动缩放 · 双击重置", + "loading_paren": "(加载中…)", + "time_remaining": "剩余 ~{v}", + "no_duration": "无时长", + "duration_avg": "平均 ~{v}分钟", + "name_placeholder": "(名称)", + "n_shown": ",显示 {n} 个", + "cycles_title": "周期({n})", + "pg_detecting": "检测中", + "pg_best_marker": "最佳:{v}", + "pg_time_left_model": "剩余时间(模型)", + "pg_time_left_model_tip": "由模型估算的剩余时间(阶段估算 + ML 混合),并非固定倒计时。", + "phase": "阶段", + "pg_mode_simulate": "模拟", + "pg_mode_history": "历史测试", + "pg_mode_sweep": "参数扫描", + "pg_ev_detected": "已检测", + "pg_ev_match": "匹配确定", + "pg_ev_match_changed": "匹配已更改", + "pg_ev_ambiguous": "不明确", + "pg_ev_unmatched": "未匹配", + "pg_ev_notify_start": "开始通知", + "pg_ev_notify_pre": "即将完成通知", + "pg_ev_notify_finish": "完成通知", + "pg_ev_notify_milestone": "里程碑通知", + "pg_ev_notify_held": "通知已暂存(免打扰时段)", + "pg_ev_finished": "已完成", + "pg_ended": "已结束", + "pg_proj_energy": "预计能耗", + "pg_alert_overrun": "运行过长", + "pg_alert_underrun": "运行过短", + "pg_alert_did_not_finish": "未完成", + "pg_alert_false_end": "拆分为多个周期", + "pg_alert_unmatched": "未匹配", + "pg_alert_ambiguous": "匹配不明确", + "pg_alert_energy": "能耗异常", + "pg_newly_correct": "新增正确", + "pg_regressed": "变差", + "pg_end_timing_changed": "结束时机改变", + "pg_vs_current": "对比当前", + "pg_fixed": "已修复", + "pg_broke": "出现问题", + "pg_sweep_param": "参数", + "pg_objective": "目标", + "pg_steps": "步数", + "pg_stress_group": "闲置终止测试", + "pg_stress_idle_auto": "Auto", + "pg_stress_idle_w": "待机功率 (W)", + "pg_stress_idle_w_desc": "覆盖自动检测的待机功率下限(留空则使用自动值)。", + "pg_stress_toggle": "测试闲置终止", + "pg_stress_toggle_desc": "模拟设备在录制结束后维持待机功耗水平,查看 WashData 是否以及何时停止运行周期。", + "pg_sweep_2d": "2D 热图", + "pg_sweep_param_y": "第二个参数", + "pg_obj_match": "匹配准确度", + "pg_obj_endtiming": "结束时机准确度", + "pg_obj_falseend": "误结束率", + "pg_obj_overrun": "时长偏离目标", + "pg_obj_ambiguity": "不明确率", + "pg_best_combo": "最佳组合", + "pg_mode_optimize": "优化", + "pg_group_matching": "程序匹配", + "pg_zoom_hint": "双击可重置缩放", + "aria_playground_chart2": "交互式周期功率图:悬停查看时间/功率,滚动缩放,拖动平移", + "pg_alert_timeout_end": "因超时而结束,并非预测结束", + "pg_alert_indefinite": "将一直运行下去", + "pg_alert_stress_cap": "已达到安全上限", + "pg_alert_stress_ok": "闲置终止: 运行周期已停止", + "pg_alert_stress_warn": "待机功耗超过停止阈值", + "task_pg_history": "用历史测试", + "task_pg_sweep": "优化", + "task_reprocess": "重新处理", + "task_ml_training": "学习", + "eta_secs": "剩~{n}秒", + "eta_mins": "剩~{n}分", + "pg_recent_runs": "最近的运行", + "pg_load_run": "重新加载此运行", + "pg_match_confidence": "匹配置信度", + "pg_envelope_fit": "包络拟合度", + "pg_envelope_fit_tip": "周期与此配置文件已保存的功率包络的贴合程度,与匹配置信度不同的视角。", + "n_imported_note": ",已导入 {n} 个", + "enable_online": "启用在线功能", + "store_brand": "家电品牌", + "store_model": "家电型号", + "anonymous": "匿名", + "rate_quality": "评价质量", + "rate_n": "{n} 星", + "approved_only": "仅已批准", + "adopt_settings": "同时采用设置", + "flags": "标志", + "include_phase_map": "包含阶段图", + "include_settings": "包含检测与匹配设置", + "show_contributor": "显示贡献者名称", + "task_pg_detail": "模拟周期", + "task_split": "正在拆分周期", + "task_trim": "正在裁剪周期", + "task_merge": "正在合并周期", + "task_rebuild": "正在重建包络", + "cat_profiles": "配置文件(程序)", + "cat_real_cycles": "周期(运行历史)", + "cat_reference_cycles": "参考周期(已导入)", + "cat_custom_phases": "自定义阶段", + "cat_profile_groups": "配置文件组", + "cat_settings": "检测与识别设置", + "cat_matching_config": "识别器调优", + "cat_ml_models": "ML 模型", + "cat_feedback": "反馈与审阅标签", + "cat_suggestions": "建议", + "cat_maintenance_log": "维护日志", + "cat_history_logs": "历史与更改日志", + "cat_lifetime_stats": "累计总量", + "cycles_short": "周期", + "import_mode": "合并方式", + "mode_merge": "合并(保留我的)", + "mode_replace": "替换所选", + "cycle_destination": "导入的周期应存放到哪里?", + "dest_reference": "参考(仅形状)", + "dest_real_history": "真实历史(计入统计)", + "conflict_resolution": "名称冲突", + "conflict_import_copy": "作为副本导入", + "conflict_keep_mine": "保留我的", + "conflict_overwrite": "覆盖", + "font_size": "面板字体大小" }, - "phase1b": { - "recorded": "您的录制已保存为 {profile_name}。现在录制或标记您的其他常用程序以建立覆盖范围。" + "log": { + "all_levels": "所有级别", + "all_devices": "所有设备", + "all_components": "所有组件", + "search_ph": "搜索日志…" }, - "phase1c": { - "verify": "您有来自社区的 {count} 个程序。运行一个周期以验证 WashData 是否正确识别 – 随着设备积累自己的历史记录,匹配将不断改善。" + "ml": { + "builtin_models": "● 使用内置模型", + "fit_fair": "尚可", + "fit_good": "良好", + "fit_slight": "轻微", + "fit_strong": "强", + "fit_weak": "弱", + "fit_word": "拟合", + "personalized": "● 已针对此机器个性化", + "better_than_baseline": "比基线估计好 {pct}%({metric})", + "trend_improving_tip": "该模型的拟合度在最近几次重新检查中有所提升。", + "trend_declining_tip": "该模型的拟合度在最近几次重新检查中有所下降,审查更多周期可能有助于它重新学习。", + "trend_steady_tip": "该模型的拟合度在最近几次重新检查中大致保持稳定。", + "cap_blurb": { + "end": "判断洗涤周期何时真正结束", + "live_match": "更早识别正在运行的程序", + "quality": "发现误检或损坏的周期", + "remaining_time": "预测剩余时间", + "total_energy": "预测总能耗和费用" + }, + "cap_label": { + "end": "周期结束检测", + "live_match": "程序匹配", + "quality": "周期质量检查", + "remaining_time": "剩余时间估算", + "total_energy": "能耗估算" + }, + "metric_auc": "留出验证数据上的 AUC {auc}", + "metric_mae": "误差 {model} vs 基线 {baseline}" }, - "phase2": { - "cluster": "WashData 发现了 {count} 个与任何已保存程序不匹配的周期 – 它们彼此相似。想为这些周期创建新配置文件吗?", - "unmatched": "您的上一个周期与任何已保存的程序不匹配。是新程序吗?" + "modal": { + "auto_label": "自动标记周期", + "correct_feedback": "修正反馈", + "create_profile": "创建配置文件", + "cycle": "周期", + "edit_group": "编辑配置文件组", + "edit_phase": "编辑阶段", + "import_config": "导入配置", + "label_cycle": "标记周期", + "merge_cycles": "合并 {n} 个周期", + "new_group": "新建配置文件组", + "new_phase": "新建阶段", + "process_history_msg": "重新运行匹配、刷新建议、重新训练 ML(如果启用)并重新计算所有存储循环的循环健康状态。这可能需要一些时间。", + "process_history_ok": "处理", + "process_history_title": "处理历史记录", + "process_recording": "处理录制", + "delete_maintenance_msg": "删除此维护记录?此操作无法撤销。", + "delete_maintenance_title": "删除维护事件", + "relabel_cycles": "重新标记 {count} 个周期", + "delete_automation_title": "删除自动化", + "delete_automation_msg": "从 Home Assistant 中删除自动化“{name}”吗?此操作无法撤销。", + "remove_legacy_title": "移除旧版操作", + "remove_legacy_msg": "移除旧版自定义操作吗?它们将不再在周期事件上触发。此操作无法从面板撤销。", + "discard_recording_title": "丢弃录制", + "discard_recording_msg": "丢弃已保存的录制吗?此操作无法撤销。", + "dismiss_all_title": "关闭所有反馈", + "dismiss_all_msg": "关闭全部 {count} 个待处理的反馈请求吗?", + "dismiss_all_ok": "全部关闭", + "delete_phase_title": "删除阶段", + "delete_phase_msg": "删除阶段“{name}”吗?", + "clear_debug_title": "清除调试数据", + "clear_debug_msg": "删除所有已存储的调试追踪吗?", + "wipe_all_title": "清除所有数据", + "wipe_all_msg": "⚠️ 这将永久删除所有周期和配置文件。此操作无法撤销。", + "wipe_all_ok": "清除全部", + "force_stop_title": "强制停止周期", + "force_stop_msg": "立即强制停止当前周期吗?该周期将被保存为已中断。", + "store_import": "导入参考周期", + "store_share": "分享到社区商店", + "store_share_device": "分享此设备", + "export_select": "导出 - 选择数据", + "import_wizard": "导入 - 选择数据" }, - "phase3": { - "suggestions": "WashData 根据您的周期历史记录提供了设置建议 – 请查看以提高检测精度。", - "groups": "您的部分配置文件看起来像在不同温度下运行的同一程序。将它们整理成组以获得更好的匹配效果。", - "phases": "为 {profile_name} 添加程序阶段,以获得更准确的剩余时间估算。" + "msg": { + "appliance_monitor": "设备监控", + "artifact_dip_detail": "跌破通常功率范围约 {n} 秒。", + "artifact_footer": "在上图中高亮显示。这些是瞬态异常(例如门在周期中打开),不一定是问题。", + "artifact_header": "此周期中检测到 {n} 个异常", + "artifact_pause_detail": "功率降至接近零约 {n} 秒后恢复 – 可能是周期中途开门或周期被暂停。", + "artifact_spike_detail": "超出通常功率范围约 {n} 秒。", + "auto_label_intro": "为置信度达到阈值的未标记周期分配配置文件。", + "automations_intro": "WashData 触发 {start} / {end} 事件并公开实体,因此通知和操作最好构建为常规 Home Assistant 自动化。使用此设备的自动化显示在下方。", + "cleanup_intro": "显示所有已标记周期的叠加。勾选离群值并删除以清理配置文件。", + "clear_debug_hint": "删除存储的调试数据以释放空间。", + "collecting_data": "正在收集数据,还需要 {need} 个周期{plural}才能开始微调({current}/{min})。", + "compare_overlay_profiles": "叠加配置文件(浅色)", + "compare_profiles_tip": "将其他配置文件包络叠加在上方图表上,看哪个最适合此周期。", + "compare_selected_cycles": "选中的周期(实线)– 显示/隐藏", + "consider_new_profile": "考虑创建新配置文件。", + "coverage_gap": "近期周期没有匹配的配置文件(最近 30 次的 {pct}%)。", + "coverage_gap_similar_cycles": "发现 {count} 个相似未标记周期 – 创建配置文件以开始匹配它们。", + "cycles_deleted": "已删除 {count} 个周期", + "enough_data": "有足够数据可供学习({current}/{min} 个循环)。", + "export_description": "精确选择要导出到 JSON 的配置文件、周期、设置等,或分析文件并仅导入所需的部分。", + "feedback_cycles_pending": "{n} 个周期{s}待审查", + "feedback_prompt": "确认正确、修正程序或忽略。", + "feedback_relabel_hint": "重新标记此周期也会解决它。", + "filter_by_profile": "按配置文件筛选…", + "group_modal_help": "将形状相同但温度/转速不同的程序分组(时长可能不同)。匹配将组作为一个候选项评分,然后选择最合适的成员。至少选 2 个;叠加显示相似程度。", + "group_not_cohesive": "这些配置文件不够相似,无法可靠分组,因此匹配会单独处理它们,直到您移除离群值或拆分组。", + "group_preview_hint": "勾选 2+ 个成员以预览并比较其功率曲线。", + "import_intro": "加载导出文件或在下方粘贴 JSON 内容。", + "legacy_actions_title": "{count} 个旧版自定义操作仍在运行", + "live_chart_loading": "实时功率图表将随读数到达而显示。", + "loading": "加载中…", + "loading_curve": "加载曲线…", + "loading_settings": "加载设置…", + "log_buffer_hint": "最新在前 · 缓冲自重启以来最后 500 条 ha_washdata 记录 · 拖动底边调整大小。", + "maintenance_advisory": "时长/能耗增加可能表明设备需要维护(例如除垢、清洗滤网)。", + "maintenance_due": "待办维护:{items}", + "maintenance_intro": "记录您对此设备执行的保养,并在每项任务再次到期时收到提醒。", + "maintenance_load_error": "无法加载维护数据:{error}", + "maintenance_requires_access": "维护和导出/导入需要完全访问权限。", + "manual_duration_hint": "配置文件的平均/预期周期时长,用于剩余时间估算。编辑以设置;保持不变则保留当前值。", + "matching_tuning_intro": "在学习时,WashData 还会调整程序匹配对形状与时长和能耗的权重比例。", + "merge_intro": "选中的周期将按时间顺序合并(间隙填充为 0 W)。选择结果配置文件。", + "ml_intro": "WashData 配备了开箱即用的智能模型。", + "ml_learned_intro": "针对此机器微调的模型。", + "ml_loading": "加载 ML 中…", + "ml_settings_intro": "两个独立开关:一个在周期运行时应用模型,另一个让 WashData 随时间针对您的机器进行微调。", + "name_first_program": "您已有足够的周期 – 为您的第一个程序命名即可开始匹配。", + "near_duplicate_cluster": "检测到近似重复的配置文件群。分组可让匹配在相似项目间可靠地选择(例如同一程序在不同温度/转速下)。", + "no_cycles_match": "没有与当前筛选条件匹配的周期。", + "no_cycles_profile": "此配置文件没有周期。", + "no_cycles_selected": "请先至少选择一个周期。", + "no_cycles_yet": "尚未记录任何周期。", + "no_device_selected": "未选择设备。", + "no_devices": "尚未配置 WashData 设备。", + "no_envelope": "还没有包络 – 标记周期后重建。", + "no_envelope_overlay": "没有可叠加的包络。", + "no_fine_tuned": "尚未微调 – WashData 正在使用内置模型。", + "no_logs": "尚未缓冲任何日志记录。", + "no_maintenance": "尚未记录任何维护。", + "no_match_yet": "尚未尝试匹配 – 此项在运行周期时填充。", + "no_other_users": "未找到其他 Home Assistant 用户。", + "no_phases": "未定义阶段。", + "no_phases_assigned": "未分配阶段。", + "no_profiles_compare": "没有可比较的配置文件。", + "no_profiles_overlay": "没有可叠加的配置文件。", + "no_profiles_yet": "还没有配置文件。从已标记的周期创建一个。", + "no_profiles_yet_short": "还没有配置文件。", + "no_settings_match": "没有与“{q}”匹配的设置", + "no_split_points": "还没有分割点。", + "no_suggestions": "没有活跃的建议。", + "notify_services_hint": "使用 {entity} 服务 ID(多个请用英文逗号分隔)。模板变量:{vars}。", + "old_actions_warning": "使用旧版操作编辑器配置(现已移除)。它们仍会在周期事件上触发,但无法在此处编辑。将它们转换为普通自动化,或移除它们。", + "onboarding_progress": "已观察 {n} / 3 个周期", + "onboarding_watching": "照常使用您的设备 – WashData 正在观察。3 个周期后将开始程序匹配。", + "pending_feedback": "待处理的检测反馈", + "performance_trend": "性能趋势({n} 个周期)", + "pg_analysis_empty": "加载一个周期以查看匹配分析。", + "pg_apply_confirm": "应用最佳值:{label} = {value}?", + "pg_canvas_empty": "在上方选择一个周期,然后按加载查看其功率轨迹。", + "pg_chart_caption": "不同 {param} 取值下的检测/匹配率", + "pg_ctrl_intro": "数值以该设备当前生效的集成设置为起点。修改会保留在试验场中,直到您将其应用为止。", + "pg_live_unavailable": "无法获取生效设置,显示默认值。", + "pg_load_live_confirm": "放弃试验场中的 {n} 项修改并重新加载集成的当前设置吗?", + "pg_match_rate": "在 {total} 个周期上的匹配率为 {pct}%", + "pg_matches_live": "与生效设置一致", + "pg_n_changed": "与生效设置有 {n} 项不同", + "pg_sugg_none": "所有建议项已与当前设置一致", + "pg_preset_delete_confirm": "删除预设“{name}”吗?", + "pg_preset_limit": "已达预设数量上限({n})", + "pg_preset_overwrite": "覆盖预设“{name}”吗?", + "pg_publish_one_confirm": "将 {label} = {value} 保存到该设备的设置吗?", + "pg_restart_note": "重启 Home Assistant 以启用模拟工具。", + "pg_sim_progress": "{done} / {total} 个周期", + "pg_starting": "正在启动…", + "pg_stress_synthetic": "待机模拟从此处开始", + "pg_sweep_intro": "如果 {param} 不同会怎样?在最近 {cycles} 个周期上测试 {steps} 个值,找到能正确匹配最多周期的设置。", + "pg_sweep_step": "步骤 {done} / {total}", + "pg_undetected": "{n} 个周期{s}未检测到", + "pg_verdict_bad": "需要注意: 许多周期未被检测到。", + "pg_verdict_good": "调校良好: 大多数周期都被正确识别和匹配。", + "pg_verdict_ok": "尚可: 漏掉了一些周期。可尝试降低启动阈值。", + "phase_catalog_intro": "周期的命名片段(预洗、加热、甩干…)。从其控制面板将它们分配给配置文件。", + "phase_ranges_intro": "叠加在平均曲线上的阶段范围(从周期开始的分钟数)。编辑值以实时预览。", + "playground_intro": "一个安全的沙盒,可用不同设置回放过去的周期、并排比较两套配置,并查看周期如何与配置文件对齐。在您明确应用之前,此处的任何操作都不会更改您的实时数据。", + "playground_needs_restart": "重启 Home Assistant 以启用试验场工具。", + "preferences_admin": "偏好、面板和访问控制", + "preferences_adv": "偏好", + "prefs_personal": "这些仅适用于您的 Home Assistant 账户。", + "process_history_hint": "对所有存储的循环重新运行匹配、刷新调优建议、重新训练 ML 模型(如果启用)并重新计算循环健康状态。在批量审查后运行此项。", + "profile_deleted": "配置文件已删除", + "profile_poor_health_detail": "分配给此配置文件的周期形状不一致或置信度较低。考虑重建包络或审查已标记的周期。", + "profiles_intro": "点击配置文件查看统计、阶段和清理。将形状/时长相近(不同温度或转速)的程序分组,以便匹配可靠地区分它们。", + "rbac_hint": "关闭时,每个 Home Assistant 用户都有完全访问权限(默认)。管理员始终有完全访问权限并可管理所有人。", + "recent_logs": "最近的 ha_washdata 记录", + "recording_in_progress": "录制进行中", + "reminders_intro": "在上次保养后经过这么多个周期时在面板中显示提醒。留空或填 0 可关闭提醒。", + "restart_gap_footer": "在图表上突出显示。这些间隔的功率数据缺失––仅使用真实读数进行匹配。", + "restart_gap_header": "{n} 此周期内的 HA 重新启动间隔", + "restart_gap_item": "{dur}间隙", + "review_confirm_help": "确认此周期是否被正确检测。您的审查可在您的机器上训练模型 – 确认的周期越多,匹配和健康评分越好。快速的好/差就足够了。", + "review_in_settings": "在设置中审查", + "review_notes_placeholder": "注释(可选)", + "review_notes_tip": "供个人参考的自由文本注释。不用于匹配或训练。", + "review_profile_tip": "此周期标记的程序。如果自动检测的程序有误,请在此处修正 – 标记可帮助未来周期的匹配学习。", + "review_quality_tip": "此周期的质量。好 = 该程序的标准示例;差 = 已检测但有噪声或不典型;不可用 = 误检测(合并、截断或虚假)。影响健康评分及允许训练模型的周期。", + "review_recorded_tip": "将此标记为其程序的精选参考周期 – 与手动录制周期的作用相同。参考周期始终保留,为匹配模板提供种子,且不会被清理删除。(这是“黄金”/录制标志;两者是同一件事。)", + "review_tags_tip": "描述此周期出现问题的可选标志,以便训练和清理可以考虑这些问题。", + "review_to_cycles": "打开周期审查队列", + "saving_triggers_reload": "保存会触发集成重载。HA 实体可能短暂显示为不可用。", + "search_placeholder": "搜索设置…", + "see_recorder": "查看下方的录制小部件", + "setting_changed": "于 {date} 从 {old} 更改为 {new}", + "settings_basic_note": "正在显示基本设置。切换到高级可查看完整列表。", + "shape_drift_advisory": "⚠ 形状偏移", + "shape_drift_detail": "此配置文件的功率模式随时间发生了变化 – 可能是设备磨损或需要维护(例如除垢、清洁滤网)。", + "show_all_settings": "显示所有设置", + "showing_suggestions": "显示 {count} 个有建议的设置。", + "split_intro": "点击图表添加或删除分割点,或通过空闲间隔自动检测。每个结果片段可获得自己的配置文件。", + "storage_diagnostics": "存储统计、维护、导出/导入", + "sug_staged": "已设置 {key} = {val}。保存以应用。", + "toast_auto_detect_enabled": "自动检测已启用", + "toast_auto_label_complete": "自动标注完成", + "toast_auto_label_failed": "自动标注失败:{error}", + "toast_automation_failed": "无法创建自动化:{error}", + "toast_automation_migrated": "操作已迁移至自动化,正在打开编辑器", + "toast_convert_failed": "转换失败:{error}", + "toast_create_failed": "创建失败:{error}", + "toast_delete_failed": "删除失败:{error}", + "toast_error": "错误:{error}", + "toast_failed": "失败:{error}", + "toast_force_stop_failed": "强制停止失败:{error}", + "toast_name_required": "需要填写名称", + "toast_no_automation": "此处无法创建自动化", + "toast_profile_name_required": "配置文件名称为必填项", + "toast_program_set": "已设置程序:{program}", + "toast_rebuild_failed": "重建失败:{error}", + "toast_resume_failed": "恢复失败:{error}", + "toast_revert_failed": "还原失败:{error}", + "toast_reverted": "已还原 {key}", + "toast_save_failed": "保存失败:{error}", + "trend_duration_longer": "时长趋势增长({pct}%/周期)– 近期平均 {avg}", + "trend_duration_shorter": "时长趋势缩短({pct}%/周期)– 近期平均 {avg}", + "trend_energy_down": "能耗趋势下降({pct}%/周期)", + "trend_energy_up": "能耗趋势上升({pct}%/周期)– 近期平均 {avg}", + "trim_destructive_confirm": "这将仅保留该周期的 {pct}%,且此操作无法撤销。是否继续?", + "trim_intro": "拖动红色控制柄,或输入值。窗口外的所有内容将被移除。", + "tuning_suggestions_available": "来自观察周期的 {count} 个调整建议可用。它们显示在相关字段旁边。", + "unsure_detected_prefix": "WashData 不确定是否检测到", + "updated": "已更新", + "warmup_badge": "仍在学习中({done}/{needed} 个周期)", + "warmup_detail": "该配置文件需要 {needed} 个已标记的周期后才能开始自动匹配。每个已确认的周期都有助于学习。", + "wipe_history_warning": "永久删除所有周期和配置文件。无法撤销。", + "compare_overlay_tip": "叠加已学习的配置文件包络,查看每个周期与哪个程序相似。", + "duration_trend_up_tip": "时长上升({pct}%/周期)", + "duration_trend_down_tip": "时长下降({pct}%/周期)", + "energy_trend_up_tip": "能耗上升({pct}%/周期)", + "energy_trend_down_tip": "能耗下降({pct}%/周期)", + "performance_trending": "性能趋势变化", + "pg_select_cycle_hint": "选择一个周期并点击 ↺ 加载", + "pg_sweep_progress": "步骤 {done} / {total}", + "pg_analysis_hint": "选择一个周期并点击 ↺ 加载分析。", + "diagnostics_load_failed": "无法加载诊断:{error}", + "manual_duration_ref_hint": "仅在未选择参考周期时使用。参考周期会根据自身长度设置时长。", + "toast_convert_rolled_back": "转换失败并已回滚(未遗留任何自动化):{error}", + "toast_convert_orphan": "自动化已创建,但清除旧操作失败。请勿重试:请手动移除旧操作,以避免自动化重复。", + "advisory_duration_trend_up": "'{name}' 的周期正逐渐变长(每个周期约 +{pct}%)。如果设备行为发生了变化,请重新录制或重建此配置文件。", + "advisory_energy_trend_up": "'{name}' 的能耗正逐渐增加(每个周期约 +{pct}%) - 如果这不符合预期,建议检查一下设备。", + "advisory_poor_health": "'{name}' 的拟合度评分较低 - 其近期周期波动较大或匹配较弱。请检查其周期或重新录制该配置文件,以保持匹配和时间估算的准确性。", + "advisory_shape_drift": "'{name}' 已明显偏离其原始功率曲线。设备行为可能随时间发生了变化(例如水垢、磨损)。建议用近期周期重新录制此配置文件。", + "advisory_shape_drift_corr": "'{name}' 已明显偏离其原始功率曲线(相关系数 {corr})。设备行为可能随时间发生了变化(例如水垢、磨损)。建议用近期周期重新录制此配置文件。", + "pg_no_alerts": "本次运行未检测到问题。", + "pg_override_active": "正在使用您编辑的设置对比当前设置", + "pg_history_intro": "用真实的检测器和匹配器重放您最近的周期。若要在此查看前后对比,请先在模拟中编辑一项检测设置。", + "pg_history_empty": "按运行以重放您的周期。", + "pg_history_summary": "{detected}/{total} 已检测 · {correct} 正确匹配", + "pg_sweep_no_metric": "数据不足,无法为此目标评分。", + "pg_sweep_intro2": "在您最近的周期中找到最能满足某个目标的设置。在您应用之前不会有任何更改。", + "pg_running_history": "正在重放您的周期…", + "pg_running_sweep": "正在所有周期上测试各个值…", + "pg_row_load_hint": "在上方图表中加载此周期", + "pg_history_intro2": "使用上方设置,将您最近的周期通过真实的检测器和匹配器重新运行。点击任意行可在图表中加载该周期;修改设置可查看修改前后的对比。", + "pg_simulating": "正在模拟周期…", + "pg_canvas_empty2": "在上方选择一个周期并按“运行”进行模拟。然后悬停查看数值,滚动缩放,拖动平移。", + "pg_apply_settings_confirm": "将这 {n} 项设置保存到该设备吗? {list}", + "pg_stress_terminated_detail": "稳定在约 {idle}W 的待机功率 -- {h} 小时 {m} 分钟后通过 {reason} 结束了周期。", + "pg_stress_above_threshold_detail": "待机功耗约 {idle}W 达到或超过有效停止阈值 ({stop}W) -- 周期从未被判定为静止状态。请提高 stop_threshold_w 以修复。", + "pg_stress_hit_cap_detail": "周期运行了 {h} 小时 {m} 分钟仍未停止 -- 被安全上限强制停止。待机功耗 {idle}W 对比停止阈值 {stop}W。", + "no_logs_match": "没有日志记录符合这些筛选条件。", + "pg_analysis_hint2": "选择一个周期并点击运行以加载匹配分析。", + "pg_analysis_empty2": "点击运行以查看匹配分析。", + "imported_readonly": "从社区商店导入。用于参考和匹配。不计入您的统计,且无法编辑。", + "merge_no_imports": "导入的录制无法合并到真实周期中。取消选择它们以进行合并。", + "store_enable_hint": "在设置中启用在线功能,以浏览和导入社区参考周期。", + "online_intro": "与其他 WashData 用户分享和下载参考周期。所有在线功能均为自愿加入,默认关闭。", + "store_share_intro": "上传此参考周期,以便拥有相同家电的其他人使用。它会经过审核后才公开显示。", + "online_intro_global": "与其他 WashData 用户浏览和分享参考录制,并确认家电条目。一次连接适用于您的整个 WashData 集成;家电品牌和型号在“基本配置”下按设备设置。所有在线功能均为自愿加入,默认关闭。", + "online_unavailable": "此服务器不支持在线功能。", + "store_picker_offline": "在设置齿轮中启用在线功能,即可从社区目录中选择。", + "pick_brand_first": "请先选择家电品牌。", + "model_not_found": "尚未收录在目录中。", + "connect_to_confirm": "在设置齿轮中连接以确认或评分。", + "adopt_settings_hint": "用共享的设置覆盖此设备的检测和匹配阈值。您的通知、实体和电价永远不会更改。", + "include_settings_hint": "分享此设备的识别和匹配阈值(不含通知、实体或电价)。采用者自行选择是否应用。", + "onboard_download": "新设备?从拥有相同设备的其他 WashData 用户处采用现成配置(程序、参考周期和阶段)。", + "share_consent": "我确认这些周期均正常完成,无中断", + "share_device_none": "暂无可分享的周期。请先在\"周期\"选项卡中将录制或手动选择的周期标记为参考周期(⭐)。", + "share_guideline_naming": "请按设备表盘或显示屏上显示的名称命名每个配置文件(例如:'Cotton 40'、'Eco 60')。", + "share_guideline_quality": "仅分享正常完成的周期 -- 无周期中断、开门事件或电源波动。", + "share_guideline_review": "您的上传从待审核状态开始,待足够多的社区成员确认后将公开显示。", + "share_guidelines_title": "分享前须知", + "store_download_device_intro": "将所有共享程序及其参考周期采用到您的设备。您自己录制的周期和统计数据不受影响。", + "store_share_device_intro": "上传 {brand} {model} 及您选择的参考周期。拥有相同设备的其他用户可以采用您的程序。条目在公开前经过审核。", + "share_profile_no_cycles": "无参考周期 -- 请在\"周期\"选项卡中将周期标记为 ⭐ 以包含此配置文件", + "advisory_phase_inconsistent": "'{name}' 似乎混合了不同的程序或温度,各周期的加热时长差异很大。将其拆分为独立的配置文件(例如按温度区分)可以改善匹配和时间估算。", + "advisory_phase_inconsistent_title": "⚠ 可能混合了不同程序", + "export_select_intro": "精确勾选要包含的内容。即使选择配置文件而不包含其周期,仍会导出可识别的程序(其学习到的形状会一同迁移)。", + "import_analyze_hint": "加载导出的文件(或粘贴其 JSON)。WashData 会对其进行分析,并在任何更改之前准确显示可导入的内容。", + "analyzing": "正在分析…", + "device_type_mismatch_warn": "此导出文件来自不同的设备类型({src} 对 {local})。程序和周期仍可作为参考数据导入,但设备专属设置和真实历史导入将被禁用。", + "merge_hint": "导入的项目会被添加,本地数据不会丢失。名称冲突将在下方解决。", + "replace_warn": "每个勾选的类别都会被清除并用文件中的内容替换。未勾选的类别保持不变。", + "dest_reference_hint": "导入的周期仅用于改进程序识别,绝不影响用量/能耗统计。", + "dest_real_history_hint": "导入的周期计为本设备自身的历史记录,并纳入能耗/用量统计。适用于将一台设备迁移到新的安装环境。", + "sug_muted": "将不再建议此设置", + "sug_mute_failed": "无法屏蔽建议", + "sug_unmuted_all": "已重置屏蔽的建议", + "n_suggestions_muted": "已屏蔽 {count} 项,自动调整器将不再提议这些设置。", + "font_size_hint": "调整此面板所有内容的字体大小,仅对您在此设备上的账户生效。" }, - "phase4": { - "healthy": "此设备已完全设置好({profile_count} 个配置文件)。" + "pg_desc": { + "completion_min_seconds": "计为真实周期的最短运行时间", + "end_repeat_count": "结束前连续的低读数次数", + "interrupted_min_seconds": "短周期标记为中断", + "min_off_gap": "区分两个周期所需的间隔", + "off_delay": "周期结束前低功率持续的秒数", + "start_duration_threshold": "确认启动所需的超阈值秒数", + "start_threshold_w": "计为启动的最小瓦数", + "stop_threshold_w": "低于此值机器计为关闭", + "anti_wrinkle_enabled": "吸收主阶段之后的翻滚脉冲,而不是将其识别为新周期", + "anti_wrinkle_exit_power": "脉冲之间的功率必须低于此值,防皱才能保持活动", + "anti_wrinkle_idle_timeout": "防皱结束前两次翻滚脉冲之间允许的静止时间", + "anti_wrinkle_max_duration": "长于此值的脉冲将结束防皱并开启新周期", + "anti_wrinkle_max_power": "高于此值的脉冲将结束防皱并开启新周期", + "dtw_bandwidth": "Stage 3: Sakoe-Chiba 规整带宽 (0 = DTW 关闭; 默认 0.2 = 周期长度的 20%)", + "corr_weight": "Stage 2: 曲线形状(相关性)与功率水平(MAE)之间的平衡; 默认 0.45", + "duration_weight": "Stage 4: 运行时长一致性对最终得分的影响程度(默认 0.22)", + "energy_weight": "Stage 4: 能耗一致性对最终得分的影响程度(默认 0.22)", + "profile_match_min_duration_ratio": "Stage 1: 最短允许运行时长占档案时长的比例; 默认 0.1 (10%)", + "profile_match_max_duration_ratio": "Stage 1: 最长允许运行时长占档案时长的比例; 默认 1.5 (150%)", + "keep_min_score": "Stage 2: 保留在竞争中的最低得分; 默认 0.1 接受弱候选,后续阶段选出最佳", + "dtw_blend": "Stage 3: 0 = 仅核心得分,1 = 仅 DTW 得分,0.5 = 等权混合(默认)", + "dtw_ensemble_w": "Stage 3 (集成模式): 缩放 L1 对导数 DTW 的权重; 默认 0.7 偏重水平感知", + "dtw_ddtw_scale": "Stage 3: DDTW 半饱和距离; 越小对形状越敏感(默认 30)", + "dtw_refine_top_n": "Stage 3: DTW 重新评分的候选数量; 若正确档案排在第 4-5 位则调高至 7-9(默认 5)", + "duration_scale": "Stage 4: 时长一致性得分减半时的对数比率; 越小惩罚越严格(默认 0.175)", + "energy_scale": "Stage 4: 能耗一致性得分减半时的对数比率; 越小惩罚越严格(默认 0.25)", + "dishwasher_end_spike_quiet_release": "洗碗机:预期时长过后、解除周期结束排水等待之前保持静止的秒数" }, - "cta": { - "start_recording": "开始录制", - "label_detected_cycle": "我已有检测到的周期 – 直接标记", - "browse_cycles": "浏览周期以标记其他", - "view_profiles": "查看您的配置文件", - "create_from_cluster": "从这些周期创建配置文件", - "create_profile": "为此创建配置文件", - "review_suggestions": "查看建议", - "organise_profiles": "整理配置文件", - "configure_phases": "配置阶段", - "skip_step": "跳过此步骤", - "skip_forever": "不再显示", - "hide_guidance": "隐藏指南", - "show_guidance": "显示指南" + "phase_desc": { + "anti_crease": "完成后偶尔进行短暂的翻滚以减少皱纹。", + "anti_wrinkle": "周期后定期翻滚以减少皱纹。", + "cool_down": "接近循环结束时在没有热量的情况下翻滚。", + "drain_and_switch": "从洗涤模式到干燥模式的过渡期。", + "dry": "使用加热器和/或余热的干燥阶段。", + "drying": "主要加热翻滚期。", + "heat_up": "完全干燥开始之前加热器初始预热。", + "pre_rinse": "洗涤剂清洗前初步喷洒。", + "pre_wash": "主洗前的初步浸泡或预处理。", + "rinse": "清水冲洗阶段。该阶段可能会重复多次。", + "sanitize": "用于消毒程序的高温清洁阶段。", + "sensor_check": "测量干燥度时短暂的低功率暂停。", + "soak": "活性洗涤阶段之间的低活性浸泡期。", + "soak_dw": "对重度污垢进行延长浸泡。", + "spin": "高速提取以去除负载中的水。", + "spin_wd": "干燥过渡前高速萃取。", + "wash": "主洗涤周期带有滚筒运动和可选加热。", + "wash_dw": "主要洗涤剂加热洗涤。" + }, + "placeholder": { + "add": "添加…", + "group_name": "例如 棉布 2:47", + "json_buttons": "[{\"action\":\"ID\",\"title\":\"Label\"}]", + "notify": "添加通知服务…", + "notify_services_list": "notify.mobile_app_phone, ...", + "person": "添加人员…", + "phase_name": "例如 预洗", + "profile_name": "例如 棉布 40°C", + "maintenance_notes": "例如:更换了过滤器、清洁了门封", + "store_brand": "例如 Bosch", + "store_model": "例如 WAT28401" + }, + "pref": { + "date_absolute": "绝对时间(例如:7月2日 14:32)", + "date_relative": "相对时间(例如:2小时前)", + "lang_auto": "系统默认({lang})", + "lang_en": "英语", + "use_panel_default": "(面板默认)" + }, + "quality": { + "bad": "差", + "good": "好", + "unusable": "不可用" + }, + "section": { + "anti_wrinkle": { + "intro": "防皱模式检测主阶段后的低功率翻滚脉冲,并将其附加到完成的周期。", + "label": "防皱" + }, + "basic": { + "intro": "核心标识和大多数设置所需的基本要素。", + "label": "基本" + }, + "delay": { + "intro": "延迟启动检测识别设备已通电但尚未开始运行的情况。", + "label": "延迟启动" + }, + "detection": { + "intro": "周期的启动、运行和结束是如何被检测的。", + "label": "检测" + }, + "matching": { + "intro": "已完成的周期如何与学习到的运行档案匹配并贴标签。", + "label": "匹配" + }, + "ml_training": { + "intro": "设备端机器学习重训练计划和数据设置。", + "label": "ML 训练" + }, + "notifications": { + "intro": "关于周期事件,您何时以及如何收到通知。", + "label": "通知" + }, + "timing": { + "intro": "后台节奏、离线看门狗和日常维护。", + "label": "计时与看门狗" + }, + "triggers": { + "intro": "可选的外部信号:结束触发器、门传感器、暂停开关和卸载提醒。", + "label": "触发器与门" + }, + "phase_eta": { + "label": "剩余时间", + "intro": "阶段感知的剩余时间,适用于周期长度取决于温度或脱水的机器。" + }, + "dishwasher": { + "label": "洗碗机", + "intro": "洗碗机的周期结束处理。洗碗机通常在短暂的最终排水之前,会经历一个近乎无功耗的长时间干燥阶段。" + } + }, + "setting": { + "anti_wrinkle_enabled": { + "doc": "识别烘干机在主要加热阶段后发出的短的低功率翻滚脉冲,并将它们附加到完成的循环,而不是将它们视为新循环。", + "label": "启用防皱检测" + }, + "anti_wrinkle_exit_power": { + "doc": "脉冲之间的功率必须低于此值,抗皱模式才能保持活动状态。", + "label": "退出功率阈值" + }, + "anti_wrinkle_idle_timeout": { + "label": "最大脉冲间隔", + "doc": "防皱模式结束前,机器在两次翻滚脉冲之间可以保持静止的时长。请将其设置为高于烘干机在脉冲之间留出的最长间隔,否则之后的每个脉冲都会被识别为误启动。" + }, + "anti_wrinkle_max_duration": { + "doc": "比这更长的脉冲被视为真正的周期,而不是抗皱滚动。", + "label": "最长时长" + }, + "anti_wrinkle_max_power": { + "doc": "高于此功率的脉冲被视为真正的新周期,而不是抗皱翻滚。设置在翻滚脉冲功率的正上方。", + "label": "最大防皱功率" + }, + "auto_label_confidence": { + "doc": "如果周期结束时的比赛分数等于或高于此分数,则节目将自动标记,无需任何确认提示。在自动标记之前将其提高到需要更高的确定性;降低它以实现更多自动化。与下面的学习信心结合使用。", + "label": "自动标记置信度" + }, + "auto_maintenance": { + "doc": "每晚运行内务管理:重建配置文件包络、重新计算周期运行状况、修剪调试跟踪并保留最新的周期。", + "label": "自动维护(每夜清理)" + }, + "completion_min_seconds": { + "doc": "比这个短的周期将被丢弃为幽灵周期(测试运行,打开门添加袜子)。", + "label": "最短周期时长" + }, + "delay_confirm_seconds": { + "doc": "在设备被视为等待启动而不是运行之前,电源必须保持在待机状态这么长时间。", + "label": "确认秒数" + }, + "delay_start_detect_enabled": { + "doc": "检测设备何时开机并等待(延迟启动/待机)但尚未开始其周期,因此待机绘制不会被误认为是运行周期。", + "label": "启用延迟启动检测" + }, + "delay_timeout_hours": { + "doc": "经过这么多小时后,停止在延迟启动模式下等待并返回空闲状态,因此保持通电但从未启动的机器不会永远等待。", + "label": "超时小时数" + }, + "device_type": { + "doc": "家电类。设置针对该设备类型调整的合理检测默认值(阈值、关闭延迟、结束处理);仅当设备最初设置为错误类型时才更改它。", + "label": "设备类型" + }, + "door_sensor_entity": { + "doc": "可选门二进制传感器。用于检测设备在一个周期后何时打开/卸载。", + "label": "门传感器实体" + }, + "duration_tolerance": { + "doc": "对剩余时间估计的容忍度(学习反馈,而不是匹配)。如果实际持续时间在估计值的 +/-X% 范围内,则视为良好匹配。", + "label": "估算容差" + }, + "enable_ml_models": { + "doc": "当一个循环运行时,让模型完善实时结果:更稳定的剩余时间和能量/成本估计,以及结束检测的防过早停止防护(它只能延迟完成,永远不会提前结束,并且是有限的)。如果可用,则使用您的微调模型,否则使用内置模型。关闭 = 仅经典的基于电源的逻辑(仍然可靠)。", + "label": "在周期中应用智能模型" + }, + "end_energy_threshold": { + "doc": "在关闭延迟倒计时期间,累积能量(瓦特 x 时间)与该阈值进行比较。如果超过,倒计时会重置 - 将防皱翻滚和洗碗机干燥尾部连接到循环上,而不是缩短它们。如果冷却过程中循环结束得太早,则提高它;如果检测缓慢,则降低它。", + "label": "结束能耗" + }, + "end_repeat_count": { + "doc": "周期结束前所需的连续低于停止阈值的读数数。 1 适用于大多数插头。如果您的智能插头偶尔在周期中报告假零样本并且您的周期提前结束,则提高到 2-3。", + "label": "结束重复次数" + }, + "energy_price_entity": { + "doc": "具有当前每千瓦时电价的传感器(例如动态电价)。优先于下面的静态价格。每个周期结束后都会冻结实际价格。", + "label": "电价实体" + }, + "energy_price_static": { + "doc": "当上面未设置实时价格实体时,每千瓦时的固定价格用于成本数据。", + "label": "固定电价(每 kWh)" + }, + "energy_sensor": { + "doc": "可选的累积电能计数器(total_increasing 的 kWh/Wh,例如插座自带的累计电能表)。设置后,每个周期报告的能耗将取自该计数器从开始到结束的差值(delta),从而避免因积分上报缓慢的功率传感器而导致的少计。若读数缺失、单位未知或差值不为正,则回退到积分值。留空则继续对功率传感器进行积分。", + "label": "电能表实体" + }, + "expose_debug_entities": { + "doc": "发布额外的诊断 HA 实体(匹配置信度、模糊性、状态内部)。关闭可保持实体列表干净以供正常使用。", + "label": "暴露调试实体" + }, + "external_end_trigger": { + "doc": "状态变化标志着周期结束的二进制传感器(例如,设备“完成”接触或配套集成)。", + "label": "外部触发器实体" + }, + "external_end_trigger_enabled": { + "doc": "除了内置的基于电源的检测之外,还可以让外部二进制传感器发出周期结束信号。", + "label": "启用外部结束触发器" + }, + "external_end_trigger_inverted": { + "doc": "将触发传感器关闭(而不是打开)视为周期结束信号。", + "label": "反转外部触发器(关闭时触发)" + }, + "learning_confidence": { + "doc": "如果匹配分数介于此分数和自动标签置信度之间,则会出现反馈通知,要求您验证已识别的程序。低于这个分数,比赛就太不确定了,无法浮出水面。必须保持在自动标签置信度以下。", + "label": "学习置信度" + }, + "linked_device": { + "doc": "可以选择将此 WashData 设备嵌套在 HA 设备注册表中的另一个设备(例如智能插头)下,显示为“通过...连接”。", + "label": "归入设备" + }, + "min_off_gap": { + "doc": "如果机器关闭时间少于该时间,则开/关/开序列被视为一个连续周期。防止浸泡程序(机器在洗涤过程中关闭几分钟)被分成两个单独的周期。如果您希望将这些负载算作单独的循环,请将其设置为短于连续负载之间的间隙。设备类型默认值可保护每个设备的典型周期内暂停。", + "label": "最小关闭间隔" + }, + "min_power": { + "doc": "视为活动的绝对最小功率。低于此值的读数被视为 0 W(待机),滤除智能插头和待机 LED 的幻象负载。", + "label": "最小功率" + }, + "ml_training_enabled": { + "doc": "定期隔夜研究您审查的循环,并针对该特定机器微调模型。只有当改变在持续的周期中真正取得更好的成绩时,才会保留改变,因此这只能有所帮助或保持不变––永远不会倒退。", + "label": "从此机器学习" + }, + "ml_training_hour": { + "doc": "一天中的当地时间 (0-23) 进行夜间微调。选择一个安静的时间,例如 2 (02:00)。", + "label": "学习时间(小时)" + }, + "ml_training_interval_days": { + "doc": "每这么多天最多重新检查一次改进。", + "label": "最多每隔几天检查一次" + }, + "ml_training_min_cycles": { + "doc": "等到至少记录了这么多周期后再进行微调,这样就有足够的东西可以学习了。", + "label": "需要的最少周期数" + }, + "name": { + "doc": "HA 集成列表和设备注册表中显示的显示名称。", + "label": "设备名称" + }, + "no_update_active_timeout": { + "doc": "如果运行时这么长时间没有电源更新到达,则假设插头脱机并强制停止以避免僵尸循环。默认 600 秒允许云或网格延迟。", + "label": "无更新超时" + }, + "notify_before_end_minutes": { + "doc": "当预计剩余时间低于此值时,发送“即将完成”警报。 0 禁用它。", + "label": "结束前提醒" + }, + "notify_channel": { + "doc": "开始/实时消息的 Android 通知通道名称(控制移动应用程序上的每个通道声音和优先级)。 Blank 使用配套应用程序默认值。", + "label": "Android 频道(启动/实时)" + }, + "notify_cycle_timers": { + "doc": "在一个周期的特定分钟发出通知(例如添加柔软剂)。消息支持{device}、{program}、{minutes}。启用“自动暂停”以在该点暂停并通过“恢复”按钮接收交互式通知;通过面板、暂停/恢复服务或通知操作恢复。", + "label": "周期计时器" + }, + "notify_finish_channel": { + "doc": "完成消息的 Android 通知通道名称。空白重用开始/直播频道。", + "label": "Android 频道(结束)" + }, + "notify_finish_message": { + "doc": "循环结束时发送的正文。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。此处 {time_finished} 和 {vs_typical} 最为有用。", + "label": "结束消息" + }, + "notify_finish_services": { + "doc": "当一个周期结束时调用notify.*服务。每个目标添加一个;留空表示没有完成通知。", + "label": "结束服务" + }, + "notify_fire_events": { + "doc": "还在循环开始/结束时触发 ha_​​washdata_* 事件,以便您可以构建自己的自动化。", + "label": "为通知触发 HA 事件" + }, + "notify_icon": { + "doc": "通知的可选 mdi 图标(例如 mdi:洗衣机)。将平台默认值留空。", + "label": "通知图标" + }, + "notify_live_chronometer": { + "doc": "在通知中显示实时更新的倒计时器(在支持它的平台上),而不是静态估计。", + "label": "使用实时计时器" + }, + "notify_live_interval_seconds": { + "doc": "周期运行时刷新实时进度通知的频率。", + "label": "实时更新间隔" + }, + "notify_live_overrun_percent": { + "doc": "如果周期超出其估计值超过此百分比,则发送超限警报。", + "label": "实时超时 % 提醒前" + }, + "notify_live_services": { + "doc": "在循环运行时,notify.* 服务需要实时更新进度。留空以禁用实时进度通知。", + "label": "实时进度服务" + }, + "notify_only_when_home": { + "doc": "仅当至少一名关联人员(上图)在家时才发送通知。", + "label": "仅在家时通知" + }, + "notify_people": { + "doc": "person.* “Notify Only When Home”使用的实体来决定是否有人在家。", + "label": "人员(仅在家时通知用)" + }, + "notify_pre_complete_message": { + "doc": "临近结束 / 即将完成提醒的正文。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", + "label": "完成前消息" + }, + "notify_reminder_message": { + "doc": "仍在等待的取出衣物提醒的正文。留空则使用内置默认值。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", + "label": "提醒消息" + }, + "notify_start_message": { + "doc": "循环开始时发送的正文。模板变量:{device}、{duration}、{minutes}、{program}、{energy_kwh}、{cost}、{time_finished}、{vs_typical}、{cycle_count}。", + "label": "启动消息" + }, + "notify_start_services": { + "doc": "循环开始时调用的notify.*服务。每个目标(电话、仪表板等)添加一个;留空表示没有开始通知。", + "label": "启动服务" + }, + "notify_timeout_seconds": { + "doc": "在这么多秒后自动关闭通知(在支持它的平台上)。 0 保留它直到手动关闭。", + "label": "自动关闭延迟" + }, + "notify_title": { + "doc": "通知标题。模板变量:{device}、{program}、{duration}、{energy}、{cost}、{date}、{time}、{minutes}。", + "label": "通知标题" + }, + "notify_unload_delay_minutes": { + "doc": "一个周期结束后几分钟,发送仍在等待的“卸载机器”提醒。设置 0 禁用提醒。", + "label": "卸载提醒延迟" + }, + "notify_unload_repeat": { + "doc": "每隔 \"卸载提醒延迟\" 分钟持续重新发送卸载提醒,直到您打开门或点按通知上的 \"停止提醒\"。需要门传感器实体(提醒本身即需要)。关闭按钮适用于 Home Assistant 配套应用(移动端)通知。", + "label": "重复直到门打开" + }, + "off_delay": { + "doc": "断电后宣告周期结束之前等待的时间。如果在此窗口内恢复供电,则循环将无缝继续 - 这会在清洗阶段之间建立暂停的桥梁。洗碗机具有较长的干燥阶段(关闭电源 20-60 分钟),因此关闭延迟必须超过该时间才能保持整个洗涤+干燥为一个循环。", + "label": "关闭延迟" + }, + "pause_cuts_power": { + "doc": "当循环暂停时,还要关闭下面的开关实体。仅适用于插头可以在周期中安全切断的电器。", + "label": "暂停同时断电(通过开关)" + }, + "power_off_delay": { + "doc": "周期完成后,在状态恢复为关闭之前,功率必须持续低于电源关闭阈值的时长。仅在电源关闭阈值大于 0 时使用。此项按后台周期检查,因此实际延迟会向上取整到下一个状态过期时刻。", + "label": "电源关闭延迟" + }, + "power_off_threshold_w": { + "doc": "基于功率的关闭检测(可选)。当设置为大于 0 时,周期完成后,如果功率在电源关闭延迟期间持续低于此值,则机器被视为已关机,状态会恢复为关闭。保持为 0 可禁用此功能(默认值)。请将其设置为高于真正关机时的最低功率,且低于停止阈值以及机器完成后仍开机时的待机功耗;如果它不低于停止阈值,则会被忽略。启用后,它将取代进度重置延迟来恢复为关闭状态,因此已完成的机器会保持在已完成/干净的状态,直到实际断电为止。", + "label": "电源关闭阈值" + }, + "power_sensor": { + "doc": "报告该设备的实时功率(以瓦为单位)的传感器实体(例如sensor.washer_power)。所有周期检测均基于该信号。", + "label": "功率传感器" + }, + "profile_duration_tolerance": { + "doc": "匹配过程中使用的配置文件平均持续时间周围的 +/- 范围。 0.25 表示 60 分钟的配置文件与 45-75 分钟的循环匹配。", + "label": "运行档案时长容差" + }, + "profile_match_interval": { + "doc": "在运行周期中尝试配置文件匹配的频率。默认 300 秒(5 分钟)平衡检测速度和 CPU。", + "label": "匹配间隔" + }, + "profile_match_max_duration_ratio": { + "doc": "相对于轮廓的最大循环长度。 1.3 表示周期必须低于配置文件持续时间的 130% 才能匹配。", + "label": "最大时长比例" + }, + "profile_match_min_duration_ratio": { + "doc": "相对于轮廓的最小周期长度。 0.9 表示一个周期必须至少为配置文件持续时间的 90% 才能匹配。", + "label": "最小时长比例" + }, + "profile_match_threshold": { + "doc": "周期结束时接受程序识别所需的最低相似度分数 (0-1)。提高它可以减少错误识别;如果您的机器的程序不匹配,请降低它。默认值 0.4 是一个保守的起点。", + "label": "匹配阈值" + }, + "profile_unmatch_threshold": { + "doc": "如果实时中期比赛的分数低于此分数,则临时标识将被清除。将其保持在匹配阈值以下一点,这样相似度的短暂下降不会将显示翻转回不匹配的状态。", + "label": "不匹配阈值" + }, + "progress_reset_delay": { + "doc": "完成后,将进度保持在 100% 一段时间,以便在重置为“空闲”之前在仪表板上可以看到“已完成”。", + "label": "进度重置延迟" + }, + "pump_stuck_duration": { + "doc": "泵在被标记为可能卡住之前可以连续运行的秒数(触发泵卡住事件)。", + "label": "泵卡住时长" + }, + "running_dead_zone": { + "doc": "一个周期开始后,该窗口内的功率骤降将被忽略。洗衣机注满冷水(加热前下降到接近 0 W) - 如果没有这种保护,注水阶段看起来就像循环结束。这不会跳过数据:从 T=0 开始记录全功率轨迹。建议引擎会测量机器的实际启动模式并自动调整其大小。", + "label": "运行死区" + }, + "sampling_interval": { + "doc": "传感器读数之间的预期时间 - 用于调整平滑窗口的大小并正确启动去抖。无论该值如何,都会捕获每个传感器更新;它仅校准下游计算。建议引擎会测量传感器过去周期的实际踏频并自动设置。", + "label": "采样间隔" + }, + "save_debug_traces": { + "doc": "存储每个周期的完整功率跟踪和匹配调试数据。对于故障排除很有用,但会增加存储大小。", + "label": "保存调试追踪" + }, + "smoothing_window": { + "doc": "原始功率信号被平滑了多少。低 (2) 响应灵敏,但噪音较大;高 (5) 可平滑尖峰,但会增加滞后。", + "label": "平滑窗口" + }, + "start_duration_threshold": { + "doc": "电源必须保持在启动阈值以上这么长的时间才能确认真正的启动,从而防止瞬间开/关切换启动一个周期。", + "label": "启动时长" + }, + "start_energy_threshold": { + "doc": "设备在运行前必须消耗的能量(功率 x 时间)。短暂的高功率尖峰能量非常低,会被忽略,从而防止误启动。", + "label": "启动能耗" + }, + "start_threshold_w": { + "doc": "功率必须高于此水平才能确认周期已开始。设置太低会导致待机功率误启动;过高且启动缓慢的程序(冷填充)会被错过。建议引擎将其设置为略高于机器观察到的最低有功功率。", + "label": "启动阈值" + }, + "stop_threshold_w": { + "doc": "在关闭延迟倒计时开始之前,功率必须降至此水平以下。将其设置为低于启动阈值 - 它们之间的间隙是防止闪烁的滞后带。如果设置得太高,低功率阶段(漂洗保持、防皱)会错误地触发结束序列。", + "label": "停止阈值" + }, + "switch_entity": { + "doc": "可选开关在暂停时关闭,在恢复时重新打开,与“暂停也会切断电源”一起使用。", + "label": "开关实体" + }, + "watchdog_interval": { + "doc": "后台看门狗检查停滞的传感器和超时的频率。默认 30 秒。", + "label": "看门狗间隔" + }, + "notify_milestone_message": { + "doc": "里程碑通知的消息。模板变量:{device}、{cycle_count}。", + "label": "里程碑消息" + }, + "notify_milestones": { + "doc": "以逗号分隔的周期计数,达到时触发一次性庆祝通知(例如 50、100、500、1000)。留空则禁用里程碑通知。", + "label": "周期里程碑" + }, + "notify_quiet_end_hour": { + "doc": "免打扰时段的结束时间(0-23)。暂存的通知将在此时段发送。留空则禁用。", + "label": "免打扰结束" + }, + "notify_quiet_start_hour": { + "doc": "免打扰时段的开始时间(0-23)。在免打扰时段内本应触发的完成、提醒和衣物已洗好通知将被暂存,并在时段结束时发送。留空则禁用。支持跨越午夜的时段(例如开始 22,结束 7)。", + "label": "免打扰开始" + }, + "peak_rate_message": { + "doc": "附加到启动通知的高峰电价提示的可选自定义文本。模板变量:{device}、{price}。留空则使用内置默认值。", + "label": "高峰电价消息" + }, + "peak_rate_threshold": { + "doc": "当周期开始且当前每千瓦时电价达到或超过此值时,在启动通知中附加高峰电价提示。0 或留空则禁用该提示。", + "label": "高峰电价阈值(每千瓦时)" + }, + "dtw_bandwidth": { + "label": "形状匹配容差", + "doc": "匹配器为了贴合已保存程序的形状,可以对周期进行多大程度的时间扭曲。数值越高越能容忍速度变化;过高则可能匹配到错误的程序。" + }, + "corr_weight": { + "label": "形状与水平权重", + "doc": "在为匹配评分时,曲线形状与绝对功率水平之间的平衡。数值越高越偏重形状;越低越偏重功率水平的吻合。" + }, + "duration_weight": { + "label": "时长权重", + "doc": "典型运行时长与此周期吻合的程序会被优先选择的程度。" + }, + "energy_weight": { + "label": "能耗权重", + "doc": "典型能耗与此周期吻合的程序会被优先选择的程度。" + }, + "store_brand": { + "label": "家电品牌", + "doc": "可选。从社区目录中选择的家电品牌。用于查找和分享匹配的参考录制。如果您不使用在线功能,请留空。" + }, + "store_model": { + "label": "家电型号", + "doc": "可选。设置品牌后,从社区目录中选择的家电型号。如果目录中没有您的型号,您可以将其添加到目录。" + }, + "show_contributor": { + "doc": "在社区家电和参考周期上显示\"by \"的贡献者署名。" + }, + "enable_phase_matching": { + "label": "阶段感知的剩余时间", + "doc": "将每个运行中的周期分解为多个阶段(加热、洗涤、脱水),按阶段分配剩余时间,并与经典估算相融合:周期早期更依赖阶段分配,接近结束时更依赖经典估算。这会根据您的机器实际加热和运行的时长来个性化倒计时,在周期的前半段效果最明显。关闭 = 仅使用经典估算。仅影响剩余时间显示;程序匹配和周期检测保持不变。" + }, + "keep_min_score": { + "label": "最低匹配得分", + "doc": "候选档案留在匹配竞争中所需的最低相似度得分。默认 0.1 有意设置得较宽松,允许弱候选也进入,由后续阶段找出最佳匹配。提高此值可更早淘汰不合适的档案;降低此值可扩大初始候选池。" + }, + "dtw_blend": { + "label": "规整混合", + "doc": "时间规整(DTW)对齐得分替换 Stage 2 核心得分的程度。0 = 仅使用 Stage 2 得分,1 = 仅使用 DTW 得分,0.5(默认)= 等权混合。当程序功率水平相近但时序模式不同时,可提高此值以更多依赖规整对齐。" + }, + "dtw_ensemble_w": { + "label": "规整集成混合", + "doc": "在集成 DTW 模式(默认)下,缩放 L1 与导数 DTW(DDTW)的权重分配。1.0 = 全部缩放-L1,0 = 全部 DDTW,0.7 = 默认。缩放-L1 变体比较功率水平;导数变体对功率如何随时间变化做出响应。集成模式将二者结合。" + }, + "dtw_ddtw_scale": { + "label": "导数规整尺度", + "doc": "导数 DTW 评分的半饱和距离。当 DDTW 距离等于此值时,得分减半。越小对形状差异越敏感。默认 30 针对典型家电功率曲线进行了校准。仅影响集成和 ddtw DTW 模式。" + }, + "dtw_refine_top_n": { + "label": "规整精化数量", + "doc": "DTW 重新评分的 Stage 2 顶部候选数量。由于 DTW 计算代价较高,仅对前 N 个候选应用。默认 5。若正确档案有时在 Stage 2 后只排到第 4 或第 5 位,可调高此值(至 7-9),DTW 能将其拉回。降低此值可略微加速匹配。" + }, + "duration_scale": { + "label": "时长锐度", + "doc": "Stage 4 时长一致性惩罚的锐度。这是一致性得分减半时的对数比率。越小越严格:时长不匹配的惩罚越大。默认 0.175 对应半权重下约 18% 的时长容差。请与时长权重配合使用。" + }, + "energy_scale": { + "label": "能耗锐度", + "doc": "Stage 4 能耗一致性惩罚的锐度。越小越严格:能耗不匹配的惩罚越大。默认 0.25 有意比时长锐度更宽松,因为能耗会随负荷变化。请与能耗权重配合使用。" + }, + "power_profile_interval_min": { + "label": "电力分布间隔", + "doc": "外部规划工具(如 EMHASS 和 tibber_prices)使用的 per-profile power_profile 传感器属性(每槽平均瓦数的数组)的桶大小。较小的桶保留短暂功率尖峰的细节,较大的桶平滑形状。默认 15 分钟。仅在读取时使用,不影响检测。" + }, + "notify_live_sticky": { + "label": "点击后保留实时通知", + "doc": "仅限 Android。将实时进度通知设置为固定(常驻),点击时不会关闭正在进行的通知线程。关闭则恢复默认行为,点击后通知消失。" + }, + "notify_live_click_action": { + "label": "实时通知点击目标", + "doc": "仅限 Android。点击实时进度通知时打开的位置(例如 /lovelace/laundry 或完整 URL),而非应用默认首页。留空使用默认值。" + }, + "door_opens_at_end": { + "label": "结束时自动开门", + "doc": "适用于周期结束后自动弹开舱门进行干燥的洗碗机(AirDry 等功能)。开启后,正在运行的周期中门被打开不会导致周期永久暂停;若门持续敞开达到下方设定的停留时间,WashData 将视为周期已完成。短暂开门(例如放入餐具)将被忽略。需要配置门传感器实体。" + }, + "door_end_dwell_seconds": { + "label": "门开放终止停留时间", + "doc": "在「结束时自动开门」开启时,WashData 终止周期前门需保持打开的时长。设置得足够长以忽略快速放入餐具的短暂开门(默认 60 秒),同时足够短以在机器弹开舱门后迅速结束。" + }, + "dishwasher_end_spike_quiet_release": { + "label": "自然干燥静止释放", + "doc": "当周期超过其预期时长后,洗碗机必须保持静止(低于停止阈值)多长时间,WashData 才会停止等待最终排水并结束该周期。如果您的机器在较晚的最终排水之前有一个较长的近乎无声的干燥阶段,导致该次排水被漏检,请调高此值 - 更宽的窗口可让学习到的时长跟随季节性漂移(进水更冷 = 周期更长),而不是锁定在旧的平均值上。它只能相对于内部 30 分钟的结束尖峰上限缩短等待时间,绝不会延长。" + } + }, + "setting_group": { + "auto_labeling": { + "label": "自动标记" + }, + "cycle_end": { + "label": "周期结束" + }, + "cycle_start": { + "label": "周期开始" + }, + "cycle_timers": { + "label": "周期计时器" + }, + "data_management": { + "label": "数据管理" + }, + "debug": { + "label": "调试" + }, + "dishwasher_end": { + "label": "洗碗机结束" + }, + "door_pause": { + "label": "门与暂停" + }, + "dtw_refinement": { + "label": "DTW 细化" + }, + "duration_gates": { + "label": "时长门控" + }, + "energy": { + "label": "能耗" + }, + "external_end_trigger": { + "label": "外部结束触发器" + }, + "housekeeping": { + "label": "日常维护" + }, + "match_scoring": { + "label": "匹配评分" + }, + "messages": { + "label": "消息" + }, + "power_off": { + "label": "电源关闭" + }, + "predictive_end": { + "label": "预测结束" + }, + "schedule": { + "label": "计划" + }, + "services": { + "label": "服务" + }, + "signal_processing": { + "label": "信号处理" + }, + "thresholds_gap": { + "label": "阈值与间隔" + }, + "timing": { + "label": "计时" + }, + "unload_reminder": { + "label": "卸载提醒" + }, + "watchdog": { + "label": "看门狗" + }, + "quiet_hours_milestones": { + "label": "免打扰时段与里程碑" + }, + "device_info": { + "label": "设备信息" + }, + "basic_configuration": { + "label": "基本配置" + } + }, + "status": { + "active": "活跃", + "all_statuses": "所有状态", + "ambiguous": "不明确", + "auto_detect": "自动检测", + "clear": "正常", + "completed": "已完成", + "fine_tuning": "正在微调…", + "force_stopped": "强制停止", + "idle": "空闲", + "interrupted": "已中断", + "ready": "准备处理", + "recording": "录制中", + "training": "训练中…", + "saving": "保存中…", + "rebuilding": "重建中…", + "analyzing": "分析中…", + "resetting": "重置中…", + "reverting": "还原中…", + "trimming": "裁剪中…", + "splitting": "拆分中…", + "deleting": "删除中…", + "imported": "已导入" + }, + "tab": { + "advanced": "高级", + "diagnostics": "诊断", + "history": "周期", + "ml": "ML 训练", + "pp_cleanup": "清理", + "pp_manage": "管理", + "pp_overview": "概览", + "pp_phases": "阶段", + "profiles": "配置文件", + "settings": "设置", + "status": "概览", + "subtab_phase_catalog": "阶段目录", + "subtab_profiles": "配置文件", + "maintenance": "维护", + "playground": "试验场", + "store": "商店" + }, + "tag": { + "early_end": "提前结束", + "late_start": "延迟开始", + "merged": "合并周期", + "noise": "噪声", + "sensor_gap": "传感器间隔", + "split": "拆分周期", + "wrong_profile": "错误配置文件" + }, + "toast": { + "access_saved": "已保存访问控制", + "all_wiped": "所有数据已清除", + "analysis_complete_none": "分析完成:没有新建议", + "auto_label_complete": "自动标记完成", + "automation_deleted": "自动化已删除", + "correction_submitted": "修正已提交", + "cycle_deleted": "周期已删除", + "cycle_force_stopped": "周期已强制停止", + "cycle_labelled": "周期已标记", + "cycle_paused": "周期已暂停", + "cycle_resumed": "周期已恢复", + "cycle_trimmed": "周期已裁剪", + "cycles_merged": "周期已合并", + "envelope_rebuilt": "包络已重建", + "envelopes_rebuilt": "所有包络已重建", + "export_downloaded": "导出已下载", + "feedback_all_dismissed": "所有反馈已关闭", + "feedback_confirmed": "反馈已确认", + "feedback_dismissed": "反馈已关闭", + "group_deleted": "组已删除", + "group_name_required": "需要组名", + "group_saved": "组已保存", + "import_successful": "导入成功;集成重载中", + "json_required": "需要 JSON 数据", + "legacy_removed": "旧版操作已移除", + "logs_exported": "日志已导出", + "matching_reverted": "匹配权重已恢复为默认值", + "min_2_profiles": "为组至少选择 2 个配置文件", + "ml_training_no_improvement": "训练完成:保留基准(无改进)", + "models_reverted": "设备上的模型已恢复为基准", + "name_required": "需要名称", + "no_split_found": "未找到可分割的空闲间隔", + "panel_settings_saved": "面板设置已保存", + "pg_preset_loaded": "已加载预设“{name}”", + "pg_preset_saved": "已保存预设“{name}”", + "pg_sugg_loaded": "已载入 {n} 个建议值 - 运行试验场以比较效果", + "pg_sugg_ml_loaded": "已载入 {n} 个 ML 校准值 - 运行试验场以比较效果", + "phase_name_required": "需要阶段名称", + "phase_updated": "阶段已更新", + "phases_saved": "阶段已保存", + "preferences_saved": "偏好已保存", + "profile_name_required": "需要配置文件名称", + "profile_renamed": "配置文件已重命名", + "recording_discarded": "录制已丢弃", + "recording_saved": "录制已保存到配置文件", + "recording_started": "录制已开始", + "recording_stopped": "录制已停止", + "review_saved": "审查已保存", + "settings_conflicts": "请先解决标红的设置冲突,再保存。", + "settings_reverted": "设置已恢复;集成正在重新加载", + "settings_saved": "设置已保存;集成重载中", + "suggestions_applied": "建议已应用;集成重载中", + "suggestions_dismissed": "建议已关闭", + "apply_failed": "应用失败:{error}", + "delete_failed": "删除失败:{error}", + "load_more_failed": "无法加载更多:{error}", + "maint_add_failed": "无法添加事件:{error}", + "maint_added": "已添加维护事件", + "maint_delete_failed": "无法删除事件:{error}", + "maint_deleted": "已删除维护事件", + "relabel_done": "已重新标记 {count} 个周期", + "relabel_failed": "重新标记失败:{error}", + "reminders_save_failed": "无法保存提醒:{error}", + "reminders_saved": "已保存保养提醒", + "pause_no_cycle": "没有可暂停的运行周期", + "resume_no_cycle": "没有可恢复的已暂停周期", + "delete_partial_failed": "部分项目无法删除,已恢复", + "pg_run_gone": "该运行已不可用。", + "task_cancelled": "已取消。", + "processed": "已处理 {bits}", + "processed_cycles": "{n} 个周期", + "processed_suggestions": "{n} 条建议", + "processed_models": "{n} 个模型升级", + "store_search_failed": "搜索失败:{error}", + "store_connect_failed": "连接失败:{error}", + "store_connected": "已连接到社区商店", + "store_disconnected": "已断开与社区商店的连接", + "store_error": "错误:{error}", + "store_unavailable": "社区商店不可用。", + "store_pick_profile": "请选择要合并到的配置文件", + "store_name_required": "请输入配置文件名称", + "store_import_failed": "导入失败:{error}", + "store_imported": "已导入到 {profile}", + "store_program_required": "请输入程序名称", + "store_no_appliance": "请先在设置中设置您的家电品牌和型号。", + "store_share_failed": "分享失败:{error}", + "store_shared": "已分享到社区商店(等待审核)", + "appliance_added": "已添加家电(等待批准)", + "thanks_confirming": "感谢您的确认", + "device_approved": "已获社区批准", + "rating_saved": "质量评分已保存", + "brand_added": "已添加品牌(等待批准)", + "profile_added": "已添加配置文件(等待批准)", + "saved_except_conflicts": "已保存。请修复突出显示的冲突以保存其余内容。", + "share_device_none_sel": "请至少选择一个周期进行分享", + "store_device_downloaded": "已添加 {p} 个程序、{c} 个录制", + "store_device_downloaded_phases": "已添加 {p} 个程序、{c} 个录制、{ph} 个阶段图", + "store_device_downloaded_settings": "已添加 {p} 个程序、{c} 个录制、{ph} 个阶段图、{s} 个设置", + "store_device_shared": "已将 {n} 个周期分享到社区商店 - 待审核。", + "store_device_shared_all_dup": "{n} 个周期均已在社区商店中。", + "store_device_shared_partial": "已分享 {n} 个周期;{failed} 个无法上传。", + "store_device_shared_some_dup": "已分享 {created} 个周期;{dup} 个已在商店中。", + "store_download_failed": "下载失败:{error}", + "store_download_nothing": "没有新内容可下载 - 此配置已在您的设备上。", + "export_selective_done": "导出已下载", + "import_selective_done": "已导入 {profiles} 个配置文件和 {cycles} 个周期" + }, + "suggestion": { + "both_agree": "WashData建议", + "calibrated_label": "已校准", + "observed_label": "观测值", + "impact": { + "auto_label_confidence": { + "higher": "自动标记的循环减少,更多循环进入审核", + "lower": "自动标记更多循环,部分可能被误识别" + }, + "duration_tolerance": { + "higher": "接受更宽的时长范围––匹配更灵活", + "lower": "要求时长更接近––更严格,但可能拒绝非常规循环" + }, + "end_energy_threshold": { + "higher": "仅关闭消耗大量能量的循环", + "lower": "也关闭较短或低能耗的循环" + }, + "end_repeat_count": { + "higher": "结束信号需重复更多次––更稳健,但略慢", + "lower": "更少重复后结束––检测更快,但误结束风险更高" + }, + "learning_confidence": { + "higher": "仅从高置信度匹配中学习––较慢但更可靠", + "lower": "从更多循环中学习,模型可能更嘈杂" + }, + "min_off_gap": { + "higher": "新循环开始前需要更长的空闲时间", + "lower": "短暂空闲即触发新循环––连续运行可能被拆分" + }, + "min_power": { + "higher": "对待机功耗不那么敏感,可能遗漏非常安静的程序", + "lower": "更灵敏,可能将待机功耗记录为活动" + }, + "no_update_active_timeout": { + "higher": "在判定循环卡住前等待更长时间", + "lower": "更快地强制终止卡住的循环" + }, + "off_delay": { + "higher": "为设备暂停留出更多时间––适合长时间浸泡或烘干阶段", + "lower": "更快检测结束––适合干净的开关设备" + }, + "profile_match_threshold": { + "higher": "仅提交高置信度匹配,更多循环保持未标记", + "lower": "匹配更多循环,部分可能略有偏差" + }, + "running_dead_zone": { + "higher": "忽略待机时的短暂功率尖峰––对噪声不那么敏感", + "lower": "响应更短的功率突发––捕捉快速瞬态活动" + }, + "start_threshold_w": { + "higher": "避免因短暂功率尖峰引起的误启动", + "lower": "捕捉低功率程序,可能对噪声触发" + }, + "stop_threshold_w": { + "higher": "更快结束循环––可能在暂停时关闭", + "lower": "等待更长时间结束––减少提前完成" + }, + "watchdog_interval": { + "higher": "允许更长的静默阶段,减少误强制停止", + "lower": "更积极地捕捉卡住的循环" + } + }, + "reason": { + "auto_label_confidence": "用户从未纠正的 {cycles} 个自动标注的第 15 百分位置信度({p15})。", + "completion_min_seconds": "{cycles} 个周期中 p05 正常周期时长的一半({minutes} min);用于过滤误检周期。{excl}", + "dead_zone_batch": "保持较短({cycles} 个周期中启动不稳定窗口的中位数 = {s}s),以便及时检测到真正的结束。", + "dead_zone_from_dip": "基于在 {s}s 时检测到的早期功率下降。", + "end_energy_default": "周期结束噪声门限的推荐默认值。", + "end_energy_false": "{cycles} 个周期中 p95 的误结束能量({p95}Wh),下限为周期能量中位数的 0.2%({floor}Wh)。", + "end_energy_no_false": "{cycles} 个周期中无误结束;下限为周期能量中位数的 0.2%({floor}Wh)。", + "end_repeat_count": "{false}/{total} 个正常周期({pct}%)出现了超过 60s 且随后恢复的内部暂停;要求进行 {val} 次结束确认。", + "learning_confidence": "{cycles} 个用户标注周期的 p05 置信度({p05});低于此值时请求验证。", + "match_interval": "基于观测到的更新频率(中位数={median}s) * 10。", + "max_duration_ratio": "基于已标注的周期时长(p95={p95})。", + "min_active": "基于上一个周期中观测到的最小工作功率({min}W)。", + "min_duration_ratio": "尽可能保持较低,以便在周期早期识别出程序;置信度和歧义门限可防止过早确定。", + "min_off_gap": "基于观测到的 {gaps} 个周期间间隔(p05={p05}s)。设备下限:{floor}s。", + "min_off_gap_bridge": "设定为足以跨过周期内最长的静默段:{span}s + 60s 缓冲,来自 {cycles} 个正常周期中的 {spans} 段已跨过的间隔(保持在您连续两次运行之间最短间隔 {ceiling}s 以内)。", + "min_power": "{cycles} 个正常周期中 p05 最低工作功率({p05}W)的 40%,使关闭门限保持在实际功耗之下。{excl}", + "ml_auto_label": "质量模型仍判定为正常的最低置信度({cycles} 个正常周期的 p10 = {p10})。", + "ml_end_repeat": "{false}/{total} 个周期({pct}%)出现了结束检测器评分超过 50% 的暂停;要求进行 {val} 次结束确认。", + "ml_off_delay": "结束检测器已确认的暂停:p95 {p95}s + 60s 缓冲,来自 {cycles} 个周期中经模型验证的 {pauses} 次暂停(下限 {floor}s)。", + "no_update_timeout": "基于观测到的更新频率(p95={p95}s) * 20(最小 60s)。", + "off_delay_cadence": "基于观测到的更新频率(p95={p95}s) * 5", + "off_delay_device_floor": "对 {device} 使用了特定于设备的安全最小值({floor}s)。", + "off_delay_generic_floor": "使用了通用安全最小值({floor}s)。", + "off_delay_pauses": "设定为足以超过真实暂停:p95 周期内暂停 {p95}s + 60s 缓冲,来自 {cycles} 个正常周期中的 {pauses} 次暂停(下限 {floor}s)。", + "profile_match_threshold": "{cycles} 个正确自动标注的 p10 置信度({p10});安全的实时确定下限。", + "sampling_interval": "{cycles} 个正常周期中观测到的更新间隔中位数({si}s)。{excl}", + "smoothing_window": "设定为在 {si}s 采样下平滑约 30s 的读数({samples} 个样本)。", + "start_duration": "保持较短(约一个 {si}s 采样间隔),以便尽早开始检测,同时忽略单个采样的尖峰。", + "thr_batch": "保持在 {cycles} 个周期中 p05 最低工作功率({p05}W)略上方,以便尽早捕捉到启动,同时使停止阈值保持在设备最低运行功率之下。", + "tol_per_profile": "{profiles} 个配置文件({cycles} 个周期)中每个配置文件时长方差的 p75;波动小的配置文件不受惩罚。", + "tol_pooled": "基于 {cycles} 个近期已标注周期的合并时长方差(p95 偏差={dev})。", + "watchdog": "在安全范围内保持尽可能低(略高于 p95 更新间隔 {p95}s,最小 30s),以便快速捕捉到停滞而不产生误停止。" + }, + "exclusions": { + "summary": "已排除 {total} 个误检测周期:{parts}。", + "reason": { + "force_stopped": "强制停止", + "interrupted": "中断", + "incomplete": "未完成", + "noise": "噪声", + "unlabeled": "未标记", + "no_trace_short": "太短无法检查", + "high_start": "高功率启动", + "abrupt_end": "突然结束", + "mid_restart": "周期中途重启", + "no_power": "无功率", + "no_active_power": "无工作功率" + } + } + }, + "trend": { + "down": "下降趋势", + "up": "上升趋势" + }, + "maint": { + "bearing_service": "轴承保养", + "descale": "除垢", + "drum_clean": "清洁滚筒", + "filter_clean": "清洁过滤器", + "other": "其他" + }, + "col": { + "profile_tip": "匹配的程序名称。未标记表示周期结束时没有配置文件匹配。", + "status_tip": "周期结果:已完成(自然结束)、已中断(功率骤降)、已强制停止(手动)或需要审查(反馈待处理)。", + "date_tip": "周期开始的日期和时间。", + "duration_tip": "从开始到结束的总周期运行时间。", + "energy_tip": "消耗的总能量(kWh)。通过对功率随时间积分计算得出。", + "cost_tip": "此周期的能耗成本,在完成时按当时生效的价格冻结(能量 x 每 kWh 价格)。在设置中设定价格以填充此项。", + "confidence_tip": "配置文件匹配置信度(0-100%)。周期功率曲线与识别出的程序的匹配程度。", + "health_tip": "ML 周期健康(越高越好)。点击周期以检查并审查。", + "flags_tip": "周期的审核、异常和来源标志。将鼠标悬停在图标上可查看详细信息。" + }, + "stat": { + "avg": "平均", + "min": "最小 {v}", + "max": "最大 {v}", + "consistency": "一致性 ±{v}", + "total": "总计 {v}", + "last_run": "上次运行 {v}", + "score": "得分 {pct}%", + "duration_cv": "时长 CV {pct}%", + "avg_confidence": "平均置信度 {pct}%" + }, + "pg_evd": { + "detected": "检测器识别到一个循环已经开始。", + "match_commit": "匹配器以足够的置信度确定了某个程序。", + "match_changed": "随着循环推进,领先的程序发生了变化。", + "match_ambiguous": "两个程序的得分很接近,因此匹配结果不确定。", + "unmatched": "没有已保存的程序与此循环匹配。", + "notify_start": "将发送开始通知。", + "notify_pre_complete": "将发送即将完成通知。", + "notify_finish": "将发送完成通知。", + "notify_milestone": "将发送里程碑通知。", + "notify_held": "由于处于免打扰时段,通知已被暂缓。", + "finished": "循环到达终止状态并已结束。" + }, + "store": { + "browse": "浏览", + "device": "设备", + "favorites": "收藏", + "search_ph": "按品牌或型号搜索…", + "no_results": "未找到匹配的家电。请尝试其他搜索。", + "n_programs": "{n} 个程序", + "n_cycles": "{n} 个周期", + "no_programs": "此家电尚无共享的程序。", + "no_cycles": "此程序尚无共享的参考周期。", + "anon": "匿名", + "uploaded_by": "由 {name} 分享", + "connected_as": "已以 {name} 身份连接", + "not_connected": "未连接。连接 GitHub 账户以分享您自己的周期。", + "import_new": "新建配置文件", + "import_merge": "合并到现有", + "merge_target": "合并到配置文件", + "description": "描述(可选)", + "contributed_by": "由 {name} 提供", + "rating_summary": "★ {avg} ({n})", + "no_ratings": "暂无评分", + "website": "商店网站 ↗", + "website_tip": "打开社区商店网站" + }, + "settings": { + "gear": { + "title": "设置" + } + }, + "link": { + "manual": "手册 ↗", + "add_appliance": "添加您的家电" + }, + "tip": { + "add_brand": "品牌未收录?将其添加到社区目录", + "add_appliance": "型号未收录?将您的家电添加到社区目录", + "add_profile": "在社区网站上为此家电添加配置文件" + }, + "task": { + "reprocess": { + "matching": "重新处理:匹配周期", + "golden": "重新处理:补全参考周期", + "suggestions": "重新处理:建议", + "ml_training": "重新处理:ML 训练", + "health": "重新处理:周期健康" + }, + "pg_sweep": { + "optimize": "优化:{param}" + }, + "pg_detail": { + "simulate": "模拟周期" + }, + "split": { + "apply": "正在拆分周期" + }, + "trim": { + "apply": "正在裁剪周期" + }, + "merge": { + "apply": "正在合并周期" + }, + "rebuild": { + "envelopes": "正在重建包络" + }, + "cancelling": "正在取消..." + }, + "setup": { + "hdr": { + "card": "设备设置", + "healthy_chip": "设置完成" + }, + "phase0": { + "washer": "WashData 已在检测您的周期。录制第一个周期以启用程序名称和时间估算。", + "dishwasher": "WashData 正在监视。洗碗机的周期较为复杂 – 强烈建议录制第一个周期。如果检测到的周期运行过长,请使用周期编辑器在保存为配置文件前进行裁剪。", + "generic": "WashData 正在监视。录制或标记检测到的周期,开始构建配置文件。" + }, + "phase1a": { + "labelled": "良好的开始 – 您的第一个程序已保存。为获得最准确的数据,建议使用录制小部件录制下一个周期。" + }, + "phase1b": { + "recorded": "您的录制已保存为 {profile_name}。现在录制或标记您的其他常用程序以建立覆盖范围。" + }, + "phase1c": { + "verify": "您有来自社区的 {count} 个程序。运行一个周期以验证 WashData 是否正确识别 – 随着设备积累自己的历史记录,匹配将不断改善。" + }, + "phase2": { + "cluster": "WashData 发现了 {count} 个与任何已保存程序不匹配的周期 – 它们彼此相似。想为这些周期创建新配置文件吗?", + "unmatched": "您的上一个周期与任何已保存的程序不匹配。是新程序吗?" + }, + "phase3": { + "suggestions": "WashData 根据您的周期历史记录提供了设置建议 – 请查看以提高检测精度。", + "groups": "您的部分配置文件看起来像在不同温度下运行的同一程序。将它们整理成组以获得更好的匹配效果。", + "phases": "为 {profile_name} 添加程序阶段,以获得更准确的剩余时间估算。" + }, + "phase4": { + "healthy": "此设备已完全设置好({profile_count} 个配置文件)。" + }, + "cta": { + "start_recording": "开始录制", + "label_detected_cycle": "我已有检测到的周期 – 直接标记", + "browse_cycles": "浏览周期以标记其他", + "view_profiles": "查看您的配置文件", + "create_from_cluster": "从这些周期创建配置文件", + "create_profile": "为此创建配置文件", + "review_suggestions": "查看建议", + "organise_profiles": "整理配置文件", + "configure_phases": "配置阶段", + "skip_step": "跳过此步骤", + "skip_forever": "不再显示", + "hide_guidance": "隐藏指南", + "show_guidance": "显示指南" + } } - } } diff --git a/custom_components/ha_washdata/translations/pl.json b/custom_components/ha_washdata/translations/pl.json index 3fe2e012..15515a2d 100644 --- a/custom_components/ha_washdata/translations/pl.json +++ b/custom_components/ha_washdata/translations/pl.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Konfiguracja WashData", - "description": "Skonfiguruj swoją pralkę lub inne urządzenie.\n\nWymagany jest czujnik mocy.\n\n**Następnie zostaniesz zapytany, czy chcesz utworzyć swój pierwszy profil.**", + "description": "Skonfiguruj swoją pralkę lub inne urządzenie.\n\nCzujnik mocy jest wymagany.\n\nPo konfiguracji otwórz panel WashData z paska bocznego (lub przejdź do [/ha-washdata](/ha-washdata)), aby przeglądać cykle, dostosowywać wykrywanie i zarządzać profilami.", "data": { "name": "Nazwa urządzenia", "device_type": "Typ urządzenia", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Rekonfiguracja WashData", - "description": "Zaktualizuj nazwę urządzenia, typ urządzenia lub czujnik mocy.", + "description": "Zaktualizuj nazwę urządzenia, typ urządzenia lub czujnik mocy.\n\nPanel WashData (pasek boczny lub [/ha-washdata](/ha-washdata)) służy do zarządzania wykrywaniem, cyklami, profilami i powiadomieniami.", "data": { "name": "Nazwa urządzenia", "device_type": "Typ urządzenia", @@ -43,7 +43,7 @@ "step": { "init": { "title": "Ustawienia WashData", - "description": "Wszystkie ustawienia -- wykrywanie, dopasowanie, timing, powiadomienia, profile i cykle -- są dostępne w panelu WashData. Użyj tego formularza tylko do zmiany czujnika mocy, typu urządzenia lub progu trybu gotowości.", + "description": "Zmień nazwę urządzenia lub zmień jego podstawowe ustawienia sprzętowe. Wszystkie ustawienia wykrywania, dopasowania i powiadomień znajdują się w [panelu WashData](/ha-washdata) (dostępny również z paska bocznego).", "data": { "name": "Nazwa urządzenia", "device_type": "Typ urządzenia", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: timer {minutes} min", "timer_pause_action_title": "Wznów cykl", "timer_pause_body_suffix": "Cykl jest wstrzymany. Otwórz panel WashData, aby wznowić.", + "unload_dismiss_action_title": "Przestań przypominać", "notify_live_waiting_message": "{device}: Nie rozpoznano jeszcze żadnego profilu.", "vs_typical_longer": "o {pct}% dłużej niż zwykle", "vs_typical_shorter": "o {pct}% krócej niż zwykle", diff --git a/custom_components/ha_washdata/translations/pt-BR.json b/custom_components/ha_washdata/translations/pt-BR.json index ff95c054..68f02038 100644 --- a/custom_components/ha_washdata/translations/pt-BR.json +++ b/custom_components/ha_washdata/translations/pt-BR.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Configuração WashData", - "description": "Configure sua máquina de lavar ou outro eletrodoméstico.\n\nSensor de potência é necessário.\n\n**Em seguida, você será perguntado se deseja criar seu primeiro perfil.**", + "description": "Configure sua máquina de lavar ou outro eletrodoméstico.\n\nSensor de potência é necessário.\n\nApós a configuração, abra o painel WashData pela barra lateral (ou acesse [/ha-washdata](/ha-washdata)) para visualizar ciclos, ajustar a detecção e gerenciar perfis.", "data": { "name": "Nome do dispositivo", "device_type": "Tipo de dispositivo", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Atualize o nome do dispositivo, o tipo de eletrodoméstico ou o sensor de potência.\n\nO painel WashData (barra lateral ou [/ha-washdata](/ha-washdata)) é onde detecção, ciclos, perfis e notificações são gerenciados.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Renomeie o dispositivo ou altere suas configurações principais de hardware. Todas as configurações de detecção, correspondência e notificação estão no [painel WashData](/ha-washdata) (também acessível pela barra lateral).", "data": { "name": "Nome do dispositivo", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: timer de {minutes} min", "timer_pause_action_title": "Retomar ciclo", "timer_pause_body_suffix": "O ciclo está pausado. Abra o painel WashData para retomar.", + "unload_dismiss_action_title": "Parar de lembrar", "notify_live_waiting_message": "{device}: Nenhum perfil identificado ainda.", "vs_typical_longer": "{pct}% mais longo que o normal", "vs_typical_shorter": "{pct}% mais curto que o normal", diff --git a/custom_components/ha_washdata/translations/pt.json b/custom_components/ha_washdata/translations/pt.json index f6730353..a8520cbd 100644 --- a/custom_components/ha_washdata/translations/pt.json +++ b/custom_components/ha_washdata/translations/pt.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Configuração WashData", - "description": "Configure a sua máquina de lavar ou outro electrodoméstico.\n\nÉ necessário um sensor de potência.\n\n**De seguida, ser-lhe-á perguntado se deseja criar o seu primeiro perfil.**", + "description": "Configure a sua máquina de lavar ou outro electrodoméstico.\n\nÉ necessário um sensor de potência.\n\nApós a configuração, abra o painel WashData a partir da barra lateral (ou aceda a [/ha-washdata](/ha-washdata)) para ver os ciclos, ajustar a deteção e gerir perfis.", "data": { "name": "Nome do dispositivo", "device_type": "Tipo de dispositivo", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigurar WashData", - "description": "Actualizar o nome do dispositivo, tipo de electrodoméstico ou sensor de potência.", + "description": "Actualize o nome do dispositivo, o tipo de electrodoméstico ou o sensor de potência.\n\nO painel WashData (barra lateral, ou [/ha-washdata](/ha-washdata)) é onde a deteção, os ciclos, os perfis e as notificações são geridos.", "data": { "name": "Nome do dispositivo", "device_type": "Tipo de dispositivo", @@ -43,7 +43,7 @@ "step": { "init": { "title": "Definições WashData", - "description": "Todas as definições -- detecção, correspondência, temporização, notificações, perfis e ciclos -- estão disponíveis no painel WashData. Utilize este formulário apenas para alterar o sensor de potência, tipo de dispositivo ou limiar de standby.", + "description": "Mude o nome do dispositivo ou altere as suas definições de hardware principais. Todas as definições de deteção, correspondência e notificações estão no [painel WashData](/ha-washdata) (também acessível a partir da barra lateral).", "data": { "name": "Nome do dispositivo", "device_type": "Tipo de dispositivo", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: temporizador de {minutes} min", "timer_pause_action_title": "Retomar ciclo", "timer_pause_body_suffix": "O ciclo está em pausa. Abra o painel WashData para retomar.", + "unload_dismiss_action_title": "Parar de lembrar", "notify_live_waiting_message": "{device}: ainda nenhum perfil reconhecido.", "vs_typical_longer": "{pct}% mais longo do que o habitual", "vs_typical_shorter": "{pct}% mais curto do que o habitual", diff --git a/custom_components/ha_washdata/translations/ro.json b/custom_components/ha_washdata/translations/ro.json index ddb39f98..3e65437b 100644 --- a/custom_components/ha_washdata/translations/ro.json +++ b/custom_components/ha_washdata/translations/ro.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Configurare WashData", - "description": "Configurați mașina de spălat sau alt aparat.\n\nEste necesar un senzor de putere.\n\n**În continuare, veți fi întrebat dacă doriți să vă creați primul profil.**", + "description": "Configurați mașina de spălat sau alt aparat.\n\nEste necesar un senzor de putere.\n\nDupă configurare, deschideți panoul WashData din bara laterală (sau accesați [/ha-washdata](/ha-washdata)) pentru a vizualiza ciclurile, a ajusta detectarea și a gestiona profilurile.", "data": { "name": "Numele dispozitivului", "device_type": "Tip de dispozitiv", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Actualizați numele dispozitivului, tipul aparatului sau senzorul de putere.\n\nPanoul WashData (bara laterală sau [/ha-washdata](/ha-washdata)) este locul unde se gestionează detectarea, ciclurile, profilurile și notificările.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Redenumiți dispozitivul sau modificați setările hardware de bază. Toate setările de detectare, potrivire și notificare se află în [panoul WashData](/ha-washdata) (accesibil și din bara laterală).", "data": { "name": "Numele dispozitivului", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: cronometru de {minutes} min", "timer_pause_action_title": "Reluați ciclul", "timer_pause_body_suffix": "Ciclul este în pauză. Deschideți panoul WashData pentru a relua.", + "unload_dismiss_action_title": "Oprește mementourile", "notify_live_waiting_message": "{device}: Niciun profil nu a fost recunoscut încă.", "vs_typical_longer": "cu {pct}% mai mult decât de obicei", "vs_typical_shorter": "cu {pct}% mai puțin decât de obicei", diff --git a/custom_components/ha_washdata/translations/ru.json b/custom_components/ha_washdata/translations/ru.json index d2a02361..077139fa 100644 --- a/custom_components/ha_washdata/translations/ru.json +++ b/custom_components/ha_washdata/translations/ru.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Настройка WashData", - "description": "Настройте стиральную машину или другой прибор.\n\nТребуется датчик мощности.\n\n**Далее вас спросят, хотите ли вы создать свой первый профиль.**", + "description": "Настройте стиральную машину или другой прибор.\n\nТребуется датчик мощности.\n\nПосле настройки откройте панель WashData на боковой панели (или перейдите на [/ha-washdata](/ha-washdata)), чтобы просматривать циклы, настраивать обнаружение и управлять профилями.", "data": { "name": "Имя устройства", "device_type": "Тип устройства", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Обновите имя устройства, тип устройства или датчик мощности.", + "description": "Обновите имя устройства, тип прибора или датчик мощности.\n\nПанель WashData (боковая панель или [/ha-washdata](/ha-washdata)) — это место для управления обнаружением, циклами, профилями и уведомлениями.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Все настройки — обнаружение, сопоставление, время, уведомления, профили и циклы — доступны на панели WashData. Используйте эту форму только для изменения датчика мощности, типа устройства или порога режима ожидания.", + "description": "Переименуйте устройство или измените его основные аппаратные настройки. Все настройки обнаружения, сопоставления и уведомлений находятся в [панели WashData](/ha-washdata) (также доступна из боковой панели).", "data": { "name": "Имя устройства", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: таймер {minutes} мин", "timer_pause_action_title": "Возобновить цикл", "timer_pause_body_suffix": "Цикл на паузе. Откройте панель WashData для возобновления.", + "unload_dismiss_action_title": "Не напоминать", "notify_live_waiting_message": "{device}: Профиль пока не распознан.", "vs_typical_longer": "на {pct}% дольше обычного", "vs_typical_shorter": "на {pct}% короче обычного", diff --git a/custom_components/ha_washdata/translations/sk.json b/custom_components/ha_washdata/translations/sk.json index 60f5f235..58803cba 100644 --- a/custom_components/ha_washdata/translations/sk.json +++ b/custom_components/ha_washdata/translations/sk.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Nastavenie WashData", - "description": "Nakonfigurujte si práčku alebo iný spotrebič.\n\nVyžaduje sa snímač napájania.\n\n**Ďalej sa vás spýta, či si chcete vytvoriť svoj prvý profil.**", + "description": "Nakonfigurujte si práčku alebo iný spotrebič.\n\nSnímač výkonu je povinný.\n\nPo nastavení otvorte panel WashData z bočného panelu (alebo prejdite na [/ha-washdata](/ha-washdata)) na zobrazenie cyklov, ladenie detekcie a správu profilov.", "data": { "name": "Názov zariadenia", "device_type": "Typ zariadenia", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Aktualizujte názov zariadenia, typ spotrebiča alebo snímač výkonu.\n\nPanel WashData (bočný panel alebo [/ha-washdata](/ha-washdata)) slúži na správu detekcie, cyklov, profilov a oznámení.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Premenujte zariadenie alebo zmeňte jeho základné hardvérové nastavenia. Všetky nastavenia detekcie, párovania a oznámení sú na [paneli WashData](/ha-washdata) (dostupný aj z bočného panelu).", "data": { "name": "Názov zariadenia", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: časovač {minutes} min", "timer_pause_action_title": "Obnoviť cyklus", "timer_pause_body_suffix": "Cyklus je pozastavený. Otvorte panel WashData na obnovenie.", + "unload_dismiss_action_title": "Prestať pripomínať", "notify_live_waiting_message": "{device}: Zatiaľ nebol rozpoznaný žiadny profil.", "vs_typical_longer": "o {pct}% dlhšie než zvyčajne", "vs_typical_shorter": "o {pct}% kratšie než zvyčajne", diff --git a/custom_components/ha_washdata/translations/sl.json b/custom_components/ha_washdata/translations/sl.json index 92e90bb3..d05c577a 100644 --- a/custom_components/ha_washdata/translations/sl.json +++ b/custom_components/ha_washdata/translations/sl.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Nastavitev WashData", - "description": "Konfigurirajte svoj pralni stroj ali drugo napravo.\n\nPotreben je senzor moči.\n\n**Nato boste pozvani, ali želite ustvariti svoj prvi profil.**", + "description": "Konfigurirajte svoj pralni stroj ali drugo napravo.\n\nSenzor moči je obvezen.\n\nPo nastavitvi odprite ploščo WashData s stranske vrstice (ali pojdite na [/ha-washdata](/ha-washdata)) za ogled ciklov, prilagoditev zaznavanja in upravljanje profilov.", "data": { "name": "Ime naprave", "device_type": "Vrsta naprave", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Ponovno konfigurirajte WashData", - "description": "Posodobite ime naprave, vrsto naprave ali senzor moči.", + "description": "Posodobite ime naprave, vrsto naprave ali senzor moči.\n\nPlosca WashData (stranska vrstica ali [/ha-washdata](/ha-washdata)) je namenjena upravljanju zaznavanja, ciklov, profilov in obvestil.", "data": { "name": "Ime naprave", "device_type": "Vrsta naprave", @@ -49,13 +49,14 @@ "min_power": "Najmanjši prag moči (W)" }, "title": "Nastavitve WashData", - "description": "Preimenujte napravo ali spremenite njene osnovne nastavitve strojne opreme. Vse nastavitve zaznavanja, ujemanja in obveščanja so na plošči WashData." + "description": "Preimenujte napravo ali spremenite njene osnovne nastavitve strojne opreme. Vse nastavitve zaznavanja, ujemanja in obveščanja so na [plošči WashData](/ha-washdata) (dostopna tudi s stranske vrstice)." } }, "error": { "timer_default_message": "{device}: časovnik {minutes} min", "timer_pause_action_title": "Nadaljuj cikel", "timer_pause_body_suffix": "Cikel je zaustavljen. Odprite ploščo WashData za nadaljevanje.", + "unload_dismiss_action_title": "Nehaj opominjati", "notify_live_waiting_message": "{device}: Noben profil se še ne ujema.", "vs_typical_longer": "{pct}% dlje kot običajno", "vs_typical_shorter": "{pct}% krajše kot običajno", diff --git a/custom_components/ha_washdata/translations/sq.json b/custom_components/ha_washdata/translations/sq.json index 192d8ae9..28bbe48e 100644 --- a/custom_components/ha_washdata/translations/sq.json +++ b/custom_components/ha_washdata/translations/sq.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Konfigurimi WashData", - "description": "Konfiguro makinën larëse ose pajisje tjetër.\n\nKërkohet sensori i fuqisë.\n\n**Më pas, do të pyeteni nëse dëshironi të krijoni profilin tuaj të parë.**", + "description": "Konfiguro makinën larëse ose pajisje tjetër.\n\nKërkohet sensori i fuqisë.\n\nPas konfigurimit, hap panelin WashData nga shiriti anësor (ose shko te [/ha-washdata](/ha-washdata)) për të parë ciklet, rregulluar zbulimin dhe menaxhuar profilet.", "data": { "name": "Emri i pajisjes", "device_type": "Lloji i pajisjes", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Rikonfiguro WashData", - "description": "Përditëso emrin e pajisjes, llojin e pajisjes ose sensorin e fuqisë.", + "description": "Përditëso emrin e pajisjes, llojin e pajisjes ose sensorin e fuqisë.\n\nPaneli WashData (shiriti anësor, ose [/ha-washdata](/ha-washdata)) është ku menaxhohen zbulimi, ciklet, profilet dhe njoftimet.", "data": { "name": "Emri i pajisjes", "device_type": "Lloji i pajisjes", @@ -43,7 +43,7 @@ "step": { "init": { "title": "Cilësimet WashData", - "description": "Të gjitha cilësimet -- zbulimi, përputhja, koha, njoftimet, profilet dhe ciklet -- janë të disponueshme në panelin WashData. Përdorni këtë formular vetëm për të ndryshuar sensorin e fuqisë, llojin e pajisjes ose pragun e gatishmërisë.", + "description": "Riemërtoni pajisjen ose ndryshoni cilësimet e saj bazë të harduerit. Të gjitha cilësimet e zbulimit, përputhjes dhe njoftimeve janë në [panelin WashData](/ha-washdata) (i arritshëm edhe nga shiriti anësor).", "data": { "name": "Emri i pajisjes", "device_type": "Lloji i pajisjes", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: kohëmatës {minutes} min", "timer_pause_action_title": "Rifillo ciklin", "timer_pause_body_suffix": "Cikli është në pauzë. Hapni panelin WashData për të vazhduar.", + "unload_dismiss_action_title": "Ndalo kujtesat", "notify_live_waiting_message": "{device}: Ende nuk është njohur asnjë profil.", "vs_typical_longer": "{pct}% më gjatë se zakonisht", "vs_typical_shorter": "{pct}% më shkurt se zakonisht", diff --git a/custom_components/ha_washdata/translations/sr-Latn.json b/custom_components/ha_washdata/translations/sr-Latn.json index 3febd156..7a4c34cb 100644 --- a/custom_components/ha_washdata/translations/sr-Latn.json +++ b/custom_components/ha_washdata/translations/sr-Latn.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData podešavanje", - "description": "Konfiguriš svoju mašinu za pranje veša ili drugi uređaj.\n\nSenzor snage je obavezan.\n\n**Dalje, bićeš upitan da li želiš da napraviš prvi profil.**", + "description": "Konfiguriši svoju mašinu za pranje veša ili drugi uređaj.\n\nSenzor snage je obavezan.\n\nNakon podešavanja, otvori WashData panel iz bočne trake (ili idi na [/ha-washdata](/ha-washdata)) za pregled ciklusa, podešavanje detekcije i upravljanje profilima.", "data": { "name": "Naziv uređaja", "device_type": "Tip uređaja", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Ponovo konfiguriši WashData", - "description": "Ažuriraj naziv uređaja, tip uređaja ili senzor snage.", + "description": "Ažuriraj naziv uređaja, tip uređaja ili senzor snage.\n\nWashData panel (bočna traka ili [/ha-washdata](/ha-washdata)) je mesto gde se upravljaju detekcija, ciklusi, profili i obaveštenja.", "data": { "name": "Naziv uređaja", "device_type": "Tip uređaja", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData podešavanja", - "description": "Sva podešavanja -- detekcija, podudaranje, tajming, obaveštenja, profili i ciklusi -- dostupna su u WashData panelu. Koristi ovaj obrazac samo da promeniš senzor snage, tip uređaja ili prag mirovanja.", + "description": "Preimenuj uređaj ili promeni njegova osnovna hardverska podešavanja. Sva podešavanja detekcije, podudaranja i obaveštenja nalaze se u [WashData panelu](/ha-washdata) (dostupan i iz bočne trake).", "data": { "name": "Naziv uređaja", "device_type": "Tip uređaja", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: tajmer {minutes} min", "timer_pause_action_title": "Nastavi ciklus", "timer_pause_body_suffix": "Ciklus je pauziran. Otvori WashData panel da nastaviš.", + "unload_dismiss_action_title": "Prestani da podsećaš", "notify_live_waiting_message": "{device}: Nijedan profil još nije podudaran.", "vs_typical_longer": "{pct}% duže nego obično", "vs_typical_shorter": "{pct}% kraće nego obično", diff --git a/custom_components/ha_washdata/translations/sv.json b/custom_components/ha_washdata/translations/sv.json index 2dcd9be0..d8f8489c 100644 --- a/custom_components/ha_washdata/translations/sv.json +++ b/custom_components/ha_washdata/translations/sv.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData Setup", - "description": "Konfigurera din tvättmaskin eller annan apparat.\n\nEffektsensor krävs.\n\n**Närnäst kommer du att bli tillfrågad om du vill skapa din första profil.**", + "description": "Konfigurera din tvättmaskin eller annan apparat.\n\nEffektsensor krävs.\n\nEfter installationen öppnar du WashData-panelen från sidofältet (eller gå till [/ha-washdata](/ha-washdata)) för att visa cykler, finjustera identifiering och hantera profiler.", "data": { "name": "Enhetens namn", "device_type": "Enhetstyp", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Konfigurera om WashData", - "description": "Uppdatera enhetens namn, apparattyp eller effektsensor.", + "description": "Uppdatera enhetsnamnet, apparattypen eller effektsensorn.\n\nWashData-panelen (sidofältet eller [/ha-washdata](/ha-washdata)) är där identifiering, cykler, profiler och notiser hanteras.", "data": { "name": "Enhetens namn", "device_type": "Enhetstyp", @@ -49,13 +49,14 @@ "min_power": "Minsta effekttröskel (W)" }, "title": "WashData-inställningar", - "description": "Byt namn på enheten eller ändra dess kärninställningar för hårdvara. Alla detekterings-, matchnings- och meddelandeinställningar finns i WashData-panelen." + "description": "Byt namn på enheten eller ändra dess grundläggande hårdvaruinställningar. Alla inställningar för identifiering, matchning och notiser finns i [WashData-panelen](/ha-washdata) (även nåbar från sidofältet)." } }, "error": { "timer_default_message": "{device}: timer {minutes} min", "timer_pause_action_title": "Återuppta cykeln", "timer_pause_body_suffix": "Cykeln är pausad. Öppna WashData-panelen för att fortsätta.", + "unload_dismiss_action_title": "Sluta påminna", "notify_live_waiting_message": "{device}: Ingen profil matchad ännu.", "vs_typical_longer": "{pct}% längre än vanligt", "vs_typical_shorter": "{pct}% kortare än vanligt", diff --git a/custom_components/ha_washdata/translations/tr.json b/custom_components/ha_washdata/translations/tr.json index cf8d120b..ca09b5f6 100644 --- a/custom_components/ha_washdata/translations/tr.json +++ b/custom_components/ha_washdata/translations/tr.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData Kurulumu", - "description": "Çamaşır makinenizi veya diğer cihazınızı yapılandırın.\n\nGüç sensörü gereklidir.\n\n**Ardından, ilk profilinizi oluşturmak isteyip istemediğiniz sorulacaktır.**", + "description": "Çamaşır makinenizi veya diğer cihazınızı yapılandırın.\n\nGüç sensörü gereklidir.\n\nKurulumdan sonra döngüleri görüntülemek, algılamayı ayarlamak ve profilleri yönetmek için kenar çubuğundan WashData panelini açın (veya [/ha-washdata](/ha-washdata) adresine gidin).", "data": { "name": "Cihaz Adı", "device_type": "Cihaz Türü", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Update the device name, appliance type, or power sensor.", + "description": "Cihaz adını, cihaz türünü veya güç sensörünü güncelleyin.\n\nAlgılama, döngüler, profiller ve bildirimler WashData panelinde (kenar çubuğu veya [/ha-washdata](/ha-washdata)) yönetilir.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "All settings -- detection, matching, timing, notifications, profiles, and cycles -- are available in the WashData panel. Use this form only to change the power sensor, device type, or standby threshold.", + "description": "Cihazı yeniden adlandırın veya temel donanım ayarlarını değiştirin. Tüm algılama, eşleştirme ve bildirim ayarları [WashData panelinde](/ha-washdata) bulunur (kenar çubuğundan da erişilebilir).", "data": { "name": "Cihaz Adı", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: {minutes} dk zamanlayıcı", "timer_pause_action_title": "Döngüyü Devam Ettir", "timer_pause_body_suffix": "Döngü duraklatıldı. Devam ettirmek için WashData panelini açın.", + "unload_dismiss_action_title": "Hatırlatmayı durdur", "notify_live_waiting_message": "{device}: Henüz eşleşen profil yok.", "vs_typical_longer": "olağandan %{pct} daha uzun", "vs_typical_shorter": "olağandan %{pct} daha kısa", diff --git a/custom_components/ha_washdata/translations/uk.json b/custom_components/ha_washdata/translations/uk.json index 07a78138..ba959bbd 100644 --- a/custom_components/ha_washdata/translations/uk.json +++ b/custom_components/ha_washdata/translations/uk.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "Налаштування WashData", - "description": "Налаштуйте пральну машину чи інший прилад.\n\nПотрібен датчик потужності.\n\n**Далі вас запитають, чи хочете ви створити свій перший профіль.**", + "description": "Налаштуйте пральну машину чи інший прилад.\n\nПотрібен датчик потужності.\n\nПісля налаштування відкрийте панель WashData з бічної панелі (або перейдіть на [/ha-washdata](/ha-washdata)), щоб переглядати цикли, налаштувати виявлення та керувати профілями.", "data": { "name": "Назва пристрою", "device_type": "Тип пристрою", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "Reconfigure WashData", - "description": "Оновіть назву пристрою, тип пристрою або датчик потужності.", + "description": "Оновіть назву пристрою, тип приладу або датчик потужності.\n\nПанель WashData (бічна панель або [/ha-washdata](/ha-washdata)) — це місце для керування виявленням, циклами, профілями та сповіщеннями.", "data": { "name": "Device Name", "device_type": "Device Type", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData Settings", - "description": "Усі налаштування – виявлення, зіставлення, час, сповіщення, профілі та цикли – доступні на панелі WashData. Використовуйте цю форму лише для зміни датчика потужності, типу пристрою або порогового значення в режимі очікування.", + "description": "Перейменуйте пристрій або змініть його основні апаратні налаштування. Усі налаштування виявлення, зіставлення та сповіщень знаходяться в [панелі WashData](/ha-washdata) (також доступна з бічної панелі).", "data": { "name": "Назва пристрою", "device_type": "Device Type", @@ -56,6 +56,7 @@ "timer_default_message": "{device}: таймер {minutes} хв", "timer_pause_action_title": "Відновити цикл", "timer_pause_body_suffix": "Цикл призупинено. Відкрийте панель WashData для відновлення.", + "unload_dismiss_action_title": "Не нагадувати", "notify_live_waiting_message": "{device}: Профіль ще не розпізнано.", "vs_typical_longer": "на {pct}% довше, ніж зазвичай", "vs_typical_shorter": "на {pct}% коротше, ніж зазвичай", diff --git a/custom_components/ha_washdata/translations/zh-Hans.json b/custom_components/ha_washdata/translations/zh-Hans.json index c7491fe2..537d7f17 100644 --- a/custom_components/ha_washdata/translations/zh-Hans.json +++ b/custom_components/ha_washdata/translations/zh-Hans.json @@ -3,7 +3,7 @@ "step": { "user": { "title": "WashData 设置", - "description": "配置您的洗衣机或其他设备。\n\n需要功率传感器。\n\n**接下来,系统会询问您是否要创建您的第一个个人资料。**", + "description": "配置您的洗衣机或其他家电设备。\n\n需要功率传感器。\n\n设置完成后,请从侧边栏打开 WashData 面板(或访问 [/ha-washdata](/ha-washdata))来查看周期、调整检测参数和管理配置文件。", "data": { "name": "设备名称", "device_type": "设备类型", @@ -19,7 +19,7 @@ }, "reconfigure": { "title": "重新配置 WashData", - "description": "更新设备名称、设备类型或功率传感器。", + "description": "更新设备名称、家电类型或功率传感器。\n\nWashData 面板(侧边栏或 [/ha-washdata](/ha-washdata))用于管理检测、周期、配置文件和通知。", "data": { "name": "设备名称", "device_type": "设备类型", @@ -43,7 +43,7 @@ "step": { "init": { "title": "WashData 设置", - "description": "所有设置——检测、匹配、计时、通知、配置文件和周期——都可以在 WashData 面板中使用。仅使用此表单来更改功率传感器、设备类型或待机阈值。", + "description": "重命名设备或更改其核心硬件设置。所有检测、匹配和通知设置均在 [WashData 面板](/ha-washdata) 中(也可从侧边栏访问)。", "data": { "name": "设备名称", "device_type": "设备类型", @@ -56,6 +56,7 @@ "timer_default_message": "{device}:{minutes} 分钟定时器", "timer_pause_action_title": "恢复周期", "timer_pause_body_suffix": "周期已暂停。打开 WashData 面板以恢复。", + "unload_dismiss_action_title": "停止提醒", "notify_live_waiting_message": "{device}:尚未匹配到配置文件。", "vs_typical_longer": "比平常长 {pct}%", "vs_typical_shorter": "比平常短 {pct}%", diff --git a/custom_components/ha_washdata/ws_api.py b/custom_components/ha_washdata/ws_api.py index cb1680bf..c398948c 100644 --- a/custom_components/ha_washdata/ws_api.py +++ b/custom_components/ha_washdata/ws_api.py @@ -22,6 +22,7 @@ import collections import functools import json import logging +import math import os import re import time @@ -39,6 +40,7 @@ from .const import ( CONF_NAME, CONF_COMPLETION_MIN_SECONDS, CONF_DEVICE_TYPE, + CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE, CONF_DOOR_SENSOR_ENTITY, CONF_ANTI_WRINKLE_EXIT_POWER, CONF_ANTI_WRINKLE_MAX_POWER, @@ -71,6 +73,7 @@ from .const import ( CONF_SWITCH_ENTITY, CONF_WATCHDOG_INTERVAL, DEFAULT_DEVICE_TYPE, + DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS, DEFAULT_MAINTENANCE_REMINDER_CYCLES, DEFAULT_MIN_POWER, DEFAULT_OFF_DELAY, @@ -81,6 +84,7 @@ from .const import ( DOMAIN, ENABLE_ML_SUGGESTIONS, ENABLE_ML_TRAINING, + PLAYGROUND_PRESET_MAX, SHOW_ML_LAB, STATE_COLORS, ) @@ -92,16 +96,11 @@ from .ws_schema import WS_OPEN_RESPONSES, WS_RESPONSE_TYPES _LOGGER = logging.getLogger(__name__) -# Read once at import time (manifest.json is static) so ws_get_constants never does -# blocking I/O on the event loop. Falls back to "" if the file is absent. -try: - from pathlib import Path as _Path - _INTEGRATION_VERSION: str = json.loads( - (_Path(__file__).parent / "manifest.json").read_text(encoding="utf-8") - ).get("version", "") - del _Path -except Exception: # pragma: no cover # pylint: disable=broad-exception-caught - _INTEGRATION_VERSION = "" +# Populated once during async_setup_entry (stored in hass.data["ha_washdata_version"]) +# so ws_get_constants never does blocking I/O on the event loop. A module-level +# read_text() here would run on the event loop the first time ws_api is imported +# inside async_setup_entry (#328/#335). +_INTEGRATION_VERSION: str = "" # ─── WS response contract (Group H1) ──────────────────────────────────────────── # Debug-only validation of every send_result payload against the TypedDict @@ -1091,6 +1090,7 @@ def async_register_commands(hass: HomeAssistant) -> None: ws_get_constants, # Suggestions ws_get_suggestions, ws_apply_suggestions, ws_clear_suggestions, ws_run_suggestion_analysis, + ws_set_suggestion_lock, # Cycle curve / interactive editing ws_get_cycle_power_data, ws_trim_cycle, ws_analyze_split, ws_apply_split, ws_apply_merge, # Profile envelope / member cycles @@ -1116,6 +1116,8 @@ def async_register_commands(hass: HomeAssistant) -> None: ws_pause_cycle, ws_resume_cycle, ws_terminate_cycle, # Playground (F3): DTW visualizer ws_get_dtw_debug, + # Playground settings control panel: live values + named presets + ws_get_playground_settings, ws_save_playground_preset, ws_delete_playground_preset, # Playground redesign: faithful single-cycle sim + history table + sweep ws_run_playground_cycle_detail, ws_run_playground_history, ws_run_playground_sweep, @@ -1215,7 +1217,13 @@ def ws_get_devices( except Exception: # pylint: disable=broad-exception-caught pass try: - info["feedback_count"] = len(store.get_pending_feedback() or {}) + # Count only pending feedback whose cycle still exists, so the + # badge cannot outrun the review list after a cycle is deleted, + # merged or split (#362). Defense-in-depth on top of the prune in + # those mutation paths; also self-heals pre-existing orphans. + _pend = store.get_pending_feedback() or {} + _live = {c.get("id") for c in store.get_past_cycles()} + info["feedback_count"] = sum(1 for cid in _pend if cid in _live) except Exception: # pylint: disable=broad-exception-caught pass info["is_user_paused"] = bool(getattr(manager, "is_user_paused", False)) @@ -1372,6 +1380,19 @@ async def ws_set_options( if effective_device_type != DEVICE_TYPE_PUMP: new_options.pop(CONF_PUMP_STUCK_DURATION, None) + # Numeric-finite validation for fields that the cycle-detector float()-casts at + # build time; coerce bad submissions to the compiled default so storage stays clean. + if CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE in new_options: + try: + _qr = float(new_options[CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE]) + if not math.isfinite(_qr): + raise ValueError("non-finite") + new_options[CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE] = _qr + except (TypeError, ValueError): + new_options[CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE] = ( + DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS + ) + # Partition identity out of options: the display name is carried by the # entry title, never persisted in options (matches the config-flow invariant # that CONF_NAME is absent from options). @@ -3013,9 +3034,12 @@ async def ws_get_export_inventory( entry = _get_entry(hass, entry_id) try: opts = dict(entry.options) if entry else {} - manifest = await hass.async_add_executor_job( - manager.profile_store.get_export_inventory, opts - ) + # Run the inventory scan synchronously on the event loop. It's a fast walk + # (counts + small per-cycle {id,date,duration} dicts) and staying on the loop + # is inherently safe from concurrent mutation - offloading it to an executor + # would read the live, mutable store lists from another thread and could raise + # "list changed size during iteration" without a full (expensive) snapshot. + manifest = manager.profile_store.get_export_inventory(opts) _send_result(connection, msg["id"], "get_export_inventory", {"manifest": manifest}) except Exception as exc: # pylint: disable=broad-exception-caught connection.send_error(msg["id"], "unknown_error", str(exc)) @@ -3239,23 +3263,8 @@ def ws_get_constants( from .frontend import BRAND_ICON_URL as _BRAND_ICON_URL, BRAND_ICON_REGISTERED_KEY as _BRAND_ICON_KEY # pylint: disable=import-outside-toplevel from .const import STORE_WEB_ORIGIN from . import store_account - from .const import ( # pylint: disable=import-outside-toplevel - DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO, - DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO, - DEFAULT_DTW_BANDWIDTH, - MATCH_CORR_WEIGHT, - MATCH_KEEP_MIN_SCORE, - MATCH_DTW_BLEND, - MATCH_DTW_ENSEMBLE_W, - MATCH_DDTW_DIST_SCALE, - MATCH_DTW_REFINE_TOP_N, - MATCH_DURATION_WEIGHT, - MATCH_ENERGY_WEIGHT, - MATCH_DURATION_SCALE, - MATCH_ENERGY_SCALE, - ) _send_result(connection, msg["id"], "get_constants", { - "version": _INTEGRATION_VERSION, + "version": hass.data.get("ha_washdata_version", _INTEGRATION_VERSION), "icon_url": _BRAND_ICON_URL if hass.data.get(_BRAND_ICON_KEY) else None, "device_types": device_types, "state_colors": dict(STATE_COLORS), @@ -3265,22 +3274,9 @@ def ws_get_constants( "PROFILE_MIN_WARMUP_CYCLES": CONF_PROFILE_MIN_WARMUP_CYCLES, # Canonical matcher defaults for the Playground's matcher-param fields, so # the panel's _PG_MATCH_DEFAULTS table cannot silently drift from const.py. - # The panel keeps that table only as an offline fallback. - "pg_match_defaults": { - "profile_match_min_duration_ratio": DEFAULT_PROFILE_MATCH_MIN_DURATION_RATIO, - "profile_match_max_duration_ratio": DEFAULT_PROFILE_MATCH_MAX_DURATION_RATIO, - "corr_weight": MATCH_CORR_WEIGHT, - "keep_min_score": MATCH_KEEP_MIN_SCORE, - "dtw_bandwidth": DEFAULT_DTW_BANDWIDTH, - "dtw_blend": MATCH_DTW_BLEND, - "dtw_ensemble_w": MATCH_DTW_ENSEMBLE_W, - "dtw_ddtw_scale": MATCH_DDTW_DIST_SCALE, - "dtw_refine_top_n": MATCH_DTW_REFINE_TOP_N, - "duration_weight": MATCH_DURATION_WEIGHT, - "energy_weight": MATCH_ENERGY_WEIGHT, - "duration_scale": MATCH_DURATION_SCALE, - "energy_scale": MATCH_ENERGY_SCALE, - }, + # The panel keeps that table only as an offline fallback. Single source: + # playground.MATCH_DEFAULTS_BY_OPTION (also used by effective_settings). + "pg_match_defaults": dict(playground.MATCH_DEFAULTS_BY_OPTION), # Community store: the panel opens /connect.html for the GitHub # handoff and validates postMessage against new URL(origin).origin. "store_online_available": True, @@ -3349,7 +3345,14 @@ def ws_get_suggestions( except Exception as exc: # pylint: disable=broad-exception-caught _LOGGER.debug("Error reading suggestions for %s: %s", entry_id, exc) - _send_result(connection, msg["id"], "get_suggestions", {"suggestions": out}) + try: + locked = manager.profile_store.get_locked_suggestions() + except Exception: # pylint: disable=broad-exception-caught + locked = [] + _send_result( + connection, msg["id"], "get_suggestions", + {"suggestions": out, "locked_suggestions": locked}, + ) @websocket_api.websocket_command( @@ -3433,6 +3436,42 @@ async def ws_clear_suggestions( connection.send_error(msg["id"], "unknown_error", str(exc)) +@websocket_api.websocket_command( + { + vol.Required("type"): "ha_washdata/set_suggestion_lock", + vol.Required("entry_id"): str, + vol.Required("key"): str, + vol.Required("locked"): bool, + } +) +@websocket_api.async_response +async def ws_set_suggestion_lock( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: dict[str, Any], +) -> None: + """Lock or unlock a tuning suggestion key so the auto-tuner stops (or resumes) + proposing it (#343).""" + entry_id: str = msg["entry_id"] + key: str = msg["key"] + if key not in _SUGGESTION_KEYS: + connection.send_error(msg["id"], "invalid_key", f"Unknown suggestion key: {key!r}") + return + manager = _get_manager(hass, entry_id) + if manager is None: + _err_not_found(connection, msg["id"], entry_id) + return + try: + await manager.profile_store.set_suggestion_locked(key, bool(msg["locked"])) + manager.notify_update() + _send_result( + connection, msg["id"], "set_suggestion_lock", + {"success": True, "locked_suggestions": manager.profile_store.get_locked_suggestions()}, + ) + except Exception as exc: # pylint: disable=broad-exception-caught + connection.send_error(msg["id"], "unknown_error", str(exc)) + + @websocket_api.websocket_command( {vol.Required("type"): "ha_washdata/run_suggestion_analysis", vol.Required("entry_id"): str} ) @@ -4085,6 +4124,14 @@ async def ws_set_user_prefs( # F2: per-user Basic/Advanced settings disclosure level. if p.get("settings_level") in ("basic", "advanced"): cur["settings_level"] = p["settings_level"] + # Panel font-size multiplier (accessibility). Coerce + clamp to safe bounds so a + # bad value can never break rendering; without this it was silently dropped and + # the setting vanished on refresh. + if "font_scale" in p: + try: + cur["font_scale"] = max(0.7, min(2.0, float(p["font_scale"]))) + except (TypeError, ValueError): + cur.pop("font_scale", None) # Display prefs: cycle date format + panel language override (paired with the # panel's save-prefs payload; without these they would be silently dropped). if p.get("date_format") in _PREF_DATE_FORMATS: @@ -4635,7 +4682,9 @@ def _compute_ml_comparison( } -def _build_settings_comparison(manager: Any, merged: dict[str, Any]) -> dict[str, Any]: +def _build_settings_comparison( + manager: Any, merged: dict[str, Any], engine: Any = None +) -> dict[str, Any]: """Build the enriched Classic-vs-ML settings comparison (executor-safe). Runs both the classic :class:`SuggestionEngine` and the @@ -4651,8 +4700,13 @@ def _build_settings_comparison(manager: Any, merged: dict[str, Any]) -> dict[str except Exception: # pylint: disable=broad-exception-caught return {} - learning = getattr(manager, "learning_manager", None) - classic = getattr(learning, "suggestion_engine", None) + # `engine` is a for_job() copy prepared on the event loop with the config + # snapshot already bound; fall back to the shared engine only for callers that + # did not supply one (its _entry_options() then does a live read). + classic = engine + if classic is None: + learning = getattr(manager, "learning_manager", None) + classic = getattr(learning, "suggestion_engine", None) if classic is None: return {} @@ -4792,8 +4846,16 @@ async def ws_get_ml_comparison( # Stage 3: replace the basic off_delay-only comparison with the full # Classic-vs-ML settings table when ML suggestions are unlocked. if ENABLE_ML_SUGGESTIONS: + # Bind this handler's already-merged view to a throwaway engine copy + # before the executor hop: reading the config entry is loop-affine, so + # the generators must not re-read it from the worker thread, and a + # copy keeps concurrent jobs from clobbering each other's snapshot. + shared = getattr( + getattr(manager, "learning_manager", None), "suggestion_engine", None + ) + job_engine = shared.for_job(merged) if shared is not None else None enriched = await hass.async_add_executor_job( - _build_settings_comparison, manager, merged + _build_settings_comparison, manager, merged, job_engine ) if enriched: result["settings_comparison"] = enriched @@ -5167,6 +5229,16 @@ async def ws_terminate_cycle( # ─── Playground (F3): headless what-if replay + DTW visualizer ────────────────── + +def _safe_float_finite(value: Any, default: float) -> float: + """Convert ``value`` to a finite float, falling back to ``default`` on failure.""" + try: + v = float(value) + return v if math.isfinite(v) else default + except (TypeError, ValueError): + return default + + def _playground_base_config(manager: Any, entry: Any) -> CycleDetectorConfig: """Resolve the device's live CycleDetectorConfig as the simulation base. @@ -5193,6 +5265,10 @@ def _playground_base_config(manager: Any, entry: Any) -> CycleDetectorConfig: stop_threshold_w=float( opts.get(CONF_STOP_THRESHOLD_W, min_power * 0.6 if min_power else 2.0) ), + dishwasher_end_spike_quiet_release=_safe_float_finite( + opts.get(CONF_DISHWASHER_END_SPIKE_QUIET_RELEASE), + DISHWASHER_END_SPIKE_QUIET_RELEASE_SECONDS, + ), ) @@ -5405,6 +5481,191 @@ async def ws_get_dtw_debug( connection.send_error(msg["id"], "unknown_error", str(exc)) +# ─── Playground settings control panel (live values + presets) ───────────────── + + +def _playground_preset_list(store: Any) -> list[dict[str, Any]]: + """Presets as a name-sorted list for the panel dropdown.""" + presets = store.get_playground_presets() + out: list[dict[str, Any]] = [] + for name, record in presets.items(): + if not isinstance(record, dict): + continue + out.append({ + "name": name, + "values": dict(record.get("values") or {}), + "created_at": record.get("created_at"), + "updated_at": record.get("updated_at"), + }) + out.sort(key=lambda p: str(p["name"]).lower()) + return out + + +@websocket_api.websocket_command( + { + vol.Required("type"): "ha_washdata/get_playground_settings", + vol.Required("entry_id"): str, + } +) +@websocket_api.async_response +async def ws_get_playground_settings( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: dict[str, Any], +) -> None: + """Return the device's LIVE effective Playground settings plus saved presets. + + ``effective`` is read back off the same live detector/matcher config the + simulation uses, so the control panel always opens on what the integration is + really running - never on a stale schema default. ``publishable`` lists the + keys the panel may write back to the config entry. + """ + entry_id: str = msg["entry_id"] + ctx = _playground_context(hass, entry_id) + if ctx is None: + _err_not_found(connection, msg["id"], entry_id) + return + _manager, store, base_config, options, _price = ctx + try: + match_config = playground._matching_config(store) # noqa: SLF001 + except Exception: # pylint: disable=broad-exception-caught + match_config = {} + + # Classic suggestions from the store (periodic analysis results), filtered to + # keys the Playground actually exposes — cheap dict read, no executor needed. + raw_sugg: dict[str, Any] = {} + try: + raw_sugg = store.get_suggestions() or {} + except Exception as exc: # pylint: disable=broad-exception-caught + _LOGGER.debug( + "Could not read Playground classic suggestions for %s: %s", entry_id, exc + ) + classic_sugg: dict[str, Any] = {} + for key in playground.SETTING_KEYS: + item = raw_sugg.get(key) + if isinstance(item, dict) and item.get("value") is not None: + val = item["value"] + try: + classic_sugg[key] = int(float(val)) if key in _SUGGESTION_INT_KEYS else round(float(val), 4) + except (TypeError, ValueError): + pass + + # ML suggestions — computed on-demand; executor-offloaded because it runs + # statistics across all clean cycles. None when the feature is disabled. + ml_sugg: dict[str, Any] | None = None + if ENABLE_ML_SUGGESTIONS: + ml_sugg = {} + try: + learning = getattr(_manager, "learning_manager", None) + classic_engine = getattr(learning, "suggestion_engine", None) + if classic_engine is not None: + _pg_setting_keys = playground.SETTING_KEYS + _pg_int_keys = _SUGGESTION_INT_KEYS + job_engine = classic_engine.for_job(options) + + def _run_ml_sugg() -> dict[str, Any]: + from .suggestion_engine import MLSuggestionEngine as _ML # pylint: disable=import-outside-toplevel + raw = _ML(job_engine).generate_ml_suggestions() or {} + out: dict[str, Any] = {} + for k in _pg_setting_keys: + entry = raw.get(k) + if isinstance(entry, dict) and entry.get("value") is not None: + v = entry["value"] + try: + out[k] = int(float(v)) if k in _pg_int_keys else round(float(v), 4) + except (TypeError, ValueError): + pass + return out + + ml_sugg = await hass.async_add_executor_job(_run_ml_sugg) + except Exception as exc: # pylint: disable=broad-exception-caught + _LOGGER.debug( + "Could not generate Playground ML suggestions for %s: %s", entry_id, exc + ) + + _send_result(connection, msg["id"], "get_playground_settings", { + "effective": playground.effective_settings(base_config, match_config), + "presets": _playground_preset_list(store), + "publishable": sorted(playground.PUBLISHABLE_SETTING_KEYS), + "preset_limit": PLAYGROUND_PRESET_MAX, + "classic_suggestions": classic_sugg, + "ml_suggestions": ml_sugg, + "ml_suggestions_enabled": ENABLE_ML_SUGGESTIONS, + }) + + +@websocket_api.websocket_command( + { + vol.Required("type"): "ha_washdata/save_playground_preset", + vol.Required("entry_id"): str, + vol.Required("name"): str, + vol.Required("values"): dict, + } +) +@websocket_api.async_response +async def ws_save_playground_preset( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: dict[str, Any], +) -> None: + """Save (or overwrite) a named snapshot of the Playground's settings.""" + entry_id: str = msg["entry_id"] + manager = _get_manager(hass, entry_id) + store = getattr(manager, "profile_store", None) if manager else None + if store is None: + _err_not_found(connection, msg["id"], entry_id) + return + values = playground.sanitize_setting_values(msg["values"]) + try: + await store.async_save_playground_preset(msg["name"], values) + except ValueError as exc: + connection.send_error(msg["id"], "invalid_format", str(exc)) + return + except Exception as exc: # pylint: disable=broad-exception-caught + # The store write can fail (disk full, permissions). Without this the + # exception escapes the handler and the client never gets a reply, so the + # panel's save button spins forever instead of reporting the failure. + _LOGGER.warning("Saving playground preset failed for %s: %s", entry_id, exc) + connection.send_error(msg["id"], "unknown_error", str(exc)) + return + _send_result(connection, msg["id"], "save_playground_preset", { + "success": True, + "presets": _playground_preset_list(store), + }) + + +@websocket_api.websocket_command( + { + vol.Required("type"): "ha_washdata/delete_playground_preset", + vol.Required("entry_id"): str, + vol.Required("name"): str, + } +) +@websocket_api.async_response +async def ws_delete_playground_preset( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: dict[str, Any], +) -> None: + """Delete a saved Playground settings preset.""" + entry_id: str = msg["entry_id"] + manager = _get_manager(hass, entry_id) + store = getattr(manager, "profile_store", None) if manager else None + if store is None: + _err_not_found(connection, msg["id"], entry_id) + return + try: + removed = await store.async_delete_playground_preset(msg["name"]) + except Exception as exc: # pylint: disable=broad-exception-caught + _LOGGER.warning("Deleting playground preset failed for %s: %s", entry_id, exc) + connection.send_error(msg["id"], "unknown_error", str(exc)) + return + _send_result(connection, msg["id"], "delete_playground_preset", { + "success": removed, + "presets": _playground_preset_list(store), + }) + + # ─── Background-task registry (progress / cancel / reconnect-safe results) ────── diff --git a/custom_components/ha_washdata/ws_schema.py b/custom_components/ha_washdata/ws_schema.py index 2b457f50..b86ecc02 100644 --- a/custom_components/ha_washdata/ws_schema.py +++ b/custom_components/ha_washdata/ws_schema.py @@ -216,6 +216,8 @@ class ImportConfigSelectiveResponse(TypedDict): # ─── Shared constants ────────────────────────────────────────────────────────── class GetConstantsResponse(TypedDict): + version: str + icon_url: str | None device_types: list[dict[str, Any]] state_colors: dict[str, Any] ml_lab_enabled: bool @@ -225,12 +227,15 @@ class GetConstantsResponse(TypedDict): store_online_available: bool store_online_enabled: bool store_web_origin: str + store_prefs: dict[str, Any] + pg_match_defaults: dict[str, Any] # ─── Suggestions ─────────────────────────────────────────────────────────────── class GetSuggestionsResponse(TypedDict): suggestions: list[dict[str, Any]] + locked_suggestions: list[str] class ApplySuggestionsResponse(TypedDict): @@ -238,6 +243,11 @@ class ApplySuggestionsResponse(TypedDict): applied: list[str] +class SetSuggestionLockResponse(TypedDict): + success: bool + locked_suggestions: list[str] + + class RunSuggestionAnalysisResponse(TypedDict, total=False): """``success`` plus whatever the analysis pass reports (e.g. ``count``).""" @@ -262,6 +272,7 @@ class GetCyclePowerDataResponse(TypedDict, total=False): energy_kwh: float | None artifacts: list[dict[str, Any]] restart_gaps: list[Any] + is_reference: bool class AnalyzeSplitResponse(TypedDict): @@ -437,6 +448,41 @@ class GetDtwDebugResponse(TypedDict): warp_path: list[list[int]] +class PlaygroundPreset(TypedDict): + """One saved Playground settings snapshot.""" + + name: str + values: dict[str, Any] + created_at: Any + updated_at: Any + + +class GetPlaygroundSettingsResponse(TypedDict): + """Live effective Playground settings + the device's saved presets. + + ``classic_suggestions`` and ``ml_suggestions`` are filtered to keys the + Playground exposes so the panel can stage them directly. ``ml_suggestions`` + is ``None`` when ``ENABLE_ML_SUGGESTIONS`` is off - the key is still always + present, so every field here is required (total=True) and + ``_validate_ws_contract()`` can catch a handler that drops one. + """ + + effective: dict[str, Any] + presets: list[PlaygroundPreset] + publishable: list[str] + preset_limit: int + classic_suggestions: dict[str, Any] + ml_suggestions: dict[str, Any] | None + ml_suggestions_enabled: bool + + +class PlaygroundPresetsResponse(TypedDict): + """Acknowledgement carrying the post-mutation preset list.""" + + success: bool + presets: list[PlaygroundPreset] + + class TaskSnapshot(TypedDict, total=False): id: str entry_id: str @@ -585,6 +631,7 @@ class GetShareableCyclesResponse(TypedDict, total=False): plus the programs that carry a local phase map.""" items: list phase_programs: list + all_programs: list class GetSetupStatusResponse(TypedDict, total=False): @@ -651,6 +698,7 @@ WS_RESPONSE_TYPES: dict[str, type] = { "get_suggestions": GetSuggestionsResponse, "apply_suggestions": ApplySuggestionsResponse, "clear_suggestions": SuccessResponse, + "set_suggestion_lock": SetSuggestionLockResponse, "run_suggestion_analysis": RunSuggestionAnalysisResponse, "get_cycle_power_data": GetCyclePowerDataResponse, "trim_cycle": StartTaskResponse, @@ -679,6 +727,9 @@ WS_RESPONSE_TYPES: dict[str, type] = { "run_playground_history": RunPlaygroundHistoryResponse, "run_playground_sweep": RunPlaygroundSweepResponse, "get_dtw_debug": GetDtwDebugResponse, + "get_playground_settings": GetPlaygroundSettingsResponse, + "save_playground_preset": PlaygroundPresetsResponse, + "delete_playground_preset": PlaygroundPresetsResponse, "list_tasks": ListTasksResponse, "subscribe_tasks": SubscribeTasksResponse, "cancel_task": CancelTaskResponse, @@ -868,6 +919,7 @@ WS_COMMANDS: dict[str, dict] = { "get_suggestions": {"params": [_entry()]}, "apply_suggestions": {"params": [_entry(), _p("keys", "list[str]")]}, "clear_suggestions": {"params": [_entry()]}, + "set_suggestion_lock": {"params": [_entry(), _p("key", "str"), _p("locked", "bool")]}, "run_suggestion_analysis": {"params": [_entry()]}, "get_cycle_power_data": {"params": [_entry(), _p("cycle_id", "str")]}, "trim_cycle": {"params": [ @@ -954,6 +1006,13 @@ WS_COMMANDS: dict[str, dict] = { _p("cycle_id", "str"), _p("profile_name", "str|null", False), ]}, + "get_playground_settings": {"params": [_entry()]}, + "save_playground_preset": {"params": [ + _entry(), + _p("name", "str"), + _p("values", "dict"), + ]}, + "delete_playground_preset": {"params": [_entry(), _p("name", "str")]}, "list_tasks": {"params": [_p("entry_id", "str|null", False)]}, "subscribe_tasks": {"params": [_p("entry_id", "str|null", False)]}, "cancel_task": {"params": [_p("task_id", "str")]}, diff --git a/custom_components/ha_washdata/www/ha-washdata-card.js b/custom_components/ha_washdata/www/ha-washdata-card.js index 04ee6463..82d470a6 100644 --- a/custom_components/ha_washdata/www/ha-washdata-card.js +++ b/custom_components/ha_washdata/www/ha-washdata-card.js @@ -16,6 +16,7 @@ // along with this program. If not, see . const CARD_TAG = "ha-washdata-card"; const EDITOR_TAG = "ha-washdata-card-editor"; +const DOMAIN = "ha_washdata"; // Gesture timing (ms) and movement tolerance (px) for tap / hold / double-tap, // chosen to match Home Assistant's own action handler conventions. @@ -23,32 +24,126 @@ const HOLD_MS = 500; const DOUBLE_TAP_MS = 250; const TAP_MOVE_TOLERANCE = 10; -const TRANSLATIONS = {"en":{"washer_program":"Washer Program","program_placeholder":"Select Program","duration":"Duration","minutes":"min","time_remaining":"Time Remaining","no_prediction":"No Prediction","cycle_in_progress":"Cycle in progress","status":"Status","progress":"Progress","select_program":"Select a program to see details","title":"Title","status_entity":"Status Entity","icon":"Icon","active_color":"Active Icon Color","show_state":"Show State","show_program":"Show Program","show_details":"Show Details","spin_icon":"Spinning Icon (While running)","program_entity":"Program Entity","pct_entity":"Progress Entity (Optional)","time_entity":"Time Entity (Optional)","display_mode":"Display Mode","show_time_remaining":"Show Time Remaining","show_percentage":"Show Percentage","entity_not_found":"Entity not found","tap_action":"Tap Action","hold_action":"Hold Action","double_tap_action":"Double Tap Action"},"bg":{"washer_program":"Програма за пране","program_placeholder":"Изберете Програма","duration":"Продължителност","minutes":"мин","time_remaining":"Оставащо време","no_prediction":"Няма прогноза","cycle_in_progress":"Цикълът е в ход","status":"Статус","progress":"Напредък","select_program":"Изберете програма, за да видите подробности","title":"Заглавие","status_entity":"Състояние на обекта","icon":"Икона","active_color":"Цвят на активната икона","show_state":"Показване на състояние","show_program":"Шоу програма","show_details":"Показване на подробности","spin_icon":"Въртяща се икона (докато работи)","program_entity":"Програмен субект","pct_entity":"Обект на напредъка (по избор)","time_entity":"Времеви обект (по избор)","display_mode":"Режим на показване","show_time_remaining":"Показване на оставащото време","show_percentage":"Показване на процента","entity_not_found":"Обектът не е намерен","tap_action":"Докосване на действие","hold_action":"Задръж действие","double_tap_action":"Двойно докосване"},"bs":{"washer_program":"Program za pranje","program_placeholder":"Odaberite Program","duration":"Trajanje","minutes":"min","time_remaining":"Preostalo vrijeme","no_prediction":"Nema predviđanja","cycle_in_progress":"Ciklus je u toku","status":"Status","progress":"Napredak","select_program":"Odaberite program da vidite detalje","title":"Naslov","status_entity":"Status Entiteta","icon":"Ikona","active_color":"Aktivna boja ikone","show_state":"Prikaži državu","show_program":"Show Program","show_details":"Prikaži detalje","spin_icon":"Ikona za okretanje (dok trčanje)","program_entity":"Programski entitet","pct_entity":"Entitet napretka (opciono)","time_entity":"Vremenski entitet (opcionalno)","display_mode":"Način prikaza","show_time_remaining":"Prikaži preostalo vrijeme","show_percentage":"Prikaži procenat","entity_not_found":"Entitet nije pronađen","tap_action":"Dodirnite Akcija","hold_action":"Držite akciju","double_tap_action":"Dvostruki dodir Akcija"},"cs":{"washer_program":"Program pračky","program_placeholder":"Vyberte Program","duration":"Trvání","minutes":"min","time_remaining":"Zbývající čas","no_prediction":"Žádná předpověď","cycle_in_progress":"Cyklus probíhá","status":"Postavení","progress":"Pokrok","select_program":"Chcete-li zobrazit podrobnosti, vyberte program","title":"Titul","status_entity":"Stavová entita","icon":"Ikona","active_color":"Barva aktivní ikony","show_state":"Zobrazit stav","show_program":"Zobrazit program","show_details":"Zobrazit podrobnosti","spin_icon":"Ikona rotace (při běhu)","program_entity":"Entita programu","pct_entity":"Entita průběhu (volitelné)","time_entity":"Časová entita (volitelné)","display_mode":"Režim zobrazení","show_time_remaining":"Zobrazit zbývající čas","show_percentage":"Zobrazit procento","entity_not_found":"Entita nenalezena","tap_action":"Klepněte na možnost Akce","hold_action":"Držet akci","double_tap_action":"Akce dvojitého klepnutí"},"da":{"washer_program":"Vaskeprogram","program_placeholder":"Vælg Program","duration":"Varighed","minutes":"min","time_remaining":"Tid tilbage","no_prediction":"Ingen forudsigelse","cycle_in_progress":"Cyklus i gang","status":"Status","progress":"Fremskridt","select_program":"Vælg et program for at se detaljer","title":"Titel","status_entity":"Statusenhed","icon":"Ikon","active_color":"Aktiv ikon farve","show_state":"Vis tilstand","show_program":"Vis program","show_details":"Vis detaljer","spin_icon":"Spinning-ikon (mens du løber)","program_entity":"Programenhed","pct_entity":"Fremskridtsenhed (valgfrit)","time_entity":"Tidsenhed (valgfrit)","display_mode":"Visningstilstand","show_time_remaining":"Vis resterende tid","show_percentage":"Vis procent","entity_not_found":"Enheden blev ikke fundet","tap_action":"Tap på handling","hold_action":"Hold handling","double_tap_action":"Dobbelt tastehandling"},"de":{"washer_program":"Waschprogramm","program_placeholder":"Wählen Sie Programm","duration":"Dauer","minutes":"min","time_remaining":"Verbleibende Zeit","no_prediction":"Keine Vorhersage","cycle_in_progress":"Zyklus läuft","status":"Status","progress":"Fortschritt","select_program":"Wählen Sie ein Programm aus, um Details anzuzeigen","title":"Titel","status_entity":"Status-Entität","icon":"Symbol","active_color":"Aktive Symbolfarbe","show_state":"Status anzeigen","show_program":"Programm anzeigen","show_details":"Details anzeigen","spin_icon":"Spinning-Symbol (während des Laufens)","program_entity":"Programmeinheit","pct_entity":"Fortschrittsentität (optional)","time_entity":"Zeiteinheit (optional)","display_mode":"Anzeigemodus","show_time_remaining":"Verbleibende Zeit anzeigen","show_percentage":"Prozentsatz anzeigen","entity_not_found":"Entität nicht gefunden","tap_action":"Tippen Sie auf","hold_action":"Action spielen","double_tap_action":"Doppeltipp-Aktion"},"el":{"washer_program":"Πρόγραμμα πλύσης","program_placeholder":"Επιλέξτε Πρόγραμμα","duration":"Διάρκεια","minutes":"ελάχ","time_remaining":"Χρόνος που απομένει","no_prediction":"Καμία Πρόβλεψη","cycle_in_progress":"Κύκλος σε εξέλιξη","status":"Κατάσταση","progress":"Πρόοδος","select_program":"Επιλέξτε ένα πρόγραμμα για να δείτε λεπτομέρειες","title":"Τίτλος","status_entity":"Οντότητα κατάστασης","icon":"Εικόνισμα","active_color":"Χρώμα ενεργού εικονιδίου","show_state":"Εμφάνιση κατάστασης","show_program":"Εμφάνιση προγράμματος","show_details":"Εμφάνιση λεπτομερειών","spin_icon":"Περιστρεφόμενο εικονίδιο (Κατά την εκτέλεση)","program_entity":"Οντότητα προγράμματος","pct_entity":"Οντότητα προόδου (Προαιρετικό)","time_entity":"Οντότητα ώρας (Προαιρετικό)","display_mode":"Λειτουργία εμφάνισης","show_time_remaining":"Εμφάνιση χρόνου που απομένει","show_percentage":"Εμφάνιση ποσοστού","entity_not_found":"Η οντότητα δεν βρέθηκε","tap_action":"Πατήστε ενέργεια","hold_action":"Διατήρηση ενέργειας","double_tap_action":"Διπλή ενέργεια πατήματος"},"es":{"washer_program":"Programa de lavadora","program_placeholder":"Seleccionar programa","duration":"Duración","minutes":"mín.","time_remaining":"Tiempo restante","no_prediction":"Sin predicción","cycle_in_progress":"Ciclo en progreso","status":"Estado","progress":"Progreso","select_program":"Selecciona un programa para ver detalles","title":"Título","status_entity":"Entidad de estado","icon":"Icono","active_color":"Color del icono activo","show_state":"Mostrar estado","show_program":"Mostrar programa","show_details":"Mostrar detalles","spin_icon":"Icono de giro (mientras se ejecuta)","program_entity":"Entidad del programa","pct_entity":"Entidad de progreso (opcional)","time_entity":"Entidad de tiempo (opcional)","display_mode":"Modo de visualización","show_time_remaining":"Mostrar tiempo restante","show_percentage":"Mostrar porcentaje","entity_not_found":"Entidad no encontrada","tap_action":"Toque Acción","hold_action":"Mantener acción","double_tap_action":"Doble toque de acción"},"et":{"washer_program":"Pesumasina programm","program_placeholder":"Valige Programm","duration":"Kestus","minutes":"min","time_remaining":"Järelejäänud aeg","no_prediction":"Ei mingit ennustust","cycle_in_progress":"Tsükkel on pooleli","status":"Olek","progress":"Edusammud","select_program":"Üksikasjade vaatamiseks valige programm","title":"Pealkiri","status_entity":"Olekuüksus","icon":"Ikoon","active_color":"Aktiivne ikooni värv","show_state":"Näita olekut","show_program":"Näita programmi","show_details":"Näita üksikasju","spin_icon":"Pöörlev ikoon (jooksmise ajal)","program_entity":"Programmi üksus","pct_entity":"Edenemisüksus (valikuline)","time_entity":"Ajaüksus (valikuline)","display_mode":"Kuvamisrežiim","show_time_remaining":"Näita järelejäänud aega","show_percentage":"Näita protsenti","entity_not_found":"Üksust ei leitud","tap_action":"Puudutustoiming","hold_action":"Hoidke tegevust","double_tap_action":"Topeltpuutetoiming"},"fi":{"washer_program":"Pesuohjelma","program_placeholder":"Valitse Ohjelma","duration":"Kesto","minutes":"min","time_remaining":"Aikaa jäljellä","no_prediction":"Ei ennustetta","cycle_in_progress":"Kierto käynnissä","status":"Tila","progress":"Edistyminen","select_program":"Valitse ohjelma nähdäksesi tiedot","title":"Otsikko","status_entity":"Tilayksikkö","icon":"Kuvake","active_color":"Aktiivinen kuvakkeen väri","show_state":"Näytä tila","show_program":"Näytä ohjelma","show_details":"Näytä tiedot","spin_icon":"Pyörivä kuvake (juoksessa)","program_entity":"Ohjelmakokonaisuus","pct_entity":"Etenemiskokonaisuus (valinnainen)","time_entity":"Aikakokonaisuus (valinnainen)","display_mode":"Näyttötila","show_time_remaining":"Näytä jäljellä oleva aika","show_percentage":"Näytä prosenttiosuus","entity_not_found":"Kokonaisuutta ei löydy","tap_action":"Napauta toimintoa","hold_action":"Pidä toimintoa","double_tap_action":"Kaksoisnapaustoiminto"},"fr":{"washer_program":"Programme de laveuse","program_placeholder":"Sélectionnez le programme","duration":"Durée","minutes":"min","time_remaining":"Temps restant","no_prediction":"Aucune prédiction","cycle_in_progress":"Cycle en cours","status":"Statut","progress":"Progrès","select_program":"Sélectionnez un programme pour voir les détails","title":"Titre","status_entity":"Entité de statut","icon":"Icône","active_color":"Couleur de l'icône active","show_state":"Afficher l'état","show_program":"Programme du spectacle","show_details":"Afficher les détails","spin_icon":"Icône de rotation (pendant l'exécution)","program_entity":"Entité du programme","pct_entity":"Entité de progression (facultatif)","time_entity":"Entité temporelle (facultatif)","display_mode":"Mode d'affichage","show_time_remaining":"Afficher le temps restant","show_percentage":"Afficher le pourcentage","entity_not_found":"Entité introuvable","tap_action":"Appuyez sur Action","hold_action":"Maintenez l'action","double_tap_action":"Double action de la touche"},"hr":{"washer_program":"Program za pranje","program_placeholder":"Odaberite Program","duration":"Trajanje","minutes":"min","time_remaining":"Preostalo vrijeme","no_prediction":"Nema predviđanja","cycle_in_progress":"Ciklus u tijeku","status":"Status","progress":"Napredak","select_program":"Odaberite program da biste vidjeli pojedinosti","title":"Titula","status_entity":"Statusni entitet","icon":"Ikona","active_color":"Boja aktivne ikone","show_state":"Prikaži stanje","show_program":"Show Program","show_details":"Prikaži pojedinosti","spin_icon":"Ikona koja se vrti (dok radi)","program_entity":"Programski entitet","pct_entity":"Entitet napretka (neobavezno)","time_entity":"Entitet vremena (neobavezno)","display_mode":"Način prikaza","show_time_remaining":"Prikaži preostalo vrijeme","show_percentage":"Prikaži postotak","entity_not_found":"Entitet nije pronađen","tap_action":"Dodirnite Akcija","hold_action":"Zadrži akciju","double_tap_action":"Akcija dvostrukog dodira"},"hu":{"washer_program":"Mosó program","program_placeholder":"Válassza a Program lehetőséget","duration":"Időtartam","minutes":"min","time_remaining":"Hátralévő idő","no_prediction":"Nincs előrejelzés","cycle_in_progress":"Ciklus folyamatban","status":"Állapot","progress":"Előrehalad","select_program":"Válasszon ki egy programot a részletek megtekintéséhez","title":"Cím","status_entity":"Állapot entitás","icon":"Ikon","active_color":"Aktív Ikon színe","show_state":"Állapot megjelenítése","show_program":"Program megjelenítése","show_details":"Részletek megjelenítése","spin_icon":"Pörgő ikon (futás közben)","program_entity":"Program entitás","pct_entity":"Haladási entitás (opcionális)","time_entity":"Idő entitás (opcionális)","display_mode":"Kijelző mód","show_time_remaining":"Mutasd a hátralévő időt","show_percentage":"Százalék megjelenítése","entity_not_found":"Az entitás nem található","tap_action":"Koppintson a Művelet elemre","hold_action":"Tartsa akciót","double_tap_action":"Dupla koppintás művelet"},"is":{"washer_program":"Þvottavélaforrit","program_placeholder":"Veldu Program","duration":"Lengd","minutes":"mín","time_remaining":"Tími sem eftir er","no_prediction":"Engin spá","cycle_in_progress":"Hringrás í gangi","status":"Staða","progress":"Framfarir","select_program":"Veldu forrit til að sjá upplýsingar","title":"Titill","status_entity":"Staða eining","icon":"Táknmynd","active_color":"Virkur táknlitur","show_state":"Sýna ástand","show_program":"Sýna dagskrá","show_details":"Sýna upplýsingar","spin_icon":"Snúningstákn (meðan í gangi)","program_entity":"Dagskráreining","pct_entity":"Framvindueining (valfrjálst)","time_entity":"Tímaeining (valfrjálst)","display_mode":"Sýnastilling","show_time_remaining":"Sýna tíma sem eftir er","show_percentage":"Sýna hlutfall","entity_not_found":"Eining fannst ekki","tap_action":"Bankaðu á Aðgerð","hold_action":"Haltu Action","double_tap_action":"Tvíspikkaðu á Action"},"it":{"washer_program":"Programma Lavatrice","program_placeholder":"Seleziona Programma","duration":"Durata","minutes":"min","time_remaining":"Tempo rimanente","no_prediction":"Nessuna previsione","cycle_in_progress":"Ciclo in corso","status":"Stato","progress":"Progressi","select_program":"Seleziona un programma per vedere i dettagli","title":"Titolo","status_entity":"Entità di stato","icon":"Icona","active_color":"Colore icona attiva","show_state":"Mostra stato","show_program":"Mostra programma","show_details":"Mostra dettagli","spin_icon":"Icona che gira (durante la corsa)","program_entity":"Entità del programma","pct_entity":"Entità di avanzamento (facoltativo)","time_entity":"Entità temporale (facoltativo)","display_mode":"Modalità di visualizzazione","show_time_remaining":"Mostra tempo rimanente","show_percentage":"Mostra percentuale","entity_not_found":"Entità non trovata","tap_action":"Tocca Azione","hold_action":"Mantieni Azione","double_tap_action":"Azione doppio tocco"},"ja":{"washer_program":"ウォッシャープログラム","program_placeholder":"プログラムの選択","duration":"間隔","minutes":"分","time_remaining":"残り時間","no_prediction":"予測なし","cycle_in_progress":"進行中のサイクル","status":"状態","progress":"進捗","select_program":"プログラムを選択して詳細を表示します","title":"タイトル","status_entity":"ステータスエンティティ","icon":"アイコン","active_color":"アクティブなアイコンの色","show_state":"状態を表示","show_program":"ショープログラム","show_details":"詳細を表示","spin_icon":"回転アイコン(走行中)","program_entity":"プログラムエンティティ","pct_entity":"進行状況エンティティ (オプション)","time_entity":"時間エンティティ (オプション)","display_mode":"表示モード","show_time_remaining":"残りの上映時間","show_percentage":"パーセンテージを表示","entity_not_found":"エンティティが見つかりません","tap_action":"タップアクション","hold_action":"ホールドアクション","double_tap_action":"ダブルタップアクション"},"ko":{"washer_program":"세탁기 프로그램","program_placeholder":"프로그램 선택","duration":"지속","minutes":"분","time_remaining":"남은 시간","no_prediction":"예측 없음","cycle_in_progress":"사이클 진행 중","status":"상태","progress":"진전","select_program":"세부정보를 보려면 프로그램을 선택하세요.","title":"제목","status_entity":"상태 엔터티","icon":"상","active_color":"활성 아이콘 색상","show_state":"상태 표시","show_program":"쇼 프로그램","show_details":"세부정보 표시","spin_icon":"회전 아이콘(실행 중)","program_entity":"프로그램 엔터티","pct_entity":"진행 엔터티(선택 사항)","time_entity":"시간 엔터티(선택 사항)","display_mode":"디스플레이 모드","show_time_remaining":"남은 시간 표시","show_percentage":"백분율 표시","entity_not_found":"엔터티를 찾을 수 없습니다.","tap_action":"탭 동작","hold_action":"보류 조치","double_tap_action":"더블 탭 액션"},"lt":{"washer_program":"Skalbimo programa","program_placeholder":"Pasirinkite Programa","duration":"Trukmė","minutes":"min","time_remaining":"Likęs laikas","no_prediction":"Jokios prognozės","cycle_in_progress":"Vyksta ciklas","status":"Būsena","progress":"Pažanga","select_program":"Norėdami pamatyti išsamią informaciją, pasirinkite programą","title":"Pavadinimas","status_entity":"Būsenos subjektas","icon":"Piktograma","active_color":"Aktyvios piktogramos spalva","show_state":"Rodyti būseną","show_program":"Rodyti programą","show_details":"Rodyti išsamią informaciją","spin_icon":"Sukimo piktograma (bėgant)","program_entity":"Programos subjektas","pct_entity":"Pažangos subjektas (neprivaloma)","time_entity":"Laiko objektas (neprivaloma)","display_mode":"Ekrano režimas","show_time_remaining":"Rodyti likusį laiką","show_percentage":"Rodyti procentą","entity_not_found":"Subjektas nerastas","tap_action":"Bakstelėkite Veiksmas","hold_action":"Laikyti veiksmą","double_tap_action":"Dukart bakstelėkite veiksmas"},"lv":{"washer_program":"Mazgāšanas programma","program_placeholder":"Atlasiet Programma","duration":"Ilgums","minutes":"min","time_remaining":"Atlikušais laiks","no_prediction":"Nav prognožu","cycle_in_progress":"Notiek cikls","status":"Statuss","progress":"Progress","select_program":"Izvēlieties programmu, lai skatītu detalizētu informāciju","title":"Nosaukums","status_entity":"Statusa entītija","icon":"Ikona","active_color":"Aktīvās ikonas krāsa","show_state":"Rādīt stāvokli","show_program":"Rādīt programmu","show_details":"Rādīt detaļas","spin_icon":"Griešanās ikona (skrienot)","program_entity":"Programmas entītija","pct_entity":"Progresa entītija (neobligāti)","time_entity":"Laika entītija (neobligāti)","display_mode":"Displeja režīms","show_time_remaining":"Rādīt atlikušo laiku","show_percentage":"Rādīt procentus","entity_not_found":"Entītija nav atrasta","tap_action":"Pieskarieties darbībai","hold_action":"Aizturēt darbību","double_tap_action":"Dubultskāriena darbība"},"mk":{"washer_program":"Програма за перење","program_placeholder":"Изберете Програма","duration":"Времетраење","minutes":"мин","time_remaining":"Преостанато време","no_prediction":"Без предвидување","cycle_in_progress":"Циклус во тек","status":"Статус","progress":"Напредок","select_program":"Изберете програма за да видите детали","title":"Наслов","status_entity":"Статусен ентитет","icon":"Икона","active_color":"Активна боја на иконата","show_state":"Прикажи држава","show_program":"Прикажи програма","show_details":"Прикажи детали","spin_icon":"Икона за вртење (додека работи)","program_entity":"Програмски ентитет","pct_entity":"Ентитет за напредок (изборно)","time_entity":"Временски ентитет (изборно)","display_mode":"Режим на прикажување","show_time_remaining":"Прикажи преостанатото време","show_percentage":"Прикажи процент","entity_not_found":"Субјектот не е пронајден","tap_action":"Допрете Акција","hold_action":"Држете акција","double_tap_action":"Акција со двоен допир"},"nb":{"washer_program":"Vaskeprogram","program_placeholder":"Velg Program","duration":"Varighet","minutes":"min","time_remaining":"Gjenstående tid","no_prediction":"Ingen prediksjon","cycle_in_progress":"Syklus pågår","status":"Status","progress":"Framgang","select_program":"Velg et program for å se detaljer","title":"Tittel","status_entity":"Status Entitet","icon":"Ikon","active_color":"Aktiv ikonfarge","show_state":"Vis tilstand","show_program":"Vis program","show_details":"Vis detaljer","spin_icon":"Spinning-ikon (mens du løper)","program_entity":"Program Entitet","pct_entity":"Fremdriftsenhet (valgfritt)","time_entity":"Tidsenhet (valgfritt)","display_mode":"Visningsmodus","show_time_remaining":"Vis gjenværende tid","show_percentage":"Vis prosentandel","entity_not_found":"Enheten ble ikke funnet","tap_action":"Trykk på Handling","hold_action":"Hold handling","double_tap_action":"Dobbelttrykk på handling"},"nl":{"washer_program":"Wasprogramma","program_placeholder":"Selecteer Programma","duration":"Duur","minutes":"min","time_remaining":"Resterende tijd","no_prediction":"Geen voorspelling","cycle_in_progress":"Cyclus in uitvoering","status":"Status","progress":"Voortgang","select_program":"Selecteer een programma om details te bekijken","title":"Titel","status_entity":"Statusentiteit","icon":"Icon","active_color":"Actieve pictogramkleur","show_state":"Toon staat","show_program":"Programma weergeven","show_details":"Details tonen","spin_icon":"Draaiend pictogram (tijdens hardlopen)","program_entity":"Programma-entiteit","pct_entity":"Voortgangsentiteit (optioneel)","time_entity":"Tijdsentiteit (optioneel)","display_mode":"Weergavemodus","show_time_remaining":"Resterende tijd weergeven","show_percentage":"Percentage weergeven","entity_not_found":"Entiteit niet gevonden","tap_action":"Tik op Actie","hold_action":"Actie vasthouden","double_tap_action":"Dubbeltikactie"},"pl":{"washer_program":"Program prania","program_placeholder":"Wybierz Program","duration":"Czas trwania","minutes":"min","time_remaining":"Pozostały czas","no_prediction":"Brak przewidywania","cycle_in_progress":"Cykl w toku","status":"Status","progress":"Postęp","select_program":"Wybierz program, aby zobaczyć szczegóły","title":"Tytuł","status_entity":"Jednostka statusowa","icon":"Ikona","active_color":"Aktywny kolor ikony","show_state":"Pokaż stan","show_program":"Pokaż program","show_details":"Pokaż szczegóły","spin_icon":"Ikona obracania się (podczas biegu)","program_entity":"Jednostka programu","pct_entity":"Jednostka postępu (opcjonalnie)","time_entity":"Jednostka czasu (opcjonalnie)","display_mode":"Tryb wyświetlania","show_time_remaining":"Pokaż pozostały czas","show_percentage":"Pokaż procent","entity_not_found":"Nie znaleziono elementu","tap_action":"Kliknij Akcja","hold_action":"Wstrzymaj akcję","double_tap_action":"Akcja podwójnego dotknięcia"},"pt":{"washer_program":"Programa de lavadora","program_placeholder":"Selecione o programa","duration":"Duração","minutes":"min","time_remaining":"Tempo restante","no_prediction":"Sem previsão","cycle_in_progress":"Ciclo em andamento","status":"Status","progress":"Progresso","select_program":"Selecione um programa para ver detalhes","title":"Título","status_entity":"Entidade de status","icon":"Ícone","active_color":"Cor do ícone ativo","show_state":"Mostrar estado","show_program":"Mostrar programa","show_details":"Mostrar detalhes","spin_icon":"Ícone giratório (durante a execução)","program_entity":"Entidade do Programa","pct_entity":"Entidade de progresso (opcional)","time_entity":"Entidade de tempo (opcional)","display_mode":"Modo de exibição","show_time_remaining":"Mostrar tempo restante","show_percentage":"Mostrar porcentagem","entity_not_found":"Entidade não encontrada","tap_action":"Toque em Ação","hold_action":"Manter ação","double_tap_action":"Ação de toque duplo"},"pt-BR":{"washer_program":"Programa de lavadora","program_placeholder":"Selecione o programa","duration":"Duração","minutes":"min","time_remaining":"Tempo restante","no_prediction":"Sem previsão","cycle_in_progress":"Ciclo em andamento","status":"Status","progress":"Progresso","select_program":"Selecione um programa para ver detalhes","title":"Título","status_entity":"Entidade de status","icon":"Ícone","active_color":"Cor do ícone ativo","show_state":"Mostrar estado","show_program":"Mostrar programa","show_details":"Mostrar detalhes","spin_icon":"Ícone giratório (durante a execução)","program_entity":"Entidade do Programa","pct_entity":"Entidade de progresso (opcional)","time_entity":"Entidade de tempo (opcional)","display_mode":"Modo de exibição","show_time_remaining":"Mostrar tempo restante","show_percentage":"Mostrar porcentagem","entity_not_found":"Entidade não encontrada","tap_action":"Toque em Ação","hold_action":"Manter ação","double_tap_action":"Ação de toque duplo"},"ro":{"washer_program":"Program de spălat","program_placeholder":"Selectați Program","duration":"Durată","minutes":"min","time_remaining":"Timp rămas","no_prediction":"Fără predicție","cycle_in_progress":"Ciclu în curs","status":"Stare","progress":"Progres","select_program":"Selectați un program pentru a vedea detalii","title":"Titlu","status_entity":"Entitate de stare","icon":"Pictogramă","active_color":"Culoarea pictogramei active","show_state":"Arată stare","show_program":"Arată programul","show_details":"Afișați detalii","spin_icon":"Pictogramă care se învârte (în timpul alergării)","program_entity":"Entitatea de program","pct_entity":"Entitate de progres (opțional)","time_entity":"Entitate oră (Opțional)","display_mode":"Modul de afișare","show_time_remaining":"Arată timpul rămas","show_percentage":"Arată procentul","entity_not_found":"Entitatea nu a fost găsită","tap_action":"Atingeți Acțiune","hold_action":"Țineți Acțiune","double_tap_action":"Atingeți de două ori Acțiune"},"ru":{"washer_program":"Программа стирки","program_placeholder":"Выберите программу","duration":"Продолжительность","minutes":"мин","time_remaining":"Оставшееся время","no_prediction":"Нет прогноза","cycle_in_progress":"Цикл в процессе","status":"Статус","progress":"Прогресс","select_program":"Выберите программу, чтобы увидеть подробности","title":"Заголовок","status_entity":"Статус объекта","icon":"Икона","active_color":"Цвет активного значка","show_state":"Показать состояние","show_program":"Шоу-программа","show_details":"Показать детали","spin_icon":"Вращающийся значок (во время бега)","program_entity":"Программный объект","pct_entity":"Сущность прогресса (необязательно)","time_entity":"Сущность времени (необязательно)","display_mode":"Режим отображения","show_time_remaining":"Показать оставшееся время","show_percentage":"Показать процент","entity_not_found":"Объект не найден","tap_action":"Нажмите «Действие».","hold_action":"Удерживать действие","double_tap_action":"Двойное нажатие"},"sk":{"washer_program":"Program práčky","program_placeholder":"Vyberte položku Program","duration":"Trvanie","minutes":"min","time_remaining":"Zostávajúci čas","no_prediction":"Žiadna predpoveď","cycle_in_progress":"Prebiehajúci cyklus","status":"Stav","progress":"Pokrok","select_program":"Ak chcete zobraziť podrobnosti, vyberte program","title":"Názov","status_entity":"Stavová entita","icon":"Ikona","active_color":"Farba aktívnej ikony","show_state":"Zobraziť stav","show_program":"Zobraziť program","show_details":"Zobraziť podrobnosti","spin_icon":"Ikona otáčania (pri behu)","program_entity":"Programová entita","pct_entity":"Entita pokroku (voliteľné)","time_entity":"Časová entita (voliteľné)","display_mode":"Režim zobrazenia","show_time_remaining":"Zobraziť zostávajúci čas","show_percentage":"Zobraziť percento","entity_not_found":"Entita sa nenašla","tap_action":"Klepnite na položku Akcia","hold_action":"Hold Action","double_tap_action":"Akcia dvojitého klepnutia"},"sl":{"washer_program":"Program za pranje","program_placeholder":"Izberite Program","duration":"Trajanje","minutes":"min","time_remaining":"Preostali čas","no_prediction":"Brez napovedi","cycle_in_progress":"Cikel v teku","status":"Stanje","progress":"Napredek","select_program":"Za ogled podrobnosti izberite program","title":"Naslov","status_entity":"Statusna entiteta","icon":"Ikona","active_color":"Barva aktivne ikone","show_state":"Prikaži stanje","show_program":"Show Program","show_details":"Pokaži podrobnosti","spin_icon":"Vrteča se ikona (med tekom)","program_entity":"Programska entiteta","pct_entity":"Entiteta napredka (neobvezno)","time_entity":"Časovna entiteta (neobvezno)","display_mode":"Način prikaza","show_time_remaining":"Prikaži preostali čas","show_percentage":"Pokaži odstotek","entity_not_found":"Entiteta ni najdena","tap_action":"Tapnite Dejanje","hold_action":"Zadrži akcijo","double_tap_action":"Dejanje dvojnega dotika"},"sq":{"washer_program":"Programi i larës","program_placeholder":"Zgjidhni Programin","duration":"Kohëzgjatja","minutes":"min","time_remaining":"Koha e mbetur","no_prediction":"Asnjë Parashikim","cycle_in_progress":"Cikli në vazhdim","status":"Statusi","progress":"Përparim","select_program":"Zgjidhni një program për të parë detajet","title":"Titulli","status_entity":"Entiteti i statusit","icon":"Ikona","active_color":"Ngjyra e ikonës aktive","show_state":"Trego shtetin","show_program":"Shfaq programin","show_details":"Shfaq Detajet","spin_icon":"Ikona rrotulluese (Gjatë funksionimit)","program_entity":"Subjekti i programit","pct_entity":"Entiteti i progresit (opsionale)","time_entity":"Entiteti i kohës (opsionale)","display_mode":"Modaliteti i shfaqjes","show_time_remaining":"Shfaq kohën e mbetur","show_percentage":"Shfaq përqindjen","entity_not_found":"Subjekti nuk u gjet","tap_action":"Prekni Veprim","hold_action":"Mbajeni veprimin","double_tap_action":"Veprimi i prekjes së dyfishtë"},"sr-Latn":{"washer_program":"Program pranja","program_placeholder":"Izaberi program","duration":"Trajanje","minutes":"min","time_remaining":"Preostalo vreme","no_prediction":"Nema procene","cycle_in_progress":"Ciklus je u toku","status":"Status","progress":"Napredak","select_program":"Izaberite program da vidite detalje","title":"Naslov","status_entity":"Entitet statusa","icon":"Ikona","active_color":"Boja aktivne ikone","show_state":"Prikaži stanje","show_program":"Prikaži program","show_details":"Prikaži detalje","spin_icon":"Rotirajuća ikona (dok radi)","program_entity":"Entitet programa","pct_entity":"Entitet napretka (opciono)","time_entity":"Entitet vremena (opciono)","display_mode":"Režim prikaza","show_time_remaining":"Prikaži preostalo vreme","show_percentage":"Prikaži procenat","entity_not_found":"Entitet nije pronađen","tap_action":"Radnja na dodir","hold_action":"Radnja na zadržavanje","double_tap_action":"Radnja na dvostruki dodir"},"sv":{"washer_program":"Tvättprogram","program_placeholder":"Välj Program","duration":"Varaktighet","minutes":"min","time_remaining":"Återstående tid","no_prediction":"Ingen förutsägelse","cycle_in_progress":"Cykel pågår","status":"Status","progress":"Framsteg","select_program":"Välj ett program för att se detaljer","title":"Titel","status_entity":"Status Entitet","icon":"Ikon","active_color":"Aktiv ikonfärg","show_state":"Visa tillstånd","show_program":"Visa program","show_details":"Visa detaljer","spin_icon":"Spinning-ikon (medan du springer)","program_entity":"Program Entitet","pct_entity":"Progress Entity (valfritt)","time_entity":"Tidsenhet (valfritt)","display_mode":"Visningsläge","show_time_remaining":"Visa återstående tid","show_percentage":"Visa procent","entity_not_found":"Enheten hittades inte","tap_action":"Tryck på Åtgärd","hold_action":"Håll Action","double_tap_action":"Dubbeltrycksåtgärd"},"tr":{"washer_program":"Yıkama Programı","program_placeholder":"Program Seç","duration":"Süre","minutes":"dk.","time_remaining":"Kalan Süre","no_prediction":"Tahmin Yok","cycle_in_progress":"Döngü devam ediyor","status":"Durum","progress":"İlerlemek","select_program":"Ayrıntıları görmek için bir program seçin","title":"Başlık","status_entity":"Durum Varlığı","icon":"Simge","active_color":"Etkin Simge Rengi","show_state":"Durumu Göster","show_program":"Programı Göster","show_details":"Ayrıntıları Göster","spin_icon":"Dönen Simge (Koşarken)","program_entity":"Program Varlığı","pct_entity":"İlerleme Varlığı (İsteğe bağlı)","time_entity":"Zaman Varlığı (İsteğe Bağlı)","display_mode":"Ekran Modu","show_time_remaining":"Kalan Süreyi Göster","show_percentage":"Yüzdeyi Göster","entity_not_found":"Varlık bulunamadı","tap_action":"Eylem'e dokunun","hold_action":"Eylemi Beklet","double_tap_action":"Çift Dokunma Eylemi"},"uk":{"washer_program":"Програма прання","program_placeholder":"Виберіть програму","duration":"Тривалість","minutes":"хв","time_remaining":"Час, що залишився","no_prediction":"Без передбачення","cycle_in_progress":"Цикл триває","status":"Статус","progress":"Прогрес","select_program":"Виберіть програму, щоб переглянути деталі","title":"Назва","status_entity":"Status Entity","icon":"значок","active_color":"Активний колір значка","show_state":"Показати стан","show_program":"Шоу програма","show_details":"Показати деталі","spin_icon":"Піктограма обертання (під час бігу)","program_entity":"Програмна сутність","pct_entity":"Сутність прогресу (необов'язково)","time_entity":"Сутність часу (необов’язково)","display_mode":"Режим відображення","show_time_remaining":"Показати час, що залишився","show_percentage":"Показати відсоток","entity_not_found":"Об'єкт не знайдено","tap_action":"Натисніть Дія","hold_action":"Дія утримання","double_tap_action":"Подвійне торкання"},"zh-Hans":{"washer_program":"清洗程序","program_placeholder":"选择节目","duration":"期间","minutes":"分钟","time_remaining":"剩余时间","no_prediction":"没有预测","cycle_in_progress":"循环正在进行中","status":"地位","progress":"进步","select_program":"选择一个程序以查看详细信息","title":"标题","status_entity":"状态实体","icon":"图标","active_color":"活动图标颜色","show_state":"显示状态","show_program":"演出节目","show_details":"显示详情","spin_icon":"旋转图标(运行时)","program_entity":"程序实体","pct_entity":"进度实体(可选)","time_entity":"时间实体(可选)","display_mode":"显示模式","show_time_remaining":"显示剩余时间","show_percentage":"显示百分比","entity_not_found":"未找到实体","tap_action":"点击操作","hold_action":"保持行动","double_tap_action":"双击操作"}}; +// Sibling entities of a WashData device are resolved from the device registry by +// their stable translation_key (which never changes even if the user renames the +// entity), so pointing the card at any one entity auto-wires all the rest. +const ROLE_TKEYS = { + state: "washer_state", + program: "washer_program", + time: "time_remaining", + progress: "cycle_progress", + power: "current_power", + energy: "energy_total", + phase: "current_phase", +}; +const BUTTON_TKEYS = { + pause: "pause_cycle", + resume: "resume_cycle", + terminate: "force_end_cycle", + record_start: "record_start", + record_stop: "record_stop", +}; +const BUTTON_ICONS = { + pause: "mdi:pause", + resume: "mdi:play", + terminate: "mdi:stop", + record_start: "mdi:record-circle-outline", + record_stop: "mdi:stop-circle-outline", + open_panel: "mdi:open-in-new", +}; +const BUTTON_ORDER = ["pause", "resume", "terminate", "record_start", "record_stop", "program", "open_panel"]; + +const ACTIVE_STATES = ["running", "paused", "user_paused", "ending", "starting", "anti_wrinkle", "rinse"]; +const INACTIVE_STATES = ["off", "unknown", "unavailable", "idle"]; +const SPARK_MAX_POINTS = 60; + +// ── Shared, module-level resource caches ──────────────────────────────────── +// One WebSocket round-trip per HA connection for the shared display constants +// (STATE_COLORS is the single source of truth in const.py), and one fetch per +// language for the panel translation dictionaries the card reuses for its own +// chrome. Both are shared across every card instance on the page. +const _constantsCache = new WeakMap(); // hass.connection -> Promise<{stateColors}> +function loadConstants(hass) { + const conn = hass && hass.connection; + if (!conn) return Promise.resolve({ stateColors: {} }); + if (_constantsCache.has(conn)) return _constantsCache.get(conn); + const p = hass + .callWS({ type: DOMAIN + "/get_constants" }) + .then((c) => ({ stateColors: (c && c.state_colors) || {} })) + .catch(() => ({ stateColors: {} })); + _constantsCache.set(conn, p); + return p; +} + +const _panelTrans = {}; // lang -> dict +const _panelTransPending = {}; // lang -> Promise +function _panelTransUrl(lang) { + return "/" + DOMAIN + "/panel-translations/" + encodeURIComponent(lang) + ".json"; +} +async function _fetchPanelLang(lang) { + if (!lang) return null; + const candidates = [lang]; + const dash = lang.indexOf("-"); + if (dash > 0) candidates.push(lang.slice(0, dash)); + for (const cand of candidates) { + try { + const r = await fetch(_panelTransUrl(cand)); + if (r.ok) { + const j = await r.json(); + if (j && typeof j === "object") return j; + } + } catch (_) { + /* try next candidate */ + } + } + return null; +} +async function loadPanelLang(lang) { + if (!lang || _panelTrans[lang]) return; + if (_panelTransPending[lang]) { + await _panelTransPending[lang]; + return; + } + const p = _fetchPanelLang(lang).then((d) => { + if (d) _panelTrans[lang] = d; + }); + _panelTransPending[lang] = p; + await p; +} class WashDataCard extends HTMLElement { - _resolveLanguage() { - const raw = - (this._hass && this._hass.locale && this._hass.locale.language) || - (this._hass && this._hass.language) || - "en"; - if (!raw || typeof raw !== "string") return "en"; - return raw; + constructor() { + super(); + this.attachShadow({ mode: "open" }); + this._cfg = null; + this._hass = null; + this._builtSig = null; // structure signature the current shell was built for + this._constantsLoaded = false; + this._langEnsured = ""; + this._constants = null; + // Rolling in-memory buffer of {t, w} power samples for the live sparkline. + this._spark = []; + this._sparkState = null; + // Gesture state for tap / hold / double-tap recognition. + this._holdTimer = null; + this._holdTriggered = false; + this._tapTimer = null; + this._lastTapTime = 0; + this._pointerStart = null; + this._pointerCanceled = false; + this._onPointerDown = this._onPointerDown.bind(this); + this._onPointerMove = this._onPointerMove.bind(this); + this._onPointerUp = this._onPointerUp.bind(this); + this._onPointerCancel = this._onPointerCancel.bind(this); } static getStubConfig() { return { entity: "sensor.washing_machine_state", - title: "Washing Machine", - icon: "mdi:washing-machine", - display_mode: "time", - active_color: [33, 150, 243], - show_state: true, - show_program: true, - show_details: true, - spin_icon: true, + layout: "tile", tap_action: { action: "more-info" }, hold_action: { action: "none" }, - double_tap_action: { action: "none" } + double_tap_action: { action: "none" }, }; } @@ -56,31 +151,82 @@ class WashDataCard extends HTMLElement { return document.createElement(EDITOR_TAG); } - _getTranslation(key) { - const lang = this._resolveLanguage(); - const baseLang = lang.split("-")[0]; - const translations = TRANSLATIONS[lang] || TRANSLATIONS[baseLang] || TRANSLATIONS["en"]; - return translations[key] || TRANSLATIONS["en"][key] || key; + setConfig(config) { + if (!config) throw new Error("Invalid configuration"); + const layout = config.layout || "tile"; + if (layout !== "glance" && !config.entity) { + throw new Error("Please define an entity"); + } + if (layout === "glance" && !(Array.isArray(config.entities) && config.entities.length) && !config.entity) { + throw new Error("Please define entities for the glance layout"); + } + this._cfg = { ...config, layout }; + // Rebuild the shell when the structural signature changes - not only on a + // layout switch, but also when the progress bar, sparkline, buttons, or the + // glance entity count change (HA reuses the element and re-calls setConfig on + // editor edits / Lovelace reloads). Otherwise the _update* helpers early-return + // because their elements don't exist and the new options only appear after a + // layout switch or page reload (removed entities also leave orphan glance rows). + if (this._builtSig !== this._structureSig()) { + this._builtSig = null; + if (this.shadowRoot) this.shadowRoot.innerHTML = ""; + } + this._render(); } - constructor() { - super(); - this.attachShadow({ mode: "open" }); - this._rendered = false; - // Gesture state for tap / hold / double-tap recognition. - this._holdTimer = null; - this._holdTriggered = false; - this._tapTimer = null; - this._lastTapTime = 0; - this._pointerStart = null; - this._onPointerDown = this._onPointerDown.bind(this); - this._onPointerMove = this._onPointerMove.bind(this); - this._onPointerUp = this._onPointerUp.bind(this); - this._onPointerCancel = this._onPointerCancel.bind(this); + // Signature of every config field that changes which elements the shell emits + // (see _buildTile/_buildDetail/_buildGlance). A change here forces a rebuild. + _structureSig() { + const c = this._cfg || {}; + const f = this._flags(); + const layout = c.layout || "tile"; + return [ + layout, + f.showBar ? "bar" : "", + f.showSparkline ? "spark" : "", + f.buttons.join("+"), + layout === "glance" ? String(this._glanceEntities().length) : "", + ].join("|"); + } + + set hass(hass) { + this._hass = hass; + this._ensureResources(); + this._render(); + } + + // Reserve enough vertical space for whatever the detail layout is showing, so + // the sections-view grid (which clips to the reserved rows) never cuts off the + // action buttons or the sparkline at the bottom of the card. + _detailRows() { + const f = this._flags(); + let rows = 2; // header + progress bar + meta chips (content-hugging card) + if (f.buttons.length) rows += 1; + if (f.showSparkline) rows += 1; + return rows; + } + + getCardSize() { + const layout = this._cfg && this._cfg.layout; + if (layout === "detail") return this._detailRows(); + if (layout === "glance") return this._glanceEntities().length || 1; + return 1; + } + + getGridOptions() { + const layout = this._cfg && this._cfg.layout; + if (layout === "detail") { + const rows = this._detailRows(); + return { rows, min_rows: rows, columns: 12, min_columns: 6 }; + } + if (layout === "glance") { + const n = Math.max(1, this._glanceEntities().length); + return { rows: n, min_rows: 1, columns: 12, min_columns: 6 }; + } + return { rows: 1, min_rows: 1, columns: 6, min_columns: 3 }; } disconnectedCallback() { - // Avoid stray actions firing after the card is removed from the DOM. this._clearHoldTimer(); if (this._tapTimer) { window.clearTimeout(this._tapTimer); @@ -88,23 +234,818 @@ class WashDataCard extends HTMLElement { } } - setConfig(config) { - if (!config.entity) { - throw new Error("Please define an entity"); - } - this._cfg = { ...WashDataCard.getStubConfig(), ...config }; - this._render(); + // ── Localization ────────────────────────────────────────────────────────── + _lang() { + const raw = + (this._hass && this._hass.locale && this._hass.locale.language) || + (this._hass && this._hass.language) || + "en"; + return typeof raw === "string" && raw ? raw : "en"; } - set hass(hass) { - this._hass = hass; + _tLookup(key, lang) { + const dict = _panelTrans[lang]; + if (!dict) return null; + const val = key.split(".").reduce((o, k) => (o && o[k] !== undefined ? o[k] : null), dict); + return val && typeof val === "string" ? val : null; + } + + _t(key, vars, fallback) { + const lang = this._lang(); + let s = (lang && this._tLookup(key, lang)) || this._tLookup(key, "en") || fallback || key; + if (vars) { + for (const [k, v] of Object.entries(vars)) { + s = s.replace(new RegExp("\\{" + k + "\\}", "g"), String(v)); + } + } + return s; + } + + _ensureResources() { + if (!this._hass) return; + const lang = this._lang(); + const needsConstants = !this._constantsLoaded; + const needsLang = lang !== this._langEnsured; + if (!needsConstants && !needsLang) return; + const tasks = []; + if (needsConstants) { + this._constantsLoaded = true; + tasks.push( + loadConstants(this._hass).then((c) => { this._constants = c; }), + loadPanelLang("en"), + ); + } + if (needsLang) { + this._langEnsured = lang; + if (lang && lang !== "en") tasks.push(loadPanelLang(lang)); + } + Promise.all(tasks) + .then(() => this._update()) + .catch(() => { + /* card degrades gracefully to English fallbacks + theme colors */ + }); + } + + // ── Entity discovery ────────────────────────────────────────────────────── + _resolveRoles(primaryEntity) { + const hass = this._hass; + const cfg = this._cfg || {}; + const reg = (hass && hass.entities) || {}; + const primary = primaryEntity || cfg.entity; + const primaryReg = reg[primary]; + const deviceId = cfg.device_id || (primaryReg && primaryReg.device_id) || null; + + const roles = { state: primary }; + const buttons = {}; + let selectEntity = null; + + if (deviceId) { + for (const [eid, ent] of Object.entries(reg)) { + if (!ent || ent.device_id !== deviceId) continue; + if (ent.platform && ent.platform !== DOMAIN) continue; + const tk = ent.translation_key; + // Display roles are always sensors; restrict the match so a like-named + // entity in another domain can never hijack a display role. + if (eid.startsWith("sensor.")) { + for (const [role, want] of Object.entries(ROLE_TKEYS)) { + if (tk === want && !roles[role]) roles[role] = eid; + } + } + for (const [btn, want] of Object.entries(BUTTON_TKEYS)) { + if (tk === want && !buttons[btn]) buttons[btn] = eid; + } + if (!selectEntity && eid.startsWith("select.")) selectEntity = eid; + } + } + + // Legacy explicit overrides always win over auto-discovery. + if (cfg.program_entity) roles.program = cfg.program_entity; + if (cfg.time_entity) roles.time = cfg.time_entity; + if (cfg.pct_entity) roles.progress = cfg.pct_entity; + if (cfg.power_entity) roles.power = cfg.power_entity; + if (cfg.energy_entity) roles.energy = cfg.energy_entity; + if (cfg.phase_entity) roles.phase = cfg.phase_entity; + + // Suffix fallback for the common case where the primary is the state sensor + // but the registry lookup came up empty (e.g. template entity, no device). + if (!roles.time || !roles.progress || !roles.program) { + const m = /^sensor\.(.+)_state$/.exec(primary); + if (m) { + const base = "sensor." + m[1] + "_"; + const st = hass && hass.states; + const guess = (suffix) => (st && st[base + suffix] ? base + suffix : null); + roles.time = roles.time || guess("time_remaining"); + roles.progress = roles.progress || guess("cycle_progress"); + roles.program = roles.program || guess("program"); + } + } + + roles._buttons = buttons; + roles._select = selectEntity; + roles._deviceId = deviceId; + return roles; + } + + // ── View model ──────────────────────────────────────────────────────────── + _fmtState(stateObj) { + if (!stateObj) return ""; + const hass = this._hass; + if (hass && typeof hass.formatEntityState === "function") { + try { + return hass.formatEntityState(stateObj); + } catch (_) { + /* fall through */ + } + } + const s = stateObj.state || ""; + return s ? s.charAt(0).toUpperCase() + s.slice(1) : s; + } + + _vm(roles) { + const hass = this._hass; + const cfg = this._cfg; + const states = hass.states; + const stateObj = states[roles.state]; + if (!stateObj) { + return { missing: true, missingEntity: roles.state }; + } + + const sk = String(stateObj.state || "").toLowerCase(); + const isInactive = INACTIVE_STATES.includes(sk); + const isActive = ACTIVE_STATES.includes(sk); + const attr = stateObj.attributes || {}; + + // Program: prefer the dedicated program entity, then the state sensor's guess. + let program = ""; + const progObj = roles.program ? states[roles.program] : null; + if (progObj) { + const pv = String(progObj.state || "").toLowerCase(); + if (!["unknown", "none", "off", "unavailable", ""].includes(pv)) program = this._fmtState(progObj); + } + if (!program && attr.current_program_guess) { + const pv = String(attr.current_program_guess).toLowerCase(); + if (!["unknown", "none", "off", "unavailable"].includes(pv)) program = attr.current_program_guess; + } + + // Phase: dedicated phase entity, else the program sensor's active_phase attr. + let phase = ""; + const phaseObj = roles.phase ? states[roles.phase] : null; + if (phaseObj) { + const pv = String(phaseObj.state || "").toLowerCase(); + if (!["unknown", "none", "off", "unavailable", ""].includes(pv)) phase = this._fmtState(phaseObj); + } + if (!phase && progObj && progObj.attributes && progObj.attributes.active_phase) { + phase = progObj.attributes.active_phase; + } + + // Sub-state (e.g. "Running (Rinsing)" -> "Rinsing"). + let subState = ""; + if (sk === "running" && attr.sub_state) { + const m = String(attr.sub_state).match(/Running \((.*)\)/); + subState = m && m[1] ? m[1] : attr.sub_state; + } + + // Progress percentage. + let pct = null; + const pctObj = roles.progress ? states[roles.progress] : null; + if (pctObj && !isNaN(parseFloat(pctObj.state))) { + pct = Math.max(0, Math.min(100, Math.round(parseFloat(pctObj.state)))); + } + + // Remaining time (respects the entity's Display Precision + unit, #354). + let timeText = ""; + const timeObj = roles.time ? states[roles.time] : null; + if (timeObj && !INACTIVE_STATES.includes(String(timeObj.state).toLowerCase())) { + if (hass && typeof hass.formatEntityState === "function") { + timeText = this._fmtState(timeObj); + } else if (!isNaN(parseFloat(timeObj.state))) { + timeText = timeObj.state + " " + this._t("card.min", null, "min"); + } else { + timeText = timeObj.state; + } + } + + // Projected energy + cost (live on the progress entity while running). + let energyText = ""; + let costText = ""; + if (pctObj && pctObj.attributes) { + const kwh = pctObj.attributes.projected_energy_kwh; + if (kwh !== undefined && kwh !== null) energyText = kwh + " kWh"; + const cost = pctObj.attributes.projected_cost; + if (cost !== undefined && cost !== null) costText = this._fmtCost(cost); + } + + // Current power. + let powerW = null; + const powerObj = roles.power ? states[roles.power] : null; + if (powerObj && !isNaN(parseFloat(powerObj.state))) powerW = parseFloat(powerObj.state); + + // Overrun / anomaly (visible-only; never a notification). + let anomaly = null; + if (attr.cycle_anomaly && attr.cycle_anomaly !== "none") { + anomaly = { kind: attr.cycle_anomaly, ratio: attr.overrun_ratio }; + } + + const color = this._stateColor(sk, isActive, cfg.active_color); + + return { + missing: false, + sk, + stateObj, + isInactive, + isActive, + isRunning: sk === "running", + stateLabel: this._fmtState(stateObj), + color, + program, + phase, + subState, + pct, + timeText, + energyText, + costText, + powerW, + anomaly, + buttons: roles._buttons || {}, + select: roles._select || null, + }; + } + + _fmtCost(cost) { + const hass = this._hass; + const currency = hass && hass.config && hass.config.currency; + if (currency) { + try { + return new Intl.NumberFormat(this._lang(), { style: "currency", currency }).format(Number(cost)); + } catch (_) { + /* fall through */ + } + } + return String(cost); + } + + _stateColor(sk, isActive, override) { + // Honour an explicit per-card override colour first (legacy active_color). + if (isActive && override) { + if (Array.isArray(override)) { + const [r, g, b] = override; + return { fg: "rgb(" + r + "," + g + "," + b + ")", bg: "rgba(" + r + "," + g + "," + b + ",0.2)" }; + } + return { fg: override, bg: "rgba(128,128,128,0.15)" }; + } + const colors = (this._constants && this._constants.stateColors) || {}; + const c = colors[sk]; + if (c) return { fg: c, bg: this._alpha(c, sk) }; + // Fallback to theme semantics when constants have not loaded yet. + if (INACTIVE_STATES.includes(sk)) { + return { fg: "var(--disabled-text-color, grey)", bg: "rgba(128,128,128,0.1)" }; + } + return { fg: "var(--primary-color)", bg: "rgba(var(--rgb-primary-color, 33,150,243),0.2)" }; + } + + _alpha(cssColor, sk) { + // The STATE_COLORS values are "var(--x, #hex)" strings; a translucent tint is + // built from the hex fallback so the icon chip reads on any theme. + const hex = /#([0-9a-fA-F]{6})/.exec(cssColor); + if (hex) { + const n = parseInt(hex[1], 16); + const r = (n >> 16) & 255; + const g = (n >> 8) & 255; + const b = n & 255; + return "rgba(" + r + "," + g + "," + b + ",0.18)"; + } + return INACTIVE_STATES.includes(sk) ? "rgba(128,128,128,0.1)" : "rgba(128,128,128,0.15)"; + } + + _deviceTypeIcon() { + const hass = this._hass; + const cfg = this._cfg; + if (cfg.icon) return cfg.icon; + const stateObj = hass && hass.states[cfg.entity]; + if (stateObj && stateObj.attributes && stateObj.attributes.icon) return stateObj.attributes.icon; + return "mdi:washing-machine"; + } + + _titleText() { + const cfg = this._cfg; + if (cfg.title) return cfg.title; + const hass = this._hass; + const reg = (hass && hass.entities) || {}; + const devices = (hass && hass.devices) || {}; + const ent = reg[cfg.entity]; + if (ent && ent.device_id && devices[ent.device_id]) { + const dev = devices[ent.device_id]; + const name = dev.name_by_user || dev.name; + if (name) return name; + } + const stateObj = hass && hass.states[cfg.entity]; + if (stateObj && stateObj.attributes && stateObj.attributes.friendly_name) { + return String(stateObj.attributes.friendly_name).replace(/ (State|Status)$/i, ""); + } + return "WashData"; + } + + _flags() { + const c = this._cfg || {}; + return { + showState: c.show_state !== false, + showProgram: c.show_program !== false, + showDetails: c.show_details !== false, // tile: show the time / percentage line + showBar: c.show_progress_bar !== false, + showPhase: c.show_phase !== false, + showEnergy: c.show_energy !== false, + showAnomaly: c.show_anomaly !== false, + showSparkline: !!c.show_sparkline, + displayMode: c.display_mode || "time", + buttons: Array.isArray(c.buttons) ? c.buttons.filter((b) => BUTTON_ORDER.includes(b)) : [], + }; + } + + // ── Rendering ───────────────────────────────────────────────────────────── + _render() { + if (!this.shadowRoot || !this._cfg) return; + const sig = this._structureSig(); + if (this._builtSig !== sig) { + this._build(this._cfg.layout || "tile"); + this._builtSig = sig; + } this._update(); } - getCardSize() { - return 1; + _baseStyle() { + return ( + ":host{display:block;height:100%}" + + "ha-card{padding:0;background:var(--ha-card-background,var(--card-background-color,white));" + + "border-radius:var(--ha-card-border-radius,12px);box-shadow:var(--ha-card-box-shadow,none);" + + "overflow:hidden;cursor:pointer;height:100%;box-sizing:border-box;" + + "border:var(--ha-card-border-width,1px) solid var(--ha-card-border-color,var(--divider-color))}" + + ".icon-container{border-radius:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0;" + + "transition:background-color .3s,color .3s;position:relative}" + + "ha-icon{--mdc-icon-size:24px}" + + ".primary{font-weight:500;color:var(--primary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.2}" + + ".secondary{color:var(--secondary-text-color);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;line-height:1.2}" + + ".bar{height:4px;border-radius:2px;background:var(--divider-color,rgba(128,128,128,.25));overflow:hidden}" + + ".bar>i{display:block;height:100%;width:0;border-radius:2px;transition:width .5s ease,background-color .3s}" + + ".chip{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:1px 8px;border-radius:10px;" + + "background:rgba(128,128,128,.14);color:var(--secondary-text-color);white-space:nowrap}" + + ".chip.warn{background:rgba(255,152,0,.16);color:var(--warning-color,#ff9800)}" + + ".acts{display:flex;gap:4px;align-items:center}" + + ".wd-act{border:none;background:rgba(128,128,128,.12);color:var(--primary-text-color);border-radius:10px;" + + "width:34px;height:34px;display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0}" + + ".wd-act:hover{background:rgba(128,128,128,.22)}" + + ".wd-act[disabled]{opacity:.35;pointer-events:none}" + + ".wd-act ha-icon{--mdc-icon-size:20px}" + + "select.wd-prog{max-width:150px;font:inherit;color:var(--primary-text-color);background:var(--secondary-background-color);" + + "border:1px solid var(--divider-color);border-radius:8px;padding:4px 6px}" + ); } + _build(layout) { + if (layout === "detail") return this._buildDetail(); + if (layout === "glance") return this._buildGlance(); + return this._buildTile(); + } + + _attachGestures(cardEl) { + cardEl.addEventListener("pointerdown", this._onPointerDown); + cardEl.addEventListener("pointermove", this._onPointerMove); + cardEl.addEventListener("pointerup", this._onPointerUp); + cardEl.addEventListener("pointercancel", this._onPointerCancel); + cardEl.addEventListener("pointerleave", this._onPointerCancel); + } + + _buildTile() { + const flags = this._flags(); + const style = this._baseStyle() + ".tile{display:flex;flex-direction:row;align-items:center;padding:8px 12px;gap:12px;width:100%;box-sizing:border-box}" + + ".tile .icon-container{width:40px;height:40px}" + + ".tile .info{display:flex;flex-direction:column;justify-content:center;overflow:hidden;flex:1;min-width:0}" + + ".tile .primary{font-size:14px}.tile .secondary{font-size:12px;margin-top:2px}" + + ".tile .bar{margin-top:6px}"; + this.shadowRoot.innerHTML = + "" + + '
' + + '
' + + '
' + + '
' + + (flags.showBar ? '
' : "") + + "
"; + this._attachGestures(this.shadowRoot.getElementById("card")); + } + + _buildDetail() { + const flags = this._flags(); + const style = this._baseStyle() + + // The detail card hugs its content (height:auto) so a short cycle does not + // leave a large empty gap; the sections grid reserves rows via getGridOptions. + "ha-card.wd-detail{height:auto}" + + ".detail{display:flex;flex-direction:column;gap:8px;padding:12px 14px;width:100%;box-sizing:border-box}" + + ".detail .top{display:flex;align-items:center;gap:12px}" + + ".detail .icon-container{width:48px;height:48px}.detail .icon-container ha-icon{--mdc-icon-size:30px}" + + ".detail .info{flex:1;min-width:0}" + + ".detail .primary{font-size:16px}.detail .secondary{font-size:13px;margin-top:2px}" + + ".detail .eta{text-align:right;flex-shrink:0}" + + ".detail .eta .big{font-size:22px;font-weight:600;color:var(--primary-text-color);line-height:1.1}" + + ".detail .eta .lbl{font-size:11px;color:var(--secondary-text-color);text-transform:uppercase;letter-spacing:.04em}" + + ".detail .bar{height:6px}" + + ".detail .meta{display:flex;flex-wrap:wrap;gap:6px;align-items:center}" + + ".detail .meta:empty{display:none}" + + ".detail canvas{width:100%;height:34px;display:block}"; + this.shadowRoot.innerHTML = + "" + + '
' + + '
' + + '
' + + '
' + + '
' + + "
" + + (flags.showBar ? '
' : "") + + '
' + + (flags.showSparkline ? '' : "") + + (flags.buttons.length ? '
' : "") + + "
"; + this._attachGestures(this.shadowRoot.getElementById("card")); + if (flags.buttons.length) this._buildButtons(this.shadowRoot.getElementById("acts"), flags.buttons); + } + + _buildButtons(container, buttons) { + if (!container) return; + container.innerHTML = ""; + for (const b of buttons) { + if (b === "program") { + const sel = document.createElement("select"); + sel.className = "wd-prog"; + sel.id = "prog-select"; + sel.addEventListener("click", (ev) => ev.stopPropagation()); + sel.addEventListener("pointerdown", (ev) => ev.stopPropagation()); + sel.addEventListener("change", (ev) => { + ev.stopPropagation(); + this._onProgramChange(ev.target.value); + }); + container.appendChild(sel); + continue; + } + const btn = document.createElement("button"); + btn.className = "wd-act"; + btn.dataset.btn = b; + btn.title = this._t("card.btn." + b, null, this._defaultBtnLabel(b)); + btn.addEventListener("pointerdown", (ev) => ev.stopPropagation()); + btn.addEventListener("pointerup", (ev) => ev.stopPropagation()); + btn.addEventListener("click", (ev) => { + ev.stopPropagation(); + this._onActionButton(b); + }); + const ic = document.createElement("ha-icon"); + ic.setAttribute("icon", BUTTON_ICONS[b] || "mdi:gesture-tap-button"); + btn.appendChild(ic); + container.appendChild(btn); + } + } + + _defaultBtnLabel(b) { + const map = { + pause: "Pause", + resume: "Resume", + terminate: "End cycle", + record_start: "Start recording", + record_stop: "Stop recording", + open_panel: "Open WashData", + }; + return map[b] || b; + } + + _buildGlance() { + const style = this._baseStyle() + + ".glance{display:flex;flex-direction:column;padding:6px 0}" + + ".row{display:flex;align-items:center;gap:12px;padding:8px 14px;cursor:pointer}" + + ".row:hover{background:rgba(128,128,128,.06)}" + + ".dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}" + + ".row .info{flex:1;min-width:0}.row .primary{font-size:14px}.row .secondary{font-size:12px;margin-top:1px}" + + ".row .rt{font-size:13px;color:var(--secondary-text-color);flex-shrink:0;text-align:right}"; + const rows = this._glanceEntities() + .map( + (_, i) => + '
' + + '
' + + '
' + ) + .join(""); + this.shadowRoot.innerHTML = "" + '
' + rows + "
"; + this.shadowRoot.querySelectorAll(".row").forEach((rowEl) => { + rowEl.addEventListener("click", () => { + const idx = parseInt(rowEl.dataset.idx, 10); + const ent = this._glanceEntities()[idx]; + if (ent) this._moreInfo(ent); + }); + }); + } + + _glanceEntities() { + const cfg = this._cfg || {}; + if (Array.isArray(cfg.entities) && cfg.entities.length) { + return cfg.entities.map((e) => (typeof e === "string" ? e : e && e.entity)).filter(Boolean); + } + return cfg.entity ? [cfg.entity] : []; + } + + _update() { + if (!this.shadowRoot || !this._hass || !this._cfg) return; + const layout = this._cfg.layout || "tile"; + if (layout === "glance") return this._updateGlance(); + const roles = this._resolveRoles(); + const vm = this._vm(roles); + if (layout === "detail") return this._updateDetail(vm); + return this._updateTile(vm); + } + + _applyIcon(vm) { + const iconEl = this.shadowRoot.getElementById("icon"); + const iconc = this.shadowRoot.getElementById("iconc"); + if (!iconEl || !iconc) return; + iconEl.setAttribute("icon", this._deviceTypeIcon()); + iconc.style.color = vm.color.fg; + iconc.style.background = vm.color.bg; + } + + _applyBar(vm) { + const fill = this.shadowRoot.getElementById("barfill"); + const bar = this.shadowRoot.getElementById("bar"); + if (!fill || !bar) return; + if (!vm.isActive || vm.pct === null) { + bar.style.visibility = "hidden"; + fill.style.width = "0%"; + return; + } + bar.style.visibility = "visible"; + fill.style.width = vm.pct + "%"; + fill.style.background = vm.color.fg; + } + + _updateTile(vm) { + const titleEl = this.shadowRoot.getElementById("title"); + const stateEl = this.shadowRoot.getElementById("state"); + if (vm.missing) { + if (titleEl) titleEl.textContent = this._t("card.entity_not_found", null, "Entity not found"); + if (stateEl) stateEl.textContent = vm.missingEntity || ""; + return; + } + titleEl.textContent = this._titleText(); + this._applyIcon(vm); + this._applyBar(vm); + + const flags = this._flags(); + const parts = []; + if (flags.showState) { + if (vm.isRunning) { + if (vm.subState) parts.push(vm.subState); + } else { + parts.push(vm.stateLabel); + } + } + if (flags.showProgram && vm.program) parts.push(vm.program); + if (!vm.isInactive && flags.showDetails) { + if (flags.displayMode === "percentage" && vm.pct !== null) parts.push(vm.pct + "%"); + else if (vm.timeText) parts.push(vm.timeText); + else if (vm.pct !== null) parts.push(vm.pct + "%"); + } + if (flags.showAnomaly && vm.anomaly) parts.push(this._t("card.running_long", null, "running long")); + stateEl.textContent = parts.join(" • "); + } + + _updateDetail(vm) { + const titleEl = this.shadowRoot.getElementById("title"); + const stateEl = this.shadowRoot.getElementById("state"); + const etaEl = this.shadowRoot.getElementById("eta"); + const etaLbl = this.shadowRoot.getElementById("etalbl"); + const etaWrap = this.shadowRoot.getElementById("etawrap"); + const meta = this.shadowRoot.getElementById("meta"); + if (vm.missing) { + if (titleEl) titleEl.textContent = this._t("card.entity_not_found", null, "Entity not found"); + if (stateEl) stateEl.textContent = vm.missingEntity || ""; + return; + } + titleEl.textContent = this._titleText(); + this._applyIcon(vm); + this._applyBar(vm); + + const flags = this._flags(); + // Header secondary line: state + program. + const sub = []; + if (flags.showState) sub.push(vm.isRunning && vm.subState ? vm.subState : vm.stateLabel); + if (flags.showProgram && vm.program) sub.push(vm.program); + stateEl.textContent = sub.join(" • "); + + // Big ETA (or percentage when running with no time). + if (etaWrap && etaEl && etaLbl) { + if (vm.isActive && vm.timeText) { + etaEl.textContent = vm.timeText; + etaLbl.textContent = this._t("card.remaining", null, "remaining"); + etaWrap.style.visibility = "visible"; + } else if (vm.isActive && vm.pct !== null) { + etaEl.textContent = vm.pct + "%"; + etaLbl.textContent = this._t("card.progress", null, "progress"); + etaWrap.style.visibility = "visible"; + } else { + etaWrap.style.visibility = "hidden"; + } + } + + // Meta chips. + if (meta) { + meta.innerHTML = ""; + const addChip = (text, warn) => { + if (!text) return; + const c = document.createElement("span"); + c.className = "chip" + (warn ? " warn" : ""); + c.textContent = text; + meta.appendChild(c); + }; + if (flags.showPhase && vm.phase && vm.isActive) addChip(vm.phase); + if (flags.showEnergy && vm.energyText) addChip(vm.energyText); + if (flags.showEnergy && vm.costText) addChip(vm.costText); + if (vm.isRunning && vm.powerW !== null) addChip(Math.round(vm.powerW) + " W"); + if (flags.showAnomaly && vm.anomaly) { + const ratio = vm.anomaly.ratio ? " (" + Math.round((vm.anomaly.ratio - 1) * 100) + "%)" : ""; + addChip(this._t("card.running_long", null, "Running long") + ratio, true); + } + } + + this._updateButtons(vm); + if (flags.showSparkline) this._updateSparkline(vm); + } + + _updateButtons(vm) { + const acts = this.shadowRoot.getElementById("acts"); + if (!acts) return; + const sk = vm.sk; + const enabled = { + pause: sk === "running", + resume: sk === "paused" || sk === "user_paused", + terminate: vm.isActive, + record_start: !vm.isActive, + record_stop: true, + open_panel: true, + }; + acts.querySelectorAll(".wd-act").forEach((btn) => { + const b = btn.dataset.btn; + const target = b === "open_panel" ? true : b === "program" ? true : vm.buttons[b]; + const ok = enabled[b] !== false && (b === "open_panel" || target); + if (ok) btn.removeAttribute("disabled"); + else btn.setAttribute("disabled", ""); + }); + const sel = this.shadowRoot.getElementById("prog-select"); + if (sel && vm.select) { + const selObj = this._hass.states[vm.select]; + const opts = (selObj && selObj.attributes && selObj.attributes.options) || []; + const cur = selObj && selObj.state; + const sig = opts.join("|"); + if (sel._sig !== sig) { + sel._sig = sig; + sel.innerHTML = ""; + for (const o of opts) { + const opt = document.createElement("option"); + opt.value = o; + opt.textContent = o; + sel.appendChild(opt); + } + } + if (cur !== undefined) sel.value = cur; + } else if (sel) { + sel.setAttribute("disabled", ""); + } + } + + _updateSparkline(vm) { + const canvas = this.shadowRoot.getElementById("spark"); + if (!canvas) return; + // Reset the buffer when a new cycle starts / the machine goes idle. + if (vm.sk !== this._sparkState) { + if (!vm.isActive) this._spark = []; + this._sparkState = vm.sk; + } + if (vm.isActive && vm.powerW !== null) { + const last = this._spark[this._spark.length - 1]; + const now = Date.now(); + if (!last || now - last.t > 2000) { + this._spark.push({ t: now, w: vm.powerW }); + if (this._spark.length > SPARK_MAX_POINTS) this._spark.shift(); + } + } + const pts = this._spark; + // Hide the canvas until there is a line to draw, so an early / idle cycle + // does not leave a blank 34px band above the buttons. + if (pts.length < 2) { + canvas.style.display = "none"; + return; + } + canvas.style.display = "block"; + const w = canvas.clientWidth || 300; + const h = 34; + if (canvas.width !== w) canvas.width = w; + if (canvas.height !== h) canvas.height = h; + const ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, w, h); + const max = Math.max.apply(null, pts.map((p) => p.w)) || 1; + const pad = 3; + const dx = (w - pad * 2) / (pts.length - 1); + ctx.beginPath(); + pts.forEach((p, i) => { + const x = pad + i * dx; + const y = h - pad - (p.w / max) * (h - pad * 2); + if (i === 0) ctx.moveTo(x, y); + else ctx.lineTo(x, y); + }); + ctx.strokeStyle = vm.color.fg; + ctx.lineWidth = 2; + ctx.lineJoin = "round"; + ctx.stroke(); + } + + _updateGlance() { + const entities = this._glanceEntities(); + const rows = this.shadowRoot.querySelectorAll(".row"); + entities.forEach((ent, i) => { + const rowEl = rows[i]; + if (!rowEl) return; + const roles = this._resolveRoles(ent); + const vm = this._vm(roles); + const dot = rowEl.querySelector("[data-dot]"); + const title = rowEl.querySelector("[data-title]"); + const sub = rowEl.querySelector("[data-sub]"); + const rt = rowEl.querySelector("[data-rt]"); + if (vm.missing) { + if (title) title.textContent = ent; + if (sub) sub.textContent = this._t("card.entity_not_found", null, "Entity not found"); + if (dot) dot.style.background = "var(--disabled-text-color, grey)"; + if (rt) rt.textContent = ""; + return; + } + if (dot) dot.style.background = vm.color.fg; + if (title) title.textContent = this._deviceNameFor(ent); + const parts = []; + if (vm.isRunning && vm.subState) parts.push(vm.subState); + else parts.push(vm.stateLabel); + if (vm.program) parts.push(vm.program); + if (sub) sub.textContent = parts.join(" • "); + if (rt) { + if (vm.isActive && vm.timeText) rt.textContent = vm.timeText; + else if (vm.isActive && vm.pct !== null) rt.textContent = vm.pct + "%"; + else rt.textContent = ""; + } + }); + } + + _deviceNameFor(entityId) { + const hass = this._hass; + const reg = (hass && hass.entities) || {}; + const devices = (hass && hass.devices) || {}; + const ent = reg[entityId]; + if (ent && ent.device_id && devices[ent.device_id]) { + const dev = devices[ent.device_id]; + const name = dev.name_by_user || dev.name; + if (name) return name; + } + const stateObj = hass && hass.states[entityId]; + if (stateObj && stateObj.attributes && stateObj.attributes.friendly_name) { + return String(stateObj.attributes.friendly_name).replace(/ (State|Status)$/i, ""); + } + return entityId; + } + + // ── Actions ─────────────────────────────────────────────────────────────── + _onActionButton(b) { + const hass = this._hass; + if (!hass) return; + if (b === "open_panel") { + this._navigate("/" + "ha-washdata"); + return; + } + const roles = this._resolveRoles(); + const entityId = roles._buttons && roles._buttons[b]; + if (!entityId) return; + this._fireHaptic("light"); + hass.callService("button", "press", { entity_id: entityId }); + } + + _onProgramChange(value) { + const hass = this._hass; + if (!hass || !value) return; + const roles = this._resolveRoles(); + const sel = roles._select; + if (!sel) return; + hass.callService("select", "select_option", { entity_id: sel, option: value }); + } + + _moreInfo(entityId) { + if (!entityId) return; + this.dispatchEvent(new CustomEvent("hass-more-info", { detail: { entityId }, bubbles: true, composed: true })); + } + + _navigate(path) { + window.history.pushState(null, "", path); + window.dispatchEvent(new CustomEvent("location-changed", { detail: { replace: false } })); + } + + // ── Gesture handling (tap / hold / double-tap) ────────────────────────────── _clearHoldTimer() { if (this._holdTimer) { window.clearTimeout(this._holdTimer); @@ -113,12 +1054,10 @@ class WashDataCard extends HTMLElement { } _onPointerDown(ev) { - // Only react to the primary pointer (left mouse button / touch / pen). if (ev.button !== undefined && ev.button !== 0) return; this._holdTriggered = false; this._pointerCanceled = false; this._pointerStart = { x: ev.clientX, y: ev.clientY }; - const holdCfg = this._cfg && this._cfg.hold_action; if (holdCfg && holdCfg.action && holdCfg.action !== "none") { this._clearHoldTimer(); @@ -132,8 +1071,6 @@ class WashDataCard extends HTMLElement { } _onPointerMove(ev) { - // Cancel the gesture if the pointer drifts (e.g. the user is scrolling), so - // neither the pending hold nor the release-tap fires. if (!this._pointerStart) return; const dx = ev.clientX - this._pointerStart.x; const dy = ev.clientY - this._pointerStart.y; @@ -150,27 +1087,21 @@ class WashDataCard extends HTMLElement { _onPointerUp() { this._clearHoldTimer(); - // The pointer drifted (scroll/drag): the release should not count as a tap. if (this._pointerCanceled) { this._pointerCanceled = false; return; } - // A hold already fired its action; the release should not also count as a tap. if (this._holdTriggered) { this._holdTriggered = false; return; } - const tapCfg = (this._cfg && this._cfg.tap_action) || { action: "more-info" }; const doubleCfg = this._cfg && this._cfg.double_tap_action; const hasDouble = doubleCfg && doubleCfg.action && doubleCfg.action !== "none"; - - // With no double-tap action configured, fire the tap immediately (no latency). if (!hasDouble) { this._executeAction(tapCfg); return; } - const now = Date.now(); if (this._tapTimer && now - this._lastTapTime < DOUBLE_TAP_MS) { window.clearTimeout(this._tapTimer); @@ -179,8 +1110,6 @@ class WashDataCard extends HTMLElement { this._executeAction(doubleCfg); return; } - - // First tap: wait briefly to see whether a second one arrives. this._lastTapTime = now; this._tapTimer = window.setTimeout(() => { this._tapTimer = null; @@ -189,40 +1118,23 @@ class WashDataCard extends HTMLElement { } _fireHaptic(type) { - this.dispatchEvent(new CustomEvent("haptic", { - detail: type, - bubbles: true, - composed: true, - })); + this.dispatchEvent(new CustomEvent("haptic", { detail: type, bubbles: true, composed: true })); } _executeAction(actionCfg) { if (!actionCfg) return; const action = actionCfg.action || "more-info"; const entityId = actionCfg.entity || (this._cfg && this._cfg.entity); - switch (action) { case "none": return; - - case "more-info": { - if (!entityId) return; - this.dispatchEvent(new CustomEvent("hass-more-info", { - detail: { entityId }, - bubbles: true, - composed: true, - })); + case "more-info": + this._moreInfo(entityId); return; - } - - case "toggle": { - // homeassistant.toggle routes to the correct domain service for all - // common toggleable domains, so no per-domain table is needed. + case "toggle": if (!this._hass || !entityId) return; this._hass.callService("homeassistant", "toggle", { entity_id: entityId }); return; - } - case "call-service": case "perform-action": { const svc = actionCfg.perform_action || actionCfg.service; @@ -233,392 +1145,169 @@ class WashDataCard extends HTMLElement { this._hass.callService(svcDomain, svcName, data, actionCfg.target); return; } - case "navigate": { const path = actionCfg.navigation_path; if (!path) return; if (actionCfg.navigation_replace) { window.history.replaceState(window.history.state, "", path); + window.dispatchEvent(new CustomEvent("location-changed", { detail: { replace: true } })); } else { - window.history.pushState(null, "", path); + this._navigate(path); } - window.dispatchEvent(new CustomEvent("location-changed", { - detail: { replace: !!actionCfg.navigation_replace }, - })); return; } - case "url": { const url = actionCfg.url_path; if (!url) return; - // noopener/noreferrer prevents the opened page from reaching back via - // window.opener (reverse tabnabbing). window.open(url, "_blank", "noopener,noreferrer"); return; } - default: - // Unsupported actions (e.g. "assist") are intentionally ignored: a - // standalone card resource cannot resolve Home Assistant's internal - // dialog chunks, so attempting them would only throw at runtime. return; } } - - _render() { - if (!this.shadowRoot) return; - - // Only create the DOM once to avoid memory leaks from duplicate event listeners - if (!this._rendered) { - this.shadowRoot.innerHTML = ` - - -
-
- -
-
-
-
-
-
-
- `; - - const cardEl = this.shadowRoot.getElementById("card"); - cardEl.addEventListener("pointerdown", this._onPointerDown); - cardEl.addEventListener("pointermove", this._onPointerMove); - cardEl.addEventListener("pointerup", this._onPointerUp); - cardEl.addEventListener("pointercancel", this._onPointerCancel); - cardEl.addEventListener("pointerleave", this._onPointerCancel); - this._rendered = true; - } - - this._update(); - } - - _update() { - if (!this.shadowRoot || !this._hass || !this._cfg) return; - - const entityId = this._cfg.entity; - const stateObj = this._hass.states[entityId]; - - const titleEl = this.shadowRoot.getElementById("title"); - const stateEl = this.shadowRoot.getElementById("state"); - const iconEl = this.shadowRoot.getElementById("icon"); - const iconContainer = this.shadowRoot.getElementById("icon-container"); - - if (!stateObj) { - if (titleEl) titleEl.textContent = this._getTranslation("entity_not_found"); - if (stateEl) stateEl.textContent = entityId; - return; - } - - const title = this._cfg.title || "Washing Machine"; - const icon = this._cfg.icon || stateObj.attributes.icon || "mdi:washing-machine"; - const activeColor = this._cfg.active_color; - - const state = stateObj.state; - // Treat as inactive if off, unknown, unavailable, idle - const isInactive = ['off', 'unknown', 'unavailable', 'idle'].includes(state.toLowerCase()); - - if (isInactive) { - iconContainer.style.background = `rgba(128, 128, 128, 0.1)`; - iconContainer.style.color = `var(--disabled-text-color, grey)`; - } else { - let colorCss = "var(--primary-color)"; - let bgCss = "rgba(var(--rgb-primary-color, 33, 150, 243), 0.2)"; - - if (Array.isArray(activeColor)) { - const [r, g, b] = activeColor; - colorCss = `rgb(${r}, ${g}, ${b})`; - bgCss = `rgba(${r}, ${g}, ${b}, 0.2)`; - } else if (activeColor) { - colorCss = activeColor; - bgCss = `rgba(128, 128, 128, 0.15)`; - } - - iconContainer.style.color = colorCss; - iconContainer.style.background = bgCss; - } - - iconEl.setAttribute("icon", icon); - if (state.toLowerCase() === 'running' && this._cfg.spin_icon !== false) { - iconEl.classList.add("spinning"); - } else { - iconEl.classList.remove("spinning"); - } - titleEl.textContent = title; - - const attr = stateObj.attributes; - const parts = []; - - // 1. State / Sub-State - // Default show_state to true if undefined - if (this._cfg.show_state !== false) { - if (state.toLowerCase() === 'running') { - const subState = attr.sub_state; - if (subState) { - // If sub_state is "Running (Rinsing)", extract "Rinsing" - const match = subState.match(/Running \((.*)\)/); - if (match && match[1]) { - parts.push(match[1]); - } else { - parts.push(subState); - } - } - // If no sub_state (or just "Running"), we show NOTHING (redundant) - } else { - // Not running (e.g. Off, Completed, etc) - show standard state - parts.push(state.charAt(0).toUpperCase() + state.slice(1)); - } - } - - // 2. Program - if (this._cfg.show_program !== false) { - let program = ""; - if (this._cfg.program_entity) { - const progState = this._hass.states[this._cfg.program_entity]; - if (progState) program = progState.state; - } else if (attr.program) { - program = attr.program; - } - if (program && !["unknown", "none", "off", "unavailable"].includes(program.toLowerCase())) { - parts.push(program); - } - } - - // 3. Details (Time / Pct) - if (this._cfg.show_details !== false && !isInactive) { - let remaining = ""; - if (this._cfg.time_entity) { - remaining = this._hass.states[this._cfg.time_entity]?.state; - } else if (attr.time_remaining) { - remaining = attr.time_remaining; - } - - let pct = ""; - if (this._cfg.pct_entity) { - pct = this._hass.states[this._cfg.pct_entity]?.state; - } else if (attr.cycle_progress) { - pct = attr.cycle_progress; - } - - if (this._cfg.display_mode === 'percentage' && pct) { - parts.push(`${Math.round(pct)}%`); - } else if (remaining) { - // Append 'min' if it is a number (WashData attribute is raw minutes) - if (!isNaN(remaining)) { - parts.push(`${remaining} ${this._getTranslation("minutes")}`); - } else { - parts.push(remaining); - } - } - } - - stateEl.textContent = parts.length > 0 ? parts.join(" • ") : ""; - } } class WashDataCardEditor extends HTMLElement { - _resolveLanguage() { + _lang() { const raw = (this._hass && this._hass.locale && this._hass.locale.language) || (this._hass && this._hass.language) || "en"; - if (!raw || typeof raw !== "string") return "en"; - return raw; + return typeof raw === "string" && raw ? raw : "en"; } - _getTranslation(key) { - const lang = this._resolveLanguage(); - const baseLang = lang.split("-")[0]; - const translations = TRANSLATIONS[lang] || TRANSLATIONS[baseLang] || TRANSLATIONS["en"]; - return translations[key] || TRANSLATIONS["en"][key] || key; + _t(key, fallback) { + const lang = this._lang(); + const dict = _panelTrans[lang] || _panelTrans["en"]; + if (dict) { + const val = key.split(".").reduce((o, k) => (o && o[k] !== undefined ? o[k] : null), dict); + if (val && typeof val === "string") return val; + } + return fallback || key; } setConfig(config) { - this._cfg = { ...WashDataCard.getStubConfig(), ...config }; + this._cfg = { layout: "tile", ...config }; this._render(); } set hass(hass) { this._hass = hass; - if (this._form) { - this._form.hass = hass; - } + const lang = this._lang(); + const jobs = []; + if (!_panelTrans["en"]) jobs.push(loadPanelLang("en")); + if (lang && lang !== "en" && !_panelTrans[lang]) jobs.push(loadPanelLang(lang)); + if (jobs.length) Promise.all(jobs).then(() => this._render()); + if (this._form) this._form.hass = hass; } _render() { - if (!this.shadowRoot) { - this.attachShadow({ mode: "open" }); - } - + if (!this.shadowRoot) this.attachShadow({ mode: "open" }); if (!this._form) { - this.shadowRoot.innerHTML = ` - -
- `; + this.shadowRoot.innerHTML = + "" + + '
'; this._form = document.createElement("ha-form"); this.shadowRoot.getElementById("editor-container").appendChild(this._form); - this._form.addEventListener("value-changed", (ev) => this._valueChanged(ev)); + this._form.computeLabel = (schema) => this._t("card.editor." + schema.name, this._humanize(schema.name)); + } + this._form.schema = this._schema(); + this._form.data = this._cfg; + if (this._hass) this._form.hass = this._hass; + } - this._form.schema = [ + _humanize(name) { + return name.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()); + } + + _schema() { + // Flat schema (no nested/expandable groups) so config keys always stay at the + // top level regardless of the running Home Assistant version. + const layout = (this._cfg && this._cfg.layout) || "tile"; + const layoutSel = { + name: "layout", + selector: { + select: { + mode: "dropdown", + options: [ + { value: "tile", label: this._t("card.layout.tile", "Tile (compact)") }, + { value: "detail", label: this._t("card.layout.detail", "Detail (rich)") }, + { value: "glance", label: this._t("card.layout.glance", "Glance (multiple devices)") }, + ], + }, + }, + }; + if (layout === "glance") { + return [ + layoutSel, + { name: "entities", selector: { entity: { domain: "sensor", multiple: true } } }, { name: "title", selector: { text: {} } }, - { name: "entity", selector: { entity: { domain: "sensor" } } }, - { name: "icon", selector: { icon: {} } }, - { name: "active_color", selector: { color_rgb: {} } }, - { name: "show_state", selector: { boolean: {} } }, - { name: "show_program", selector: { boolean: {} } }, - { name: "show_details", selector: { boolean: {} } }, - { name: "spin_icon", selector: { boolean: {} } }, + ]; + } + const schema = [ + layoutSel, + { name: "entity", selector: { entity: { domain: "sensor" } } }, + { name: "title", selector: { text: {} } }, + { name: "icon", selector: { icon: {} } }, + { name: "show_state", selector: { boolean: {} } }, + { name: "show_program", selector: { boolean: {} } }, + { name: "show_progress_bar", selector: { boolean: {} } }, + { + name: "display_mode", + selector: { + select: { + mode: "dropdown", + options: [ + { value: "time", label: this._t("card.show_time_remaining", "Show Time Remaining") }, + { value: "percentage", label: this._t("card.show_percentage", "Show Percentage") }, + ], + }, + }, + }, + { name: "active_color", selector: { color_rgb: {} } }, + ]; + if (layout === "detail") { + schema.push( + { name: "show_phase", selector: { boolean: {} } }, + { name: "show_energy", selector: { boolean: {} } }, + { name: "show_anomaly", selector: { boolean: {} } }, + { name: "show_sparkline", selector: { boolean: {} } }, { - name: "display_mode", + name: "buttons", selector: { select: { - options: [ - { value: "time", label: this._getTranslation("show_time_remaining") }, - { value: "percentage", label: this._getTranslation("show_percentage") } - ], - mode: "dropdown" - } - } - }, - { name: "program_entity", selector: { entity: { domain: ["sensor", "select", "input_select", "input_text"] } } }, - { name: "pct_entity", selector: { entity: { domain: "sensor" } } }, - { name: "time_entity", selector: { entity: { domain: "sensor" } } }, - { name: "tap_action", selector: { ui_action: {} } }, - { name: "hold_action", selector: { ui_action: {} } }, - { name: "double_tap_action", selector: { ui_action: {} } }, - ]; - - this._form.computeLabel = (schema) => { - const labels = { - title: this._getTranslation("title"), - entity: this._getTranslation("status_entity"), - icon: this._getTranslation("icon"), - active_color: this._getTranslation("active_color"), - show_state: this._getTranslation("show_state"), - show_program: this._getTranslation("show_program"), - show_details: this._getTranslation("show_details"), - spin_icon: this._getTranslation("spin_icon"), - program_entity: this._getTranslation("program_entity"), - pct_entity: this._getTranslation("pct_entity"), - time_entity: this._getTranslation("time_entity"), - display_mode: this._getTranslation("display_mode"), - tap_action: this._getTranslation("tap_action"), - hold_action: this._getTranslation("hold_action"), - double_tap_action: this._getTranslation("double_tap_action") - }; - return labels[schema.name] || schema.name; - }; - } - - this._form.data = this._cfg; - if (this._hass) { - this._form.hass = this._hass; + multiple: true, + mode: "list", + options: BUTTON_ORDER.map((b) => ({ value: b, label: this._t("card.btn." + b, this._humanize(b)) })), + }, + }, + } + ); } + schema.push( + { name: "program_entity", selector: { entity: { domain: ["sensor", "select", "input_select", "input_text"] } } }, + { name: "time_entity", selector: { entity: { domain: "sensor" } } }, + { name: "pct_entity", selector: { entity: { domain: "sensor" } } }, + { name: "power_entity", selector: { entity: { domain: "sensor" } } }, + { name: "tap_action", selector: { ui_action: {} } }, + { name: "hold_action", selector: { ui_action: {} } }, + { name: "double_tap_action", selector: { ui_action: {} } } + ); + return schema; } _valueChanged(ev) { - if (!this._cfg || !this._hass) return; + if (!this._cfg) return; const val = ev.detail.value; + const layoutChanged = val.layout && val.layout !== this._cfg.layout; this._cfg = { ...this._cfg, ...val }; - - const event = new CustomEvent("config-changed", { - detail: { config: this._cfg }, - bubbles: true, - composed: true, - }); - this.dispatchEvent(event); + this.dispatchEvent( + new CustomEvent("config-changed", { detail: { config: this._cfg }, bubbles: true, composed: true }) + ); + // Re-render the schema when the layout changes so its layout-specific fields appear. + if (layoutChanged) this._render(); } } @@ -628,7 +1317,8 @@ customElements.define(EDITOR_TAG, WashDataCardEditor); window.customCards = window.customCards || []; window.customCards.push({ type: CARD_TAG, - name: "WashData Tile Card", + name: "WashData Card", preview: true, - description: "A compact tile-style card for washing machines.", + description: "Adaptive card for WashData appliances: compact tile, rich detail, or multi-device glance.", + documentationURL: "https://github.com/3dg1luk43/ha_washdata", }); diff --git a/custom_components/ha_washdata/www/ha-washdata-panel.js b/custom_components/ha_washdata/www/ha-washdata-panel.js index 657e5680..0c167c3f 100644 --- a/custom_components/ha_washdata/www/ha-washdata-panel.js +++ b/custom_components/ha_washdata/www/ha-washdata-panel.js @@ -171,6 +171,8 @@ const _SETTINGS_SECTIONS = [ doc: 'After finishing, hold progress at 100% for this long so Completed is visible on dashboards before resetting to Idle.' }, { key: 'auto_maintenance', label: 'Auto Maintenance (nightly cleanup)', type: 'checkbox', def: true, doc: 'Run nightly housekeeping: rebuild profile envelopes, recompute cycle health, prune debug traces and retain the most recent cycles.' }, + { key: 'power_profile_interval_min', label: 'Power Profile Interval', unit: 'min', type: 'number', min: 1, def: 15, + doc: 'Bucket size for the per-profile power_profile sensor attribute (the flat per-slot average-watts array consumed by external planners such as EMHASS and tibber_prices). Smaller buckets keep short power spikes sharp; larger buckets smooth the shape. Default 15 min. Read-time only; does not affect detection.' }, ] }, { sub: 'Debug', fields: [ { key: 'expose_debug_entities', label: 'Expose Debug Entities', type: 'checkbox', @@ -191,6 +193,10 @@ const _SETTINGS_SECTIONS = [ { key: 'anti_wrinkle_idle_timeout', label: 'Max Pulse Gap', unit: 's', type: 'number', step: 30, min: 0, def: 120, doc: 'How long the machine may stay quiet between two tumble pulses before anti-wrinkle mode ends. Set it above the longest gap your dryer leaves between pulses, otherwise every later pulse is read as a false start.' }, ] }, + { id: 'dishwasher', label: 'Dishwasher', intro: 'End-of-cycle handling for dishwashers, which typically finish with a long near-silent drying phase before a short final drain.', onlyDeviceTypes: ['dishwasher'], fields: [ + { key: 'dishwasher_end_spike_quiet_release', label: 'Passive-Dry Quiet Release', unit: 's', type: 'number', step: 60, min: 0, def: 600, + doc: 'Once the cycle passes its expected duration, how long the dishwasher must stay quiet (below the Stop Threshold) before WashData stops waiting for a final drain and ends the cycle. Raise it if your machine has a long silent drying phase before a late final drain that is being missed - a wider window lets the learned duration follow seasonal drift (colder inlet water = longer cycles) instead of locking to the old average. It only ever shortens the wait relative to the internal 30-minute end-spike cap, never extends it.' }, + ] }, { id: 'delay', label: 'Delay Start', intro: 'Delayed-start detection identifies when an appliance is powered but has not yet begun its cycle.', fields: [ { key: 'delay_start_detect_enabled', label: 'Enable Delay-Start Detection', type: 'checkbox', doc: 'Detect when the appliance is powered on and waiting (delayed start / standby) but has not begun its cycle, so standby draw is not mistaken for a running cycle.' }, @@ -211,6 +217,10 @@ const _SETTINGS_SECTIONS = [ { sub: 'Door & Pause', fields: [ { key: 'door_sensor_entity', label: 'Door Sensor Entity', type: 'entity', domain: 'binary_sensor', doc: 'Optional door binary sensor. Used to detect when the appliance has been opened/unloaded after a cycle.' }, + { key: 'door_opens_at_end', label: 'Door Opens Automatically At End', type: 'checkbox', + doc: 'For dishwashers that pop the door open at the end of the cycle to dry (AirDry and similar). With this on, a door-open on a running cycle no longer pauses it forever; instead, if the door stays open for the dwell below, WashData treats the cycle as finished. A brief open (adding an item) is ignored. Requires a Door Sensor Entity.' }, + { key: 'door_end_dwell_seconds', label: 'Door-Open End Dwell', unit: 's', type: 'number', min: 1, def: 60, + doc: 'How long the door must stay open before WashData ends the cycle, when "Door Opens Automatically At End" is on. Long enough to ignore quickly adding a dish (default 60 s), short enough to end promptly once the machine pops the door.' }, { key: 'pause_cuts_power', label: 'Pause Also Cuts Power (via switch)', type: 'checkbox', doc: 'When a cycle is paused, also switch off the Switch Entity below. Only for appliances whose plug can safely be cut mid-cycle.' }, { key: 'switch_entity', label: 'Switch Entity', type: 'entity', domain: 'switch', @@ -219,6 +229,8 @@ const _SETTINGS_SECTIONS = [ { sub: 'Unload Reminder', fields: [ { key: 'notify_unload_delay_minutes', label: 'Unload Nag Delay', unit: 'min', type: 'number', min: 0, def: 60, basic: true, doc: 'Minutes after a cycle ends before sending the still-waiting "unload the machine" reminder. Set 0 to disable the reminder.' }, + { key: 'notify_unload_repeat', label: 'Repeat Until Door Opens', type: 'checkbox', + doc: 'Keep re-sending the unload reminder every "Unload Nag Delay" minutes until you open the door or tap "Stop reminding" on the notification. Requires a Door Sensor Entity (the reminder itself does). The dismiss button works on Home Assistant companion-app (mobile) notifications.' }, { key: 'pump_stuck_duration', label: 'Pump Stuck Duration', unit: 's', type: 'number', min: 0, def: 1800, onlyDeviceType: 'pump', doc: 'Seconds a pump may run continuously before it is flagged as possibly stuck (fires the stuck-pump event).' }, ] }, @@ -247,6 +259,10 @@ const _SETTINGS_SECTIONS = [ doc: 'If a cycle runs past its estimate by more than this percentage, send an overrun alert.' }, { key: 'notify_live_chronometer', label: 'Use Live Chronometer', type: 'checkbox', doc: 'Show a live-updating countdown timer in the notification (on platforms that support it) instead of a static estimate.' }, + { key: 'notify_live_sticky', label: 'Keep Live Notification On Tap', type: 'checkbox', + doc: 'Android only. Make the live-progress notification persistent (sticky) so tapping it does not dismiss the ongoing thread. Off keeps the default behaviour where a tap dismisses it.' }, + { key: 'notify_live_click_action', label: 'Live Notification Tap Target', type: 'text', optional: true, + doc: 'Android only. Where a tap on the live-progress notification opens (e.g. /lovelace/laundry, or a full URL) instead of the app landing page. Leave blank for the default.' }, { key: 'notify_timeout_seconds', label: 'Auto-Dismiss After', unit: 's', type: 'number', min: 0, def: 0, doc: 'Automatically dismiss the notification after this many seconds (on platforms that support it). 0 keeps it until dismissed manually.' }, ] }, @@ -468,6 +484,24 @@ const _SETTING_CONFLICTS = [ profile_match_max_duration_ratio: { msgKey: 'conflict.duration_ratio.max', msgVars: {min: v.profile_match_min_duration_ratio}, msgFb: `Must be greater than Min Duration Ratio (${v.profile_match_min_duration_ratio})`, fixVal: +(v.profile_match_min_duration_ratio * 2.0).toFixed(2) }, }), }, + { + // end_energy_threshold >= stop_threshold_w * off_delay / 3600 (#376) + // The energy gate is evaluated over an off_delay-long window, so it implies a + // wattage. Below this it forbids what stop_threshold_w (the power gate) allows, + // and the cycle can only close through a fallback path (smart termination, + // watchdog force-end) — surfacing only as an unexplained late completion. + keys: ['end_energy_threshold', 'stop_threshold_w', 'off_delay'], + check: v => v.end_energy_threshold != null && v.stop_threshold_w != null && v.off_delay != null + && v.off_delay > 0 && v.end_energy_threshold < v.stop_threshold_w * v.off_delay / 3600, + fieldErrors: v => ({ + end_energy_threshold: { msgKey: 'conflict.end_energy.energy', msgVars: {w: v.stop_threshold_w, d: v.off_delay}, + msgFb: `Too strict for Stop Threshold (${v.stop_threshold_w} W) over Off Delay (${v.off_delay} s); the cycle can only end through a fallback path`, + fixVal: Math.ceil(v.stop_threshold_w * v.off_delay / 3600 * 1000) / 1000 }, + stop_threshold_w: { msgKey: 'conflict.end_energy.stop', msgVars: {e: v.end_energy_threshold, d: v.off_delay}, + msgFb: `End Energy Threshold (${v.end_energy_threshold} Wh over ${v.off_delay} s) only permits ${+(v.end_energy_threshold * 3600 / v.off_delay).toFixed(2)} W`, + fixVal: Math.floor(v.end_energy_threshold * 3600 / v.off_delay * 10) / 10 }, + }), + }, ]; // ─── Styles ────────────────────────────────────────────────────────────────── @@ -508,6 +542,7 @@ const _CSS = ` .wd-gear-btn { background: transparent; border: none; color: inherit; cursor: pointer; padding: 5px; margin-left: 4px; border-radius: var(--wd-radius-md); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; opacity: .8; } .wd-gear-btn:hover { background: rgba(255,255,255,.16); opacity: 1; } @media (max-width: 870px) { .wd-burger { display: inline-flex; } } +.wd-burger.wd-burger--force { display: inline-flex; } .wd-header .wd-sub { font-size: .72em; opacity: .75; margin-top: 2px; } .wd-header .wd-ts { margin-left: auto; font-size: .7em; opacity: .65; white-space: nowrap; } .wd-body { max-width: 1160px; margin: 0 auto; padding: 20px 16px 60px; } @@ -763,6 +798,8 @@ th.wd-tc-flags { color: var(--secondary-text-color); font-weight: 500; } .wd-sug-sep { display: none; } .wd-sug-impact { display: none; } .wd-sug-use { border: none; background: var(--warning-color, #ff9800); color: var(--wd-white); border-radius: var(--wd-radius-sm); padding: 2px 8px; font-size: .92em; cursor: pointer; flex-shrink: 0; } +.wd-sug-lock { border: none; background: transparent; color: var(--secondary-text-color); border-radius: var(--wd-radius-sm); padding: 2px 6px; font-size: .92em; cursor: pointer; flex-shrink: 0; opacity: .65; } +.wd-sug-lock:hover { opacity: 1; background: rgba(255,152,0,.15); } .wd-conflict-err { display: flex; flex-direction: column; gap: 4px; margin-top: 5px; } .wd-conflict-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: .8em; color: var(--error-color, #b71c1c); padding: 5px 9px; border-left: 3px solid var(--error-color, #b71c1c); background: rgba(183,28,28,.07); border-radius: 0 5px 5px 0; } .wd-conflict-fix { border: 1px solid var(--error-color, #b71c1c); background: none; color: var(--error-color, #b71c1c); border-radius: var(--wd-radius-sm); padding: 1px 7px; font-size: .92em; cursor: pointer; white-space: nowrap; flex: none; } @@ -1099,6 +1136,16 @@ button.wd-profile-card { display: block; } .wd-pg-cand-track { flex: 1; height: 7px; background: var(--secondary-background-color); border-radius: var(--wd-radius-sm); overflow: hidden; } .wd-pg-cand-fill { height: 100%; border-radius: var(--wd-radius-sm); } .wd-pg-cand-pct { flex: 0 0 34px; text-align: right; color: var(--secondary-text-color); } +/* Playground: settings control panel (live-settings source + named presets) */ +.wd-pg-ctrl { border: 1px solid var(--divider-color, rgba(127,127,127,.25)); border-radius: var(--wd-radius-md, 10px); padding: 8px 10px; margin: 0 0 10px; background: var(--secondary-background-color); } +.wd-pg-ctrl .wd-btn { white-space: nowrap; } +.wd-pg-preset-sel { min-width: 150px; max-width: 220px; font-size: .82em; } +.wd-pg-preset-name { flex: 1 1 150px; min-width: 120px; max-width: 220px; font-size: .82em; } +/* Per-setting publish arrow. The empty slot keeps every row's value column aligned + whether or not that row currently has a publishable change. */ +.wd-pg-pub { width: 20px; height: 20px; flex: 0 0 20px; padding: 0; border: none; border-radius: 5px; cursor: pointer; background: var(--primary-color); color: var(--text-primary-color, #fff); font-size: .8em; line-height: 1; } +.wd-pg-pub:hover { filter: brightness(1.15); } +.wd-pg-pub-slot { width: 20px; flex: 0 0 20px; display: inline-block; } /* Playground: unified workbench (graph+settings always on top) + "Across your cycles" drawer with History/Optimize sub-tabs. */ .wd-pg-drawer { margin-top: 16px; padding-top: 14px; border-top: 1px solid var(--divider-color, rgba(127,127,127,.25)); } @@ -1479,6 +1526,14 @@ function _field(f, value, extra) { sugHtml = `
🤖 ${_esc(t('suggestion.calibrated_label', {}, 'Calibrated'))}${_esc(mlVal)}${_u}${useBtn(mlVal)}${r}
`; } + // #343: a "mute" button on each suggestion card so the user can tell the + // auto-tuner to stop proposing this setting (e.g. a threshold that breaks an + // anti-crease-tuned device). Injected once just before the card's closing tag. + if (sugHtml && key) { + const lockTitle = _esc(t('btn.mute_suggestion', {}, "Stop suggesting this setting")); + const lockBtn = ``; + sugHtml = sugHtml.replace(/<\/div>\s*$/, lockBtn + ''); + } return `
${chgDot}${tip}
${input}${f.hint ? `
${_esc(f.hint)}
` : ''}${sugHtml}
`; } @@ -1710,6 +1765,7 @@ class HaWashdataPanel extends HTMLElement { this._profileGroups = { groups: [], suggestions: [], min_cohesion: 0.85 }; this._profileEnvCache = {}; this._suggestions = []; + this._lockedSuggestions = []; // #343: setting keys the user muted from auto-tuning this._feedbacks = []; this._diag = null; this._phases = []; @@ -1808,6 +1864,19 @@ class HaWashdataPanel extends HTMLElement { this._pgThreshStart = null; // null = use live option; number = dragged override (W) this._pgThreshStop = null; // same for stop threshold this._pgParamOverrides = {}; // other params: off_delay, min_off_gap, etc. + // Settings control panel: the device's LIVE effective values (what the running + // detector/matcher actually use, device-type defaults resolved server-side) are + // the baseline every field renders against; the three states above are the diff + // on top of it. Loaded from get_playground_settings on tab entry. + this._pgEffective = null; // {key: value} live baseline; null = not loaded yet + this._pgPublishable = null; // keys that are real config options (publish allow-list) + this._pgPresets = []; // saved sandbox snapshots [{name, values, ...}] + this._pgPresetLimit = 0; // server-side per-device preset cap + this._pgPresetSel = ''; // selected preset name in the dropdown + this._pgPresetName = ''; // "save as" name input buffer (survives re-render) + this._pgSuggClassic = {}; // classic auto-tuner suggestions {key: value} + this._pgSuggMl = null; // ML-calibrated suggestions {key: value} or null (disabled) + this._pgMlSuggEnabled = false; // ENABLE_ML_SUGGESTIONS server flag this._pgView = null; // {min,max} time-axis zoom window (seconds); null = full this._pgHoverT = null; // hovered time (seconds) for cursor readout; null = none this._pgMap = null; // current time<->x mapping, set by _pgDrawCanvas @@ -2777,8 +2846,12 @@ class HaWashdataPanel extends HTMLElement { this._suggestionsError = false; try { const res = await this._ws({ type: `${_DOMAIN}/get_suggestions`, entry_id: entryId }); + if (!this._isActiveEntry(entryId)) return; // device switched mid-flight this._suggestions = res.suggestions || []; - } catch (_) { this._suggestionsError = true; this._suggestions = []; } + this._lockedSuggestions = res.locked_suggestions || []; + } catch (_) { + if (this._isActiveEntry(entryId)) { this._suggestionsError = true; this._suggestions = []; } + } } async _fetchProfiles(entryId) { @@ -2840,7 +2913,7 @@ class HaWashdataPanel extends HTMLElement { this._settingsChangelog = null; this._settingsChangeByKey = {}; this._powerData = { live: [], raw: [], cycle_active: false, cycle_elapsed_s: 0 }; this._matchDebug = null; - this._profiles = []; this._profileHealth = {}; this._profileTrends = {}; this._coverageGaps = {}; this._profileAdvisories = []; this._opts = {}; this._suggestions = []; + this._profiles = []; this._profileHealth = {}; this._profileTrends = {}; this._coverageGaps = {}; this._profileAdvisories = []; this._opts = {}; this._suggestions = []; this._lockedSuggestions = []; this._cycles = []; this._refCycles = []; this._recState = null; this._diag = null; this._maintenance = null; this._phases = []; this._mlTrainingStatus = null; // per-device; re-fetched by _fetchTabData this._setupStatus = null; // per-device; re-fetched by _fetchTabData @@ -2852,6 +2925,10 @@ class HaWashdataPanel extends HTMLElement { this._pgCycleId = ''; this._pgProfileName = ''; this._pgPowerPts = null; this._pgDtwData = null; this._pgEnvData = null; this._pgThreshStart = null; this._pgThreshStop = null; this._pgParamOverrides = {}; + // Live baseline + presets are per-device; re-fetched by _fetchTabData. + this._pgEffective = null; this._pgPublishable = null; + this._pgPresets = []; this._pgPresetSel = ''; this._pgPresetName = ''; this._pgPresetLimit = 0; + this._pgSuggClassic = {}; this._pgSuggMl = null; this._pgMlSuggEnabled = false; this._pgView = null; this._pgHoverT = null; this._pgLoadSeq++; this._pgNeedsRestart = false; this._pgLoading = false; this._pgDetail = null; this._pgHistory = null; this._pgSweepNew = null; @@ -3037,6 +3114,11 @@ class HaWashdataPanel extends HTMLElement { this._loadMlTrainingStatus(eid).finally(() => { if (this._tab === 'advanced' && this._panelSubtab === 'ml') this._renderPreservingFormEdits(); }); } else if (this._tab === 'playground') { try { const r = await this._ws({ type: `${_DOMAIN}/get_options`, entry_id: eid }); if (!this._isActiveEntry(eid)) return; this._opts = r.options || {}; } catch (_) {} + // Always open on the integration's CURRENT settings: the backend reads them + // back off the live detector/matcher config, so no stale schema default can + // leak into the sandbox. + await this._pgFetchSettings(eid); + if (!this._isActiveEntry(eid)) return; await this._fetchCycles(eid); if (!this._profiles.length) await this._fetchProfiles(eid); // Auto-select most recent cycle on first load. Profile defaults to @@ -3260,9 +3342,21 @@ class HaWashdataPanel extends HTMLElement { // ── Access / panel-config helpers ─────────────────────────────────────────── + // Apply the user's panel font-size multiplier (#accessibility). All panel sizes + // are em-relative and :host has no explicit font-size, so setting the host's + // font-size scales the whole panel. Clamped to the same bounds the backend + // enforces so a stale/bad value can never break rendering. + _applyFontScale(scale) { + let s = parseFloat(scale); + if (!isFinite(s)) s = 1.0; + s = Math.max(0.7, Math.min(2.0, s)); + this.style.fontSize = (s === 1.0) ? '' : (Math.round(s * 1000) / 10) + '%'; + } + _applyPanelConfig() { const cfg = this._panelCfg; if (!cfg) return; + this._applyFontScale((cfg.prefs && cfg.prefs.font_scale) || 1.0); // lang_override arrives here (not at boot). If the user picked a language we // didn't eagerly load, fetch it now and re-render once it lands. const override = cfg.prefs && cfg.prefs.lang_override; @@ -3481,7 +3575,11 @@ class HaWashdataPanel extends HTMLElement { `; const ver = this._constants.version; - const burger = ``; return ` @@ -3501,9 +3599,7 @@ class HaWashdataPanel extends HTMLElement { _htmlBody() { if (!this._devices.length) return `
🧺
${this._t('msg.no_devices', {}, 'No WashData devices configured yet.')}
`; - const mlSugCount = Object.entries(this._mlSettings || {}).filter(([key, mlc]) => - mlc && mlc.ml_value != null && !_sugSame(mlc.ml_value, this._opts[key]) - ).length; + const mlSugCount = this._mlSugKeys().size; const sugDot = (this._suggestions.length || mlSugCount) ? ' 💡' : ''; const confIndicator = this._conflictKeysFromOpts().size > 0 ? ' ⚠' : ''; const pgBusy = this._busy.has('pg-sim') || this._busy.has('pg-sweep'); @@ -3594,9 +3690,7 @@ class HaWashdataPanel extends HTMLElement { const n = _confKeys.size, s = n > 1 ? 's' : ''; attn.push(``); } - const _mlSugCount = Object.entries(this._mlSettings || {}).filter(([key, mlc]) => - mlc && mlc.ml_value != null && !_sugSame(mlc.ml_value, this._opts[key]) - ).length; + const _mlSugCount = this._mlSugKeys().size; if ((dev.suggestions_count || _mlSugCount) && this._canEdit()) { const total = (dev.suggestions_count || 0) + _mlSugCount; const parts = []; @@ -3915,8 +4009,12 @@ class HaWashdataPanel extends HTMLElement { const isReviewed = c => { const m = mlOf(c); return !!(m && m.ml_review && m.ml_review.reviewed_at); }; const isGolden = c => { const m = mlOf(c); return !!(m && m.ml_review && m.ml_review.golden); }; const needsReview = c => { - if (isReviewed(c)) return false; + // Unresolved pending feedback ALWAYS needs review, even if an ML quality + // review was already saved: the two are separate, and the header counter + // counts pending feedback, so short-circuiting on reviewed_at here made the + // counter and the list disagree (#355). Pending feedback wins. if (fbIds.has(c.id)) return true; + if (isReviewed(c)) return false; const m = mlOf(c); const lbl = m && m.ml_quality_label; return ['uncertain', 'review'].includes(lbl) || ['force_stopped', 'interrupted'].includes(c.status); @@ -3960,8 +4058,10 @@ class HaWashdataPanel extends HTMLElement { : ''; const reviewBadge = c => { if (isGolden(c)) return ' '; - if (isReviewed(c)) return ' '; + // Pending feedback wins over the reviewed check, matching needsReview (#355): + // a reviewed cycle with unresolved feedback shows the feedback badge, not ✓. if (fbIds.has(c.id)) return ' 💬'; + if (isReviewed(c)) return ' '; if (needsReview(c)) return ' '; return ''; }; @@ -4356,7 +4456,12 @@ class HaWashdataPanel extends HTMLElement { const level = this._settingsLevel(); const basicMode = level === 'basic'; - const sugKeys = new Set((this._suggestions || []).map(s => s.key)); + const classicSugKeys = new Set((this._suggestions || []).map(s => s.key)); + // Calibrated (ML) recommendations that still differ from the effective value + // count as tuning suggestions too, so the section dots + banner surface them, + // mirroring the tab bulb and the "Show only" filter, which already include ML. + const mlSugKeys = this._mlSugKeys(o); + const sugKeys = new Set([...classicSugKeys, ...mlSugKeys]); const secHasSug = (sec) => { const fields = sec.fields || (sec.groups || []).flatMap(g => g.fields || []); return fields.some(f => sugKeys.has(f.key)); @@ -4407,18 +4512,26 @@ class HaWashdataPanel extends HTMLElement { ⚠ ${this._t('conflict.settings_banner', {n: confCount, s}, `${confCount} setting conflict${s} — check the highlighted sections and fix before saving.`)} ` : ''; - const sugCount = this._suggestions.length; + // Combined tuning-suggestion count: classic (observed) + Calibrated (ML) keys + // not already covered by a classic suggestion. Apply-all / Dismiss act on the + // classic engine only, so they render solely when a classic suggestion exists; + // Calibrated recommendations are applied individually via their "Use" button. + const classicSugCount = this._suggestions.length; + const mlOnlyCount = [...mlSugKeys].filter(k => !classicSugKeys.has(k)).length; + const sugCount = classicSugCount + mlOnlyCount; const sugOnly = this._settingsSugOnly && !this._settingsSearch; + const applyAllBtn = classicSugCount ? `` : ''; + const dismissBtn = classicSugCount ? `` : ''; const banner = sugCount ? (sugOnly ? `
💡 ${this._t('msg.showing_suggestions', {count: sugCount}, `Showing ${sugCount} setting${sugCount > 1 ? 's' : ''} with suggestions.`)} ${this._t('msg.show_all_settings', {}, 'Show all settings')}. - + ${applyAllBtn}
` : `
💡 ${this._t('msg.tuning_suggestions_available', {count: sugCount}, `${sugCount} tuning suggestion${sugCount > 1 ? 's' : ''} available from observed cycles. They appear beside the relevant fields.`)} - - + ${applyAllBtn} + ${dismissBtn}
`) : ''; const analyzeBusy = this._busy.has('sug-analyze'); @@ -4430,13 +4543,22 @@ class HaWashdataPanel extends HTMLElement { const formContent = q ? this._htmlSettingsSearch(o, q) : (sugOnly ? this._htmlSettingsSugOnly(o) : this._htmlSettingsSection(o)); + // #343: muted-suggestions notice + reset. Muted keys have no visible card, so + // this is the only place the user can bring them back. + const mutedCount = (this._lockedSuggestions || []).length; + const mutedBanner = mutedCount ? ` +
+ 🔕 ${this._t('msg.n_suggestions_muted', {count: mutedCount}, `${mutedCount} suggestion${mutedCount > 1 ? 's' : ''} muted; the auto-tuner will not propose these.`)} + +
` : ''; + return ` ${suggestionsErrorBanner}
${this._t('tab.settings', {}, 'Settings')}${this._mlSettingsLoading ? ` ${this._t('msg.ml_loading', {}, 'loading ML…')}` : ''}
${analyzeBtn}
- ${confBanner}${banner}${basicNote} + ${confBanner}${banner}${mutedBanner}${basicNote}
${searchInput}
${nav}
@@ -4531,8 +4653,13 @@ class HaWashdataPanel extends HTMLElement { extra.suggestion = { suggested: sug.suggested, current: sug.current, reason: sug.reason, reason_key: sug.reason_key, reason_params: rp }; } + // A muted key (#343) must hide its Calibrated (ML) recommendation too - the + // mute is per-setting, not per-engine, so an ML-only suggestion would + // otherwise stay visible (and counted) after the user muted it. const mlc = (this._mlSettings || {})[f.key]; - if (mlc && mlc.ml_value != null) extra.mlSuggestion = { value: mlc.ml_value, reason: mlc.ml_reason, reason_key: mlc.ml_reason_key, reason_params: mlc.ml_reason_params }; + if (mlc && mlc.ml_value != null && !(this._lockedSuggestions || []).includes(f.key)) { + extra.mlSuggestion = { value: mlc.ml_value, reason: mlc.ml_reason, reason_key: mlc.ml_reason_key, reason_params: mlc.ml_reason_params }; + } extra.useBtnLabel = this._t('btn.use', {}, 'Use'); extra.t = this._t.bind(this); @@ -4986,16 +5113,29 @@ class HaWashdataPanel extends HTMLElement { } // Cross-section view showing only the fields that have active suggestions. + // Setting keys with a Calibrated (ML) recommendation that still differs from the + // effective current value (staged edit if present, else the saved option). Shared + // by the settings banner, section dots, tab bulb, and the "Show only" filter so + // Calibrated suggestions surface everywhere classic (observed) suggestions do. + _mlSugKeys(eff) { + const cur = eff || Object.assign({}, this._opts, this._pendingSettings || {}); + // Muted keys (#343) are excluded so the banner count, section dots, tab bulb + // and the "Show only" filter all follow the mute state the same way the + // classic suggestions do (which are dropped from this._suggestions on mute). + const locked = new Set(this._lockedSuggestions || []); + const keys = new Set(); + for (const [key, mlc] of Object.entries(this._mlSettings || {})) { + if (locked.has(key)) continue; + if (mlc && mlc.ml_value != null && !_sugSame(mlc.ml_value, cur[key])) keys.add(key); + } + return keys; + } + _htmlSettingsSugOnly(o) { const sugKeys = new Set((this._suggestions || []).map(s => s.key)); - // Include ML-recommended settings (same key shape used by the sug-count badge) - // so the "Show only" filter surfaces ML-only recommendations too. - for (const [key, mlc] of Object.entries(this._mlSettings || {})) { - // Compare against the effective current form value (staged edit if present, - // else the saved option) so the filter reflects what the user has staged. - const cur = (this._pendingSettings && key in this._pendingSettings) ? this._pendingSettings[key] : this._opts[key]; - if (mlc && mlc.ml_value != null && !_sugSame(mlc.ml_value, cur)) sugKeys.add(key); - } + // Include Calibrated (ML) recommendations so the "Show only" filter surfaces + // ML-only recommendations too (same set the banner + section dots use). + for (const k of this._mlSugKeys(o)) sugKeys.add(k); if (!sugKeys.size) return `

${this._t('msg.no_suggestions', {}, 'No active suggestions.')}

`; const currentDeviceType = (this._opts && this._opts.device_type) || ''; const sections = _SETTINGS_SECTIONS.filter(s => { @@ -5232,6 +5372,7 @@ class HaWashdataPanel extends HTMLElement { ['anti_wrinkle_max_duration','Max Anti-Wrinkle Duration','s', 'A pulse longer than this ends anti-wrinkle and opens a new cycle', 'advanced'], ['anti_wrinkle_exit_power', 'Anti-Wrinkle Exit Power','W', 'Power must fall below this between pulses for anti-wrinkle to stay active', 'advanced'], ['anti_wrinkle_idle_timeout','Max Pulse Gap', 's', 'Quiet time allowed between two tumble pulses before anti-wrinkle ends', 'advanced'], + ['dishwasher_end_spike_quiet_release','Passive-Dry Quiet Release','s', 'Dishwasher: quiet seconds after expected duration before the end-of-cycle drain wait is released', 'advanced'], ['profile_match_min_duration_ratio', 'Min Duration Ratio', '', 'Stage 1: shortest run (vs the profile) still allowed to match', 'matching'], ['profile_match_max_duration_ratio', 'Max Duration Ratio', '', 'Stage 1: longest run (vs the profile) still allowed to match', 'matching'], ['corr_weight', 'Correlation Weight', '', 'Stage 2: balance between curve shape (correlation) and power level (MAE); default 0.45', 'matching'], @@ -5248,11 +5389,19 @@ class HaWashdataPanel extends HTMLElement { ]; } - // Resolve a pre-fill value for an override field: staged override → live option - // → field default (settings schema) → matcher constant default → ''. + // Resolve a pre-fill value for an override field: staged override → the live + // effective value from the backend → stored option → field default (settings + // schema) → matcher constant default → ''. + // + // The effective value comes first because it is the ONLY source that resolves + // device-type defaults (e.g. a dishwasher's min_off_gap) the way the running + // integration does; the option/schema fallbacks below it only matter on an older + // backend that has no get_playground_settings command. _pgFieldVal(key, store) { const s = store || {}; if (s[key] !== undefined) return s[key]; + const eff = this._pgEffective || {}; + if (eff[key] !== undefined && eff[key] !== null) return eff[key]; const o = this._opts || {}; if (o[key] !== undefined && o[key] !== null) return o[key]; const f = _FIELD_BY_KEY[key] || {}; @@ -5266,6 +5415,277 @@ class HaWashdataPanel extends HTMLElement { return ''; } + // ── Playground settings control panel ─────────────────────────────────────── + // Load live → edit in the sandbox → save/load a named preset → publish single + // values back. The staged-override maps stay the single source of "what the + // user changed"; this block only decides what they are measured against. + + // Fetch the device's live effective settings + its saved presets. Tolerant of an + // older backend (command unknown): the field pre-fill silently falls back to the + // stored-option chain in _pgFieldVal. + async _pgFetchSettings(entryId) { + try { + const r = await this._ws({ type: `${_DOMAIN}/get_playground_settings`, entry_id: entryId }); + if (!this._isActiveEntry(entryId)) return; + this._pgEffective = r.effective || {}; + this._pgPublishable = Array.isArray(r.publishable) ? r.publishable : null; + this._pgPresets = Array.isArray(r.presets) ? r.presets : []; + this._pgPresetLimit = r.preset_limit || 0; + if (this._pgPresetSel && !this._pgPresets.some(p => p.name === this._pgPresetSel)) this._pgPresetSel = ''; + this._pgSuggClassic = (r.classic_suggestions && typeof r.classic_suggestions === 'object') ? r.classic_suggestions : {}; + this._pgSuggMl = (r.ml_suggestions && typeof r.ml_suggestions === 'object') ? r.ml_suggestions : null; + this._pgMlSuggEnabled = !!r.ml_suggestions_enabled; + } catch (e) { + if (this._pgIsUnknownCmd(e)) this._pgNeedsRestart = true; + } + } + + // Every value the control panel currently shows (live baseline + staged edits). + // This is what a "save preset" snapshots, so a preset is a complete setup rather + // than a sparse diff that would mean something different on another baseline. + _pgCurrentValues() { + const out = {}; + for (const [key] of this._pgOverrideFields()) { + const v = this._pgFieldVal(key, {}); + if (v !== '' && v !== null && v !== undefined) out[key] = v; + } + if (this._pgThreshStart != null) out.start_threshold_w = this._pgThreshStart; + if (this._pgThreshStop != null) out.stop_threshold_w = this._pgThreshStop; + for (const [k, v] of Object.entries(this._pgParamOverrides || {})) out[k] = v; + return out; + } + + // Staged value for one key, or undefined when the field is at the live baseline. + _pgStagedVal(key) { + if (key === 'start_threshold_w') return this._pgThreshStart ?? undefined; + if (key === 'stop_threshold_w') return this._pgThreshStop ?? undefined; + return this._pgParamOverrides[key]; + } + + _pgSetStaged(key, val) { + if (key === 'start_threshold_w') this._pgThreshStart = val; + else if (key === 'stop_threshold_w') this._pgThreshStop = val; + else this._pgParamOverrides[key] = val; + } + + _pgClearStaged(key) { + if (key === 'start_threshold_w') this._pgThreshStart = null; + else if (key === 'stop_threshold_w') this._pgThreshStop = null; + else delete this._pgParamOverrides[key]; + } + + // Keys the user changed away from the live baseline (a staged value equal to the + // live one is not a change and is never published). + _pgChangedKeys() { + const live = this._pgEffective || {}; + const keys = []; + for (const [key] of this._pgOverrideFields()) { + const staged = this._pgStagedVal(key); + if (staged === undefined || staged === null) continue; + const base = live[key]; + if (base !== undefined && base !== null && this._pgSameVal(staged, base)) continue; + keys.push(key); + } + return keys; + } + + // Loose numeric/bool equality: input fields yield strings and floats can carry + // representation noise, so compare on value, not on type. + _pgSameVal(a, b) { + if (typeof a === 'boolean' || typeof b === 'boolean') return !!a === !!b; + const na = parseFloat(a), nb = parseFloat(b); + if (!isNaN(na) && !isNaN(nb)) return Math.abs(na - nb) < 1e-9; + return String(a) === String(b); + } + + // Can this key be written back to the live config? The backend ships the + // allow-list (real CONF_* options only); the settings-schema membership test is + // the offline fallback. The Stage 2-4 matcher knobs are sandbox-only constants + // with no option behind them, so they are never publishable. + _pgIsPublishable(key) { + if (Array.isArray(this._pgPublishable)) return this._pgPublishable.includes(key); + return !!_FIELD_BY_KEY[key]; + } + + _htmlPgControlPanel() { + const changed = this._pgChangedKeys(); + const canEdit = this._canEdit(); + const loaded = !!this._pgEffective; + const publishable = changed.filter(k => this._pgIsPublishable(k)); + + const status = !loaded + ? `${this._t('msg.pg_live_unavailable', {}, 'Live settings unavailable — showing defaults.')}` + : (changed.length + ? `${this._t('msg.pg_n_changed', {n: changed.length}, changed.length + ' changed vs live settings')}` + : `✓ ${this._t('msg.pg_matches_live', {}, 'Matches live settings')}`); + + const presetOpts = `` + + (this._pgPresets || []).map(p => ``).join(''); + const hasSel = !!this._pgPresetSel; + const atLimit = this._pgPresetLimit > 0 && (this._pgPresets || []).length >= this._pgPresetLimit + && !(this._pgPresets || []).some(p => p.name === (this._pgPresetName || '').trim()); + + const presetRow = `
+ + + ${canEdit ? `` : ''} +
`; + + const saveRow = canEdit ? `
+ + + ${this._t('msg.pg_preset_limit', {n: this._pgPresetLimit}, 'Preset limit reached (' + this._pgPresetLimit + ')')} +
` : ''; + + const publishBtn = (canEdit && publishable.length) + ? `` + : ''; + + const suggClassicCount = Object.keys(this._pgSuggClassic || {}).length; + const suggMlCount = Object.keys(this._pgSuggMl || {}).length; + const suggClassicBtn = suggClassicCount > 0 + ? `` + : ''; + const suggMlBtn = (this._pgMlSuggEnabled && suggMlCount > 0) + ? `` + : ''; + + return `
+
+ ${this._t('hdr.pg_settings_source', {}, 'Settings source')} + ${status} +
+

${this._t('msg.pg_ctrl_intro', {}, 'Values start from this device\'s live integration settings. Edits stay in the Playground until you publish them.')}

+
+ + ${suggClassicBtn}${suggMlBtn} + ${publishBtn} +
+ ${presetRow} + ${saveRow} +
`; + } + + // Replace the sandbox values with a preset: stage only what differs from the live + // baseline, so the graph's before/after diff keeps meaning "vs the integration". + _pgApplyPresetValues(values) { + this._pgThreshStart = null; this._pgThreshStop = null; this._pgParamOverrides = {}; + const live = this._pgEffective || {}; + for (const [key, val] of Object.entries(values || {})) { + if (val === null || val === undefined) continue; + const base = live[key]; + if (base !== undefined && base !== null && this._pgSameVal(val, base)) continue; + this._pgSetStaged(key, val); + } + } + + async _pgSavePreset() { + const dev = this._devices[this._selIdx]; + const name = (this._pgPresetName || '').trim(); + if (!dev || !this._canEdit() || !name) return; + if ((this._pgPresets || []).some(p => p.name === name) + && !confirm(this._t('msg.pg_preset_overwrite', {name}, `Overwrite the preset "${name}"?`))) return; + await this._busyRun('pg-preset-save', async () => { + try { + const r = await this._ws({ type: `${_DOMAIN}/save_playground_preset`, entry_id: dev.entry_id, name, values: this._pgCurrentValues() }); + if (!this._isActiveEntry(dev.entry_id)) return; + this._pgPresets = Array.isArray(r.presets) ? r.presets : this._pgPresets; + this._pgPresetSel = name; + this._pgPresetName = ''; + this._showToast(this._t('toast.pg_preset_saved', {name}, `Preset "${name}" saved`)); + } catch (e) { + this._showToast(this._t('msg.toast_save_failed', {error: e.message || e}, 'Save failed: ' + (e.message || e)), 'error'); + } + }); + this._render(); + } + + async _pgDeletePreset() { + const dev = this._devices[this._selIdx]; + const name = this._pgPresetSel; + if (!dev || !this._canEdit() || !name) return; + if (!confirm(this._t('msg.pg_preset_delete_confirm', {name}, `Delete the preset "${name}"?`))) return; + await this._busyRun('pg-preset-delete', async () => { + try { + const r = await this._ws({ type: `${_DOMAIN}/delete_playground_preset`, entry_id: dev.entry_id, name }); + if (!this._isActiveEntry(dev.entry_id)) return; + this._pgPresets = Array.isArray(r.presets) ? r.presets : (this._pgPresets || []).filter(p => p.name !== name); + this._pgPresetSel = ''; + } catch (e) { + this._showToast(this._t('msg.toast_error', {error: e.message || e}, 'Error: ' + (e.message || e)), 'error'); + } + }); + this._render(); + } + + // Re-read the integration's settings and discard every sandbox edit. + async _pgLoadLive() { + const dev = this._devices[this._selIdx]; + if (!dev) return; + const changed = this._pgChangedKeys(); + if (changed.length && !confirm(this._t('msg.pg_load_live_confirm', {n: changed.length}, `Discard ${changed.length} Playground edit(s) and reload the integration's current settings?`))) return; + await this._busyRun('pg-load-live', async () => { + this._pgThreshStart = null; this._pgThreshStop = null; this._pgParamOverrides = {}; + await this._pgFetchSettings(dev.entry_id); + }); + this._render(); + requestAnimationFrame(() => this._pgDrawCanvas()); + } + + // Stage suggested values as Playground overrides (additive merge - does not + // reset existing edits, unlike _pgApplyPresetValues which does a full replace). + _pgLoadSuggested(source) { + const vals = source === 'ml' ? (this._pgSuggMl || {}) : (this._pgSuggClassic || {}); + const live = this._pgEffective || {}; + let staged = 0; + for (const [key, val] of Object.entries(vals)) { + if (val === null || val === undefined) continue; + // Skip values already at the live baseline — staging them would show as a + // "change" in the diff view but produce no actual difference in simulation. + const base = live[key]; + if (base !== undefined && base !== null && this._pgSameVal(val, base)) continue; + this._pgSetStaged(key, val); + staged++; + } + if (staged === 0) { + this._showToast(this._t('msg.pg_sugg_none', {}, 'All suggestions already match the current settings')); + } else { + const msgKey = source === 'ml' ? 'toast.pg_sugg_ml_loaded' : 'toast.pg_sugg_loaded'; + const fallback = source === 'ml' + ? `Staged ${staged} ML-calibrated value(s) - run the Playground to compare` + : `Staged ${staged} suggested value(s) - run the Playground to compare`; + this._showToast(this._t(msgKey, {n: staged}, fallback)); + } + this._render(); + requestAnimationFrame(() => this._pgDrawCanvas()); + } + + // Publish exactly one edited value into the device's live settings. + async _pgPublishOne(key) { + const dev = this._devices[this._selIdx]; + if (!dev || !this._canEdit() || !key || !this._pgIsPublishable(key)) return; + const val = this._pgStagedVal(key); + if (val === undefined || val === null) return; + const lbl = this._t('setting.' + key + '.label', {}, key); + if (!confirm(this._t('msg.pg_publish_one_confirm', {label: lbl, value: val}, `Save ${lbl} = ${val} to this device's settings?`))) return; + await this._busyRun('pg-publish-' + key, async () => { + try { + await this._ws({ type: `${_DOMAIN}/set_options`, entry_id: dev.entry_id, options: { [key]: val } }); + if (!this._isActiveEntry(dev.entry_id)) return; + this._opts = { ...this._opts, [key]: val }; + // The published value IS the live baseline now: fold it into the effective + // map and drop the staged edit, so the field reads "matches live" without + // waiting for the entry reload to come back around. + if (this._pgEffective) this._pgEffective = { ...this._pgEffective, [key]: val }; + this._pgClearStaged(key); + this._showToast(this._t('toast.settings_saved', {}, 'Settings saved; integration reloading')); + } catch (e) { + this._showToast(this._t('msg.toast_save_failed', {error: e.message || e}, 'Save failed: ' + (e.message || e)), 'error'); + } + }); + this._render(); + } + _htmlPlayground() { const dev = this._devices[this._selIdx]; if (!dev) return `
${this._t('msg.no_device_selected', {}, 'No device selected.')}
`; @@ -5391,6 +5811,15 @@ class HaWashdataPanel extends HTMLElement {
`; lastGroup = group; } + // Per-setting publish: only for keys that are real integration options AND + // only once this field actually differs from the live value. Sandbox-only + // matcher knobs never get one (there is no option to write them to). + const staged = this._pgStagedVal(key); + const isChanged = staged !== undefined && staged !== null + && !(liveVal !== '' && liveVal !== null && liveVal !== undefined && this._pgSameVal(staged, liveVal)); + const pubBtn = (this._canEdit() && isChanged && this._pgIsPublishable(key)) + ? `` + : ``; return `${header}
${_esc(lbl)}${isDrag ? ` ` : ''}
@@ -5401,14 +5830,10 @@ class HaWashdataPanel extends HTMLElement { ? `` : ``} ${unitTxt ? `${_esc(unitTxt)}` : ''} + ${pubBtn}
`; }).join(''); - const hasOverrides = Object.keys(this._pgParamOverrides || {}).length > 0 - || this._pgThreshStart != null || this._pgThreshStop != null; - const applyBtn = (this._canEdit() && hasOverrides) - ? `` - : ''; const stressGc = '#c0392b'; const stressHeader = `
@@ -5436,9 +5861,9 @@ class HaWashdataPanel extends HTMLElement { const stressGroup = `${stressHeader}${stressToggle}${stressIdleField}`; return `
${this._t('hdr.pg_detection_params', {}, 'Detection settings')}
+ ${this._htmlPgControlPanel()} ${paramRows}${stressGroup}
- ${applyBtn} ${this._pgDetailBusy ? `` : ''}
@@ -5709,15 +6134,20 @@ class HaWashdataPanel extends HTMLElement { } // Transfer everything the user edited in the Playground into the device's live - // settings in one click, so they don't retype it in the Settings tab. Every - // override key is a real settable option (that is why the matching group is - // limited to the two duration-ratio settings), so this is a plain set_options. + // settings in one click, so they don't retype it in the Settings tab. + // + // Only PUBLISHABLE keys go out: the Stage 2-4 matcher knobs in the params list + // are sandbox-only scoring constants with no config option behind them, so + // writing them would leave dead keys in entry.options that nothing ever reads. + // Values already equal to the live setting are skipped as well. async _pgApplyToSettings() { const dev = this._devices[this._selIdx]; if (!dev || !this._canEdit()) return; - const opts = { ...this._pgParamOverrides }; - if (this._pgThreshStart != null) opts.start_threshold_w = this._pgThreshStart; - if (this._pgThreshStop != null) opts.stop_threshold_w = this._pgThreshStop; + const opts = {}; + for (const key of this._pgChangedKeys()) { + if (!this._pgIsPublishable(key)) continue; + opts[key] = this._pgStagedVal(key); + } const keys = Object.keys(opts); if (!keys.length) return; const labels = keys.map(k => this._t('setting.' + k + '.label', {}, k)).join(', '); @@ -5725,9 +6155,13 @@ class HaWashdataPanel extends HTMLElement { await this._busyRun('pg-apply-settings', async () => { try { await this._ws({ type: `${_DOMAIN}/set_options`, entry_id: dev.entry_id, options: opts }); + if (!this._isActiveEntry(dev.entry_id)) return; this._opts = { ...this._opts, ...opts }; - // Clear the staged overrides: they are the live baseline now. - this._pgParamOverrides = {}; this._pgThreshStart = null; this._pgThreshStop = null; + // The published values ARE the live baseline now; clear only those staged + // edits. Sandbox-only matcher edits are deliberately left in place - they + // were not published, so dropping them would lose the user's tuning. + if (this._pgEffective) this._pgEffective = { ...this._pgEffective, ...opts }; + for (const key of keys) this._pgClearStaged(key); this._showToast(this._t('toast.settings_saved', {}, 'Settings saved; integration reloading')); } catch (e) { this._showToast(this._t('msg.toast_save_failed', {error: e.message || e}, 'Save failed: ' + (e.message || e)), 'error'); @@ -6462,7 +6896,9 @@ class HaWashdataPanel extends HTMLElement { _pgUpdateParamInput(key, val) { const sr = this.shadowRoot; - const inp = sr && sr.querySelector(`[data-pgkey="${key}"]`); + // input[...] specifically: the publish button in the same row also carries + // data-pgkey, and must never be mistaken for the value field. + const inp = sr && sr.querySelector(`input[data-pgkey="${key}"]`); if (!inp) return; if (inp.dataset.pgtype === 'bool') inp.checked = !!val; else inp.value = typeof val === 'number' ? Math.round(val) : val; @@ -6771,6 +7207,14 @@ class HaWashdataPanel extends HTMLElement {
+
+ +
+ + ${Math.round((cur.font_scale || 1) * 100)}% +
+
${this._t('msg.font_size_hint', {}, 'Make everything in this panel larger or smaller. Applies to your account on this device.')}
+
${this._t('hdr.status_graph', {}, 'Status Graph')}
${_switchRow(`id="wd-pref-expected" ${(cur.show_expected !== false) ? 'checked' : ''}`, this._t('lbl.show_expected', {}, 'Show expected curve overlay (matched profile, orange)'))} ${_switchRow(`id="wd-pref-raw" ${cur.show_raw ? 'checked' : ''}`, this._t('lbl.show_raw', {}, 'Show raw socket toggle in live power graph'))} @@ -7767,7 +8211,7 @@ class HaWashdataPanel extends HTMLElement { _wizGroupIds(manifest, catId, prof) { const cat = (manifest.categories || {})[catId] || {}; const g = (cat.groups || []).find(gr => gr.profile === prof); - return g ? g.cycles.map(cy => String(cy.id)).filter(id => id !== 'null') : []; + return g ? g.cycles.filter(cy => cy.id != null).map(cy => String(cy.id)) : []; } // tri-state {sel, total, state} for a category, for the checkbox rendering. @@ -7841,11 +8285,13 @@ class HaWashdataPanel extends HTMLElement { ${_esc(cy.date ? _fmtDate(cy.date) : String(cy.id))}${cy.duration != null ? ' · ' + _fmtDuration(cy.duration) : ''} `).join('') : ''; return `
-
`; }).join('')}
`; @@ -8701,8 +9147,9 @@ class HaWashdataPanel extends HTMLElement { pgCanvas.addEventListener('dblclick', () => { this._pgView = null; this._pgDrawCanvas(); }); } - // F3: Param input fields → sync to threshold state + redraw - sr.querySelectorAll('[data-pgkey]').forEach(inp => { + // F3: Param input fields → sync to threshold state + redraw. Scoped to inputs: + // the per-row publish button shares the data-pgkey hook. + sr.querySelectorAll('input[data-pgkey]').forEach(inp => { inp.addEventListener('input', () => { const key = inp.dataset.pgkey; if (inp.dataset.pgtype === 'bool') { @@ -8711,7 +9158,7 @@ class HaWashdataPanel extends HTMLElement { else if (key === 'stop_threshold_w') this._pgThreshStop = val; else this._pgParamOverrides[key] = val; this._render(); - const again = sr.querySelector(`[data-pgkey="${key}"]`); + const again = sr.querySelector(`input[data-pgkey="${key}"]`); if (again) again.focus(); requestAnimationFrame(() => this._pgDrawCanvas()); return; @@ -8736,7 +9183,7 @@ class HaWashdataPanel extends HTMLElement { const caret = inp.selectionStart; const rawVal = inp.value; this._render(); - const again = sr.querySelector(`[data-pgkey="${key}"]`); + const again = sr.querySelector(`input[data-pgkey="${key}"]`); if (again) { again.value = rawVal; // restore raw text incl. trailing "." the browser strips again.focus(); @@ -8770,6 +9217,27 @@ class HaWashdataPanel extends HTMLElement { const pgProfSel = sr.getElementById('wd-pg-prof-sel'); if (pgProfSel) pgProfSel.addEventListener('change', () => { this._pgProfileName = pgProfSel.value; this._pgLoad(); }); + // F3: Settings control panel — preset picker + "save as" name buffer. Both keep + // their value in state so a re-render (any param edit) cannot reset them. + const pgPresetSel = sr.getElementById('wd-pg-preset-sel'); + if (pgPresetSel) pgPresetSel.addEventListener('change', () => { this._pgPresetSel = pgPresetSel.value; this._render(); }); + const pgPresetName = sr.getElementById('wd-pg-preset-name'); + if (pgPresetName) pgPresetName.addEventListener('input', () => { + this._pgPresetName = pgPresetName.value; + // Only the save button's disabled state and the preset-limit note depend on + // the typed name, so patch those two in place. A full _render() per keystroke + // rebuilt the entire panel DOM and repainted the Playground canvases, and is + // what forced the caret save/restore workaround this replaces. + const name = (this._pgPresetName || '').trim(); + const atLimitNow = this._pgPresetLimit > 0 + && (this._pgPresets || []).length >= this._pgPresetLimit + && !(this._pgPresets || []).some(p => p.name === name); + const saveBtn = sr.querySelector('[data-action="pg-preset-save"]'); + if (saveBtn) saveBtn.disabled = !(name && !atLimitNow); + const limitNote = sr.getElementById('wd-pg-preset-limit-note'); + if (limitNote) limitNote.style.display = atLimitNow ? '' : 'none'; + }); + // F3: Sim cycle count const pgSimN = sr.getElementById('wd-pg-simn'); if (pgSimN) pgSimN.addEventListener('input', () => { this._pgSimCycles = Math.max(1, Math.min(200, parseInt(pgSimN.value, 10) || 20)); }); @@ -9224,6 +9692,21 @@ class HaWashdataPanel extends HTMLElement { } }); + // Panel font-size slider (accessibility): live-preview while dragging, persist + // on release. All panel text is em-relative, so _applyFontScale scales it all. + const fontScaleInp = sr.getElementById('wd-pref-fontscale'); + if (fontScaleInp) { + const fsVal = sr.getElementById('wd-pref-fontscale-val'); + fontScaleInp.addEventListener('input', () => { + const v = parseFloat(fontScaleInp.value) || 1; + this._applyFontScale(v); + if (fsVal) fsVal.textContent = Math.round(v * 100) + '%'; + }); + fontScaleInp.addEventListener('change', () => { + this._setPref('font_scale', parseFloat(fontScaleInp.value) || 1); + }); + } + sr.querySelectorAll('[data-action]').forEach(btn => btn.addEventListener('click', e => this._onAction(e.currentTarget))); sr.querySelectorAll('[data-maction]').forEach(btn => btn.addEventListener('click', e => this._onModalAction(e.currentTarget.dataset.maction, e.currentTarget))); // A