278 files
This commit is contained in:
@@ -55,7 +55,6 @@
|
||||
"runtime": "Doba běhu",
|
||||
"runtime_hours": "Cílová doba běhu (hodiny)",
|
||||
"target_value": "Cílová hodnota",
|
||||
"baseline": "Základní hodnota",
|
||||
"target_changes": "Cílový počet změn",
|
||||
"for_minutes": "Po dobu (minut)",
|
||||
"time_based": "Časový",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Vytvořeno",
|
||||
"report_times_done": "Provedeno",
|
||||
"report_total_cost": "Celkové náklady",
|
||||
"report_every": "každých {n} {unit}",
|
||||
"report_notes": "Poznámky",
|
||||
"report_col_type": "Typ",
|
||||
"report_col_status": "Stav",
|
||||
"report_col_schedule": "Plán",
|
||||
"duration": "Doba trvání",
|
||||
"minutes_short": "min",
|
||||
"both": "Obojí",
|
||||
"trigger_val": "Hodnota spouštěče",
|
||||
"complete_title": "Dokončit: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: špatný typ (očekáván: {type})",
|
||||
"err_invalid_choice": "{field}: nepovolená hodnota",
|
||||
"err_invalid_value": "{field}: neplatná hodnota",
|
||||
"ws_err_not_found": "Nenalezeno — mezitím to mohlo být smazáno",
|
||||
"ws_err_invalid_input": "Neplatný vstup",
|
||||
"ws_err_invalid_date": "Neplatné datum",
|
||||
"ws_err_invalid_format": "Neplatný formát",
|
||||
"ws_err_invalid_url": "Neplatný odkaz",
|
||||
"ws_err_not_configured": "Zatím nenastaveno",
|
||||
"ws_err_not_loaded": "Zatím nenačteno — zkuste to za chvíli znovu",
|
||||
"ws_err_limit_reached": "Dosažen limit",
|
||||
"ws_err_too_many": "Příliš mnoho položek",
|
||||
"ws_err_too_large": "Příliš velké",
|
||||
"ws_err_not_archived": "Není archivováno",
|
||||
"ws_err_invalid_target": "Neplatný cíl",
|
||||
"ws_err_create_failed": "Nepodařilo se vytvořit",
|
||||
"ws_err_archived": "Archivováno — nejprve obnovte",
|
||||
"ws_err_already_archived": "Již archivováno",
|
||||
"ws_err_unavailable": "Momentálně nedostupné",
|
||||
"ws_err_unauthorized": "Pro vašeho uživatele není povoleno",
|
||||
"ws_err_too_many_views": "Příliš mnoho uložených pohledů",
|
||||
"ws_err_storage_unavailable": "Úložiště není dostupné",
|
||||
"ws_err_replace_failed": "Nahrazení se nezdařilo",
|
||||
"ws_err_not_paused": "Není pozastaveno",
|
||||
"ws_err_not_available": "Nic k dispozici",
|
||||
"ws_err_no_url": "Nebyl zadán odkaz",
|
||||
"ws_err_no_phases": "Tento úkol nemá fáze",
|
||||
"ws_err_invalid_view": "Neplatný pohled",
|
||||
"ws_err_invalid_user": "Neznámý uživatel",
|
||||
"ws_err_invalid_range": "Neplatný rozsah",
|
||||
"ws_err_invalid_parent": "Neplatný nadřazený objekt",
|
||||
"ws_err_invalid_device": "Neznámé zařízení",
|
||||
"ws_err_empty_csv": "Soubor CSV je prázdný",
|
||||
"ws_err_empty": "Není co importovat",
|
||||
"ws_err_duplicate_failed": "Nepodařilo se duplikovat",
|
||||
"ws_err_already_paused": "Již pozastaveno",
|
||||
"ws_err_invalid_cursor": "Neplatná pozice fáze",
|
||||
"ws_err_invalid_entity_slug": "Neplatný název entity",
|
||||
"ws_err_invalid_trigger_config": "Neplatná konfigurace spouštěče",
|
||||
"ws_err_no_defaults": "Nejsou nastaveny výchozí hodnoty pro rychlé dokončení",
|
||||
"ws_err_self_link_device": "Objekt nelze propojit sám se sebou",
|
||||
"ws_err_too_early": "Příliš brzy — tento úkol lze dokončit až blíže k termínu",
|
||||
"feat_schedule_time": "Plánování podle denní doby",
|
||||
"feat_schedule_time_desc": "Úkoly se stanou po termínu v určenou denní dobu místo o půlnoci.",
|
||||
"schedule_time_toggle": "Termín v určitou hodinu",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Spustit při rovnosti (=)",
|
||||
"trigger_not_equals": "Spustit při odlišnosti od (≠)",
|
||||
"for_at_least_minutes": "Po dobu alespoň (minut)",
|
||||
"safety_interval_days": "Bezpečnostní interval (dny, volitelný)",
|
||||
"safety_interval": "Bezpečnostní interval (volitelný)",
|
||||
"trigger_combinator": "Kombinovat spouštěč a interval",
|
||||
"trigger_combinator_any": "Spouštěč nebo interval (co dřív)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Moje úkoly",
|
||||
"tab_calendar": "Kalendář",
|
||||
"cal_no_events": "Bez údržby",
|
||||
"cal_window_7": "7 dní",
|
||||
"cal_window_14": "14 dní",
|
||||
"cal_window_30": "30 dní",
|
||||
"cal_window_365": "1 rok",
|
||||
"cal_every_n_days": "každých {n} dní",
|
||||
"cal_source_time": "Čas",
|
||||
"cal_source_time_adaptive": "Čas (adaptivní)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Nepodařilo se vygenerovat QR kód.",
|
||||
"qr_error_no_url": "Není nakonfigurováno URL HA. Nastavte externí nebo interní URL v Nastavení → Systém → Síť.",
|
||||
"save_error": "Nepodařilo se uložit. Zkuste to znovu.",
|
||||
"subsave_warning": "Uloženo, ale jedno nastavení bylo odmítnuto: {detail}",
|
||||
"qr_print": "Tisk",
|
||||
"qr_download": "Stáhnout SVG",
|
||||
"qr_action": "Akce při skenování",
|
||||
"qr_action_view": "Zobrazit informace o údržbě",
|
||||
"qr_action_complete": "Označit údržbu jako dokončenou",
|
||||
"qr_url_mode": "Typ odkazu",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Lokální (mDNS)",
|
||||
"qr_mode_server": "URL serveru",
|
||||
"overview": "Přehled",
|
||||
"analysis": "Analýza",
|
||||
"recent_activities": "Nedávné aktivity",
|
||||
"search_notes": "Hledat v poznámkách",
|
||||
"avg_cost": "Prům. náklady",
|
||||
"no_advanced_features": "Žádné pokročilé funkce nejsou povoleny",
|
||||
"no_advanced_features_hint": "Povolte „Adaptivní intervaly” nebo „Sezónní vzory” v nastavení integrace pro zobrazení analytických dat.",
|
||||
"analysis_not_enough_data": "Zatím nedostatek dat pro analýzu.",
|
||||
"analysis_not_enough_data_hint": "Weibullova analýza vyžaduje alespoň 5 dokončených údržeb; sezónní vzory se stanou viditelné po 6+ datových bodech na měsíc.",
|
||||
"analysis_manual_task_hint": "Manuální úkoly bez intervalu negenerují analytická data.",
|
||||
"completions": "dokončení",
|
||||
"current": "Aktuální",
|
||||
"shorter": "Kratší",
|
||||
"longer": "Delší",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Minulá okna",
|
||||
"cal_forward_windows": "Budoucí okna",
|
||||
"history_edit_title": "Upravit záznam historie",
|
||||
"history_delete_entry": "Smazat záznam",
|
||||
"history_delete_confirm": "Smazat tento záznam historie? Datum posledního provedení se vrátí k předchozímu dokončení; fotografie zůstanou u objektu a spotřebované díly se nevrátí na sklad.",
|
||||
"history_edit_timestamp": "Časové razítko",
|
||||
"manufacturer": "Výrobce",
|
||||
"model": "Model",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Výchozí dny upozornění",
|
||||
"settings_consumable_threshold": "Práh „spotřební materiál nízký“ (%)",
|
||||
"settings_battery_low_percent": "Práh „baterie slabá“ (%)",
|
||||
"settings_battery_lifetimes": "Typická životnost baterií",
|
||||
"settings_battery_lifetimes_hint": "Použije se jen u baterií bez procent: poznámka Battery Notes jen s typem a datem výměny nebo senzor hlásící pouze „slabá“. Splatnost = poslední výměna + tato životnost. Baterie hlásící úroveň mají prognózu z naměřeného vybíjení. Po třech výměnách daného typu nahradí medián intervalů vestavěnou hodnotu — vaše hodnota má vždy přednost.",
|
||||
"settings_battery_lifetime_months": "měsíců",
|
||||
"settings_battery_lifetime_reset": "Použít výchozí",
|
||||
"settings_battery_lifetime_in_fleet": "ve vaší flotile",
|
||||
"settings_battery_lifetime_learned_models": "Naučeno podle modelu: {list}",
|
||||
"settings_thresholds_hint": "Výchozí hodnoty pro nová Navrhovaná nastavení (zbývající procenta) a pro baterie flotily bez vlastního prahu Battery Notes. Stávající úkoly si ponechají svou hodnotu.",
|
||||
"settings_value_out_of_range": "Hodnota musí být mezi {min} a {max}",
|
||||
"bn_summary": "{name}: {pct} % pro {n} baterií",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} zařízení s vlastním prahem:",
|
||||
"bn_more": "+ {n} dalších",
|
||||
"settings_row_actions": "Akce v řádcích úkolů",
|
||||
"settings_ref_numbers_in_lists": "Referenční čísla v seznamech",
|
||||
"settings_ref_numbers_in_lists_hint": "Zobrazí štítky #8 / #8.3 před názvy objektů a úkolů v seznamu Dnes, tabulce úkolů, kartách objektů a tabulce objektů.",
|
||||
"row_actions_buttons_compact": "Tlačítka (na telefonu jen ikony)",
|
||||
"row_actions_buttons": "Tlačítka s textem",
|
||||
"row_actions_icons": "Ikony (klasické)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Doba odložení (hodiny)",
|
||||
"settings_budget": "Rozpočet",
|
||||
"settings_currency": "Měna",
|
||||
"settings_currency_decimals": "Desetinná místa částek",
|
||||
"settings_currency_decimals_hint": "Kolik desetinných míst zobrazuje každá částka: KPI, rozpočty, náklady v seznamech a sestavách, rozpočtová upozornění. 0 = celá čísla.",
|
||||
"settings_budget_monthly": "Měsíční rozpočet",
|
||||
"settings_budget_yearly": "Roční rozpočet",
|
||||
"settings_budget_alerts": "Rozpočtová upozornění",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Exportovat YAML",
|
||||
"settings_export_csv": "Exportovat CSV",
|
||||
"settings_export_settings": "Exportovat nastavení (JSON)",
|
||||
"settings_import_csv": "Importovat CSV",
|
||||
"settings_import_placeholder": "Vložte sem obsah JSON nebo CSV…",
|
||||
"settings_import_btn": "Importovat",
|
||||
"settings_import_success": "{count} objektů úspěšně importováno.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Akce HA na úlohu při dokončení + QR rychlého dokončení s předvolenými hodnotami.",
|
||||
"on_complete_action_title": "Při dokončení: spustit akci HA (volitelné)",
|
||||
"on_complete_action_desc": "Volá službu HA, když je úloha dokončena — např. resetuje čítač na zařízení.",
|
||||
"on_complete_action_service": "Služba",
|
||||
"on_complete_action_target": "Cílová entita",
|
||||
"on_complete_action_data": "Data (JSON, volitelné)",
|
||||
"on_complete_action_test": "Testovat akci",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Vybrat fotky",
|
||||
"choose_photo": "Vybrat fotku",
|
||||
"photos_android_hint": "Aplikace pro Android předá jednu fotku na výběr — každý výběr se přidá.",
|
||||
"add_photos": "Přidat fotky",
|
||||
"photos_limit": "Nejvýše {max} fotek na dokončení",
|
||||
"history_edit_photos_hint": "Zde odebraná fotka zůstává v dokumentech objektu.",
|
||||
"uploading": "Nahrávání…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Stáhnout",
|
||||
"doc_close": "Zavřít",
|
||||
"doc_camera": "Vyfotit",
|
||||
"camera_capture_shoot": "Vyfotit",
|
||||
"camera_switch_lens": "Přepnout kameru",
|
||||
"doc_drop_hint": "Přetáhněte soubory sem",
|
||||
"doc_task_none": "Žádné dokumenty spojené s tímto úkolem.",
|
||||
"doc_link_existing": "Připojit dokument…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Zaznamená dokončení (nastaví poslední provedení), jakmile se spouštěč sám vyřeší — např. doplněná sůl, vyměněný filtr.",
|
||||
"doc_search": "Hledat dokumenty…",
|
||||
"doc_search_none": "Žádné odpovídající dokumenty",
|
||||
"doc_description": "Popis (volitelné)",
|
||||
"doc_sort": "Seřadit dokumenty",
|
||||
"doc_sort_newest": "Nejnovější první",
|
||||
"doc_sort_oldest": "Nejstarší první",
|
||||
"doc_sort_title": "Podle názvu (1, 2, 3 …)",
|
||||
"doc_sort_category": "Podle kategorie",
|
||||
"link_device_optional": "Propojit s existujícím zařízením (volitelné)",
|
||||
"parent_object_optional": "Nadřazený objekt (volitelné)",
|
||||
"parent_none": "(Žádný nadřazený)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Upozorňovat jen pro zobrazení",
|
||||
"settings_notify_scope_all": "Všechny úkoly",
|
||||
"settings_notify_scope_hint": "Připomenutí posílají jen úkoly odpovídající filtrům štítku/uživatele zvoleného zobrazení. Stav, řazení a seskupení zobrazení se zde ignorují.",
|
||||
"settings_notify_completed": "Oznámení o dokončení",
|
||||
"settings_notify_completed_hint": "Zpráva pro domácnost, když je úkol dokončen, s důvodem a tím, kdo to udělal. „Jen automatická“ hlásí pouze dokončení, která nikdo neudělal na místě: zotavení senzoru, odškrtnutí v nákupním seznamu, volání služby automatizací. Jen na službu domácnosti; tiché hodiny a denní limit platí.",
|
||||
"notify_completed_off": "Vypnuto",
|
||||
"notify_completed_automatic": "Jen automatická dokončení",
|
||||
"notify_completed_all": "Všechna dokončení",
|
||||
"settings_notify_rule": "Vlastní pravidlo oznámení",
|
||||
"settings_notify_rule_hint": "Každé oznámení navíc vyvolá událost maintenance_supporter_notification (druh, stav, objekt, úkol, referenční čísla, priorita, odkaz, data). Nasměrujte ji automatizací — např. do Tickeru, Telegramu nebo Pushoveru.",
|
||||
"settings_notify_event_only": "Jen událost, nic neposílat",
|
||||
"settings_notify_event_only_hint": "Doručení zajišťuje vaše automatizace. Intervaly opakování, tiché hodiny a denní limit dál rozhodují, kdy se událost vyvolá.",
|
||||
"settings_notify_extra_data": "Další data oznámení (šablona)",
|
||||
"settings_notify_extra_data_hint": "JSON nebo YAML, Jinja povoleno; sloučí se do data volání notify (vaše klíče mají přednost). Proměnné: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Ověřte tlačítkem Odeslat test.",
|
||||
"settings_notify_extra_data_hint": "JSON nebo YAML, Jinja povoleno; sloučí se do data volání notify (vaše klíče mají přednost). Proměnné: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Ověřte tlačítkem Odeslat test.",
|
||||
"card_saved_view": "Uložené zobrazení",
|
||||
"card_saved_view_none": "Žádné",
|
||||
"card_saved_view_help": "Použije filtry stavu, uživatele a štítku zobrazení navíc k výše uvedeným filtrům. Řazení a seskupení zobrazení jsou nastavení panelu a na kartě se nepoužijí.",
|
||||
"panel_card_tab": "Otevřít na kartě",
|
||||
"panel_card_tab_default": "Zapamatovaná karta (jako v panelu)",
|
||||
"panel_card_view": "Otevřít s uloženým pohledem",
|
||||
"panel_card_height": "Výška",
|
||||
"panel_card_height_help": "Prázdné = vyplní obrazovku pod kartou (zobrazení panel). Jinak délka CSS jako 600px nebo 80vh pro zobrazení s dalšími kartami.",
|
||||
"panel_card_not_registered": "Panel Maintenance Supporter není k dispozici — je integrace nastavená?",
|
||||
"panel_card_load_failed": "Panel Maintenance Supporter se nepodařilo načíst — obnovte stránku (po aktualizaci: vymažte mezipaměť prohlížeče).",
|
||||
"doc_part_none": "K tomuto dílu nejsou připojeny žádné dokumenty.",
|
||||
"settings_templates_toggle_group": "Zapnout nebo vypnout všechny šablony v této skupině",
|
||||
"setups_button": "Navrhovaná nastavení",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "V pořádku",
|
||||
"battery_fleet_status_due": "K výměně",
|
||||
"battery_fleet_predicted_on": "Očekáváno kolem {date}",
|
||||
"battery_fleet_predicted_typical": "Očekáváno kolem {date} — {months} měsíců typicky pro {type} ({source})",
|
||||
"lifetime_source_default": "vestavěná výchozí hodnota",
|
||||
"lifetime_source_table": "vestavěná tabulka",
|
||||
"lifetime_source_learned": "naučeno z {n} výměn",
|
||||
"lifetime_source_override": "vaše nastavení",
|
||||
"lifetime_source_learned_device": "naučeno z {n} výměn tohoto zařízení",
|
||||
"lifetime_source_learned_model": "naučeno z {n} výměn u zařízení tohoto modelu",
|
||||
"battery_fleet_predicted_trend": "Předpověď z trendu vybíjení této baterie: přibližně {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Akumulátor: nabíjí se místo výměny — nikdy na nákupním seznamu",
|
||||
"battery_fleet_sort_name": "Řadit podle názvu",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Použité díly",
|
||||
"print_inc_photos": "Fotky",
|
||||
"print_inc_documents": "Propojené dokumenty",
|
||||
"print_inc_doc_desc": "Popisy dokumentů",
|
||||
"print_inc_checklist": "Kontrolní seznam",
|
||||
"print_inc_notes": "Poznámky",
|
||||
"print_inc_costs": "Náklady a doba",
|
||||
"print_inc_person": "Provedl",
|
||||
"print_inc_refs": "Referenční čísla",
|
||||
"print_inc_bare": "Dokončení bez podrobností",
|
||||
"print_inc_qr": "QR kód pro každý úkol",
|
||||
"print_button": "Tisk",
|
||||
"report_scan_hint": "Naskenujte pro otevření úkolu",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Driftstid",
|
||||
"runtime_hours": "Måldriftstid (timer)",
|
||||
"target_value": "Målværdi",
|
||||
"baseline": "Referenceværdi",
|
||||
"target_changes": "Antal målændringer",
|
||||
"for_minutes": "I (minutter)",
|
||||
"time_based": "Tidsbaseret",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Genereret",
|
||||
"report_times_done": "Udført",
|
||||
"report_total_cost": "Samlede omkostninger",
|
||||
"report_every": "hver {n}. {unit}",
|
||||
"report_notes": "Noter",
|
||||
"report_col_type": "Type",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Tidsplan",
|
||||
"duration": "Varighed",
|
||||
"minutes_short": "min",
|
||||
"both": "Begge",
|
||||
"trigger_val": "Udløserværdi",
|
||||
"complete_title": "Fuldfør: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: forkert type (forventet: {type})",
|
||||
"err_invalid_choice": "{field}: ikke en tilladt værdi",
|
||||
"err_invalid_value": "{field}: ugyldig værdi",
|
||||
"ws_err_not_found": "Ikke fundet — det er måske blevet slettet i mellemtiden",
|
||||
"ws_err_invalid_input": "Ugyldig input",
|
||||
"ws_err_invalid_date": "Ugyldig dato",
|
||||
"ws_err_invalid_format": "Ugyldigt format",
|
||||
"ws_err_invalid_url": "Ugyldigt link",
|
||||
"ws_err_not_configured": "Ikke sat op endnu",
|
||||
"ws_err_not_loaded": "Ikke indlæst endnu — prøv igen om lidt",
|
||||
"ws_err_limit_reached": "Grænsen er nået",
|
||||
"ws_err_too_many": "For mange poster",
|
||||
"ws_err_too_large": "For stort",
|
||||
"ws_err_not_archived": "Ikke arkiveret",
|
||||
"ws_err_invalid_target": "Ugyldigt mål",
|
||||
"ws_err_create_failed": "Kunne ikke oprettes",
|
||||
"ws_err_archived": "Arkiveret — gendan først",
|
||||
"ws_err_already_archived": "Allerede arkiveret",
|
||||
"ws_err_unavailable": "Ikke tilgængelig lige nu",
|
||||
"ws_err_unauthorized": "Ikke tilladt for din bruger",
|
||||
"ws_err_too_many_views": "For mange gemte visninger",
|
||||
"ws_err_storage_unavailable": "Lageret er ikke tilgængeligt",
|
||||
"ws_err_replace_failed": "Udskiftning mislykkedes",
|
||||
"ws_err_not_paused": "Ikke sat på pause",
|
||||
"ws_err_not_available": "Intet tilgængeligt",
|
||||
"ws_err_no_url": "Intet link angivet",
|
||||
"ws_err_no_phases": "Opgaven har ingen faser",
|
||||
"ws_err_invalid_view": "Ugyldig visning",
|
||||
"ws_err_invalid_user": "Ukendt bruger",
|
||||
"ws_err_invalid_range": "Ugyldigt interval",
|
||||
"ws_err_invalid_parent": "Ugyldigt overordnet objekt",
|
||||
"ws_err_invalid_device": "Ukendt enhed",
|
||||
"ws_err_empty_csv": "CSV-filen er tom",
|
||||
"ws_err_empty": "Intet at importere",
|
||||
"ws_err_duplicate_failed": "Kunne ikke duplikeres",
|
||||
"ws_err_already_paused": "Allerede sat på pause",
|
||||
"ws_err_invalid_cursor": "Ugyldig faseposition",
|
||||
"ws_err_invalid_entity_slug": "Ugyldigt entitetsnavn",
|
||||
"ws_err_invalid_trigger_config": "Ugyldig triggerkonfiguration",
|
||||
"ws_err_no_defaults": "Ingen standardværdier for hurtig fuldførelse",
|
||||
"ws_err_self_link_device": "Et objekt kan ikke knyttes til sig selv",
|
||||
"ws_err_too_early": "For tidligt — opgaven kan først fuldføres tættere på forfaldsdatoen",
|
||||
"feat_schedule_time": "Planlægning efter tidspunkt på dagen",
|
||||
"feat_schedule_time_desc": "Opgaver bliver forfaldne på et bestemt tidspunkt på dagen i stedet for midnat.",
|
||||
"schedule_time_toggle": "Forfalder på et bestemt tidspunkt",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Udløs ved lig med (=)",
|
||||
"trigger_not_equals": "Udløs ved forskellig fra (≠)",
|
||||
"for_at_least_minutes": "I mindst (minutter)",
|
||||
"safety_interval_days": "Sikkerhedsinterval (dage, valgfrit)",
|
||||
"safety_interval": "Sikkerhedsinterval (valgfrit)",
|
||||
"trigger_combinator": "Kombinér trigger og interval",
|
||||
"trigger_combinator_any": "Trigger eller interval (først opfyldt)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Mine opgaver",
|
||||
"tab_calendar": "Kalender",
|
||||
"cal_no_events": "Ingen vedligeholdelse",
|
||||
"cal_window_7": "7 dage",
|
||||
"cal_window_14": "14 dage",
|
||||
"cal_window_30": "30 dage",
|
||||
"cal_window_365": "1 år",
|
||||
"cal_every_n_days": "hver {n}. dag",
|
||||
"cal_source_time": "Tidsbaseret",
|
||||
"cal_source_time_adaptive": "Tidsbaseret (adaptiv)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "Kunne ikke generere QR-kode.",
|
||||
"qr_error_no_url": "Ingen HA-URL konfigureret. Angiv en ekstern eller intern URL under Indstillinger → System → Netværk.",
|
||||
"save_error": "Kunne ikke gemme. Prøv igen.",
|
||||
"subsave_warning": "Gemt, men én indstilling blev afvist: {detail}",
|
||||
"qr_print": "Udskriv",
|
||||
"qr_download": "Download SVG",
|
||||
"qr_action": "Handling ved scanning",
|
||||
"qr_action_view": "Vis vedligeholdelsesoplysninger",
|
||||
"qr_action_complete": "Marker vedligeholdelse som fuldført",
|
||||
"qr_url_mode": "Linktype",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Lokal (mDNS)",
|
||||
"qr_mode_server": "Server-URL",
|
||||
"overview": "Oversigt",
|
||||
"analysis": "Analyse",
|
||||
"recent_activities": "Seneste aktiviteter",
|
||||
"search_notes": "Søg i noter",
|
||||
"avg_cost": "Gns. omkostning",
|
||||
"no_advanced_features": "Ingen avancerede funktioner aktiveret",
|
||||
"no_advanced_features_hint": "Aktiver „Adaptive intervaller” eller „Sæsonmønstre” i integrationsindstillingerne for at se analysedata her.",
|
||||
"analysis_not_enough_data": "Ikke nok data til analyse endnu.",
|
||||
"analysis_not_enough_data_hint": "Weibull-analyse kræver mindst 5 fuldførte vedligeholdelser; sæsonmønstre bliver synlige efter 6+ datapunkter pr. måned.",
|
||||
"analysis_manual_task_hint": "Manuelle opgaver uden et interval genererer ikke analysedata.",
|
||||
"completions": "fuldførelser",
|
||||
"current": "Nuværende",
|
||||
"shorter": "Kortere",
|
||||
"longer": "Længere",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Tidligere vinduer",
|
||||
"cal_forward_windows": "Kommende vinduer",
|
||||
"history_edit_title": "Rediger historikpost",
|
||||
"history_delete_entry": "Slet post",
|
||||
"history_delete_confirm": "Slet denne historikpost? Datoen for seneste udførelse falder tilbage til den forrige; fotos bliver hos objektet, og forbrugte dele lægges ikke tilbage på lager.",
|
||||
"history_edit_timestamp": "Tidsstempel",
|
||||
"manufacturer": "Producent",
|
||||
"model": "Model",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Standard advarselsdage",
|
||||
"settings_consumable_threshold": "Tærskel „forbrugsvare lav“ (%)",
|
||||
"settings_battery_low_percent": "Tærskel „batteri lavt“ (%)",
|
||||
"settings_battery_lifetimes": "Typiske batterilevetider",
|
||||
"settings_battery_lifetimes_hint": "Bruges kun til batterier uden procent: en Battery Notes-note med kun type og udskiftningsdato, eller en sensor der kun melder \"lavt\". Forfaldsdato = seneste udskiftning + denne levetid. Batterier der melder niveau får prognosen fra den målte afladning. Når flåden har set tre udskiftninger af en type, overtager medianintervallet fra den indbyggede værdi — din egen værdi vinder altid.",
|
||||
"settings_battery_lifetime_months": "måneder",
|
||||
"settings_battery_lifetime_reset": "Brug standard",
|
||||
"settings_battery_lifetime_in_fleet": "i din flåde",
|
||||
"settings_battery_lifetime_learned_models": "Lært pr. model: {list}",
|
||||
"settings_thresholds_hint": "Standardværdier for nye Foreslåede opsætninger (resterende procent) og for flådebatterier uden egen Battery Notes-tærskel. Eksisterende opgaver beholder deres værdi.",
|
||||
"settings_value_out_of_range": "Værdien skal være mellem {min} og {max}",
|
||||
"bn_summary": "{name}: {pct} % for {n} batterier",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} enheder med egen tærskel:",
|
||||
"bn_more": "+ {n} mere",
|
||||
"settings_row_actions": "Handlinger i opgaverækker",
|
||||
"settings_ref_numbers_in_lists": "Referencenumre i lister",
|
||||
"settings_ref_numbers_in_lists_hint": "Viser brikkerne #8 / #8.3 foran objekt- og opgavenavne i I dag-listen, opgavetabellen, objektkortene og objekttabellen.",
|
||||
"row_actions_buttons_compact": "Knapper (kun ikoner på telefonen)",
|
||||
"row_actions_buttons": "Knapper med tekst",
|
||||
"row_actions_icons": "Ikoner (klassisk)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Udsættelsesvarighed (timer)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Valuta",
|
||||
"settings_currency_decimals": "Decimaler for beløb",
|
||||
"settings_currency_decimals_hint": "Hvor mange decimaler hvert beløb viser: nøgletal, budgetter, omkostninger i lister og rapporter, budgetadvarsler. 0 = hele tal.",
|
||||
"settings_budget_monthly": "Månedligt budget",
|
||||
"settings_budget_yearly": "Årligt budget",
|
||||
"settings_budget_alerts": "Budgetadvarsler",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "Eksporter YAML",
|
||||
"settings_export_csv": "Eksporter CSV",
|
||||
"settings_export_settings": "Eksportér indstillinger (JSON)",
|
||||
"settings_import_csv": "Importer CSV",
|
||||
"settings_import_placeholder": "Indsæt JSON- eller CSV-indhold her…",
|
||||
"settings_import_btn": "Importer",
|
||||
"settings_import_success": "{count} objekter importeret.",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "HA-handling pr. opgave ved fuldførelse + hurtig-fuldfør-QR med forudindstillede værdier.",
|
||||
"on_complete_action_title": "Ved fuldførelse: udløs HA-handling (valgfrit)",
|
||||
"on_complete_action_desc": "Kalder en HA-tjeneste, når opgaven fuldføres — f.eks. nulstil en tæller på enheden.",
|
||||
"on_complete_action_service": "Tjeneste",
|
||||
"on_complete_action_target": "Målenhed",
|
||||
"on_complete_action_target_hint": "Bemærk: enhedens domæne skal matche tjenesten — f.eks. virker 'button.press' kun på button.*, 'counter.increment' kun på counter.*, 'input_button.press' kun på input_button.* osv. Ved et misforhold mislykkes handlingen lydløst (HA logger 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Data (JSON, valgfrit)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Vælg fotos",
|
||||
"choose_photo": "Vælg foto",
|
||||
"photos_android_hint": "Android-appen afleverer ét foto pr. valg — hvert valg tilføjes.",
|
||||
"add_photos": "Tilføj fotos",
|
||||
"photos_limit": "Højst {max} fotos pr. fuldførelse",
|
||||
"history_edit_photos_hint": "Et foto, der fjernes her, bliver i objektets dokumenter.",
|
||||
"uploading": "Uploader…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Download",
|
||||
"doc_close": "Luk",
|
||||
"doc_camera": "Tag billede",
|
||||
"camera_capture_shoot": "Tag billede",
|
||||
"camera_switch_lens": "Skift kamera",
|
||||
"doc_drop_hint": "Slip filer her",
|
||||
"doc_task_none": "Ingen dokumenter knyttet til denne opgave.",
|
||||
"doc_link_existing": "Knyt et dokument…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Registrerer en fuldførelse (sætter senest udført), når udløseren løser sig selv — f.eks. salt påfyldt, filter udskiftet.",
|
||||
"doc_search": "Søg dokumenter…",
|
||||
"doc_search_none": "Ingen matchende dokumenter",
|
||||
"doc_description": "Beskrivelse (valgfri)",
|
||||
"doc_sort": "Sortér dokumenter",
|
||||
"doc_sort_newest": "Nyeste først",
|
||||
"doc_sort_oldest": "Ældste først",
|
||||
"doc_sort_title": "Efter titel (1, 2, 3 …)",
|
||||
"doc_sort_category": "Efter kategori",
|
||||
"link_device_optional": "Tilknyt eksisterende enhed (valgfrit)",
|
||||
"parent_object_optional": "Overordnet objekt (valgfrit)",
|
||||
"parent_none": "(Intet overordnet)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Underret kun for visning",
|
||||
"settings_notify_scope_all": "Alle opgaver",
|
||||
"settings_notify_scope_hint": "Kun opgaver, der matcher den valgte visnings etiket-/brugerfiltre, sender påmindelser. Visningens status, sortering og gruppering ignoreres her.",
|
||||
"settings_notify_completed": "Notifikationer om udførelse",
|
||||
"settings_notify_completed_hint": "En besked til husstanden, når en opgave er udført, med årsag og hvem der gjorde det. \"Kun automatiske\" melder kun udførelser, som ingen lavede på stedet: sensorgendannelse, afkrydsning på indkøbslisten, et servicekald fra en automatisering. Kun til husstandstjenesten; stilletimer og dagsgrænsen gælder.",
|
||||
"notify_completed_off": "Fra",
|
||||
"notify_completed_automatic": "Kun automatiske udførelser",
|
||||
"notify_completed_all": "Alle udførelser",
|
||||
"settings_notify_rule": "Din egen notifikationsregel",
|
||||
"settings_notify_rule_hint": "Hver notifikation udløser også hændelsen maintenance_supporter_notification (type, status, objekt, opgave, referencenumre, prioritet, link, nyttelast). Videresend den med en automatisering — fx til Ticker, Telegram eller Pushover.",
|
||||
"settings_notify_event_only": "Udløs kun hændelsen, send intet selv",
|
||||
"settings_notify_event_only_hint": "Din automatisering står for hele leveringen. Gentagelsesintervaller, stille timer og dagsloftet gælder stadig for, hvornår hændelsen udløses.",
|
||||
"settings_notify_extra_data": "Ekstra notifikationsdata (skabelon)",
|
||||
"settings_notify_extra_data_hint": "JSON eller YAML, Jinja tilladt; flettes ind i notify-kaldets data (dine nøgler vinder). Variabler: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Test med knappen Send test.",
|
||||
"settings_notify_extra_data_hint": "JSON eller YAML, Jinja tilladt; flettes ind i notify-kaldets data (dine nøgler vinder). Variabler: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Test med knappen Send test.",
|
||||
"card_saved_view": "Gemt visning",
|
||||
"card_saved_view_none": "Ingen",
|
||||
"card_saved_view_help": "Anvender visningens status-, bruger- og etiketfiltre oven på filtrene ovenfor. Visningens sortering og gruppering er panelvisningsindstillinger og anvendes ikke på kortet.",
|
||||
"panel_card_tab": "Åbn på fanen",
|
||||
"panel_card_tab_default": "Husket fane (som i panelet)",
|
||||
"panel_card_view": "Åbn med gemt visning",
|
||||
"panel_card_height": "Højde",
|
||||
"panel_card_height_help": "Tom = fylder skærmen under kortet (panelvisning). Ellers en CSS-længde som 600px eller 80vh til visninger med andre kort.",
|
||||
"panel_card_not_registered": "Maintenance Supporter-panelet er ikke tilgængeligt — er integrationen sat op?",
|
||||
"panel_card_load_failed": "Maintenance Supporter-panelet kunne ikke indlæses — genindlæs siden (efter en opdatering: ryd browserens cache).",
|
||||
"doc_part_none": "Ingen dokumenter knyttet til denne del.",
|
||||
"settings_templates_toggle_group": "Slå alle skabeloner i denne gruppe til eller fra",
|
||||
"setups_button": "Foreslåede opsætninger",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "I orden",
|
||||
"battery_fleet_status_due": "Forfalden",
|
||||
"battery_fleet_predicted_on": "Forventes omkring {date}",
|
||||
"battery_fleet_predicted_typical": "Forventes omkring {date} — {months} måneder typisk for {type} ({source})",
|
||||
"lifetime_source_default": "indbygget standardværdi",
|
||||
"lifetime_source_table": "indbygget tabel",
|
||||
"lifetime_source_learned": "lært fra {n} udskiftninger",
|
||||
"lifetime_source_override": "din indstilling",
|
||||
"lifetime_source_learned_device": "lært fra {n} udskiftninger på denne enhed",
|
||||
"lifetime_source_learned_model": "lært fra {n} udskiftninger på enheder af denne model",
|
||||
"battery_fleet_predicted_trend": "Forudsagt ud fra batteriets afladningstendens: omkring {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Genopladeligt: oplad i stedet for at udskifte — aldrig på indkøbslisten",
|
||||
"battery_fleet_sort_name": "Sortér efter navn",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Brugte dele",
|
||||
"print_inc_photos": "Fotos",
|
||||
"print_inc_documents": "Tilknyttede dokumenter",
|
||||
"print_inc_doc_desc": "Dokumentbeskrivelser",
|
||||
"print_inc_checklist": "Tjekliste",
|
||||
"print_inc_notes": "Noter",
|
||||
"print_inc_costs": "Omkostning og varighed",
|
||||
"print_inc_person": "Udført af",
|
||||
"print_inc_refs": "Referencenumre",
|
||||
"print_inc_bare": "Udførelser uden detaljer",
|
||||
"print_inc_qr": "QR-kode pr. opgave",
|
||||
"print_button": "Udskriv",
|
||||
"report_scan_hint": "Scan for at åbne opgaven",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Laufzeit",
|
||||
"runtime_hours": "Ziel-Laufzeit (Stunden)",
|
||||
"target_value": "Zielwert",
|
||||
"baseline": "Nulllinie",
|
||||
"target_changes": "Ziel-Änderungen",
|
||||
"for_minutes": "Für (Minuten)",
|
||||
"time_based": "Zeitbasiert",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Erstellt",
|
||||
"report_times_done": "Erledigt",
|
||||
"report_total_cost": "Gesamtkosten",
|
||||
"report_every": "alle {n} {unit}",
|
||||
"report_notes": "Notizen",
|
||||
"report_col_type": "Typ",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Zeitplan",
|
||||
"duration": "Dauer",
|
||||
"minutes_short": "Min.",
|
||||
"both": "Beides",
|
||||
"trigger_val": "Trigger-Wert",
|
||||
"complete_title": "Erledigt: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: falscher Typ (erwartet: {type})",
|
||||
"err_invalid_choice": "{field}: nicht erlaubter Wert",
|
||||
"err_invalid_value": "{field}: ungültiger Wert",
|
||||
"ws_err_not_found": "Nicht gefunden — es wurde vielleicht inzwischen gelöscht",
|
||||
"ws_err_invalid_input": "Ungültige Eingabe",
|
||||
"ws_err_invalid_date": "Ungültiges Datum",
|
||||
"ws_err_invalid_format": "Ungültiges Format",
|
||||
"ws_err_invalid_url": "Ungültiger Link",
|
||||
"ws_err_not_configured": "Noch nicht eingerichtet",
|
||||
"ws_err_not_loaded": "Noch nicht geladen — gleich noch einmal versuchen",
|
||||
"ws_err_limit_reached": "Limit erreicht",
|
||||
"ws_err_too_many": "Zu viele Einträge",
|
||||
"ws_err_too_large": "Zu groß",
|
||||
"ws_err_not_archived": "Nicht archiviert",
|
||||
"ws_err_invalid_target": "Ungültiges Ziel",
|
||||
"ws_err_create_failed": "Konnte nicht angelegt werden",
|
||||
"ws_err_archived": "Archiviert — zuerst wiederherstellen",
|
||||
"ws_err_already_archived": "Bereits archiviert",
|
||||
"ws_err_unavailable": "Derzeit nicht verfügbar",
|
||||
"ws_err_unauthorized": "Für deinen Benutzer nicht erlaubt",
|
||||
"ws_err_too_many_views": "Zu viele gespeicherte Ansichten",
|
||||
"ws_err_storage_unavailable": "Der Speicher ist nicht verfügbar",
|
||||
"ws_err_replace_failed": "Ersetzen fehlgeschlagen",
|
||||
"ws_err_not_paused": "Nicht pausiert",
|
||||
"ws_err_not_available": "Nichts verfügbar",
|
||||
"ws_err_no_url": "Kein Link angegeben",
|
||||
"ws_err_no_phases": "Diese Aufgabe hat keine Phasen",
|
||||
"ws_err_invalid_view": "Ungültige Ansicht",
|
||||
"ws_err_invalid_user": "Unbekannter Benutzer",
|
||||
"ws_err_invalid_range": "Ungültiger Zeitraum",
|
||||
"ws_err_invalid_parent": "Ungültiges übergeordnetes Objekt",
|
||||
"ws_err_invalid_device": "Unbekanntes Gerät",
|
||||
"ws_err_empty_csv": "Die CSV-Datei ist leer",
|
||||
"ws_err_empty": "Nichts zu importieren",
|
||||
"ws_err_duplicate_failed": "Konnte nicht dupliziert werden",
|
||||
"ws_err_already_paused": "Bereits pausiert",
|
||||
"ws_err_invalid_cursor": "Ungültige Phasenposition",
|
||||
"ws_err_invalid_entity_slug": "Ungültiger Entitätsname",
|
||||
"ws_err_invalid_trigger_config": "Ungültige Trigger-Konfiguration",
|
||||
"ws_err_no_defaults": "Keine Vorgaben für das Schnell-Erledigen hinterlegt",
|
||||
"ws_err_self_link_device": "Ein Objekt kann nicht mit sich selbst verknüpft werden",
|
||||
"ws_err_too_early": "Zu früh — diese Aufgabe kann erst näher am Fälligkeitsdatum erledigt werden",
|
||||
"feat_schedule_time": "Uhrzeit-Scheduling",
|
||||
"feat_schedule_time_desc": "Tasks werden zu einer festen Uhrzeit fällig statt um Mitternacht.",
|
||||
"schedule_time_toggle": "Zu einer bestimmten Uhrzeit fällig",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Auslösen bei genau (=)",
|
||||
"trigger_not_equals": "Auslösen bei abweichend von (≠)",
|
||||
"for_at_least_minutes": "Für mindestens (Minuten)",
|
||||
"safety_interval_days": "Sicherheitsintervall (Tage, optional)",
|
||||
"safety_interval": "Sicherheitsintervall (optional)",
|
||||
"trigger_combinator": "Trigger und Intervall kombinieren",
|
||||
"trigger_combinator_any": "Trigger oder Intervall (zuerst erfüllt)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Meine Aufgaben",
|
||||
"tab_calendar": "Kalender",
|
||||
"cal_no_events": "Keine Wartung",
|
||||
"cal_window_7": "7 Tage",
|
||||
"cal_window_14": "14 Tage",
|
||||
"cal_window_30": "30 Tage",
|
||||
"cal_window_365": "1 Jahr",
|
||||
"cal_every_n_days": "alle {n} Tage",
|
||||
"cal_source_time": "Zeit-basiert",
|
||||
"cal_source_time_adaptive": "Zeit-basiert (adaptiv)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "QR-Code konnte nicht generiert werden.",
|
||||
"qr_error_no_url": "Keine HA-URL konfiguriert. Bitte unter Einstellungen → System → Netzwerk eine externe oder interne URL setzen.",
|
||||
"save_error": "Fehler beim Speichern. Bitte erneut versuchen.",
|
||||
"subsave_warning": "Gespeichert, aber eine Einstellung wurde abgelehnt: {detail}",
|
||||
"qr_print": "Drucken",
|
||||
"qr_download": "SVG herunterladen",
|
||||
"qr_action": "Aktion beim Scannen",
|
||||
"qr_action_view": "Wartungsinfo anzeigen",
|
||||
"qr_action_complete": "Wartung als erledigt markieren",
|
||||
"qr_url_mode": "Link-Typ",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Lokal (mDNS)",
|
||||
"qr_mode_server": "Server-URL",
|
||||
"overview": "Übersicht",
|
||||
"analysis": "Analyse",
|
||||
"recent_activities": "Letzte Aktivitäten",
|
||||
"search_notes": "Notizen durchsuchen",
|
||||
"avg_cost": "Ø Kosten",
|
||||
"no_advanced_features": "Keine erweiterten Funktionen aktiviert",
|
||||
"no_advanced_features_hint": "Aktiviere „Adaptive Intervalle“ oder „Saisonale Muster“ in den Integrationseinstellungen, um hier Analysedaten zu sehen.",
|
||||
"analysis_not_enough_data": "Noch nicht genügend Daten für die Analyse vorhanden.",
|
||||
"analysis_not_enough_data_hint": "Die Weibull-Analyse benötigt mindestens 5 abgeschlossene Wartungen, saisonale Muster werden nach 6+ Datenpunkten pro Monat sichtbar.",
|
||||
"analysis_manual_task_hint": "Manuelle Aufgaben ohne Intervall erzeugen keine Analysedaten.",
|
||||
"completions": "Abschlüsse",
|
||||
"current": "Aktuell",
|
||||
"shorter": "Kürzer",
|
||||
"longer": "Länger",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Vergangene Fenster",
|
||||
"cal_forward_windows": "Zukünftige Fenster",
|
||||
"history_edit_title": "Verlaufseintrag bearbeiten",
|
||||
"history_delete_entry": "Eintrag löschen",
|
||||
"history_delete_confirm": "Diesen Verlaufseintrag löschen? Das Datum der letzten Erledigung fällt auf die vorherige zurück; Fotos bleiben beim Objekt, verbrauchte Teile werden nicht zurückgebucht.",
|
||||
"history_edit_timestamp": "Zeitstempel",
|
||||
"manufacturer": "Hersteller",
|
||||
"model": "Modell",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Standard-Warntage",
|
||||
"settings_consumable_threshold": "Schwelle „Verbrauchsmaterial niedrig“ (%)",
|
||||
"settings_battery_low_percent": "Schwelle „Batterie niedrig“ (%)",
|
||||
"settings_battery_lifetimes": "Typische Batterie-Lebensdauern",
|
||||
"settings_battery_lifetimes_hint": "Wird nur für Batterien ohne Prozentanzeige verwendet: eine Battery-Notes-Notiz, die nur Typ und Austauschdatum kennt, oder ein Sensor, der nur „schwach“ meldet. Deren Fälligkeit ist letzter Wechsel + diese Lebensdauer. Batterien mit Füllstand bekommen ihre Prognose aus der gemessenen Entladung. Sobald die Flotte drei Wechsel eines Typs gesehen hat, ersetzt das mittlere Intervall den eingebauten Wert — dein eigener Wert gewinnt immer.",
|
||||
"settings_battery_lifetime_months": "Monate",
|
||||
"settings_battery_lifetime_reset": "Standard verwenden",
|
||||
"settings_battery_lifetime_in_fleet": "in deiner Flotte",
|
||||
"settings_battery_lifetime_learned_models": "Gelernt je Modell: {list}",
|
||||
"settings_thresholds_hint": "Vorgaben für neue Vorgeschlagene Einrichtungen (Prozent-Restwert) und für Flotten-Batterien ohne eigene Battery-Notes-Schwelle. Bestehende Aufgaben behalten ihren Wert.",
|
||||
"settings_value_out_of_range": "Der Wert muss zwischen {min} und {max} liegen",
|
||||
"bn_summary": "{name}: {pct} % für {n} Batterien",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} Geräte mit eigener Schwelle:",
|
||||
"bn_more": "+ {n} weitere",
|
||||
"settings_row_actions": "Aktionen in Aufgabenzeilen",
|
||||
"settings_ref_numbers_in_lists": "Referenznummern in Listen",
|
||||
"settings_ref_numbers_in_lists_hint": "Zeigt die Chips #8 / #8.3 vor Objekt- und Aufgabennamen in der Heute-Liste, der Aufgabentabelle, den Objektkarten und der Objekttabelle.",
|
||||
"row_actions_buttons_compact": "Buttons (auf dem Handy nur Symbole)",
|
||||
"row_actions_buttons": "Buttons mit Text",
|
||||
"row_actions_icons": "Symbole (klassisch)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Schlummerdauer (Stunden)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Währung",
|
||||
"settings_currency_decimals": "Nachkommastellen für Beträge",
|
||||
"settings_currency_decimals_hint": "Wie viele Nachkommastellen jeder Betrag zeigt: KPIs, Budgets, Kosten in Listen und Berichten, Budget-Alarme. 0 = ganze Zahlen.",
|
||||
"settings_budget_monthly": "Monatsbudget",
|
||||
"settings_budget_yearly": "Jahresbudget",
|
||||
"settings_budget_alerts": "Budget-Warnungen",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "YAML exportieren",
|
||||
"settings_export_csv": "CSV exportieren",
|
||||
"settings_export_settings": "Einstellungen exportieren (JSON)",
|
||||
"settings_import_csv": "CSV importieren",
|
||||
"settings_import_placeholder": "JSON- oder CSV-Inhalt hier einfügen…",
|
||||
"settings_import_btn": "Importieren",
|
||||
"settings_import_success": "{count} Objekte erfolgreich importiert.",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "Pro Aufgabe HA-Action beim Abschluss konfigurieren + Quick-Complete-QR mit voreingestellten Werten.",
|
||||
"on_complete_action_title": "Beim Abschluss: HA-Action auslösen (optional)",
|
||||
"on_complete_action_desc": "Ruft beim Erledigen der Aufgabe einen HA-Service auf — z. B. einen Zähler am Gerät zurücksetzen.",
|
||||
"on_complete_action_service": "Service",
|
||||
"on_complete_action_target": "Ziel-Entität",
|
||||
"on_complete_action_target_hint": "Achtung: Domain der Entität muss zum Service passen — z. B. 'button.press' nur für button.*, 'counter.increment' nur für counter.*, 'input_button.press' nur für input_button.* etc. Bei Mismatch fired die Aktion nicht (HA loggt 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Daten (JSON, optional)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Fotos auswählen",
|
||||
"choose_photo": "Foto wählen",
|
||||
"photos_android_hint": "Die Android-App übergibt pro Auswahl ein Foto — jede Auswahl wird hinzugefügt.",
|
||||
"add_photos": "Fotos hinzufügen",
|
||||
"photos_limit": "Bis zu {max} Fotos pro Abschluss",
|
||||
"history_edit_photos_hint": "Ein hier entferntes Foto bleibt in den Dokumenten des Objekts erhalten.",
|
||||
"uploading": "Wird hochgeladen…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Herunterladen",
|
||||
"doc_close": "Schließen",
|
||||
"doc_camera": "Foto aufnehmen",
|
||||
"camera_capture_shoot": "Aufnehmen",
|
||||
"camera_switch_lens": "Kamera wechseln",
|
||||
"doc_drop_hint": "Dateien hier ablegen",
|
||||
"doc_task_none": "Keine Dokumente mit dieser Aufgabe verknüpft.",
|
||||
"doc_link_existing": "Dokument verknüpfen…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Verbucht eine Wartung (setzt „zuletzt durchgeführt“), sobald sich der Auslöser von selbst auflöst — z. B. Salz nachgefüllt, Filter getauscht.",
|
||||
"doc_search": "Dokumente durchsuchen…",
|
||||
"doc_search_none": "Keine passenden Dokumente",
|
||||
"doc_description": "Beschreibung (optional)",
|
||||
"doc_sort": "Dokumente sortieren",
|
||||
"doc_sort_newest": "Neueste zuerst",
|
||||
"doc_sort_oldest": "Älteste zuerst",
|
||||
"doc_sort_title": "Nach Titel (1, 2, 3 …)",
|
||||
"doc_sort_category": "Nach Kategorie",
|
||||
"link_device_optional": "Mit bestehendem Gerät verknüpfen (optional)",
|
||||
"parent_object_optional": "Übergeordnetes Objekt (optional)",
|
||||
"parent_none": "(Kein übergeordnetes Objekt)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Nur benachrichtigen für Ansicht",
|
||||
"settings_notify_scope_all": "Alle Aufgaben",
|
||||
"settings_notify_scope_hint": "Nur Aufgaben, die zu den Label-/Nutzer-Filtern der gewählten Ansicht passen, senden Erinnerungen. Status, Sortierung und Gruppierung der Ansicht werden hier ignoriert.",
|
||||
"settings_notify_completed": "Erledigt-Benachrichtigungen",
|
||||
"settings_notify_completed_hint": "Haushalts-Info, wenn eine Aufgabe erledigt wurde, mit Grund und Person. „Nur automatische“ meldet nur Erledigungen, die niemand vor Ort ausgelöst hat: Sensor-Erholung, Einkaufslisten-Abhaken, Service-Aufruf einer Automation. Geht nur an den Haushalts-Dienst; Ruhezeiten und Tageslimit gelten.",
|
||||
"notify_completed_off": "Aus",
|
||||
"notify_completed_automatic": "Nur automatische Erledigungen",
|
||||
"notify_completed_all": "Alle Erledigungen",
|
||||
"settings_notify_rule": "Eigene Benachrichtigungsregel",
|
||||
"settings_notify_rule_hint": "Jede Benachrichtigung löst zusätzlich das Ereignis maintenance_supporter_notification aus (Art, Status, Objekt, Aufgabe, Referenznummern, Priorität, Deep-Link, Nutzlast). Leite es per Automation weiter — z. B. an Ticker, Telegram oder Pushover.",
|
||||
"settings_notify_event_only": "Nur das Ereignis auslösen, selbst nichts senden",
|
||||
"settings_notify_event_only_hint": "Deine Automation übernimmt den kompletten Versand. Wiederholintervalle, Ruhezeiten und Tageslimit gelten weiterhin dafür, wann das Ereignis ausgelöst wird.",
|
||||
"settings_notify_extra_data": "Zusätzliche Benachrichtigungsdaten (Template)",
|
||||
"settings_notify_extra_data_hint": "JSON oder YAML, Jinja erlaubt; wird in die data des Notify-Aufrufs gemischt (deine Schlüssel gewinnen). Variablen: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Prüfen mit „Test senden“.",
|
||||
"settings_notify_extra_data_hint": "JSON oder YAML, Jinja erlaubt; wird in die data des Notify-Aufrufs gemischt (deine Schlüssel gewinnen). Variablen: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Prüfen mit „Test senden“.",
|
||||
"card_saved_view": "Gespeicherte Ansicht",
|
||||
"card_saved_view_none": "Keine",
|
||||
"card_saved_view_help": "Wendet die Status-, Nutzer- und Label-Filter der Ansicht zusätzlich zu den obigen Filtern an. Sortierung und Gruppierung der Ansicht sind Panel-Darstellung und werden auf der Karte nicht angewendet.",
|
||||
"panel_card_tab": "Startet auf Tab",
|
||||
"panel_card_tab_default": "Gemerkter Tab (wie im Panel)",
|
||||
"panel_card_view": "Startet mit gespeicherter Ansicht",
|
||||
"panel_card_height": "Höhe",
|
||||
"panel_card_height_help": "Leer = füllt den Bildschirm unterhalb der Karte (Panel-Ansicht). Sonst eine CSS-Länge wie 600px oder 80vh für Ansichten mit weiteren Karten.",
|
||||
"panel_card_not_registered": "Das Maintenance-Supporter-Panel ist nicht verfügbar — ist die Integration eingerichtet?",
|
||||
"panel_card_load_failed": "Das Maintenance-Supporter-Panel konnte nicht geladen werden — Seite neu laden (nach einem Update: Browser-Cache leeren).",
|
||||
"doc_part_none": "Keine Dokumente mit diesem Ersatzteil verknüpft.",
|
||||
"settings_templates_toggle_group": "Alle Vorlagen dieser Gruppe ein- oder ausschalten",
|
||||
"setups_button": "Setup-Vorschläge",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "In Ordnung",
|
||||
"battery_fleet_status_due": "Fällig",
|
||||
"battery_fleet_predicted_on": "Voraussichtlich um {date}",
|
||||
"battery_fleet_predicted_typical": "Voraussichtlich um {date} — {months} Monate typisch für {type} ({source})",
|
||||
"lifetime_source_default": "eingebauter Standardwert",
|
||||
"lifetime_source_table": "eingebaute Tabelle",
|
||||
"lifetime_source_learned": "gelernt aus {n} Wechseln",
|
||||
"lifetime_source_override": "deine Einstellung",
|
||||
"lifetime_source_learned_device": "gelernt aus {n} Wechseln dieses Geräts",
|
||||
"lifetime_source_learned_model": "gelernt aus {n} Wechseln bei Geräten dieses Modells",
|
||||
"battery_fleet_predicted_trend": "Aus dem Entladetrend dieser Batterie vorhergesagt: etwa {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Wiederaufladbar: laden statt ersetzen — nie auf der Einkaufsliste",
|
||||
"battery_fleet_sort_name": "Nach Name sortieren",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Verbrauchte Teile",
|
||||
"print_inc_photos": "Fotos",
|
||||
"print_inc_documents": "Verknüpfte Dokumente",
|
||||
"print_inc_doc_desc": "Dokumentbeschreibungen",
|
||||
"print_inc_checklist": "Checkliste",
|
||||
"print_inc_notes": "Notizen",
|
||||
"print_inc_costs": "Kosten und Dauer",
|
||||
"print_inc_person": "Erledigt von",
|
||||
"print_inc_refs": "Referenznummern",
|
||||
"print_inc_bare": "Erledigungen ohne Details",
|
||||
"print_inc_qr": "QR-Code je Aufgabe",
|
||||
"print_button": "Drucken",
|
||||
"report_scan_hint": "Scannen öffnet die Aufgabe",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Runtime",
|
||||
"runtime_hours": "Target runtime (hours)",
|
||||
"target_value": "Target value",
|
||||
"baseline": "Baseline",
|
||||
"target_changes": "Target changes",
|
||||
"for_minutes": "For (minutes)",
|
||||
"time_based": "Time-based",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Generated",
|
||||
"report_times_done": "Done",
|
||||
"report_total_cost": "Total cost",
|
||||
"report_every": "every {n} {unit}",
|
||||
"report_notes": "Notes",
|
||||
"report_col_type": "Type",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Schedule",
|
||||
"duration": "Duration",
|
||||
"minutes_short": "min",
|
||||
"both": "Both",
|
||||
"trigger_val": "Trigger value",
|
||||
"complete_title": "Complete: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: wrong type (expected: {type})",
|
||||
"err_invalid_choice": "{field}: not an allowed value",
|
||||
"err_invalid_value": "{field}: invalid value",
|
||||
"ws_err_not_found": "Not found — it may have been deleted meanwhile",
|
||||
"ws_err_invalid_input": "Invalid input",
|
||||
"ws_err_invalid_date": "Invalid date",
|
||||
"ws_err_invalid_format": "Invalid format",
|
||||
"ws_err_invalid_url": "Invalid link",
|
||||
"ws_err_not_configured": "Not set up yet",
|
||||
"ws_err_not_loaded": "Not loaded yet — try again in a moment",
|
||||
"ws_err_limit_reached": "Limit reached",
|
||||
"ws_err_too_many": "Too many entries",
|
||||
"ws_err_too_large": "Too large",
|
||||
"ws_err_not_archived": "Not archived",
|
||||
"ws_err_invalid_target": "Invalid target",
|
||||
"ws_err_create_failed": "Could not be created",
|
||||
"ws_err_archived": "Archived — restore it first",
|
||||
"ws_err_already_archived": "Already archived",
|
||||
"ws_err_unavailable": "Currently unavailable",
|
||||
"ws_err_unauthorized": "Not permitted for your user",
|
||||
"ws_err_too_many_views": "Too many saved views",
|
||||
"ws_err_storage_unavailable": "Storage is not available",
|
||||
"ws_err_replace_failed": "Replacement failed",
|
||||
"ws_err_not_paused": "Not paused",
|
||||
"ws_err_not_available": "Nothing available",
|
||||
"ws_err_no_url": "No link given",
|
||||
"ws_err_no_phases": "This task has no phases",
|
||||
"ws_err_invalid_view": "Invalid view",
|
||||
"ws_err_invalid_user": "Unknown user",
|
||||
"ws_err_invalid_range": "Invalid range",
|
||||
"ws_err_invalid_parent": "Invalid parent object",
|
||||
"ws_err_invalid_device": "Unknown device",
|
||||
"ws_err_empty_csv": "The CSV file is empty",
|
||||
"ws_err_empty": "Nothing to import",
|
||||
"ws_err_duplicate_failed": "Could not duplicate",
|
||||
"ws_err_already_paused": "Already paused",
|
||||
"ws_err_invalid_cursor": "Invalid phase position",
|
||||
"ws_err_invalid_entity_slug": "Invalid entity name",
|
||||
"ws_err_invalid_trigger_config": "Invalid trigger configuration",
|
||||
"ws_err_no_defaults": "No quick-complete defaults set",
|
||||
"ws_err_self_link_device": "An object cannot be linked to itself",
|
||||
"ws_err_too_early": "Too early — this task can only be completed closer to its due date",
|
||||
"feat_schedule_time": "Time-of-day scheduling",
|
||||
"feat_schedule_time_desc": "Tasks become overdue at a specific time of day instead of midnight.",
|
||||
"schedule_time_toggle": "Due at a specific time",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Trigger when equal to (=)",
|
||||
"trigger_not_equals": "Trigger when different from (≠)",
|
||||
"for_at_least_minutes": "For at least (minutes)",
|
||||
"safety_interval_days": "Safety interval (days, optional)",
|
||||
"safety_interval": "Safety interval (optional)",
|
||||
"trigger_combinator": "Combine trigger and interval",
|
||||
"trigger_combinator_any": "Trigger or interval (whichever first)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "My Tasks",
|
||||
"tab_calendar": "Calendar",
|
||||
"cal_no_events": "No maintenance",
|
||||
"cal_window_7": "7 days",
|
||||
"cal_window_14": "14 days",
|
||||
"cal_window_30": "30 days",
|
||||
"cal_window_365": "1 year",
|
||||
"cal_every_n_days": "every {n} days",
|
||||
"cal_source_time": "Time-based",
|
||||
"cal_source_time_adaptive": "Time-based (adaptive)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "Failed to generate QR code.",
|
||||
"qr_error_no_url": "No HA URL configured. Please set an external or internal URL in Settings → System → Network.",
|
||||
"save_error": "Failed to save. Please try again.",
|
||||
"subsave_warning": "Saved, but one setting was rejected: {detail}",
|
||||
"qr_print": "Print",
|
||||
"qr_download": "Download SVG",
|
||||
"qr_action": "Action on scan",
|
||||
"qr_action_view": "View maintenance info",
|
||||
"qr_action_complete": "Mark maintenance as complete",
|
||||
"qr_url_mode": "Link type",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "Server URL",
|
||||
"overview": "Overview",
|
||||
"analysis": "Analysis",
|
||||
"recent_activities": "Recent Activities",
|
||||
"search_notes": "Search notes",
|
||||
"avg_cost": "Avg Cost",
|
||||
"no_advanced_features": "No advanced features enabled",
|
||||
"no_advanced_features_hint": "Enable “Adaptive Intervals” or “Seasonal Patterns” in the integration settings to see analysis data here.",
|
||||
"analysis_not_enough_data": "Not enough data for analysis yet.",
|
||||
"analysis_not_enough_data_hint": "Weibull analysis requires at least 5 completed maintenances; seasonal patterns become visible after 6+ data points per month.",
|
||||
"analysis_manual_task_hint": "Manual tasks without an interval do not generate analysis data.",
|
||||
"completions": "completions",
|
||||
"current": "Current",
|
||||
"shorter": "Shorter",
|
||||
"longer": "Longer",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Past windows",
|
||||
"cal_forward_windows": "Forward windows",
|
||||
"history_edit_title": "Edit history entry",
|
||||
"history_delete_entry": "Delete entry",
|
||||
"history_delete_confirm": "Delete this history entry? The task's last-performed date falls back to the previous completion; photos stay with the object and consumed parts are not restocked.",
|
||||
"history_edit_timestamp": "Timestamp",
|
||||
"manufacturer": "Manufacturer",
|
||||
"model": "Model",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Default warning days",
|
||||
"settings_consumable_threshold": "Consumable low threshold (%)",
|
||||
"settings_battery_low_percent": "Battery low threshold (%)",
|
||||
"settings_battery_lifetimes": "Typical battery lifetimes",
|
||||
"settings_battery_lifetimes_hint": "Only used for batteries without a percentage: a Battery Notes note that has just a type and a last-replaced date, or a sensor that only reports \"low\". Their due date is last replaced + this lifetime. Batteries that report a level get their forecast from the measured discharge instead. Once the fleet has seen three replacements of a type, the median interval takes over from the built-in value — your own value always wins.",
|
||||
"settings_battery_lifetime_months": "months",
|
||||
"settings_battery_lifetime_reset": "Use default",
|
||||
"settings_battery_lifetime_in_fleet": "in your fleet",
|
||||
"settings_battery_lifetime_learned_models": "Learned per model: {list}",
|
||||
"settings_thresholds_hint": "Defaults for new Suggested setups (percent-remaining consumables) and for fleet batteries without their own Battery Notes threshold. Existing tasks keep their value.",
|
||||
"settings_value_out_of_range": "Value must be between {min} and {max}",
|
||||
"bn_summary": "{name}: {pct} % for {n} batteries",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} devices with their own threshold:",
|
||||
"bn_more": "+ {n} more",
|
||||
"settings_row_actions": "Task row actions",
|
||||
"settings_ref_numbers_in_lists": "Reference numbers in lists",
|
||||
"settings_ref_numbers_in_lists_hint": "Show the #8 / #8.3 chips in front of object and task names in the Today list, the task table, the object cards and the objects table.",
|
||||
"row_actions_buttons_compact": "Buttons (icons only on phones)",
|
||||
"row_actions_buttons": "Buttons with text",
|
||||
"row_actions_icons": "Icons (classic)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Snooze duration (hours)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Currency",
|
||||
"settings_currency_decimals": "Decimal places for amounts",
|
||||
"settings_currency_decimals_hint": "How many decimals every amount shows: KPIs, budgets, costs in lists and reports, budget alerts. 0 = whole numbers.",
|
||||
"settings_budget_monthly": "Monthly budget",
|
||||
"settings_budget_yearly": "Yearly budget",
|
||||
"settings_budget_alerts": "Budget alerts",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "Export YAML",
|
||||
"settings_export_csv": "Export CSV",
|
||||
"settings_export_settings": "Export settings (JSON)",
|
||||
"settings_import_csv": "Import CSV",
|
||||
"settings_import_placeholder": "Paste JSON or CSV content here…",
|
||||
"settings_import_btn": "Import",
|
||||
"settings_import_success": "{count} objects imported successfully.",
|
||||
@@ -644,7 +681,6 @@
|
||||
"feat_completion_actions_desc": "Per-task HA action on complete + quick-complete QR with pre-set values.",
|
||||
"on_complete_action_title": "On complete: trigger HA action (optional)",
|
||||
"on_complete_action_desc": "Calls an HA service when the task is completed — e.g. reset a counter on the device.",
|
||||
"on_complete_action_service": "Service",
|
||||
"on_complete_action_target": "Target entity",
|
||||
"on_complete_action_target_hint": "Note: the entity domain must match the service — e.g. 'button.press' only works on button.*, 'counter.increment' only on counter.*, 'input_button.press' only on input_button.* etc. On a mismatch the action will silently fail (HA logs 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Data (JSON, optional)",
|
||||
@@ -710,7 +746,6 @@
|
||||
"choose_photos": "Choose photos",
|
||||
"choose_photo": "Choose photo",
|
||||
"photos_android_hint": "The Android app hands over one photo per pick — each pick is added.",
|
||||
"add_photos": "Add photos",
|
||||
"photos_limit": "Up to {max} photos per completion",
|
||||
"history_edit_photos_hint": "Removing a photo here keeps the file in the object's documents.",
|
||||
"uploading": "Uploading…",
|
||||
@@ -731,6 +766,8 @@
|
||||
"doc_download": "Download",
|
||||
"doc_close": "Close",
|
||||
"doc_camera": "Take photo",
|
||||
"camera_capture_shoot": "Capture",
|
||||
"camera_switch_lens": "Switch camera",
|
||||
"doc_drop_hint": "Drop files here",
|
||||
"doc_task_none": "No documents linked to this task.",
|
||||
"doc_link_existing": "Link a document…",
|
||||
@@ -747,6 +784,12 @@
|
||||
"auto_complete_on_recovery_help": "Records a completion (sets last performed) when the trigger clears itself — e.g. salt refilled, filter replaced.",
|
||||
"doc_search": "Search documents…",
|
||||
"doc_search_none": "No matching documents",
|
||||
"doc_description": "Description (optional)",
|
||||
"doc_sort": "Sort documents",
|
||||
"doc_sort_newest": "Newest first",
|
||||
"doc_sort_oldest": "Oldest first",
|
||||
"doc_sort_title": "By title (1, 2, 3 …)",
|
||||
"doc_sort_category": "By category",
|
||||
"link_device_optional": "Link to existing device (optional)",
|
||||
"parent_object_optional": "Parent object (optional)",
|
||||
"parent_none": "(No parent)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Notify only for view",
|
||||
"settings_notify_scope_all": "All tasks",
|
||||
"settings_notify_scope_hint": "Only tasks matching the selected saved view's label/user filters send reminders. Status, sorting and grouping of the view are ignored here.",
|
||||
"settings_notify_completed": "Completion notifications",
|
||||
"settings_notify_completed_hint": "Household news when a task is completed, with the reason and who did it. \"Automatic only\" announces just the completions nobody made on the spot: sensor recovery, shopping-list check-off, an automation's service call. Sent to the household service only; quiet hours and the daily cap apply.",
|
||||
"notify_completed_off": "Off",
|
||||
"notify_completed_automatic": "Automatic completions only",
|
||||
"notify_completed_all": "All completions",
|
||||
"settings_notify_rule": "Your own notification rule",
|
||||
"settings_notify_rule_hint": "Every notification also fires the event maintenance_supporter_notification (kind, status, object, task, reference numbers, priority, deep link, the payload). Route it with an automation — e.g. into Ticker, Telegram or Pushover.",
|
||||
"settings_notify_event_only": "Only fire the event, send nothing myself",
|
||||
"settings_notify_event_only_hint": "Your automation is the whole delivery. Rate limits, quiet hours and the daily cap still apply to when the event fires.",
|
||||
"settings_notify_extra_data": "Extra notification data (template)",
|
||||
"settings_notify_extra_data_hint": "JSON or YAML, Jinja allowed; merged into the notify call's data (your keys win). Variables: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Test it with the Send test button.",
|
||||
"settings_notify_extra_data_hint": "JSON or YAML, Jinja allowed; merged into the notify call's data (your keys win). Variables: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Test it with the Send test button.",
|
||||
"card_saved_view": "Saved view",
|
||||
"card_saved_view_none": "None",
|
||||
"card_saved_view_help": "Applies the view's status, user and label filters on top of the filters above. The view's sorting and grouping are panel display settings and are not applied on the card.",
|
||||
"panel_card_tab": "Open on tab",
|
||||
"panel_card_tab_default": "Remembered tab (as in the panel)",
|
||||
"panel_card_view": "Open with saved view",
|
||||
"panel_card_height": "Height",
|
||||
"panel_card_height_help": "Empty = fill the screen below the card (panel view). Otherwise a CSS length such as 600px or 80vh for views with other cards.",
|
||||
"panel_card_not_registered": "The Maintenance Supporter panel is not available — is the integration set up?",
|
||||
"panel_card_load_failed": "The Maintenance Supporter panel could not be loaded — reload the page (after an update: clear the browser cache).",
|
||||
"doc_part_none": "No documents linked to this part.",
|
||||
"settings_templates_toggle_group": "Enable or disable all templates in this group",
|
||||
"setups_button": "Suggested setups",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Healthy",
|
||||
"battery_fleet_status_due": "Due",
|
||||
"battery_fleet_predicted_on": "Expected around {date}",
|
||||
"battery_fleet_predicted_typical": "Expected around {date} — {months} months typical for {type} ({source})",
|
||||
"lifetime_source_default": "built-in default",
|
||||
"lifetime_source_table": "built-in table",
|
||||
"lifetime_source_learned": "learned from {n} replacements",
|
||||
"lifetime_source_override": "your setting",
|
||||
"lifetime_source_learned_device": "learned from this device's {n} replacements",
|
||||
"lifetime_source_learned_model": "learned from {n} replacements on devices of this model",
|
||||
"battery_fleet_predicted_trend": "Predicted from this battery's discharge trend: around {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Rechargeable: charge instead of replacing — never on the shopping list",
|
||||
"battery_fleet_sort_name": "Sort by name",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Parts used",
|
||||
"print_inc_photos": "Photos",
|
||||
"print_inc_documents": "Linked documents",
|
||||
"print_inc_doc_desc": "Document descriptions",
|
||||
"print_inc_checklist": "Checklist",
|
||||
"print_inc_notes": "Notes",
|
||||
"print_inc_costs": "Cost and duration",
|
||||
"print_inc_person": "Completed by",
|
||||
"print_inc_refs": "Reference numbers",
|
||||
"print_inc_bare": "Completions without details",
|
||||
"print_inc_qr": "QR code per task",
|
||||
"print_button": "Print",
|
||||
"report_scan_hint": "Scan to open the task",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Tiempo de funcionamiento",
|
||||
"runtime_hours": "Duración objetivo (horas)",
|
||||
"target_value": "Valor objetivo",
|
||||
"baseline": "Línea base",
|
||||
"target_changes": "Cambios objetivo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Temporal",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Generado",
|
||||
"report_times_done": "Hecho",
|
||||
"report_total_cost": "Coste total",
|
||||
"report_every": "cada {n} {unit}",
|
||||
"report_notes": "Notas",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Estado",
|
||||
"report_col_schedule": "Programación",
|
||||
"duration": "Duración",
|
||||
"minutes_short": "min",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor del disparador",
|
||||
"complete_title": "Completada: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: tipo incorrecto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor no permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"ws_err_not_found": "No encontrado — puede que se haya eliminado mientras tanto",
|
||||
"ws_err_invalid_input": "Entrada no válida",
|
||||
"ws_err_invalid_date": "Fecha no válida",
|
||||
"ws_err_invalid_format": "Formato no válido",
|
||||
"ws_err_invalid_url": "Enlace no válido",
|
||||
"ws_err_not_configured": "Aún no configurado",
|
||||
"ws_err_not_loaded": "Aún no cargado — inténtalo de nuevo en un momento",
|
||||
"ws_err_limit_reached": "Límite alcanzado",
|
||||
"ws_err_too_many": "Demasiadas entradas",
|
||||
"ws_err_too_large": "Demasiado grande",
|
||||
"ws_err_not_archived": "No archivado",
|
||||
"ws_err_invalid_target": "Destino no válido",
|
||||
"ws_err_create_failed": "No se pudo crear",
|
||||
"ws_err_archived": "Archivado — restáuralo primero",
|
||||
"ws_err_already_archived": "Ya archivado",
|
||||
"ws_err_unavailable": "No disponible actualmente",
|
||||
"ws_err_unauthorized": "No permitido para tu usuario",
|
||||
"ws_err_too_many_views": "Demasiadas vistas guardadas",
|
||||
"ws_err_storage_unavailable": "El almacenamiento no está disponible",
|
||||
"ws_err_replace_failed": "Error al reemplazar",
|
||||
"ws_err_not_paused": "No está en pausa",
|
||||
"ws_err_not_available": "Nada disponible",
|
||||
"ws_err_no_url": "No se indicó ningún enlace",
|
||||
"ws_err_no_phases": "Esta tarea no tiene fases",
|
||||
"ws_err_invalid_view": "Vista no válida",
|
||||
"ws_err_invalid_user": "Usuario desconocido",
|
||||
"ws_err_invalid_range": "Rango no válido",
|
||||
"ws_err_invalid_parent": "Objeto principal no válido",
|
||||
"ws_err_invalid_device": "Dispositivo desconocido",
|
||||
"ws_err_empty_csv": "El archivo CSV está vacío",
|
||||
"ws_err_empty": "Nada que importar",
|
||||
"ws_err_duplicate_failed": "No se pudo duplicar",
|
||||
"ws_err_already_paused": "Ya está en pausa",
|
||||
"ws_err_invalid_cursor": "Posición de fase no válida",
|
||||
"ws_err_invalid_entity_slug": "Nombre de entidad no válido",
|
||||
"ws_err_invalid_trigger_config": "Configuración del disparador no válida",
|
||||
"ws_err_no_defaults": "No hay valores predeterminados para completar rápido",
|
||||
"ws_err_self_link_device": "Un objeto no puede vincularse a sí mismo",
|
||||
"ws_err_too_early": "Demasiado pronto — esta tarea solo puede completarse más cerca de su vencimiento",
|
||||
"feat_schedule_time": "Programación por hora",
|
||||
"feat_schedule_time_desc": "Las tareas vencen a una hora específica en lugar de medianoche.",
|
||||
"schedule_time_toggle": "Vence a una hora concreta",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Activar cuando sea igual a (=)",
|
||||
"trigger_not_equals": "Activar cuando sea distinto de (≠)",
|
||||
"for_at_least_minutes": "Durante al menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de seguridad (días, opcional)",
|
||||
"safety_interval": "Intervalo de seguridad (opcional)",
|
||||
"trigger_combinator": "Combinar disparador e intervalo",
|
||||
"trigger_combinator_any": "Disparador o intervalo (el primero)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Mis tareas",
|
||||
"tab_calendar": "Calendario",
|
||||
"cal_no_events": "Sin mantenimiento",
|
||||
"cal_window_7": "7 días",
|
||||
"cal_window_14": "14 días",
|
||||
"cal_window_30": "30 días",
|
||||
"cal_window_365": "1 año",
|
||||
"cal_every_n_days": "cada {n} días",
|
||||
"cal_source_time": "Basado en tiempo",
|
||||
"cal_source_time_adaptive": "Basado en tiempo (adaptativo)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "No se pudo generar el código QR.",
|
||||
"qr_error_no_url": "No hay URL de HA configurada. Establezca una URL externa o interna en Ajustes → Sistema → Red.",
|
||||
"save_error": "Error al guardar. Inténtelo de nuevo.",
|
||||
"subsave_warning": "Guardado, pero se rechazó un ajuste: {detail}",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Descargar SVG",
|
||||
"qr_action": "Acción al escanear",
|
||||
"qr_action_view": "Ver info de mantenimiento",
|
||||
"qr_action_complete": "Marcar mantenimiento como completado",
|
||||
"qr_url_mode": "Tipo de enlace",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL del servidor",
|
||||
"overview": "Resumen",
|
||||
"analysis": "Análisis",
|
||||
"recent_activities": "Actividades recientes",
|
||||
"search_notes": "Buscar en notas",
|
||||
"avg_cost": "Ø Coste",
|
||||
"no_advanced_features": "Sin funciones avanzadas activadas",
|
||||
"no_advanced_features_hint": "Active “Intervalos Adaptativos” o “Patrones Estacionales” en la configuración de la integración para ver datos de análisis aquí.",
|
||||
"analysis_not_enough_data": "Aún no hay suficientes datos para el análisis.",
|
||||
"analysis_not_enough_data_hint": "El análisis Weibull requiere al menos 5 mantenimientos completados; los patrones estacionales son visibles tras 6+ puntos de datos por mes.",
|
||||
"analysis_manual_task_hint": "Las tareas manuales sin intervalo no generan datos de análisis.",
|
||||
"completions": "finalizaciones",
|
||||
"current": "Actual",
|
||||
"shorter": "Más corto",
|
||||
"longer": "Más largo",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Ventanas pasadas",
|
||||
"cal_forward_windows": "Ventanas futuras",
|
||||
"history_edit_title": "Editar entrada del historial",
|
||||
"history_delete_entry": "Eliminar entrada",
|
||||
"history_delete_confirm": "¿Eliminar esta entrada del historial? La fecha de última realización vuelve a la anterior; las fotos permanecen con el objeto y las piezas consumidas no se reponen.",
|
||||
"history_edit_timestamp": "Marca de tiempo",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Días de aviso predeterminados",
|
||||
"settings_consumable_threshold": "Umbral „consumible bajo“ (%)",
|
||||
"settings_battery_low_percent": "Umbral „pila baja“ (%)",
|
||||
"settings_battery_lifetimes": "Duraciones típicas de las pilas",
|
||||
"settings_battery_lifetimes_hint": "Solo se usa para pilas sin porcentaje: una nota de Battery Notes que solo tiene tipo y fecha de sustitución, o un sensor que solo avisa de « baja ». Su vencimiento es última sustitución + esta duración. Las pilas que informan de un nivel obtienen su previsión de la descarga medida. Cuando la flota ha visto tres sustituciones de un tipo, el intervalo mediano sustituye al valor integrado — tu valor siempre gana.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
"settings_battery_lifetime_reset": "Usar predeterminado",
|
||||
"settings_battery_lifetime_in_fleet": "en tu flota",
|
||||
"settings_battery_lifetime_learned_models": "Aprendido por modelo: {list}",
|
||||
"settings_thresholds_hint": "Valores predeterminados para nuevas Configuraciones sugeridas (porcentaje restante) y para pilas de la flota sin umbral propio de Battery Notes. Las tareas existentes conservan su valor.",
|
||||
"settings_value_out_of_range": "El valor debe estar entre {min} y {max}",
|
||||
"bn_summary": "{name}: {pct} % para {n} pilas",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} dispositivos con umbral propio:",
|
||||
"bn_more": "+ {n} más",
|
||||
"settings_row_actions": "Acciones en las filas de tareas",
|
||||
"settings_ref_numbers_in_lists": "Números de referencia en las listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Muestra las etiquetas #8 / #8.3 delante de los nombres de objetos y tareas en la lista Hoy, la tabla de tareas, las tarjetas de objetos y la tabla de objetos.",
|
||||
"row_actions_buttons_compact": "Botones (solo iconos en el móvil)",
|
||||
"row_actions_buttons": "Botones con texto",
|
||||
"row_actions_icons": "Iconos (clásico)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Duración de posposición (horas)",
|
||||
"settings_budget": "Presupuesto",
|
||||
"settings_currency": "Moneda",
|
||||
"settings_currency_decimals": "Decimales de los importes",
|
||||
"settings_currency_decimals_hint": "Cuántos decimales muestra cada importe: KPI, presupuestos, costes en listas e informes, alertas de presupuesto. 0 = números enteros.",
|
||||
"settings_budget_monthly": "Presupuesto mensual",
|
||||
"settings_budget_yearly": "Presupuesto anual",
|
||||
"settings_budget_alerts": "Alertas de presupuesto",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_export_settings": "Exportar ajustes (JSON)",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Pegue el contenido JSON o CSV aquí…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados correctamente.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Acción HA por tarea al completar + QR de finalización rápida con valores prefijados.",
|
||||
"on_complete_action_title": "Al completar: ejecutar acción HA (opcional)",
|
||||
"on_complete_action_desc": "Llama un servicio HA cuando se completa la tarea — p. ej. reiniciar un contador del dispositivo.",
|
||||
"on_complete_action_service": "Servicio",
|
||||
"on_complete_action_target": "Entidad objetivo",
|
||||
"on_complete_action_data": "Datos (JSON, opcional)",
|
||||
"on_complete_action_test": "Probar acción",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Elegir fotos",
|
||||
"choose_photo": "Elegir foto",
|
||||
"photos_android_hint": "La app de Android entrega una foto por selección — cada selección se añade.",
|
||||
"add_photos": "Añadir fotos",
|
||||
"photos_limit": "Hasta {max} fotos por finalización",
|
||||
"history_edit_photos_hint": "Una foto quitada aquí se conserva en los documentos del objeto.",
|
||||
"uploading": "Subiendo…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Descargar",
|
||||
"doc_close": "Cerrar",
|
||||
"doc_camera": "Tomar foto",
|
||||
"camera_capture_shoot": "Capturar",
|
||||
"camera_switch_lens": "Cambiar de cámara",
|
||||
"doc_drop_hint": "Suelta los archivos aquí",
|
||||
"doc_task_none": "Ningún documento vinculado a esta tarea.",
|
||||
"doc_link_existing": "Vincular un documento…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Registra una finalización (fija la última realización) cuando el disparador se resuelve solo — p. ej., sal rellenada, filtro cambiado.",
|
||||
"doc_search": "Buscar documentos…",
|
||||
"doc_search_none": "Ningún documento coincidente",
|
||||
"doc_description": "Descripción (opcional)",
|
||||
"doc_sort": "Ordenar documentos",
|
||||
"doc_sort_newest": "Más recientes primero",
|
||||
"doc_sort_oldest": "Más antiguos primero",
|
||||
"doc_sort_title": "Por título (1, 2, 3 …)",
|
||||
"doc_sort_category": "Por categoría",
|
||||
"link_device_optional": "Vincular a dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto principal (opcional)",
|
||||
"parent_none": "(Sin objeto principal)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Notificar solo para la vista",
|
||||
"settings_notify_scope_all": "Todas las tareas",
|
||||
"settings_notify_scope_hint": "Solo las tareas que coinciden con los filtros de etiqueta/usuario de la vista seleccionada envían recordatorios. El estado, el orden y la agrupación de la vista se ignoran aquí.",
|
||||
"settings_notify_completed": "Notificaciones de finalización",
|
||||
"settings_notify_completed_hint": "Aviso para el hogar cuando se completa una tarea, con el motivo y quién lo hizo. «Solo automáticas» anuncia solo las finalizaciones que nadie hizo en el sitio: recuperación del sensor, marcado en la lista de la compra, llamada de servicio de una automatización. Solo al servicio del hogar; se aplican las horas de silencio y el límite diario.",
|
||||
"notify_completed_off": "Desactivado",
|
||||
"notify_completed_automatic": "Solo finalizaciones automáticas",
|
||||
"notify_completed_all": "Todas las finalizaciones",
|
||||
"settings_notify_rule": "Tu propia regla de notificación",
|
||||
"settings_notify_rule_hint": "Cada notificación dispara además el evento maintenance_supporter_notification (tipo, estado, objeto, tarea, números de referencia, prioridad, enlace, carga útil). Enrútalo con una automatización — p. ej. a Ticker, Telegram o Pushover.",
|
||||
"settings_notify_event_only": "Solo disparar el evento, no enviar nada",
|
||||
"settings_notify_event_only_hint": "Tu automatización se encarga de toda la entrega. Los intervalos de repetición, las horas de silencio y el límite diario siguen decidiendo cuándo se dispara el evento.",
|
||||
"settings_notify_extra_data": "Datos de notificación adicionales (plantilla)",
|
||||
"settings_notify_extra_data_hint": "JSON o YAML, se permite Jinja; se fusiona en los data de la llamada notify (tus claves ganan). Variables: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Pruébalo con el botón Enviar prueba.",
|
||||
"settings_notify_extra_data_hint": "JSON o YAML, se permite Jinja; se fusiona en los data de la llamada notify (tus claves ganan). Variables: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Pruébalo con el botón Enviar prueba.",
|
||||
"card_saved_view": "Vista guardada",
|
||||
"card_saved_view_none": "Ninguna",
|
||||
"card_saved_view_help": "Aplica los filtros de estado, usuario y etiqueta de la vista además de los filtros anteriores. El orden y la agrupación de la vista son ajustes de visualización del panel y no se aplican en la tarjeta.",
|
||||
"panel_card_tab": "Abrir en la pestaña",
|
||||
"panel_card_tab_default": "Pestaña recordada (como en el panel)",
|
||||
"panel_card_view": "Abrir con la vista guardada",
|
||||
"panel_card_height": "Altura",
|
||||
"panel_card_height_help": "Vacío = llena la pantalla debajo de la tarjeta (vista panel). Si no, una longitud CSS como 600px u 80vh para vistas con otras tarjetas.",
|
||||
"panel_card_not_registered": "El panel de Maintenance Supporter no está disponible — ¿está configurada la integración?",
|
||||
"panel_card_load_failed": "No se pudo cargar el panel de Maintenance Supporter — recarga la página (tras una actualización: vacía la caché del navegador).",
|
||||
"doc_part_none": "No hay documentos vinculados a esta pieza.",
|
||||
"settings_templates_toggle_group": "Activar o desactivar todas las plantillas de este grupo",
|
||||
"setups_button": "Configuraciones sugeridas",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Correcta",
|
||||
"battery_fleet_status_due": "Pendiente",
|
||||
"battery_fleet_predicted_on": "Previsto hacia {date}",
|
||||
"battery_fleet_predicted_typical": "Previsto hacia el {date} — {months} meses habituales para {type} ({source})",
|
||||
"lifetime_source_default": "valor predeterminado integrado",
|
||||
"lifetime_source_table": "tabla integrada",
|
||||
"lifetime_source_learned": "aprendido de {n} sustituciones",
|
||||
"lifetime_source_override": "tu ajuste",
|
||||
"lifetime_source_learned_device": "aprendido de {n} sustituciones de este dispositivo",
|
||||
"lifetime_source_learned_model": "aprendido de {n} sustituciones en dispositivos de este modelo",
|
||||
"battery_fleet_predicted_trend": "Predicción según la tendencia de descarga de esta pila: hacia {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Recargable: se recarga en lugar de sustituirse — nunca en la lista de compra",
|
||||
"battery_fleet_sort_name": "Ordenar por nombre",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Piezas usadas",
|
||||
"print_inc_photos": "Fotos",
|
||||
"print_inc_documents": "Documentos vinculados",
|
||||
"print_inc_doc_desc": "Descripciones de los documentos",
|
||||
"print_inc_checklist": "Lista de verificación",
|
||||
"print_inc_notes": "Notas",
|
||||
"print_inc_costs": "Coste y duración",
|
||||
"print_inc_person": "Realizado por",
|
||||
"print_inc_refs": "Números de referencia",
|
||||
"print_inc_bare": "Realizaciones sin detalles",
|
||||
"print_inc_qr": "Código QR por tarea",
|
||||
"print_button": "Imprimir",
|
||||
"report_scan_hint": "Escanea para abrir la tarea",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Käyttöaika",
|
||||
"runtime_hours": "Tavoitekäyttöaika (tuntia)",
|
||||
"target_value": "Tavoitearvo",
|
||||
"baseline": "Lähtötaso",
|
||||
"target_changes": "Tavoitemuutokset",
|
||||
"for_minutes": "Vähintään (minuuttia)",
|
||||
"time_based": "Aikaperusteinen",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Luotu",
|
||||
"report_times_done": "Tehty",
|
||||
"report_total_cost": "Kokonaiskustannus",
|
||||
"report_every": "joka {n}. {unit}",
|
||||
"report_notes": "Muistiinpanot",
|
||||
"report_col_type": "Tyyppi",
|
||||
"report_col_status": "Tila",
|
||||
"report_col_schedule": "Aikataulu",
|
||||
"duration": "Kesto",
|
||||
"minutes_short": "min",
|
||||
"both": "Molemmat",
|
||||
"trigger_val": "Laukaisuarvo",
|
||||
"complete_title": "Suorita: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: väärä tyyppi (odotettiin: {type})",
|
||||
"err_invalid_choice": "{field}: ei sallittu arvo",
|
||||
"err_invalid_value": "{field}: virheellinen arvo",
|
||||
"ws_err_not_found": "Ei löytynyt — se on ehkä poistettu sillä välin",
|
||||
"ws_err_invalid_input": "Virheellinen syöte",
|
||||
"ws_err_invalid_date": "Virheellinen päivämäärä",
|
||||
"ws_err_invalid_format": "Virheellinen muoto",
|
||||
"ws_err_invalid_url": "Virheellinen linkki",
|
||||
"ws_err_not_configured": "Ei vielä määritetty",
|
||||
"ws_err_not_loaded": "Ei vielä ladattu — yritä hetken kuluttua uudelleen",
|
||||
"ws_err_limit_reached": "Raja saavutettu",
|
||||
"ws_err_too_many": "Liian monta merkintää",
|
||||
"ws_err_too_large": "Liian suuri",
|
||||
"ws_err_not_archived": "Ei arkistoitu",
|
||||
"ws_err_invalid_target": "Virheellinen kohde",
|
||||
"ws_err_create_failed": "Luominen epäonnistui",
|
||||
"ws_err_archived": "Arkistoitu — palauta ensin",
|
||||
"ws_err_already_archived": "On jo arkistoitu",
|
||||
"ws_err_unavailable": "Ei tällä hetkellä käytettävissä",
|
||||
"ws_err_unauthorized": "Ei sallittu käyttäjällesi",
|
||||
"ws_err_too_many_views": "Liian monta tallennettua näkymää",
|
||||
"ws_err_storage_unavailable": "Tallennustila ei ole käytettävissä",
|
||||
"ws_err_replace_failed": "Korvaaminen epäonnistui",
|
||||
"ws_err_not_paused": "Ei keskeytetty",
|
||||
"ws_err_not_available": "Ei mitään saatavilla",
|
||||
"ws_err_no_url": "Linkkiä ei annettu",
|
||||
"ws_err_no_phases": "Tällä tehtävällä ei ole vaiheita",
|
||||
"ws_err_invalid_view": "Virheellinen näkymä",
|
||||
"ws_err_invalid_user": "Tuntematon käyttäjä",
|
||||
"ws_err_invalid_range": "Virheellinen aikaväli",
|
||||
"ws_err_invalid_parent": "Virheellinen yläobjekti",
|
||||
"ws_err_invalid_device": "Tuntematon laite",
|
||||
"ws_err_empty_csv": "CSV-tiedosto on tyhjä",
|
||||
"ws_err_empty": "Ei mitään tuotavaa",
|
||||
"ws_err_duplicate_failed": "Monistaminen epäonnistui",
|
||||
"ws_err_already_paused": "On jo keskeytetty",
|
||||
"ws_err_invalid_cursor": "Virheellinen vaiheen sijainti",
|
||||
"ws_err_invalid_entity_slug": "Virheellinen entiteetin nimi",
|
||||
"ws_err_invalid_trigger_config": "Virheellinen laukaisimen määritys",
|
||||
"ws_err_no_defaults": "Pikavalmistumisen oletuksia ei ole asetettu",
|
||||
"ws_err_self_link_device": "Objektia ei voi linkittää itseensä",
|
||||
"ws_err_too_early": "Liian aikaista — tehtävän voi merkitä tehdyksi vasta lähempänä eräpäivää",
|
||||
"feat_schedule_time": "Kellonajan ajoitus",
|
||||
"feat_schedule_time_desc": "Tehtävät erääntyvät tiettyyn kellonaikaan keskiyön sijaan.",
|
||||
"schedule_time_toggle": "Erääntyy tiettyyn kellonaikaan",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Laukaise kun yhtä suuri kuin (=)",
|
||||
"trigger_not_equals": "Laukaise kun eri kuin (≠)",
|
||||
"for_at_least_minutes": "Vähintään (minuuttia)",
|
||||
"safety_interval_days": "Turvaväli (päivää, valinnainen)",
|
||||
"safety_interval": "Turvaväli (valinnainen)",
|
||||
"trigger_combinator": "Yhdistä laukaisin ja väli",
|
||||
"trigger_combinator_any": "Laukaisin tai väli (ensin täyttyvä)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Omat tehtävät",
|
||||
"tab_calendar": "Kalenteri",
|
||||
"cal_no_events": "Ei huoltoja",
|
||||
"cal_window_7": "7 päivää",
|
||||
"cal_window_14": "14 päivää",
|
||||
"cal_window_30": "30 päivää",
|
||||
"cal_window_365": "1 vuosi",
|
||||
"cal_every_n_days": "{n} päivän välein",
|
||||
"cal_source_time": "Aikaperusteinen",
|
||||
"cal_source_time_adaptive": "Aikaperusteinen (mukautuva)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "QR-koodin luonti epäonnistui.",
|
||||
"qr_error_no_url": "HA:n URL-osoitetta ei ole määritetty. Aseta ulkoinen tai sisäinen URL kohdassa Asetukset → Järjestelmä → Verkko.",
|
||||
"save_error": "Tallennus epäonnistui. Yritä uudelleen.",
|
||||
"subsave_warning": "Tallennettu, mutta yksi asetus hylättiin: {detail}",
|
||||
"qr_print": "Tulosta",
|
||||
"qr_download": "Lataa SVG",
|
||||
"qr_action": "Toiminto skannattaessa",
|
||||
"qr_action_view": "Näytä huoltotiedot",
|
||||
"qr_action_complete": "Merkitse huolto valmiiksi",
|
||||
"qr_url_mode": "Linkin tyyppi",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Paikallinen (mDNS)",
|
||||
"qr_mode_server": "Palvelimen URL",
|
||||
"overview": "Yleiskatsaus",
|
||||
"analysis": "Analyysi",
|
||||
"recent_activities": "Viimeaikaiset toimet",
|
||||
"search_notes": "Hae muistiinpanoja",
|
||||
"avg_cost": "Keskim. kustannus",
|
||||
"no_advanced_features": "Lisäominaisuuksia ei ole otettu käyttöön",
|
||||
"no_advanced_features_hint": "Ota käyttöön ”Mukautuvat välit” tai ”Kausivaihtelut” integraation asetuksissa nähdäksesi analyysitiedot täällä.",
|
||||
"analysis_not_enough_data": "Ei vielä tarpeeksi tietoja analyysiin.",
|
||||
"analysis_not_enough_data_hint": "Weibull-analyysi vaatii vähintään 5 suoritettua huoltoa; kausivaihtelut näkyvät kun kuukautta kohden on yli 6 tietopistettä.",
|
||||
"analysis_manual_task_hint": "Manuaaliset tehtävät ilman väliä eivät tuota analyysitietoja.",
|
||||
"completions": "suoritusta",
|
||||
"current": "Nykyinen",
|
||||
"shorter": "Lyhyempi",
|
||||
"longer": "Pidempi",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Menneet jaksot",
|
||||
"cal_forward_windows": "Tulevat jaksot",
|
||||
"history_edit_title": "Muokkaa historiamerkintää",
|
||||
"history_delete_entry": "Poista merkintä",
|
||||
"history_delete_confirm": "Poistetaanko tämä historiamerkintä? Viimeisimmän suorituksen päivä palautuu edelliseen; kuvat jäävät kohteelle eikä kulutettuja osia palauteta varastoon.",
|
||||
"history_edit_timestamp": "Aikaleima",
|
||||
"manufacturer": "Valmistaja",
|
||||
"model": "Malli",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Oletusvaroituspäivät",
|
||||
"settings_consumable_threshold": "Kynnys „kulutustarvike vähissä“ (%)",
|
||||
"settings_battery_low_percent": "Kynnys „paristo vähissä“ (%)",
|
||||
"settings_battery_lifetimes": "Paristojen tyypilliset käyttöiät",
|
||||
"settings_battery_lifetimes_hint": "Käytetään vain paristoille ilman prosenttilukua: Battery Notes -merkintä, jolla on vain tyyppi ja vaihtopäivä, tai anturi, joka ilmoittaa vain ”vähissä”. Erääntyminen = viimeisin vaihto + tämä käyttöikä. Tasoa raportoivien paristojen ennuste tulee mitatusta purkautumisesta. Kun laivasto on nähnyt kolme saman tyypin vaihtoa, mediaaniväli korvaa sisäänrakennetun arvon — oma arvosi voittaa aina.",
|
||||
"settings_battery_lifetime_months": "kuukautta",
|
||||
"settings_battery_lifetime_reset": "Käytä oletusta",
|
||||
"settings_battery_lifetime_in_fleet": "laivastossasi",
|
||||
"settings_battery_lifetime_learned_models": "Opittu mallikohtaisesti: {list}",
|
||||
"settings_thresholds_hint": "Oletukset uusille Ehdotetuille asetuksille (jäljellä oleva prosentti) ja paristokannan paristoille ilman omaa Battery Notes -kynnystä. Olemassa olevat tehtävät säilyttävät arvonsa.",
|
||||
"settings_value_out_of_range": "Arvon on oltava välillä {min}–{max}",
|
||||
"bn_summary": "{name}: {pct} % {n} paristolle",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} laitetta, joilla on oma kynnys:",
|
||||
"bn_more": "+ {n} lisää",
|
||||
"settings_row_actions": "Tehtävärivien toiminnot",
|
||||
"settings_ref_numbers_in_lists": "Viitenumerot luetteloissa",
|
||||
"settings_ref_numbers_in_lists_hint": "Näyttää tunnisteet #8 / #8.3 kohteiden ja tehtävien nimien edessä Tänään-luettelossa, tehtävätaulukossa, kohdekorteissa ja kohdetaulukossa.",
|
||||
"row_actions_buttons_compact": "Painikkeet (puhelimessa vain kuvakkeet)",
|
||||
"row_actions_buttons": "Painikkeet tekstillä",
|
||||
"row_actions_icons": "Kuvakkeet (perinteinen)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Torkun kesto (tuntia)",
|
||||
"settings_budget": "Budjetti",
|
||||
"settings_currency": "Valuutta",
|
||||
"settings_currency_decimals": "Summien desimaalit",
|
||||
"settings_currency_decimals_hint": "Montako desimaalia jokainen summa näyttää: tunnusluvut, budjetit, kustannukset listoissa ja raporteissa, budjettihälytykset. 0 = kokonaisluvut.",
|
||||
"settings_budget_monthly": "Kuukausibudjetti",
|
||||
"settings_budget_yearly": "Vuosibudjetti",
|
||||
"settings_budget_alerts": "Budjettihälytykset",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "Vie YAML",
|
||||
"settings_export_csv": "Vie CSV",
|
||||
"settings_export_settings": "Vie asetukset (JSON)",
|
||||
"settings_import_csv": "Tuo CSV",
|
||||
"settings_import_placeholder": "Liitä JSON- tai CSV-sisältö tähän…",
|
||||
"settings_import_btn": "Tuo",
|
||||
"settings_import_success": "{count} kohdetta tuotu onnistuneesti.",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "Tehtäväkohtainen HA-toiminto suorituksen yhteydessä + pikasuoritus-QR esiasetetuilla arvoilla.",
|
||||
"on_complete_action_title": "Suorituksen yhteydessä: laukaise HA-toiminto (valinnainen)",
|
||||
"on_complete_action_desc": "Kutsuu HA-palvelua, kun tehtävä suoritetaan — esim. nollaa laitteen laskuri.",
|
||||
"on_complete_action_service": "Palvelu",
|
||||
"on_complete_action_target": "Kohde-entiteetti",
|
||||
"on_complete_action_target_hint": "Huom: entiteetin toimialueen on vastattava palvelua — esim. 'button.press' toimii vain button.*-entiteeteillä, 'counter.increment' vain counter.*-entiteeteillä, 'input_button.press' vain input_button.*-entiteeteillä jne. Epäsopivuuden sattuessa toiminto epäonnistuu hiljaisesti (HA kirjaa 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Tiedot (JSON, valinnainen)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Valitse kuvat",
|
||||
"choose_photo": "Valitse kuva",
|
||||
"photos_android_hint": "Android-sovellus välittää yhden kuvan per valinta — jokainen valinta lisätään.",
|
||||
"add_photos": "Lisää kuvia",
|
||||
"photos_limit": "Enintään {max} kuvaa suoritusta kohti",
|
||||
"history_edit_photos_hint": "Tästä poistettu kuva säilyy kohteen asiakirjoissa.",
|
||||
"uploading": "Ladataan…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Lataa",
|
||||
"doc_close": "Sulje",
|
||||
"doc_camera": "Ota kuva",
|
||||
"camera_capture_shoot": "Ota kuva",
|
||||
"camera_switch_lens": "Vaihda kameraa",
|
||||
"doc_drop_hint": "Pudota tiedostot tähän",
|
||||
"doc_task_none": "Tähän tehtävään ei ole liitetty asiakirjoja.",
|
||||
"doc_link_existing": "Liitä asiakirja…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Kirjaa suorituksen (asettaa viimeksi tehdyn), kun laukaisin poistuu itsestään — esim. suola lisätty, suodatin vaihdettu.",
|
||||
"doc_search": "Hae asiakirjoja…",
|
||||
"doc_search_none": "Ei vastaavia asiakirjoja",
|
||||
"doc_description": "Kuvaus (valinnainen)",
|
||||
"doc_sort": "Lajittele asiakirjat",
|
||||
"doc_sort_newest": "Uusimmat ensin",
|
||||
"doc_sort_oldest": "Vanhimmat ensin",
|
||||
"doc_sort_title": "Otsikon mukaan (1, 2, 3 …)",
|
||||
"doc_sort_category": "Luokan mukaan",
|
||||
"link_device_optional": "Liitä olemassa olevaan laitteeseen (valinnainen)",
|
||||
"parent_object_optional": "Yläobjekti (valinnainen)",
|
||||
"parent_none": "(Ei yläobjektia)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Ilmoita vain näkymälle",
|
||||
"settings_notify_scope_all": "Kaikki tehtävät",
|
||||
"settings_notify_scope_hint": "Vain valitun näkymän tunniste-/käyttäjäsuodattimiin osuvat tehtävät lähettävät muistutuksia. Näkymän tila, lajittelu ja ryhmittely ohitetaan tässä.",
|
||||
"settings_notify_completed": "Ilmoitukset suorituksista",
|
||||
"settings_notify_completed_hint": "Tieto taloudelle, kun tehtävä on suoritettu, syyn ja tekijän kera. ”Vain automaattiset” ilmoittaa vain suoritukset, joita kukaan ei tehnyt paikan päällä: anturin palautuminen, ostoslistan rastitus, automaation palvelukutsu. Vain talouden palveluun; hiljaiset tunnit ja päiväraja pätevät.",
|
||||
"notify_completed_off": "Pois",
|
||||
"notify_completed_automatic": "Vain automaattiset suoritukset",
|
||||
"notify_completed_all": "Kaikki suoritukset",
|
||||
"settings_notify_rule": "Oma ilmoitussääntö",
|
||||
"settings_notify_rule_hint": "Jokainen ilmoitus laukaisee myös tapahtuman maintenance_supporter_notification (laji, tila, kohde, tehtävä, viitenumerot, prioriteetti, linkki, sisältö). Ohjaa se automaatiolla — esim. Tickeriin, Telegramiin tai Pushoveriin.",
|
||||
"settings_notify_event_only": "Laukaise vain tapahtuma, älä lähetä itse mitään",
|
||||
"settings_notify_event_only_hint": "Automaatiosi hoitaa koko toimituksen. Toistovälit, hiljaiset tunnit ja päiväraja määräävät yhä, milloin tapahtuma laukeaa.",
|
||||
"settings_notify_extra_data": "Ilmoituksen lisätiedot (malli)",
|
||||
"settings_notify_extra_data_hint": "JSON tai YAML, Jinja sallittu; yhdistetään notify-kutsun data-kenttään (omat avaimesi voittavat). Muuttujat: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Kokeile Lähetä testi -painikkeella.",
|
||||
"settings_notify_extra_data_hint": "JSON tai YAML, Jinja sallittu; yhdistetään notify-kutsun data-kenttään (omat avaimesi voittavat). Muuttujat: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Kokeile Lähetä testi -painikkeella.",
|
||||
"card_saved_view": "Tallennettu näkymä",
|
||||
"card_saved_view_none": "Ei mitään",
|
||||
"card_saved_view_help": "Soveltaa näkymän tila-, käyttäjä- ja tunnistesuodattimet yllä olevien suodattimien lisäksi. Näkymän lajittelu ja ryhmittely ovat paneelin näyttöasetuksia eivätkä vaikuta korttiin.",
|
||||
"panel_card_tab": "Avaa välilehdellä",
|
||||
"panel_card_tab_default": "Muistettu välilehti (kuten paneelissa)",
|
||||
"panel_card_view": "Avaa tallennetulla näkymällä",
|
||||
"panel_card_height": "Korkeus",
|
||||
"panel_card_height_help": "Tyhjä = täyttää näytön kortin alapuolella (paneelinäkymä). Muuten CSS-pituus, kuten 600px tai 80vh, näkymille, joissa on muita kortteja.",
|
||||
"panel_card_not_registered": "Maintenance Supporter -paneeli ei ole käytettävissä — onko integraatio määritetty?",
|
||||
"panel_card_load_failed": "Maintenance Supporter -paneelia ei voitu ladata — lataa sivu uudelleen (päivityksen jälkeen: tyhjennä selaimen välimuisti).",
|
||||
"doc_part_none": "Tähän osaan ei ole linkitetty asiakirjoja.",
|
||||
"settings_templates_toggle_group": "Ota kaikki tämän ryhmän mallit käyttöön tai pois",
|
||||
"setups_button": "Ehdotetut asennukset",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Kunnossa",
|
||||
"battery_fleet_status_due": "Erääntynyt",
|
||||
"battery_fleet_predicted_on": "Odotettavissa noin {date}",
|
||||
"battery_fleet_predicted_typical": "Odotettavissa noin {date} — {months} kuukautta tyypillisesti tyypille {type} ({source})",
|
||||
"lifetime_source_default": "sisäänrakennettu oletus",
|
||||
"lifetime_source_table": "sisäänrakennettu taulukko",
|
||||
"lifetime_source_learned": "opittu {n} vaihdosta",
|
||||
"lifetime_source_override": "oma asetuksesi",
|
||||
"lifetime_source_learned_device": "opittu tämän laitteen {n} vaihdosta",
|
||||
"lifetime_source_learned_model": "opittu tämän mallin laitteiden {n} vaihdosta",
|
||||
"battery_fleet_predicted_trend": "Ennustettu tämän pariston purkautumistrendistä: noin {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Ladattava: lataa vaihtamisen sijaan — ei koskaan ostoslistalle",
|
||||
"battery_fleet_sort_name": "Lajittele nimen mukaan",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Käytetyt osat",
|
||||
"print_inc_photos": "Kuvat",
|
||||
"print_inc_documents": "Liitetyt asiakirjat",
|
||||
"print_inc_doc_desc": "Asiakirjojen kuvaukset",
|
||||
"print_inc_checklist": "Tarkistuslista",
|
||||
"print_inc_notes": "Muistiinpanot",
|
||||
"print_inc_costs": "Kustannus ja kesto",
|
||||
"print_inc_person": "Suorittaja",
|
||||
"print_inc_refs": "Viitenumerot",
|
||||
"print_inc_bare": "Suoritukset ilman tietoja",
|
||||
"print_inc_qr": "QR-koodi tehtävää kohti",
|
||||
"print_button": "Tulosta",
|
||||
"report_scan_hint": "Skannaa avataksesi tehtävän",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Durée de fonctionnement",
|
||||
"runtime_hours": "Durée cible (heures)",
|
||||
"target_value": "Valeur cible",
|
||||
"baseline": "Ligne de base",
|
||||
"target_changes": "Changements cibles",
|
||||
"for_minutes": "Pendant (minutes)",
|
||||
"time_based": "Temporel",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Généré",
|
||||
"report_times_done": "Effectué",
|
||||
"report_total_cost": "Coût total",
|
||||
"report_every": "tous les {n} {unit}",
|
||||
"report_notes": "Notes",
|
||||
"report_col_type": "Type",
|
||||
"report_col_status": "Statut",
|
||||
"report_col_schedule": "Planning",
|
||||
"duration": "Durée",
|
||||
"minutes_short": "min",
|
||||
"both": "Les deux",
|
||||
"trigger_val": "Valeur du déclencheur",
|
||||
"complete_title": "Terminé : ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field} : mauvais type (attendu : {type})",
|
||||
"err_invalid_choice": "{field} : valeur non autorisée",
|
||||
"err_invalid_value": "{field} : valeur invalide",
|
||||
"ws_err_not_found": "Introuvable — il a peut-être été supprimé entre-temps",
|
||||
"ws_err_invalid_input": "Saisie non valide",
|
||||
"ws_err_invalid_date": "Date non valide",
|
||||
"ws_err_invalid_format": "Format non valide",
|
||||
"ws_err_invalid_url": "Lien non valide",
|
||||
"ws_err_not_configured": "Pas encore configuré",
|
||||
"ws_err_not_loaded": "Pas encore chargé — réessayez dans un instant",
|
||||
"ws_err_limit_reached": "Limite atteinte",
|
||||
"ws_err_too_many": "Trop d'entrées",
|
||||
"ws_err_too_large": "Trop volumineux",
|
||||
"ws_err_not_archived": "Non archivé",
|
||||
"ws_err_invalid_target": "Cible non valide",
|
||||
"ws_err_create_failed": "Impossible de créer",
|
||||
"ws_err_archived": "Archivé — restaurez-le d'abord",
|
||||
"ws_err_already_archived": "Déjà archivé",
|
||||
"ws_err_unavailable": "Actuellement indisponible",
|
||||
"ws_err_unauthorized": "Non autorisé pour votre utilisateur",
|
||||
"ws_err_too_many_views": "Trop de vues enregistrées",
|
||||
"ws_err_storage_unavailable": "Le stockage n'est pas disponible",
|
||||
"ws_err_replace_failed": "Échec du remplacement",
|
||||
"ws_err_not_paused": "Pas en pause",
|
||||
"ws_err_not_available": "Rien de disponible",
|
||||
"ws_err_no_url": "Aucun lien indiqué",
|
||||
"ws_err_no_phases": "Cette tâche n'a pas de phases",
|
||||
"ws_err_invalid_view": "Vue non valide",
|
||||
"ws_err_invalid_user": "Utilisateur inconnu",
|
||||
"ws_err_invalid_range": "Plage non valide",
|
||||
"ws_err_invalid_parent": "Objet parent non valide",
|
||||
"ws_err_invalid_device": "Appareil inconnu",
|
||||
"ws_err_empty_csv": "Le fichier CSV est vide",
|
||||
"ws_err_empty": "Rien à importer",
|
||||
"ws_err_duplicate_failed": "Impossible de dupliquer",
|
||||
"ws_err_already_paused": "Déjà en pause",
|
||||
"ws_err_invalid_cursor": "Position de phase non valide",
|
||||
"ws_err_invalid_entity_slug": "Nom d'entité non valide",
|
||||
"ws_err_invalid_trigger_config": "Configuration du déclencheur non valide",
|
||||
"ws_err_no_defaults": "Aucune valeur par défaut pour la validation rapide",
|
||||
"ws_err_self_link_device": "Un objet ne peut pas être lié à lui-même",
|
||||
"ws_err_too_early": "Trop tôt — cette tâche ne peut être terminée que plus près de son échéance",
|
||||
"feat_schedule_time": "Planification à l'heure",
|
||||
"feat_schedule_time_desc": "Les tâches arrivent à échéance à une heure précise plutôt qu'à minuit.",
|
||||
"schedule_time_toggle": "Échéance à une heure précise",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Déclencher si égal à (=)",
|
||||
"trigger_not_equals": "Déclencher si différent de (≠)",
|
||||
"for_at_least_minutes": "Pendant au moins (minutes)",
|
||||
"safety_interval_days": "Intervalle de sécurité (jours, optionnel)",
|
||||
"safety_interval": "Intervalle de sécurité (optionnel)",
|
||||
"trigger_combinator": "Combiner déclencheur et intervalle",
|
||||
"trigger_combinator_any": "Déclencheur ou intervalle (premier atteint)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Mes tâches",
|
||||
"tab_calendar": "Calendrier",
|
||||
"cal_no_events": "Aucun entretien",
|
||||
"cal_window_7": "7 jours",
|
||||
"cal_window_14": "14 jours",
|
||||
"cal_window_30": "30 jours",
|
||||
"cal_window_365": "1 an",
|
||||
"cal_every_n_days": "tous les {n} jours",
|
||||
"cal_source_time": "Basé sur le temps",
|
||||
"cal_source_time_adaptive": "Basé sur le temps (adaptatif)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Impossible de générer le QR code.",
|
||||
"qr_error_no_url": "Aucune URL HA configurée. Veuillez définir une URL externe ou interne dans Paramètres → Système → Réseau.",
|
||||
"save_error": "Échec de l'enregistrement. Veuillez réessayer.",
|
||||
"subsave_warning": "Enregistré, mais un réglage a été refusé : {detail}",
|
||||
"qr_print": "Imprimer",
|
||||
"qr_download": "Télécharger SVG",
|
||||
"qr_action": "Action au scan",
|
||||
"qr_action_view": "Afficher les infos de maintenance",
|
||||
"qr_action_complete": "Marquer la maintenance comme terminée",
|
||||
"qr_url_mode": "Type de lien",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL serveur",
|
||||
"overview": "Aperçu",
|
||||
"analysis": "Analyse",
|
||||
"recent_activities": "Activités récentes",
|
||||
"search_notes": "Rechercher dans les notes",
|
||||
"avg_cost": "Ø Coût",
|
||||
"no_advanced_features": "Aucune fonction avancée activée",
|
||||
"no_advanced_features_hint": "Activez « Intervalles adaptatifs » ou « Tendances saisonnières » dans les paramètres de l'intégration pour voir les données d'analyse ici.",
|
||||
"analysis_not_enough_data": "Pas encore assez de données pour l'analyse.",
|
||||
"analysis_not_enough_data_hint": "L'analyse Weibull nécessite au moins 5 maintenances terminées ; les tendances saisonnières apparaissent après 6+ points par mois.",
|
||||
"analysis_manual_task_hint": "Les tâches manuelles sans intervalle ne génèrent pas de données d'analyse.",
|
||||
"completions": "réalisations",
|
||||
"current": "Actuel",
|
||||
"shorter": "Plus court",
|
||||
"longer": "Plus long",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Fenêtres passées",
|
||||
"cal_forward_windows": "Fenêtres à venir",
|
||||
"history_edit_title": "Modifier l'entrée d'historique",
|
||||
"history_delete_entry": "Supprimer l'entrée",
|
||||
"history_delete_confirm": "Supprimer cette entrée d'historique ? La date de dernière réalisation revient à la précédente ; les photos restent avec l'objet et les pièces consommées ne sont pas remises en stock.",
|
||||
"history_edit_timestamp": "Horodatage",
|
||||
"manufacturer": "Fabricant",
|
||||
"model": "Modèle",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Jours d'avertissement par défaut",
|
||||
"settings_consumable_threshold": "Seuil « consommable bas » (%)",
|
||||
"settings_battery_low_percent": "Seuil « pile faible » (%)",
|
||||
"settings_battery_lifetimes": "Durées de vie typiques des piles",
|
||||
"settings_battery_lifetimes_hint": "Utilisé uniquement pour les piles sans pourcentage : une note Battery Notes qui ne connaît qu'un type et une date de remplacement, ou un capteur qui ne signale que « faible ». Leur échéance est dernier remplacement + cette durée. Les piles qui remontent un niveau sont prévues d'après la décharge mesurée. Dès que le parc a vu trois remplacements d'un type, l'intervalle médian remplace la valeur intégrée — votre valeur l'emporte toujours.",
|
||||
"settings_battery_lifetime_months": "mois",
|
||||
"settings_battery_lifetime_reset": "Valeur par défaut",
|
||||
"settings_battery_lifetime_in_fleet": "dans votre parc",
|
||||
"settings_battery_lifetime_learned_models": "Appris par modèle : {list}",
|
||||
"settings_thresholds_hint": "Valeurs par défaut pour les nouvelles Configurations suggérées (pourcentage restant) et pour les piles de la flotte sans seuil Battery Notes propre. Les tâches existantes gardent leur valeur.",
|
||||
"settings_value_out_of_range": "La valeur doit être comprise entre {min} et {max}",
|
||||
"bn_summary": "{name} : {pct} % pour {n} piles",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} appareils avec leur propre seuil :",
|
||||
"bn_more": "+ {n} autres",
|
||||
"settings_row_actions": "Actions des lignes de tâches",
|
||||
"settings_ref_numbers_in_lists": "Numéros de référence dans les listes",
|
||||
"settings_ref_numbers_in_lists_hint": "Affiche les puces #8 / #8.3 devant les noms d'objets et de tâches dans la liste Aujourd'hui, le tableau des tâches, les cartes d'objets et le tableau des objets.",
|
||||
"row_actions_buttons_compact": "Boutons (icônes seules sur téléphone)",
|
||||
"row_actions_buttons": "Boutons avec texte",
|
||||
"row_actions_icons": "Icônes (classique)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Durée de report (heures)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Devise",
|
||||
"settings_currency_decimals": "Décimales des montants",
|
||||
"settings_currency_decimals_hint": "Nombre de décimales affichées pour chaque montant : indicateurs, budgets, coûts dans les listes et rapports, alertes budget. 0 = nombres entiers.",
|
||||
"settings_budget_monthly": "Budget mensuel",
|
||||
"settings_budget_yearly": "Budget annuel",
|
||||
"settings_budget_alerts": "Alertes budgétaires",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Exporter YAML",
|
||||
"settings_export_csv": "Exporter CSV",
|
||||
"settings_export_settings": "Exporter les réglages (JSON)",
|
||||
"settings_import_csv": "Importer CSV",
|
||||
"settings_import_placeholder": "Collez le contenu JSON ou CSV ici…",
|
||||
"settings_import_btn": "Importer",
|
||||
"settings_import_success": "{count} objets importés avec succès.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Action HA par tâche lors de la finalisation + QR de finalisation rapide avec valeurs pré-définies.",
|
||||
"on_complete_action_title": "À la finalisation : déclencher une action HA (optionnel)",
|
||||
"on_complete_action_desc": "Appelle un service HA quand la tâche est terminée — p. ex. réinitialiser un compteur sur l'appareil.",
|
||||
"on_complete_action_service": "Service",
|
||||
"on_complete_action_target": "Entité cible",
|
||||
"on_complete_action_data": "Données (JSON, optionnel)",
|
||||
"on_complete_action_test": "Tester l'action",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Choisir des photos",
|
||||
"choose_photo": "Choisir une photo",
|
||||
"photos_android_hint": "L'application Android ne transmet qu'une photo par sélection — chaque sélection est ajoutée.",
|
||||
"add_photos": "Ajouter des photos",
|
||||
"photos_limit": "Jusqu'à {max} photos par fin de tâche",
|
||||
"history_edit_photos_hint": "Une photo retirée ici reste dans les documents de l'objet.",
|
||||
"uploading": "Téléversement…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Télécharger",
|
||||
"doc_close": "Fermer",
|
||||
"doc_camera": "Prendre une photo",
|
||||
"camera_capture_shoot": "Prendre la photo",
|
||||
"camera_switch_lens": "Changer de caméra",
|
||||
"doc_drop_hint": "Déposez les fichiers ici",
|
||||
"doc_task_none": "Aucun document lié à cette tâche.",
|
||||
"doc_link_existing": "Lier un document…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Enregistre une exécution (met à jour la dernière réalisation) lorsque le déclencheur se résout de lui-même — p. ex. sel rechargé, filtre remplacé.",
|
||||
"doc_search": "Rechercher des documents…",
|
||||
"doc_search_none": "Aucun document correspondant",
|
||||
"doc_description": "Description (facultatif)",
|
||||
"doc_sort": "Trier les documents",
|
||||
"doc_sort_newest": "Plus récents d'abord",
|
||||
"doc_sort_oldest": "Plus anciens d'abord",
|
||||
"doc_sort_title": "Par titre (1, 2, 3 …)",
|
||||
"doc_sort_category": "Par catégorie",
|
||||
"link_device_optional": "Lier à un appareil existant (optionnel)",
|
||||
"parent_object_optional": "Objet parent (optionnel)",
|
||||
"parent_none": "(Aucun parent)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Notifier uniquement pour la vue",
|
||||
"settings_notify_scope_all": "Toutes les tâches",
|
||||
"settings_notify_scope_hint": "Seules les tâches correspondant aux filtres étiquette/utilisateur de la vue choisie envoient des rappels. Le statut, le tri et le regroupement de la vue sont ignorés ici.",
|
||||
"settings_notify_completed": "Notifications d'achèvement",
|
||||
"settings_notify_completed_hint": "Une info pour le foyer quand une tâche est terminée, avec la raison et l'auteur. « Automatiques seulement » n'annonce que les achèvements que personne n'a faits sur place : retour du capteur, case cochée dans la liste de courses, appel de service d'une automatisation. Envoyé au service du foyer seulement ; heures calmes et plafond quotidien s'appliquent.",
|
||||
"notify_completed_off": "Désactivé",
|
||||
"notify_completed_automatic": "Achèvements automatiques seulement",
|
||||
"notify_completed_all": "Tous les achèvements",
|
||||
"settings_notify_rule": "Votre propre règle de notification",
|
||||
"settings_notify_rule_hint": "Chaque notification déclenche aussi l'événement maintenance_supporter_notification (type, statut, objet, tâche, numéros de référence, priorité, lien, charge utile). Routez-le avec une automatisation — vers Ticker, Telegram ou Pushover par exemple.",
|
||||
"settings_notify_event_only": "Déclencher seulement l'événement, ne rien envoyer",
|
||||
"settings_notify_event_only_hint": "Votre automatisation assure toute la livraison. Intervalles de répétition, heures calmes et plafond quotidien s'appliquent toujours au déclenchement de l'événement.",
|
||||
"settings_notify_extra_data": "Données de notification supplémentaires (modèle)",
|
||||
"settings_notify_extra_data_hint": "JSON ou YAML, Jinja autorisé ; fusionné dans les data de l'appel notify (vos clés l'emportent). Variables : kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Vérifiez avec le bouton Envoyer un test.",
|
||||
"settings_notify_extra_data_hint": "JSON ou YAML, Jinja autorisé ; fusionné dans les data de l'appel notify (vos clés l'emportent). Variables : kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Vérifiez avec le bouton Envoyer un test.",
|
||||
"card_saved_view": "Vue enregistrée",
|
||||
"card_saved_view_none": "Aucune",
|
||||
"card_saved_view_help": "Applique les filtres statut, utilisateur et étiquette de la vue en plus des filtres ci-dessus. Le tri et le regroupement de la vue sont des réglages d'affichage du panneau et ne s'appliquent pas à la carte.",
|
||||
"panel_card_tab": "Ouvrir sur l'onglet",
|
||||
"panel_card_tab_default": "Onglet mémorisé (comme dans le panneau)",
|
||||
"panel_card_view": "Ouvrir avec la vue enregistrée",
|
||||
"panel_card_height": "Hauteur",
|
||||
"panel_card_height_help": "Vide = remplit l'écran sous la carte (vue panneau). Sinon une longueur CSS comme 600px ou 80vh pour les vues avec d'autres cartes.",
|
||||
"panel_card_not_registered": "Le panneau Maintenance Supporter n'est pas disponible — l'intégration est-elle configurée ?",
|
||||
"panel_card_load_failed": "Le panneau Maintenance Supporter n'a pas pu être chargé — rechargez la page (après une mise à jour : videz le cache du navigateur).",
|
||||
"doc_part_none": "Aucun document lié à cette pièce.",
|
||||
"settings_templates_toggle_group": "Activer ou désactiver tous les modèles de ce groupe",
|
||||
"setups_button": "Configurations suggérées",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Bon état",
|
||||
"battery_fleet_status_due": "À remplacer",
|
||||
"battery_fleet_predicted_on": "Prévu vers {date}",
|
||||
"battery_fleet_predicted_typical": "Prévu vers le {date} — {months} mois typiques pour {type} ({source})",
|
||||
"lifetime_source_default": "valeur par défaut intégrée",
|
||||
"lifetime_source_table": "table intégrée",
|
||||
"lifetime_source_learned": "appris de {n} remplacements",
|
||||
"lifetime_source_override": "votre réglage",
|
||||
"lifetime_source_learned_device": "appris des {n} remplacements de cet appareil",
|
||||
"lifetime_source_learned_model": "appris de {n} remplacements sur des appareils de ce modèle",
|
||||
"battery_fleet_predicted_trend": "Prédit à partir de la tendance de décharge de cette pile : vers {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Rechargeable : à recharger plutôt qu'à remplacer — jamais sur la liste d'achats",
|
||||
"battery_fleet_sort_name": "Trier par nom",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Pièces utilisées",
|
||||
"print_inc_photos": "Photographies",
|
||||
"print_inc_documents": "Documents liés",
|
||||
"print_inc_doc_desc": "Descriptions des documents",
|
||||
"print_inc_checklist": "Liste de contrôle",
|
||||
"print_inc_notes": "Remarques",
|
||||
"print_inc_costs": "Coût et durée",
|
||||
"print_inc_person": "Réalisé par",
|
||||
"print_inc_refs": "Numéros de référence",
|
||||
"print_inc_bare": "Réalisations sans détails",
|
||||
"print_inc_qr": "QR code par tâche",
|
||||
"print_button": "Imprimer",
|
||||
"report_scan_hint": "Scanner pour ouvrir la tâche",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "रनटाइम",
|
||||
"runtime_hours": "लक्ष्य रनटाइम (घंटे)",
|
||||
"target_value": "लक्ष्य मान",
|
||||
"baseline": "आधार रेखा",
|
||||
"target_changes": "लक्ष्य परिवर्तन",
|
||||
"for_minutes": "के लिए (मिनट)",
|
||||
"time_based": "समय-आधारित",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "जनरेट किया गया",
|
||||
"report_times_done": "पूर्ण",
|
||||
"report_total_cost": "कुल लागत",
|
||||
"report_every": "हर {n} {unit}",
|
||||
"report_notes": "नोट्स",
|
||||
"report_col_type": "प्रकार",
|
||||
"report_col_status": "स्थिति",
|
||||
"report_col_schedule": "शेड्यूल",
|
||||
"duration": "अवधि",
|
||||
"minutes_short": "मिनट",
|
||||
"both": "दोनों",
|
||||
"trigger_val": "ट्रिगर मान",
|
||||
"complete_title": "पूर्ण करें: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: गलत प्रकार (अपेक्षित: {type})",
|
||||
"err_invalid_choice": "{field}: अनुमत मान नहीं है",
|
||||
"err_invalid_value": "{field}: अमान्य मान",
|
||||
"ws_err_not_found": "नहीं मिला — शायद इस बीच हटा दिया गया है",
|
||||
"ws_err_invalid_input": "अमान्य इनपुट",
|
||||
"ws_err_invalid_date": "अमान्य तारीख",
|
||||
"ws_err_invalid_format": "अमान्य प्रारूप",
|
||||
"ws_err_invalid_url": "अमान्य लिंक",
|
||||
"ws_err_not_configured": "अभी सेट नहीं किया गया",
|
||||
"ws_err_not_loaded": "अभी लोड नहीं हुआ — कुछ देर बाद फिर से कोशिश करें",
|
||||
"ws_err_limit_reached": "सीमा पूरी हो गई",
|
||||
"ws_err_too_many": "बहुत अधिक प्रविष्टियाँ",
|
||||
"ws_err_too_large": "बहुत बड़ा",
|
||||
"ws_err_not_archived": "संग्रहीत नहीं",
|
||||
"ws_err_invalid_target": "अमान्य लक्ष्य",
|
||||
"ws_err_create_failed": "बनाया नहीं जा सका",
|
||||
"ws_err_archived": "संग्रहीत — पहले पुनर्स्थापित करें",
|
||||
"ws_err_already_archived": "पहले से संग्रहीत",
|
||||
"ws_err_unavailable": "फ़िलहाल उपलब्ध नहीं",
|
||||
"ws_err_unauthorized": "आपके उपयोगकर्ता के लिए अनुमति नहीं",
|
||||
"ws_err_too_many_views": "बहुत अधिक सहेजे गए दृश्य",
|
||||
"ws_err_storage_unavailable": "स्टोरेज उपलब्ध नहीं है",
|
||||
"ws_err_replace_failed": "बदलना विफल रहा",
|
||||
"ws_err_not_paused": "रोका नहीं गया",
|
||||
"ws_err_not_available": "कुछ उपलब्ध नहीं",
|
||||
"ws_err_no_url": "कोई लिंक नहीं दिया गया",
|
||||
"ws_err_no_phases": "इस कार्य में कोई चरण नहीं है",
|
||||
"ws_err_invalid_view": "अमान्य दृश्य",
|
||||
"ws_err_invalid_user": "अज्ञात उपयोगकर्ता",
|
||||
"ws_err_invalid_range": "अमान्य सीमा",
|
||||
"ws_err_invalid_parent": "अमान्य मूल ऑब्जेक्ट",
|
||||
"ws_err_invalid_device": "अज्ञात डिवाइस",
|
||||
"ws_err_empty_csv": "CSV फ़ाइल खाली है",
|
||||
"ws_err_empty": "आयात करने के लिए कुछ नहीं",
|
||||
"ws_err_duplicate_failed": "डुप्लिकेट नहीं किया जा सका",
|
||||
"ws_err_already_paused": "पहले से रोका गया",
|
||||
"ws_err_invalid_cursor": "अमान्य चरण स्थिति",
|
||||
"ws_err_invalid_entity_slug": "अमान्य एंटिटी नाम",
|
||||
"ws_err_invalid_trigger_config": "अमान्य ट्रिगर कॉन्फ़िगरेशन",
|
||||
"ws_err_no_defaults": "त्वरित पूर्णता के लिए डिफ़ॉल्ट सेट नहीं",
|
||||
"ws_err_self_link_device": "कोई ऑब्जेक्ट स्वयं से लिंक नहीं हो सकता",
|
||||
"ws_err_too_early": "बहुत जल्दी — यह कार्य केवल नियत तारीख के करीब ही पूरा किया जा सकता है",
|
||||
"feat_schedule_time": "दिन का समय निर्धारण",
|
||||
"feat_schedule_time_desc": "कार्य मध्यरात्रि के बजाय दिन के एक विशिष्ट समय पर अतिदेय हो जाते हैं।",
|
||||
"schedule_time_toggle": "किसी निश्चित समय पर देय",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "बराबर होने पर ट्रिगर करें (=)",
|
||||
"trigger_not_equals": "भिन्न होने पर ट्रिगर करें (≠)",
|
||||
"for_at_least_minutes": "कम से कम (मिनट)",
|
||||
"safety_interval_days": "सुरक्षा अंतराल (दिन, वैकल्पिक)",
|
||||
"safety_interval": "सुरक्षा अंतराल (वैकल्पिक)",
|
||||
"trigger_combinator": "ट्रिगर और अंतराल संयोजित करें",
|
||||
"trigger_combinator_any": "ट्रिगर या अंतराल (जो पहले हो)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "मेरे कार्य",
|
||||
"tab_calendar": "कैलेंडर",
|
||||
"cal_no_events": "कोई रखरखाव नहीं",
|
||||
"cal_window_7": "7 दिन",
|
||||
"cal_window_14": "14 दिन",
|
||||
"cal_window_30": "30 दिन",
|
||||
"cal_window_365": "1 वर्ष",
|
||||
"cal_every_n_days": "हर {n} दिन",
|
||||
"cal_source_time": "समय-आधारित",
|
||||
"cal_source_time_adaptive": "समय-आधारित (अनुकूली)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "QR कोड बनाने में विफल।",
|
||||
"qr_error_no_url": "कोई HA URL कॉन्फ़िगर नहीं है। कृपया सेटिंग्स → सिस्टम → नेटवर्क में एक बाहरी या आंतरिक URL सेट करें।",
|
||||
"save_error": "सहेजने में विफल। कृपया पुनः प्रयास करें।",
|
||||
"subsave_warning": "सहेजा गया, लेकिन एक सेटिंग अस्वीकृत हुई: {detail}",
|
||||
"qr_print": "प्रिंट करें",
|
||||
"qr_download": "SVG डाउनलोड करें",
|
||||
"qr_action": "स्कैन पर क्रिया",
|
||||
"qr_action_view": "रखरखाव जानकारी देखें",
|
||||
"qr_action_complete": "रखरखाव को पूर्ण के रूप में चिह्नित करें",
|
||||
"qr_url_mode": "लिंक प्रकार",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "लोकल (mDNS)",
|
||||
"qr_mode_server": "सर्वर URL",
|
||||
"overview": "अवलोकन",
|
||||
"analysis": "विश्लेषण",
|
||||
"recent_activities": "हाल की गतिविधियाँ",
|
||||
"search_notes": "टिप्पणियाँ खोजें",
|
||||
"avg_cost": "औसत लागत",
|
||||
"no_advanced_features": "कोई उन्नत सुविधा सक्षम नहीं",
|
||||
"no_advanced_features_hint": "यहाँ विश्लेषण डेटा देखने के लिए इंटीग्रेशन सेटिंग्स में “अनुकूली अंतराल” या “मौसमी पैटर्न” सक्षम करें।",
|
||||
"analysis_not_enough_data": "अभी विश्लेषण के लिए पर्याप्त डेटा नहीं।",
|
||||
"analysis_not_enough_data_hint": "वीबुल विश्लेषण के लिए कम से कम 5 पूर्ण रखरखाव आवश्यक हैं; मौसमी पैटर्न प्रति माह 6+ डेटा बिंदुओं के बाद दिखाई देते हैं।",
|
||||
"analysis_manual_task_hint": "अंतराल के बिना मैनुअल कार्य विश्लेषण डेटा उत्पन्न नहीं करते।",
|
||||
"completions": "पूर्णताएँ",
|
||||
"current": "वर्तमान",
|
||||
"shorter": "छोटा",
|
||||
"longer": "लंबा",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "पिछली अवधियाँ",
|
||||
"cal_forward_windows": "आगामी अवधियाँ",
|
||||
"history_edit_title": "इतिहास प्रविष्टि संपादित करें",
|
||||
"history_delete_entry": "प्रविष्टि हटाएँ",
|
||||
"history_delete_confirm": "क्या यह इतिहास प्रविष्टि हटाएँ? अंतिम निष्पादन की तिथि पिछली पूर्णता पर लौट जाएगी; फ़ोटो ऑब्जेक्ट के पास रहेंगे और उपयोग किए गए पुर्जे स्टॉक में वापस नहीं जोड़े जाएँगे।",
|
||||
"history_edit_timestamp": "टाइमस्टैम्प",
|
||||
"manufacturer": "निर्माता",
|
||||
"model": "मॉडल",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "डिफ़ॉल्ट चेतावनी दिन",
|
||||
"settings_consumable_threshold": "उपभोग्य „कम“ सीमा (%)",
|
||||
"settings_battery_low_percent": "बैटरी „कम“ सीमा (%)",
|
||||
"settings_battery_lifetimes": "बैटरी की सामान्य आयु",
|
||||
"settings_battery_lifetimes_hint": "केवल बिना प्रतिशत वाली बैटरियों के लिए: सिर्फ़ प्रकार और बदलने की तारीख वाला Battery Notes नोट, या केवल \"कम\" बताने वाला सेंसर। नियत तिथि = अंतिम बदलाव + यह आयु। स्तर बताने वाली बैटरियों का पूर्वानुमान मापे गए डिस्चार्ज से बनता है। एक प्रकार के तीन बदलाव देखने के बाद माध्यिका अंतराल अंतर्निहित मान की जगह लेता है — आपका अपना मान हमेशा प्राथमिकता पाता है।",
|
||||
"settings_battery_lifetime_months": "महीने",
|
||||
"settings_battery_lifetime_reset": "डिफ़ॉल्ट उपयोग करें",
|
||||
"settings_battery_lifetime_in_fleet": "आपके बेड़े में",
|
||||
"settings_battery_lifetime_learned_models": "मॉडल अनुसार सीखा: {list}",
|
||||
"settings_thresholds_hint": "नए सुझाए गए सेटअप (शेष प्रतिशत) और अपनी Battery Notes सीमा न रखने वाली बेड़े की बैटरियों के लिए डिफ़ॉल्ट। मौजूदा कार्य अपना मान रखते हैं।",
|
||||
"settings_value_out_of_range": "मान {min} और {max} के बीच होना चाहिए",
|
||||
"bn_summary": "{name}: {n} बैटरियों के लिए {pct} %",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} डिवाइस अपनी सीमा के साथ:",
|
||||
"bn_more": "+ {n} और",
|
||||
"settings_row_actions": "कार्य पंक्ति क्रियाएँ",
|
||||
"settings_ref_numbers_in_lists": "सूचियों में संदर्भ संख्या",
|
||||
"settings_ref_numbers_in_lists_hint": "आज सूची, कार्य तालिका, ऑब्जेक्ट कार्ड और ऑब्जेक्ट तालिका में ऑब्जेक्ट और कार्य नामों के आगे #8 / #8.3 चिप दिखाता है।",
|
||||
"row_actions_buttons_compact": "बटन (फ़ोन पर केवल आइकन)",
|
||||
"row_actions_buttons": "टेक्स्ट वाले बटन",
|
||||
"row_actions_icons": "आइकन (क्लासिक)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "स्नूज़ अवधि (घंटे)",
|
||||
"settings_budget": "बजट",
|
||||
"settings_currency": "मुद्रा",
|
||||
"settings_currency_decimals": "राशियों के दशमलव स्थान",
|
||||
"settings_currency_decimals_hint": "हर राशि कितने दशमलव दिखाए: KPI, बजट, सूचियों और रिपोर्टों में लागत, बजट अलर्ट। 0 = पूर्ण संख्याएँ।",
|
||||
"settings_budget_monthly": "मासिक बजट",
|
||||
"settings_budget_yearly": "वार्षिक बजट",
|
||||
"settings_budget_alerts": "बजट अलर्ट",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "YAML निर्यात करें",
|
||||
"settings_export_csv": "CSV निर्यात करें",
|
||||
"settings_export_settings": "सेटिंग्स निर्यात करें (JSON)",
|
||||
"settings_import_csv": "CSV आयात करें",
|
||||
"settings_import_placeholder": "JSON या CSV सामग्री यहाँ चिपकाएँ…",
|
||||
"settings_import_btn": "आयात करें",
|
||||
"settings_import_success": "{count} वस्तुएँ सफलतापूर्वक आयात की गईं।",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "पूर्ण होने पर प्रति-कार्य HA क्रिया + पूर्व-निर्धारित मानों के साथ त्वरित-पूर्ण QR।",
|
||||
"on_complete_action_title": "पूर्ण होने पर: HA क्रिया ट्रिगर करें (वैकल्पिक)",
|
||||
"on_complete_action_desc": "कार्य पूर्ण होने पर एक HA सेवा कॉल करता है — उदा. डिवाइस पर काउंटर रीसेट करना।",
|
||||
"on_complete_action_service": "सेवा",
|
||||
"on_complete_action_target": "लक्ष्य एंटिटी",
|
||||
"on_complete_action_target_hint": "ध्यान दें: एंटिटी डोमेन सेवा से मेल खाना चाहिए — उदा. 'button.press' केवल button.* पर काम करता है, 'counter.increment' केवल counter.* पर, 'input_button.press' केवल input_button.* पर आदि। मेल न खाने पर क्रिया चुपचाप विफल हो जाएगी (HA लॉग करता है 'Referenced entities ... missing or not currently available')।",
|
||||
"on_complete_action_data": "डेटा (JSON, वैकल्पिक)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "तस्वीरें चुनें",
|
||||
"choose_photo": "फ़ोटो चुनें",
|
||||
"photos_android_hint": "Android ऐप प्रति चयन एक फ़ोटो देता है — हर चयन जोड़ा जाता है।",
|
||||
"add_photos": "तस्वीरें जोड़ें",
|
||||
"photos_limit": "प्रति पूर्णता अधिकतम {max} तस्वीरें",
|
||||
"history_edit_photos_hint": "यहाँ हटाई गई तस्वीर ऑब्जेक्ट के दस्तावेज़ों में बनी रहती है।",
|
||||
"uploading": "अपलोड हो रहा है…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "डाउनलोड करें",
|
||||
"doc_close": "बंद करें",
|
||||
"doc_camera": "फ़ोटो लें",
|
||||
"camera_capture_shoot": "कैप्चर करें",
|
||||
"camera_switch_lens": "कैमरा बदलें",
|
||||
"doc_drop_hint": "फ़ाइलें यहाँ छोड़ें",
|
||||
"doc_task_none": "इस कार्य से कोई दस्तावेज़ संबद्ध नहीं है।",
|
||||
"doc_link_existing": "दस्तावेज़ जोड़ें…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "जब ट्रिगर स्वयं हल हो जाता है तो एक पूर्णता दर्ज करता है (अंतिम निष्पादन सेट करता है) — जैसे नमक भरा गया, फ़िल्टर बदला गया।",
|
||||
"doc_search": "दस्तावेज़ खोजें…",
|
||||
"doc_search_none": "कोई मेल खाता दस्तावेज़ नहीं",
|
||||
"doc_description": "विवरण (वैकल्पिक)",
|
||||
"doc_sort": "दस्तावेज़ क्रमबद्ध करें",
|
||||
"doc_sort_newest": "नवीनतम पहले",
|
||||
"doc_sort_oldest": "सबसे पुराने पहले",
|
||||
"doc_sort_title": "शीर्षक के अनुसार (1, 2, 3 …)",
|
||||
"doc_sort_category": "श्रेणी के अनुसार",
|
||||
"link_device_optional": "मौजूदा डिवाइस से लिंक करें (वैकल्पिक)",
|
||||
"parent_object_optional": "मूल ऑब्जेक्ट (वैकल्पिक)",
|
||||
"parent_none": "(कोई मूल नहीं)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "केवल इस व्यू के लिए सूचित करें",
|
||||
"settings_notify_scope_all": "सभी कार्य",
|
||||
"settings_notify_scope_hint": "केवल वे कार्य अनुस्मारक भेजते हैं जो चुने गए व्यू के लेबल/उपयोगकर्ता फ़िल्टर से मेल खाते हैं। व्यू की स्थिति, क्रम और समूहन यहाँ अनदेखे रहते हैं।",
|
||||
"settings_notify_completed": "पूर्णता सूचनाएँ",
|
||||
"settings_notify_completed_hint": "किसी कार्य के पूरा होने पर परिवार को कारण और करने वाले सहित सूचना। \"केवल स्वचालित\" सिर्फ़ वे पूर्णताएँ बताता है जो किसी ने मौके पर नहीं कीं: सेंसर रिकवरी, खरीदारी सूची में टिक, ऑटोमेशन का सर्विस कॉल। केवल परिवार की सेवा पर; शांत घंटे और दैनिक सीमा लागू।",
|
||||
"notify_completed_off": "बंद",
|
||||
"notify_completed_automatic": "केवल स्वचालित पूर्णताएँ",
|
||||
"notify_completed_all": "सभी पूर्णताएँ",
|
||||
"settings_notify_rule": "आपका अपना सूचना नियम",
|
||||
"settings_notify_rule_hint": "हर सूचना maintenance_supporter_notification इवेंट भी ट्रिगर करती है (प्रकार, स्थिति, ऑब्जेक्ट, कार्य, संदर्भ संख्याएँ, प्राथमिकता, डीप लिंक, पेलोड)। इसे ऑटोमेशन से रूट करें — जैसे Ticker, Telegram या Pushover में।",
|
||||
"settings_notify_event_only": "केवल इवेंट ट्रिगर करें, स्वयं कुछ न भेजें",
|
||||
"settings_notify_event_only_hint": "आपका ऑटोमेशन पूरी डिलीवरी संभालता है। दोहराव अंतराल, शांत घंटे और दैनिक सीमा अभी भी तय करते हैं कि इवेंट कब ट्रिगर हो।",
|
||||
"settings_notify_extra_data": "अतिरिक्त सूचना डेटा (टेम्पलेट)",
|
||||
"settings_notify_extra_data_hint": "JSON या YAML, Jinja की अनुमति; notify कॉल के data में मिलाया जाता है (आपकी कुंजियाँ प्राथमिक)। वेरिएबल: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message। परीक्षण भेजें बटन से जाँचें।",
|
||||
"settings_notify_extra_data_hint": "JSON या YAML, Jinja की अनुमति; notify कॉल के data में मिलाया जाता है (आपकी कुंजियाँ प्राथमिक)। वेरिएबल: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message। परीक्षण भेजें बटन से जाँचें।",
|
||||
"card_saved_view": "सहेजा गया व्यू",
|
||||
"card_saved_view_none": "कोई नहीं",
|
||||
"card_saved_view_help": "ऊपर दिए फ़िल्टरों के अतिरिक्त व्यू के स्थिति, उपयोगकर्ता और लेबल फ़िल्टर लागू करता है। व्यू का क्रम और समूहन पैनल की प्रदर्शन सेटिंग हैं और कार्ड पर लागू नहीं होते।",
|
||||
"panel_card_tab": "इस टैब पर खोलें",
|
||||
"panel_card_tab_default": "याद रखा गया टैब (पैनल जैसा)",
|
||||
"panel_card_view": "सहेजे गए दृश्य के साथ खोलें",
|
||||
"panel_card_height": "ऊँचाई",
|
||||
"panel_card_height_help": "खाली = कार्ड के नीचे की स्क्रीन भरता है (पैनल दृश्य)। अन्यथा अन्य कार्डों वाले दृश्यों के लिए 600px या 80vh जैसी CSS लंबाई।",
|
||||
"panel_card_not_registered": "Maintenance Supporter पैनल उपलब्ध नहीं है — क्या इंटीग्रेशन सेट है?",
|
||||
"panel_card_load_failed": "Maintenance Supporter पैनल लोड नहीं हो सका — पेज फिर से लोड करें (अपडेट के बाद: ब्राउज़र कैश साफ़ करें)।",
|
||||
"doc_part_none": "इस पुर्ज़े से कोई दस्तावेज़ जुड़ा नहीं है।",
|
||||
"settings_templates_toggle_group": "इस समूह के सभी टेम्पलेट चालू या बंद करें",
|
||||
"setups_button": "सुझाए गए सेटअप",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "ठीक",
|
||||
"battery_fleet_status_due": "देय",
|
||||
"battery_fleet_predicted_on": "{date} के आसपास अपेक्षित",
|
||||
"battery_fleet_predicted_typical": "लगभग {date} अपेक्षित — {type} के लिए सामान्यतः {months} महीने ({source})",
|
||||
"lifetime_source_default": "अंतर्निहित डिफ़ॉल्ट",
|
||||
"lifetime_source_table": "अंतर्निहित तालिका",
|
||||
"lifetime_source_learned": "{n} बदलावों से सीखा",
|
||||
"lifetime_source_override": "आपकी सेटिंग",
|
||||
"lifetime_source_learned_device": "इस डिवाइस के {n} बदलावों से सीखा",
|
||||
"lifetime_source_learned_model": "इस मॉडल के डिवाइसों के {n} बदलावों से सीखा",
|
||||
"battery_fleet_predicted_trend": "इस बैटरी के डिस्चार्ज रुझान से अनुमानित: लगभग {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "रिचार्जेबल: बदलने के बजाय चार्ज करें — खरीदारी सूची में कभी नहीं",
|
||||
"battery_fleet_sort_name": "नाम के अनुसार क्रमबद्ध करें",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "प्रयुक्त पुर्जे",
|
||||
"print_inc_photos": "फ़ोटो",
|
||||
"print_inc_documents": "लिंक किए गए दस्तावेज़",
|
||||
"print_inc_doc_desc": "दस्तावेज़ विवरण",
|
||||
"print_inc_checklist": "चेकलिस्ट",
|
||||
"print_inc_notes": "नोट्स",
|
||||
"print_inc_costs": "लागत और अवधि",
|
||||
"print_inc_person": "पूर्ण किया",
|
||||
"print_inc_refs": "संदर्भ संख्याएँ",
|
||||
"print_inc_bare": "बिना विवरण के पूर्ण किए गए कार्य",
|
||||
"print_inc_qr": "प्रति कार्य QR कोड",
|
||||
"print_button": "प्रिंट",
|
||||
"report_scan_hint": "कार्य खोलने के लिए स्कैन करें",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Üzemidő",
|
||||
"runtime_hours": "Cél üzemidő (óra)",
|
||||
"target_value": "Célérték",
|
||||
"baseline": "Kiindulási érték",
|
||||
"target_changes": "Cél változásszám",
|
||||
"for_minutes": "Ennyi ideig (perc)",
|
||||
"time_based": "Időalapú",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Létrehozva",
|
||||
"report_times_done": "Elvégezve",
|
||||
"report_total_cost": "Összköltség",
|
||||
"report_every": "minden {n}. {unit}",
|
||||
"report_notes": "Megjegyzések",
|
||||
"report_col_type": "Típus",
|
||||
"report_col_status": "Állapot",
|
||||
"report_col_schedule": "Ütemezés",
|
||||
"duration": "Időtartam",
|
||||
"minutes_short": "perc",
|
||||
"both": "Mindkettő",
|
||||
"trigger_val": "Kiváltó érték",
|
||||
"complete_title": "Elvégzés: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: hibás típus (várt: {type})",
|
||||
"err_invalid_choice": "{field}: nem megengedett érték",
|
||||
"err_invalid_value": "{field}: érvénytelen érték",
|
||||
"ws_err_not_found": "Nem található — időközben törölhették",
|
||||
"ws_err_invalid_input": "Érvénytelen bevitel",
|
||||
"ws_err_invalid_date": "Érvénytelen dátum",
|
||||
"ws_err_invalid_format": "Érvénytelen formátum",
|
||||
"ws_err_invalid_url": "Érvénytelen hivatkozás",
|
||||
"ws_err_not_configured": "Még nincs beállítva",
|
||||
"ws_err_not_loaded": "Még nincs betöltve — próbálja újra egy pillanat múlva",
|
||||
"ws_err_limit_reached": "Elérte a korlátot",
|
||||
"ws_err_too_many": "Túl sok bejegyzés",
|
||||
"ws_err_too_large": "Túl nagy",
|
||||
"ws_err_not_archived": "Nincs archiválva",
|
||||
"ws_err_invalid_target": "Érvénytelen cél",
|
||||
"ws_err_create_failed": "Nem sikerült létrehozni",
|
||||
"ws_err_archived": "Archiválva — először állítsa vissza",
|
||||
"ws_err_already_archived": "Már archiválva",
|
||||
"ws_err_unavailable": "Jelenleg nem elérhető",
|
||||
"ws_err_unauthorized": "A felhasználója számára nem engedélyezett",
|
||||
"ws_err_too_many_views": "Túl sok mentett nézet",
|
||||
"ws_err_storage_unavailable": "A tároló nem elérhető",
|
||||
"ws_err_replace_failed": "A csere sikertelen",
|
||||
"ws_err_not_paused": "Nincs szüneteltetve",
|
||||
"ws_err_not_available": "Semmi sem elérhető",
|
||||
"ws_err_no_url": "Nincs megadva hivatkozás",
|
||||
"ws_err_no_phases": "Ennek a feladatnak nincsenek fázisai",
|
||||
"ws_err_invalid_view": "Érvénytelen nézet",
|
||||
"ws_err_invalid_user": "Ismeretlen felhasználó",
|
||||
"ws_err_invalid_range": "Érvénytelen tartomány",
|
||||
"ws_err_invalid_parent": "Érvénytelen szülőobjektum",
|
||||
"ws_err_invalid_device": "Ismeretlen eszköz",
|
||||
"ws_err_empty_csv": "A CSV-fájl üres",
|
||||
"ws_err_empty": "Nincs mit importálni",
|
||||
"ws_err_duplicate_failed": "Nem sikerült duplikálni",
|
||||
"ws_err_already_paused": "Már szünetel",
|
||||
"ws_err_invalid_cursor": "Érvénytelen fázispozíció",
|
||||
"ws_err_invalid_entity_slug": "Érvénytelen entitásnév",
|
||||
"ws_err_invalid_trigger_config": "Érvénytelen eseményindító-beállítás",
|
||||
"ws_err_no_defaults": "Nincs beállítva gyors befejezési alapérték",
|
||||
"ws_err_self_link_device": "Egy objektum nem kapcsolható önmagához",
|
||||
"ws_err_too_early": "Túl korai — ez a feladat csak a határidőhöz közelebb fejezhető be",
|
||||
"feat_schedule_time": "Napszakhoz kötött ütemezés",
|
||||
"feat_schedule_time_desc": "A feladatok nem éjfélkor, hanem egy megadott napszakban válnak lejárttá.",
|
||||
"schedule_time_toggle": "Adott időpontban esedékes",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Aktiválás ha egyenlő (=)",
|
||||
"trigger_not_equals": "Aktiválás ha eltér ettől (≠)",
|
||||
"for_at_least_minutes": "Legalább ennyi ideig (perc)",
|
||||
"safety_interval_days": "Biztonsági intervallum (nap, opcionális)",
|
||||
"safety_interval": "Biztonsági intervallum (opcionális)",
|
||||
"trigger_combinator": "Trigger és időköz kombinálása",
|
||||
"trigger_combinator_any": "Trigger vagy időköz (amelyik előbb)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Saját feladataim",
|
||||
"tab_calendar": "Naptár",
|
||||
"cal_no_events": "Nincs karbantartás",
|
||||
"cal_window_7": "7 nap",
|
||||
"cal_window_14": "14 nap",
|
||||
"cal_window_30": "30 nap",
|
||||
"cal_window_365": "1 év",
|
||||
"cal_every_n_days": "{n} naponta",
|
||||
"cal_source_time": "Időalapú",
|
||||
"cal_source_time_adaptive": "Időalapú (adaptív)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "A QR-kód generálása nem sikerült.",
|
||||
"qr_error_no_url": "Nincs HA URL beállítva. Adjon meg külső vagy belső URL-t a Beállítások → Rendszer → Hálózat alatt.",
|
||||
"save_error": "A mentés nem sikerült. Próbálja újra.",
|
||||
"subsave_warning": "Mentve, de egy beállítást elutasított a rendszer: {detail}",
|
||||
"qr_print": "Nyomtatás",
|
||||
"qr_download": "SVG letöltése",
|
||||
"qr_action": "Művelet beolvasáskor",
|
||||
"qr_action_view": "Karbantartási adatok megtekintése",
|
||||
"qr_action_complete": "Karbantartás elvégzettként jelölése",
|
||||
"qr_url_mode": "Hivatkozás típusa",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Helyi (mDNS)",
|
||||
"qr_mode_server": "Szerver URL",
|
||||
"overview": "Áttekintés",
|
||||
"analysis": "Elemzés",
|
||||
"recent_activities": "Legutóbbi tevékenységek",
|
||||
"search_notes": "Keresés a megjegyzésekben",
|
||||
"avg_cost": "Átl. költség",
|
||||
"no_advanced_features": "Nincsenek engedélyezett speciális funkciók",
|
||||
"no_advanced_features_hint": "Az elemzési adatok megjelenítéséhez engedélyezze az „Adaptív ütemezés” vagy a „Szezonális minták” funkciót az integráció beállításaiban.",
|
||||
"analysis_not_enough_data": "Még nincs elég adat az elemzéshez.",
|
||||
"analysis_not_enough_data_hint": "A Weibull-elemzéshez legalább 5 elvégzett karbantartás szükséges; a szezonális minták havi 6+ adatpont után válnak láthatóvá.",
|
||||
"analysis_manual_task_hint": "Az intervallum nélküli kézi feladatok nem termelnek elemzési adatot.",
|
||||
"completions": "elvégzés",
|
||||
"current": "Jelenlegi",
|
||||
"shorter": "Rövidebb",
|
||||
"longer": "Hosszabb",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Korábbi időszakok",
|
||||
"cal_forward_windows": "Jövőbeli időszakok",
|
||||
"history_edit_title": "Előzménybejegyzés szerkesztése",
|
||||
"history_delete_entry": "Bejegyzés törlése",
|
||||
"history_delete_confirm": "Törli ezt az előzménybejegyzést? Az utolsó elvégzés dátuma az előzőre áll vissza; a fotók az objektumnál maradnak, a felhasznált alkatrészek nem kerülnek vissza a készletbe.",
|
||||
"history_edit_timestamp": "Időbélyeg",
|
||||
"manufacturer": "Gyártó",
|
||||
"model": "Modell",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Alapértelmezett figyelmeztetési napok",
|
||||
"settings_consumable_threshold": "„Fogyóeszköz alacsony” küszöb (%)",
|
||||
"settings_battery_low_percent": "„Alacsony akkumulátor” küszöb (%)",
|
||||
"settings_battery_lifetimes": "Jellemző elem-élettartamok",
|
||||
"settings_battery_lifetimes_hint": "Csak százalék nélküli elemeknél használjuk: olyan Battery Notes-bejegyzésnél, amelynek csak típusa és cseredátuma van, vagy csak „alacsony”-t jelentő érzékelőnél. Esedékesség = utolsó csere + ez az élettartam. A szintet jelentő elemek előrejelzése a mért kisülésből jön. Ha a flotta már három cserét látott egy típusból, a medián időköz veszi át a beépített értéket — a saját értéked mindig nyer.",
|
||||
"settings_battery_lifetime_months": "hónap",
|
||||
"settings_battery_lifetime_reset": "Alapérték",
|
||||
"settings_battery_lifetime_in_fleet": "a flottádban",
|
||||
"settings_battery_lifetime_learned_models": "Modellenként tanulva: {list}",
|
||||
"settings_thresholds_hint": "Alapértékek az új Javasolt beállításokhoz (százalékos maradék) és a saját Battery Notes-küszöb nélküli flottaelemekhez. A meglévő feladatok megtartják az értéküket.",
|
||||
"settings_value_out_of_range": "Az értéknek {min} és {max} között kell lennie",
|
||||
"bn_summary": "{name}: {pct} % {n} elemhez",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} eszköz saját küszöbbel:",
|
||||
"bn_more": "+ még {n}",
|
||||
"settings_row_actions": "Műveletek a feladatsorokban",
|
||||
"settings_ref_numbers_in_lists": "Hivatkozási számok a listákban",
|
||||
"settings_ref_numbers_in_lists_hint": "Megjeleníti a #8 / #8.3 címkéket az objektum- és feladatnevek előtt a Ma listában, a feladattáblában, az objektumkártyákon és az objektumtáblában.",
|
||||
"row_actions_buttons_compact": "Gombok (telefonon csak ikonok)",
|
||||
"row_actions_buttons": "Gombok szöveggel",
|
||||
"row_actions_icons": "Ikonok (klasszikus)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Szundi időtartama (óra)",
|
||||
"settings_budget": "Költségkeret",
|
||||
"settings_currency": "Pénznem",
|
||||
"settings_currency_decimals": "Összegek tizedesjegyei",
|
||||
"settings_currency_decimals_hint": "Hány tizedesjegyet mutasson minden összeg: KPI-k, költségvetések, költségek a listákban és jelentésekben, költségvetési riasztások. 0 = egész számok.",
|
||||
"settings_budget_monthly": "Havi költségkeret",
|
||||
"settings_budget_yearly": "Éves költségkeret",
|
||||
"settings_budget_alerts": "Költségkeret-riasztások",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "YAML exportálása",
|
||||
"settings_export_csv": "CSV exportálása",
|
||||
"settings_export_settings": "Beállítások exportálása (JSON)",
|
||||
"settings_import_csv": "CSV importálása",
|
||||
"settings_import_placeholder": "Illessze be ide a JSON vagy CSV tartalmat…",
|
||||
"settings_import_btn": "Importálás",
|
||||
"settings_import_success": "{count} objektum sikeresen importálva.",
|
||||
@@ -644,7 +681,6 @@
|
||||
"feat_completion_actions_desc": "Feladatonkénti HA művelet elvégzéskor + gyorselvégző QR előre beállított értékekkel.",
|
||||
"on_complete_action_title": "Elvégzéskor: HA művelet indítása (opcionális)",
|
||||
"on_complete_action_desc": "HA szolgáltatást hív meg a feladat elvégzésekor — pl. számláló nullázása az eszközön.",
|
||||
"on_complete_action_service": "Szolgáltatás",
|
||||
"on_complete_action_target": "Cél entitás",
|
||||
"on_complete_action_target_hint": "Megjegyzés: az entitás doménjének egyeznie kell a szolgáltatással — pl. a „button.press” csak button.* entitáson működik, a „counter.increment” csak counter.* entitáson, az „input_button.press” csak input_button.* entitáson stb. Eltérés esetén a művelet csendben meghiúsul (a HA naplóban: „Referenced entities ... missing or not currently available”).",
|
||||
"on_complete_action_data": "Adatok (JSON, opcionális)",
|
||||
@@ -710,7 +746,6 @@
|
||||
"choose_photos": "Fotók kiválasztása",
|
||||
"choose_photo": "Fotó kiválasztása",
|
||||
"photos_android_hint": "Az Android-alkalmazás választásonként egy fotót ad át — minden választás hozzáadódik.",
|
||||
"add_photos": "Fotók hozzáadása",
|
||||
"photos_limit": "Legfeljebb {max} fotó elvégzésenként",
|
||||
"history_edit_photos_hint": "Az itt eltávolított fotó megmarad az objektum dokumentumai között.",
|
||||
"uploading": "Feltöltés…",
|
||||
@@ -731,6 +766,8 @@
|
||||
"doc_download": "Letöltés",
|
||||
"doc_close": "Bezárás",
|
||||
"doc_camera": "Fotó készítése",
|
||||
"camera_capture_shoot": "Felvétel",
|
||||
"camera_switch_lens": "Kamera váltása",
|
||||
"doc_drop_hint": "Húzza ide a fájlokat",
|
||||
"doc_task_none": "Ehhez a feladathoz nincs dokumentum csatolva.",
|
||||
"doc_link_existing": "Dokumentum hozzárendelése…",
|
||||
@@ -747,6 +784,12 @@
|
||||
"auto_complete_on_recovery_help": "Elvégzést rögzít (beállítja az utolsó elvégzést), amikor a kiváltás magától megszűnik — pl. só utántöltve, szűrő kicserélve.",
|
||||
"doc_search": "Dokumentumok keresése…",
|
||||
"doc_search_none": "Nincs egyező dokumentum",
|
||||
"doc_description": "Leírás (opcionális)",
|
||||
"doc_sort": "Dokumentumok rendezése",
|
||||
"doc_sort_newest": "Legújabb elöl",
|
||||
"doc_sort_oldest": "Legrégebbi elöl",
|
||||
"doc_sort_title": "Cím szerint (1, 2, 3 …)",
|
||||
"doc_sort_category": "Kategória szerint",
|
||||
"link_device_optional": "Meglévő eszközhöz kapcsolás (opcionális)",
|
||||
"parent_object_optional": "Szülőobjektum (opcionális)",
|
||||
"parent_none": "(Nincs szülő)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Értesítés csak erre a nézetre",
|
||||
"settings_notify_scope_all": "Minden feladat",
|
||||
"settings_notify_scope_hint": "Csak a kiválasztott mentett nézet címke-/felhasználószűrőinek megfelelő feladatok küldenek emlékeztetőt. A nézet állapot-, rendezési és csoportosítási beállításait itt figyelmen kívül hagyjuk.",
|
||||
"settings_notify_completed": "Elvégzési értesítések",
|
||||
"settings_notify_completed_hint": "Üzenet a háztartásnak, ha egy feladat elkészült, az okkal és a végrehajtóval. A „Csak automatikus” csak azokat jelenti, amelyeket senki nem végzett el a helyszínen: érzékelő helyreállása, kipipálás a bevásárlólistán, automatizálás szolgáltatáshívása. Csak a háztartási szolgáltatásra; a csendes órák és a napi korlát érvényes.",
|
||||
"notify_completed_off": "Ki",
|
||||
"notify_completed_automatic": "Csak automatikus elvégzések",
|
||||
"notify_completed_all": "Minden elvégzés",
|
||||
"settings_notify_rule": "Saját értesítési szabály",
|
||||
"settings_notify_rule_hint": "Minden értesítés kiváltja a maintenance_supporter_notification eseményt is (típus, állapot, tárgy, feladat, hivatkozási számok, prioritás, mélylink, adatok). Irányítsa automatizálással — pl. a Tickerbe, Telegramba vagy Pushoverbe.",
|
||||
"settings_notify_event_only": "Csak az esemény, saját küldés nélkül",
|
||||
"settings_notify_event_only_hint": "A kézbesítést teljes egészében az automatizálás végzi. Az ismétlési időközök, a csendes órák és a napi korlát továbbra is meghatározzák, mikor váltódik ki az esemény.",
|
||||
"settings_notify_extra_data": "További értesítési adatok (sablon)",
|
||||
"settings_notify_extra_data_hint": "JSON vagy YAML, Jinja engedélyezett; beolvad a notify hívás data mezőjébe (a saját kulcsai nyernek). Változók: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Ellenőrizze a Teszt küldése gombbal.",
|
||||
"settings_notify_extra_data_hint": "JSON vagy YAML, Jinja engedélyezett; beolvad a notify hívás data mezőjébe (a saját kulcsai nyernek). Változók: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Ellenőrizze a Teszt küldése gombbal.",
|
||||
"card_saved_view": "Mentett nézet",
|
||||
"card_saved_view_none": "Nincs",
|
||||
"card_saved_view_help": "A nézet állapot-, felhasználó- és címkeszűrőit a fenti szűrőkön felül alkalmazza. A nézet rendezése és csoportosítása a panel megjelenítési beállítása, a kártyán nem érvényesül.",
|
||||
"panel_card_tab": "Megnyitás ezen a lapon",
|
||||
"panel_card_tab_default": "Megjegyzett lap (mint a panelen)",
|
||||
"panel_card_view": "Megnyitás mentett nézettel",
|
||||
"panel_card_height": "Magasság",
|
||||
"panel_card_height_help": "Üres = kitölti a képernyőt a kártya alatt (panelnézet). Egyébként egy CSS-hossz, például 600px vagy 80vh, más kártyákat is tartalmazó nézetekhez.",
|
||||
"panel_card_not_registered": "A Maintenance Supporter panel nem érhető el — be van állítva az integráció?",
|
||||
"panel_card_load_failed": "A Maintenance Supporter panelt nem sikerült betölteni — töltse újra az oldalt (frissítés után: ürítse a böngésző gyorsítótárát).",
|
||||
"doc_part_none": "Ehhez az alkatrészhez nincs dokumentum csatolva.",
|
||||
"settings_templates_toggle_group": "A csoport összes sablonjának be- vagy kikapcsolása",
|
||||
"setups_button": "Javasolt beállítások",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Rendben",
|
||||
"battery_fleet_status_due": "Esedékes",
|
||||
"battery_fleet_predicted_on": "Várhatóan {date} körül",
|
||||
"battery_fleet_predicted_typical": "Várhatóan {date} körül — {type} esetén jellemzően {months} hónap ({source})",
|
||||
"lifetime_source_default": "beépített alapérték",
|
||||
"lifetime_source_table": "beépített táblázat",
|
||||
"lifetime_source_learned": "{n} cseréből tanulva",
|
||||
"lifetime_source_override": "saját beállításod",
|
||||
"lifetime_source_learned_device": "ennek az eszköznek {n} cseréjéből tanulva",
|
||||
"lifetime_source_learned_model": "ennek a modellnek {n} cseréjéből tanulva",
|
||||
"battery_fleet_predicted_trend": "Az elem merülési trendjéből előrejelezve: kb. {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Újratölthető: cserélés helyett töltse fel — soha nem kerül a bevásárlólistára",
|
||||
"battery_fleet_sort_name": "Rendezés név szerint",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Felhasznált alkatrészek",
|
||||
"print_inc_photos": "Fotók",
|
||||
"print_inc_documents": "Csatolt dokumentumok",
|
||||
"print_inc_doc_desc": "Dokumentumleírások",
|
||||
"print_inc_checklist": "Ellenőrzőlista",
|
||||
"print_inc_notes": "Jegyzetek",
|
||||
"print_inc_costs": "Költség és időtartam",
|
||||
"print_inc_person": "Elvégezte",
|
||||
"print_inc_refs": "Hivatkozási számok",
|
||||
"print_inc_bare": "Részletek nélküli elvégzések",
|
||||
"print_inc_qr": "QR-kód feladatonként",
|
||||
"print_button": "Nyomtatás",
|
||||
"report_scan_hint": "Olvassa be a feladat megnyitásához",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Tempo di funzionamento",
|
||||
"runtime_hours": "Durata obiettivo (ore)",
|
||||
"target_value": "Valore obiettivo",
|
||||
"baseline": "Linea di base",
|
||||
"target_changes": "Modifiche obiettivo",
|
||||
"for_minutes": "Per (minuti)",
|
||||
"time_based": "Temporale",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Generato",
|
||||
"report_times_done": "Fatto",
|
||||
"report_total_cost": "Costo totale",
|
||||
"report_every": "ogni {n} {unit}",
|
||||
"report_notes": "Note",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Stato",
|
||||
"report_col_schedule": "Pianificazione",
|
||||
"duration": "Durata",
|
||||
"minutes_short": "min",
|
||||
"both": "Entrambi",
|
||||
"trigger_val": "Valore trigger",
|
||||
"complete_title": "Completato: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: tipo errato (atteso: {type})",
|
||||
"err_invalid_choice": "{field}: valore non consentito",
|
||||
"err_invalid_value": "{field}: valore non valido",
|
||||
"ws_err_not_found": "Non trovato — potrebbe essere stato eliminato nel frattempo",
|
||||
"ws_err_invalid_input": "Input non valido",
|
||||
"ws_err_invalid_date": "Data non valida",
|
||||
"ws_err_invalid_format": "Formato non valido",
|
||||
"ws_err_invalid_url": "Link non valido",
|
||||
"ws_err_not_configured": "Non ancora configurato",
|
||||
"ws_err_not_loaded": "Non ancora caricato — riprova tra un istante",
|
||||
"ws_err_limit_reached": "Limite raggiunto",
|
||||
"ws_err_too_many": "Troppe voci",
|
||||
"ws_err_too_large": "Troppo grande",
|
||||
"ws_err_not_archived": "Non archiviato",
|
||||
"ws_err_invalid_target": "Destinazione non valida",
|
||||
"ws_err_create_failed": "Impossibile creare",
|
||||
"ws_err_archived": "Archiviato — ripristinalo prima",
|
||||
"ws_err_already_archived": "Già archiviato",
|
||||
"ws_err_unavailable": "Al momento non disponibile",
|
||||
"ws_err_unauthorized": "Non consentito al tuo utente",
|
||||
"ws_err_too_many_views": "Troppe viste salvate",
|
||||
"ws_err_storage_unavailable": "Archiviazione non disponibile",
|
||||
"ws_err_replace_failed": "Sostituzione non riuscita",
|
||||
"ws_err_not_paused": "Non in pausa",
|
||||
"ws_err_not_available": "Niente di disponibile",
|
||||
"ws_err_no_url": "Nessun link indicato",
|
||||
"ws_err_no_phases": "Questa attività non ha fasi",
|
||||
"ws_err_invalid_view": "Vista non valida",
|
||||
"ws_err_invalid_user": "Utente sconosciuto",
|
||||
"ws_err_invalid_range": "Intervallo non valido",
|
||||
"ws_err_invalid_parent": "Oggetto principale non valido",
|
||||
"ws_err_invalid_device": "Dispositivo sconosciuto",
|
||||
"ws_err_empty_csv": "Il file CSV è vuoto",
|
||||
"ws_err_empty": "Niente da importare",
|
||||
"ws_err_duplicate_failed": "Impossibile duplicare",
|
||||
"ws_err_already_paused": "Già in pausa",
|
||||
"ws_err_invalid_cursor": "Posizione della fase non valida",
|
||||
"ws_err_invalid_entity_slug": "Nome entità non valido",
|
||||
"ws_err_invalid_trigger_config": "Configurazione del trigger non valida",
|
||||
"ws_err_no_defaults": "Nessun valore predefinito per il completamento rapido",
|
||||
"ws_err_self_link_device": "Un oggetto non può essere collegato a sé stesso",
|
||||
"ws_err_too_early": "Troppo presto — questa attività può essere completata solo più vicino alla scadenza",
|
||||
"feat_schedule_time": "Pianificazione oraria",
|
||||
"feat_schedule_time_desc": "Le attività scadono a un'ora specifica anziché a mezzanotte.",
|
||||
"schedule_time_toggle": "Scadenza a un orario preciso",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Attiva quando uguale a (=)",
|
||||
"trigger_not_equals": "Attiva quando diverso da (≠)",
|
||||
"for_at_least_minutes": "Per almeno (minuti)",
|
||||
"safety_interval_days": "Intervallo di sicurezza (giorni, opzionale)",
|
||||
"safety_interval": "Intervallo di sicurezza (opzionale)",
|
||||
"trigger_combinator": "Combina trigger e intervallo",
|
||||
"trigger_combinator_any": "Trigger o intervallo (il primo)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Le mie attività",
|
||||
"tab_calendar": "Calendario",
|
||||
"cal_no_events": "Nessuna manutenzione",
|
||||
"cal_window_7": "7 giorni",
|
||||
"cal_window_14": "14 giorni",
|
||||
"cal_window_30": "30 giorni",
|
||||
"cal_window_365": "1 anno",
|
||||
"cal_every_n_days": "ogni {n} giorni",
|
||||
"cal_source_time": "Basato sul tempo",
|
||||
"cal_source_time_adaptive": "Basato sul tempo (adattivo)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Impossibile generare il codice QR.",
|
||||
"qr_error_no_url": "Nessun URL HA configurato. Impostare un URL esterno o interno in Impostazioni → Sistema → Rete.",
|
||||
"save_error": "Salvataggio non riuscito. Riprovare.",
|
||||
"subsave_warning": "Salvato, ma un'impostazione è stata rifiutata: {detail}",
|
||||
"qr_print": "Stampa",
|
||||
"qr_download": "Scarica SVG",
|
||||
"qr_action": "Azione alla scansione",
|
||||
"qr_action_view": "Visualizza info manutenzione",
|
||||
"qr_action_complete": "Segna manutenzione come completata",
|
||||
"qr_url_mode": "Tipo di link",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Locale (mDNS)",
|
||||
"qr_mode_server": "URL server",
|
||||
"overview": "Panoramica",
|
||||
"analysis": "Analisi",
|
||||
"recent_activities": "Attività recenti",
|
||||
"search_notes": "Cerca nelle note",
|
||||
"avg_cost": "Ø Costo",
|
||||
"no_advanced_features": "Nessuna funzione avanzata attivata",
|
||||
"no_advanced_features_hint": "Attiva “Intervalli Adattivi” o “Modelli Stagionali” nelle impostazioni dell'integrazione per vedere i dati di analisi qui.",
|
||||
"analysis_not_enough_data": "Non ci sono ancora abbastanza dati per l'analisi.",
|
||||
"analysis_not_enough_data_hint": "L'analisi Weibull richiede almeno 5 manutenzioni completate; i modelli stagionali diventano visibili dopo 6+ punti dati al mese.",
|
||||
"analysis_manual_task_hint": "Le attività manuali senza intervallo non generano dati di analisi.",
|
||||
"completions": "completamenti",
|
||||
"current": "Attuale",
|
||||
"shorter": "Più breve",
|
||||
"longer": "Più lungo",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Finestre passate",
|
||||
"cal_forward_windows": "Finestre future",
|
||||
"history_edit_title": "Modifica voce dello storico",
|
||||
"history_delete_entry": "Elimina voce",
|
||||
"history_delete_confirm": "Eliminare questa voce della cronologia? La data dell'ultima esecuzione torna al completamento precedente; le foto restano con l'oggetto e le parti consumate non vengono rimesse a magazzino.",
|
||||
"history_edit_timestamp": "Data e ora",
|
||||
"manufacturer": "Produttore",
|
||||
"model": "Modello",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Giorni di avviso predefiniti",
|
||||
"settings_consumable_threshold": "Soglia „consumabile basso“ (%)",
|
||||
"settings_battery_low_percent": "Soglia „batteria scarica“ (%)",
|
||||
"settings_battery_lifetimes": "Durate tipiche delle batterie",
|
||||
"settings_battery_lifetimes_hint": "Usato solo per batterie senza percentuale: una nota Battery Notes con solo tipo e data di sostituzione, o un sensore che segnala solo « scarica ». La scadenza è ultima sostituzione + questa durata. Le batterie che riportano un livello ricavano la previsione dalla scarica misurata. Dopo tre sostituzioni dello stesso tipo, l'intervallo mediano sostituisce il valore integrato — il tuo valore vince sempre.",
|
||||
"settings_battery_lifetime_months": "mesi",
|
||||
"settings_battery_lifetime_reset": "Usa predefinito",
|
||||
"settings_battery_lifetime_in_fleet": "nel tuo parco",
|
||||
"settings_battery_lifetime_learned_models": "Appreso per modello: {list}",
|
||||
"settings_thresholds_hint": "Valori predefiniti per le nuove Configurazioni suggerite (percentuale residua) e per le batterie della flotta senza soglia Battery Notes propria. Le attività esistenti mantengono il loro valore.",
|
||||
"settings_value_out_of_range": "Il valore deve essere compreso tra {min} e {max}",
|
||||
"bn_summary": "{name}: {pct} % per {n} batterie",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} dispositivi con soglia propria:",
|
||||
"bn_more": "+ altri {n}",
|
||||
"settings_row_actions": "Azioni nelle righe delle attività",
|
||||
"settings_ref_numbers_in_lists": "Numeri di riferimento negli elenchi",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra le etichette #8 / #8.3 davanti ai nomi di oggetti e attività nell'elenco Oggi, nella tabella delle attività, nelle schede degli oggetti e nella tabella degli oggetti.",
|
||||
"row_actions_buttons_compact": "Pulsanti (solo icone sul telefono)",
|
||||
"row_actions_buttons": "Pulsanti con testo",
|
||||
"row_actions_icons": "Icone (classico)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Durata posticipo (ore)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Valuta",
|
||||
"settings_currency_decimals": "Decimali degli importi",
|
||||
"settings_currency_decimals_hint": "Quanti decimali mostra ogni importo: KPI, budget, costi in elenchi e report, avvisi di budget. 0 = numeri interi.",
|
||||
"settings_budget_monthly": "Budget mensile",
|
||||
"settings_budget_yearly": "Budget annuale",
|
||||
"settings_budget_alerts": "Avvisi budget",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Esporta YAML",
|
||||
"settings_export_csv": "Esporta CSV",
|
||||
"settings_export_settings": "Esporta impostazioni (JSON)",
|
||||
"settings_import_csv": "Importa CSV",
|
||||
"settings_import_placeholder": "Incolla il contenuto JSON o CSV qui…",
|
||||
"settings_import_btn": "Importa",
|
||||
"settings_import_success": "{count} oggetti importati con successo.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Azione HA per attività al completamento + QR completamento rapido con valori predefiniti.",
|
||||
"on_complete_action_title": "Al completamento: attiva azione HA (opzionale)",
|
||||
"on_complete_action_desc": "Chiama un servizio HA quando l'attività viene completata — es. azzerare un contatore sul dispositivo.",
|
||||
"on_complete_action_service": "Servizio",
|
||||
"on_complete_action_target": "Entità target",
|
||||
"on_complete_action_data": "Dati (JSON, opzionale)",
|
||||
"on_complete_action_test": "Testa azione",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Scegli foto",
|
||||
"choose_photo": "Scegli foto",
|
||||
"photos_android_hint": "L'app Android passa una foto per selezione — ogni selezione viene aggiunta.",
|
||||
"add_photos": "Aggiungi foto",
|
||||
"photos_limit": "Fino a {max} foto per completamento",
|
||||
"history_edit_photos_hint": "Una foto rimossa qui resta nei documenti dell'oggetto.",
|
||||
"uploading": "Caricamento…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Scarica",
|
||||
"doc_close": "Chiudi",
|
||||
"doc_camera": "Scatta foto",
|
||||
"camera_capture_shoot": "Scatta",
|
||||
"camera_switch_lens": "Cambia fotocamera",
|
||||
"doc_drop_hint": "Trascina qui i file",
|
||||
"doc_task_none": "Nessun documento collegato a questa attività.",
|
||||
"doc_link_existing": "Collega un documento…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Registra un completamento (imposta l'ultima esecuzione) quando il trigger si risolve da solo — ad es. sale ricaricato, filtro sostituito.",
|
||||
"doc_search": "Cerca documenti…",
|
||||
"doc_search_none": "Nessun documento corrispondente",
|
||||
"doc_description": "Descrizione (facoltativa)",
|
||||
"doc_sort": "Ordina documenti",
|
||||
"doc_sort_newest": "Più recenti prima",
|
||||
"doc_sort_oldest": "Meno recenti prima",
|
||||
"doc_sort_title": "Per titolo (1, 2, 3 …)",
|
||||
"doc_sort_category": "Per categoria",
|
||||
"link_device_optional": "Collega a dispositivo esistente (opzionale)",
|
||||
"parent_object_optional": "Oggetto principale (opzionale)",
|
||||
"parent_none": "(Nessun principale)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Notifica solo per la vista",
|
||||
"settings_notify_scope_all": "Tutte le attività",
|
||||
"settings_notify_scope_hint": "Solo le attività che corrispondono ai filtri etichetta/utente della vista scelta inviano promemoria. Stato, ordinamento e raggruppamento della vista qui vengono ignorati.",
|
||||
"settings_notify_completed": "Notifiche di completamento",
|
||||
"settings_notify_completed_hint": "Una nota per la famiglia quando un'attività viene completata, con il motivo e chi l'ha fatto. \"Solo automatici\" annuncia solo i completamenti che nessuno ha fatto sul posto: ripristino del sensore, spunta nella lista della spesa, chiamata di servizio di un'automazione. Solo al servizio della famiglia; ore di silenzio e limite giornaliero si applicano.",
|
||||
"notify_completed_off": "Disattivato",
|
||||
"notify_completed_automatic": "Solo completamenti automatici",
|
||||
"notify_completed_all": "Tutti i completamenti",
|
||||
"settings_notify_rule": "La tua regola di notifica",
|
||||
"settings_notify_rule_hint": "Ogni notifica genera anche l'evento maintenance_supporter_notification (tipo, stato, oggetto, attività, numeri di riferimento, priorità, link, payload). Instradalo con un'automazione — ad es. verso Ticker, Telegram o Pushover.",
|
||||
"settings_notify_event_only": "Genera solo l'evento, non inviare nulla",
|
||||
"settings_notify_event_only_hint": "La tua automazione gestisce l'intera consegna. Intervalli di ripetizione, ore di silenzio e limite giornaliero valgono ancora per quando scatta l'evento.",
|
||||
"settings_notify_extra_data": "Dati di notifica aggiuntivi (template)",
|
||||
"settings_notify_extra_data_hint": "JSON o YAML, Jinja consentito; unito ai data della chiamata notify (le tue chiavi vincono). Variabili: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Prova con il pulsante Invia test.",
|
||||
"settings_notify_extra_data_hint": "JSON o YAML, Jinja consentito; unito ai data della chiamata notify (le tue chiavi vincono). Variabili: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Prova con il pulsante Invia test.",
|
||||
"card_saved_view": "Vista salvata",
|
||||
"card_saved_view_none": "Nessuna",
|
||||
"card_saved_view_help": "Applica i filtri stato, utente ed etichetta della vista in aggiunta ai filtri sopra. Ordinamento e raggruppamento della vista sono impostazioni di visualizzazione del pannello e non si applicano alla scheda.",
|
||||
"panel_card_tab": "Apri sulla scheda",
|
||||
"panel_card_tab_default": "Scheda memorizzata (come nel pannello)",
|
||||
"panel_card_view": "Apri con la vista salvata",
|
||||
"panel_card_height": "Altezza",
|
||||
"panel_card_height_help": "Vuoto = riempie lo schermo sotto la scheda (vista pannello). Altrimenti una lunghezza CSS come 600px o 80vh per viste con altre schede.",
|
||||
"panel_card_not_registered": "Il pannello Maintenance Supporter non è disponibile — l'integrazione è configurata?",
|
||||
"panel_card_load_failed": "Impossibile caricare il pannello Maintenance Supporter — ricarica la pagina (dopo un aggiornamento: svuota la cache del browser).",
|
||||
"doc_part_none": "Nessun documento collegato a questo ricambio.",
|
||||
"settings_templates_toggle_group": "Attiva o disattiva tutti i modelli di questo gruppo",
|
||||
"setups_button": "Configurazioni suggerite",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "A posto",
|
||||
"battery_fleet_status_due": "In scadenza",
|
||||
"battery_fleet_predicted_on": "Previsto intorno al {date}",
|
||||
"battery_fleet_predicted_typical": "Previsto intorno al {date} — {months} mesi tipici per {type} ({source})",
|
||||
"lifetime_source_default": "valore predefinito integrato",
|
||||
"lifetime_source_table": "tabella integrata",
|
||||
"lifetime_source_learned": "appreso da {n} sostituzioni",
|
||||
"lifetime_source_override": "la tua impostazione",
|
||||
"lifetime_source_learned_device": "appreso da {n} sostituzioni di questo dispositivo",
|
||||
"lifetime_source_learned_model": "appreso da {n} sostituzioni su dispositivi di questo modello",
|
||||
"battery_fleet_predicted_trend": "Previsto dalla tendenza di scarica di questa batteria: intorno al {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Ricaricabile: da ricaricare anziché sostituire — mai nella lista della spesa",
|
||||
"battery_fleet_sort_name": "Ordina per nome",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Ricambi usati",
|
||||
"print_inc_photos": "Foto",
|
||||
"print_inc_documents": "Documenti collegati",
|
||||
"print_inc_doc_desc": "Descrizioni dei documenti",
|
||||
"print_inc_checklist": "Lista di controllo",
|
||||
"print_inc_notes": "Note",
|
||||
"print_inc_costs": "Costo e durata",
|
||||
"print_inc_person": "Eseguito da",
|
||||
"print_inc_refs": "Numeri di riferimento",
|
||||
"print_inc_bare": "Completamenti senza dettagli",
|
||||
"print_inc_qr": "Codice QR per attività",
|
||||
"print_button": "Stampa",
|
||||
"report_scan_hint": "Scansiona per aprire l'attività",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "稼働時間",
|
||||
"runtime_hours": "目標稼働時間(時間)",
|
||||
"target_value": "目標値",
|
||||
"baseline": "基準値",
|
||||
"target_changes": "変化回数",
|
||||
"for_minutes": "継続(分)",
|
||||
"time_based": "時間ベース",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "作成日",
|
||||
"report_times_done": "実施回数",
|
||||
"report_total_cost": "合計費用",
|
||||
"report_every": "{n} {unit} ごと",
|
||||
"report_notes": "メモ",
|
||||
"report_col_type": "種類",
|
||||
"report_col_status": "状態",
|
||||
"report_col_schedule": "スケジュール",
|
||||
"duration": "所要時間",
|
||||
"minutes_short": "分",
|
||||
"both": "両方",
|
||||
"trigger_val": "トリガー値",
|
||||
"complete_title": "完了: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: 型が違います(期待値: {type})",
|
||||
"err_invalid_choice": "{field}: 許可されていない値です",
|
||||
"err_invalid_value": "{field}: 無効な値です",
|
||||
"ws_err_not_found": "見つかりません — その間に削除された可能性があります",
|
||||
"ws_err_invalid_input": "入力が無効です",
|
||||
"ws_err_invalid_date": "日付が無効です",
|
||||
"ws_err_invalid_format": "形式が無効です",
|
||||
"ws_err_invalid_url": "リンクが無効です",
|
||||
"ws_err_not_configured": "まだ設定されていません",
|
||||
"ws_err_not_loaded": "まだ読み込まれていません — しばらくしてからもう一度お試しください",
|
||||
"ws_err_limit_reached": "上限に達しました",
|
||||
"ws_err_too_many": "項目が多すぎます",
|
||||
"ws_err_too_large": "サイズが大きすぎます",
|
||||
"ws_err_not_archived": "アーカイブされていません",
|
||||
"ws_err_invalid_target": "対象が無効です",
|
||||
"ws_err_create_failed": "作成できませんでした",
|
||||
"ws_err_archived": "アーカイブ済み — 先に復元してください",
|
||||
"ws_err_already_archived": "すでにアーカイブ済みです",
|
||||
"ws_err_unavailable": "現在利用できません",
|
||||
"ws_err_unauthorized": "このユーザーには許可されていません",
|
||||
"ws_err_too_many_views": "保存済みビューが多すぎます",
|
||||
"ws_err_storage_unavailable": "ストレージが利用できません",
|
||||
"ws_err_replace_failed": "置き換えに失敗しました",
|
||||
"ws_err_not_paused": "一時停止されていません",
|
||||
"ws_err_not_available": "利用できるものがありません",
|
||||
"ws_err_no_url": "リンクが指定されていません",
|
||||
"ws_err_no_phases": "このタスクにはフェーズがありません",
|
||||
"ws_err_invalid_view": "ビューが無効です",
|
||||
"ws_err_invalid_user": "不明なユーザーです",
|
||||
"ws_err_invalid_range": "範囲が無効です",
|
||||
"ws_err_invalid_parent": "親オブジェクトが無効です",
|
||||
"ws_err_invalid_device": "不明なデバイスです",
|
||||
"ws_err_empty_csv": "CSV ファイルが空です",
|
||||
"ws_err_empty": "インポートするものがありません",
|
||||
"ws_err_duplicate_failed": "複製できませんでした",
|
||||
"ws_err_already_paused": "すでに一時停止中です",
|
||||
"ws_err_invalid_cursor": "フェーズの位置が無効です",
|
||||
"ws_err_invalid_entity_slug": "エンティティ名が無効です",
|
||||
"ws_err_invalid_trigger_config": "トリガー設定が無効です",
|
||||
"ws_err_no_defaults": "クイック完了の既定値が設定されていません",
|
||||
"ws_err_self_link_device": "オブジェクトを自分自身にリンクすることはできません",
|
||||
"ws_err_too_early": "早すぎます — このタスクは期日が近づいてからのみ完了できます",
|
||||
"feat_schedule_time": "時刻指定スケジュール",
|
||||
"feat_schedule_time_desc": "タスクが深夜0時ではなく指定した時刻に期限超過となります。",
|
||||
"schedule_time_toggle": "特定の時刻に期限",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "値が一致したらトリガー(=)",
|
||||
"trigger_not_equals": "値が異なればトリガー(≠)",
|
||||
"for_at_least_minutes": "最低継続時間(分)",
|
||||
"safety_interval_days": "安全間隔(日、任意)",
|
||||
"safety_interval": "安全間隔(任意)",
|
||||
"trigger_combinator": "トリガーと間隔の組み合わせ",
|
||||
"trigger_combinator_any": "トリガーまたは間隔(先に満たした方)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "自分のタスク",
|
||||
"tab_calendar": "カレンダー",
|
||||
"cal_no_events": "メンテナンスなし",
|
||||
"cal_window_7": "7日間",
|
||||
"cal_window_14": "14日間",
|
||||
"cal_window_30": "30日間",
|
||||
"cal_window_365": "1年間",
|
||||
"cal_every_n_days": "{n}日ごと",
|
||||
"cal_source_time": "時間ベース",
|
||||
"cal_source_time_adaptive": "時間ベース(適応)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "QRコードの生成に失敗しました。",
|
||||
"qr_error_no_url": "HAのURLが設定されていません。設定 → システム → ネットワークで外部または内部URLを設定してください。",
|
||||
"save_error": "保存に失敗しました。もう一度お試しください。",
|
||||
"subsave_warning": "保存しましたが、1 つの設定が拒否されました: {detail}",
|
||||
"qr_print": "印刷",
|
||||
"qr_download": "SVGをダウンロード",
|
||||
"qr_action": "スキャン時の動作",
|
||||
"qr_action_view": "メンテナンス情報を表示",
|
||||
"qr_action_complete": "メンテナンスを完了にする",
|
||||
"qr_url_mode": "リンク種別",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "ローカル(mDNS)",
|
||||
"qr_mode_server": "サーバーURL",
|
||||
"overview": "概要",
|
||||
"analysis": "分析",
|
||||
"recent_activities": "最近のアクティビティ",
|
||||
"search_notes": "メモを検索",
|
||||
"avg_cost": "平均費用",
|
||||
"no_advanced_features": "高度な機能が有効になっていません",
|
||||
"no_advanced_features_hint": "統合設定で「適応間隔」または「季節パターン」を有効にすると、ここに分析データが表示されます。",
|
||||
"analysis_not_enough_data": "分析に必要なデータがまだ不足しています。",
|
||||
"analysis_not_enough_data_hint": "ワイブル分析には完了済みメンテナンスが最低5件必要です。季節パターンは月あたり6件以上のデータポイントで表示されるようになります。",
|
||||
"analysis_manual_task_hint": "間隔のない手動タスクは分析データを生成しません。",
|
||||
"completions": "完了回数",
|
||||
"current": "現在",
|
||||
"shorter": "短く",
|
||||
"longer": "長く",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "過去の期間",
|
||||
"cal_forward_windows": "今後の期間",
|
||||
"history_edit_title": "履歴項目を編集",
|
||||
"history_delete_entry": "記録を削除",
|
||||
"history_delete_confirm": "この履歴記録を削除しますか?最終実施日は前回の完了に戻ります。写真はオブジェクトに残り、消費した部品は在庫に戻りません。",
|
||||
"history_edit_timestamp": "日時",
|
||||
"manufacturer": "メーカー",
|
||||
"model": "型番",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "既定の警告日数",
|
||||
"settings_consumable_threshold": "消耗品「残量少」しきい値(%)",
|
||||
"settings_battery_low_percent": "電池「残量少」しきい値(%)",
|
||||
"settings_battery_lifetimes": "電池の標準寿命",
|
||||
"settings_battery_lifetimes_hint": "パーセント表示のない電池にのみ使います:種類と交換日だけの Battery Notes メモや「残量低下」しか報告しないセンサーです。期日は最終交換日+この寿命。残量を報告する電池は実測の放電から予測します。同じ種類の交換を3回記録すると、中央値の間隔が内蔵値に代わります。自分で設定した値が常に優先されます。",
|
||||
"settings_battery_lifetime_months": "か月",
|
||||
"settings_battery_lifetime_reset": "既定値に戻す",
|
||||
"settings_battery_lifetime_in_fleet": "使用中",
|
||||
"settings_battery_lifetime_learned_models": "型番ごとの学習値:{list}",
|
||||
"settings_thresholds_hint": "新しい「推奨セットアップ」(残量パーセント)と、独自の Battery Notes しきい値を持たないバッテリー一覧の電池に適用される既定値です。既存のタスクは値を保持します。",
|
||||
"settings_value_out_of_range": "値は {min} から {max} の間で指定してください",
|
||||
"bn_summary": "{name}:{n} 個の電池に {pct} %",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "独自のしきい値を持つデバイス {n} 台:",
|
||||
"bn_more": "+ 他 {n} 件",
|
||||
"settings_row_actions": "タスク行の操作",
|
||||
"settings_ref_numbers_in_lists": "一覧に参照番号を表示",
|
||||
"settings_ref_numbers_in_lists_hint": "「今日」の一覧、タスク表、オブジェクトカード、オブジェクト表で、オブジェクト名とタスク名の前に #8 / #8.3 のチップを表示します。",
|
||||
"row_actions_buttons_compact": "ボタン(スマートフォンではアイコンのみ)",
|
||||
"row_actions_buttons": "テキスト付きボタン",
|
||||
"row_actions_icons": "アイコン(従来)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "スヌーズ時間(時間)",
|
||||
"settings_budget": "予算",
|
||||
"settings_currency": "通貨",
|
||||
"settings_currency_decimals": "金額の小数点以下の桁数",
|
||||
"settings_currency_decimals_hint": "各金額に表示する小数点以下の桁数:KPI、予算、リストやレポートの費用、予算アラート。0 = 整数。",
|
||||
"settings_budget_monthly": "月間予算",
|
||||
"settings_budget_yearly": "年間予算",
|
||||
"settings_budget_alerts": "予算アラート",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "YAMLをエクスポート",
|
||||
"settings_export_csv": "CSVをエクスポート",
|
||||
"settings_export_settings": "設定をエクスポート(JSON)",
|
||||
"settings_import_csv": "CSVをインポート",
|
||||
"settings_import_placeholder": "JSONまたはCSVの内容をここに貼り付け…",
|
||||
"settings_import_btn": "インポート",
|
||||
"settings_import_success": "{count}件の対象を正常にインポートしました。",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "タスクごとの完了時HAアクション+事前設定値付きのクイック完了QR。",
|
||||
"on_complete_action_title": "完了時: HAアクションを実行(任意)",
|
||||
"on_complete_action_desc": "タスク完了時にHAサービスを呼び出します — 例: デバイスのカウンターをリセット。",
|
||||
"on_complete_action_service": "サービス",
|
||||
"on_complete_action_target": "対象エンティティ",
|
||||
"on_complete_action_target_hint": "注意: エンティティのドメインはサービスと一致する必要があります — 例: 'button.press'はbutton.*のみ、'counter.increment'はcounter.*のみ、'input_button.press'はinput_button.*のみで動作します。不一致の場合、アクションは何も表示せずに失敗します(HAのログに「Referenced entities ... missing or not currently available」と記録されます)。",
|
||||
"on_complete_action_data": "データ(JSON、任意)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "写真を選択",
|
||||
"choose_photo": "写真を選択",
|
||||
"photos_android_hint": "Android アプリは1回の選択につき写真1枚を渡します。選択するたびに追加されます。",
|
||||
"add_photos": "写真を追加",
|
||||
"photos_limit": "1回の完了につき最大{max}枚",
|
||||
"history_edit_photos_hint": "ここで外した写真は対象のドキュメントに残ります。",
|
||||
"uploading": "アップロード中…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "ダウンロード",
|
||||
"doc_close": "閉じる",
|
||||
"doc_camera": "写真を撮る",
|
||||
"camera_capture_shoot": "撮影",
|
||||
"camera_switch_lens": "カメラを切り替え",
|
||||
"doc_drop_hint": "ここにファイルをドロップ",
|
||||
"doc_task_none": "このタスクに紐付いたドキュメントはありません。",
|
||||
"doc_link_existing": "ドキュメントを紐付け…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "トリガーが自然に解消されたとき(塩の補充、フィルター交換など)に完了を記録し、最終実施日を更新します。",
|
||||
"doc_search": "ドキュメントを検索…",
|
||||
"doc_search_none": "一致するドキュメントはありません",
|
||||
"doc_description": "説明(任意)",
|
||||
"doc_sort": "文書を並べ替え",
|
||||
"doc_sort_newest": "新しい順",
|
||||
"doc_sort_oldest": "古い順",
|
||||
"doc_sort_title": "タイトル順(1、2、3…)",
|
||||
"doc_sort_category": "カテゴリー順",
|
||||
"link_device_optional": "既存のデバイスにリンク(任意)",
|
||||
"parent_object_optional": "親オブジェクト(任意)",
|
||||
"parent_none": "(親なし)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "このビューのみ通知",
|
||||
"settings_notify_scope_all": "すべてのタスク",
|
||||
"settings_notify_scope_hint": "選択した保存済みビューのラベル/ユーザーフィルターに一致するタスクのみがリマインダーを送信します。ビューのステータス・並び順・グループ化はここでは無視されます。",
|
||||
"settings_notify_completed": "完了通知",
|
||||
"settings_notify_completed_hint": "タスクが完了したときに、理由と実行者を添えて家族に知らせます。「自動のみ」は、その場で誰も操作していない完了だけを通知します:センサーの回復、買い物リストのチェック、オートメーションのサービス呼び出し。家庭用サービスにのみ送信され、静音時間と 1 日の上限が適用されます。",
|
||||
"notify_completed_off": "オフ",
|
||||
"notify_completed_automatic": "自動完了のみ",
|
||||
"notify_completed_all": "すべての完了",
|
||||
"settings_notify_rule": "独自の通知ルール",
|
||||
"settings_notify_rule_hint": "各通知はイベント maintenance_supporter_notification(種類、状態、対象、タスク、参照番号、優先度、ディープリンク、ペイロード)も発火します。オートメーションで Ticker、Telegram、Pushover などへ転送してください。",
|
||||
"settings_notify_event_only": "イベントのみ発火し、自身では送信しない",
|
||||
"settings_notify_event_only_hint": "配信はすべてオートメーション側で行います。繰り返し間隔、静音時間、1日の上限は引き続きイベント発火の条件になります。",
|
||||
"settings_notify_extra_data": "追加の通知データ(テンプレート)",
|
||||
"settings_notify_extra_data_hint": "JSON または YAML、Jinja 可。notify 呼び出しの data にマージされます(あなたのキーが優先)。変数: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message。「テスト送信」ボタンで確認できます。",
|
||||
"settings_notify_extra_data_hint": "JSON または YAML、Jinja 可。notify 呼び出しの data にマージされます(あなたのキーが優先)。変数: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message。「テスト送信」ボタンで確認できます。",
|
||||
"card_saved_view": "保存済みビュー",
|
||||
"card_saved_view_none": "なし",
|
||||
"card_saved_view_help": "上記のフィルターに加えて、ビューのステータス・ユーザー・ラベルのフィルターを適用します。ビューの並び順とグループ化はパネルの表示設定であり、カードには適用されません。",
|
||||
"panel_card_tab": "開くタブ",
|
||||
"panel_card_tab_default": "記憶したタブ(パネルと同じ)",
|
||||
"panel_card_view": "保存済みビューで開く",
|
||||
"panel_card_height": "高さ",
|
||||
"panel_card_height_help": "空欄 = カードの下の画面を埋めます(パネルビュー)。それ以外は、他のカードがあるビュー向けに 600px や 80vh などの CSS の長さを指定します。",
|
||||
"panel_card_not_registered": "Maintenance Supporter パネルを利用できません。統合は設定済みですか?",
|
||||
"panel_card_load_failed": "Maintenance Supporter パネルを読み込めませんでした。ページを再読み込みしてください(更新後はブラウザーのキャッシュを消去)。",
|
||||
"doc_part_none": "この部品にリンクされた文書はありません。",
|
||||
"settings_templates_toggle_group": "このグループのテンプレートをすべて有効/無効にする",
|
||||
"setups_button": "おすすめセットアップ",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "良好",
|
||||
"battery_fleet_status_due": "交換時期",
|
||||
"battery_fleet_predicted_on": "{date} 頃の見込み",
|
||||
"battery_fleet_predicted_typical": "{date} 頃の見込み — {type} の標準 {months} か月({source})",
|
||||
"lifetime_source_default": "内蔵の既定値",
|
||||
"lifetime_source_table": "内蔵テーブル",
|
||||
"lifetime_source_learned": "{n} 回の交換から学習",
|
||||
"lifetime_source_override": "あなたの設定",
|
||||
"lifetime_source_learned_device": "この機器の {n} 回の交換から学習",
|
||||
"lifetime_source_learned_model": "同じ型番の機器の {n} 回の交換から学習",
|
||||
"battery_fleet_predicted_trend": "この電池の放電傾向から予測: {date} 頃 ({confidence})",
|
||||
"battery_fleet_rechargeable": "充電式:交換ではなく充電——買い物リストには載りません",
|
||||
"battery_fleet_sort_name": "名前順に並べ替え",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "使用部品",
|
||||
"print_inc_photos": "写真",
|
||||
"print_inc_documents": "関連文書",
|
||||
"print_inc_doc_desc": "ドキュメントの説明",
|
||||
"print_inc_checklist": "チェックリスト",
|
||||
"print_inc_notes": "メモ",
|
||||
"print_inc_costs": "費用と所要時間",
|
||||
"print_inc_person": "実施者",
|
||||
"print_inc_refs": "参照番号",
|
||||
"print_inc_bare": "詳細のない完了記録",
|
||||
"print_inc_qr": "タスクごとのQRコード",
|
||||
"print_button": "印刷",
|
||||
"report_scan_hint": "スキャンしてタスクを開く",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "가동 시간",
|
||||
"runtime_hours": "목표 가동 시간 (시간)",
|
||||
"target_value": "목표값",
|
||||
"baseline": "기준값",
|
||||
"target_changes": "목표 변경 횟수",
|
||||
"for_minutes": "지속 시간 (분)",
|
||||
"time_based": "시간 기반",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "생성일",
|
||||
"report_times_done": "수행 횟수",
|
||||
"report_total_cost": "총 비용",
|
||||
"report_every": "{n} {unit}마다",
|
||||
"report_notes": "메모",
|
||||
"report_col_type": "유형",
|
||||
"report_col_status": "상태",
|
||||
"report_col_schedule": "일정",
|
||||
"duration": "소요 시간",
|
||||
"minutes_short": "분",
|
||||
"both": "둘 다",
|
||||
"trigger_val": "트리거 값",
|
||||
"complete_title": "완료: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: 잘못된 형식입니다 (예상: {type})",
|
||||
"err_invalid_choice": "{field}: 허용되지 않는 값입니다",
|
||||
"err_invalid_value": "{field}: 유효하지 않은 값입니다",
|
||||
"ws_err_not_found": "찾을 수 없음 — 그 사이에 삭제되었을 수 있습니다",
|
||||
"ws_err_invalid_input": "잘못된 입력",
|
||||
"ws_err_invalid_date": "잘못된 날짜",
|
||||
"ws_err_invalid_format": "잘못된 형식",
|
||||
"ws_err_invalid_url": "잘못된 링크",
|
||||
"ws_err_not_configured": "아직 설정되지 않음",
|
||||
"ws_err_not_loaded": "아직 로드되지 않음 — 잠시 후 다시 시도하세요",
|
||||
"ws_err_limit_reached": "한도에 도달함",
|
||||
"ws_err_too_many": "항목이 너무 많음",
|
||||
"ws_err_too_large": "너무 큼",
|
||||
"ws_err_not_archived": "보관되지 않음",
|
||||
"ws_err_invalid_target": "잘못된 대상",
|
||||
"ws_err_create_failed": "생성할 수 없음",
|
||||
"ws_err_archived": "보관됨 — 먼저 복원하세요",
|
||||
"ws_err_already_archived": "이미 보관됨",
|
||||
"ws_err_unavailable": "현재 사용할 수 없음",
|
||||
"ws_err_unauthorized": "이 사용자에게는 허용되지 않음",
|
||||
"ws_err_too_many_views": "저장된 보기가 너무 많음",
|
||||
"ws_err_storage_unavailable": "저장소를 사용할 수 없음",
|
||||
"ws_err_replace_failed": "교체 실패",
|
||||
"ws_err_not_paused": "일시 중지되지 않음",
|
||||
"ws_err_not_available": "사용 가능한 항목 없음",
|
||||
"ws_err_no_url": "링크가 지정되지 않음",
|
||||
"ws_err_no_phases": "이 작업에는 단계가 없음",
|
||||
"ws_err_invalid_view": "잘못된 보기",
|
||||
"ws_err_invalid_user": "알 수 없는 사용자",
|
||||
"ws_err_invalid_range": "잘못된 범위",
|
||||
"ws_err_invalid_parent": "잘못된 상위 객체",
|
||||
"ws_err_invalid_device": "알 수 없는 장치",
|
||||
"ws_err_empty_csv": "CSV 파일이 비어 있음",
|
||||
"ws_err_empty": "가져올 항목 없음",
|
||||
"ws_err_duplicate_failed": "복제할 수 없음",
|
||||
"ws_err_already_paused": "이미 일시 중지됨",
|
||||
"ws_err_invalid_cursor": "잘못된 단계 위치",
|
||||
"ws_err_invalid_entity_slug": "잘못된 엔터티 이름",
|
||||
"ws_err_invalid_trigger_config": "잘못된 트리거 구성",
|
||||
"ws_err_no_defaults": "빠른 완료 기본값이 설정되지 않음",
|
||||
"ws_err_self_link_device": "객체는 자기 자신에게 연결할 수 없음",
|
||||
"ws_err_too_early": "너무 이름 — 이 작업은 기한에 가까워져야 완료할 수 있습니다",
|
||||
"feat_schedule_time": "시각 지정 일정",
|
||||
"feat_schedule_time_desc": "작업이 자정이 아닌 지정한 시각에 기한 초과로 전환됩니다.",
|
||||
"schedule_time_toggle": "특정 시각에 기한",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "값이 같으면 트리거 (=)",
|
||||
"trigger_not_equals": "값이 다르면 트리거 (≠)",
|
||||
"for_at_least_minutes": "최소 지속 시간 (분)",
|
||||
"safety_interval_days": "안전 주기 (일, 선택)",
|
||||
"safety_interval": "안전 주기 (선택)",
|
||||
"trigger_combinator": "트리거와 간격 결합",
|
||||
"trigger_combinator_any": "트리거 또는 간격 (먼저 충족)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "내 작업",
|
||||
"tab_calendar": "캘린더",
|
||||
"cal_no_events": "유지보수 없음",
|
||||
"cal_window_7": "7일",
|
||||
"cal_window_14": "14일",
|
||||
"cal_window_30": "30일",
|
||||
"cal_window_365": "1년",
|
||||
"cal_every_n_days": "{n}일마다",
|
||||
"cal_source_time": "시간 기반",
|
||||
"cal_source_time_adaptive": "시간 기반 (적응형)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "QR 코드 생성에 실패했습니다.",
|
||||
"qr_error_no_url": "설정된 HA URL이 없습니다. 설정 → 시스템 → 네트워크에서 외부 또는 내부 URL을 설정해 주세요.",
|
||||
"save_error": "저장에 실패했습니다. 다시 시도해 주세요.",
|
||||
"subsave_warning": "저장되었지만 설정 하나가 거부되었습니다: {detail}",
|
||||
"qr_print": "인쇄",
|
||||
"qr_download": "SVG 다운로드",
|
||||
"qr_action": "스캔 시 동작",
|
||||
"qr_action_view": "유지보수 정보 보기",
|
||||
"qr_action_complete": "유지보수 완료로 표시",
|
||||
"qr_url_mode": "링크 유형",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "로컬 (mDNS)",
|
||||
"qr_mode_server": "서버 URL",
|
||||
"overview": "개요",
|
||||
"analysis": "분석",
|
||||
"recent_activities": "최근 활동",
|
||||
"search_notes": "메모 검색",
|
||||
"avg_cost": "평균 비용",
|
||||
"no_advanced_features": "활성화된 고급 기능 없음",
|
||||
"no_advanced_features_hint": "통합구성요소 설정에서 “적응형 일정” 또는 “계절 패턴”을 활성화하면 여기에서 분석 데이터를 볼 수 있습니다.",
|
||||
"analysis_not_enough_data": "아직 분석할 데이터가 충분하지 않습니다.",
|
||||
"analysis_not_enough_data_hint": "Weibull 분석에는 최소 5회의 완료 기록이 필요하며, 계절 패턴은 월별 6개 이상의 데이터 포인트가 쌓이면 표시됩니다.",
|
||||
"analysis_manual_task_hint": "주기가 없는 수동 작업은 분석 데이터를 생성하지 않습니다.",
|
||||
"completions": "회 완료",
|
||||
"current": "현재",
|
||||
"shorter": "더 짧게",
|
||||
"longer": "더 길게",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "이전 기간",
|
||||
"cal_forward_windows": "이후 기간",
|
||||
"history_edit_title": "기록 항목 편집",
|
||||
"history_delete_entry": "기록 삭제",
|
||||
"history_delete_confirm": "이 기록을 삭제할까요? 마지막 수행일은 이전 완료로 되돌아가며, 사진은 개체에 남고 사용한 부품은 재고로 복구되지 않습니다.",
|
||||
"history_edit_timestamp": "타임스탬프",
|
||||
"manufacturer": "제조사",
|
||||
"model": "모델",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "기본 경고 일수",
|
||||
"settings_consumable_threshold": "소모품 „부족“ 임계값 (%)",
|
||||
"settings_battery_low_percent": "배터리 „부족“ 임계값 (%)",
|
||||
"settings_battery_lifetimes": "배터리 일반 수명",
|
||||
"settings_battery_lifetimes_hint": "백분율이 없는 배터리에만 사용됩니다: 종류와 교체일만 있는 Battery Notes 메모나 \"낮음\"만 알리는 센서입니다. 만기 = 마지막 교체 + 이 수명. 잔량을 보고하는 배터리는 실측 방전으로 예측합니다. 같은 종류의 교체를 3회 기록하면 중앙값 간격이 내장값을 대체합니다. 직접 설정한 값이 항상 우선합니다.",
|
||||
"settings_battery_lifetime_months": "개월",
|
||||
"settings_battery_lifetime_reset": "기본값 사용",
|
||||
"settings_battery_lifetime_in_fleet": "내 장치에 사용 중",
|
||||
"settings_battery_lifetime_learned_models": "모델별 학습값: {list}",
|
||||
"settings_thresholds_hint": "새 추천 설정(남은 비율)과 자체 Battery Notes 임계값이 없는 배터리 목록 배터리의 기본값입니다. 기존 작업은 값을 유지합니다.",
|
||||
"settings_value_out_of_range": "값은 {min}에서 {max} 사이여야 합니다",
|
||||
"bn_summary": "{name}: 배터리 {n}개에 {pct} %",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "자체 임계값이 있는 기기 {n}개:",
|
||||
"bn_more": "+ {n}개 더",
|
||||
"settings_row_actions": "작업 행 동작",
|
||||
"settings_ref_numbers_in_lists": "목록에 참조 번호 표시",
|
||||
"settings_ref_numbers_in_lists_hint": "오늘 목록, 작업 표, 개체 카드, 개체 표에서 개체 및 작업 이름 앞에 #8 / #8.3 칩을 표시합니다.",
|
||||
"row_actions_buttons_compact": "버튼 (휴대폰에서는 아이콘만)",
|
||||
"row_actions_buttons": "텍스트가 있는 버튼",
|
||||
"row_actions_icons": "아이콘 (기본)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "다시 알림 대기 시간 (시간)",
|
||||
"settings_budget": "예산",
|
||||
"settings_currency": "통화",
|
||||
"settings_currency_decimals": "금액 소수 자릿수",
|
||||
"settings_currency_decimals_hint": "모든 금액에 표시할 소수 자릿수: KPI, 예산, 목록과 보고서의 비용, 예산 알림. 0 = 정수.",
|
||||
"settings_budget_monthly": "월 예산",
|
||||
"settings_budget_yearly": "연 예산",
|
||||
"settings_budget_alerts": "예산 경고",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "YAML 내보내기",
|
||||
"settings_export_csv": "CSV 내보내기",
|
||||
"settings_export_settings": "설정 내보내기 (JSON)",
|
||||
"settings_import_csv": "CSV 가져오기",
|
||||
"settings_import_placeholder": "JSON 또는 CSV 내용을 여기에 붙여넣으세요…",
|
||||
"settings_import_btn": "가져오기",
|
||||
"settings_import_success": "객체 {count}개를 성공적으로 가져왔습니다.",
|
||||
@@ -644,7 +681,6 @@
|
||||
"feat_completion_actions_desc": "완료 시 작업별 HA 동작 실행 + 사전 설정값이 있는 빠른 완료 QR.",
|
||||
"on_complete_action_title": "완료 시: HA 동작 실행 (선택)",
|
||||
"on_complete_action_desc": "작업이 완료되면 HA 서비스를 호출합니다 — 예: 기기의 카운터 초기화.",
|
||||
"on_complete_action_service": "서비스",
|
||||
"on_complete_action_target": "대상 엔티티",
|
||||
"on_complete_action_target_hint": "참고: 엔티티 도메인이 서비스와 일치해야 합니다 — 예: 'button.press'는 button.*에서만, 'counter.increment'는 counter.*에서만, 'input_button.press'는 input_button.*에서만 동작합니다. 불일치 시 동작이 조용히 실패합니다 (HA 로그에 'Referenced entities ... missing or not currently available' 기록).",
|
||||
"on_complete_action_data": "데이터 (JSON, 선택)",
|
||||
@@ -710,7 +746,6 @@
|
||||
"choose_photos": "사진 선택",
|
||||
"choose_photo": "사진 선택",
|
||||
"photos_android_hint": "Android 앱은 선택할 때마다 사진 한 장씩 전달합니다. 선택할 때마다 추가됩니다.",
|
||||
"add_photos": "사진 추가",
|
||||
"photos_limit": "완료당 최대 {max}장",
|
||||
"history_edit_photos_hint": "여기서 제거한 사진은 대상의 문서에 그대로 남습니다.",
|
||||
"uploading": "업로드 중…",
|
||||
@@ -731,6 +766,8 @@
|
||||
"doc_download": "다운로드",
|
||||
"doc_close": "닫기",
|
||||
"doc_camera": "사진 촬영",
|
||||
"camera_capture_shoot": "촬영",
|
||||
"camera_switch_lens": "카메라 전환",
|
||||
"doc_drop_hint": "파일을 여기에 놓으세요",
|
||||
"doc_task_none": "이 작업에 연결된 문서가 없습니다.",
|
||||
"doc_link_existing": "문서 연결…",
|
||||
@@ -747,6 +784,12 @@
|
||||
"auto_complete_on_recovery_help": "트리거가 스스로 해제되면 완료를 기록합니다 (마지막 수행일 갱신) — 예: 소금 보충, 필터 교체.",
|
||||
"doc_search": "문서 검색…",
|
||||
"doc_search_none": "일치하는 문서 없음",
|
||||
"doc_description": "설명(선택)",
|
||||
"doc_sort": "문서 정렬",
|
||||
"doc_sort_newest": "최신순",
|
||||
"doc_sort_oldest": "오래된순",
|
||||
"doc_sort_title": "제목순(1, 2, 3 …)",
|
||||
"doc_sort_category": "카테고리순",
|
||||
"link_device_optional": "기존 기기와 연결 (선택)",
|
||||
"parent_object_optional": "상위 객체 (선택)",
|
||||
"parent_none": "(상위 없음)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "특정 보기만 알림",
|
||||
"settings_notify_scope_all": "모든 작업",
|
||||
"settings_notify_scope_hint": "선택한 저장된 보기의 라벨/사용자 필터와 일치하는 작업만 알림을 보냅니다. 보기의 상태·정렬·그룹화는 여기서 무시됩니다.",
|
||||
"settings_notify_completed": "완료 알림",
|
||||
"settings_notify_completed_hint": "작업이 완료되면 사유와 실행자를 함께 가족에게 알립니다. \"자동만\"은 현장에서 아무도 하지 않은 완료만 알립니다: 센서 복구, 쇼핑 목록 체크, 자동화의 서비스 호출. 가정용 서비스로만 전송되며 방해 금지 시간과 일일 한도가 적용됩니다.",
|
||||
"notify_completed_off": "끄기",
|
||||
"notify_completed_automatic": "자동 완료만",
|
||||
"notify_completed_all": "모든 완료",
|
||||
"settings_notify_rule": "나만의 알림 규칙",
|
||||
"settings_notify_rule_hint": "모든 알림은 maintenance_supporter_notification 이벤트도 발생시킵니다(종류, 상태, 대상, 작업, 참조 번호, 우선순위, 딥 링크, 페이로드). 자동화로 라우팅하세요 — 예: Ticker, Telegram, Pushover.",
|
||||
"settings_notify_event_only": "이벤트만 발생시키고 직접 보내지 않음",
|
||||
"settings_notify_event_only_hint": "전달은 전적으로 자동화가 담당합니다. 반복 간격, 방해 금지 시간, 일일 한도는 여전히 이벤트 발생 시점에 적용됩니다.",
|
||||
"settings_notify_extra_data": "추가 알림 데이터(템플릿)",
|
||||
"settings_notify_extra_data_hint": "JSON 또는 YAML, Jinja 사용 가능. notify 호출의 data에 병합됩니다(사용자 키 우선). 변수: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. 테스트 보내기 버튼으로 확인하세요.",
|
||||
"settings_notify_extra_data_hint": "JSON 또는 YAML, Jinja 사용 가능. notify 호출의 data에 병합됩니다(사용자 키 우선). 변수: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. 테스트 보내기 버튼으로 확인하세요.",
|
||||
"card_saved_view": "저장된 보기",
|
||||
"card_saved_view_none": "없음",
|
||||
"card_saved_view_help": "위 필터에 더해 보기의 상태·사용자·라벨 필터를 적용합니다. 보기의 정렬과 그룹화는 패널 표시 설정이며 카드에는 적용되지 않습니다.",
|
||||
"panel_card_tab": "열 때 탭",
|
||||
"panel_card_tab_default": "기억된 탭(패널과 동일)",
|
||||
"panel_card_view": "저장된 보기로 열기",
|
||||
"panel_card_height": "높이",
|
||||
"panel_card_height_help": "비워 두면 카드 아래 화면을 채웁니다(패널 보기). 그 외에는 다른 카드가 있는 보기를 위해 600px 또는 80vh 같은 CSS 길이를 지정합니다.",
|
||||
"panel_card_not_registered": "Maintenance Supporter 패널을 사용할 수 없습니다. 통합이 설정되어 있나요?",
|
||||
"panel_card_load_failed": "Maintenance Supporter 패널을 불러오지 못했습니다. 페이지를 새로 고치세요(업데이트 후에는 브라우저 캐시를 지우세요).",
|
||||
"doc_part_none": "이 부품에 연결된 문서가 없습니다.",
|
||||
"settings_templates_toggle_group": "이 그룹의 모든 템플릿을 켜거나 끄기",
|
||||
"setups_button": "추천 설정",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "정상",
|
||||
"battery_fleet_status_due": "교체 시기",
|
||||
"battery_fleet_predicted_on": "{date}쯤 예상",
|
||||
"battery_fleet_predicted_typical": "{date}경 예상 — {type} 기준 보통 {months}개월({source})",
|
||||
"lifetime_source_default": "기본 내장값",
|
||||
"lifetime_source_table": "기본 내장 표",
|
||||
"lifetime_source_learned": "{n}회 교체에서 학습",
|
||||
"lifetime_source_override": "사용자 설정",
|
||||
"lifetime_source_learned_device": "이 기기의 {n}회 교체에서 학습",
|
||||
"lifetime_source_learned_model": "같은 모델 기기의 {n}회 교체에서 학습",
|
||||
"battery_fleet_predicted_trend": "이 배터리의 방전 추세로 예측: 약 {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "충전식: 교체 대신 충전 — 쇼핑 목록에 오르지 않습니다",
|
||||
"battery_fleet_sort_name": "이름순 정렬",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "사용 부품",
|
||||
"print_inc_photos": "사진",
|
||||
"print_inc_documents": "연결된 문서",
|
||||
"print_inc_doc_desc": "문서 설명",
|
||||
"print_inc_checklist": "체크리스트",
|
||||
"print_inc_notes": "메모",
|
||||
"print_inc_costs": "비용 및 소요 시간",
|
||||
"print_inc_person": "완료자",
|
||||
"print_inc_refs": "참조 번호",
|
||||
"print_inc_bare": "세부 정보 없는 완료 기록",
|
||||
"print_inc_qr": "작업별 QR 코드",
|
||||
"print_button": "인쇄",
|
||||
"report_scan_hint": "스캔하여 작업 열기",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Driftstid",
|
||||
"runtime_hours": "Måldriftstid (timer)",
|
||||
"target_value": "Målverdi",
|
||||
"baseline": "Utgangspunkt",
|
||||
"target_changes": "Antall endringer",
|
||||
"for_minutes": "I (minutter)",
|
||||
"time_based": "Tidsbasert",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Generert",
|
||||
"report_times_done": "Utført",
|
||||
"report_total_cost": "Totalkostnad",
|
||||
"report_every": "hver {n}. {unit}",
|
||||
"report_notes": "Notater",
|
||||
"report_col_type": "Type",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Tidsplan",
|
||||
"duration": "Varighet",
|
||||
"minutes_short": "min",
|
||||
"both": "Begge",
|
||||
"trigger_val": "Utløserverdi",
|
||||
"complete_title": "Fullfør: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: feil type (forventet: {type})",
|
||||
"err_invalid_choice": "{field}: ikke en tillatt verdi",
|
||||
"err_invalid_value": "{field}: ugyldig verdi",
|
||||
"ws_err_not_found": "Ikke funnet — det kan ha blitt slettet i mellomtiden",
|
||||
"ws_err_invalid_input": "Ugyldig inndata",
|
||||
"ws_err_invalid_date": "Ugyldig dato",
|
||||
"ws_err_invalid_format": "Ugyldig format",
|
||||
"ws_err_invalid_url": "Ugyldig lenke",
|
||||
"ws_err_not_configured": "Ikke satt opp ennå",
|
||||
"ws_err_not_loaded": "Ikke lastet ennå — prøv igjen om et øyeblikk",
|
||||
"ws_err_limit_reached": "Grensen er nådd",
|
||||
"ws_err_too_many": "For mange oppføringer",
|
||||
"ws_err_too_large": "For stort",
|
||||
"ws_err_not_archived": "Ikke arkivert",
|
||||
"ws_err_invalid_target": "Ugyldig mål",
|
||||
"ws_err_create_failed": "Kunne ikke opprettes",
|
||||
"ws_err_archived": "Arkivert — gjenopprett først",
|
||||
"ws_err_already_archived": "Allerede arkivert",
|
||||
"ws_err_unavailable": "Ikke tilgjengelig for øyeblikket",
|
||||
"ws_err_unauthorized": "Ikke tillatt for din bruker",
|
||||
"ws_err_too_many_views": "For mange lagrede visninger",
|
||||
"ws_err_storage_unavailable": "Lagringen er ikke tilgjengelig",
|
||||
"ws_err_replace_failed": "Utskifting mislyktes",
|
||||
"ws_err_not_paused": "Ikke satt på pause",
|
||||
"ws_err_not_available": "Ingenting tilgjengelig",
|
||||
"ws_err_no_url": "Ingen lenke oppgitt",
|
||||
"ws_err_no_phases": "Oppgaven har ingen faser",
|
||||
"ws_err_invalid_view": "Ugyldig visning",
|
||||
"ws_err_invalid_user": "Ukjent bruker",
|
||||
"ws_err_invalid_range": "Ugyldig område",
|
||||
"ws_err_invalid_parent": "Ugyldig overordnet objekt",
|
||||
"ws_err_invalid_device": "Ukjent enhet",
|
||||
"ws_err_empty_csv": "CSV-filen er tom",
|
||||
"ws_err_empty": "Ingenting å importere",
|
||||
"ws_err_duplicate_failed": "Kunne ikke dupliseres",
|
||||
"ws_err_already_paused": "Allerede satt på pause",
|
||||
"ws_err_invalid_cursor": "Ugyldig faseposisjon",
|
||||
"ws_err_invalid_entity_slug": "Ugyldig entitetsnavn",
|
||||
"ws_err_invalid_trigger_config": "Ugyldig utløserkonfigurasjon",
|
||||
"ws_err_no_defaults": "Ingen standardverdier for hurtigfullføring",
|
||||
"ws_err_self_link_device": "Et objekt kan ikke kobles til seg selv",
|
||||
"ws_err_too_early": "For tidlig — oppgaven kan først fullføres nærmere forfallsdatoen",
|
||||
"feat_schedule_time": "Planlegging med klokkeslett",
|
||||
"feat_schedule_time_desc": "Oppgaver forfaller på et bestemt klokkeslett i stedet for ved midnatt.",
|
||||
"schedule_time_toggle": "Forfaller på et bestemt klokkeslett",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Utløs ved lik (=)",
|
||||
"trigger_not_equals": "Utløs ved forskjellig fra (≠)",
|
||||
"for_at_least_minutes": "I minst (minutter)",
|
||||
"safety_interval_days": "Sikkerhetsintervall (dager, valgfritt)",
|
||||
"safety_interval": "Sikkerhetsintervall (valgfritt)",
|
||||
"trigger_combinator": "Kombiner utløser og intervall",
|
||||
"trigger_combinator_any": "Utløser eller intervall (først oppfylt)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Mine oppgaver",
|
||||
"tab_calendar": "Kalender",
|
||||
"cal_no_events": "Ingen vedlikehold",
|
||||
"cal_window_7": "7 dager",
|
||||
"cal_window_14": "14 dager",
|
||||
"cal_window_30": "30 dager",
|
||||
"cal_window_365": "1 år",
|
||||
"cal_every_n_days": "hver {n}. dag",
|
||||
"cal_source_time": "Tidsbasert",
|
||||
"cal_source_time_adaptive": "Tidsbasert (adaptiv)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "Kunne ikke generere QR-kode.",
|
||||
"qr_error_no_url": "Ingen HA-URL konfigurert. Angi en ekstern eller intern URL under Innstillinger → System → Nettverk.",
|
||||
"save_error": "Kunne ikke lagre. Prøv igjen.",
|
||||
"subsave_warning": "Lagret, men én innstilling ble avvist: {detail}",
|
||||
"qr_print": "Skriv ut",
|
||||
"qr_download": "Last ned SVG",
|
||||
"qr_action": "Handling ved skanning",
|
||||
"qr_action_view": "Vis vedlikeholdsinfo",
|
||||
"qr_action_complete": "Merk vedlikehold som fullført",
|
||||
"qr_url_mode": "Lenketype",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Lokal (mDNS)",
|
||||
"qr_mode_server": "Server-URL",
|
||||
"overview": "Oversikt",
|
||||
"analysis": "Analyse",
|
||||
"recent_activities": "Nylige aktiviteter",
|
||||
"search_notes": "Søk i notater",
|
||||
"avg_cost": "Gj.snittlig kostnad",
|
||||
"no_advanced_features": "Ingen avanserte funksjoner aktivert",
|
||||
"no_advanced_features_hint": "Aktiver «Adaptive intervaller» eller «Sesongmønstre» i integrasjonsinnstillingene for å se analysedata her.",
|
||||
"analysis_not_enough_data": "Ikke nok data for analyse ennå.",
|
||||
"analysis_not_enough_data_hint": "Weibull-analyse krever minst 5 fullførte vedlikehold; sesongmønstre blir synlige etter 6+ datapunkter per måned.",
|
||||
"analysis_manual_task_hint": "Manuelle oppgaver uten intervall genererer ikke analysedata.",
|
||||
"completions": "fullføringer",
|
||||
"current": "Nåværende",
|
||||
"shorter": "Kortere",
|
||||
"longer": "Lengre",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Tidligere vinduer",
|
||||
"cal_forward_windows": "Fremtidige vinduer",
|
||||
"history_edit_title": "Rediger historikkoppføring",
|
||||
"history_delete_entry": "Slett oppføring",
|
||||
"history_delete_confirm": "Slette denne historikkoppføringen? Datoen for siste utførelse faller tilbake til den forrige; bilder blir hos objektet, og forbrukte deler legges ikke tilbake på lager.",
|
||||
"history_edit_timestamp": "Tidsstempel",
|
||||
"manufacturer": "Produsent",
|
||||
"model": "Modell",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Standard varslingsdager",
|
||||
"settings_consumable_threshold": "Terskel „forbruksvare lav“ (%)",
|
||||
"settings_battery_low_percent": "Terskel „batteri lavt“ (%)",
|
||||
"settings_battery_lifetimes": "Typiske batterilevetider",
|
||||
"settings_battery_lifetimes_hint": "Brukes bare for batterier uten prosent: et Battery Notes-notat med bare type og byttedato, eller en sensor som bare melder «lavt». Forfall = siste bytte + denne levetiden. Batterier som melder nivå får prognosen fra målt utlading. Når flåten har sett tre bytter av en type, overtar medianintervallet fra den innebygde verdien — din egen verdi vinner alltid.",
|
||||
"settings_battery_lifetime_months": "måneder",
|
||||
"settings_battery_lifetime_reset": "Bruk standard",
|
||||
"settings_battery_lifetime_in_fleet": "i flåten din",
|
||||
"settings_battery_lifetime_learned_models": "Lært per modell: {list}",
|
||||
"settings_thresholds_hint": "Standardverdier for nye Foreslåtte oppsett (gjenværende prosent) og for flåtebatterier uten egen Battery Notes-terskel. Eksisterende oppgaver beholder verdien sin.",
|
||||
"settings_value_out_of_range": "Verdien må være mellom {min} og {max}",
|
||||
"bn_summary": "{name}: {pct} % for {n} batterier",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} enheter med egen terskel:",
|
||||
"bn_more": "+ {n} til",
|
||||
"settings_row_actions": "Handlinger i oppgaverader",
|
||||
"settings_ref_numbers_in_lists": "Referansenumre i lister",
|
||||
"settings_ref_numbers_in_lists_hint": "Viser brikkene #8 / #8.3 foran objekt- og oppgavenavn i I dag-listen, oppgavetabellen, objektkortene og objekttabellen.",
|
||||
"row_actions_buttons_compact": "Knapper (bare ikoner på mobil)",
|
||||
"row_actions_buttons": "Knapper med tekst",
|
||||
"row_actions_icons": "Ikoner (klassisk)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Slumrevarighet (timer)",
|
||||
"settings_budget": "Budsjett",
|
||||
"settings_currency": "Valuta",
|
||||
"settings_currency_decimals": "Desimaler for beløp",
|
||||
"settings_currency_decimals_hint": "Hvor mange desimaler hvert beløp viser: nøkkeltall, budsjetter, kostnader i lister og rapporter, budsjettvarsler. 0 = hele tall.",
|
||||
"settings_budget_monthly": "Månedsbudsjett",
|
||||
"settings_budget_yearly": "Årsbudsjett",
|
||||
"settings_budget_alerts": "Budsjettvarsler",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "Eksporter YAML",
|
||||
"settings_export_csv": "Eksporter CSV",
|
||||
"settings_export_settings": "Eksporter innstillinger (JSON)",
|
||||
"settings_import_csv": "Importer CSV",
|
||||
"settings_import_placeholder": "Lim inn JSON- eller CSV-innhold her…",
|
||||
"settings_import_btn": "Importer",
|
||||
"settings_import_success": "{count} objekter importert.",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "HA-handling per oppgave ved fullføring + hurtigfullføring med QR og forhåndsinnstilte verdier.",
|
||||
"on_complete_action_title": "Ved fullføring: utløs HA-handling (valgfritt)",
|
||||
"on_complete_action_desc": "Kaller en HA-tjeneste når oppgaven fullføres — f.eks. tilbakestille en teller på enheten.",
|
||||
"on_complete_action_service": "Tjeneste",
|
||||
"on_complete_action_target": "Målentitet",
|
||||
"on_complete_action_target_hint": "Merk: entitetsdomenet må samsvare med tjenesten — f.eks. fungerer 'button.press' kun på button.*, 'counter.increment' kun på counter.*, 'input_button.press' kun på input_button.* osv. Ved manglende samsvar mislykkes handlingen i det stille (HA logger 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Data (JSON, valgfritt)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Velg bilder",
|
||||
"choose_photo": "Velg bilde",
|
||||
"photos_android_hint": "Android-appen leverer ett bilde per valg — hvert valg legges til.",
|
||||
"add_photos": "Legg til bilder",
|
||||
"photos_limit": "Inntil {max} bilder per fullføring",
|
||||
"history_edit_photos_hint": "Et bilde som fjernes her, blir liggende i objektets dokumenter.",
|
||||
"uploading": "Laster opp…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Last ned",
|
||||
"doc_close": "Lukk",
|
||||
"doc_camera": "Ta bilde",
|
||||
"camera_capture_shoot": "Ta bilde",
|
||||
"camera_switch_lens": "Bytt kamera",
|
||||
"doc_drop_hint": "Slipp filer her",
|
||||
"doc_task_none": "Ingen dokumenter knyttet til denne oppgaven.",
|
||||
"doc_link_existing": "Knytt et dokument…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Registrerer en fullføring (setter sist utført) når utløseren løser seg selv — f.eks. salt etterfylt, filter byttet.",
|
||||
"doc_search": "Søk i dokumenter…",
|
||||
"doc_search_none": "Ingen samsvarende dokumenter",
|
||||
"doc_description": "Beskrivelse (valgfritt)",
|
||||
"doc_sort": "Sorter dokumenter",
|
||||
"doc_sort_newest": "Nyeste først",
|
||||
"doc_sort_oldest": "Eldste først",
|
||||
"doc_sort_title": "Etter tittel (1, 2, 3 …)",
|
||||
"doc_sort_category": "Etter kategori",
|
||||
"link_device_optional": "Koble til eksisterende enhet (valgfritt)",
|
||||
"parent_object_optional": "Overordnet objekt (valgfritt)",
|
||||
"parent_none": "(Ingen overordnet)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Varsle kun for visning",
|
||||
"settings_notify_scope_all": "Alle oppgaver",
|
||||
"settings_notify_scope_hint": "Bare oppgaver som matcher etikett-/brukerfiltrene til valgt visning sender påminnelser. Visningens status, sortering og gruppering ignoreres her.",
|
||||
"settings_notify_completed": "Varsler om fullføring",
|
||||
"settings_notify_completed_hint": "En beskjed til husstanden når en oppgave er fullført, med årsak og hvem som gjorde det. «Bare automatiske» melder bare fullføringer ingen gjorde på stedet: sensorgjenoppretting, avkrysning i handlelisten, et tjenestekall fra en automasjon. Bare til husstandstjenesten; stilletimer og dagsgrensen gjelder.",
|
||||
"notify_completed_off": "Av",
|
||||
"notify_completed_automatic": "Bare automatiske fullføringer",
|
||||
"notify_completed_all": "Alle fullføringer",
|
||||
"settings_notify_rule": "Din egen varslingsregel",
|
||||
"settings_notify_rule_hint": "Hvert varsel utløser også hendelsen maintenance_supporter_notification (type, status, objekt, oppgave, referansenumre, prioritet, lenke, nyttelast). Rut den med en automasjon — f.eks. til Ticker, Telegram eller Pushover.",
|
||||
"settings_notify_event_only": "Bare utløs hendelsen, send ingenting selv",
|
||||
"settings_notify_event_only_hint": "Automasjonen din tar hele leveransen. Gjentakelsesintervaller, stille timer og dagstaket avgjør fortsatt når hendelsen utløses.",
|
||||
"settings_notify_extra_data": "Ekstra varslingsdata (mal)",
|
||||
"settings_notify_extra_data_hint": "JSON eller YAML, Jinja tillatt; flettes inn i notify-kallets data (dine nøkler vinner). Variabler: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Test med knappen Send test.",
|
||||
"settings_notify_extra_data_hint": "JSON eller YAML, Jinja tillatt; flettes inn i notify-kallets data (dine nøkler vinner). Variabler: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Test med knappen Send test.",
|
||||
"card_saved_view": "Lagret visning",
|
||||
"card_saved_view_none": "Ingen",
|
||||
"card_saved_view_help": "Bruker visningens status-, bruker- og etikettfiltre i tillegg til filtrene over. Visningens sortering og gruppering er panelvisningsinnstillinger og brukes ikke på kortet.",
|
||||
"panel_card_tab": "Åpne på fanen",
|
||||
"panel_card_tab_default": "Husket fane (som i panelet)",
|
||||
"panel_card_view": "Åpne med lagret visning",
|
||||
"panel_card_height": "Høyde",
|
||||
"panel_card_height_help": "Tom = fyller skjermen under kortet (panelvisning). Ellers en CSS-lengde som 600px eller 80vh for visninger med andre kort.",
|
||||
"panel_card_not_registered": "Maintenance Supporter-panelet er ikke tilgjengelig — er integrasjonen satt opp?",
|
||||
"panel_card_load_failed": "Maintenance Supporter-panelet kunne ikke lastes — last siden på nytt (etter en oppdatering: tøm nettleserens hurtigbuffer).",
|
||||
"doc_part_none": "Ingen dokumenter knyttet til denne delen.",
|
||||
"settings_templates_toggle_group": "Slå alle maler i denne gruppen på eller av",
|
||||
"setups_button": "Foreslåtte oppsett",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "I orden",
|
||||
"battery_fleet_status_due": "Forfalt",
|
||||
"battery_fleet_predicted_on": "Forventes rundt {date}",
|
||||
"battery_fleet_predicted_typical": "Forventet rundt {date} — {months} måneder typisk for {type} ({source})",
|
||||
"lifetime_source_default": "innebygd standardverdi",
|
||||
"lifetime_source_table": "innebygd tabell",
|
||||
"lifetime_source_learned": "lært fra {n} bytter",
|
||||
"lifetime_source_override": "din innstilling",
|
||||
"lifetime_source_learned_device": "lært fra {n} bytter på denne enheten",
|
||||
"lifetime_source_learned_model": "lært fra {n} bytter på enheter av denne modellen",
|
||||
"battery_fleet_predicted_trend": "Forutsagt ut fra batteriets utladingstrend: rundt {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Oppladbart: lad i stedet for å bytte — aldri på handlelisten",
|
||||
"battery_fleet_sort_name": "Sorter etter navn",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Brukte deler",
|
||||
"print_inc_photos": "Bilder",
|
||||
"print_inc_documents": "Tilknyttede dokumenter",
|
||||
"print_inc_doc_desc": "Dokumentbeskrivelser",
|
||||
"print_inc_checklist": "Sjekkliste",
|
||||
"print_inc_notes": "Notater",
|
||||
"print_inc_costs": "Kostnad og varighet",
|
||||
"print_inc_person": "Utført av",
|
||||
"print_inc_refs": "Referansenumre",
|
||||
"print_inc_bare": "Utførelser uten detaljer",
|
||||
"print_inc_qr": "QR-kode per oppgave",
|
||||
"print_button": "Skriv ut",
|
||||
"report_scan_hint": "Skann for å åpne oppgaven",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Looptijd",
|
||||
"runtime_hours": "Doellooptijd (uren)",
|
||||
"target_value": "Doelwaarde",
|
||||
"baseline": "Basislijn",
|
||||
"target_changes": "Doelwijzigingen",
|
||||
"for_minutes": "Voor (minuten)",
|
||||
"time_based": "Tijdgebaseerd",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Gegenereerd",
|
||||
"report_times_done": "Gedaan",
|
||||
"report_total_cost": "Totale kosten",
|
||||
"report_every": "elke {n} {unit}",
|
||||
"report_notes": "Notities",
|
||||
"report_col_type": "Type",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Schema",
|
||||
"duration": "Duur",
|
||||
"minutes_short": "min",
|
||||
"both": "Beide",
|
||||
"trigger_val": "Triggerwaarde",
|
||||
"complete_title": "Voltooid: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: verkeerd type (verwacht: {type})",
|
||||
"err_invalid_choice": "{field}: niet-toegestane waarde",
|
||||
"err_invalid_value": "{field}: ongeldige waarde",
|
||||
"ws_err_not_found": "Niet gevonden — het is misschien intussen verwijderd",
|
||||
"ws_err_invalid_input": "Ongeldige invoer",
|
||||
"ws_err_invalid_date": "Ongeldige datum",
|
||||
"ws_err_invalid_format": "Ongeldig formaat",
|
||||
"ws_err_invalid_url": "Ongeldige link",
|
||||
"ws_err_not_configured": "Nog niet ingesteld",
|
||||
"ws_err_not_loaded": "Nog niet geladen — probeer het zo opnieuw",
|
||||
"ws_err_limit_reached": "Limiet bereikt",
|
||||
"ws_err_too_many": "Te veel items",
|
||||
"ws_err_too_large": "Te groot",
|
||||
"ws_err_not_archived": "Niet gearchiveerd",
|
||||
"ws_err_invalid_target": "Ongeldig doel",
|
||||
"ws_err_create_failed": "Kon niet worden aangemaakt",
|
||||
"ws_err_archived": "Gearchiveerd — herstel het eerst",
|
||||
"ws_err_already_archived": "Al gearchiveerd",
|
||||
"ws_err_unavailable": "Momenteel niet beschikbaar",
|
||||
"ws_err_unauthorized": "Niet toegestaan voor jouw gebruiker",
|
||||
"ws_err_too_many_views": "Te veel opgeslagen weergaven",
|
||||
"ws_err_storage_unavailable": "Opslag is niet beschikbaar",
|
||||
"ws_err_replace_failed": "Vervangen mislukt",
|
||||
"ws_err_not_paused": "Niet gepauzeerd",
|
||||
"ws_err_not_available": "Niets beschikbaar",
|
||||
"ws_err_no_url": "Geen link opgegeven",
|
||||
"ws_err_no_phases": "Deze taak heeft geen fasen",
|
||||
"ws_err_invalid_view": "Ongeldige weergave",
|
||||
"ws_err_invalid_user": "Onbekende gebruiker",
|
||||
"ws_err_invalid_range": "Ongeldig bereik",
|
||||
"ws_err_invalid_parent": "Ongeldig bovenliggend object",
|
||||
"ws_err_invalid_device": "Onbekend apparaat",
|
||||
"ws_err_empty_csv": "Het CSV-bestand is leeg",
|
||||
"ws_err_empty": "Niets om te importeren",
|
||||
"ws_err_duplicate_failed": "Kon niet worden gedupliceerd",
|
||||
"ws_err_already_paused": "Al gepauzeerd",
|
||||
"ws_err_invalid_cursor": "Ongeldige fasepositie",
|
||||
"ws_err_invalid_entity_slug": "Ongeldige entiteitsnaam",
|
||||
"ws_err_invalid_trigger_config": "Ongeldige triggerconfiguratie",
|
||||
"ws_err_no_defaults": "Geen standaardwaarden voor snel afronden ingesteld",
|
||||
"ws_err_self_link_device": "Een object kan niet aan zichzelf worden gekoppeld",
|
||||
"ws_err_too_early": "Te vroeg — deze taak kan pas dichter bij de vervaldatum worden afgerond",
|
||||
"feat_schedule_time": "Tijd-van-dag-planning",
|
||||
"feat_schedule_time_desc": "Taken vervallen op een specifieke tijd in plaats van middernacht.",
|
||||
"schedule_time_toggle": "Vervalt op een vast tijdstip",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Activeren bij gelijk aan (=)",
|
||||
"trigger_not_equals": "Activeren bij afwijkend van (≠)",
|
||||
"for_at_least_minutes": "Voor minstens (minuten)",
|
||||
"safety_interval_days": "Veiligheidsinterval (dagen, optioneel)",
|
||||
"safety_interval": "Veiligheidsinterval (optioneel)",
|
||||
"trigger_combinator": "Trigger en interval combineren",
|
||||
"trigger_combinator_any": "Trigger of interval (eerst vervuld)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Mijn taken",
|
||||
"tab_calendar": "Kalender",
|
||||
"cal_no_events": "Geen onderhoud",
|
||||
"cal_window_7": "7 dagen",
|
||||
"cal_window_14": "14 dagen",
|
||||
"cal_window_30": "30 dagen",
|
||||
"cal_window_365": "1 jaar",
|
||||
"cal_every_n_days": "elke {n} dagen",
|
||||
"cal_source_time": "Tijd-gebaseerd",
|
||||
"cal_source_time_adaptive": "Tijd-gebaseerd (adaptief)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "QR-code kon niet worden gegenereerd.",
|
||||
"qr_error_no_url": "Geen HA-URL geconfigureerd. Stel een externe of interne URL in via Instellingen → Systeem → Netwerk.",
|
||||
"save_error": "Opslaan mislukt. Probeer het opnieuw.",
|
||||
"subsave_warning": "Opgeslagen, maar één instelling is geweigerd: {detail}",
|
||||
"qr_print": "Afdrukken",
|
||||
"qr_download": "SVG downloaden",
|
||||
"qr_action": "Actie bij scannen",
|
||||
"qr_action_view": "Onderhoudsinfo bekijken",
|
||||
"qr_action_complete": "Onderhoud als voltooid markeren",
|
||||
"qr_url_mode": "Linktype",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Lokaal (mDNS)",
|
||||
"qr_mode_server": "Server-URL",
|
||||
"overview": "Overzicht",
|
||||
"analysis": "Analyse",
|
||||
"recent_activities": "Recente activiteiten",
|
||||
"search_notes": "Notities doorzoeken",
|
||||
"avg_cost": "Ø Kosten",
|
||||
"no_advanced_features": "Geen geavanceerde functies ingeschakeld",
|
||||
"no_advanced_features_hint": "Schakel „Adaptieve Intervallen” of „Seizoenpatronen” in via de integratie-instellingen om hier analysegegevens te zien.",
|
||||
"analysis_not_enough_data": "Nog niet genoeg gegevens voor analyse.",
|
||||
"analysis_not_enough_data_hint": "Weibull-analyse vereist minstens 5 voltooide onderhoudsbeurten; seizoenspatronen worden zichtbaar na 6+ datapunten per maand.",
|
||||
"analysis_manual_task_hint": "Handmatige taken zonder interval genereren geen analysegegevens.",
|
||||
"completions": "voltooiingen",
|
||||
"current": "Huidig",
|
||||
"shorter": "Korter",
|
||||
"longer": "Langer",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Eerdere vensters",
|
||||
"cal_forward_windows": "Toekomstige vensters",
|
||||
"history_edit_title": "Geschiedenisitem bewerken",
|
||||
"history_delete_entry": "Vermelding verwijderen",
|
||||
"history_delete_confirm": "Deze geschiedenisvermelding verwijderen? De datum van laatste uitvoering valt terug op de vorige voltooiing; foto's blijven bij het object en verbruikte onderdelen worden niet teruggeboekt.",
|
||||
"history_edit_timestamp": "Tijdstempel",
|
||||
"manufacturer": "Fabrikant",
|
||||
"model": "Model",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Standaard waarschuwingsdagen",
|
||||
"settings_consumable_threshold": "Drempel „verbruiksartikel laag“ (%)",
|
||||
"settings_battery_low_percent": "Drempel „batterij laag“ (%)",
|
||||
"settings_battery_lifetimes": "Gebruikelijke batterijlevensduur",
|
||||
"settings_battery_lifetimes_hint": "Alleen gebruikt voor batterijen zonder percentage: een Battery Notes-notitie met enkel een type en een vervangdatum, of een sensor die alleen „bijna leeg“ meldt. Hun vervaldatum is laatste vervanging + deze levensduur. Batterijen die een niveau melden krijgen hun voorspelling uit de gemeten ontlading. Zodra de vloot drie vervangingen van een type heeft gezien, vervangt het mediane interval de ingebouwde waarde — je eigen waarde wint altijd.",
|
||||
"settings_battery_lifetime_months": "maanden",
|
||||
"settings_battery_lifetime_reset": "Standaard gebruiken",
|
||||
"settings_battery_lifetime_in_fleet": "in je vloot",
|
||||
"settings_battery_lifetime_learned_models": "Geleerd per model: {list}",
|
||||
"settings_thresholds_hint": "Standaardwaarden voor nieuwe Voorgestelde installaties (resterend percentage) en voor vlootbatterijen zonder eigen Battery Notes-drempel. Bestaande taken behouden hun waarde.",
|
||||
"settings_value_out_of_range": "De waarde moet tussen {min} en {max} liggen",
|
||||
"bn_summary": "{name}: {pct} % voor {n} batterijen",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} apparaten met een eigen drempel:",
|
||||
"bn_more": "+ {n} meer",
|
||||
"settings_row_actions": "Acties in taakrijen",
|
||||
"settings_ref_numbers_in_lists": "Referentienummers in lijsten",
|
||||
"settings_ref_numbers_in_lists_hint": "Toont de chips #8 / #8.3 vóór object- en taaknamen in de lijst Vandaag, de takentabel, de objectkaarten en de objectentabel.",
|
||||
"row_actions_buttons_compact": "Knoppen (op telefoons alleen pictogrammen)",
|
||||
"row_actions_buttons": "Knoppen met tekst",
|
||||
"row_actions_icons": "Pictogrammen (klassiek)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Snoozeduur (uren)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Valuta",
|
||||
"settings_currency_decimals": "Decimalen voor bedragen",
|
||||
"settings_currency_decimals_hint": "Hoeveel decimalen elk bedrag toont: KPI's, budgetten, kosten in lijsten en rapporten, budgetmeldingen. 0 = hele getallen.",
|
||||
"settings_budget_monthly": "Maandbudget",
|
||||
"settings_budget_yearly": "Jaarbudget",
|
||||
"settings_budget_alerts": "Budgetwaarschuwingen",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "YAML exporteren",
|
||||
"settings_export_csv": "CSV exporteren",
|
||||
"settings_export_settings": "Instellingen exporteren (JSON)",
|
||||
"settings_import_csv": "CSV importeren",
|
||||
"settings_import_placeholder": "Plak JSON- of CSV-inhoud hier…",
|
||||
"settings_import_btn": "Importeren",
|
||||
"settings_import_success": "{count} objecten succesvol geïmporteerd.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Per taak HA-actie bij voltooien + snel-voltooien-QR met vooraf ingestelde waarden.",
|
||||
"on_complete_action_title": "Bij voltooien: HA-actie uitvoeren (optioneel)",
|
||||
"on_complete_action_desc": "Roept een HA-service aan wanneer de taak is voltooid — bv. een teller op het apparaat resetten.",
|
||||
"on_complete_action_service": "Service",
|
||||
"on_complete_action_target": "Doel-entiteit",
|
||||
"on_complete_action_data": "Data (JSON, optioneel)",
|
||||
"on_complete_action_test": "Actie testen",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Foto's kiezen",
|
||||
"choose_photo": "Foto kiezen",
|
||||
"photos_android_hint": "De Android-app geeft één foto per keuze door — elke keuze wordt toegevoegd.",
|
||||
"add_photos": "Foto's toevoegen",
|
||||
"photos_limit": "Maximaal {max} foto's per afronding",
|
||||
"history_edit_photos_hint": "Een hier verwijderde foto blijft bewaard in de documenten van het object.",
|
||||
"uploading": "Uploaden…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Downloaden",
|
||||
"doc_close": "Sluiten",
|
||||
"doc_camera": "Foto maken",
|
||||
"camera_capture_shoot": "Vastleggen",
|
||||
"camera_switch_lens": "Camera wisselen",
|
||||
"doc_drop_hint": "Sleep bestanden hierheen",
|
||||
"doc_task_none": "Geen documenten aan deze taak gekoppeld.",
|
||||
"doc_link_existing": "Document koppelen…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Registreert een voltooiing (stelt laatst uitgevoerd in) wanneer de trigger zichzelf oplost — bijv. zout bijgevuld, filter vervangen.",
|
||||
"doc_search": "Documenten zoeken…",
|
||||
"doc_search_none": "Geen overeenkomende documenten",
|
||||
"doc_description": "Beschrijving (optioneel)",
|
||||
"doc_sort": "Documenten sorteren",
|
||||
"doc_sort_newest": "Nieuwste eerst",
|
||||
"doc_sort_oldest": "Oudste eerst",
|
||||
"doc_sort_title": "Op titel (1, 2, 3 …)",
|
||||
"doc_sort_category": "Op categorie",
|
||||
"link_device_optional": "Koppelen aan bestaand apparaat (optioneel)",
|
||||
"parent_object_optional": "Bovenliggend object (optioneel)",
|
||||
"parent_none": "(Geen bovenliggend object)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Alleen melden voor weergave",
|
||||
"settings_notify_scope_all": "Alle taken",
|
||||
"settings_notify_scope_hint": "Alleen taken die overeenkomen met de label-/gebruikersfilters van de gekozen weergave sturen herinneringen. Status, sortering en groepering van de weergave worden hier genegeerd.",
|
||||
"settings_notify_completed": "Voltooiingsmeldingen",
|
||||
"settings_notify_completed_hint": "Huishoudnieuws wanneer een taak is voltooid, met de reden en wie het deed. \"Alleen automatisch\" meldt alleen voltooiingen die niemand ter plekke deed: sensorherstel, afvinken op de boodschappenlijst, een service-aanroep van een automatisering. Alleen naar de huishouddienst; stille uren en het daglimiet gelden.",
|
||||
"notify_completed_off": "Uit",
|
||||
"notify_completed_automatic": "Alleen automatische voltooiingen",
|
||||
"notify_completed_all": "Alle voltooiingen",
|
||||
"settings_notify_rule": "Eigen meldingsregel",
|
||||
"settings_notify_rule_hint": "Elke melding vuurt ook het event maintenance_supporter_notification af (soort, status, object, taak, referentienummers, prioriteit, deep link, payload). Stuur het door met een automatisering — bijv. naar Ticker, Telegram of Pushover.",
|
||||
"settings_notify_event_only": "Alleen het event afvuren, zelf niets verzenden",
|
||||
"settings_notify_event_only_hint": "Je automatisering verzorgt de volledige bezorging. Herhaalintervallen, stille uren en het daglimiet bepalen nog steeds wanneer het event afgaat.",
|
||||
"settings_notify_extra_data": "Extra meldingsgegevens (sjabloon)",
|
||||
"settings_notify_extra_data_hint": "JSON of YAML, Jinja toegestaan; wordt samengevoegd met de data van de notify-aanroep (jouw sleutels winnen). Variabelen: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Test met de knop Test verzenden.",
|
||||
"settings_notify_extra_data_hint": "JSON of YAML, Jinja toegestaan; wordt samengevoegd met de data van de notify-aanroep (jouw sleutels winnen). Variabelen: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Test met de knop Test verzenden.",
|
||||
"card_saved_view": "Opgeslagen weergave",
|
||||
"card_saved_view_none": "Geen",
|
||||
"card_saved_view_help": "Past de status-, gebruikers- en labelfilters van de weergave toe bovenop de bovenstaande filters. Sortering en groepering van de weergave zijn paneelweergave-instellingen en gelden niet voor de kaart.",
|
||||
"panel_card_tab": "Openen op tabblad",
|
||||
"panel_card_tab_default": "Onthouden tabblad (zoals in het paneel)",
|
||||
"panel_card_view": "Openen met opgeslagen weergave",
|
||||
"panel_card_height": "Hoogte",
|
||||
"panel_card_height_help": "Leeg = vult het scherm onder de kaart (paneelweergave). Anders een CSS-lengte zoals 600px of 80vh voor weergaven met andere kaarten.",
|
||||
"panel_card_not_registered": "Het Maintenance Supporter-paneel is niet beschikbaar — is de integratie ingesteld?",
|
||||
"panel_card_load_failed": "Het Maintenance Supporter-paneel kon niet worden geladen — herlaad de pagina (na een update: browsercache wissen).",
|
||||
"doc_part_none": "Geen documenten gekoppeld aan dit onderdeel.",
|
||||
"settings_templates_toggle_group": "Alle sjablonen in deze groep in- of uitschakelen",
|
||||
"setups_button": "Voorgestelde setups",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "In orde",
|
||||
"battery_fleet_status_due": "Aan de beurt",
|
||||
"battery_fleet_predicted_on": "Verwacht rond {date}",
|
||||
"battery_fleet_predicted_typical": "Verwacht rond {date} — {months} maanden gebruikelijk voor {type} ({source})",
|
||||
"lifetime_source_default": "ingebouwde standaard",
|
||||
"lifetime_source_table": "ingebouwde tabel",
|
||||
"lifetime_source_learned": "geleerd uit {n} vervangingen",
|
||||
"lifetime_source_override": "jouw instelling",
|
||||
"lifetime_source_learned_device": "geleerd uit {n} vervangingen van dit apparaat",
|
||||
"lifetime_source_learned_model": "geleerd uit {n} vervangingen bij apparaten van dit model",
|
||||
"battery_fleet_predicted_trend": "Voorspeld uit de ontladingstrend van deze batterij: rond {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Oplaadbaar: opladen in plaats van vervangen — nooit op het boodschappenlijstje",
|
||||
"battery_fleet_sort_name": "Sorteren op naam",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Gebruikte onderdelen",
|
||||
"print_inc_photos": "Foto's",
|
||||
"print_inc_documents": "Gekoppelde documenten",
|
||||
"print_inc_doc_desc": "Documentbeschrijvingen",
|
||||
"print_inc_checklist": "Controlelijst",
|
||||
"print_inc_notes": "Notities",
|
||||
"print_inc_costs": "Kosten en duur",
|
||||
"print_inc_person": "Uitgevoerd door",
|
||||
"print_inc_refs": "Referentienummers",
|
||||
"print_inc_bare": "Voltooiingen zonder details",
|
||||
"print_inc_qr": "QR-code per taak",
|
||||
"print_button": "Afdrukken",
|
||||
"report_scan_hint": "Scan om de taak te openen",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Czas pracy",
|
||||
"runtime_hours": "Docelowy czas pracy (godziny)",
|
||||
"target_value": "Wartość docelowa",
|
||||
"baseline": "Wartość bazowa",
|
||||
"target_changes": "Docelowa liczba zmian",
|
||||
"for_minutes": "Przez (minuty)",
|
||||
"time_based": "Czasowy",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Wygenerowano",
|
||||
"report_times_done": "Wykonano",
|
||||
"report_total_cost": "Koszt całkowity",
|
||||
"report_every": "co {n} {unit}",
|
||||
"report_notes": "Notatki",
|
||||
"report_col_type": "Typ",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Harmonogram",
|
||||
"duration": "Czas trwania",
|
||||
"minutes_short": "min",
|
||||
"both": "Oba",
|
||||
"trigger_val": "Wartość wyzwalacza",
|
||||
"complete_title": "Wykonaj: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: zły typ (oczekiwano: {type})",
|
||||
"err_invalid_choice": "{field}: niedozwolona wartość",
|
||||
"err_invalid_value": "{field}: nieprawidłowa wartość",
|
||||
"ws_err_not_found": "Nie znaleziono — być może zostało w międzyczasie usunięte",
|
||||
"ws_err_invalid_input": "Nieprawidłowe dane",
|
||||
"ws_err_invalid_date": "Nieprawidłowa data",
|
||||
"ws_err_invalid_format": "Nieprawidłowy format",
|
||||
"ws_err_invalid_url": "Nieprawidłowy link",
|
||||
"ws_err_not_configured": "Jeszcze nie skonfigurowano",
|
||||
"ws_err_not_loaded": "Jeszcze nie załadowano — spróbuj ponownie za chwilę",
|
||||
"ws_err_limit_reached": "Osiągnięto limit",
|
||||
"ws_err_too_many": "Zbyt wiele wpisów",
|
||||
"ws_err_too_large": "Za duży rozmiar",
|
||||
"ws_err_not_archived": "Nie zarchiwizowano",
|
||||
"ws_err_invalid_target": "Nieprawidłowy cel",
|
||||
"ws_err_create_failed": "Nie udało się utworzyć",
|
||||
"ws_err_archived": "Zarchiwizowano — najpierw przywróć",
|
||||
"ws_err_already_archived": "Już zarchiwizowano",
|
||||
"ws_err_unavailable": "Obecnie niedostępne",
|
||||
"ws_err_unauthorized": "Niedozwolone dla Twojego użytkownika",
|
||||
"ws_err_too_many_views": "Zbyt wiele zapisanych widoków",
|
||||
"ws_err_storage_unavailable": "Magazyn danych jest niedostępny",
|
||||
"ws_err_replace_failed": "Zastąpienie nie powiodło się",
|
||||
"ws_err_not_paused": "Nie wstrzymano",
|
||||
"ws_err_not_available": "Brak dostępnych",
|
||||
"ws_err_no_url": "Nie podano linku",
|
||||
"ws_err_no_phases": "To zadanie nie ma faz",
|
||||
"ws_err_invalid_view": "Nieprawidłowy widok",
|
||||
"ws_err_invalid_user": "Nieznany użytkownik",
|
||||
"ws_err_invalid_range": "Nieprawidłowy zakres",
|
||||
"ws_err_invalid_parent": "Nieprawidłowy obiekt nadrzędny",
|
||||
"ws_err_invalid_device": "Nieznane urządzenie",
|
||||
"ws_err_empty_csv": "Plik CSV jest pusty",
|
||||
"ws_err_empty": "Nie ma nic do zaimportowania",
|
||||
"ws_err_duplicate_failed": "Nie udało się zduplikować",
|
||||
"ws_err_already_paused": "Już wstrzymano",
|
||||
"ws_err_invalid_cursor": "Nieprawidłowa pozycja fazy",
|
||||
"ws_err_invalid_entity_slug": "Nieprawidłowa nazwa encji",
|
||||
"ws_err_invalid_trigger_config": "Nieprawidłowa konfiguracja wyzwalacza",
|
||||
"ws_err_no_defaults": "Brak domyślnych wartości szybkiego ukończenia",
|
||||
"ws_err_self_link_device": "Obiekt nie może być powiązany sam ze sobą",
|
||||
"ws_err_too_early": "Za wcześnie — to zadanie można ukończyć dopiero bliżej terminu",
|
||||
"feat_schedule_time": "Harmonogram według pory dnia",
|
||||
"feat_schedule_time_desc": "Zadania stają się zaległe o określonej porze dnia zamiast o północy.",
|
||||
"schedule_time_toggle": "Termin o określonej godzinie",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Wyzwól przy równym (=)",
|
||||
"trigger_not_equals": "Wyzwól przy różnym od (≠)",
|
||||
"for_at_least_minutes": "Przez co najmniej (minuty)",
|
||||
"safety_interval_days": "Interwał bezpieczeństwa (dni, opcjonalny)",
|
||||
"safety_interval": "Interwał bezpieczeństwa (opcjonalny)",
|
||||
"trigger_combinator": "Połącz wyzwalacz i interwał",
|
||||
"trigger_combinator_any": "Wyzwalacz lub interwał (co pierwsze)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Moje zadania",
|
||||
"tab_calendar": "Kalendarz",
|
||||
"cal_no_events": "Brak konserwacji",
|
||||
"cal_window_7": "7 dni",
|
||||
"cal_window_14": "14 dni",
|
||||
"cal_window_30": "30 dni",
|
||||
"cal_window_365": "1 rok",
|
||||
"cal_every_n_days": "co {n} dni",
|
||||
"cal_source_time": "Czas",
|
||||
"cal_source_time_adaptive": "Czas (adaptacyjny)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Nie udało się wygenerować kodu QR.",
|
||||
"qr_error_no_url": "Brak skonfigurowanego URL HA. Ustaw zewnętrzny lub wewnętrzny URL w Ustawienia → System → Sieć.",
|
||||
"save_error": "Nie udało się zapisać. Spróbuj ponownie.",
|
||||
"subsave_warning": "Zapisano, ale jedno ustawienie zostało odrzucone: {detail}",
|
||||
"qr_print": "Drukuj",
|
||||
"qr_download": "Pobierz SVG",
|
||||
"qr_action": "Akcja przy skanowaniu",
|
||||
"qr_action_view": "Wyświetl informacje o konserwacji",
|
||||
"qr_action_complete": "Oznacz konserwację jako wykonaną",
|
||||
"qr_url_mode": "Typ linku",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Lokalny (mDNS)",
|
||||
"qr_mode_server": "URL serwera",
|
||||
"overview": "Przegląd",
|
||||
"analysis": "Analiza",
|
||||
"recent_activities": "Ostatnie aktywności",
|
||||
"search_notes": "Szukaj w notatkach",
|
||||
"avg_cost": "Śr. koszt",
|
||||
"no_advanced_features": "Brak włączonych funkcji zaawansowanych",
|
||||
"no_advanced_features_hint": "Włącz „Adaptacyjne interwały” lub „Wzorce sezonowe” w ustawieniach integracji, aby zobaczyć tutaj dane analityczne.",
|
||||
"analysis_not_enough_data": "Jeszcze za mało danych do analizy.",
|
||||
"analysis_not_enough_data_hint": "Analiza Weibulla wymaga co najmniej 5 wykonanych konserwacji; wzorce sezonowe stają się widoczne po 6+ punktach danych na miesiąc.",
|
||||
"analysis_manual_task_hint": "Zadania ręczne bez interwału nie generują danych analitycznych.",
|
||||
"completions": "wykonania",
|
||||
"current": "Bieżące",
|
||||
"shorter": "Krótsze",
|
||||
"longer": "Dłuższe",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Minione okna",
|
||||
"cal_forward_windows": "Przyszłe okna",
|
||||
"history_edit_title": "Edytuj wpis historii",
|
||||
"history_delete_entry": "Usuń wpis",
|
||||
"history_delete_confirm": "Usunąć ten wpis historii? Data ostatniego wykonania cofnie się do poprzedniego; zdjęcia pozostaną przy obiekcie, a zużyte części nie wrócą na stan.",
|
||||
"history_edit_timestamp": "Znacznik czasu",
|
||||
"manufacturer": "Producent",
|
||||
"model": "Model",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Domyślne dni ostrzeżenia",
|
||||
"settings_consumable_threshold": "Próg „materiał eksploatacyjny niski” (%)",
|
||||
"settings_battery_low_percent": "Próg „bateria słaba” (%)",
|
||||
"settings_battery_lifetimes": "Typowa żywotność baterii",
|
||||
"settings_battery_lifetimes_hint": "Używane tylko dla baterii bez procentu: notatka Battery Notes z samym typem i datą wymiany albo czujnik zgłaszający tylko „niski”. Termin = ostatnia wymiana + ta żywotność. Baterie raportujące poziom dostają prognozę z mierzonego rozładowania. Po trzech wymianach danego typu mediana odstępów zastępuje wbudowaną wartość — Twoja wartość zawsze wygrywa.",
|
||||
"settings_battery_lifetime_months": "mies.",
|
||||
"settings_battery_lifetime_reset": "Użyj domyślnej",
|
||||
"settings_battery_lifetime_in_fleet": "w Twojej flocie",
|
||||
"settings_battery_lifetime_learned_models": "Nauczone według modelu: {list}",
|
||||
"settings_thresholds_hint": "Wartości domyślne dla nowych Sugerowanych konfiguracji (procent pozostały) i dla baterii floty bez własnego progu Battery Notes. Istniejące zadania zachowują swoją wartość.",
|
||||
"settings_value_out_of_range": "Wartość musi mieścić się w zakresie od {min} do {max}",
|
||||
"bn_summary": "{name}: {pct} % dla {n} baterii",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} urządzeń z własnym progiem:",
|
||||
"bn_more": "+ {n} więcej",
|
||||
"settings_row_actions": "Akcje w wierszach zadań",
|
||||
"settings_ref_numbers_in_lists": "Numery referencyjne na listach",
|
||||
"settings_ref_numbers_in_lists_hint": "Pokazuje etykiety #8 / #8.3 przed nazwami obiektów i zadań na liście Dzisiaj, w tabeli zadań, na kartach obiektów i w tabeli obiektów.",
|
||||
"row_actions_buttons_compact": "Przyciski (na telefonie tylko ikony)",
|
||||
"row_actions_buttons": "Przyciski z tekstem",
|
||||
"row_actions_icons": "Ikony (klasyczne)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Czas drzemki (godziny)",
|
||||
"settings_budget": "Budżet",
|
||||
"settings_currency": "Waluta",
|
||||
"settings_currency_decimals": "Miejsca po przecinku w kwotach",
|
||||
"settings_currency_decimals_hint": "Ile miejsc po przecinku pokazuje każda kwota: KPI, budżety, koszty na listach i w raportach, alerty budżetowe. 0 = liczby całkowite.",
|
||||
"settings_budget_monthly": "Budżet miesięczny",
|
||||
"settings_budget_yearly": "Budżet roczny",
|
||||
"settings_budget_alerts": "Alerty budżetowe",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Eksportuj YAML",
|
||||
"settings_export_csv": "Eksportuj CSV",
|
||||
"settings_export_settings": "Eksportuj ustawienia (JSON)",
|
||||
"settings_import_csv": "Importuj CSV",
|
||||
"settings_import_placeholder": "Wklej tutaj zawartość JSON lub CSV…",
|
||||
"settings_import_btn": "Importuj",
|
||||
"settings_import_success": "{count} obiektów zaimportowanych pomyślnie.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Akcja HA per zadanie po zakończeniu + QR szybkiego zakończenia z predefiniowanymi wartościami.",
|
||||
"on_complete_action_title": "Po zakończeniu: wywołaj akcję HA (opcjonalnie)",
|
||||
"on_complete_action_desc": "Wywołuje usługę HA po zakończeniu zadania — np. zresetuj licznik urządzenia.",
|
||||
"on_complete_action_service": "Usługa",
|
||||
"on_complete_action_target": "Encja docelowa",
|
||||
"on_complete_action_data": "Dane (JSON, opcjonalnie)",
|
||||
"on_complete_action_test": "Testuj akcję",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Wybierz zdjęcia",
|
||||
"choose_photo": "Wybierz zdjęcie",
|
||||
"photos_android_hint": "Aplikacja na Androida przekazuje jedno zdjęcie na wybór — każdy wybór jest dodawany.",
|
||||
"add_photos": "Dodaj zdjęcia",
|
||||
"photos_limit": "Maksymalnie {max} zdjęć na wykonanie",
|
||||
"history_edit_photos_hint": "Zdjęcie usunięte tutaj pozostaje w dokumentach obiektu.",
|
||||
"uploading": "Przesyłanie…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Pobierz",
|
||||
"doc_close": "Zamknij",
|
||||
"doc_camera": "Zrób zdjęcie",
|
||||
"camera_capture_shoot": "Zrób zdjęcie",
|
||||
"camera_switch_lens": "Przełącz kamerę",
|
||||
"doc_drop_hint": "Upuść pliki tutaj",
|
||||
"doc_task_none": "Brak dokumentów powiązanych z tym zadaniem.",
|
||||
"doc_link_existing": "Powiąż dokument…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Rejestruje wykonanie (ustawia ostatnie wykonanie), gdy wyzwalacz sam się rozwiąże — np. uzupełniono sól, wymieniono filtr.",
|
||||
"doc_search": "Szukaj dokumentów…",
|
||||
"doc_search_none": "Brak pasujących dokumentów",
|
||||
"doc_description": "Opis (opcjonalnie)",
|
||||
"doc_sort": "Sortuj dokumenty",
|
||||
"doc_sort_newest": "Najnowsze najpierw",
|
||||
"doc_sort_oldest": "Najstarsze najpierw",
|
||||
"doc_sort_title": "Według tytułu (1, 2, 3 …)",
|
||||
"doc_sort_category": "Według kategorii",
|
||||
"link_device_optional": "Połącz z istniejącym urządzeniem (opcjonalnie)",
|
||||
"parent_object_optional": "Obiekt nadrzędny (opcjonalnie)",
|
||||
"parent_none": "(Brak nadrzędnego)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Powiadamiaj tylko dla widoku",
|
||||
"settings_notify_scope_all": "Wszystkie zadania",
|
||||
"settings_notify_scope_hint": "Przypomnienia wysyłają tylko zadania pasujące do filtrów etykiety/użytkownika wybranego widoku. Status, sortowanie i grupowanie widoku są tu ignorowane.",
|
||||
"settings_notify_completed": "Powiadomienia o wykonaniu",
|
||||
"settings_notify_completed_hint": "Wiadomość dla domowników, gdy zadanie zostanie wykonane, z powodem i wykonawcą. „Tylko automatyczne” zgłasza wyłącznie wykonania, których nikt nie zrobił na miejscu: powrót czujnika, odhaczenie na liście zakupów, wywołanie usługi przez automatyzację. Tylko do usługi domowej; godziny ciszy i dzienny limit obowiązują.",
|
||||
"notify_completed_off": "Wył.",
|
||||
"notify_completed_automatic": "Tylko automatyczne wykonania",
|
||||
"notify_completed_all": "Wszystkie wykonania",
|
||||
"settings_notify_rule": "Własna reguła powiadomień",
|
||||
"settings_notify_rule_hint": "Każde powiadomienie wyzwala dodatkowo zdarzenie maintenance_supporter_notification (rodzaj, status, obiekt, zadanie, numery referencyjne, priorytet, link, dane). Przekieruj je automatyzacją — np. do Tickera, Telegrama lub Pushover.",
|
||||
"settings_notify_event_only": "Tylko zdarzenie, nic nie wysyłaj",
|
||||
"settings_notify_event_only_hint": "Twoja automatyzacja odpowiada za całe dostarczanie. Odstępy powtórzeń, ciche godziny i dzienny limit nadal decydują, kiedy zdarzenie się wyzwala.",
|
||||
"settings_notify_extra_data": "Dodatkowe dane powiadomienia (szablon)",
|
||||
"settings_notify_extra_data_hint": "JSON lub YAML, Jinja dozwolone; scalane z data wywołania notify (Twoje klucze wygrywają). Zmienne: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Sprawdź przyciskiem Wyślij test.",
|
||||
"settings_notify_extra_data_hint": "JSON lub YAML, Jinja dozwolone; scalane z data wywołania notify (Twoje klucze wygrywają). Zmienne: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Sprawdź przyciskiem Wyślij test.",
|
||||
"card_saved_view": "Zapisany widok",
|
||||
"card_saved_view_none": "Brak",
|
||||
"card_saved_view_help": "Stosuje filtry statusu, użytkownika i etykiety widoku oprócz powyższych filtrów. Sortowanie i grupowanie widoku to ustawienia wyświetlania panelu i nie są stosowane na karcie.",
|
||||
"panel_card_tab": "Otwieraj na karcie",
|
||||
"panel_card_tab_default": "Zapamiętana karta (jak w panelu)",
|
||||
"panel_card_view": "Otwieraj z zapisanym widokiem",
|
||||
"panel_card_height": "Wysokość",
|
||||
"panel_card_height_help": "Puste = wypełnia ekran pod kartą (widok panelu). W przeciwnym razie długość CSS, np. 600px lub 80vh, dla widoków z innymi kartami.",
|
||||
"panel_card_not_registered": "Panel Maintenance Supporter jest niedostępny — czy integracja jest skonfigurowana?",
|
||||
"panel_card_load_failed": "Nie udało się wczytać panelu Maintenance Supporter — odśwież stronę (po aktualizacji: wyczyść pamięć podręczną przeglądarki).",
|
||||
"doc_part_none": "Brak dokumentów powiązanych z tą częścią.",
|
||||
"settings_templates_toggle_group": "Włącz lub wyłącz wszystkie szablony w tej grupie",
|
||||
"setups_button": "Sugerowane konfiguracje",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "W porządku",
|
||||
"battery_fleet_status_due": "Do wymiany",
|
||||
"battery_fleet_predicted_on": "Przewidywane około {date}",
|
||||
"battery_fleet_predicted_typical": "Spodziewane około {date} — {months} mies. typowo dla {type} ({source})",
|
||||
"lifetime_source_default": "wbudowana wartość domyślna",
|
||||
"lifetime_source_table": "wbudowana tabela",
|
||||
"lifetime_source_learned": "nauczone z {n} wymian",
|
||||
"lifetime_source_override": "Twoje ustawienie",
|
||||
"lifetime_source_learned_device": "nauczone z {n} wymian tego urządzenia",
|
||||
"lifetime_source_learned_model": "nauczone z {n} wymian w urządzeniach tego modelu",
|
||||
"battery_fleet_predicted_trend": "Prognoza na podstawie trendu rozładowania tej baterii: około {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Akumulator: ładowanie zamiast wymiany — nigdy na liście zakupów",
|
||||
"battery_fleet_sort_name": "Sortuj według nazwy",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Zużyte części",
|
||||
"print_inc_photos": "Zdjęcia",
|
||||
"print_inc_documents": "Powiązane dokumenty",
|
||||
"print_inc_doc_desc": "Opisy dokumentów",
|
||||
"print_inc_checklist": "Lista kontrolna",
|
||||
"print_inc_notes": "Notatki",
|
||||
"print_inc_costs": "Koszt i czas",
|
||||
"print_inc_person": "Wykonał",
|
||||
"print_inc_refs": "Numery referencyjne",
|
||||
"print_inc_bare": "Wykonania bez szczegółów",
|
||||
"print_inc_qr": "Kod QR dla każdego zadania",
|
||||
"print_button": "Drukuj",
|
||||
"report_scan_hint": "Zeskanuj, aby otworzyć zadanie",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Tempo de operação",
|
||||
"runtime_hours": "Tempo de operação alvo (horas)",
|
||||
"target_value": "Valor alvo",
|
||||
"baseline": "Linha de base",
|
||||
"target_changes": "Mudanças alvo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Baseado em tempo",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Gerado em",
|
||||
"report_times_done": "Concluídas",
|
||||
"report_total_cost": "Custo total",
|
||||
"report_every": "a cada {n} {unit}",
|
||||
"report_notes": "Observações",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Agendamento",
|
||||
"duration": "Duração",
|
||||
"minutes_short": "min",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor do gatilho",
|
||||
"complete_title": "Concluir: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: tipo incorreto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor não permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"ws_err_not_found": "Não encontrado — pode ter sido excluído nesse meio-tempo",
|
||||
"ws_err_invalid_input": "Entrada inválida",
|
||||
"ws_err_invalid_date": "Data inválida",
|
||||
"ws_err_invalid_format": "Formato inválido",
|
||||
"ws_err_invalid_url": "Link inválido",
|
||||
"ws_err_not_configured": "Ainda não configurado",
|
||||
"ws_err_not_loaded": "Ainda não carregado — tente novamente em instantes",
|
||||
"ws_err_limit_reached": "Limite atingido",
|
||||
"ws_err_too_many": "Entradas demais",
|
||||
"ws_err_too_large": "Grande demais",
|
||||
"ws_err_not_archived": "Não arquivado",
|
||||
"ws_err_invalid_target": "Destino inválido",
|
||||
"ws_err_create_failed": "Não foi possível criar",
|
||||
"ws_err_archived": "Arquivado — restaure primeiro",
|
||||
"ws_err_already_archived": "Já arquivado",
|
||||
"ws_err_unavailable": "Indisponível no momento",
|
||||
"ws_err_unauthorized": "Não permitido para o seu usuário",
|
||||
"ws_err_too_many_views": "Visualizações salvas demais",
|
||||
"ws_err_storage_unavailable": "O armazenamento não está disponível",
|
||||
"ws_err_replace_failed": "Falha ao substituir",
|
||||
"ws_err_not_paused": "Não está pausado",
|
||||
"ws_err_not_available": "Nada disponível",
|
||||
"ws_err_no_url": "Nenhum link informado",
|
||||
"ws_err_no_phases": "Esta tarefa não tem fases",
|
||||
"ws_err_invalid_view": "Visualização inválida",
|
||||
"ws_err_invalid_user": "Usuário desconhecido",
|
||||
"ws_err_invalid_range": "Intervalo inválido",
|
||||
"ws_err_invalid_parent": "Objeto pai inválido",
|
||||
"ws_err_invalid_device": "Dispositivo desconhecido",
|
||||
"ws_err_empty_csv": "O arquivo CSV está vazio",
|
||||
"ws_err_empty": "Nada para importar",
|
||||
"ws_err_duplicate_failed": "Não foi possível duplicar",
|
||||
"ws_err_already_paused": "Já está pausado",
|
||||
"ws_err_invalid_cursor": "Posição de fase inválida",
|
||||
"ws_err_invalid_entity_slug": "Nome de entidade inválido",
|
||||
"ws_err_invalid_trigger_config": "Configuração do gatilho inválida",
|
||||
"ws_err_no_defaults": "Sem padrões para conclusão rápida",
|
||||
"ws_err_self_link_device": "Um objeto não pode ser vinculado a si mesmo",
|
||||
"ws_err_too_early": "Cedo demais — esta tarefa só pode ser concluída mais perto do vencimento",
|
||||
"feat_schedule_time": "Agendamento por horário",
|
||||
"feat_schedule_time_desc": "As tarefas ficam atrasadas em um horário específico do dia, em vez de à meia-noite.",
|
||||
"schedule_time_toggle": "Vence em um horário específico",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Acionar quando igual a (=)",
|
||||
"trigger_not_equals": "Acionar quando diferente de (≠)",
|
||||
"for_at_least_minutes": "Por pelo menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de segurança (dias, opcional)",
|
||||
"safety_interval": "Intervalo de segurança (opcional)",
|
||||
"trigger_combinator": "Combinar gatilho e intervalo",
|
||||
"trigger_combinator_any": "Gatilho ou intervalo (o primeiro)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Minhas tarefas",
|
||||
"tab_calendar": "Calendário",
|
||||
"cal_no_events": "Sem manutenção",
|
||||
"cal_window_7": "7 dias",
|
||||
"cal_window_14": "14 dias",
|
||||
"cal_window_30": "30 dias",
|
||||
"cal_window_365": "1 ano",
|
||||
"cal_every_n_days": "a cada {n} dias",
|
||||
"cal_source_time": "Baseado em tempo",
|
||||
"cal_source_time_adaptive": "Baseado em tempo (adaptativo)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "Falha ao gerar o código QR.",
|
||||
"qr_error_no_url": "Nenhuma URL do HA configurada. Defina uma URL externa ou interna em Configurações → Sistema → Rede.",
|
||||
"save_error": "Falha ao salvar. Tente novamente.",
|
||||
"subsave_warning": "Salvo, mas uma configuração foi rejeitada: {detail}",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Baixar SVG",
|
||||
"qr_action": "Ação ao escanear",
|
||||
"qr_action_view": "Ver informações de manutenção",
|
||||
"qr_action_complete": "Marcar a manutenção como concluída",
|
||||
"qr_url_mode": "Tipo de link",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL do servidor",
|
||||
"overview": "Visão geral",
|
||||
"analysis": "Análise",
|
||||
"recent_activities": "Atividades recentes",
|
||||
"search_notes": "Pesquisar observações",
|
||||
"avg_cost": "Custo médio",
|
||||
"no_advanced_features": "Nenhum recurso avançado ativado",
|
||||
"no_advanced_features_hint": "Ative “Intervalos adaptativos” ou “Padrões sazonais” nas configurações da integração para ver dados de análise aqui.",
|
||||
"analysis_not_enough_data": "Ainda não há dados suficientes para análise.",
|
||||
"analysis_not_enough_data_hint": "A análise de Weibull exige pelo menos 5 manutenções concluídas; padrões sazonais aparecem após 6+ pontos de dados por mês.",
|
||||
"analysis_manual_task_hint": "Tarefas manuais sem intervalo não geram dados de análise.",
|
||||
"completions": "conclusões",
|
||||
"current": "Atual",
|
||||
"shorter": "Mais curto",
|
||||
"longer": "Mais longo",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Janelas passadas",
|
||||
"cal_forward_windows": "Janelas futuras",
|
||||
"history_edit_title": "Editar entrada do histórico",
|
||||
"history_delete_entry": "Excluir entrada",
|
||||
"history_delete_confirm": "Excluir esta entrada do histórico? A data da última execução volta para a conclusão anterior; as fotos permanecem com o objeto e as peças consumidas não são repostas.",
|
||||
"history_edit_timestamp": "Data e hora",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Dias de aviso padrão",
|
||||
"settings_consumable_threshold": "Limite „consumível baixo“ (%)",
|
||||
"settings_battery_low_percent": "Limite „pilha fraca“ (%)",
|
||||
"settings_battery_lifetimes": "Vida útil típica das pilhas",
|
||||
"settings_battery_lifetimes_hint": "Usado apenas para pilhas sem porcentagem: uma nota do Battery Notes só com tipo e data de troca, ou um sensor que apenas informa « fraca ». O vencimento é última troca + esta vida útil. Pilhas que informam nível têm a previsão pela descarga medida. Após três trocas de um tipo, o intervalo mediano substitui o valor integrado — seu valor sempre vence.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
"settings_battery_lifetime_reset": "Usar padrão",
|
||||
"settings_battery_lifetime_in_fleet": "na sua frota",
|
||||
"settings_battery_lifetime_learned_models": "Aprendido por modelo: {list}",
|
||||
"settings_thresholds_hint": "Padrões para novas Configurações sugeridas (porcentagem restante) e para pilhas da frota sem limite próprio do Battery Notes. As tarefas existentes mantêm seu valor.",
|
||||
"settings_value_out_of_range": "O valor deve estar entre {min} e {max}",
|
||||
"bn_summary": "{name}: {pct} % para {n} pilhas",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} dispositivos com limite próprio:",
|
||||
"bn_more": "+ {n} mais",
|
||||
"settings_row_actions": "Ações nas linhas de tarefas",
|
||||
"settings_ref_numbers_in_lists": "Números de referência nas listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra as etiquetas #8 / #8.3 antes dos nomes de objetos e tarefas na lista Hoje, na tabela de tarefas, nos cartões de objetos e na tabela de objetos.",
|
||||
"row_actions_buttons_compact": "Botões (só ícones no celular)",
|
||||
"row_actions_buttons": "Botões com texto",
|
||||
"row_actions_icons": "Ícones (clássico)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Duração da soneca (horas)",
|
||||
"settings_budget": "Orçamento",
|
||||
"settings_currency": "Moeda",
|
||||
"settings_currency_decimals": "Casas decimais dos valores",
|
||||
"settings_currency_decimals_hint": "Quantas casas decimais cada valor mostra: KPIs, orçamentos, custos em listas e relatórios, alertas de orçamento. 0 = números inteiros.",
|
||||
"settings_budget_monthly": "Orçamento mensal",
|
||||
"settings_budget_yearly": "Orçamento anual",
|
||||
"settings_budget_alerts": "Alertas de orçamento",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_export_settings": "Exportar configurações (JSON)",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Cole o conteúdo JSON ou CSV aqui…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados com sucesso.",
|
||||
@@ -644,7 +681,6 @@
|
||||
"feat_completion_actions_desc": "Ação do HA por tarefa ao concluir + QR de conclusão rápida com valores predefinidos.",
|
||||
"on_complete_action_title": "Ao concluir: acionar ação do HA (opcional)",
|
||||
"on_complete_action_desc": "Chama um serviço do HA quando a tarefa é concluída — ex.: zerar um contador no dispositivo.",
|
||||
"on_complete_action_service": "Serviço",
|
||||
"on_complete_action_target": "Entidade alvo",
|
||||
"on_complete_action_target_hint": "Atenção: o domínio da entidade deve corresponder ao serviço — ex.: 'button.press' só funciona em button.*, 'counter.increment' só em counter.*, 'input_button.press' só em input_button.* etc. Em caso de divergência, a ação falhará silenciosamente (o HA registra 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Dados (JSON, opcional)",
|
||||
@@ -710,7 +746,6 @@
|
||||
"choose_photos": "Escolher fotos",
|
||||
"choose_photo": "Escolher foto",
|
||||
"photos_android_hint": "O app Android entrega uma foto por seleção — cada seleção é adicionada.",
|
||||
"add_photos": "Adicionar fotos",
|
||||
"photos_limit": "Até {max} fotos por conclusão",
|
||||
"history_edit_photos_hint": "Uma foto removida aqui continua nos documentos do objeto.",
|
||||
"uploading": "Enviando…",
|
||||
@@ -731,6 +766,8 @@
|
||||
"doc_download": "Baixar",
|
||||
"doc_close": "Fechar",
|
||||
"doc_camera": "Tirar foto",
|
||||
"camera_capture_shoot": "Capturar",
|
||||
"camera_switch_lens": "Trocar de câmera",
|
||||
"doc_drop_hint": "Solte os arquivos aqui",
|
||||
"doc_task_none": "Nenhum documento vinculado a esta tarefa.",
|
||||
"doc_link_existing": "Vincular um documento…",
|
||||
@@ -747,6 +784,12 @@
|
||||
"auto_complete_on_recovery_help": "Registra uma conclusão (define a última execução) quando o gatilho se resolve sozinho — ex.: sal reposto, filtro trocado.",
|
||||
"doc_search": "Pesquisar documentos…",
|
||||
"doc_search_none": "Nenhum documento correspondente",
|
||||
"doc_description": "Descrição (opcional)",
|
||||
"doc_sort": "Ordenar documentos",
|
||||
"doc_sort_newest": "Mais recentes primeiro",
|
||||
"doc_sort_oldest": "Mais antigos primeiro",
|
||||
"doc_sort_title": "Por título (1, 2, 3 …)",
|
||||
"doc_sort_category": "Por categoria",
|
||||
"link_device_optional": "Vincular a um dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto pai (opcional)",
|
||||
"parent_none": "(Sem pai)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Notificar apenas para a visualização",
|
||||
"settings_notify_scope_all": "Todas as tarefas",
|
||||
"settings_notify_scope_hint": "Apenas tarefas que correspondem aos filtros de etiqueta/usuário da visualização salva selecionada enviam lembretes. Status, ordenação e agrupamento da visualização são ignorados aqui.",
|
||||
"settings_notify_completed": "Notificações de conclusão",
|
||||
"settings_notify_completed_hint": "Aviso para a casa quando uma tarefa é concluída, com o motivo e quem fez. \"Só automáticas\" anuncia apenas as conclusões que ninguém fez na hora: recuperação do sensor, item marcado na lista de compras, chamada de serviço de uma automação. Só para o serviço da casa; horário de silêncio e limite diário se aplicam.",
|
||||
"notify_completed_off": "Desligado",
|
||||
"notify_completed_automatic": "Só conclusões automáticas",
|
||||
"notify_completed_all": "Todas as conclusões",
|
||||
"settings_notify_rule": "Sua regra de notificação",
|
||||
"settings_notify_rule_hint": "Cada notificação também dispara o evento maintenance_supporter_notification (tipo, status, objeto, tarefa, números de referência, prioridade, link, payload). Roteie-o com uma automação — por ex. para Ticker, Telegram ou Pushover.",
|
||||
"settings_notify_event_only": "Apenas disparar o evento, não enviar nada",
|
||||
"settings_notify_event_only_hint": "Sua automação cuida de toda a entrega. Intervalos de repetição, horário silencioso e o limite diário continuam valendo para quando o evento dispara.",
|
||||
"settings_notify_extra_data": "Dados extras de notificação (modelo)",
|
||||
"settings_notify_extra_data_hint": "JSON ou YAML, Jinja permitido; mesclado nos data da chamada notify (suas chaves vencem). Variáveis: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Teste com o botão Enviar teste.",
|
||||
"settings_notify_extra_data_hint": "JSON ou YAML, Jinja permitido; mesclado nos data da chamada notify (suas chaves vencem). Variáveis: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Teste com o botão Enviar teste.",
|
||||
"card_saved_view": "Visualização salva",
|
||||
"card_saved_view_none": "Nenhuma",
|
||||
"card_saved_view_help": "Aplica os filtros de status, usuário e etiqueta da visualização por cima dos filtros acima. A ordenação e o agrupamento da visualização são configurações de exibição do painel e não se aplicam ao cartão.",
|
||||
"panel_card_tab": "Abrir na aba",
|
||||
"panel_card_tab_default": "Aba lembrada (como no painel)",
|
||||
"panel_card_view": "Abrir com a visualização salva",
|
||||
"panel_card_height": "Altura",
|
||||
"panel_card_height_help": "Vazio = preenche a tela abaixo do cartão (visualização painel). Caso contrário, um comprimento CSS como 600px ou 80vh para visualizações com outros cartões.",
|
||||
"panel_card_not_registered": "O painel Maintenance Supporter não está disponível — a integração está configurada?",
|
||||
"panel_card_load_failed": "Não foi possível carregar o painel Maintenance Supporter — recarregue a página (após uma atualização: limpe o cache do navegador).",
|
||||
"doc_part_none": "Nenhum documento vinculado a esta peça.",
|
||||
"settings_templates_toggle_group": "Ativar ou desativar todos os modelos deste grupo",
|
||||
"setups_button": "Configurações sugeridas",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Em bom estado",
|
||||
"battery_fleet_status_due": "Vencida",
|
||||
"battery_fleet_predicted_on": "Previsto por volta de {date}",
|
||||
"battery_fleet_predicted_typical": "Previsto por volta de {date} — {months} meses típicos para {type} ({source})",
|
||||
"lifetime_source_default": "valor padrão integrado",
|
||||
"lifetime_source_table": "tabela integrada",
|
||||
"lifetime_source_learned": "aprendido de {n} trocas",
|
||||
"lifetime_source_override": "sua configuração",
|
||||
"lifetime_source_learned_device": "aprendido de {n} trocas deste dispositivo",
|
||||
"lifetime_source_learned_model": "aprendido de {n} trocas em dispositivos deste modelo",
|
||||
"battery_fleet_predicted_trend": "Previsto pela tendência de descarga desta bateria: por volta de {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Recarregável: recarregue em vez de substituir — nunca na lista de compras",
|
||||
"battery_fleet_sort_name": "Ordenar por nome",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Peças usadas",
|
||||
"print_inc_photos": "Fotos",
|
||||
"print_inc_documents": "Documentos vinculados",
|
||||
"print_inc_doc_desc": "Descrições dos documentos",
|
||||
"print_inc_checklist": "Lista de verificação",
|
||||
"print_inc_notes": "Notas",
|
||||
"print_inc_costs": "Custo e duração",
|
||||
"print_inc_person": "Concluído por",
|
||||
"print_inc_refs": "Números de referência",
|
||||
"print_inc_bare": "Conclusões sem detalhes",
|
||||
"print_inc_qr": "Código QR por tarefa",
|
||||
"print_button": "Imprimir",
|
||||
"report_scan_hint": "Escaneie para abrir a tarefa",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Tempo de funcionamento",
|
||||
"runtime_hours": "Duração alvo (horas)",
|
||||
"target_value": "Valor alvo",
|
||||
"baseline": "Linha de base",
|
||||
"target_changes": "Alterações alvo",
|
||||
"for_minutes": "Durante (minutos)",
|
||||
"time_based": "Temporal",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Gerado",
|
||||
"report_times_done": "Feito",
|
||||
"report_total_cost": "Custo total",
|
||||
"report_every": "a cada {n} {unit}",
|
||||
"report_notes": "Notas",
|
||||
"report_col_type": "Tipo",
|
||||
"report_col_status": "Estado",
|
||||
"report_col_schedule": "Agenda",
|
||||
"duration": "Duração",
|
||||
"minutes_short": "min",
|
||||
"both": "Ambos",
|
||||
"trigger_val": "Valor do acionador",
|
||||
"complete_title": "Concluída: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: tipo incorreto (esperado: {type})",
|
||||
"err_invalid_choice": "{field}: valor não permitido",
|
||||
"err_invalid_value": "{field}: valor inválido",
|
||||
"ws_err_not_found": "Não encontrado — pode ter sido eliminado entretanto",
|
||||
"ws_err_invalid_input": "Entrada inválida",
|
||||
"ws_err_invalid_date": "Data inválida",
|
||||
"ws_err_invalid_format": "Formato inválido",
|
||||
"ws_err_invalid_url": "Ligação inválida",
|
||||
"ws_err_not_configured": "Ainda não configurado",
|
||||
"ws_err_not_loaded": "Ainda não carregado — tente novamente daqui a pouco",
|
||||
"ws_err_limit_reached": "Limite atingido",
|
||||
"ws_err_too_many": "Demasiadas entradas",
|
||||
"ws_err_too_large": "Demasiado grande",
|
||||
"ws_err_not_archived": "Não arquivado",
|
||||
"ws_err_invalid_target": "Destino inválido",
|
||||
"ws_err_create_failed": "Não foi possível criar",
|
||||
"ws_err_archived": "Arquivado — restaure primeiro",
|
||||
"ws_err_already_archived": "Já arquivado",
|
||||
"ws_err_unavailable": "Atualmente indisponível",
|
||||
"ws_err_unauthorized": "Não permitido para o seu utilizador",
|
||||
"ws_err_too_many_views": "Demasiadas vistas guardadas",
|
||||
"ws_err_storage_unavailable": "O armazenamento não está disponível",
|
||||
"ws_err_replace_failed": "Falha ao substituir",
|
||||
"ws_err_not_paused": "Não está em pausa",
|
||||
"ws_err_not_available": "Nada disponível",
|
||||
"ws_err_no_url": "Nenhuma ligação indicada",
|
||||
"ws_err_no_phases": "Esta tarefa não tem fases",
|
||||
"ws_err_invalid_view": "Vista inválida",
|
||||
"ws_err_invalid_user": "Utilizador desconhecido",
|
||||
"ws_err_invalid_range": "Intervalo inválido",
|
||||
"ws_err_invalid_parent": "Objeto principal inválido",
|
||||
"ws_err_invalid_device": "Dispositivo desconhecido",
|
||||
"ws_err_empty_csv": "O ficheiro CSV está vazio",
|
||||
"ws_err_empty": "Nada para importar",
|
||||
"ws_err_duplicate_failed": "Não foi possível duplicar",
|
||||
"ws_err_already_paused": "Já está em pausa",
|
||||
"ws_err_invalid_cursor": "Posição de fase inválida",
|
||||
"ws_err_invalid_entity_slug": "Nome de entidade inválido",
|
||||
"ws_err_invalid_trigger_config": "Configuração do acionador inválida",
|
||||
"ws_err_no_defaults": "Sem predefinições para conclusão rápida",
|
||||
"ws_err_self_link_device": "Um objeto não pode ser ligado a si próprio",
|
||||
"ws_err_too_early": "Demasiado cedo — esta tarefa só pode ser concluída mais perto do prazo",
|
||||
"feat_schedule_time": "Agendamento por hora",
|
||||
"feat_schedule_time_desc": "Tarefas vencem em um horário específico em vez de meia-noite.",
|
||||
"schedule_time_toggle": "Vence a uma hora específica",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Acionar quando igual a (=)",
|
||||
"trigger_not_equals": "Acionar quando diferente de (≠)",
|
||||
"for_at_least_minutes": "Durante pelo menos (minutos)",
|
||||
"safety_interval_days": "Intervalo de segurança (dias, opcional)",
|
||||
"safety_interval": "Intervalo de segurança (opcional)",
|
||||
"trigger_combinator": "Combinar acionador e intervalo",
|
||||
"trigger_combinator_any": "Acionador ou intervalo (o primeiro)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "As minhas tarefas",
|
||||
"tab_calendar": "Calendário",
|
||||
"cal_no_events": "Sem manutenção",
|
||||
"cal_window_7": "7 dias",
|
||||
"cal_window_14": "14 dias",
|
||||
"cal_window_30": "30 dias",
|
||||
"cal_window_365": "1 ano",
|
||||
"cal_every_n_days": "a cada {n} dias",
|
||||
"cal_source_time": "Baseado em tempo",
|
||||
"cal_source_time_adaptive": "Baseado em tempo (adaptativo)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Não foi possível gerar o código QR.",
|
||||
"qr_error_no_url": "Nenhum URL do HA configurado. Defina um URL externo ou interno em Definições → Sistema → Rede.",
|
||||
"save_error": "Erro ao guardar. Tente novamente.",
|
||||
"subsave_warning": "Guardado, mas uma definição foi rejeitada: {detail}",
|
||||
"qr_print": "Imprimir",
|
||||
"qr_download": "Transferir SVG",
|
||||
"qr_action": "Ação ao digitalizar",
|
||||
"qr_action_view": "Ver informações de manutenção",
|
||||
"qr_action_complete": "Marcar manutenção como concluída",
|
||||
"qr_url_mode": "Tipo de ligação",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Local (mDNS)",
|
||||
"qr_mode_server": "URL do servidor",
|
||||
"overview": "Visão geral",
|
||||
"analysis": "Análise",
|
||||
"recent_activities": "Atividades recentes",
|
||||
"search_notes": "Pesquisar notas",
|
||||
"avg_cost": "Ø Custo",
|
||||
"no_advanced_features": "Sem funções avançadas ativadas",
|
||||
"no_advanced_features_hint": "Ative “Intervalos Adaptativos” ou “Padrões Sazonais” nas definições da integração para ver dados de análise aqui.",
|
||||
"analysis_not_enough_data": "Ainda não há dados suficientes para a análise.",
|
||||
"analysis_not_enough_data_hint": "A análise Weibull requer pelo menos 5 manutenções concluídas; os padrões sazonais tornam-se visíveis após 6+ pontos de dados por mês.",
|
||||
"analysis_manual_task_hint": "Tarefas manuais sem intervalo não geram dados de análise.",
|
||||
"completions": "conclusões",
|
||||
"current": "Atual",
|
||||
"shorter": "Mais curto",
|
||||
"longer": "Mais longo",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Janelas passadas",
|
||||
"cal_forward_windows": "Janelas futuras",
|
||||
"history_edit_title": "Editar entrada do histórico",
|
||||
"history_delete_entry": "Eliminar entrada",
|
||||
"history_delete_confirm": "Eliminar esta entrada do histórico? A data da última execução recua para a conclusão anterior; as fotos ficam com o objeto e as peças consumidas não são repostas.",
|
||||
"history_edit_timestamp": "Carimbo de data/hora",
|
||||
"manufacturer": "Fabricante",
|
||||
"model": "Modelo",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Dias de aviso predefinidos",
|
||||
"settings_consumable_threshold": "Limiar „consumível baixo“ (%)",
|
||||
"settings_battery_low_percent": "Limiar „pilha fraca“ (%)",
|
||||
"settings_battery_lifetimes": "Durações típicas das pilhas",
|
||||
"settings_battery_lifetimes_hint": "Usado apenas para pilhas sem percentagem: uma nota do Battery Notes só com tipo e data de substituição, ou um sensor que apenas reporta « fraca ». O vencimento é última substituição + esta duração. Pilhas que reportam nível obtêm a previsão da descarga medida. Após três substituições de um tipo, o intervalo mediano substitui o valor integrado — o seu valor ganha sempre.",
|
||||
"settings_battery_lifetime_months": "meses",
|
||||
"settings_battery_lifetime_reset": "Usar predefinição",
|
||||
"settings_battery_lifetime_in_fleet": "na sua frota",
|
||||
"settings_battery_lifetime_learned_models": "Aprendido por modelo: {list}",
|
||||
"settings_thresholds_hint": "Predefinições para novas Configurações sugeridas (percentagem restante) e para pilhas da frota sem limiar Battery Notes próprio. As tarefas existentes mantêm o seu valor.",
|
||||
"settings_value_out_of_range": "O valor tem de estar entre {min} e {max}",
|
||||
"bn_summary": "{name}: {pct} % para {n} pilhas",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} dispositivos com limiar próprio:",
|
||||
"bn_more": "+ {n} mais",
|
||||
"settings_row_actions": "Ações nas linhas de tarefas",
|
||||
"settings_ref_numbers_in_lists": "Números de referência nas listas",
|
||||
"settings_ref_numbers_in_lists_hint": "Mostra as etiquetas #8 / #8.3 antes dos nomes de objetos e tarefas na lista Hoje, na tabela de tarefas, nos cartões de objetos e na tabela de objetos.",
|
||||
"row_actions_buttons_compact": "Botões (só ícones no telemóvel)",
|
||||
"row_actions_buttons": "Botões com texto",
|
||||
"row_actions_icons": "Ícones (clássico)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Duração do adiamento (horas)",
|
||||
"settings_budget": "Orçamento",
|
||||
"settings_currency": "Moeda",
|
||||
"settings_currency_decimals": "Casas decimais dos montantes",
|
||||
"settings_currency_decimals_hint": "Quantas casas decimais cada montante mostra: KPIs, orçamentos, custos em listas e relatórios, alertas de orçamento. 0 = números inteiros.",
|
||||
"settings_budget_monthly": "Orçamento mensal",
|
||||
"settings_budget_yearly": "Orçamento anual",
|
||||
"settings_budget_alerts": "Alertas de orçamento",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Exportar YAML",
|
||||
"settings_export_csv": "Exportar CSV",
|
||||
"settings_export_settings": "Exportar definições (JSON)",
|
||||
"settings_import_csv": "Importar CSV",
|
||||
"settings_import_placeholder": "Cole o conteúdo JSON ou CSV aqui…",
|
||||
"settings_import_btn": "Importar",
|
||||
"settings_import_success": "{count} objetos importados com sucesso.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Ação HA por tarefa ao concluir + QR de conclusão rápida com valores predefinidos.",
|
||||
"on_complete_action_title": "Na conclusão: acionar ação HA (opcional)",
|
||||
"on_complete_action_desc": "Chama um serviço HA quando a tarefa é concluída — p. ex. reiniciar um contador no dispositivo.",
|
||||
"on_complete_action_service": "Serviço",
|
||||
"on_complete_action_target": "Entidade alvo",
|
||||
"on_complete_action_data": "Dados (JSON, opcional)",
|
||||
"on_complete_action_test": "Testar ação",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Escolher fotos",
|
||||
"choose_photo": "Escolher foto",
|
||||
"photos_android_hint": "A app Android entrega uma foto por seleção — cada seleção é adicionada.",
|
||||
"add_photos": "Adicionar fotos",
|
||||
"photos_limit": "Até {max} fotos por conclusão",
|
||||
"history_edit_photos_hint": "Uma foto removida aqui continua nos documentos do objeto.",
|
||||
"uploading": "A enviar…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Transferir",
|
||||
"doc_close": "Fechar",
|
||||
"doc_camera": "Tirar foto",
|
||||
"camera_capture_shoot": "Capturar",
|
||||
"camera_switch_lens": "Mudar de câmara",
|
||||
"doc_drop_hint": "Solte os ficheiros aqui",
|
||||
"doc_task_none": "Nenhum documento associado a esta tarefa.",
|
||||
"doc_link_existing": "Associar um documento…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Regista uma conclusão (define a última realização) quando o gatilho se resolve sozinho — p. ex., sal reabastecido, filtro substituído.",
|
||||
"doc_search": "Pesquisar documentos…",
|
||||
"doc_search_none": "Nenhum documento correspondente",
|
||||
"doc_description": "Descrição (opcional)",
|
||||
"doc_sort": "Ordenar documentos",
|
||||
"doc_sort_newest": "Mais recentes primeiro",
|
||||
"doc_sort_oldest": "Mais antigos primeiro",
|
||||
"doc_sort_title": "Por título (1, 2, 3 …)",
|
||||
"doc_sort_category": "Por categoria",
|
||||
"link_device_optional": "Associar a dispositivo existente (opcional)",
|
||||
"parent_object_optional": "Objeto principal (opcional)",
|
||||
"parent_none": "(Sem objeto principal)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Notificar apenas para a vista",
|
||||
"settings_notify_scope_all": "Todas as tarefas",
|
||||
"settings_notify_scope_hint": "Apenas as tarefas que correspondem aos filtros de etiqueta/utilizador da vista escolhida enviam lembretes. O estado, a ordenação e o agrupamento da vista são ignorados aqui.",
|
||||
"settings_notify_completed": "Notificações de conclusão",
|
||||
"settings_notify_completed_hint": "Aviso para a casa quando uma tarefa é concluída, com o motivo e quem a fez. \"Só automáticas\" anuncia apenas as conclusões que ninguém fez no local: recuperação do sensor, item marcado na lista de compras, chamada de serviço de uma automação. Só para o serviço da casa; horas de silêncio e limite diário aplicam-se.",
|
||||
"notify_completed_off": "Desligado",
|
||||
"notify_completed_automatic": "Só conclusões automáticas",
|
||||
"notify_completed_all": "Todas as conclusões",
|
||||
"settings_notify_rule": "A sua regra de notificação",
|
||||
"settings_notify_rule_hint": "Cada notificação dispara também o evento maintenance_supporter_notification (tipo, estado, objeto, tarefa, números de referência, prioridade, ligação, conteúdo). Encaminhe-o com uma automação — p. ex. para o Ticker, Telegram ou Pushover.",
|
||||
"settings_notify_event_only": "Apenas disparar o evento, não enviar nada",
|
||||
"settings_notify_event_only_hint": "A sua automação trata de toda a entrega. Intervalos de repetição, horas de silêncio e o limite diário continuam a decidir quando o evento dispara.",
|
||||
"settings_notify_extra_data": "Dados de notificação adicionais (modelo)",
|
||||
"settings_notify_extra_data_hint": "JSON ou YAML, Jinja permitido; é fundido nos data da chamada notify (as suas chaves ganham). Variáveis: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Teste com o botão Enviar teste.",
|
||||
"settings_notify_extra_data_hint": "JSON ou YAML, Jinja permitido; é fundido nos data da chamada notify (as suas chaves ganham). Variáveis: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Teste com o botão Enviar teste.",
|
||||
"card_saved_view": "Vista guardada",
|
||||
"card_saved_view_none": "Nenhuma",
|
||||
"card_saved_view_help": "Aplica os filtros de estado, utilizador e etiqueta da vista além dos filtros acima. A ordenação e o agrupamento da vista são definições de apresentação do painel e não se aplicam ao cartão.",
|
||||
"panel_card_tab": "Abrir no separador",
|
||||
"panel_card_tab_default": "Separador memorizado (como no painel)",
|
||||
"panel_card_view": "Abrir com a vista guardada",
|
||||
"panel_card_height": "Altura",
|
||||
"panel_card_height_help": "Vazio = preenche o ecrã abaixo do cartão (vista painel). Caso contrário, um comprimento CSS como 600px ou 80vh para vistas com outros cartões.",
|
||||
"panel_card_not_registered": "O painel Maintenance Supporter não está disponível — a integração está configurada?",
|
||||
"panel_card_load_failed": "Não foi possível carregar o painel Maintenance Supporter — recarregue a página (após uma atualização: limpe a cache do browser).",
|
||||
"doc_part_none": "Nenhum documento associado a esta peça.",
|
||||
"settings_templates_toggle_group": "Ativar ou desativar todos os modelos deste grupo",
|
||||
"setups_button": "Configurações sugeridas",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "Em bom estado",
|
||||
"battery_fleet_status_due": "A substituir",
|
||||
"battery_fleet_predicted_on": "Previsto por volta de {date}",
|
||||
"battery_fleet_predicted_typical": "Previsto por volta de {date} — {months} meses típicos para {type} ({source})",
|
||||
"lifetime_source_default": "valor predefinido integrado",
|
||||
"lifetime_source_table": "tabela integrada",
|
||||
"lifetime_source_learned": "aprendido de {n} substituições",
|
||||
"lifetime_source_override": "a sua definição",
|
||||
"lifetime_source_learned_device": "aprendido de {n} substituições deste dispositivo",
|
||||
"lifetime_source_learned_model": "aprendido de {n} substituições em dispositivos deste modelo",
|
||||
"battery_fleet_predicted_trend": "Previsto pela tendência de descarga desta pilha: por volta de {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Recarregável: carrega-se em vez de se substituir — nunca na lista de compras",
|
||||
"battery_fleet_sort_name": "Ordenar por nome",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Peças usadas",
|
||||
"print_inc_photos": "Fotografias",
|
||||
"print_inc_documents": "Documentos associados",
|
||||
"print_inc_doc_desc": "Descrições dos documentos",
|
||||
"print_inc_checklist": "Lista de verificação",
|
||||
"print_inc_notes": "Notas",
|
||||
"print_inc_costs": "Custo e duração",
|
||||
"print_inc_person": "Concluído por",
|
||||
"print_inc_refs": "Números de referência",
|
||||
"print_inc_bare": "Conclusões sem detalhes",
|
||||
"print_inc_qr": "Código QR por tarefa",
|
||||
"print_button": "Imprimir",
|
||||
"report_scan_hint": "Digitalize para abrir a tarefa",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Время работы",
|
||||
"runtime_hours": "Целевое время работы (часы)",
|
||||
"target_value": "Целевое значение",
|
||||
"baseline": "Базовое значение",
|
||||
"target_changes": "Целевые изменения",
|
||||
"for_minutes": "На (минут)",
|
||||
"time_based": "По времени",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Создан",
|
||||
"report_times_done": "Выполнено",
|
||||
"report_total_cost": "Итого",
|
||||
"report_every": "каждые {n} {unit}",
|
||||
"report_notes": "Заметки",
|
||||
"report_col_type": "Тип",
|
||||
"report_col_status": "Статус",
|
||||
"report_col_schedule": "Расписание",
|
||||
"duration": "Длительность",
|
||||
"minutes_short": "мин",
|
||||
"both": "Оба",
|
||||
"trigger_val": "Значение триггера",
|
||||
"complete_title": "Выполнить: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: неверный тип (ожидался: {type})",
|
||||
"err_invalid_choice": "{field}: недопустимое значение",
|
||||
"err_invalid_value": "{field}: неверное значение",
|
||||
"ws_err_not_found": "Не найдено — возможно, уже удалено",
|
||||
"ws_err_invalid_input": "Недопустимый ввод",
|
||||
"ws_err_invalid_date": "Недопустимая дата",
|
||||
"ws_err_invalid_format": "Недопустимый формат",
|
||||
"ws_err_invalid_url": "Недопустимая ссылка",
|
||||
"ws_err_not_configured": "Ещё не настроено",
|
||||
"ws_err_not_loaded": "Ещё не загружено — попробуйте чуть позже",
|
||||
"ws_err_limit_reached": "Достигнут предел",
|
||||
"ws_err_too_many": "Слишком много записей",
|
||||
"ws_err_too_large": "Слишком большой размер",
|
||||
"ws_err_not_archived": "Не в архиве",
|
||||
"ws_err_invalid_target": "Недопустимая цель",
|
||||
"ws_err_create_failed": "Не удалось создать",
|
||||
"ws_err_archived": "В архиве — сначала восстановите",
|
||||
"ws_err_already_archived": "Уже в архиве",
|
||||
"ws_err_unavailable": "Сейчас недоступно",
|
||||
"ws_err_unauthorized": "Недоступно для вашего пользователя",
|
||||
"ws_err_too_many_views": "Слишком много сохранённых представлений",
|
||||
"ws_err_storage_unavailable": "Хранилище недоступно",
|
||||
"ws_err_replace_failed": "Не удалось заменить",
|
||||
"ws_err_not_paused": "Не на паузе",
|
||||
"ws_err_not_available": "Ничего нет",
|
||||
"ws_err_no_url": "Ссылка не указана",
|
||||
"ws_err_no_phases": "У этой задачи нет фаз",
|
||||
"ws_err_invalid_view": "Недопустимое представление",
|
||||
"ws_err_invalid_user": "Неизвестный пользователь",
|
||||
"ws_err_invalid_range": "Недопустимый диапазон",
|
||||
"ws_err_invalid_parent": "Недопустимый родительский объект",
|
||||
"ws_err_invalid_device": "Неизвестное устройство",
|
||||
"ws_err_empty_csv": "CSV-файл пуст",
|
||||
"ws_err_empty": "Нечего импортировать",
|
||||
"ws_err_duplicate_failed": "Не удалось дублировать",
|
||||
"ws_err_already_paused": "Уже на паузе",
|
||||
"ws_err_invalid_cursor": "Недопустимая позиция фазы",
|
||||
"ws_err_invalid_entity_slug": "Недопустимое имя сущности",
|
||||
"ws_err_invalid_trigger_config": "Недопустимая настройка триггера",
|
||||
"ws_err_no_defaults": "Не заданы значения по умолчанию для быстрого завершения",
|
||||
"ws_err_self_link_device": "Объект нельзя связать с самим собой",
|
||||
"ws_err_too_early": "Слишком рано — эту задачу можно завершить только ближе к сроку",
|
||||
"feat_schedule_time": "Планирование по времени дня",
|
||||
"feat_schedule_time_desc": "Задачи становятся просроченными в определённое время дня, а не в полночь.",
|
||||
"schedule_time_toggle": "Срок в определённое время",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Срабатывать при равенстве (=)",
|
||||
"trigger_not_equals": "Срабатывать при отличии от (≠)",
|
||||
"for_at_least_minutes": "Не менее (минут)",
|
||||
"safety_interval_days": "Интервал безопасности (дни, опционально)",
|
||||
"safety_interval": "Интервал безопасности (опционально)",
|
||||
"trigger_combinator": "Совместить триггер и интервал",
|
||||
"trigger_combinator_any": "Триггер или интервал (что раньше)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Мои задачи",
|
||||
"tab_calendar": "Календарь",
|
||||
"cal_no_events": "Без обслуживания",
|
||||
"cal_window_7": "7 дней",
|
||||
"cal_window_14": "14 дней",
|
||||
"cal_window_30": "30 дней",
|
||||
"cal_window_365": "1 год",
|
||||
"cal_every_n_days": "каждые {n} дней",
|
||||
"cal_source_time": "По времени",
|
||||
"cal_source_time_adaptive": "По времени (адаптивно)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Не удалось сгенерировать QR-код.",
|
||||
"qr_error_no_url": "URL HA не настроен. Установите внешний или внутренний URL в Настройках → Система → Сеть.",
|
||||
"save_error": "Не удалось сохранить. Попробуйте ещё раз.",
|
||||
"subsave_warning": "Сохранено, но одна настройка отклонена: {detail}",
|
||||
"qr_print": "Печать",
|
||||
"qr_download": "Скачать SVG",
|
||||
"qr_action": "Действие при сканировании",
|
||||
"qr_action_view": "Просмотр",
|
||||
"qr_action_complete": "Отметить обслуживание как выполненное",
|
||||
"qr_url_mode": "Тип ссылки",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Локальный (mDNS)",
|
||||
"qr_mode_server": "URL сервера",
|
||||
"overview": "Обзор",
|
||||
"analysis": "Анализ",
|
||||
"recent_activities": "Недавние действия",
|
||||
"search_notes": "Поиск по заметкам",
|
||||
"avg_cost": "Ср. стоимость",
|
||||
"no_advanced_features": "Расширенные функции не включены",
|
||||
"no_advanced_features_hint": "Включите «Адаптивные интервалы» или «Сезонные паттерны» в настройках интеграции, чтобы увидеть здесь аналитику.",
|
||||
"analysis_not_enough_data": "Недостаточно данных для анализа.",
|
||||
"analysis_not_enough_data_hint": "Для анализа Вейбулла требуется минимум 5 выполненных обслуживаний; сезонные паттерны становятся видны после 6+ точек данных в месяц.",
|
||||
"analysis_manual_task_hint": "Ручные задачи без интервала не генерируют аналитику.",
|
||||
"completions": "выполнений",
|
||||
"current": "Текущий",
|
||||
"shorter": "Короче",
|
||||
"longer": "Длиннее",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Прошлые окна",
|
||||
"cal_forward_windows": "Будущие окна",
|
||||
"history_edit_title": "Редактировать запись истории",
|
||||
"history_delete_entry": "Удалить запись",
|
||||
"history_delete_confirm": "Удалить эту запись истории? Дата последнего выполнения вернётся к предыдущему; фотографии останутся у объекта, а израсходованные детали не будут возвращены на склад.",
|
||||
"history_edit_timestamp": "Метка времени",
|
||||
"manufacturer": "Производитель",
|
||||
"model": "Модель",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Дни предупреждения по умолчанию",
|
||||
"settings_consumable_threshold": "Порог «расходник заканчивается» (%)",
|
||||
"settings_battery_low_percent": "Порог «батарея разряжена» (%)",
|
||||
"settings_battery_lifetimes": "Типичный срок службы батарей",
|
||||
"settings_battery_lifetimes_hint": "Используется только для батарей без процента: заметка Battery Notes лишь с типом и датой замены или датчик, сообщающий только «низкий». Срок = последняя замена + этот срок службы. Для батарей с уровнем прогноз строится по измеренному разряду. После трёх замен одного типа медианный интервал заменяет встроенное значение — ваше значение всегда главнее.",
|
||||
"settings_battery_lifetime_months": "мес.",
|
||||
"settings_battery_lifetime_reset": "По умолчанию",
|
||||
"settings_battery_lifetime_in_fleet": "в вашем парке",
|
||||
"settings_battery_lifetime_learned_models": "Изучено по моделям: {list}",
|
||||
"settings_thresholds_hint": "Значения по умолчанию для новых «Предлагаемых настроек» (остаток в процентах) и для батарей парка без собственного порога Battery Notes. Существующие задачи сохраняют своё значение.",
|
||||
"settings_value_out_of_range": "Значение должно быть от {min} до {max}",
|
||||
"bn_summary": "{name}: {pct} % для {n} батарей",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} устройств с собственным порогом:",
|
||||
"bn_more": "+ ещё {n}",
|
||||
"settings_row_actions": "Действия в строках задач",
|
||||
"settings_ref_numbers_in_lists": "Номера ссылок в списках",
|
||||
"settings_ref_numbers_in_lists_hint": "Показывать метки #8 / #8.3 перед названиями объектов и задач в списке «Сегодня», таблице задач, карточках объектов и таблице объектов.",
|
||||
"row_actions_buttons_compact": "Кнопки (на телефоне только значки)",
|
||||
"row_actions_buttons": "Кнопки с текстом",
|
||||
"row_actions_icons": "Значки (классический вид)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Длительность откладывания (часы)",
|
||||
"settings_budget": "Бюджет",
|
||||
"settings_currency": "Валюта",
|
||||
"settings_currency_decimals": "Знаков после запятой в суммах",
|
||||
"settings_currency_decimals_hint": "Сколько знаков после запятой показывает каждая сумма: KPI, бюджеты, расходы в списках и отчётах, оповещения о бюджете. 0 = целые числа.",
|
||||
"settings_budget_monthly": "Месячный бюджет",
|
||||
"settings_budget_yearly": "Годовой бюджет",
|
||||
"settings_budget_alerts": "Оповещения о бюджете",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Экспорт YAML",
|
||||
"settings_export_csv": "Экспорт CSV",
|
||||
"settings_export_settings": "Экспорт настроек (JSON)",
|
||||
"settings_import_csv": "Импорт CSV",
|
||||
"settings_import_placeholder": "Вставьте содержимое JSON или CSV здесь…",
|
||||
"settings_import_btn": "Импортировать",
|
||||
"settings_import_success": "Импортировано объектов: {count}.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "HA-действие по задаче при завершении + QR быстрого завершения с предустановленными значениями.",
|
||||
"on_complete_action_title": "При завершении: запустить HA-действие (опционально)",
|
||||
"on_complete_action_desc": "Вызывает HA-сервис при завершении задачи — напр., сбросить счётчик на устройстве.",
|
||||
"on_complete_action_service": "Сервис",
|
||||
"on_complete_action_target": "Целевая сущность",
|
||||
"on_complete_action_data": "Данные (JSON, опционально)",
|
||||
"on_complete_action_test": "Тестировать действие",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Выбрать фото",
|
||||
"choose_photo": "Выбрать фото",
|
||||
"photos_android_hint": "Приложение для Android передаёт по одному фото за выбор — каждый выбор добавляется.",
|
||||
"add_photos": "Добавить фото",
|
||||
"photos_limit": "До {max} фото на одно выполнение",
|
||||
"history_edit_photos_hint": "Удалённое здесь фото остаётся в документах объекта.",
|
||||
"uploading": "Загрузка…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Скачать",
|
||||
"doc_close": "Закрыть",
|
||||
"doc_camera": "Сделать фото",
|
||||
"camera_capture_shoot": "Снять",
|
||||
"camera_switch_lens": "Сменить камеру",
|
||||
"doc_drop_hint": "Перетащите файлы сюда",
|
||||
"doc_task_none": "Нет документов, связанных с этой задачей.",
|
||||
"doc_link_existing": "Связать документ…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Записывает выполнение (обновляет дату последнего обслуживания), когда триггер устраняется сам — например, соль досыпана, фильтр заменён.",
|
||||
"doc_search": "Поиск документов…",
|
||||
"doc_search_none": "Нет подходящих документов",
|
||||
"doc_description": "Описание (необязательно)",
|
||||
"doc_sort": "Сортировать документы",
|
||||
"doc_sort_newest": "Сначала новые",
|
||||
"doc_sort_oldest": "Сначала старые",
|
||||
"doc_sort_title": "По названию (1, 2, 3 …)",
|
||||
"doc_sort_category": "По категории",
|
||||
"link_device_optional": "Привязать к существующему устройству (необязательно)",
|
||||
"parent_object_optional": "Родительский объект (необязательно)",
|
||||
"parent_none": "(Без родителя)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Уведомлять только для представления",
|
||||
"settings_notify_scope_all": "Все задачи",
|
||||
"settings_notify_scope_hint": "Напоминания отправляют только задачи, совпадающие с фильтрами метки/пользователя выбранного представления. Статус, сортировка и группировка представления здесь игнорируются.",
|
||||
"settings_notify_completed": "Уведомления о выполнении",
|
||||
"settings_notify_completed_hint": "Сообщение для всех домашних, когда задача выполнена, с причиной и исполнителем. «Только автоматические» сообщает лишь о выполнениях, которые никто не делал на месте: восстановление датчика, отметка в списке покупок, вызов службы автоматизацией. Только на общий сервис; тихие часы и дневной лимит действуют.",
|
||||
"notify_completed_off": "Выкл.",
|
||||
"notify_completed_automatic": "Только автоматические выполнения",
|
||||
"notify_completed_all": "Все выполнения",
|
||||
"settings_notify_rule": "Своё правило уведомлений",
|
||||
"settings_notify_rule_hint": "Каждое уведомление дополнительно вызывает событие maintenance_supporter_notification (вид, статус, объект, задача, номера ссылок, приоритет, ссылка, данные). Направьте его автоматизацией — например в Ticker, Telegram или Pushover.",
|
||||
"settings_notify_event_only": "Только событие, ничего не отправлять",
|
||||
"settings_notify_event_only_hint": "Доставку целиком выполняет ваша автоматизация. Интервалы повтора, тихие часы и дневной лимит по-прежнему определяют, когда срабатывает событие.",
|
||||
"settings_notify_extra_data": "Дополнительные данные уведомления (шаблон)",
|
||||
"settings_notify_extra_data_hint": "JSON или YAML, Jinja разрешён; добавляется в data вызова notify (ваши ключи важнее). Переменные: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Проверьте кнопкой «Отправить тест».",
|
||||
"settings_notify_extra_data_hint": "JSON или YAML, Jinja разрешён; добавляется в data вызова notify (ваши ключи важнее). Переменные: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Проверьте кнопкой «Отправить тест».",
|
||||
"card_saved_view": "Сохранённое представление",
|
||||
"card_saved_view_none": "Нет",
|
||||
"card_saved_view_help": "Применяет фильтры статуса, пользователя и метки представления в дополнение к фильтрам выше. Сортировка и группировка представления — настройки отображения панели и на карточке не применяются.",
|
||||
"panel_card_tab": "Открывать на вкладке",
|
||||
"panel_card_tab_default": "Запомненная вкладка (как в панели)",
|
||||
"panel_card_view": "Открывать с сохранённым видом",
|
||||
"panel_card_height": "Высота",
|
||||
"panel_card_height_help": "Пусто = заполнить экран под карточкой (вид «панель»). Иначе длина CSS, например 600px или 80vh, для видов с другими карточками.",
|
||||
"panel_card_not_registered": "Панель Maintenance Supporter недоступна — интеграция настроена?",
|
||||
"panel_card_load_failed": "Не удалось загрузить панель Maintenance Supporter — перезагрузите страницу (после обновления очистите кэш браузера).",
|
||||
"doc_part_none": "К этой запчасти не привязаны документы.",
|
||||
"settings_templates_toggle_group": "Включить или выключить все шаблоны этой группы",
|
||||
"setups_button": "Предлагаемые настройки",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "В норме",
|
||||
"battery_fleet_status_due": "Пора менять",
|
||||
"battery_fleet_predicted_on": "Ожидается примерно {date}",
|
||||
"battery_fleet_predicted_typical": "Ожидается около {date} — {months} мес. типично для {type} ({source})",
|
||||
"lifetime_source_default": "встроенное значение по умолчанию",
|
||||
"lifetime_source_table": "встроенная таблица",
|
||||
"lifetime_source_learned": "по {n} заменам",
|
||||
"lifetime_source_override": "ваша настройка",
|
||||
"lifetime_source_learned_device": "по {n} заменам этого устройства",
|
||||
"lifetime_source_learned_model": "по {n} заменам на устройствах этой модели",
|
||||
"battery_fleet_predicted_trend": "Прогноз по тренду разряда этой батареи: примерно {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Аккумулятор: заряжается, а не заменяется — никогда не попадает в список покупок",
|
||||
"battery_fleet_sort_name": "Сортировать по имени",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Использованные детали",
|
||||
"print_inc_photos": "Фото",
|
||||
"print_inc_documents": "Связанные документы",
|
||||
"print_inc_doc_desc": "Описания документов",
|
||||
"print_inc_checklist": "Чек-лист",
|
||||
"print_inc_notes": "Заметки",
|
||||
"print_inc_costs": "Стоимость и длительность",
|
||||
"print_inc_person": "Выполнил",
|
||||
"print_inc_refs": "Номера ссылок",
|
||||
"print_inc_bare": "Выполнения без подробностей",
|
||||
"print_inc_qr": "QR-код для каждой задачи",
|
||||
"print_button": "Печать",
|
||||
"report_scan_hint": "Отсканируйте, чтобы открыть задачу",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Körtid",
|
||||
"runtime_hours": "Måltid (timmar)",
|
||||
"target_value": "Målvärde",
|
||||
"baseline": "Baslinje",
|
||||
"target_changes": "Antal målförändringar",
|
||||
"for_minutes": "Under (minuter)",
|
||||
"time_based": "Tidsbaserad",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Genererad",
|
||||
"report_times_done": "Utfört",
|
||||
"report_total_cost": "Total kostnad",
|
||||
"report_every": "var {n}:e {unit}",
|
||||
"report_notes": "Anteckningar",
|
||||
"report_col_type": "Typ",
|
||||
"report_col_status": "Status",
|
||||
"report_col_schedule": "Schema",
|
||||
"duration": "Varaktighet",
|
||||
"minutes_short": "min",
|
||||
"both": "Båda",
|
||||
"trigger_val": "Utlösarvärde",
|
||||
"complete_title": "Slutför: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: fel typ (förväntad: {type})",
|
||||
"err_invalid_choice": "{field}: ej tillåtet värde",
|
||||
"err_invalid_value": "{field}: ogiltigt värde",
|
||||
"ws_err_not_found": "Hittades inte — det kan ha tagits bort under tiden",
|
||||
"ws_err_invalid_input": "Ogiltig inmatning",
|
||||
"ws_err_invalid_date": "Ogiltigt datum",
|
||||
"ws_err_invalid_format": "Ogiltigt format",
|
||||
"ws_err_invalid_url": "Ogiltig länk",
|
||||
"ws_err_not_configured": "Inte inställt ännu",
|
||||
"ws_err_not_loaded": "Inte inläst ännu — försök igen om en stund",
|
||||
"ws_err_limit_reached": "Gränsen nådd",
|
||||
"ws_err_too_many": "För många poster",
|
||||
"ws_err_too_large": "För stort",
|
||||
"ws_err_not_archived": "Inte arkiverad",
|
||||
"ws_err_invalid_target": "Ogiltigt mål",
|
||||
"ws_err_create_failed": "Kunde inte skapas",
|
||||
"ws_err_archived": "Arkiverad — återställ först",
|
||||
"ws_err_already_archived": "Redan arkiverad",
|
||||
"ws_err_unavailable": "För närvarande otillgänglig",
|
||||
"ws_err_unauthorized": "Inte tillåtet för din användare",
|
||||
"ws_err_too_many_views": "För många sparade vyer",
|
||||
"ws_err_storage_unavailable": "Lagringen är inte tillgänglig",
|
||||
"ws_err_replace_failed": "Ersättningen misslyckades",
|
||||
"ws_err_not_paused": "Inte pausad",
|
||||
"ws_err_not_available": "Inget tillgängligt",
|
||||
"ws_err_no_url": "Ingen länk angiven",
|
||||
"ws_err_no_phases": "Uppgiften har inga faser",
|
||||
"ws_err_invalid_view": "Ogiltig vy",
|
||||
"ws_err_invalid_user": "Okänd användare",
|
||||
"ws_err_invalid_range": "Ogiltigt intervall",
|
||||
"ws_err_invalid_parent": "Ogiltigt överordnat objekt",
|
||||
"ws_err_invalid_device": "Okänd enhet",
|
||||
"ws_err_empty_csv": "CSV-filen är tom",
|
||||
"ws_err_empty": "Inget att importera",
|
||||
"ws_err_duplicate_failed": "Kunde inte dupliceras",
|
||||
"ws_err_already_paused": "Redan pausad",
|
||||
"ws_err_invalid_cursor": "Ogiltig fasposition",
|
||||
"ws_err_invalid_entity_slug": "Ogiltigt entitetsnamn",
|
||||
"ws_err_invalid_trigger_config": "Ogiltig utlösarkonfiguration",
|
||||
"ws_err_no_defaults": "Inga standardvärden för snabbslutförande",
|
||||
"ws_err_self_link_device": "Ett objekt kan inte länkas till sig självt",
|
||||
"ws_err_too_early": "För tidigt — uppgiften kan bara slutföras närmare förfallodatumet",
|
||||
"feat_schedule_time": "Schemaläggning per tid på dygnet",
|
||||
"feat_schedule_time_desc": "Uppgifter blir försenade vid en specifik tid på dygnet istället för midnatt.",
|
||||
"schedule_time_toggle": "Förfaller vid en viss tid",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Utlös vid lika med (=)",
|
||||
"trigger_not_equals": "Utlös vid skilt från (≠)",
|
||||
"for_at_least_minutes": "Under minst (minuter)",
|
||||
"safety_interval_days": "Säkerhetsintervall (dagar, valfritt)",
|
||||
"safety_interval": "Säkerhetsintervall (valfritt)",
|
||||
"trigger_combinator": "Kombinera utlösare och intervall",
|
||||
"trigger_combinator_any": "Utlösare eller intervall (först uppfylld)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Mina uppgifter",
|
||||
"tab_calendar": "Kalender",
|
||||
"cal_no_events": "Inget underhåll",
|
||||
"cal_window_7": "7 dagar",
|
||||
"cal_window_14": "14 dagar",
|
||||
"cal_window_30": "30 dagar",
|
||||
"cal_window_365": "1 år",
|
||||
"cal_every_n_days": "var {n} dag",
|
||||
"cal_source_time": "Tidsbaserad",
|
||||
"cal_source_time_adaptive": "Tidsbaserad (adaptiv)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Kunde inte generera QR-kod.",
|
||||
"qr_error_no_url": "Ingen HA-URL konfigurerad. Ange en extern eller intern URL i Inställningar → System → Nätverk.",
|
||||
"save_error": "Kunde inte spara. Försök igen.",
|
||||
"subsave_warning": "Sparat, men en inställning avvisades: {detail}",
|
||||
"qr_print": "Skriv ut",
|
||||
"qr_download": "Ladda ner SVG",
|
||||
"qr_action": "Åtgärd vid skanning",
|
||||
"qr_action_view": "Visa underhållsinformation",
|
||||
"qr_action_complete": "Markera underhåll som slutfört",
|
||||
"qr_url_mode": "Länktyp",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Lokal (mDNS)",
|
||||
"qr_mode_server": "Server-URL",
|
||||
"overview": "Översikt",
|
||||
"analysis": "Analys",
|
||||
"recent_activities": "Senaste aktiviteter",
|
||||
"search_notes": "Sök i anteckningar",
|
||||
"avg_cost": "Snittlig kostnad",
|
||||
"no_advanced_features": "Inga avancerade funktioner aktiverade",
|
||||
"no_advanced_features_hint": "Aktivera „Adaptiva intervall” eller „Säsongsmönster” i integrationsinställningar för att se analysdata här.",
|
||||
"analysis_not_enough_data": "Inte tillräckligt med data för analys ännu.",
|
||||
"analysis_not_enough_data_hint": "Weibull-analys kräver minst 5 slutförda underhåll; säsongsmönster blir synliga efter 6+ datapunkter per månad.",
|
||||
"analysis_manual_task_hint": "Manuella uppgifter utan intervall genererar inte analysdata.",
|
||||
"completions": "slutföranden",
|
||||
"current": "Aktuell",
|
||||
"shorter": "Kortare",
|
||||
"longer": "Längre",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Tidigare fönster",
|
||||
"cal_forward_windows": "Kommande fönster",
|
||||
"history_edit_title": "Redigera historikpost",
|
||||
"history_delete_entry": "Ta bort post",
|
||||
"history_delete_confirm": "Ta bort den här historikposten? Datumet för senaste utförande faller tillbaka till det föregående; foton stannar hos objektet och förbrukade delar läggs inte tillbaka i lager.",
|
||||
"history_edit_timestamp": "Tidsstämpel",
|
||||
"manufacturer": "Tillverkare",
|
||||
"model": "Modell",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Standard varningsdagar",
|
||||
"settings_consumable_threshold": "Tröskel „förbrukningsartikel låg“ (%)",
|
||||
"settings_battery_low_percent": "Tröskel „batteri lågt“ (%)",
|
||||
"settings_battery_lifetimes": "Typiska batterilivslängder",
|
||||
"settings_battery_lifetimes_hint": "Används bara för batterier utan procent: en Battery Notes-anteckning med bara typ och bytesdatum, eller en sensor som bara rapporterar ”lågt”. Deras förfallodatum är senaste byte + denna livslängd. Batterier som rapporterar nivå får sin prognos från den uppmätta urladdningen. När flottan sett tre byten av en typ tar medianintervallet över från det inbyggda värdet — ditt eget värde vinner alltid.",
|
||||
"settings_battery_lifetime_months": "månader",
|
||||
"settings_battery_lifetime_reset": "Använd standard",
|
||||
"settings_battery_lifetime_in_fleet": "i din flotta",
|
||||
"settings_battery_lifetime_learned_models": "Inlärt per modell: {list}",
|
||||
"settings_thresholds_hint": "Standardvärden för nya Föreslagna inställningar (återstående procent) och för flottans batterier utan egen Battery Notes-tröskel. Befintliga uppgifter behåller sitt värde.",
|
||||
"settings_value_out_of_range": "Värdet måste vara mellan {min} och {max}",
|
||||
"bn_summary": "{name}: {pct} % för {n} batterier",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} enheter med egen tröskel:",
|
||||
"bn_more": "+ {n} till",
|
||||
"settings_row_actions": "Åtgärder i uppgiftsrader",
|
||||
"settings_ref_numbers_in_lists": "Referensnummer i listor",
|
||||
"settings_ref_numbers_in_lists_hint": "Visar brickorna #8 / #8.3 före objekt- och uppgiftsnamn i Idag-listan, uppgiftstabellen, objektkorten och objekttabellen.",
|
||||
"row_actions_buttons_compact": "Knappar (endast ikoner på mobilen)",
|
||||
"row_actions_buttons": "Knappar med text",
|
||||
"row_actions_icons": "Ikoner (klassiskt)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Snooza-tid (timmar)",
|
||||
"settings_budget": "Budget",
|
||||
"settings_currency": "Valuta",
|
||||
"settings_currency_decimals": "Decimaler för belopp",
|
||||
"settings_currency_decimals_hint": "Hur många decimaler varje belopp visar: nyckeltal, budgetar, kostnader i listor och rapporter, budgetvarningar. 0 = hela tal.",
|
||||
"settings_budget_monthly": "Månatlig budget",
|
||||
"settings_budget_yearly": "Årlig budget",
|
||||
"settings_budget_alerts": "Budgetvarningar",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Exportera YAML",
|
||||
"settings_export_csv": "Exportera CSV",
|
||||
"settings_export_settings": "Exportera inställningar (JSON)",
|
||||
"settings_import_csv": "Importera CSV",
|
||||
"settings_import_placeholder": "Klistra in JSON- eller CSV-innehåll här…",
|
||||
"settings_import_btn": "Importera",
|
||||
"settings_import_success": "{count} objekt importerade.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "HA-åtgärd per uppgift vid slutförande + snabb-slutför-QR med förinställda värden.",
|
||||
"on_complete_action_title": "Vid slutförande: utlös HA-åtgärd (valfritt)",
|
||||
"on_complete_action_desc": "Anropar en HA-tjänst när uppgiften slutförs — t.ex. återställ en räknare på enheten.",
|
||||
"on_complete_action_service": "Tjänst",
|
||||
"on_complete_action_target": "Målentitet",
|
||||
"on_complete_action_data": "Data (JSON, valfritt)",
|
||||
"on_complete_action_test": "Testa åtgärd",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Välj foton",
|
||||
"choose_photo": "Välj foto",
|
||||
"photos_android_hint": "Android-appen lämnar över ett foto per val — varje val läggs till.",
|
||||
"add_photos": "Lägg till foton",
|
||||
"photos_limit": "Högst {max} foton per slutförande",
|
||||
"history_edit_photos_hint": "Ett foto som tas bort här finns kvar bland objektets dokument.",
|
||||
"uploading": "Laddar upp…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Ladda ner",
|
||||
"doc_close": "Stäng",
|
||||
"doc_camera": "Ta foto",
|
||||
"camera_capture_shoot": "Ta bild",
|
||||
"camera_switch_lens": "Byt kamera",
|
||||
"doc_drop_hint": "Släpp filer här",
|
||||
"doc_task_none": "Inga dokument kopplade till denna uppgift.",
|
||||
"doc_link_existing": "Koppla ett dokument…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Registrerar ett slutförande (sätter senast utförd) när utlösaren löser sig själv — t.ex. salt påfyllt, filter bytt.",
|
||||
"doc_search": "Sök dokument…",
|
||||
"doc_search_none": "Inga matchande dokument",
|
||||
"doc_description": "Beskrivning (valfritt)",
|
||||
"doc_sort": "Sortera dokument",
|
||||
"doc_sort_newest": "Nyaste först",
|
||||
"doc_sort_oldest": "Äldsta först",
|
||||
"doc_sort_title": "Efter titel (1, 2, 3 …)",
|
||||
"doc_sort_category": "Efter kategori",
|
||||
"link_device_optional": "Länka till befintlig enhet (valfritt)",
|
||||
"parent_object_optional": "Överordnat objekt (valfritt)",
|
||||
"parent_none": "(Inget överordnat)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Avisera endast för vy",
|
||||
"settings_notify_scope_all": "Alla uppgifter",
|
||||
"settings_notify_scope_hint": "Endast uppgifter som matchar den valda vyns etikett-/användarfilter skickar påminnelser. Vyns status, sortering och gruppering ignoreras här.",
|
||||
"settings_notify_completed": "Aviseringar om slutförande",
|
||||
"settings_notify_completed_hint": "Ett meddelande till hushållet när en uppgift slutförts, med orsak och vem som gjorde det. \"Endast automatiska\" meddelar bara slutföranden som ingen gjorde på plats: sensoråterhämtning, avbockning i inköpslistan, ett tjänsteanrop från en automation. Bara till hushållstjänsten; tysta timmar och dagsgränsen gäller.",
|
||||
"notify_completed_off": "Av",
|
||||
"notify_completed_automatic": "Endast automatiska slutföranden",
|
||||
"notify_completed_all": "Alla slutföranden",
|
||||
"settings_notify_rule": "Din egen aviseringsregel",
|
||||
"settings_notify_rule_hint": "Varje avisering utlöser även händelsen maintenance_supporter_notification (typ, status, objekt, uppgift, referensnummer, prioritet, länk, nyttolast). Styr den med en automation — t.ex. till Ticker, Telegram eller Pushover.",
|
||||
"settings_notify_event_only": "Utlös bara händelsen, skicka inget själv",
|
||||
"settings_notify_event_only_hint": "Din automation sköter hela leveransen. Upprepningsintervall, tysta timmar och dagstaket avgör fortfarande när händelsen utlöses.",
|
||||
"settings_notify_extra_data": "Extra aviseringsdata (mall)",
|
||||
"settings_notify_extra_data_hint": "JSON eller YAML, Jinja tillåtet; slås ihop med notify-anropets data (dina nycklar vinner). Variabler: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Testa med knappen Skicka test.",
|
||||
"settings_notify_extra_data_hint": "JSON eller YAML, Jinja tillåtet; slås ihop med notify-anropets data (dina nycklar vinner). Variabler: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Testa med knappen Skicka test.",
|
||||
"card_saved_view": "Sparad vy",
|
||||
"card_saved_view_none": "Ingen",
|
||||
"card_saved_view_help": "Tillämpar vyns status-, användar- och etikettfilter utöver filtren ovan. Vyns sortering och gruppering är panelvisningsinställningar och tillämpas inte på kortet.",
|
||||
"panel_card_tab": "Öppna på fliken",
|
||||
"panel_card_tab_default": "Ihågkommen flik (som i panelen)",
|
||||
"panel_card_view": "Öppna med sparad vy",
|
||||
"panel_card_height": "Höjd",
|
||||
"panel_card_height_help": "Tomt = fyller skärmen under kortet (panelvy). Annars en CSS-längd som 600px eller 80vh för vyer med andra kort.",
|
||||
"panel_card_not_registered": "Maintenance Supporter-panelen är inte tillgänglig — är integrationen konfigurerad?",
|
||||
"panel_card_load_failed": "Maintenance Supporter-panelen kunde inte läsas in — ladda om sidan (efter en uppdatering: rensa webbläsarens cache).",
|
||||
"doc_part_none": "Inga dokument länkade till denna del.",
|
||||
"settings_templates_toggle_group": "Aktivera eller inaktivera alla mallar i denna grupp",
|
||||
"setups_button": "Föreslagna uppsättningar",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "I ordning",
|
||||
"battery_fleet_status_due": "Dags",
|
||||
"battery_fleet_predicted_on": "Väntas omkring {date}",
|
||||
"battery_fleet_predicted_typical": "Väntas omkring {date} — {months} månader typiskt för {type} ({source})",
|
||||
"lifetime_source_default": "inbyggt standardvärde",
|
||||
"lifetime_source_table": "inbyggd tabell",
|
||||
"lifetime_source_learned": "inlärt från {n} byten",
|
||||
"lifetime_source_override": "din inställning",
|
||||
"lifetime_source_learned_device": "inlärt från {n} byten på den här enheten",
|
||||
"lifetime_source_learned_model": "inlärt från {n} byten på enheter av den här modellen",
|
||||
"battery_fleet_predicted_trend": "Förutspått utifrån batteriets urladdningstrend: omkring {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Uppladdningsbart: ladda i stället för att byta — aldrig på inköpslistan",
|
||||
"battery_fleet_sort_name": "Sortera efter namn",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Använda delar",
|
||||
"print_inc_photos": "Foton",
|
||||
"print_inc_documents": "Länkade dokument",
|
||||
"print_inc_doc_desc": "Dokumentbeskrivningar",
|
||||
"print_inc_checklist": "Checklista",
|
||||
"print_inc_notes": "Anteckningar",
|
||||
"print_inc_costs": "Kostnad och tid",
|
||||
"print_inc_person": "Utförd av",
|
||||
"print_inc_refs": "Referensnummer",
|
||||
"print_inc_bare": "Utföranden utan detaljer",
|
||||
"print_inc_qr": "QR-kod per uppgift",
|
||||
"print_button": "Skriv ut",
|
||||
"report_scan_hint": "Skanna för att öppna uppgiften",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "Çalışma süresi",
|
||||
"runtime_hours": "Hedef çalışma süresi (saat)",
|
||||
"target_value": "Hedef değer",
|
||||
"baseline": "Başlangıç değeri",
|
||||
"target_changes": "Hedef değişiklik sayısı",
|
||||
"for_minutes": "Süre (dakika)",
|
||||
"time_based": "Zamana dayalı",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "Oluşturulma",
|
||||
"report_times_done": "Yapıldı",
|
||||
"report_total_cost": "Toplam maliyet",
|
||||
"report_every": "her {n} {unit}",
|
||||
"report_notes": "Notlar",
|
||||
"report_col_type": "Tür",
|
||||
"report_col_status": "Durum",
|
||||
"report_col_schedule": "Zamanlama",
|
||||
"duration": "Süre",
|
||||
"minutes_short": "dk",
|
||||
"both": "Her ikisi",
|
||||
"trigger_val": "Tetikleme değeri",
|
||||
"complete_title": "Tamamla: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: yanlış tür (beklenen: {type})",
|
||||
"err_invalid_choice": "{field}: izin verilen bir değer değil",
|
||||
"err_invalid_value": "{field}: geçersiz değer",
|
||||
"ws_err_not_found": "Bulunamadı — bu arada silinmiş olabilir",
|
||||
"ws_err_invalid_input": "Geçersiz giriş",
|
||||
"ws_err_invalid_date": "Geçersiz tarih",
|
||||
"ws_err_invalid_format": "Geçersiz biçim",
|
||||
"ws_err_invalid_url": "Geçersiz bağlantı",
|
||||
"ws_err_not_configured": "Henüz ayarlanmadı",
|
||||
"ws_err_not_loaded": "Henüz yüklenmedi — birazdan tekrar deneyin",
|
||||
"ws_err_limit_reached": "Sınıra ulaşıldı",
|
||||
"ws_err_too_many": "Çok fazla kayıt",
|
||||
"ws_err_too_large": "Çok büyük",
|
||||
"ws_err_not_archived": "Arşivlenmemiş",
|
||||
"ws_err_invalid_target": "Geçersiz hedef",
|
||||
"ws_err_create_failed": "Oluşturulamadı",
|
||||
"ws_err_archived": "Arşivlenmiş — önce geri yükleyin",
|
||||
"ws_err_already_archived": "Zaten arşivlenmiş",
|
||||
"ws_err_unavailable": "Şu anda kullanılamıyor",
|
||||
"ws_err_unauthorized": "Kullanıcınız için izin verilmiyor",
|
||||
"ws_err_too_many_views": "Çok fazla kayıtlı görünüm",
|
||||
"ws_err_storage_unavailable": "Depolama kullanılamıyor",
|
||||
"ws_err_replace_failed": "Değiştirme başarısız",
|
||||
"ws_err_not_paused": "Duraklatılmamış",
|
||||
"ws_err_not_available": "Kullanılabilir bir şey yok",
|
||||
"ws_err_no_url": "Bağlantı verilmedi",
|
||||
"ws_err_no_phases": "Bu görevin aşaması yok",
|
||||
"ws_err_invalid_view": "Geçersiz görünüm",
|
||||
"ws_err_invalid_user": "Bilinmeyen kullanıcı",
|
||||
"ws_err_invalid_range": "Geçersiz aralık",
|
||||
"ws_err_invalid_parent": "Geçersiz üst nesne",
|
||||
"ws_err_invalid_device": "Bilinmeyen cihaz",
|
||||
"ws_err_empty_csv": "CSV dosyası boş",
|
||||
"ws_err_empty": "İçe aktarılacak bir şey yok",
|
||||
"ws_err_duplicate_failed": "Çoğaltılamadı",
|
||||
"ws_err_already_paused": "Zaten duraklatılmış",
|
||||
"ws_err_invalid_cursor": "Geçersiz aşama konumu",
|
||||
"ws_err_invalid_entity_slug": "Geçersiz varlık adı",
|
||||
"ws_err_invalid_trigger_config": "Geçersiz tetikleyici yapılandırması",
|
||||
"ws_err_no_defaults": "Hızlı tamamlama varsayılanları ayarlanmamış",
|
||||
"ws_err_self_link_device": "Bir nesne kendisine bağlanamaz",
|
||||
"ws_err_too_early": "Çok erken — bu görev ancak son tarihine yaklaşınca tamamlanabilir",
|
||||
"feat_schedule_time": "Gün içi saat zamanlaması",
|
||||
"feat_schedule_time_desc": "Görevler gece yarısı yerine günün belirli bir saatinde gecikmiş olur.",
|
||||
"schedule_time_toggle": "Belirli bir saatte vadesi dolar",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "Şuna eşitse tetikle (=)",
|
||||
"trigger_not_equals": "Şundan farklıysa tetikle (≠)",
|
||||
"for_at_least_minutes": "En az (dakika)",
|
||||
"safety_interval_days": "Güvenlik aralığı (gün, isteğe bağlı)",
|
||||
"safety_interval": "Güvenlik aralığı (isteğe bağlı)",
|
||||
"trigger_combinator": "Tetikleyici ve aralığı birleştir",
|
||||
"trigger_combinator_any": "Tetikleyici veya aralık (ilk gerçekleşen)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "Görevlerim",
|
||||
"tab_calendar": "Takvim",
|
||||
"cal_no_events": "Bakım yok",
|
||||
"cal_window_7": "7 gün",
|
||||
"cal_window_14": "14 gün",
|
||||
"cal_window_30": "30 gün",
|
||||
"cal_window_365": "1 yıl",
|
||||
"cal_every_n_days": "her {n} günde bir",
|
||||
"cal_source_time": "Zamana dayalı",
|
||||
"cal_source_time_adaptive": "Zamana dayalı (uyarlanabilir)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "QR kodu oluşturulamadı.",
|
||||
"qr_error_no_url": "Yapılandırılmış bir HA URL'si yok. Lütfen Ayarlar → Sistem → Ağ bölümünden bir dış veya iç URL ayarlayın.",
|
||||
"save_error": "Kaydedilemedi. Lütfen tekrar deneyin.",
|
||||
"subsave_warning": "Kaydedildi, ancak bir ayar reddedildi: {detail}",
|
||||
"qr_print": "Yazdır",
|
||||
"qr_download": "SVG indir",
|
||||
"qr_action": "Tarama eylemi",
|
||||
"qr_action_view": "Bakım bilgisini görüntüle",
|
||||
"qr_action_complete": "Bakımı tamamlandı olarak işaretle",
|
||||
"qr_url_mode": "Bağlantı türü",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "Yerel (mDNS)",
|
||||
"qr_mode_server": "Sunucu URL'si",
|
||||
"overview": "Genel Bakış",
|
||||
"analysis": "Analiz",
|
||||
"recent_activities": "Son Etkinlikler",
|
||||
"search_notes": "Notlarda ara",
|
||||
"avg_cost": "Ort. Maliyet",
|
||||
"no_advanced_features": "Etkin gelişmiş özellik yok",
|
||||
"no_advanced_features_hint": "Burada analiz verilerini görmek için entegrasyon ayarlarından “Uyarlanabilir Aralıklar” veya “Mevsimsel Desenler” özelliğini etkinleştirin.",
|
||||
"analysis_not_enough_data": "Analiz için henüz yeterli veri yok.",
|
||||
"analysis_not_enough_data_hint": "Weibull analizi en az 5 tamamlanmış bakım gerektirir; mevsimsel desenler ay başına 6+ veri noktasından sonra görünür olur.",
|
||||
"analysis_manual_task_hint": "Aralığı olmayan manuel görevler analiz verisi üretmez.",
|
||||
"completions": "tamamlama",
|
||||
"current": "Mevcut",
|
||||
"shorter": "Daha kısa",
|
||||
"longer": "Daha uzun",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "Geçmiş dönemler",
|
||||
"cal_forward_windows": "Gelecek dönemler",
|
||||
"history_edit_title": "Geçmiş kaydını düzenle",
|
||||
"history_delete_entry": "Kaydı sil",
|
||||
"history_delete_confirm": "Bu geçmiş kaydı silinsin mi? Son yapılma tarihi bir önceki tamamlamaya döner; fotoğraflar nesnede kalır, kullanılan parçalar stoğa geri eklenmez.",
|
||||
"history_edit_timestamp": "Zaman damgası",
|
||||
"manufacturer": "Üretici",
|
||||
"model": "Model",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "Varsayılan uyarı günleri",
|
||||
"settings_consumable_threshold": "„Sarf malzemesi düşük“ eşiği (%)",
|
||||
"settings_battery_low_percent": "„Pil zayıf“ eşiği (%)",
|
||||
"settings_battery_lifetimes": "Tipik pil ömürleri",
|
||||
"settings_battery_lifetimes_hint": "Yalnızca yüzdesi olmayan piller için kullanılır: sadece tür ve değişim tarihi olan bir Battery Notes notu ya da yalnızca \"düşük\" bildiren bir sensör. Vade = son değişim + bu ömür. Seviye bildiren pillerin tahmini ölçülen deşarjdan gelir. Filo bir türden üç değişim gördüğünde ortanca aralık yerleşik değerin yerini alır — kendi değerin her zaman kazanır.",
|
||||
"settings_battery_lifetime_months": "ay",
|
||||
"settings_battery_lifetime_reset": "Varsayılanı kullan",
|
||||
"settings_battery_lifetime_in_fleet": "filonda",
|
||||
"settings_battery_lifetime_learned_models": "Modele göre öğrenilen: {list}",
|
||||
"settings_thresholds_hint": "Yeni Önerilen kurulumlar (kalan yüzde) ve kendi Battery Notes eşiği olmayan filo pilleri için varsayılanlar. Mevcut görevler değerlerini korur.",
|
||||
"settings_value_out_of_range": "Değer {min} ile {max} arasında olmalıdır",
|
||||
"bn_summary": "{name}: {n} pil için % {pct}",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "Kendi eşiği olan {n} cihaz:",
|
||||
"bn_more": "+ {n} tane daha",
|
||||
"settings_row_actions": "Görev satırı eylemleri",
|
||||
"settings_ref_numbers_in_lists": "Listelerde referans numaraları",
|
||||
"settings_ref_numbers_in_lists_hint": "Bugün listesinde, görev tablosunda, nesne kartlarında ve nesne tablosunda nesne ve görev adlarının önünde #8 / #8.3 etiketlerini gösterir.",
|
||||
"row_actions_buttons_compact": "Düğmeler (telefonda yalnızca simgeler)",
|
||||
"row_actions_buttons": "Metinli düğmeler",
|
||||
"row_actions_icons": "Simgeler (klasik)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "Erteleme süresi (saat)",
|
||||
"settings_budget": "Bütçe",
|
||||
"settings_currency": "Para birimi",
|
||||
"settings_currency_decimals": "Tutarlarda ondalık basamak",
|
||||
"settings_currency_decimals_hint": "Her tutarın kaç ondalık basamak göstereceği: KPI'lar, bütçeler, liste ve raporlardaki maliyetler, bütçe uyarıları. 0 = tam sayılar.",
|
||||
"settings_budget_monthly": "Aylık bütçe",
|
||||
"settings_budget_yearly": "Yıllık bütçe",
|
||||
"settings_budget_alerts": "Bütçe uyarıları",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "YAML dışa aktar",
|
||||
"settings_export_csv": "CSV dışa aktar",
|
||||
"settings_export_settings": "Ayarları dışa aktar (JSON)",
|
||||
"settings_import_csv": "CSV içe aktar",
|
||||
"settings_import_placeholder": "JSON veya CSV içeriğini buraya yapıştırın…",
|
||||
"settings_import_btn": "İçe aktar",
|
||||
"settings_import_success": "{count} nesne başarıyla içe aktarıldı.",
|
||||
@@ -644,7 +681,6 @@
|
||||
"feat_completion_actions_desc": "Görev başına tamamlamada HA eylemi + önceden ayarlı değerlerle hızlı tamamlama QR'ı.",
|
||||
"on_complete_action_title": "Tamamlandığında: HA eylemi tetikle (isteğe bağlı)",
|
||||
"on_complete_action_desc": "Görev tamamlandığında bir HA servisi çağırır — örn. cihazdaki bir sayacı sıfırlar.",
|
||||
"on_complete_action_service": "Servis",
|
||||
"on_complete_action_target": "Hedef varlık",
|
||||
"on_complete_action_target_hint": "Not: varlık alan adı servisle eşleşmelidir — örn. 'button.press' yalnızca button.* üzerinde, 'counter.increment' yalnızca counter.* üzerinde, 'input_button.press' yalnızca input_button.* üzerinde çalışır. Eşleşmezse eylem sessizce başarısız olur (HA günlüğü: 'Referenced entities ... missing or not currently available').",
|
||||
"on_complete_action_data": "Veri (JSON, isteğe bağlı)",
|
||||
@@ -710,7 +746,6 @@
|
||||
"choose_photos": "Fotoğraf seç",
|
||||
"choose_photo": "Fotoğraf seç",
|
||||
"photos_android_hint": "Android uygulaması her seçimde bir fotoğraf iletir — her seçim eklenir.",
|
||||
"add_photos": "Fotoğraf ekle",
|
||||
"photos_limit": "Tamamlama başına en fazla {max} fotoğraf",
|
||||
"history_edit_photos_hint": "Burada kaldırılan fotoğraf nesnenin belgelerinde kalır.",
|
||||
"uploading": "Yükleniyor…",
|
||||
@@ -731,6 +766,8 @@
|
||||
"doc_download": "İndir",
|
||||
"doc_close": "Kapat",
|
||||
"doc_camera": "Fotoğraf çek",
|
||||
"camera_capture_shoot": "Çek",
|
||||
"camera_switch_lens": "Kamerayı değiştir",
|
||||
"doc_drop_hint": "Dosyaları buraya bırakın",
|
||||
"doc_task_none": "Bu göreve bağlı belge yok.",
|
||||
"doc_link_existing": "Belge bağla…",
|
||||
@@ -747,6 +784,12 @@
|
||||
"auto_complete_on_recovery_help": "Tetikleyici kendiliğinden temizlendiğinde bir tamamlama kaydeder (son yapılmayı ayarlar) — örn. tuz dolduruldu, filtre değiştirildi.",
|
||||
"doc_search": "Belgelerde ara…",
|
||||
"doc_search_none": "Eşleşen belge yok",
|
||||
"doc_description": "Açıklama (isteğe bağlı)",
|
||||
"doc_sort": "Belgeleri sırala",
|
||||
"doc_sort_newest": "En yeni önce",
|
||||
"doc_sort_oldest": "En eski önce",
|
||||
"doc_sort_title": "Başlığa göre (1, 2, 3 …)",
|
||||
"doc_sort_category": "Kategoriye göre",
|
||||
"link_device_optional": "Mevcut bir cihaza bağla (isteğe bağlı)",
|
||||
"parent_object_optional": "Üst nesne (isteğe bağlı)",
|
||||
"parent_none": "(Üst nesne yok)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Yalnızca şu görünüm için bildir",
|
||||
"settings_notify_scope_all": "Tüm görevler",
|
||||
"settings_notify_scope_hint": "Yalnızca seçili kayıtlı görünümün etiket/kullanıcı filtreleriyle eşleşen görevler hatırlatma gönderir. Görünümün durum, sıralama ve gruplaması burada dikkate alınmaz.",
|
||||
"settings_notify_completed": "Tamamlama bildirimleri",
|
||||
"settings_notify_completed_hint": "Bir görev tamamlandığında ev halkına nedeni ve kimin yaptığıyla birlikte haber verir. \"Yalnızca otomatik\" sadece kimsenin yerinde yapmadığı tamamlamaları bildirir: sensör toparlanması, alışveriş listesinde işaretleme, bir otomasyonun servis çağrısı. Yalnızca ev servisine gider; sessiz saatler ve günlük sınır geçerlidir.",
|
||||
"notify_completed_off": "Kapalı",
|
||||
"notify_completed_automatic": "Yalnızca otomatik tamamlamalar",
|
||||
"notify_completed_all": "Tüm tamamlamalar",
|
||||
"settings_notify_rule": "Kendi bildirim kuralınız",
|
||||
"settings_notify_rule_hint": "Her bildirim ayrıca maintenance_supporter_notification olayını tetikler (tür, durum, nesne, görev, referans numaraları, öncelik, derin bağlantı, yük). Bir otomasyonla yönlendirin — ör. Ticker, Telegram veya Pushover'a.",
|
||||
"settings_notify_event_only": "Yalnızca olayı tetikle, kendin gönderme",
|
||||
"settings_notify_event_only_hint": "Teslimatın tamamını otomasyonunuz yapar. Tekrar aralıkları, sessiz saatler ve günlük sınır, olayın ne zaman tetikleneceği için geçerli kalır.",
|
||||
"settings_notify_extra_data": "Ek bildirim verileri (şablon)",
|
||||
"settings_notify_extra_data_hint": "JSON veya YAML, Jinja kullanılabilir; notify çağrısının data alanına birleştirilir (sizin anahtarlarınız öncelikli). Değişkenler: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Test gönder düğmesiyle deneyin.",
|
||||
"settings_notify_extra_data_hint": "JSON veya YAML, Jinja kullanılabilir; notify çağrısının data alanına birleştirilir (sizin anahtarlarınız öncelikli). Değişkenler: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Test gönder düğmesiyle deneyin.",
|
||||
"card_saved_view": "Kayıtlı görünüm",
|
||||
"card_saved_view_none": "Yok",
|
||||
"card_saved_view_help": "Görünümün durum, kullanıcı ve etiket filtrelerini yukarıdaki filtrelerin üzerine uygular. Görünümün sıralaması ve gruplaması panel görüntüleme ayarlarıdır ve kartta uygulanmaz.",
|
||||
"panel_card_tab": "Şu sekmede aç",
|
||||
"panel_card_tab_default": "Hatırlanan sekme (paneldeki gibi)",
|
||||
"panel_card_view": "Kayıtlı görünümle aç",
|
||||
"panel_card_height": "Yükseklik",
|
||||
"panel_card_height_help": "Boş = kartın altındaki ekranı doldurur (panel görünümü). Aksi halde başka kartlar içeren görünümler için 600px veya 80vh gibi bir CSS uzunluğu.",
|
||||
"panel_card_not_registered": "Maintenance Supporter paneli kullanılamıyor — entegrasyon kurulu mu?",
|
||||
"panel_card_load_failed": "Maintenance Supporter paneli yüklenemedi — sayfayı yenileyin (bir güncellemeden sonra: tarayıcı önbelleğini temizleyin).",
|
||||
"doc_part_none": "Bu parçaya bağlı belge yok.",
|
||||
"settings_templates_toggle_group": "Bu gruptaki tüm şablonları etkinleştir veya devre dışı bırak",
|
||||
"setups_button": "Önerilen kurulumlar",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "İyi durumda",
|
||||
"battery_fleet_status_due": "Süresi doldu",
|
||||
"battery_fleet_predicted_on": "Yaklaşık {date} tarihinde bekleniyor",
|
||||
"battery_fleet_predicted_typical": "Yaklaşık {date} — {type} için tipik {months} ay ({source})",
|
||||
"lifetime_source_default": "yerleşik varsayılan",
|
||||
"lifetime_source_table": "yerleşik tablo",
|
||||
"lifetime_source_learned": "{n} değişimden öğrenildi",
|
||||
"lifetime_source_override": "senin ayarın",
|
||||
"lifetime_source_learned_device": "bu cihazın {n} değişiminden öğrenildi",
|
||||
"lifetime_source_learned_model": "bu modeldeki cihazların {n} değişiminden öğrenildi",
|
||||
"battery_fleet_predicted_trend": "Bu pilin deşarj eğiliminden tahmin edildi: yaklaşık {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Şarj edilebilir: değiştirmek yerine şarj edin — alışveriş listesine asla girmez",
|
||||
"battery_fleet_sort_name": "Ada göre sırala",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Kullanılan parçalar",
|
||||
"print_inc_photos": "Fotoğraflar",
|
||||
"print_inc_documents": "Bağlı belgeler",
|
||||
"print_inc_doc_desc": "Belge açıklamaları",
|
||||
"print_inc_checklist": "Kontrol listesi",
|
||||
"print_inc_notes": "Notlar",
|
||||
"print_inc_costs": "Maliyet ve süre",
|
||||
"print_inc_person": "Tamamlayan",
|
||||
"print_inc_refs": "Referans numaraları",
|
||||
"print_inc_bare": "Ayrıntısız tamamlamalar",
|
||||
"print_inc_qr": "Görev başına QR kodu",
|
||||
"print_button": "Yazdır",
|
||||
"report_scan_hint": "Görevi açmak için tarayın",
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
"runtime": "Напрацювання",
|
||||
"runtime_hours": "Цільове напрацювання (години)",
|
||||
"target_value": "Цільове значення",
|
||||
"baseline": "Базове значення",
|
||||
"target_changes": "Цільова кількість змін",
|
||||
"for_minutes": "Протягом (хвилин)",
|
||||
"time_based": "За часом",
|
||||
@@ -103,12 +102,12 @@
|
||||
"report_generated": "Створено",
|
||||
"report_times_done": "Виконано",
|
||||
"report_total_cost": "Загальна вартість",
|
||||
"report_every": "кожні {n} {unit}",
|
||||
"report_notes": "Нотатки",
|
||||
"report_col_type": "Тип",
|
||||
"report_col_status": "Статус",
|
||||
"report_col_schedule": "Розклад",
|
||||
"duration": "Тривалість",
|
||||
"minutes_short": "хв",
|
||||
"both": "Обидва",
|
||||
"trigger_val": "Значення тригера",
|
||||
"complete_title": "Виконати: ",
|
||||
@@ -125,6 +124,45 @@
|
||||
"err_wrong_type": "{field}: невірний тип (очікувалось: {type})",
|
||||
"err_invalid_choice": "{field}: недопустиме значення",
|
||||
"err_invalid_value": "{field}: невірне значення",
|
||||
"ws_err_not_found": "Не знайдено — можливо, вже видалено",
|
||||
"ws_err_invalid_input": "Неприпустиме введення",
|
||||
"ws_err_invalid_date": "Неприпустима дата",
|
||||
"ws_err_invalid_format": "Неприпустимий формат",
|
||||
"ws_err_invalid_url": "Неприпустиме посилання",
|
||||
"ws_err_not_configured": "Ще не налаштовано",
|
||||
"ws_err_not_loaded": "Ще не завантажено — спробуйте трохи пізніше",
|
||||
"ws_err_limit_reached": "Досягнуто межу",
|
||||
"ws_err_too_many": "Забагато записів",
|
||||
"ws_err_too_large": "Занадто великий розмір",
|
||||
"ws_err_not_archived": "Не в архіві",
|
||||
"ws_err_invalid_target": "Неприпустима ціль",
|
||||
"ws_err_create_failed": "Не вдалося створити",
|
||||
"ws_err_archived": "В архіві — спочатку відновіть",
|
||||
"ws_err_already_archived": "Уже в архіві",
|
||||
"ws_err_unavailable": "Зараз недоступно",
|
||||
"ws_err_unauthorized": "Недоступно для вашого користувача",
|
||||
"ws_err_too_many_views": "Забагато збережених подань",
|
||||
"ws_err_storage_unavailable": "Сховище недоступне",
|
||||
"ws_err_replace_failed": "Не вдалося замінити",
|
||||
"ws_err_not_paused": "Не на паузі",
|
||||
"ws_err_not_available": "Нічого немає",
|
||||
"ws_err_no_url": "Посилання не вказано",
|
||||
"ws_err_no_phases": "У цього завдання немає фаз",
|
||||
"ws_err_invalid_view": "Неприпустиме подання",
|
||||
"ws_err_invalid_user": "Невідомий користувач",
|
||||
"ws_err_invalid_range": "Неприпустимий діапазон",
|
||||
"ws_err_invalid_parent": "Неприпустимий батьківський об'єкт",
|
||||
"ws_err_invalid_device": "Невідомий пристрій",
|
||||
"ws_err_empty_csv": "CSV-файл порожній",
|
||||
"ws_err_empty": "Нічого імпортувати",
|
||||
"ws_err_duplicate_failed": "Не вдалося дублювати",
|
||||
"ws_err_already_paused": "Уже на паузі",
|
||||
"ws_err_invalid_cursor": "Неприпустима позиція фази",
|
||||
"ws_err_invalid_entity_slug": "Неприпустима назва сутності",
|
||||
"ws_err_invalid_trigger_config": "Неприпустиме налаштування тригера",
|
||||
"ws_err_no_defaults": "Не задано значення за замовчуванням для швидкого завершення",
|
||||
"ws_err_self_link_device": "Об'єкт не можна пов'язати із самим собою",
|
||||
"ws_err_too_early": "Зарано — це завдання можна завершити лише ближче до терміну",
|
||||
"feat_schedule_time": "Планування за часом доби",
|
||||
"feat_schedule_time_desc": "Задачі стають простроченими у певний час доби, а не опівночі.",
|
||||
"schedule_time_toggle": "Термін у визначений час",
|
||||
@@ -205,7 +243,6 @@
|
||||
"trigger_equals": "Спрацьовувати при рівності (=)",
|
||||
"trigger_not_equals": "Спрацьовувати при відмінності від (≠)",
|
||||
"for_at_least_minutes": "Протягом не менше (хвилин)",
|
||||
"safety_interval_days": "Страховий інтервал (дні, необов'язково)",
|
||||
"safety_interval": "Страховий інтервал (необов'язково)",
|
||||
"trigger_combinator": "Поєднати тригер та інтервал",
|
||||
"trigger_combinator_any": "Тригер або інтервал (що раніше)",
|
||||
@@ -245,10 +282,6 @@
|
||||
"my_tasks": "Мої завдання",
|
||||
"tab_calendar": "Календар",
|
||||
"cal_no_events": "Без обслуговування",
|
||||
"cal_window_7": "7 днів",
|
||||
"cal_window_14": "14 днів",
|
||||
"cal_window_30": "30 днів",
|
||||
"cal_window_365": "1 рік",
|
||||
"cal_every_n_days": "кожні {n} днів",
|
||||
"cal_source_time": "За часом",
|
||||
"cal_source_time_adaptive": "За часом (адаптивно)",
|
||||
@@ -346,9 +379,9 @@
|
||||
"qr_error": "Не вдалося згенерувати QR-код.",
|
||||
"qr_error_no_url": "URL Home Assistant не налаштовано. Задайте зовнішню або внутрішню URL-адресу в Налаштування → Система → Мережа.",
|
||||
"save_error": "Не вдалося зберегти. Спробуйте ще раз.",
|
||||
"subsave_warning": "Збережено, але одне налаштування відхилено: {detail}",
|
||||
"qr_print": "Друкувати",
|
||||
"qr_download": "Завантажити SVG",
|
||||
"qr_action": "Дія при скануванні",
|
||||
"qr_action_view": "Переглянути",
|
||||
"qr_action_complete": "Позначити обслуговування виконаним",
|
||||
"qr_url_mode": "Тип посилання",
|
||||
@@ -356,16 +389,9 @@
|
||||
"qr_mode_local": "Локальний (mDNS)",
|
||||
"qr_mode_server": "URL сервера",
|
||||
"overview": "Огляд",
|
||||
"analysis": "Аналіз",
|
||||
"recent_activities": "Остання активність",
|
||||
"search_notes": "Пошук у примітках",
|
||||
"avg_cost": "Сер. вартість",
|
||||
"no_advanced_features": "Розширені функції не увімкнено",
|
||||
"no_advanced_features_hint": "Увімкніть «Адаптивні інтервали» або «Сезонні закономірності» в налаштуваннях інтеграції, щоб побачити тут дані аналізу.",
|
||||
"analysis_not_enough_data": "Недостатньо даних для аналізу.",
|
||||
"analysis_not_enough_data_hint": "Аналіз Вейбулла потребує щонайменше 5 виконаних обслуговувань; сезонні закономірності стають видимими після 6+ записів на місяць.",
|
||||
"analysis_manual_task_hint": "Ручні завдання без інтервалу не генерують дані аналізу.",
|
||||
"completions": "виконань",
|
||||
"current": "Поточний",
|
||||
"shorter": "Коротший",
|
||||
"longer": "Довший",
|
||||
@@ -411,6 +437,8 @@
|
||||
"cal_past_windows": "Минулі вікна",
|
||||
"cal_forward_windows": "Майбутні вікна",
|
||||
"history_edit_title": "Редагувати запис історії",
|
||||
"history_delete_entry": "Видалити запис",
|
||||
"history_delete_confirm": "Видалити цей запис історії? Дата останнього виконання повернеться до попереднього; фотографії залишаться в об'єкта, а витрачені деталі не повернуться на склад.",
|
||||
"history_edit_timestamp": "Позначка часу",
|
||||
"manufacturer": "Виробник",
|
||||
"model": "Модель",
|
||||
@@ -468,6 +496,12 @@
|
||||
"settings_default_warning": "Днів попередження за замовчуванням",
|
||||
"settings_consumable_threshold": "Поріг «витратний матеріал закінчується» (%)",
|
||||
"settings_battery_low_percent": "Поріг «батарея розряджена» (%)",
|
||||
"settings_battery_lifetimes": "Типовий строк служби батарей",
|
||||
"settings_battery_lifetimes_hint": "Використовується лише для батарей без відсотка: нотатка Battery Notes лише з типом і датою заміни або датчик, що повідомляє тільки «низький». Термін = остання заміна + цей строк служби. Для батарей з рівнем прогноз будується за виміряним розрядом. Після трьох замін одного типу медіанний інтервал замінює вбудоване значення — ваше значення завжди головніше.",
|
||||
"settings_battery_lifetime_months": "міс.",
|
||||
"settings_battery_lifetime_reset": "За замовчуванням",
|
||||
"settings_battery_lifetime_in_fleet": "у вашому парку",
|
||||
"settings_battery_lifetime_learned_models": "Вивчено за моделями: {list}",
|
||||
"settings_thresholds_hint": "Значення за замовчуванням для нових «Запропонованих налаштувань» (залишок у відсотках) і для батарей парку без власного порогу Battery Notes. Наявні завдання зберігають своє значення.",
|
||||
"settings_value_out_of_range": "Значення має бути від {min} до {max}",
|
||||
"bn_summary": "{name}: {pct} % для {n} батарей",
|
||||
@@ -476,6 +510,8 @@
|
||||
"bn_overrides": "{n} пристроїв із власним порогом:",
|
||||
"bn_more": "+ ще {n}",
|
||||
"settings_row_actions": "Дії в рядках завдань",
|
||||
"settings_ref_numbers_in_lists": "Номери посилань у списках",
|
||||
"settings_ref_numbers_in_lists_hint": "Показувати мітки #8 / #8.3 перед назвами об'єктів і завдань у списку «Сьогодні», таблиці завдань, картках об'єктів і таблиці об'єктів.",
|
||||
"row_actions_buttons_compact": "Кнопки (на телефоні лише значки)",
|
||||
"row_actions_buttons": "Кнопки з текстом",
|
||||
"row_actions_icons": "Значки (класичний вигляд)",
|
||||
@@ -525,6 +561,8 @@
|
||||
"settings_snooze_hours": "Тривалість відкладення (години)",
|
||||
"settings_budget": "Бюджет",
|
||||
"settings_currency": "Валюта",
|
||||
"settings_currency_decimals": "Знаків після коми в сумах",
|
||||
"settings_currency_decimals_hint": "Скільки знаків після коми показує кожна сума: KPI, бюджети, витрати у списках і звітах, сповіщення про бюджет. 0 = цілі числа.",
|
||||
"settings_budget_monthly": "Щомісячний бюджет",
|
||||
"settings_budget_yearly": "Щорічний бюджет",
|
||||
"settings_budget_alerts": "Сповіщення про бюджет",
|
||||
@@ -534,7 +572,6 @@
|
||||
"settings_export_yaml": "Експортувати YAML",
|
||||
"settings_export_csv": "Експортувати CSV",
|
||||
"settings_export_settings": "Експорт налаштувань (JSON)",
|
||||
"settings_import_csv": "Імпортувати CSV",
|
||||
"settings_import_placeholder": "Вставте вміст JSON або CSV сюди…",
|
||||
"settings_import_btn": "Імпортувати",
|
||||
"settings_import_success": "{count} об'єктів успішно імпортовано.",
|
||||
@@ -612,7 +649,6 @@
|
||||
"feat_completion_actions_desc": "Дія HA по завданню при завершенні + QR швидкого завершення з попередньо встановленими значеннями.",
|
||||
"on_complete_action_title": "При завершенні: викликати HA-дію (опційно)",
|
||||
"on_complete_action_desc": "Викликає HA-сервіс, коли завдання завершено — напр., скинути лічильник на пристрої.",
|
||||
"on_complete_action_service": "Сервіс",
|
||||
"on_complete_action_target": "Цільова сутність",
|
||||
"on_complete_action_data": "Дані (JSON, опційно)",
|
||||
"on_complete_action_test": "Тестувати дію",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "Вибрати фото",
|
||||
"choose_photo": "Вибрати фото",
|
||||
"photos_android_hint": "Застосунок для Android передає по одному фото за вибір — кожен вибір додається.",
|
||||
"add_photos": "Додати фото",
|
||||
"photos_limit": "До {max} фото на одне виконання",
|
||||
"history_edit_photos_hint": "Видалене тут фото залишається в документах об'єкта.",
|
||||
"uploading": "Завантаження…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "Завантажити",
|
||||
"doc_close": "Закрити",
|
||||
"doc_camera": "Зробити фото",
|
||||
"camera_capture_shoot": "Зняти",
|
||||
"camera_switch_lens": "Змінити камеру",
|
||||
"doc_drop_hint": "Перетягніть файли сюди",
|
||||
"doc_task_none": "Немає документів, пов'язаних із цим завданням.",
|
||||
"doc_link_existing": "Пов'язати документ…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "Записує виконання (оновлює дату останнього обслуговування), коли тригер зникає сам — наприклад, сіль досипано, фільтр замінено.",
|
||||
"doc_search": "Пошук документів…",
|
||||
"doc_search_none": "Немає відповідних документів",
|
||||
"doc_description": "Опис (необов'язково)",
|
||||
"doc_sort": "Сортувати документи",
|
||||
"doc_sort_newest": "Спочатку нові",
|
||||
"doc_sort_oldest": "Спочатку старі",
|
||||
"doc_sort_title": "За назвою (1, 2, 3 …)",
|
||||
"doc_sort_category": "За категорією",
|
||||
"link_device_optional": "Прив'язати до наявного пристрою (необов'язково)",
|
||||
"parent_object_optional": "Батьківський об'єкт (необов'язково)",
|
||||
"parent_none": "(Без батьківського)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "Сповіщати лише для подання",
|
||||
"settings_notify_scope_all": "Усі завдання",
|
||||
"settings_notify_scope_hint": "Нагадування надсилають лише завдання, що відповідають фільтрам мітки/користувача обраного подання. Статус, сортування та групування подання тут ігноруються.",
|
||||
"settings_notify_completed": "Сповіщення про виконання",
|
||||
"settings_notify_completed_hint": "Повідомлення для всіх домашніх, коли завдання виконано, з причиною та виконавцем. «Лише автоматичні» повідомляє тільки про виконання, які ніхто не робив на місці: відновлення датчика, позначка у списку покупок, виклик служби автоматизацією. Лише на спільний сервіс; тихі години та денний ліміт діють.",
|
||||
"notify_completed_off": "Вимк.",
|
||||
"notify_completed_automatic": "Лише автоматичні виконання",
|
||||
"notify_completed_all": "Усі виконання",
|
||||
"settings_notify_rule": "Власне правило сповіщень",
|
||||
"settings_notify_rule_hint": "Кожне сповіщення додатково викликає подію maintenance_supporter_notification (вид, статус, об'єкт, завдання, номери посилань, пріоритет, посилання, дані). Спрямуйте її автоматизацією — наприклад у Ticker, Telegram чи Pushover.",
|
||||
"settings_notify_event_only": "Лише подія, нічого не надсилати",
|
||||
"settings_notify_event_only_hint": "Доставку повністю виконує ваша автоматизація. Інтервали повтору, тихі години та денний ліміт і далі визначають, коли спрацьовує подія.",
|
||||
"settings_notify_extra_data": "Додаткові дані сповіщення (шаблон)",
|
||||
"settings_notify_extra_data_hint": "JSON або YAML, Jinja дозволено; додається до data виклику notify (ваші ключі мають перевагу). Змінні: kind, status, priority, object_name, task_name, object_ref, task_ref, days_until_due, next_due, responsible_user_id, url, target, title, message. Перевірте кнопкою «Надіслати тест».",
|
||||
"settings_notify_extra_data_hint": "JSON або YAML, Jinja дозволено; додається до data виклику notify (ваші ключі мають перевагу). Змінні: kind, status, priority, labels, notes, area_name, object_name, task_name, object_ref, task_ref, days_until_due, next_due, last_performed, responsible_user_id, sensor_entity_id, url, target, title, message. Перевірте кнопкою «Надіслати тест».",
|
||||
"card_saved_view": "Збережене подання",
|
||||
"card_saved_view_none": "Немає",
|
||||
"card_saved_view_help": "Застосовує фільтри статусу, користувача та мітки подання додатково до фільтрів вище. Сортування та групування подання — налаштування відображення панелі й на картці не застосовуються.",
|
||||
"panel_card_tab": "Відкривати на вкладці",
|
||||
"panel_card_tab_default": "Запам'ятована вкладка (як у панелі)",
|
||||
"panel_card_view": "Відкривати зі збереженим виглядом",
|
||||
"panel_card_height": "Висота",
|
||||
"panel_card_height_help": "Порожньо = заповнити екран під карткою (вигляд «панель»). Інакше довжина CSS, наприклад 600px або 80vh, для виглядів з іншими картками.",
|
||||
"panel_card_not_registered": "Панель Maintenance Supporter недоступна — інтеграцію налаштовано?",
|
||||
"panel_card_load_failed": "Не вдалося завантажити панель Maintenance Supporter — перезавантажте сторінку (після оновлення очистіть кеш браузера).",
|
||||
"doc_part_none": "До цієї запчастини не прив'язано документів.",
|
||||
"settings_templates_toggle_group": "Увімкнути або вимкнути всі шаблони цієї групи",
|
||||
"setups_button": "Пропоновані налаштування",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "У нормі",
|
||||
"battery_fleet_status_due": "Час замінити",
|
||||
"battery_fleet_predicted_on": "Очікується приблизно {date}",
|
||||
"battery_fleet_predicted_typical": "Очікується близько {date} — {months} міс. типово для {type} ({source})",
|
||||
"lifetime_source_default": "вбудоване значення за замовчуванням",
|
||||
"lifetime_source_table": "вбудована таблиця",
|
||||
"lifetime_source_learned": "за {n} замінами",
|
||||
"lifetime_source_override": "ваше налаштування",
|
||||
"lifetime_source_learned_device": "за {n} замінами цього пристрою",
|
||||
"lifetime_source_learned_model": "за {n} замінами на пристроях цієї моделі",
|
||||
"battery_fleet_predicted_trend": "Прогноз за трендом розряду цієї батареї: приблизно {date} ({confidence})",
|
||||
"battery_fleet_rechargeable": "Акумулятор: заряджається, а не замінюється — ніколи не потрапляє до списку покупок",
|
||||
"battery_fleet_sort_name": "Сортувати за назвою",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "Використані деталі",
|
||||
"print_inc_photos": "Фото",
|
||||
"print_inc_documents": "Пов'язані документи",
|
||||
"print_inc_doc_desc": "Описи документів",
|
||||
"print_inc_checklist": "Чек-лист",
|
||||
"print_inc_notes": "Нотатки",
|
||||
"print_inc_costs": "Вартість і тривалість",
|
||||
"print_inc_person": "Виконав",
|
||||
"print_inc_refs": "Номери посилань",
|
||||
"print_inc_bare": "Виконання без подробиць",
|
||||
"print_inc_qr": "QR-код для кожного завдання",
|
||||
"print_button": "Друк",
|
||||
"report_scan_hint": "Скануйте, щоб відкрити завдання",
|
||||
|
||||
@@ -57,7 +57,6 @@
|
||||
"runtime": "运行时间",
|
||||
"runtime_hours": "目标运行时长 (小时)",
|
||||
"target_value": "目标值",
|
||||
"baseline": "基准线",
|
||||
"target_changes": "目标变化次数",
|
||||
"for_minutes": "持续 (分钟)",
|
||||
"time_based": "基于时间",
|
||||
@@ -105,12 +104,12 @@
|
||||
"report_generated": "生成于",
|
||||
"report_times_done": "完成次数",
|
||||
"report_total_cost": "总费用",
|
||||
"report_every": "每 {n} {unit}",
|
||||
"report_notes": "备注",
|
||||
"report_col_type": "类型",
|
||||
"report_col_status": "状态",
|
||||
"report_col_schedule": "计划",
|
||||
"duration": "耗时",
|
||||
"minutes_short": "分钟",
|
||||
"both": "两者",
|
||||
"trigger_val": "触发值",
|
||||
"complete_title": "完成: ",
|
||||
@@ -127,6 +126,45 @@
|
||||
"err_wrong_type": "{field}: 类型错误 (预期: {type})",
|
||||
"err_invalid_choice": "{field}: 无效选项",
|
||||
"err_invalid_value": "{field}: 无效数值",
|
||||
"ws_err_not_found": "未找到 — 可能已被删除",
|
||||
"ws_err_invalid_input": "输入无效",
|
||||
"ws_err_invalid_date": "日期无效",
|
||||
"ws_err_invalid_format": "格式无效",
|
||||
"ws_err_invalid_url": "链接无效",
|
||||
"ws_err_not_configured": "尚未设置",
|
||||
"ws_err_not_loaded": "尚未加载 — 请稍后重试",
|
||||
"ws_err_limit_reached": "已达上限",
|
||||
"ws_err_too_many": "条目过多",
|
||||
"ws_err_too_large": "内容过大",
|
||||
"ws_err_not_archived": "未归档",
|
||||
"ws_err_invalid_target": "目标无效",
|
||||
"ws_err_create_failed": "无法创建",
|
||||
"ws_err_archived": "已归档 — 请先恢复",
|
||||
"ws_err_already_archived": "已归档",
|
||||
"ws_err_unavailable": "当前不可用",
|
||||
"ws_err_unauthorized": "您的用户无权执行此操作",
|
||||
"ws_err_too_many_views": "保存的视图过多",
|
||||
"ws_err_storage_unavailable": "存储不可用",
|
||||
"ws_err_replace_failed": "替换失败",
|
||||
"ws_err_not_paused": "未暂停",
|
||||
"ws_err_not_available": "没有可用项",
|
||||
"ws_err_no_url": "未提供链接",
|
||||
"ws_err_no_phases": "此任务没有阶段",
|
||||
"ws_err_invalid_view": "视图无效",
|
||||
"ws_err_invalid_user": "未知用户",
|
||||
"ws_err_invalid_range": "范围无效",
|
||||
"ws_err_invalid_parent": "父级对象无效",
|
||||
"ws_err_invalid_device": "未知设备",
|
||||
"ws_err_empty_csv": "CSV 文件为空",
|
||||
"ws_err_empty": "没有可导入的内容",
|
||||
"ws_err_duplicate_failed": "无法复制",
|
||||
"ws_err_already_paused": "已暂停",
|
||||
"ws_err_invalid_cursor": "阶段位置无效",
|
||||
"ws_err_invalid_entity_slug": "实体名称无效",
|
||||
"ws_err_invalid_trigger_config": "触发器配置无效",
|
||||
"ws_err_no_defaults": "未设置快速完成默认值",
|
||||
"ws_err_self_link_device": "对象不能链接到自身",
|
||||
"ws_err_too_early": "为时过早 — 此任务只能在临近到期日时完成",
|
||||
"feat_schedule_time": "具体时间调度",
|
||||
"feat_schedule_time_desc": "任务将在特定时间点变为逾期,而非默认的午夜。",
|
||||
"schedule_time_toggle": "在特定时间到期",
|
||||
@@ -207,7 +245,6 @@
|
||||
"trigger_equals": "等于时触发(=)",
|
||||
"trigger_not_equals": "不等于时触发(≠)",
|
||||
"for_at_least_minutes": "持续至少 (分钟)",
|
||||
"safety_interval_days": "安全间隔 (天, 可选)",
|
||||
"safety_interval": "安全间隔 (可选)",
|
||||
"trigger_combinator": "组合触发器与间隔",
|
||||
"trigger_combinator_any": "触发器或间隔(先到者)",
|
||||
@@ -247,10 +284,6 @@
|
||||
"my_tasks": "我的任务",
|
||||
"tab_calendar": "日历",
|
||||
"cal_no_events": "无维护事项",
|
||||
"cal_window_7": "7 天",
|
||||
"cal_window_14": "14 天",
|
||||
"cal_window_30": "30 天",
|
||||
"cal_window_365": "1 年",
|
||||
"cal_every_n_days": "每 {n} 天",
|
||||
"cal_source_time": "基于时间",
|
||||
"cal_source_time_adaptive": "基于时间 (自适应)",
|
||||
@@ -348,9 +381,9 @@
|
||||
"qr_error": "无法生成二维码。",
|
||||
"qr_error_no_url": "未配置 HA URL。请前往“设置 → 系统 → 网络”设置外部或内部 URL。",
|
||||
"save_error": "保存失败。请重试。",
|
||||
"subsave_warning": "已保存,但有一项设置被拒绝:{detail}",
|
||||
"qr_print": "打印",
|
||||
"qr_download": "下载 SVG",
|
||||
"qr_action": "扫码后动作",
|
||||
"qr_action_view": "查看维护信息",
|
||||
"qr_action_complete": "标记维护为已完成",
|
||||
"qr_url_mode": "链接类型",
|
||||
@@ -358,16 +391,9 @@
|
||||
"qr_mode_local": "本地 (mDNS)",
|
||||
"qr_mode_server": "服务器 URL",
|
||||
"overview": "概览",
|
||||
"analysis": "分析",
|
||||
"recent_activities": "近期活动",
|
||||
"search_notes": "搜索备注",
|
||||
"avg_cost": "平均成本",
|
||||
"no_advanced_features": "未启用高级功能",
|
||||
"no_advanced_features_hint": "请在集成设置中启用“自适应间隔”或“季节性模式”以在此查看分析数据。",
|
||||
"analysis_not_enough_data": "暂无足够的分析数据。",
|
||||
"analysis_not_enough_data_hint": "韦伯分析需要至少 5 次完成记录;季节性模式在每月有 6 个以上数据点后可见。",
|
||||
"analysis_manual_task_hint": "无间隔的手动任务不会生成分析数据。",
|
||||
"completions": "次完成记录",
|
||||
"current": "当前",
|
||||
"shorter": "较短",
|
||||
"longer": "较长",
|
||||
@@ -413,6 +439,8 @@
|
||||
"cal_past_windows": "过去的窗口",
|
||||
"cal_forward_windows": "未来的窗口",
|
||||
"history_edit_title": "编辑历史记录",
|
||||
"history_delete_entry": "删除记录",
|
||||
"history_delete_confirm": "删除此历史记录?上次完成日期将回退到前一次完成;照片仍保留在对象中,已消耗的配件不会退回库存。",
|
||||
"history_edit_timestamp": "时间戳",
|
||||
"manufacturer": "制造商",
|
||||
"model": "型号",
|
||||
@@ -470,6 +498,12 @@
|
||||
"settings_default_warning": "默认预警天数",
|
||||
"settings_consumable_threshold": "耗材“不足”阈值(%)",
|
||||
"settings_battery_low_percent": "电池“电量低”阈值(%)",
|
||||
"settings_battery_lifetimes": "电池典型寿命",
|
||||
"settings_battery_lifetimes_hint": "仅用于没有百分比的电池:只有类型和更换日期的 Battery Notes 记录,或只报告“低电量”的传感器。其到期日 = 上次更换 + 此寿命。报告电量的电池改用实测放电来预测。同一类型出现三次更换后,中位间隔将取代内置值——你自己的值始终优先。",
|
||||
"settings_battery_lifetime_months": "个月",
|
||||
"settings_battery_lifetime_reset": "使用默认值",
|
||||
"settings_battery_lifetime_in_fleet": "在你的电池群中",
|
||||
"settings_battery_lifetime_learned_models": "按型号学习:{list}",
|
||||
"settings_thresholds_hint": "用于新的“建议设置”(剩余百分比)以及没有自身 Battery Notes 阈值的电池组电池。现有任务保留其值。",
|
||||
"settings_value_out_of_range": "数值必须介于 {min} 和 {max} 之间",
|
||||
"bn_summary": "{name}:{n} 块电池为 {pct}%",
|
||||
@@ -478,6 +512,8 @@
|
||||
"bn_overrides": "{n} 台设备有自己的阈值:",
|
||||
"bn_more": "+ 另外 {n} 个",
|
||||
"settings_row_actions": "任务行操作",
|
||||
"settings_ref_numbers_in_lists": "在列表中显示编号",
|
||||
"settings_ref_numbers_in_lists_hint": "在“今天”列表、任务表、对象卡片和对象表中的对象与任务名称前显示 #8 / #8.3 编号标签。",
|
||||
"row_actions_buttons_compact": "按钮(手机上仅显示图标)",
|
||||
"row_actions_buttons": "带文字的按钮",
|
||||
"row_actions_icons": "图标(经典)",
|
||||
@@ -527,6 +563,8 @@
|
||||
"settings_snooze_hours": "稍后提醒间隔 (小时)",
|
||||
"settings_budget": "预算",
|
||||
"settings_currency": "货币单位",
|
||||
"settings_currency_decimals": "金额小数位数",
|
||||
"settings_currency_decimals_hint": "每个金额显示几位小数:KPI、预算、列表和报告中的费用、预算提醒。0 = 整数。",
|
||||
"settings_budget_monthly": "月度预算",
|
||||
"settings_budget_yearly": "年度预算",
|
||||
"settings_budget_alerts": "预算警报",
|
||||
@@ -536,7 +574,6 @@
|
||||
"settings_export_yaml": "导出 YAML",
|
||||
"settings_export_csv": "导出 CSV",
|
||||
"settings_export_settings": "导出设置(JSON)",
|
||||
"settings_import_csv": "导入 CSV",
|
||||
"settings_import_placeholder": "在此粘贴 JSON 或 CSV 内容…",
|
||||
"settings_import_btn": "导入",
|
||||
"settings_import_success": "成功导入 {count} 个维护项。",
|
||||
@@ -638,7 +675,6 @@
|
||||
"feat_completion_actions_desc": "为每个任务配置完成时的 HA 动作 + 预设值的快速完成二维码。",
|
||||
"on_complete_action_title": "完成时:触发 HA 动作(可选)",
|
||||
"on_complete_action_desc": "任务完成时调用 HA 服务 — 例如重置设备上的物理计数器。",
|
||||
"on_complete_action_service": "服务",
|
||||
"on_complete_action_target": "目标实体",
|
||||
"on_complete_action_target_hint": "注意:实体的域必须与服务匹配 — 例如 'button.press' 仅适用于 button.* 实体,'counter.increment' 仅适用于 counter.* 实体等。如果不匹配,动作将静默失败。",
|
||||
"on_complete_action_data": "数据(JSON, 可选)",
|
||||
@@ -704,7 +740,6 @@
|
||||
"choose_photos": "选择照片",
|
||||
"choose_photo": "选择照片",
|
||||
"photos_android_hint": "Android 应用每次只传一张照片——每次选择都会添加。",
|
||||
"add_photos": "添加照片",
|
||||
"photos_limit": "每次完成最多 {max} 张照片",
|
||||
"history_edit_photos_hint": "在此移除的照片仍保留在对象的文档中。",
|
||||
"uploading": "上传中…",
|
||||
@@ -725,6 +760,8 @@
|
||||
"doc_download": "下载",
|
||||
"doc_close": "关闭",
|
||||
"doc_camera": "拍照",
|
||||
"camera_capture_shoot": "拍摄",
|
||||
"camera_switch_lens": "切换摄像头",
|
||||
"doc_drop_hint": "将文件拖放到此处",
|
||||
"doc_task_none": "没有与此任务关联的文档。",
|
||||
"doc_link_existing": "关联文档…",
|
||||
@@ -741,6 +778,12 @@
|
||||
"auto_complete_on_recovery_help": "当触发条件自行解除时(如已加盐、已更换滤芯),记录一次完成并更新上次执行日期。",
|
||||
"doc_search": "搜索文档…",
|
||||
"doc_search_none": "没有匹配的文档",
|
||||
"doc_description": "说明(可选)",
|
||||
"doc_sort": "文档排序",
|
||||
"doc_sort_newest": "最新在前",
|
||||
"doc_sort_oldest": "最早在前",
|
||||
"doc_sort_title": "按标题(1、2、3…)",
|
||||
"doc_sort_category": "按类别",
|
||||
"link_device_optional": "关联到现有设备(可选)",
|
||||
"parent_object_optional": "父对象(可选)",
|
||||
"parent_none": "(无父对象)",
|
||||
@@ -854,15 +897,27 @@
|
||||
"settings_notify_scope": "仅为该视图发送通知",
|
||||
"settings_notify_scope_all": "所有任务",
|
||||
"settings_notify_scope_hint": "只有匹配所选视图的标签/用户筛选的任务才会发送提醒。视图的状态、排序和分组在此处被忽略。",
|
||||
"settings_notify_completed": "完成通知",
|
||||
"settings_notify_completed_hint": "任务完成时通知家庭成员,附上原因和执行者。“仅自动”只通报无人现场操作的完成:传感器恢复、购物清单勾选、自动化的服务调用。仅发送到家庭通知服务;免打扰时段和每日上限有效。",
|
||||
"notify_completed_off": "关闭",
|
||||
"notify_completed_automatic": "仅自动完成",
|
||||
"notify_completed_all": "所有完成",
|
||||
"settings_notify_rule": "自定义通知规则",
|
||||
"settings_notify_rule_hint": "每条通知还会触发事件 maintenance_supporter_notification(类型、状态、对象、任务、参考编号、优先级、深层链接、载荷)。用自动化转发它——例如到 Ticker、Telegram 或 Pushover。",
|
||||
"settings_notify_event_only": "仅触发事件,自身不发送",
|
||||
"settings_notify_event_only_hint": "由你的自动化完成全部发送。重复间隔、免打扰时段和每日上限仍决定事件何时触发。",
|
||||
"settings_notify_extra_data": "附加通知数据(模板)",
|
||||
"settings_notify_extra_data_hint": "JSON 或 YAML,可用 Jinja;合并进 notify 调用的 data(你的键优先)。变量:kind、status、priority、object_name、task_name、object_ref、task_ref、days_until_due、next_due、responsible_user_id、url、target、title、message。用“发送测试”按钮验证。",
|
||||
"settings_notify_extra_data_hint": "JSON 或 YAML,可用 Jinja;合并进 notify 调用的 data(你的键优先)。变量:kind、status、priority、labels、notes、area_name、object_name、task_name、object_ref、task_ref、days_until_due、next_due、last_performed、responsible_user_id、sensor_entity_id、url、target、title、message。用“发送测试”按钮验证。",
|
||||
"card_saved_view": "已保存的视图",
|
||||
"card_saved_view_none": "无",
|
||||
"card_saved_view_help": "在上述筛选之外再应用该视图的状态、用户和标签筛选。视图的排序和分组属于面板显示设置,不会应用到卡片上。",
|
||||
"panel_card_tab": "打开时的标签页",
|
||||
"panel_card_tab_default": "记住的标签页(与面板一致)",
|
||||
"panel_card_view": "打开时使用已保存的视图",
|
||||
"panel_card_height": "高度",
|
||||
"panel_card_height_help": "留空 = 填满卡片下方的屏幕(面板视图)。否则填写 CSS 长度,如 600px 或 80vh,用于含其他卡片的视图。",
|
||||
"panel_card_not_registered": "Maintenance Supporter 面板不可用——集成是否已设置?",
|
||||
"panel_card_load_failed": "无法加载 Maintenance Supporter 面板——请重新加载页面(更新后请清除浏览器缓存)。",
|
||||
"doc_part_none": "此部件没有关联的文档。",
|
||||
"settings_templates_toggle_group": "启用或禁用此组中的所有模板",
|
||||
"setups_button": "推荐配置",
|
||||
@@ -920,6 +975,13 @@
|
||||
"battery_fleet_status_ok": "正常",
|
||||
"battery_fleet_status_due": "已到期",
|
||||
"battery_fleet_predicted_on": "预计在 {date} 前后",
|
||||
"battery_fleet_predicted_typical": "预计约 {date} — {type} 通常 {months} 个月({source})",
|
||||
"lifetime_source_default": "内置默认值",
|
||||
"lifetime_source_table": "内置表",
|
||||
"lifetime_source_learned": "从 {n} 次更换中学习",
|
||||
"lifetime_source_override": "你的设置",
|
||||
"lifetime_source_learned_device": "从此设备的 {n} 次更换中学习",
|
||||
"lifetime_source_learned_model": "从同型号设备的 {n} 次更换中学习",
|
||||
"battery_fleet_predicted_trend": "根据此电池的放电趋势预测:约 {date}({confidence})",
|
||||
"battery_fleet_rechargeable": "可充电电池:充电即可,无需更换——不会出现在购物清单中",
|
||||
"battery_fleet_sort_name": "按名称排序",
|
||||
@@ -973,11 +1035,13 @@
|
||||
"print_inc_parts": "使用的零件",
|
||||
"print_inc_photos": "照片",
|
||||
"print_inc_documents": "关联文档",
|
||||
"print_inc_doc_desc": "文档说明",
|
||||
"print_inc_checklist": "检查清单",
|
||||
"print_inc_notes": "备注",
|
||||
"print_inc_costs": "费用和用时",
|
||||
"print_inc_person": "完成者",
|
||||
"print_inc_refs": "参考编号",
|
||||
"print_inc_bare": "无详情的完成记录",
|
||||
"print_inc_qr": "每个任务的二维码",
|
||||
"print_button": "打印",
|
||||
"report_scan_hint": "扫描以打开任务",
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+250
@@ -0,0 +1,250 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZLVS6B3E.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${t("adopt_problem_title",s)}</div>
|
||||
<div class="hint">${t("adopt_problem_hint",s)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._sensors.length===0?i`<div class="empty">${t("adopt_problem_none",s)}</div>`:i`
|
||||
<label class="select-all">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${a}
|
||||
@change=${this._toggleAll}
|
||||
/>
|
||||
<span>${t("selected",s)}: ${this._selected.size} / ${this._sensors.length}</span>
|
||||
</label>
|
||||
<div class="list">
|
||||
${this._sensors.map(e=>{let m=this._selected.has(e.entity_id),d=e.state==="on",c=[e.device_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${m}
|
||||
@change=${()=>this._toggle(e.entity_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.name}</span>
|
||||
<span class="chip ${d?"chip-active":"chip-ok"}">
|
||||
${d?t("adopt_problem_active",s):t("adopt_problem_ok",s)}
|
||||
</span>
|
||||
</div>
|
||||
${c?i`<div class="row-sub">${c}</div>`:l}
|
||||
<div class="row-target">
|
||||
→ ${e.suggested_object_name}${e.suggested_entry_id?l:i` <span class="new-tag">${t("adopt_problem_new_object",s)}</span>`}
|
||||
</div>
|
||||
${e.suggested_part_name?i`<div class="row-part">
|
||||
<ha-icon icon="mdi:package-variant-closed"></ha-icon>
|
||||
${t("adopt_problem_part",s).replace("{name}",e.suggested_part_name)}
|
||||
</div>`:l}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${!this._loading&&this._sensors.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("for_at_least_minutes",s)}</span>
|
||||
<input
|
||||
class="for-input"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1440"
|
||||
.value=${this._forMinutes}
|
||||
@input=${e=>this._forMinutes=e.target.value}
|
||||
/>
|
||||
</label>
|
||||
<div class="for-hint">${t("adopt_for_minutes_hint",s)}</div>
|
||||
`:l}
|
||||
|
||||
${!this._loading&&this._sensors.length>0&&this._users.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("adopt_problem_responsible",s)}</span>
|
||||
<select
|
||||
.value=${this._responsible}
|
||||
@change=${e=>{this._responsible=e.target.value}}
|
||||
>
|
||||
<option value="" ?selected=${!this._responsible}>${t("no_user_assigned",s)}</option>
|
||||
${this._users.map(e=>i`<option value=${e.id} ?selected=${e.id===this._responsible}>${e.name}</option>`)}
|
||||
</select>
|
||||
</label>
|
||||
`:l}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",s)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${t("adopt_problem_adopt",s)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};r.styles=_`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.hint {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
.loading,
|
||||
.empty {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 14px;
|
||||
padding: 12px 0;
|
||||
}
|
||||
.select-all {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
.select-all input {
|
||||
cursor: pointer;
|
||||
}
|
||||
.list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
overflow-y: auto;
|
||||
max-height: 50vh;
|
||||
}
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
padding: 8px;
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row input {
|
||||
margin-top: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
.row-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.row-name {
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
}
|
||||
.row-sub {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-target {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-part {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.row-part ha-icon {
|
||||
--mdc-icon-size: 14px;
|
||||
}
|
||||
.new-tag {
|
||||
font-style: italic;
|
||||
}
|
||||
.chip {
|
||||
font-size: 11px;
|
||||
padding: 1px 8px;
|
||||
border-radius: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.chip-active {
|
||||
background: var(--error-color, #f44336);
|
||||
color: #fff;
|
||||
}
|
||||
.chip-ok {
|
||||
background: var(--divider-color);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.responsible {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.for-input {
|
||||
width: 70px;
|
||||
background: var(--card-background-color);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 4px;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
.for-hint {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
margin: -4px 0 2px;
|
||||
}
|
||||
.responsible select {
|
||||
flex: 1;
|
||||
min-width: 140px;
|
||||
padding: 4px 6px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
`,o([g({attribute:!1})],r.prototype,"hass",2),o([n()],r.prototype,"_open",2),o([n()],r.prototype,"_loading",2),o([n()],r.prototype,"_adopting",2),o([n()],r.prototype,"_error",2),o([n()],r.prototype,"_sensors",2),o([n()],r.prototype,"_selected",2),o([n()],r.prototype,"_users",2),o([n()],r.prototype,"_responsible",2),o([n()],r.prototype,"_forMinutes",2);customElements.get("maintenance-adopt-problem-sensors-dialog")||customElements.define("maintenance-adopt-problem-sensors-dialog",r);export{r as MaintenanceAdoptProblemSensorsDialog};
|
||||
+250
@@ -0,0 +1,250 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{e as f}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-LXDQIXSO.js";import{a as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import{a as o,b as _,c as i,f as l,h,l as g,m as n,q as t,s as u,u as v}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var r=class extends h{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._sensors=[];this._selected=new Set;this._users=[];this._responsible="";this._forMinutes="0";this._localeReady=!1;this._userService=null;this._toggle=s=>{let a=new Set(this._selected);a.has(s)?a.delete(s):a.add(s),this._selected=a};this._toggleAll=()=>{this._selected.size===this._sensors.length?this._selected=new Set:this._selected=new Set(this._sensors.map(s=>s.entity_id))};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let s=this._sensors.filter(e=>this._selected.has(e.entity_id)).map(e=>({entity_id:e.entity_id,name:e.name,entry_id:e.suggested_entry_id??void 0,object_name:e.suggested_object_name,device_id:e.device_id??void 0,part_id:e.suggested_part_id??void 0,responsible_user_id:this._responsible||void 0,for_minutes:parseInt(this._forMinutes,10)>0?parseInt(this._forMinutes,10):void 0})),a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/adopt",selections:s});this.dispatchEvent(new CustomEvent("problem-sensors-adopted",{bubbles:!0,composed:!0,detail:a})),this._open=!1}catch(s){this._error=p(s,this._lang)}finally{this._adopting=!1}}}}get _lang(){return u(this.hass)}updated(s){s.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,v(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._sensors=[],this._selected=new Set,this._responsible="",this._forMinutes="0";try{this._userService?this._userService.updateHass(this.hass):this._userService=new f(this.hass);let[s,a]=await Promise.all([this.hass.connection.sendMessagePromise({type:"maintenance_supporter/problem_sensors/discover"}),this._userService.getUsers().catch(()=>[])]);this._sensors=s.sensors||[],this._selected=new Set(this._sensors.map(e=>e.entity_id)),this._users=a}catch(s){this._error=p(s,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let s=this._lang,a=this._sensors.length>0&&this._selected.size===this._sensors.length;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${t("adopt_problem_title",s)}</div>
|
||||
<div class="hint">${t("adopt_problem_hint",s)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:l}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._sensors.length===0?i`<div class="empty">${t("adopt_problem_none",s)}</div>`:i`
|
||||
<label class="select-all">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${a}
|
||||
@change=${this._toggleAll}
|
||||
/>
|
||||
<span>${t("selected",s)}: ${this._selected.size} / ${this._sensors.length}</span>
|
||||
</label>
|
||||
<div class="list">
|
||||
${this._sensors.map(e=>{let m=this._selected.has(e.entity_id),d=e.state==="on",c=[e.device_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${m}
|
||||
@change=${()=>this._toggle(e.entity_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.name}</span>
|
||||
<span class="chip ${d?"chip-active":"chip-ok"}">
|
||||
${d?t("adopt_problem_active",s):t("adopt_problem_ok",s)}
|
||||
</span>
|
||||
</div>
|
||||
${c?i`<div class="row-sub">${c}</div>`:l}
|
||||
<div class="row-target">
|
||||
→ ${e.suggested_object_name}${e.suggested_entry_id?l:i` <span class="new-tag">${t("adopt_problem_new_object",s)}</span>`}
|
||||
</div>
|
||||
${e.suggested_part_name?i`<div class="row-part">
|
||||
<ha-icon icon="mdi:package-variant-closed"></ha-icon>
|
||||
${t("adopt_problem_part",s).replace("{name}",e.suggested_part_name)}
|
||||
</div>`:l}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${!this._loading&&this._sensors.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("for_at_least_minutes",s)}</span>
|
||||
<input
|
||||
class="for-input"
|
||||
type="number"
|
||||
min="0"
|
||||
max="1440"
|
||||
.value=${this._forMinutes}
|
||||
@input=${e=>this._forMinutes=e.target.value}
|
||||
/>
|
||||
</label>
|
||||
<div class="for-hint">${t("adopt_for_minutes_hint",s)}</div>
|
||||
`:l}
|
||||
|
||||
${!this._loading&&this._sensors.length>0&&this._users.length>0?i`
|
||||
<label class="responsible">
|
||||
<span>${t("adopt_problem_responsible",s)}</span>
|
||||
<select
|
||||
.value=${this._responsible}
|
||||
@change=${e=>{this._responsible=e.target.value}}
|
||||
>
|
||||
<option value="" ?selected=${!this._responsible}>${t("no_user_assigned",s)}</option>
|
||||
${this._users.map(e=>i`<option value=${e.id} ?selected=${e.id===this._responsible}>${e.name}</option>`)}
|
||||
</select>
|
||||
</label>
|
||||
`:l}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",s)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${t("adopt_problem_adopt",s)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};r.styles=_`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.hint {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
.loading,
|
||||
.empty {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 14px;
|
||||
padding: 12px 0;
|
||||
}
|
||||
.select-all {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
}
|
||||
.select-all input {
|
||||
cursor: pointer;
|
||||
}
|
||||
.list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
overflow-y: auto;
|
||||
max-height: 50vh;
|
||||
}
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 10px;
|
||||
padding: 8px;
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row input {
|
||||
margin-top: 2px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.row-main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 2px;
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
.row-top {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.row-name {
|
||||
font-weight: 500;
|
||||
font-size: 13px;
|
||||
}
|
||||
.row-sub {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-target {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
}
|
||||
.row-part {
|
||||
color: var(--secondary-text-color);
|
||||
font-size: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
.row-part ha-icon {
|
||||
--mdc-icon-size: 14px;
|
||||
}
|
||||
.new-tag {
|
||||
font-style: italic;
|
||||
}
|
||||
.chip {
|
||||
font-size: 11px;
|
||||
padding: 1px 8px;
|
||||
border-radius: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.chip-active {
|
||||
background: var(--error-color, #f44336);
|
||||
color: #fff;
|
||||
}
|
||||
.chip-ok {
|
||||
background: var(--divider-color);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.responsible {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color);
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.for-input {
|
||||
width: 70px;
|
||||
background: var(--card-background-color);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color);
|
||||
border-radius: 4px;
|
||||
padding: 4px 6px;
|
||||
}
|
||||
.for-hint {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
margin: -4px 0 2px;
|
||||
}
|
||||
.responsible select {
|
||||
flex: 1;
|
||||
min-width: 140px;
|
||||
padding: 4px 6px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font-size: 13px;
|
||||
}
|
||||
.actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 8px;
|
||||
}
|
||||
`,o([g({attribute:!1})],r.prototype,"hass",2),o([n()],r.prototype,"_open",2),o([n()],r.prototype,"_loading",2),o([n()],r.prototype,"_adopting",2),o([n()],r.prototype,"_error",2),o([n()],r.prototype,"_sensors",2),o([n()],r.prototype,"_selected",2),o([n()],r.prototype,"_users",2),o([n()],r.prototype,"_responsible",2),o([n()],r.prototype,"_forMinutes",2);customElements.get("maintenance-adopt-problem-sensors-dialog")||customElements.define("maintenance-adopt-problem-sensors-dialog",r);export{r as MaintenanceAdoptProblemSensorsDialog};
|
||||
@@ -0,0 +1,88 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a,b as y,c as s,f as l,h as g,l as o,m as f,q as d,z as m}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{q as a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var s={entry_id:"object",name:"name",task_type:"maintenance_type",schedule_type:"schedule_type",interval_days:"interval_days",interval_anchor:"interval_anchor",warning_days:"warning_days",last_performed:"last_performed_optional",notes:"notes_optional",documentation_url:"documentation_url_optional",custom_icon:"custom_icon_optional",nfc_tag_id:"nfc_tag_id_optional",responsible_user_id:"responsible_user",entity_slug:"entity_slug",entity_id:"entity_id",area_id:"area_id_optional",manufacturer:"manufacturer_optional",model:"model_optional",serial_number:"serial_number_optional",installation_date:"installation_date_optional",warranty_expiry:"warranty_expiry_optional",checklist:"checklist_steps_optional",reason:"reason",feedback:"feedback",cost:"cost",duration:"duration",description:"description_optional",group_name:"name",group_description:"description_optional",environmental_entity:"environmental_entity_optional",environmental_attribute:"environmental_attribute_optional",trigger_above:"trigger_above",trigger_below:"trigger_below",trigger_equals:"trigger_equals",trigger_not_equals:"trigger_not_equals",trigger_for_minutes:"trigger_for_minutes"};function c(e,o){let r=s[e];if(!r)return e;let t=a(r,o);return t&&t!==r?t:e}function d(e){let r=e.match(/data\['([^']+)'\]/)?.[1],t;return(t=e.match(/length of value must be at most (\d+)/))?{field:r,rule:"too_long",param:t[1]}:(t=e.match(/length of value must be at least (\d+)/))?{field:r,rule:"too_short",param:t[1]}:(t=e.match(/value must be at most (\S+)/))?{field:r,rule:"value_too_high",param:t[1]}:(t=e.match(/value must be at least (\S+)/))?{field:r,rule:"value_too_low",param:t[1]}:/required key not provided/.test(e)?{field:r,rule:"required"}:(t=e.match(/expected (\w+)/))?{field:r,rule:"wrong_type",param:t[1]}:/value must be one of/.test(e)?{field:r,rule:"invalid_choice"}:/not a valid value/.test(e)?{field:r,rule:"invalid_value"}:{field:r,rule:"unknown"}}function g(e,o,r){if(r=r??a("action_error",o),typeof e=="string")return e;if(typeof e!="object"||e===null)return r;let t=e,_=t.message||t.error?.message||"";if(!_)return r;let i=d(_),l=i.field?c(i.field,o):"",n=u=>a(u,o).replace("{field}",l).replace("{n}",i.param??"");switch(i.rule){case"too_long":return n("err_too_long");case"too_short":return n("err_too_short");case"value_too_high":return n("err_value_too_high");case"value_too_low":return n("err_value_too_low");case"required":return n("err_required");case"wrong_type":return n("err_wrong_type").replace("{type}",i.param??"");case"invalid_choice":return n("err_invalid_choice");case"invalid_value":return n("err_invalid_value");default:return _||r}}export{g as a};
|
||||
@@ -0,0 +1,79 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
<label class="field">
|
||||
${this.label?i`<span class="label">${this.label}${this.required?i`<span class="req">*</span>`:o}</span>`:o}
|
||||
${this.multiline?i`
|
||||
<textarea
|
||||
.value=${this.value??""}
|
||||
rows=${this.rows}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
></textarea>`:i`
|
||||
<input
|
||||
.value=${this.value??""}
|
||||
.type=${this.type}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
step=${this.step??o}
|
||||
min=${this.min??o}
|
||||
max=${this.max??o}
|
||||
pattern=${this.pattern??o}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
/>`}
|
||||
${this.helper?i`<span class="helper">${this.helper}</span>`:o}
|
||||
</label>
|
||||
`}};e.styles=l`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
input {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
}
|
||||
input:focus {
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
textarea {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
resize: vertical;
|
||||
}
|
||||
textarea:focus { border-color: var(--primary-color); }
|
||||
textarea:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
`,r([t()],e.prototype,"label",2),r([t()],e.prototype,"value",2),r([t()],e.prototype,"placeholder",2),r([t()],e.prototype,"type",2),r([t({type:Boolean})],e.prototype,"required",2),r([t({type:Boolean})],e.prototype,"disabled",2),r([t()],e.prototype,"step",2),r([t()],e.prototype,"min",2),r([t()],e.prototype,"max",2),r([t()],e.prototype,"pattern",2),r([t()],e.prototype,"helper",2),r([t({type:Boolean})],e.prototype,"multiline",2),r([t({type:Number})],e.prototype,"rows",2);customElements.get("ms-textfield")||customElements.define("ms-textfield",e);
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
var l=[{key:"name",labelKey:"name",required:!0},{key:"ref_no",labelKey:"ref_number"},{key:"manufacturer",labelKey:"manufacturer"},{key:"model",labelKey:"model"},{key:"serial_number",labelKey:"serial_number_label"},{key:"installation_date",labelKey:"installed"},{key:"warranty_expiry",labelKey:"warranty"},{key:"area_id",labelKey:"area"},{key:"documentation_url",labelKey:"documentation_url_label"},{key:"notes",labelKey:"object_notes_label"},{key:"task_count",labelKey:"tasks"},{key:"actions",labelKey:"actions"}],i=l.map(a=>a.key),r=["name","manufacturer","model","serial_number","installation_date","warranty_expiry","area_id","task_count","actions"];function o(a){if(!Array.isArray(a))return[...r];let t=new Set,e=[];for(let n of a)typeof n=="string"&&i.includes(n)&&!t.has(n)&&(t.add(n),e.push(n));return e.length?(e.includes("name")||e.unshift("name"),e):[...r]}export{l as a,r as b,o as c};
|
||||
@@ -0,0 +1,153 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${n}</div>
|
||||
<div class="content">
|
||||
${this._error?l`<div class="error">${this._error}</div>`:o}
|
||||
<ms-textfield
|
||||
label="${i("name",e)}"
|
||||
required
|
||||
.value=${this._name}
|
||||
@input=${t=>this._name=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("manufacturer_optional",e)}"
|
||||
.value=${this._manufacturer}
|
||||
@input=${t=>this._manufacturer=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("model_optional",e)}"
|
||||
.value=${this._model}
|
||||
@input=${t=>this._model=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("serial_number_optional",e)}"
|
||||
.value=${this._serialNumber}
|
||||
@input=${t=>this._serialNumber=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("documentation_url_optional",e)}"
|
||||
type="url"
|
||||
.value=${this._documentationUrl}
|
||||
@input=${t=>this._documentationUrl=t.target.value}
|
||||
></ms-textfield>
|
||||
<ha-area-picker
|
||||
.hass=${this.hass}
|
||||
label="${i("area_id_optional",e)}"
|
||||
.value=${this._areaId}
|
||||
@value-changed=${t=>this._areaId=t.detail.value||""}
|
||||
></ha-area-picker>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("installation_date_optional",e)}"
|
||||
.value=${this._installationDate}
|
||||
@value-changed=${t=>this._installationDate=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("warranty_expiry_optional",e)}"
|
||||
.value=${this._warrantyExpiry}
|
||||
@value-changed=${t=>this._warrantyExpiry=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{device:this._haDeviceId||void 0}}
|
||||
.schema=${[{name:"device",selector:{device:{}}}]}
|
||||
.computeLabel=${()=>i("link_device_optional",e)}
|
||||
@value-changed=${t=>this._haDeviceId=t.detail.value?.device||""}
|
||||
></ha-form>
|
||||
${this._parentChoices().length?l`<label class="textarea-field">
|
||||
<span class="textarea-label">${i("parent_object_optional",e)}</span>
|
||||
<select
|
||||
class="parent-select"
|
||||
.value=${this._parentEntryId}
|
||||
@change=${t=>this._parentEntryId=t.target.value}
|
||||
>
|
||||
<option value="" ?selected=${!this._parentEntryId}>
|
||||
${i("parent_none",e)}
|
||||
</option>
|
||||
${this._parentChoices().map(t=>l`<option
|
||||
value=${t.entry_id}
|
||||
?selected=${this._parentEntryId===t.entry_id}
|
||||
>${t.object.name}</option>`)}
|
||||
</select>
|
||||
</label>`:o}
|
||||
<label class="textarea-field">
|
||||
<span class="textarea-label">${i("object_notes_optional",e)}</span>
|
||||
<textarea
|
||||
rows="3"
|
||||
.value=${this._notes}
|
||||
@input=${t=>this._notes=t.target.value}
|
||||
></textarea>
|
||||
<span class="md-hint">${i("notes_markdown_hint",e)}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${i("cancel",this._lang)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._save}
|
||||
.disabled=${this._loading||!this._name.trim()}
|
||||
>
|
||||
${this._loading?i("saving",this._lang):i("save",this._lang)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};a.styles=_`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
ms-textfield {
|
||||
display: block;
|
||||
}
|
||||
.textarea-field {
|
||||
display: flex; flex-direction: column; gap: 4px;
|
||||
}
|
||||
.textarea-label {
|
||||
font-size: 12px; color: var(--secondary-text-color, #888); font-weight: 500;
|
||||
}
|
||||
.textarea-field textarea {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
resize: vertical;
|
||||
}
|
||||
.textarea-field textarea:focus {
|
||||
outline: none; border-color: var(--primary-color);
|
||||
}
|
||||
.md-hint {
|
||||
font-size: 11px; color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.parent-select {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
`,r([d({attribute:!1})],a.prototype,"hass",2),r([d({attribute:!1})],a.prototype,"objects",2),r([s()],a.prototype,"_open",2),r([s()],a.prototype,"_loading",2),r([s()],a.prototype,"_error",2),r([s()],a.prototype,"_name",2),r([s()],a.prototype,"_manufacturer",2),r([s()],a.prototype,"_model",2),r([s()],a.prototype,"_serialNumber",2),r([s()],a.prototype,"_areaId",2),r([s()],a.prototype,"_installationDate",2),r([s()],a.prototype,"_warrantyExpiry",2),r([s()],a.prototype,"_documentationUrl",2),r([s()],a.prototype,"_notes",2),r([s()],a.prototype,"_haDeviceId",2),r([s()],a.prototype,"_parentEntryId",2),r([s()],a.prototype,"_entryId",2);customElements.get("maintenance-object-dialog")||customElements.define("maintenance-object-dialog",a);export{a};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
function c(o,t,e){let l=new Blob([o],{type:e}),d=URL.createObjectURL(l),n=document.createElement("a");n.href=d,n.download=t,n.target="_blank",n.rel="noopener",n.style.display="none",document.body.appendChild(n),n.dispatchEvent(new MouseEvent("click")),document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(d),6e4)}function r(o,t){let e=document.createElement("a");e.href=o,e.download=t,e.target="_blank",e.rel="noopener",e.style.display="none",document.body.appendChild(e),e.dispatchEvent(new MouseEvent("click")),document.body.removeChild(e)}export{c as a,r as b};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{q as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";function f(r){return`${r.entry_id??""}\0${r.part_id}`}function g(r,n,i,o){let t=!!r.entry_id&&r.entry_id!==n,e=t?r.entry_id:n,s=i.find(l=>l.entry_id===e),a=(s?.parts||[]).find(l=>l.id===r.part_id)||null,u=t&&s?.object?.name||"",d=a?.name||p("shared_part_unknown",o);return{part:a,foreign:t,ownerName:u,label:u?`${d} (${u})`:d}}function _(r,n,i,o){let{part:t,label:e}=g(r,n,i,o),s=t&&t.stock!==null&&t.stock!==void 0?` (${t.stock}${t.unit?" "+t.unit:""})`:"",a=t?.storage_location?` \u2014 ${t.storage_location}`:"";return`${r.quantity}\xD7 ${e}${s}${a}`}function R(r,n,i,o){let e=(i.find(a=>a.entry_id===n)?.parts||[]).map(a=>({...a})),s=new Set(e.map(a=>f({part_id:a.id})));for(let a of r?.consumes_parts||[]){if(!a.entry_id||a.entry_id===n)continue;let u=f(a);if(s.has(u))continue;s.add(u);let{part:d,ownerName:l}=g(a,n,i,o);e.push({id:a.part_id,name:d?.name||p("shared_part_unknown",o),unit:d?.unit,stock:d?.stock??null,storage_location:d?.storage_location,entry_id:a.entry_id,owner_name:l})}return e}function w(){let r=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(r),Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function c(r){let n=r?.reading_values;if(!Array.isArray(n))return[];let i=[],o=new Set;for(let t of n){if(!t||typeof t!="object")continue;let e=t;typeof e.id!="string"||!e.id||o.has(e.id)||typeof e.value!="number"||!Number.isFinite(e.value)||(o.add(e.id),i.push({id:e.id,name:typeof e.name=="string"?e.name:e.id,unit:typeof e.unit=="string"?e.unit:null,value:e.value}))}return i}function y(r){return r.filter(n=>n.type==="completed"&&(n.reading_value!=null||c(n).length>0)).sort((n,i)=>n.timestamp.localeCompare(i.timestamp))}function S(r){return y(r??[]).map(n=>({timestamp:n.timestamp,values:c(n)})).filter(n=>n.values.length>0)}function P(r,n,i){let o;for(let t of r){if(i!==void 0){let s=new Date(t.timestamp).getTime();if(!isNaN(s)&&s>=i)break}let e=t.values.find(s=>s.id===n);e&&(o=e)}return o}function b(r,n,i){let o=c(n).find(e=>e.id===i);if(!o)return null;let t=null;for(let e of y(r)){if(e.timestamp>=n.timestamp)break;let s=c(e).find(a=>a.id===i);s&&(t=s.value)}return t==null?null:o.value-t}function E(r){let n=new Set,i=new Set;for(let o of r){let t=(o.name||"").trim().toLowerCase();t&&(n.has(t)?i.add(o.id):n.add(t))}return i}function v(r){let n=[],i=new Set,o=new Set;for(let t of r){let e=(t.name||"").trim();if(!(!e||i.has(t.id)||o.has(e.toLowerCase()))&&(i.add(t.id),o.add(e.toLowerCase()),n.push({id:t.id,name:e,unit:(t.unit||"").trim()||null}),n.length>=20))break}return n}var x=["notes","cost","duration","photo","user"],h={notes:"notes_label",cost:"cost",duration:"duration",photo:"photo_label",user:"user_label"};export{f as a,_ as b,R as c,w as d,c as e,S as f,P as g,b as h,E as i,v as j,x as k,h as l};
|
||||
@@ -0,0 +1,88 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{A as m,a,b as y,c as s,f as l,h as g,l as o,m as f,q as d}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
@@ -0,0 +1,213 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-D52RXZ4R.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
<meta name="color-scheme" content="light">
|
||||
<title>${u}</title>
|
||||
<style>
|
||||
/* Printable sheet \u2014 must not inherit the phone's dark theme. The QR images
|
||||
carry their own white quiet zone and stay scannable either way, but the
|
||||
labels below are explicit dark greys and would vanish on a WebView's dark
|
||||
canvas. Same reasoning as helpers/report.ts. */
|
||||
:root{color-scheme:light}
|
||||
body{font-family:sans-serif;text-align:center;padding:20px;background:#fff;color:#1a1a1a}
|
||||
h2{margin:0 0 4px}
|
||||
.sub{color:#666;font-size:14px;margin-bottom:16px}
|
||||
.qr-row{display:flex;justify-content:center;gap:24px;margin:12px 0}
|
||||
.qr-col{display:flex;flex-direction:column;align-items:center;gap:6px}
|
||||
.qr-col img{width:${_?"200px":"280px"}}
|
||||
.qr-label{font-size:13px;font-weight:500;color:#333}
|
||||
.url{font-size:10px;color:#999;word-break:break-all;margin-top:8px;max-width:480px}
|
||||
</style></head><body>
|
||||
<h2>${u}</h2>
|
||||
${m?`<div class="sub">${m}</div>`:""}
|
||||
<div class="qr-row">
|
||||
<div class="qr-col">
|
||||
<img src="${f(this._viewResult.svg_data_uri)}" alt="QR Info" />
|
||||
<div class="qr-label">${w}</div>
|
||||
</div>
|
||||
${_?`<div class="qr-col">
|
||||
<img src="${f(this._completeResult.svg_data_uri)}" alt="QR Complete" />
|
||||
<div class="qr-label">${$}</div>
|
||||
</div>`:""}
|
||||
</div>
|
||||
<div class="url">${d(this._viewResult.url)}</div>
|
||||
<script>setTimeout(()=>window.print(),300)<\/script>
|
||||
</body></html>`),s.document.close()}_downloadSvg(e,i){let r=decodeURIComponent(e.svg_data_uri.replace("data:image/svg+xml,","")),s=this._taskName?`${this._objectName}-${this._taskName}`:this._objectName;x(r,`qr-${q(s)}-${i}.svg`,"image/svg+xml")}_close(){this._open=!1,this._viewResult=null,this._completeResult=null,this._error="",this._loading=!1}render(){if(!this._open)return n``;let e=this.lang||this.hass?.language||"en",i=this._taskName?`${t("qr_code",e)}: ${this._objectName} \u2014 ${this._taskName}`:`${t("qr_code",e)}: ${this._objectName}`,r=!!this._viewResult;return n`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${i}</div>
|
||||
<div class="content">
|
||||
${this._loading?n`<div class="loading">${t("qr_generating",e)}</div>`:this._error?n`<div class="error">${this._error}</div>`:r?n`
|
||||
<div class="qr-pair">
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image ${this._completeResult?"small":""}"
|
||||
src="${this._viewResult.svg_data_uri}"
|
||||
alt="QR Info"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_view",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._viewResult,"info")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
${this._completeResult?n`
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image small"
|
||||
src="${this._completeResult.svg_data_uri}"
|
||||
alt="QR Complete"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_complete",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._completeResult,"complete")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
`:p}
|
||||
</div>
|
||||
<div class="url-display">${this._viewResult.url}</div>
|
||||
`:p}
|
||||
<div class="action-row">
|
||||
<label>${t("qr_url_mode",e)}</label>
|
||||
<div class="action-toggle">
|
||||
<button class="toggle-btn ${this._urlMode==="companion"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("companion")}>${t("qr_mode_companion",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="local"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("local")}>${t("qr_mode_local",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="server"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("server")}>${t("qr_mode_server",e)}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",e)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._print}
|
||||
.disabled=${!r}
|
||||
>
|
||||
${t("qr_print",e)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};o.styles=v`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
.qr-pair {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
.qr-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
.qr-image {
|
||||
width: 240px;
|
||||
height: 240px;
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
.qr-image.small {
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
}
|
||||
.qr-item-label {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--secondary-text-color);
|
||||
text-align: center;
|
||||
}
|
||||
.dl-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
background: none;
|
||||
border: 1px solid var(--divider-color, #e0e0e0);
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
color: var(--primary-text-color);
|
||||
padding: 6px 14px;
|
||||
border-radius: 18px;
|
||||
transition: background 0.2s, border-color 0.2s;
|
||||
}
|
||||
.dl-btn:hover {
|
||||
background: var(--secondary-background-color, #f5f5f5);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.dl-btn ha-icon {
|
||||
--mdc-icon-size: 18px;
|
||||
}
|
||||
.url-display {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
}
|
||||
.loading {
|
||||
padding: 40px 0;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.error {
|
||||
padding: 20px 0;
|
||||
color: var(--error-color, #f44336);
|
||||
}
|
||||
.action-row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
.action-row label {
|
||||
font-size: 13px;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.action-toggle {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background: var(--divider-color, #e0e0e0);
|
||||
border-radius: 6px;
|
||||
padding: 3px;
|
||||
}
|
||||
.toggle-btn {
|
||||
flex: 1;
|
||||
padding: 8px 12px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--primary-text-color);
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
transition: all 0.2s;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.toggle-btn:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.toggle-btn.active {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, #fff);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
`,a([h({attribute:!1})],o.prototype,"hass",2),a([h()],o.prototype,"lang",2),a([c()],o.prototype,"_open",2),a([c()],o.prototype,"_loading",2),a([c()],o.prototype,"_error",2),a([c()],o.prototype,"_viewResult",2),a([c()],o.prototype,"_completeResult",2),a([c()],o.prototype,"_urlMode",2);customElements.get("maintenance-qr-dialog")||customElements.define("maintenance-qr-dialog",o);export{o as a};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{q as o}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var v={already_archived:"ws_err_already_archived",already_paused:"ws_err_already_paused",archived:"ws_err_archived",create_failed:"ws_err_create_failed",duplicate_failed:"ws_err_duplicate_failed",empty:"ws_err_empty",empty_csv:"ws_err_empty_csv",invalid_cursor:"ws_err_invalid_cursor",invalid_date:"ws_err_invalid_date",invalid_device:"ws_err_invalid_device",invalid_entity_slug:"ws_err_invalid_entity_slug",invalid_format:"ws_err_invalid_format",invalid_input:"ws_err_invalid_input",invalid_parent:"ws_err_invalid_parent",invalid_range:"ws_err_invalid_range",invalid_target:"ws_err_invalid_target",invalid_trigger_config:"ws_err_invalid_trigger_config",invalid_url:"ws_err_invalid_url",invalid_user:"ws_err_invalid_user",invalid_view:"ws_err_invalid_view",limit_reached:"ws_err_limit_reached",no_defaults:"ws_err_no_defaults",no_phases:"ws_err_no_phases",no_url:"ws_err_no_url",not_archived:"ws_err_not_archived",not_available:"ws_err_not_available",not_configured:"ws_err_not_configured",not_found:"ws_err_not_found",not_loaded:"ws_err_not_loaded",not_paused:"ws_err_not_paused",replace_failed:"ws_err_replace_failed",self_link_device:"ws_err_self_link_device",storage_unavailable:"ws_err_storage_unavailable",too_early:"ws_err_too_early",too_large:"ws_err_too_large",too_many:"ws_err_too_many",too_many_views:"ws_err_too_many_views",unauthorized:"ws_err_unauthorized",unavailable:"ws_err_unavailable"},g={entry_id:"object",name:"name",task_type:"maintenance_type",schedule_type:"schedule_type",interval_days:"interval_days",interval_anchor:"interval_anchor",warning_days:"warning_days",last_performed:"last_performed_optional",notes:"notes_optional",documentation_url:"documentation_url_optional",custom_icon:"custom_icon_optional",nfc_tag_id:"nfc_tag_id_optional",responsible_user_id:"responsible_user",entity_slug:"entity_slug",entity_id:"entity_id",area_id:"area_id_optional",manufacturer:"manufacturer_optional",model:"model_optional",serial_number:"serial_number_optional",installation_date:"installation_date_optional",warranty_expiry:"warranty_expiry_optional",checklist:"checklist_steps_optional",reason:"reason",feedback:"feedback",cost:"cost",duration:"duration",description:"description_optional",environmental_entity:"environmental_entity_optional",environmental_attribute:"environmental_attribute_optional",trigger_above:"trigger_above",trigger_below:"trigger_below",trigger_equals:"trigger_equals",trigger_not_equals:"trigger_not_equals",trigger_for_minutes:"trigger_for_minutes"};function p(e){let _=e.replace(/_ids?$/,"").split("_").filter(Boolean);if(_.length===0)return e;let r=_.join(" ");return r.charAt(0).toUpperCase()+r.slice(1)}function w(e,_){let r=g[e];if(r){let t=o(r,_);if(t&&t!==r)return t}return p(e)}function f(e){let _=[...e.matchAll(/\['([^']+)'\]/g)].map(n=>n[1]),r=_.length?_[_.length-1]:void 0,t;return(t=e.match(/length of value must be at most (\d+)/))?{field:r,rule:"too_long",param:t[1]}:(t=e.match(/length of value must be at least (\d+)/))?{field:r,rule:"too_short",param:t[1]}:(t=e.match(/value must be at most (\S+)/))?{field:r,rule:"value_too_high",param:t[1]}:(t=e.match(/value must be at least (\S+)/))?{field:r,rule:"value_too_low",param:t[1]}:/required key not provided/.test(e)?{field:r,rule:"required"}:(t=e.match(/expected (\w+)/))?{field:r,rule:"wrong_type",param:t[1]}:/value must be one of/.test(e)?{field:r,rule:"invalid_choice"}:/not a valid value/.test(e)?{field:r,rule:"invalid_value"}:{field:r,rule:"unknown"}}var u=e=>e.toLowerCase().split(/[^a-z0-9]+/).filter(_=>_.length>1);function m(e,_){let r=new Set(u(_));return u(e).every(t=>r.has(t))}function y(e,_,r){if(r=r??o("action_error",_),typeof e=="string")return e;if(typeof e!="object"||e===null)return r;let t=e,n=t.message||t.error?.message||"",s=t.code||t.error?.code||"",d=s?v[s]:void 0;if(!n&&!d)return r;let a=f(n),c=a.field?w(a.field,_):"",i=l=>o(l,_).replace("{field}",c).replace("{n}",a.param??"");switch(a.rule){case"too_long":return i("err_too_long");case"too_short":return i("err_too_short");case"value_too_high":return i("err_value_too_high");case"value_too_low":return i("err_value_too_low");case"required":return i("err_required");case"wrong_type":return i("err_wrong_type").replace("{type}",a.param??"");case"invalid_choice":return i("err_invalid_choice");case"invalid_value":return i("err_invalid_value");default:if(d){let l=o(d,_);return n&&!m(n,s)?`${l} (${n})`:l}return n||r}}export{y as a};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{q as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";function f(r){return`${r.entry_id??""}\0${r.part_id}`}function g(r,n,i,o){let t=!!r.entry_id&&r.entry_id!==n,e=t?r.entry_id:n,s=i.find(l=>l.entry_id===e),a=(s?.parts||[]).find(l=>l.id===r.part_id)||null,u=t&&s?.object?.name||"",d=a?.name||p("shared_part_unknown",o);return{part:a,foreign:t,ownerName:u,label:u?`${d} (${u})`:d}}function _(r,n,i,o){let{part:t,label:e}=g(r,n,i,o),s=t&&t.stock!==null&&t.stock!==void 0?` (${t.stock}${t.unit?" "+t.unit:""})`:"",a=t?.storage_location?` \u2014 ${t.storage_location}`:"";return`${r.quantity}\xD7 ${e}${s}${a}`}function R(r,n,i,o){let e=(i.find(a=>a.entry_id===n)?.parts||[]).map(a=>({...a})),s=new Set(e.map(a=>f({part_id:a.id})));for(let a of r?.consumes_parts||[]){if(!a.entry_id||a.entry_id===n)continue;let u=f(a);if(s.has(u))continue;s.add(u);let{part:d,ownerName:l}=g(a,n,i,o);e.push({id:a.part_id,name:d?.name||p("shared_part_unknown",o),unit:d?.unit,stock:d?.stock??null,storage_location:d?.storage_location,entry_id:a.entry_id,owner_name:l})}return e}function w(){let r=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(r),Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function c(r){let n=r?.reading_values;if(!Array.isArray(n))return[];let i=[],o=new Set;for(let t of n){if(!t||typeof t!="object")continue;let e=t;typeof e.id!="string"||!e.id||o.has(e.id)||typeof e.value!="number"||!Number.isFinite(e.value)||(o.add(e.id),i.push({id:e.id,name:typeof e.name=="string"?e.name:e.id,unit:typeof e.unit=="string"?e.unit:null,value:e.value}))}return i}function y(r){return r.filter(n=>n.type==="completed"&&(n.reading_value!=null||c(n).length>0)).sort((n,i)=>n.timestamp.localeCompare(i.timestamp))}function S(r){return y(r??[]).map(n=>({timestamp:n.timestamp,values:c(n)})).filter(n=>n.values.length>0)}function P(r,n,i){let o;for(let t of r){if(i!==void 0){let s=new Date(t.timestamp).getTime();if(!isNaN(s)&&s>=i)break}let e=t.values.find(s=>s.id===n);e&&(o=e)}return o}function b(r,n,i){let o=c(n).find(e=>e.id===i);if(!o)return null;let t=null;for(let e of y(r)){if(e.timestamp>=n.timestamp)break;let s=c(e).find(a=>a.id===i);s&&(t=s.value)}return t==null?null:o.value-t}function E(r){let n=new Set,i=new Set;for(let o of r){let t=(o.name||"").trim().toLowerCase();t&&(n.has(t)?i.add(o.id):n.add(t))}return i}function v(r){let n=[],i=new Set,o=new Set;for(let t of r){let e=(t.name||"").trim();if(!(!e||i.has(t.id)||o.has(e.toLowerCase()))&&(i.add(t.id),o.add(e.toLowerCase()),n.push({id:t.id,name:e,unit:(t.unit||"").trim()||null}),n.length>=20))break}return n}var x=["notes","cost","duration","photo","user"],h={notes:"notes_label",cost:"cost",duration:"duration",photo:"photo_label",user:"user_label"};export{f as a,_ as b,R as c,w as d,c as e,S as f,P as g,b as h,E as i,v as j,x as k,h as l};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,213 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-TVK2JN4G.js";import{a,b as v,c as n,f as p,h as b,l as h,m as c,q as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";function d(l){return l.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}function f(l){return!l.startsWith("data:image/svg+xml,")&&!l.startsWith("data:image/png;base64,")?"":d(l)}function q(l){return l.replace(/[/\\:*?"<>|#%]+/g,"").replace(/\s+/g,"-").toLowerCase().substring(0,100)}var o=class extends b{constructor(){super(...arguments);this.lang="en";this._open=!1;this._loading=!1;this._error="";this._viewResult=null;this._completeResult=null;this._urlMode="companion";this._entryId="";this._taskId=null;this._objectName="";this._taskName="";this._generateSeq=0}openForObject(e,i){this._entryId=e,this._taskId=null,this._objectName=i,this._taskName="",this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}openForTask(e,i,r,s){this._entryId=e,this._taskId=i,this._objectName=r,this._taskName=s,this._urlMode="companion",this._error="",this._viewResult=null,this._completeResult=null,this._open=!0,this._generate()}async _generate(){let e=++this._generateSeq;this._loading=!0,this._error="",this._viewResult=null,this._completeResult=null;try{let i={type:"maintenance_supporter/qr/generate",entry_id:this._entryId,url_mode:this._urlMode};this._taskId&&(i.task_id=this._taskId);let r=[this.hass.connection.sendMessagePromise({...i,action:"view"})];this._taskId&&r.push(this.hass.connection.sendMessagePromise({...i,action:"complete"}));let s=await Promise.all(r);if(e!==this._generateSeq)return;this._viewResult=s[0],s.length>1&&(this._completeResult=s[1])}catch(i){if(e!==this._generateSeq)return;let r=i?.code,s=i?.message;this._error=r==="no_url"||typeof s=="string"&&s.includes("No Home Assistant URL")?t("qr_error_no_url",this.lang):t("qr_error",this.lang)}finally{e===this._generateSeq&&(this._loading=!1)}}_setUrlMode(e){this._urlMode!==e&&(this._urlMode=e,this._generate())}_print(){if(!this._viewResult)return;let e=this._viewResult,i=e.label.task_name?`${e.label.object_name} \u2014 ${e.label.task_name}`:e.label.object_name,r=[e.label.manufacturer,e.label.model].filter(Boolean).join(" "),s=window.open("","_blank","width=600,height=500");if(!s)return;let g=this.lang||"en",u=d(i),m=d(r),_=!!this._completeResult,w=d(t("qr_action_view",g)),$=d(t("qr_action_complete",g));s.document.write(`<!DOCTYPE html><html><head><meta charset="utf-8">
|
||||
<meta name="color-scheme" content="light">
|
||||
<title>${u}</title>
|
||||
<style>
|
||||
/* Printable sheet \u2014 must not inherit the phone's dark theme. The QR images
|
||||
carry their own white quiet zone and stay scannable either way, but the
|
||||
labels below are explicit dark greys and would vanish on a WebView's dark
|
||||
canvas. Same reasoning as helpers/report.ts. */
|
||||
:root{color-scheme:light}
|
||||
body{font-family:sans-serif;text-align:center;padding:20px;background:#fff;color:#1a1a1a}
|
||||
h2{margin:0 0 4px}
|
||||
.sub{color:#666;font-size:14px;margin-bottom:16px}
|
||||
.qr-row{display:flex;justify-content:center;gap:24px;margin:12px 0}
|
||||
.qr-col{display:flex;flex-direction:column;align-items:center;gap:6px}
|
||||
.qr-col img{width:${_?"200px":"280px"}}
|
||||
.qr-label{font-size:13px;font-weight:500;color:#333}
|
||||
.url{font-size:10px;color:#999;word-break:break-all;margin-top:8px;max-width:480px}
|
||||
</style></head><body>
|
||||
<h2>${u}</h2>
|
||||
${m?`<div class="sub">${m}</div>`:""}
|
||||
<div class="qr-row">
|
||||
<div class="qr-col">
|
||||
<img src="${f(this._viewResult.svg_data_uri)}" alt="QR Info" />
|
||||
<div class="qr-label">${w}</div>
|
||||
</div>
|
||||
${_?`<div class="qr-col">
|
||||
<img src="${f(this._completeResult.svg_data_uri)}" alt="QR Complete" />
|
||||
<div class="qr-label">${$}</div>
|
||||
</div>`:""}
|
||||
</div>
|
||||
<div class="url">${d(this._viewResult.url)}</div>
|
||||
<script>setTimeout(()=>window.print(),300)<\/script>
|
||||
</body></html>`),s.document.close()}_downloadSvg(e,i){let r=decodeURIComponent(e.svg_data_uri.replace("data:image/svg+xml,","")),s=this._taskName?`${this._objectName}-${this._taskName}`:this._objectName;x(r,`qr-${q(s)}-${i}.svg`,"image/svg+xml")}_close(){this._open=!1,this._viewResult=null,this._completeResult=null,this._error="",this._loading=!1}render(){if(!this._open)return n``;let e=this.lang||this.hass?.language||"en",i=this._taskName?`${t("qr_code",e)}: ${this._objectName} \u2014 ${this._taskName}`:`${t("qr_code",e)}: ${this._objectName}`,r=!!this._viewResult;return n`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${i}</div>
|
||||
<div class="content">
|
||||
${this._loading?n`<div class="loading">${t("qr_generating",e)}</div>`:this._error?n`<div class="error">${this._error}</div>`:r?n`
|
||||
<div class="qr-pair">
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image ${this._completeResult?"small":""}"
|
||||
src="${this._viewResult.svg_data_uri}"
|
||||
alt="QR Info"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_view",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._viewResult,"info")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
${this._completeResult?n`
|
||||
<div class="qr-item">
|
||||
<img
|
||||
class="qr-image small"
|
||||
src="${this._completeResult.svg_data_uri}"
|
||||
alt="QR Complete"
|
||||
/>
|
||||
<div class="qr-item-label">${t("qr_action_complete",e)}</div>
|
||||
<button class="dl-btn"
|
||||
@click=${()=>this._downloadSvg(this._completeResult,"complete")}>
|
||||
<ha-icon icon="mdi:download"></ha-icon>
|
||||
${t("qr_download",e)}
|
||||
</button>
|
||||
</div>
|
||||
`:p}
|
||||
</div>
|
||||
<div class="url-display">${this._viewResult.url}</div>
|
||||
`:p}
|
||||
<div class="action-row">
|
||||
<label>${t("qr_url_mode",e)}</label>
|
||||
<div class="action-toggle">
|
||||
<button class="toggle-btn ${this._urlMode==="companion"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("companion")}>${t("qr_mode_companion",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="local"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("local")}>${t("qr_mode_local",e)}</button>
|
||||
<button class="toggle-btn ${this._urlMode==="server"?"active":""}"
|
||||
@click=${()=>this._setUrlMode("server")}>${t("qr_mode_server",e)}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${t("cancel",e)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._print}
|
||||
.disabled=${!r}
|
||||
>
|
||||
${t("qr_print",e)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};o.styles=v`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
.qr-pair {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
.qr-item {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
}
|
||||
.qr-image {
|
||||
width: 240px;
|
||||
height: 240px;
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
.qr-image.small {
|
||||
width: 180px;
|
||||
height: 180px;
|
||||
}
|
||||
.qr-item-label {
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
color: var(--secondary-text-color);
|
||||
text-align: center;
|
||||
}
|
||||
.dl-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
background: none;
|
||||
border: 1px solid var(--divider-color, #e0e0e0);
|
||||
cursor: pointer;
|
||||
font-size: 13px;
|
||||
color: var(--primary-text-color);
|
||||
padding: 6px 14px;
|
||||
border-radius: 18px;
|
||||
transition: background 0.2s, border-color 0.2s;
|
||||
}
|
||||
.dl-btn:hover {
|
||||
background: var(--secondary-background-color, #f5f5f5);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.dl-btn ha-icon {
|
||||
--mdc-icon-size: 18px;
|
||||
}
|
||||
.url-display {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
word-break: break-all;
|
||||
text-align: center;
|
||||
max-width: 400px;
|
||||
}
|
||||
.loading {
|
||||
padding: 40px 0;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.error {
|
||||
padding: 20px 0;
|
||||
color: var(--error-color, #f44336);
|
||||
}
|
||||
.action-row {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
.action-row label {
|
||||
font-size: 13px;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.action-toggle {
|
||||
display: flex;
|
||||
gap: 4px;
|
||||
background: var(--divider-color, #e0e0e0);
|
||||
border-radius: 6px;
|
||||
padding: 3px;
|
||||
}
|
||||
.toggle-btn {
|
||||
flex: 1;
|
||||
padding: 8px 12px;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: var(--primary-text-color);
|
||||
cursor: pointer;
|
||||
border-radius: 4px;
|
||||
font-size: 13px;
|
||||
transition: all 0.2s;
|
||||
line-height: 1.3;
|
||||
}
|
||||
.toggle-btn:hover {
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.toggle-btn.active {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, #fff);
|
||||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
`,a([h({attribute:!1})],o.prototype,"hass",2),a([h()],o.prototype,"lang",2),a([c()],o.prototype,"_open",2),a([c()],o.prototype,"_loading",2),a([c()],o.prototype,"_error",2),a([c()],o.prototype,"_viewResult",2),a([c()],o.prototype,"_completeResult",2),a([c()],o.prototype,"_urlMode",2);customElements.get("maintenance-qr-dialog")||customElements.define("maintenance-qr-dialog",o);export{o as a};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{c as r,f as i}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var a=["#c62828","#ad1457","#6a1b9a","#4527a0","#283593","#1565c0","#00838f","#2e7d32","#558b2f","#ef6c00","#6d4c41","#546e7a"];function u(e){let s=(e||"").split(/\s+/).filter(Boolean);return s.length===0?"?":s.length===1?s[0][0].toUpperCase():(s[0][0]+s[s.length-1][0]).toUpperCase()}function c(e){let s=0;for(let n of e)s=s*31+n.charCodeAt(0)>>>0;return a[s%a.length]}function o(e){return e?{id:e.id,name:e.name,initials:e.initials||u(e.name),color:e.color||c(e.id)}:null}function h(e){return e?r`<span class="person-avatar" style="--person-color: ${e.color}" title=${e.name}>${e.initials}</span>`:i}function m(e,s=""){return e?r`<span class="person-chip ${s}" title=${e.name}>${h(e)}<span class="person-name">${e.name}</span></span>`:i}var l=class{constructor(s){this.usersCache=null;this.cacheTimestamp=0;this.CACHE_TTL_MS=6e4;this.hass=s}updateHass(s){this.hass=s}async getUsers(s=!1){let n=Date.now();if(!s&&this.usersCache&&n-this.cacheTimestamp<this.CACHE_TTL_MS)return this.usersCache;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/users/list"});return this.usersCache=t.users,this.cacheTimestamp=n,this.usersCache}catch(t){return console.error("Failed to fetch users:",t),this.usersCache||[]}}async assignUser(s,n,t){await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/task/assign_user",entry_id:s,task_id:n,user_id:t})}async getTasksByUser(s){return(await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/tasks/by_user",user_id:s})).tasks}getUserName(s){return!s||!this.usersCache?null:this.usersCache.find(t=>t.id===s)?.name||null}getPerson(s){return o(this.getUser(s))}getUser(s){return!s||!this.usersCache?null:this.usersCache.find(n=>n.id===s)||null}getCurrentUserId(){return this.hass.user?.id||null}isCurrentUser(s){return s?s===this.getCurrentUserId():!1}clearCache(){this.usersCache=null,this.cacheTimestamp=0}};export{a,o as b,h as c,m as d,l as e};
|
||||
@@ -0,0 +1,79 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as r,b as l,c as i,f as o,h as n,l as t}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var e=class extends n{constructor(){super(...arguments);this.label="";this.value="";this.placeholder="";this.type="text";this.required=!1;this.disabled=!1;this.multiline=!1;this.rows=3}_onInput(s){let a=s.target.value;this.value=a,this.dispatchEvent(new CustomEvent("input",{bubbles:!0,composed:!0,detail:{value:a}}))}render(){return i`
|
||||
<label class="field">
|
||||
${this.label?i`<span class="label">${this.label}${this.required?i`<span class="req">*</span>`:o}</span>`:o}
|
||||
${this.multiline?i`
|
||||
<textarea
|
||||
.value=${this.value??""}
|
||||
rows=${this.rows}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
></textarea>`:i`
|
||||
<input
|
||||
.value=${this.value??""}
|
||||
.type=${this.type}
|
||||
?required=${this.required}
|
||||
?disabled=${this.disabled}
|
||||
placeholder=${this.placeholder}
|
||||
step=${this.step??o}
|
||||
min=${this.min??o}
|
||||
max=${this.max??o}
|
||||
pattern=${this.pattern??o}
|
||||
@input=${this._onInput}
|
||||
@change=${this._onInput}
|
||||
/>`}
|
||||
${this.helper?i`<span class="helper">${this.helper}</span>`:o}
|
||||
</label>
|
||||
`}};e.styles=l`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
input {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
}
|
||||
input:focus {
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
textarea {
|
||||
padding: 8px 10px;
|
||||
font-size: 14px;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color, rgba(255,255,255,0.12));
|
||||
border-radius: 6px;
|
||||
font-family: inherit;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
outline: none;
|
||||
resize: vertical;
|
||||
}
|
||||
textarea:focus { border-color: var(--primary-color); }
|
||||
textarea:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
`,r([t()],e.prototype,"label",2),r([t()],e.prototype,"value",2),r([t()],e.prototype,"placeholder",2),r([t()],e.prototype,"type",2),r([t({type:Boolean})],e.prototype,"required",2),r([t({type:Boolean})],e.prototype,"disabled",2),r([t()],e.prototype,"step",2),r([t()],e.prototype,"min",2),r([t()],e.prototype,"max",2),r([t()],e.prototype,"pattern",2),r([t()],e.prototype,"helper",2),r([t({type:Boolean})],e.prototype,"multiline",2),r([t({type:Number})],e.prototype,"rows",2);customElements.get("ms-textfield")||customElements.define("ms-textfield",e);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,153 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as u}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import{a as r,b as _,c as l,f as o,h,l as d,m as s,q as i,s as p}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var a=class extends h{constructor(){super(...arguments);this.objects=[];this._open=!1;this._loading=!1;this._error="";this._name="";this._manufacturer="";this._model="";this._serialNumber="";this._areaId="";this._installationDate="";this._warrantyExpiry="";this._documentationUrl="";this._notes="";this._haDeviceId="";this._parentEntryId="";this._entryId=null}get _lang(){return p(this.hass)}openCreate(){this._entryId=null,this._name="",this._manufacturer="",this._model="",this._serialNumber="",this._areaId="",this._installationDate="",this._warrantyExpiry="",this._documentationUrl="",this._notes="",this._haDeviceId="",this._parentEntryId="",this._error="",this._open=!0}openEdit(e,n){this._entryId=e,this._name=n.name||"",this._manufacturer=n.manufacturer||"",this._model=n.model||"",this._serialNumber=n.serial_number||"",this._areaId=n.area_id||"",this._installationDate=n.installation_date||"",this._warrantyExpiry=n.warranty_expiry||"",this._documentationUrl=n.documentation_url||"",this._notes=n.notes||"",this._haDeviceId=n.ha_device_id||"",this._parentEntryId=n.parent_entry_id||"",this._error="",this._open=!0}async _save(){if(!this._loading&&this._name.trim()){this._loading=!0,this._error="";try{this._entryId?await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/update",entry_id:this._entryId,name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}):await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/object/create",name:this._name,manufacturer:this._manufacturer||null,model:this._model||null,serial_number:this._serialNumber||null,area_id:this._areaId||null,installation_date:this._installationDate||null,warranty_expiry:this._warrantyExpiry||null,documentation_url:this._documentationUrl.trim()||null,notes:this._notes.trim()||null,ha_device_id:this._haDeviceId||null,parent_entry_id:this._parentEntryId||null}),this._open=!1,this.dispatchEvent(new CustomEvent("object-saved"))}catch(e){this._error=u(e,this._lang,i("save_error",this._lang))}finally{this._loading=!1}}}_parentChoices(){return(this.objects||[]).filter(e=>e.entry_id!==this._entryId)}_close(){this._open=!1}render(){if(!this._open)return l``;let e=this._lang,n=this._entryId?i("edit_object",e):i("new_object",e);return l`
|
||||
<ha-dialog open @closed=${this._close}>
|
||||
<div class="dialog-title">${n}</div>
|
||||
<div class="content">
|
||||
${this._error?l`<div class="error">${this._error}</div>`:o}
|
||||
<ms-textfield
|
||||
label="${i("name",e)}"
|
||||
required
|
||||
.value=${this._name}
|
||||
@input=${t=>this._name=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("manufacturer_optional",e)}"
|
||||
.value=${this._manufacturer}
|
||||
@input=${t=>this._manufacturer=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("model_optional",e)}"
|
||||
.value=${this._model}
|
||||
@input=${t=>this._model=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("serial_number_optional",e)}"
|
||||
.value=${this._serialNumber}
|
||||
@input=${t=>this._serialNumber=t.target.value}
|
||||
></ms-textfield>
|
||||
<ms-textfield
|
||||
label="${i("documentation_url_optional",e)}"
|
||||
type="url"
|
||||
.value=${this._documentationUrl}
|
||||
@input=${t=>this._documentationUrl=t.target.value}
|
||||
></ms-textfield>
|
||||
<ha-area-picker
|
||||
.hass=${this.hass}
|
||||
label="${i("area_id_optional",e)}"
|
||||
.value=${this._areaId}
|
||||
@value-changed=${t=>this._areaId=t.detail.value||""}
|
||||
></ha-area-picker>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("installation_date_optional",e)}"
|
||||
.value=${this._installationDate}
|
||||
@value-changed=${t=>this._installationDate=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${e}
|
||||
label="${i("warranty_expiry_optional",e)}"
|
||||
.value=${this._warrantyExpiry}
|
||||
@value-changed=${t=>this._warrantyExpiry=t.detail.value}
|
||||
></ms-date-field>
|
||||
<ha-form
|
||||
.hass=${this.hass}
|
||||
.data=${{device:this._haDeviceId||void 0}}
|
||||
.schema=${[{name:"device",selector:{device:{}}}]}
|
||||
.computeLabel=${()=>i("link_device_optional",e)}
|
||||
@value-changed=${t=>this._haDeviceId=t.detail.value?.device||""}
|
||||
></ha-form>
|
||||
${this._parentChoices().length?l`<label class="textarea-field">
|
||||
<span class="textarea-label">${i("parent_object_optional",e)}</span>
|
||||
<select
|
||||
class="parent-select"
|
||||
.value=${this._parentEntryId}
|
||||
@change=${t=>this._parentEntryId=t.target.value}
|
||||
>
|
||||
<option value="" ?selected=${!this._parentEntryId}>
|
||||
${i("parent_none",e)}
|
||||
</option>
|
||||
${this._parentChoices().map(t=>l`<option
|
||||
value=${t.entry_id}
|
||||
?selected=${this._parentEntryId===t.entry_id}
|
||||
>${t.object.name}</option>`)}
|
||||
</select>
|
||||
</label>`:o}
|
||||
<label class="textarea-field">
|
||||
<span class="textarea-label">${i("object_notes_optional",e)}</span>
|
||||
<textarea
|
||||
rows="3"
|
||||
.value=${this._notes}
|
||||
@input=${t=>this._notes=t.target.value}
|
||||
></textarea>
|
||||
<span class="md-hint">${i("notes_markdown_hint",e)}</span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="dialog-actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${i("cancel",this._lang)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._save}
|
||||
.disabled=${this._loading||!this._name.trim()}
|
||||
>
|
||||
${this._loading?i("saving",this._lang):i("save",this._lang)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</ha-dialog>
|
||||
`}};a.styles=_`
|
||||
.dialog-title {
|
||||
font-size: 18px;
|
||||
font-weight: 500;
|
||||
padding-bottom: 12px;
|
||||
}
|
||||
.content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 16px;
|
||||
min-width: 300px;
|
||||
}
|
||||
.dialog-actions {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 8px;
|
||||
padding-top: 16px;
|
||||
}
|
||||
ms-textfield {
|
||||
display: block;
|
||||
}
|
||||
.textarea-field {
|
||||
display: flex; flex-direction: column; gap: 4px;
|
||||
}
|
||||
.textarea-label {
|
||||
font-size: 12px; color: var(--secondary-text-color, #888); font-weight: 500;
|
||||
}
|
||||
.textarea-field textarea {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
resize: vertical;
|
||||
}
|
||||
.textarea-field textarea:focus {
|
||||
outline: none; border-color: var(--primary-color);
|
||||
}
|
||||
.md-hint {
|
||||
font-size: 11px; color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.parent-select {
|
||||
padding: 8px 10px; font-size: 14px; font-family: inherit;
|
||||
background: var(--secondary-background-color, rgba(0,0,0,0.06));
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
}
|
||||
.error {
|
||||
color: var(--error-color, #f44336);
|
||||
font-size: 13px;
|
||||
}
|
||||
`,r([d({attribute:!1})],a.prototype,"hass",2),r([d({attribute:!1})],a.prototype,"objects",2),r([s()],a.prototype,"_open",2),r([s()],a.prototype,"_loading",2),r([s()],a.prototype,"_error",2),r([s()],a.prototype,"_name",2),r([s()],a.prototype,"_manufacturer",2),r([s()],a.prototype,"_model",2),r([s()],a.prototype,"_serialNumber",2),r([s()],a.prototype,"_areaId",2),r([s()],a.prototype,"_installationDate",2),r([s()],a.prototype,"_warrantyExpiry",2),r([s()],a.prototype,"_documentationUrl",2),r([s()],a.prototype,"_notes",2),r([s()],a.prototype,"_haDeviceId",2),r([s()],a.prototype,"_parentEntryId",2),r([s()],a.prototype,"_entryId",2);customElements.get("maintenance-object-dialog")||customElements.define("maintenance-object-dialog",a);export{a};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
function c(o,t,e){let l=new Blob([o],{type:e}),d=URL.createObjectURL(l),n=document.createElement("a");n.href=d,n.download=t,n.target="_blank",n.rel="noopener",n.style.display="none",document.body.appendChild(n),n.dispatchEvent(new MouseEvent("click")),document.body.removeChild(n),setTimeout(()=>URL.revokeObjectURL(d),6e4)}function r(o,t){let e=document.createElement("a");e.href=o,e.download=t,e.target="_blank",e.rel="noopener",e.style.display="none",document.body.appendChild(e),e.dispatchEvent(new MouseEvent("click")),document.body.removeChild(e)}export{c as a,r as b};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
var l=[{key:"name",labelKey:"name",required:!0},{key:"ref_no",labelKey:"ref_number"},{key:"manufacturer",labelKey:"manufacturer"},{key:"model",labelKey:"model"},{key:"serial_number",labelKey:"serial_number_label"},{key:"installation_date",labelKey:"installed"},{key:"warranty_expiry",labelKey:"warranty"},{key:"area_id",labelKey:"area"},{key:"documentation_url",labelKey:"documentation_url_label"},{key:"notes",labelKey:"object_notes_label"},{key:"task_count",labelKey:"tasks"},{key:"actions",labelKey:"actions"}],i=l.map(a=>a.key),r=["name","manufacturer","model","serial_number","installation_date","warranty_expiry","area_id","task_count","actions"];function o(a){if(!Array.isArray(a))return[...r];let t=new Set,e=[];for(let n of a)typeof n=="string"&&i.includes(n)&&!t.has(n)&&(t.add(n),e.push(n));return e.length?(e.includes("name")||e.unshift("name"),e):[...r]}export{l as a,r as b,o as c};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as i}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import{q as s,s as o}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";async function f(e,a,n={}){n.busy?.(!0);try{return await e.hass.connection.sendMessagePromise(a)}catch(t){let r=o(e.hass);n.onError?.(i(t,r,n.fallbackKey?s(n.fallbackKey,r):void 0));return}finally{n.busy?.(!1)}}export{f as a};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{b as a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-TVK2JN4G.js";async function l(t,e,n=300){return(await t.connection.sendMessagePromise({type:"auth/sign_path",path:e,expires:n})).path}async function r(t,e,n=300){return l(t,`/api/maintenance_supporter/document/${e}`,n)}async function m(t,e,n=""){let o=window.open("about:blank","_blank");try{let s=await r(t,e);o&&(o.location.href=new URL(s+n,window.location.origin).href)}catch(s){throw o&&o.close(),s}}async function u(t,e,n){a(await r(t,e,30),n)}function g(t){let e=URL.createObjectURL(new Blob([t],{type:"text/html"}));window.open(e,"_blank"),setTimeout(()=>URL.revokeObjectURL(e),6e4)}var i={features:{adaptive:!1,predictions:!1,seasonal:!1,environmental:!1,budget:!1,groups:!1,checklists:!1,schedule_time:!1,completion_actions:!1},defaultWarningDays:7,rowActionStyle:"buttons_compact"};function c(){let t=window;return t.__msSettingsCache??={promise:null}}function d(t){let e=c();if(e.promise)return e.promise;let n=t.connection.sendMessagePromise({type:"maintenance_supporter/settings"}).then(o=>({features:o.features??i.features,defaultWarningDays:o.general?.default_warning_days??7,rowActionStyle:o.general?.row_action_style??i.rowActionStyle})).catch(()=>(e.promise===n&&(e.promise=null),i));return e.promise=n,n}function h(){c().promise=null}export{l as a,r as b,m as c,u as d,g as e,d as f,h as g};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{c as r,f as i}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var a=["#c62828","#ad1457","#6a1b9a","#4527a0","#283593","#1565c0","#00838f","#2e7d32","#558b2f","#ef6c00","#6d4c41","#546e7a"];function u(e){let s=(e||"").split(/\s+/).filter(Boolean);return s.length===0?"?":s.length===1?s[0][0].toUpperCase():(s[0][0]+s[s.length-1][0]).toUpperCase()}function c(e){let s=0;for(let n of e)s=s*31+n.charCodeAt(0)>>>0;return a[s%a.length]}function o(e){return e?{id:e.id,name:e.name,initials:e.initials||u(e.name),color:e.color||c(e.id)}:null}function h(e){return e?r`<span class="person-avatar" style="--person-color: ${e.color}" title=${e.name}>${e.initials}</span>`:i}function m(e,s=""){return e?r`<span class="person-chip ${s}" title=${e.name}>${h(e)}<span class="person-name">${e.name}</span></span>`:i}var l=class{constructor(s){this.usersCache=null;this.cacheTimestamp=0;this.CACHE_TTL_MS=6e4;this.hass=s}updateHass(s){this.hass=s}async getUsers(s=!1){let n=Date.now();if(!s&&this.usersCache&&n-this.cacheTimestamp<this.CACHE_TTL_MS)return this.usersCache;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/users/list"});return this.usersCache=t.users,this.cacheTimestamp=n,this.usersCache}catch(t){return console.error("Failed to fetch users:",t),this.usersCache||[]}}async assignUser(s,n,t){await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/task/assign_user",entry_id:s,task_id:n,user_id:t})}async getTasksByUser(s){return(await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/tasks/by_user",user_id:s})).tasks}getUserName(s){return!s||!this.usersCache?null:this.usersCache.find(t=>t.id===s)?.name||null}getPerson(s){return o(this.getUser(s))}getUser(s){return!s||!this.usersCache?null:this.usersCache.find(n=>n.id===s)||null}getCurrentUserId(){return this.hass.user?.id||null}isCurrentUser(s){return s?s===this.getCurrentUserId():!1}clearCache(){this.usersCache=null,this.cacheTimestamp=0}};export{a,o as b,h as c,m as d,l as e};
|
||||
File diff suppressed because one or more lines are too long
+2
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{d as a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-HMRAXB77.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-H235LAFJ.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-3RZNOGQY.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";export{a as MaintenanceCompleteDialog};
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{i as a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-XM5ER255.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EO7HST7S.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EPXIDVO3.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";export{a as MaintenanceCompleteDialog};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{F as a,G as b,H as c,I as d,J as e,K as f,L as g,M as h,N as i,O as j,P as k}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-4IXJEKWO.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-TF6DLWEC.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-AKVULK73.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-LGSRBPFD.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-XKVTMCJS.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-P4T4X54D.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-XM5ER255.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EO7HST7S.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EPXIDVO3.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-F4SM4QET.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-D52RXZ4R.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZLVS6B3E.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";export{b as __resetSettingsCacheForTests,a as getRowActionStyle,h as openCompleteDialog,c as openCreateObjectDialog,e as openCreateTaskDialog,d as openEditObjectDialog,f as openEditTaskDialog,g as openHistoryEditDialog,k as openObjectQuickActions,i as openQrDialog,j as openTaskQuickActions};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{A as c,B as d,C as e,D as f,E as g,F as h,G as i,H as j,I as k,y as a,z as b}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-U6MI7BIF.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-YUCXSTBQ.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-THG66UT5.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZYL7NR3G.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-7QC673DD.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-HMRAXB77.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-H235LAFJ.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-3RZNOGQY.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-KVN7NIIW.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-TVK2JN4G.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-LXDQIXSO.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";export{b as __resetSettingsCacheForTests,a as getRowActionStyle,h as openCompleteDialog,c as openCreateObjectDialog,e as openCreateTaskDialog,d as openEditObjectDialog,f as openEditTaskDialog,g as openHistoryEditDialog,k as openObjectQuickActions,i as openQrDialog,j as openTaskQuickActions};
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-AKVULK73.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-P4T4X54D.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EPXIDVO3.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";export{a as MaintenanceObjectDialog};
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-THG66UT5.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-7QC673DD.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-3RZNOGQY.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";export{a as MaintenanceObjectDialog};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-KVN7NIIW.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-TVK2JN4G.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";export{a as MaintenanceQrDialog};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-F4SM4QET.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-D52RXZ4R.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";export{a as MaintenanceQrDialog};
|
||||
+1343
File diff suppressed because one or more lines are too long
+1337
File diff suppressed because one or more lines are too long
+146
@@ -0,0 +1,146 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as g}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import{a as l,b as m,c as i,f as h,h as v,l as u,m as d,q as p,s as f,u as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";var a=class extends v{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._setups=[];this._selected=new Set;this._baselines=new Map;this._targets=new Map;this._objects=[];this._localeReady=!1;this._toggle=t=>{let e=new Set(this._selected);e.has(t)?e.delete(t):e.add(t),this._selected=e};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/integration_setups/adopt",selections:[...this._selected].map(e=>{let r={device_id:e},c=this._targets.get(e);c&&(r.entry_id=c);let s=this._setups.find(n=>n.device_id===e);for(let n of s?.tasks??[]){let o=this._baselines.get(`${e} ${n.task_name}`),_=o?parseFloat(o):NaN;!isNaN(_)&&_>=0&&((r.baselines??={})[n.task_name]=_)}return r})});this.dispatchEvent(new CustomEvent("integration-setups-adopted",{bubbles:!0,composed:!0,detail:t})),this._open=!1}catch(t){this._error=g(t,this._lang)}finally{this._adopting=!1}}}}get _lang(){return f(this.hass)}updated(t){t.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,x(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._setups=[],this._selected=new Set;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/integration_setups/discover"});this._setups=t.setups||[],this._selected=new Set(this._setups.map(e=>e.device_id)),this._baselines=new Map,this._targets=new Map;try{let e=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/objects"});this._objects=(e.objects||[]).map(r=>({entry_id:r.entry_id,name:r.object?.name||r.entry_id})).sort((r,c)=>r.name.localeCompare(c.name))}catch{this._objects=[]}}catch(t){this._error=g(t,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let t=this._lang;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${p("setups_title",t)}</div>
|
||||
<div class="hint">${p("setups_hint",t)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:h}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._setups.length===0?i`<div class="empty">${p("setups_none",t)}</div>`:i`
|
||||
<div class="list">
|
||||
${this._setups.map(e=>{let r=this._selected.has(e.device_id),c=[e.integration_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${r}
|
||||
@change=${()=>this._toggle(e.device_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.device_name}</span>
|
||||
</div>
|
||||
<div class="row-sub">${c}</div>
|
||||
<div class="row-target" @click=${s=>s.preventDefault()}>
|
||||
→
|
||||
${r&&this._objects.length>0?i`
|
||||
<select
|
||||
class="target-select"
|
||||
@change=${s=>{let n=new Map(this._targets),o=s.target.value;o?n.set(e.device_id,o):n.delete(e.device_id),this._targets=n}}
|
||||
>
|
||||
<option value="" ?selected=${!this._targets.get(e.device_id)}>
|
||||
${e.suggested_entry_id?e.suggested_object_name:p("setups_target_new",t).replace("{name}",e.suggested_object_name)}
|
||||
</option>
|
||||
${this._objects.filter(s=>s.entry_id!==e.suggested_entry_id).map(s=>i`<option
|
||||
value=${s.entry_id}
|
||||
?selected=${this._targets.get(e.device_id)===s.entry_id}
|
||||
>
|
||||
${s.name}
|
||||
</option>`)}
|
||||
</select>
|
||||
`:i`${e.suggested_object_name}${e.suggested_entry_id?h:i` <span class="new-tag">${p("adopt_problem_new_object",t)}</span>`}`}
|
||||
</div>
|
||||
<div class="row-tasks">
|
||||
${e.tasks.map(s=>i`<span class="chip" title=${s.entity_ids.join(", ")}>
|
||||
<ha-icon icon="mdi:link-variant"></ha-icon>${s.task_name_localized||s.task_name}
|
||||
</span>`)}
|
||||
</div>
|
||||
${r?e.tasks.filter(s=>s.direction==="usage_delta").map(s=>{let n=`${e.device_id} ${s.task_name}`;return i`
|
||||
<div class="baseline-field" @click=${o=>o.preventDefault()}>
|
||||
<span class="baseline-label"
|
||||
>${s.task_name_localized||s.task_name} —
|
||||
${p("setups_baseline_hint",t)}</span
|
||||
>
|
||||
<input
|
||||
type="number"
|
||||
step="any"
|
||||
min="0"
|
||||
.value=${this._baselines.get(n)??""}
|
||||
@click=${o=>o.preventDefault()}
|
||||
@input=${o=>{let _=new Map(this._baselines);_.set(n,o.target.value),this._baselines=_}}
|
||||
/>
|
||||
</div>
|
||||
`}):h}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${p("cancel",t)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${p("setups_adopt",t)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};a.styles=m`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title { font-size: 18px; font-weight: 500; }
|
||||
.hint { color: var(--secondary-text-color); font-size: 13px; }
|
||||
.error { color: var(--error-color, #f44336); font-size: 13px; }
|
||||
.loading, .empty { color: var(--secondary-text-color); font-size: 14px; padding: 12px 0; }
|
||||
.list { display: flex; flex-direction: column; gap: 6px; overflow-y: auto; max-height: 50vh; }
|
||||
.row {
|
||||
display: flex; align-items: flex-start; gap: 10px; padding: 8px;
|
||||
border: 1px solid var(--divider-color); border-radius: 6px; cursor: pointer;
|
||||
}
|
||||
.row input { margin-top: 2px; cursor: pointer; }
|
||||
.row-main { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
|
||||
.row-name { font-weight: 500; font-size: 13px; }
|
||||
.row-sub, .row-target { color: var(--secondary-text-color); font-size: 12px; }
|
||||
.new-tag { font-style: italic; }
|
||||
.row-tasks { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 2px; }
|
||||
.chip {
|
||||
display: inline-flex; align-items: center; gap: 4px;
|
||||
font-size: 11px; padding: 2px 8px; border-radius: 10px;
|
||||
background: var(--secondary-background-color, rgba(0, 0, 0, 0.06));
|
||||
color: var(--primary-text-color); white-space: nowrap;
|
||||
}
|
||||
.chip ha-icon { --mdc-icon-size: 12px; color: var(--primary-color); }
|
||||
.target-select {
|
||||
font-size: 12px; padding: 2px 4px; max-width: 100%;
|
||||
border: 1px solid var(--divider-color); border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.baseline-field {
|
||||
display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
|
||||
margin-top: 4px; font-size: 12px; color: var(--secondary-text-color);
|
||||
}
|
||||
.baseline-field input {
|
||||
width: 110px; padding: 3px 6px; font-size: 12px;
|
||||
border: 1px solid var(--divider-color); border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 8px; }
|
||||
`,l([u({attribute:!1})],a.prototype,"hass",2),l([d()],a.prototype,"_open",2),l([d()],a.prototype,"_loading",2),l([d()],a.prototype,"_adopting",2),l([d()],a.prototype,"_error",2),l([d()],a.prototype,"_setups",2),l([d()],a.prototype,"_selected",2),l([d()],a.prototype,"_baselines",2),l([d()],a.prototype,"_targets",2),l([d()],a.prototype,"_objects",2);customElements.get("maintenance-suggested-setups-dialog")||customElements.define("maintenance-suggested-setups-dialog",a);export{a as MaintenanceSuggestedSetupsDialog};
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as g}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import{a as l,b as m,c as i,f as h,h as v,l as u,m as d,q as p,s as f,u as x}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";var a=class extends v{constructor(){super(...arguments);this._open=!1;this._loading=!1;this._adopting=!1;this._error="";this._setups=[];this._selected=new Set;this._baselines=new Map;this._targets=new Map;this._objects=[];this._localeReady=!1;this._toggle=t=>{let e=new Set(this._selected);e.has(t)?e.delete(t):e.add(t),this._selected=e};this._adopt=async()=>{if(!(this._selected.size===0||this._adopting)){this._adopting=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/integration_setups/adopt",selections:[...this._selected].map(e=>{let r={device_id:e},c=this._targets.get(e);c&&(r.entry_id=c);let s=this._setups.find(n=>n.device_id===e);for(let n of s?.tasks??[]){let o=this._baselines.get(`${e} ${n.task_name}`),_=o?parseFloat(o):NaN;!isNaN(_)&&_>=0&&((r.baselines??={})[n.task_name]=_)}return r})});this.dispatchEvent(new CustomEvent("integration-setups-adopted",{bubbles:!0,composed:!0,detail:t})),this._open=!1}catch(t){this._error=g(t,this._lang)}finally{this._adopting=!1}}}}get _lang(){return f(this.hass)}updated(t){t.has("hass")&&this.hass&&!this._localeReady&&(this._localeReady=!0,x(this._lang).then(()=>this.requestUpdate()))}async open(){this._open=!0,this._loading=!0,this._error="",this._setups=[],this._selected=new Set;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/integration_setups/discover"});this._setups=t.setups||[],this._selected=new Set(this._setups.map(e=>e.device_id)),this._baselines=new Map,this._targets=new Map;try{let e=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/objects"});this._objects=(e.objects||[]).map(r=>({entry_id:r.entry_id,name:r.object?.name||r.entry_id})).sort((r,c)=>r.name.localeCompare(c.name))}catch{this._objects=[]}}catch(t){this._error=g(t,this._lang)}finally{this._loading=!1}}_close(){this._open=!1}render(){if(!this._open)return i``;let t=this._lang;return i`
|
||||
<div class="overlay" @click=${this._close}>
|
||||
<div class="card" @click=${e=>e.stopPropagation()}>
|
||||
<div class="title">${p("setups_title",t)}</div>
|
||||
<div class="hint">${p("setups_hint",t)}</div>
|
||||
${this._error?i`<div class="error">${this._error}</div>`:h}
|
||||
|
||||
${this._loading?i`<div class="loading">…</div>`:this._setups.length===0?i`<div class="empty">${p("setups_none",t)}</div>`:i`
|
||||
<div class="list">
|
||||
${this._setups.map(e=>{let r=this._selected.has(e.device_id),c=[e.integration_name,e.area_name].filter(Boolean).join(" \xB7 ");return i`
|
||||
<label class="row">
|
||||
<input
|
||||
type="checkbox"
|
||||
.checked=${r}
|
||||
@change=${()=>this._toggle(e.device_id)}
|
||||
/>
|
||||
<div class="row-main">
|
||||
<div class="row-top">
|
||||
<span class="row-name">${e.device_name}</span>
|
||||
</div>
|
||||
<div class="row-sub">${c}</div>
|
||||
<div class="row-target" @click=${s=>s.preventDefault()}>
|
||||
→
|
||||
${r&&this._objects.length>0?i`
|
||||
<select
|
||||
class="target-select"
|
||||
@change=${s=>{let n=new Map(this._targets),o=s.target.value;o?n.set(e.device_id,o):n.delete(e.device_id),this._targets=n}}
|
||||
>
|
||||
<option value="" ?selected=${!this._targets.get(e.device_id)}>
|
||||
${e.suggested_entry_id?e.suggested_object_name:p("setups_target_new",t).replace("{name}",e.suggested_object_name)}
|
||||
</option>
|
||||
${this._objects.filter(s=>s.entry_id!==e.suggested_entry_id).map(s=>i`<option
|
||||
value=${s.entry_id}
|
||||
?selected=${this._targets.get(e.device_id)===s.entry_id}
|
||||
>
|
||||
${s.name}
|
||||
</option>`)}
|
||||
</select>
|
||||
`:i`${e.suggested_object_name}${e.suggested_entry_id?h:i` <span class="new-tag">${p("adopt_problem_new_object",t)}</span>`}`}
|
||||
</div>
|
||||
<div class="row-tasks">
|
||||
${e.tasks.map(s=>i`<span class="chip" title=${s.entity_ids.join(", ")}>
|
||||
<ha-icon icon="mdi:link-variant"></ha-icon>${s.task_name_localized||s.task_name}
|
||||
</span>`)}
|
||||
</div>
|
||||
${r?e.tasks.filter(s=>s.direction==="usage_delta").map(s=>{let n=`${e.device_id} ${s.task_name}`;return i`
|
||||
<div class="baseline-field" @click=${o=>o.preventDefault()}>
|
||||
<span class="baseline-label"
|
||||
>${s.task_name_localized||s.task_name} —
|
||||
${p("setups_baseline_hint",t)}</span
|
||||
>
|
||||
<input
|
||||
type="number"
|
||||
step="any"
|
||||
min="0"
|
||||
.value=${this._baselines.get(n)??""}
|
||||
@click=${o=>o.preventDefault()}
|
||||
@input=${o=>{let _=new Map(this._baselines);_.set(n,o.target.value),this._baselines=_}}
|
||||
/>
|
||||
</div>
|
||||
`}):h}
|
||||
</div>
|
||||
</label>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
<div class="actions">
|
||||
<ha-button appearance="plain" @click=${this._close}>
|
||||
${p("cancel",t)}
|
||||
</ha-button>
|
||||
<ha-button
|
||||
@click=${this._adopt}
|
||||
.disabled=${this._selected.size===0||this._adopting}
|
||||
>
|
||||
${p("setups_adopt",t)}
|
||||
</ha-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`}};a.styles=m`
|
||||
.overlay {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.card {
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
min-width: min(360px, calc(100vw - 24px));
|
||||
max-width: 560px;
|
||||
width: 90vw;
|
||||
max-height: 80vh;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.title { font-size: 18px; font-weight: 500; }
|
||||
.hint { color: var(--secondary-text-color); font-size: 13px; }
|
||||
.error { color: var(--error-color, #f44336); font-size: 13px; }
|
||||
.loading, .empty { color: var(--secondary-text-color); font-size: 14px; padding: 12px 0; }
|
||||
.list { display: flex; flex-direction: column; gap: 6px; overflow-y: auto; max-height: 50vh; }
|
||||
.row {
|
||||
display: flex; align-items: flex-start; gap: 10px; padding: 8px;
|
||||
border: 1px solid var(--divider-color); border-radius: 6px; cursor: pointer;
|
||||
}
|
||||
.row input { margin-top: 2px; cursor: pointer; }
|
||||
.row-main { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
|
||||
.row-name { font-weight: 500; font-size: 13px; }
|
||||
.row-sub, .row-target { color: var(--secondary-text-color); font-size: 12px; }
|
||||
.new-tag { font-style: italic; }
|
||||
.row-tasks { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 2px; }
|
||||
.chip {
|
||||
display: inline-flex; align-items: center; gap: 4px;
|
||||
font-size: 11px; padding: 2px 8px; border-radius: 10px;
|
||||
background: var(--secondary-background-color, rgba(0, 0, 0, 0.06));
|
||||
color: var(--primary-text-color); white-space: nowrap;
|
||||
}
|
||||
.chip ha-icon { --mdc-icon-size: 12px; color: var(--primary-color); }
|
||||
.target-select {
|
||||
font-size: 12px; padding: 2px 4px; max-width: 100%;
|
||||
border: 1px solid var(--divider-color); border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.baseline-field {
|
||||
display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
|
||||
margin-top: 4px; font-size: 12px; color: var(--secondary-text-color);
|
||||
}
|
||||
.baseline-field input {
|
||||
width: 110px; padding: 3px 6px; font-size: 12px;
|
||||
border: 1px solid var(--divider-color); border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.actions { display: flex; justify-content: flex-end; gap: 8px; padding-top: 8px; }
|
||||
`,l([u({attribute:!1})],a.prototype,"hass",2),l([d()],a.prototype,"_open",2),l([d()],a.prototype,"_loading",2),l([d()],a.prototype,"_adopting",2),l([d()],a.prototype,"_error",2),l([d()],a.prototype,"_setups",2),l([d()],a.prototype,"_selected",2),l([d()],a.prototype,"_baselines",2),l([d()],a.prototype,"_targets",2),l([d()],a.prototype,"_objects",2);customElements.get("maintenance-suggested-setups-dialog")||customElements.define("maintenance-suggested-setups-dialog",a);export{a as MaintenanceSuggestedSetupsDialog};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZYL7NR3G.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-7QC673DD.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-H235LAFJ.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-3RZNOGQY.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-LXDQIXSO.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-73OGSTHK.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WQO7M6UD.js";export{a as MaintenanceTaskDialog};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a}from"/maintenance_supporter_panelfiles/panel-chunks/chunk-LGSRBPFD.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-XKVTMCJS.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-P4T4X54D.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EO7HST7S.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-EPXIDVO3.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-ZLVS6B3E.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-FE4LECIX.js";import"/maintenance_supporter_panelfiles/panel-chunks/chunk-WG3MZHOS.js";export{a as MaintenanceTaskDialog};
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as x,b as $}from"./chunk-WIO3PYFT.js";import{a as h,b as n,d as b,e as y,f as m,g as o,h as _,i as a,j as g,k as v,o as f,p,z as c}from"./chunk-AVD72T2Q.js";import{a as l}from"./chunk-LRS2DZQN.js";var E=80,s=class extends y{constructor(){super(...arguments);this._config={type:""};this._status=null;this._busy=!1;this._error="";this._localMonthly="";this._localYearly="";this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return v(this.hass)}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),g(this,t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load())}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/budget_status"});this._status=t,this._localMonthly=t.monthly_budget?String(t.monthly_budget):"",this._localYearly=t.yearly_budget?String(t.yearly_budget):"",this._dirty=!1}catch(t){this._error=c(t,this._lang)}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=this._localMonthly.trim()===""?0:parseFloat(this._localMonthly),r=this._localYearly.trim()===""?0:parseFloat(this._localYearly),i={};!isNaN(t)&&t>=0&&(i.budget_monthly=t),!isNaN(r)&&r>=0&&(i.budget_yearly=r),await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/global/update",settings:i}),await this._load()}catch(t){this._error=c(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_budget"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,r=this._status;if(!r)return n`<ha-card><div class="loading">${a("loading",t)||"Loading\u2026"}</div></ha-card>`;let i=r.currency_symbol||_,k=r.alert_threshold_pct??E,w=[{label:a("budget_monthly",t)||"Monthly",spent:r.monthly_spent||0,budget:r.monthly_budget||0},{label:a("budget_yearly",t)||"Yearly",spent:r.yearly_spent||0,budget:r.yearly_budget||0}];return n`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">💰</span>
|
||||
<span>${this._config.title||a("settings_budget",t)||"Budget"}</span>
|
||||
</div>
|
||||
<span class="currency">${i}</span>
|
||||
</div>
|
||||
|
||||
${this._error?n`<div class="error">${this._error}</div>`:b}
|
||||
|
||||
${w.map(e=>{if(!(e.budget>0))return n`
|
||||
<div class="track spent-only">
|
||||
<div class="track-label-row">
|
||||
<label>${e.label}</label>
|
||||
<span class="track-numbers ok">${p(e.spent,i,t,0)}</span>
|
||||
</div>
|
||||
</div>
|
||||
`;let d=Math.min(100,Math.max(0,e.spent/e.budget*100)),u=d>=100?"danger":d>=k?"warning":"ok";return n`
|
||||
<div class="track">
|
||||
<div class="track-label-row">
|
||||
<label>${e.label}</label>
|
||||
<span class="track-numbers ${u}">
|
||||
${f(e.spent,t,0)} / ${p(e.budget,i,t,0)}
|
||||
</span>
|
||||
</div>
|
||||
<div class="bar"><div class="bar-fill ${u}" style="width:${d}%"></div></div>
|
||||
</div>
|
||||
`})}
|
||||
|
||||
${this._isAdmin?n`
|
||||
<div class="inputs-row">
|
||||
<div class="input-field">
|
||||
<label>${a("budget_monthly_set",t)||"Set monthly"}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localMonthly}
|
||||
?disabled=${this._busy}
|
||||
@input=${e=>{this._localMonthly=e.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${i}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label>${a("budget_yearly_set",t)||"Set yearly"}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localYearly}
|
||||
?disabled=${this._busy}
|
||||
@input=${e=>{this._localYearly=e.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${i}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?a("save",t)||"Save":a("saved",t)||"Saved"}
|
||||
</button>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_advanced",t)||"Currency, alerts\u2026"}
|
||||
</button>
|
||||
</div>
|
||||
`:n`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};s.styles=[$,h`
|
||||
.currency {
|
||||
font-size: 14px; font-weight: 600;
|
||||
color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 10px; border-radius: 999px;
|
||||
}
|
||||
.track { display: flex; flex-direction: column; gap: 4px; }
|
||||
.track-label-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.track-label-row label {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.track-numbers { font-size: 13px; font-weight: 600; }
|
||||
.track-numbers.ok { color: var(--primary-text-color); }
|
||||
.track-numbers.warning { color: #ff9800; }
|
||||
.track-numbers.danger { color: var(--error-color, #f44336); }
|
||||
.bar {
|
||||
height: 6px; background: var(--secondary-background-color);
|
||||
border-radius: 3px; overflow: hidden;
|
||||
}
|
||||
.bar-fill { height: 100%; transition: width 0.3s; border-radius: 3px; }
|
||||
.bar-fill.ok { background: var(--primary-color); }
|
||||
.bar-fill.warning { background: #ff9800; }
|
||||
.bar-fill.danger { background: var(--error-color, #f44336); }
|
||||
.inputs-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
|
||||
padding-top: 4px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.input-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.input-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.input-wrap { position: relative; display: flex; align-items: center; }
|
||||
.input-wrap input {
|
||||
flex: 1; padding: 6px 32px 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.input-suffix {
|
||||
position: absolute; right: 8px;
|
||||
color: var(--secondary-text-color); font-size: 13px;
|
||||
pointer-events: none;
|
||||
}
|
||||
.actions { display: flex; gap: 8px; align-items: center; }
|
||||
`],l([m({attribute:!1})],s.prototype,"hass",2),l([o()],s.prototype,"_config",2),l([o()],s.prototype,"_status",2),l([o()],s.prototype,"_busy",2),l([o()],s.prototype,"_error",2),l([o()],s.prototype,"_localMonthly",2),l([o()],s.prototype,"_localYearly",2),l([o()],s.prototype,"_dirty",2);customElements.get("maintenance-budget-section-card")||customElements.define("maintenance-budget-section-card",s);x({type:"maintenance-budget-section-card",name:"Maintenance Supporter \u2014 Budget",description:"Inline monthly + yearly budget editor",preview:!1});export{s as MaintenanceBudgetSectionCard};
|
||||
+125
@@ -0,0 +1,125 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as x,b as $}from"./chunk-4QSUIFST.js";import{B as p,a as h,b as l,d as b,e as y,f as m,g as o,h as g,i as a,j as v,k as _,n as f,q as d}from"./chunk-QP4GVVMP.js";import{a as n}from"./chunk-VMGD53HU.js";var E=80,e=class extends y{constructor(){super(...arguments);this._config={type:""};this._status=null;this._busy=!1;this._error="";this._localMonthly="";this._localYearly="";this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return _(this.hass)}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),v(this,t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load())}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/budget_status"});this._status=t,f(t),this._localMonthly=t.monthly_budget?String(t.monthly_budget):"",this._localYearly=t.yearly_budget?String(t.yearly_budget):"",this._dirty=!1}catch(t){this._error=p(t,this._lang)}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=this._localMonthly.trim()===""?0:parseFloat(this._localMonthly),r=this._localYearly.trim()===""?0:parseFloat(this._localYearly),i={};!isNaN(t)&&t>=0&&(i.budget_monthly=t),!isNaN(r)&&r>=0&&(i.budget_yearly=r),await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/global/update",settings:i}),await this._load()}catch(t){this._error=p(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_budget"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,r=this._status;if(!r)return l`<ha-card><div class="loading">${a("loading",t)}</div></ha-card>`;let i=g(r),k=r.alert_threshold_pct??E,w=[{label:a("budget_monthly",t),spent:r.monthly_spent||0,budget:r.monthly_budget||0},{label:a("budget_yearly",t),spent:r.yearly_spent||0,budget:r.yearly_budget||0}];return l`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">💰</span>
|
||||
<span>${this._config.title||a("settings_budget",t)}</span>
|
||||
</div>
|
||||
<span class="currency">${i}</span>
|
||||
</div>
|
||||
|
||||
${this._error?l`<div class="error">${this._error}</div>`:b}
|
||||
|
||||
${w.map(s=>{if(!(s.budget>0))return l`
|
||||
<div class="track spent-only">
|
||||
<div class="track-label-row">
|
||||
<label>${s.label}</label>
|
||||
<span class="track-numbers ok">${d(s.spent,i,t)}</span>
|
||||
</div>
|
||||
</div>
|
||||
`;let c=Math.min(100,Math.max(0,s.spent/s.budget*100)),u=c>=100?"danger":c>=k?"warning":"ok";return l`
|
||||
<div class="track">
|
||||
<div class="track-label-row">
|
||||
<label>${s.label}</label>
|
||||
<span class="track-numbers ${u}">
|
||||
${d(s.spent,void 0,t)} / ${d(s.budget,i,t)}
|
||||
</span>
|
||||
</div>
|
||||
<div class="bar"><div class="bar-fill ${u}" style="width:${c}%"></div></div>
|
||||
</div>
|
||||
`})}
|
||||
|
||||
${this._isAdmin?l`
|
||||
<div class="inputs-row">
|
||||
<div class="input-field">
|
||||
<label>${a("budget_monthly_set",t)}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localMonthly}
|
||||
?disabled=${this._busy}
|
||||
@input=${s=>{this._localMonthly=s.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${i}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="input-field">
|
||||
<label>${a("budget_yearly_set",t)}</label>
|
||||
<div class="input-wrap">
|
||||
<input type="number" min="0" step="1"
|
||||
.value=${this._localYearly}
|
||||
?disabled=${this._busy}
|
||||
@input=${s=>{this._localYearly=s.target.value,this._dirty=!0}} />
|
||||
<span class="input-suffix">${i}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?a("save",t):a("saved",t)}
|
||||
</button>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_advanced",t)}
|
||||
</button>
|
||||
</div>
|
||||
`:l`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${a("budget_open_panel",t)}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};e.styles=[$,h`
|
||||
.currency {
|
||||
font-size: 14px; font-weight: 600;
|
||||
color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 10px; border-radius: 999px;
|
||||
}
|
||||
.track { display: flex; flex-direction: column; gap: 4px; }
|
||||
.track-label-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.track-label-row label {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.track-numbers { font-size: 13px; font-weight: 600; }
|
||||
.track-numbers.ok { color: var(--primary-text-color); }
|
||||
.track-numbers.warning { color: #ff9800; }
|
||||
.track-numbers.danger { color: var(--error-color, #f44336); }
|
||||
.bar {
|
||||
height: 6px; background: var(--secondary-background-color);
|
||||
border-radius: 3px; overflow: hidden;
|
||||
}
|
||||
.bar-fill { height: 100%; transition: width 0.3s; border-radius: 3px; }
|
||||
.bar-fill.ok { background: var(--primary-color); }
|
||||
.bar-fill.warning { background: #ff9800; }
|
||||
.bar-fill.danger { background: var(--error-color, #f44336); }
|
||||
.inputs-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
|
||||
padding-top: 4px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.input-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.input-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.input-wrap { position: relative; display: flex; align-items: center; }
|
||||
.input-wrap input {
|
||||
flex: 1; padding: 6px 32px 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.input-suffix {
|
||||
position: absolute; right: 8px;
|
||||
color: var(--secondary-text-color); font-size: 13px;
|
||||
pointer-events: none;
|
||||
}
|
||||
.actions { display: flex; gap: 8px; align-items: center; }
|
||||
`],n([m({attribute:!1})],e.prototype,"hass",2),n([o()],e.prototype,"_config",2),n([o()],e.prototype,"_status",2),n([o()],e.prototype,"_busy",2),n([o()],e.prototype,"_error",2),n([o()],e.prototype,"_localMonthly",2),n([o()],e.prototype,"_localYearly",2),n([o()],e.prototype,"_dirty",2);customElements.get("maintenance-budget-section-card")||customElements.define("maintenance-budget-section-card",e);x({type:"maintenance-budget-section-card",name:"Maintenance Supporter \u2014 Budget",description:"Inline monthly + yearly budget editor",preview:!1});export{e as MaintenanceBudgetSectionCard};
|
||||
@@ -0,0 +1,60 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as t}from"./chunk-QP4GVVMP.js";function e(o){let r=window;r.customCards=r.customCards||[],r.customCards.some(a=>a.type===o.type)||r.customCards.push(o)}var d=t`
|
||||
ha-card { overflow: hidden; }
|
||||
.card-content {
|
||||
padding: 16px;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
.header {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
.title {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
font-size: 16px; font-weight: 500;
|
||||
}
|
||||
.emoji { font-size: 20px; }
|
||||
|
||||
/* Button family — primary action / muted-saved-state / link / icon-with-text */
|
||||
.btn {
|
||||
padding: 6px 12px; font-size: 13px;
|
||||
border-radius: 6px; cursor: pointer;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--secondary-background-color, transparent);
|
||||
color: var(--primary-text-color);
|
||||
font-weight: 500;
|
||||
display: inline-flex; align-items: center; gap: 4px;
|
||||
}
|
||||
.btn:hover { background: var(--state-icon-color, rgba(255,255,255,0.06)); }
|
||||
.btn[disabled] { opacity: 0.5; cursor: not-allowed; }
|
||||
.btn.primary {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, white);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.btn.primary[disabled] { opacity: 0.6; }
|
||||
.btn.muted {
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
border-style: dashed;
|
||||
}
|
||||
.btn.muted[disabled] { opacity: 1; cursor: default; }
|
||||
.btn.muted ha-icon, .btn.primary ha-icon { --mdc-icon-size: 14px; }
|
||||
.btn.link {
|
||||
background: transparent; border: none; padding: 6px 4px;
|
||||
color: var(--primary-color); margin-left: auto;
|
||||
}
|
||||
.btn.link:hover { background: transparent; text-decoration: underline; }
|
||||
|
||||
/* Error + loading states */
|
||||
.error {
|
||||
padding: 8px; border-radius: 6px;
|
||||
background: rgba(211, 47, 47, 0.1);
|
||||
color: var(--error-color, #d32f2f); font-size: 13px;
|
||||
}
|
||||
.loading {
|
||||
padding: 24px; text-align: center;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
`;export{e as a,d as b};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,88 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as y,b as s,d as l,e as g,f as o,g as f,i as d,q as m}from"./chunk-AVD72T2Q.js";import{a}from"./chunk-LRS2DZQN.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
function l(r){if(!r)return[];let n=[],i=r.photo_doc_id;typeof i=="string"&&n.push(i);let o=r.photo_doc_ids;Array.isArray(o)&&n.push(...o);let t=[];for(let e of n){if(typeof e!="string")continue;let s=e.trim();if(!(!s||t.includes(s))&&(t.push(s),t.length>=10))break}return t}function f(){let r=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(r),Array.from(r,n=>n.toString(16).padStart(2,"0")).join("")}function u(r){let n=r?.reading_values;if(!Array.isArray(n))return[];let i=[],o=new Set;for(let t of n){if(!t||typeof t!="object")continue;let e=t;typeof e.id!="string"||!e.id||o.has(e.id)||typeof e.value!="number"||!Number.isFinite(e.value)||(o.add(e.id),i.push({id:e.id,name:typeof e.name=="string"?e.name:e.id,unit:typeof e.unit=="string"?e.unit:null,value:e.value}))}return i}function c(r){return r.filter(n=>n.type==="completed"&&(n.reading_value!=null||u(n).length>0)).sort((n,i)=>n.timestamp.localeCompare(i.timestamp))}function p(r){return c(r??[]).map(n=>({timestamp:n.timestamp,values:u(n)})).filter(n=>n.values.length>0)}function m(r,n,i){let o;for(let t of r){if(i!==void 0){let s=new Date(t.timestamp).getTime();if(!isNaN(s)&&s>=i)break}let e=t.values.find(s=>s.id===n);e&&(o=e)}return o}function _(r,n,i){let o=u(n).find(e=>e.id===i);if(!o)return null;let t=null;for(let e of c(r)){if(e.timestamp>=n.timestamp)break;let s=u(e).find(a=>a.id===i);s&&(t=s.value)}return t==null?null:o.value-t}function R(r){let n=new Set,i=new Set;for(let o of r){let t=(o.name||"").trim().toLowerCase();t&&(n.has(t)?i.add(o.id):n.add(t))}return i}function h(r){let n=[],i=new Set,o=new Set;for(let t of r){let e=(t.name||"").trim();if(!(!e||i.has(t.id)||o.has(e.toLowerCase()))&&(i.add(t.id),o.add(e.toLowerCase()),n.push({id:t.id,name:e,unit:(t.unit||"").trim()||null}),n.length>=20))break}return n}function g(r,n,i,o){let t=i,e=d=>typeof d=="string"?d:null,s=d=>typeof d=="number"?d:null,a=e(t.timestamp)??"";return{entry_id:r,task_id:n,original_timestamp:a,type:e(t.type)||"completed",timestamp:a,notes:e(t.notes),cost:s(t.cost),duration:s(t.duration),completed_by:e(t.completed_by),used_parts:Array.isArray(t.used_parts)?t.used_parts:null,photo_doc_ids:l(t),reading_value:s(t.reading_value),reading_values:u(t),readings:o?.readings??[],task_type:o?.type??null,reading_unit:o?.reading_unit??null}}async function E(r,n,i,o){let e=(await r.connection.sendMessagePromise({type:"maintenance_supporter/object",entry_id:n})).tasks?.find(a=>a.id===i),s=e?.history?.find(a=>a.timestamp===o);return!e||!s?null:g(n,i,s,e)}export{l as a,f as b,u as c,p as d,m as e,_ as f,R as g,h,g as i,E as j};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
function l(i){if(!i)return[];let n=[],o=i.photo_doc_id;typeof o=="string"&&n.push(o);let r=i.photo_doc_ids;Array.isArray(r)&&n.push(...r);let e=[];for(let t of n){if(typeof t!="string")continue;let a=t.trim();if(!(!a||e.includes(a))&&(e.push(a),e.length>=10))break}return e}function c(){let i=new Uint8Array(4);return(globalThis.crypto??{getRandomValues:n=>n.map(()=>Math.floor(Math.random()*256))}).getRandomValues(i),Array.from(i,n=>n.toString(16).padStart(2,"0")).join("")}function s(i){let n=i?.reading_values;if(!Array.isArray(n))return[];let o=[],r=new Set;for(let e of n){if(!e||typeof e!="object")continue;let t=e;typeof t.id!="string"||!t.id||r.has(t.id)||typeof t.value!="number"||!Number.isFinite(t.value)||(r.add(t.id),o.push({id:t.id,name:typeof t.name=="string"?t.name:t.id,unit:typeof t.unit=="string"?t.unit:null,value:t.value}))}return o}function u(i){return i.filter(n=>n.type==="completed"&&(n.reading_value!=null||s(n).length>0)).sort((n,o)=>n.timestamp.localeCompare(o.timestamp))}function g(i){return u(i??[]).map(n=>({timestamp:n.timestamp,values:s(n)})).filter(n=>n.values.length>0)}function y(i,n,o){let r;for(let e of i){if(o!==void 0){let a=new Date(e.timestamp).getTime();if(!isNaN(a)&&a>=o)break}let t=e.values.find(a=>a.id===n);t&&(r=t)}return r}function p(i,n,o){let r=s(n).find(t=>t.id===o);if(!r)return null;let e=null;for(let t of u(i)){if(t.timestamp>=n.timestamp)break;let a=s(t).find(d=>d.id===o);a&&(e=a.value)}return e==null?null:r.value-e}function m(i){let n=new Set,o=new Set;for(let r of i){let e=(r.name||"").trim().toLowerCase();e&&(n.has(e)?o.add(r.id):n.add(e))}return o}function R(i){let n=[],o=new Set,r=new Set;for(let e of i){let t=(e.name||"").trim();if(!(!t||o.has(e.id)||r.has(t.toLowerCase()))&&(o.add(e.id),r.add(t.toLowerCase()),n.push({id:e.id,name:t,unit:(e.unit||"").trim()||null}),n.length>=20))break}return n}export{l as a,c as b,s as c,g as d,y as e,p as f,m as g,R as h};
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
var s=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var t=(a,r,c,o)=>{for(var e=o>1?void 0:o?l(r,c):r,i=a.length-1,d;i>=0;i--)(d=a[i])&&(e=(o?d(r,c,e):d(e))||e);return o&&e&&s(r,c,e),e};var m={ok:"var(--success-color, #4caf50)",due_soon:"var(--warning-color, #ff9800)",overdue:"var(--error-color, #f44336)",triggered:"var(--deep-orange-color, #ff5722)",archived:"var(--disabled-color, #9e9e9e)",paused:"var(--info-color, #2196f3)"},v={ok:"mdi:check-circle",due_soon:"mdi:alert-circle",overdue:"mdi:alert-octagon",triggered:"mdi:bell-alert",archived:"mdi:archive-outline",paused:"mdi:pause-circle-outline",completed:"mdi:check-circle",skipped:"mdi:skip-next",missed:"mdi:calendar-remove",reset:"mdi:refresh"};export{t as a,m as b,v as c};
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,88 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as y,b as s,d as l,e as g,f as o,g as f,i as d,r as m}from"./chunk-QP4GVVMP.js";import{a}from"./chunk-VMGD53HU.js";function $(n){let t=m("2001-02-03",n).match(/\d+/g)||[],e=v=>t.findIndex(_=>Number(_)===v),h=e(2001),c=e(2),u=e(3);return h===0?"YMD":c>=0&&u>=0&&c<u?"MDY":"DMY"}function p(n,i,t){if(n<1e3||n>9999||i<1||i>12||t<1||t>31)return null;let e=new Date(n,i-1,t);return e.getFullYear()!==n||e.getMonth()!==i-1||e.getDate()!==t?null:`${n}-${String(i).padStart(2,"0")}-${String(t).padStart(2,"0")}`}function b(n,i){let t=n.trim(),e;if(e=t.match(/^(\d{4})-(\d{1,2})-(\d{1,2})$/))return p(+e[1],+e[2],+e[3]);if(e=t.match(/^(\d{4})$/))return p(+e[1],1,1);if(e=t.match(/^(\d{1,2})[./](\d{4})$/))return p(+e[2],+e[1],1);if(e=t.match(/^(\d{1,2})\.(\d{1,2})\.(\d{4})$/))return p(+e[3],+e[2],+e[1]);if(e=t.match(/^(\d{1,2})[/-](\d{1,2})[/-](\d{4})$/)){let h=+e[1],c=+e[2],u=+e[3];return $(i)==="MDY"?p(u,h,c):p(u,c,h)}return null}function x(n,i){if(i)switch(n){case"date":return i.split("T")[0];case"time":return i.length===5?`${i}:00`:i;case"datetime":{let[t,e="00:00:00"]=i.split("T");return`${t} ${e.length===5?`${e}:00`:e}`}}}function k(n,i){if(typeof i!="string"||!i)return"";switch(n){case"date":return i.slice(0,10);case"time":return i.slice(0,5);case"datetime":{let[t,e="00:00:00"]=i.split(" ");return`${t}T${e.length===5?`${e}:00`:e}`}}}var r=class extends g{constructor(){super(...arguments);this.kind="date";this.label="";this.value="";this.clearable=!1;this.disabled=!1;this.required=!1;this.lang="en";this._typing=!1;this._typed="";this._typedInvalid=!1}_startTyping(){this._typed=this.value,this._typedInvalid=!1,this._typing=!0,this.updateComplete.then(()=>this.shadowRoot?.querySelector("input.typed")?.focus())}_commitTyped(){if(!this._typed.trim()){this._typing=!1;return}let t=b(this._typed,this.lang);if(!t){this._typedInvalid=!0;return}this._typing=!1,this._typedInvalid=!1,this._emit(t)}_onTypedKey(t){t.key==="Enter"?(t.preventDefault(),this._commitTyped()):t.key==="Escape"&&(t.preventDefault(),this._typing=!1,this._typedInvalid=!1)}_selector(){switch(this.kind){case"date":return{date:{}};case"time":return{time:{no_second:!0}};case"datetime":return{datetime:{}}}}_onSelectorChange(t){t.stopPropagation(),this._emit(k(this.kind,t.detail?.value))}_clear(){this._emit("")}_emit(t){t!==this.value&&(this.value=t,this.dispatchEvent(new CustomEvent("value-changed",{bubbles:!0,composed:!0,detail:{value:t}})))}render(){return s`
|
||||
<div class="field">
|
||||
${this.label?s`<span class="label">${this.label}${this.required?s`<span class="req">*</span>`:l}</span>`:l}
|
||||
<div class="row">
|
||||
${this._typing?s`<input class="typed" type="text" inputmode="numeric" autocomplete="off"
|
||||
.value=${this._typed}
|
||||
placeholder=${m("1978-03-15",this.lang)}
|
||||
aria-invalid=${this._typedInvalid?"true":"false"}
|
||||
@input=${t=>{this._typed=t.target.value,this._typedInvalid=!1}}
|
||||
@keydown=${this._onTypedKey}
|
||||
@blur=${this._commitTyped} />`:s`<ha-selector
|
||||
.hass=${this.hass}
|
||||
.selector=${this._selector()}
|
||||
.value=${x(this.kind,this.value)}
|
||||
.required=${this.required}
|
||||
.disabled=${this.disabled}
|
||||
@value-changed=${this._onSelectorChange}
|
||||
></ha-selector>`}
|
||||
${this.kind==="date"&&!this.disabled&&!this._typing?s`<button type="button" class="type-toggle" title=${d("date_type_toggle",this.lang)} aria-label=${d("date_type_toggle",this.lang)} @click=${this._startTyping}>
|
||||
<ha-icon icon="mdi:keyboard-outline"></ha-icon>
|
||||
</button>`:l}
|
||||
${this.clearable&&this.value&&!this.disabled&&!this._typing?s`<button type="button" class="clear" title=${d("clear",this.lang)} aria-label=${d("clear",this.lang)} @click=${this._clear}>
|
||||
<ha-icon icon="mdi:close"></ha-icon>
|
||||
</button>`:l}
|
||||
</div>
|
||||
${this._typedInvalid?s`<span class="helper invalid">${d("date_type_invalid",this.lang)}</span>`:this.helper?s`<span class="helper">${this.helper}</span>`:l}
|
||||
</div>
|
||||
`}};r.styles=y`
|
||||
:host { display: block; }
|
||||
.field {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
.label {
|
||||
font-size: 12px;
|
||||
color: var(--secondary-text-color, #888);
|
||||
font-weight: 500;
|
||||
}
|
||||
.req { color: var(--error-color, #f44336); margin-left: 2px; }
|
||||
.row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
ha-selector {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
.clear, .type-toggle {
|
||||
flex: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
padding: 0;
|
||||
border: none;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
cursor: pointer;
|
||||
--mdc-icon-size: 20px;
|
||||
}
|
||||
.clear:hover, .type-toggle:hover { background: rgba(var(--rgb-primary-text-color, 0, 0, 0), 0.08); }
|
||||
.clear:focus-visible, .type-toggle:focus-visible { outline: 2px solid var(--primary-color); }
|
||||
.helper {
|
||||
font-size: 11px;
|
||||
color: var(--secondary-text-color);
|
||||
font-style: italic;
|
||||
}
|
||||
.helper.invalid { color: var(--error-color, #f44336); font-style: normal; }
|
||||
input.typed {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
height: 40px;
|
||||
box-sizing: border-box;
|
||||
padding: 0 12px;
|
||||
border: 1px solid var(--divider-color, #ccc);
|
||||
border-radius: 4px;
|
||||
background: var(--card-background-color, #fff);
|
||||
color: var(--primary-text-color);
|
||||
font: inherit;
|
||||
}
|
||||
input.typed[aria-invalid="true"] { border-color: var(--error-color, #f44336); }
|
||||
input.typed:focus { outline: 2px solid var(--primary-color); outline-offset: -1px; }
|
||||
`,a([o({attribute:!1})],r.prototype,"hass",2),a([o()],r.prototype,"kind",2),a([o()],r.prototype,"label",2),a([o()],r.prototype,"value",2),a([o()],r.prototype,"helper",2),a([o({type:Boolean})],r.prototype,"clearable",2),a([o({type:Boolean})],r.prototype,"disabled",2),a([o({type:Boolean})],r.prototype,"required",2),a([o()],r.prototype,"lang",2),a([f()],r.prototype,"_typing",2),a([f()],r.prototype,"_typed",2),a([f()],r.prototype,"_typedInvalid",2);customElements.get("ms-date-field")||customElements.define("ms-date-field",r);
|
||||
@@ -0,0 +1,2 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
var s=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var t=(a,r,c,o)=>{for(var e=o>1?void 0:o?l(r,c):r,i=a.length-1,d;i>=0;i--)(d=a[i])&&(e=(o?d(r,c,e):d(e))||e);return o&&e&&s(r,c,e),e};var m={ok:"var(--success-color, #4caf50)",due_soon:"var(--warning-color, #ff9800)",overdue:"var(--error-color, #f44336)",triggered:"var(--deep-orange-color, #ff5722)",archived:"var(--disabled-color, #9e9e9e)",paused:"var(--info-color, #2196f3)"},v={ok:"mdi:check-circle",due_soon:"mdi:alert-circle",overdue:"mdi:alert-octagon",triggered:"mdi:bell-alert",archived:"mdi:archive-outline",paused:"mdi:pause-circle-outline",completed:"mdi:check-circle",skipped:"mdi:skip-next",missed:"mdi:calendar-remove",reset:"mdi:refresh"};export{t as a,m as b,v as c};
|
||||
@@ -0,0 +1,60 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as t}from"./chunk-AVD72T2Q.js";function e(o){let r=window;r.customCards=r.customCards||[],r.customCards.some(a=>a.type===o.type)||r.customCards.push(o)}var d=t`
|
||||
ha-card { overflow: hidden; }
|
||||
.card-content {
|
||||
padding: 16px;
|
||||
display: flex; flex-direction: column;
|
||||
gap: 12px;
|
||||
}
|
||||
.header {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
gap: 12px;
|
||||
}
|
||||
.title {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
font-size: 16px; font-weight: 500;
|
||||
}
|
||||
.emoji { font-size: 20px; }
|
||||
|
||||
/* Button family — primary action / muted-saved-state / link / icon-with-text */
|
||||
.btn {
|
||||
padding: 6px 12px; font-size: 13px;
|
||||
border-radius: 6px; cursor: pointer;
|
||||
border: 1px solid var(--divider-color);
|
||||
background: var(--secondary-background-color, transparent);
|
||||
color: var(--primary-text-color);
|
||||
font-weight: 500;
|
||||
display: inline-flex; align-items: center; gap: 4px;
|
||||
}
|
||||
.btn:hover { background: var(--state-icon-color, rgba(255,255,255,0.06)); }
|
||||
.btn[disabled] { opacity: 0.5; cursor: not-allowed; }
|
||||
.btn.primary {
|
||||
background: var(--primary-color);
|
||||
color: var(--text-primary-color, white);
|
||||
border-color: var(--primary-color);
|
||||
}
|
||||
.btn.primary[disabled] { opacity: 0.6; }
|
||||
.btn.muted {
|
||||
background: transparent;
|
||||
color: var(--secondary-text-color);
|
||||
border-style: dashed;
|
||||
}
|
||||
.btn.muted[disabled] { opacity: 1; cursor: default; }
|
||||
.btn.muted ha-icon, .btn.primary ha-icon { --mdc-icon-size: 14px; }
|
||||
.btn.link {
|
||||
background: transparent; border: none; padding: 6px 4px;
|
||||
color: var(--primary-color); margin-left: auto;
|
||||
}
|
||||
.btn.link:hover { background: transparent; text-decoration: underline; }
|
||||
|
||||
/* Error + loading states */
|
||||
.error {
|
||||
padding: 8px; border-radius: 6px;
|
||||
background: rgba(211, 47, 47, 0.1);
|
||||
color: var(--error-color, #d32f2f); font-size: 13px;
|
||||
}
|
||||
.loading {
|
||||
padding: 24px; text-align: center;
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
`;export{e as a,d as b};
|
||||
+3177
File diff suppressed because one or more lines are too long
+3213
File diff suppressed because one or more lines are too long
+137
@@ -0,0 +1,137 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as v,b}from"./chunk-4QSUIFST.js";import{B as p,a as u,b as s,d as c,e as h,f as g,g as o,i,k as _,m}from"./chunk-QP4GVVMP.js";import{a}from"./chunk-VMGD53HU.js";var e=class extends h{constructor(){super(...arguments);this._config={type:""};this._groups={};this._loaded=!1;this._busy=!1;this._error="";this._newName="";this._editingId=null;this._editingName="";this._hasInitiallyLoaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return _(this.hass)}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._hasInitiallyLoaded&&(this._hasInitiallyLoaded=!0,this._load(),m(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/groups"});this._groups=t.groups||{},this._loaded=!0}catch(t){this._error=p(t,this._lang)}}async _addGroup(){if(!this._isAdmin)return;let t=this._newName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/create",name:t}),this._newName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}_startEdit(t){this._editingId=t,this._editingName=this._groups[t]?.name||""}async _saveEdit(){if(!this._isAdmin||!this._editingId)return;let t=this._editingName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/update",group_id:this._editingId,name:t}),this._editingId=null,this._editingName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}async _deleteGroup(t,r){if(!this._isAdmin)return;let n=i("group_delete_confirm",this._lang).replace("{name}",r);if(window.confirm(n)){this._busy=!0;try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/delete",group_id:t}),await this._load()}catch(d){this._error=p(d,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_groups"),window.dispatchEvent(new CustomEvent("location-changed"))}_onKeyDown(t,r){t.key==="Enter"?(t.preventDefault(),r()):t.key==="Escape"&&(t.preventDefault(),this._editingId=null,this._editingName="")}render(){let t=this._lang;if(!this._loaded)return s`<ha-card><div class="loading">${i("loading",t)}</div></ha-card>`;let r=Object.keys(this._groups);return s`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏷️</span>
|
||||
<span>${this._config.title||i("groups",t)}</span>
|
||||
<span class="count">${r.length}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
${this._error?s`<div class="error">${this._error}</div>`:c}
|
||||
|
||||
${r.length===0?s`<div class="empty">${i("groups_empty",t)}</div>`:s`
|
||||
<div class="group-list">
|
||||
${r.map(n=>{let d=this._groups[n],y=d.task_refs?.length??0,f=this._editingId===n;return s`
|
||||
<div class="group-row">
|
||||
${f?s`
|
||||
<input class="edit-input" type="text"
|
||||
.value=${this._editingName}
|
||||
?disabled=${this._busy}
|
||||
@input=${l=>{this._editingName=l.target.value}}
|
||||
@keydown=${l=>this._onKeyDown(l,this._saveEdit.bind(this))} />
|
||||
<button class="btn small primary"
|
||||
@click=${this._saveEdit}
|
||||
?disabled=${this._busy||!this._editingName.trim()}>
|
||||
${i("save",t)}
|
||||
</button>
|
||||
<button class="btn small"
|
||||
@click=${()=>{this._editingId=null}}>
|
||||
${i("cancel",t)}
|
||||
</button>
|
||||
`:s`
|
||||
<span class="group-name">${d.name||"Unnamed"}</span>
|
||||
<span class="task-count">${y}</span>
|
||||
${this._isAdmin?s`
|
||||
<button class="icon-btn"
|
||||
title="${i("edit",t)}"
|
||||
@click=${()=>this._startEdit(n)}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:pencil"></ha-icon>
|
||||
</button>
|
||||
<button class="icon-btn danger"
|
||||
title="${i("delete",t)}"
|
||||
@click=${()=>this._deleteGroup(n,d.name||"Unnamed")}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:delete"></ha-icon>
|
||||
</button>
|
||||
`:c}
|
||||
`}
|
||||
</div>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${this._isAdmin?s`
|
||||
<div class="add-row">
|
||||
<input type="text"
|
||||
placeholder="${i("group_new_placeholder",t)}"
|
||||
.value=${this._newName}
|
||||
?disabled=${this._busy}
|
||||
@input=${n=>{this._newName=n.target.value}}
|
||||
@keydown=${n=>this._onKeyDown(n,this._addGroup.bind(this))} />
|
||||
<button class="btn primary"
|
||||
@click=${this._addGroup}
|
||||
?disabled=${this._busy||!this._newName.trim()}>
|
||||
<ha-icon icon="mdi:plus"></ha-icon>
|
||||
${i("add",t)}
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_manage_tasks",t)}
|
||||
</button>
|
||||
`:s`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_open_panel",t)}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};e.styles=[b,u`
|
||||
.count {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 8px; border-radius: 999px;
|
||||
}
|
||||
.empty {
|
||||
padding: 16px; text-align: center;
|
||||
color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.group-list { display: flex; flex-direction: column; gap: 4px; }
|
||||
.group-row {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
padding: 6px 8px; border-radius: 6px;
|
||||
background: var(--secondary-background-color, rgba(255,255,255,0.03));
|
||||
}
|
||||
.group-name { flex: 1; font-size: 14px; }
|
||||
.task-count {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
background: var(--card-background-color, rgba(0,0,0,0.2));
|
||||
padding: 1px 8px; border-radius: 999px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.edit-input {
|
||||
flex: 1; padding: 4px 8px; font-size: 14px;
|
||||
background: var(--card-background-color, #1c1c1c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--primary-color); border-radius: 4px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.icon-btn {
|
||||
background: transparent; border: none; cursor: pointer;
|
||||
color: var(--secondary-text-color); padding: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.icon-btn:hover {
|
||||
background: var(--state-icon-color, rgba(255,255,255,0.06));
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.icon-btn.danger:hover { color: var(--error-color); }
|
||||
.icon-btn ha-icon { --mdc-icon-size: 18px; }
|
||||
.add-row {
|
||||
display: flex; gap: 6px;
|
||||
padding-top: 8px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.add-row input {
|
||||
flex: 1; padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
/* Card-specific overrides on the shared .btn */
|
||||
.btn.small { padding: 4px 8px; font-size: 12px; }
|
||||
.btn ha-icon { --mdc-icon-size: 16px; }
|
||||
`],a([g({attribute:!1})],e.prototype,"hass",2),a([o()],e.prototype,"_config",2),a([o()],e.prototype,"_groups",2),a([o()],e.prototype,"_loaded",2),a([o()],e.prototype,"_busy",2),a([o()],e.prototype,"_error",2),a([o()],e.prototype,"_newName",2),a([o()],e.prototype,"_editingId",2),a([o()],e.prototype,"_editingName",2);customElements.get("maintenance-groups-section-card")||customElements.define("maintenance-groups-section-card",e);v({type:"maintenance-groups-section-card",name:"Maintenance Supporter \u2014 Groups",description:"Inline group CRUD",preview:!1});export{e as MaintenanceGroupsSectionCard};
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as v,b}from"./chunk-WIO3PYFT.js";import{a as u,b as s,d as c,e as h,f as g,g as o,i,k as _,m,z as p}from"./chunk-AVD72T2Q.js";import{a}from"./chunk-LRS2DZQN.js";var e=class extends h{constructor(){super(...arguments);this._config={type:""};this._groups={};this._loaded=!1;this._busy=!1;this._error="";this._newName="";this._editingId=null;this._editingName="";this._hasInitiallyLoaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return _(this.hass)}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),t.has("hass")&&this.hass&&!this._hasInitiallyLoaded&&(this._hasInitiallyLoaded=!0,this._load(),m(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/groups"});this._groups=t.groups||{},this._loaded=!0}catch(t){this._error=p(t,this._lang)}}async _addGroup(){if(!this._isAdmin)return;let t=this._newName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/create",name:t}),this._newName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}_startEdit(t){this._editingId=t,this._editingName=this._groups[t]?.name||""}async _saveEdit(){if(!this._isAdmin||!this._editingId)return;let t=this._editingName.trim();if(t){this._busy=!0,this._error="";try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/update",group_id:this._editingId,name:t}),this._editingId=null,this._editingName="",await this._load()}catch(r){this._error=p(r,this._lang)}finally{this._busy=!1}}}async _deleteGroup(t,r){if(!this._isAdmin)return;let n=(i("group_delete_confirm",this._lang)||'Delete group "{name}"?').replace("{name}",r);if(window.confirm(n)){this._busy=!0;try{await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/group/delete",group_id:t}),await this._load()}catch(d){this._error=p(d,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_groups"),window.dispatchEvent(new CustomEvent("location-changed"))}_onKeyDown(t,r){t.key==="Enter"?(t.preventDefault(),r()):t.key==="Escape"&&(t.preventDefault(),this._editingId=null,this._editingName="")}render(){let t=this._lang;if(!this._loaded)return s`<ha-card><div class="loading">${i("loading",t)||"Loading\u2026"}</div></ha-card>`;let r=Object.keys(this._groups);return s`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏷️</span>
|
||||
<span>${this._config.title||i("groups",t)||"Groups"}</span>
|
||||
<span class="count">${r.length}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
${this._error?s`<div class="error">${this._error}</div>`:c}
|
||||
|
||||
${r.length===0?s`<div class="empty">${i("groups_empty",t)||"No groups yet."}</div>`:s`
|
||||
<div class="group-list">
|
||||
${r.map(n=>{let d=this._groups[n],y=d.task_refs?.length??0,f=this._editingId===n;return s`
|
||||
<div class="group-row">
|
||||
${f?s`
|
||||
<input class="edit-input" type="text"
|
||||
.value=${this._editingName}
|
||||
?disabled=${this._busy}
|
||||
@input=${l=>{this._editingName=l.target.value}}
|
||||
@keydown=${l=>this._onKeyDown(l,this._saveEdit.bind(this))} />
|
||||
<button class="btn small primary"
|
||||
@click=${this._saveEdit}
|
||||
?disabled=${this._busy||!this._editingName.trim()}>
|
||||
${i("save",t)||"Save"}
|
||||
</button>
|
||||
<button class="btn small"
|
||||
@click=${()=>{this._editingId=null}}>
|
||||
${i("cancel",t)||"Cancel"}
|
||||
</button>
|
||||
`:s`
|
||||
<span class="group-name">${d.name||"Unnamed"}</span>
|
||||
<span class="task-count">${y}</span>
|
||||
${this._isAdmin?s`
|
||||
<button class="icon-btn"
|
||||
title="${i("edit",t)||"Edit"}"
|
||||
@click=${()=>this._startEdit(n)}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:pencil"></ha-icon>
|
||||
</button>
|
||||
<button class="icon-btn danger"
|
||||
title="${i("delete",t)||"Delete"}"
|
||||
@click=${()=>this._deleteGroup(n,d.name||"Unnamed")}
|
||||
?disabled=${this._busy}>
|
||||
<ha-icon icon="mdi:delete"></ha-icon>
|
||||
</button>
|
||||
`:c}
|
||||
`}
|
||||
</div>
|
||||
`})}
|
||||
</div>
|
||||
`}
|
||||
|
||||
${this._isAdmin?s`
|
||||
<div class="add-row">
|
||||
<input type="text"
|
||||
placeholder="${i("group_new_placeholder",t)||"Add group\u2026"}"
|
||||
.value=${this._newName}
|
||||
?disabled=${this._busy}
|
||||
@input=${n=>{this._newName=n.target.value}}
|
||||
@keydown=${n=>this._onKeyDown(n,this._addGroup.bind(this))} />
|
||||
<button class="btn primary"
|
||||
@click=${this._addGroup}
|
||||
?disabled=${this._busy||!this._newName.trim()}>
|
||||
<ha-icon icon="mdi:plus"></ha-icon>
|
||||
${i("add",t)||"Add"}
|
||||
</button>
|
||||
</div>
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_manage_tasks",t)||"Manage task assignments\u2026"}
|
||||
</button>
|
||||
`:s`
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${i("groups_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};e.styles=[b,u`
|
||||
.count {
|
||||
font-size: 12px; color: var(--secondary-text-color);
|
||||
background: var(--secondary-background-color);
|
||||
padding: 2px 8px; border-radius: 999px;
|
||||
}
|
||||
.empty {
|
||||
padding: 16px; text-align: center;
|
||||
color: var(--secondary-text-color); font-style: italic;
|
||||
}
|
||||
.group-list { display: flex; flex-direction: column; gap: 4px; }
|
||||
.group-row {
|
||||
display: flex; align-items: center; gap: 8px;
|
||||
padding: 6px 8px; border-radius: 6px;
|
||||
background: var(--secondary-background-color, rgba(255,255,255,0.03));
|
||||
}
|
||||
.group-name { flex: 1; font-size: 14px; }
|
||||
.task-count {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
background: var(--card-background-color, rgba(0,0,0,0.2));
|
||||
padding: 1px 8px; border-radius: 999px;
|
||||
font-weight: 500;
|
||||
}
|
||||
.edit-input {
|
||||
flex: 1; padding: 4px 8px; font-size: 14px;
|
||||
background: var(--card-background-color, #1c1c1c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--primary-color); border-radius: 4px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.icon-btn {
|
||||
background: transparent; border: none; cursor: pointer;
|
||||
color: var(--secondary-text-color); padding: 4px;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.icon-btn:hover {
|
||||
background: var(--state-icon-color, rgba(255,255,255,0.06));
|
||||
color: var(--primary-text-color);
|
||||
}
|
||||
.icon-btn.danger:hover { color: var(--error-color); }
|
||||
.icon-btn ha-icon { --mdc-icon-size: 18px; }
|
||||
.add-row {
|
||||
display: flex; gap: 6px;
|
||||
padding-top: 8px; border-top: 1px solid var(--divider-color);
|
||||
}
|
||||
.add-row input {
|
||||
flex: 1; padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
/* Card-specific overrides on the shared .btn */
|
||||
.btn.small { padding: 4px 8px; font-size: 12px; }
|
||||
.btn ha-icon { --mdc-icon-size: 16px; }
|
||||
`],a([g({attribute:!1})],e.prototype,"hass",2),a([o()],e.prototype,"_config",2),a([o()],e.prototype,"_groups",2),a([o()],e.prototype,"_loaded",2),a([o()],e.prototype,"_busy",2),a([o()],e.prototype,"_error",2),a([o()],e.prototype,"_newName",2),a([o()],e.prototype,"_editingId",2),a([o()],e.prototype,"_editingName",2);customElements.get("maintenance-groups-section-card")||customElements.define("maintenance-groups-section-card",e);v({type:"maintenance-groups-section-card",name:"Maintenance Supporter \u2014 Groups",description:"Inline group CRUD",preview:!1});export{e as MaintenanceGroupsSectionCard};
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
/*! maintenance_supporter frontend 2.86.0 */
|
||||
import{a as g,b as y}from"./chunk-4QSUIFST.js";import"./chunk-UKCMA2RG.js";import{B as o,a as h,b as r,d as c,e as _,f as v,g as n,i as e,j as f,k as m,m as b}from"./chunk-QP4GVVMP.js";import{a as i}from"./chunk-VMGD53HU.js";var s=class extends _{constructor(){super(...arguments);this._config={type:""};this._state=null;this._busy=!1;this._error="";this._localStart="";this._localEnd="";this._localBuffer=7;this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return m(this.hass)}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),f(this,t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),b(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/state"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||"",this._localBuffer=t.buffer_days??7,this._dirty=!1}catch(t){this._error=o(t,this._lang)}}async _toggleEnabled(t){this._busy=!0,this._error="";try{let a=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",enabled:t});this._state=a}catch(a){this._error=o(a,this._lang)}finally{this._busy=!1}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",start:this._localStart||null,end:this._localEnd||null,buffer_days:this._localBuffer});this._state=t,this._dirty=!1}catch(t){this._error=o(t,this._lang)}finally{this._busy=!1}}}async _endNow(){if(this._isAdmin&&window.confirm(e("vacation_end_now_confirm",this._lang))){this._busy=!0;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/end_now"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||""}catch(t){this._error=o(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_vacation"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,a=this._state;if(!a)return r`<ha-card><div class="loading">${e("loading",t)}</div></ha-card>`;let p=a.is_active===!0,d=a.enabled===!0,u=a.exempt_task_ids?.length??0,$=p?e("vacation_status_active",t):d?e("vacation_status_scheduled",t):e("vacation_status_inactive",t),x=p?"active":d?"scheduled":"inactive";return r`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏖️</span>
|
||||
<span>${this._config.title||e("vacation_mode",t)}</span>
|
||||
</div>
|
||||
<span class="status-pill ${x}">${$}</span>
|
||||
</div>
|
||||
|
||||
${this._error?r`<div class="error">${this._error}</div>`:c}
|
||||
|
||||
${this._isAdmin?r`
|
||||
<div class="row toggle-row">
|
||||
<label>${e("enable",t)}</label>
|
||||
<ha-switch
|
||||
.checked=${d}
|
||||
.disabled=${this._busy}
|
||||
@change=${l=>this._toggleEnabled(l.target.checked)}
|
||||
></ha-switch>
|
||||
</div>
|
||||
|
||||
<div class="dates-row">
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_start",t)}</label>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${t}
|
||||
.value=${this._localStart}
|
||||
.disabled=${this._busy}
|
||||
@value-changed=${l=>{this._localStart=l.detail.value,this._dirty=!0}}
|
||||
></ms-date-field>
|
||||
</div>
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_end",t)}</label>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${t}
|
||||
.value=${this._localEnd}
|
||||
.disabled=${this._busy}
|
||||
@value-changed=${l=>{this._localEnd=l.detail.value,this._dirty=!0}}
|
||||
></ms-date-field>
|
||||
</div>
|
||||
<div class="date-field buffer">
|
||||
<label>${e("vacation_buffer",t)}</label>
|
||||
<input type="number" min="0" max="14"
|
||||
.value=${String(this._localBuffer)}
|
||||
?disabled=${this._busy}
|
||||
@input=${l=>{this._localBuffer=parseInt(l.target.value,10)||0,this._dirty=!0}} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?e("save",t):e("saved",t)}
|
||||
</button>
|
||||
${p?r`<button class="btn"
|
||||
@click=${this._endNow}
|
||||
?disabled=${this._busy}>
|
||||
${e("vacation_end_now",t)}
|
||||
</button>`:c}
|
||||
${u>0?r`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${u} ${e("vacation_exempt_count",t)}…
|
||||
</button>`:r`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${e("vacation_advanced",t)}
|
||||
</button>`}
|
||||
</div>
|
||||
`:r`
|
||||
<div class="readonly">
|
||||
${d&&a.start&&a.end?r`<div>${a.start} → ${a.end}</div>`:c}
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${e("vacation_open_panel",t)}
|
||||
</button>
|
||||
</div>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};s.styles=[y,h`
|
||||
.status-pill {
|
||||
font-size: 11px; font-weight: 600;
|
||||
padding: 3px 8px; border-radius: 999px;
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.status-pill.active {
|
||||
background: rgba(76, 175, 80, 0.15);
|
||||
color: #4caf50;
|
||||
}
|
||||
.status-pill.scheduled {
|
||||
background: rgba(255, 152, 0, 0.15);
|
||||
color: #ff9800;
|
||||
}
|
||||
.status-pill.inactive {
|
||||
background: rgba(158, 158, 158, 0.15);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.row.toggle-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.row.toggle-row label {
|
||||
font-size: 14px; color: var(--primary-text-color);
|
||||
}
|
||||
.dates-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr 100px; gap: 10px;
|
||||
}
|
||||
.date-field.buffer label { white-space: nowrap; }
|
||||
.date-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.date-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.date-field input {
|
||||
padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.date-field input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.actions {
|
||||
display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
|
||||
}
|
||||
.readonly { display: flex; flex-direction: column; gap: 8px; }
|
||||
`],i([v({attribute:!1})],s.prototype,"hass",2),i([n()],s.prototype,"_config",2),i([n()],s.prototype,"_state",2),i([n()],s.prototype,"_busy",2),i([n()],s.prototype,"_error",2),i([n()],s.prototype,"_localStart",2),i([n()],s.prototype,"_localEnd",2),i([n()],s.prototype,"_localBuffer",2),i([n()],s.prototype,"_dirty",2);customElements.get("maintenance-vacation-section-card")||customElements.define("maintenance-vacation-section-card",s);g({type:"maintenance-vacation-section-card",name:"Maintenance Supporter \u2014 Vacation",description:"Inline vacation mode toggle + dates",preview:!1});export{s as MaintenanceVacationSectionCard};
|
||||
+134
@@ -0,0 +1,134 @@
|
||||
/*! maintenance_supporter frontend 2.83.0 */
|
||||
import{a as g,b as y}from"./chunk-WIO3PYFT.js";import"./chunk-C4KIMTDR.js";import{a as h,b as n,d as c,e as _,f as v,g as r,i as e,j as f,k as m,m as b,z as o}from"./chunk-AVD72T2Q.js";import{a as i}from"./chunk-LRS2DZQN.js";var a=class extends _{constructor(){super(...arguments);this._config={type:""};this._state=null;this._busy=!1;this._error="";this._localStart="";this._localEnd="";this._localBuffer=7;this._dirty=!1;this._loaded=!1}setConfig(t){this._config=t}getCardSize(){return 2}get _lang(){return m(this.hass)}get _isAdmin(){return this.hass?.user?.is_admin??!0}updated(t){super.updated(t),f(this,t),t.has("hass")&&this.hass&&!this._loaded&&(this._loaded=!0,this._load(),b(this._lang).then(()=>this.requestUpdate()))}async _load(){try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/state"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||"",this._localBuffer=t.buffer_days??7,this._dirty=!1}catch(t){this._error=o(t,this._lang)}}async _toggleEnabled(t){this._busy=!0,this._error="";try{let s=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",enabled:t});this._state=s}catch(s){this._error=o(s,this._lang)}finally{this._busy=!1}}async _save(){if(this._isAdmin){this._busy=!0,this._error="";try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/update",start:this._localStart||null,end:this._localEnd||null,buffer_days:this._localBuffer});this._state=t,this._dirty=!1}catch(t){this._error=o(t,this._lang)}finally{this._busy=!1}}}async _endNow(){if(this._isAdmin&&window.confirm(e("vacation_end_now_confirm",this._lang)||"End vacation immediately?")){this._busy=!0;try{let t=await this.hass.connection.sendMessagePromise({type:"maintenance_supporter/vacation/end_now"});this._state=t,this._localStart=t.start||"",this._localEnd=t.end||""}catch(t){this._error=o(t,this._lang)}finally{this._busy=!1}}}_onDeepLink(){history.pushState(null,"","/maintenance-supporter?ms_action=open_vacation"),window.dispatchEvent(new CustomEvent("location-changed"))}render(){let t=this._lang,s=this._state;if(!s)return n`<ha-card><div class="loading">${e("loading",t)||"Loading\u2026"}</div></ha-card>`;let p=s.is_active===!0,d=s.enabled===!0,u=s.exempt_task_ids?.length??0,$=p?e("vacation_status_active",t)||"Active now":d?e("vacation_status_scheduled",t)||"Scheduled":e("vacation_status_inactive",t)||"Inactive",x=p?"active":d?"scheduled":"inactive";return n`
|
||||
<ha-card>
|
||||
<div class="card-content">
|
||||
<div class="header">
|
||||
<div class="title">
|
||||
<span class="emoji">🏖️</span>
|
||||
<span>${this._config.title||e("vacation_mode",t)||"Vacation mode"}</span>
|
||||
</div>
|
||||
<span class="status-pill ${x}">${$}</span>
|
||||
</div>
|
||||
|
||||
${this._error?n`<div class="error">${this._error}</div>`:c}
|
||||
|
||||
${this._isAdmin?n`
|
||||
<div class="row toggle-row">
|
||||
<label>${e("enable",t)||"Enable"}</label>
|
||||
<ha-switch
|
||||
.checked=${d}
|
||||
.disabled=${this._busy}
|
||||
@change=${l=>this._toggleEnabled(l.target.checked)}
|
||||
></ha-switch>
|
||||
</div>
|
||||
|
||||
<div class="dates-row">
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_start",t)||"Start"}</label>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${t}
|
||||
.value=${this._localStart}
|
||||
.disabled=${this._busy}
|
||||
@value-changed=${l=>{this._localStart=l.detail.value,this._dirty=!0}}
|
||||
></ms-date-field>
|
||||
</div>
|
||||
<div class="date-field">
|
||||
<label>${e("vacation_end",t)||"End"}</label>
|
||||
<ms-date-field
|
||||
kind="date"
|
||||
clearable
|
||||
.hass=${this.hass}
|
||||
.lang=${t}
|
||||
.value=${this._localEnd}
|
||||
.disabled=${this._busy}
|
||||
@value-changed=${l=>{this._localEnd=l.detail.value,this._dirty=!0}}
|
||||
></ms-date-field>
|
||||
</div>
|
||||
<div class="date-field buffer">
|
||||
<label>${e("vacation_buffer",t)||"Buffer days"}</label>
|
||||
<input type="number" min="0" max="14"
|
||||
.value=${String(this._localBuffer)}
|
||||
?disabled=${this._busy}
|
||||
@input=${l=>{this._localBuffer=parseInt(l.target.value,10)||0,this._dirty=!0}} />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="actions">
|
||||
<button class="btn ${this._dirty?"primary":"muted"}"
|
||||
@click=${this._save}
|
||||
?disabled=${this._busy||!this._dirty}>
|
||||
<ha-icon icon="${this._dirty?"mdi:content-save":"mdi:check"}"></ha-icon>
|
||||
${this._dirty?e("save",t)||"Save":e("saved",t)||"Saved"}
|
||||
</button>
|
||||
${p?n`<button class="btn"
|
||||
@click=${this._endNow}
|
||||
?disabled=${this._busy}>
|
||||
${e("vacation_end_now",t)||"End now"}
|
||||
</button>`:c}
|
||||
${u>0?n`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${u} ${e("vacation_exempt_count",t)||"exempt"}…
|
||||
</button>`:n`<button class="btn link"
|
||||
@click=${this._onDeepLink}>
|
||||
${e("vacation_advanced",t)||"Advanced\u2026"}
|
||||
</button>`}
|
||||
</div>
|
||||
`:n`
|
||||
<div class="readonly">
|
||||
${d&&s.start&&s.end?n`<div>${s.start} → ${s.end}</div>`:c}
|
||||
<button class="btn link" @click=${this._onDeepLink}>
|
||||
${e("vacation_open_panel",t)||"Open in panel"}
|
||||
</button>
|
||||
</div>
|
||||
`}
|
||||
</div>
|
||||
</ha-card>
|
||||
`}};a.styles=[y,h`
|
||||
.status-pill {
|
||||
font-size: 11px; font-weight: 600;
|
||||
padding: 3px 8px; border-radius: 999px;
|
||||
text-transform: uppercase; letter-spacing: 0.5px;
|
||||
}
|
||||
.status-pill.active {
|
||||
background: rgba(76, 175, 80, 0.15);
|
||||
color: #4caf50;
|
||||
}
|
||||
.status-pill.scheduled {
|
||||
background: rgba(255, 152, 0, 0.15);
|
||||
color: #ff9800;
|
||||
}
|
||||
.status-pill.inactive {
|
||||
background: rgba(158, 158, 158, 0.15);
|
||||
color: var(--secondary-text-color);
|
||||
}
|
||||
.row.toggle-row {
|
||||
display: flex; align-items: center; justify-content: space-between;
|
||||
}
|
||||
.row.toggle-row label {
|
||||
font-size: 14px; color: var(--primary-text-color);
|
||||
}
|
||||
.dates-row {
|
||||
display: grid; grid-template-columns: 1fr 1fr 100px; gap: 10px;
|
||||
}
|
||||
.date-field.buffer label { white-space: nowrap; }
|
||||
.date-field { display: flex; flex-direction: column; gap: 4px; }
|
||||
.date-field label {
|
||||
font-size: 11px; color: var(--secondary-text-color);
|
||||
text-transform: uppercase; letter-spacing: 0.3px;
|
||||
}
|
||||
.date-field input {
|
||||
padding: 6px 8px; font-size: 13px;
|
||||
background: var(--secondary-background-color, #2c2c2c);
|
||||
color: var(--primary-text-color);
|
||||
border: 1px solid var(--divider-color); border-radius: 6px;
|
||||
font-family: inherit;
|
||||
}
|
||||
.date-field input:disabled { opacity: 0.5; cursor: not-allowed; }
|
||||
.actions {
|
||||
display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
|
||||
}
|
||||
.readonly { display: flex; flex-direction: column; gap: 8px; }
|
||||
`],i([v({attribute:!1})],a.prototype,"hass",2),i([r()],a.prototype,"_config",2),i([r()],a.prototype,"_state",2),i([r()],a.prototype,"_busy",2),i([r()],a.prototype,"_error",2),i([r()],a.prototype,"_localStart",2),i([r()],a.prototype,"_localEnd",2),i([r()],a.prototype,"_localBuffer",2),i([r()],a.prototype,"_dirty",2);customElements.get("maintenance-vacation-section-card")||customElements.define("maintenance-vacation-section-card",a);g({type:"maintenance-vacation-section-card",name:"Maintenance Supporter \u2014 Vacation",description:"Inline vacation mode toggle + dates",preview:!1});export{a as MaintenanceVacationSectionCard};
|
||||
+3
-3
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user